aemeathcli 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +66 -54
- package/dist/App-JQ622M66.js +4431 -0
- package/dist/App-JQ622M66.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/auth-status-JQJOKUPF.js.map +1 -0
- package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/chunk-36RXCZOV.js +88 -0
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
- package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
- package/dist/chunk-BIMQL4AG.js +186 -0
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
- package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
- package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
- package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/chunk-LQBALETG.js +71 -0
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/chunk-M3FPQSRU.js +12 -0
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/chunk-NQEUK763.js +26 -0
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/chunk-OPWAFS6Y.js +38 -0
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/chunk-VNZ3YTQD.js +232 -0
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/chunk-XEXWX7C7.js +241 -0
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/chunk-YPQ2MLAV.js +140 -0
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/chunk-ZCOVMVK4.js +26 -0
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
- package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
- package/dist/cli.js +370 -171
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
- package/dist/codex-login-LW5X7GAM.js.map +1 -0
- package/dist/config-store-NF56VHFU.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/conversation-store-7GRDQZD2.js.map +1 -0
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/detect-providers-QICJ5U3R.js.map +1 -0
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/first-run-ADROZVYF.js +230 -0
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
- package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
- package/dist/index.d.ts +46 -70
- package/dist/index.js +79 -468
- package/dist/index.js.map +1 -1
- package/dist/input-history-BEICE7PT.js +57 -0
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
- package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/logger-KGHUQ4VE.js.map +1 -0
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/model-discovery-AAJDHRFO.js.map +1 -0
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/pathResolver-UVAB2FCW.js +3 -0
- package/dist/pathResolver-UVAB2FCW.js.map +1 -0
- package/dist/profile-loader-EMLV4J7S.js +162 -0
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/sqlite-store-7OECRTXM.js.map +1 -0
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/team-state-HZNVMQHT.js.map +1 -0
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +11 -11
- package/dist/App-FKRSMFMB.js +0 -2789
- package/dist/App-FKRSMFMB.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-RWCNNAL7.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js +0 -211
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js +0 -234
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
- package/dist/codex-login-GZIFXUWD.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js.map +0 -1
- package/dist/registry-AZ2LOHHJ.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-XOMDMC77.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CLI_PROVIDER_ORDER, getCliProviderEntry } from './chunk-LQBALETG.js';
|
|
2
|
+
import { spawnSync } from 'child_process';
|
|
3
|
+
|
|
4
|
+
function detectInstalledProviders() {
|
|
5
|
+
const available = [];
|
|
6
|
+
for (const provider of CLI_PROVIDER_ORDER) {
|
|
7
|
+
try {
|
|
8
|
+
const entry = getCliProviderEntry(provider);
|
|
9
|
+
const args = ["--version"];
|
|
10
|
+
const result = spawnSync(entry.binary, args, {
|
|
11
|
+
stdio: "ignore",
|
|
12
|
+
timeout: 5e3,
|
|
13
|
+
shell: process.platform === "win32"
|
|
14
|
+
});
|
|
15
|
+
if (result.status === 0) {
|
|
16
|
+
available.push(provider);
|
|
17
|
+
}
|
|
18
|
+
} catch {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return available;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { detectInstalledProviders };
|
|
25
|
+
//# sourceMappingURL=chunk-NQEUK763.js.map
|
|
26
|
+
//# sourceMappingURL=chunk-NQEUK763.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/orchestrator/utils/detect-providers.ts"],"names":[],"mappings":";;;AAsBO,SAAS,wBAAA,GAA8C;AAC5D,EAAA,MAAM,YAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,oBAAoB,QAAQ,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,CAAC,WAAW,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,QAC3C,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,GAAA;AAAA,QACT,KAAA,EAAO,QAAQ,QAAA,KAAa;AAAA,OAC7B,CAAA;AACD,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-NQEUK763.js","sourcesContent":["/**\n * Cross-platform CLI provider detection utility.\n *\n * Probes the system PATH for known AI CLI tools by running\n * `<tool> --version` with a 5-second timeout. Returns a list\n * of provider types that are available on the current machine.\n *\n * @see IMPLEMENT_PLAN.md Section 10\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport type { CliProviderType } from \"../constants.js\";\nimport { CLI_PROVIDER_ORDER, getCliProviderEntry } from \"./provider-catalog.js\";\n\n/**\n * Detect which CLI AI providers are installed on the system.\n *\n * Each provider is checked by running its version command. Only\n * providers that exit with status 0 are included in the result.\n *\n * @returns Array of installed CLI provider types.\n */\nexport function detectInstalledProviders(): CliProviderType[] {\n const available: CliProviderType[] = [];\n\n for (const provider of CLI_PROVIDER_ORDER) {\n try {\n const entry = getCliProviderEntry(provider);\n const args = [\"--version\"];\n const result = spawnSync(entry.binary, args, {\n stdio: \"ignore\",\n timeout: 5000,\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) {\n available.push(provider);\n }\n } catch {\n // Not installed — skip\n }\n }\n\n return available;\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { normalize, resolve, relative, isAbsolute } from 'path';
|
|
2
|
+
|
|
3
|
+
// src/utils/sanitizer.ts
|
|
4
|
+
function validatePath(filePath, projectRoot) {
|
|
5
|
+
const normalizedRoot = normalize(resolve(projectRoot));
|
|
6
|
+
const normalizedPath = normalize(resolve(normalizedRoot, filePath));
|
|
7
|
+
if (!isSubPath(normalizedRoot, normalizedPath)) {
|
|
8
|
+
throw new Error(
|
|
9
|
+
`Path traversal detected: "${filePath}" resolves outside project root "${projectRoot}"`
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
return normalizedPath;
|
|
13
|
+
}
|
|
14
|
+
function isPathAllowed(filePath, allowedPaths, projectRoot) {
|
|
15
|
+
const normalizedRoot = normalize(resolve(projectRoot));
|
|
16
|
+
const resolved = normalize(resolve(normalizedRoot, filePath));
|
|
17
|
+
return allowedPaths.some((allowed) => {
|
|
18
|
+
const resolvedAllowed = normalize(resolve(normalizedRoot, allowed));
|
|
19
|
+
return isSubPath(resolvedAllowed, resolved);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function isSubPath(basePath, candidatePath) {
|
|
23
|
+
const rel = relative(basePath, candidatePath);
|
|
24
|
+
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
25
|
+
}
|
|
26
|
+
function isCommandBlocked(command, blockedCommands) {
|
|
27
|
+
const normalizedCommand = command.trim().toLowerCase();
|
|
28
|
+
return blockedCommands.some(
|
|
29
|
+
(blocked) => normalizedCommand.includes(blocked.toLowerCase())
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function redactSecrets(text) {
|
|
33
|
+
return text.replace(/sk-ant-api\S+/g, "sk-ant-api[REDACTED]").replace(/sk-[a-zA-Z0-9]{20,}/g, "sk-[REDACTED]").replace(/AIza[a-zA-Z0-9_-]{35}/g, "AIza[REDACTED]").replace(/ghp_[a-zA-Z0-9]{36}/g, "ghp_[REDACTED]").replace(/Bearer\s+[a-zA-Z0-9._-]+/gi, "Bearer [REDACTED]");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { isCommandBlocked, isPathAllowed, redactSecrets, validatePath };
|
|
37
|
+
//# sourceMappingURL=chunk-OPWAFS6Y.js.map
|
|
38
|
+
//# sourceMappingURL=chunk-OPWAFS6Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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-OPWAFS6Y.js","sourcesContent":["/**\n * Input/output sanitization per PRD section 14.2\n * Zero trust for AI output — treat all model-generated content as untrusted\n */\n\nimport { isAbsolute, normalize, relative, resolve } from \"node:path\";\n\n/**\n * Sanitize shell command arguments to prevent injection.\n * PRD REQ: NO shell injection (section 14.1, 15.7 item 10)\n */\nexport function sanitizeShellArg(arg: string): string {\n // Escape single quotes by replacing them with escaped version\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Validate a file path is within the allowed project root.\n * Prevents directory traversal attacks (PRD section 14.1).\n */\nexport function validatePath(filePath: string, projectRoot: string): string {\n const normalizedRoot = normalize(resolve(projectRoot));\n const normalizedPath = normalize(resolve(normalizedRoot, filePath));\n\n if (!isSubPath(normalizedRoot, normalizedPath)) {\n throw new Error(\n `Path traversal detected: \"${filePath}\" resolves outside project root \"${projectRoot}\"`,\n );\n }\n\n return normalizedPath;\n}\n\n/**\n * Check if a path is safe (within allowed paths).\n */\nexport function isPathAllowed(\n filePath: string,\n allowedPaths: readonly string[],\n projectRoot: string,\n): boolean {\n const normalizedRoot = normalize(resolve(projectRoot));\n const resolved = normalize(resolve(normalizedRoot, filePath));\n return allowedPaths.some((allowed) => {\n const resolvedAllowed = normalize(resolve(normalizedRoot, allowed));\n return isSubPath(resolvedAllowed, resolved);\n });\n}\n\nfunction isSubPath(basePath: string, candidatePath: string): boolean {\n const rel = relative(basePath, candidatePath);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\n/**\n * Check if a shell command is on the blocked list.\n * PRD section 14.4: Dangerous commands always require confirmation.\n */\nexport function isCommandBlocked(\n command: string,\n blockedCommands: readonly string[],\n): boolean {\n const normalizedCommand = command.trim().toLowerCase();\n return blockedCommands.some((blocked) =>\n normalizedCommand.includes(blocked.toLowerCase()),\n );\n}\n\n/**\n * Redact potential secrets from text for logging.\n */\nexport function redactSecrets(text: string): string {\n return text\n .replace(/sk-ant-api\\S+/g, \"sk-ant-api[REDACTED]\")\n .replace(/sk-[a-zA-Z0-9]{20,}/g, \"sk-[REDACTED]\")\n .replace(/AIza[a-zA-Z0-9_-]{35}/g, \"AIza[REDACTED]\")\n .replace(/ghp_[a-zA-Z0-9]{36}/g, \"ghp_[REDACTED]\")\n .replace(/Bearer\\s+[a-zA-Z0-9._-]+/gi, \"Bearer [REDACTED]\");\n}\n\n/**\n * Sanitize user input for safe inclusion in prompts.\n */\nexport function sanitizePromptInput(input: string): string {\n // Strip null bytes\n return input.replace(/\\0/g, \"\");\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getModelInfo } from './chunk-VNZ3YTQD.js';
|
|
2
2
|
import { ModelNotFoundError, AuthenticationError } from './chunk-ZGOHARPV.js';
|
|
3
|
-
import {
|
|
3
|
+
import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
|
|
4
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
4
5
|
import { randomUUID } from 'crypto';
|
|
5
6
|
import { execa } from 'execa';
|
|
6
7
|
|
|
@@ -40,13 +41,7 @@ function toJsonLines(output) {
|
|
|
40
41
|
function buildPrompt(request) {
|
|
41
42
|
const latestUser = [...request.messages].reverse().find((message) => message.role === "user");
|
|
42
43
|
const fallbackLast = request.messages.length > 0 ? request.messages[request.messages.length - 1] : void 0;
|
|
43
|
-
|
|
44
|
-
if (request.system !== void 0 && request.system.length > 0) {
|
|
45
|
-
return `${request.system}
|
|
46
|
-
|
|
47
|
-
${latestPrompt}`.trim();
|
|
48
|
-
}
|
|
49
|
-
return latestPrompt;
|
|
44
|
+
return latestUser?.content ?? fallbackLast?.content ?? "";
|
|
50
45
|
}
|
|
51
46
|
function computeCost(modelInfo, inputTokens, outputTokens) {
|
|
52
47
|
return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
|
|
@@ -60,11 +55,12 @@ function classifyCliError(provider, error) {
|
|
|
60
55
|
return error instanceof Error ? error : new Error(message);
|
|
61
56
|
}
|
|
62
57
|
var BaseNativeCLIAdapter = class {
|
|
58
|
+
supportsToolCalling = false;
|
|
63
59
|
async chat(request) {
|
|
64
60
|
const modelInfo = this.getModelInfo(request.model);
|
|
65
61
|
const prompt = buildPrompt(request);
|
|
66
62
|
try {
|
|
67
|
-
const result = await this.runCLI(request.model, prompt);
|
|
63
|
+
const result = await this.runCLI(request.model, prompt, request.system);
|
|
68
64
|
const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
69
65
|
const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
70
66
|
const usage = {
|
|
@@ -109,18 +105,18 @@ var BaseNativeCLIAdapter = class {
|
|
|
109
105
|
yield { type: "done" };
|
|
110
106
|
}
|
|
111
107
|
}
|
|
112
|
-
|
|
113
|
-
return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
108
|
+
countTokens(text, _model) {
|
|
109
|
+
return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
|
|
114
110
|
}
|
|
115
111
|
getModelInfo(model) {
|
|
116
|
-
const info = SUPPORTED_MODELS[model];
|
|
112
|
+
const info = SUPPORTED_MODELS[model] ?? getModelInfo(model);
|
|
117
113
|
if (info === void 0 || info.provider !== this.name) {
|
|
118
114
|
throw new ModelNotFoundError(model);
|
|
119
115
|
}
|
|
120
116
|
return info;
|
|
121
117
|
}
|
|
122
|
-
|
|
123
|
-
return [...this.supportedModels];
|
|
118
|
+
listAvailableModels() {
|
|
119
|
+
return Promise.resolve([...this.supportedModels]);
|
|
124
120
|
}
|
|
125
121
|
};
|
|
126
122
|
var ClaudeNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
@@ -132,10 +128,30 @@ var ClaudeNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
|
132
128
|
"claude-sonnet-4-6-1m",
|
|
133
129
|
"claude-haiku-4-5"
|
|
134
130
|
];
|
|
135
|
-
|
|
131
|
+
/** Map internal model IDs to valid Claude CLI model IDs. */
|
|
132
|
+
toCLIModelId(model) {
|
|
133
|
+
return model.replace(/-1m$/, "");
|
|
134
|
+
}
|
|
135
|
+
async runCLI(model, prompt, systemPrompt) {
|
|
136
|
+
const cliModel = this.toCLIModelId(model);
|
|
137
|
+
const args = [
|
|
138
|
+
"-p",
|
|
139
|
+
"--output-format",
|
|
140
|
+
"json",
|
|
141
|
+
"--model",
|
|
142
|
+
cliModel,
|
|
143
|
+
// Skip project CLAUDE.md to avoid loading huge project instructions
|
|
144
|
+
// that make Claude think it's Claude Code doing a codebase audit
|
|
145
|
+
"--setting-sources",
|
|
146
|
+
"user"
|
|
147
|
+
];
|
|
148
|
+
if (systemPrompt && systemPrompt.length > 0) {
|
|
149
|
+
args.push("--system-prompt", systemPrompt);
|
|
150
|
+
}
|
|
151
|
+
args.push(prompt);
|
|
136
152
|
const { stdout } = await execa(
|
|
137
153
|
"claude",
|
|
138
|
-
|
|
154
|
+
args,
|
|
139
155
|
{
|
|
140
156
|
timeout: CLI_TIMEOUT_MS,
|
|
141
157
|
stdin: "ignore",
|
|
@@ -169,8 +185,11 @@ var CodexNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
|
169
185
|
"gpt-5.2",
|
|
170
186
|
"gpt-5.1-codex-mini"
|
|
171
187
|
];
|
|
172
|
-
async runCLI(model, prompt) {
|
|
188
|
+
async runCLI(model, prompt, systemPrompt) {
|
|
173
189
|
const sandbox = process.env["AEMEATHCLI_CODEX_SANDBOX"] ?? "read-only";
|
|
190
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}
|
|
191
|
+
|
|
192
|
+
${prompt}` : prompt;
|
|
174
193
|
const { stdout } = await execa(
|
|
175
194
|
"codex",
|
|
176
195
|
[
|
|
@@ -180,7 +199,7 @@ var CodexNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
|
180
199
|
"--json",
|
|
181
200
|
"--model",
|
|
182
201
|
model,
|
|
183
|
-
|
|
202
|
+
fullPrompt
|
|
184
203
|
],
|
|
185
204
|
{
|
|
186
205
|
timeout: CLI_TIMEOUT_MS,
|
|
@@ -229,12 +248,15 @@ var GeminiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
|
229
248
|
"gemini-2.5-flash",
|
|
230
249
|
"gemini-2.5-flash-lite"
|
|
231
250
|
];
|
|
232
|
-
async runCLI(model, prompt) {
|
|
251
|
+
async runCLI(model, prompt, systemPrompt) {
|
|
252
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}
|
|
253
|
+
|
|
254
|
+
${prompt}` : prompt;
|
|
233
255
|
const { stdout } = await execa(
|
|
234
256
|
"gemini",
|
|
235
257
|
[
|
|
236
258
|
"-p",
|
|
237
|
-
|
|
259
|
+
fullPrompt,
|
|
238
260
|
"--model",
|
|
239
261
|
model,
|
|
240
262
|
"--output-format",
|
|
@@ -281,10 +303,13 @@ var GeminiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
|
281
303
|
var KimiNativeCLIAdapter = class extends BaseNativeCLIAdapter {
|
|
282
304
|
name = "kimi";
|
|
283
305
|
supportedModels = ["kimi-for-coding"];
|
|
284
|
-
async runCLI(_model, prompt) {
|
|
306
|
+
async runCLI(_model, prompt, systemPrompt) {
|
|
307
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}
|
|
308
|
+
|
|
309
|
+
${prompt}` : prompt;
|
|
285
310
|
const { stdout } = await execa(
|
|
286
311
|
"kimi",
|
|
287
|
-
["--print", "--output-format", "stream-json", "-p",
|
|
312
|
+
["--print", "--output-format", "stream-json", "-p", fullPrompt],
|
|
288
313
|
{
|
|
289
314
|
timeout: CLI_TIMEOUT_MS,
|
|
290
315
|
stdin: "ignore",
|
|
@@ -321,5 +346,5 @@ function logNativeAdapterSelection(provider) {
|
|
|
321
346
|
}
|
|
322
347
|
|
|
323
348
|
export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter, logNativeAdapterSelection };
|
|
324
|
-
//# sourceMappingURL=chunk-
|
|
325
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-PS4WEFW6.js.map
|
|
350
|
+
//# sourceMappingURL=chunk-PS4WEFW6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/native-cli-adapters.ts"],"names":[],"mappings":"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","file":"chunk-PS4WEFW6.js","sourcesContent":["/**\n * Native CLI-backed provider adapters.\n * Uses official provider CLIs in non-interactive mode when credentials come from native login.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport {\n AuthenticationError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport { getModelInfo as getDynamicModelInfo } from \"./model-discovery.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatMessage,\n IChatRequest,\n IChatResponse,\n IStreamChunk,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider } from \"./types.js\";\n\ninterface ICLIResult {\n readonly text: string;\n readonly inputTokens?: number | undefined;\n readonly outputTokens?: number | undefined;\n readonly finishReason?: IChatResponse[\"finishReason\"] | undefined;\n}\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\n/**\n * Resolve CLI timeout from environment. Default is 0 (no timeout) so that\n * long-running agent tasks are never prematurely killed.\n * Set AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS to a positive integer to enforce a limit.\n */\nfunction resolveCliTimeoutMs(): number {\n const raw = process.env[\"AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS\"];\n if (raw === undefined) {\n return 0;\n }\n\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return 0;\n }\n\n return parsed;\n}\n\nconst CLI_TIMEOUT_MS = resolveCliTimeoutMs();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction toJsonLines(output: string): unknown[] {\n const lines = output\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && line.startsWith(\"{\"));\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line) as unknown);\n } catch {\n // Ignore non-JSON lines\n }\n }\n return parsed;\n}\n\nfunction buildPrompt(request: IChatRequest): string {\n // Extract only the user message text — system prompt is passed separately\n // via the provider's native --system-prompt flag.\n const latestUser = [...request.messages]\n .reverse()\n .find((message) => message.role === \"user\");\n const fallbackLast = request.messages.length > 0\n ? request.messages[request.messages.length - 1]\n : undefined;\n\n return latestUser?.content ?? fallbackLast?.content ?? \"\";\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyCliError(provider: ProviderName, error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n\n if (\n lower.includes(\"login\")\n || lower.includes(\"credential\")\n || lower.includes(\"authentication\")\n || lower.includes(\"unauthorized\")\n || lower.includes(\"forbidden\")\n || lower.includes(\"api key\")\n || lower.includes(\"token\")\n ) {\n return new AuthenticationError(provider, message);\n }\n\n return error instanceof Error ? error : new Error(message);\n}\n\nabstract class BaseNativeCLIAdapter implements IModelProvider {\n abstract readonly name: ProviderName;\n abstract readonly supportedModels: readonly string[];\n readonly supportsToolCalling = false;\n\n protected abstract runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult>;\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const prompt = buildPrompt(request);\n\n try {\n const result = await this.runCLI(request.model, prompt, request.system);\n\n const inputTokens = result.inputTokens ?? Math.ceil(prompt.length / CHARS_PER_TOKEN_ESTIMATE);\n const outputTokens = result.outputTokens ?? Math.ceil(result.text.length / CHARS_PER_TOKEN_ESTIMATE);\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: this.name,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: randomUUID(),\n model: request.model,\n provider: this.name,\n message: responseMessage,\n usage,\n finishReason: result.finishReason ?? \"stop\",\n };\n } catch (error: unknown) {\n throw classifyCliError(this.name, error);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n try {\n const response = await this.chat(request);\n if (response.message.content.length > 0) {\n yield { type: \"text\", content: response.message.content };\n }\n yield { type: \"usage\", usage: response.usage };\n yield { type: \"done\" };\n } catch (error: unknown) {\n // Execa errors can include raw stdout/stderr in the message.\n // Truncate to prevent raw CLI protocol output from leaking through.\n const rawMsg = error instanceof Error ? error.message : String(error);\n const truncated = rawMsg.length > 500 ? rawMsg.slice(0, 500) + \"...\" : rawMsg;\n yield { type: \"error\", error: truncated };\n yield { type: \"done\" };\n }\n }\n\n countTokens(text: string, _model: string): Promise<number> {\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\n }\n\n getModelInfo(model: string): IModelInfo {\n // Check hardcoded registry first, then dynamic discovery\n const info = SUPPORTED_MODELS[model] ?? getDynamicModelInfo(model);\n if (info === undefined || info.provider !== this.name) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n listAvailableModels(): Promise<readonly string[]> {\n return Promise.resolve([...this.supportedModels]);\n }\n}\n\nexport class ClaudeNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"anthropic\";\n readonly supportedModels = [\n \"claude-opus-4-6\",\n \"claude-opus-4-6-1m\",\n \"claude-sonnet-4-6\",\n \"claude-sonnet-4-6-1m\",\n \"claude-haiku-4-5\",\n ] as const;\n\n /** Map internal model IDs to valid Claude CLI model IDs. */\n private toCLIModelId(model: string): string {\n // The Claude CLI doesn't recognize the \"-1m\" context suffix.\n // Strip it — the API handles context window sizing automatically.\n return model.replace(/-1m$/, \"\");\n }\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n const cliModel = this.toCLIModelId(model);\n const args = [\n \"-p\",\n \"--output-format\", \"json\",\n \"--model\", cliModel,\n // Skip project CLAUDE.md to avoid loading huge project instructions\n // that make Claude think it's Claude Code doing a codebase audit\n \"--setting-sources\", \"user\",\n ];\n\n if (systemPrompt && systemPrompt.length > 0) {\n args.push(\"--system-prompt\", systemPrompt);\n }\n\n args.push(prompt);\n\n const { stdout } = await execa(\n \"claude\",\n args,\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const lastJson = lines.length > 0 ? lines[lines.length - 1] : undefined;\n\n if (!isRecord(lastJson)) {\n throw new Error(\"Claude CLI returned no JSON result\");\n }\n\n const text = asString(lastJson[\"result\"]) ?? \"\";\n const usage = isRecord(lastJson[\"usage\"]) ? lastJson[\"usage\"] : undefined;\n const inputTokens = usage ? asNumber(usage[\"input_tokens\"]) : undefined;\n const outputTokens = usage ? asNumber(usage[\"output_tokens\"]) : undefined;\n\n return {\n text,\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class CodexNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"openai\";\n readonly supportedModels = [\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-spark\",\n \"gpt-5.2-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.1-codex-mini\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n // Allow agent panes to set a writable sandbox so codex can write to the\n // shared board directory. Default to \"read-only\" for normal usage.\n const sandbox = process.env[\"AEMEATHCLI_CODEX_SANDBOX\"] ?? \"read-only\";\n // Prepend system prompt for Codex (no native --system-prompt flag)\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"codex\",\n [\n \"exec\",\n \"--skip-git-repo-check\",\n ...(sandbox !== \"none\" ? [\"--sandbox\", sandbox] : []),\n \"--json\",\n \"--model\",\n model,\n fullPrompt,\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n const textParts: string[] = [];\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"item.completed\") {\n const item = isRecord(line[\"item\"]) ? line[\"item\"] : undefined;\n if (item && asString(item[\"type\"]) === \"agent_message\") {\n const text = asString(item[\"text\"]);\n if (text && text.length > 0) {\n textParts.push(text);\n }\n }\n }\n\n if (type === \"turn.completed\") {\n const usage = isRecord(line[\"usage\"]) ? line[\"usage\"] : undefined;\n if (usage) {\n inputTokens = asNumber(usage[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(usage[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: textParts.join(\"\\n\").trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class GeminiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"google\";\n readonly supportedModels = [\n \"gemini-3-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n ] as const;\n\n protected async runCLI(model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n // Prepend system prompt for Gemini (no native --system-prompt flag)\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"gemini\",\n [\n \"-p\",\n fullPrompt,\n \"--model\",\n model,\n \"--output-format\",\n \"stream-json\",\n \"--approval-mode\",\n \"yolo\",\n ],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n const type = asString(line[\"type\"]);\n\n if (type === \"message\" && asString(line[\"role\"]) === \"assistant\") {\n const content = asString(line[\"content\"]);\n if (content !== undefined) {\n const delta = line[\"delta\"] === true;\n text = delta ? `${text}${content}` : content;\n }\n }\n\n if (type === \"result\") {\n const stats = isRecord(line[\"stats\"]) ? line[\"stats\"] : undefined;\n if (stats) {\n inputTokens = asNumber(stats[\"input_tokens\"]) ?? inputTokens;\n outputTokens = asNumber(stats[\"output_tokens\"]) ?? outputTokens;\n }\n }\n }\n\n return {\n text: text.trim(),\n inputTokens,\n outputTokens,\n finishReason: \"stop\",\n };\n }\n}\n\nexport class KimiNativeCLIAdapter extends BaseNativeCLIAdapter {\n readonly name: ProviderName = \"kimi\";\n readonly supportedModels = [\"kimi-for-coding\"] as const;\n\n protected async runCLI(_model: string, prompt: string, systemPrompt?: string): Promise<ICLIResult> {\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const { stdout } = await execa(\n \"kimi\",\n [\"--print\", \"--output-format\", \"stream-json\", \"-p\", fullPrompt],\n {\n timeout: CLI_TIMEOUT_MS,\n stdin: \"ignore\",\n env: { ...process.env, NO_COLOR: \"1\" },\n },\n );\n\n const lines = toJsonLines(stdout);\n let text = \"\";\n\n for (const line of lines) {\n if (!isRecord(line)) continue;\n if (asString(line[\"role\"]) !== \"assistant\") continue;\n\n const content = line[\"content\"];\n if (!Array.isArray(content)) continue;\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!isRecord(part)) continue;\n if (asString(part[\"type\"]) === \"text\") {\n const piece = asString(part[\"text\"]);\n if (piece) textParts.push(piece);\n }\n }\n\n if (textParts.length > 0) {\n text = textParts.join(\"\");\n }\n }\n\n return {\n text: text.trim(),\n finishReason: \"stop\",\n };\n }\n}\n\nexport function logNativeAdapterSelection(provider: ProviderName): void {\n logger.info({ provider }, \"Using native CLI adapter\");\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getEventBus } from './chunk-YL5XFHR3.js';
|
|
2
|
-
import { getIPCSocketPath, getTasksDir, ensureDirectory, getTeamsDir } from './chunk-NBR3GHMT.js';
|
|
3
2
|
import { AgentSpawnError } from './chunk-ZGOHARPV.js';
|
|
4
|
-
import { logger } from './chunk-
|
|
3
|
+
import { logger } from './chunk-IR5HLBMH.js';
|
|
4
|
+
import { getIPCSocketPath, getTasksDir, ensureDirectory, getTeamsDir } from './chunk-D275MCIH.js';
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import { writeFileSync, renameSync, unlinkSync, existsSync, readFileSync, readdirSync, rmSync } from 'fs';
|
|
7
7
|
import { randomUUID } from 'crypto';
|
|
@@ -9,6 +9,49 @@ import { fork } from 'child_process';
|
|
|
9
9
|
|
|
10
10
|
var DEFAULT_SHUTDOWN_TIMEOUT_MS = 1e4;
|
|
11
11
|
var DEFAULT_REGISTRATION_TIMEOUT_MS = 15e3;
|
|
12
|
+
var BASE_ENV_KEYS = [
|
|
13
|
+
"PATH",
|
|
14
|
+
"HOME",
|
|
15
|
+
"SHELL",
|
|
16
|
+
"TERM",
|
|
17
|
+
"TMPDIR",
|
|
18
|
+
"TMP",
|
|
19
|
+
"TEMP",
|
|
20
|
+
"LANG",
|
|
21
|
+
"LC_ALL",
|
|
22
|
+
"LC_CTYPE",
|
|
23
|
+
"USER",
|
|
24
|
+
"LOGNAME",
|
|
25
|
+
"PWD",
|
|
26
|
+
"XDG_CONFIG_HOME",
|
|
27
|
+
"XDG_CACHE_HOME",
|
|
28
|
+
"XDG_DATA_HOME",
|
|
29
|
+
"APPDATA",
|
|
30
|
+
"LOCALAPPDATA",
|
|
31
|
+
"PROGRAMDATA",
|
|
32
|
+
"SYSTEMROOT",
|
|
33
|
+
"COMSPEC",
|
|
34
|
+
"PATHEXT",
|
|
35
|
+
"COLORTERM",
|
|
36
|
+
"CI",
|
|
37
|
+
"NO_COLOR",
|
|
38
|
+
"FORCE_COLOR",
|
|
39
|
+
"HTTP_PROXY",
|
|
40
|
+
"HTTPS_PROXY",
|
|
41
|
+
"NO_PROXY",
|
|
42
|
+
"SSH_AUTH_SOCK"
|
|
43
|
+
];
|
|
44
|
+
var FORWARDED_ENV_PREFIXES = [
|
|
45
|
+
"AEMEATHCLI_",
|
|
46
|
+
"ANTHROPIC_",
|
|
47
|
+
"OPENAI_",
|
|
48
|
+
"GOOGLE_",
|
|
49
|
+
"GEMINI_",
|
|
50
|
+
"MOONSHOT_",
|
|
51
|
+
"KIMI_",
|
|
52
|
+
"OLLAMA_",
|
|
53
|
+
"NODE_"
|
|
54
|
+
];
|
|
12
55
|
var AgentProcess = class {
|
|
13
56
|
config;
|
|
14
57
|
teamName;
|
|
@@ -51,21 +94,7 @@ var AgentProcess = class {
|
|
|
51
94
|
this.config.role
|
|
52
95
|
];
|
|
53
96
|
const socketPath = getIPCSocketPath(this.sessionId);
|
|
54
|
-
const env =
|
|
55
|
-
...process.env,
|
|
56
|
-
...this.customEnv,
|
|
57
|
-
AEMEATHCLI_AGENT_MODE: "1",
|
|
58
|
-
AEMEATHCLI_TEAM_NAME: this.teamName,
|
|
59
|
-
AEMEATHCLI_AGENT_ID: this.config.agentId,
|
|
60
|
-
AEMEATHCLI_AGENT_NAME: this.config.name,
|
|
61
|
-
AEMEATHCLI_IPC_SOCKET: socketPath,
|
|
62
|
-
// Prefer SDK adapters when API keys are available (not OAuth/native login).
|
|
63
|
-
// Native login credentials always use native CLI adapters regardless of
|
|
64
|
-
// this flag — the registry enforces this to avoid "invalid API key" errors.
|
|
65
|
-
AEMEATHCLI_PREFER_SDK: "1",
|
|
66
|
-
// Increase timeout for native CLI fallback (agent tasks can be long).
|
|
67
|
-
AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS: "300000"
|
|
68
|
-
};
|
|
97
|
+
const env = this.buildChildEnv(socketPath);
|
|
69
98
|
try {
|
|
70
99
|
this.child = fork(this.cliEntryPoint, args, {
|
|
71
100
|
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
@@ -96,6 +125,30 @@ var AgentProcess = class {
|
|
|
96
125
|
throw new AgentSpawnError(this.config.name, reason);
|
|
97
126
|
}
|
|
98
127
|
}
|
|
128
|
+
buildChildEnv(socketPath) {
|
|
129
|
+
const env = {
|
|
130
|
+
...pickInheritedEnv(process.env),
|
|
131
|
+
...this.customEnv,
|
|
132
|
+
AEMEATHCLI_AGENT_MODE: "1",
|
|
133
|
+
AEMEATHCLI_TEAM_NAME: this.teamName,
|
|
134
|
+
AEMEATHCLI_AGENT_ID: this.config.agentId,
|
|
135
|
+
AEMEATHCLI_AGENT_NAME: this.config.name,
|
|
136
|
+
AEMEATHCLI_IPC_SOCKET: socketPath,
|
|
137
|
+
// Prefer SDK adapters when API keys are available (not OAuth/native login).
|
|
138
|
+
// Native login credentials always use native CLI adapters regardless of
|
|
139
|
+
// this flag — the registry enforces this to avoid "invalid API key" errors.
|
|
140
|
+
AEMEATHCLI_PREFER_SDK: "1",
|
|
141
|
+
// Increase timeout for native CLI fallback (agent tasks can be long).
|
|
142
|
+
AEMEATHCLI_NATIVE_CLI_TIMEOUT_MS: "300000"
|
|
143
|
+
};
|
|
144
|
+
const sanitized = {};
|
|
145
|
+
for (const [key, value] of Object.entries(env)) {
|
|
146
|
+
if (typeof value === "string" && value.length > 0) {
|
|
147
|
+
sanitized[key] = value;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return sanitized;
|
|
151
|
+
}
|
|
99
152
|
/** Gracefully stop the agent. Falls back to SIGTERM after timeout. */
|
|
100
153
|
async stop() {
|
|
101
154
|
if (!this.child) return;
|
|
@@ -298,6 +351,24 @@ var AgentProcess = class {
|
|
|
298
351
|
this.messageCallbacks.clear();
|
|
299
352
|
}
|
|
300
353
|
};
|
|
354
|
+
function pickInheritedEnv(env) {
|
|
355
|
+
const filtered = {};
|
|
356
|
+
for (const key of BASE_ENV_KEYS) {
|
|
357
|
+
const value = env[key];
|
|
358
|
+
if (typeof value === "string" && value.length > 0) {
|
|
359
|
+
filtered[key] = value;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
for (const [key, value] of Object.entries(env)) {
|
|
363
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
if (FORWARDED_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))) {
|
|
367
|
+
filtered[key] = value;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return filtered;
|
|
371
|
+
}
|
|
301
372
|
function isIPCMessage(value) {
|
|
302
373
|
if (typeof value !== "object" || value === null) return false;
|
|
303
374
|
const obj = value;
|
|
@@ -786,7 +857,7 @@ var TEAM_NAME_PATTERN = /^[\w-]+$/;
|
|
|
786
857
|
var TeamManager = class {
|
|
787
858
|
activeTeams = /* @__PURE__ */ new Map();
|
|
788
859
|
/** Create a new team: config, directories, and agent process handles. */
|
|
789
|
-
|
|
860
|
+
createTeam(name, options) {
|
|
790
861
|
if (this.activeTeams.has(name)) {
|
|
791
862
|
throw new Error(`Team already exists: ${name}`);
|
|
792
863
|
}
|
|
@@ -826,7 +897,8 @@ var TeamManager = class {
|
|
|
826
897
|
const processOptions = {
|
|
827
898
|
teamName: name,
|
|
828
899
|
sessionId,
|
|
829
|
-
cliEntryPoint: options.cliEntryPoint
|
|
900
|
+
cliEntryPoint: options.cliEntryPoint,
|
|
901
|
+
...options.agentEnv !== void 0 ? { env: options.agentEnv } : {}
|
|
830
902
|
};
|
|
831
903
|
const agentProcess = new AgentProcess(member, processOptions);
|
|
832
904
|
processes.set(member.name, agentProcess);
|
|
@@ -1027,5 +1099,5 @@ var TeamManager = class {
|
|
|
1027
1099
|
};
|
|
1028
1100
|
|
|
1029
1101
|
export { AgentProcess, MessageBus, PlanApproval, TaskStore, TeamManager };
|
|
1030
|
-
//# sourceMappingURL=chunk-
|
|
1031
|
-
//# sourceMappingURL=chunk-
|
|
1102
|
+
//# sourceMappingURL=chunk-QK7TKNHV.js.map
|
|
1103
|
+
//# sourceMappingURL=chunk-QK7TKNHV.js.map
|