neoctl 0.1.4 → 0.1.6

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.
Files changed (69) hide show
  1. package/README.md +369 -151
  2. package/dist/agents/smoke-agents.js +21 -4
  3. package/dist/agents/smoke-agents.js.map +1 -1
  4. package/dist/core/query-engine.d.ts +20 -1
  5. package/dist/core/query-engine.js +86 -12
  6. package/dist/core/query-engine.js.map +1 -1
  7. package/dist/core/query.d.ts +2 -1
  8. package/dist/core/query.js +2 -0
  9. package/dist/core/query.js.map +1 -1
  10. package/dist/core/smoke-core-loop.js +19 -3
  11. package/dist/core/smoke-core-loop.js.map +1 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.js +0 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/model/communication-logger.d.ts +2 -1
  16. package/dist/model/communication-logger.js +3 -0
  17. package/dist/model/communication-logger.js.map +1 -1
  18. package/dist/model/config.d.ts +7 -4
  19. package/dist/model/config.js +41 -12
  20. package/dist/model/config.js.map +1 -1
  21. package/dist/model/deepseek-adapter.d.ts +29 -0
  22. package/dist/model/deepseek-adapter.js +108 -0
  23. package/dist/model/deepseek-adapter.js.map +1 -0
  24. package/dist/model/env.js +25 -13
  25. package/dist/model/env.js.map +1 -1
  26. package/dist/model/model-metadata.json +677 -677
  27. package/dist/model/openai-adapter.d.ts +1 -1
  28. package/dist/model/openai-chat-mapper.d.ts +3 -1
  29. package/dist/model/openai-chat-mapper.js +26 -8
  30. package/dist/model/openai-chat-mapper.js.map +1 -1
  31. package/dist/model/openai-mappers.d.ts +5 -2
  32. package/dist/model/openai-mappers.js +17 -4
  33. package/dist/model/openai-mappers.js.map +1 -1
  34. package/dist/model/openai-responses-mapper.d.ts +1 -1
  35. package/dist/model/openai-responses-mapper.js +2 -1
  36. package/dist/model/openai-responses-mapper.js.map +1 -1
  37. package/dist/model/provider-factory.js +16 -0
  38. package/dist/model/provider-factory.js.map +1 -1
  39. package/dist/model/smoke-deepseek-mapper.d.ts +1 -0
  40. package/dist/model/smoke-deepseek-mapper.js +65 -0
  41. package/dist/model/smoke-deepseek-mapper.js.map +1 -0
  42. package/dist/model/smoke-openai.js +1 -1
  43. package/dist/model/smoke-openai.js.map +1 -1
  44. package/dist/model/smoke-responses-mapper.js +6 -6
  45. package/dist/model/smoke-responses-mapper.js.map +1 -1
  46. package/dist/repl/commands.d.ts +5 -0
  47. package/dist/repl/commands.js +6 -0
  48. package/dist/repl/commands.js.map +1 -1
  49. package/dist/repl/index.js +542 -40
  50. package/dist/repl/index.js.map +1 -1
  51. package/dist/repl/render.js +0 -2
  52. package/dist/repl/render.js.map +1 -1
  53. package/dist/repl/status-line.d.ts +0 -1
  54. package/dist/repl/status-line.js +27 -34
  55. package/dist/repl/status-line.js.map +1 -1
  56. package/dist/session/session-export.d.ts +33 -0
  57. package/dist/session/session-export.js +351 -0
  58. package/dist/session/session-export.js.map +1 -0
  59. package/dist/session/smoke-session.js +22 -1
  60. package/dist/session/smoke-session.js.map +1 -1
  61. package/dist/skills/smoke-skills.js +1 -1
  62. package/dist/tools/builtins/search-providers.d.ts +15 -1
  63. package/dist/tools/builtins/search-providers.js +195 -1
  64. package/dist/tools/builtins/search-providers.js.map +1 -1
  65. package/dist/tools/builtins/search-tool.js +2 -2
  66. package/dist/tools/builtins/search-tool.js.map +1 -1
  67. package/dist/tools/smoke-tool-system.js +43 -9
  68. package/dist/tools/smoke-tool-system.js.map +1 -1
  69. package/package.json +50 -49
package/README.md CHANGED
@@ -1,151 +1,369 @@
1
- # Agent Scaffold Source
2
-
3
- This directory is a TypeScript implementation scaffold for the parent README. Chapters 01, 02, 03, 04, 05-core, and 07 now have runnable paths; later chapters still expose stable module boundaries and placeholders.
4
-
5
- ## Shape
6
-
7
- - `src/repl`: the UI layer. It owns terminal input, slash commands, system init events, and rendering streamed events.
8
- - `src/core`: the multi-turn query loop, loop state, message pipeline, `QueryEngine`, and child-agent runner entry points.
9
- - `src/model`: provider-neutral model gateway/config/factory, provider adapters, OpenAI Responses/Chat mappers, HTTP transport, SSE decoder, retry, and normalized errors.
10
- - `src/tools`: lifecycle tool contracts, registry, schema validation, execution pipeline, batch orchestration, streaming executor, and built-in tools.
11
- - `src/context`: system prompt sections, runtime user/system context, deterministic compaction helpers, and model-driven compaction.
12
- - `src/session`: JSONL session transcripts, tool-result persistence, latest/specific session resume, and session listing.
13
- - `src/agents`: agent definitions, `AgentTool`, prompt rules, fork constraints, local task lifecycle, and agent smoke coverage.
14
- - `src/tasks`: background task store, task-control tools, named-agent message routing, and persisted task output files.
15
- - `src/skills`: inline workflow-as-tool injection and fork-skill boundary.
16
- - `src/safety`: optional permission, sandbox, and audit ports.
17
- - `src/app`: app-state ports used by tools and runtime code.
18
- - `vendor/ripgrep`: per-platform bundled `rg` binaries installed by `npm run vendor:rg` or optional `postinstall`.
19
-
20
- ## Commands
21
-
22
- ```bash
23
- npm install
24
- npm run vendor:rg
25
- npm run typecheck
26
- npm run build
27
- npm run smoke:core
28
- npm run smoke:tools
29
- npm run smoke:context
30
- npm run smoke:agents
31
- npm run smoke:skills
32
- npm run smoke:openai -- "Say pong"
33
- npm run dev
34
- ```
35
-
36
- ## Core Loop
37
-
38
- `src/core/query.ts` implements the Chapter 01 main path as a streaming state machine:
39
-
40
- - prepares each turn from a single `QueryState`
41
- - applies compact-boundary filtering and tool-result budgeting before model calls
42
- - builds system/user context into the model request
43
- - streams assistant deltas and messages to the UI
44
- - collects `tool_use` events, executes tools, and feeds `tool_result` messages into the next model turn
45
- - tracks `previousResponseId` for Responses API tool-result continuation
46
- - emits terminal reasons such as `completed`, `max_turns`, `model_error`, and abort states
47
- - keeps max-output-token recovery and reactive compact continuation points explicit
48
-
49
- `npm run smoke:core` verifies the tool-call follow-up loop with a fake model and the built-in `echo` tool.
50
-
51
- ## Tool System
52
-
53
- `src/tools` implements the Chapter 02 tool system contract:
54
-
55
- - tools are lifecycle objects with identity, aliases, schemas, metadata, validators, execution, result mapping, progress rendering, and optional context modifiers
56
- - `ToolRegistry` keeps built-in tools as a stable prompt-cache prefix, supports aliases, filters deferred tools, and merges external tools deterministically
57
- - `runToolUse()` performs schema validation, custom validation, permission decision, progress emission, abort handling, result mapping, max-result truncation, new messages, and context modifier propagation
58
- - `runTools()` partitions tool calls into concurrency-safe batches and serial batches, applying context modifiers in tool-use order
59
- - `StreamingToolExecutor` can start tools as tool calls arrive and can synthesize discarded results on fallback/abort
60
- - `grepTool` calls the bundled ripgrep binary through `ripgrep-binary.ts`, supports smart/sensitive/insensitive case modes, glob filters, hidden-file opt-in, bounded context lines, and bounded total results
61
- - `searchTool` performs web search through a pluggable `SearchProvider`; the initial backend is Exa MCP, with provider factory seams for future Bing/Tavily/custom implementations
62
- - `scripts/install-ripgrep.cjs` resolves the current OS/CPU, downloads the matching official ripgrep release asset, extracts `rg`, and writes a manifest beside the binary; runtime lookup does not depend on PATH
63
-
64
- `npm run smoke:tools` verifies aliases, schema/custom validation, unknown-tool errors, max result truncation, bundled-rg grep, pluggable web search, and concurrent batch execution.
65
-
66
- ## Context And Prompts
67
-
68
- `src/context` implements the Chapter 03 and Chapter 05 prompt/context path:
69
-
70
- - `prompts.ts` builds system prompt sections with `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__`, replacement priority, proactive agent append mode, and prefix splitting for cache-aware providers
71
- - `DefaultContextManager` memoizes user context (`currentDate`, project memory files) and system context (`cwd`, platform, git branch/status/recent commit)
72
- - `message-pipeline.ts` prepends user context as a user message, appends system context to the system prompt, respects compact boundaries, and budgets oversized tool results
73
- - `ModelDrivenCompactor` uses the configured model gateway for autocompact and reactive compact summaries
74
- - deterministic snip, microcompact, and summary fallback remain available when model summarization fails or when tests need predictable output
75
- - `query.ts` persists compact-boundary messages into the event stream and retries once after provider `context_length` errors
76
-
77
- `npm run smoke:context` verifies prompt boundary splitting, context injection, tool result budgeting, deterministic compaction, model-driven autocompact, and prompt-too-long recovery.
78
-
79
- ## Session Resume
80
-
81
- The REPL writes JSONL transcripts under `.agent/sessions` by default. After each user message, a background title subagent check is scheduled after 5s: it creates one initial title, then performs one later refinement with the conversation and previous title if the prior title agent has finished. `/sessions` opens an interactive browser (default 10 per page): use ↑/↓ to select a session, ←/→ to switch pages when more than one page exists, Enter to resume the selected session, and Esc to close.
82
-
83
- Startup resume is available with environment variables:
84
-
85
- ```bash
86
- set AGENT_SESSION_RESUME=1
87
- npm run dev
88
-
89
- set AGENT_SESSION_ID=<session_id>
90
- set AGENT_SESSION_RESUME=1
91
- npm run dev
92
- ```
93
-
94
- Set `AGENT_SESSION_TRANSCRIPT=0` to disable transcript persistence, or `AGENT_SESSION_DIR=<absolute-or-relative-dir>` to store transcripts elsewhere. `/reset` clears the active history and records a reset marker so future resumes start after the reset.
95
-
96
- `npm run smoke:session` verifies transcript recording, latest-session lookup, specific-session resume, tool-result output persistence, and reset markers.
97
-
98
- ## Subagents And Tasks
99
-
100
- `src/agents` and `src/tasks` implement the Chapter 04 core path:
101
-
102
- - `AgentTool` is a normal tool with `prompt`, `description`, `subagent_type`, `model`, `run_in_background`, `name`, `team_name`, `mode`, `isolation`, and `cwd` inputs
103
- - `AgentTool` now exports prompt rules covering fresh/fork/background/parallel/prompt-quality behavior
104
- - `runAgent()` creates isolated child messages/context/tool pools and reuses the same `query()` loop
105
- - `AgentDefinition` supports tool allow/deny lists, model, effort, permission mode, background, max turns, memory, isolation, and custom system prompts
106
- - sync agents return a completed structured result; background/fork agents register `LocalAgentTask` and return `async_launched`
107
- - `TaskOutput`, `TaskList`, `TaskGet`, `TaskStop`, and `SendMessage` provide the minimum control surface for background agents
108
- - completed background tasks write `.agent-tasks/<task_id>.txt`; the directory is gitignored
109
- - fork children get explicit anti-recursion and scope boilerplate; teammate/team inputs are represented as named background agents for now
110
-
111
- `npm run smoke:agents` verifies sync delegation, async launch, task output, output-file persistence, task listing, and named-agent message routing.
112
-
113
- ## Skills
114
-
115
- `src/skills` implements the low-risk part of Chapter 05 SkillTool:
116
-
117
- - `SkillTool` validates skill existence and model invocation eligibility
118
- - inline skills inject a meta user message into the next model turn through `newMessages`
119
- - inline skills can update main loop model and effort through `contextModifier`
120
- - fork skills are recognized and return a structured `fork_required` result instead of silently pretending to run
121
-
122
- `npm run smoke:skills` verifies inline injection, context modification, fork-skill rejection, and unknown-skill validation.
123
-
124
- ## Model Providers
125
-
126
- The REPL loads environment files, reads `MODEL_*` settings into a small discriminated provider config, and constructs a provider through `provider-factory.ts`. It loads the current directory `.env` first, then overrides it with the user-level config at `%APPDATA%\\neo\\.env` on Windows or `~/.config/neo/.env` on other platforms. If the user-level config file is missing, `neo` creates a commented template there and prints a startup notice telling the user to fill `MODEL_API_KEY`. Set `NEO_ENV_FILE` to point at a custom env file; that file has the highest priority. Provider-specific switches stay inside provider-owned config (`OpenAIProviderConfig.openai.endpoint` today), while `OPENAI_*` variables remain supported as compatibility aliases.
127
-
128
- ```bash
129
- mkdir "%APPDATA%\\neo"
130
- notepad "%APPDATA%\\neo\\.env"
131
-
132
- # In the env file:
133
- MODEL_PROVIDER=openai
134
- MODEL_API_KEY=your-api-key
135
- MODEL_BASE_URL=https://api.openai.com
136
- MODEL_ID=gpt-5.5
137
- MODEL_REASONING_EFFORT=high
138
- MODEL_ENDPOINT=auto
139
-
140
- npm run smoke:openai -- "Say pong"
141
- npm run dev
142
- ```
143
-
144
- The OpenAI adapter is split into a small provider facade plus mappers:
145
-
146
- - `openai-adapter.ts`: endpoint selection, auth, transport, retry, and Responses-to-Chat fallback
147
- - `openai-responses-mapper.ts`: `/v1/responses` request and event mapping
148
- - `openai-chat-mapper.ts`: OpenAI-compatible `/v1/chat/completions` fallback mapping
149
- - `openai-mappers.ts`: shared tool/message/usage helpers
150
-
151
- `MODEL_ENDPOINT=auto` tries `/v1/responses` first and falls back to `/v1/chat/completions` for OpenAI-compatible gateways that do not expose Responses API.
1
+ # neoctl / neo
2
+
3
+ neoctl 是一个用 TypeScript 编写的本地 AI 工程代理运行时。项目提供 `neo` 命令行 REPL,也导出核心运行时模块,围绕流式模型调用、工具执行、上下文管理、会话恢复和子代理任务编排构建。
4
+
5
+ ## 特性亮点
6
+
7
+ - **流式多轮 Agent Loop**:模型输出、thinking、工具调用、工具结果和终止状态都通过统一事件流传递。
8
+ - **OpenAI 兼容模型网关**:支持 `/v1/responses` `/v1/chat/completions`,`OPENAI_ENDPOINT=auto` 时会优先尝试 Responses API,并在兼容网关不支持时回退到 Chat Completions。
9
+ - **内置工程工具集**:文件读写、文本替换、命令执行、目录列表、ripgrep 搜索、Web 搜索、计划展示、子代理和后台任务控制。
10
+ - **上下文预算与压缩**:在每次模型调用前注入用户/系统上下文、估算上下文占用、预算大型工具结果,并支持自动、手动和错误恢复压缩。
11
+ - **会话持久化与恢复**:默认记录 JSONL transcript,大型工具结果落盘保存,支持最近/指定会话恢复和交互式会话浏览。
12
+ - **子代理与后台任务**:同一套 query loop 可运行同步子代理、后台子代理、fork 子代理,以及后台 shell 任务。
13
+ - **TTY REPL 体验**:Ink UI、slash command 补全、Markdown 渲染、流式状态栏、token 使用统计、剪贴板文本/图片粘贴、会话标题和终端标题更新。
14
+
15
+ ## 快速开始
16
+
17
+ 要求 Node.js >= 20。
18
+
19
+ ```bash
20
+ npm install
21
+ npm run build
22
+ npm start
23
+ ```
24
+
25
+ 开发模式:
26
+
27
+ ```bash
28
+ npm run dev
29
+ ```
30
+
31
+ 首次启动会创建用户级配置文件:
32
+
33
+ - Windows:`%APPDATA%\neo\.env`
34
+ - macOS/Linux:`~/.config/neo/.env`
35
+
36
+ 可以运行 `/login` 交互式填写并保存,也可以手动编辑。推荐格式是:`MODEL_PROVIDER` 只选择当前供应者;供应者专属的 key、base URL、model 分别写在 `OPENAI_*` / `DEEPSEEK_*` 下;跨供应者共用的运行参数保留 `MODEL_*`。
37
+
38
+ ```env
39
+ # Active provider
40
+ MODEL_PROVIDER=openai
41
+
42
+ # OpenAI provider settings
43
+ OPENAI_API_KEY=your-openai-api-key
44
+ OPENAI_BASE_URL=https://api.openai.com
45
+ OPENAI_MODEL=gpt-5.5
46
+ OPENAI_FALLBACK_MODEL=
47
+ OPENAI_ENDPOINT=auto
48
+
49
+ # DeepSeek provider settings
50
+ DEEPSEEK_API_KEY=your-deepseek-api-key
51
+ DEEPSEEK_BASE_URL=https://api.deepseek.com
52
+ DEEPSEEK_MODEL=deepseek-chat
53
+ DEEPSEEK_FALLBACK_MODEL=
54
+
55
+ # Shared model runtime settings
56
+ MODEL_REASONING_EFFORT=high
57
+ MODEL_REASONING_SUMMARY=auto
58
+ MODEL_MAX_OUTPUT_TOKENS=800
59
+ MODEL_TIMEOUT_MS=120000
60
+ MODEL_STREAM_IDLE_TIMEOUT_MS=120000
61
+ MODEL_MAX_RETRIES=2
62
+ ```
63
+
64
+ 也可以在当前工作目录放 `.env`,或通过 `NEO_ENV_FILE=/path/to/.env` 指定配置文件。加载顺序是:当前目录 `.env` 用户级 `.env` `NEO_ENV_FILE`,后者优先级最高。
65
+
66
+ ## 常用命令
67
+
68
+ ```bash
69
+ npm run typecheck # TypeScript 类型检查
70
+ npm run build # 编译到 dist,并复制模型元数据
71
+ npm run vendor:rg # 下载/安装当前平台的 ripgrep vendor/ripgrep
72
+ npm run smoke:core # 核心 query loop 冒烟测试
73
+ npm run smoke:tools # 工具体系冒烟测试
74
+ npm run smoke:context # 上下文和压缩冒烟测试
75
+ npm run smoke:session # 会话持久化冒烟测试
76
+ npm run smoke:agents # 子代理/任务冒烟测试
77
+ npm run smoke:skills # skill 模块冒烟测试
78
+ npm run smoke:responses # OpenAI Responses mapper 冒烟测试
79
+ npm run smoke:deepseek # DeepSeek Chat mapper 冒烟测试
80
+ npm run smoke:openai -- "Say pong"
81
+ ```
82
+
83
+ `postinstall` 会以 optional 模式尝试安装 ripgrep;如果失败或需要重装,可手动运行 `npm run vendor:rg`。
84
+
85
+ ## REPL 用法
86
+
87
+ 启动后直接输入自然语言任务即可。常用 slash commands:
88
+
89
+ | 命令 | 作用 |
90
+ | --- | --- |
91
+ | `/help` | 显示命令列表 |
92
+ | `/model` | 查看当前模型和 reasoning 设置 |
93
+ | `/model <model-id>` | 切换模型 |
94
+ | `/model <model-id> <effort>` | 切换模型并设置 reasoning effort |
95
+ | `/model <effort>` | 只切换 reasoning effort |
96
+ | `/login` | 交互式选择供应者、编辑配置并保存到 env 文件 |
97
+ | `/cost` | 查看当前 REPL 会话累计 token 使用量 |
98
+ | `/compact` | 手动压缩早期上下文 |
99
+ | `/pure` | 在风险/WAF 阻断后清理上下文但不重置会话 |
100
+ | `/sessions` | 打开会话浏览器 |
101
+ | `/state` | 查看 query engine 状态与通信日志状态 |
102
+ | `/log <absolute-dir>` | 将模型通信日志写入指定绝对目录 |
103
+ | `/log off` | 关闭模型通信日志 |
104
+ | `/reset` | 清空当前历史,并在 transcript 中写入 reset marker |
105
+ | `/exit` / `/quit` | 退出 |
106
+
107
+ 交互细节:
108
+
109
+ - `Tab` 可补全 slash command。
110
+ - 上/下方向键可浏览输入历史,也可在补全面板中移动选择。
111
+ - `/sessions` 中使用上/下选择,会话多页时左/右或 PageUp/PageDown 翻页,Enter 恢复,Esc 关闭,`d`/Delete/Backspace 删除选中的非活跃会话。
112
+ - `Ctrl+V` / `Cmd+V` 或右键粘贴会读取系统剪贴板;长文本会以附件形式折叠,图片会作为 image block 发送给支持图片输入的模型。
113
+ - 空输入时第一次 `Ctrl+C` 会尝试中断当前任务或提示再次退出,第二次退出;有输入内容时 `Ctrl+C` 清空输入。
114
+
115
+ ## 架构概览
116
+
117
+ ```text
118
+ src/
119
+ repl/ Ink 终端 UI、输入编辑、slash commands、剪贴板、会话浏览
120
+ core/ QueryEngine、多轮 query loop、消息管线、事件流、子代理 runner
121
+ model/ 模型网关、OpenAI adapter、HTTP/SSE、重试、错误归一化、模型元数据
122
+ tools/ Tool 接口、注册表、schema 校验、执行编排、内置工具
123
+ context/ system prompt、用户/系统上下文、上下文指标、压缩器
124
+ session/ JSONL transcript、会话列表/恢复、大型工具结果落盘
125
+ agents/ AgentTool、AgentDefinition、本地后台任务输出
126
+ tasks/ TaskStore、TaskOutput/TaskList/TaskGet/TaskStop/TaskResume/SendMessage
127
+ skills/ 可复用 prompt workflow 的 SkillTool 与内存 catalog
128
+ app/ AppState port 和内存实现
129
+ safety/ permission / sandbox / audit 的接口边界
130
+ types/ message 与 event 类型
131
+ ```
132
+
133
+ ### 运行主线
134
+
135
+ `QueryEngine` 是 REPL 与核心 loop 之间的状态封装:
136
+
137
+ 1. 接收用户输入并追加到历史。
138
+ 2. 记录 session transcript。
139
+ 3. 生成一次 system init message,用于展示本轮可用工具、模型、命令等信息。
140
+ 4. 调用 `query()` 进入流式多轮循环。
141
+ 5. 将模型消息、工具结果、压缩边界和终止状态持续写回历史与 transcript。
142
+
143
+ `query()` 的每轮流程:
144
+
145
+ 1. 构建 runtime context:system prompt、user context、system context。
146
+ 2. 根据 compact boundary 选择参与模型调用的消息。
147
+ 3. 对大型工具结果做预算处理;启用 session 时会将超大结果写到 `.agent/sessions/<session>/tool-results/` 并用预览替换。
148
+ 4. 修复缺失的 tool_use/tool_result 配对,避免模型 API 拒绝历史。
149
+ 5. 估算 context metrics,并按预算触发压缩。
150
+ 6. 流式调用模型网关。
151
+ 7. 收集 assistant 文本、thinking、tool_use usage。
152
+ 8. 如有工具调用,按并发安全规则执行工具,把 tool_result 放入下一轮。
153
+ 9. 无工具调用时结束;如果因输出 token 达限且没有工具调用,会尝试提高输出预算继续。
154
+ 10. 遇到 context length 错误时会进行一次 reactive compact 后重试。
155
+
156
+ 事件类型定义在 `src/types/events.ts`,包括 `state`、`context.metrics`、`assistant.delta`、`thinking.delta`、`tool.started`、`tool.finished`、`usage`、`terminal` 等。
157
+
158
+ ## 模型层
159
+
160
+ 模型访问通过 `ModelGateway` 抽象。当前内置 provider 包括 OpenAI 与 DeepSeek:
161
+
162
+ - `openai-adapter.ts`:端点选择、认证、超时、重试、Responses→Chat fallback。
163
+ - `deepseek-adapter.ts`:DeepSeek OpenAI 格式 Chat Completions,默认 `https://api.deepseek.com/chat/completions`,支持 `reasoning_content` 到 thinking 事件的归一化。
164
+ - `openai-responses-mapper.ts`:Responses API 请求和流事件归一化。
165
+ - `openai-chat-mapper.ts`:Chat Completions 请求和流事件归一化。
166
+ - `http-transport.ts` / `sse-decoder.ts`:HTTP 请求与 SSE 流解析。
167
+ - `errors.ts`:将 provider 错误归一为 `ModelAPIError` 分类。
168
+ - `context-window.ts` + `model-metadata.json`:静态模型元数据,用于 context window、reasoning effort 和图片输入能力判断。
169
+
170
+ 支持的配置变量:
171
+
172
+ | 变量 | 说明 |
173
+ | --- | --- |
174
+ | `MODEL_PROVIDER` | `openai` 或 `deepseek` |
175
+ | `OPENAI_API_KEY` / `DEEPSEEK_API_KEY` | 供应者专属 API Key;只读取当前 `MODEL_PROVIDER` 对应的一组变量 |
176
+ | `OPENAI_BASE_URL` / `DEEPSEEK_BASE_URL` | 供应者专属服务地址;DeepSeek 默认 `https://api.deepseek.com` |
177
+ | `OPENAI_MODEL` / `DEEPSEEK_MODEL` | 供应者专属默认模型;OpenAI 默认 `gpt-5.5`,DeepSeek 默认 `deepseek-chat` |
178
+ | `OPENAI_FALLBACK_MODEL` / `DEEPSEEK_FALLBACK_MODEL` | 供应者专属 fallback model |
179
+ | `OPENAI_ENDPOINT` | OpenAI 专用,`responses`、`chat` 或 `auto`;DeepSeek 固定使用 Chat Completions |
180
+ | `MODEL_REASONING_EFFORT` | 共享运行设置:`none`、`minimal`、`low`、`medium`、`high`、`xhigh`、`max` |
181
+ | `MODEL_REASONING_SUMMARY` | `auto`、`concise`、`detailed` |
182
+ | `MODEL_MAX_OUTPUT_TOKENS` | 默认最大输出 token,未设置时为 800 |
183
+ | `MODEL_CONTEXT_WINDOW_TOKENS` | 覆盖模型上下文窗口估算 |
184
+ | `MODEL_TIMEOUT_MS` | 请求超时 |
185
+ | `MODEL_STREAM_IDLE_TIMEOUT_MS` | 流式响应空闲超时 |
186
+ | `MODEL_MAX_RETRIES` | provider 重试次数 |
187
+
188
+ ## 工具体系
189
+
190
+ 工具实现统一遵循 `Tool<TInput>` 接口,包含:
191
+
192
+ - 名称与 alias。
193
+ - JSON Schema 输入定义。
194
+ - 元数据:是否只读、是否可并发、是否可见、最大结果大小等。
195
+ - 输入 normalize 与自定义校验。
196
+ - 权限决策入口 `canUseTool`。
197
+ - 执行函数 `call()` / `execute()`。
198
+ - 结果映射、进度消息渲染、上下文修改器。
199
+
200
+ `ToolRegistry` 负责注册和按 prompt cache 友好顺序输出工具定义;`runToolUse()` 负责 schema 校验、权限检查、进度事件、执行、结果映射和异常转 tool_result;`runTools()` 会把同一轮模型产生的工具调用按并发安全性分批执行。默认并发上限为 10,可用 `AGENT_MAX_TOOL_USE_CONCURRENCY` 调整。
201
+
202
+ REPL 当前注册的内置工具:
203
+
204
+ | 工具 | 作用 |
205
+ | --- | --- |
206
+ | `echo` | 返回输入文本,主要用于测试链路 |
207
+ | `read` / `view` | 按行范围读取文本文件 |
208
+ | `list` | 列目录,支持递归、隐藏文件、深度、排除项和数量限制 |
209
+ | `grep` | 通过 bundled ripgrep 搜索工作区文本 |
210
+ | `write` | 创建或覆盖文本文件 |
211
+ | `edit` / `replace` | 基于唯一字符串替换修改文件,容忍 LF/CRLF 和直/弯引号差异 |
212
+ | `exec` / `shell` / `bash` / `powershell` | 执行命令,支持 cwd、超时、输出截断和后台模式 |
213
+ | `search` | 通过可插拔 provider 搜索 Web;OpenAI 模型提供者默认走 GPT web search,否则默认 Exa MCP;可显式切换 provider |
214
+ | `plan` | 输出和更新当前任务计划 |
215
+ | `agent` | 启动同步/后台/fork 子代理 |
216
+ | `TaskOutput` | 读取后台任务输出,可阻塞等待完成 |
217
+ | `TaskList` | 列出后台任务 |
218
+ | `TaskGet` | 查看单个后台任务详情 |
219
+ | `TaskStop` | 停止后台任务 |
220
+ | `TaskResume` | 以新指令恢复已结束/失败/停止的后台 agent 任务 |
221
+ | `SendMessage` | 给命名后台 agent 排队消息 |
222
+
223
+ ### 文件与搜索
224
+
225
+ - `read` 对大文件使用 offset/limit 分段读取,避免一次性塞满上下文。
226
+ - `list` 默认跳过 `.git`、`node_modules`、`dist`、`build`、`coverage` 等重目录。
227
+ - `grep` 不依赖系统 PATH,会调用 `vendor/ripgrep` 中的平台二进制;支持 glob、大小写模式、fixed strings、隐藏文件、上下文行、结果数和列宽限制。
228
+ - `search` 默认优先使用显式 `SEARCH_PROVIDER` / `WEB_SEARCH_PROVIDER`;未显式配置且当前模型提供者为 OpenAI(`MODEL_PROVIDER=openai` 或存在 `OPENAI_API_KEY`)时走 OpenAI Responses API 的 GPT web search,否则走 `https://mcp.exa.ai/mcp` 的 `web_search_exa`。OpenAI 搜索可通过 `OPENAI_SEARCH_API_KEY`、`OPENAI_SEARCH_BASE_URL`、`OPENAI_SEARCH_MODEL`、`OPENAI_SEARCH_TOOL_TYPE`、`OPENAI_SEARCH_CONTEXT_SIZE` 配置;Exa 可通过 `EXA_MCP_URL`、`EXA_MCP_TOOL_NAME` 配置;两者超时可用 `SEARCH_TIMEOUT_MS` 配置。模型也可以在单次工具调用里通过 `provider` 字段切换后端,但工具提示会要求:除非用户明确要求特定 provider,或默认/当前搜索 provider 在重试后持续不可用,否则不要显式指定 `provider`,让系统默认选择生效。
229
+
230
+ ### 命令执行
231
+
232
+ `exec` 根据平台和 `shell` 参数选择 PowerShell、cmd、bash 或 sh。支持:
233
+
234
+ - `cwd`:命令工作目录。
235
+ - `timeoutMs`:超时控制。
236
+ - `maxOutputChars`:分别限制 stdout/stderr 返回长度。
237
+ - `background=true`:将长命令注册为后台任务,立即返回 task id,后续用 `TaskGet`/`TaskOutput`/`TaskStop` 管理。
238
+
239
+ ## 上下文与压缩
240
+
241
+ `DefaultContextManager` 每轮构建两类上下文:
242
+
243
+ - **User context**:当前日期,以及项目记忆文件内容。默认读取 `AGENTS.md`、`CLAUDE.md`、`.agent/memory.md`、`.codex/memory.md`、`.github/copilot-instructions.md`。
244
+ - **System context**:cwd、platform、git branch、recent commit、status。
245
+
246
+ `prompts.ts` 将 system prompt 分为可缓存稳定段和动态段,中间使用 `__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__` 标记。`message-pipeline.ts` 在模型调用前把 user context 作为用户消息 prepend,并把 system context append 到 system prompt。
247
+
248
+ 压缩实现位于 `src/context/compaction.ts`:
249
+
250
+ - `DeterministicCompactor` 提供可预测的 snip、microcompact、summary fallback。
251
+ - `ModelDrivenCompactor` 使用当前模型生成摘要,支持 autocompact、manual compact、pure compact 和 reactive compact。
252
+ - 当工具结果过大时,session 模式下 `FileToolResultMemory` 会把完整结果写入文件,仅把预览和路径留在上下文中。
253
+
254
+ ## 会话持久化
255
+
256
+ 默认启用 transcript,位置为:
257
+
258
+ ```text
259
+ .agent/sessions/<session_id>/transcript.jsonl
260
+ .agent/sessions/<session_id>/tool-results/*
261
+ ```
262
+
263
+ 会话记录包括用户/助手/工具消息、内容替换记录、title、compact marker 和 reset marker。`/reset` 不删除文件,而是写入 reset marker,使未来 resume 从 reset 后继续。
264
+
265
+ 相关环境变量:
266
+
267
+ | 变量 | 作用 |
268
+ | --- | --- |
269
+ | `AGENT_SESSION_TRANSCRIPT=0` | 禁用 transcript |
270
+ | `AGENT_SESSION_DIR=<dir>` | 修改 session 根目录 |
271
+ | `AGENT_SESSION_RESUME=1` | 启动时恢复最近会话 |
272
+ | `AGENT_SESSION_ID=<id>` | 指定 session id;配合 resume 恢复指定会话 |
273
+ | `AGENT_SESSION_TITLE_DELAY_MS` | 会话标题生成延迟,默认 5000ms |
274
+ | `AGENT_TOOL_RESULT_THRESHOLD_CHARS` | 大型工具结果落盘阈值 |
275
+
276
+ 每次用户输入后,`QueryEngine` 会延迟启动一个无工具的标题子代理:先生成初始短标题,后续在已有标题基础上进行一次 refinement。标题用于 `/sessions` 列表和终端标题。
277
+
278
+ ## 子代理与任务
279
+
280
+ `agent` 工具通过 `runAgent()` 复用主 query loop,但使用独立的消息、上下文和工具池。子代理定义支持工具 allow/deny、模型覆盖、最大轮数、背景运行、隔离类型和自定义 system prompt。
281
+
282
+ 调用模式:
283
+
284
+ - **同步子代理**:默认模式;当前工具调用等待子代理完成后返回最终文本、耗时、token 和工具调用数。
285
+ - **后台子代理**:`run_in_background=true` 或 `mode=background`;立即返回 `task_id` 和 output file。
286
+ - **fork 子代理**:`mode=fork`;继承父上下文,但追加反递归和作用域约束。
287
+ - **并行同步子代理**:同一模型轮次中多个 `agent` 调用设置 `parallel=true` 后可被并发批处理。
288
+
289
+ 后台任务由 `TaskStore` 管理,完成、失败或停止后会写入:
290
+
291
+ ```text
292
+ .agent-tasks/<task_id>.txt
293
+ ```
294
+
295
+ 控制工具:
296
+
297
+ - `TaskList()`:列任务。
298
+ - `TaskGet({ task_id })`:查详情。
299
+ - `TaskOutput({ task_id, block, timeout_ms })`:读输出,可等待完成。
300
+ - `TaskStop({ task_id })`:停止任务。
301
+ - `TaskResume({ task_id, directive })`:带新指令恢复任务。
302
+ - `SendMessage({ target, message })`:向命名或指定 agent id 的后台任务追加待处理消息。
303
+
304
+ 子代理相关限制:
305
+
306
+ - `AGENT_SUBAGENT_MAX_TURNS` 可覆盖子代理最大轮数。
307
+ - `AGENT_SUBAGENT_WALL_TIMEOUT_MS` 可设置子代理墙钟超时。
308
+ - fork 子代理不能继续生成更多子代理,避免递归失控。
309
+
310
+ ## Skill 模块
311
+
312
+ `src/skills` 提供可复用 prompt workflow 的基础设施,但默认 REPL 运行时当前未注册任何 skill catalog。
313
+
314
+ - `InMemorySkillCatalog` 可保存 `SkillDescriptor`。
315
+ - `createSkillTool()` 会创建 `skill` 工具。
316
+ - inline skill 会向下一轮模型注入 meta user message,并可修改主循环模型/effort。
317
+ - fork skill 会返回 `fork_required`,需要调用方用 AgentTool 承接。
318
+
319
+ 这部分适合嵌入方在自定义 runtime 中按需注册。
320
+
321
+ ## 作为库使用
322
+
323
+ `src/index.ts` 导出了核心模块,可在自己的程序中组合运行时:
324
+
325
+ ```ts
326
+ import {
327
+ QueryEngine,
328
+ ToolRegistry,
329
+ createModelGatewayFromEnv,
330
+ readFileTool,
331
+ listDirectoryTool,
332
+ grepTool,
333
+ echoTool,
334
+ } from "neoctl";
335
+
336
+ const tools = new ToolRegistry();
337
+ tools.register(echoTool);
338
+ tools.register(readFileTool);
339
+ tools.register(listDirectoryTool);
340
+ tools.register(grepTool);
341
+
342
+ const engine = new QueryEngine({
343
+ agentId: "main",
344
+ modelGateway: createModelGatewayFromEnv(),
345
+ tools,
346
+ });
347
+
348
+ for await (const event of engine.sendUserText("Summarize this repository")) {
349
+ console.log(event);
350
+ }
351
+ ```
352
+
353
+ 如果直接从源码运行,请使用 `.ts` 源文件路径或 `tsx`;发布包会通过 `dist` 导出编译后的 `.js` 模块。
354
+
355
+ ## 运行数据目录
356
+
357
+ | 路径 | 内容 |
358
+ | --- | --- |
359
+ | `.agent/sessions/` | 默认会话 transcript 和大型工具结果 |
360
+ | `.agent-tasks/` | 后台 agent / exec 任务最终输出 |
361
+ | `vendor/ripgrep/` | 当前平台 ripgrep 二进制和 manifest |
362
+ | `dist/` | `npm run build` 生成的编译产物 |
363
+
364
+ ## 当前边界
365
+
366
+ - 模型 provider 配置类型目前内置 OpenAI 与 DeepSeek provider。
367
+ - `src/safety` 是 permission、sandbox、audit 的接口边界;默认 REPL 没有强制沙箱策略。
368
+ - `src/skills` 已实现工具与 catalog,但默认 REPL 未装配 skill catalog。
369
+ - `isolation=worktree/remote` 在 AgentTool schema 中保留为接口形态,当前本地实现主要通过 `cwd` 和独立消息上下文隔离。
@@ -7,11 +7,27 @@ import { QueryEngine } from "../core/query-engine.js";
7
7
  import { ToolRegistry } from "../tools/registry.js";
8
8
  import { runToolUse } from "../tools/run-tool-use.js";
9
9
  import { createTextMessage } from "../types/messages.js";
10
- import { echoTool } from "../tools/builtins/echo-tool.js";
11
10
  import { createAgentTool } from "./agent-tool.js";
12
11
  import { StaticAgentCatalog, GENERAL_PURPOSE_AGENT } from "./agent-definition.js";
13
12
  import { createTaskTools } from "../tasks/task-tools.js";
14
13
  import { TaskStore } from "../tasks/task-store.js";
14
+ const smokePassthroughTool = {
15
+ name: "smoke_passthrough",
16
+ description: "Smoke test passthrough tool.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: { text: { type: "string" } },
20
+ required: ["text"],
21
+ additionalProperties: false,
22
+ },
23
+ metadata: { readOnly: true, concurrent: true, visible: true },
24
+ validate(input) {
25
+ return input;
26
+ },
27
+ async call(input) {
28
+ return { ok: true, output: input.text };
29
+ },
30
+ };
15
31
  class ParentAndSubagentGateway {
16
32
  parentCalls = 0;
17
33
  subagentCalls = 0;
@@ -54,7 +70,7 @@ async function main() {
54
70
  const sessionRoot = await fs.mkdtemp(path.join(os.tmpdir(), "agent-title-smoke-"));
55
71
  const taskStore = new TaskStore();
56
72
  const tools = new ToolRegistry();
57
- tools.register(echoTool);
73
+ tools.register(smokePassthroughTool);
58
74
  for (const tool of createTaskTools(taskStore))
59
75
  tools.register(tool);
60
76
  tools.register(createAgentTool({
@@ -78,8 +94,9 @@ async function main() {
78
94
  const listed = await engine.listSessions(1);
79
95
  return listed[0]?.title === "Refined Delegate Smoke Title" ? listed : undefined;
80
96
  });
97
+ const afterRefinementTitleCalls = gateway.subagentCalls;
81
98
  const syncOk = afterInitialTitleCalls === 2 &&
82
- gateway.subagentCalls === 4 &&
99
+ afterRefinementTitleCalls === afterInitialTitleCalls + 1 &&
83
100
  events.includes("tool.started") &&
84
101
  events.includes("tool.finished") &&
85
102
  events.includes("terminal:completed") &&
@@ -120,7 +137,7 @@ async function main() {
120
137
  const outputFileOk = Boolean(task?.outputFile && existsSync(task.outputFile));
121
138
  const asyncOk = Boolean(taskId && task?.status === "completed" && outputText.includes("retrieval_status") && sendOk && listOk && outputFileOk);
122
139
  const ok = syncOk && asyncOk;
123
- console.log(JSON.stringify({ ok, syncOk, asyncOk, outputFileOk, sessionTitle: listedSessions[0]?.title, events, parentCalls: gateway.parentCalls, subagentCalls: gateway.subagentCalls, taskId, taskStatus: task?.status, outputFile: task?.outputFile }, null, 2));
140
+ console.log(JSON.stringify({ ok, syncOk, asyncOk, outputFileOk, sessionTitle: listedSessions[0]?.title, events, parentCalls: gateway.parentCalls, subagentCalls: gateway.subagentCalls, afterInitialTitleCalls, afterRefinementTitleCalls, taskId, taskStatus: task?.status, outputFile: task?.outputFile }, null, 2));
124
141
  if (!ok)
125
142
  process.exitCode = 1;
126
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"smoke-agents.js","sourceRoot":"","sources":["../../src/agents/smoke-agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smoke-agents.js","sourceRoot":"","sources":["../../src/agents/smoke-agents.ts"],"names":[],"mappings":"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"}