aemeathcli 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +620 -609
- package/dist/{App-YAHJUWCX.js → App-JQ622M66.js} +209 -52
- package/dist/App-JQ622M66.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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skills/executor.ts"],"names":[],"mappings":"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","file":"chunk-QCRK4QEL.js","sourcesContent":["/**\r\n * SkillExecutor — Manages skill activation, context injection, and tool restriction.\r\n * Per PRD section 10.3: Load full SKILL.md content into context on activation,\r\n * restrict tools, and unload on deactivation.\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { ISkillDefinition } from \"../types/config.js\";\r\nimport type { ModelRole } from \"../types/model.js\";\r\nimport type { SkillRegistry } from \"./registry.js\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\nexport interface IActiveSkill {\r\n readonly definition: ISkillDefinition;\r\n readonly activatedAt: Date;\r\n readonly previousAllowedTools: readonly string[] | null;\r\n}\r\n\r\nexport interface ISkillActivationResult {\r\n readonly success: boolean;\r\n readonly skill?: ISkillDefinition;\r\n readonly errorMessage?: string;\r\n readonly warnings?: readonly string[];\r\n}\r\n\r\nexport interface IModelCapabilities {\r\n readonly contextWindow: number;\r\n readonly currentRole?: ModelRole;\r\n}\r\n\r\n// ── SkillExecutor Class ─────────────────────────────────────────────────\r\n\r\nexport class SkillExecutor {\r\n private readonly registry: SkillRegistry;\r\n private activeSkill: IActiveSkill | null = null;\r\n private baseAllowedTools: readonly string[] | null = null;\r\n\r\n constructor(registry: SkillRegistry) {\r\n this.registry = registry;\r\n }\r\n\r\n /**\r\n * Activate a skill by name.\r\n */\r\n async activateByName(\r\n name: string,\r\n modelCapabilities?: IModelCapabilities,\r\n ): Promise<ISkillActivationResult> {\r\n const definition = await this.registry.getByName(name);\r\n if (!definition) {\r\n return { success: false, errorMessage: `Skill \"${name}\" not found` };\r\n }\r\n\r\n return this.activate(definition, modelCapabilities);\r\n }\r\n\r\n /**\r\n * Activate a skill by trigger string (e.g. \"$review\" or \"review\").\r\n */\r\n async activateByTrigger(\r\n trigger: string,\r\n modelCapabilities?: IModelCapabilities,\r\n ): Promise<ISkillActivationResult> {\r\n const definition = await this.registry.getByTrigger(trigger);\r\n if (!definition) {\r\n return {\r\n success: false,\r\n errorMessage: `No skill found for trigger \"${trigger}\"`,\r\n };\r\n }\r\n\r\n return this.activate(definition, modelCapabilities);\r\n }\r\n\r\n /**\r\n * Deactivate the currently active skill, restoring previous tool set.\r\n */\r\n deactivate(): void {\r\n if (!this.activeSkill) {\r\n logger.debug(\"No active skill to deactivate\");\r\n return;\r\n }\r\n\r\n const skillName = this.activeSkill.definition.frontmatter.name;\r\n this.baseAllowedTools = this.activeSkill.previousAllowedTools;\r\n this.activeSkill = null;\r\n\r\n logger.info({ skill: skillName }, \"Skill deactivated\");\r\n }\r\n\r\n /**\r\n * Get the currently active skill, or null if none.\r\n */\r\n getActiveSkill(): IActiveSkill | null {\r\n return this.activeSkill;\r\n }\r\n\r\n /**\r\n * Check if any skill is currently active.\r\n */\r\n isActive(): boolean {\r\n return this.activeSkill !== null;\r\n }\r\n\r\n /**\r\n * Get the active skill's body content for context injection.\r\n * Returns null if no skill is active.\r\n */\r\n getActiveSkillContent(): string | null {\r\n return this.activeSkill?.definition.body ?? null;\r\n }\r\n\r\n /**\r\n * Get the name of the currently active skill, or null.\r\n */\r\n getActiveSkillName(): string | null {\r\n return this.activeSkill?.definition.frontmatter.name ?? null;\r\n }\r\n\r\n /**\r\n * Get the allowed tool list under the current state.\r\n * When a skill is active with allowed-tools, only those tools are permitted.\r\n * Returns null when no restrictions are in effect.\r\n */\r\n getAllowedTools(): readonly string[] | null {\r\n if (this.activeSkill) {\r\n return this.activeSkill.definition.frontmatter[\"allowed-tools\"] ?? null;\r\n }\r\n return this.baseAllowedTools;\r\n }\r\n\r\n /**\r\n * Check if a specific tool is allowed under the current skill restrictions.\r\n */\r\n isToolAllowed(toolName: string): boolean {\r\n const allowed = this.getAllowedTools();\r\n if (!allowed) return true;\r\n return allowed.includes(toolName);\r\n }\r\n\r\n /**\r\n * Set the base allowed tools (used when no skill is active).\r\n */\r\n setBaseAllowedTools(tools: readonly string[] | null): void {\r\n this.baseAllowedTools = tools;\r\n }\r\n\r\n /**\r\n * Validate model requirements for a skill definition.\r\n * Returns compatibility status and any warnings.\r\n */\r\n checkModelRequirements(\r\n definition: ISkillDefinition,\r\n capabilities: IModelCapabilities,\r\n ): { compatible: boolean; warnings: readonly string[] } {\r\n const warnings: string[] = [];\r\n const requirements = definition.frontmatter[\"model-requirements\"];\r\n\r\n if (!requirements) {\r\n return { compatible: true, warnings: [] };\r\n }\r\n\r\n const preferredRole = requirements[\"preferred-role\"];\r\n if (preferredRole && capabilities.currentRole) {\r\n if (capabilities.currentRole !== preferredRole) {\r\n warnings.push(\r\n `Skill \"${definition.frontmatter.name}\" prefers role \"${preferredRole}\", ` +\r\n `current role is \"${capabilities.currentRole}\"`,\r\n );\r\n }\r\n }\r\n\r\n const minContext = requirements[\"min-context\"];\r\n if (minContext !== undefined) {\r\n if (capabilities.contextWindow < minContext) {\r\n warnings.push(\r\n `Skill \"${definition.frontmatter.name}\" requires ${minContext} context tokens, ` +\r\n `but current model has ${capabilities.contextWindow}`,\r\n );\r\n return { compatible: false, warnings };\r\n }\r\n }\r\n\r\n return { compatible: true, warnings };\r\n }\r\n\r\n // ── Private ───────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Core activation logic. Deactivates any current skill first.\r\n */\r\n private activate(\r\n definition: ISkillDefinition,\r\n modelCapabilities?: IModelCapabilities,\r\n ): ISkillActivationResult {\r\n const allWarnings: string[] = [];\r\n\r\n // Validate model requirements if capabilities are provided\r\n if (modelCapabilities) {\r\n const { compatible, warnings } = this.checkModelRequirements(\r\n definition,\r\n modelCapabilities,\r\n );\r\n allWarnings.push(...warnings);\r\n\r\n for (const warning of warnings) {\r\n logger.warn({ skill: definition.frontmatter.name }, warning);\r\n }\r\n\r\n if (!compatible) {\r\n return {\r\n success: false,\r\n skill: definition,\r\n errorMessage: `Model does not meet skill requirements: ${warnings.join(\"; \")}`,\r\n warnings: allWarnings,\r\n };\r\n }\r\n }\r\n\r\n // Deactivate current skill if one is active\r\n if (this.activeSkill) {\r\n logger.info(\r\n {\r\n current: this.activeSkill.definition.frontmatter.name,\r\n next: definition.frontmatter.name,\r\n },\r\n \"Switching active skill\",\r\n );\r\n this.deactivate();\r\n }\r\n\r\n this.activeSkill = {\r\n definition,\r\n activatedAt: new Date(),\r\n previousAllowedTools: this.baseAllowedTools,\r\n };\r\n\r\n logger.info(\r\n {\r\n skill: definition.frontmatter.name,\r\n version: definition.frontmatter.version,\r\n allowedTools: definition.frontmatter[\"allowed-tools\"],\r\n },\r\n \"Skill activated\",\r\n );\r\n\r\n return {\r\n success: true,\r\n skill: definition,\r\n ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/event-bus.ts"],"names":[],"mappings":";AAwCO,IAAM,WAAN,MAAe;AAAA,EACH,SAAA,uBAAgB,GAAA,EAA+B;AAAA,EAEhE,EAAA,CAAwB,OAAU,OAAA,EAAiD;AACjF,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,wBAAS,GAAA,EAAI;AACtD,IAAA,QAAA,CAAS,IAAI,OAAuB,CAAA;AACpC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAGlC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,OAAO,OAAuB,CAAA;AACvC,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,IAAA,CAA0B,OAAU,OAAA,EAAiD;AACnF,IAAA,MAAM,cAAA,GAA6C,CAAC,IAAA,KAAS;AAC3D,MAAA,WAAA,EAAY;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACjD,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAA0B,OAAU,IAAA,EAA0B;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAC,QAAuC,IAAI,CAAA;AAAA,MAC9C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAyB;AAC1C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,cAAc,KAAA,EAA0B;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,IAAA,IAAQ,CAAA;AAAA,EAC5C;AACF,CAAA;AAGA,IAAI,cAAA;AAEG,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAiB,IAAI,QAAA,EAAS;AAAA,EAChC;AACA,EAAA,OAAO,cAAA;AACT","file":"chunk-ROJPFPJ7.js","sourcesContent":["/**\r\n * Typed event emitter per PRD section 6.1\r\n * Core IPC backbone for the orchestration layer.\r\n */\r\n\r\ntype EventHandler<T = unknown> = (data: T) => void;\r\n\r\ninterface IEventMap {\r\n \"model:request\": { model: string; role?: string };\r\n \"model:response\": { model: string; tokens: number; cost: number };\r\n \"model:stream:chunk\": { model: string; content: string };\r\n \"model:stream:done\": { model: string; totalTokens: number };\r\n \"model:error\": { model: string; error: Error };\r\n \"tool:call\": { name: string; args: Record<string, unknown> };\r\n \"tool:result\": { name: string; isError: boolean; content: string };\r\n \"team:created\": { teamName: string; agentCount: number };\r\n \"team:deleted\": { teamName: string };\r\n \"agent:spawned\": { agentName: string; model: string };\r\n \"agent:status\": { agentName: string; status: string };\r\n \"agent:message\": { from: string; to: string; content: string };\r\n \"task:created\": { taskId: string; subject: string };\r\n \"task:updated\": { taskId: string; status: string };\r\n \"task:completed\": { taskId: string };\r\n \"cost:updated\": { total: number; provider: string; delta: number };\r\n \"cost:warning\": { current: number; limit: number };\r\n \"cost:exceeded\": { current: number; limit: number };\r\n \"pane:created\": { paneId: string; agentName: string };\r\n \"pane:closed\": { paneId: string };\r\n \"skill:activated\": { skillName: string };\r\n \"skill:deactivated\": { skillName: string };\r\n \"mcp:server:started\": { serverName: string };\r\n \"mcp:server:stopped\": { serverName: string };\r\n \"mcp:server:error\": { serverName: string; error: string };\r\n \"config:changed\": { key: string };\r\n \"auth:login\": { provider: string; email?: string };\r\n \"auth:logout\": { provider: string };\r\n}\r\n\r\ntype EventName = keyof IEventMap;\r\n\r\nexport class EventBus {\r\n private readonly listeners = new Map<string, Set<EventHandler>>();\r\n\r\n on<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\r\n const handlers = this.listeners.get(event) ?? new Set();\r\n handlers.add(handler as EventHandler);\r\n this.listeners.set(event, handlers);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n handlers.delete(handler as EventHandler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(event);\r\n }\r\n };\r\n }\r\n\r\n once<K extends EventName>(event: K, handler: EventHandler<IEventMap[K]>): () => void {\r\n const wrappedHandler: EventHandler<IEventMap[K]> = (data) => {\r\n unsubscribe();\r\n handler(data);\r\n };\r\n const unsubscribe = this.on(event, wrappedHandler);\r\n return unsubscribe;\r\n }\r\n\r\n emit<K extends EventName>(event: K, data: IEventMap[K]): void {\r\n const handlers = this.listeners.get(event);\r\n if (!handlers) {\r\n return;\r\n }\r\n for (const handler of handlers) {\r\n try {\r\n (handler as EventHandler<IEventMap[K]>)(data);\r\n } catch {\r\n // Event handlers should not throw; silently catch to avoid cascading\r\n }\r\n }\r\n }\r\n\r\n removeAllListeners(event?: EventName): void {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n }\r\n\r\n listenerCount(event: EventName): number {\r\n return this.listeners.get(event)?.size ?? 0;\r\n }\r\n}\r\n\r\n// Singleton event bus for the application\r\nlet globalEventBus: EventBus | undefined;\r\n\r\nexport function getEventBus(): EventBus {\r\n if (!globalEventBus) {\r\n globalEventBus = new EventBus();\r\n }\r\n return globalEventBus;\r\n}\r\n\r\nexport type { IEventMap, EventName };\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orchestrator/utils/provider-catalog.ts"],"names":[],"mappings":";AAgBO,IAAM,oBAAA,GAAmF;AAAA,EAC9F,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa,4BAAA;AAAA,IACb,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,OAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,WAAA,EAAa,yBAAA;AAAA,IACb,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,YAAA;AAAA,IACP,WAAA,EAAa,yBAAA;AAAA,IACb,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,2BAAA;AAAA,IACb,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,WAAA,EAAa,qBAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,YAAA,EAAc,CAAC,KAAA,KAAmB,CAAA,WAAA,EAAc,SAAS,QAAQ,CAAA;AAAA;AAErE,CAAA;AAEO,IAAM,kBAAA,GAAiD;AAAA,EAC5D,aAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAEO,SAAS,oBAAoB,QAAA,EAAoD;AACtF,EAAA,OAAO,qBAAqB,QAAQ,CAAA;AACtC;AAMO,SAAS,+BAA+B,QAAA,EAAqD;AAClG,EAAA,OAAO,kBAAA,CAAmB,IAAA;AAAA,IACxB,CAAC,WAAA,KAAgB,oBAAA,CAAqB,WAAW,EAAE,QAAA,KAAa;AAAA,GAClE;AACF","file":"chunk-RP2TAL3J.js","sourcesContent":["import type { ProviderName } from \"../../types/model.js\";\r\nimport type { CliProviderType } from \"../constants.js\";\r\n\r\nexport type LoginProvider = \"claude\" | \"codex\" | \"gemini\" | \"kimi\";\r\n\r\nexport interface CliProviderCatalogEntry {\r\n readonly type: CliProviderType;\r\n readonly provider: ProviderName;\r\n readonly binary: string;\r\n readonly label: string;\r\n readonly description: string;\r\n readonly loginProvider?: LoginProvider | undefined;\r\n readonly localOnly: boolean;\r\n readonly startCommand: (model?: string) => string;\r\n}\r\n\r\nexport const CLI_PROVIDER_CATALOG: Readonly<Record<CliProviderType, CliProviderCatalogEntry>> = {\r\n \"claude-code\": {\r\n type: \"claude-code\",\r\n provider: \"anthropic\",\r\n binary: \"claude\",\r\n label: \"Claude Code\",\r\n description: \"Anthropic native CLI agent\",\r\n loginProvider: \"claude\",\r\n localOnly: false,\r\n startCommand: () => \"claude --dangerously-skip-permissions\",\r\n },\r\n codex: {\r\n type: \"codex\",\r\n provider: \"openai\",\r\n binary: \"codex\",\r\n label: \"Codex\",\r\n description: \"OpenAI native CLI agent\",\r\n loginProvider: \"codex\",\r\n localOnly: false,\r\n startCommand: () => \"codex --full-auto\",\r\n },\r\n \"gemini-cli\": {\r\n type: \"gemini-cli\",\r\n provider: \"google\",\r\n binary: \"gemini\",\r\n label: \"Gemini CLI\",\r\n description: \"Google native CLI agent\",\r\n loginProvider: \"gemini\",\r\n localOnly: false,\r\n startCommand: () => \"gemini\",\r\n },\r\n \"kimi-cli\": {\r\n type: \"kimi-cli\",\r\n provider: \"kimi\",\r\n binary: \"kimi\",\r\n label: \"Kimi CLI\",\r\n description: \"Moonshot native CLI agent\",\r\n loginProvider: \"kimi\",\r\n localOnly: false,\r\n startCommand: () => \"kimi\",\r\n },\r\n ollama: {\r\n type: \"ollama\",\r\n provider: \"ollama\",\r\n binary: \"ollama\",\r\n label: \"Ollama\",\r\n description: \"Local agent runtime\",\r\n localOnly: true,\r\n startCommand: (model?: string) => `ollama run ${model ?? \"llama3\"}`,\r\n },\r\n};\r\n\r\nexport const CLI_PROVIDER_ORDER: readonly CliProviderType[] = [\r\n \"claude-code\",\r\n \"codex\",\r\n \"gemini-cli\",\r\n \"kimi-cli\",\r\n \"ollama\",\r\n] as const;\r\n\r\nexport function getCliProviderEntry(provider: CliProviderType): CliProviderCatalogEntry {\r\n return CLI_PROVIDER_CATALOG[provider];\r\n}\r\n\r\nexport function getCliProviderLabel(provider: CliProviderType): string {\r\n return getCliProviderEntry(provider).label;\r\n}\r\n\r\nexport function getCliProviderForModelProvider(provider: ProviderName): CliProviderType | undefined {\r\n return CLI_PROVIDER_ORDER.find(\r\n (cliProvider) => CLI_PROVIDER_CATALOG[cliProvider].provider === provider,\r\n );\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/native-cli-adapters.ts"],"names":[],"mappings":"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","file":"chunk-RYOB3TLZ.js","sourcesContent":["/**\r\n * Native CLI-backed provider adapters.\r\n * Uses official provider CLIs in non-interactive mode when credentials come from native login.\r\n */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { execa } from \"execa\";\r\nimport {\r\n AuthenticationError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport { getModelInfo as getDynamicModelInfo } from \"./model-discovery.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatMessage,\r\n IChatRequest,\r\n IChatResponse,\r\n IStreamChunk,\r\n ITokenUsage,\r\n} from \"../types/message.js\";\r\nimport type { IModelProvider } from \"./types.js\";\r\n\r\ninterface ICLIResult {\r\n readonly text: string;\r\n readonly inputTokens?: number | undefined;\r\n readonly outputTokens?: number | undefined;\r\n readonly finishReason?: IChatResponse[\"finishReason\"] | undefined;\r\n}\r\n\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\n/**\r\n * Resolve CLI timeout from environment. Default is 0 (no timeout) so that\r\n * long-running agent tasks are never prematurely killed.\r\n * Set AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS to a positive integer to enforce a limit.\r\n */\r\nfunction resolveCliTimeoutMs(): number {\r\n const raw = process.env[\"AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS\"];\r\n if (raw === undefined) {\r\n return 0;\r\n }\r\n\r\n const parsed = Number.parseInt(raw, 10);\r\n if (!Number.isFinite(parsed) || parsed <= 0) {\r\n return 0;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nconst CLI_TIMEOUT_MS = resolveCliTimeoutMs();\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction asNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction toJsonLines(output: string): unknown[] {\r\n const lines = output\r\n .split(/\\r?\\n/u)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0 && line.startsWith(\"{\"));\r\n\r\n const parsed: unknown[] = [];\r\n for (const line of lines) {\r\n try {\r\n parsed.push(JSON.parse(line) as unknown);\r\n } catch {\r\n // Ignore non-JSON lines\r\n }\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction buildPrompt(request: IChatRequest): string {\r\n // Extract only the user message text — system prompt is passed separately\r\n // via the provider's native --system-prompt flag.\r\n const latestUser = [...request.messages]\r\n .reverse()\r\n .find((message) => message.role === \"user\");\r\n const fallbackLast = request.messages.length > 0\r\n ? request.messages[request.messages.length - 1]\r\n : undefined;\r\n\r\n return latestUser?.content ?? fallbackLast?.content ?? \"\";\r\n}\r\n\r\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\r\n return (\r\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\r\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\r\n );\r\n}\r\n\r\nfunction classifyCliError(provider: ProviderName, error: unknown): Error {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (\r\n lower.includes(\"login\")\r\n || lower.includes(\"credential\")\r\n || lower.includes(\"authentication\")\r\n || lower.includes(\"unauthorized\")\r\n || lower.includes(\"forbidden\")\r\n || lower.includes(\"api key\")\r\n || lower.includes(\"token\")\r\n ) {\r\n return new AuthenticationError(provider, message);\r\n }\r\n\r\n return error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nabstract class BaseNativeCLIAdapter implements IModelProvider {\r\n abstract readonly name: ProviderName;\r\n abstract readonly supportedModels: readonly string[];\r\n readonly supportsToolCalling = false;\r\n\r\n protected abstract runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const prompt = buildPrompt(request);\r\n\r\n try {\r\n const result = await this.runCLI(request.model, prompt, request.system);\r\n\r\n const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);\r\n const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);\r\n\r\n const usage: ITokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\r\n };\r\n\r\n const responseMessage: IChatMessage = {\r\n id: randomUUID(),\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: this.name,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: randomUUID(),\r\n model: request.model,\r\n provider: this.name,\r\n message: responseMessage,\r\n usage,\r\n finishReason: result.finishReason ?? \"stop\",\r\n };\r\n } catch (error: unknown) {\r\n throw classifyCliError(this.name, error);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n try {\r\n const response = await this.chat(request);\r\n if (response.message.content.length > 0) {\r\n yield { type: \"text\", content: response.message.content };\r\n }\r\n yield { type: \"usage\", usage: response.usage };\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n // Execa errors can include raw stdout/stderr in the message.\r\n // Truncate to prevent raw CLI protocol output from leaking through.\r\n const rawMsg = error instanceof Error ? error.message : String(error);\r\n const truncated = rawMsg.length > 500 ? rawMsg.slice(0, 500) + \"...\" : rawMsg;\r\n yield { type: \"error\", error: truncated };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n // Check hardcoded registry first, then dynamic discovery\r\n const info = SUPPORTED_MODELS[model] ?? getDynamicModelInfo(model);\r\n if (info === undefined || info.provider !== this.name) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n listAvailableModels(): Promise<readonly string[]> {\r\n return Promise.resolve([...this.supportedModels]);\r\n }\r\n}\r\n\r\nexport class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"anthropic\";\r\n readonly supportedModels = [\r\n \"claude-opus-4-6\",\r\n \"claude-opus-4-6-1m\",\r\n \"claude-sonnet-4-6\",\r\n \"claude-sonnet-4-6-1m\",\r\n \"claude-haiku-4-5\",\r\n ] as const;\r\n\r\n /** Map internal model IDs to valid Claude CLI model IDs. */\r\n private toCLIModelId(model: string): string {\r\n // The Claude CLI doesn't recognize the \"-1m\" context suffix.\r\n // Strip it — the API handles context window sizing automatically.\r\n return model.replace(/-1m$/, \"\");\r\n }\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n const cliModel = this.toCLIModelId(model);\r\n const args = [\r\n \"-p\",\r\n \"--output-format\", \"json\",\r\n \"--model\", cliModel,\r\n // Skip project CLAUDE.md to avoid loading huge project instructions\r\n // that make Claude think it's Claude Code doing a codebase audit\r\n \"--setting-sources\", \"user\",\r\n ];\r\n\r\n if (systemPrompt && systemPrompt.length > 0) {\r\n args.push(\"--system-prompt\", systemPrompt);\r\n }\r\n\r\n args.push(prompt);\r\n\r\n const { stdout } = await execa(\r\n \"claude\",\r\n args,\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n const lastJson = lines.length > 0 ? lines[lines.length - 1] : undefined;\r\n\r\n if (!isRecord(lastJson)) {\r\n throw new Error(\"Claude CLI returned no JSON result\");\r\n }\r\n\r\n const text = asString(lastJson[\"result\"]) ?? \"\";\r\n const usage = isRecord(lastJson[\"usage\"]) ? lastJson[\"usage\"] : undefined;\r\n const inputTokens = usage ? asNumber(usage[\"input_tokens\"]) : undefined;\r\n const outputTokens = usage ? asNumber(usage[\"output_tokens\"]) : undefined;\r\n\r\n return {\r\n text,\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"openai\";\r\n readonly supportedModels = [\r\n \"gpt-5.3-codex\",\r\n \"gpt-5.3-codex-spark\",\r\n \"gpt-5.2-codex\",\r\n \"gpt-5.1-codex-max\",\r\n \"gpt-5.2\",\r\n \"gpt-5.1-codex-mini\",\r\n ] as const;\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n // Allow agent panes to set a writable sandbox so codex can write to the\r\n // shared board directory. Default to \"read-only\" for normal usage.\r\n const sandbox = process.env[\"AEMEATHCLI_CODEX_SANDBOX\"] ?? \"read-only\";\r\n // Prepend system prompt for Codex (no native --system-prompt flag)\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"codex\",\r\n [\r\n \"exec\",\r\n \"--skip-git-repo-check\",\r\n ...(sandbox !== \"none\" ? [\"--sandbox\", sandbox] : []),\r\n \"--json\",\r\n \"--model\",\r\n model,\r\n fullPrompt,\r\n ],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n const textParts: string[] = [];\r\n let inputTokens: number | undefined;\r\n let outputTokens: number | undefined;\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n const type = asString(line[\"type\"]);\r\n\r\n if (type === \"item.completed\") {\r\n const item = isRecord(line[\"item\"]) ? line[\"item\"] : undefined;\r\n if (item && asString(item[\"type\"]) === \"agent_message\") {\r\n const text = asString(item[\"text\"]);\r\n if (text && text.length > 0) {\r\n textParts.push(text);\r\n }\r\n }\r\n }\r\n\r\n if (type === \"turn.completed\") {\r\n const usage = isRecord(line[\"usage\"]) ? line[\"usage\"] : undefined;\r\n if (usage) {\r\n inputTokens = asNumber(usage[\"input_tokens\"]) ?? inputTokens;\r\n outputTokens = asNumber(usage[\"output_tokens\"]) ?? outputTokens;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n text: textParts.join(\"\\n\").trim(),\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"google\";\r\n readonly supportedModels = [\r\n \"gemini-3-pro-preview\",\r\n \"gemini-3-flash-preview\",\r\n \"gemini-2.5-pro\",\r\n \"gemini-2.5-flash\",\r\n \"gemini-2.5-flash-lite\",\r\n ] as const;\r\n\r\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n // Prepend system prompt for Gemini (no native --system-prompt flag)\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"gemini\",\r\n [\r\n \"-p\",\r\n fullPrompt,\r\n \"--model\",\r\n model,\r\n \"--output-format\",\r\n \"stream-json\",\r\n \"--approval-mode\",\r\n \"yolo\",\r\n ],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n let text = \"\";\r\n let inputTokens: number | undefined;\r\n let outputTokens: number | undefined;\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n const type = asString(line[\"type\"]);\r\n\r\n if (type === \"message\" && asString(line[\"role\"]) === \"assistant\") {\r\n const content = asString(line[\"content\"]);\r\n if (content !== undefined) {\r\n const delta = line[\"delta\"] === true;\r\n text = delta ? `${text}${content}` : content;\r\n }\r\n }\r\n\r\n if (type === \"result\") {\r\n const stats = isRecord(line[\"stats\"]) ? line[\"stats\"] : undefined;\r\n if (stats) {\r\n inputTokens = asNumber(stats[\"input_tokens\"]) ?? inputTokens;\r\n outputTokens = asNumber(stats[\"output_tokens\"]) ?? outputTokens;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n text: text.trim(),\r\n inputTokens,\r\n outputTokens,\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {\r\n readonly name: ProviderName = \"kimi\";\r\n readonly supportedModels = [\"kimi-for-coding\"] as const;\r\n\r\n protected async runCLI(_model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\r\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\r\n const { stdout } = await execa(\r\n \"kimi\",\r\n [\"--print\", \"--output-format\", \"stream-json\", \"-p\", fullPrompt],\r\n {\r\n timeout: CLI_TIMEOUT_MS,\r\n stdin: \"ignore\",\r\n env: { ...process.env, NO_COLOR: \"1\" },\r\n },\r\n );\r\n\r\n const lines = toJsonLines(stdout);\r\n let text = \"\";\r\n\r\n for (const line of lines) {\r\n if (!isRecord(line)) continue;\r\n if (asString(line[\"role\"]) !== \"assistant\") continue;\r\n\r\n const content = line[\"content\"];\r\n if (!Array.isArray(content)) continue;\r\n\r\n const textParts: string[] = [];\r\n for (const part of content) {\r\n if (!isRecord(part)) continue;\r\n if (asString(part[\"type\"]) === \"text\") {\r\n const piece = asString(part[\"text\"]);\r\n if (piece) textParts.push(piece);\r\n }\r\n }\r\n\r\n if (textParts.length > 0) {\r\n text = textParts.join(\"\");\r\n }\r\n }\r\n\r\n return {\r\n text: text.trim(),\r\n finishReason: \"stop\",\r\n };\r\n }\r\n}\r\n\r\nexport function logNativeAdapterSelection(provider: ProviderName): void {\r\n logger.info({ provider }, \"Using native CLI adapter\");\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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-SOQFMNQC.js","sourcesContent":["/**\r\n * Tool Registry — central registry for all built-in and MCP tools.\r\n * Per PRD sections 5.1, 14.4\r\n */\r\n\r\nimport type {\r\n IToolRegistry,\r\n IToolRegistration,\r\n IToolExecutionContext,\r\n ToolCategory,\r\n} from \"../types/tool.js\";\r\nimport type { IToolDefinition, IToolResult, IToolCall } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { redactSecrets } from \"../utils/sanitizer.js\";\r\n\r\nfunction redactToolArgs(args: Record<string, unknown>): Record<string, unknown> {\r\n const redacted: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(args)) {\r\n if (typeof value === \"string\" && (key === \"content\" || key === \"command\" || key === \"new_source\")) {\r\n redacted[key] = redactSecrets(value.length > 200 ? value.slice(0, 200) + \"...\" : value);\r\n } else if (typeof value === \"string\") {\r\n redacted[key] = redactSecrets(value);\r\n } else {\r\n redacted[key] = value;\r\n }\r\n }\r\n return redacted;\r\n}\r\n\r\nexport class ToolRegistry implements IToolRegistry {\r\n private readonly tools: Map<string, IToolRegistration> = new Map();\r\n private readonly categoryIndex: Map<ToolCategory, Set<string>> = new Map();\r\n\r\n register(tool: IToolRegistration): void {\r\n const name = tool.definition.name;\r\n if (this.tools.has(name)) {\r\n logger.warn({ toolName: name }, \"Overwriting existing tool registration\");\r\n }\r\n this.tools.set(name, tool);\r\n\r\n let categorySet = this.categoryIndex.get(tool.category);\r\n if (!categorySet) {\r\n categorySet = new Set();\r\n this.categoryIndex.set(tool.category, categorySet);\r\n }\r\n categorySet.add(name);\r\n\r\n logger.debug({ toolName: name, category: tool.category }, \"Tool registered\");\r\n }\r\n\r\n get(name: string): IToolRegistration | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): readonly IToolRegistration[] {\r\n return [...this.tools.values()];\r\n }\r\n\r\n getDefinitions(): readonly IToolDefinition[] {\r\n return [...this.tools.values()].map((t) => t.definition);\r\n }\r\n\r\n getByCategory(category: ToolCategory): readonly IToolRegistration[] {\r\n const names = this.categoryIndex.get(category);\r\n if (!names) {\r\n return [];\r\n }\r\n const results: IToolRegistration[] = [];\r\n for (const name of names) {\r\n const tool = this.tools.get(name);\r\n if (tool) {\r\n results.push(tool);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n async execute(\r\n call: IToolCall,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return {\r\n toolCallId: call.id,\r\n name: call.name,\r\n content: `Unknown tool: ${call.name}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n if (tool.requiresApproval(context, call.arguments)) {\r\n return {\r\n toolCallId: call.id,\r\n name: call.name,\r\n content: `Tool \"${call.name}\" requires user approval in ${context.permissionMode} mode.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n logger.debug({ toolName: call.name, args: redactToolArgs(call.arguments) }, \"Executing tool\");\r\n const result = await tool.execute(call.arguments, context);\r\n return {\r\n ...result,\r\n toolCallId: call.id,\r\n name: call.name,\r\n };\r\n } catch (error: unknown) {\r\n const message =\r\n error instanceof Error ? error.message : \"Unknown execution error\";\r\n logger.error({ toolName: call.name, error: message }, \"Tool execution failed\");\r\n return {\r\n toolCallId: call.id,\r\n name: call.name,\r\n content: message,\r\n isError: true,\r\n };\r\n }\r\n }\r\n}\r\n","/**\r\n * Read tool — file reading with line numbers, offset/limit, binary detection.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport { readFile, stat } from \"node:fs/promises\";\r\nimport { extname } from \"node:path\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { FileNotFoundError } from \"../types/errors.js\";\r\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\r\nconst DEFAULT_LINE_LIMIT = 2000;\r\nconst MAX_LINE_LENGTH = 2000;\r\n\r\nconst BINARY_EXTENSIONS = new Set([\r\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".ico\", \".webp\", \".svg\",\r\n \".mp3\", \".mp4\", \".avi\", \".mov\", \".wav\", \".flac\",\r\n \".zip\", \".gz\", \".tar\", \".bz2\", \".7z\", \".rar\",\r\n \".exe\", \".dll\", \".so\", \".dylib\", \".o\", \".a\",\r\n \".pdf\", \".doc\", \".docx\", \".xls\", \".xlsx\",\r\n \".woff\", \".woff2\", \".ttf\", \".eot\", \".otf\",\r\n \".sqlite\", \".db\",\r\n]);\r\n\r\nfunction isBinaryFile(filePath: string, buffer: Buffer): boolean {\r\n if (BINARY_EXTENSIONS.has(extname(filePath).toLowerCase())) {\r\n return true;\r\n }\r\n // Check for null bytes in first 8KB\r\n const sample = buffer.subarray(0, 8192);\r\n for (let i = 0; i < sample.length; i++) {\r\n if (sample[i] === 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction formatWithLineNumbers(\r\n content: string,\r\n offset: number,\r\n limit: number,\r\n): string {\r\n const allLines = content.split(\"\\n\");\r\n const startLine = Math.max(0, offset);\r\n const endLine = Math.min(allLines.length, startLine + limit);\r\n const sliced = allLines.slice(startLine, endLine);\r\n\r\n const maxLineNum = endLine;\r\n const padWidth = String(maxLineNum).length;\r\n\r\n return sliced\r\n .map((line, idx) => {\r\n const lineNum = String(startLine + idx + 1).padStart(padWidth, \" \");\r\n const truncated =\r\n line.length > MAX_LINE_LENGTH\r\n ? line.substring(0, MAX_LINE_LENGTH) + \"...\"\r\n : line;\r\n return `${lineNum}\\t${truncated}`;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\nexport function createReadTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"read\",\r\n description:\r\n \"Read a file from the filesystem with line numbers. Supports offset and limit for large files.\",\r\n parameters: [\r\n {\r\n name: \"file_path\",\r\n type: \"string\",\r\n description: \"Absolute path to the file to read\",\r\n required: true,\r\n },\r\n {\r\n name: \"offset\",\r\n type: \"number\",\r\n description: \"Line number to start reading from (0-indexed)\",\r\n required: false,\r\n default: 0,\r\n },\r\n {\r\n name: \"limit\",\r\n type: \"number\",\r\n description: \"Maximum number of lines to read\",\r\n required: false,\r\n default: DEFAULT_LINE_LIMIT,\r\n },\r\n ],\r\n },\r\n category: \"file\",\r\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n return false; // Read never requires approval\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const filePath = args[\"file_path\"];\r\n if (typeof filePath !== \"string\" || filePath.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: \"file_path parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const projectRoot = context.projectRoot;\r\n const allowedPaths = context.allowedPaths;\r\n\r\n let resolvedPath: string;\r\n try {\r\n resolvedPath = validatePath(filePath, projectRoot);\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\r\n return { toolCallId: \"\", name: \"read\", content: msg, isError: true };\r\n }\r\n\r\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n let fileStat;\r\n try {\r\n fileStat = await stat(resolvedPath);\r\n } catch {\r\n throw new FileNotFoundError(resolvedPath);\r\n }\r\n\r\n if (!fileStat.isFile()) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: `\"${resolvedPath}\" is not a regular file. Use Bash ls to list directories.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n if (fileStat.size > MAX_FILE_SIZE) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: `File is too large (${(fileStat.size / 1024 / 1024).toFixed(1)} MB). Maximum is ${MAX_FILE_SIZE / 1024 / 1024} MB.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const rawBuffer = await readFile(resolvedPath);\r\n\r\n if (isBinaryFile(resolvedPath, rawBuffer)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: `Binary file detected: ${resolvedPath} (${fileStat.size} bytes). Cannot display binary content.`,\r\n isError: false,\r\n };\r\n }\r\n\r\n const content = rawBuffer.toString(\"utf-8\");\r\n\r\n if (content.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: `File \"${resolvedPath}\" exists but is empty.`,\r\n isError: false,\r\n };\r\n }\r\n\r\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\r\n const limit = typeof args[\"limit\"] === \"number\" ? args[\"limit\"] : DEFAULT_LINE_LIMIT;\r\n\r\n const formatted = formatWithLineNumbers(content, offset, limit);\r\n logger.debug({ file: resolvedPath, offset, limit }, \"File read\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"read\",\r\n content: formatted,\r\n isError: false,\r\n };\r\n },\r\n };\r\n}\r\n","/**\r\n * Write tool — write content to files, create parent dirs, set permissions.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport { writeFile, mkdir, stat } from \"node:fs/promises\";\r\nimport { dirname, extname } from \"node:path\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst CONFIG_EXTENSIONS = new Set([\r\n \".env\", \".pem\", \".key\", \".crt\", \".p12\", \".pfx\", \".jks\",\r\n]);\r\n\r\nconst SENSITIVE_FILENAMES = new Set([\r\n \".env\", \".env.local\", \".env.production\", \".env.development\",\r\n \"credentials.json\", \"credentials.enc\", \"secrets.json\",\r\n \"id_rsa\", \"id_ed25519\", \"config.json\",\r\n]);\r\n\r\nfunction isConfigFile(filePath: string): boolean {\r\n const ext = extname(filePath).toLowerCase();\r\n const base = filePath.split(\"/\").pop() ?? \"\";\r\n return CONFIG_EXTENSIONS.has(ext) || SENSITIVE_FILENAMES.has(base);\r\n}\r\n\r\nexport function createWriteTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"write\",\r\n description:\r\n \"Write content to a file. Creates parent directories if needed. Overwrites existing files.\",\r\n parameters: [\r\n {\r\n name: \"file_path\",\r\n type: \"string\",\r\n description: \"Absolute path to the file to write\",\r\n required: true,\r\n },\r\n {\r\n name: \"content\",\r\n type: \"string\",\r\n description: \"The content to write to the file\",\r\n required: true,\r\n },\r\n ],\r\n },\r\n category: \"file\",\r\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n // Write always requires approval in strict and standard modes\r\n return context.permissionMode === \"strict\" || context.permissionMode === \"standard\";\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const filePath = args[\"file_path\"];\r\n const content = args[\"content\"];\r\n\r\n if (typeof filePath !== \"string\" || filePath.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: \"file_path parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (typeof content !== \"string\") {\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: \"content parameter is required and must be a string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const projectRoot = context.projectRoot;\r\n const allowedPaths = context.allowedPaths;\r\n\r\n let resolvedPath: string;\r\n try {\r\n resolvedPath = validatePath(filePath, projectRoot);\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\r\n return { toolCallId: \"\", name: \"write\", content: msg, isError: true };\r\n }\r\n\r\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const parentDir = dirname(resolvedPath);\r\n try {\r\n await mkdir(parentDir, { recursive: true });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Failed to create directory\";\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: `Failed to create parent directory: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const fileMode = isConfigFile(resolvedPath) ? 0o600 : 0o644;\r\n\r\n let existed = false;\r\n try {\r\n const fileStat = await stat(resolvedPath);\r\n existed = fileStat.isFile();\r\n } catch {\r\n // File does not exist — will be created\r\n }\r\n\r\n try {\r\n await writeFile(resolvedPath, content, { encoding: \"utf-8\", mode: fileMode });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Write failed\";\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: `Failed to write file: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const lineCount = content.split(\"\\n\").length;\r\n const action = existed ? \"Updated\" : \"Created\";\r\n\r\n logger.debug(\r\n { file: resolvedPath, lines: lineCount, mode: fileMode.toString(8) },\r\n `File ${action.toLowerCase()}`,\r\n );\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"write\",\r\n content: `${action} ${resolvedPath} (${lineCount} lines)`,\r\n isError: false,\r\n };\r\n },\r\n };\r\n}\r\n","/**\r\n * Edit tool — exact string replacement with uniqueness validation.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport { readFile, writeFile } from \"node:fs/promises\";\r\nimport { stat } from \"node:fs/promises\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { FileNotFoundError } from \"../types/errors.js\";\r\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nexport function createEditTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"edit\",\r\n description:\r\n \"Perform exact string replacement in a file. The old_string must be unique unless replace_all is true.\",\r\n parameters: [\r\n {\r\n name: \"file_path\",\r\n type: \"string\",\r\n description: \"Absolute path to the file to edit\",\r\n required: true,\r\n },\r\n {\r\n name: \"old_string\",\r\n type: \"string\",\r\n description: \"The exact text to find and replace\",\r\n required: true,\r\n },\r\n {\r\n name: \"new_string\",\r\n type: \"string\",\r\n description: \"The replacement text\",\r\n required: true,\r\n },\r\n {\r\n name: \"replace_all\",\r\n type: \"boolean\",\r\n description: \"Replace all occurrences instead of requiring uniqueness\",\r\n required: false,\r\n default: false,\r\n },\r\n ],\r\n },\r\n category: \"file\",\r\n requiresApproval: (context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n return context.permissionMode === \"strict\" || context.permissionMode === \"standard\";\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const filePath = args[\"file_path\"];\r\n const oldString = args[\"old_string\"];\r\n const newString = args[\"new_string\"];\r\n const replaceAll = args[\"replace_all\"] === true;\r\n\r\n if (typeof filePath !== \"string\" || filePath.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: \"file_path parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (typeof oldString !== \"string\") {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: \"old_string parameter is required and must be a string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (typeof newString !== \"string\") {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: \"new_string parameter is required and must be a string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (oldString === newString) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: \"old_string and new_string are identical — no edit needed.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const projectRoot = context.projectRoot;\r\n const allowedPaths = context.allowedPaths;\r\n\r\n let resolvedPath: string;\r\n try {\r\n resolvedPath = validatePath(filePath, projectRoot);\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\r\n return { toolCallId: \"\", name: \"edit\", content: msg, isError: true };\r\n }\r\n\r\n if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n const fileStat = await stat(resolvedPath);\r\n if (!fileStat.isFile()) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: `\"${resolvedPath}\" is not a regular file.`,\r\n isError: true,\r\n };\r\n }\r\n } catch {\r\n throw new FileNotFoundError(resolvedPath);\r\n }\r\n\r\n const rawBuffer = await readFile(resolvedPath);\r\n const originalContent = rawBuffer.toString(\"utf-8\");\r\n\r\n if (!originalContent.includes(oldString)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content:\r\n `old_string not found in ${resolvedPath}. Ensure it matches the file content exactly, including whitespace and indentation.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n if (!replaceAll) {\r\n const firstIdx = originalContent.indexOf(oldString);\r\n const secondIdx = originalContent.indexOf(oldString, firstIdx + 1);\r\n if (secondIdx !== -1) {\r\n const occurrences = originalContent.split(oldString).length - 1;\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content:\r\n `old_string is not unique — found ${occurrences} occurrences in ${resolvedPath}. ` +\r\n `Provide more surrounding context to make it unique, or set replace_all to true.`,\r\n isError: true,\r\n };\r\n }\r\n }\r\n\r\n let newContent: string;\r\n let replacementCount: number;\r\n\r\n if (replaceAll) {\r\n replacementCount = originalContent.split(oldString).length - 1;\r\n newContent = originalContent.split(oldString).join(newString);\r\n } else {\r\n replacementCount = 1;\r\n const idx = originalContent.indexOf(oldString);\r\n newContent =\r\n originalContent.substring(0, idx) +\r\n newString +\r\n originalContent.substring(idx + oldString.length);\r\n }\r\n\r\n await writeFile(resolvedPath, newContent, \"utf-8\");\r\n\r\n logger.debug(\r\n { file: resolvedPath, replacements: replacementCount },\r\n \"File edited\",\r\n );\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"edit\",\r\n content: `Edited ${resolvedPath}: ${replacementCount} replacement(s) made.`,\r\n isError: false,\r\n };\r\n },\r\n };\r\n}\r\n","/**\r\n * Glob tool — fast file pattern matching sorted by modification time.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport fg from \"fast-glob\";\r\nimport { stat } from \"node:fs/promises\";\r\nimport { resolve } from \"node:path\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\r\n\r\nconst MAX_RESULTS = 1000;\r\n\r\ninterface FileEntry {\r\n readonly path: string;\r\n readonly mtimeMs: number;\r\n}\r\n\r\nexport function createGlobTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"glob\",\r\n description:\r\n \"Find files matching a glob pattern. Results are sorted by modification time (newest first).\",\r\n parameters: [\r\n {\r\n name: \"pattern\",\r\n type: \"string\",\r\n description: 'Glob pattern to match (e.g. \"**/*.ts\", \"src/**/*.tsx\")',\r\n required: true,\r\n },\r\n {\r\n name: \"path\",\r\n type: \"string\",\r\n description: \"Directory to search in. Defaults to project root.\",\r\n required: false,\r\n },\r\n ],\r\n },\r\n category: \"search\",\r\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n return false; // Glob never requires approval\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const pattern = args[\"pattern\"];\r\n if (typeof pattern !== \"string\" || pattern.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"glob\",\r\n content: \"pattern parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const projectRoot = context.projectRoot;\r\n const allowedPaths = context.allowedPaths;\r\n\r\n let searchPath: string;\r\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\r\n const resolved = resolve(projectRoot, args[\"path\"]);\r\n searchPath = validatePath(resolved, projectRoot);\r\n } else {\r\n searchPath = projectRoot;\r\n }\r\n\r\n if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"glob\",\r\n content: `Access denied: ${searchPath} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n let matchedPaths: string[];\r\n try {\r\n matchedPaths = await fg(pattern, {\r\n cwd: searchPath,\r\n absolute: true,\r\n dot: false,\r\n onlyFiles: true,\r\n ignore: [\r\n \"**/node_modules/**\",\r\n \"**/.git/**\",\r\n \"**/dist/**\",\r\n \"**/build/**\",\r\n \"**/.next/**\",\r\n \"**/coverage/**\",\r\n ],\r\n });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Glob search failed\";\r\n return { toolCallId: \"\", name: \"glob\", content: msg, isError: true };\r\n }\r\n\r\n if (matchedPaths.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"glob\",\r\n content: \"No files found\",\r\n isError: false,\r\n };\r\n }\r\n\r\n // Sort by modification time — newest first\r\n const entries: FileEntry[] = [];\r\n for (const filePath of matchedPaths) {\r\n try {\r\n const fileStat = await stat(filePath);\r\n entries.push({ path: filePath, mtimeMs: fileStat.mtimeMs });\r\n } catch {\r\n // Skip files we can't stat\r\n }\r\n }\r\n\r\n entries.sort((a, b) => b.mtimeMs - a.mtimeMs);\r\n\r\n const truncated = entries.length > MAX_RESULTS;\r\n const resultEntries = truncated ? entries.slice(0, MAX_RESULTS) : entries;\r\n const output = resultEntries.map((e) => e.path).join(\"\\n\");\r\n\r\n logger.debug(\r\n { pattern, searchPath, total: entries.length, returned: resultEntries.length },\r\n \"Glob search complete\",\r\n );\r\n\r\n const suffix = truncated\r\n ? `\\n\\n(Showing ${MAX_RESULTS} of ${entries.length} matches)`\r\n : \"\";\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"glob\",\r\n content: output + suffix,\r\n isError: false,\r\n };\r\n },\r\n };\r\n}\r\n","/**\r\n * Grep tool — content search using ripgrep with grep fallback.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport { execFile } from \"node:child_process\";\r\nimport { resolve } from \"node:path\";\r\nimport { promisify } from \"node:util\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport { isPathAllowed, validatePath } from \"../utils/sanitizer.js\";\r\n\r\nconst execFileAsync = promisify(execFile);\r\n\r\nconst MAX_OUTPUT_LENGTH = 30_000;\r\nconst DEFAULT_HEAD_LIMIT = 0; // unlimited\r\n\r\ntype OutputMode = \"content\" | \"files_with_matches\" | \"count\";\r\n\r\nasync function findSearchBinary(): Promise<string> {\r\n try {\r\n await execFileAsync(\"which\", [\"rg\"]);\r\n return \"rg\";\r\n } catch {\r\n return \"grep\";\r\n }\r\n}\r\n\r\nfunction buildRipgrepArgs(\r\n pattern: string,\r\n searchPath: string,\r\n outputMode: OutputMode,\r\n opts: {\r\n readonly glob?: string | undefined;\r\n readonly fileType?: string | undefined;\r\n readonly contextLines?: number | undefined;\r\n readonly beforeContext?: number | undefined;\r\n readonly afterContext?: number | undefined;\r\n readonly caseInsensitive?: boolean | undefined;\r\n readonly multiline?: boolean | undefined;\r\n readonly lineNumbers?: boolean | undefined;\r\n readonly headLimit?: number | undefined;\r\n },\r\n): string[] {\r\n const args: string[] = [];\r\n\r\n if (outputMode === \"files_with_matches\") {\r\n args.push(\"--files-with-matches\");\r\n } else if (outputMode === \"count\") {\r\n args.push(\"--count\");\r\n }\r\n\r\n if (opts.caseInsensitive === true) {\r\n args.push(\"-i\");\r\n }\r\n\r\n if (opts.multiline === true) {\r\n args.push(\"-U\", \"--multiline-dotall\");\r\n }\r\n\r\n if (outputMode === \"content\") {\r\n if (opts.lineNumbers !== false) {\r\n args.push(\"-n\");\r\n }\r\n if (typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\r\n args.push(\"-C\", String(opts.contextLines));\r\n } else {\r\n if (typeof opts.beforeContext === \"number\" && opts.beforeContext > 0) {\r\n args.push(\"-B\", String(opts.beforeContext));\r\n }\r\n if (typeof opts.afterContext === \"number\" && opts.afterContext > 0) {\r\n args.push(\"-A\", String(opts.afterContext));\r\n }\r\n }\r\n }\r\n\r\n if (typeof opts.glob === \"string\" && opts.glob.length > 0) {\r\n args.push(\"--glob\", opts.glob);\r\n }\r\n\r\n if (typeof opts.fileType === \"string\" && opts.fileType.length > 0) {\r\n args.push(\"--type\", opts.fileType);\r\n }\r\n\r\n // Always skip common uninteresting directories\r\n args.push(\r\n \"--glob\", \"!node_modules\",\r\n \"--glob\", \"!.git\",\r\n \"--glob\", \"!dist\",\r\n \"--glob\", \"!build\",\r\n \"--glob\", \"!coverage\",\r\n );\r\n\r\n args.push(\"--\", pattern, searchPath);\r\n\r\n return args;\r\n}\r\n\r\nfunction buildGrepArgs(\r\n pattern: string,\r\n searchPath: string,\r\n outputMode: OutputMode,\r\n opts: {\r\n readonly caseInsensitive?: boolean | undefined;\r\n readonly contextLines?: number | undefined;\r\n },\r\n): string[] {\r\n const args: string[] = [\"-r\", \"--extended-regexp\"];\r\n\r\n if (outputMode === \"files_with_matches\") {\r\n args.push(\"-l\");\r\n } else if (outputMode === \"count\") {\r\n args.push(\"-c\");\r\n }\r\n\r\n if (opts.caseInsensitive === true) {\r\n args.push(\"-i\");\r\n }\r\n\r\n if (outputMode === \"content\" && typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\r\n args.push(\"-C\", String(opts.contextLines));\r\n }\r\n\r\n args.push(\r\n \"--exclude-dir=node_modules\",\r\n \"--exclude-dir=.git\",\r\n \"--exclude-dir=dist\",\r\n \"--exclude-dir=build\",\r\n );\r\n\r\n args.push(\"--\", pattern, searchPath);\r\n\r\n return args;\r\n}\r\n\r\nfunction applyLimits(\r\n output: string,\r\n headLimit: number,\r\n offset: number,\r\n): string {\r\n let lines = output.split(\"\\n\");\r\n\r\n if (offset > 0) {\r\n lines = lines.slice(offset);\r\n }\r\n\r\n if (headLimit > 0) {\r\n lines = lines.slice(0, headLimit);\r\n }\r\n\r\n let result = lines.join(\"\\n\");\r\n\r\n if (result.length > MAX_OUTPUT_LENGTH) {\r\n result = result.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function createGrepTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"grep\",\r\n description:\r\n \"Search file contents using regex patterns. Uses ripgrep (rg) with grep fallback.\",\r\n parameters: [\r\n {\r\n name: \"pattern\",\r\n type: \"string\",\r\n description: \"Regular expression pattern to search for\",\r\n required: true,\r\n },\r\n {\r\n name: \"path\",\r\n type: \"string\",\r\n description: \"File or directory to search in. Defaults to project root.\",\r\n required: false,\r\n },\r\n {\r\n name: \"output_mode\",\r\n type: \"string\",\r\n description: \"Output mode: content, files_with_matches, or count\",\r\n required: false,\r\n default: \"files_with_matches\",\r\n enum: [\"content\", \"files_with_matches\", \"count\"],\r\n },\r\n {\r\n name: \"glob\",\r\n type: \"string\",\r\n description: 'Glob filter for files (e.g. \"*.ts\")',\r\n required: false,\r\n },\r\n {\r\n name: \"type\",\r\n type: \"string\",\r\n description: 'File type filter (e.g. \"ts\", \"py\")',\r\n required: false,\r\n },\r\n {\r\n name: \"context\",\r\n type: \"number\",\r\n description: \"Lines of context around matches\",\r\n required: false,\r\n },\r\n {\r\n name: \"-B\",\r\n type: \"number\",\r\n description: \"Lines of context before matches\",\r\n required: false,\r\n },\r\n {\r\n name: \"-A\",\r\n type: \"number\",\r\n description: \"Lines of context after matches\",\r\n required: false,\r\n },\r\n {\r\n name: \"-i\",\r\n type: \"boolean\",\r\n description: \"Case insensitive search\",\r\n required: false,\r\n default: false,\r\n },\r\n {\r\n name: \"multiline\",\r\n type: \"boolean\",\r\n description: \"Enable multiline matching\",\r\n required: false,\r\n default: false,\r\n },\r\n {\r\n name: \"head_limit\",\r\n type: \"number\",\r\n description: \"Limit output to first N entries\",\r\n required: false,\r\n default: 0,\r\n },\r\n {\r\n name: \"offset\",\r\n type: \"number\",\r\n description: \"Skip first N entries\",\r\n required: false,\r\n default: 0,\r\n },\r\n ],\r\n },\r\n category: \"search\",\r\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n return false;\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const pattern = args[\"pattern\"];\r\n if (typeof pattern !== \"string\" || pattern.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: \"pattern parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const projectRoot = context.projectRoot;\r\n const allowedPaths = context.allowedPaths;\r\n\r\n let searchPath: string;\r\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\r\n const resolved = resolve(projectRoot, args[\"path\"]);\r\n searchPath = validatePath(resolved, projectRoot);\r\n } else {\r\n searchPath = projectRoot;\r\n }\r\n\r\n if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: `Access denied: ${searchPath} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const outputMode: OutputMode =\r\n args[\"output_mode\"] === \"content\" || args[\"output_mode\"] === \"count\"\r\n ? args[\"output_mode\"]\r\n : \"files_with_matches\";\r\n\r\n const headLimit =\r\n typeof args[\"head_limit\"] === \"number\" ? args[\"head_limit\"] : DEFAULT_HEAD_LIMIT;\r\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\r\n\r\n const binary = await findSearchBinary();\r\n\r\n const searchArgs =\r\n binary === \"rg\"\r\n ? buildRipgrepArgs(pattern, searchPath, outputMode, {\r\n glob: typeof args[\"glob\"] === \"string\" ? args[\"glob\"] : undefined,\r\n fileType: typeof args[\"type\"] === \"string\" ? args[\"type\"] : undefined,\r\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\r\n beforeContext: typeof args[\"-B\"] === \"number\" ? args[\"-B\"] : undefined,\r\n afterContext: typeof args[\"-A\"] === \"number\" ? args[\"-A\"] : undefined,\r\n caseInsensitive: args[\"-i\"] === true,\r\n multiline: args[\"multiline\"] === true,\r\n lineNumbers: true,\r\n headLimit,\r\n })\r\n : buildGrepArgs(pattern, searchPath, outputMode, {\r\n caseInsensitive: args[\"-i\"] === true,\r\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\r\n });\r\n\r\n try {\r\n const { stdout } = await execFileAsync(binary, searchArgs, {\r\n maxBuffer: 10 * 1024 * 1024,\r\n timeout: 30_000,\r\n });\r\n\r\n const result = applyLimits(stdout.trim(), headLimit, offset);\r\n\r\n if (result.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: \"No matches found.\",\r\n isError: false,\r\n };\r\n }\r\n\r\n logger.debug({ binary, pattern, outputMode, matches: result.split(\"\\n\").length }, \"Grep complete\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: result,\r\n isError: false,\r\n };\r\n } catch (err: unknown) {\r\n // Exit code 1 = no matches (for both rg and grep)\r\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"1\") {\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: \"No matches found.\",\r\n isError: false,\r\n };\r\n }\r\n\r\n // ripgrep and grep return exit code 1 for no matches\r\n const execError = err as { status?: number; stdout?: string };\r\n if (execError.status === 1) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: \"No matches found.\",\r\n isError: false,\r\n };\r\n }\r\n\r\n const msg = err instanceof Error ? err.message : \"Search failed\";\r\n logger.error({ binary, pattern, error: msg }, \"Grep failed\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"grep\",\r\n content: `Search failed: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Bash tool — shell command execution with timeout, blocklist, and sanitization.\r\n * Per PRD sections 5.1, 14.4\r\n */\r\n\r\nimport { execaCommand } from \"execa\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { ExecutionTimeoutError } from \"../types/errors.js\";\r\nimport { isCommandBlocked, isPathAllowed, redactSecrets } from \"../utils/sanitizer.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst DEFAULT_TIMEOUT_MS = 120_000; // 2 minutes\r\nconst MAX_TIMEOUT_MS = 600_000; // 10 minutes\r\nconst MAX_OUTPUT_LENGTH = 30_000;\r\n\r\nconst DANGEROUS_PATTERNS: readonly string[] = [\r\n \"rm -rf /\",\r\n \"rm -rf ~\",\r\n \"mkfs\",\r\n \"dd if=\",\r\n \"> /dev/sd\",\r\n \"chmod -R 777 /\",\r\n \":(){ :|:& };:\",\r\n \"fork bomb\",\r\n \"shutdown\",\r\n \"reboot\",\r\n \"init 0\",\r\n \"init 6\",\r\n];\r\n\r\nconst ALWAYS_DANGEROUS_COMMANDS: readonly string[] = [\r\n \"push --force\",\r\n \"push -f\",\r\n \"reset --hard\",\r\n \"clean -fd\",\r\n \"branch -D\",\r\n \"rm -rf\",\r\n \"drop table\",\r\n \"drop database\",\r\n \"truncate table\",\r\n];\r\n\r\nconst SENSITIVE_ENV_PATTERNS: readonly string[] = [\r\n \"API_KEY\",\r\n \"SECRET\",\r\n \"TOKEN\",\r\n \"PASSWORD\",\r\n \"CREDENTIAL\",\r\n \"ANTHROPIC_API\",\r\n \"OPENAI_API\",\r\n \"GOOGLE_API\",\r\n \"MOONSHOT_API\",\r\n \"KIMI_API\",\r\n \"SESSION_TOKEN\",\r\n \"REFRESH_TOKEN\",\r\n \"ACCESS_TOKEN\",\r\n \"PRIVATE_KEY\",\r\n];\r\n\r\nfunction filterSensitiveEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const filtered: NodeJS.ProcessEnv = {};\r\n for (const [key, value] of Object.entries(env)) {\r\n const upperKey = key.toUpperCase();\r\n const isSensitive = SENSITIVE_ENV_PATTERNS.some((pattern) => upperKey.includes(pattern));\r\n if (!isSensitive) {\r\n filtered[key] = value;\r\n }\r\n }\r\n return filtered;\r\n}\r\n\r\nfunction isDangerousCommand(command: string): boolean {\r\n const lowerCommand = command.toLowerCase().trim();\r\n return DANGEROUS_PATTERNS.some((p) => lowerCommand.includes(p)) ||\r\n ALWAYS_DANGEROUS_COMMANDS.some((p) => lowerCommand.includes(p.toLowerCase()));\r\n}\r\n\r\nfunction truncateOutput(output: string): string {\r\n if (output.length <= MAX_OUTPUT_LENGTH) {\r\n return output;\r\n }\r\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\r\n}\r\n\r\nexport function createBashTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"bash\",\r\n description:\r\n \"Execute a shell command. Supports timeout. Dangerous commands require approval.\",\r\n parameters: [\r\n {\r\n name: \"command\",\r\n type: \"string\",\r\n description: \"The shell command to execute\",\r\n required: true,\r\n },\r\n {\r\n name: \"description\",\r\n type: \"string\",\r\n description: \"Short description of what this command does\",\r\n required: false,\r\n },\r\n {\r\n name: \"timeout\",\r\n type: \"number\",\r\n description: \"Timeout in milliseconds (max 600000)\",\r\n required: false,\r\n default: DEFAULT_TIMEOUT_MS,\r\n },\r\n ],\r\n },\r\n category: \"shell\",\r\n requiresApproval: (context: IToolExecutionContext, args: Record<string, unknown>): boolean => {\r\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\r\n const blockedCommands = context.blockedCommands;\r\n\r\n // Dangerous commands always require approval\r\n if (isDangerousCommand(command) || isCommandBlocked(command, blockedCommands)) {\r\n return true;\r\n }\r\n\r\n // Strict mode: all shell commands require approval\r\n if (context.permissionMode === \"strict\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const command = args[\"command\"];\r\n if (typeof command !== \"string\" || command.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content: \"command parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const workingDirectory = context.workingDirectory;\r\n const blockedCommands = context.blockedCommands;\r\n const allowedPaths = context.allowedPaths;\r\n const projectRoot = context.projectRoot;\r\n\r\n // Block extremely dangerous patterns\r\n const lowerCommand = command.toLowerCase().trim();\r\n for (const pattern of DANGEROUS_PATTERNS) {\r\n if (lowerCommand.includes(pattern)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content: `Blocked: command matches dangerous pattern \"${pattern}\".`,\r\n isError: true,\r\n };\r\n }\r\n }\r\n\r\n if (isCommandBlocked(command, blockedCommands)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content: \"Command is on the blocked list and cannot be executed.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (!isPathAllowed(workingDirectory, allowedPaths, projectRoot)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content: `Access denied: working directory ${workingDirectory} is outside the configured allowed paths.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n let timeoutMs = DEFAULT_TIMEOUT_MS;\r\n if (typeof args[\"timeout\"] === \"number\") {\r\n timeoutMs = Math.max(1000, Math.min(args[\"timeout\"], MAX_TIMEOUT_MS));\r\n }\r\n\r\n logger.debug({ command: redactSecrets(command), timeout: timeoutMs, cwd: workingDirectory }, \"Executing bash command\");\r\n\r\n try {\r\n const result = await execaCommand(command, {\r\n cwd: workingDirectory,\r\n timeout: timeoutMs,\r\n reject: false,\r\n shell: true,\r\n env: {\r\n ...filterSensitiveEnv(process.env),\r\n TERM: \"dumb\",\r\n NO_COLOR: \"1\",\r\n },\r\n stripFinalNewline: true,\r\n });\r\n\r\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\r\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\r\n\r\n let content = \"\";\r\n if (stdout.length > 0) {\r\n content += stdout;\r\n }\r\n if (stderr.length > 0) {\r\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"STDERR:\\n\") + stderr;\r\n }\r\n if (content.length === 0) {\r\n content = `Command completed with exit code ${result.exitCode ?? 0}.`;\r\n }\r\n\r\n const isError = (result.exitCode ?? 0) !== 0;\r\n\r\n if (isError) {\r\n content = `Exit code: ${result.exitCode ?? \"unknown\"}\\n${content}`;\r\n }\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content,\r\n isError,\r\n };\r\n } catch (err: unknown) {\r\n if (err instanceof Error && err.message.includes(\"timed out\")) {\r\n throw new ExecutionTimeoutError(command, timeoutMs);\r\n }\r\n\r\n const msg = err instanceof Error ? err.message : \"Command execution failed\";\r\n logger.error({ command: redactSecrets(command), error: msg }, \"Bash execution failed\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"bash\",\r\n content: `Execution failed: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Web Search tool — search interface (provider-dependent implementation).\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\ntype WebSearchProvider = (\r\n query: string,\r\n options: { readonly allowedDomains?: readonly string[] | undefined; readonly blockedDomains?: readonly string[] | undefined },\r\n) => Promise<string>;\r\n\r\nlet searchProvider: WebSearchProvider | undefined;\r\n\r\nexport function setWebSearchProvider(provider: WebSearchProvider): void {\r\n searchProvider = provider;\r\n}\r\n\r\nexport function createWebSearchTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"web_search\",\r\n description:\r\n \"Search the web for up-to-date information. Requires a configured search provider.\",\r\n parameters: [\r\n {\r\n name: \"query\",\r\n type: \"string\",\r\n description: \"The search query\",\r\n required: true,\r\n },\r\n {\r\n name: \"allowed_domains\",\r\n type: \"array\",\r\n description: \"Only include results from these domains\",\r\n required: false,\r\n },\r\n {\r\n name: \"blocked_domains\",\r\n type: \"array\",\r\n description: \"Exclude results from these domains\",\r\n required: false,\r\n },\r\n ],\r\n },\r\n category: \"web\",\r\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => {\r\n return false;\r\n },\r\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\r\n const query = args[\"query\"];\r\n if (typeof query !== \"string\" || query.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_search\",\r\n content: \"query parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (!searchProvider) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_search\",\r\n content:\r\n \"Web search is not configured. Set up a search provider in your configuration.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const allowedDomains = Array.isArray(args[\"allowed_domains\"])\r\n ? (args[\"allowed_domains\"] as unknown[]).filter(\r\n (d): d is string => typeof d === \"string\",\r\n )\r\n : undefined;\r\n\r\n const blockedDomains = Array.isArray(args[\"blocked_domains\"])\r\n ? (args[\"blocked_domains\"] as unknown[]).filter(\r\n (d): d is string => typeof d === \"string\",\r\n )\r\n : undefined;\r\n\r\n try {\r\n logger.debug({ query }, \"Web search executing\");\r\n\r\n const results = await searchProvider(query, {\r\n allowedDomains,\r\n blockedDomains,\r\n });\r\n\r\n if (results.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_search\",\r\n content: `No results found for: ${query}`,\r\n isError: false,\r\n };\r\n }\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_search\",\r\n content: results,\r\n isError: false,\r\n };\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Search failed\";\r\n logger.error({ query, error: msg }, \"Web search failed\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_search\",\r\n content: `Web search failed: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Web Fetch tool — fetch URL content, strip HTML, timeout handling.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst DEFAULT_TIMEOUT_MS = 30_000;\r\nconst MAX_CONTENT_LENGTH = 100_000;\r\nconst MAX_URL_LENGTH = 2048;\r\n\r\nfunction stripHtmlTags(html: string): string {\r\n // Remove script and style blocks entirely\r\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\r\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, \"\");\r\n\r\n // Replace common block elements with newlines\r\n text = text.replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, \"\\n\");\r\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\r\n\r\n // Strip all remaining tags\r\n text = text.replace(/<[^>]+>/g, \"\");\r\n\r\n // Decode common HTML entities\r\n text = text.replace(/&/g, \"&\");\r\n text = text.replace(/</g, \"<\");\r\n text = text.replace(/>/g, \">\");\r\n text = text.replace(/"/g, '\"');\r\n text = text.replace(/'/g, \"'\");\r\n text = text.replace(/ /g, \" \");\r\n\r\n // Collapse excessive whitespace\r\n text = text.replace(/[ \\t]+/g, \" \");\r\n text = text.replace(/\\n{3,}/g, \"\\n\\n\");\r\n\r\n return text.trim();\r\n}\r\n\r\nfunction isPrivateHostname(hostname: string): boolean {\r\n if (hostname === \"localhost\" || hostname === \"[::1]\") {\r\n return true;\r\n }\r\n const ipMatch = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(hostname);\r\n if (ipMatch) {\r\n const [, a, b] = ipMatch;\r\n if (a === undefined || b === undefined) {\r\n return false;\r\n }\r\n const first = parseInt(a, 10);\r\n const second = parseInt(b, 10);\r\n if (first === 127) return true;\r\n if (first === 10) return true;\r\n if (first === 172 && second >= 16 && second <= 31) return true;\r\n if (first === 192 && second === 168) return true;\r\n if (first === 169 && second === 254) return true;\r\n if (first === 0) return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction isValidUrl(urlString: string): boolean {\r\n if (urlString.length > MAX_URL_LENGTH) {\r\n return false;\r\n }\r\n try {\r\n const url = new URL(urlString);\r\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\r\n return false;\r\n }\r\n if (isPrivateHostname(url.hostname)) {\r\n return false;\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction enforceHttps(urlString: string): string {\r\n try {\r\n const url = new URL(urlString);\r\n if (url.protocol === \"http:\") {\r\n url.protocol = \"https:\";\r\n }\r\n return url.toString();\r\n } catch {\r\n return urlString;\r\n }\r\n}\r\n\r\nexport function createWebFetchTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"web_fetch\",\r\n description:\r\n \"Fetch content from a URL and convert HTML to readable text. HTTP URLs are upgraded to HTTPS.\",\r\n parameters: [\r\n {\r\n name: \"url\",\r\n type: \"string\",\r\n description: \"The URL to fetch content from\",\r\n required: true,\r\n },\r\n {\r\n name: \"prompt\",\r\n type: \"string\",\r\n description: \"What information to extract from the page\",\r\n required: false,\r\n },\r\n {\r\n name: \"timeout\",\r\n type: \"number\",\r\n description: \"Timeout in milliseconds (default 30000)\",\r\n required: false,\r\n default: DEFAULT_TIMEOUT_MS,\r\n },\r\n ],\r\n },\r\n category: \"web\",\r\n requiresApproval: (_context: IToolExecutionContext, _args: Record<string, unknown>): boolean => false,\r\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\r\n const rawUrl = args[\"url\"];\r\n if (typeof rawUrl !== \"string\" || rawUrl.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: \"url parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n if (!isValidUrl(rawUrl)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: `Invalid URL: \"${rawUrl}\". Must be a valid HTTP(S) URL.`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const url = enforceHttps(rawUrl);\r\n let timeoutMs = DEFAULT_TIMEOUT_MS;\r\n if (typeof args[\"timeout\"] === \"number\") {\r\n timeoutMs = Math.max(5000, Math.min(args[\"timeout\"], 60_000));\r\n }\r\n\r\n logger.debug({ url, timeout: timeoutMs }, \"Fetching URL\");\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => {\r\n controller.abort();\r\n }, timeoutMs);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n signal: controller.signal,\r\n headers: {\r\n \"User-Agent\": \"AemeathCLI/1.0\",\r\n \"Accept\": \"text/html, application/json, text/plain, */*\",\r\n },\r\n redirect: \"follow\",\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: `HTTP ${response.status} ${response.statusText} for ${url}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const contentType = response.headers.get(\"content-type\") ?? \"\";\r\n const rawBody = await response.text();\r\n\r\n let content: string;\r\n if (contentType.includes(\"text/html\")) {\r\n content = stripHtmlTags(rawBody);\r\n } else {\r\n content = rawBody;\r\n }\r\n\r\n if (content.length > MAX_CONTENT_LENGTH) {\r\n content = content.substring(0, MAX_CONTENT_LENGTH) + \"\\n...(content truncated)\";\r\n }\r\n\r\n if (content.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: `Fetched ${url} but the response body was empty.`,\r\n isError: false,\r\n };\r\n }\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content,\r\n isError: false,\r\n };\r\n } catch (err: unknown) {\r\n clearTimeout(timeoutId);\r\n\r\n if (err instanceof Error && err.name === \"AbortError\") {\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: `Request timed out after ${timeoutMs}ms for ${url}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n const msg = err instanceof Error ? err.message : \"Fetch failed\";\r\n logger.error({ url, error: msg }, \"Web fetch failed\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"web_fetch\",\r\n content: `Fetch failed for ${url}: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Git tool — safe git operations via execa. Never force push by default.\r\n * Per PRD section 5.1\r\n */\r\n\r\nimport { execaCommand } from \"execa\";\r\nimport type { IToolExecutionContext, IToolRegistration } from \"../types/tool.js\";\r\nimport type { IToolResult } from \"../types/message.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst GIT_TIMEOUT_MS = 60_000;\r\nconst MAX_OUTPUT_LENGTH = 30_000;\r\n\r\nconst ALLOWED_SUBCOMMANDS: ReadonlySet<string> = new Set([\r\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\r\n \"add\", \"commit\", \"checkout\", \"switch\", \"merge\",\r\n \"rebase\", \"cherry-pick\", \"stash\", \"fetch\", \"pull\", \"push\",\r\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\r\n]);\r\n\r\nconst DANGEROUS_FLAGS: readonly string[] = [\r\n \"--force\", \"-f\",\r\n \"--force-with-lease\",\r\n \"--hard\",\r\n \"--no-verify\",\r\n \"-D\",\r\n];\r\n\r\nconst READ_ONLY_SUBCOMMANDS: ReadonlySet<string> = new Set([\r\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\r\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\r\n]);\r\n\r\nfunction parseGitSubcommand(command: string): string | undefined {\r\n const parts = command.trim().split(/\\s+/);\r\n // Expect \"git <subcommand> ...\"\r\n if (parts[0] !== \"git\" || parts.length < 2) {\r\n return undefined;\r\n }\r\n return parts[1];\r\n}\r\n\r\nfunction hasDangerousFlags(command: string): boolean {\r\n const lowerCommand = command.toLowerCase();\r\n return DANGEROUS_FLAGS.some((flag) => {\r\n // Match as whole token\r\n const pattern = new RegExp(`(^|\\\\s)${flag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\\\\s|$)`);\r\n return pattern.test(lowerCommand);\r\n });\r\n}\r\n\r\nfunction truncateOutput(output: string): string {\r\n if (output.length <= MAX_OUTPUT_LENGTH) {\r\n return output;\r\n }\r\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\r\n}\r\n\r\nexport function createGitTool(): IToolRegistration {\r\n return {\r\n definition: {\r\n name: \"git\",\r\n description:\r\n \"Execute git commands safely. Supports status, diff, log, add, commit, branch operations. Never force pushes by default.\",\r\n parameters: [\r\n {\r\n name: \"command\",\r\n type: \"string\",\r\n description: 'Full git command to execute (e.g. \"git status\", \"git diff HEAD\")',\r\n required: true,\r\n },\r\n ],\r\n },\r\n category: \"git\",\r\n requiresApproval: (context: IToolExecutionContext, args: Record<string, unknown>): boolean => {\r\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\r\n const subcommand = parseGitSubcommand(command);\r\n\r\n // Dangerous flags always need approval\r\n if (hasDangerousFlags(command)) {\r\n return true;\r\n }\r\n\r\n // Read-only commands never need approval\r\n if (subcommand && READ_ONLY_SUBCOMMANDS.has(subcommand)) {\r\n return false;\r\n }\r\n\r\n // Write commands need approval in strict mode\r\n if (context.permissionMode === \"strict\") {\r\n return true;\r\n }\r\n\r\n // Push needs approval in standard mode\r\n if (subcommand === \"push\" && context.permissionMode === \"standard\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n execute: async (\r\n args: Record<string, unknown>,\r\n context: IToolExecutionContext,\r\n ): Promise<IToolResult> => {\r\n const command = args[\"command\"];\r\n if (typeof command !== \"string\" || command.length === 0) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content: \"command parameter is required and must be a non-empty string.\",\r\n isError: true,\r\n };\r\n }\r\n\r\n const workingDirectory = context.workingDirectory;\r\n\r\n const trimmedCommand = command.trim();\r\n if (!trimmedCommand.startsWith(\"git \")) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content: 'Command must start with \"git\".',\r\n isError: true,\r\n };\r\n }\r\n\r\n const subcommand = parseGitSubcommand(trimmedCommand);\r\n if (!subcommand || !ALLOWED_SUBCOMMANDS.has(subcommand)) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content: `Git subcommand \"${subcommand ?? \"unknown\"}\" is not allowed. Allowed: ${[...ALLOWED_SUBCOMMANDS].join(\", \")}`,\r\n isError: true,\r\n };\r\n }\r\n\r\n // Block force push completely\r\n const lowerCommand = trimmedCommand.toLowerCase();\r\n if (\r\n subcommand === \"push\" &&\r\n (lowerCommand.includes(\"--force\") || lowerCommand.includes(\" -f\"))\r\n ) {\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content:\r\n \"Force push is blocked by default. Use --force-with-lease if needed (requires approval).\",\r\n isError: true,\r\n };\r\n }\r\n\r\n logger.debug({ command: trimmedCommand, subcommand, cwd: workingDirectory }, \"Executing git command\");\r\n\r\n try {\r\n const result = await execaCommand(trimmedCommand, {\r\n cwd: workingDirectory,\r\n timeout: GIT_TIMEOUT_MS,\r\n reject: false,\r\n env: {\r\n ...process.env,\r\n GIT_TERMINAL_PROMPT: \"0\",\r\n GIT_PAGER: \"cat\",\r\n },\r\n stripFinalNewline: true,\r\n });\r\n\r\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\r\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\r\n\r\n let content = \"\";\r\n if (stdout.length > 0) {\r\n content += stdout;\r\n }\r\n if (stderr.length > 0) {\r\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"\") + stderr;\r\n }\r\n if (content.length === 0) {\r\n content = `Git command completed with exit code ${result.exitCode ?? 0}.`;\r\n }\r\n\r\n const isError = (result.exitCode ?? 0) !== 0;\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content,\r\n isError,\r\n };\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : \"Git command failed\";\r\n logger.error({ command: trimmedCommand, error: msg }, \"Git execution failed\");\r\n\r\n return {\r\n toolCallId: \"\",\r\n name: \"git\",\r\n content: `Git command failed: ${msg}`,\r\n isError: true,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n","/**\r\n * Tools barrel export and default registry factory.\r\n * Per PRD section 5.1\r\n */\r\n\r\nexport { ToolRegistry } from \"./registry.js\";\r\n\r\nexport { createReadTool } from \"./read.js\";\r\nexport { createWriteTool } from \"./write.js\";\r\nexport { createEditTool } from \"./edit.js\";\r\nexport { createGlobTool } from \"./glob.js\";\r\nexport { createGrepTool } from \"./grep.js\";\r\nexport { createBashTool } from \"./bash.js\";\r\nexport { createWebSearchTool, setWebSearchProvider } from \"./web-search.js\";\r\nexport { createWebFetchTool } from \"./web-fetch.js\";\r\nexport { createGitTool } from \"./git.js\";\r\n\r\nimport { ToolRegistry } from \"./registry.js\";\r\nimport { createReadTool } from \"./read.js\";\r\nimport { createWriteTool } from \"./write.js\";\r\nimport { createEditTool } from \"./edit.js\";\r\nimport { createGlobTool } from \"./glob.js\";\r\nimport { createGrepTool } from \"./grep.js\";\r\nimport { createBashTool } from \"./bash.js\";\r\nimport { createWebSearchTool } from \"./web-search.js\";\r\nimport { createWebFetchTool } from \"./web-fetch.js\";\r\nimport { createGitTool } from \"./git.js\";\r\nimport type { IToolExecutionContext } from \"../types/tool.js\";\r\n\r\nexport function createDefaultRegistry(_context: IToolExecutionContext): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n registry.register(createReadTool());\r\n registry.register(createWriteTool());\r\n registry.register(createEditTool());\r\n registry.register(createGlobTool());\r\n registry.register(createGrepTool());\r\n registry.register(createBashTool());\r\n registry.register(createWebSearchTool());\r\n registry.register(createWebFetchTool());\r\n registry.register(createGitTool());\r\n\r\n return registry;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skills/loader.ts","../src/skills/registry.ts"],"names":["parseYaml"],"mappings":"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","file":"chunk-TDFTX32B.js","sourcesContent":["/**\r\n * SkillLoader — Parses YAML frontmatter + Markdown body from SKILL.md files.\r\n * Per PRD section 10.2-10.3: YAML skill file format with Zod validation.\r\n */\r\n\r\nimport { readFile } from \"node:fs/promises\";\r\nimport { parse as parseYaml } from \"yaml\";\r\nimport { z } from \"zod\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { ISkillFrontmatter, ISkillDefinition } from \"../types/config.js\";\r\nimport type { ModelRole } from \"../types/model.js\";\r\n\r\n// ── Zod Schema ──────────────────────────────────────────────────────────\r\n\r\nconst MODEL_ROLE_VALUES: readonly [ModelRole, ...ModelRole[]] = [\r\n \"planning\",\r\n \"coding\",\r\n \"review\",\r\n \"testing\",\r\n \"bugfix\",\r\n \"documentation\",\r\n];\r\n\r\nconst skillFrontmatterSchema = z.object({\r\n name: z.string().min(1, \"Skill name is required\"),\r\n description: z.string().min(1, \"Skill description is required\"),\r\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, \"Version must be semver (e.g. 1.0.0)\").optional(),\r\n \"allowed-tools\": z.array(z.string().min(1)).optional(),\r\n triggers: z.array(z.string().min(1)).min(1).optional(),\r\n \"model-requirements\": z\r\n .object({\r\n \"preferred-role\": z.enum(MODEL_ROLE_VALUES).optional(),\r\n \"min-context\": z.number().int().positive().optional(),\r\n })\r\n .optional(),\r\n});\r\n\r\nconst FRONTMATTER_DELIMITER = \"---\";\r\n\r\n// ── SkillLoader Class ───────────────────────────────────────────────────\r\n\r\nexport class SkillLoader {\r\n /**\r\n * Parse a single SKILL.md file into an ISkillDefinition.\r\n * Returns null if the file is malformed or invalid.\r\n */\r\n async loadSkillFile(filePath: string): Promise<ISkillDefinition | null> {\r\n let raw: string;\r\n try {\r\n raw = await readFile(filePath, \"utf-8\");\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.warn({ filePath, error: message }, \"Failed to read skill file\");\r\n return null;\r\n }\r\n\r\n return this.parseSkillContent(raw, filePath);\r\n }\r\n\r\n /**\r\n * Parse raw SKILL.md content string into an ISkillDefinition.\r\n */\r\n parseSkillContent(raw: string, filePath: string): ISkillDefinition | null {\r\n const extracted = this.extractFrontmatter(raw);\r\n if (!extracted) {\r\n logger.warn({ filePath }, \"Skill file missing valid YAML frontmatter delimiters\");\r\n return null;\r\n }\r\n\r\n const { yamlContent, body } = extracted;\r\n\r\n let rawFrontmatter: unknown;\r\n try {\r\n rawFrontmatter = parseYaml(yamlContent);\r\n } catch (error: unknown) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.warn({ filePath, error: message }, \"Failed to parse YAML frontmatter\");\r\n return null;\r\n }\r\n\r\n const result = skillFrontmatterSchema.safeParse(rawFrontmatter);\r\n if (!result.success) {\r\n logger.warn(\r\n { filePath, errors: result.error.flatten().fieldErrors },\r\n \"Skill frontmatter validation failed\",\r\n );\r\n return null;\r\n }\r\n\r\n const validated = result.data;\r\n\r\n // Build frontmatter with defaults for missing optional fields.\r\n // External skills (e.g. from ~/.agents/skills/) often only have name + description.\r\n const modelReqs = validated[\"model-requirements\"];\r\n const skillName = validated.name;\r\n const frontmatter: ISkillFrontmatter = {\r\n name: skillName,\r\n description: validated.description,\r\n version: validated.version ?? \"0.0.0\",\r\n triggers: validated.triggers ?? [`$${skillName}`, skillName],\r\n // Only include optional properties when they are defined (not undefined)\r\n ...(validated[\"allowed-tools\"] !== undefined\r\n ? { \"allowed-tools\": validated[\"allowed-tools\"] }\r\n : {}),\r\n ...(modelReqs !== undefined\r\n ? {\r\n \"model-requirements\": {\r\n ...(modelReqs[\"preferred-role\"] !== undefined\r\n ? { \"preferred-role\": modelReqs[\"preferred-role\"] }\r\n : {}),\r\n ...(modelReqs[\"min-context\"] !== undefined\r\n ? { \"min-context\": modelReqs[\"min-context\"] }\r\n : {}),\r\n },\r\n }\r\n : {}),\r\n };\r\n\r\n return {\r\n frontmatter,\r\n body: body.trim(),\r\n filePath,\r\n };\r\n }\r\n\r\n /**\r\n * Extract only name and description for progressive loading (~100 tokens).\r\n */\r\n async loadSkillSummary(\r\n filePath: string,\r\n ): Promise<{ name: string; description: string } | null> {\r\n const definition = await this.loadSkillFile(filePath);\r\n if (!definition) return null;\r\n\r\n return {\r\n name: definition.frontmatter.name,\r\n description: definition.frontmatter.description,\r\n };\r\n }\r\n\r\n /**\r\n * Split raw content into YAML frontmatter and Markdown body.\r\n * Frontmatter is delimited by `---` at the start and a subsequent `---`.\r\n */\r\n private extractFrontmatter(\r\n raw: string,\r\n ): { yamlContent: string; body: string } | null {\r\n const trimmed = raw.trimStart();\r\n if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {\r\n return null;\r\n }\r\n\r\n // Find the line after the opening delimiter\r\n const afterOpening = trimmed.slice(FRONTMATTER_DELIMITER.length);\r\n // The opening delimiter must be followed by a newline\r\n if (!afterOpening.startsWith(\"\\n\")) {\r\n return null;\r\n }\r\n\r\n const contentAfterOpening = afterOpening.slice(1); // skip the \\n\r\n const closingIndex = contentAfterOpening.indexOf(`\\n${FRONTMATTER_DELIMITER}`);\r\n if (closingIndex === -1) {\r\n return null;\r\n }\r\n\r\n const yamlContent = contentAfterOpening.slice(0, closingIndex);\r\n // Body starts after the closing delimiter line\r\n const afterClosing = contentAfterOpening.slice(\r\n closingIndex + 1 + FRONTMATTER_DELIMITER.length,\r\n );\r\n // Skip optional newline after closing delimiter\r\n const body = afterClosing.startsWith(\"\\n\") ? afterClosing.slice(1) : afterClosing;\r\n\r\n return { yamlContent, body };\r\n }\r\n}\r\n","/**\r\n * SkillRegistry — Discovers, indexes, and resolves skill definitions.\r\n * Resolution priority: project > user > built-in (PRD section 10.4).\r\n * Progressive loading: only name + description loaded initially (~100 tokens each).\r\n */\r\n\r\nimport { readdir, stat } from \"node:fs/promises\";\r\nimport { join, dirname } from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n getUserSkillsDir,\r\n getProjectSkillsDir,\r\n getUniversalUserSkillsDir,\r\n getUniversalProjectSkillsDir,\r\n} from \"../utils/pathResolver.js\";\r\nimport { SkillLoader } from \"./loader.js\";\r\nimport type { ISkillDefinition } from \"../types/config.js\";\r\n\r\n// ── Constants ───────────────────────────────────────────────────────────\r\n\r\nconst SKILL_FILENAME = \"SKILL.md\";\r\n\r\n// ── Types ───────────────────────────────────────────────────────────────\r\n\r\nexport type SkillSource = \"project\" | \"user\" | \"universal\" | \"built-in\";\r\n\r\nexport interface ISkillSummary {\r\n readonly name: string;\r\n readonly description: string;\r\n readonly version: string;\r\n readonly source: SkillSource;\r\n readonly dirPath: string;\r\n}\r\n\r\ninterface ISkillEntry {\r\n readonly summary: ISkillSummary;\r\n definition: ISkillDefinition | null;\r\n}\r\n\r\n// ── SkillRegistry Class ─────────────────────────────────────────────────\r\n\r\nexport class SkillRegistry {\r\n private readonly loader: SkillLoader;\r\n private readonly skills: Map<string, ISkillEntry> = new Map();\r\n private readonly triggerIndex: Map<string, string> = new Map();\r\n private initialized = false;\r\n\r\n constructor(loader?: SkillLoader) {\r\n this.loader = loader ?? new SkillLoader();\r\n }\r\n\r\n /**\r\n * Initialize the registry by scanning all skill directories.\r\n * Loads in priority order so higher-priority sources override lower ones.\r\n */\r\n async initialize(projectRoot?: string): Promise<void> {\r\n if (this.initialized) return;\r\n\r\n // 1. Built-in skills (lowest priority)\r\n const builtInDir = this.getBuiltInSkillsDir();\r\n await this.scanDirectory(builtInDir, \"built-in\");\r\n\r\n // 2. Universal user-level skills (~/.agents/skills/)\r\n const universalUserDir = getUniversalUserSkillsDir();\r\n await this.scanDirectory(universalUserDir, \"universal\");\r\n\r\n // 3. User-level skills (~/.aemeathcli/skills/)\r\n const userDir = getUserSkillsDir();\r\n await this.scanDirectory(userDir, \"user\");\r\n\r\n // 4. Universal project-level skills (<project>/.agents/skills/)\r\n if (projectRoot) {\r\n const universalProjectDir = getUniversalProjectSkillsDir(projectRoot);\r\n await this.scanDirectory(universalProjectDir, \"universal\");\r\n }\r\n\r\n // 5. Project-level skills (highest priority — <project>/.aemeathcli/skills/)\r\n if (projectRoot) {\r\n const projectDir = getProjectSkillsDir(projectRoot);\r\n await this.scanDirectory(projectDir, \"project\");\r\n }\r\n\r\n this.initialized = true;\r\n logger.info(\r\n { totalSkills: this.skills.size, totalTriggers: this.triggerIndex.size },\r\n \"Skill registry initialized\",\r\n );\r\n }\r\n\r\n /**\r\n * Get a full skill definition by name. Loads content on demand.\r\n */\r\n async getByName(name: string): Promise<ISkillDefinition | null> {\r\n const entry = this.skills.get(name);\r\n if (!entry) return null;\r\n\r\n if (!entry.definition) {\r\n const filePath = join(entry.summary.dirPath, SKILL_FILENAME);\r\n entry.definition = await this.loader.loadSkillFile(filePath);\r\n }\r\n\r\n return entry.definition;\r\n }\r\n\r\n /**\r\n * Find a skill by trigger string (e.g. \"$review\" or \"review\").\r\n */\r\n async getByTrigger(trigger: string): Promise<ISkillDefinition | null> {\r\n const normalized = trigger.startsWith(\"$\") ? trigger.slice(1) : trigger;\r\n const withPrefix = `$${normalized}`;\r\n\r\n // Try both forms: with and without $ prefix\r\n const name =\r\n this.triggerIndex.get(withPrefix) ??\r\n this.triggerIndex.get(normalized) ??\r\n this.triggerIndex.get(trigger);\r\n\r\n if (!name) return null;\r\n return this.getByName(name);\r\n }\r\n\r\n /**\r\n * Resolve a trigger string to a skill name without loading the full definition.\r\n */\r\n resolveTriger(trigger: string): string | undefined {\r\n const normalized = trigger.startsWith(\"$\") ? trigger.slice(1) : trigger;\r\n const withPrefix = `$${normalized}`;\r\n\r\n return (\r\n this.triggerIndex.get(withPrefix) ??\r\n this.triggerIndex.get(normalized) ??\r\n this.triggerIndex.get(trigger)\r\n );\r\n }\r\n\r\n /**\r\n * List all registered skill summaries.\r\n */\r\n listAll(): readonly ISkillSummary[] {\r\n return Array.from(this.skills.values()).map((entry) => entry.summary);\r\n }\r\n\r\n /**\r\n * Check if a skill exists by name.\r\n */\r\n has(name: string): boolean {\r\n return this.skills.has(name);\r\n }\r\n\r\n /**\r\n * Get the count of registered skills.\r\n */\r\n get size(): number {\r\n return this.skills.size;\r\n }\r\n\r\n /**\r\n * Reset the registry for re-initialization.\r\n */\r\n reset(): void {\r\n this.skills.clear();\r\n this.triggerIndex.clear();\r\n this.initialized = false;\r\n }\r\n\r\n // ── Private Helpers ──────────────────────────────────────────────────\r\n\r\n /**\r\n * Scan a directory for skill subdirectories containing SKILL.md.\r\n */\r\n private async scanDirectory(dirPath: string, source: SkillSource): Promise<void> {\r\n let entries: string[];\r\n try {\r\n entries = await readdir(dirPath);\r\n } catch {\r\n logger.debug({ dirPath, source }, \"Skill directory not found, skipping\");\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n const skillDir = join(dirPath, entry);\r\n\r\n try {\r\n const info = await stat(skillDir);\r\n if (!info.isDirectory()) continue;\r\n } catch {\r\n continue;\r\n }\r\n\r\n const skillFile = join(skillDir, SKILL_FILENAME);\r\n try {\r\n await stat(skillFile);\r\n } catch {\r\n logger.debug({ skillDir }, \"No SKILL.md found in directory, skipping\");\r\n continue;\r\n }\r\n\r\n await this.registerSkillFromFile(skillFile, skillDir, source);\r\n }\r\n }\r\n\r\n /**\r\n * Register a single skill from its SKILL.md file path.\r\n */\r\n private async registerSkillFromFile(\r\n skillFile: string,\r\n skillDir: string,\r\n source: SkillSource,\r\n ): Promise<void> {\r\n const definition = await this.loader.loadSkillFile(skillFile);\r\n if (!definition) return;\r\n\r\n const { frontmatter } = definition;\r\n const summary: ISkillSummary = {\r\n name: frontmatter.name,\r\n description: frontmatter.description,\r\n version: frontmatter.version,\r\n source,\r\n dirPath: skillDir,\r\n };\r\n\r\n // Remove previous trigger mappings if overriding\r\n const existing = this.skills.get(summary.name);\r\n if (existing) {\r\n this.removeTriggers(existing.summary.name);\r\n logger.debug(\r\n {\r\n skill: summary.name,\r\n oldSource: existing.summary.source,\r\n newSource: source,\r\n },\r\n \"Skill overridden by higher-priority source\",\r\n );\r\n }\r\n\r\n this.skills.set(summary.name, { summary, definition });\r\n this.registerTriggers(definition);\r\n }\r\n\r\n /**\r\n * Index all triggers for a skill definition.\r\n */\r\n private registerTriggers(definition: ISkillDefinition): void {\r\n for (const trigger of definition.frontmatter.triggers) {\r\n this.triggerIndex.set(trigger, definition.frontmatter.name);\r\n }\r\n }\r\n\r\n /**\r\n * Remove all trigger mappings associated with a skill name.\r\n */\r\n private removeTriggers(skillName: string): void {\r\n const toDelete: string[] = [];\r\n for (const [trigger, name] of this.triggerIndex) {\r\n if (name === skillName) {\r\n toDelete.push(trigger);\r\n }\r\n }\r\n for (const trigger of toDelete) {\r\n this.triggerIndex.delete(trigger);\r\n }\r\n }\r\n\r\n /**\r\n * Resolve the built-in skills directory relative to this module.\r\n */\r\n private getBuiltInSkillsDir(): string {\r\n const currentFilePath = fileURLToPath(import.meta.url);\r\n return join(dirname(currentFilePath), \"built-in\");\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/sanitizer.ts"],"names":[],"mappings":";;;AAoBO,SAAS,YAAA,CAAa,UAAkB,WAAA,EAA6B;AAC1E,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAElE,EAAA,IAAI,CAAC,SAAA,CAAU,cAAA,EAAgB,cAAc,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,QAAQ,CAAA,iCAAA,EAAoC,WAAW,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;AAKO,SAAS,aAAA,CACd,QAAA,EACA,YAAA,EACA,WAAA,EACS;AACT,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAC5D,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAC,OAAA,KAAY;AACpC,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,OAAA,CAAQ,cAAA,EAAgB,OAAO,CAAC,CAAA;AAClE,IAAA,OAAO,SAAA,CAAU,iBAAiB,QAAQ,CAAA;AAAA,EAC5C,CAAC,CAAA;AACH;AAEA,SAAS,SAAA,CAAU,UAAkB,aAAA,EAAgC;AACnE,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,aAAa,CAAA;AAC5C,EAAA,OAAO,GAAA,KAAQ,MAAO,CAAC,GAAA,CAAI,WAAW,IAAI,CAAA,IAAK,CAAC,UAAA,CAAW,GAAG,CAAA;AAChE;AAMO,SAAS,gBAAA,CACd,SACA,eAAA,EACS;AACT,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AACrD,EAAA,OAAO,eAAA,CAAgB,IAAA;AAAA,IAAK,CAAC,OAAA,KAC3B,iBAAA,CAAkB,QAAA,CAAS,OAAA,CAAQ,aAAa;AAAA,GAClD;AACF;AAKO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,KACJ,OAAA,CAAQ,gBAAA,EAAkB,sBAAsB,CAAA,CAChD,OAAA,CAAQ,wBAAwB,eAAe,CAAA,CAC/C,QAAQ,wBAAA,EAA0B,gBAAgB,EAClD,OAAA,CAAQ,sBAAA,EAAwB,gBAAgB,CAAA,CAChD,OAAA,CAAQ,8BAA8B,mBAAmB,CAAA;AAC9D","file":"chunk-VBLLDY4R.js","sourcesContent":["/**\r\n * Input/output sanitization per PRD section 14.2\r\n * Zero trust for AI output — treat all model-generated content as untrusted\r\n */\r\n\r\nimport { isAbsolute, normalize, relative, resolve } from \"node:path\";\r\n\r\n/**\r\n * Sanitize shell command arguments to prevent injection.\r\n * PRD REQ: NO shell injection (section 14.1, 15.7 item 10)\r\n */\r\nexport function sanitizeShellArg(arg: string): string {\r\n // Escape single quotes by replacing them with escaped version\r\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\r\n}\r\n\r\n/**\r\n * Validate a file path is within the allowed project root.\r\n * Prevents directory traversal attacks (PRD section 14.1).\r\n */\r\nexport function validatePath(filePath: string, projectRoot: string): string {\r\n const normalizedRoot = normalize(resolve(projectRoot));\r\n const normalizedPath = normalize(resolve(normalizedRoot, filePath));\r\n\r\n if (!isSubPath(normalizedRoot, normalizedPath)) {\r\n throw new Error(\r\n `Path traversal detected: \"${filePath}\" resolves outside project root \"${projectRoot}\"`,\r\n );\r\n }\r\n\r\n return normalizedPath;\r\n}\r\n\r\n/**\r\n * Check if a path is safe (within allowed paths).\r\n */\r\nexport function isPathAllowed(\r\n filePath: string,\r\n allowedPaths: readonly string[],\r\n projectRoot: string,\r\n): boolean {\r\n const normalizedRoot = normalize(resolve(projectRoot));\r\n const resolved = normalize(resolve(normalizedRoot, filePath));\r\n return allowedPaths.some((allowed) => {\r\n const resolvedAllowed = normalize(resolve(normalizedRoot, allowed));\r\n return isSubPath(resolvedAllowed, resolved);\r\n });\r\n}\r\n\r\nfunction isSubPath(basePath: string, candidatePath: string): boolean {\r\n const rel = relative(basePath, candidatePath);\r\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\r\n}\r\n\r\n/**\r\n * Check if a shell command is on the blocked list.\r\n * PRD section 14.4: Dangerous commands always require confirmation.\r\n */\r\nexport function isCommandBlocked(\r\n command: string,\r\n blockedCommands: readonly string[],\r\n): boolean {\r\n const normalizedCommand = command.trim().toLowerCase();\r\n return blockedCommands.some((blocked) =>\r\n normalizedCommand.includes(blocked.toLowerCase()),\r\n );\r\n}\r\n\r\n/**\r\n * Redact potential secrets from text for logging.\r\n */\r\nexport function redactSecrets(text: string): string {\r\n return text\r\n .replace(/sk-ant-api\\S+/g, \"sk-ant-api[REDACTED]\")\r\n .replace(/sk-[a-zA-Z0-9]{20,}/g, \"sk-[REDACTED]\")\r\n .replace(/AIza[a-zA-Z0-9_-]{35}/g, \"AIza[REDACTED]\")\r\n .replace(/ghp_[a-zA-Z0-9]{36}/g, \"ghp_[REDACTED]\")\r\n .replace(/Bearer\\s+[a-zA-Z0-9._-]+/gi, \"Bearer [REDACTED]\");\r\n}\r\n\r\n/**\r\n * Sanitize user input for safe inclusion in prompts.\r\n */\r\nexport function sanitizePromptInput(input: string): string {\r\n // Strip null bytes\r\n return input.replace(/\\0/g, \"\");\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/tokenCounter.ts","../src/utils/retry.ts"],"names":[],"mappings":"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","file":"chunk-VJNQJALF.js","sourcesContent":["/**\r\n * Multi-provider token estimation per PRD section 7.5\r\n * Uses a universal approximation since we don't bundle tokenizers for each provider.\r\n */\r\n\r\nimport type { ITokenUsage } from \"../types/index.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/index.js\";\r\n\r\n/**\r\n * Approximate token count using the ~4 chars per token heuristic.\r\n * For production cost tracking, we rely on provider-reported usage in API responses.\r\n */\r\nexport function estimateTokenCount(text: string): number {\r\n return Math.ceil(text.length / 4);\r\n}\r\n\r\n/**\r\n * Calculate cost in USD based on token usage and model pricing.\r\n */\r\nexport function calculateCost(\r\n modelId: string,\r\n inputTokens: number,\r\n outputTokens: number,\r\n): number {\r\n const modelInfo = SUPPORTED_MODELS[modelId];\r\n if (!modelInfo) {\r\n return 0;\r\n }\r\n\r\n const inputCost = (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken;\r\n const outputCost = (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken;\r\n\r\n return Math.round((inputCost + outputCost) * 1_000_000) / 1_000_000;\r\n}\r\n\r\n/**\r\n * Create a token usage record with cost calculation.\r\n */\r\nexport function createTokenUsage(\r\n modelId: string,\r\n inputTokens: number,\r\n outputTokens: number,\r\n): ITokenUsage {\r\n return {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: calculateCost(modelId, inputTokens, outputTokens),\r\n };\r\n}\r\n\r\n/**\r\n * Format cost for display (e.g., \"$0.04\").\r\n */\r\nexport function formatCost(costUsd: number): string {\r\n if (costUsd < 0.01) {\r\n return `$${costUsd.toFixed(4)}`;\r\n }\r\n return `$${costUsd.toFixed(2)}`;\r\n}\r\n\r\n/**\r\n * Format token count for display (e.g., \"12.3K\").\r\n */\r\nexport function formatTokenCount(count: number): string {\r\n if (count < 1_000) {\r\n return String(count);\r\n }\r\n if (count < 1_000_000) {\r\n return `${(count / 1_000).toFixed(1)}K`;\r\n }\r\n return `${(count / 1_000_000).toFixed(1)}M`;\r\n}\r\n","/**\r\n * Retry with exponential backoff per PRD section 20.2\r\n * Provider failover: If primary model fails, auto-fallback to configured backup.\r\n */\r\n\r\nimport { logger } from \"./logger.js\";\r\n\r\nexport interface IRetryOptions {\r\n readonly maxRetries: number;\r\n readonly baseDelayMs: number;\r\n readonly maxDelayMs: number;\r\n readonly shouldRetry?: (error: unknown, attempt: number) => boolean;\r\n}\r\n\r\nconst DEFAULT_RETRY_OPTIONS: IRetryOptions = {\r\n maxRetries: 3,\r\n baseDelayMs: 1_000,\r\n maxDelayMs: 30_000,\r\n};\r\n\r\n/**\r\n * Execute a function with exponential backoff retry.\r\n */\r\nexport async function withRetry<T>(\r\n fn: () => Promise<T>,\r\n options?: Partial<IRetryOptions>,\r\n): Promise<T> {\r\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\r\n let lastError: unknown;\r\n\r\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error: unknown) {\r\n lastError = error;\r\n\r\n if (attempt === opts.maxRetries) {\r\n break;\r\n }\r\n\r\n if (opts.shouldRetry && !opts.shouldRetry(error, attempt)) {\r\n break;\r\n }\r\n\r\n const delay = Math.min(\r\n opts.baseDelayMs * Math.pow(2, attempt) + Math.random() * 1_000,\r\n opts.maxDelayMs,\r\n );\r\n\r\n logger.warn(\r\n { attempt: attempt + 1, maxRetries: opts.maxRetries, delayMs: delay },\r\n \"Retrying after error\",\r\n );\r\n\r\n await sleep(delay);\r\n }\r\n }\r\n\r\n throw lastError;\r\n}\r\n\r\n/**\r\n * Sleep for a specified duration.\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Check if an error indicates a rate limit (should retry after delay).\r\n */\r\nexport function isRateLimitError(error: unknown): boolean {\r\n if (error instanceof Error) {\r\n const message = error.message.toLowerCase();\r\n return message.includes(\"rate limit\") || message.includes(\"429\") || message.includes(\"too many requests\");\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if an error is transient (network issues, timeouts).\r\n */\r\nexport function isTransientError(error: unknown): boolean {\r\n if (error instanceof Error) {\r\n const message = error.message.toLowerCase();\r\n return (\r\n message.includes(\"timeout\") ||\r\n message.includes(\"econnreset\") ||\r\n message.includes(\"econnrefused\") ||\r\n message.includes(\"socket hang up\") ||\r\n message.includes(\"503\") ||\r\n message.includes(\"502\")\r\n );\r\n }\r\n return false;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/team-state.ts"],"names":[],"mappings":";AAOA,IAAI,iBAAA;AACJ,IAAI,cAAA;AACJ,IAAI,iBAAA;AAEG,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,iBAAA;AACT;AAEO,SAAS,qBAAqB,OAAA,EAAwC;AAC3E,EAAA,iBAAA,GAAoB,OAAA;AACtB;AAEO,SAAS,iBAAA,GAAwC;AACtD,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,kBAAkB,IAAA,EAAgC;AAChE,EAAA,cAAA,GAAiB,IAAA;AACnB;AAEO,SAAS,oBAAA,GAA0D;AACxE,EAAA,OAAO,iBAAA;AACT;AAEO,SAAS,qBAAqB,OAAA,EAAkD;AACrF,EAAA,iBAAA,GAAoB,OAAA;AACtB","file":"chunk-WAYSJMPS.js","sourcesContent":["/**\r\n * Module-level active team state shared between team commands and team launcher.\r\n * Extracted from App.tsx to enforce the 300-line component limit (PRD 6.2).\r\n */\r\n\r\nimport type { TeamManager } from \"../teams/team-manager.js\";\r\n\r\nlet activeTeamManager: TeamManager | undefined;\r\nlet activeTeamName: string | undefined;\r\nlet activeTmuxCleanup: (() => Promise<void>) | undefined;\r\n\r\nexport function getActiveTeamManager(): TeamManager | undefined {\r\n return activeTeamManager;\r\n}\r\n\r\nexport function setActiveTeamManager(manager: TeamManager | undefined): void {\r\n activeTeamManager = manager;\r\n}\r\n\r\nexport function getActiveTeamName(): string | undefined {\r\n return activeTeamName;\r\n}\r\n\r\nexport function setActiveTeamName(name: string | undefined): void {\r\n activeTeamName = name;\r\n}\r\n\r\nexport function getActiveTmuxCleanup(): (() => Promise<void>) | undefined {\r\n return activeTmuxCleanup;\r\n}\r\n\r\nexport function setActiveTmuxCleanup(cleanup: (() => Promise<void>) | undefined): void {\r\n activeTmuxCleanup = cleanup;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/conversation-store.ts"],"names":[],"mappings":"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","file":"chunk-WC72BRHR.js","sourcesContent":["/**\r\n * Conversation store — PRD section 17.1\r\n * CRUD for conversations, messages, file context, and cost tracking.\r\n * All queries use parameterized prepared statements.\r\n */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { SqliteStore } from \"./sqlite-store.js\";\r\nimport type { MessageRole } from \"../types/message.js\";\r\nimport type { ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IConversationRow,\r\n IMessageRow,\r\n IFileContextRow,\r\n ICostRow,\r\n IConversation,\r\n IMessage,\r\n IStoredTokenUsage,\r\n IFileContext,\r\n ICostEntry,\r\n IPaginationOptions,\r\n IAddMessageParams,\r\n IAddCostParams,\r\n IAddFileContextParams,\r\n} from \"./conversation-types.js\";\r\n\r\nexport type {\r\n IConversation,\r\n IMessage,\r\n IStoredTokenUsage,\r\n IFileContext,\r\n ICostEntry,\r\n IPaginationOptions,\r\n IAddMessageParams,\r\n IAddCostParams,\r\n IAddFileContextParams,\r\n} from \"./conversation-types.js\";\r\n\r\nexport class ConversationStore {\r\n private readonly store: SqliteStore;\r\n\r\n constructor(store: SqliteStore) {\r\n this.store = store;\r\n }\r\n\r\n createConversation(\r\n projectRoot: string,\r\n defaultModel?: string,\r\n metadata?: Record<string, unknown>,\r\n ): IConversation {\r\n const id = randomUUID();\r\n const metadataJson = JSON.stringify(metadata ?? {});\r\n\r\n this.store.run(\r\n `INSERT INTO conversations (id, project_root, default_model, metadata)\r\n VALUES (?, ?, ?, ?)`,\r\n id,\r\n projectRoot,\r\n defaultModel ?? null,\r\n metadataJson,\r\n );\r\n\r\n logger.info({ conversationId: id, projectRoot }, \"Conversation created\");\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM conversations WHERE id = ?\",\r\n id,\r\n ) as IConversationRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(`Failed to retrieve created conversation: ${id}`);\r\n }\r\n\r\n return this.mapConversationRow(row);\r\n }\r\n\r\n getConversation(id: string): IConversation | undefined {\r\n const row = this.store.get(\r\n \"SELECT * FROM conversations WHERE id = ?\",\r\n id,\r\n ) as IConversationRow | undefined;\r\n return row ? this.mapConversationRow(row) : undefined;\r\n }\r\n\r\n listConversations(projectRoot?: string): IConversation[] {\r\n const rows = projectRoot\r\n ? (this.store.all(\r\n \"SELECT * FROM conversations WHERE project_root = ? ORDER BY updated_at DESC\",\r\n projectRoot,\r\n ) as IConversationRow[])\r\n : (this.store.all(\r\n \"SELECT * FROM conversations ORDER BY updated_at DESC\",\r\n ) as IConversationRow[]);\r\n\r\n return rows.map((row) => this.mapConversationRow(row));\r\n }\r\n\r\n deleteConversation(id: string): void {\r\n this.store.run(\"DELETE FROM conversations WHERE id = ?\", id);\r\n logger.info({ conversationId: id }, \"Conversation deleted\");\r\n }\r\n\r\n addMessage(params: IAddMessageParams): IMessage {\r\n const toolCallsJson = params.toolCalls\r\n ? JSON.stringify(params.toolCalls)\r\n : null;\r\n const tokenUsageJson = params.tokenUsage\r\n ? JSON.stringify(params.tokenUsage)\r\n : null;\r\n\r\n const result = this.store.run(\r\n `INSERT INTO messages\r\n (conversation_id, role, model, provider, content, tool_calls, token_usage)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.role,\r\n params.model ?? null,\r\n params.provider ?? null,\r\n params.content,\r\n toolCallsJson,\r\n tokenUsageJson,\r\n );\r\n\r\n this.store.run(\r\n \"UPDATE conversations SET updated_at = datetime('now') WHERE id = ?\",\r\n params.conversationId,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM messages WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as IMessageRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created message\");\r\n }\r\n\r\n return this.mapMessageRow(row);\r\n }\r\n\r\n getMessages(\r\n conversationId: string,\r\n pagination?: IPaginationOptions,\r\n ): IMessage[] {\r\n const limit = pagination?.limit ?? 100;\r\n const offset = pagination?.offset ?? 0;\r\n\r\n const rows = this.store.all(\r\n `SELECT * FROM messages\r\n WHERE conversation_id = ?\r\n ORDER BY created_at ASC\r\n LIMIT ? OFFSET ?`,\r\n conversationId,\r\n limit,\r\n offset,\r\n ) as IMessageRow[];\r\n\r\n return rows.map((row) => this.mapMessageRow(row));\r\n }\r\n\r\n getMessageCount(conversationId: string): number {\r\n const result = this.store.get(\r\n \"SELECT COUNT(*) as count FROM messages WHERE conversation_id = ?\",\r\n conversationId,\r\n ) as { count: number } | undefined;\r\n return result?.count ?? 0;\r\n }\r\n\r\n addFileContext(params: IAddFileContextParams): IFileContext {\r\n const result = this.store.run(\r\n `INSERT INTO file_context\r\n (conversation_id, file_path, content_hash, token_count)\r\n VALUES (?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.filePath,\r\n params.contentHash ?? null,\r\n params.tokenCount ?? null,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM file_context WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as IFileContextRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created file context\");\r\n }\r\n\r\n return this.mapFileContextRow(row);\r\n }\r\n\r\n getFileContext(conversationId: string): IFileContext[] {\r\n const rows = this.store.all(\r\n \"SELECT * FROM file_context WHERE conversation_id = ? ORDER BY added_at DESC\",\r\n conversationId,\r\n ) as IFileContextRow[];\r\n return rows.map((row) => this.mapFileContextRow(row));\r\n }\r\n\r\n removeFileContext(conversationId: string, filePath: string): void {\r\n this.store.run(\r\n \"DELETE FROM file_context WHERE conversation_id = ? AND file_path = ?\",\r\n conversationId,\r\n filePath,\r\n );\r\n }\r\n\r\n addCost(params: IAddCostParams): ICostEntry {\r\n const result = this.store.run(\r\n `INSERT INTO cost_tracking\r\n (conversation_id, provider, model, role, input_tokens, output_tokens, cost_usd)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.provider,\r\n params.model,\r\n params.role ?? null,\r\n params.inputTokens ?? null,\r\n params.outputTokens ?? null,\r\n params.costUsd ?? null,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM cost_tracking WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as ICostRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created cost entry\");\r\n }\r\n\r\n return this.mapCostRow(row);\r\n }\r\n\r\n getConversationCost(conversationId: string): number {\r\n const result = this.store.get(\r\n \"SELECT SUM(cost_usd) as total FROM cost_tracking WHERE conversation_id = ?\",\r\n conversationId,\r\n ) as { total: number | null } | undefined;\r\n return result?.total ?? 0;\r\n }\r\n\r\n getCostBreakdown(conversationId: string): ICostEntry[] {\r\n const rows = this.store.all(\r\n \"SELECT * FROM cost_tracking WHERE conversation_id = ? ORDER BY created_at ASC\",\r\n conversationId,\r\n ) as ICostRow[];\r\n return rows.map((row) => this.mapCostRow(row));\r\n }\r\n\r\n // ── Private row mappers ─────────────────────────────────────────────\r\n\r\n private mapConversationRow(row: IConversationRow): IConversation {\r\n let metadata: Record<string, unknown> = {};\r\n try {\r\n metadata = JSON.parse(row.metadata) as Record<string, unknown>;\r\n } catch {\r\n metadata = {};\r\n }\r\n\r\n return {\r\n id: row.id,\r\n projectRoot: row.project_root,\r\n defaultModel: row.default_model,\r\n createdAt: row.created_at,\r\n updatedAt: row.updated_at,\r\n metadata,\r\n };\r\n }\r\n\r\n private mapMessageRow(row: IMessageRow): IMessage {\r\n let toolCalls: unknown[] | null = null;\r\n if (row.tool_calls) {\r\n try {\r\n toolCalls = JSON.parse(row.tool_calls) as unknown[];\r\n } catch {\r\n toolCalls = null;\r\n }\r\n }\r\n\r\n let tokenUsage: IStoredTokenUsage | null = null;\r\n if (row.token_usage) {\r\n try {\r\n tokenUsage = JSON.parse(row.token_usage) as IStoredTokenUsage;\r\n } catch {\r\n tokenUsage = null;\r\n }\r\n }\r\n\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n role: row.role as MessageRole,\r\n model: row.model,\r\n provider: row.provider as ProviderName | null,\r\n content: row.content,\r\n toolCalls,\r\n tokenUsage,\r\n createdAt: row.created_at,\r\n };\r\n }\r\n\r\n private mapFileContextRow(row: IFileContextRow): IFileContext {\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n filePath: row.file_path,\r\n contentHash: row.content_hash,\r\n tokenCount: row.token_count,\r\n addedAt: row.added_at,\r\n };\r\n }\r\n\r\n private mapCostRow(row: ICostRow): ICostEntry {\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n provider: row.provider,\r\n model: row.model,\r\n role: row.role,\r\n inputTokens: row.input_tokens,\r\n outputTokens: row.output_tokens,\r\n costUsd: row.cost_usd,\r\n createdAt: row.created_at,\r\n };\r\n }\r\n}\r\n"]}
|