@apolloyh/apollo-agent 0.1.9 → 0.1.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiBxD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,qBAAa,gBAAgB;IAiBf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhBpC,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAoE;gBAE1D,OAAO,EAAE,eAAe;IAErD,IAAI,IAAI,SAAS;IAIjB,SAAS,IAAI,IAAI;IAajB,UAAU,IAAI,IAAI;IAelB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA6H/B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,yEAAyE;IACzE,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,GAAG;CAKZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAOxD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAO9D;AA4ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAY1D"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiBxD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,qBAAa,gBAAgB;IAiBf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhBpC,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAoE;gBAE1D,OAAO,EAAE,eAAe;IAErD,IAAI,IAAI,SAAS;IAIjB,SAAS,IAAI,IAAI;IAajB,UAAU,IAAI,IAAI;IAelB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA6H/B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,yEAAyE;IACzE,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,GAAG;CAKZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAOxD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAO9D;AA4ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAY1D"}
package/dist/trace.js CHANGED
@@ -280,14 +280,12 @@ export class CliTraceRenderer {
280
280
  }
281
281
  renderInteractiveToolResult(event, denied) {
282
282
  this.bullet(formatInteractiveToolResult(event.tool, event.content, event.isError, event.input), denied ? "yellow" : event.isError ? "red" : "green");
283
- if (event.tool !== "shell_exec" || event.isError || event.content === "(no output)")
283
+ if (event.isError || event.content === "(no output)")
284
284
  return;
285
- const lines = stripTerminalEscapes(event.content).split(/\r?\n/);
286
- for (const [index, line] of lines.slice(0, 6).entries()) {
285
+ const lines = toolOutputLines(event.tool, event.content);
286
+ for (const [index, line] of lines.entries()) {
287
287
  this.out(` ${this.paint(index === 0 ? "└" : " ", "gray")} ${this.paint(truncateDisplayLine(line, 140), "gray")}\n`);
288
288
  }
289
- if (lines.length > 6)
290
- this.out(` ${this.paint(`… +${lines.length - 6} lines`, "gray")}\n`);
291
289
  }
292
290
  renderCodeChange(change) {
293
291
  const width = Math.max(40, Math.min(this.options.stdout?.columns ?? 120, 160));
@@ -597,6 +595,22 @@ function toolLabel(tool) {
597
595
  .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
598
596
  .join(" ");
599
597
  }
598
+ function toolOutputLines(tool, content) {
599
+ if (tool === "web_search") {
600
+ try {
601
+ const results = JSON.parse(content).results ?? [];
602
+ return results.slice(0, 5).map((result) => [result.title, result.url].filter(Boolean).join(" — "));
603
+ }
604
+ catch {
605
+ return [compactValue(content, 140)];
606
+ }
607
+ }
608
+ const lines = stripTerminalEscapes(content).split(/\r?\n/);
609
+ const visible = lines.slice(0, 6);
610
+ if (lines.length > 6)
611
+ visible.push(`… +${lines.length - 6} lines`);
612
+ return visible;
613
+ }
600
614
  function isPermissionDenied(content) {
601
615
  return content.startsWith("Permission denied for tool ");
602
616
  }
package/dist/types.d.ts CHANGED
@@ -2,6 +2,10 @@ export type JsonObject = Record<string, unknown>;
2
2
  export type ContentBlock = {
3
3
  type: "text";
4
4
  text: string;
5
+ } | {
6
+ type: "thinking";
7
+ thinking: string;
8
+ signature?: string;
5
9
  } | {
6
10
  type: "tool_use";
7
11
  id: string;
@@ -59,6 +63,9 @@ export type TraceEvent = {
59
63
  } | {
60
64
  type: "assistant_delta";
61
65
  text: string;
66
+ } | {
67
+ type: "thinking_delta";
68
+ text: string;
62
69
  } | {
63
70
  type: "llm_tool_delta";
64
71
  bytes: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ # Apollo 高级功能与恢复机制
2
+
3
+ All state lives under **`.apollo/`** in the workspace (gitignored).
4
+
5
+ ## Commands
6
+
7
+ | Command | Purpose |
8
+ | --- | --- |
9
+ | `/plan` | Enter **Plan mode** (read-only except `.apollo/plan.md`) |
10
+ | `/approve` | Approve plan → exit plan mode → implement |
11
+ | `/reject` | Discard plan mode |
12
+ | `/workflow <goal>` | Start **coordinator workflow** (研究→实现→验证→交付) |
13
+ | `/wf` | Print workflow status bar |
14
+ | `/save` | Persist session |
15
+ | `/resume [id]` | Resume latest or given session |
16
+ | `/sessions` | List sessions |
17
+ | `/skillify name \| desc` | Turn session into `skills/<name>/SKILL.md` |
18
+ | `/memory [query]` | List/search memories |
19
+ | `/thought` | Expand/collapse last Thought |
20
+ | `/status` | Mode, session id, model, token usage, Prompt Cache hit rate by request type, and cache-key diagnostics |
21
+
22
+ ## Goal mode
23
+
24
+ Autonomous pursuit of a single goal until done (or blocked / max iterations).
25
+
26
+ ```text
27
+ /goal Fix the null pointer in auth and add a regression test
28
+ # status bar updates each iteration
29
+ # auto-continues until GOAL_DONE / GOAL_BLOCKED / GOAL_FAILED / max
30
+ /goal # show status
31
+ /goal-stop # pause
32
+ /goal max=8 <text> # custom max iterations (1–30)
33
+ ```
34
+
35
+ Model markers:
36
+ - `GOAL_PROGRESS:<note>`
37
+ - `GOAL_DONE:<summary>`
38
+ - `GOAL_BLOCKED:<what you need>`
39
+ - `GOAL_FAILED:<reason>`
40
+
41
+ Differs from `/workflow`: free-form steps, not fixed 研究→实现→验证→交付 phases.
42
+
43
+ ## Plan mode
44
+
45
+ ```text
46
+ /plan
47
+ # agent researches + writes .apollo/plan.md
48
+ /approve
49
+ # then ask: implement the plan
50
+ ```
51
+
52
+ In plan mode, write tools are blocked except the plan file.
53
+
54
+ ## Workflow (lightweight coordinator)
55
+
56
+ ```text
57
+ /workflow Fix auth null pointer and add tests
58
+ # status bar:
59
+ # ● 研究中 → ○ 实现中 → ○ 验证中 → ○ 交付中
60
+ continue workflow
61
+ ```
62
+
63
+ Agent is instructed to emit `PHASE_DONE:<name>:<summary>` and `WORKFLOW_DONE`.
64
+ Failed Task steps retry once with a corrected brief.
65
+
66
+ ## Hooks
67
+
68
+ Copy `.apollo/hooks.example.json` → `.apollo/hooks.json`:
69
+
70
+ ```json
71
+ {
72
+ "log": true,
73
+ "denyTools": ["email_send"],
74
+ "denyMessage": "Email blocked by hooks."
75
+ }
76
+ ```
77
+
78
+ Logging is off unless `.apollo/hooks.json` explicitly sets `log: true`. Tool calls then append to
79
+ `.apollo/hooks.log`; sensitive fields and result content are redacted.
80
+
81
+ ## Memory
82
+
83
+ Tools: `memory_search`, `memory_save`, `memory_list`
84
+ Files: `.apollo/memory/*.json`
85
+ Relevant memories are attached to the current user turn rather than the cache-stable system prompt. Identical memory blocks are attached once per active context and become eligible again after `/clear` or context compaction.
86
+
87
+ ## Prompt Cache
88
+
89
+ `/status` calculates Prompt Cache hit rates only from the usage fields returned by the model provider. It reports the latest main request separately from cumulative session and per-category (`main`, `task`, `compaction`) rates. GLM is shown as implicit, provider-managed caching; Anthropic-compatible endpoints show the requested `5m` or `1h` policy.
90
+
91
+ The configured `systemPrompt` comes first, followed by Apollo's built-in rules; the exact combined system prompt plus tool definitions are frozen for the lifetime of a `QueryEngine`. The Skill catalog is attached once in conversation context instead of changing the system prompt; later catalog changes are sent as additions, updates, and removals. Matched Skill instructions and memory blocks are also omitted from later turns, while Goal and Workflow modes send their full instructions once and concise state updates afterward.
92
+
93
+ `/status` shows short SHA-256 fingerprints for the complete stable request prefix, cache-affecting configuration, system prompt, and tool definitions; prompt text and credentials are never included. If a request misses after a previous hit, the diagnostic reports which stable component changed or indicates that the message prefix, provider expiry, or provider behavior caused the miss. Tool results are capped at 30000 characters with both the head and tail preserved. Skill files are cached in-process and invalidated after local installation; Exa searches use a bounded 10-minute process-local cache.
94
+
95
+ Tool calls use CC-style terminal feedback: streamed input shows the tool name, target path/query/command, generated size, and elapsed time as soon as those fields arrive. Execution keeps the same contextual label. New files then show a bounded, line-numbered content preview. Replacements render an `Update(path)` card with added/removed counts, old/new line numbers, surrounding context, syntax colors, and full-line red/green diff backgrounds. Approval prompts support ↑/↓, Enter, Esc, and y/n shortcuts. Display metadata is emitted only to the UI and is not added to the model's tool result.
96
+
97
+ The interactive input supports ←/→, Home/End, Delete/Backspace, Ctrl-A/E/U/W, and ↑/↓ history. Ctrl-C clears a non-empty idle input before exiting. Bracketed multi-line paste is preserved as one prompt, shown in a bounded single-line viewport while editing, and collapsed to a line/character summary on submission. Structured model questions use the same arrow-key picker with a custom-answer option. During model generation or `shell_exec`, Ctrl-C aborts the current turn and returns to the input instead of terminating Apollo; an aborted turn is rolled back when no tool side effect has completed.
98
+
99
+ Quiet tool results retain useful context instead of generic “completed” messages: reads and lists include their path, searches include the query and result count when available, and Bash shows the command plus a bounded six-line output preview. Long output remains in the model-visible tool result without flooding the terminal.
100
+
101
+ If a streamed tool call ends with malformed or truncated JSON, Apollo automatically retries the same model request once without streaming. No tool has executed at that point, so the recovered tool call can continue safely without duplicating a write or other side effect.
102
+
103
+ ## Runtime recovery
104
+
105
+ The main loop follows CC's staged recovery model while keeping bounded defaults:
106
+
107
+ - Network failures and provider `408`, `409`, `425`, `429`, `5xx`, and `529` responses retry up to three times. Apollo honors `Retry-After` and `x-should-retry`, uses exponential backoff with jitter, and caps each wait at 30 seconds.
108
+ - Malformed, empty, or truncated event streams retry once without streaming. If partial text was already displayed, Apollo emits only the missing suffix when the recovered response has the same prefix.
109
+ - Provider prompt/context overflow triggers one forced semantic compaction, then retries the same pending user request with the compacted message history.
110
+ - `max_tokens` / `max_output_tokens` responses continue automatically up to two times. Partial text remains in the transcript and in the final SDK result.
111
+ - Tool failures remain ordinary `tool_result` errors for the model to handle. API retries occur before tool execution, so writes and other side effects are never replayed by the recovery loop.
112
+
113
+ ## AskUserQuestion
114
+
115
+ Tool: `ask_user_question`
116
+ CLI prompts interactively (options as `1) …`).
117
+
118
+ ## Session resume
119
+
120
+ - `apollo -r` and `/resume` open an interactive saved-session picker. Use ↑/↓ to move, Enter to resume, and Esc to cancel.
121
+ - After a session is resumed, Apollo redraws its user/assistant transcript, including older turns archived by context compaction. Internal runtime context, compaction summaries, and tool-result payloads stay hidden.
122
+ - In non-interactive terminals, the picker falls back to accepting a number or session ID.
123
+
124
+ Sessions: `.apollo/sessions/<id>.json` + `latest` pointer.
125
+ Auto-saves after each turn, including aggregate and per-category usage counters.
126
+
127
+ ## Skillify
128
+
129
+ ```text
130
+ /skillify auth-fix | Fix session expiry null pointer workflow
131
+ ```
132
+
133
+ Creates `skills/auth-fix/SKILL.md` from recent transcript.
package/docs/guide.md ADDED
@@ -0,0 +1,250 @@
1
+ # Apollo 使用指南
2
+
3
+ 本文对应 `@apolloyh/apollo-agent` 0.1.10。Apollo 是一个可在终端运行、也可通过 Node.js SDK 嵌入其他系统的个人 Agent。
4
+
5
+ ## 安装与升级
6
+
7
+ 要求 Node.js 20 或更高版本。
8
+
9
+ ```bash
10
+ npm install -g @apolloyh/apollo-agent
11
+ apollo
12
+ ```
13
+
14
+ 升级到最新版:
15
+
16
+ ```bash
17
+ npm install -g @apolloyh/apollo-agent@latest
18
+ ```
19
+
20
+ 第一次运行会自动创建:
21
+
22
+ - `~/.apollo/.env`:模型和搜索服务的密钥
23
+ - `~/.apollo/config.json`:实际使用的用户级配置
24
+ - `~/.apollo/config.example.json`:完整配置示例
25
+
26
+ 没有模型密钥时仍可进入交互界面;发送消息时会提示补充密钥。
27
+
28
+ ## 模型与搜索配置
29
+
30
+ 编辑 `~/.apollo/.env`:
31
+
32
+ ```dotenv
33
+ ANTHROPIC_AUTH_TOKEN=your_model_token
34
+ ANTHROPIC_BASE_URL=https://open.bigmodel.cn/api/anthropic
35
+ ANTHROPIC_MODEL=glm-5.2
36
+
37
+ # 可选:Exa 搜索
38
+ EXA_API_KEY=your_exa_key
39
+
40
+ # 可选
41
+ # ANTHROPIC_MAX_TOKENS=131072
42
+ # ANTHROPIC_TIMEOUT_MS=300000
43
+ # ANTHROPIC_CACHE_TTL=5m
44
+ ```
45
+
46
+ Apollo 使用 Anthropic Messages API 兼容接口。GLM/BigModel 在未显式配置时默认使用 131072 的输出上限;其他提供商默认 4096。显式设置 `ANTHROPIC_MAX_TOKENS` 始终优先。
47
+
48
+ 环境文件发现顺序:
49
+
50
+ 1. `--env-file <path>`
51
+ 2. 当前项目 `.apollo/.env`
52
+ 3. 当前项目 `.env`
53
+ 4. 用户目录 `~/.apollo/.env`
54
+
55
+ 密钥只应放在 env 文件或宿主进程环境变量中,不要写入 `config.json`、`APOLLO.md`、日志或会话消息。
56
+
57
+ ## 启动参数
58
+
59
+ ```bash
60
+ apollo # 交互模式
61
+ apollo "分析这个项目" # 一次性任务
62
+ apollo --yolo # 自动批准工具,readonly 仍然优先
63
+ apollo --verbose # 显示详细工具过程
64
+ apollo --no-stream # 关闭模型流式输出
65
+ apollo --no-color # 关闭 ANSI 颜色
66
+ apollo -c # 继续当前项目最近会话
67
+ apollo -r # 方向键选择历史会话
68
+ apollo -r <session-id> # 恢复指定会话
69
+ apollo --config <path> # 使用显式 Agent 配置
70
+ apollo --env-file <path> # 使用显式环境文件
71
+ ```
72
+
73
+ ## 配置文件
74
+
75
+ 配置合并顺序:内置默认值 → `~/.apollo/config.json` → 项目 `.apollo/config.json` → `--config` 指定文件。后层只覆盖它提供的字段;可选字符串的空值视为“未设置”,不会清掉上层有效提示词。
76
+
77
+ 常用配置:
78
+
79
+ ```json
80
+ {
81
+ "workspaceRoot": ".",
82
+ "systemPrompt": "始终使用中文回答。",
83
+ "modeInstructions": "",
84
+ "maxTurns": 40,
85
+ "context": {
86
+ "maxChars": 262144,
87
+ "summaryChars": 12000
88
+ },
89
+ "permissions": {
90
+ "mode": "ask",
91
+ "autoApproveReadOnly": true
92
+ },
93
+ "skills": {
94
+ "directories": ["./skills"]
95
+ },
96
+ "mcpServers": {}
97
+ }
98
+ ```
99
+
100
+ 权限模式:
101
+
102
+ - `ask`:低风险读取可自动批准,写入、shell、git、外部操作等按风险询问
103
+ - `readonly`:只允许低风险只读操作;`--yolo` 不能绕过
104
+ - `unrestricted`:运行时自动批准,进程仍受操作系统权限约束
105
+
106
+ 完整字段和子 Agent 配置见自动生成的 `~/.apollo/config.example.json`。
107
+
108
+ ## 系统提示词与 APOLLO.md
109
+
110
+ `systemPrompt` 会放在完整系统提示词最前面,之后依次拼接 Apollo 内置身份与安全规则、任务规则、工具规则、skills 规则、表达规则、项目指令、模式指令、子 Agent 规则和运行环境。
111
+
112
+ Apollo 还会加载:
113
+
114
+ 1. 用户级 `~/.apollo/APOLLO.md` 或 `~/.apollo/apollo.md`
115
+ 2. 项目中第一个存在的 `APOLLO.md`、`apollo.md`、`AGENTS.md`、`.apollo/instructions.md`
116
+
117
+ 配置、系统提示词、项目指令和工具定义在一个 Engine 的对话期间冻结。修改后需要重启 Apollo 或创建新的 SDK Engine 才会生效。这也能保持厂商 Prompt Cache 的前缀稳定。
118
+
119
+ ## 对话与终端交互
120
+
121
+ - 短的多行输入会让输入框随内容增高。
122
+ - 大段粘贴会折叠为 `[Pasted text #N +X lines]`,提交给模型时仍恢复完整内容。
123
+ - Agent 工作期间输入并按 Enter,会把消息加入 FIFO 队列。
124
+ - 工作期间按 Esc 或 Ctrl-C 可中断当前回合并恢复输入框。
125
+ - 成功的文件修改会显示 `Update(path)`、增删统计和彩色 diff。
126
+ - `/verbose on` 可查看更完整的工具准备、执行和结果信息。
127
+
128
+ ## Slash 命令
129
+
130
+ | 命令 | 作用 |
131
+ |---|---|
132
+ | `/help` | 显示命令列表 |
133
+ | `/status` | 模型、上下文、Token、Prompt Cache 和会话状态 |
134
+ | `/skill` | 列出内置及工作区 skills |
135
+ | `/skill install <path> [name]` | 从本地目录或 `SKILL.md` 安装到工作区 |
136
+ | `/simplify [focus]` | 简化并审查当前修改 |
137
+ | `/verify [claim]` | 用可执行证据验证修改 |
138
+ | `/debug [problem]` | 系统化复现和定位故障 |
139
+ | `/agents` | 查看当前会话的子 Agent 活动 |
140
+ | `/compact` | 立即语义压缩较早上下文 |
141
+ | `/save` | 保存当前会话 |
142
+ | `/sessions` | 列出项目会话 |
143
+ | `/resume [session-id]` | 选择或恢复会话并显示历史记录 |
144
+ | `/clear` | 清空当前对话上下文 |
145
+ | `/plan` | 进入只读计划模式 |
146
+ | `/approve` / `/reject` | 批准或拒绝 `.apollo/plan.md` |
147
+ | `/goal <goal>` | 持续执行目标,支持 `max=N` |
148
+ | `/goal-stop` | 停止 Goal 模式 |
149
+ | `/workflow <goal>` | 启动研究→实现→验证→交付工作流 |
150
+ | `/wf` | 查看工作流状态 |
151
+ | `/memory [query]` | 列出或搜索项目记忆 |
152
+ | `/skillify <name> \| <description>` | 从当前会话生成工作区 skill |
153
+ | `/thought` | 展开或折叠 Thought 显示 |
154
+ | `/verbose on\|off` | 切换详细工具过程 |
155
+ | `/stream on\|off` | 切换流式回答 |
156
+ | `/exit` | 保存并退出 |
157
+
158
+ ## 内置 skills
159
+
160
+ Apollo 随 npm 包提供三个通用 skill:
161
+
162
+ - `simplify`:检查复用、重复、复杂度和低效实现,只修复范围内的真实问题
163
+ - `verify`:从需求和 diff 提取验收条件,运行真实检查并给出 PASS/FAIL/PARTIAL
164
+ - `debug`:复现问题、验证假设、定位根因,并在要求修复时增加回归检查
165
+
166
+ 项目 `skills/<name>/SKILL.md` 中的同名 skill 会覆盖内置版本。用户安装的工作区 skills 不会被打进 Apollo npm 包。
167
+
168
+ ## 子 Agent
169
+
170
+ Apollo 按需创建子 Agent,不会在启动时预先运行:
171
+
172
+ - `Explore`:只读搜索、代码流追踪、完整盘点
173
+ - `Plan`:只读分析并输出可执行计划
174
+ - `general-purpose`:隔离执行复杂的研究、实现或混合任务
175
+
176
+ 主 Agent 负责用户对话和最终结论;子 Agent 没有历史对话,只接收主 Agent 写入的任务简报,且不能继续创建下级子 Agent。
177
+
178
+ ## 搜索、工具与 MCP
179
+
180
+ 内置工具包括文件读取与编辑、shell、git、Exa 搜索、网页抓取、skills、记忆、MCP、邮件、用户提问和 Task 子 Agent。
181
+
182
+ - `web_search` 使用 Exa,需要 `EXA_API_KEY`,进程内对相同查询缓存 10 分钟。
183
+ - `web_fetch` 会阻止本机、私网和危险重定向,降低 SSRF 风险。
184
+ - `edit_file` 用于精确局部替换;`write_file` 用于新建或完整覆盖。
185
+ - MCP 服务在 `mcpServers` 中配置,连接会在 Engine 生命周期内复用并在 `close()` 时关闭。
186
+
187
+ MCP 示例:
188
+
189
+ ```json
190
+ {
191
+ "mcpServers": {
192
+ "example": {
193
+ "command": "npx",
194
+ "args": ["-y", "@example/mcp-server"],
195
+ "env": {},
196
+ "cwd": "."
197
+ }
198
+ }
199
+ }
200
+ ```
201
+
202
+ ## Hooks 与安全边界
203
+
204
+ 复制 npm 包中的 `.apollo/hooks.example.json` 为项目 `.apollo/hooks.json`:
205
+
206
+ ```json
207
+ {
208
+ "log": true,
209
+ "denyTools": ["email_send"],
210
+ "denyMessage": "Email blocked by project hooks."
211
+ }
212
+ ```
213
+
214
+ 配置文件支持在 `PreToolUse` 阶段拒绝指定工具,并选择性记录经过脱敏的 `PreToolUse`/`PostToolUse` 日志。格式错误的 hooks 配置会 fail closed,阻止工具执行。
215
+
216
+ Apollo 的权限机制是应用层防线,不是操作系统沙箱。开启 `--yolo`、`unrestricted`、shell 或第三方 MCP 时,工具仍拥有当前系统用户的权限。对不可信用户或多租户服务,应在 Apollo 外使用容器或独立进程隔离。
217
+
218
+ ## 会话、记忆和上下文
219
+
220
+ - 会话:`.apollo/sessions/`
221
+ - 记忆:`.apollo/memory/`
222
+ - 计划:`.apollo/plan.md`
223
+ - hooks 日志:`.apollo/hooks.log`
224
+
225
+ 会话在每回合后自动保存。恢复会话时会重新显示用户和助手历史;工具内部消息和压缩摘要不会直接展示。会话文件未加密,不应包含秘密。
226
+
227
+ 活动上下文达到 `context.maxChars` 的 70% 时会触发语义压缩,较早原文归档在会话文件中。默认字符预算为 262144,`summaryChars` 控制摘要长度。
228
+
229
+ ## Prompt Cache 指标
230
+
231
+ Apollo 不伪造本地 Prompt Cache 命中;`/status` 只使用模型厂商响应中的 usage 字段统计:
232
+
233
+ - `hit/latest`:最近一次主模型请求的缓存命中率
234
+ - `hit/session`:整个会话累计命中率
235
+ - `hit/main`、`hit/task`、`hit/compaction`:按请求类别统计
236
+ - `cache key`:稳定前缀、配置、系统提示词和工具定义的短指纹,用于诊断变化,不包含提示词正文或密钥
237
+
238
+ 为了提高命中率,Apollo 将稳定的 system、tools 和配置放在前面并在 Engine 生命周期内冻结;动态消息、记忆、Goal/Workflow 状态放在后面。
239
+
240
+ ## SDK
241
+
242
+ 需要嵌入 Node.js / TypeScript 服务时,请阅读 [SDK 接入指南](sdk.md)。
243
+
244
+ ## 故障排查
245
+
246
+ - `Missing ANTHROPIC_AUTH_TOKEN`:编辑 `~/.apollo/.env` 后重启。
247
+ - `EEXIST .../bin/apollo`:先确认 `which apollo`;移除旧的手动软链接或旧全局包后重装。
248
+ - 搜索不可用:检查 `EXA_API_KEY`,普通文件和代码搜索不依赖 Exa。
249
+ - 修改配置没有生效:重启 Apollo;配置和提示词在当前 Engine 中冻结。
250
+ - 大文件工具 JSON 被截断:检查 `/status` 的 `output max`,并确认没有显式配置过低的 `ANTHROPIC_MAX_TOKENS`。