chivgent 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -3
- package/README.zh-CN.md +88 -3
- package/dist/agent.d.ts +14 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +33 -1
- package/dist/agent.js.map +1 -1
- package/dist/auth/credentials.d.ts +26 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +29 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/env-credentials.d.ts +10 -0
- package/dist/auth/env-credentials.d.ts.map +1 -0
- package/dist/auth/env-credentials.js +18 -0
- package/dist/auth/env-credentials.js.map +1 -0
- package/dist/auth/file-credentials.d.ts +25 -0
- package/dist/auth/file-credentials.d.ts.map +1 -0
- package/dist/auth/file-credentials.js +94 -0
- package/dist/auth/file-credentials.js.map +1 -0
- package/dist/auth/runtime-credentials.d.ts +10 -0
- package/dist/auth/runtime-credentials.d.ts.map +1 -0
- package/dist/auth/runtime-credentials.js +15 -0
- package/dist/auth/runtime-credentials.js.map +1 -0
- package/dist/cli-options.d.ts +16 -9
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +72 -26
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +14 -42
- package/dist/cli.js.map +1 -1
- package/dist/context/compaction.d.ts +39 -0
- package/dist/context/compaction.d.ts.map +1 -0
- package/dist/context/compaction.js +141 -0
- package/dist/context/compaction.js.map +1 -0
- package/dist/context/context-manager.d.ts +72 -0
- package/dist/context/context-manager.d.ts.map +1 -0
- package/dist/context/context-manager.js +129 -0
- package/dist/context/context-manager.js.map +1 -0
- package/dist/context/token-estimator.d.ts +22 -0
- package/dist/context/token-estimator.d.ts.map +1 -0
- package/dist/context/token-estimator.js +43 -0
- package/dist/context/token-estimator.js.map +1 -0
- package/dist/providers/client.d.ts +7 -0
- package/dist/providers/client.d.ts.map +1 -0
- package/dist/providers/client.js +48 -0
- package/dist/providers/client.js.map +1 -0
- package/dist/providers/definitions.d.ts +25 -0
- package/dist/providers/definitions.d.ts.map +1 -0
- package/dist/providers/definitions.js +97 -0
- package/dist/providers/definitions.js.map +1 -0
- package/dist/providers/registry.d.ts +15 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +34 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/workspace/read.d.ts +2 -0
- package/dist/workspace/read.d.ts.map +1 -1
- package/dist/workspace/read.js +5 -1
- package/dist/workspace/read.js.map +1 -1
- package/dist/workspace/text.d.ts +15 -0
- package/dist/workspace/text.d.ts.map +1 -1
- package/dist/workspace/text.js +21 -2
- package/dist/workspace/text.js.map +1 -1
- package/dist/workspace/write.d.ts.map +1 -1
- package/dist/workspace/write.js +38 -11
- package/dist/workspace/write.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,11 +24,14 @@ to study before adding production-harness complexity.
|
|
|
24
24
|
|
|
25
25
|
- A real multi-turn agent loop: model -> tool call -> tool result -> model.
|
|
26
26
|
- Provider-independent runtime messages and tool contracts.
|
|
27
|
+
- A Provider registry: adding a Provider is a declaration, not a CLI change.
|
|
28
|
+
- API keys resolved from `--api-key`, the environment, then an optional file.
|
|
27
29
|
- OpenAI support through the Responses API.
|
|
28
30
|
- DeepSeek support through a reusable OpenAI-compatible Chat Completions client.
|
|
29
31
|
- Custom OpenAI-compatible endpoints through environment-only configuration.
|
|
30
32
|
- An interactive session with slash commands, or a single-shot question.
|
|
31
33
|
- Sessions that persist as JSON lines and can be resumed in a later process.
|
|
34
|
+
- A context manager that summarises old turns to stay inside the window.
|
|
32
35
|
- A `--json` event stream for scripting and other front ends.
|
|
33
36
|
- Streamed answers rendered from a typed runtime event stream.
|
|
34
37
|
- Interruptible runs: Ctrl+C ends the current run without losing the transcript.
|
|
@@ -37,6 +40,7 @@ to study before adding production-harness complexity.
|
|
|
37
40
|
- Ranged `read_file` output with continuation hints and bounded tool results.
|
|
38
41
|
- Read-only by default; `--allow-writes` adds `write_file` and `edit_file`.
|
|
39
42
|
- Exact-match `edit_file` that refuses missing or ambiguous edits.
|
|
43
|
+
- Edits preserve the file's own byte order mark and CRLF line endings.
|
|
40
44
|
- Atomic writes: a crash mid-write leaves the original file intact.
|
|
41
45
|
- Safe workspace access with traversal and symlink-escape protection.
|
|
42
46
|
- Root `.gitignore`, generated-directory, and sensitive-path filtering.
|
|
@@ -130,8 +134,11 @@ Options:
|
|
|
130
134
|
--json Write the run as JSON lines instead of rendered text
|
|
131
135
|
-c, --continue Resume the most recent session for this workspace
|
|
132
136
|
--resume ID Resume a specific session
|
|
137
|
+
--api-key KEY API key for this run; prefer an environment variable
|
|
133
138
|
--sessions List recorded sessions and exit
|
|
134
139
|
--allow-writes Let the agent create and change files (default: read-only)
|
|
140
|
+
--context-window N Token budget for the context (default: 128000)
|
|
141
|
+
--no-compaction Send the whole transcript instead of summarising old turns
|
|
135
142
|
--no-session Do not record this run
|
|
136
143
|
-h, --help Show help
|
|
137
144
|
-v, --version Show version
|
|
@@ -151,12 +158,45 @@ reached, `130` interrupted with Ctrl+C.
|
|
|
151
158
|
| OpenAI | `OPENAI_API_KEY` | `OPENAI_MODEL` | `gpt-5.6` | Responses API |
|
|
152
159
|
| DeepSeek | `DEEPSEEK_API_KEY` | `DEEPSEEK_MODEL` | `deepseek-v4-flash` | OpenAI-compatible Chat Completions |
|
|
153
160
|
| Custom compatible | `OPENAI_API_KEY` | `OPENAI_MODEL` | Required | OpenAI-compatible Chat Completions |
|
|
161
|
+
| OpenRouter | `OPENROUTER_API_KEY` | `OPENROUTER_MODEL` | Required | OpenAI-compatible Chat Completions |
|
|
162
|
+
| Groq | `GROQ_API_KEY` | `GROQ_MODEL` | Required | OpenAI-compatible Chat Completions |
|
|
163
|
+
| xAI | `XAI_API_KEY` | `XAI_MODEL` | Required | OpenAI-compatible Chat Completions |
|
|
164
|
+
| Moonshot | `MOONSHOT_API_KEY` | `MOONSHOT_MODEL` | Required | OpenAI-compatible Chat Completions |
|
|
154
165
|
|
|
155
166
|
An explicit `--model` value takes precedence over the Provider-specific model
|
|
156
167
|
environment variable. Custom compatible Providers also require
|
|
157
168
|
`OPENAI_BASE_URL`. Sessions are written under `CHIVGENT_HOME` (default
|
|
158
169
|
`~/.chivgent`).
|
|
159
170
|
|
|
171
|
+
Providers are declared in a registry rather than branched on in the CLI, so
|
|
172
|
+
`--help` and `--provider` validation are generated from the same list that
|
|
173
|
+
creates the client.
|
|
174
|
+
|
|
175
|
+
#### API key resolution
|
|
176
|
+
|
|
177
|
+
Keys are resolved in this order, first match wins:
|
|
178
|
+
|
|
179
|
+
1. `--api-key` for a single run
|
|
180
|
+
2. the Provider's environment variable
|
|
181
|
+
3. `<CHIVGENT_HOME>/auth.json`
|
|
182
|
+
|
|
183
|
+
An environment variable deliberately beats the stored file, matching the
|
|
184
|
+
convention other CLIs use, so a stored key can be overridden for one run
|
|
185
|
+
without editing anything.
|
|
186
|
+
|
|
187
|
+
`auth.json` is optional and holds literal keys only:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"openai": { "type": "api_key", "key": "sk-..." },
|
|
192
|
+
"deepseek": "sk-..."
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Neither `$VAR` expansion nor `!command` substitution is supported: letting a
|
|
197
|
+
config file spawn a process is a large attack surface for a small convenience.
|
|
198
|
+
chivgent warns when the file is readable by other users; keep it at `chmod 600`.
|
|
199
|
+
|
|
160
200
|
```bash
|
|
161
201
|
chivgent --provider openai --model gpt-5.6 "Explain package.json"
|
|
162
202
|
chivgent --provider deepseek --model deepseek-v4-pro "Explain package.json"
|
|
@@ -186,6 +226,42 @@ AssistantMessage <- normalized result
|
|
|
186
226
|
This prevents the Agent, tools, and CLI from depending on one vendor's message
|
|
187
227
|
format.
|
|
188
228
|
|
|
229
|
+
### Context management
|
|
230
|
+
|
|
231
|
+
A session records everything that happened. The context manager decides what
|
|
232
|
+
is worth sending for one request. Keeping those apart is what lets a long
|
|
233
|
+
session stay inside a fixed context window.
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
Full transcript ──────────────→ Session store (what happened)
|
|
237
|
+
│
|
|
238
|
+
↓
|
|
239
|
+
ContextManager
|
|
240
|
+
│ token estimate vs. contextWindow - reserveTokens
|
|
241
|
+
↓
|
|
242
|
+
summary + recent messages ────→ Provider (what the model sees)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
When the estimate exceeds the budget, older messages are summarised into a
|
|
246
|
+
single message and recent turns are kept verbatim. Three details matter:
|
|
247
|
+
|
|
248
|
+
- **File lists are derived from tool calls, not from the summary.** A summary
|
|
249
|
+
can forget or invent a path. For a coding agent, "which files did I read and
|
|
250
|
+
change" is the part that most needs to survive intact, so it is collected
|
|
251
|
+
from the `read_file`, `write_file`, and `edit_file` calls themselves.
|
|
252
|
+
- **Tool calls are never separated from their results.** A split point that
|
|
253
|
+
would orphan a tool result moves forward past the whole group.
|
|
254
|
+
- **Compaction discards the Provider continuation.** A Provider that chains
|
|
255
|
+
history server-side replays its own copy and ignores the messages sent with
|
|
256
|
+
it, so keeping the continuation would send back the history just removed.
|
|
257
|
+
|
|
258
|
+
Token counts are estimated from character length rather than with a real
|
|
259
|
+
tokenizer, which would be model-specific and a large dependency for a number
|
|
260
|
+
that only decides *when* to compact. The reserve budget absorbs the error.
|
|
261
|
+
|
|
262
|
+
A single tool result larger than the whole budget cannot be compacted away;
|
|
263
|
+
bound tool output instead. Compaction is disabled with `--no-compaction`.
|
|
264
|
+
|
|
189
265
|
### Runtime events
|
|
190
266
|
|
|
191
267
|
The Agent Loop reports what it is doing through a typed event stream instead of
|
|
@@ -251,6 +327,11 @@ inside thin Provider adapters rather than leaking them into the Agent loop.
|
|
|
251
327
|
src/
|
|
252
328
|
cli.ts CLI entry point and process boundary
|
|
253
329
|
cli-options.ts Argument and Provider configuration
|
|
330
|
+
auth/
|
|
331
|
+
credentials.ts Credential contract and resolution order
|
|
332
|
+
runtime-credentials.ts --api-key override
|
|
333
|
+
env-credentials.ts Environment variable lookup
|
|
334
|
+
file-credentials.ts Optional auth.json store
|
|
254
335
|
agent.ts Agent loop and run state
|
|
255
336
|
events.ts Runtime event model
|
|
256
337
|
render.ts Terminal renderer for runtime events
|
|
@@ -260,6 +341,10 @@ src/
|
|
|
260
341
|
session.ts Conversation state and event fan-out
|
|
261
342
|
session-store.ts JSONL session log and resume support
|
|
262
343
|
repl.ts Interactive prompt and slash commands
|
|
344
|
+
context/
|
|
345
|
+
context-manager.ts Builds the messages for one request
|
|
346
|
+
compaction.ts Summarises old history and tracks files
|
|
347
|
+
token-estimator.ts Character-based token approximation
|
|
263
348
|
workspace.ts Workspace configuration and the read-only default
|
|
264
349
|
workspace/
|
|
265
350
|
types.ts Limits, errors, and the Workspace contract
|
|
@@ -271,6 +356,9 @@ src/
|
|
|
271
356
|
search.ts Literal text search
|
|
272
357
|
write.ts Atomic whole-file writes and exact edits
|
|
273
358
|
providers/
|
|
359
|
+
registry.ts Provider registry
|
|
360
|
+
definitions.ts Built-in Provider declarations
|
|
361
|
+
client.ts Credential resolution into an LLM client
|
|
274
362
|
openai.ts OpenAI Responses adapter
|
|
275
363
|
openai-compatible-chat.ts Shared Chat Completions adapter
|
|
276
364
|
deepseek.ts DeepSeek configuration wrapper
|
|
@@ -313,7 +401,12 @@ manual so the default test suite never consumes credits.
|
|
|
313
401
|
|
|
314
402
|
## Security model
|
|
315
403
|
|
|
316
|
-
- API keys
|
|
404
|
+
- API keys come from `--api-key`, an environment variable, or an optional
|
|
405
|
+
`auth.json`, in that order, and must never be committed.
|
|
406
|
+
- `auth.json` stores keys in plain text. It is opt-in for that reason, and
|
|
407
|
+
chivgent warns when its permissions let other users read it.
|
|
408
|
+
- The auth file accepts literal keys only; it cannot expand environment
|
|
409
|
+
variables or run shell commands.
|
|
317
410
|
- A custom `OPENAI_BASE_URL` receives the configured API key and prompts; use
|
|
318
411
|
only endpoints you trust.
|
|
319
412
|
- Workspace tools are read-only unless `--allow-writes` is passed; `write_file`
|
|
@@ -352,11 +445,11 @@ a sensitive project.
|
|
|
352
445
|
- [x] Project discovery tools: `list_files`, `search_text`, and ranged `read_file`
|
|
353
446
|
- [x] Streaming output and runtime events
|
|
354
447
|
- [x] Persistent multi-turn sessions
|
|
355
|
-
- [
|
|
448
|
+
- [x] Context-window management and compaction
|
|
356
449
|
- [x] Opt-in `write_file` and `edit_file` behind `--allow-writes`
|
|
357
450
|
- [ ] Per-edit confirmation prompts and an undo log
|
|
358
451
|
- [ ] Permission-gated shell tools
|
|
359
|
-
- [
|
|
452
|
+
- [x] Provider registry and credential resolution chain
|
|
360
453
|
- [ ] TUI, extensions, telemetry, and evals
|
|
361
454
|
|
|
362
455
|
## Documentation
|
package/README.zh-CN.md
CHANGED
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
|
|
22
22
|
- 完整的多轮 Agent Loop:模型 -> Tool Call -> Tool Result -> 模型。
|
|
23
23
|
- Provider 无关的运行时消息和工具契约。
|
|
24
|
+
- Provider 注册表:新增 Provider 只是一条声明,不需要改 CLI。
|
|
25
|
+
- API Key 依次从 `--api-key`、环境变量、可选文件解析。
|
|
24
26
|
- 通过 Responses API 支持 OpenAI。
|
|
25
27
|
- 通过通用 OpenAI-compatible Chat Completions 客户端支持 DeepSeek。
|
|
26
28
|
- 无需修改代码即可配置自定义 OpenAI-compatible API。
|
|
@@ -28,12 +30,14 @@
|
|
|
28
30
|
- Session 以 JSON Lines 持久化,可以在之后的进程中恢复。
|
|
29
31
|
- 提供 `--json` 事件流,便于脚本和其他前端消费。
|
|
30
32
|
- 基于类型化运行时事件流的流式输出。
|
|
33
|
+
- 上下文管理器:压缩较早的轮次以待在窗口内。
|
|
31
34
|
- 可中断的运行:Ctrl+C 结束当前运行,且不会丢失已产生的 transcript。
|
|
32
35
|
- Provider 调用具备单次超时和有上限的指数退避重试。
|
|
33
36
|
- 通过 `list_files` 和字面量 `search_text` 确定性地发现项目内容。
|
|
34
37
|
- 支持带续读提示的分段 `read_file`,所有工具结果都有容量上限。
|
|
35
38
|
- 默认只读;`--allow-writes` 才会启用 `write_file` 和 `edit_file`。
|
|
36
39
|
- 精确匹配的 `edit_file`,命中缺失或不唯一时拒绝执行。
|
|
40
|
+
- 编辑会保留文件原有的 BOM 和 CRLF 换行符。
|
|
37
41
|
- 原子写入:写入中途崩溃不会损坏原文件。
|
|
38
42
|
- 安全的工作区访问,阻止路径穿越和符号链接逃逸。
|
|
39
43
|
- 支持根 `.gitignore`、生成目录和敏感路径过滤。
|
|
@@ -126,8 +130,11 @@ chivgent [选项] 进入交互式会话
|
|
|
126
130
|
--json 以 JSON Lines 输出整次运行,而不是渲染文本
|
|
127
131
|
-c, --continue 恢复当前工作区最近的一次 Session
|
|
128
132
|
--resume ID 恢复指定 Session
|
|
133
|
+
--api-key KEY 本次运行使用的 API Key;更推荐用环境变量
|
|
129
134
|
--sessions 列出已记录的 Session 并退出
|
|
130
135
|
--allow-writes 允许 Agent 创建和修改文件(默认只读)
|
|
136
|
+
--context-window N 上下文的 Token 预算(默认:128000)
|
|
137
|
+
--no-compaction 发送完整 transcript,不压缩较早的轮次
|
|
131
138
|
--no-session 不记录本次运行
|
|
132
139
|
-h, --help 显示帮助
|
|
133
140
|
-v, --version 显示版本
|
|
@@ -146,10 +153,41 @@ Ctrl+C 中断。
|
|
|
146
153
|
| OpenAI | `OPENAI_API_KEY` | `OPENAI_MODEL` | `gpt-5.6` | Responses API |
|
|
147
154
|
| DeepSeek | `DEEPSEEK_API_KEY` | `DEEPSEEK_MODEL` | `deepseek-v4-flash` | OpenAI-compatible Chat Completions |
|
|
148
155
|
| 自定义兼容供应商 | `OPENAI_API_KEY` | `OPENAI_MODEL` | 必填 | OpenAI-compatible Chat Completions |
|
|
156
|
+
| OpenRouter | `OPENROUTER_API_KEY` | `OPENROUTER_MODEL` | 必填 | OpenAI-compatible Chat Completions |
|
|
157
|
+
| Groq | `GROQ_API_KEY` | `GROQ_MODEL` | 必填 | OpenAI-compatible Chat Completions |
|
|
158
|
+
| xAI | `XAI_API_KEY` | `XAI_MODEL` | 必填 | OpenAI-compatible Chat Completions |
|
|
159
|
+
| Moonshot | `MOONSHOT_API_KEY` | `MOONSHOT_MODEL` | 必填 | OpenAI-compatible Chat Completions |
|
|
149
160
|
|
|
150
161
|
显式传入的 `--model` 优先于 Provider 对应的模型环境变量。自定义兼容供应商还必须
|
|
151
162
|
配置 `OPENAI_BASE_URL`。Session 记录在 `CHIVGENT_HOME`(默认 `~/.chivgent`)下。
|
|
152
163
|
|
|
164
|
+
Provider 通过注册表声明,而不是在 CLI 里分支判断,因此 `--help` 的内容、
|
|
165
|
+
`--provider` 的校验和实际创建 Client 用的是同一份清单。
|
|
166
|
+
|
|
167
|
+
#### API Key 解析顺序
|
|
168
|
+
|
|
169
|
+
按以下顺序解析,命中即停:
|
|
170
|
+
|
|
171
|
+
1. `--api-key`(仅本次运行)
|
|
172
|
+
2. Provider 对应的环境变量
|
|
173
|
+
3. `<CHIVGENT_HOME>/auth.json`
|
|
174
|
+
|
|
175
|
+
环境变量刻意排在文件之前,与其他 CLI 的惯例一致,这样已存储的 Key 可以被
|
|
176
|
+
一次性的环境变量临时覆盖,而不必改文件。
|
|
177
|
+
|
|
178
|
+
`auth.json` 是可选的,只接受字面量 Key:
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"openai": { "type": "api_key", "key": "sk-..." },
|
|
183
|
+
"deepseek": "sk-..."
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
不支持 `$VAR` 展开,也不支持 `!command` 替换:让配置文件能够启动进程,
|
|
188
|
+
是用很小的便利换很大的攻击面。当该文件可被其他用户读取时 chivgent 会告警,
|
|
189
|
+
请保持 `chmod 600`。
|
|
190
|
+
|
|
153
191
|
```bash
|
|
154
192
|
chivgent --provider openai --model gpt-5.6 "解释 package.json"
|
|
155
193
|
chivgent --provider deepseek --model deepseek-v4-pro "解释 package.json"
|
|
@@ -178,6 +216,39 @@ AssistantMessage <- Normalized Result
|
|
|
178
216
|
|
|
179
217
|
因此 Agent、工具和 CLI 不会依赖任何单一供应商的消息格式。
|
|
180
218
|
|
|
219
|
+
### 上下文管理
|
|
220
|
+
|
|
221
|
+
Session 记录发生过的一切;Context Manager 决定这一次请求值得发送什么。把两者
|
|
222
|
+
分开,才能让长会话待在固定的上下文窗口内。
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
完整 transcript ──────────────→ Session Store(发生了什么)
|
|
226
|
+
│
|
|
227
|
+
↓
|
|
228
|
+
ContextManager
|
|
229
|
+
│ token 估算 vs. contextWindow - reserveTokens
|
|
230
|
+
↓
|
|
231
|
+
摘要 + 最近消息 ──────────────→ Provider(模型看到什么)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
当估算超出预算时,较早的消息会被压缩成一条摘要消息,最近若干轮原样保留。
|
|
235
|
+
有三个细节值得注意:
|
|
236
|
+
|
|
237
|
+
- **文件清单从工具调用推导,而不是从摘要里提取。** 摘要可能遗漏或者编造路径。
|
|
238
|
+
对 Coding Agent 来说,「我读过和改过哪些文件」是最需要完整存活的信息,因此
|
|
239
|
+
它直接从 `read_file`、`write_file`、`edit_file` 的调用参数收集。
|
|
240
|
+
- **工具调用永远不会和它的结果被切开。** 会把 tool result 孤立的切点会向前
|
|
241
|
+
移动,越过整组消息。
|
|
242
|
+
- **压缩会丢弃 Provider continuation。** 在服务端串联历史的 Provider 会重放
|
|
243
|
+
它自己那份历史、忽略请求里带的消息,保留 continuation 等于把刚压缩掉的历史
|
|
244
|
+
又送了回去。
|
|
245
|
+
|
|
246
|
+
Token 数量按字符长度估算,而不是用真正的 tokenizer:后者与模型强相关,为一个
|
|
247
|
+
只用来决定「何时压缩」的数字引入大依赖并不划算,估算误差由 reserve 预算吸收。
|
|
248
|
+
|
|
249
|
+
单条超过整个预算的工具结果无法被压缩掉,这种情况应该去限制工具输出本身。
|
|
250
|
+
用 `--no-compaction` 可以关闭压缩。
|
|
251
|
+
|
|
181
252
|
### 运行时事件
|
|
182
253
|
|
|
183
254
|
Agent Loop 自己不打印任何内容,而是通过类型化的事件流对外汇报。一次运行会产生:
|
|
@@ -239,6 +310,11 @@ const client = new OpenAICompatibleChatClient({
|
|
|
239
310
|
src/
|
|
240
311
|
cli.ts CLI 入口与进程边界
|
|
241
312
|
cli-options.ts 参数和 Provider 配置
|
|
313
|
+
auth/
|
|
314
|
+
credentials.ts 凭据契约与解析顺序
|
|
315
|
+
runtime-credentials.ts --api-key 覆盖层
|
|
316
|
+
env-credentials.ts 环境变量查找
|
|
317
|
+
file-credentials.ts 可选的 auth.json 存储
|
|
242
318
|
agent.ts Agent Loop 与运行状态
|
|
243
319
|
events.ts 运行时事件模型
|
|
244
320
|
render.ts 运行时事件的终端渲染
|
|
@@ -248,6 +324,10 @@ src/
|
|
|
248
324
|
session.ts 会话状态与事件分发
|
|
249
325
|
session-store.ts JSONL 会话日志与恢复
|
|
250
326
|
repl.ts 交互式输入与斜杠命令
|
|
327
|
+
context/
|
|
328
|
+
context-manager.ts 构造单次请求的消息
|
|
329
|
+
compaction.ts 压缩历史并跟踪文件
|
|
330
|
+
token-estimator.ts 基于字符的 Token 估算
|
|
251
331
|
workspace.ts 工作区配置与只读默认值
|
|
252
332
|
workspace/
|
|
253
333
|
types.ts 上限、错误类型与 Workspace 契约
|
|
@@ -259,6 +339,9 @@ src/
|
|
|
259
339
|
search.ts 字面量文本搜索
|
|
260
340
|
write.ts 原子整文件写入与精确编辑
|
|
261
341
|
providers/
|
|
342
|
+
registry.ts Provider 注册表
|
|
343
|
+
definitions.ts 内置 Provider 声明
|
|
344
|
+
client.ts 凭据解析并构造 LLM Client
|
|
262
345
|
openai.ts OpenAI Responses Adapter
|
|
263
346
|
openai-compatible-chat.ts 通用 Chat Completions Adapter
|
|
264
347
|
deepseek.ts DeepSeek 配置包装器
|
|
@@ -301,7 +384,9 @@ npm install -g ./chivgent-0.6.0.tgz
|
|
|
301
384
|
|
|
302
385
|
## 安全模型
|
|
303
386
|
|
|
304
|
-
- API Key
|
|
387
|
+
- API Key 依次从 `--api-key`、环境变量、可选的 `auth.json` 解析,绝不能提交到仓库。
|
|
388
|
+
- `auth.json` 以明文保存 Key,因此它是可选的;当文件权限允许其他用户读取时会告警。
|
|
389
|
+
- 该文件只接受字面量 Key,无法展开环境变量或执行 Shell 命令。
|
|
305
390
|
- 自定义 `OPENAI_BASE_URL` 会收到配置的 API Key 和提示词,只能使用可信端点。
|
|
306
391
|
- 不传 `--allow-writes` 时工作区工具全部只读,`write_file` 和 `edit_file` 根本
|
|
307
392
|
不会被注册。
|
|
@@ -335,11 +420,11 @@ npm install -g ./chivgent-0.6.0.tgz
|
|
|
335
420
|
- [x] 项目发现工具:`list_files`、`search_text` 和分段 `read_file`
|
|
336
421
|
- [x] 流式输出和运行时事件
|
|
337
422
|
- [x] 持久化多轮 Session
|
|
338
|
-
- [
|
|
423
|
+
- [x] Context Window 管理和压缩
|
|
339
424
|
- [x] 通过 `--allow-writes` 选择性开启的 `write_file` 和 `edit_file`
|
|
340
425
|
- [ ] 逐次修改确认与撤销日志
|
|
341
426
|
- [ ] 需要权限确认的 Shell 工具
|
|
342
|
-
- [
|
|
427
|
+
- [x] Provider Registry 与凭据解析链
|
|
343
428
|
- [ ] TUI、Extensions、Telemetry 和 Evals
|
|
344
429
|
|
|
345
430
|
## 文档
|
package/dist/agent.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type LLMClient } from "./llm.js";
|
|
|
3
3
|
import type { AssistantMessage, Message } from "./messages.js";
|
|
4
4
|
import type { Tool } from "./tools/tool.js";
|
|
5
5
|
import type { Workspace } from "./workspace.js";
|
|
6
|
+
import type { ContextManager } from "./context/context-manager.js";
|
|
6
7
|
export interface AgentOptions {
|
|
7
8
|
readonly systemPrompt: string;
|
|
8
9
|
readonly maxTurns: number;
|
|
@@ -13,6 +14,10 @@ export interface AgentOptions {
|
|
|
13
14
|
readonly onEvent?: AgentEventListener;
|
|
14
15
|
/** Use the Provider's streaming API when it offers one. Defaults to true. */
|
|
15
16
|
readonly streaming?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Decides what the model sees each turn. Omit to send the whole transcript.
|
|
19
|
+
*/
|
|
20
|
+
readonly contextManager?: ContextManager;
|
|
16
21
|
}
|
|
17
22
|
export interface AgentRunOptions {
|
|
18
23
|
/** Cancels the run between turns, during a Provider call, and between tools. */
|
|
@@ -45,10 +50,19 @@ export declare class Agent {
|
|
|
45
50
|
private readonly workspace;
|
|
46
51
|
private readonly onEvent?;
|
|
47
52
|
private readonly streaming;
|
|
53
|
+
private readonly contextManager?;
|
|
48
54
|
constructor(options: AgentOptions);
|
|
49
55
|
get toolNames(): readonly string[];
|
|
50
56
|
run(userInput: string, options?: AgentRunOptions): Promise<AgentRunResult>;
|
|
51
57
|
private loop;
|
|
58
|
+
/**
|
|
59
|
+
* Produces the messages for one request and records any compaction.
|
|
60
|
+
*
|
|
61
|
+
* A Provider holding a continuation replays its own history and ignores the
|
|
62
|
+
* messages sent with it, so a fresh compaction has to drop the continuation
|
|
63
|
+
* to take effect at all.
|
|
64
|
+
*/
|
|
65
|
+
private buildContext;
|
|
52
66
|
private requestAssistantMessage;
|
|
53
67
|
private assertUniqueToolCallIds;
|
|
54
68
|
private executeToolCall;
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,SAAS,EAAwB,MAAM,UAAU,CAAC;AAC9E,OAAO,KAAK,EACV,gBAAgB,EAChB,OAAO,EAGR,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,SAAS,EAAwB,MAAM,UAAU,CAAC;AAC9E,OAAO,KAAK,EACV,gBAAgB,EAChB,OAAO,EAGR,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAUN,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IAEjD,YAAY,OAAO,EAAE,YAAY,EAsBhC;IAED,IAAI,SAAS,IAAI,SAAS,MAAM,EAAE,CAEjC;IAEK,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAqCzB;YAEa,IAAI;IAuDlB;;;;;;OAMG;YACW,YAAY;YAwBZ,uBAAuB;IA4BrC,OAAO,CAAC,uBAAuB;YAcjB,eAAe;IA0D7B,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;CAahB"}
|
package/dist/agent.js
CHANGED
|
@@ -15,6 +15,7 @@ export class Agent {
|
|
|
15
15
|
workspace;
|
|
16
16
|
onEvent;
|
|
17
17
|
streaming;
|
|
18
|
+
contextManager;
|
|
18
19
|
constructor(options) {
|
|
19
20
|
if (!Number.isSafeInteger(options.maxTurns) || options.maxTurns <= 0) {
|
|
20
21
|
throw new TypeError("maxTurns must be a positive safe integer.");
|
|
@@ -33,6 +34,9 @@ export class Agent {
|
|
|
33
34
|
this.onEvent = options.onEvent;
|
|
34
35
|
}
|
|
35
36
|
this.streaming = options.streaming ?? true;
|
|
37
|
+
if (options.contextManager !== undefined) {
|
|
38
|
+
this.contextManager = options.contextManager;
|
|
39
|
+
}
|
|
36
40
|
}
|
|
37
41
|
get toolNames() {
|
|
38
42
|
return [...this.registry.keys()];
|
|
@@ -115,10 +119,38 @@ export class Agent {
|
|
|
115
119
|
turnCount: state.turnCount,
|
|
116
120
|
};
|
|
117
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Produces the messages for one request and records any compaction.
|
|
124
|
+
*
|
|
125
|
+
* A Provider holding a continuation replays its own history and ignores the
|
|
126
|
+
* messages sent with it, so a fresh compaction has to drop the continuation
|
|
127
|
+
* to take effect at all.
|
|
128
|
+
*/
|
|
129
|
+
async buildContext(state, signal) {
|
|
130
|
+
const snapshot = snapshotMessages(state.messages);
|
|
131
|
+
if (this.contextManager === undefined) {
|
|
132
|
+
return snapshot;
|
|
133
|
+
}
|
|
134
|
+
const context = await this.contextManager.build(snapshot, {
|
|
135
|
+
...(state.compaction === undefined ? {} : { previous: state.compaction }),
|
|
136
|
+
...(signal === undefined ? {} : { signal }),
|
|
137
|
+
});
|
|
138
|
+
if (context.compaction === undefined) {
|
|
139
|
+
delete state.compaction;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
state.compaction = context.compaction;
|
|
143
|
+
}
|
|
144
|
+
if (context.compacted) {
|
|
145
|
+
delete state.continuation;
|
|
146
|
+
}
|
|
147
|
+
return context.messages;
|
|
148
|
+
}
|
|
118
149
|
async requestAssistantMessage(state, turn, signal) {
|
|
150
|
+
const messages = await this.buildContext(state, signal);
|
|
119
151
|
const request = {
|
|
120
152
|
systemPrompt: this.systemPrompt,
|
|
121
|
-
messages
|
|
153
|
+
messages,
|
|
122
154
|
tools: this.toolDefinitions,
|
|
123
155
|
...(state.continuation === undefined
|
|
124
156
|
? {}
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ProviderDefinition } from "../providers/definitions.js";
|
|
2
|
+
export interface Credential {
|
|
3
|
+
readonly apiKey: string;
|
|
4
|
+
/** Where the key came from, used in diagnostics. Never contains the key. */
|
|
5
|
+
readonly origin: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CredentialSource {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
read(provider: ProviderDefinition): Promise<Credential | undefined>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Walks credential sources in order and returns the first hit.
|
|
13
|
+
*
|
|
14
|
+
* The order is deliberate: an explicit `--api-key` beats the environment,
|
|
15
|
+
* and the environment beats the stored file. That matches the convention
|
|
16
|
+
* users already know from other CLIs, and means a stored credential can be
|
|
17
|
+
* overridden for a single run without editing the file.
|
|
18
|
+
*/
|
|
19
|
+
export declare class CredentialResolver {
|
|
20
|
+
private readonly sources;
|
|
21
|
+
constructor(sources: readonly CredentialSource[]);
|
|
22
|
+
resolve(provider: ProviderDefinition): Promise<Credential | undefined>;
|
|
23
|
+
/** Explains what the user could set, for the "no credential" error. */
|
|
24
|
+
describeExpectations(provider: ProviderDefinition): string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACrE;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAI;IAE/D,OAAO,CACX,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAQjC;IAED,uEAAuE;IACvE,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAGzD;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walks credential sources in order and returns the first hit.
|
|
3
|
+
*
|
|
4
|
+
* The order is deliberate: an explicit `--api-key` beats the environment,
|
|
5
|
+
* and the environment beats the stored file. That matches the convention
|
|
6
|
+
* users already know from other CLIs, and means a stored credential can be
|
|
7
|
+
* overridden for a single run without editing the file.
|
|
8
|
+
*/
|
|
9
|
+
export class CredentialResolver {
|
|
10
|
+
sources;
|
|
11
|
+
constructor(sources) {
|
|
12
|
+
this.sources = sources;
|
|
13
|
+
}
|
|
14
|
+
async resolve(provider) {
|
|
15
|
+
for (const source of this.sources) {
|
|
16
|
+
const credential = await source.read(provider);
|
|
17
|
+
if (credential !== undefined && credential.apiKey.length > 0) {
|
|
18
|
+
return credential;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
/** Explains what the user could set, for the "no credential" error. */
|
|
24
|
+
describeExpectations(provider) {
|
|
25
|
+
const variables = provider.envKeys.join(" or ");
|
|
26
|
+
return `No API key for ${provider.id}. Set ${variables}, pass --api-key, or add "${provider.id}" to the auth file.`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IACA,OAAO;IAApC,YAA6B,OAAoC;uBAApC,OAAO;IAAgC,CAAC;IAErE,KAAK,CAAC,OAAO,CACX,QAA4B;QAE5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uEAAuE;IACvE,oBAAoB,CAAC,QAA4B;QAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,kBAAkB,QAAQ,CAAC,EAAE,SAAS,SAAS,6BAA6B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACtH,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProviderDefinition } from "../providers/definitions.js";
|
|
2
|
+
import type { Credential, CredentialSource } from "./credentials.js";
|
|
3
|
+
/** Reads the Provider's declared environment variables, in declared order. */
|
|
4
|
+
export declare class EnvCredentialSource implements CredentialSource {
|
|
5
|
+
private readonly environment;
|
|
6
|
+
readonly name = "environment";
|
|
7
|
+
constructor(environment?: NodeJS.ProcessEnv);
|
|
8
|
+
read(provider: ProviderDefinition): Promise<Credential | undefined>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=env-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-credentials.d.ts","sourceRoot":"","sources":["../../src/auth/env-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErE,8EAA8E;AAC9E,qBAAa,mBAAoB,YAAW,gBAAgB;IAG9C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,YAA6B,WAAW,GAAE,MAAM,CAAC,UAAwB,EAAI;IAEvE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAQxE;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Reads the Provider's declared environment variables, in declared order. */
|
|
2
|
+
export class EnvCredentialSource {
|
|
3
|
+
environment;
|
|
4
|
+
name = "environment";
|
|
5
|
+
constructor(environment = process.env) {
|
|
6
|
+
this.environment = environment;
|
|
7
|
+
}
|
|
8
|
+
async read(provider) {
|
|
9
|
+
for (const key of provider.envKeys) {
|
|
10
|
+
const value = this.environment[key];
|
|
11
|
+
if (value !== undefined && value.length > 0) {
|
|
12
|
+
return { apiKey: value, origin: key };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=env-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-credentials.js","sourceRoot":"","sources":["../../src/auth/env-credentials.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,MAAM,OAAO,mBAAmB;IAGD,WAAW;IAF/B,IAAI,GAAG,aAAa,CAAC;IAE9B,YAA6B,WAAW,GAAsB,OAAO,CAAC,GAAG;2BAA5C,WAAW;IAAoC,CAAC;IAE7E,KAAK,CAAC,IAAI,CAAC,QAA4B;QACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ProviderDefinition } from "../providers/definitions.js";
|
|
2
|
+
import type { Credential, CredentialSource } from "./credentials.js";
|
|
3
|
+
export declare class AuthFileError extends Error {
|
|
4
|
+
constructor(message: string, options?: {
|
|
5
|
+
cause?: unknown;
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export declare function defaultAuthFile(environment?: NodeJS.ProcessEnv): string;
|
|
9
|
+
/**
|
|
10
|
+
* Reads API keys from `<chivgent home>/auth.json`.
|
|
11
|
+
*
|
|
12
|
+
* The file deliberately supports only literal keys. Neither `$VAR` expansion
|
|
13
|
+
* nor `!command` substitution is accepted: letting a config file spawn a
|
|
14
|
+
* process is a large attack surface for a small convenience.
|
|
15
|
+
*/
|
|
16
|
+
export declare class FileCredentialSource implements CredentialSource {
|
|
17
|
+
private readonly filePath;
|
|
18
|
+
private readonly onWarning;
|
|
19
|
+
readonly name = "auth file";
|
|
20
|
+
constructor(filePath?: string, onWarning?: (message: string) => void);
|
|
21
|
+
read(provider: ProviderDefinition): Promise<Credential | undefined>;
|
|
22
|
+
private parse;
|
|
23
|
+
private warnOnLoosePermissions;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=file-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-credentials.d.ts","sourceRoot":"","sources":["../../src/auth/file-credentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErE,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAGzD;CACF;AAED,wBAAgB,eAAe,CAC7B,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,MAAM,CAOR;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAIzD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,QAAQ,CAAC,IAAI,eAAe;IAE5B,YACmB,QAAQ,GAAE,MAA0B,EACpC,SAAS,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAsB,EACrE;IAEE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoBxE;IAED,OAAO,CAAC,KAAK;YA6BC,sBAAsB;CAWrC"}
|