{"repo": "chaineasy-ai/alice-agent", "files": {"alice-facade-cmd/src/main/java/org/cland/alice/facade/cmd/AliceCliLauncher.java": {"8ebb2c40d3906a86e5a1eaa8ea381b21d0df9bd9": {"t": 1785745680.1727407, "n": 24154, "h": "c44e229fbcac68d6", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.core.agent.wal.SnowflakeIdGenerator;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n *
对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n *
退出码映射(符合设计文档):\n *\n *
用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n *
由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : SnowflakeIdGenerator.generateSessionId();\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ResumeSessionCmd resume -> {\n System.out.println(\"Resuming session: \" + resume.sessionId());\n if (resume.snapshotId() != null) {\n System.out.println(\" Snapshot: \" + resume.snapshotId());\n }\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = SnowflakeIdGenerator.generateSessionId();\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n /** 从 ~/.alice/model.json 加载的默认模型 ID,供 config 命令和 run 流程使用。 */\n private static String loadedDefaultModel;\n\n /** 从 ~/.alice/model.json 加载的默认模型配置对象(新格式),含 enable_thinking / reasoning_effort。 */\n private static ModelConfigLoader.DefaultModelConfig loadedDefaultModelConfig;\n\n /**\n * 初始化模型提供器。\n *\n * @return model.json 中配置的默认模型 ID,未设置则返回 {@code null}\n */\n private static String initializeModelProvider() {\n String configDefaultModel = null;\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n configDefaultModel = configLoader.getDefaultModel();\n loadedDefaultModelConfig = configLoader.getDefaultModelConfig();\n logger.info(\n \"Loaded {} provider(s) from ~/.alice/model.json\", configLoader.getProviders().size());\n if (configDefaultModel != null) {\n logger.info(\"Default model from model.json: {}\", configDefaultModel);\n }\n if (loadedDefaultModelConfig != null) {\n logger.info(\n \"Default model config: enable_thinking={}, reasoning_effort={}\",\n loadedDefaultModelConfig.enableThinking(),\n loadedDefaultModelConfig.reasoningEffort());\n }\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n return configDefaultModel;\n }\n}\n"}, "542dfef86a8f56af43d54230584fe2edf9c80f6a": {"t": 1785755689.6241956, "n": 24154, "h": "c44e229fbcac68d6", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.core.agent.wal.SnowflakeIdGenerator;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : SnowflakeIdGenerator.generateSessionId();\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ResumeSessionCmd resume -> {\n System.out.println(\"Resuming session: \" + resume.sessionId());\n if (resume.snapshotId() != null) {\n System.out.println(\" Snapshot: \" + resume.snapshotId());\n }\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = SnowflakeIdGenerator.generateSessionId();\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n /** 从 ~/.alice/model.json 加载的默认模型 ID,供 config 命令和 run 流程使用。 */\n private static String loadedDefaultModel;\n\n /** 从 ~/.alice/model.json 加载的默认模型配置对象(新格式),含 enable_thinking / reasoning_effort。 */\n private static ModelConfigLoader.DefaultModelConfig loadedDefaultModelConfig;\n\n /**\n * 初始化模型提供器。\n *\n * @return model.json 中配置的默认模型 ID,未设置则返回 {@code null}\n */\n private static String initializeModelProvider() {\n String configDefaultModel = null;\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n configDefaultModel = configLoader.getDefaultModel();\n loadedDefaultModelConfig = configLoader.getDefaultModelConfig();\n logger.info(\n \"Loaded {} provider(s) from ~/.alice/model.json\", configLoader.getProviders().size());\n if (configDefaultModel != null) {\n logger.info(\"Default model from model.json: {}\", configDefaultModel);\n }\n if (loadedDefaultModelConfig != null) {\n logger.info(\n \"Default model config: enable_thinking={}, reasoning_effort={}\",\n loadedDefaultModelConfig.enableThinking(),\n loadedDefaultModelConfig.reasoningEffort());\n }\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n return configDefaultModel;\n }\n}\n"}, "2bbe5ee1d8031e29c337a8ef11da323abd34bd40": {"t": 1785755691.3378158, "n": 23656, "h": "d19894fb0d903ef4", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.core.agent.wal.SnowflakeIdGenerator;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : SnowflakeIdGenerator.generateSessionId();\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ResumeSessionCmd resume -> {\n System.out.println(\"Resuming session: \" + resume.sessionId());\n if (resume.snapshotId() != null) {\n System.out.println(\" Snapshot: \" + resume.snapshotId());\n }\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = SnowflakeIdGenerator.generateSessionId();\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n /** 从 ~/.alice/model.json 加载的默认模型 ID,供 config 命令和 run 流程使用。 */\n private static String loadedDefaultModel;\n\n /**\n * 初始化模型提供器。\n *\n * @return model.json 中配置的默认模型 ID,未设置则返回 {@code null}\n */\n private static String initializeModelProvider() {\n String configDefaultModel = null;\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n configDefaultModel = configLoader.getDefaultModel();\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n if (configDefaultModel != null) {\n logger.info(\"Default model from model.json: {}\", configDefaultModel);\n }\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n return configDefaultModel;\n }\n}\n"}, "3e58892dd30fad4915a4efd6b5901a09ac3ccae5": {"t": 1785755692.903427, "n": 23608, "h": "8e0fb5edc52116d6", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ResumeSessionCmd resume -> {\n System.out.println(\"Resuming session: \" + resume.sessionId());\n if (resume.snapshotId() != null) {\n System.out.println(\" Snapshot: \" + resume.snapshotId());\n }\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n /** 从 ~/.alice/model.json 加载的默认模型 ID,供 config 命令和 run 流程使用。 */\n private static String loadedDefaultModel;\n\n /**\n * 初始化模型提供器。\n *\n * @return model.json 中配置的默认模型 ID,未设置则返回 {@code null}\n */\n private static String initializeModelProvider() {\n String configDefaultModel = null;\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n configDefaultModel = configLoader.getDefaultModel();\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n if (configDefaultModel != null) {\n logger.info(\"Default model from model.json: {}\", configDefaultModel);\n }\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n return configDefaultModel;\n }\n}\n"}, "2bb6b3f7e483c34be142c1c9ed1daba4cd65067f": {"t": 1785755694.60479, "n": 21220, "h": "deff7556657ad355", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n /** 从 ~/.alice/model.json 加载的默认模型 ID,供 config 命令和 run 流程使用。 */\n private static String loadedDefaultModel;\n\n /**\n * 初始化模型提供器。\n *\n * @return model.json 中配置的默认模型 ID,未设置则返回 {@code null}\n */\n private static String initializeModelProvider() {\n String configDefaultModel = null;\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n configDefaultModel = configLoader.getDefaultModel();\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n if (configDefaultModel != null) {\n logger.info(\"Default model from model.json: {}\", configDefaultModel);\n }\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n return configDefaultModel;\n }\n}\n"}, "c2c7eac01472b99309c1f867fa8a080907dba673": {"t": 1785755696.0762913, "n": 19994, "h": "41c6911f05cd4f82", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-v4-flash\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "ea266cc69fdfde12ecbe7c3df37743f6c42372fc": {"t": 1785755697.7079556, "n": 19990, "h": "e64cc7fa904ee99b", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.chat.JLineChatSession;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-chat\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "89b2479f36a21903ca0de8000a61a4e11bf70224": {"t": 1785755699.5411308, "n": 19933, "h": "ebc9581e91bf157d", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n\n // 1. 加载 ~/.alice/model.json 配置文件\n try {\n ModelConfigLoader configLoader = new ModelConfigLoader();\n configLoader.load();\n configLoader.registerTo(provider);\n logger.info(\n \"Loaded {} model provider(s) from ~/.alice/model.json\",\n configLoader.getProviders().size());\n } catch (Exception e) {\n logger.debug(\"No model config found, using env vars: {}\", e.getMessage());\n }\n\n // 2. 注册内置模型枚举\n provider.registerBuiltinModels();\n\n // 3. 从环境变量注册供应商(优先级低于配置文件)\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n if (provider.getSupplier(\"gpt-4o-mini\") == null) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered from env var\");\n }\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n if (provider.getSupplier(\"claude-3-5-sonnet-latest\") == null) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered from env var\");\n }\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n\n // 4. DeepSeek (OpenAI-compatible) 从环境变量注册\n String deepseekKey = System.getenv(\"DEEPSEEK_API_KEY\");\n if (deepseekKey != null && !deepseekKey.isEmpty()) {\n if (provider.getSupplier(\"deepseek-chat\") == null) {\n provider.registerSupplier(\n new OpenAiSupplier(\n \"deepseek\", deepseekKey, \"https://api.deepseek.com/v1/chat/completions\"));\n logger.info(\"DeepSeek supplier registered from env var (OpenAI-compatible)\");\n }\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "a4225676e3fe9533f6466874bfd10308b7f7f6fc": {"t": 1785755700.958288, "n": 18692, "h": "3b9a2afbe1a7e437", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.Map;\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.core.agent.AgentConfig;\nimport org.cland.alice.facade.cmd.config.AliceConfigStore;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 工具列表\n // ========================================================================\n\n /**\n * 处理 {@code alice tools} 子命令,列出 ToolRegistry 中的已注册工具。\n *\n * @param config 运行配置\n * @return 退出码\n */\n private static int handleListTools(RunConfig config) {\n try {\n var registry = org.cland.alice.tool.gateway.ToolRegistryHolder.INSTANCE;\n var tools = registry.allTools();\n\n if (tools.isEmpty()) {\n System.out.println(\"No tools registered.\");\n System.out.println(\"Use 'alice run --skill 支持:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered\");\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "7d35985d4f861780abf7f36eb3f2fa62bea9c786": {"t": 1785755702.4121075, "n": 10043, "h": "0b7481e2f7d6ac20", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.agent.subagent.SubAgentManager;\nimport org.cland.alice.agent.subagent.SubAgentRecord;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.ClaudeSupplier;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SpawnSubAgentCmd spawn -> {\n System.out.println(\"Spawning sub-agent: \" + spawn.goal());\n // 创建 SubAgentManager 并生成子 Agent\n String subSessionId = UUID.randomUUID().toString().substring(0, 8);\n SubAgentManager mgr = new SubAgentManager(subSessionId);\n SubAgentRecord record = mgr.spawnSubAgent(spawn.goal(), spawn.model());\n System.out.println(\"Sub-agent \" + record.id() + \" spawned with goal: \" + spawn.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ConnectSubAgentCmd connect -> {\n System.out.println(\n \"Connecting to ACP agent: \" + connect.name() + \" at \" + connect.acpEndpoint());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ListSubAgentsCmd list -> {\n System.out.println(\"Listing sub-agents (not yet wired to a SubAgentManager)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.CancelSubAgentCmd cancel -> {\n System.out.println(\"Cancel sub-agent: \" + cancel.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.GetSubAgentResultsCmd results -> {\n System.out.println(\n \"Get results for sub-agent: \" + results.subAgentId() + \" (not yet wired)\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.SendToSubAgentCmd send -> {\n System.out.println(\n \"Send message to sub-agent \" + send.subAgentId() + \": \" + send.message());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.PromptSubAgentCmd prompt -> {\n System.out.println(\"Prompt sub-agent \" + prompt.subAgentId() + \": \" + prompt.prompt());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String openAiKey = System.getenv(\"OPENAI_API_KEY\");\n if (openAiKey != null && !openAiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(openAiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n\n String anthropicKey = System.getenv(\"ANTHROPIC_API_KEY\");\n if (anthropicKey != null && !anthropicKey.isEmpty()) {\n provider.registerSupplier(new ClaudeSupplier(anthropicKey));\n logger.info(\"Anthropic Claude supplier registered\");\n } else {\n logger.warn(\"ANTHROPIC_API_KEY not set. LLM calls via Anthropic will be unavailable.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "0b23bcc1514cdbac79d0b5dcebfa9d5682211679": {"t": 1785755703.6172955, "n": 7692, "h": "689a2073074b3dd3", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.RoutineTimeCmd.RegisterRoutineCmd routine -> {\n System.out.println(\"Registering routine: \" + routine.cronExpression());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "6ac7c7c409fdeda5f270fc91665793da3d5507a0": {"t": 1785755705.1294005, "n": 7488, "h": "f674b38f33eccf69", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId =\n cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "cdaaead10134ed1474525a45acdd5b6fc2ff12da": {"t": 1785755706.4558299, "n": 7480, "h": "8cc072b8b4c6bef7", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 由 {@link JLineChatSession} 等已预先解析的调用方使用,避免重复解析。\n *\n * @param cmd 已解析的 AgentCommand\n * @return 退出码\n */\n public static int dispatchCommand(AgentCommand cmd) {\n if (cmd == null) {\n System.err.println(\"Cannot dispatch null command\");\n return EXIT_PARAM_ERROR;\n }\n\n String sessionId = cmd.sessionId() != null ? cmd.sessionId() : UUID.randomUUID().toString().substring(0, 8);\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "54c104cd19d2e340e51ebaa92cae552fe6b2fc43": {"t": 1785755707.7977746, "n": 6990, "h": "8d369b6724a60229", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "ecba2ea793e0640c9d3e7fb067725c450ccae401": {"t": 1785755709.3734043, "n": 6086, "h": "e83e27b3c34155e2", "c": "package org.cland.alice.facade.cmd;\n\nimport java.util.UUID;\nimport org.cland.alice.agent.command.AgentCommand;\nimport org.cland.alice.agent.command.CapabilityCmd;\nimport org.cland.alice.agent.command.ControlCmd;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 用于交互式 CLI 会话(chat 模式),根据 AgentCommand 类型路由:\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "cf772f464ef785e85743100f561e6292b64c024a": {"t": 1785755710.593858, "n": 3315, "h": "c52ff15a51e74a09", "c": "package org.cland.alice.facade.cmd;\n\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Alice CLI 模块的入口点。\n *\n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n *\n * 退出码映射(符合设计文档):\n *\n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "74837030dfba4e7d4c820989eed8c4dd79acc3aa": {"t": 1785755712.0336196, "n": 3576, "h": "e2b9982ec4dc3189", "c": "package org.cland.alice.facade.cmd;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\n\n/**\n * Alice CLI 模块的入口点。\n * \n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n * \n * 退出码映射(符合设计文档):\n * \n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.info(\"OpenAI supplier registered\");\n } else {\n logger.warn(\"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.warn(\"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "b72ce13b6595188b8c47f91d0409c1cb187b621f": {"t": 1785755713.2476056, "n": 3680, "h": "143badcb424dc7cd", "c": "package org.cland.alice.facade.cmd;\n\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\n\n/**\n * Alice CLI 模块的入口点。\n * \n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n * \n * 退出码映射(符合设计文档):\n * \n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.log(System.Logger.Level.INFO, \"OpenAI supplier registered\");\n } else {\n logger.log(System.Logger.Level.WARNING,\n \"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.log(System.Logger.Level.WARNING,\n \"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}, "ee70bd0a0bab774568fba363216d26f0e925e276": {"t": 1785755714.5662138, "n": 3673, "h": "835a33a2e85f446d", "c": "package org.cland.alice.facade.cmd;\n\nimport org.cland.alice.facade.cmd.config.CommandParser;\nimport org.cland.alice.facade.cmd.config.CommandParser.ParseException;\nimport org.cland.alice.facade.cmd.config.RunConfig;\nimport org.cland.alice.facade.cmd.render.OutputRenderer;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.model.supplier.OpenAiSupplier;\n\n/**\n * Alice CLI 模块的入口点。\n * \n * 对应设计文档中 {@code AliceCliLauncher} 的角色:\n * \n * 退出码映射(符合设计文档):\n * \n * 注册内置模型,并从环境变量中读取 API Key 注册外部供应商。\n */\n private static void initializeModelProvider() {\n try {\n ModelProvider provider = ModelProvider.getInstance();\n provider.registerBuiltinModels();\n\n String apiKey = System.getenv(\"OPENAI_API_KEY\");\n if (apiKey != null && !apiKey.isEmpty()) {\n provider.registerSupplier(new OpenAiSupplier(apiKey));\n logger.log(System.Logger.Level.INFO, \"OpenAI supplier registered\");\n } else {\n logger.log(System.Logger.Level.WARNING,\n \"OPENAI_API_KEY not set. Set it via environment variable to enable LLM calls.\");\n }\n } catch (Exception e) {\n logger.log(System.Logger.Level.WARNING,\n \"ModelProvider initialization failed (some features may be unavailable)\", e);\n }\n }\n}\n"}}, "alice-core-agent/src/main/java/org/cland/alice/core/agent/Agent.java": {"8ebb2c40d3906a86e5a1eaa8ea381b21d0df9bd9": {"t": 1785745700.2901363, "n": 23299, "h": "10f7e7960c0ed5a8", "c": "package org.cland.alice.core.agent;\n\nimport io.vertx.core.Future;\nimport io.vertx.core.Vertx;\nimport java.time.Instant;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicReference;\nimport java.util.stream.Collectors;\nimport org.cland.alice.core.agent.executor.AgentExecutor;\nimport org.cland.alice.core.agent.lifecycle.Action;\nimport org.cland.alice.core.agent.memory.AgentSession;\nimport org.cland.alice.core.agent.result.StepResult;\nimport org.cland.alice.core.agent.wal.RawMessage;\nimport org.cland.alice.core.agent.wal.SnowflakeIdGenerator;\nimport org.cland.alice.core.agent.wal.WalSession;\nimport org.cland.alice.core.planner.Plan;\nimport org.cland.alice.core.planner.PlannerService;\nimport org.cland.alice.core.planner.strategy.FastPathStrategy;\nimport org.cland.alice.core.planner.strategy.SlowPathStrategy;\nimport org.cland.alice.core.planner.strategy.StrategySelector;\nimport org.cland.alice.core.planner.tree.ThinkingTree;\nimport org.cland.alice.env.adapter.EnvEvent;\nimport org.cland.alice.guardrail.Verificator;\nimport org.cland.alice.model.Call;\nimport org.cland.alice.model.CallStatus;\nimport org.cland.alice.model.ModelConfigLoader;\nimport org.cland.alice.model.ModelProvider;\nimport org.cland.alice.tool.gateway.ToolRegistry;\nimport org.cland.alice.tool.gateway.ToolRegistryHolder;\nimport org.cland.alice.tool.gateway.builtin.BuiltinTools;\nimport org.cland.alice.tool.gateway.engine.ToolDiscovery;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Agent 核心类,代表一个 AI Agent 实例。\n *\n * 基于 PPAO (Perceive-Plan-Act-Observe-Verify) 核心循环。 通过 ModelProvider 与底层模型交互,通过 AgentExecutor\n * 驱动响应式执行循环。持有所有子模块(规划器、安全校验、工具注册中心、记忆、环境适配器)的引用。\n *\n * 生命周期状态机:\n *\n * 使用示例:\n *\n * 如果当前已有 PlannerService,会复用其 StrategySelector 和现有的 SOP 函数。 该函数通常来自 {@code alice-memory-vault}\n * 的 {@code StaticPlanner::plan}。\n *\n * @param staticPlannerFn 接收上下文 Map 返回 Plan 的函数(null 表示无 SOP)\n */\n public Agent withStaticPlanner(\n java.util.function.Function\n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 3a. Resume 命令 — 走 Agent 执行(通过 ExecutionCoordinator)\n if (config.resumeMode()) {\n // resume 命令可能带 --list 标志,直接列表展示\n if (config.resumeList()) {\n return handleResumeList(config);\n }\n // 否则进入 Agent 执行流程\n }\n\n // 4. 初始化 ModelProvider\n String configDefaultModel = initializeModelProvider();\n\n // 4a. 如果用户未通过 --model 指定,且 model.json 中配置了 default_model,则使用它\n String effectiveModel =\n (configDefaultModel != null && config.model().equals(RunConfig.DEFAULT_MODEL))\n ? configDefaultModel\n : config.model();\n if (configDefaultModel != null) {\n loadedDefaultModel = configDefaultModel;\n }\n\n // 4. 创建渲染器(将有效 model 回传给 config 上下文)\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer, effectiveModel);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = SnowflakeIdGenerator.generateSessionId();\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 3a. Resume 命令 — 走 Agent 执行(通过 ExecutionCoordinator)\n if (config.resumeMode()) {\n // resume 命令可能带 --list 标志,直接列表展示\n if (config.resumeList()) {\n return handleResumeList(config);\n }\n // 否则进入 Agent 执行流程\n }\n\n // 4. 初始化 ModelProvider\n String configDefaultModel = initializeModelProvider();\n\n // 4a. 如果用户未通过 --model 指定,且 model.json 中配置了 default_model,则使用它\n String effectiveModel =\n (configDefaultModel != null && config.model().equals(RunConfig.DEFAULT_MODEL))\n ? configDefaultModel\n : config.model();\n if (configDefaultModel != null) {\n loadedDefaultModel = configDefaultModel;\n }\n\n // 4. 创建渲染器(将有效 model 回传给 config 上下文)\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer, effectiveModel);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = SnowflakeIdGenerator.generateSessionId();\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 3a. Resume 命令 — 走 Agent 执行(通过 ExecutionCoordinator)\n if (config.resumeMode()) {\n // resume 命令可能带 --list 标志,直接列表展示\n if (config.resumeList()) {\n return handleResumeList(config);\n }\n // 否则进入 Agent 执行流程\n }\n\n // 4. 初始化 ModelProvider\n String configDefaultModel = initializeModelProvider();\n\n // 4a. 如果用户未通过 --model 指定,且 model.json 中配置了 default_model,则使用它\n String effectiveModel =\n (configDefaultModel != null && config.model().equals(RunConfig.DEFAULT_MODEL))\n ? configDefaultModel\n : config.model();\n if (configDefaultModel != null) {\n loadedDefaultModel = configDefaultModel;\n }\n\n // 4. 创建渲染器(将有效 model 回传给 config 上下文)\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer, effectiveModel);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 4. 初始化 ModelProvider\n String configDefaultModel = initializeModelProvider();\n\n // 4a. 如果用户未通过 --model 指定,且 model.json 中配置了 default_model,则使用它\n String effectiveModel =\n (configDefaultModel != null && config.model().equals(RunConfig.DEFAULT_MODEL))\n ? configDefaultModel\n : config.model();\n if (configDefaultModel != null) {\n loadedDefaultModel = configDefaultModel;\n }\n\n // 4. 创建渲染器(将有效 model 回传给 config 上下文)\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer, effectiveModel);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 4. 初始化 ModelProvider\n initializeModelProvider();\n\n // 4. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 4. 初始化 ModelProvider\n initializeModelProvider();\n\n // 4. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 4. 初始化 ModelProvider\n initializeModelProvider();\n\n // 4. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印 → 成功退出\n return EXIT_SUCCESS;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 工具列表命令 — 不走 Agent 执行\n if (config.listTools()) {\n return handleListTools(config);\n }\n\n // 3. 配置管理命令 — 不走 Agent 执行\n if (config.configAction() != null) {\n return handleConfig(config);\n }\n\n // 4. 初始化 ModelProvider\n initializeModelProvider();\n\n // 4. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 5. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n */\n /** 全局配置存储实例(延迟初始化) */\n private static volatile AliceConfigStore configStore;\n\n /** 获取或创建配置存储实例。 */\n private static AliceConfigStore configStore() {\n if (configStore == null) {\n synchronized (AliceCliLauncher.class) {\n if (configStore == null) {\n configStore = new AliceConfigStore();\n }\n }\n }\n return configStore;\n }\n\n private static int handleConfig(RunConfig config) {\n try {\n String action = config.configAction();\n String key = config.configKey();\n String value = config.configValue();\n AliceConfigStore store = configStore();\n\n if (\"set\".equals(action)) {\n if (key == null || value == null) {\n System.err.println(\"Usage: alice config set \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n return dispatchCommand(cmd);\n }\n\n /**\n * 分发已解析的 {@link AgentCommand}。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ClearContextCmd clear -> {\n System.out.println(\"Clearing context (session=\" + clear.sessionId() + \")\");\n System.out.println(\"上下文已清除\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.ViewContextCmd view -> {\n System.out.println(\"Viewing context (session=\" + view.sessionId() + \")\");\n System.out.println(\"── 上下文状态 ──\");\n System.out.println(\"会话 ID: \" + view.sessionId());\n System.out.println(\"Token 占用: N/A (Memory 模块待集成)\");\n System.out.println(\"消息滑动窗口: N/A\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ControlCmd.CompactContextCmd compact -> {\n System.out.println(\"Compacting context (session=\" + compact.sessionId() + \")\");\n System.out.println(\"上下文压缩请求已提交(待 Memory 模块提供总结接口)\");\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n /**\n * 将用户输入解析为 {@link AgentCommand} 并分发。\n *\n * \n *
\n *\n * @param input 用户原始输入\n * @return 退出码\n */\n public static int dispatchCommand(String input) {\n String sessionId = UUID.randomUUID().toString().substring(0, 8);\n String traceId = UUID.randomUUID().toString().substring(0, 12);\n\n AgentCommand cmd = AgentCommand.parse(input, sessionId, traceId);\n if (cmd == null) {\n System.err.println(\"Unrecognized command: \" + input);\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\n \"Dispatching AgentCommand: {} (session={})\", cmd.getClass().getSimpleName(), sessionId);\n\n return switch (cmd) {\n case org.cland.alice.agent.command.ExecutionCmd.AcquireGoalCmd run -> {\n System.out.println(\"Executing goal: \" + run.goal());\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.ExecutionCmd.ExecuteRawCmd exec -> {\n System.out.println(\"Executing raw: \" + exec.command());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.RegisterSkillCmd skill -> {\n System.out.println(\"Registering skill: \" + skill.skillRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.UpdateRulesCmd rules -> {\n System.out.println(\"Updating rules: \" + rules.rulesRef());\n yield EXIT_SUCCESS;\n }\n case CapabilityCmd.ReloadKernelCmd reload -> {\n System.out.println(\"Reloading kernel...\");\n yield EXIT_SUCCESS;\n }\n case org.cland.alice.agent.command.AlignmentCmd.SwitchModelCmd model -> {\n System.out.println(\"Switching model to: \" + model.modelId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.ResetSessionCmd reset -> {\n System.out.println(\"Resetting session: \" + reset.sessionId());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.FeedbackCmd fb -> {\n System.out.println(\"Feedback received: \" + fb.message());\n yield EXIT_SUCCESS;\n }\n case ControlCmd.InterruptCmd interrupt -> {\n System.out.println(\"Interrupted: \" + interrupt.cause());\n yield EXIT_SUCCESS;\n }\n case null, default -> {\n System.err.println(\"Unknown command type\");\n yield EXIT_PARAM_ERROR;\n }\n };\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n // 注册 JVM 关闭钩子处理 Ctrl+C\n Runtime.getRuntime()\n .addShutdownHook(\n new Thread(\n () -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n *\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final Logger logger = LoggerFactory.getLogger(AliceCliLauncher.class);\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n // 注册 JVM 关闭钩子处理 Ctrl+C\n Runtime.getRuntime().addShutdownHook(new Thread(() -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.info(\"RunConfig: {}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final System.Logger logger = System.getLogger(AliceCliLauncher.class.getName());\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n // 注册 JVM 关闭钩子处理 Ctrl+C\n Runtime.getRuntime().addShutdownHook(new Thread(() -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n public static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.log(System.Logger.Level.INFO, \"RunConfig: {0}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n * \n *
\n *\n * \n *
\n */\npublic final class AliceCliLauncher {\n\n private static final System.Logger logger = System.getLogger(AliceCliLauncher.class.getName());\n\n // 退出码常量\n public static final int EXIT_SUCCESS = 0;\n public static final int EXIT_RUNTIME_ERROR = 1;\n public static final int EXIT_PARAM_ERROR = 2;\n public static final int EXIT_INTERRUPTED = 130;\n\n private AliceCliLauncher() {\n // 工具类,不可实例化\n }\n\n /**\n * CLI 主入口点。\n *\n * @param args 命令行参数\n */\n public static void main(String[] args) {\n // 注册 JVM 关闭钩子处理 Ctrl+C\n Runtime.getRuntime().addShutdownHook(new Thread(() -> {\n System.err.println(\"\\nReceived shutdown signal. Exiting...\");\n }));\n\n int exitCode = run(args);\n System.exit(exitCode);\n }\n\n /**\n * CLI 运行逻辑(可测试的主逻辑)。\n *\n * @param args 命令行参数\n * @return 退出码\n */\n static int run(String[] args) {\n try {\n // 1. 解析参数\n CommandParser parser = new CommandParser();\n RunConfig config = parser.parse(args);\n\n if (config == null) {\n // parse 返回 null 表示帮助/版本信息已打印\n return EXIT_PARAM_ERROR;\n }\n\n logger.log(System.Logger.Level.INFO, \"RunConfig: {0}\", config);\n\n // 2. 初始化 ModelProvider\n initializeModelProvider();\n\n // 3. 创建渲染器\n OutputRenderer renderer = OutputRenderer.create(config);\n\n // 4. 执行任务\n ExecutionCoordinator coordinator = new ExecutionCoordinator(config, renderer);\n return coordinator.execute();\n\n } catch (ParseException e) {\n System.err.println(\"Error: \" + e.getMessage());\n return e.exitCode();\n }\n }\n\n // ========================================================================\n // 初始化\n // ========================================================================\n\n /**\n * 初始化模型提供器。\n * \n * START -> PERCEIVING -> PLANNING -> VERIFYING_PRE -> ACTING (Micro-ReAct)\n * -> OBSERVING -> VERIFYING_POST -> REFLECTING -> (loop|FINISH)\n *
\n *\n * \n * Agent agent = new Agent();\n * String result = agent.ask(\"What is the capital of France?\");\n * System.out.println(result); // \"Paris\"\n *
\n */\npublic class Agent implements AgentFacade {\n\n private static final Logger logger = LoggerFactory.getLogger(Agent.class);\n\n private final String agentId;\n private final String sessionId;\n private final AgentConfig config;\n private final Vertx vertx;\n private final AgentExecutor executor;\n\n // ========== 子模块引用(原 AgentCore 字段) ==========\n\n private PlannerService plannerService;\n private Verificator guardrail;\n private ToolRegistry toolRegistry;\n private AgentSession memory;\n private EnvEvent envAdapter;\n\n /** 最近一次 LLM 调用的推理/思考过程,供前端渲染 */\n private String lastReasoning;\n\n // ========== 构造 ==========\n\n public Agent() {\n this(null, AgentConfig.defaults());\n }\n\n public Agent(String agentId) {\n this(agentId, AgentConfig.defaults());\n }\n\n public Agent(AgentConfig config) {\n this(null, config);\n }\n\n public Agent(String agentId, String sessionId, AgentConfig config) {\n this.agentId = agentId != null ? agentId : UUID.randomUUID().toString().substring(0, 8);\n this.sessionId = sessionId != null ? sessionId : SnowflakeIdGenerator.generateSessionId();\n this.config = config;\n this.vertx = Vertx.vertx();\n this.executor = new AgentExecutor(vertx, this);\n }\n\n public Agent(String agentId, AgentConfig config) {\n this(agentId, null, config);\n }\n\n // ========== 属性 ==========\n\n @Override\n public String agentId() {\n return agentId;\n }\n\n @Override\n public AgentConfig config() {\n return config;\n }\n\n public Vertx vertx() {\n return vertx;\n }\n\n // ========== 依赖注入(原 AgentCore 的 with* 方法) ==========\n\n /** 注入 {@link PlannerService} — 规划器引擎。 */\n public Agent withPlannerService(PlannerService plannerService) {\n this.plannerService = plannerService;\n return this;\n }\n\n /**\n * 注入静态规划(SOP)函数,重建 {@link PlannerService} 以支持 SOP 匹配。\n *\n *