agim-cli 1.2.140 → 1.2.142
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/CHANGELOG.md +160 -0
- package/dist/core/llm/registry.d.ts.map +1 -1
- package/dist/core/llm/registry.js +9 -1
- package/dist/core/llm/registry.js.map +1 -1
- package/dist/core/llm/secrets.d.ts +29 -3
- package/dist/core/llm/secrets.d.ts.map +1 -1
- package/dist/core/llm/secrets.js +114 -5
- package/dist/core/llm/secrets.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +40 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +247 -150
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/web/llm-api.js +12 -2
- package/dist/web/llm-api.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,166 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.142] - 2026-06-04
|
|
8
|
+
|
|
9
|
+
### Changed (unhappy turn → 阶段性报告,不再吐工具计数)
|
|
10
|
+
|
|
11
|
+
用户反馈:当一轮 native turn 没正常收尾(最大步数、卡循环、空文本、
|
|
12
|
+
偏离目标)时,agim 会回一段「✓ tool ×N / ✗ tool ×M / 最后一步……要
|
|
13
|
+
继续吗:a) 继续 b) 拆任务 c) 调大上限」的**技术诊断模板**。这套对开发
|
|
14
|
+
调试有用,对用户没用——失败几次跑了什么工具完全不是用户关心的,
|
|
15
|
+
他要的是"**做到啥了、卡在哪、下一步咋办**"。
|
|
16
|
+
|
|
17
|
+
特别是失败率高的场景(例:v1.2.139 后用户碰到 29 次工具调用 14 次失
|
|
18
|
+
败的 turn),技术模板把"半残但有用"的中间结果完全埋没。
|
|
19
|
+
|
|
20
|
+
#### 改了什么
|
|
21
|
+
|
|
22
|
+
新加 `tryStageReport()`:用户委托做了 X,按"成功的中间结果 / 失败的卡点
|
|
23
|
+
/ 下一步建议"三节给一份**阶段性报告**,硬约束 prompt 禁止列工具名、禁
|
|
24
|
+
止把失败粉饰成完成、禁止再调工具。
|
|
25
|
+
|
|
26
|
+
所有 unhappy turn 分支(empty / max_iter / stuck_loop / off_track)都
|
|
27
|
+
先跑一次 `tryStageReport`,成功就用它的文字。**老的技术 recap
|
|
28
|
+
(composeUnfinishedTurnRecap / composeOffTrackRecap)降级为最后兜底**
|
|
29
|
+
——只在 stage report 自己也失败/返回空时才用。
|
|
30
|
+
|
|
31
|
+
#### Prompt 设计
|
|
32
|
+
|
|
33
|
+
- **系统消息**:明确说"用户委托你做了某项任务,你做了一些工作但没
|
|
34
|
+
正常收尾。请按三节给阶段性报告——已经做到/没做到/下一步建议。"
|
|
35
|
+
- **失败描述要求人话**:不能写 "`native_web_fetch` ×8 failed",要写
|
|
36
|
+
"新浪财经页面抓不到(疑似反爬)"。系统消息里 ban 掉 `native_xxx`
|
|
37
|
+
和 `mcp__imhub__xxx` 字面字符串。
|
|
38
|
+
- **下一步软约束**:1-3 个具体可执行建议("继续 / 换数据源 / 缩小范
|
|
39
|
+
围 / 终止"),让模型自然挑词,不强制 a/b/c 选项格式。
|
|
40
|
+
- **off_track 模式**:critic 给的 reason / redirect 注入到 prompt 的
|
|
41
|
+
「偏离原因」段,让 stage report 在解释卡点时能借力。
|
|
42
|
+
|
|
43
|
+
#### 工程细节
|
|
44
|
+
|
|
45
|
+
- `tryStageReport` 输入:`{ prompt, result, provider, kind,
|
|
46
|
+
offTrackReason?, model?, signal?, sessionId }`,返回
|
|
47
|
+
`{ text, costUsd } | null`
|
|
48
|
+
- 单次 LLM 调用,60s 硬超时,**不带 tools**(不会再调任何工具)
|
|
49
|
+
- 把 `result.toolCalls.slice(-20)` 分成 success / failed 两组分别喂
|
|
50
|
+
——成功的截 300 字预览,失败的截 200 字(错误一般短)
|
|
51
|
+
- 返回的 `costUsd` 累加到 turn 总 cost,audit row 跟着算对
|
|
52
|
+
- env `IMHUB_NATIVE_STAGE_REPORT=off` 全局禁用,回退到老的纯技术
|
|
53
|
+
recap,调试用
|
|
54
|
+
|
|
55
|
+
#### 兼容性
|
|
56
|
+
|
|
57
|
+
- 老的 `composeUnfinishedTurnRecap` / `composeOffTrackRecap` 保留——
|
|
58
|
+
stage report 失败时仍走老路,所以失败模式不会变更差
|
|
59
|
+
- 0 次 tool 调用的空轮直接走老 recap 的「没说话也没动工具」分支
|
|
60
|
+
(没素材给 stage report)
|
|
61
|
+
- audit row 的 `responseLen` 现在用 body.length 而不是 result.text.length
|
|
62
|
+
——因为 body 可能是 stage report 文字,跟 result.text 不同了
|
|
63
|
+
|
|
64
|
+
#### 测试
|
|
65
|
+
|
|
66
|
+
`test/unit/native-stage-report.test.ts` 8 case 全绿:
|
|
67
|
+
- provider 成功返回 → text + costUsd 都正确
|
|
68
|
+
- 不带 tools 调用 provider(确保 retry 不会再触发工具)
|
|
69
|
+
- 成功 / 失败 preview 正确分到两个 context 块
|
|
70
|
+
- 系统 prompt 包含 ban tool-name 字样
|
|
71
|
+
- off_track reason 注入到 user prompt
|
|
72
|
+
- provider 返回空 → null(caller 走老 recap)
|
|
73
|
+
- provider 抛错 → null(不外抛)
|
|
74
|
+
- `IMHUB_NATIVE_STAGE_REPORT=off` → 不调 provider,直接 null
|
|
75
|
+
|
|
76
|
+
### 文件
|
|
77
|
+
|
|
78
|
+
- `src/plugins/agents/native/index.ts` — 删除 v1.2.94 empty-only 块;
|
|
79
|
+
新增 `tryStageReport` + `isStageReportDisabled`;重构 body
|
|
80
|
+
assembly 4 个 unhappy 分支统一走 stage report-first 链路;audit
|
|
81
|
+
row 下移到 body 后,cost 加上 stageReportCost
|
|
82
|
+
- `test/unit/native-stage-report.test.ts` — 8 case 新增
|
|
83
|
+
|
|
84
|
+
### 文档
|
|
85
|
+
|
|
86
|
+
- v1.2.94 的 auto-summary 整段被替换,文档术语 "auto summary" 改为
|
|
87
|
+
"stage report"(保持向下兼容的 log event 命名只换前缀)
|
|
88
|
+
|
|
89
|
+
## [1.2.141] - 2026-06-04
|
|
90
|
+
|
|
91
|
+
### Fixed (LLM secret 解析:识别 vendor 标准 env)
|
|
92
|
+
|
|
93
|
+
用户反馈:环境变量里明明配了 `DEEPSEEK_API_KEY`、`OPENAI_API_KEY`、
|
|
94
|
+
`MOONSHOT_API_KEY` 等 vendor 官方 SDK 都认的标准命名,agim 却报 backend
|
|
95
|
+
"未配置"——只有把同一个 key 再复制一份到 `AGIM_LLM_SECRET_<NAME>` 或写
|
|
96
|
+
入 `~/.agim/llm-secrets.json` 才行。
|
|
97
|
+
|
|
98
|
+
**根因**:`resolveSecret(name)` 只看 agim 私有命名空间,从不读 vendor 标
|
|
99
|
+
准 env。一个装了 12 个 vendor API key 的环境,agim 一个都不识别——只
|
|
100
|
+
要 backend 没单独配过,就一律"未就绪"。
|
|
101
|
+
|
|
102
|
+
**修复**:`resolveSecret` 增加第 3 个 fallback。查找顺序:
|
|
103
|
+
1. `AGIM_LLM_SECRET_<NAME>`(原有,私有命名空间优先级最高)
|
|
104
|
+
2. `~/.agim/llm-secrets.json[name]`(原有,文件次之)
|
|
105
|
+
3. **v1.2.141 新增**:按 backend 的 `baseUrl` 子串 + `provider` 命中内
|
|
106
|
+
置 vendor 表,依次 probe 对应 vendor env。命中即用。
|
|
107
|
+
4. undefined(与之前一致)
|
|
108
|
+
|
|
109
|
+
vendor 表(v1.2.141 出厂内置 17 条规则,覆盖以下):
|
|
110
|
+
- `deepseek.com` → `DEEPSEEK_API_KEY`
|
|
111
|
+
- `api.openai.com` → `OPENAI_API_KEY`
|
|
112
|
+
- `moonshot.cn` → `MOONSHOT_API_KEY` → `KIMI_API_KEY`
|
|
113
|
+
- `dashscope` / `aliyuncs` → `DASHSCOPE_API_KEY` → `QWEN_API_KEY`
|
|
114
|
+
- `siliconflow` → `SILICONFLOW_API_KEY`
|
|
115
|
+
- `openrouter.ai` → `OPENROUTER_API_KEY`
|
|
116
|
+
- `stepfun.com` → `STEPFUN_API_KEY`
|
|
117
|
+
- `bigmodel.cn` / `zhipuai` → `ZHIPUAI_API_KEY` → `GLM_API_KEY`
|
|
118
|
+
- `minimaxi` → `MINIMAX_API_KEY`
|
|
119
|
+
- `baichuan-ai` → `BAICHUAN_API_KEY`
|
|
120
|
+
- `mistral.ai` → `MISTRAL_API_KEY`
|
|
121
|
+
- `groq.com` → `GROQ_API_KEY`
|
|
122
|
+
- `together.xyz` → `TOGETHER_API_KEY`
|
|
123
|
+
- `fireworks.ai` → `FIREWORKS_API_KEY`
|
|
124
|
+
- `provider === 'anthropic'` → `ANTHROPIC_API_KEY`(不需要 baseUrl)
|
|
125
|
+
|
|
126
|
+
**自托管网关**(不命中任何子串)走原 `AGIM_LLM_SECRET_<NAME>` 路径,零行
|
|
127
|
+
为变化——避免把别人的 key 错误地路由进自建 gateway。
|
|
128
|
+
|
|
129
|
+
### 诊断改进
|
|
130
|
+
|
|
131
|
+
- `describeSecretSource(name, hint)` 加 `source: 'vendor'` 这一档,
|
|
132
|
+
当 vendor env 命中时返回 `vendorEnvName: 'DEEPSEEK_API_KEY'`
|
|
133
|
+
- 没命中任何源时返回 `vendorCandidates: [...]`,告诉操作员"你可以
|
|
134
|
+
通过设置这些 vendor env 中任意一个让 agim 自动识别"
|
|
135
|
+
- Web admin `/api/llm` 把 `vendorEnvName` / `vendorCandidates` 透
|
|
136
|
+
出,便于 UI 显示 secret 来源
|
|
137
|
+
|
|
138
|
+
### 测试
|
|
139
|
+
|
|
140
|
+
`test/unit/llm-secrets-vendor.test.ts`(10 case 全绿):
|
|
141
|
+
- 私有 env 仍优先于 vendor env
|
|
142
|
+
- 私有 file 优先于 vendor env
|
|
143
|
+
- DeepSeek / OpenAI / Anthropic / Moonshot 各匹配 baseUrl
|
|
144
|
+
- alias env 兜底(MOONSHOT 没设 → 尝试 KIMI)
|
|
145
|
+
- 自托管 gateway(无匹配规则)→ undefined
|
|
146
|
+
- 不传 hint → 走 legacy 路径(向后兼容)
|
|
147
|
+
- describeSecretSource 报告 source='vendor' + vendorEnvName
|
|
148
|
+
- vendorCandidates 在 source='none' 时列出
|
|
149
|
+
|
|
150
|
+
### 文件
|
|
151
|
+
|
|
152
|
+
- `src/core/llm/secrets.ts` — VendorRule 表 + `resolveVendorEnv` +
|
|
153
|
+
`vendorEnvCandidates` + 拓展 `resolveSecret` / `describeSecretSource`
|
|
154
|
+
- `src/core/llm/registry.ts` — `loadFromConfig` 调 `resolveSecret` 时
|
|
155
|
+
传入 backend hint(provider + baseUrl)
|
|
156
|
+
- `src/web/llm-api.ts` — `/api/llm` GET 返回新字段
|
|
157
|
+
- `test/unit/llm-secrets-vendor.test.ts` — 新增 10 case
|
|
158
|
+
|
|
159
|
+
### 兼容性
|
|
160
|
+
|
|
161
|
+
零破坏:
|
|
162
|
+
- vendor 路径只在前两个私有源都为空时启用
|
|
163
|
+
- 老 install 没设 vendor env → 行为完全等于 v1.2.140
|
|
164
|
+
- 老 install 同时有私有 + vendor → 还是私有赢
|
|
165
|
+
- 设有 vendor env 但 backend 是自建 gateway → 不命中规则,不会误用
|
|
166
|
+
|
|
7
167
|
## [1.2.140] - 2026-06-04
|
|
8
168
|
|
|
9
169
|
### Fixed (admin SPA: native agent 加入 /settings/agents 清单)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD;;gCAEgC;AAChC,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;AAoBpE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD;;gCAEgC;AAChC,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;AAoBpE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA6DzG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAI7D;AAED;gDACgD;AAChD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAElE;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAMvF;AAED;uCACuC;AACvC,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAMA"}
|
|
@@ -58,7 +58,15 @@ export function loadFromConfig(cfg) {
|
|
|
58
58
|
next.duplicates.add(cfg.name);
|
|
59
59
|
log.warn({ event: 'llm-registry.duplicate_name', name: cfg.name }, `Duplicate llmBackends entry "${cfg.name}"; last wins`);
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
// v1.2.141 — pass backend hint so resolveSecret can fall back to
|
|
62
|
+
// vendor-standard envs (DEEPSEEK_API_KEY / OPENAI_API_KEY / …) when
|
|
63
|
+
// neither AGIM_LLM_SECRET_<NAME> nor llm-secrets.json carries the
|
|
64
|
+
// key. Hint is best-effort — keys missing from cfg leave the hint
|
|
65
|
+
// empty and the vendor fallback simply yields null.
|
|
66
|
+
const apiKey = resolveSecret(cfg.name, secrets, {
|
|
67
|
+
provider: cfg.provider,
|
|
68
|
+
baseUrl: cfg.baseUrl,
|
|
69
|
+
});
|
|
62
70
|
const provider = buildProvider(cfg, apiKey);
|
|
63
71
|
if (!provider)
|
|
64
72
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,6DAA6D;AAC7D,EAAE;AACF,aAAa;AACb,sEAAsE;AACtE,qEAAqE;AACrE,oEAAoE;AACpE,sEAAsE;AACtE,uEAAuE;AACvE,gDAAgD;AAChD,8DAA8D;AAC9D,EAAE;AACF,oEAAoE;AACpE,gEAAgE;AAChE,kEAAkE;AAClE,2CAA2C;AAE3C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE7D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAA;AAc3D,IAAI,KAAK,GAAkB,UAAU,EAAE,CAAA;AAEvC,SAAS,UAAU;IACjB,OAAO;QACL,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,UAAU,EAAE,IAAI,GAAG,EAAE;KACtB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAoE;IACjG,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAE,GAAmC,CAAC,WAAW,CAAC;QAC9E,CAAC,CAAE,GAAkC,CAAC,WAAW;QACjD,CAAC,CAAC,EAAE,CAAA;IAEN,mEAAmE;IACnE,wBAAwB;IACxB,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IAEjC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAoB,CAAA;QAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAQ;QAC7E,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1B,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAClE,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAC/D,gCAAgC,GAAG,CAAC,IAAI,cAAc,CAAC,CAAA;QAC3D,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,19 @@ interface SecretsFile {
|
|
|
7
7
|
* of the codebase: non-alphanumeric → underscore, uppercased. So
|
|
8
8
|
* "deepseek-cheap" → "AGIM_LLM_SECRET_DEEPSEEK_CHEAP". */
|
|
9
9
|
export declare function envKeyForBackend(name: string): string;
|
|
10
|
+
/** Vendor hint passed by the registry so we can fall back to standard
|
|
11
|
+
* vendor envs (`DEEPSEEK_API_KEY`, `OPENAI_API_KEY`, …). Optional —
|
|
12
|
+
* callers from CLI tests etc. can omit it and only see the two
|
|
13
|
+
* legacy lookup paths. */
|
|
14
|
+
export interface BackendHint {
|
|
15
|
+
provider?: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Diagnostic — returns the list of vendor env names that would be
|
|
19
|
+
* probed for a given backend hint. Used by `describeSecretSource` to
|
|
20
|
+
* show the operator which envs are checked when both private slots
|
|
21
|
+
* are empty. */
|
|
22
|
+
export declare function vendorEnvCandidates(hint: BackendHint | undefined): string[];
|
|
10
23
|
/**
|
|
11
24
|
* Read the on-disk secrets file (or return an empty SecretsFile if missing / corrupt).
|
|
12
25
|
* Logs a warning on corrupt files so operators notice — we deliberately
|
|
@@ -18,8 +31,14 @@ export declare function loadSecretsFile(): SecretsFile;
|
|
|
18
31
|
* Resolve a single secret for a backend, applying env-var precedence.
|
|
19
32
|
* Returns undefined when nothing is configured — providers downstream
|
|
20
33
|
* use this to flip `isConfigured()` off.
|
|
34
|
+
*
|
|
35
|
+
* v1.2.141 — `backendHint` enables vendor-env fallback. Callers that
|
|
36
|
+
* have backend config in hand (registry.ts) should pass it so users
|
|
37
|
+
* who exported `DEEPSEEK_API_KEY` / `OPENAI_API_KEY` / etc. via vendor
|
|
38
|
+
* convention don't also need to copy the value into our private
|
|
39
|
+
* `AGIM_LLM_SECRET_*` namespace.
|
|
21
40
|
*/
|
|
22
|
-
export declare function resolveSecret(backendName: string, fileSecrets?: SecretsFile): string | undefined;
|
|
41
|
+
export declare function resolveSecret(backendName: string, fileSecrets?: SecretsFile, backendHint?: BackendHint): string | undefined;
|
|
23
42
|
/**
|
|
24
43
|
* Persist a secret. Idempotent — writes the entire file with 0600
|
|
25
44
|
* perms. Used by the CLI wizard (`agim config llm add`) once we land
|
|
@@ -36,10 +55,17 @@ export declare function listConfiguredBackends(): string[];
|
|
|
36
55
|
* UI doesn't have to guess. The string is operator-facing; keep it
|
|
37
56
|
* succinct and actionable.
|
|
38
57
|
*/
|
|
39
|
-
export declare function describeSecretSource(backendName: string): {
|
|
40
|
-
source: 'env' | 'file' | 'none';
|
|
58
|
+
export declare function describeSecretSource(backendName: string, backendHint?: BackendHint): {
|
|
59
|
+
source: 'env' | 'file' | 'vendor' | 'none';
|
|
41
60
|
envKey: string;
|
|
42
61
|
filePath: string;
|
|
62
|
+
/** v1.2.141 — when source==='vendor', this is the vendor env var
|
|
63
|
+
* name that actually held the secret (e.g. 'DEEPSEEK_API_KEY'). */
|
|
64
|
+
vendorEnvName?: string;
|
|
65
|
+
/** v1.2.141 — when source==='none' but a backendHint was supplied,
|
|
66
|
+
* the candidate vendor envs we tried (helps operators figure out
|
|
67
|
+
* which standard env to set). */
|
|
68
|
+
vendorCandidates?: string[];
|
|
43
69
|
perms?: string;
|
|
44
70
|
};
|
|
45
71
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/core/llm/secrets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/core/llm/secrets.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,gBAAgB,QAAsC,CAAA;AAEnE,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AASD;;2DAE2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;2BAG2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAmED;;;iBAGiB;AACjB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,CAY3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAmB7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,GACxB,MAAM,GAAG,SAAS,CAapB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMpE;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,8DAA8D;AAC9D,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAoBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,WAAW,GACxB;IACD,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB;wEACoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;sCAEkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAuBA"}
|
package/dist/core/llm/secrets.js
CHANGED
|
@@ -19,7 +19,14 @@
|
|
|
19
19
|
// touching the on-disk file. Hyphens in the backend name are
|
|
20
20
|
// converted to underscores for the env var name.
|
|
21
21
|
// 2. ~/.agim/llm-secrets.json `keys.<backend-name>`.
|
|
22
|
-
// 3.
|
|
22
|
+
// 3. v1.2.141 — vendor-standard env (DEEPSEEK_API_KEY / OPENAI_API_KEY /
|
|
23
|
+
// ANTHROPIC_API_KEY / …) when the caller passes a `backendHint` with
|
|
24
|
+
// provider + baseUrl. Matched by baseUrl substring against a small
|
|
25
|
+
// built-in table so a user who already exported the vendor's
|
|
26
|
+
// standard env (which DeepSeek/OpenAI/Moonshot/etc SDKs all read by
|
|
27
|
+
// default) gets agim working out of the box — no separate copy of
|
|
28
|
+
// the same secret under `AGIM_LLM_SECRET_*`.
|
|
29
|
+
// 4. undefined (provider will report isConfigured()=false).
|
|
23
30
|
import { existsSync, readFileSync, writeFileSync, chmodSync, mkdirSync, statSync } from 'node:fs';
|
|
24
31
|
import { dirname, join } from 'node:path';
|
|
25
32
|
import { AGIM_HOME } from '../agim-paths.js';
|
|
@@ -39,6 +46,85 @@ export function envKeyForBackend(name) {
|
|
|
39
46
|
const safe = name.replace(/[^A-Za-z0-9]+/g, '_').toUpperCase();
|
|
40
47
|
return `AGIM_LLM_SECRET_${safe}`;
|
|
41
48
|
}
|
|
49
|
+
/** Built-in mapping of vendor → standard env names. baseUrl substring
|
|
50
|
+
* match is intentionally loose — `deepseek.com`, `api.deepseek.com`,
|
|
51
|
+
* `https://api.deepseek.com/v1` all hit the same rule. Order matters
|
|
52
|
+
* only when two rules overlap (none do today).
|
|
53
|
+
*
|
|
54
|
+
* v1.2.141 — kept short and conservative on purpose. Adding a vendor
|
|
55
|
+
* is one line; over-matching is a footgun (you'd leak the wrong env
|
|
56
|
+
* into the wrong backend). Self-hosted gateways are deliberately NOT
|
|
57
|
+
* here — those operators should use `AGIM_LLM_SECRET_<NAME>`. */
|
|
58
|
+
const VENDOR_RULES = [
|
|
59
|
+
{ match: 'deepseek.com', envNames: ['DEEPSEEK_API_KEY'] },
|
|
60
|
+
{ match: 'api.openai.com', envNames: ['OPENAI_API_KEY'] },
|
|
61
|
+
{ match: 'moonshot.cn', envNames: ['MOONSHOT_API_KEY', 'KIMI_API_KEY'] },
|
|
62
|
+
{ match: 'dashscope', envNames: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'] },
|
|
63
|
+
{ match: 'aliyuncs', envNames: ['DASHSCOPE_API_KEY', 'QWEN_API_KEY'] },
|
|
64
|
+
{ match: 'siliconflow', envNames: ['SILICONFLOW_API_KEY'] },
|
|
65
|
+
{ match: 'openrouter.ai', envNames: ['OPENROUTER_API_KEY'] },
|
|
66
|
+
{ match: 'stepfun.com', envNames: ['STEPFUN_API_KEY'] },
|
|
67
|
+
{ match: 'bigmodel.cn', envNames: ['ZHIPUAI_API_KEY', 'GLM_API_KEY'] },
|
|
68
|
+
{ match: 'zhipuai', envNames: ['ZHIPUAI_API_KEY'] },
|
|
69
|
+
{ match: 'minimaxi', envNames: ['MINIMAX_API_KEY'] },
|
|
70
|
+
{ match: 'baichuan-ai', envNames: ['BAICHUAN_API_KEY'] },
|
|
71
|
+
{ match: 'mistral.ai', envNames: ['MISTRAL_API_KEY'] },
|
|
72
|
+
{ match: 'groq.com', envNames: ['GROQ_API_KEY'] },
|
|
73
|
+
{ match: 'together.xyz', envNames: ['TOGETHER_API_KEY'] },
|
|
74
|
+
{ match: 'fireworks.ai', envNames: ['FIREWORKS_API_KEY'] },
|
|
75
|
+
// Anthropic — baseUrl might be empty (provider uses its own default),
|
|
76
|
+
// so we additionally key on provider name.
|
|
77
|
+
{ match: 'anthropic.com', provider: 'anthropic', envNames: ['ANTHROPIC_API_KEY'] },
|
|
78
|
+
{ match: '', provider: 'anthropic', envNames: ['ANTHROPIC_API_KEY'] },
|
|
79
|
+
];
|
|
80
|
+
/**
|
|
81
|
+
* Resolve via the vendor table. Returns the matched env name + value, or
|
|
82
|
+
* null when no rule applies / matched rule's envs are all empty. The
|
|
83
|
+
* env-name is surfaced so `describeSecretSource` can report which vendor
|
|
84
|
+
* env was used (useful for the "Test connection" diagnostic).
|
|
85
|
+
*/
|
|
86
|
+
function resolveVendorEnv(hint) {
|
|
87
|
+
if (!hint)
|
|
88
|
+
return null;
|
|
89
|
+
const baseUrl = (hint.baseUrl ?? '').toLowerCase();
|
|
90
|
+
const provider = (hint.provider ?? '').toLowerCase();
|
|
91
|
+
for (const rule of VENDOR_RULES) {
|
|
92
|
+
if (rule.provider && rule.provider !== provider)
|
|
93
|
+
continue;
|
|
94
|
+
if (rule.match && !baseUrl.includes(rule.match))
|
|
95
|
+
continue;
|
|
96
|
+
if (!rule.match && !rule.provider)
|
|
97
|
+
continue;
|
|
98
|
+
for (const envName of rule.envNames) {
|
|
99
|
+
const v = process.env[envName];
|
|
100
|
+
if (v && v.length > 0)
|
|
101
|
+
return { envName, value: v };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/** Diagnostic — returns the list of vendor env names that would be
|
|
107
|
+
* probed for a given backend hint. Used by `describeSecretSource` to
|
|
108
|
+
* show the operator which envs are checked when both private slots
|
|
109
|
+
* are empty. */
|
|
110
|
+
export function vendorEnvCandidates(hint) {
|
|
111
|
+
if (!hint)
|
|
112
|
+
return [];
|
|
113
|
+
const baseUrl = (hint.baseUrl ?? '').toLowerCase();
|
|
114
|
+
const provider = (hint.provider ?? '').toLowerCase();
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
for (const rule of VENDOR_RULES) {
|
|
117
|
+
if (rule.provider && rule.provider !== provider)
|
|
118
|
+
continue;
|
|
119
|
+
if (rule.match && !baseUrl.includes(rule.match))
|
|
120
|
+
continue;
|
|
121
|
+
if (!rule.match && !rule.provider)
|
|
122
|
+
continue;
|
|
123
|
+
for (const n of rule.envNames)
|
|
124
|
+
seen.add(n);
|
|
125
|
+
}
|
|
126
|
+
return Array.from(seen);
|
|
127
|
+
}
|
|
42
128
|
/**
|
|
43
129
|
* Read the on-disk secrets file (or return an empty SecretsFile if missing / corrupt).
|
|
44
130
|
* Logs a warning on corrupt files so operators notice — we deliberately
|
|
@@ -72,8 +158,14 @@ export function loadSecretsFile() {
|
|
|
72
158
|
* Resolve a single secret for a backend, applying env-var precedence.
|
|
73
159
|
* Returns undefined when nothing is configured — providers downstream
|
|
74
160
|
* use this to flip `isConfigured()` off.
|
|
161
|
+
*
|
|
162
|
+
* v1.2.141 — `backendHint` enables vendor-env fallback. Callers that
|
|
163
|
+
* have backend config in hand (registry.ts) should pass it so users
|
|
164
|
+
* who exported `DEEPSEEK_API_KEY` / `OPENAI_API_KEY` / etc. via vendor
|
|
165
|
+
* convention don't also need to copy the value into our private
|
|
166
|
+
* `AGIM_LLM_SECRET_*` namespace.
|
|
75
167
|
*/
|
|
76
|
-
export function resolveSecret(backendName, fileSecrets) {
|
|
168
|
+
export function resolveSecret(backendName, fileSecrets, backendHint) {
|
|
77
169
|
if (!backendName)
|
|
78
170
|
return undefined;
|
|
79
171
|
const envKey = envKeyForBackend(backendName);
|
|
@@ -82,7 +174,14 @@ export function resolveSecret(backendName, fileSecrets) {
|
|
|
82
174
|
return envVal;
|
|
83
175
|
const file = fileSecrets ?? loadSecretsFile();
|
|
84
176
|
const v = file.keys[backendName];
|
|
85
|
-
|
|
177
|
+
if (typeof v === 'string' && v.length > 0)
|
|
178
|
+
return v;
|
|
179
|
+
// v1.2.141 — vendor env fallback. Only consulted when both private
|
|
180
|
+
// slots came up empty so existing installs see no behavior change.
|
|
181
|
+
const vendor = resolveVendorEnv(backendHint);
|
|
182
|
+
if (vendor)
|
|
183
|
+
return vendor.value;
|
|
184
|
+
return undefined;
|
|
86
185
|
}
|
|
87
186
|
/**
|
|
88
187
|
* Persist a secret. Idempotent — writes the entire file with 0600
|
|
@@ -138,7 +237,7 @@ function _writeFile(file) {
|
|
|
138
237
|
* UI doesn't have to guess. The string is operator-facing; keep it
|
|
139
238
|
* succinct and actionable.
|
|
140
239
|
*/
|
|
141
|
-
export function describeSecretSource(backendName) {
|
|
240
|
+
export function describeSecretSource(backendName, backendHint) {
|
|
142
241
|
const envKey = envKeyForBackend(backendName);
|
|
143
242
|
if (process.env[envKey])
|
|
144
243
|
return { source: 'env', envKey, filePath: LLM_SECRETS_PATH };
|
|
@@ -152,6 +251,16 @@ export function describeSecretSource(backendName) {
|
|
|
152
251
|
catch { /* ignore */ }
|
|
153
252
|
return { source: 'file', envKey, filePath: LLM_SECRETS_PATH, perms };
|
|
154
253
|
}
|
|
155
|
-
|
|
254
|
+
const vendor = resolveVendorEnv(backendHint);
|
|
255
|
+
if (vendor) {
|
|
256
|
+
return {
|
|
257
|
+
source: 'vendor', envKey, filePath: LLM_SECRETS_PATH,
|
|
258
|
+
vendorEnvName: vendor.envName,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
source: 'none', envKey, filePath: LLM_SECRETS_PATH,
|
|
263
|
+
vendorCandidates: vendorEnvCandidates(backendHint),
|
|
264
|
+
};
|
|
156
265
|
}
|
|
157
266
|
//# sourceMappingURL=secrets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/core/llm/secrets.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,6CAA6C;AAC7C,uEAAuE;AACvE,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,oCAAoC;AACpC,MAAM;AACN,oBAAoB;AACpB,gDAAgD;AAChD,MAAM;AACN,EAAE;AACF,0DAA0D;AAC1D,kEAAkE;AAClE,kEAAkE;AAClE,kEAAkE;AAClE,sDAAsD;AACtD,uDAAuD;AACvD,8DAA8D;AAE9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;AAOnE,SAAS,SAAS;IAChB,sEAAsE;IACtE,mEAAmE;IACnE,gEAAgE;IAChE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACjC,CAAC;AAED;;2DAE2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAC9D,OAAO,mBAAmB,IAAI,EAAE,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,SAAS,EAAE,CAAA;QACrD,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAA;QACtD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACpE,OAAO,SAAS,EAAE,CAAA;QACpB,CAAC;QACD,6DAA6D;QAC7D,MAAM,KAAK,GAA2B,EAAE,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChE,OAAO,SAAS,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/core/llm/secrets.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,6CAA6C;AAC7C,uEAAuE;AACvE,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,sBAAsB;AACtB,EAAE;AACF,oCAAoC;AACpC,MAAM;AACN,oBAAoB;AACpB,gDAAgD;AAChD,MAAM;AACN,EAAE;AACF,0DAA0D;AAC1D,kEAAkE;AAClE,kEAAkE;AAClE,kEAAkE;AAClE,sDAAsD;AACtD,uDAAuD;AACvD,2EAA2E;AAC3E,0EAA0E;AAC1E,wEAAwE;AACxE,kEAAkE;AAClE,yEAAyE;AACzE,uEAAuE;AACvE,kDAAkD;AAClD,8DAA8D;AAE9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;AAE1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;AAOnE,SAAS,SAAS;IAChB,sEAAsE;IACtE,mEAAmE;IACnE,gEAAgE;IAChE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACjC,CAAC;AAED;;2DAE2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAC9D,OAAO,mBAAmB,IAAI,EAAE,CAAA;AAClC,CAAC;AAsBD;;;;;;;;kEAQkE;AAClE,MAAM,YAAY,GAAiB;IACjC,EAAE,KAAK,EAAE,cAAc,EAAiB,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE;IACxE,EAAE,KAAK,EAAE,gBAAgB,EAAe,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE;IACtE,EAAE,KAAK,EAAE,aAAa,EAAkB,QAAQ,EAAE,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE;IACxF,EAAE,KAAK,EAAE,WAAW,EAAoB,QAAQ,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAAE;IACzF,EAAE,KAAK,EAAE,UAAU,EAAqB,QAAQ,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC,EAAE;IACzF,EAAE,KAAK,EAAE,aAAa,EAAkB,QAAQ,EAAE,CAAC,qBAAqB,CAAC,EAAE;IAC3E,EAAE,KAAK,EAAE,eAAe,EAAgB,QAAQ,EAAE,CAAC,oBAAoB,CAAC,EAAE;IAC1E,EAAE,KAAK,EAAE,aAAa,EAAkB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACvE,EAAE,KAAK,EAAE,aAAa,EAAkB,QAAQ,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE;IACtF,EAAE,KAAK,EAAE,SAAS,EAAsB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACvE,EAAE,KAAK,EAAE,UAAU,EAAqB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACvE,EAAE,KAAK,EAAE,aAAa,EAAkB,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE;IACxE,EAAE,KAAK,EAAE,YAAY,EAAmB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACvE,EAAE,KAAK,EAAE,UAAU,EAAqB,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE;IACpE,EAAE,KAAK,EAAE,cAAc,EAAiB,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE;IACxE,EAAE,KAAK,EAAE,cAAc,EAAiB,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE;IACzE,sEAAsE;IACtE,2CAA2C;IAC3C,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE;IAClF,EAAE,KAAK,EAAE,EAAE,EAAe,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE;CACnF,CAAA;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAA6B;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAQ;QACzD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAQ;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAQ;QAC3C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;QACrD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;iBAGiB;AACjB,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAQ;QACzD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAQ;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAQ;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,SAAS,EAAE,CAAA;QACrD,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAA;QACtD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACpE,OAAO,SAAS,EAAE,CAAA;QACpB,CAAC;QACD,6DAA6D;QAC7D,MAAM,KAAK,GAA2B,EAAE,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChE,OAAO,SAAS,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,WAAmB,EACnB,WAAyB,EACzB,WAAyB;IAEzB,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAC9C,MAAM,IAAI,GAAG,WAAW,IAAI,eAAe,EAAE,CAAA;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAChC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IACnD,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC5C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAA;IAC/B,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAc;IAC5D,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAC3F,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;IAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAA;IAC/B,UAAU,CAAC,IAAI,CAAC,CAAA;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;IAC9B,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;QAAE,OAAM;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC7B,UAAU,CAAC,IAAI,CAAC,CAAA;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB;IACnC,uEAAuE;IACvE,8CAA8C;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,yBAAyB;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IACpD,aAAa,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,qEAAqE;IACrE,sEAAsE;IACtE,qCAAqC;IACrC,IAAI,CAAC;QAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,WAAyB;IAczB,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IACrF,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;IAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,IAAI,KAAyB,CAAA;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA;YACrC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAA;IACtE,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB;YACpD,aAAa,EAAE,MAAM,CAAC,OAAO;SAC9B,CAAA;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB;QAClD,gBAAgB,EAAE,mBAAmB,CAAC,WAAW,CAAC;KACnD,CAAA;AACH,CAAC"}
|
|
@@ -25,6 +25,46 @@ export declare function buildSystemPrompt(provider: LlmProvider, role: string, c
|
|
|
25
25
|
* hit so post-incident forensics can correlate. Honours
|
|
26
26
|
* IMHUB_NATIVE_AGENT_ROLE_FILE for a non-default location. */
|
|
27
27
|
export declare function readOperatorRole(cwd: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* v1.2.142 — Stage-report retry. Replaces v1.2.94's empty-only auto-
|
|
30
|
+
* summary with a single helper used by all four "unhappy ending"
|
|
31
|
+
* branches (empty / max_iter / stuck_loop / off_track).
|
|
32
|
+
*
|
|
33
|
+
* The retry asks the same provider, with no tools, for a *user-facing
|
|
34
|
+
* stage report* given the work already done — not a "final answer". The
|
|
35
|
+
* prompt explicitly tolerates partial / failed work; failed tool
|
|
36
|
+
* results get described in plain language ("couldn't fetch the news
|
|
37
|
+
* page — anti-bot"), never as `tool_name ×N`.
|
|
38
|
+
*
|
|
39
|
+
* Returns the produced text + cost delta on success; null when the
|
|
40
|
+
* provider returned nothing or threw. Caller falls back to the
|
|
41
|
+
* technical `composeUnfinishedTurnRecap` recap on null.
|
|
42
|
+
*
|
|
43
|
+
* One LLM call, 60s deadline, tools=[] so it can't keep chaining.
|
|
44
|
+
* Env IMHUB_NATIVE_STAGE_REPORT=off disables the retry entirely
|
|
45
|
+
* (caller goes straight to the technical recap) — useful for debug.
|
|
46
|
+
*/
|
|
47
|
+
export declare function tryStageReport(opts: {
|
|
48
|
+
prompt: string;
|
|
49
|
+
result: {
|
|
50
|
+
toolCalls: ReadonlyArray<{
|
|
51
|
+
name: string;
|
|
52
|
+
isError: boolean;
|
|
53
|
+
preview?: string;
|
|
54
|
+
}>;
|
|
55
|
+
iterations: number;
|
|
56
|
+
};
|
|
57
|
+
provider: LlmProvider;
|
|
58
|
+
kind: 'empty' | 'max_iter' | 'stuck_loop' | 'off_track';
|
|
59
|
+
/** off_track reason; ignored for other kinds. */
|
|
60
|
+
offTrackReason?: string;
|
|
61
|
+
model?: string;
|
|
62
|
+
signal?: AbortSignal;
|
|
63
|
+
sessionId: string;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
text: string;
|
|
66
|
+
costUsd: number | null;
|
|
67
|
+
} | null>;
|
|
28
68
|
/** Resolve the operator's approval policy from env. Defaults to
|
|
29
69
|
* `allow-list` mode with NO allow entries — equivalent to "no tool
|
|
30
70
|
* calls". Operators that want native to actually call tools must
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/native/index.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAOL,KAAK,WAAW,EAEjB,MAAM,4BAA4B,CAAA;AAKnC,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,2CAA2C,CAAA;AAyClD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAoLR;AAED;;;;;;;+DAO+D;AAC/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBpD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/native/index.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAOL,KAAK,WAAW,EAEjB,MAAM,4BAA4B,CAAA;AAKnC,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,2CAA2C,CAAA;AAyClD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAoLR;AAED;;;;;;;+DAO+D;AAC/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBpD;AA+LD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,aAAa,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC9E,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,QAAQ,EAAE,WAAW,CAAA;IACrB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAA;IACvD,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAwG1D;AAwED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,wBAAwB,CAgE1E;AAWD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAExD;AA8ED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCvF;AAmlBD,eAAO,MAAM,kBAAkB,EAAE,YAAuC,CAAA;AAExE;;cAEc;AACd,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C"}
|