aemeathcli 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +66 -54
- package/dist/App-JQ622M66.js +4431 -0
- package/dist/App-JQ622M66.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/auth-status-JQJOKUPF.js.map +1 -0
- package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/chunk-36RXCZOV.js +88 -0
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
- package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
- package/dist/chunk-BIMQL4AG.js +186 -0
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
- package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
- package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
- package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/chunk-LQBALETG.js +71 -0
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/chunk-M3FPQSRU.js +12 -0
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/chunk-NQEUK763.js +26 -0
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/chunk-OPWAFS6Y.js +38 -0
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/chunk-VNZ3YTQD.js +232 -0
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/chunk-XEXWX7C7.js +241 -0
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/chunk-YPQ2MLAV.js +140 -0
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/chunk-ZCOVMVK4.js +26 -0
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
- package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
- package/dist/cli.js +370 -171
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
- package/dist/codex-login-LW5X7GAM.js.map +1 -0
- package/dist/config-store-NF56VHFU.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/conversation-store-7GRDQZD2.js.map +1 -0
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/detect-providers-QICJ5U3R.js.map +1 -0
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/first-run-ADROZVYF.js +230 -0
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
- package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
- package/dist/index.d.ts +46 -70
- package/dist/index.js +79 -468
- package/dist/index.js.map +1 -1
- package/dist/input-history-BEICE7PT.js +57 -0
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
- package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/logger-KGHUQ4VE.js.map +1 -0
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/model-discovery-AAJDHRFO.js.map +1 -0
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/pathResolver-UVAB2FCW.js +3 -0
- package/dist/pathResolver-UVAB2FCW.js.map +1 -0
- package/dist/profile-loader-EMLV4J7S.js +162 -0
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/sqlite-store-7OECRTXM.js.map +1 -0
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/team-state-HZNVMQHT.js.map +1 -0
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +11 -11
- package/dist/App-FKRSMFMB.js +0 -2789
- package/dist/App-FKRSMFMB.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-RWCNNAL7.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js +0 -211
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js +0 -234
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
- package/dist/codex-login-GZIFXUWD.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js.map +0 -1
- package/dist/registry-AZ2LOHHJ.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-XOMDMC77.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/teams/agent-process.ts","../src/teams/message-bus.ts","../src/teams/task-store.ts","../src/teams/plan-approval.ts","../src/teams/team-manager.ts"],"names":["randomUUID","join","existsSync","readdirSync","writeFileSync","readFileSync"],"mappings":"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","file":"chunk-HMJRPNPZ.js","sourcesContent":["/**\n * Agent subprocess management per PRD sections 8.1, 9.4\n * Each agent runs as a separate Node.js process (fork of aemeathcli).\n * Parent–child IPC uses JSON-RPC 2.0 protocol (IIPCMessage).\n */\n\nimport { fork, type ChildProcess } from \"node:child_process\";\nimport type {\n IAgentConfig,\n IAgentState,\n AgentStatus,\n IPCMethod,\n IIPCMessage,\n} from \"../types/index.js\";\nimport { AgentSpawnError } from \"../types/index.js\";\nimport { logger, getIPCSocketPath } from \"../utils/index.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\n\n// ── Public Types ──────────────────────────────────────────────────────\n\n/** Configuration for spawning an agent process. */\nexport interface IAgentProcessOptions {\n readonly teamName: string;\n readonly sessionId: string;\n readonly cliEntryPoint?: string | undefined;\n readonly env?: Readonly<Record<string, string>>;\n readonly shutdownTimeoutMs?: number;\n readonly registrationTimeoutMs?: number;\n}\n\n/** Callback for IPC messages received from the child process. */\nexport type AgentMessageCallback = (\n method: string,\n params: Record<string, unknown>,\n) => void;\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 10_000;\nconst DEFAULT_REGISTRATION_TIMEOUT_MS = 15_000;\n\n// ── AgentProcess ──────────────────────────────────────────────────────\n\nexport class AgentProcess {\n private readonly config: IAgentConfig;\n private readonly teamName: string;\n private readonly sessionId: string;\n private readonly cliEntryPoint: string;\n private readonly customEnv: Readonly<Record<string, string>>;\n private readonly shutdownTimeoutMs: number;\n private readonly registrationTimeoutMs: number;\n private readonly messageCallbacks = new Set<AgentMessageCallback>();\n\n private child: ChildProcess | null = null;\n private status: AgentStatus = \"idle\";\n private currentTaskId: string | undefined;\n private nextMessageId = 1;\n\n constructor(config: IAgentConfig, options: IAgentProcessOptions) {\n this.config = config;\n this.teamName = options.teamName;\n this.sessionId = options.sessionId;\n this.cliEntryPoint =\n options.cliEntryPoint ?? process.argv[1] ?? \"aemeathcli\";\n this.customEnv = options.env ?? {};\n this.shutdownTimeoutMs =\n options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n this.registrationTimeoutMs =\n options.registrationTimeoutMs ?? DEFAULT_REGISTRATION_TIMEOUT_MS;\n }\n\n /** Spawn the child process. Throws AgentSpawnError on failure. */\n async start(): Promise<void> {\n if (this.child) {\n throw new AgentSpawnError(\n this.config.name,\n \"Agent process already running\",\n );\n }\n\n const args = [\n \"--agent\",\n \"--team\",\n this.teamName,\n \"--name\",\n this.config.name,\n \"--model\",\n this.config.model,\n \"--role\",\n this.config.role,\n ];\n\n const socketPath = getIPCSocketPath(this.sessionId);\n\n const env: Record<string, string | undefined> = {\n ...process.env,\n ...this.customEnv,\n AEMEATHCLI_AGENT_MODE: \"1\",\n AEMEATHCLI_TEAM_NAME: this.teamName,\n AEMEATHCLI_AGENT_ID: this.config.agentId,\n AEMEATHCLI_AGENT_NAME: this.config.name,\n AEMEATHCLI_IPC_SOCKET: socketPath,\n // Prefer SDK adapters when API keys are available (not OAuth/native login).\n // Native login credentials always use native CLI adapters regardless of\n // this flag — the registry enforces this to avoid \"invalid API key\" errors.\n AEMEATHCLI_PREFER_SDK: \"1\",\n // Increase timeout for native CLI fallback (agent tasks can be long).\n AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS: \"300000\",\n };\n\n try {\n this.child = fork(this.cliEntryPoint, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\", \"ipc\"],\n env,\n detached: false,\n });\n\n this.setupChildListeners();\n this.setStatus(\"idle\");\n\n await this.waitForRegistration();\n\n getEventBus().emit(\"agent:spawned\", {\n agentName: this.config.name,\n model: this.config.model,\n });\n\n logger.info(\n {\n agent: this.config.name,\n pid: this.child.pid,\n model: this.config.model,\n },\n \"Agent process spawned\",\n );\n } catch (error: unknown) {\n // Kill orphaned child on startup failure\n if (this.child) {\n this.child.kill(\"SIGTERM\");\n this.child = null;\n }\n const reason = error instanceof Error ? error.message : String(error);\n throw new AgentSpawnError(this.config.name, reason);\n }\n }\n\n /** Gracefully stop the agent. Falls back to SIGTERM after timeout. */\n async stop(): Promise<void> {\n if (!this.child) return;\n\n const child = this.child;\n\n this.sendIPC(\"hub.shutdown\", { reason: \"team_cleanup\" });\n\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (child.exitCode === null) {\n logger.warn(\n { agent: this.config.name },\n \"Force-killing unresponsive agent\",\n );\n child.kill(\"SIGTERM\");\n }\n resolve();\n }, this.shutdownTimeoutMs);\n\n child.once(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n\n this.cleanup();\n logger.info({ agent: this.config.name }, \"Agent process stopped\");\n }\n\n /** Kill and restart the agent process. */\n async restart(): Promise<void> {\n await this.stop();\n await this.start();\n }\n\n /** Send a JSON-RPC 2.0 message to the child process. Returns message ID. */\n sendIPC(method: IPCMethod, params: Record<string, unknown>): number {\n if (!this.child?.connected) {\n logger.warn(\n { agent: this.config.name, method },\n \"Cannot send IPC: child not connected\",\n );\n return -1;\n }\n\n const id = this.nextMessageId++;\n const message: IIPCMessage = {\n jsonrpc: \"2.0\",\n method,\n params,\n id,\n };\n\n this.child.send(message);\n return id;\n }\n\n /** Assign a task to this agent via IPC. */\n assignTask(taskId: string, subject: string, description: string): number {\n this.currentTaskId = taskId;\n return this.sendIPC(\"hub.taskAssign\", { taskId, subject, description });\n }\n\n /** Register a callback for IPC messages from the child process. */\n onMessage(callback: AgentMessageCallback): () => void {\n this.messageCallbacks.add(callback);\n return () => {\n this.messageCallbacks.delete(callback);\n };\n }\n\n /** Get the current agent state snapshot. */\n getState(): IAgentState {\n return {\n config: this.config,\n status: this.status,\n currentTaskId: this.currentTaskId,\n };\n }\n\n /** Get the current status. */\n getStatus(): AgentStatus {\n return this.status;\n }\n\n /** Get the child process PID, or undefined if not running. */\n getPid(): number | undefined {\n return this.child?.pid;\n }\n\n /** Check if the child process is alive. */\n isAlive(): boolean {\n return this.child !== null && this.child.exitCode === null;\n }\n\n // ── Private ──────────────────────────────────────────────────────────\n\n private setupChildListeners(): void {\n const child = this.child;\n if (!child) return;\n\n // Do NOT forward child stdout as agent.streamChunk.\n // The agent child sends all structured output via IPC (process.send).\n // Forwarding stdout captures raw noise from subprocess execution\n // (e.g. native CLI adapters shelling out to codex/gemini/claude).\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n const content = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf-8\");\n if (content.length > 0) {\n logger.debug(\n { agent: this.config.name, bytes: content.length },\n \"Agent stdout (suppressed from UI)\",\n );\n }\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n const content = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf-8\");\n if (content.length > 0) {\n logger.warn(\n { agent: this.config.name, stderr: content.slice(0, 200) },\n \"Agent stderr\",\n );\n }\n });\n\n child.on(\"message\", (raw: unknown) => {\n this.handleChildMessage(raw);\n });\n\n child.on(\"error\", (error: Error) => {\n logger.error(\n { agent: this.config.name, error: error.message },\n \"Agent process error\",\n );\n this.setStatus(\"error\");\n });\n\n child.on(\"exit\", (code: number | null, signal: string | null) => {\n logger.info(\n { agent: this.config.name, code, signal },\n \"Agent process exited\",\n );\n this.setStatus(\"shutdown\");\n this.child = null;\n });\n\n child.on(\"disconnect\", () => {\n logger.debug({ agent: this.config.name }, \"Agent IPC disconnected\");\n });\n }\n\n private handleChildMessage(raw: unknown): void {\n if (!isIPCMessage(raw)) {\n logger.warn(\n { agent: this.config.name },\n \"Received non-IPC message from child\",\n );\n return;\n }\n\n const { method, params } = raw;\n\n // Handle known methods internally\n switch (method) {\n case \"agent.register\":\n logger.debug({ agent: this.config.name }, \"Agent registered via IPC\");\n break;\n\n case \"agent.taskUpdate\": {\n const taskStatus = params[\"status\"];\n if (typeof taskStatus === \"string\") {\n if (taskStatus === \"in_progress\") {\n this.setStatus(\"active\");\n } else if (taskStatus === \"completed\") {\n this.currentTaskId = undefined;\n this.setStatus(\"idle\");\n }\n }\n break;\n }\n\n case \"agent.streamChunk\":\n case \"agent.message\":\n // Forwarded to registered callbacks below\n break;\n\n default:\n break;\n }\n\n this.notifyCallbacks(method, params);\n }\n\n /** Wait for the child to send agent.register. Rejects on timeout or early exit. */\n private async waitForRegistration(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.child?.removeListener(\"message\", onMessage);\n reject(new Error(\"Agent registration timeout\"));\n }, this.registrationTimeoutMs);\n\n const onMessage = (raw: unknown): void => {\n if (isIPCMessage(raw) && raw.method === \"agent.register\") {\n clearTimeout(timeout);\n this.child?.removeListener(\"message\", onMessage);\n this.child?.removeListener(\"exit\", onExit);\n resolve();\n }\n };\n\n const onExit = (): void => {\n clearTimeout(timeout);\n this.child?.removeListener(\"message\", onMessage);\n reject(new Error(\"Agent process exited before registration\"));\n };\n\n this.child?.on(\"message\", onMessage);\n this.child?.once(\"exit\", onExit);\n });\n }\n\n private setStatus(status: AgentStatus): void {\n this.status = status;\n getEventBus().emit(\"agent:status\", {\n agentName: this.config.name,\n status,\n });\n }\n\n private notifyCallbacks(method: string, params: Record<string, unknown>): void {\n for (const callback of this.messageCallbacks) {\n try {\n callback(method, params);\n } catch (error: unknown) {\n const reason = error instanceof Error ? error.message : String(error);\n logger.error(\n { agent: this.config.name, error: reason },\n \"Message callback threw\",\n );\n }\n }\n }\n\n private cleanup(): void {\n this.child = null;\n this.currentTaskId = undefined;\n this.messageCallbacks.clear();\n }\n}\n\n// ── Type Guard ─────────────────────────────────────────────────────────\n\nfunction isIPCMessage(value: unknown): value is IIPCMessage {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n obj[\"jsonrpc\"] === \"2.0\" &&\n typeof obj[\"method\"] === \"string\" &&\n typeof obj[\"params\"] === \"object\" &&\n obj[\"params\"] !== null\n );\n}\n","/**\n * Inter-agent message routing per PRD section 8.4\n * Supports: DM, broadcast, shutdown, plan approval, task updates.\n * Message queue for busy agents with automatic drain on idle transition.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type {\n IAgentMessage,\n AgentMessageType,\n AgentStatus,\n} from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\n\n// ── Public Types ──────────────────────────────────────────────────────\n\n/** Handler function invoked when an agent receives a message. */\nexport type MessageHandler = (message: IAgentMessage) => void;\n\n/**\n * Optional transport layer for remote message delivery (e.g., IPC hub).\n * Implement this interface to bridge the message bus to Unix domain sockets.\n */\nexport interface IMessageTransport {\n send(agentId: string, message: IAgentMessage): Promise<boolean>;\n onReceive(handler: (message: IAgentMessage) => void): () => void;\n}\n\n/** Options for constructing a MessageBus. */\nexport interface IMessageBusOptions {\n readonly transport?: IMessageTransport;\n}\n\n// ── MessageBus ────────────────────────────────────────────────────────\n\nexport class MessageBus {\n private readonly handlers = new Map<string, Set<MessageHandler>>();\n private readonly queues = new Map<string, IAgentMessage[]>();\n private readonly statuses = new Map<string, AgentStatus>();\n private readonly transport: IMessageTransport | undefined;\n private readonly transportUnsubscribe: (() => void) | undefined;\n private destroyed = false;\n\n constructor(options?: IMessageBusOptions) {\n this.transport = options?.transport;\n\n if (this.transport) {\n this.transportUnsubscribe = this.transport.onReceive((message) => {\n this.routeIncoming(message);\n });\n }\n }\n\n /** Register an agent as available for message delivery. */\n registerAgent(agentId: string): void {\n if (!this.handlers.has(agentId)) {\n this.handlers.set(agentId, new Set());\n }\n if (!this.queues.has(agentId)) {\n this.queues.set(agentId, []);\n }\n this.statuses.set(agentId, \"idle\");\n logger.debug({ agentId }, \"Agent registered on message bus\");\n }\n\n /** Remove an agent from the bus. Pending messages are discarded. */\n unregisterAgent(agentId: string): void {\n this.handlers.delete(agentId);\n this.queues.delete(agentId);\n this.statuses.delete(agentId);\n logger.debug({ agentId }, \"Agent unregistered from message bus\");\n }\n\n /** Subscribe to messages delivered to an agent. Returns unsubscribe function. */\n subscribe(agentId: string, handler: MessageHandler): () => void {\n let handlerSet = this.handlers.get(agentId);\n if (!handlerSet) {\n handlerSet = new Set();\n this.handlers.set(agentId, handlerSet);\n }\n handlerSet.add(handler);\n\n return () => {\n handlerSet.delete(handler);\n };\n }\n\n /** Route a message to its recipient(s). Returns true if delivered or queued. */\n send(message: IAgentMessage): boolean {\n if (this.destroyed) {\n logger.warn(\"MessageBus is destroyed, dropping message\");\n return false;\n }\n\n if (message.type === \"broadcast\") {\n return this.broadcastToAll(message);\n }\n\n if (!message.recipientId) {\n logger.warn(\n { type: message.type, senderId: message.senderId },\n \"Non-broadcast message missing recipientId\",\n );\n return false;\n }\n\n return this.deliverToAgent(message.recipientId, message);\n }\n\n /** Create a well-formed message and send it. Returns the created message. */\n createAndSend(\n type: AgentMessageType,\n senderId: string,\n recipientId: string | undefined,\n content: string,\n extra?: {\n summary?: string;\n requestId?: string;\n approve?: boolean;\n },\n ): IAgentMessage {\n const message: IAgentMessage = {\n type,\n senderId,\n recipientId,\n content,\n summary: extra?.summary,\n requestId: extra?.requestId ?? randomUUID(),\n approve: extra?.approve,\n timestamp: new Date(),\n };\n\n this.send(message);\n return message;\n }\n\n /** Update an agent's status. Drains the queue when transitioning to idle. */\n setAgentStatus(agentId: string, status: AgentStatus): void {\n const previous = this.statuses.get(agentId);\n this.statuses.set(agentId, status);\n\n if (status === \"idle\" && previous === \"active\") {\n this.drainQueue(agentId);\n }\n }\n\n /** Get the number of queued messages for an agent. */\n getQueueSize(agentId: string): number {\n return this.queues.get(agentId)?.length ?? 0;\n }\n\n /** Get all registered agent IDs. */\n getRegisteredAgents(): readonly string[] {\n return [...this.handlers.keys()];\n }\n\n /** Tear down the message bus and release resources. */\n destroy(): void {\n this.destroyed = true;\n this.transportUnsubscribe?.();\n this.handlers.clear();\n this.queues.clear();\n this.statuses.clear();\n logger.debug(\"MessageBus destroyed\");\n }\n\n // ── Private Routing ─────────────────────────────────────────────────\n\n private broadcastToAll(message: IAgentMessage): boolean {\n let delivered = false;\n\n for (const agentId of this.handlers.keys()) {\n if (agentId === message.senderId) continue;\n\n const copy: IAgentMessage = { ...message, recipientId: agentId };\n this.deliverToAgent(agentId, copy);\n delivered = true;\n }\n\n return delivered;\n }\n\n private deliverToAgent(agentId: string, message: IAgentMessage): boolean {\n const status = this.statuses.get(agentId);\n\n // Queue if agent is busy\n if (status === \"active\") {\n this.enqueue(agentId, message);\n logger.debug(\n { agentId, type: message.type },\n \"Agent busy, message queued\",\n );\n return true;\n }\n\n // Try local handler delivery\n const handlerSet = this.handlers.get(agentId);\n if (handlerSet && handlerSet.size > 0) {\n this.invokeHandlers(agentId, handlerSet, message);\n return true;\n }\n\n // Try remote transport\n if (this.transport) {\n this.transport.send(agentId, message).catch((error: unknown) => {\n const reason = error instanceof Error ? error.message : String(error);\n logger.error({ agentId, error: reason }, \"Transport delivery failed\");\n });\n return true;\n }\n\n // No handler and no transport — queue for later\n this.enqueue(agentId, message);\n return true;\n }\n\n private invokeHandlers(\n agentId: string,\n handlerSet: Set<MessageHandler>,\n message: IAgentMessage,\n ): void {\n for (const handler of handlerSet) {\n try {\n handler(message);\n } catch (error: unknown) {\n const reason = error instanceof Error ? error.message : String(error);\n logger.error({ agentId, error: reason }, \"Message handler threw\");\n }\n }\n\n getEventBus().emit(\"agent:message\", {\n from: message.senderId,\n to: agentId,\n content: message.content,\n });\n }\n\n private enqueue(agentId: string, message: IAgentMessage): void {\n let queue = this.queues.get(agentId);\n if (!queue) {\n queue = [];\n this.queues.set(agentId, queue);\n }\n queue.push(message);\n }\n\n private drainQueue(agentId: string): void {\n const queue = this.queues.get(agentId);\n if (!queue || queue.length === 0) return;\n\n const handlerSet = this.handlers.get(agentId);\n if (!handlerSet || handlerSet.size === 0) return;\n\n const pending = queue.splice(0);\n logger.debug({ agentId, count: pending.length }, \"Draining message queue\");\n\n for (const message of pending) {\n this.invokeHandlers(agentId, handlerSet, message);\n }\n }\n\n private routeIncoming(message: IAgentMessage): void {\n if (message.type === \"broadcast\") {\n this.broadcastToAll(message);\n } else if (message.recipientId) {\n this.deliverToAgent(message.recipientId, message);\n }\n }\n}\n","/**\n * File-based task persistence per PRD section 20.2\n * Atomic writes for crash recovery: write to temp file, then rename.\n * Store at getTasksDir()/teamName/taskId.json\n */\n\nimport { join } from \"node:path\";\nimport {\n readFileSync,\n writeFileSync,\n renameSync,\n unlinkSync,\n readdirSync,\n existsSync,\n} from \"node:fs\";\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\nimport { logger, getTasksDir, ensureDirectory } from \"../utils/index.js\";\n\n// ── Serialization Format ──────────────────────────────────────────────\n\n/** Serialized task format with ISO-8601 date strings for JSON persistence. */\ninterface ISerializedTask {\n readonly id: string;\n readonly subject: string;\n readonly description: string;\n readonly status: TaskStatus;\n readonly owner?: string | undefined;\n readonly model?: string | undefined;\n readonly role?: ModelRole | undefined;\n readonly blocks: readonly string[];\n readonly blockedBy: readonly string[];\n readonly createdAt: string;\n readonly updatedAt: string;\n}\n\n// ── TaskStore ─────────────────────────────────────────────────────────\n\nexport class TaskStore {\n private readonly storeDir: string;\n\n constructor(teamName: string) {\n this.storeDir = join(getTasksDir(), teamName);\n ensureDirectory(this.storeDir);\n this.cleanupTempFiles();\n }\n\n /** Persist a task to disk with atomic write (temp + rename). */\n save(task: ITask): void {\n const serialized = TaskStore.serialize(task);\n const filePath = this.getTaskFilePath(task.id);\n const tmpPath = `${filePath}.tmp`;\n\n try {\n writeFileSync(tmpPath, JSON.stringify(serialized, null, 2), {\n encoding: \"utf-8\",\n mode: 0o644,\n });\n renameSync(tmpPath, filePath);\n logger.debug({ taskId: task.id }, \"Task persisted to disk\");\n } catch (error: unknown) {\n try {\n unlinkSync(tmpPath);\n } catch {\n /* temp cleanup best-effort */\n }\n const reason = error instanceof Error ? error.message : String(error);\n logger.error({ taskId: task.id, error: reason }, \"Failed to save task\");\n throw error;\n }\n }\n\n /** Load a single task by ID. Throws if not found. */\n load(taskId: string): ITask {\n const filePath = this.getTaskFilePath(taskId);\n if (!existsSync(filePath)) {\n throw new Error(`Task file not found: ${taskId}`);\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const data: unknown = JSON.parse(raw);\n return TaskStore.deserialize(data as ISerializedTask);\n }\n\n /** Load all tasks for this team, sorted by creation time. */\n loadAll(): ITask[] {\n if (!existsSync(this.storeDir)) {\n return [];\n }\n\n const files = readdirSync(this.storeDir).filter(\n (f) => f.endsWith(\".json\") && !f.endsWith(\".tmp\"),\n );\n const tasks: ITask[] = [];\n\n for (const file of files) {\n try {\n const raw = readFileSync(join(this.storeDir, file), \"utf-8\");\n const data: unknown = JSON.parse(raw);\n tasks.push(TaskStore.deserialize(data as ISerializedTask));\n } catch (error: unknown) {\n const reason = error instanceof Error ? error.message : String(error);\n logger.warn({ file, error: reason }, \"Skipping corrupt task file\");\n }\n }\n\n return tasks.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n }\n\n /** Remove a task file from disk. Returns true if deleted. */\n remove(taskId: string): boolean {\n const filePath = this.getTaskFilePath(taskId);\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n unlinkSync(filePath);\n logger.debug({ taskId }, \"Task file removed\");\n return true;\n } catch (error: unknown) {\n const reason = error instanceof Error ? error.message : String(error);\n logger.error({ taskId, error: reason }, \"Failed to remove task file\");\n return false;\n }\n }\n\n /** Check whether a task file exists on disk. */\n exists(taskId: string): boolean {\n return existsSync(this.getTaskFilePath(taskId));\n }\n\n /** Absolute path to this team's task store directory. */\n getStorePath(): string {\n return this.storeDir;\n }\n\n // ── Private ──────────────────────────────────────────────────────────\n\n private getTaskFilePath(taskId: string): string {\n return join(this.storeDir, `${taskId}.json`);\n }\n\n /** Remove orphaned .tmp files left from interrupted writes. */\n private cleanupTempFiles(): void {\n if (!existsSync(this.storeDir)) return;\n\n const tmpFiles = readdirSync(this.storeDir).filter((f) =>\n f.endsWith(\".tmp\"),\n );\n\n for (const file of tmpFiles) {\n try {\n unlinkSync(join(this.storeDir, file));\n } catch {\n /* best-effort */\n }\n }\n\n if (tmpFiles.length > 0) {\n logger.info(\n { count: tmpFiles.length },\n \"Cleaned up stale temp task files\",\n );\n }\n }\n\n private static serialize(task: ITask): ISerializedTask {\n return {\n id: task.id,\n subject: task.subject,\n description: task.description,\n status: task.status,\n owner: task.owner,\n model: task.model,\n role: task.role,\n blocks: [...task.blocks],\n blockedBy: [...task.blockedBy],\n createdAt: task.createdAt.toISOString(),\n updatedAt: task.updatedAt.toISOString(),\n };\n }\n\n private static deserialize(data: ISerializedTask): ITask {\n return {\n id: data.id,\n subject: data.subject,\n description: data.description,\n status: data.status,\n owner: data.owner,\n model: data.model,\n role: data.role,\n blocks: [...data.blocks],\n blockedBy: [...data.blockedBy],\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n };\n }\n}\n","/**\n * Plan approval workflow per PRD section 8.2 step 5\n * Agent submits plan → Leader reviews → Approve or reject.\n * Uses message bus for transport; includes configurable timeout.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type { IAgentMessage } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport type { MessageBus } from \"./message-bus.js\";\n\n// ── Public Types ──────────────────────────────────────────────────────\n\n/** Result of a plan approval request. */\nexport interface IPlanApprovalResult {\n readonly approved: boolean;\n readonly feedback?: string | undefined;\n readonly requestId: string;\n readonly respondedBy: string;\n readonly respondedAt: Date;\n}\n\n/** A pending plan awaiting leader review (for listing). */\nexport interface IPendingPlan {\n readonly requestId: string;\n readonly agentId: string;\n readonly plan: string;\n readonly submittedAt: Date;\n}\n\n/** Options for the PlanApproval workflow. */\nexport interface IPlanApprovalOptions {\n readonly leaderId?: string;\n readonly timeoutMs?: number;\n}\n\n// ── Internal Types ────────────────────────────────────────────────────\n\ninterface IPlanRequest {\n readonly requestId: string;\n readonly agentId: string;\n readonly plan: string;\n readonly submittedAt: Date;\n readonly resolve: (result: IPlanApprovalResult) => void;\n readonly reject: (reason: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\n// ── Constants ─────────────────────────────────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\nconst DEFAULT_LEADER_ID = \"leader\";\n\n// ── PlanApproval ──────────────────────────────────────────────────────\n\nexport class PlanApproval {\n private readonly messageBus: MessageBus;\n private readonly leaderId: string;\n private readonly timeoutMs: number;\n private readonly pending = new Map<string, IPlanRequest>();\n private destroyed = false;\n\n constructor(messageBus: MessageBus, options?: IPlanApprovalOptions) {\n this.messageBus = messageBus;\n this.leaderId = options?.leaderId ?? DEFAULT_LEADER_ID;\n this.timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /**\n * Submit a plan for approval. Returns a promise that resolves\n * when the leader approves or rejects, or rejects on timeout.\n */\n submitPlan(agentId: string, plan: string): Promise<IPlanApprovalResult> {\n if (this.destroyed) {\n return Promise.reject(new Error(\"PlanApproval has been destroyed\"));\n }\n\n const requestId = randomUUID();\n\n return new Promise<IPlanApprovalResult>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(requestId);\n reject(new Error(`Plan approval timed out after ${this.timeoutMs}ms`));\n }, this.timeoutMs);\n\n const request: IPlanRequest = {\n requestId,\n agentId,\n plan,\n submittedAt: new Date(),\n resolve,\n reject,\n timer,\n };\n\n this.pending.set(requestId, request);\n\n this.messageBus.createAndSend(\n \"plan_approval_request\",\n agentId,\n this.leaderId,\n plan,\n { requestId, summary: `Plan from ${agentId} awaiting review` },\n );\n\n logger.info({ requestId, agentId }, \"Plan submitted for approval\");\n });\n }\n\n /** Leader approves a pending plan. Returns false if no matching request. */\n approvePlan(requestId: string, responderId: string): boolean {\n const request = this.pending.get(requestId);\n if (!request) {\n logger.warn({ requestId }, \"No pending plan for this requestId\");\n return false;\n }\n\n clearTimeout(request.timer);\n this.pending.delete(requestId);\n\n const result: IPlanApprovalResult = {\n approved: true,\n requestId,\n respondedBy: responderId,\n respondedAt: new Date(),\n };\n\n this.messageBus.createAndSend(\n \"plan_approval_response\",\n responderId,\n request.agentId,\n \"Plan approved\",\n { requestId, approve: true },\n );\n\n request.resolve(result);\n logger.info({ requestId, agentId: request.agentId }, \"Plan approved\");\n return true;\n }\n\n /** Leader rejects a pending plan with feedback. */\n rejectPlan(\n requestId: string,\n responderId: string,\n feedback: string,\n ): boolean {\n const request = this.pending.get(requestId);\n if (!request) {\n logger.warn({ requestId }, \"No pending plan for this requestId\");\n return false;\n }\n\n clearTimeout(request.timer);\n this.pending.delete(requestId);\n\n const result: IPlanApprovalResult = {\n approved: false,\n feedback,\n requestId,\n respondedBy: responderId,\n respondedAt: new Date(),\n };\n\n this.messageBus.createAndSend(\n \"plan_approval_response\",\n responderId,\n request.agentId,\n feedback,\n { requestId, approve: false },\n );\n\n request.resolve(result);\n logger.info(\n { requestId, agentId: request.agentId, feedback },\n \"Plan rejected\",\n );\n return true;\n }\n\n /**\n * Handle an incoming plan_approval_response message.\n * Call this from a message bus subscription to close the request loop.\n */\n handleResponse(message: IAgentMessage): void {\n if (message.type !== \"plan_approval_response\" || !message.requestId) {\n return;\n }\n\n const request = this.pending.get(message.requestId);\n if (!request) return;\n\n clearTimeout(request.timer);\n this.pending.delete(message.requestId);\n\n const result: IPlanApprovalResult = {\n approved: message.approve === true,\n feedback: message.approve === true ? undefined : message.content,\n requestId: message.requestId,\n respondedBy: message.senderId,\n respondedAt: new Date(),\n };\n\n request.resolve(result);\n }\n\n /** Cancel a pending plan request. */\n cancelPlan(requestId: string): boolean {\n const request = this.pending.get(requestId);\n if (!request) return false;\n\n clearTimeout(request.timer);\n this.pending.delete(requestId);\n request.reject(new Error(\"Plan approval cancelled\"));\n\n logger.info({ requestId, agentId: request.agentId }, \"Plan cancelled\");\n return true;\n }\n\n /** Get all pending plan requests (for leader UI). */\n getPendingPlans(): readonly IPendingPlan[] {\n return [...this.pending.values()].map((req) => ({\n requestId: req.requestId,\n agentId: req.agentId,\n plan: req.plan,\n submittedAt: req.submittedAt,\n }));\n }\n\n /** Get the count of pending plans. */\n getPendingCount(): number {\n return this.pending.size;\n }\n\n /** Tear down: cancel all pending plans and release resources. */\n destroy(): void {\n this.destroyed = true;\n\n for (const [, request] of this.pending) {\n clearTimeout(request.timer);\n request.reject(new Error(\"PlanApproval destroyed\"));\n }\n\n this.pending.clear();\n logger.debug(\"PlanApproval destroyed\");\n }\n}\n","/**\n * Team creation and lifecycle management per PRD section 8.2\n * Orchestrates agents, tasks, messaging, and plan approval for a team.\n */\n\nimport { join } from \"node:path\";\nimport {\n readFileSync,\n writeFileSync,\n readdirSync,\n rmSync,\n existsSync,\n} from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n ITeamConfig,\n IAgentConfig,\n IAgentState,\n TeamStatus,\n ProviderName,\n ModelRole,\n} from \"../types/index.js\";\nimport {\n logger,\n getTeamsDir,\n getTasksDir,\n ensureDirectory,\n} from \"../utils/index.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\nimport { AgentProcess, type IAgentProcessOptions } from \"./agent-process.js\";\nimport { MessageBus } from \"./message-bus.js\";\nimport { TaskStore } from \"./task-store.js\";\nimport { PlanApproval } from \"./plan-approval.js\";\n\n// ── Public Types ──────────────────────────────────────────────────────\n\n/** Agent definition used when creating a team. */\nexport interface IAgentDefinition {\n readonly name: string;\n readonly agentType: string;\n readonly model: string;\n readonly provider: ProviderName;\n readonly role: ModelRole;\n}\n\n/** Options for createTeam(). */\nexport interface ITeamCreateOptions {\n readonly description?: string;\n readonly agents: readonly IAgentDefinition[];\n readonly sessionId?: string;\n readonly cliEntryPoint?: string;\n}\n\n// ── Internal Types ────────────────────────────────────────────────────\n\n/** Serialized team config for JSON persistence (dates as ISO strings). */\ninterface ISerializedTeamConfig {\n readonly teamName: string;\n readonly description?: string | undefined;\n readonly status: TeamStatus;\n readonly members: readonly IAgentConfig[];\n readonly createdAt: string;\n}\n\n/** Runtime state for an active team. */\ninterface IActiveTeam {\n readonly config: ITeamConfig;\n readonly processes: Map<string, AgentProcess>;\n readonly messageBus: MessageBus;\n readonly taskStore: TaskStore;\n readonly planApproval: PlanApproval;\n readonly sessionId: string;\n}\n\n// ── Validation ────────────────────────────────────────────────────────\n\nconst TEAM_NAME_PATTERN = /^[\\w-]+$/;\n\n// ── TeamManager ───────────────────────────────────────────────────────\n\nexport class TeamManager {\n private readonly activeTeams = new Map<string, IActiveTeam>();\n\n /** Create a new team: config, directories, and agent process handles. */\n async createTeam(\n name: string,\n options: ITeamCreateOptions,\n ): Promise<ITeamConfig> {\n if (this.activeTeams.has(name)) {\n throw new Error(`Team already exists: ${name}`);\n }\n\n if (!TEAM_NAME_PATTERN.test(name)) {\n throw new Error(\n `Invalid team name: \"${name}\". Use alphanumeric characters, dashes, or underscores.`,\n );\n }\n\n const teamDir = join(getTeamsDir(), name);\n if (existsSync(teamDir)) {\n throw new Error(`Team directory already exists: ${teamDir}`);\n }\n\n // Build agent configs with generated IDs\n const members: IAgentConfig[] = options.agents.map((def) => ({\n name: def.name,\n agentId: randomUUID(),\n agentType: def.agentType,\n model: def.model,\n provider: def.provider,\n role: def.role,\n }));\n\n const config: ITeamConfig = {\n teamName: name,\n description: options.description,\n status: \"active\",\n members,\n createdAt: new Date(),\n };\n\n // Create directories\n ensureDirectory(teamDir);\n ensureDirectory(join(getTasksDir(), name));\n\n // Persist config\n this.saveTeamConfig(name, config);\n\n // Initialize runtime resources\n const sessionId = options.sessionId ?? randomUUID();\n const messageBus = new MessageBus();\n const taskStore = new TaskStore(name);\n const planApproval = new PlanApproval(messageBus);\n\n // Create agent process handles (not yet started)\n const processes = new Map<string, AgentProcess>();\n\n for (const member of members) {\n const processOptions: IAgentProcessOptions = {\n teamName: name,\n sessionId,\n cliEntryPoint: options.cliEntryPoint,\n };\n\n const agentProcess = new AgentProcess(member, processOptions);\n processes.set(member.name, agentProcess);\n messageBus.registerAgent(member.agentId);\n }\n\n const activeTeam: IActiveTeam = {\n config,\n processes,\n messageBus,\n taskStore,\n planApproval,\n sessionId,\n };\n\n this.activeTeams.set(name, activeTeam);\n\n getEventBus().emit(\"team:created\", {\n teamName: name,\n agentCount: members.length,\n });\n\n logger.info(\n { team: name, agents: members.length, sessionId },\n \"Team created\",\n );\n\n return config;\n }\n\n /** Start all agent processes for a team. */\n async startAgents(teamName: string): Promise<void> {\n const team = this.getActiveTeam(teamName);\n const startPromises: Promise<void>[] = [];\n\n for (const [agentName, agentProcess] of team.processes) {\n startPromises.push(\n agentProcess.start().catch((error: unknown) => {\n const reason =\n error instanceof Error ? error.message : String(error);\n logger.error(\n { team: teamName, agent: agentName, error: reason },\n \"Failed to start agent\",\n );\n }),\n );\n }\n\n await Promise.allSettled(startPromises);\n }\n\n /** Gracefully shutdown and remove a team. */\n async deleteTeam(name: string): Promise<void> {\n const active = this.activeTeams.get(name);\n\n if (active) {\n await this.shutdownAgents(active);\n active.planApproval.destroy();\n active.messageBus.destroy();\n this.activeTeams.delete(name);\n }\n\n // Remove directories from disk\n const teamDir = join(getTeamsDir(), name);\n if (existsSync(teamDir)) {\n rmSync(teamDir, { recursive: true, force: true });\n }\n\n const taskDir = join(getTasksDir(), name);\n if (existsSync(taskDir)) {\n rmSync(taskDir, { recursive: true, force: true });\n }\n\n getEventBus().emit(\"team:deleted\", { teamName: name });\n logger.info({ team: name }, \"Team deleted\");\n }\n\n /** List all teams from disk (active and inactive). */\n listTeams(): ITeamConfig[] {\n const teamsDir = getTeamsDir();\n if (!existsSync(teamsDir)) return [];\n\n const entries = readdirSync(teamsDir, { withFileTypes: true });\n const configs: ITeamConfig[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n try {\n const teamConfig = this.loadTeamConfig(entry.name);\n configs.push(teamConfig);\n } catch (error: unknown) {\n const reason = error instanceof Error ? error.message : String(error);\n logger.warn(\n { team: entry.name, error: reason },\n \"Skipping unreadable team\",\n );\n }\n }\n\n return configs;\n }\n\n /** Load a team config from disk. Throws if not found. */\n getTeam(name: string): ITeamConfig {\n return this.loadTeamConfig(name);\n }\n\n /** Get the runtime state of a specific agent within an active team. */\n getAgentState(\n teamName: string,\n agentName: string,\n ): IAgentState | undefined {\n const team = this.activeTeams.get(teamName);\n if (!team) return undefined;\n\n const agentProcess = team.processes.get(agentName);\n return agentProcess?.getState();\n }\n\n /** Get all agent states for an active team. */\n getAgentStates(teamName: string): readonly IAgentState[] {\n const team = this.activeTeams.get(teamName);\n if (!team) return [];\n\n return [...team.processes.values()].map((p) => p.getState());\n }\n\n /** Get the message bus for an active team. */\n getMessageBus(teamName: string): MessageBus | undefined {\n return this.activeTeams.get(teamName)?.messageBus;\n }\n\n /** Get the task store for an active team. */\n getTaskStore(teamName: string): TaskStore | undefined {\n return this.activeTeams.get(teamName)?.taskStore;\n }\n\n /** Get the plan approval handler for an active team. */\n getPlanApproval(teamName: string): PlanApproval | undefined {\n return this.activeTeams.get(teamName)?.planApproval;\n }\n\n /** Register a callback for IPC messages from all agents in a team. Returns cleanup function. */\n onAgentMessages(\n teamName: string,\n callback: (agentName: string, method: string, params: Record<string, unknown>) => void,\n ): () => void {\n const team = this.getActiveTeam(teamName);\n const cleanups: Array<() => void> = [];\n\n for (const [agentName, agentProcess] of team.processes) {\n const unsubscribe = agentProcess.onMessage((method, params) => {\n callback(agentName, method, params);\n });\n cleanups.push(unsubscribe);\n }\n\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n }\n\n /** Assign a task to a specific agent via IPC. */\n assignTask(\n teamName: string,\n agentName: string,\n taskId: string,\n subject: string,\n description: string,\n ): void {\n const team = this.getActiveTeam(teamName);\n const agentProcess = team.processes.get(agentName);\n if (agentProcess) {\n agentProcess.assignTask(taskId, subject, description);\n }\n }\n\n /** Check whether a team is currently active in memory. */\n isTeamActive(name: string): boolean {\n return this.activeTeams.has(name);\n }\n\n /** Shut down all active teams. Call during application cleanup. */\n async shutdownAll(): Promise<void> {\n const names = [...this.activeTeams.keys()];\n await Promise.allSettled(names.map((n) => this.deleteTeam(n)));\n }\n\n // ── Private ──────────────────────────────────────────────────────────\n\n private getActiveTeam(teamName: string): IActiveTeam {\n const team = this.activeTeams.get(teamName);\n if (!team) {\n throw new Error(`Team not active: ${teamName}`);\n }\n return team;\n }\n\n private saveTeamConfig(name: string, config: ITeamConfig): void {\n const teamDir = join(getTeamsDir(), name);\n ensureDirectory(teamDir);\n\n const serialized: ISerializedTeamConfig = {\n teamName: config.teamName,\n description: config.description,\n status: config.status,\n members: config.members,\n createdAt: config.createdAt.toISOString(),\n };\n\n const configPath = join(teamDir, \"config.json\");\n writeFileSync(configPath, JSON.stringify(serialized, null, 2), {\n encoding: \"utf-8\",\n mode: 0o644,\n });\n }\n\n private loadTeamConfig(name: string): ITeamConfig {\n const configPath = join(getTeamsDir(), name, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(`Team config not found: ${name}`);\n }\n\n const raw = readFileSync(configPath, \"utf-8\");\n const data = JSON.parse(raw) as ISerializedTeamConfig;\n\n return {\n teamName: data.teamName,\n description: data.description,\n status: data.status,\n members: data.members,\n createdAt: new Date(data.createdAt),\n };\n }\n\n private async shutdownAgents(team: IActiveTeam): Promise<void> {\n const stopPromises: Promise<void>[] = [];\n\n for (const [agentName, agentProcess] of team.processes) {\n stopPromises.push(\n agentProcess.stop().catch((error: unknown) => {\n const reason =\n error instanceof Error ? error.message : String(error);\n logger.error(\n { agent: agentName, error: reason },\n \"Error stopping agent\",\n );\n }),\n );\n }\n\n await Promise.allSettled(stopPromises);\n team.processes.clear();\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/config-store.ts"],"names":[],"mappings":"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","file":"chunk-IYW62KKR.js","sourcesContent":["/**\n * Configuration store — PRD sections 17.2, 17.3\n * Loads/saves global and project config with Zod validation.\n * Merges project config over global config.\n * Watches for config file changes.\n */\n\nimport { readFileSync, writeFileSync, watchFile, unwatchFile } from \"node:fs\";\nimport { existsSync, chmodSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { z } from \"zod\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n getConfigPath,\n getProjectConfigPath,\n ensureDirectory,\n} from \"../utils/pathResolver.js\";\nimport { DEFAULT_CONFIG } from \"../types/config.js\";\nimport type { IGlobalConfig } from \"../types/config.js\";\n\n// ── Zod Schemas ─────────────────────────────────────────────────────────\n\nconst ProviderConfigSchema = z.object({\n enabled: z.boolean(),\n baseUrl: z.string().optional(),\n});\n\nconst PermissionConfigSchema = z.object({\n mode: z.enum([\"strict\", \"standard\", \"permissive\"]),\n allowedPaths: z.array(z.string()),\n blockedCommands: z.array(z.string()),\n});\n\nconst SplitPanelConfigSchema = z.object({\n enabled: z.boolean(),\n backend: z.enum([\"tmux\", \"iterm2\"]),\n defaultLayout: z.enum([\"auto\", \"horizontal\", \"vertical\", \"grid\"]),\n maxPanes: z.number().int().min(1).max(16),\n});\n\nconst CostConfigSchema = z.object({\n budgetWarning: z.number().nonnegative(),\n budgetHardStop: z.number().nonnegative(),\n currency: z.string(),\n});\n\nconst TelemetryConfigSchema = z.object({\n enabled: z.boolean(),\n anonymized: z.boolean(),\n});\n\nconst RoleConfigSchema = z.object({\n primary: z.string(),\n fallback: z.array(z.string()),\n});\n\nconst OAuthProviderConfigSchema = z.object({\n clientId: z.string(),\n clientSecret: z.string().optional(),\n authorizeUrl: z.string().optional(),\n tokenUrl: z.string().optional(),\n scope: z.string().optional(),\n});\n\nconst OAuthConfigSchema = z.object({\n anthropic: OAuthProviderConfigSchema.optional(),\n openai: OAuthProviderConfigSchema.optional(),\n google: OAuthProviderConfigSchema.optional(),\n kimi: OAuthProviderConfigSchema.optional(),\n});\n\nconst GlobalConfigSchema = z.object({\n version: z.string(),\n defaultModel: z.string(),\n roles: z.record(z.string(), RoleConfigSchema).optional(),\n providers: z.record(z.string(), ProviderConfigSchema).optional(),\n permissions: PermissionConfigSchema.optional(),\n splitPanel: SplitPanelConfigSchema.optional(),\n cost: CostConfigSchema.optional(),\n telemetry: TelemetryConfigSchema.optional(),\n oauth: OAuthConfigSchema.optional(),\n});\n\ntype ConfigChangeCallback = (config: IGlobalConfig) => void;\n\nexport class ConfigStore {\n private globalConfig: IGlobalConfig = DEFAULT_CONFIG;\n private projectConfig: Partial<IGlobalConfig> | undefined;\n private mergedConfig: IGlobalConfig = DEFAULT_CONFIG;\n private watchers: Array<{ path: string; active: boolean }> = [];\n private changeCallbacks: ConfigChangeCallback[] = [];\n\n get config(): IGlobalConfig {\n return this.mergedConfig;\n }\n\n loadGlobal(configPath?: string): IGlobalConfig {\n const resolvedPath = configPath ?? getConfigPath();\n\n if (!existsSync(resolvedPath)) {\n logger.info(\n { path: resolvedPath },\n \"Global config not found, using defaults\",\n );\n this.globalConfig = DEFAULT_CONFIG;\n this.rebuildMergedConfig();\n return this.mergedConfig;\n }\n\n const raw = readFileSync(resolvedPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n const validated = GlobalConfigSchema.safeParse(parsed);\n\n if (!validated.success) {\n logger.warn(\n { errors: validated.error.issues },\n \"Global config validation failed, using defaults\",\n );\n this.globalConfig = DEFAULT_CONFIG;\n this.rebuildMergedConfig();\n return this.mergedConfig;\n }\n\n this.globalConfig = this.applyDefaults(validated.data);\n this.rebuildMergedConfig();\n\n logger.info({ path: resolvedPath }, \"Global config loaded\");\n return this.mergedConfig;\n }\n\n loadProject(projectRoot: string): IGlobalConfig {\n const resolvedPath = getProjectConfigPath(projectRoot);\n\n if (!existsSync(resolvedPath)) {\n logger.debug(\n { path: resolvedPath },\n \"Project config not found, using global only\",\n );\n this.projectConfig = undefined;\n this.rebuildMergedConfig();\n return this.mergedConfig;\n }\n\n const raw = readFileSync(resolvedPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n const validated = GlobalConfigSchema.partial().safeParse(parsed);\n\n if (!validated.success) {\n logger.warn(\n { errors: validated.error.issues },\n \"Project config validation failed, ignoring\",\n );\n this.projectConfig = undefined;\n this.rebuildMergedConfig();\n return this.mergedConfig;\n }\n\n this.projectConfig = validated.data as Partial<IGlobalConfig>;\n this.rebuildMergedConfig();\n\n logger.info({ path: resolvedPath }, \"Project config loaded\");\n return this.mergedConfig;\n }\n\n saveGlobal(\n config?: IGlobalConfig,\n configPath?: string,\n ): void {\n const resolvedPath = configPath ?? getConfigPath();\n const configToSave = config ?? this.globalConfig;\n\n ensureDirectory(dirname(resolvedPath));\n const json = JSON.stringify(configToSave, null, 2);\n writeFileSync(resolvedPath, json, { encoding: \"utf-8\", mode: 0o600 });\n\n logger.info({ path: resolvedPath }, \"Global config saved\");\n\n if (config) {\n this.globalConfig = config;\n this.rebuildMergedConfig();\n }\n }\n\n saveProject(\n projectRoot: string,\n config: Partial<IGlobalConfig>,\n ): void {\n const resolvedPath = getProjectConfigPath(projectRoot);\n\n ensureDirectory(dirname(resolvedPath));\n const json = JSON.stringify(config, null, 2);\n writeFileSync(resolvedPath, json, { encoding: \"utf-8\", mode: 0o600 });\n\n this.projectConfig = config;\n this.rebuildMergedConfig();\n\n logger.info({ path: resolvedPath }, \"Project config saved\");\n }\n\n watchGlobal(configPath?: string): void {\n const resolvedPath = configPath ?? getConfigPath();\n this.watchConfigFile(resolvedPath, () => {\n this.loadGlobal(resolvedPath);\n });\n }\n\n watchProject(projectRoot: string): void {\n const resolvedPath = getProjectConfigPath(projectRoot);\n this.watchConfigFile(resolvedPath, () => {\n this.loadProject(projectRoot);\n });\n }\n\n onChange(callback: ConfigChangeCallback): void {\n this.changeCallbacks.push(callback);\n }\n\n stopWatching(): void {\n for (const watcher of this.watchers) {\n if (watcher.active) {\n unwatchFile(watcher.path);\n watcher.active = false;\n }\n }\n this.watchers = [];\n }\n\n private watchConfigFile(filePath: string, onUpdate: () => void): void {\n if (!existsSync(filePath)) {\n return;\n }\n\n const entry = { path: filePath, active: true };\n this.watchers.push(entry);\n\n watchFile(filePath, { interval: 2000 }, () => {\n if (!entry.active) {\n return;\n }\n logger.info({ path: filePath }, \"Config file changed, reloading\");\n try {\n onUpdate();\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n logger.error({ error: message }, \"Failed to reload config\");\n }\n });\n }\n\n private rebuildMergedConfig(): void {\n if (!this.projectConfig) {\n this.mergedConfig = { ...this.globalConfig };\n } else {\n this.mergedConfig = {\n ...this.globalConfig,\n ...this.projectConfig,\n roles: {\n ...this.globalConfig.roles,\n ...(this.projectConfig.roles ?? {}),\n },\n providers: {\n ...this.globalConfig.providers,\n ...(this.projectConfig.providers ?? {}),\n },\n permissions: {\n ...this.globalConfig.permissions,\n ...(this.projectConfig.permissions ?? {}),\n },\n splitPanel: {\n ...this.globalConfig.splitPanel,\n ...(this.projectConfig.splitPanel ?? {}),\n },\n cost: {\n ...this.globalConfig.cost,\n ...(this.projectConfig.cost ?? {}),\n },\n telemetry: {\n ...this.globalConfig.telemetry,\n ...(this.projectConfig.telemetry ?? {}),\n },\n oauth: this.projectConfig.oauth ?? this.globalConfig.oauth,\n };\n }\n\n for (const cb of this.changeCallbacks) {\n try {\n cb(this.mergedConfig);\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n logger.error({ error: message }, \"Config change callback failed\");\n }\n }\n }\n\n private applyDefaults(\n partial: z.infer<typeof GlobalConfigSchema>,\n ): IGlobalConfig {\n return {\n version: partial.version,\n defaultModel: partial.defaultModel,\n roles: {\n ...DEFAULT_CONFIG.roles,\n ...(partial.roles as IGlobalConfig[\"roles\"] | undefined),\n },\n providers: {\n ...DEFAULT_CONFIG.providers,\n ...(partial.providers as IGlobalConfig[\"providers\"] | undefined),\n },\n permissions: partial.permissions\n ? (partial.permissions as IGlobalConfig[\"permissions\"])\n : DEFAULT_CONFIG.permissions,\n splitPanel: partial.splitPanel\n ? (partial.splitPanel as IGlobalConfig[\"splitPanel\"])\n : DEFAULT_CONFIG.splitPanel,\n cost: partial.cost\n ? (partial.cost as IGlobalConfig[\"cost\"])\n : DEFAULT_CONFIG.cost,\n telemetry: partial.telemetry\n ? (partial.telemetry as IGlobalConfig[\"telemetry\"])\n : DEFAULT_CONFIG.telemetry,\n oauth: partial.oauth\n ? (partial.oauth as IGlobalConfig[\"oauth\"])\n : undefined,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skills/executor.ts"],"names":[],"mappings":"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","file":"chunk-LSOYPSAT.js","sourcesContent":["/**\n * SkillExecutor — Manages skill activation, context injection, and tool restriction.\n * Per PRD section 10.3: Load full SKILL.md content into context on activation,\n * restrict tools, and unload on deactivation.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport type { ISkillDefinition } from \"../types/config.js\";\nimport type { ModelRole } from \"../types/model.js\";\nimport type { SkillRegistry } from \"./registry.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport interface IActiveSkill {\n readonly definition: ISkillDefinition;\n readonly activatedAt: Date;\n readonly previousAllowedTools: readonly string[] | null;\n}\n\nexport interface ISkillActivationResult {\n readonly success: boolean;\n readonly skill?: ISkillDefinition;\n readonly errorMessage?: string;\n readonly warnings?: readonly string[];\n}\n\nexport interface IModelCapabilities {\n readonly contextWindow: number;\n readonly currentRole?: ModelRole;\n}\n\n// ── SkillExecutor Class ─────────────────────────────────────────────────\n\nexport class SkillExecutor {\n private readonly registry: SkillRegistry;\n private activeSkill: IActiveSkill | null = null;\n private baseAllowedTools: readonly string[] | null = null;\n\n constructor(registry: SkillRegistry) {\n this.registry = registry;\n }\n\n /**\n * Activate a skill by name.\n */\n async activateByName(\n name: string,\n modelCapabilities?: IModelCapabilities,\n ): Promise<ISkillActivationResult> {\n const definition = await this.registry.getByName(name);\n if (!definition) {\n return { success: false, errorMessage: `Skill \"${name}\" not found` };\n }\n\n return this.activate(definition, modelCapabilities);\n }\n\n /**\n * Activate a skill by trigger string (e.g. \"$review\" or \"review\").\n */\n async activateByTrigger(\n trigger: string,\n modelCapabilities?: IModelCapabilities,\n ): Promise<ISkillActivationResult> {\n const definition = await this.registry.getByTrigger(trigger);\n if (!definition) {\n return {\n success: false,\n errorMessage: `No skill found for trigger \"${trigger}\"`,\n };\n }\n\n return this.activate(definition, modelCapabilities);\n }\n\n /**\n * Deactivate the currently active skill, restoring previous tool set.\n */\n deactivate(): void {\n if (!this.activeSkill) {\n logger.debug(\"No active skill to deactivate\");\n return;\n }\n\n const skillName = this.activeSkill.definition.frontmatter.name;\n this.baseAllowedTools = this.activeSkill.previousAllowedTools;\n this.activeSkill = null;\n\n logger.info({ skill: skillName }, \"Skill deactivated\");\n }\n\n /**\n * Get the currently active skill, or null if none.\n */\n getActiveSkill(): IActiveSkill | null {\n return this.activeSkill;\n }\n\n /**\n * Check if any skill is currently active.\n */\n isActive(): boolean {\n return this.activeSkill !== null;\n }\n\n /**\n * Get the active skill's body content for context injection.\n * Returns null if no skill is active.\n */\n getActiveSkillContent(): string | null {\n return this.activeSkill?.definition.body ?? null;\n }\n\n /**\n * Get the name of the currently active skill, or null.\n */\n getActiveSkillName(): string | null {\n return this.activeSkill?.definition.frontmatter.name ?? null;\n }\n\n /**\n * Get the allowed tool list under the current state.\n * When a skill is active with allowed-tools, only those tools are permitted.\n * Returns null when no restrictions are in effect.\n */\n getAllowedTools(): readonly string[] | null {\n if (this.activeSkill) {\n return this.activeSkill.definition.frontmatter[\"allowed-tools\"] ?? null;\n }\n return this.baseAllowedTools;\n }\n\n /**\n * Check if a specific tool is allowed under the current skill restrictions.\n */\n isToolAllowed(toolName: string): boolean {\n const allowed = this.getAllowedTools();\n if (!allowed) return true;\n return allowed.includes(toolName);\n }\n\n /**\n * Set the base allowed tools (used when no skill is active).\n */\n setBaseAllowedTools(tools: readonly string[] | null): void {\n this.baseAllowedTools = tools;\n }\n\n /**\n * Validate model requirements for a skill definition.\n * Returns compatibility status and any warnings.\n */\n checkModelRequirements(\n definition: ISkillDefinition,\n capabilities: IModelCapabilities,\n ): { compatible: boolean; warnings: readonly string[] } {\n const warnings: string[] = [];\n const requirements = definition.frontmatter[\"model-requirements\"];\n\n if (!requirements) {\n return { compatible: true, warnings: [] };\n }\n\n const preferredRole = requirements[\"preferred-role\"];\n if (preferredRole && capabilities.currentRole) {\n if (capabilities.currentRole !== preferredRole) {\n warnings.push(\n `Skill \"${definition.frontmatter.name}\" prefers role \"${preferredRole}\", ` +\n `current role is \"${capabilities.currentRole}\"`,\n );\n }\n }\n\n const minContext = requirements[\"min-context\"];\n if (minContext !== undefined && minContext !== null) {\n if (capabilities.contextWindow < minContext) {\n warnings.push(\n `Skill \"${definition.frontmatter.name}\" requires ${minContext} context tokens, ` +\n `but current model has ${capabilities.contextWindow}`,\n );\n return { compatible: false, warnings };\n }\n }\n\n return { compatible: true, warnings };\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n /**\n * Core activation logic. Deactivates any current skill first.\n */\n private activate(\n definition: ISkillDefinition,\n modelCapabilities?: IModelCapabilities,\n ): ISkillActivationResult {\n const allWarnings: string[] = [];\n\n // Validate model requirements if capabilities are provided\n if (modelCapabilities) {\n const { compatible, warnings } = this.checkModelRequirements(\n definition,\n modelCapabilities,\n );\n allWarnings.push(...warnings);\n\n for (const warning of warnings) {\n logger.warn({ skill: definition.frontmatter.name }, warning);\n }\n\n if (!compatible) {\n return {\n success: false,\n skill: definition,\n errorMessage: `Model does not meet skill requirements: ${warnings.join(\"; \")}`,\n warnings: allWarnings,\n };\n }\n }\n\n // Deactivate current skill if one is active\n if (this.activeSkill) {\n logger.info(\n {\n current: this.activeSkill.definition.frontmatter.name,\n next: definition.frontmatter.name,\n },\n \"Switching active skill\",\n );\n this.deactivate();\n }\n\n this.activeSkill = {\n definition,\n activatedAt: new Date(),\n previousAllowedTools: this.baseAllowedTools,\n };\n\n logger.info(\n {\n skill: definition.frontmatter.name,\n version: definition.frontmatter.version,\n allowedTools: definition.frontmatter[\"allowed-tools\"],\n },\n \"Skill activated\",\n );\n\n return {\n success: true,\n skill: definition,\n ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp/client.ts","../src/mcp/server-manager.ts"],"names":[],"mappings":"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","file":"chunk-MFBHNWGV.js","sourcesContent":["/**\n * MCP client per PRD section 11.1\n * Wraps @modelcontextprotocol/sdk Client with typed, transport-agnostic interface.\n * Supports stdio (local servers) and Streamable HTTP (remote servers).\n */\n\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError, ToolCallError } from \"../types/errors.js\";\n\n// ── Exported Types ──────────────────────────────────────────────────────\n\nexport interface IMCPToolSchema {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: Readonly<Record<string, unknown>>;\n}\n\nexport interface IMCPCallResult {\n readonly content: string;\n readonly isError: boolean;\n}\n\nexport interface IMCPResource {\n readonly uri: string;\n readonly name: string;\n readonly description: string;\n readonly mimeType: string;\n}\n\n// ── Transport Configuration ─────────────────────────────────────────────\n\nexport interface IStdioTransportConfig {\n readonly type: \"stdio\";\n readonly command: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n}\n\nexport interface IHttpTransportConfig {\n readonly type: \"streamable-http\";\n readonly url: string;\n}\n\nexport type MCPTransportConfig = IStdioTransportConfig | IHttpTransportConfig;\n\n// ── Client Options ──────────────────────────────────────────────────────\n\nexport interface IMCPClientOptions {\n readonly serverName: string;\n readonly transport: MCPTransportConfig;\n readonly connectionTimeoutMs?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst CLIENT_NAME = \"aemeathcli\";\nconst CLIENT_VERSION = \"1.0.0\";\n\n// ── Content Helpers ─────────────────────────────────────────────────────\n\ninterface IContentItem {\n readonly type: string;\n readonly text?: string;\n}\n\nfunction extractText(content: unknown): string {\n if (!Array.isArray(content)) {\n return \"No output\";\n }\n const parts: string[] = [];\n for (const item of content as ReadonlyArray<IContentItem>) {\n if (item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n return parts.length > 0 ? parts.join(\"\\n\") : \"No output\";\n}\n\n// ── MCPClient ───────────────────────────────────────────────────────────\n\nexport class MCPClient {\n private client: Client | undefined;\n private connected = false;\n private readonly serverName: string;\n private readonly transportConfig: MCPTransportConfig;\n private readonly connectionTimeoutMs: number;\n\n constructor(options: IMCPClientOptions) {\n this.serverName = options.serverName;\n this.transportConfig = options.transport;\n this.connectionTimeoutMs = options.connectionTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n get name(): string {\n return this.serverName;\n }\n\n /** Establish connection to the MCP server. */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Connecting to MCP server\");\n\n try {\n this.client = new Client(\n { name: CLIENT_NAME, version: CLIENT_VERSION },\n { capabilities: { sampling: {} } },\n );\n\n await this.connectWithTimeout();\n this.connected = true;\n logger.info({ server: this.serverName }, \"Connected to MCP server\");\n } catch (error: unknown) {\n this.connected = false;\n this.client = undefined;\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, msg);\n }\n }\n\n /** Gracefully close the MCP connection. */\n async disconnect(): Promise<void> {\n if (!this.connected || !this.client) {\n return;\n }\n\n logger.info({ server: this.serverName }, \"Disconnecting from MCP server\");\n\n try {\n await this.client.close();\n } catch (error: unknown) {\n logger.warn({ server: this.serverName, error }, \"Error during MCP disconnect\");\n } finally {\n this.connected = false;\n this.client = undefined;\n }\n }\n\n /** Disconnect then reconnect to the server. */\n async reconnect(): Promise<void> {\n await this.disconnect();\n await this.connect();\n }\n\n /** List all tools exposed by this MCP server. */\n async listTools(): Promise<readonly IMCPToolSchema[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listTools();\n return result.tools.map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n inputSchema: (tool.inputSchema ?? {}) as Readonly<Record<string, unknown>>,\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(this.serverName, `listTools failed: ${msg}`);\n }\n }\n\n /** Call a tool on this MCP server with the given arguments. */\n async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<IMCPCallResult> {\n const client = this.requireConnected();\n\n try {\n const result = await client.callTool({ name: toolName, arguments: args });\n return {\n content: extractText(result.content),\n isError: result.isError === true,\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ToolCallError(toolName, msg);\n }\n }\n\n /** List resources exposed by this MCP server. */\n async listResources(): Promise<readonly IMCPResource[]> {\n const client = this.requireConnected();\n\n try {\n const result = await client.listResources();\n return result.resources.map((r) => ({\n uri: r.uri,\n name: r.name ?? r.uri,\n description: \"\",\n mimeType: r.mimeType ?? \"application/octet-stream\",\n }));\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `listResources failed: ${msg}`,\n );\n }\n }\n\n /** Read a specific resource by URI. */\n async readResource(uri: string): Promise<string> {\n const client = this.requireConnected();\n\n try {\n const result = await client.readResource({ uri });\n return extractText(result.contents);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new ServerConnectionError(\n this.serverName,\n `readResource(${uri}) failed: ${msg}`,\n );\n }\n }\n\n // ── Private Helpers ─────────────────────────────────────────────────\n\n private async connectWithTimeout(): Promise<void> {\n const client = this.client;\n if (!client) {\n throw new Error(\"Client not initialised\");\n }\n\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(\n `Connection timed out after ${this.connectionTimeoutMs}ms`,\n ),\n ),\n this.connectionTimeoutMs,\n );\n });\n\n if (this.transportConfig.type === \"stdio\") {\n const transport = new StdioClientTransport({\n command: this.transportConfig.command,\n args: [...this.transportConfig.args],\n ...(this.transportConfig.env !== undefined\n ? { env: { ...this.transportConfig.env } }\n : {}),\n });\n await Promise.race([client.connect(transport), timeoutPromise]);\n return;\n }\n\n if (this.transportConfig.type === \"streamable-http\") {\n const { StreamableHTTPClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n );\n const transport = new StreamableHTTPClientTransport(\n new URL(this.transportConfig.url),\n );\n await Promise.race([client.connect(transport as Transport), timeoutPromise]);\n return;\n }\n\n // Exhaustiveness guard\n const _exhaustive: never = this.transportConfig;\n throw new ServerConnectionError(\n this.serverName,\n `Unknown transport type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n\n private requireConnected(): Client {\n if (!this.connected || !this.client) {\n throw new ServerConnectionError(this.serverName, \"Not connected\");\n }\n return this.client;\n }\n}\n","/**\n * MCP server lifecycle manager per PRD section 11.1\n * Manages multiple MCP server connections: start, stop, health-check, restart, rate-limit.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ServerConnectionError } from \"../types/errors.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { IMCPClientOptions, IMCPToolSchema, IStdioTransportConfig } from \"./client.js\";\nimport type { IMCPConfig, IMCPServerConfig } from \"../types/config.js\";\n\n// ── Server State ────────────────────────────────────────────────────────\n\ntype ServerStatus = \"stopped\" | \"connecting\" | \"connected\" | \"error\";\n\ninterface IServerEntry {\n readonly client: MCPClient;\n status: ServerStatus;\n lastHealthCheck: number;\n consecutiveFailures: number;\n readonly rateLimit: IRateLimitState;\n}\n\n// ── Rate Limiting ───────────────────────────────────────────────────────\n\ninterface IRateLimitState {\n callTimestamps: number[];\n maxCallsPerMinute: number;\n}\n\nexport interface IRateLimitConfig {\n readonly maxCallsPerMinute: number;\n}\n\n// ── Manager Options ─────────────────────────────────────────────────────\n\nexport interface IServerManagerOptions {\n readonly connectionTimeoutMs?: number;\n readonly healthCheckIntervalMs?: number;\n readonly maxConsecutiveFailures?: number;\n readonly defaultRateLimit?: IRateLimitConfig | undefined;\n readonly rateLimits?: Readonly<Record<string, IRateLimitConfig>> | undefined;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_HEALTH_INTERVAL_MS = 60_000;\nconst DEFAULT_MAX_FAILURES = 3;\nconst DEFAULT_MAX_CALLS_PER_MINUTE = 60;\nconst RATE_LIMIT_WINDOW_MS = 60_000;\n\n// ── MCPServerManager ────────────────────────────────────────────────────\n\nexport class MCPServerManager {\n private readonly servers = new Map<string, IServerEntry>();\n private readonly options: Required<\n Pick<IServerManagerOptions, \"connectionTimeoutMs\" | \"healthCheckIntervalMs\" | \"maxConsecutiveFailures\">\n > & Pick<IServerManagerOptions, \"defaultRateLimit\" | \"rateLimits\">;\n private healthCheckTimer: ReturnType<typeof setInterval> | undefined;\n\n constructor(options?: IServerManagerOptions) {\n this.options = {\n connectionTimeoutMs: options?.connectionTimeoutMs ?? 30_000,\n healthCheckIntervalMs: options?.healthCheckIntervalMs ?? DEFAULT_HEALTH_INTERVAL_MS,\n maxConsecutiveFailures: options?.maxConsecutiveFailures ?? DEFAULT_MAX_FAILURES,\n defaultRateLimit: options?.defaultRateLimit,\n rateLimits: options?.rateLimits,\n };\n }\n\n /** Start all servers defined in the MCP config. */\n async startAll(config: IMCPConfig): Promise<void> {\n const entries = Object.entries(config.mcpServers);\n if (entries.length === 0) {\n logger.info(\"No MCP servers configured\");\n return;\n }\n\n logger.info({ count: entries.length }, \"Starting MCP servers\");\n\n const results = await Promise.allSettled(\n entries.map(([name, serverConfig]) => this.startServer(name, serverConfig)),\n );\n\n let successCount = 0;\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n successCount++;\n }\n }\n\n logger.info(\n { total: entries.length, connected: successCount },\n \"MCP server startup complete\",\n );\n\n this.startHealthChecks();\n }\n\n /** Start a single MCP server by name and config. */\n async startServer(name: string, serverConfig: IMCPServerConfig): Promise<void> {\n if (this.servers.has(name)) {\n logger.warn({ server: name }, \"MCP server already registered, stopping first\");\n await this.stopServer(name);\n }\n\n logger.info({ server: name, command: serverConfig.command }, \"Starting MCP server\");\n\n const transportConfig: IStdioTransportConfig = {\n type: \"stdio\",\n command: serverConfig.command,\n args: [...serverConfig.args],\n ...(serverConfig.env !== undefined ? { env: { ...serverConfig.env } } : {}),\n };\n\n const clientOptions: IMCPClientOptions = {\n serverName: name,\n transport: transportConfig,\n connectionTimeoutMs: this.options.connectionTimeoutMs,\n };\n\n const client = new MCPClient(clientOptions);\n const maxCalls = this.getMaxCallsPerMinute(name);\n\n const entry: IServerEntry = {\n client,\n status: \"connecting\",\n lastHealthCheck: Date.now(),\n consecutiveFailures: 0,\n rateLimit: { callTimestamps: [], maxCallsPerMinute: maxCalls },\n };\n\n this.servers.set(name, entry);\n\n try {\n await client.connect();\n entry.status = \"connected\";\n logger.info({ server: name }, \"MCP server connected\");\n } catch (error: unknown) {\n entry.status = \"error\";\n entry.consecutiveFailures = 1;\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"Failed to start MCP server\");\n throw new ServerConnectionError(name, msg);\n }\n }\n\n /** Stop a single server by name. */\n async stopServer(name: string): Promise<void> {\n const entry = this.servers.get(name);\n if (!entry) {\n return;\n }\n\n logger.info({ server: name }, \"Stopping MCP server\");\n\n try {\n await entry.client.disconnect();\n } catch (error: unknown) {\n logger.warn({ server: name, error }, \"Error stopping MCP server\");\n }\n\n entry.status = \"stopped\";\n this.servers.delete(name);\n }\n\n /** Stop all managed servers and clean up. */\n async stopAll(): Promise<void> {\n this.stopHealthChecks();\n\n const names = [...this.servers.keys()];\n logger.info({ count: names.length }, \"Stopping all MCP servers\");\n\n await Promise.allSettled(names.map((name) => this.stopServer(name)));\n }\n\n /** Get a connected client by server name. */\n getClient(name: string): MCPClient | undefined {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n return undefined;\n }\n return entry.client;\n }\n\n /** Get all connected server names. */\n getConnectedServers(): readonly string[] {\n const connected: string[] = [];\n for (const [name, entry] of this.servers) {\n if (entry.status === \"connected\") {\n connected.push(name);\n }\n }\n return connected;\n }\n\n /** Get the status of a server. */\n getServerStatus(name: string): ServerStatus | undefined {\n return this.servers.get(name)?.status;\n }\n\n /** List tools from a specific server (with rate-limit check). */\n async listServerTools(name: string): Promise<readonly IMCPToolSchema[]> {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n return entry.client.listTools();\n }\n\n /** Check rate limit before allowing a call to the given server. Throws on exceeded. */\n checkRateLimitFor(name: string): void {\n const entry = this.requireServer(name);\n this.checkRateLimit(entry, name);\n }\n\n /** Record a tool call for rate-limiting purposes. */\n recordCall(name: string): void {\n const entry = this.servers.get(name);\n if (entry) {\n entry.rateLimit.callTimestamps.push(Date.now());\n }\n }\n\n // ── Health Checking ─────────────────────────────────────────────────\n\n private startHealthChecks(): void {\n this.stopHealthChecks();\n\n this.healthCheckTimer = setInterval(() => {\n void this.runHealthChecks();\n }, this.options.healthCheckIntervalMs);\n\n // Prevent the timer from keeping the process alive\n if (typeof this.healthCheckTimer === \"object\" && \"unref\" in this.healthCheckTimer) {\n this.healthCheckTimer.unref();\n }\n }\n\n private stopHealthChecks(): void {\n if (this.healthCheckTimer !== undefined) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n }\n\n private async runHealthChecks(): Promise<void> {\n for (const [name, entry] of this.servers) {\n if (entry.status === \"stopped\") {\n continue;\n }\n\n try {\n await entry.client.listTools();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n entry.lastHealthCheck = Date.now();\n } catch {\n entry.consecutiveFailures++;\n entry.status = \"error\";\n logger.warn(\n { server: name, failures: entry.consecutiveFailures },\n \"MCP health check failed\",\n );\n\n if (entry.consecutiveFailures >= this.options.maxConsecutiveFailures) {\n logger.info({ server: name }, \"Attempting MCP server restart\");\n void this.restartServer(name, entry);\n }\n }\n }\n }\n\n private async restartServer(name: string, entry: IServerEntry): Promise<void> {\n try {\n await entry.client.reconnect();\n entry.status = \"connected\";\n entry.consecutiveFailures = 0;\n logger.info({ server: name }, \"MCP server restarted successfully\");\n } catch (error: unknown) {\n entry.status = \"error\";\n const msg = error instanceof Error ? error.message : String(error);\n logger.error({ server: name, error: msg }, \"MCP server restart failed\");\n }\n }\n\n // ── Rate Limiting ─────────────────────────────────────────────────\n\n private checkRateLimit(entry: IServerEntry, serverName: string): void {\n const now = Date.now();\n const windowStart = now - RATE_LIMIT_WINDOW_MS;\n\n // Prune timestamps outside the window\n entry.rateLimit.callTimestamps = entry.rateLimit.callTimestamps.filter(\n (ts) => ts > windowStart,\n );\n\n if (entry.rateLimit.callTimestamps.length >= entry.rateLimit.maxCallsPerMinute) {\n throw new ServerConnectionError(\n serverName,\n `Rate limit exceeded: ${entry.rateLimit.maxCallsPerMinute} calls/minute`,\n );\n }\n }\n\n private getMaxCallsPerMinute(serverName: string): number {\n const perServer = this.options.rateLimits?.[serverName];\n if (perServer) {\n return perServer.maxCallsPerMinute;\n }\n return this.options.defaultRateLimit?.maxCallsPerMinute ?? DEFAULT_MAX_CALLS_PER_MINUTE;\n }\n\n // ── Helpers ───────────────────────────────────────────────────────\n\n private requireServer(name: string): IServerEntry {\n const entry = this.servers.get(name);\n if (!entry || entry.status !== \"connected\") {\n throw new ServerConnectionError(name, \"Server not connected\");\n }\n return entry;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/kimi-adapter.ts"],"names":[],"mappings":"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","file":"chunk-MXZSI3AY.js","sourcesContent":["/**\n * Kimi (Moonshot) adapter — custom HTTP per PRD section 7.1\n * Uses OpenAI-compatible API format via fetch().\n * Supports Kimi Code (kimi-for-coding)\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"kimi\";\nconst DEFAULT_BASE_URL = \"https://api.moonshot.cn/v1\";\n\nconst KIMI_MODELS: readonly string[] = [\"kimi-for-coding\"] as const;\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\ninterface OpenAIMessage { role: string; content: string }\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\ninterface OpenAIToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\ninterface OpenAIChoice {\n index: number;\n message: { role: string; content: string | null; tool_calls?: readonly OpenAIToolCallRef[] };\n finish_reason: string;\n}\ninterface OpenAIUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\ninterface OpenAIChatResponse { id: string; choices: OpenAIChoice[]; usage: OpenAIUsage }\n\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n }));\n}\n\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n return {\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { type: \"object\", properties, required },\n },\n };\n });\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nasync function handleResponseError(response: Response, model: string): Promise<never> {\n const body = await response.text();\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(PROVIDER_NAME, body);\n }\n if (response.status === 429) {\n const retryHeader = response.headers.get(\"retry-after\");\n const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (response.status === 404) {\n throw new ModelNotFoundError(model);\n }\n throw new Error(`Kimi API error (${response.status}): ${body}`);\n}\n\nexport class KimiAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = KIMI_MODELS;\n\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(options?: IProviderOptions) {\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options?.apiKey ?? process.env[\"MOONSHOT_API_KEY\"] ?? \"\";\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: false,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n const data = (await response.json()) as OpenAIChatResponse;\n const choice = data.choices[0];\n if (choice === undefined) {\n throw new Error(\"Kimi API returned empty choices\");\n }\n\n const toolCalls = extractToolCalls(choice);\n const inputTokens = data.usage.prompt_tokens;\n const outputTokens = data.usage.completion_tokens;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: data.id,\n role: \"assistant\",\n content: choice.message.content ?? \"\",\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: data.id,\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(choice.finish_reason),\n };\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = convertMessages(request.messages);\n const tools = convertTools(request.tools);\n\n if (request.system !== undefined) {\n messages.unshift({ role: \"system\", content: request.system });\n }\n\n const body: Record<string, unknown> = {\n model: request.model,\n messages,\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n stream: true,\n };\n if (request.temperature !== undefined) {\n body[\"temperature\"] = request.temperature;\n }\n if (tools !== undefined) {\n body[\"tools\"] = tools;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await handleResponseError(response, request.model);\n }\n\n if (response.body === null) {\n yield { type: \"error\", error: \"Kimi API returned empty stream body\" };\n yield { type: \"done\" };\n return;\n }\n\n try {\n yield* this.parseSSEStream(response.body, modelInfo);\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"Kimi stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n if (!this.apiKey) return [...this.supportedModels];\n\n try {\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!response.ok) return [...this.supportedModels];\n\n const data = (await response.json()) as { data: Array<{ id: string }> };\n const models = data.data.map((m) => m.id).sort();\n return models.length > 0 ? models : [...this.supportedModels];\n } catch {\n return [...this.supportedModels];\n }\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n modelInfo: IModelInfo,\n ): AsyncIterable<IStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\n continue;\n }\n if (!trimmed.startsWith(\"data: \")) {\n continue;\n }\n\n const jsonStr = trimmed.slice(6);\n let parsed: {\n choices?: Array<{\n delta?: {\n content?: string;\n tool_calls?: Array<{\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: OpenAIUsage;\n };\n\n try {\n parsed = JSON.parse(jsonStr) as typeof parsed;\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content !== undefined && delta.content !== \"\") {\n yield { type: \"text\", content: delta.content };\n }\n\n if (delta?.tool_calls !== undefined) {\n for (const tc of delta.tool_calls) {\n if (tc.id !== undefined && tc.function?.name !== undefined) {\n let args: Record<string, unknown> = {};\n if (tc.function.arguments !== undefined) {\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n }\n const toolCall: IToolCall = {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n yield { type: \"tool_call\", toolCall };\n }\n }\n }\n\n if (parsed.usage !== undefined) {\n const inTok = parsed.usage.prompt_tokens;\n const outTok = parsed.usage.completion_tokens;\n yield {\n type: \"usage\",\n usage: {\n inputTokens: inTok,\n outputTokens: outTok,\n totalTokens: inTok + outTok,\n costUsd: computeCost(modelInfo, inTok, outTok),\n },\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nfunction extractToolCalls(choice: OpenAIChoice): IToolCall[] {\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\n return [];\n }\n return choice.message.tool_calls.map((tc) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: args,\n };\n });\n}\n\nfunction mapFinishReason(\n reason: string,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool_calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/pathResolver.ts"],"names":[],"mappings":";;;;;AAWA,IAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,EAAQ,EAAG,aAAa,CAAA;AAE9C,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,IAAK,eAAA;AAC3C;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,cAAA,EAAe;AACxB;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,IAAA,CAAK,YAAA,EAAa,EAAG,aAAa,CAAA;AAC3C;AAEO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,IAAI,CAAA;AACpC;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,eAAe,CAAA;AAC/C;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,MAAM,CAAA;AACtC;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,iBAAiB,CAAA;AACjD;AAMO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,QAAQ,CAAA;AACxC;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAIO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,aAAa,aAAa,CAAA;AACxC;AAEO,SAAS,qBAAqB,WAAA,EAA6B;AAChE,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,aAAa,CAAA;AAC7D;AAEO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,QAAQ,CAAA;AACxD;AAYO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AACxC,EAAA,OAAO,KAAK,MAAA,EAAQ,CAAA,WAAA,EAAc,QAAQ,MAAA,IAAS,IAAK,MAAM,CAAA,CAAE,CAAA;AAClE;AAEO,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,EAAG,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AACpD;AAIO,SAAS,eAAA,CAAgB,SAAiB,IAAA,EAAqB;AACpE,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,MAAM,IAAA,EAAM,IAAA,IAAQ,KAAO,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,sBAAsB,OAAA,EAAuB;AAC3D,EAAA,eAAA,CAAgB,SAAS,GAAK,CAAA;AAChC;AAEO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,qBAAA,CAAsB,gBAAgB,CAAA;AACtC,EAAA,eAAA,CAAgB,gBAAgB,CAAA;AAChC,EAAA,qBAAA,CAAsB,WAAW,CAAA;AACjC,EAAA,eAAA,CAAgB,kBAAkB,CAAA;AAClC,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC7B,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC/B","file":"chunk-NBR3GHMT.js","sourcesContent":["/**\n * Safe path handling per PRD section 15.7 item 5\n * NO hardcoded paths — use path.join(), os.homedir(), XDG Base Directory\n */\n\nimport { homedir } from \"node:os\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { existsSync, mkdirSync } from \"node:fs\";\n\n// ── XDG-inspired directory layout ────────────────────────────────────────\n\nconst AEMEATHCLI_HOME = join(homedir(), \".aemeathcli\");\n\nexport function getAemeathHome(): string {\n return process.env[\"AEMEATHCLI_HOME\"] ?? AEMEATHCLI_HOME;\n}\n\nexport function getConfigDir(): string {\n return getAemeathHome();\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function getDatabaseDir(): string {\n return join(getAemeathHome(), \"db\");\n}\n\nexport function getDatabasePath(): string {\n return join(getDatabaseDir(), \"aemeathcli.db\");\n}\n\nexport function getLogDir(): string {\n return join(getAemeathHome(), \"logs\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAemeathHome(), \"credentials.enc\");\n}\n\nexport function getMCPConfigPath(): string {\n return join(getAemeathHome(), \"mcp.json\");\n}\n\nexport function getUserSkillsDir(): string {\n return join(getAemeathHome(), \"skills\");\n}\n\nexport function getTeamsDir(): string {\n return join(getAemeathHome(), \"teams\");\n}\n\nexport function getTasksDir(): string {\n return join(getAemeathHome(), \"tasks\");\n}\n\n// ── Project-level paths ──────────────────────────────────────────────────\n\nexport function getProjectConfigDir(projectRoot: string): string {\n return join(projectRoot, \".aemeathcli\");\n}\n\nexport function getProjectConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"config.json\");\n}\n\nexport function getProjectSkillsDir(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"skills\");\n}\n\nexport function getProjectMCPConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"mcp.json\");\n}\n\nexport function getProjectAgentsPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"AGENTS.md\");\n}\n\n// ── Socket paths (PRD section 14.5) ──────────────────────────────────────\n\nexport function getIPCSocketDir(): string {\n const tmpDir = process.env[\"TMPDIR\"] ?? \"/tmp\";\n return join(tmpDir, `aemeathcli-${process.getuid?.() ?? \"user\"}`);\n}\n\nexport function getIPCSocketPath(sessionId: string): string {\n return join(getIPCSocketDir(), `${sessionId}.sock`);\n}\n\n// ── Directory Initialization ─────────────────────────────────────────────\n\nexport function ensureDirectory(dirPath: string, mode?: number): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true, mode: mode ?? 0o755 });\n }\n}\n\nexport function ensureSecureDirectory(dirPath: string): void {\n ensureDirectory(dirPath, 0o700);\n}\n\nexport function initializeDirectories(): void {\n ensureSecureDirectory(getAemeathHome());\n ensureDirectory(getDatabaseDir());\n ensureSecureDirectory(getLogDir());\n ensureDirectory(getUserSkillsDir());\n ensureDirectory(getTeamsDir());\n ensureDirectory(getTasksDir());\n}\n\n// ── Project Root Detection ───────────────────────────────────────────────\n\nexport function findProjectRoot(startDir?: string): string {\n let currentDir = startDir ?? process.cwd();\n\n while (currentDir !== dirname(currentDir)) {\n if (existsSync(join(currentDir, \".git\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \".aemeathcli\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \"package.json\"))) {\n return currentDir;\n }\n currentDir = dirname(currentDir);\n }\n\n // Fallback to cwd\n return process.cwd();\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/registry.ts"],"names":["provider"],"mappings":"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","file":"chunk-RWCNNAL7.js","sourcesContent":["/**\n * Provider registry per PRD section 7.1\n * Central registry for provider adapters — register, resolve, list.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ModelNotFoundError } from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo } from \"../types/model.js\";\nimport type { IModelProvider } from \"./types.js\";\n\n/**\n * Singleton registry that maps provider names and model IDs to provider adapters.\n */\nexport class ProviderRegistry {\n private readonly providers = new Map<string, IModelProvider>();\n private readonly modelToProvider = new Map<string, string>();\n\n /**\n * Register a provider adapter.\n * Automatically indexes all supported models to this provider.\n */\n register(provider: IModelProvider): void {\n this.providers.set(provider.name, provider);\n\n for (const modelId of provider.supportedModels) {\n this.modelToProvider.set(modelId, provider.name);\n }\n\n logger.debug(\n { provider: provider.name, models: provider.supportedModels },\n \"Provider registered\",\n );\n }\n\n /**\n * Get a provider adapter by its name (e.g. \"anthropic\", \"openai\").\n */\n getByName(name: string): IModelProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get the provider adapter that supports a given model ID.\n * @throws ModelNotFoundError if no provider serves this model.\n */\n getForModel(modelId: string): IModelProvider {\n const providerName = this.modelToProvider.get(modelId);\n if (providerName === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n return provider;\n }\n\n /**\n * Resolve a model string to its provider.\n * Supports both model IDs (\"claude-sonnet-4-6\") and provider-prefixed\n * forms (\"anthropic:claude-sonnet-4-6\").\n */\n resolve(modelString: string): { provider: IModelProvider; modelId: string } {\n const colonIndex = modelString.indexOf(\":\");\n if (colonIndex !== -1) {\n const providerName = modelString.slice(0, colonIndex);\n const modelId = modelString.slice(colonIndex + 1);\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelString);\n }\n return { provider, modelId };\n }\n\n const provider = this.getForModel(modelString);\n return { provider, modelId: modelString };\n }\n\n /**\n * List all registered model IDs across all providers.\n */\n listModels(): readonly IModelInfo[] {\n const models: IModelInfo[] = [];\n\n for (const provider of this.providers.values()) {\n for (const modelId of provider.supportedModels) {\n const info = SUPPORTED_MODELS[modelId];\n if (info !== undefined) {\n models.push(info);\n }\n }\n }\n\n return models;\n }\n\n /**\n * List all registered provider names.\n */\n listProviders(): readonly string[] {\n return [...this.providers.keys()];\n }\n\n /**\n * Check if a model ID is supported by any registered provider.\n */\n hasModel(modelId: string): boolean {\n return this.modelToProvider.has(modelId);\n }\n\n /**\n * Check if a provider is registered.\n */\n hasProvider(name: string): boolean {\n return this.providers.has(name);\n }\n\n /**\n * List available models from all providers.\n * Uses dynamic API listing where supported, falls back to static models.\n */\n async listAllAvailableModels(): Promise<Map<string, readonly string[]>> {\n const entries = [...this.providers.entries()];\n const fetched = await Promise.all(\n entries.map(async ([name, provider]): Promise<[string, readonly string[]]> => {\n if (typeof provider.listAvailableModels === \"function\") {\n try {\n return [name, await provider.listAvailableModels()];\n } catch {\n return [name, [...provider.supportedModels]];\n }\n }\n return [name, [...provider.supportedModels]];\n }),\n );\n\n const result = new Map<string, readonly string[]>();\n fetched.sort(([a], [b]) => a.localeCompare(b));\n for (const [name, models] of fetched) {\n result.set(name, models);\n }\n\n return result;\n }\n}\n\n/**\n * Create a pre-populated registry with all available providers.\n * Resolves credentials via SessionManager (CLI delegation, API keys, env vars).\n */\nexport async function createDefaultRegistry(): Promise<ProviderRegistry> {\n const registry = new ProviderRegistry();\n\n const { SessionManager } = await import(\"../auth/session-manager.js\");\n const session = new SessionManager();\n const { execa } = await import(\"execa\");\n\n // When AEMEATHCLI_PREFER_SDK=1 (set for agent child processes), prefer\n // SDK-based adapters over native CLI adapters. Native CLI adapters shell\n // out to external binaries whose raw JSON output can interfere with IPC\n // streaming. Falls back to native only when no API key is available.\n const preferSdk = process.env[\"AEMEATHCLI_PREFER_SDK\"] === \"1\";\n\n const cliAvailability = new Map<string, boolean>();\n const hasCli = async (command: string): Promise<boolean> => {\n const cached = cliAvailability.get(command);\n if (cached !== undefined) {\n return cached;\n }\n\n try {\n await execa(\"which\", [command], { timeout: 3000 });\n cliAvailability.set(command, true);\n return true;\n } catch {\n cliAvailability.set(command, false);\n return false;\n }\n };\n\n /** Determine whether to use a native CLI adapter for a provider. */\n const shouldUseNative = async (\n credential: { method: string; token?: string | undefined } | undefined,\n cliCommand: string,\n envKeyName: string,\n ): Promise<boolean> => {\n // Native login credentials (OAuth sessions) must always use the native CLI\n // adapter. The stored token is an OAuth session token, NOT an API key — SDK\n // adapters will reject it with \"invalid x-api-key\" / \"API key not valid\".\n if (credential?.method === \"native_login\") {\n return await hasCli(cliCommand);\n }\n\n // When preferSdk is set, only use native if SDK has no way to authenticate.\n if (preferSdk) {\n const hasApiKey =\n credential?.token !== undefined ||\n process.env[envKeyName] !== undefined;\n if (hasApiKey) {\n return false;\n }\n // No API key available — fall back to native if CLI exists.\n return await hasCli(cliCommand);\n }\n\n // Default behavior: prefer native when CLI is available and no explicit credential.\n return credential === undefined && await hasCli(cliCommand);\n };\n\n const providerLoaders: ReadonlyArray<{\n name: string;\n load: () => Promise<IModelProvider>;\n }> = [\n {\n name: \"anthropic\",\n load: async () => {\n const { ClaudeAdapter } = await import(\"./claude-adapter.js\");\n const credential = await session.getActiveCredential(\"anthropic\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"claude\", \"ANTHROPIC_API_KEY\");\n\n if (useNative) {\n const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"anthropic\");\n return new ClaudeNativeCLIAdapter();\n }\n\n return new ClaudeAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"openai\",\n load: async () => {\n const { OpenAIAdapter } = await import(\"./openai-adapter.js\");\n const credential = await session.getActiveCredential(\"openai\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"codex\", \"OPENAI_API_KEY\");\n\n if (useNative) {\n const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"openai\");\n return new CodexNativeCLIAdapter();\n }\n\n return new OpenAIAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"google\",\n load: async () => {\n const { GeminiAdapter } = await import(\"./gemini-adapter.js\");\n const credential = await session.getActiveCredential(\"google\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"gemini\", \"GOOGLE_API_KEY\");\n\n if (useNative) {\n const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"google\");\n return new GeminiNativeCLIAdapter();\n }\n\n return new GeminiAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"kimi\",\n load: async () => {\n const { KimiAdapter } = await import(\"./kimi-adapter.js\");\n const credential = await session.getActiveCredential(\"kimi\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"kimi\", \"MOONSHOT_API_KEY\");\n\n if (useNative) {\n const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"kimi\");\n return new KimiNativeCLIAdapter();\n }\n\n return new KimiAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n ];\n\n // Initialize all providers in parallel (including Ollama)\n const ollamaTask = (async () => {\n try {\n const { OllamaAdapter } = await import(\"./ollama-adapter.js\");\n const ollama = new OllamaAdapter();\n await ollama.refreshModels();\n registry.register(ollama);\n } catch {\n // Ollama not available\n }\n })();\n\n await Promise.all([\n ...providerLoaders.map(async (config) => {\n try {\n const adapter = await config.load();\n registry.register(adapter);\n } catch {\n // Skip provider if adapter fails to initialize\n }\n }),\n ollamaTask,\n ]);\n\n return registry;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skills/loader.ts","../src/skills/registry.ts"],"names":["parseYaml"],"mappings":"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","file":"chunk-TEVZS4FA.js","sourcesContent":["/**\n * SkillLoader — Parses YAML frontmatter + Markdown body from SKILL.md files.\n * Per PRD section 10.2-10.3: YAML skill file format with Zod validation.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { logger } from \"../utils/logger.js\";\nimport type { ISkillFrontmatter, ISkillDefinition } from \"../types/config.js\";\nimport type { ModelRole } from \"../types/model.js\";\n\n// ── Zod Schema ──────────────────────────────────────────────────────────\n\nconst MODEL_ROLE_VALUES: readonly [ModelRole, ...ModelRole[]] = [\n \"planning\",\n \"coding\",\n \"review\",\n \"testing\",\n \"bugfix\",\n \"documentation\",\n];\n\nconst skillFrontmatterSchema = z.object({\n name: z.string().min(1, \"Skill name is required\"),\n description: z.string().min(1, \"Skill description is required\"),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, \"Version must be semver (e.g. 1.0.0)\"),\n \"allowed-tools\": z.array(z.string().min(1)).optional(),\n triggers: z.array(z.string().min(1)).min(1, \"At least one trigger is required\"),\n \"model-requirements\": z\n .object({\n \"preferred-role\": z.enum(MODEL_ROLE_VALUES).optional(),\n \"min-context\": z.number().int().positive().optional(),\n })\n .optional(),\n});\n\nconst FRONTMATTER_DELIMITER = \"---\";\n\n// ── SkillLoader Class ───────────────────────────────────────────────────\n\nexport class SkillLoader {\n /**\n * Parse a single SKILL.md file into an ISkillDefinition.\n * Returns null if the file is malformed or invalid.\n */\n async loadSkillFile(filePath: string): Promise<ISkillDefinition | null> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn({ filePath, error: message }, \"Failed to read skill file\");\n return null;\n }\n\n return this.parseSkillContent(raw, filePath);\n }\n\n /**\n * Parse raw SKILL.md content string into an ISkillDefinition.\n */\n parseSkillContent(raw: string, filePath: string): ISkillDefinition | null {\n const extracted = this.extractFrontmatter(raw);\n if (!extracted) {\n logger.warn({ filePath }, \"Skill file missing valid YAML frontmatter delimiters\");\n return null;\n }\n\n const { yamlContent, body } = extracted;\n\n let rawFrontmatter: unknown;\n try {\n rawFrontmatter = parseYaml(yamlContent);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn({ filePath, error: message }, \"Failed to parse YAML frontmatter\");\n return null;\n }\n\n const result = skillFrontmatterSchema.safeParse(rawFrontmatter);\n if (!result.success) {\n logger.warn(\n { filePath, errors: result.error.flatten().fieldErrors },\n \"Skill frontmatter validation failed\",\n );\n return null;\n }\n\n const validated = result.data;\n\n // Build frontmatter with conditional spreads for exactOptionalPropertyTypes\n const modelReqs = validated[\"model-requirements\"];\n const frontmatter: ISkillFrontmatter = {\n name: validated.name,\n description: validated.description,\n version: validated.version,\n triggers: validated.triggers,\n // Only include optional properties when they are defined (not undefined)\n ...(validated[\"allowed-tools\"] !== undefined\n ? { \"allowed-tools\": validated[\"allowed-tools\"] }\n : {}),\n ...(modelReqs !== undefined\n ? {\n \"model-requirements\": {\n ...(modelReqs[\"preferred-role\"] !== undefined\n ? { \"preferred-role\": modelReqs[\"preferred-role\"] }\n : {}),\n ...(modelReqs[\"min-context\"] !== undefined\n ? { \"min-context\": modelReqs[\"min-context\"] }\n : {}),\n },\n }\n : {}),\n };\n\n return {\n frontmatter,\n body: body.trim(),\n filePath,\n };\n }\n\n /**\n * Extract only name and description for progressive loading (~100 tokens).\n */\n async loadSkillSummary(\n filePath: string,\n ): Promise<{ name: string; description: string } | null> {\n const definition = await this.loadSkillFile(filePath);\n if (!definition) return null;\n\n return {\n name: definition.frontmatter.name,\n description: definition.frontmatter.description,\n };\n }\n\n /**\n * Split raw content into YAML frontmatter and Markdown body.\n * Frontmatter is delimited by `---` at the start and a subsequent `---`.\n */\n private extractFrontmatter(\n raw: string,\n ): { yamlContent: string; body: string } | null {\n const trimmed = raw.trimStart();\n if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {\n return null;\n }\n\n // Find the line after the opening delimiter\n const afterOpening = trimmed.slice(FRONTMATTER_DELIMITER.length);\n // The opening delimiter must be followed by a newline\n if (!afterOpening.startsWith(\"\\n\")) {\n return null;\n }\n\n const contentAfterOpening = afterOpening.slice(1); // skip the \\n\n const closingIndex = contentAfterOpening.indexOf(`\\n${FRONTMATTER_DELIMITER}`);\n if (closingIndex === -1) {\n return null;\n }\n\n const yamlContent = contentAfterOpening.slice(0, closingIndex);\n // Body starts after the closing delimiter line\n const afterClosing = contentAfterOpening.slice(\n closingIndex + 1 + FRONTMATTER_DELIMITER.length,\n );\n // Skip optional newline after closing delimiter\n const body = afterClosing.startsWith(\"\\n\") ? afterClosing.slice(1) : afterClosing;\n\n return { yamlContent, body };\n }\n}\n","/**\n * SkillRegistry — Discovers, indexes, and resolves skill definitions.\n * Resolution priority: project > user > built-in (PRD section 10.4).\n * Progressive loading: only name + description loaded initially (~100 tokens each).\n */\n\nimport { readdir, stat } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { logger } from \"../utils/logger.js\";\nimport { getUserSkillsDir, getProjectSkillsDir } from \"../utils/pathResolver.js\";\nimport { SkillLoader } from \"./loader.js\";\nimport type { ISkillDefinition } from \"../types/config.js\";\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst SKILL_FILENAME = \"SKILL.md\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type SkillSource = \"project\" | \"user\" | \"built-in\";\n\nexport interface ISkillSummary {\n readonly name: string;\n readonly description: string;\n readonly version: string;\n readonly source: SkillSource;\n readonly dirPath: string;\n}\n\ninterface ISkillEntry {\n readonly summary: ISkillSummary;\n definition: ISkillDefinition | null;\n}\n\n// ── SkillRegistry Class ─────────────────────────────────────────────────\n\nexport class SkillRegistry {\n private readonly loader: SkillLoader;\n private readonly skills: Map<string, ISkillEntry> = new Map();\n private readonly triggerIndex: Map<string, string> = new Map();\n private initialized = false;\n\n constructor(loader?: SkillLoader) {\n this.loader = loader ?? new SkillLoader();\n }\n\n /**\n * Initialize the registry by scanning all skill directories.\n * Loads in priority order so higher-priority sources override lower ones.\n */\n async initialize(projectRoot?: string): Promise<void> {\n if (this.initialized) return;\n\n // 1. Built-in skills (lowest priority)\n const builtInDir = this.getBuiltInSkillsDir();\n await this.scanDirectory(builtInDir, \"built-in\");\n\n // 2. User-level skills\n const userDir = getUserSkillsDir();\n await this.scanDirectory(userDir, \"user\");\n\n // 3. Project-level skills (highest priority)\n if (projectRoot) {\n const projectDir = getProjectSkillsDir(projectRoot);\n await this.scanDirectory(projectDir, \"project\");\n }\n\n this.initialized = true;\n logger.info(\n { totalSkills: this.skills.size, totalTriggers: this.triggerIndex.size },\n \"Skill registry initialized\",\n );\n }\n\n /**\n * Get a full skill definition by name. Loads content on demand.\n */\n async getByName(name: string): Promise<ISkillDefinition | null> {\n const entry = this.skills.get(name);\n if (!entry) return null;\n\n if (!entry.definition) {\n const filePath = join(entry.summary.dirPath, SKILL_FILENAME);\n entry.definition = await this.loader.loadSkillFile(filePath);\n }\n\n return entry.definition;\n }\n\n /**\n * Find a skill by trigger string (e.g. \"$review\" or \"review\").\n */\n async getByTrigger(trigger: string): Promise<ISkillDefinition | null> {\n const normalized = trigger.startsWith(\"$\") ? trigger.slice(1) : trigger;\n const withPrefix = `$${normalized}`;\n\n // Try both forms: with and without $ prefix\n const name =\n this.triggerIndex.get(withPrefix) ??\n this.triggerIndex.get(normalized) ??\n this.triggerIndex.get(trigger);\n\n if (!name) return null;\n return this.getByName(name);\n }\n\n /**\n * Resolve a trigger string to a skill name without loading the full definition.\n */\n resolveTriger(trigger: string): string | undefined {\n const normalized = trigger.startsWith(\"$\") ? trigger.slice(1) : trigger;\n const withPrefix = `$${normalized}`;\n\n return (\n this.triggerIndex.get(withPrefix) ??\n this.triggerIndex.get(normalized) ??\n this.triggerIndex.get(trigger)\n );\n }\n\n /**\n * List all registered skill summaries.\n */\n listAll(): readonly ISkillSummary[] {\n return Array.from(this.skills.values()).map((entry) => entry.summary);\n }\n\n /**\n * Check if a skill exists by name.\n */\n has(name: string): boolean {\n return this.skills.has(name);\n }\n\n /**\n * Get the count of registered skills.\n */\n get size(): number {\n return this.skills.size;\n }\n\n /**\n * Reset the registry for re-initialization.\n */\n reset(): void {\n this.skills.clear();\n this.triggerIndex.clear();\n this.initialized = false;\n }\n\n // ── Private Helpers ──────────────────────────────────────────────────\n\n /**\n * Scan a directory for skill subdirectories containing SKILL.md.\n */\n private async scanDirectory(dirPath: string, source: SkillSource): Promise<void> {\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch {\n logger.debug({ dirPath, source }, \"Skill directory not found, skipping\");\n return;\n }\n\n for (const entry of entries) {\n const skillDir = join(dirPath, entry);\n\n try {\n const info = await stat(skillDir);\n if (!info.isDirectory()) continue;\n } catch {\n continue;\n }\n\n const skillFile = join(skillDir, SKILL_FILENAME);\n try {\n await stat(skillFile);\n } catch {\n logger.debug({ skillDir }, \"No SKILL.md found in directory, skipping\");\n continue;\n }\n\n await this.registerSkillFromFile(skillFile, skillDir, source);\n }\n }\n\n /**\n * Register a single skill from its SKILL.md file path.\n */\n private async registerSkillFromFile(\n skillFile: string,\n skillDir: string,\n source: SkillSource,\n ): Promise<void> {\n const definition = await this.loader.loadSkillFile(skillFile);\n if (!definition) return;\n\n const { frontmatter } = definition;\n const summary: ISkillSummary = {\n name: frontmatter.name,\n description: frontmatter.description,\n version: frontmatter.version,\n source,\n dirPath: skillDir,\n };\n\n // Remove previous trigger mappings if overriding\n const existing = this.skills.get(summary.name);\n if (existing) {\n this.removeTriggers(existing.summary.name);\n logger.debug(\n {\n skill: summary.name,\n oldSource: existing.summary.source,\n newSource: source,\n },\n \"Skill overridden by higher-priority source\",\n );\n }\n\n this.skills.set(summary.name, { summary, definition });\n this.registerTriggers(definition);\n }\n\n /**\n * Index all triggers for a skill definition.\n */\n private registerTriggers(definition: ISkillDefinition): void {\n for (const trigger of definition.frontmatter.triggers) {\n this.triggerIndex.set(trigger, definition.frontmatter.name);\n }\n }\n\n /**\n * Remove all trigger mappings associated with a skill name.\n */\n private removeTriggers(skillName: string): void {\n const toDelete: string[] = [];\n for (const [trigger, name] of this.triggerIndex) {\n if (name === skillName) {\n toDelete.push(trigger);\n }\n }\n for (const trigger of toDelete) {\n this.triggerIndex.delete(trigger);\n }\n }\n\n /**\n * Resolve the built-in skills directory relative to this module.\n */\n private getBuiltInSkillsDir(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n return join(dirname(currentFilePath), \"built-in\");\n }\n}\n"]}
|