@deepwhale/coding-agent 1.0.12 → 1.0.13
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/dist/agent/agent-compaction.d.ts +74 -0
- package/dist/agent/agent-compaction.d.ts.map +1 -0
- package/dist/agent/agent-compaction.js +145 -0
- package/dist/agent/agent-compaction.js.map +1 -0
- package/dist/agent/index.d.ts +16 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +17 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/session-adapter.d.ts +177 -0
- package/dist/agent/session-adapter.d.ts.map +1 -0
- package/dist/agent/session-adapter.js +365 -0
- package/dist/agent/session-adapter.js.map +1 -0
- package/dist/agent/tool-loop.d.ts +123 -0
- package/dist/agent/tool-loop.d.ts.map +1 -0
- package/dist/agent/tool-loop.js +436 -0
- package/dist/agent/tool-loop.js.map +1 -0
- package/dist/env/load-project-env.d.ts +40 -0
- package/dist/env/load-project-env.d.ts.map +1 -0
- package/dist/env/load-project-env.js +80 -0
- package/dist/env/load-project-env.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-factory.d.ts +50 -0
- package/dist/llm-factory.d.ts.map +1 -0
- package/dist/llm-factory.js +110 -0
- package/dist/llm-factory.js.map +1 -0
- package/dist/modes/index.d.ts +14 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +14 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/print.d.ts +50 -0
- package/dist/modes/print.d.ts.map +1 -0
- package/dist/modes/print.js +236 -0
- package/dist/modes/print.js.map +1 -0
- package/dist/modes/rpc.d.ts +52 -0
- package/dist/modes/rpc.d.ts.map +1 -0
- package/dist/modes/rpc.js +316 -0
- package/dist/modes/rpc.js.map +1 -0
- package/dist/modes/tui.d.ts +107 -0
- package/dist/modes/tui.d.ts.map +1 -0
- package/dist/modes/tui.js +680 -0
- package/dist/modes/tui.js.map +1 -0
- package/dist/policy/args-digest.d.ts +13 -0
- package/dist/policy/args-digest.d.ts.map +1 -0
- package/dist/policy/args-digest.js +29 -0
- package/dist/policy/args-digest.js.map +1 -0
- package/dist/policy/chain.d.ts +19 -0
- package/dist/policy/chain.d.ts.map +1 -0
- package/dist/policy/chain.js +24 -0
- package/dist/policy/chain.js.map +1 -0
- package/dist/policy/index.d.ts +17 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +16 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/sanitize-reason.d.ts +11 -0
- package/dist/policy/sanitize-reason.d.ts.map +1 -0
- package/dist/policy/sanitize-reason.js +24 -0
- package/dist/policy/sanitize-reason.js.map +1 -0
- package/dist/policy/static-rules.d.ts +32 -0
- package/dist/policy/static-rules.d.ts.map +1 -0
- package/dist/policy/static-rules.js +106 -0
- package/dist/policy/static-rules.js.map +1 -0
- package/dist/policy/types.d.ts +56 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +13 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/repl/repl-command-router.d.ts +78 -0
- package/dist/repl/repl-command-router.d.ts.map +1 -0
- package/dist/repl/repl-command-router.js +112 -0
- package/dist/repl/repl-command-router.js.map +1 -0
- package/dist/repl/repl-confirm.d.ts +49 -0
- package/dist/repl/repl-confirm.d.ts.map +1 -0
- package/dist/repl/repl-confirm.js +88 -0
- package/dist/repl/repl-confirm.js.map +1 -0
- package/dist/repl/repl-session.d.ts +79 -0
- package/dist/repl/repl-session.d.ts.map +1 -0
- package/dist/repl/repl-session.js +129 -0
- package/dist/repl/repl-session.js.map +1 -0
- package/dist/repl/repl-signal-coordinator.d.ts +74 -0
- package/dist/repl/repl-signal-coordinator.d.ts.map +1 -0
- package/dist/repl/repl-signal-coordinator.js +73 -0
- package/dist/repl/repl-signal-coordinator.js.map +1 -0
- package/dist/repl.d.ts +117 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +626 -0
- package/dist/repl.js.map +1 -0
- package/dist/sandbox/docker-runner.d.ts +147 -0
- package/dist/sandbox/docker-runner.d.ts.map +1 -0
- package/dist/sandbox/docker-runner.js +426 -0
- package/dist/sandbox/docker-runner.js.map +1 -0
- package/dist/sandbox/env-gate.d.ts +28 -0
- package/dist/sandbox/env-gate.d.ts.map +1 -0
- package/dist/sandbox/env-gate.js +65 -0
- package/dist/sandbox/env-gate.js.map +1 -0
- package/dist/sandbox/local-runner.d.ts +29 -0
- package/dist/sandbox/local-runner.d.ts.map +1 -0
- package/dist/sandbox/local-runner.js +79 -0
- package/dist/sandbox/local-runner.js.map +1 -0
- package/dist/sandbox/types.d.ts +80 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +25 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/tools/bash.d.ts +35 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +233 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-file.d.ts +22 -0
- package/dist/tools/edit-file.d.ts.map +1 -0
- package/dist/tools/edit-file.js +79 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/find.d.ts +21 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +168 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +19 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +170 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read-file.d.ts +18 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +52 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/registry.d.ts +39 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +67 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/write-file.d.ts +18 -0
- package/dist/tools/write-file.d.ts.map +1 -0
- package/dist/tools/write-file.js +47 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/tui-ink-bundle.js +38587 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/util/index.d.ts +16 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +16 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/tui-history.d.ts +37 -0
- package/dist/util/tui-history.d.ts.map +1 -0
- package/dist/util/tui-history.js +93 -0
- package/dist/util/tui-history.js.map +1 -0
- package/dist/verify/format-report.d.ts +57 -0
- package/dist/verify/format-report.d.ts.map +1 -0
- package/dist/verify/format-report.js +128 -0
- package/dist/verify/format-report.js.map +1 -0
- package/dist/verify/index.d.ts +8 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +8 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/verify-runner.d.ts +186 -0
- package/dist/verify/verify-runner.d.ts.map +1 -0
- package/dist/verify/verify-runner.js +707 -0
- package/dist/verify/verify-runner.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC 模式 — Sprint 1a stub
|
|
3
|
+
*
|
|
4
|
+
* NDJSON over stdio(Codex / oh-my-pi 借鉴):每行 = 1 个 JSON object。
|
|
5
|
+
* - request: { id, method, params }
|
|
6
|
+
* - response: { id, result | error }
|
|
7
|
+
* - notification: { method, params } // server push,无 id
|
|
8
|
+
*
|
|
9
|
+
* Sprint 1a stub 范围:
|
|
10
|
+
* - 实现 NDJSON line parser + writer
|
|
11
|
+
* - 实现 1 个 method: 'chat'(复用 runPrintMode 逻辑)
|
|
12
|
+
* - 拒绝其他 method 返回 "method not found"
|
|
13
|
+
* - Ctrl-C 优雅退出
|
|
14
|
+
*
|
|
15
|
+
* Sprint 1b 扩展:
|
|
16
|
+
* - initialize / cancel / shutdown
|
|
17
|
+
* - session 加载/恢复/分支
|
|
18
|
+
* - streaming 增量推送(sse-like notifications)
|
|
19
|
+
*/
|
|
20
|
+
import process from 'node:process';
|
|
21
|
+
import { createInterface } from 'node:readline';
|
|
22
|
+
import { isLLMError } from '@deepwhale/llm';
|
|
23
|
+
import { SessionReader, SessionWriter } from '@deepwhale/core';
|
|
24
|
+
import { isToolLoopError, loadSession, persistToolLoopSteps, runToolLoop, runToolLoopWithCompaction, } from '../agent/index.js';
|
|
25
|
+
import { CompactionState } from '@deepwhale/core';
|
|
26
|
+
import { createDefaultRegistry } from '../tools/registry.js';
|
|
27
|
+
import { createDefaultClient } from '../llm-factory.js';
|
|
28
|
+
import { resolveSandboxRunnerFromEnv } from '../sandbox/env-gate.js';
|
|
29
|
+
import { staticToolPolicy } from '../policy/static-rules.js';
|
|
30
|
+
export async function runRpcMode(options) {
|
|
31
|
+
// Sprint 1c-revive-2-D-5+ (review P2, 2026-06-04): rpc 改走 createDefaultClient
|
|
32
|
+
// factory, 跟 print/repl 拍板一致 (env 推断 + flag 显式覆盖). 旧实现写死
|
|
33
|
+
// DeepSeekClient 拍 P2 bug: --provider anthropic 走 rpc 仍用 deepseek.
|
|
34
|
+
const client = options.client ??
|
|
35
|
+
createDefaultClient({
|
|
36
|
+
...(options.provider !== undefined ? { provider: options.provider } : {}),
|
|
37
|
+
...(options.model !== undefined ? { model: options.model } : {}),
|
|
38
|
+
});
|
|
39
|
+
const sessionPath = options.sessionPath;
|
|
40
|
+
// Sprint 1c-revive-3-D-12 review P1 修复 (2026-06-05): 入口解析 sandbox env.
|
|
41
|
+
// 未知值 throw (fail-closed), 由 CLI `main().catch` 写到 stderr + exit 1.
|
|
42
|
+
const sandboxRunner = resolveSandboxRunnerFromEnv({ sandboxRoot: process.cwd() });
|
|
43
|
+
// Sprint 1c-revive-3-D-13: rpc 拍板 isInteractive=false (D-15 扩 confirmedTools 协议).
|
|
44
|
+
const policyYes = options.yes ?? false;
|
|
45
|
+
// session
|
|
46
|
+
let workingMessages = [];
|
|
47
|
+
const writer = sessionPath ? new SessionWriter(sessionPath) : null;
|
|
48
|
+
const reader = sessionPath ? new SessionReader(sessionPath) : null;
|
|
49
|
+
if (writer && reader) {
|
|
50
|
+
try {
|
|
51
|
+
await writer.open();
|
|
52
|
+
const loaded = await loadSession(reader);
|
|
53
|
+
workingMessages = [...loaded.messages];
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
sendError('session_load_failed', `could not load session: ${String(e)}`, '');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Sprint 1c-revive-2-D-6 (review P1 修复, 2026-06-04): CompactionState 闭包持有,
|
|
60
|
+
// 跨 chat request 持续累计 failures / paused 状态. 跟 startRepl 拍板一致.
|
|
61
|
+
let compactionConfig = null;
|
|
62
|
+
if (options.compactionConfig && writer) {
|
|
63
|
+
compactionConfig = {
|
|
64
|
+
...options.compactionConfig,
|
|
65
|
+
writer,
|
|
66
|
+
state: new CompactionState(options.compactionConfig.pauseAfterFailures ?? 2),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
else if (options.compactionConfig && !writer) {
|
|
70
|
+
sendError('compaction_requires_session', 'compactionConfig requires sessionPath; falling back to baseline (no compaction).', '');
|
|
71
|
+
}
|
|
72
|
+
process.stderr.write('deepwhale rpc mode (Sprint 1a stub)\n');
|
|
73
|
+
process.stderr.write(' methods: chat { prompt, stream? }\n');
|
|
74
|
+
process.stderr.write(' notifications: stderr only\n');
|
|
75
|
+
const rl = createInterface({
|
|
76
|
+
input: options.input ?? process.stdin,
|
|
77
|
+
terminal: false,
|
|
78
|
+
});
|
|
79
|
+
let exiting = false;
|
|
80
|
+
// Sprint 1a follow-up:readline line event 不会 await handler,并发 dispatch 会让 workingMessages race。
|
|
81
|
+
// 维护一个 in-flight chain,保证 request 串行处理,workingMessages 累积语义稳定。
|
|
82
|
+
//
|
|
83
|
+
// P1 follow-up:close/SIGINT 路径必须先 await chain,否则正在跑的 chat 写到一半就被 rl.close 砍掉,
|
|
84
|
+
// chat.delta notification / response 都会被截断,响应"晚到"或直接丢。
|
|
85
|
+
// 协议契约:close 触发后,已收到的 request 仍要完整处理完,只有 stdin 已关且 chain 排空才能 finish。
|
|
86
|
+
let chain = Promise.resolve();
|
|
87
|
+
// 标记"想退出",但不立刻 finish。close handler 会 await chain 再 finish。
|
|
88
|
+
let shouldExit = false;
|
|
89
|
+
let exitSignal = 0;
|
|
90
|
+
const finish = async () => {
|
|
91
|
+
if (exiting)
|
|
92
|
+
return;
|
|
93
|
+
exiting = true;
|
|
94
|
+
rl.close();
|
|
95
|
+
if (writer) {
|
|
96
|
+
try {
|
|
97
|
+
await writer.close();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
/* best-effort */
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const requestShutdown = (code) => {
|
|
105
|
+
if (shouldExit)
|
|
106
|
+
return; // 已经处于 shutdown 流程,不要重复 signal
|
|
107
|
+
shouldExit = true;
|
|
108
|
+
exitSignal = code;
|
|
109
|
+
};
|
|
110
|
+
rl.on('line', (line) => {
|
|
111
|
+
chain = chain.then(async () => {
|
|
112
|
+
const trimmed = line.trim();
|
|
113
|
+
if (!trimmed)
|
|
114
|
+
return;
|
|
115
|
+
let req;
|
|
116
|
+
try {
|
|
117
|
+
const parsed = JSON.parse(trimmed);
|
|
118
|
+
if (typeof parsed !== 'object' ||
|
|
119
|
+
parsed === null ||
|
|
120
|
+
typeof parsed.id !== 'string' ||
|
|
121
|
+
typeof parsed.method !== 'string') {
|
|
122
|
+
sendError('invalid_request', 'expected {id, method, params?}', '');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
req = parsed;
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
sendError('parse_error', `invalid JSON: ${String(e)}`, '');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const result = await dispatch(client, req, workingMessages, writer, options, compactionConfig, sandboxRunner, policyYes);
|
|
133
|
+
sendOk(req.id, result);
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
if (isToolLoopError(e)) {
|
|
137
|
+
sendError('tool_loop_limit', e.message, req.id);
|
|
138
|
+
}
|
|
139
|
+
else if (isLLMError(e)) {
|
|
140
|
+
sendError('llm_error', e.message, req.id);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
sendError('internal_error', e instanceof Error ? e.message : String(e), req.id);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
rl.on('close', () => {
|
|
149
|
+
// stdin 关闭 → 标记退出,但不立刻 finish。finish 由 chain 排空触发。
|
|
150
|
+
// Sprint 1a follow-up #3:signal handler 走的是 "rl.close() 触发此 close handler" 路径,
|
|
151
|
+
// 所以 SIGINT/SIGTERM 也走这里 drain — 保证 in-flight chat 能写完响应。
|
|
152
|
+
requestShutdown(0);
|
|
153
|
+
});
|
|
154
|
+
// Sprint 1a follow-up #3: 之前 SIGINT/SIGTERM 只 requestShutdown(0) 但不 rl.close(),
|
|
155
|
+
// 若 stdin 还开着 (例如纯 RPC 模式无 stdin 数据), 进程永远等 close 事件 → 挂住。
|
|
156
|
+
// 修法: signal handler 主动 rl.close(), 走和 stdin close 一样的 drain 路径。
|
|
157
|
+
// exitSignal 反映是被 signal 干掉 (128 + 信号编号), 让 caller 决定退出码 130/143。
|
|
158
|
+
const watchSignals = options.watchSignals ?? ['SIGINT', 'SIGTERM'];
|
|
159
|
+
const signalHandlers = [];
|
|
160
|
+
for (const sig of watchSignals) {
|
|
161
|
+
const handler = () => {
|
|
162
|
+
// 128 + 信号编号 是 POSIX 约定 (130 = SIGINT, 143 = SIGTERM, ...)
|
|
163
|
+
const code = sig === 'SIGINT' ? 130 : sig === 'SIGTERM' ? 143 : 128;
|
|
164
|
+
requestShutdown(code);
|
|
165
|
+
// 主动触发 close, 走和 stdin close 完全一样的 drain 路径
|
|
166
|
+
rl.close();
|
|
167
|
+
};
|
|
168
|
+
process.on(sig, handler);
|
|
169
|
+
signalHandlers.push({ sig, handler });
|
|
170
|
+
}
|
|
171
|
+
// 阻塞直到 stdin 关闭。close 之后,等 chain 排空再 cleanup。
|
|
172
|
+
await new Promise((resolve) => rl.once('close', () => resolve()));
|
|
173
|
+
// P1 follow-up:等 chain 排空 + finish,才能保证 close 之后排队的 request 完整写完 stdout。
|
|
174
|
+
await chain;
|
|
175
|
+
await finish();
|
|
176
|
+
// 卸载 signal handler 避免 leak: 同一进程多次调用 runRpcMode 不能重复挂 signal。
|
|
177
|
+
for (const { sig, handler } of signalHandlers) {
|
|
178
|
+
process.off(sig, handler);
|
|
179
|
+
}
|
|
180
|
+
return exitSignal;
|
|
181
|
+
}
|
|
182
|
+
async function dispatch(client, req, workingMessages, writer, options, compactionConfig,
|
|
183
|
+
// Sprint 1c-revive-3-D-12 review P1 修复: 透传 sandboxRunner 进 dispatch,
|
|
184
|
+
// 让 chat request 内的 tool loop 跟 env 配置一致.
|
|
185
|
+
sandboxRunner,
|
|
186
|
+
// Sprint 1c-revive-3-D-13: 透传 yes 进 dispatch.
|
|
187
|
+
yes) {
|
|
188
|
+
switch (req.method) {
|
|
189
|
+
case 'chat': {
|
|
190
|
+
const prompt = req.params?.['prompt'];
|
|
191
|
+
if (typeof prompt !== 'string') {
|
|
192
|
+
throw new Error('chat: params.prompt must be a string');
|
|
193
|
+
}
|
|
194
|
+
const stream = req.params?.['stream'] === true;
|
|
195
|
+
if (writer) {
|
|
196
|
+
const userEvent = { kind: 'user', ts: Date.now(), content: prompt };
|
|
197
|
+
await writer.append(userEvent);
|
|
198
|
+
}
|
|
199
|
+
// 构造 turn 消息:历史 + 本轮 user。Sprint 1a 修 P1 — user 必须进 LLM。
|
|
200
|
+
const turnMessages = [...workingMessages, { role: 'user', content: prompt }];
|
|
201
|
+
// Sprint 1c-revive-2-D-6 (review P1 修复, 2026-06-04): compactionConfig 存在
|
|
202
|
+
// 走 runToolLoopWithCompaction, 跨 chat request 复用 CompactionState (paused
|
|
203
|
+
// / failures 跨 request 持续, 跟 test 1c-revive-2-D-5-2 拍板).
|
|
204
|
+
const summaryFn = compactionConfig
|
|
205
|
+
? makeLlmSummarizeFn(client, compactionConfig.protocol)
|
|
206
|
+
: null;
|
|
207
|
+
const result = await (async () => {
|
|
208
|
+
if (compactionConfig !== null && summaryFn !== null) {
|
|
209
|
+
return runToolLoopWithCompaction(client, turnMessages, {
|
|
210
|
+
registry: createDefaultRegistry({ sandboxRunner }),
|
|
211
|
+
...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
|
|
212
|
+
...(stream
|
|
213
|
+
? {
|
|
214
|
+
onChunk: (chunk) => {
|
|
215
|
+
if (chunk.content) {
|
|
216
|
+
const notif = {
|
|
217
|
+
method: 'chat.delta',
|
|
218
|
+
params: { content: chunk.content },
|
|
219
|
+
};
|
|
220
|
+
process.stdout.write(`${JSON.stringify(notif)}\n`);
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
}
|
|
224
|
+
: {}),
|
|
225
|
+
policy: staticToolPolicy,
|
|
226
|
+
isInteractive: false, // rpc 拍板非交互 (D-13)
|
|
227
|
+
yes,
|
|
228
|
+
...(writer ? { writer } : {}),
|
|
229
|
+
}, compactionConfig, summaryFn);
|
|
230
|
+
}
|
|
231
|
+
return runToolLoop(client, turnMessages, {
|
|
232
|
+
registry: createDefaultRegistry({ sandboxRunner }),
|
|
233
|
+
...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
|
|
234
|
+
...(stream
|
|
235
|
+
? {
|
|
236
|
+
onChunk: (chunk) => {
|
|
237
|
+
if (chunk.content) {
|
|
238
|
+
const notif = {
|
|
239
|
+
method: 'chat.delta',
|
|
240
|
+
params: { content: chunk.content },
|
|
241
|
+
};
|
|
242
|
+
process.stdout.write(`${JSON.stringify(notif)}\n`);
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
}
|
|
246
|
+
: {}),
|
|
247
|
+
policy: staticToolPolicy,
|
|
248
|
+
isInteractive: false, // rpc 拍板非交互 (D-13)
|
|
249
|
+
yes,
|
|
250
|
+
...(writer ? { writer } : {}),
|
|
251
|
+
});
|
|
252
|
+
})();
|
|
253
|
+
if (writer) {
|
|
254
|
+
try {
|
|
255
|
+
await persistToolLoopSteps(writer, result.steps);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
/* best-effort */
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// 跑完回写 workingMessages,下一个 request 拿到的是包含本轮 assistant 步骤的 history。
|
|
262
|
+
// 修 Sprint 1a follow-up: 之前不写回,后续 chat 永远基于空历史。
|
|
263
|
+
workingMessages.length = 0;
|
|
264
|
+
workingMessages.push(...result.messages);
|
|
265
|
+
// Sprint 1b: 顶层暴露 cache_hit_rate / cost_turn, 让 RPC caller 不用 deep dive 到 usage
|
|
266
|
+
// (跟 print/REPL 状态栏对齐: 关键可观测性 1 层扁平访问)
|
|
267
|
+
const resultObj = {
|
|
268
|
+
content: result.final.content,
|
|
269
|
+
usage: result.final.usage,
|
|
270
|
+
steps: result.steps.length,
|
|
271
|
+
};
|
|
272
|
+
if (result.final.usage?.cache_hit_rate !== undefined) {
|
|
273
|
+
resultObj['cache_hit_rate'] = result.final.usage.cache_hit_rate;
|
|
274
|
+
}
|
|
275
|
+
if (result.final.usage?.cost_turn !== undefined) {
|
|
276
|
+
resultObj['cost_turn'] = result.final.usage.cost_turn;
|
|
277
|
+
}
|
|
278
|
+
return resultObj;
|
|
279
|
+
}
|
|
280
|
+
default:
|
|
281
|
+
throw new Error(`method not found: '${req.method}'`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function sendOk(id, result) {
|
|
285
|
+
const resp = { id, result };
|
|
286
|
+
process.stdout.write(`${JSON.stringify(resp)}\n`);
|
|
287
|
+
}
|
|
288
|
+
function sendError(code, message, id) {
|
|
289
|
+
const resp = { id, error: { code, message } };
|
|
290
|
+
process.stdout.write(`${JSON.stringify(resp)}\n`);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 生成 LLM summary callback (Sprint 1c-revive-2-D-6).
|
|
294
|
+
* 跟 startRepl / runPrintMode 同形态 helper 拍板一致. 跨 openai/anthropic
|
|
295
|
+
* 同形态 (走 LLMClient 统一契约).
|
|
296
|
+
*/
|
|
297
|
+
function makeLlmSummarizeFn(client, _protocol) {
|
|
298
|
+
return async (toSummarize) => {
|
|
299
|
+
const summaryMessages = [
|
|
300
|
+
{
|
|
301
|
+
role: 'system',
|
|
302
|
+
content: 'You are a concise summarizer. Compress the following conversation into 1 short paragraph ' +
|
|
303
|
+
'(max 200 words). Preserve key arithmetic results, tool calls, and final answers.',
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
role: 'user',
|
|
307
|
+
content: toSummarize
|
|
308
|
+
.map((m, i) => `[${i}] ${m.role}: ${m.content ?? '(empty)'}`)
|
|
309
|
+
.join('\n'),
|
|
310
|
+
},
|
|
311
|
+
];
|
|
312
|
+
const r = await client.chat(summaryMessages, {});
|
|
313
|
+
return r.content;
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/modes/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI 模式 — Sprint 1c-revive-4-D-20.3 P0-B (2026-06-05) v1.0 capability completion
|
|
3
|
+
*
|
|
4
|
+
* @deprecated LEGACY — Sprint 1c-revive-2-D-24.3 (2026-06-06) v1.0.9:
|
|
5
|
+
* 1.0.9+ `deepwhale tui` mode 走 Ink 容器 (@deepwhale/tui-ink 1.0.9 bundle).
|
|
6
|
+
* 本文件保留仅作 source-install dev 路径保底, 不再是 default path.
|
|
7
|
+
* - bin/deepwhale.js 'tui' case → runTuiInkMode (D-24.3 dispatch)
|
|
8
|
+
* - 跟 D-24.1 §6 红线 1 一致: legacy 0 删, fallback 兜底
|
|
9
|
+
* - 现有 979 行 tui-smoke.test.ts 0 改动, 行为在 readline 容器仍验过
|
|
10
|
+
*
|
|
11
|
+
* 业务逻辑 0 重写: D-22 / D-23.1 / D-23.2 业务 1:1 搬到 tui-ink/, 跟本文件同形态.
|
|
12
|
+
* 不再维护 (sprint 1.1+): 计划完全删除本文件, 但保留 0 改动作 fallback.
|
|
13
|
+
*
|
|
14
|
+
* ---- 下方为 v1.0.0 - v1.0.8 readline 容器实现 ----
|
|
15
|
+
*
|
|
16
|
+
* Minimal ANSI TUI. **不**装新依赖 (无 Ink), 用 node:readline + ANSI 转义码.
|
|
17
|
+
*
|
|
18
|
+
* 复用红线 (D-20.3 P0-B 拍板):
|
|
19
|
+
* - 复用 runToolLoop + staticToolPolicy (不绕过 ToolPolicy)
|
|
20
|
+
* - 复用 createReplConfirm (D-19 串行化, 不重建 2 套 confirm)
|
|
21
|
+
* - 复用 SessionWriter (不绕过 session audit, 跟 REPL/print mode 同形态)
|
|
22
|
+
* - 复用 formatUsageStatus (REPL 状态栏 4 字段, 风格统一)
|
|
23
|
+
*
|
|
24
|
+
* 必须实现 (用户红线):
|
|
25
|
+
* 1. `deepwhale tui` 启动
|
|
26
|
+
* 2. 用户可输入 prompt
|
|
27
|
+
* 3. assistant stream 可显示
|
|
28
|
+
* 4. tool call / result 可显示
|
|
29
|
+
* 5. destructive tool 触发 y/N confirm (走 createReplConfirm)
|
|
30
|
+
* 6. y 执行, n/empty 拒绝
|
|
31
|
+
* 7. /exit 或 q 退出
|
|
32
|
+
* 8. session 不损坏 (走 D-19.5 finish 路径, writer.close)
|
|
33
|
+
* 9. TUI 路径复用 ToolPolicy / SessionWriter / runToolLoop
|
|
34
|
+
*
|
|
35
|
+
* Minimal scope (v1.0):
|
|
36
|
+
* - ANSI 颜色: 标题 / 用户 prompt / tool call / tool result / 状态栏
|
|
37
|
+
* - 不做: 多行 / 自动补全 / 主题 / 鼠标 / 文件树 / syntax highlight
|
|
38
|
+
*
|
|
39
|
+
* NOT covered (defer to v1.1):
|
|
40
|
+
* - 全屏 IDE-style TUI
|
|
41
|
+
* - 主题切换
|
|
42
|
+
* - 多 session 切换
|
|
43
|
+
* - Plan mode / recovery
|
|
44
|
+
*/
|
|
45
|
+
import type { LLMClient } from '@deepwhale/llm';
|
|
46
|
+
import { type AgentCompactionConfig } from '../agent/index.js';
|
|
47
|
+
import { type Provider } from '../llm-factory.js';
|
|
48
|
+
export type TuiThemeName = 'default' | 'solarized' | 'monochrome';
|
|
49
|
+
export interface TuiTheme {
|
|
50
|
+
header: string;
|
|
51
|
+
model: string;
|
|
52
|
+
divider: string;
|
|
53
|
+
prompt: string;
|
|
54
|
+
error: string;
|
|
55
|
+
success: string;
|
|
56
|
+
/** D-23.1 (2026-06-06): 工具名 (tool call/result 行), 跟 model 同级, 用同色变体 */
|
|
57
|
+
toolName: string;
|
|
58
|
+
}
|
|
59
|
+
export declare const THEMES: Record<TuiThemeName, TuiTheme>;
|
|
60
|
+
/**
|
|
61
|
+
* 解析 theme 来源 (env > 默认), 找不到或 invalid 时退化到 'default' + stderr warning.
|
|
62
|
+
* 不抛: 启动期不阻塞, 跟 env-gate 风格一致.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveTuiTheme(themeArg?: string): TuiThemeName;
|
|
65
|
+
/**
|
|
66
|
+
* 语法高亮 chunk content. 非 TTY 退化到原 text (跟 colorize 行为一致, 跟 CI/管道 log 兼容).
|
|
67
|
+
*
|
|
68
|
+
* @param text - 单 chunk 文本 fragment
|
|
69
|
+
* @param theme - 当前 theme (从 runTuiMode 闭包传入)
|
|
70
|
+
* @param forceColor - D-23.2 测试 hook: 强制当 TTY (非默认) 用于 unit test 验证染色字节.
|
|
71
|
+
* 生产路径 (runTuiMode) 不传, 走 isTty() 自动判断.
|
|
72
|
+
* @returns 染色后文本 (含 ANSI escape) 或原 text (非 TTY)
|
|
73
|
+
*/
|
|
74
|
+
export declare function highlightChunk(text: string, theme?: TuiTheme, forceColor?: boolean): string;
|
|
75
|
+
declare const SPINNER_FRAMES: readonly ["⠋", "⠙", "⠹", "⠸", "⠼"];
|
|
76
|
+
declare const SPINNER_INTERVAL_MS = 80;
|
|
77
|
+
declare const SPINNER_LABEL = "thinking\u2026";
|
|
78
|
+
declare class Spinner {
|
|
79
|
+
private timer;
|
|
80
|
+
private frame;
|
|
81
|
+
private active;
|
|
82
|
+
start(stream?: NodeJS.WritableStream): void;
|
|
83
|
+
stop(stream?: NodeJS.WritableStream): void;
|
|
84
|
+
private render;
|
|
85
|
+
}
|
|
86
|
+
export { Spinner, SPINNER_FRAMES, SPINNER_INTERVAL_MS, SPINNER_LABEL };
|
|
87
|
+
export interface TuiModeOptions {
|
|
88
|
+
sessionPath?: string;
|
|
89
|
+
enableToolLoop?: boolean;
|
|
90
|
+
maxSteps?: number;
|
|
91
|
+
client?: LLMClient;
|
|
92
|
+
provider?: Provider;
|
|
93
|
+
model?: string;
|
|
94
|
+
yes?: boolean;
|
|
95
|
+
/** 注入输入流(默认 stdin)。单测用。 */
|
|
96
|
+
input?: NodeJS.ReadableStream;
|
|
97
|
+
/** 注入输出流(默认 stdout)。单测用。 */
|
|
98
|
+
output?: NodeJS.WritableStream;
|
|
99
|
+
/** 注入错误流(默认 stderr)。单测用。 */
|
|
100
|
+
errorOutput?: NodeJS.WritableStream;
|
|
101
|
+
/** D-23.1 (2026-06-06): TUI 主题. 不传或 invalid → 'default' (跟 env DEEPWHALE_TUI_THEME 协同). */
|
|
102
|
+
theme?: TuiThemeName;
|
|
103
|
+
/** compaction config 跟 print mode 同形态 */
|
|
104
|
+
compactionConfig?: Omit<AgentCompactionConfig, 'writer' | 'state'> | null;
|
|
105
|
+
}
|
|
106
|
+
export declare function runTuiMode(options?: TuiModeOptions): Promise<number>;
|
|
107
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/modes/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQ7D,OAAO,EAKL,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAwCvE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CA8BjD,CAAC;AAIF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAO/D;AAyED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,QAAyB,EAChC,UAAU,CAAC,EAAE,OAAO,GACnB,MAAM,CA8CR;AAkBD,QAAA,MAAM,cAAc,oCAAqC,CAAC;AAC1D,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAC/B,QAAA,MAAM,aAAa,mBAAc,CAAC;AAElC,cAAM,OAAO;IACX,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAS;IAEvB,KAAK,CAAC,MAAM,GAAE,MAAM,CAAC,cAAuB,GAAG,IAAI;IAYnD,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,cAAuB,GAAG,IAAI;IA0BlD,OAAO,CAAC,MAAM;CAKf;AAGD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC;AAmBvE,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACpC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3E;AAID,wBAAsB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqX9E"}
|