aemeathcli 1.0.11 → 1.1.0
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 -21
- package/README.md +620 -609
- package/dist/{App-YAHJUWCX.js → App-NT6MRKQJ.js} +675 -169
- package/dist/App-NT6MRKQJ.js.map +1 -0
- package/dist/agent-store/architect.md +32 -32
- package/dist/agent-store/debugger.md +32 -32
- package/dist/agent-store/developer.md +29 -29
- package/dist/agent-store/documenter.md +30 -30
- package/dist/agent-store/researcher.md +31 -31
- package/dist/agent-store/reviewer.md +28 -28
- package/dist/agent-store/supervisor.md +37 -37
- package/dist/agent-store/tester.md +30 -30
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-UN3TJEOO.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/{auth-status-EIM5A5KL.js.map → auth-status-JQJOKUPF.js.map} +1 -1
- package/dist/{chunk-P66WDACW.js → chunk-2KMA5RBC.js} +18 -42
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-2GKOK6T7.js → chunk-2Y7TR6BS.js} +2 -2
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-ONQ4WCUI.js → chunk-2ZYK5IJG.js} +6 -6
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/{chunk-OCJPQFOR.js → chunk-36RXCZOV.js} +4 -4
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-H2SYKIMI.js → chunk-7EBLXPL4.js} +10 -10
- package/dist/chunk-7EBLXPL4.js.map +1 -0
- package/dist/{chunk-IARA5XYP.js → chunk-BIMQL4AG.js} +4 -4
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-BY4DAKUU.js → chunk-D275MCIH.js} +2 -2
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-SOQFMNQC.js → chunk-FFS4T7BZ.js} +5 -5
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-LDVY5ELP.js → chunk-GXAJGP2T.js} +5 -5
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-62HSGYQD.js → chunk-HCIHOHLX.js} +2 -2
- package/dist/chunk-HCIHOHLX.js.map +1 -0
- package/dist/{chunk-6GUD7QIM.js → chunk-HESQLCLU.js} +4 -4
- package/dist/chunk-HESQLCLU.js.map +1 -0
- package/dist/{chunk-HEKFAKVH.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/chunk-IR5HLBMH.js.map +1 -0
- package/dist/{chunk-2LF7ALGR.js → chunk-K2FCMRXH.js} +4 -4
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-2NWNIKBK.js → chunk-KIC7UI5U.js} +4 -4
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-YPFOE2QJ.js → chunk-KMOAJRDE.js} +5 -5
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/{chunk-RP2TAL3J.js → chunk-LQBALETG.js} +2 -2
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/{chunk-CC7MGWYY.js → chunk-M3FPQSRU.js} +2 -2
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/{chunk-3TSPZRGM.js → chunk-NQEUK763.js} +3 -3
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/{chunk-VBLLDY4R.js → chunk-OPWAFS6Y.js} +2 -2
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-RYOB3TLZ.js → chunk-PS4WEFW6.js} +6 -6
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-LCYH4T6N.js → chunk-QK7TKNHV.js} +6 -6
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-QCRK4QEL.js → chunk-RADJSEG5.js} +3 -3
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-AQ23TYSQ.js → chunk-SNWPI6XJ.js} +4 -4
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TDFTX32B.js → chunk-UM7MSLOV.js} +4 -4
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/{chunk-FIC7AK4Q.js → chunk-VNZ3YTQD.js} +5 -5
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-5XFSV6PF.js → chunk-WXIN65UG.js} +6 -6
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/{chunk-WC72BRHR.js → chunk-XEXWX7C7.js} +3 -3
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-VJNQJALF.js → chunk-YCCYXDW7.js} +4 -4
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/{chunk-ROJPFPJ7.js → chunk-YL5XFHR3.js} +2 -2
- package/dist/chunk-YL5XFHR3.js.map +1 -0
- package/dist/{chunk-GU33WKPG.js → chunk-YPQ2MLAV.js} +5 -5
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/{chunk-WAYSJMPS.js → chunk-ZCOVMVK4.js} +2 -2
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{chunk-473JN6M5.js → chunk-ZGOHARPV.js} +2 -2
- package/dist/chunk-ZGOHARPV.js.map +1 -0
- package/dist/{claude-login-IS5WTBMP.js → claude-login-AIFIWTYF.js} +10 -10
- package/dist/claude-login-AIFIWTYF.js.map +1 -0
- package/dist/cli.js +30 -30
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GMPF64MR.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-POB6I37G.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/{conversation-store-PRBHWQMJ.js.map → conversation-store-7GRDQZD2.js.map} +1 -1
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/{detect-providers-C4SVQHFF.js.map → detect-providers-QICJ5U3R.js.map} +1 -1
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-RUX7VK3T.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/{first-run-GDEVRFPO.js → first-run-ADROZVYF.js} +13 -13
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-KE224MSW.js → gemini-login-TST454MX.js} +10 -10
- package/dist/gemini-login-TST454MX.js.map +1 -0
- package/dist/index.d.ts +2 -56
- package/dist/index.js +30 -34
- package/dist/index.js.map +1 -1
- package/dist/{input-history-MIOO3FIW.js → input-history-BEICE7PT.js} +3 -3
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-UODMNX6K.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-DNT5YBKX.js → kimi-login-3IGVOBJI.js} +10 -10
- package/dist/kimi-login-3IGVOBJI.js.map +1 -0
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/{logger-PLPDWACQ.js.map → logger-KGHUQ4VE.js.map} +1 -1
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/{model-discovery-O64ZWPX5.js.map → model-discovery-AAJDHRFO.js.map} +1 -1
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-JMZX2C2C.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-GE67BNSS.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/{pathResolver-A6IXQQFE.js → pathResolver-UVAB2FCW.js} +3 -3
- package/dist/{pathResolver-A6IXQQFE.js.map → pathResolver-UVAB2FCW.js.map} +1 -1
- package/dist/{profile-loader-TNAXBLDX.js → profile-loader-EMLV4J7S.js} +4 -4
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-3NHVCXCZ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-7CQ3NCAD.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-DES23IBQ.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-EHD7GWM2.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -85
- package/dist/skills/built-in/commit/SKILL.md +83 -83
- package/dist/skills/built-in/debug/SKILL.md +119 -119
- package/dist/skills/built-in/plan/SKILL.md +123 -123
- package/dist/skills/built-in/refactor/SKILL.md +132 -132
- package/dist/skills/built-in/test/SKILL.md +128 -128
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/{sqlite-store-7ZIVOUNI.js.map → sqlite-store-7OECRTXM.js.map} +1 -1
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-6DCNLGTC.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/{team-state-R2D7DT5M.js.map → team-state-HZNVMQHT.js.map} +1 -1
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-WBKHUHDT.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-I6XCTEZY.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +89 -93
- package/dist/App-YAHJUWCX.js.map +0 -1
- package/dist/api-key-fallback-UN3TJEOO.js +0 -11
- package/dist/auth-status-EIM5A5KL.js +0 -13
- package/dist/chunk-25UNNEHN.js +0 -140
- package/dist/chunk-25UNNEHN.js.map +0 -1
- package/dist/chunk-2GKOK6T7.js.map +0 -1
- package/dist/chunk-2LF7ALGR.js.map +0 -1
- package/dist/chunk-2NWNIKBK.js.map +0 -1
- package/dist/chunk-3TSPZRGM.js.map +0 -1
- package/dist/chunk-473JN6M5.js.map +0 -1
- package/dist/chunk-5XFSV6PF.js.map +0 -1
- package/dist/chunk-62HSGYQD.js.map +0 -1
- package/dist/chunk-6GUD7QIM.js.map +0 -1
- package/dist/chunk-AQ23TYSQ.js.map +0 -1
- package/dist/chunk-BY4DAKUU.js.map +0 -1
- package/dist/chunk-CC7MGWYY.js.map +0 -1
- package/dist/chunk-CTFZTARK.js +0 -155
- package/dist/chunk-CTFZTARK.js.map +0 -1
- package/dist/chunk-FIC7AK4Q.js.map +0 -1
- package/dist/chunk-GU33WKPG.js.map +0 -1
- package/dist/chunk-H2SYKIMI.js.map +0 -1
- package/dist/chunk-HEKFAKVH.js.map +0 -1
- package/dist/chunk-IARA5XYP.js.map +0 -1
- package/dist/chunk-LCYH4T6N.js.map +0 -1
- package/dist/chunk-LDVY5ELP.js.map +0 -1
- package/dist/chunk-OCJPQFOR.js.map +0 -1
- package/dist/chunk-ODBY7S4X.js +0 -141
- package/dist/chunk-ODBY7S4X.js.map +0 -1
- package/dist/chunk-ONQ4WCUI.js.map +0 -1
- package/dist/chunk-P5TKZM3T.js +0 -159
- package/dist/chunk-P5TKZM3T.js.map +0 -1
- package/dist/chunk-P66WDACW.js.map +0 -1
- package/dist/chunk-QCRK4QEL.js.map +0 -1
- package/dist/chunk-ROJPFPJ7.js.map +0 -1
- package/dist/chunk-RP2TAL3J.js.map +0 -1
- package/dist/chunk-RYOB3TLZ.js.map +0 -1
- package/dist/chunk-SOQFMNQC.js.map +0 -1
- package/dist/chunk-TDFTX32B.js.map +0 -1
- package/dist/chunk-VBLLDY4R.js.map +0 -1
- package/dist/chunk-VJNQJALF.js.map +0 -1
- package/dist/chunk-WAYSJMPS.js.map +0 -1
- package/dist/chunk-WC72BRHR.js.map +0 -1
- package/dist/chunk-YPFOE2QJ.js.map +0 -1
- package/dist/claude-adapter-6P4SJH7P.js +0 -7
- package/dist/claude-adapter-6P4SJH7P.js.map +0 -1
- package/dist/claude-login-IS5WTBMP.js.map +0 -1
- package/dist/codex-login-GMPF64MR.js.map +0 -1
- package/dist/config-store-POB6I37G.js +0 -7
- package/dist/conversation-store-PRBHWQMJ.js +0 -4
- package/dist/detect-providers-C4SVQHFF.js +0 -4
- package/dist/executor-RUX7VK3T.js +0 -4
- package/dist/first-run-GDEVRFPO.js.map +0 -1
- package/dist/gemini-adapter-MV3U4QFH.js +0 -7
- package/dist/gemini-adapter-MV3U4QFH.js.map +0 -1
- package/dist/gemini-login-KE224MSW.js.map +0 -1
- package/dist/input-history-MIOO3FIW.js.map +0 -1
- package/dist/kimi-adapter-UODMNX6K.js +0 -6
- package/dist/kimi-login-DNT5YBKX.js.map +0 -1
- package/dist/logger-PLPDWACQ.js +0 -3
- package/dist/model-discovery-O64ZWPX5.js +0 -6
- package/dist/native-cli-adapters-JMZX2C2C.js +0 -8
- package/dist/ollama-adapter-GE67BNSS.js +0 -5
- package/dist/openai-adapter-SHPLK77L.js +0 -7
- package/dist/openai-adapter-SHPLK77L.js.map +0 -1
- package/dist/profile-loader-TNAXBLDX.js.map +0 -1
- package/dist/registry-3NHVCXCZ.js +0 -6
- package/dist/registry-7CQ3NCAD.js +0 -5
- package/dist/server-manager-DES23IBQ.js +0 -5
- package/dist/session-manager-EHD7GWM2.js +0 -12
- package/dist/sqlite-store-7ZIVOUNI.js +0 -5
- package/dist/team-manager-6DCNLGTC.js +0 -11
- package/dist/team-state-R2D7DT5M.js +0 -3
- package/dist/tmux-manager-WBKHUHDT.js +0 -6
- package/dist/tools-I6XCTEZY.js +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/registry.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/bash.ts","../src/tools/web-search.ts","../src/tools/web-fetch.ts","../src/tools/git.ts","../src/tools/index.ts"],"names":["extname","stat","readFile","writeFile","resolve","MAX_OUTPUT_LENGTH","DEFAULT_TIMEOUT_MS","truncateOutput","execaCommand"],"mappings":"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","file":"chunk-FFS4T7BZ.js","sourcesContent":["/**\n * Tool Registry — central registry for all built-in and MCP tools.\n * Per PRD sections 5.1, 14.4\n */\n\nimport type {\n IToolRegistry,\n IToolRegistration,\n IToolExecutionContext,\n ToolCategory,\n} from \"../types/tool.js\";\nimport type { IToolDefinition, IToolResult, IToolCall } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { redactSecrets } from \"../utils/sanitizer.js\";\n\nfunction redactToolArgs(args: Record<string, unknown>): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(args)) {\n if (typeof value === \"string\" && (key === \"content\" || key === \"command\" || key === \"new_source\")) {\n redacted[key] = redactSecrets(value.length > 200 ? value.slice(0, 200) + \"...\" : value);\n } else if (typeof value === \"string\") {\n redacted[key] = redactSecrets(value);\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\nexport class ToolRegistry implements IToolRegistry {\n private readonly tools: Map<string, IToolRegistration> = new Map();\n private readonly categoryIndex: Map<ToolCategory, Set<string>> = new Map();\n\n register(tool: IToolRegistration): void {\n const name = tool.definition.name;\n if (this.tools.has(name)) {\n logger.warn({ toolName: name }, \"Overwriting existing tool registration\");\n }\n this.tools.set(name, tool);\n\n let categorySet = this.categoryIndex.get(tool.category);\n if (!categorySet) {\n categorySet = new Set();\n this.categoryIndex.set(tool.category, categorySet);\n }\n categorySet.add(name);\n\n logger.debug({ toolName: name, category: tool.category }, \"Tool registered\");\n }\n\n get(name: string): IToolRegistration | undefined {\n return this.tools.get(name);\n }\n\n getAll(): readonly IToolRegistration[] {\n return [...this.tools.values()];\n }\n\n getDefinitions(): readonly IToolDefinition[] {\n return [...this.tools.values()].map((t) => t.definition);\n }\n\n getByCategory(category: ToolCategory): readonly IToolRegistration[] {\n const names = this.categoryIndex.get(category);\n if (!names) {\n return [];\n }\n const results: IToolRegistration[] = [];\n for (const name of names) {\n const tool = this.tools.get(name);\n if (tool) {\n results.push(tool);\n }\n }\n return results;\n }\n\n async execute(\n call: IToolCall,\n context: IToolExecutionContext,\n ): Promise<IToolResult> {\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n toolCallId: call.id,\n name: call.name,\n content: `Unknown tool: ${call.name}`,\n isError: true,\n };\n }\n\n if (tool.requiresApproval(context, call.arguments)) {\n return {\n toolCallId: call.id,\n name: call.name,\n content: `Tool \"${call.name}\" requires user approval in ${context.permissionMode} mode.`,\n isError: true,\n };\n }\n\n try {\n logger.debug({ toolName: call.name, args: redactToolArgs(call.arguments) }, \"Executing tool\");\n const result = await tool.execute(call.arguments, context);\n return {\n ...result,\n toolCallId: call.id,\n name: call.name,\n };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown execution error\";\n logger.error({ toolName: call.name, error: message }, \"Tool execution failed\");\n return {\n toolCallId: call.id,\n name: call.name,\n content: message,\n isError: true,\n };\n }\n }\n}\n","/**\n * Read tool — file reading with line numbers, offset/limit, binary detection.\n * Per PRD section 5.1\n */\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { FileNotFoundError } from \"../types/errors.js\";\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\nconst DEFAULT_LINE_LIMIT = 2000;\nconst MAX_LINE_LENGTH = 2000;\n\nconst BINARY_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".ico\", \".webp\", \".svg\",\n \".mp3\", \".mp4\", \".avi\", \".mov\", \".wav\", \".flac\",\n \".zip\", \".gz\", \".tar\", \".bz2\", \".7z\", \".rar\",\n \".exe\", \".dll\", \".so\", \".dylib\", \".o\", \".a\",\n \".pdf\", \".doc\", \".docx\", \".xls\", \".xlsx\",\n \".woff\", \".woff2\", \".ttf\", \".eot\", \".otf\",\n \".sqlite\", \".db\",\n]);\n\nfunction isBinaryFile(filePath: string, buffer: Buffer): boolean {\n if (BINARY_EXTENSIONS.has(extname(filePath).toLowerCase())) {\n return true;\n }\n // Check for null bytes in first 8KB\n const sample = buffer.subarray(0, 8192);\n for (let i = 0; i < sample.length; i++) {\n if (sample[i] === 0) {\n return true;\n }\n }\n return false;\n}\n\nfunction formatWithLineNumbers(\n content: string,\n offset: number,\n limit: number,\n): string {\n const allLines = content.split(\"\\n\");\n const startLine = Math.max(0, offset);\n const endLine = Math.min(allLines.length, startLine + limit);\n const sliced = allLines.slice(startLine, endLine);\n\n const maxLineNum = endLine;\n const padWidth = String(maxLineNum).length;\n\n return sliced\n .map((line, idx) => {\n const lineNum = String(startLine + idx + 1).padStart(padWidth, \" \");\n const truncated =\n line.length > MAX_LINE_LENGTH\n ? line.substring(0, MAX_LINE_LENGTH) + \"...\"\n : line;\n return `${lineNum}\\t${truncated}`;\n })\n .join(\"\\n\");\n}\n\nexport function createReadTool(): IToolRegistration {\n return {\n definition: {\n name: \"read\",\n description:\n \"Read a file from the filesystem with line numbers. Supports offset and limit for large files.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to read\",\n required: true,\n },\n {\n name: \"offset\",\n type: \"number\",\n description: \"Line number to start reading from (0-indexed)\",\n required: false,\n default: 0,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Maximum number of lines to read\",\n required: false,\n default: DEFAULT_LINE_LIMIT,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n return false; // Read never requires approval\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const projectRoot = context.projectRoot;\n const allowedPaths = context.allowedPaths;\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"read\", content: msg, isError: true };\n }\n\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n let fileStat;\n try {\n fileStat = await stat(resolvedPath);\n } catch {\n throw new FileNotFoundError(resolvedPath);\n }\n\n if (!fileStat.isFile()) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `\"${resolvedPath}\" is not a regular file. Use Bash ls to list directories.`,\n isError: true,\n };\n }\n\n if (fileStat.size > MAX_FILE_SIZE) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `File is too large (${(fileStat.size / 1024 / 1024).toFixed(1)} MB). Maximum is ${MAX_FILE_SIZE / 1024 / 1024} MB.`,\n isError: true,\n };\n }\n\n const rawBuffer = await readFile(resolvedPath);\n\n if (isBinaryFile(resolvedPath, rawBuffer)) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `Binary file detected: ${resolvedPath} (${fileStat.size} bytes). Cannot display binary content.`,\n isError: false,\n };\n }\n\n const content = rawBuffer.toString(\"utf-8\");\n\n if (content.length === 0) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `File \"${resolvedPath}\" exists but is empty.`,\n isError: false,\n };\n }\n\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\n const limit = typeof args[\"limit\"] === \"number\" ? args[\"limit\"] : DEFAULT_LINE_LIMIT;\n\n const formatted = formatWithLineNumbers(content, offset, limit);\n logger.debug({ file: resolvedPath, offset, limit }, \"File read\");\n\n return {\n toolCallId: \"\",\n name: \"read\",\n content: formatted,\n isError: false,\n };\n },\n };\n}\n","/**\n * Write tool — write content to files, create parent dirs, set permissions.\n * Per PRD section 5.1\n */\n\nimport { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { dirname, extname } from \"node:path\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst CONFIG_EXTENSIONS = new Set([\n \".env\", \".pem\", \".key\", \".crt\", \".p12\", \".pfx\", \".jks\",\n]);\n\nconst SENSITIVE_FILENAMES = new Set([\n \".env\", \".env.local\", \".env.production\", \".env.development\",\n \"credentials.json\", \"credentials.enc\", \"secrets.json\",\n \"id_rsa\", \"id_ed25519\", \"config.json\",\n]);\n\nfunction isConfigFile(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n const base = filePath.split(\"/\").pop() ?? \"\";\n return CONFIG_EXTENSIONS.has(ext) || SENSITIVE_FILENAMES.has(base);\n}\n\nexport function createWriteTool(): IToolRegistration {\n return {\n definition: {\n name: \"write\",\n description:\n \"Write content to a file. Creates parent directories if needed. Overwrites existing files.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to write\",\n required: true,\n },\n {\n name: \"content\",\n type: \"string\",\n description: \"The content to write to the file\",\n required: true,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n // Write always requires approval in strict and standard modes\n return context.permissionMode === \"strict\" || context.permissionMode === \"standard\";\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n const content = args[\"content\"];\n\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"write\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (typeof content !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"write\",\n content: \"content parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n const projectRoot = context.projectRoot;\n const allowedPaths = context.allowedPaths;\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"write\", content: msg, isError: true };\n }\n\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n const parentDir = dirname(resolvedPath);\n try {\n await mkdir(parentDir, { recursive: true });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Failed to create directory\";\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `Failed to create parent directory: ${msg}`,\n isError: true,\n };\n }\n\n const fileMode = isConfigFile(resolvedPath) ? 0o600 : 0o644;\n\n let existed = false;\n try {\n const fileStat = await stat(resolvedPath);\n existed = fileStat.isFile();\n } catch {\n // File does not exist — will be created\n }\n\n try {\n await writeFile(resolvedPath, content, { encoding: \"utf-8\", mode: fileMode });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Write failed\";\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `Failed to write file: ${msg}`,\n isError: true,\n };\n }\n\n const lineCount = content.split(\"\\n\").length;\n const action = existed ? \"Updated\" : \"Created\";\n\n logger.debug(\n { file: resolvedPath, lines: lineCount, mode: fileMode.toString(8) },\n `File ${action.toLowerCase()}`,\n );\n\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `${action} ${resolvedPath} (${lineCount} lines)`,\n isError: false,\n };\n },\n };\n}\n","/**\n * Edit tool — exact string replacement with uniqueness validation.\n * Per PRD section 5.1\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { stat } from \"node:fs/promises\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { FileNotFoundError } from \"../types/errors.js\";\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport function createEditTool(): IToolRegistration {\n return {\n definition: {\n name: \"edit\",\n description:\n \"Perform exact string replacement in a file. The old_string must be unique unless replace_all is true.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to edit\",\n required: true,\n },\n {\n name: \"old_string\",\n type: \"string\",\n description: \"The exact text to find and replace\",\n required: true,\n },\n {\n name: \"new_string\",\n type: \"string\",\n description: \"The replacement text\",\n required: true,\n },\n {\n name: \"replace_all\",\n type: \"boolean\",\n description: \"Replace all occurrences instead of requiring uniqueness\",\n required: false,\n default: false,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n return context.permissionMode === \"strict\" || context.permissionMode === \"standard\";\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n const oldString = args[\"old_string\"];\n const newString = args[\"new_string\"];\n const replaceAll = args[\"replace_all\"] === true;\n\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (typeof oldString !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"old_string parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n if (typeof newString !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"new_string parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n if (oldString === newString) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"old_string and new_string are identical — no edit needed.\",\n isError: true,\n };\n }\n\n const projectRoot = context.projectRoot;\n const allowedPaths = context.allowedPaths;\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"edit\", content: msg, isError: true };\n }\n\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n try {\n const fileStat = await stat(resolvedPath);\n if (!fileStat.isFile()) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: `\"${resolvedPath}\" is not a regular file.`,\n isError: true,\n };\n }\n } catch {\n throw new FileNotFoundError(resolvedPath);\n }\n\n const rawBuffer = await readFile(resolvedPath);\n const originalContent = rawBuffer.toString(\"utf-8\");\n\n if (!originalContent.includes(oldString)) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content:\n `old_string not found in ${resolvedPath}. Ensure it matches the file content exactly, including whitespace and indentation.`,\n isError: true,\n };\n }\n\n if (!replaceAll) {\n const firstIdx = originalContent.indexOf(oldString);\n const secondIdx = originalContent.indexOf(oldString, firstIdx + 1);\n if (secondIdx !== -1) {\n const occurrences = originalContent.split(oldString).length - 1;\n return {\n toolCallId: \"\",\n name: \"edit\",\n content:\n `old_string is not unique — found ${occurrences} occurrences in ${resolvedPath}. ` +\n `Provide more surrounding context to make it unique, or set replace_all to true.`,\n isError: true,\n };\n }\n }\n\n let newContent: string;\n let replacementCount: number;\n\n if (replaceAll) {\n replacementCount = originalContent.split(oldString).length - 1;\n newContent = originalContent.split(oldString).join(newString);\n } else {\n replacementCount = 1;\n const idx = originalContent.indexOf(oldString);\n newContent =\n originalContent.substring(0, idx) +\n newString +\n originalContent.substring(idx + oldString.length);\n }\n\n await writeFile(resolvedPath, newContent, \"utf-8\");\n\n logger.debug(\n { file: resolvedPath, replacements: replacementCount },\n \"File edited\",\n );\n\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: `Edited ${resolvedPath}: ${replacementCount} replacement(s) made.`,\n isError: false,\n };\n },\n };\n}\n","/**\n * Glob tool — fast file pattern matching sorted by modification time.\n * Per PRD section 5.1\n */\n\nimport fg from \"fast-glob\";\nimport { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\n\nconst MAX_RESULTS = 1000;\n\ninterface FileEntry {\n readonly path: string;\n readonly mtimeMs: number;\n}\n\nexport function createGlobTool(): IToolRegistration {\n return {\n definition: {\n name: \"glob\",\n description:\n \"Find files matching a glob pattern. Results are sorted by modification time (newest first).\",\n parameters: [\n {\n name: \"pattern\",\n type: \"string\",\n description: 'Glob pattern to match (e.g. \"**/*.ts\", \"src/**/*.tsx\")',\n required: true,\n },\n {\n name: \"path\",\n type: \"string\",\n description: \"Directory to search in. Defaults to project root.\",\n required: false,\n },\n ],\n },\n category: \"search\",\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n return false; // Glob never requires approval\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const pattern = args[\"pattern\"];\n if (typeof pattern !== \"string\" || pattern.length === 0) {\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: \"pattern parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const projectRoot = context.projectRoot;\n const allowedPaths = context.allowedPaths;\n\n let searchPath: string;\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\n const resolved = resolve(projectRoot, args[\"path\"]);\n searchPath = validatePath(resolved, projectRoot);\n } else {\n searchPath = projectRoot;\n }\n\n if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: `Access denied: ${searchPath} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n let matchedPaths: string[];\n try {\n matchedPaths = await fg(pattern, {\n cwd: searchPath,\n absolute: true,\n dot: false,\n onlyFiles: true,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/coverage/**\",\n ],\n });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Glob search failed\";\n return { toolCallId: \"\", name: \"glob\", content: msg, isError: true };\n }\n\n if (matchedPaths.length === 0) {\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: \"No files found\",\n isError: false,\n };\n }\n\n // Sort by modification time — newest first\n const entries: FileEntry[] = [];\n for (const filePath of matchedPaths) {\n try {\n const fileStat = await stat(filePath);\n entries.push({ path: filePath, mtimeMs: fileStat.mtimeMs });\n } catch {\n // Skip files we can't stat\n }\n }\n\n entries.sort((a, b) => b.mtimeMs - a.mtimeMs);\n\n const truncated = entries.length > MAX_RESULTS;\n const resultEntries = truncated ? entries.slice(0, MAX_RESULTS) : entries;\n const output = resultEntries.map((e) => e.path).join(\"\\n\");\n\n logger.debug(\n { pattern, searchPath, total: entries.length, returned: resultEntries.length },\n \"Glob search complete\",\n );\n\n const suffix = truncated\n ? `\\n\\n(Showing ${MAX_RESULTS} of ${entries.length} matches)`\n : \"\";\n\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: output + suffix,\n isError: false,\n };\n },\n };\n}\n","/**\n * Grep tool — content search using ripgrep with grep fallback.\n * Per PRD section 5.1\n */\n\nimport { execFile } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst MAX_OUTPUT_LENGTH = 30_000;\nconst DEFAULT_HEAD_LIMIT = 0; // unlimited\n\ntype OutputMode = \"content\" | \"files_with_matches\" | \"count\";\n\nasync function findSearchBinary(): Promise<string> {\n try {\n await execFileAsync(\"which\", [\"rg\"]);\n return \"rg\";\n } catch {\n return \"grep\";\n }\n}\n\nfunction buildRipgrepArgs(\n pattern: string,\n searchPath: string,\n outputMode: OutputMode,\n opts: {\n readonly glob?: string | undefined;\n readonly fileType?: string | undefined;\n readonly contextLines?: number | undefined;\n readonly beforeContext?: number | undefined;\n readonly afterContext?: number | undefined;\n readonly caseInsensitive?: boolean | undefined;\n readonly multiline?: boolean | undefined;\n readonly lineNumbers?: boolean | undefined;\n readonly headLimit?: number | undefined;\n },\n): string[] {\n const args: string[] = [];\n\n if (outputMode === \"files_with_matches\") {\n args.push(\"--files-with-matches\");\n } else if (outputMode === \"count\") {\n args.push(\"--count\");\n }\n\n if (opts.caseInsensitive === true) {\n args.push(\"-i\");\n }\n\n if (opts.multiline === true) {\n args.push(\"-U\", \"--multiline-dotall\");\n }\n\n if (outputMode === \"content\") {\n if (opts.lineNumbers !== false) {\n args.push(\"-n\");\n }\n if (typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\n args.push(\"-C\", String(opts.contextLines));\n } else {\n if (typeof opts.beforeContext === \"number\" && opts.beforeContext > 0) {\n args.push(\"-B\", String(opts.beforeContext));\n }\n if (typeof opts.afterContext === \"number\" && opts.afterContext > 0) {\n args.push(\"-A\", String(opts.afterContext));\n }\n }\n }\n\n if (typeof opts.glob === \"string\" && opts.glob.length > 0) {\n args.push(\"--glob\", opts.glob);\n }\n\n if (typeof opts.fileType === \"string\" && opts.fileType.length > 0) {\n args.push(\"--type\", opts.fileType);\n }\n\n // Always skip common uninteresting directories\n args.push(\n \"--glob\", \"!node_modules\",\n \"--glob\", \"!.git\",\n \"--glob\", \"!dist\",\n \"--glob\", \"!build\",\n \"--glob\", \"!coverage\",\n );\n\n args.push(\"--\", pattern, searchPath);\n\n return args;\n}\n\nfunction buildGrepArgs(\n pattern: string,\n searchPath: string,\n outputMode: OutputMode,\n opts: {\n readonly caseInsensitive?: boolean | undefined;\n readonly contextLines?: number | undefined;\n },\n): string[] {\n const args: string[] = [\"-r\", \"--extended-regexp\"];\n\n if (outputMode === \"files_with_matches\") {\n args.push(\"-l\");\n } else if (outputMode === \"count\") {\n args.push(\"-c\");\n }\n\n if (opts.caseInsensitive === true) {\n args.push(\"-i\");\n }\n\n if (outputMode === \"content\" && typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\n args.push(\"-C\", String(opts.contextLines));\n }\n\n args.push(\n \"--exclude-dir=node_modules\",\n \"--exclude-dir=.git\",\n \"--exclude-dir=dist\",\n \"--exclude-dir=build\",\n );\n\n args.push(\"--\", pattern, searchPath);\n\n return args;\n}\n\nfunction applyLimits(\n output: string,\n headLimit: number,\n offset: number,\n): string {\n let lines = output.split(\"\\n\");\n\n if (offset > 0) {\n lines = lines.slice(offset);\n }\n\n if (headLimit > 0) {\n lines = lines.slice(0, headLimit);\n }\n\n let result = lines.join(\"\\n\");\n\n if (result.length > MAX_OUTPUT_LENGTH) {\n result = result.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n }\n\n return result;\n}\n\nexport function createGrepTool(): IToolRegistration {\n return {\n definition: {\n name: \"grep\",\n description:\n \"Search file contents using regex patterns. Uses ripgrep (rg) with grep fallback.\",\n parameters: [\n {\n name: \"pattern\",\n type: \"string\",\n description: \"Regular expression pattern to search for\",\n required: true,\n },\n {\n name: \"path\",\n type: \"string\",\n description: \"File or directory to search in. Defaults to project root.\",\n required: false,\n },\n {\n name: \"output_mode\",\n type: \"string\",\n description: \"Output mode: content, files_with_matches, or count\",\n required: false,\n default: \"files_with_matches\",\n enum: [\"content\", \"files_with_matches\", \"count\"],\n },\n {\n name: \"glob\",\n type: \"string\",\n description: 'Glob filter for files (e.g. \"*.ts\")',\n required: false,\n },\n {\n name: \"type\",\n type: \"string\",\n description: 'File type filter (e.g. \"ts\", \"py\")',\n required: false,\n },\n {\n name: \"context\",\n type: \"number\",\n description: \"Lines of context around matches\",\n required: false,\n },\n {\n name: \"-B\",\n type: \"number\",\n description: \"Lines of context before matches\",\n required: false,\n },\n {\n name: \"-A\",\n type: \"number\",\n description: \"Lines of context after matches\",\n required: false,\n },\n {\n name: \"-i\",\n type: \"boolean\",\n description: \"Case insensitive search\",\n required: false,\n default: false,\n },\n {\n name: \"multiline\",\n type: \"boolean\",\n description: \"Enable multiline matching\",\n required: false,\n default: false,\n },\n {\n name: \"head_limit\",\n type: \"number\",\n description: \"Limit output to first N entries\",\n required: false,\n default: 0,\n },\n {\n name: \"offset\",\n type: \"number\",\n description: \"Skip first N entries\",\n required: false,\n default: 0,\n },\n ],\n },\n category: \"search\",\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n return false;\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const pattern = args[\"pattern\"];\n if (typeof pattern !== \"string\" || pattern.length === 0) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"pattern parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const projectRoot = context.projectRoot;\n const allowedPaths = context.allowedPaths;\n\n let searchPath: string;\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\n const resolved = resolve(projectRoot, args[\"path\"]);\n searchPath = validatePath(resolved, projectRoot);\n } else {\n searchPath = projectRoot;\n }\n\n if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: `Access denied: ${searchPath} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n const outputMode: OutputMode =\n args[\"output_mode\"] === \"content\" || args[\"output_mode\"] === \"count\"\n ? args[\"output_mode\"]\n : \"files_with_matches\";\n\n const headLimit =\n typeof args[\"head_limit\"] === \"number\" ? args[\"head_limit\"] : DEFAULT_HEAD_LIMIT;\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\n\n const binary = await findSearchBinary();\n\n const searchArgs =\n binary === \"rg\"\n ? buildRipgrepArgs(pattern, searchPath, outputMode, {\n glob: typeof args[\"glob\"] === \"string\" ? args[\"glob\"] : undefined,\n fileType: typeof args[\"type\"] === \"string\" ? args[\"type\"] : undefined,\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\n beforeContext: typeof args[\"-B\"] === \"number\" ? args[\"-B\"] : undefined,\n afterContext: typeof args[\"-A\"] === \"number\" ? args[\"-A\"] : undefined,\n caseInsensitive: args[\"-i\"] === true,\n multiline: args[\"multiline\"] === true,\n lineNumbers: true,\n headLimit,\n })\n : buildGrepArgs(pattern, searchPath, outputMode, {\n caseInsensitive: args[\"-i\"] === true,\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\n });\n\n try {\n const { stdout } = await execFileAsync(binary, searchArgs, {\n maxBuffer: 10 * 1024 * 1024,\n timeout: 30_000,\n });\n\n const result = applyLimits(stdout.trim(), headLimit, offset);\n\n if (result.length === 0) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n logger.debug({ binary, pattern, outputMode, matches: result.split(\"\\n\").length }, \"Grep complete\");\n\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: result,\n isError: false,\n };\n } catch (err: unknown) {\n // Exit code 1 = no matches (for both rg and grep)\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"1\") {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n // ripgrep and grep return exit code 1 for no matches\n const execError = err as { status?: number; stdout?: string };\n if (execError.status === 1) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n const msg = err instanceof Error ? err.message : \"Search failed\";\n logger.error({ binary, pattern, error: msg }, \"Grep failed\");\n\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: `Search failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Bash tool — shell command execution with timeout, blocklist, and sanitization.\n * Per PRD sections 5.1, 14.4\n */\n\nimport { execaCommand } from \"execa\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { ExecutionTimeoutError } from \"../types/errors.js\";\nimport { isCommandBlocked, isPathAllowed, redactSecrets } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000; // 2 minutes\nconst MAX_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_OUTPUT_LENGTH = 30_000;\n\nconst DANGEROUS_PATTERNS: readonly string[] = [\n \"rm -rf /\",\n \"rm -rf ~\",\n \"mkfs\",\n \"dd if=\",\n \"> /dev/sd\",\n \"chmod -R 777 /\",\n \":(){ :|:& };:\",\n \"fork bomb\",\n \"shutdown\",\n \"reboot\",\n \"init 0\",\n \"init 6\",\n];\n\nconst ALWAYS_DANGEROUS_COMMANDS: readonly string[] = [\n \"push --force\",\n \"push -f\",\n \"reset --hard\",\n \"clean -fd\",\n \"branch -D\",\n \"rm -rf\",\n \"drop table\",\n \"drop database\",\n \"truncate table\",\n];\n\nconst SENSITIVE_ENV_PATTERNS: readonly string[] = [\n \"API_KEY\",\n \"SECRET\",\n \"TOKEN\",\n \"PASSWORD\",\n \"CREDENTIAL\",\n \"ANTHROPIC_API\",\n \"OPENAI_API\",\n \"GOOGLE_API\",\n \"MOONSHOT_API\",\n \"KIMI_API\",\n \"SESSION_TOKEN\",\n \"REFRESH_TOKEN\",\n \"ACCESS_TOKEN\",\n \"PRIVATE_KEY\",\n];\n\nfunction filterSensitiveEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const filtered: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(env)) {\n const upperKey = key.toUpperCase();\n const isSensitive = SENSITIVE_ENV_PATTERNS.some((pattern) => upperKey.includes(pattern));\n if (!isSensitive) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\nfunction isDangerousCommand(command: string): boolean {\n const lowerCommand = command.toLowerCase().trim();\n return DANGEROUS_PATTERNS.some((p) => lowerCommand.includes(p)) ||\n ALWAYS_DANGEROUS_COMMANDS.some((p) => lowerCommand.includes(p.toLowerCase()));\n}\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT_LENGTH) {\n return output;\n }\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n}\n\nexport function createBashTool(): IToolRegistration {\n return {\n definition: {\n name: \"bash\",\n description:\n \"Execute a shell command. Supports timeout. Dangerous commands require approval.\",\n parameters: [\n {\n name: \"command\",\n type: \"string\",\n description: \"The shell command to execute\",\n required: true,\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"Short description of what this command does\",\n required: false,\n },\n {\n name: \"timeout\",\n type: \"number\",\n description: \"Timeout in milliseconds (max 600000)\",\n required: false,\n default: DEFAULT_TIMEOUT_MS,\n },\n ],\n },\n category: \"shell\",\n requiresApproval: (context: IToolExecutionContext, args: Record<string, unknown>): boolean => {\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\n const blockedCommands = context.blockedCommands;\n\n // Dangerous commands always require approval\n if (isDangerousCommand(command) || isCommandBlocked(command, blockedCommands)) {\n return true;\n }\n\n // Strict mode: all shell commands require approval\n if (context.permissionMode === \"strict\") {\n return true;\n }\n\n return false;\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const command = args[\"command\"];\n if (typeof command !== \"string\" || command.length === 0) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: \"command parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const workingDirectory = context.workingDirectory;\n const blockedCommands = context.blockedCommands;\n const allowedPaths = context.allowedPaths;\n const projectRoot = context.projectRoot;\n\n // Block extremely dangerous patterns\n const lowerCommand = command.toLowerCase().trim();\n for (const pattern of DANGEROUS_PATTERNS) {\n if (lowerCommand.includes(pattern)) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: `Blocked: command matches dangerous pattern \"${pattern}\".`,\n isError: true,\n };\n }\n }\n\n if (isCommandBlocked(command, blockedCommands)) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: \"Command is on the blocked list and cannot be executed.\",\n isError: true,\n };\n }\n\n if (!isPathAllowed(workingDirectory, allowedPaths, projectRoot)) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: `Access denied: working directory ${workingDirectory} is outside the configured allowed paths.`,\n isError: true,\n };\n }\n\n let timeoutMs = DEFAULT_TIMEOUT_MS;\n if (typeof args[\"timeout\"] === \"number\") {\n timeoutMs = Math.max(1000, Math.min(args[\"timeout\"], MAX_TIMEOUT_MS));\n }\n\n logger.debug({ command: redactSecrets(command), timeout: timeoutMs, cwd: workingDirectory }, \"Executing bash command\");\n\n try {\n const result = await execaCommand(command, {\n cwd: workingDirectory,\n timeout: timeoutMs,\n reject: false,\n shell: true,\n env: {\n ...filterSensitiveEnv(process.env),\n TERM: \"dumb\",\n NO_COLOR: \"1\",\n },\n stripFinalNewline: true,\n });\n\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\n\n let content = \"\";\n if (stdout.length > 0) {\n content += stdout;\n }\n if (stderr.length > 0) {\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"STDERR:\\n\") + stderr;\n }\n if (content.length === 0) {\n content = `Command completed with exit code ${result.exitCode ?? 0}.`;\n }\n\n const isError = (result.exitCode ?? 0) !== 0;\n\n if (isError) {\n content = `Exit code: ${result.exitCode ?? \"unknown\"}\\n${content}`;\n }\n\n return {\n toolCallId: \"\",\n name: \"bash\",\n content,\n isError,\n };\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes(\"timed out\")) {\n throw new ExecutionTimeoutError(command, timeoutMs);\n }\n\n const msg = err instanceof Error ? err.message : \"Command execution failed\";\n logger.error({ command: redactSecrets(command), error: msg }, \"Bash execution failed\");\n\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: `Execution failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Web Search tool — search interface (provider-dependent implementation).\n * Per PRD section 5.1\n */\n\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype WebSearchProvider = (\n query: string,\n options: { readonly allowedDomains?: readonly string[] | undefined; readonly blockedDomains?: readonly string[] | undefined },\n) => Promise<string>;\n\nlet searchProvider: WebSearchProvider | undefined;\n\nexport function setWebSearchProvider(provider: WebSearchProvider): void {\n searchProvider = provider;\n}\n\nexport function createWebSearchTool(): IToolRegistration {\n return {\n definition: {\n name: \"web_search\",\n description:\n \"Search the web for up-to-date information. Requires a configured search provider.\",\n parameters: [\n {\n name: \"query\",\n type: \"string\",\n description: \"The search query\",\n required: true,\n },\n {\n name: \"allowed_domains\",\n type: \"array\",\n description: \"Only include results from these domains\",\n required: false,\n },\n {\n name: \"blocked_domains\",\n type: \"array\",\n description: \"Exclude results from these domains\",\n required: false,\n },\n ],\n },\n category: \"web\",\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const query = args[\"query\"];\n if (typeof query !== \"string\" || query.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: \"query parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (!searchProvider) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content:\n \"Web search is not configured. Set up a search provider in your configuration.\",\n isError: true,\n };\n }\n\n const allowedDomains = Array.isArray(args[\"allowed_domains\"])\n ? (args[\"allowed_domains\"] as unknown[]).filter(\n (d): d is string => typeof d === \"string\",\n )\n : undefined;\n\n const blockedDomains = Array.isArray(args[\"blocked_domains\"])\n ? (args[\"blocked_domains\"] as unknown[]).filter(\n (d): d is string => typeof d === \"string\",\n )\n : undefined;\n\n try {\n logger.debug({ query }, \"Web search executing\");\n\n const results = await searchProvider(query, {\n allowedDomains,\n blockedDomains,\n });\n\n if (results.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: `No results found for: ${query}`,\n isError: false,\n };\n }\n\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: results,\n isError: false,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Search failed\";\n logger.error({ query, error: msg }, \"Web search failed\");\n\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: `Web search failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Web Fetch tool — fetch URL content, strip HTML, timeout handling.\n * Per PRD section 5.1\n */\n\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_CONTENT_LENGTH = 100_000;\nconst MAX_URL_LENGTH = 2048;\n\nfunction stripHtmlTags(html: string): string {\n // Remove script and style blocks entirely\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, \"\");\n\n // Replace common block elements with newlines\n text = text.replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n // Strip all remaining tags\n text = text.replace(/<[^>]+>/g, \"\");\n\n // Decode common HTML entities\n text = text.replace(/&/g, \"&\");\n text = text.replace(/</g, \"<\");\n text = text.replace(/>/g, \">\");\n text = text.replace(/"/g, '\"');\n text = text.replace(/'/g, \"'\");\n text = text.replace(/ /g, \" \");\n\n // Collapse excessive whitespace\n text = text.replace(/[ \\t]+/g, \" \");\n text = text.replace(/\\n{3,}/g, \"\\n\\n\");\n\n return text.trim();\n}\n\nfunction isPrivateHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname === \"[::1]\") {\n return true;\n }\n const ipMatch = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(hostname);\n if (ipMatch) {\n const [, a, b] = ipMatch;\n if (a === undefined || b === undefined) {\n return false;\n }\n const first = parseInt(a, 10);\n const second = parseInt(b, 10);\n if (first === 127) return true;\n if (first === 10) return true;\n if (first === 172 && second >= 16 && second <= 31) return true;\n if (first === 192 && second === 168) return true;\n if (first === 169 && second === 254) return true;\n if (first === 0) return true;\n }\n return false;\n}\n\nfunction isValidUrl(urlString: string): boolean {\n if (urlString.length > MAX_URL_LENGTH) {\n return false;\n }\n try {\n const url = new URL(urlString);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return false;\n }\n if (isPrivateHostname(url.hostname)) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\nfunction enforceHttps(urlString: string): string {\n try {\n const url = new URL(urlString);\n if (url.protocol === \"http:\") {\n url.protocol = \"https:\";\n }\n return url.toString();\n } catch {\n return urlString;\n }\n}\n\nexport function createWebFetchTool(): IToolRegistration {\n return {\n definition: {\n name: \"web_fetch\",\n description:\n \"Fetch content from a URL and convert HTML to readable text. HTTP URLs are upgraded to HTTPS.\",\n parameters: [\n {\n name: \"url\",\n type: \"string\",\n description: \"The URL to fetch content from\",\n required: true,\n },\n {\n name: \"prompt\",\n type: \"string\",\n description: \"What information to extract from the page\",\n required: false,\n },\n {\n name: \"timeout\",\n type: \"number\",\n description: \"Timeout in milliseconds (default 30000)\",\n required: false,\n default: DEFAULT_TIMEOUT_MS,\n },\n ],\n },\n category: \"web\",\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => false,\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const rawUrl = args[\"url\"];\n if (typeof rawUrl !== \"string\" || rawUrl.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: \"url parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (!isValidUrl(rawUrl)) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Invalid URL: \"${rawUrl}\". Must be a valid HTTP(S) URL.`,\n isError: true,\n };\n }\n\n const url = enforceHttps(rawUrl);\n let timeoutMs = DEFAULT_TIMEOUT_MS;\n if (typeof args[\"timeout\"] === \"number\") {\n timeoutMs = Math.max(5000, Math.min(args[\"timeout\"], 60_000));\n }\n\n logger.debug({ url, timeout: timeoutMs }, \"Fetching URL\");\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, timeoutMs);\n\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: {\n \"User-Agent\": \"AemeathCLI/1.0\",\n \"Accept\": \"text/html, application/json, text/plain, */*\",\n },\n redirect: \"follow\",\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `HTTP ${response.status} ${response.statusText} for ${url}`,\n isError: true,\n };\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const rawBody = await response.text();\n\n let content: string;\n if (contentType.includes(\"text/html\")) {\n content = stripHtmlTags(rawBody);\n } else {\n content = rawBody;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + \"\\n...(content truncated)\";\n }\n\n if (content.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Fetched ${url} but the response body was empty.`,\n isError: false,\n };\n }\n\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content,\n isError: false,\n };\n } catch (err: unknown) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error && err.name === \"AbortError\") {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Request timed out after ${timeoutMs}ms for ${url}`,\n isError: true,\n };\n }\n\n const msg = err instanceof Error ? err.message : \"Fetch failed\";\n logger.error({ url, error: msg }, \"Web fetch failed\");\n\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Fetch failed for ${url}: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Git tool — safe git operations via execa. Never force push by default.\n * Per PRD section 5.1\n */\n\nimport { execaCommand } from \"execa\";\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst GIT_TIMEOUT_MS = 60_000;\nconst MAX_OUTPUT_LENGTH = 30_000;\n\nconst ALLOWED_SUBCOMMANDS: ReadonlySet<string> = new Set([\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\n \"add\", \"commit\", \"checkout\", \"switch\", \"merge\",\n \"rebase\", \"cherry-pick\", \"stash\", \"fetch\", \"pull\", \"push\",\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\n]);\n\nconst DANGEROUS_FLAGS: readonly string[] = [\n \"--force\", \"-f\",\n \"--force-with-lease\",\n \"--hard\",\n \"--no-verify\",\n \"-D\",\n];\n\nconst READ_ONLY_SUBCOMMANDS: ReadonlySet<string> = new Set([\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\n]);\n\nfunction parseGitSubcommand(command: string): string | undefined {\n const parts = command.trim().split(/\\s+/);\n // Expect \"git <subcommand> ...\"\n if (parts[0] !== \"git\" || parts.length < 2) {\n return undefined;\n }\n return parts[1];\n}\n\nfunction hasDangerousFlags(command: string): boolean {\n const lowerCommand = command.toLowerCase();\n return DANGEROUS_FLAGS.some((flag) => {\n // Match as whole token\n const pattern = new RegExp(`(^|\\\\s)${flag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\\\\s|$)`);\n return pattern.test(lowerCommand);\n });\n}\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT_LENGTH) {\n return output;\n }\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n}\n\nexport function createGitTool(): IToolRegistration {\n return {\n definition: {\n name: \"git\",\n description:\n \"Execute git commands safely. Supports status, diff, log, add, commit, branch operations. Never force pushes by default.\",\n parameters: [\n {\n name: \"command\",\n type: \"string\",\n description: 'Full git command to execute (e.g. \"git status\", \"git diff HEAD\")',\n required: true,\n },\n ],\n },\n category: \"git\",\n requiresApproval: (context: IToolExecutionContext, args: Record<string, unknown>): boolean => {\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\n const subcommand = parseGitSubcommand(command);\n\n // Dangerous flags always need approval\n if (hasDangerousFlags(command)) {\n return true;\n }\n\n // Read-only commands never need approval\n if (subcommand && READ_ONLY_SUBCOMMANDS.has(subcommand)) {\n return false;\n }\n\n // Write commands need approval in strict mode\n if (context.permissionMode === \"strict\") {\n return true;\n }\n\n // Push needs approval in standard mode\n if (subcommand === \"push\" && context.permissionMode === \"standard\") {\n return true;\n }\n\n return false;\n },\n execute: async (\n args: Record<string, unknown>,\n context: IToolExecutionContext,\n ): Promise<IToolResult> => {\n const command = args[\"command\"];\n if (typeof command !== \"string\" || command.length === 0) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: \"command parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const workingDirectory = context.workingDirectory;\n\n const trimmedCommand = command.trim();\n if (!trimmedCommand.startsWith(\"git \")) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: 'Command must start with \"git\".',\n isError: true,\n };\n }\n\n const subcommand = parseGitSubcommand(trimmedCommand);\n if (!subcommand || !ALLOWED_SUBCOMMANDS.has(subcommand)) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: `Git subcommand \"${subcommand ?? \"unknown\"}\" is not allowed. Allowed: ${[...ALLOWED_SUBCOMMANDS].join(\", \")}`,\n isError: true,\n };\n }\n\n // Block force push completely\n const lowerCommand = trimmedCommand.toLowerCase();\n if (\n subcommand === \"push\" &&\n (lowerCommand.includes(\"--force\") || lowerCommand.includes(\" -f\"))\n ) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content:\n \"Force push is blocked by default. Use --force-with-lease if needed (requires approval).\",\n isError: true,\n };\n }\n\n logger.debug({ command: trimmedCommand, subcommand, cwd: workingDirectory }, \"Executing git command\");\n\n try {\n const result = await execaCommand(trimmedCommand, {\n cwd: workingDirectory,\n timeout: GIT_TIMEOUT_MS,\n reject: false,\n env: {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n GIT_PAGER: \"cat\",\n },\n stripFinalNewline: true,\n });\n\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\n\n let content = \"\";\n if (stdout.length > 0) {\n content += stdout;\n }\n if (stderr.length > 0) {\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"\") + stderr;\n }\n if (content.length === 0) {\n content = `Git command completed with exit code ${result.exitCode ?? 0}.`;\n }\n\n const isError = (result.exitCode ?? 0) !== 0;\n\n return {\n toolCallId: \"\",\n name: \"git\",\n content,\n isError,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Git command failed\";\n logger.error({ command: trimmedCommand, error: msg }, \"Git execution failed\");\n\n return {\n toolCallId: \"\",\n name: \"git\",\n content: `Git command failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Tools barrel export and default registry factory.\n * Per PRD section 5.1\n */\n\nexport { ToolRegistry } from \"./registry.js\";\n\nexport { createReadTool } from \"./read.js\";\nexport { createWriteTool } from \"./write.js\";\nexport { createEditTool } from \"./edit.js\";\nexport { createGlobTool } from \"./glob.js\";\nexport { createGrepTool } from \"./grep.js\";\nexport { createBashTool } from \"./bash.js\";\nexport { createWebSearchTool, setWebSearchProvider } from \"./web-search.js\";\nexport { createWebFetchTool } from \"./web-fetch.js\";\nexport { createGitTool } from \"./git.js\";\n\nimport { ToolRegistry } from \"./registry.js\";\nimport { createReadTool } from \"./read.js\";\nimport { createWriteTool } from \"./write.js\";\nimport { createEditTool } from \"./edit.js\";\nimport { createGlobTool } from \"./glob.js\";\nimport { createGrepTool } from \"./grep.js\";\nimport { createBashTool } from \"./bash.js\";\nimport { createWebSearchTool } from \"./web-search.js\";\nimport { createWebFetchTool } from \"./web-fetch.js\";\nimport { createGitTool } from \"./git.js\";\nimport type { IToolExecutionContext } from \"../types/tool.js\";\n\nexport function createDefaultRegistry(_context: IToolExecutionContext): ToolRegistry {\n const registry = new ToolRegistry();\n\n registry.register(createReadTool());\n registry.register(createWriteTool());\n registry.register(createEditTool());\n registry.register(createGlobTool());\n registry.register(createGrepTool());\n registry.register(createBashTool());\n registry.register(createWebSearchTool());\n registry.register(createWebFetchTool());\n registry.register(createGitTool());\n\n return registry;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getEventBus } from './chunk-
|
|
2
|
-
import { AgentSpawnError } from './chunk-
|
|
3
|
-
import { logger } from './chunk-
|
|
1
|
+
import { getEventBus } from './chunk-YL5XFHR3.js';
|
|
2
|
+
import { AgentSpawnError } from './chunk-ZGOHARPV.js';
|
|
3
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
4
4
|
import { execa } from 'execa';
|
|
5
5
|
|
|
6
6
|
// src/panes/layout-engine.ts
|
|
@@ -606,5 +606,5 @@ var TmuxManager = class {
|
|
|
606
606
|
};
|
|
607
607
|
|
|
608
608
|
export { LayoutEngine, TmuxManager };
|
|
609
|
-
//# sourceMappingURL=chunk-
|
|
610
|
-
//# sourceMappingURL=chunk-
|
|
609
|
+
//# sourceMappingURL=chunk-GXAJGP2T.js.map
|
|
610
|
+
//# sourceMappingURL=chunk-GXAJGP2T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/panes/layout-engine.ts","../src/panes/tmux-manager.ts"],"names":["firstPane","bottomPanes"],"mappings":"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","file":"chunk-GXAJGP2T.js","sourcesContent":["/**\n * Layout engine for split-panel auto-layout computation per PRD section 9.2.\n * Computes pane positions based on agent count and terminal dimensions.\n */\n\nimport type { PaneLayout, IPaneConfig, ILayoutConfig } from \"../types/team.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ── Layout Geometry ─────────────────────────────────────────────────────\n\nexport interface IPaneGeometry {\n readonly paneId: string;\n readonly row: number;\n readonly col: number;\n readonly widthPercent: number;\n readonly heightPercent: number;\n readonly splitDirection: \"horizontal\" | \"vertical\" | \"none\";\n}\n\nexport interface IComputedLayout {\n readonly panes: readonly IPaneGeometry[];\n readonly rows: number;\n readonly cols: number;\n readonly terminalWidth: number;\n readonly terminalHeight: number;\n}\n\ninterface ITerminalSize {\n readonly columns: number;\n readonly rows: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst MIN_PANE_WIDTH = 40;\nconst MIN_PANE_HEIGHT = 10;\nconst DEFAULT_TERMINAL_WIDTH = 120;\nconst DEFAULT_TERMINAL_HEIGHT = 40;\nconst MAX_GRID_COLUMNS = 3;\n\n// ── Layout Engine ───────────────────────────────────────────────────────\n\nexport class LayoutEngine {\n private readonly terminalSize: ITerminalSize;\n\n constructor(terminalSize?: Partial<ITerminalSize>) {\n this.terminalSize = {\n columns: terminalSize?.columns ?? this.detectTerminalWidth(),\n rows: terminalSize?.rows ?? this.detectTerminalHeight(),\n };\n logger.debug(\n { terminalSize: this.terminalSize },\n \"LayoutEngine initialized\",\n );\n }\n\n /**\n * Compute the full layout for a set of pane configs.\n */\n computeLayout(config: ILayoutConfig): IComputedLayout {\n const paneCount = config.panes.length;\n if (paneCount === 0) {\n return {\n panes: [],\n rows: 0,\n cols: 0,\n terminalWidth: this.terminalSize.columns,\n terminalHeight: this.terminalSize.rows,\n };\n }\n\n const effectiveCount = Math.max(\n 1,\n Math.min(paneCount, config.maxPanes, this.getMaxPanes()),\n );\n const layout = config.layout === \"auto\"\n ? this.resolveAutoLayout(effectiveCount)\n : config.layout;\n\n const geometries = this.computeGeometries(\n config.panes.slice(0, effectiveCount),\n layout,\n effectiveCount,\n );\n\n const { gridRows, gridCols } = this.getGridDimensions(effectiveCount, layout);\n\n logger.info(\n { layout, paneCount: effectiveCount, gridRows, gridCols },\n \"Layout computed\",\n );\n\n return {\n panes: geometries,\n rows: gridRows,\n cols: gridCols,\n terminalWidth: this.terminalSize.columns,\n terminalHeight: this.terminalSize.rows,\n };\n }\n\n /**\n * Determine the best auto-layout for a given pane count (PRD section 9.2).\n */\n resolveAutoLayout(paneCount: number): Exclude<PaneLayout, \"auto\"> {\n if (paneCount <= 1) return \"horizontal\";\n return \"hub-spoke\";\n }\n\n /**\n * Get the maximum number of panes the terminal can support.\n */\n getMaxPanes(): number {\n const maxByWidth = Math.floor(this.terminalSize.columns / MIN_PANE_WIDTH);\n const maxByHeight = Math.floor(this.terminalSize.rows / MIN_PANE_HEIGHT);\n return Math.max(1, maxByWidth * maxByHeight);\n }\n\n /**\n * Check if the terminal is large enough for the requested pane count.\n */\n canFitPanes(paneCount: number): boolean {\n return paneCount <= this.getMaxPanes();\n }\n\n /**\n * Get the grid dimensions for a given pane count and layout type.\n */\n private getGridDimensions(\n paneCount: number,\n layout: Exclude<PaneLayout, \"auto\">,\n ): { gridRows: number; gridCols: number } {\n switch (layout) {\n case \"horizontal\":\n return { gridRows: 1, gridCols: paneCount };\n case \"vertical\":\n return { gridRows: paneCount, gridCols: 1 };\n case \"grid\":\n return this.computeGridSize(paneCount);\n case \"hub-spoke\":\n return { gridRows: Math.max(1, paneCount - 1), gridCols: 2 };\n }\n }\n\n /**\n * Compute grid rows and columns for a given pane count.\n * PRD section 9.2:\n * 2 agents → horizontal split (50/50) → 1x2\n * 3 agents → 1 top + 2 bottom → 2 rows\n * 4 agents → 2x2 grid\n * 5+ agents → leader top + grid bottom\n */\n private computeGridSize(paneCount: number): { gridRows: number; gridCols: number } {\n if (paneCount <= 1) return { gridRows: 1, gridCols: 1 };\n if (paneCount === 2) return { gridRows: 1, gridCols: 2 };\n if (paneCount <= 4) return { gridRows: 2, gridCols: 2 };\n\n const bottomPaneCount = paneCount - 1;\n const gridCols = Math.min(bottomPaneCount, MAX_GRID_COLUMNS);\n const gridRows = 1 + Math.ceil(bottomPaneCount / gridCols);\n return { gridRows, gridCols };\n }\n\n /**\n * Compute per-pane geometries based on layout type.\n */\n private computeGeometries(\n panes: readonly IPaneConfig[],\n layout: Exclude<PaneLayout, \"auto\">,\n paneCount: number,\n ): IPaneGeometry[] {\n switch (layout) {\n case \"horizontal\":\n return this.computeHorizontalLayout(panes);\n case \"vertical\":\n return this.computeVerticalLayout(panes);\n case \"grid\":\n return this.computeGridLayout(panes, paneCount);\n case \"hub-spoke\":\n return this.computeHubSpokeLayout(panes);\n }\n }\n\n private computeHubSpokeLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\n const [leaderPane, ...workerPanes] = panes;\n if (!leaderPane) {\n return [];\n }\n\n const geometries: IPaneGeometry[] = [\n {\n paneId: leaderPane.paneId,\n row: 0,\n col: 0,\n widthPercent: workerPanes.length > 0 ? 50 : 100,\n heightPercent: 100,\n splitDirection: \"none\",\n },\n ];\n\n if (workerPanes.length === 0) {\n return geometries;\n }\n\n const workerHeightPercent = Math.floor(100 / workerPanes.length);\n for (const [index, pane] of workerPanes.entries()) {\n geometries.push({\n paneId: pane.paneId,\n row: index,\n col: 1,\n widthPercent: 50,\n heightPercent:\n index === workerPanes.length - 1\n ? 100 - workerHeightPercent * (workerPanes.length - 1)\n : workerHeightPercent,\n splitDirection: index === 0 ? \"horizontal\" : \"vertical\",\n });\n }\n\n return geometries;\n }\n\n /**\n * Horizontal split: all panes side by side.\n */\n private computeHorizontalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\n const widthPercent = Math.floor(100 / panes.length);\n return panes.map((pane, index) => ({\n paneId: pane.paneId,\n row: 0,\n col: index,\n widthPercent: index === panes.length - 1\n ? 100 - widthPercent * (panes.length - 1)\n : widthPercent,\n heightPercent: 100,\n splitDirection: index === 0 ? \"none\" as const : \"horizontal\" as const,\n }));\n }\n\n /**\n * Vertical split: all panes stacked.\n */\n private computeVerticalLayout(panes: readonly IPaneConfig[]): IPaneGeometry[] {\n const heightPercent = Math.floor(100 / panes.length);\n return panes.map((pane, index) => ({\n paneId: pane.paneId,\n row: index,\n col: 0,\n widthPercent: 100,\n heightPercent: index === panes.length - 1\n ? 100 - heightPercent * (panes.length - 1)\n : heightPercent,\n splitDirection: index === 0 ? \"none\" as const : \"vertical\" as const,\n }));\n }\n\n /**\n * Grid layout per PRD section 9.2 rules:\n * 3 agents → leader spans top, 2 on bottom\n * 4 agents → 2x2 even grid\n * 5+ agents → leader spans top, rest in grid below\n */\n private computeGridLayout(\n panes: readonly IPaneConfig[],\n paneCount: number,\n ): IPaneGeometry[] {\n const geometries: IPaneGeometry[] = [];\n\n if (paneCount <= 2) {\n return this.computeHorizontalLayout(panes);\n }\n\n if (paneCount === 3) {\n // 1 top (leader, full width) + 2 bottom\n const firstPane = panes[0];\n if (firstPane) {\n geometries.push({\n paneId: firstPane.paneId,\n row: 0,\n col: 0,\n widthPercent: 100,\n heightPercent: 50,\n splitDirection: \"none\",\n });\n }\n const bottomPanes = panes.slice(1);\n for (let i = 0; i < bottomPanes.length; i++) {\n const pane = bottomPanes[i];\n if (pane) {\n geometries.push({\n paneId: pane.paneId,\n row: 1,\n col: i,\n widthPercent: 50,\n heightPercent: 50,\n splitDirection: i === 0 ? \"vertical\" : \"horizontal\",\n });\n }\n }\n return geometries;\n }\n\n if (paneCount === 4) {\n // 2x2 even grid\n const { gridCols } = this.computeGridSize(4);\n for (let i = 0; i < panes.length; i++) {\n const pane = panes[i];\n if (pane) {\n const row = Math.floor(i / gridCols);\n const col = i % gridCols;\n geometries.push({\n paneId: pane.paneId,\n row,\n col,\n widthPercent: 50,\n heightPercent: 50,\n splitDirection: this.determineSplitDirection(i, row, col),\n });\n }\n }\n return geometries;\n }\n\n // 5+ agents: leader top + grid bottom\n const firstPane = panes[0];\n if (firstPane) {\n geometries.push({\n paneId: firstPane.paneId,\n row: 0,\n col: 0,\n widthPercent: 100,\n heightPercent: 40,\n splitDirection: \"none\",\n });\n }\n\n const bottomPanes = panes.slice(1);\n const bottomCols = Math.min(bottomPanes.length, MAX_GRID_COLUMNS);\n const bottomRows = Math.ceil(bottomPanes.length / bottomCols);\n const cellWidth = Math.floor(100 / bottomCols);\n const cellHeight = Math.floor(60 / bottomRows);\n\n for (let i = 0; i < bottomPanes.length; i++) {\n const pane = bottomPanes[i];\n if (pane) {\n const row = Math.floor(i / bottomCols) + 1;\n const col = i % bottomCols;\n const isLastInRow = col === bottomCols - 1 || i === bottomPanes.length - 1;\n geometries.push({\n paneId: pane.paneId,\n row,\n col,\n widthPercent: isLastInRow ? 100 - cellWidth * col : cellWidth,\n heightPercent: cellHeight,\n splitDirection: this.determineSplitDirection(i + 1, row, col),\n });\n }\n }\n\n return geometries;\n }\n\n /**\n * Determine split direction based on position in grid.\n */\n private determineSplitDirection(\n index: number,\n row: number,\n col: number,\n ): \"horizontal\" | \"vertical\" | \"none\" {\n if (index === 0) return \"none\";\n if (col === 0) return \"vertical\";\n return \"horizontal\";\n }\n\n /**\n * Detect terminal width from environment.\n */\n private detectTerminalWidth(): number {\n const columns = process.stdout.columns;\n return Number.isFinite(columns) && columns > 0 ? columns : DEFAULT_TERMINAL_WIDTH;\n }\n\n /**\n * Detect terminal height from environment.\n */\n private detectTerminalHeight(): number {\n const rows = process.stdout.rows;\n return Number.isFinite(rows) && rows > 0 ? rows : DEFAULT_TERMINAL_HEIGHT;\n }\n}\n","/**\n * TmuxManager — Programmatic tmux control per PRD section 9.2.\n * Creates sessions, splits panes, sends commands, manages lifecycle.\n */\n\nimport { execa } from \"execa\";\nimport type { ILayoutConfig } from \"../types/team.js\";\nimport type { IComputedLayout, IPaneGeometry } from \"./layout-engine.js\";\nimport { LayoutEngine } from \"./layout-engine.js\";\nimport { getEventBus } from \"../core/event-bus.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { AgentSpawnError } from \"../types/errors.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport interface ITmuxPaneInfo {\n readonly paneId: string;\n readonly tmuxPaneId: string;\n readonly agentName: string;\n readonly title: string;\n}\n\ninterface ITmuxManagerOptions {\n readonly sessionPrefix?: string;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────\n\nconst DEFAULT_SESSION_PREFIX = \"aemeathcli\";\nconst TMUX_BINARY = \"tmux\";\n\n// ── TmuxManager ─────────────────────────────────────────────────────────\n\nexport class TmuxManager {\n private readonly sessionPrefix: string;\n private readonly layoutEngine: LayoutEngine;\n private readonly panes = new Map<string, ITmuxPaneInfo>();\n private sessionName: string | undefined;\n private disposed = false;\n\n constructor(options?: ITmuxManagerOptions) {\n this.sessionPrefix = options?.sessionPrefix ?? DEFAULT_SESSION_PREFIX;\n this.layoutEngine = new LayoutEngine();\n }\n\n /**\n * Check if tmux is available on this system.\n */\n async isAvailable(): Promise<boolean> {\n // tmux is Unix-only — always unavailable on Windows.\n if (process.platform === \"win32\") return false;\n\n try {\n const result = await execa(\"which\", [TMUX_BINARY]);\n return result.exitCode === 0;\n } catch {\n logger.warn(\"tmux binary not found on PATH\");\n return false;\n }\n }\n\n /**\n * Create a new tmux session for a team.\n */\n async createSession(teamName: string): Promise<string> {\n this.assertNotDisposed();\n\n if (!(await this.isAvailable())) {\n throw new AgentSpawnError(\n teamName,\n \"tmux is not installed. Install tmux or use single-pane mode.\",\n );\n }\n\n this.sessionName = `${this.sessionPrefix}-${teamName}`;\n const stdout = {\n columns: process.stdout.columns as number | undefined,\n rows: process.stdout.rows as number | undefined,\n };\n\n // Kill any existing session with the same name\n await this.killSessionSilent(this.sessionName);\n\n try {\n await execa(TMUX_BINARY, [\n \"new-session\",\n \"-d\",\n \"-s\", this.sessionName,\n \"-x\", String(stdout.columns ?? 120),\n \"-y\", String(stdout.rows ?? 40),\n ]);\n logger.info({ sessionName: this.sessionName }, \"tmux session created\");\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n throw new AgentSpawnError(teamName, `Failed to create tmux session: ${message}`);\n }\n\n return this.sessionName;\n }\n\n /**\n * Create split panes based on a layout configuration.\n */\n async createPanes(layoutConfig: ILayoutConfig): Promise<IComputedLayout> {\n this.assertNotDisposed();\n this.assertSession();\n\n const computed = this.layoutEngine.computeLayout(layoutConfig);\n const resolvedLayout = layoutConfig.layout === \"auto\"\n ? this.layoutEngine.resolveAutoLayout(layoutConfig.panes.length)\n : layoutConfig.layout;\n\n // First pane is already the initial pane in the session\n const firstGeometry = computed.panes[0];\n const firstConfig = layoutConfig.panes[0];\n if (firstGeometry && firstConfig) {\n const tmuxPaneId = await this.getFirstPaneId();\n const info: ITmuxPaneInfo = {\n paneId: firstConfig.paneId,\n tmuxPaneId,\n agentName: firstConfig.agentName,\n title: firstConfig.title,\n };\n this.panes.set(firstConfig.paneId, info);\n await this.setPaneTitle(tmuxPaneId, firstConfig.title);\n getEventBus().emit(\"pane:created\", {\n paneId: firstConfig.paneId,\n agentName: firstConfig.agentName,\n });\n }\n\n // Create remaining panes via splits\n for (let i = 1; i < computed.panes.length; i++) {\n const geometry = computed.panes[i];\n const config = layoutConfig.panes[i];\n if (!geometry || !config) continue;\n\n const tmuxPaneId = await this.splitPane(geometry);\n const info: ITmuxPaneInfo = {\n paneId: config.paneId,\n tmuxPaneId,\n agentName: config.agentName,\n title: config.title,\n };\n this.panes.set(config.paneId, info);\n await this.setPaneTitle(tmuxPaneId, config.title);\n getEventBus().emit(\"pane:created\", {\n paneId: config.paneId,\n agentName: config.agentName,\n });\n }\n\n await this.applyLayoutPreset(resolvedLayout);\n\n logger.info(\n { paneCount: this.panes.size, session: this.sessionName },\n \"All panes created\",\n );\n\n return computed;\n }\n\n /**\n * Send a command string to a specific pane.\n */\n async sendCommand(paneId: string, command: string): Promise<void> {\n this.assertNotDisposed();\n this.assertSession();\n\n const info = this.panes.get(paneId);\n if (!info) {\n logger.warn({ paneId }, \"Pane not found, cannot send command\");\n return;\n }\n\n // tmux pane IDs (%N) are globally unique — use them directly.\n // The format \"session:%N\" is invalid because tmux interprets\n // the part after \":\" as a window name, not a pane ID.\n await execa(TMUX_BINARY, [\n \"send-keys\",\n \"-t\", info.tmuxPaneId,\n command,\n \"Enter\",\n ]);\n\n logger.debug({ paneId, command: command.slice(0, 80) }, \"Command sent to pane\");\n }\n\n /**\n * Resize a pane by tmux pane target.\n */\n async resizePane(\n paneId: string,\n dimensions: { width?: number; height?: number },\n ): Promise<void> {\n this.assertNotDisposed();\n this.assertSession();\n\n const info = this.panes.get(paneId);\n if (!info) return;\n\n const target = info.tmuxPaneId;\n\n if (dimensions.width !== undefined) {\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-x\", String(dimensions.width)]);\n }\n if (dimensions.height !== undefined) {\n await execa(TMUX_BINARY, [\"resize-pane\", \"-t\", target, \"-y\", String(dimensions.height)]);\n }\n }\n\n /**\n * Set the title for a tmux pane.\n */\n private async setPaneTitle(tmuxPaneId: string, title: string): Promise<void> {\n if (!this.sessionName) return;\n try {\n await execa(TMUX_BINARY, [\n \"select-pane\",\n \"-t\", tmuxPaneId,\n \"-T\", title,\n ]);\n } catch {\n logger.debug({ tmuxPaneId, title }, \"Failed to set pane title (non-fatal)\");\n }\n }\n\n /**\n * Kill a specific pane.\n */\n async killPane(paneId: string): Promise<void> {\n this.assertNotDisposed();\n\n const info = this.panes.get(paneId);\n if (!info || !this.sessionName) return;\n\n try {\n await execa(TMUX_BINARY, [\n \"kill-pane\",\n \"-t\", info.tmuxPaneId,\n ]);\n this.panes.delete(paneId);\n getEventBus().emit(\"pane:closed\", { paneId });\n logger.debug({ paneId }, \"Pane killed\");\n } catch {\n logger.debug({ paneId }, \"Failed to kill pane (may already be closed)\");\n }\n }\n\n /**\n * Attach to the tmux session (gives control to the user).\n */\n async attachSession(): Promise<void> {\n this.assertNotDisposed();\n const sessionName = this.requireSessionName();\n\n await execa(TMUX_BINARY, [\"attach-session\", \"-t\", sessionName], {\n stdio: \"inherit\",\n });\n }\n\n /**\n * Check if the session still exists.\n */\n async isSessionAlive(): Promise<boolean> {\n if (!this.sessionName) return false;\n try {\n await execa(TMUX_BINARY, [\"has-session\", \"-t\", this.sessionName]);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Destroy the entire tmux session and all panes.\n */\n async destroy(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n if (this.sessionName) {\n await this.killSessionSilent(this.sessionName);\n\n for (const paneId of this.panes.keys()) {\n getEventBus().emit(\"pane:closed\", { paneId });\n }\n this.panes.clear();\n\n logger.info({ sessionName: this.sessionName }, \"tmux session destroyed\");\n this.sessionName = undefined;\n }\n }\n\n /**\n * Get the current session name.\n */\n getSessionName(): string | undefined {\n return this.sessionName;\n }\n\n /**\n * Get all tracked pane info.\n */\n getPanes(): ReadonlyMap<string, ITmuxPaneInfo> {\n return this.panes;\n }\n\n // ── Private Helpers ─────────────────────────────────────────────────\n\n private async splitPane(geometry: IPaneGeometry): Promise<string> {\n const sessionName = this.requireSessionName();\n const splitFlag = geometry.splitDirection === \"horizontal\" ? \"-h\" : \"-v\";\n\n const result = await execa(TMUX_BINARY, [\n \"split-window\",\n splitFlag,\n \"-t\", sessionName,\n \"-P\",\n \"-F\", \"#{pane_id}\",\n ]);\n\n const tmuxPaneId = result.stdout.trim();\n logger.debug(\n { tmuxPaneId, direction: geometry.splitDirection },\n \"Pane split created\",\n );\n return tmuxPaneId;\n }\n\n private async getFirstPaneId(): Promise<string> {\n const sessionName = this.requireSessionName();\n const result = await execa(TMUX_BINARY, [\n \"list-panes\",\n \"-t\", sessionName,\n \"-F\", \"#{pane_id}\",\n ]);\n const firstLine = result.stdout.trim().split(\"\\n\")[0];\n return firstLine ?? \"%0\";\n }\n\n private async applyLayoutPreset(layout: Exclude<ILayoutConfig[\"layout\"], \"auto\">): Promise<void> {\n if (!this.sessionName) return;\n const tmuxLayout = layout === \"hub-spoke\" ? \"main-vertical\" : \"tiled\";\n try {\n await execa(TMUX_BINARY, [\n \"select-layout\",\n \"-t\", this.sessionName,\n tmuxLayout,\n ]);\n } catch {\n logger.debug({ layout: tmuxLayout }, \"Failed to apply tmux layout preset (non-fatal)\");\n }\n }\n\n private async killSessionSilent(sessionName: string): Promise<void> {\n try {\n await execa(TMUX_BINARY, [\"kill-session\", \"-t\", sessionName]);\n } catch {\n // Session may not exist — ignore\n }\n }\n\n private assertNotDisposed(): void {\n if (this.disposed) {\n throw new AgentSpawnError(\"tmux\", \"TmuxManager has been disposed\");\n }\n }\n\n private assertSession(): void {\n if (!this.sessionName) {\n throw new AgentSpawnError(\"tmux\", \"No active tmux session. Call createSession() first.\");\n }\n }\n\n private requireSessionName(): string {\n if (!this.sessionName) {\n throw new AgentSpawnError(\"tmux\", \"No active tmux session. Call createSession() first.\");\n }\n return this.sessionName;\n }\n}\n"]}
|
|
@@ -318,5 +318,5 @@ var PROVIDER_MODEL_ORDER = {
|
|
|
318
318
|
var DEFAULT_MODEL_ID = "claude-sonnet-4-6";
|
|
319
319
|
|
|
320
320
|
export { DEFAULT_MODEL_ID, PROVIDER_MODEL_ORDER, SUPPORTED_MODELS, getThinkingConfigForModel };
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
322
|
-
//# sourceMappingURL=chunk-
|
|
321
|
+
//# sourceMappingURL=chunk-HCIHOHLX.js.map
|
|
322
|
+
//# sourceMappingURL=chunk-HCIHOHLX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/model.ts"],"names":[],"mappings":"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","file":"chunk-HCIHOHLX.js","sourcesContent":["/**\n * Model-related types per PRD sections 7.1-7.5\n */\n\n// ── Provider Identifiers ─────────────────────────────────────────────────\n\nexport type ProviderName = \"anthropic\" | \"openai\" | \"google\" | \"kimi\" | \"ollama\";\n\n// ── Model Roles (PRD section 7.2) ───────────────────────────────────────\n\nexport type ModelRole =\n | \"planning\"\n | \"coding\"\n | \"review\"\n | \"testing\"\n | \"bugfix\"\n | \"documentation\";\n\n// ── Provider-specific Thinking / Reasoning Configuration ─────────────────\n\nexport interface IThinkingOption {\n readonly value: string;\n readonly label: string;\n readonly description: string;\n}\n\nexport interface IProviderThinkingConfig {\n readonly method: string;\n readonly options: readonly IThinkingOption[];\n readonly defaultValue: string;\n}\n\n/**\n * Provider-specific thinking configurations.\n *\n * Anthropic → Extended Thinking (budget_tokens: 1024–model max)\n * OpenAI → Reasoning Effort (low | medium | high)\n * Google 2.5 → Thinking Budget (0–24576, -1 = dynamic)\n * Google 3 → Thinking Level (minimal | low | medium | high)\n * Kimi → Thinking Mode (enabled | disabled)\n */\nexport const PROVIDER_THINKING_CONFIGS: Readonly<Record<string, IProviderThinkingConfig>> = {\n anthropic: {\n method: \"extended_thinking\",\n options: [\n { value: \"off\", label: \"Off\", description: \"No extended thinking\" },\n { value: \"low\", label: \"Low (1K tokens)\", description: \"budget_tokens: 1024\" },\n { value: \"medium\", label: \"Medium (8K tokens)\", description: \"budget_tokens: 8192\" },\n { value: \"high\", label: \"High (16K tokens)\", description: \"budget_tokens: 16384\" },\n { value: \"max\", label: \"Max (model limit)\", description: \"budget_tokens: max_output_tokens\" },\n ],\n defaultValue: \"medium\",\n },\n openai: {\n method: \"reasoning_effort\",\n options: [\n { value: \"low\", label: \"Low\", description: \"Fewer reasoning tokens, faster\" },\n { value: \"medium\", label: \"Medium\", description: \"Balanced reasoning (default)\" },\n { value: \"high\", label: \"High\", description: \"Thorough reasoning, more tokens\" },\n ],\n defaultValue: \"medium\",\n },\n \"google:gemini-2.5\": {\n method: \"thinking_budget\",\n options: [\n { value: \"off\", label: \"Off\", description: \"Disable thinking (budget: 0)\" },\n { value: \"dynamic\", label: \"Dynamic\", description: \"Auto-adjust based on complexity (budget: -1)\" },\n { value: \"low\", label: \"Low (4K tokens)\", description: \"thinkingBudget: 4096\" },\n { value: \"medium\", label: \"Medium (12K tokens)\", description: \"thinkingBudget: 12288\" },\n { value: \"high\", label: \"High (24K tokens)\", description: \"thinkingBudget: 24576\" },\n ],\n defaultValue: \"dynamic\",\n },\n \"google:gemini-3\": {\n method: \"thinking_level\",\n options: [\n { value: \"minimal\", label: \"Minimal\", description: \"Minimal thinking\" },\n { value: \"low\", label: \"Low\", description: \"Light thinking\" },\n { value: \"medium\", label: \"Medium\", description: \"Balanced thinking\" },\n { value: \"high\", label: \"High\", description: \"Deep thinking\" },\n ],\n defaultValue: \"medium\",\n },\n kimi: {\n method: \"thinking_mode\",\n options: [\n { value: \"enabled\", label: \"Enabled\", description: \"Include reasoning traces\" },\n { value: \"disabled\", label: \"Disabled\", description: \"Direct responses only\" },\n ],\n defaultValue: \"enabled\",\n },\n};\n\n/**\n * Look up the thinking configuration for a specific model.\n * Handles Google's model-family split (Gemini 2.5 vs Gemini 3).\n */\nexport function getThinkingConfigForModel(modelId: string): IProviderThinkingConfig | undefined {\n const modelInfo = SUPPORTED_MODELS[modelId];\n if (modelInfo === undefined) return undefined;\n\n if (modelInfo.provider === \"google\") {\n if (modelId.startsWith(\"gemini-3\")) {\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-3\"];\n }\n return PROVIDER_THINKING_CONFIGS[\"google:gemini-2.5\"];\n }\n\n return PROVIDER_THINKING_CONFIGS[modelInfo.provider];\n}\n\n// ── Model Information ────────────────────────────────────────────────────\n\nexport interface IModelInfo {\n readonly id: string;\n readonly name: string;\n readonly provider: ProviderName;\n readonly contextWindow: number;\n readonly maxOutputTokens: number;\n readonly inputPricePerMToken: number;\n readonly outputPricePerMToken: number;\n readonly supportsStreaming: boolean;\n readonly supportsToolCalling: boolean;\n readonly supportedRoles: readonly ModelRole[];\n readonly description?: string | undefined;\n}\n\n// ── Model Display Entry (for /model selection UI) ────────────────────────\n\nexport interface IModelDisplayEntry {\n readonly id: string;\n readonly label: string;\n readonly description: string;\n readonly isDefault?: boolean | undefined;\n}\n\n// ── Role Configuration (PRD section 7.2) ─────────────────────────────────\n\nexport interface IRoleConfig {\n readonly primary: string;\n readonly fallback: readonly string[];\n}\n\n// ── Model Router Resolution (PRD section 7.2) ────────────────────────────\n\nexport type ModelResolutionSource =\n | \"user_override\"\n | \"role_config\"\n | \"fallback_chain\"\n | \"system_default\";\n\nexport interface IModelResolution {\n readonly modelId: string;\n readonly provider: ProviderName;\n readonly source: ModelResolutionSource;\n readonly role?: ModelRole | undefined;\n}\n\n// ── Token Usage ──────────────────────────────────────────────────────────\n\nexport interface ITokenUsage {\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly totalTokens: number;\n readonly costUsd: number;\n}\n\n// ── Supported Models Registry (PRD section 7.3) ─────────────────────────\n\nexport const SUPPORTED_MODELS: Record<string, IModelInfo> = {\n // ── Anthropic / Claude ─────────────────────────────────────────────────\n \"claude-opus-4-6\": {\n id: \"claude-opus-4-6\",\n name: \"Claude Opus 4.6\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 15,\n outputPricePerMToken: 75,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\n description: \"Most capable for complex work\",\n },\n \"claude-opus-4-6-1m\": {\n id: \"claude-opus-4-6-1m\",\n name: \"Claude Opus 4.6 (1M context)\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 10,\n outputPricePerMToken: 37.5,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"bugfix\", \"coding\"],\n description: \"Opus 4.6 with 1M context\",\n },\n \"claude-sonnet-4-6\": {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 16_000,\n inputPricePerMToken: 3,\n outputPricePerMToken: 15,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\n description: \"Best for everyday tasks\",\n },\n \"claude-sonnet-4-6-1m\": {\n id: \"claude-sonnet-4-6-1m\",\n name: \"Claude Sonnet 4.6 (1M context)\",\n provider: \"anthropic\",\n contextWindow: 1_000_000,\n maxOutputTokens: 16_000,\n inputPricePerMToken: 6,\n outputPricePerMToken: 22.5,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\", \"documentation\", \"review\"],\n description: \"Sonnet 4.6 with 1M context\",\n },\n \"claude-haiku-4-5\": {\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n provider: \"anthropic\",\n contextWindow: 200_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0.8,\n outputPricePerMToken: 4,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\"],\n description: \"Fastest for quick answers\",\n },\n\n // ── OpenAI / Codex ─────────────────────────────────────────────────────\n \"gpt-5.3-codex\": {\n id: \"gpt-5.3-codex\",\n name: \"GPT-5.3 Codex\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Latest frontier agentic coding model\",\n },\n \"gpt-5.3-codex-spark\": {\n id: \"gpt-5.3-codex-spark\",\n name: \"GPT-5.3 Codex Spark\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 16_384,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\n description: \"Ultra-fast coding model\",\n },\n \"gpt-5.2-codex\": {\n id: \"gpt-5.2-codex\",\n name: \"GPT-5.2 Codex\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Frontier agentic coding model\",\n },\n \"gpt-5.1-codex-max\": {\n id: \"gpt-5.1-codex-max\",\n name: \"GPT-5.1 Codex Max\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 100_000,\n inputPricePerMToken: 10,\n outputPricePerMToken: 40,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Codex-optimized flagship for deep and fast reasoning\",\n },\n \"gpt-5.2\": {\n id: \"gpt-5.2\",\n name: \"GPT-5.2\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 32_000,\n inputPricePerMToken: 2.5,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"coding\", \"review\", \"bugfix\"],\n description: \"Latest frontier model with improvements across knowledge, reasoning and coding\",\n },\n \"gpt-5.1-codex-mini\": {\n id: \"gpt-5.1-codex-mini\",\n name: \"GPT-5.1 Codex Mini\",\n provider: \"openai\",\n contextWindow: 256_000,\n maxOutputTokens: 16_384,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\n description: \"Optimized for codex. Cheaper, faster, but less capable\",\n },\n\n // ── Google / Gemini ────────────────────────────────────────────────────\n \"gemini-3-pro-preview\": {\n id: \"gemini-3-pro-preview\",\n name: \"Gemini 3 Pro Preview\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 1.25,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Next-gen Gemini Pro preview\",\n },\n \"gemini-3-flash-preview\": {\n id: \"gemini-3-flash-preview\",\n name: \"Gemini 3 Flash Preview\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"testing\", \"documentation\"],\n description: \"Next-gen Gemini Flash preview\",\n },\n \"gemini-2.5-pro\": {\n id: \"gemini-2.5-pro\",\n name: \"Gemini 2.5 Pro\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 1.25,\n outputPricePerMToken: 10,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"planning\", \"review\", \"coding\"],\n description: \"Gemini 2.5 Pro stable\",\n },\n \"gemini-2.5-flash\": {\n id: \"gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash\",\n provider: \"google\",\n contextWindow: 2_000_000,\n maxOutputTokens: 65_536,\n inputPricePerMToken: 0.15,\n outputPricePerMToken: 0.6,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\", \"coding\"],\n description: \"Gemini 2.5 Flash stable\",\n },\n \"gemini-2.5-flash-lite\": {\n id: \"gemini-2.5-flash-lite\",\n name: \"Gemini 2.5 Flash Lite\",\n provider: \"google\",\n contextWindow: 1_000_000,\n maxOutputTokens: 32_768,\n inputPricePerMToken: 0.075,\n outputPricePerMToken: 0.3,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"testing\", \"documentation\"],\n description: \"Gemini 2.5 Flash Lite\",\n },\n\n // ── Moonshot / Kimi ────────────────────────────────────────────────────\n \"kimi-for-coding\": {\n id: \"kimi-for-coding\",\n name: \"Kimi Code\",\n provider: \"kimi\",\n contextWindow: 128_000,\n maxOutputTokens: 8_192,\n inputPricePerMToken: 0.5,\n outputPricePerMToken: 2,\n supportsStreaming: true,\n supportsToolCalling: true,\n supportedRoles: [\"coding\", \"bugfix\"],\n description: \"Kimi for coding\",\n },\n};\n\n// ── Ordered Model Lists Per Provider (for /model selection UI) ───────────\n\nexport const PROVIDER_MODEL_ORDER: Readonly<Record<string, readonly IModelDisplayEntry[]>> = {\n anthropic: [\n { id: \"claude-opus-4-6\", label: \"Default (recommended)\", description: \"Opus 4.6 · Most capable for complex work\", isDefault: true },\n { id: \"claude-opus-4-6-1m\", label: \"Opus (1M context)\", description: \"Opus 4.6 with 1M context · Billed as extra usage · $10/$37.50 per Mtok\" },\n { id: \"claude-sonnet-4-6\", label: \"Sonnet\", description: \"Sonnet 4.6 · Best for everyday tasks\" },\n { id: \"claude-sonnet-4-6-1m\", label: \"Sonnet (1M context)\", description: \"Sonnet 4.6 with 1M context · Billed as extra usage · $6/$22.50 per Mtok\" },\n { id: \"claude-haiku-4-5\", label: \"Haiku\", description: \"Haiku 4.5 · Fastest for quick answers\" },\n ],\n openai: [\n { id: \"gpt-5.3-codex\", label: \"gpt-5.3-codex\", description: \"Latest frontier agentic coding model\", isDefault: true },\n { id: \"gpt-5.3-codex-spark\", label: \"gpt-5.3-codex-spark\", description: \"Ultra-fast coding model\" },\n { id: \"gpt-5.2-codex\", label: \"gpt-5.2-codex\", description: \"Frontier agentic coding model\" },\n { id: \"gpt-5.1-codex-max\", label: \"gpt-5.1-codex-max\", description: \"Codex-optimized flagship for deep and fast reasoning\" },\n { id: \"gpt-5.2\", label: \"gpt-5.2\", description: \"Latest frontier model with improvements across knowledge, reasoning and coding\" },\n { id: \"gpt-5.1-codex-mini\", label: \"gpt-5.1-codex-mini\", description: \"Optimized for codex. Cheaper, faster, but less capable\" },\n ],\n google: [\n { id: \"gemini-3-pro-preview\", label: \"gemini-3-pro-preview\", description: \"Next-gen Gemini Pro preview\", isDefault: true },\n { id: \"gemini-3-flash-preview\", label: \"gemini-3-flash-preview\", description: \"Next-gen Gemini Flash preview\" },\n { id: \"gemini-2.5-pro\", label: \"gemini-2.5-pro\", description: \"Gemini 2.5 Pro stable\" },\n { id: \"gemini-2.5-flash\", label: \"gemini-2.5-flash\", description: \"Gemini 2.5 Flash stable\" },\n { id: \"gemini-2.5-flash-lite\", label: \"gemini-2.5-flash-lite\", description: \"Gemini 2.5 Flash Lite\" },\n ],\n kimi: [\n { id: \"kimi-for-coding\", label: \"kimi-for-coding (Kimi Code)\", description: \"Kimi for coding\", isDefault: true },\n ],\n};\n\nexport const DEFAULT_MODEL_ID = \"claude-sonnet-4-6\";\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CredentialStore } from './chunk-
|
|
2
|
-
import { logger } from './chunk-
|
|
1
|
+
import { CredentialStore } from './chunk-SNWPI6XJ.js';
|
|
2
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
3
3
|
|
|
4
4
|
// src/auth/api-key-fallback.ts
|
|
5
5
|
var ENV_KEY_MAP = {
|
|
@@ -115,5 +115,5 @@ var ApiKeyFallback = class {
|
|
|
115
115
|
};
|
|
116
116
|
|
|
117
117
|
export { ApiKeyFallback, getEnvKeyName, resolveProviderName };
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
119
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-HESQLCLU.js.map
|
|
119
|
+
//# sourceMappingURL=chunk-HESQLCLU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/api-key-fallback.ts"],"names":[],"mappings":"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","file":"chunk-HESQLCLU.js","sourcesContent":["/**\n * API Key Fallback — store/retrieve/validate API keys per provider\n * Per PRD section 13.5 — optional fallback for CI/headless environments\n */\n\nimport type { ProviderName, ICredential } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { logger } from \"../utils/index.js\";\n\n// ── Environment Variable Mapping ─────────────────────────────────────────\n\nconst ENV_KEY_MAP: Readonly<Record<ProviderName, string | undefined>> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: undefined,\n} as const;\n\n// ── CLI-Friendly Provider Names ──────────────────────────────────────────\n\nconst CLI_PROVIDER_MAP: Readonly<Record<string, ProviderName>> = {\n claude: \"anthropic\",\n anthropic: \"anthropic\",\n openai: \"openai\",\n codex: \"openai\",\n google: \"google\",\n gemini: \"google\",\n kimi: \"kimi\",\n moonshot: \"kimi\",\n} as const;\n\n// ── API Key Validation Patterns ──────────────────────────────────────────\n\nconst KEY_PATTERNS: Readonly<Record<ProviderName, RegExp | undefined>> = {\n anthropic: /^sk-ant-api\\d{2}-[A-Za-z0-9_-]{20,}$/,\n openai: /^sk-[A-Za-z0-9_-]{20,}$/,\n google: /^AIza[A-Za-z0-9_-]{30,}$/,\n kimi: /^sk-[A-Za-z0-9_-]{20,}$/,\n ollama: undefined,\n} as const;\n\nconst API_KEY_CREDENTIAL_PREFIX = \"apikey:\";\n\n// ── Public Helpers ───────────────────────────────────────────────────────\n\nexport function resolveProviderName(alias: string): ProviderName | undefined {\n const normalized = alias.toLowerCase().trim();\n return CLI_PROVIDER_MAP[normalized];\n}\n\nexport function getEnvKeyName(provider: ProviderName): string | undefined {\n return ENV_KEY_MAP[provider];\n}\n\n// ── ApiKeyFallback Class ─────────────────────────────────────────────────\n\nexport class ApiKeyFallback {\n private readonly store: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.store = store ?? new CredentialStore();\n }\n\n /**\n * Validate an API key format for a given provider.\n */\n validateKeyFormat(provider: ProviderName, key: string): boolean {\n const pattern = KEY_PATTERNS[provider];\n if (pattern === undefined) {\n return key.length > 0;\n }\n return pattern.test(key);\n }\n\n /**\n * Store an API key for a provider via the credential store.\n */\n async setKey(provider: ProviderName, key: string): Promise<void> {\n if (!this.validateKeyFormat(provider, key)) {\n logger.warn({ provider }, \"API key format does not match expected pattern — storing anyway\");\n }\n\n const credential: ICredential = {\n provider,\n method: \"api_key\",\n token: `${API_KEY_CREDENTIAL_PREFIX}${key}`,\n };\n\n await this.store.set(provider, credential);\n logger.info({ provider }, \"API key stored\");\n }\n\n /**\n * Retrieve a stored API key credential for a provider.\n * Only returns credentials stored via setKey (not native login tokens).\n */\n async getCredential(provider: ProviderName): Promise<ICredential | undefined> {\n const stored = await this.store.get(provider);\n if (stored === undefined) return undefined;\n\n if (stored.method !== \"api_key\") return undefined;\n\n // Strip the internal prefix\n if (stored.token?.startsWith(API_KEY_CREDENTIAL_PREFIX)) {\n return {\n ...stored,\n token: stored.token.slice(API_KEY_CREDENTIAL_PREFIX.length),\n };\n }\n\n return stored;\n }\n\n /**\n * Get an API key from environment variables.\n */\n getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envKey = ENV_KEY_MAP[provider];\n if (envKey === undefined) return undefined;\n\n const value = process.env[envKey];\n if (value === undefined || value.length === 0) return undefined;\n\n return {\n provider,\n method: \"env_variable\",\n token: value,\n };\n }\n\n /**\n * Delete a stored API key for a provider.\n */\n async deleteKey(provider: ProviderName): Promise<void> {\n const stored = await this.store.get(provider);\n if (stored !== undefined && stored.method === \"api_key\") {\n await this.store.delete(provider);\n logger.info({ provider }, \"API key deleted\");\n }\n }\n\n /**\n * Check if an API key is available (stored or env) for a provider.\n */\n async hasKey(provider: ProviderName): Promise<boolean> {\n const stored = await this.getCredential(provider);\n if (stored !== undefined) return true;\n return this.getFromEnvironment(provider) !== undefined;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAUA,IAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAQ,EAAG,eAAe,MAAM,CAAA;AAErD,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,YAAA,EAAa;AAEb,IAAM,SAAS,IAAA,CAAK;AAAA,EAClB,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,sBAAsB,CAAA,IAAK,OAAA;AAAA,EAC9C,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,GAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,aAAA,GAC5B;AAAA,IACE,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,EAAE,WAAA,EAAa,IAAA,CAAK,SAAS,gBAAgB,CAAA,EAAG,OAAO,IAAA;AAAK;AACvE,MAEF,EAAC;AAAA,EACL,SAAA,EAAW,KAAK,gBAAA,CAAiB;AACnC,CAAC","file":"chunk-IR5HLBMH.js","sourcesContent":["/**\n * Structured logging via pino per PRD section 16.1\n * Automatic credential redaction per PRD section 14.1\n */\n\nimport pino from \"pino\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\n\nconst LOG_DIR = join(homedir(), \".aemeathcli\", \"logs\");\n\nfunction ensureLogDir(): void {\n try {\n mkdirSync(LOG_DIR, { recursive: true, mode: 0o700 });\n } catch {\n // Log dir creation failed — fall back to stderr only\n }\n}\n\n// Redaction patterns for credentials (PRD section 14.2 REQ-CRED-04)\nconst REDACT_PATHS = [\n \"token\",\n \"refreshToken\",\n \"apiKey\",\n \"accessToken\",\n \"sessionToken\",\n \"password\",\n \"secret\",\n \"authorization\",\n \"cookie\",\n \"*.token\",\n \"*.refreshToken\",\n \"*.apiKey\",\n \"*.accessToken\",\n \"*.sessionToken\",\n \"*.password\",\n \"*.secret\",\n];\n\nensureLogDir();\n\nconst logger = pino({\n name: \"aemeathcli\",\n level: process.env[\"AEMEATHCLI_LOG_LEVEL\"] ?? \"error\",\n redact: {\n paths: REDACT_PATHS,\n censor: \"[REDACTED]\",\n },\n ...(process.env[\"NODE_ENV\"] === \"development\"\n ? {\n transport: {\n target: \"pino/file\",\n options: { destination: join(LOG_DIR, \"aemeathcli.log\"), mkdir: true },\n },\n }\n : {}),\n timestamp: pino.stdTimeFunctions.isoTime,\n});\n\nexport { logger };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ServerConnectionError, ToolCallError } from './chunk-
|
|
2
|
-
import { logger } from './chunk-
|
|
1
|
+
import { ServerConnectionError, ToolCallError } from './chunk-ZGOHARPV.js';
|
|
2
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
3
3
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
4
4
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
5
5
|
|
|
@@ -404,5 +404,5 @@ var MCPServerManager = class {
|
|
|
404
404
|
};
|
|
405
405
|
|
|
406
406
|
export { MCPClient, MCPServerManager };
|
|
407
|
-
//# sourceMappingURL=chunk-
|
|
408
|
-
//# sourceMappingURL=chunk-
|
|
407
|
+
//# sourceMappingURL=chunk-K2FCMRXH.js.map
|
|
408
|
+
//# sourceMappingURL=chunk-K2FCMRXH.js.map
|