@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
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 跨包共享的 tool 类型(被工具实现和 registry 共同使用)
|
|
3
|
+
*/
|
|
4
|
+
import type { ToolName } from '@deepwhale/core';
|
|
5
|
+
export type { ToolName };
|
|
6
|
+
/**
|
|
7
|
+
* 工具输入 schema — 用 zod-like 的简化结构(避免 Sprint 0 拉 zod 依赖)
|
|
8
|
+
* Sprint 1 再决定是否引入 zod
|
|
9
|
+
*/
|
|
10
|
+
export type ToolInputSchema = {
|
|
11
|
+
readonly type: 'object';
|
|
12
|
+
readonly properties: Record<string, ToolParamSchema>;
|
|
13
|
+
readonly required?: ReadonlyArray<string>;
|
|
14
|
+
};
|
|
15
|
+
export type ToolParamSchema = {
|
|
16
|
+
type: 'string';
|
|
17
|
+
description: string;
|
|
18
|
+
enum?: ReadonlyArray<string>;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'number';
|
|
21
|
+
description: string;
|
|
22
|
+
minimum?: number;
|
|
23
|
+
maximum?: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'boolean';
|
|
26
|
+
description: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'array';
|
|
29
|
+
description: string;
|
|
30
|
+
items: ToolParamSchema;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* 工具执行结果 — Observation 4 字段(arch §2.3 / ECC 借鉴)
|
|
34
|
+
* - content: 工具输出
|
|
35
|
+
* - success: 是否成功
|
|
36
|
+
* - error: 失败时的错误信息
|
|
37
|
+
* - meta: 性能/调试元数据
|
|
38
|
+
*/
|
|
39
|
+
export type ToolResult = {
|
|
40
|
+
success: true;
|
|
41
|
+
content: string;
|
|
42
|
+
meta?: Record<string, unknown>;
|
|
43
|
+
} | {
|
|
44
|
+
success: false;
|
|
45
|
+
content: string;
|
|
46
|
+
error: string;
|
|
47
|
+
meta?: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 工具接口 — 所有 6 工具必须实现
|
|
51
|
+
*
|
|
52
|
+
* 设计原则:
|
|
53
|
+
* - name/risk/description 让 LLM 看到
|
|
54
|
+
* - schema 让 LLM 知道参数结构
|
|
55
|
+
* - execute() 是真实实现(同步或异步)
|
|
56
|
+
* - 沙箱在 Sprint 2 加(v1.0 = Docker only,v1.0 不强制沙箱)
|
|
57
|
+
*/
|
|
58
|
+
export interface Tool {
|
|
59
|
+
readonly name: ToolName;
|
|
60
|
+
readonly description: string;
|
|
61
|
+
readonly risk: 'low' | 'medium' | 'high';
|
|
62
|
+
readonly schema: ToolInputSchema;
|
|
63
|
+
execute(input: Record<string, unknown>): Promise<ToolResult>;
|
|
64
|
+
}
|
|
65
|
+
/** Tool 错误码(arch §ApplyError 对应,扩展到所有 tool) */
|
|
66
|
+
export type ToolError = {
|
|
67
|
+
kind: 'invalid-input';
|
|
68
|
+
param: string;
|
|
69
|
+
reason: string;
|
|
70
|
+
} | {
|
|
71
|
+
kind: 'not-found';
|
|
72
|
+
path: string;
|
|
73
|
+
} | {
|
|
74
|
+
kind: 'permission-denied';
|
|
75
|
+
path: string;
|
|
76
|
+
reason: string;
|
|
77
|
+
} | {
|
|
78
|
+
kind: 'execution-failed';
|
|
79
|
+
command: string;
|
|
80
|
+
stderr: string;
|
|
81
|
+
} | {
|
|
82
|
+
kind: 'io-error';
|
|
83
|
+
path: string;
|
|
84
|
+
message: string;
|
|
85
|
+
} | {
|
|
86
|
+
kind: 'unsupported';
|
|
87
|
+
reason: string;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAClE;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEvF;;;;;;;;GAQG;AACH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9D;AAED,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — util barrel (D-25 B4, 跟 tui-ink + tui.ts 共享)
|
|
3
|
+
*
|
|
4
|
+
* D-25 B4 (2026-06-06) 拍板: 抽跨包共享 util 到这里, 跟 tui-ink 复用红线一致.
|
|
5
|
+
* - 0 改业务实现, 只做 re-export
|
|
6
|
+
* - 跟 D-24.2 policy/index.ts barrel 模式 1:1
|
|
7
|
+
*
|
|
8
|
+
* 当前 (B4): 1 个 util
|
|
9
|
+
* - tui-history: 抽 tui-ink/src/history/index.ts 86 行到 coding-agent util,
|
|
10
|
+
* 跟 modes/tui.ts 共享, 0 业务重写, 0 删已有测
|
|
11
|
+
*
|
|
12
|
+
* 后续 sprint (D-26+) 可能加:
|
|
13
|
+
* - memory, clipboard, osc52, syntax 等 (Hermes ui-tui 对齐)
|
|
14
|
+
*/
|
|
15
|
+
export { tuiHistoryPath, tuiHistoryLoad, tuiHistoryAppend, tuiHistoryTruncate, TUI_HISTORY_MAX, } from './tui-history.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — util barrel (D-25 B4, 跟 tui-ink + tui.ts 共享)
|
|
3
|
+
*
|
|
4
|
+
* D-25 B4 (2026-06-06) 拍板: 抽跨包共享 util 到这里, 跟 tui-ink 复用红线一致.
|
|
5
|
+
* - 0 改业务实现, 只做 re-export
|
|
6
|
+
* - 跟 D-24.2 policy/index.ts barrel 模式 1:1
|
|
7
|
+
*
|
|
8
|
+
* 当前 (B4): 1 个 util
|
|
9
|
+
* - tui-history: 抽 tui-ink/src/history/index.ts 86 行到 coding-agent util,
|
|
10
|
+
* 跟 modes/tui.ts 共享, 0 业务重写, 0 删已有测
|
|
11
|
+
*
|
|
12
|
+
* 后续 sprint (D-26+) 可能加:
|
|
13
|
+
* - memory, clipboard, osc52, syntax 等 (Hermes ui-tui 对齐)
|
|
14
|
+
*/
|
|
15
|
+
export { tuiHistoryPath, tuiHistoryLoad, tuiHistoryAppend, tuiHistoryTruncate, TUI_HISTORY_MAX, } from './tui-history.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — TUI 历史持久化 util (D-25 B4, 跟 tui.ts + tui-ink 1:1).
|
|
3
|
+
*
|
|
4
|
+
* 业务逻辑 0 重写, 跟 packages/coding-agent/src/modes/tui.ts line 293-343 的
|
|
5
|
+
* tuiHistoryPath / tuiHistoryLoad / tuiHistoryAppend 1:1 同步.
|
|
6
|
+
*
|
|
7
|
+
* D-25 B4 (2026-06-06) — 抽 tui-ink history 到 coding-agent util, tui-ink 复用:
|
|
8
|
+
* - 修前: tui-ink/src/history/index.ts 86 行 copy, 跟 modes/tui.ts 三处实现各管各
|
|
9
|
+
* - 修后: 唯一实现 在这里, tui-ink 走 thin re-export, modes/tui.ts 1:1 同步
|
|
10
|
+
* - 跨包消费: tui-ink + legacy readline 容器都 import 这个 util
|
|
11
|
+
*
|
|
12
|
+
* D-25 A1 (F4) — Windows tui-smoke history 测试 fail (HOME vs USERPROFILE) 修:
|
|
13
|
+
* - tuiHistoryPath(homeOverride?) 新签名: 优先 homeOverride > DEEPWHALE_HOME env >
|
|
14
|
+
* USERPROFILE (Windows 原生) > HOME (Unix + 测试 mock) > homedir() 兜底
|
|
15
|
+
* - tuiHistoryLoad / tuiHistoryAppend 接 homeOverride 透传
|
|
16
|
+
* - 兼容: legacy `tuiHistoryPath()` 0 参 = 走 env 探测, 不破坏老调用方
|
|
17
|
+
*
|
|
18
|
+
* 文件: <home>/.deepwhale/tui-history (JSONL, 每行 1 条 raw line)
|
|
19
|
+
* 上限: 1000 条 (LRU 截断, 防无限增长)
|
|
20
|
+
*
|
|
21
|
+
* 注意: readline 历史上依赖 `rl.history = loaded.reverse()` (readline 期望最新在尾部).
|
|
22
|
+
* Ink 容器用 `useState` 维护 history, load 时同样 reverse (保持跟 readline 一致).
|
|
23
|
+
*/
|
|
24
|
+
export declare const TUI_HISTORY_MAX = 1000;
|
|
25
|
+
/**
|
|
26
|
+
* D-25 A1: 新签名接受 homeOverride. 不传走 3 路径优先级探测.
|
|
27
|
+
* 旧 0 参调用方 (legacy tui.ts, test 4) 0 改.
|
|
28
|
+
*/
|
|
29
|
+
export declare function tuiHistoryPath(homeOverride?: string): string;
|
|
30
|
+
export declare function tuiHistoryLoad(homeOverride?: string): string[];
|
|
31
|
+
export declare function tuiHistoryAppend(line: string, homeOverride?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* LRU 截断 (跟 D-22.1 1:1 同步, 避免无限增长).
|
|
34
|
+
* 暴露给测试用.
|
|
35
|
+
*/
|
|
36
|
+
export declare function tuiHistoryTruncate(lines: string[], max?: number): string[];
|
|
37
|
+
//# sourceMappingURL=tui-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-history.d.ts","sourceRoot":"","sources":["../../src/util/tui-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,eAAO,MAAM,eAAe,OAAO,CAAA;AAqBnC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAU1E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAwB,GAAG,MAAM,EAAE,CAG3F"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — TUI 历史持久化 util (D-25 B4, 跟 tui.ts + tui-ink 1:1).
|
|
3
|
+
*
|
|
4
|
+
* 业务逻辑 0 重写, 跟 packages/coding-agent/src/modes/tui.ts line 293-343 的
|
|
5
|
+
* tuiHistoryPath / tuiHistoryLoad / tuiHistoryAppend 1:1 同步.
|
|
6
|
+
*
|
|
7
|
+
* D-25 B4 (2026-06-06) — 抽 tui-ink history 到 coding-agent util, tui-ink 复用:
|
|
8
|
+
* - 修前: tui-ink/src/history/index.ts 86 行 copy, 跟 modes/tui.ts 三处实现各管各
|
|
9
|
+
* - 修后: 唯一实现 在这里, tui-ink 走 thin re-export, modes/tui.ts 1:1 同步
|
|
10
|
+
* - 跨包消费: tui-ink + legacy readline 容器都 import 这个 util
|
|
11
|
+
*
|
|
12
|
+
* D-25 A1 (F4) — Windows tui-smoke history 测试 fail (HOME vs USERPROFILE) 修:
|
|
13
|
+
* - tuiHistoryPath(homeOverride?) 新签名: 优先 homeOverride > DEEPWHALE_HOME env >
|
|
14
|
+
* USERPROFILE (Windows 原生) > HOME (Unix + 测试 mock) > homedir() 兜底
|
|
15
|
+
* - tuiHistoryLoad / tuiHistoryAppend 接 homeOverride 透传
|
|
16
|
+
* - 兼容: legacy `tuiHistoryPath()` 0 参 = 走 env 探测, 不破坏老调用方
|
|
17
|
+
*
|
|
18
|
+
* 文件: <home>/.deepwhale/tui-history (JSONL, 每行 1 条 raw line)
|
|
19
|
+
* 上限: 1000 条 (LRU 截断, 防无限增长)
|
|
20
|
+
*
|
|
21
|
+
* 注意: readline 历史上依赖 `rl.history = loaded.reverse()` (readline 期望最新在尾部).
|
|
22
|
+
* Ink 容器用 `useState` 维护 history, load 时同样 reverse (保持跟 readline 一致).
|
|
23
|
+
*/
|
|
24
|
+
import { existsSync, readFileSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
import { join, dirname } from 'node:path';
|
|
27
|
+
export const TUI_HISTORY_MAX = 1000;
|
|
28
|
+
/**
|
|
29
|
+
* D-25 A1: 解析 home dir, 3 路径优先级:
|
|
30
|
+
* 1. homeOverride 显式入参 (测试 / 业务透传)
|
|
31
|
+
* 2. DEEPWHALE_HOME env (用户 / 部署)
|
|
32
|
+
* 3. HOME > USERPROFILE (Windows) > homedir() 兜底
|
|
33
|
+
*/
|
|
34
|
+
function resolveTuiHome(homeOverride) {
|
|
35
|
+
if (homeOverride && homeOverride.length > 0)
|
|
36
|
+
return homeOverride;
|
|
37
|
+
const env = process.env['DEEPWHALE_HOME'];
|
|
38
|
+
if (env && env.length > 0)
|
|
39
|
+
return env;
|
|
40
|
+
// Windows 上 Node 的 homedir() 走 USERPROFILE, 但 env test 经常只设 HOME.
|
|
41
|
+
// 显式查两个, USERPROFILE 优先 (Windows 原生), 然后 HOME (Unix 原生 + 测试 mock).
|
|
42
|
+
const windowsHome = process.env['USERPROFILE'];
|
|
43
|
+
if (windowsHome && windowsHome.length > 0)
|
|
44
|
+
return windowsHome;
|
|
45
|
+
const unixHome = process.env['HOME'];
|
|
46
|
+
if (unixHome && unixHome.length > 0)
|
|
47
|
+
return unixHome;
|
|
48
|
+
return homedir();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* D-25 A1: 新签名接受 homeOverride. 不传走 3 路径优先级探测.
|
|
52
|
+
* 旧 0 参调用方 (legacy tui.ts, test 4) 0 改.
|
|
53
|
+
*/
|
|
54
|
+
export function tuiHistoryPath(homeOverride) {
|
|
55
|
+
return join(resolveTuiHome(homeOverride), '.deepwhale', 'tui-history');
|
|
56
|
+
}
|
|
57
|
+
export function tuiHistoryLoad(homeOverride) {
|
|
58
|
+
const p = tuiHistoryPath(homeOverride);
|
|
59
|
+
if (!existsSync(p))
|
|
60
|
+
return [];
|
|
61
|
+
try {
|
|
62
|
+
const raw = readFileSync(p, 'utf8');
|
|
63
|
+
const lines = raw.split(/\r?\n/).filter((l) => l.length > 0);
|
|
64
|
+
// readline 期望最新在尾部, JSONL 顺序是 append (最新在末尾), 不需要 reverse
|
|
65
|
+
return lines;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function tuiHistoryAppend(line, homeOverride) {
|
|
72
|
+
if (!line || !line.trim())
|
|
73
|
+
return;
|
|
74
|
+
const p = tuiHistoryPath(homeOverride);
|
|
75
|
+
try {
|
|
76
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
77
|
+
// atomic fsync 避免 crash 留半行 (appendFileSync 自带 fsync)
|
|
78
|
+
appendFileSync(p, line + '\n');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* best-effort, 不污染主路径 */
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* LRU 截断 (跟 D-22.1 1:1 同步, 避免无限增长).
|
|
86
|
+
* 暴露给测试用.
|
|
87
|
+
*/
|
|
88
|
+
export function tuiHistoryTruncate(lines, max = TUI_HISTORY_MAX) {
|
|
89
|
+
if (lines.length <= max)
|
|
90
|
+
return lines;
|
|
91
|
+
return lines.slice(-max);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=tui-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-history.js","sourceRoot":"","sources":["../../src/util/tui-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AAEnC;;;;;GAKG;AACH,SAAS,cAAc,CAAC,YAAqB;IAC3C,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,CAAA;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACzC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAA;IACrC,kEAAkE;IAClE,mEAAmE;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC9C,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,WAAW,CAAA;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAA;IACpD,OAAO,OAAO,EAAE,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,YAAqB;IAClD,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,YAAqB;IAClD,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC5D,0DAA0D;QAC1D,OAAO,KAAK,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,YAAqB;IAClE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAM;IACjC,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,sDAAsD;QACtD,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAe,EAAE,MAAc,eAAe;IAC/E,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — Verify report formatter
|
|
3
|
+
*
|
|
4
|
+
* Sprint 1c-revive-2-D-11 (2026-06-04): 把 `VerificationReport` 渲染成人类可读文本.
|
|
5
|
+
* REPL `/verify` 跟 CLI `deepwhale --verify` 都用这个 formatter, 风格统一.
|
|
6
|
+
*
|
|
7
|
+
* 拍板 (D-11, 2026-06-04):
|
|
8
|
+
* - 简洁优先, 跟 REPL greeting / goodbye 风格一致
|
|
9
|
+
* - 每步 1 行 status, 失败时附带 tail
|
|
10
|
+
* - 不打印 key, 不打印 session 路径, 不打印 .env 路径
|
|
11
|
+
* - summary 跟 nextSuggestedAction 由 formatter 拍 (跟 D-11 拍板 "runner 纯函数,
|
|
12
|
+
* formatter 写自然语言" 一致)
|
|
13
|
+
*
|
|
14
|
+
* @module @deepwhale/coding-agent/format-report
|
|
15
|
+
*/
|
|
16
|
+
import type { VerifyCheckResult, VerifyCheckStatus, VerificationReport } from './verify-runner.js';
|
|
17
|
+
/**
|
|
18
|
+
* 把 `VerificationReport` 渲染成多行文本.
|
|
19
|
+
*
|
|
20
|
+
* 风格:
|
|
21
|
+
* deepwhale verify — pass (1m 23s)
|
|
22
|
+
*
|
|
23
|
+
* ✓ build 12.3s
|
|
24
|
+
* ✓ lint 4.1s
|
|
25
|
+
* ✗ test 67.0s (exit 1)
|
|
26
|
+
* stderr tail:
|
|
27
|
+
* ...last 8 lines of stderr...
|
|
28
|
+
*
|
|
29
|
+
* Summary: 1/4 checks failed (test exit 1).
|
|
30
|
+
* Next: re-run after fixing failing test, or see /tmp/deepwhale-verify.log.
|
|
31
|
+
*
|
|
32
|
+
* @param report `runVerify()` 返回的报告
|
|
33
|
+
* @param options.verbose 默认 false. true 时**不**截断 stdout/stderr 印全 (单测 debug 用)
|
|
34
|
+
*/
|
|
35
|
+
export interface FormatReportOptions {
|
|
36
|
+
verbose?: boolean;
|
|
37
|
+
/** stderrTail / stdoutTail 印几行. 默认 8. */
|
|
38
|
+
tailLines?: number;
|
|
39
|
+
/** 报告写入文件路径建议 (显示在 nextSuggestedAction 里). 不传不写. */
|
|
40
|
+
logFilePath?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function formatReport(report: VerificationReport, options?: FormatReportOptions): string;
|
|
43
|
+
/**
|
|
44
|
+
* 简化 summary 跟 nextSuggestedAction — 之前 runner 留空, formatter 拍.
|
|
45
|
+
* 拍板 (D-11, 2026-06-04): summary 给"X/Y pass", nextSuggestedAction 给 fix 提示.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildSummaryAndNext(report: VerificationReport, options?: {
|
|
48
|
+
logFilePath?: string;
|
|
49
|
+
}): {
|
|
50
|
+
summary: string;
|
|
51
|
+
nextSuggestedAction: string;
|
|
52
|
+
};
|
|
53
|
+
/** @internal — 单步 status helper, 跟 status 字段对齐. 单测用. */
|
|
54
|
+
export declare function _checkStatusIcon(status: VerifyCheckStatus): string;
|
|
55
|
+
/** @internal — 单测用: 提取 check 简短描述. */
|
|
56
|
+
export declare function _describeCheck(c: VerifyCheckResult): string;
|
|
57
|
+
//# sourceMappingURL=format-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-report.d.ts","sourceRoot":"","sources":["../../src/verify/format-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAY5B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAkDR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAsBlD;AAmBD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAElE;AAED,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — Verify report formatter
|
|
3
|
+
*
|
|
4
|
+
* Sprint 1c-revive-2-D-11 (2026-06-04): 把 `VerificationReport` 渲染成人类可读文本.
|
|
5
|
+
* REPL `/verify` 跟 CLI `deepwhale --verify` 都用这个 formatter, 风格统一.
|
|
6
|
+
*
|
|
7
|
+
* 拍板 (D-11, 2026-06-04):
|
|
8
|
+
* - 简洁优先, 跟 REPL greeting / goodbye 风格一致
|
|
9
|
+
* - 每步 1 行 status, 失败时附带 tail
|
|
10
|
+
* - 不打印 key, 不打印 session 路径, 不打印 .env 路径
|
|
11
|
+
* - summary 跟 nextSuggestedAction 由 formatter 拍 (跟 D-11 拍板 "runner 纯函数,
|
|
12
|
+
* formatter 写自然语言" 一致)
|
|
13
|
+
*
|
|
14
|
+
* @module @deepwhale/coding-agent/format-report
|
|
15
|
+
*/
|
|
16
|
+
const STATUS_ICON = {
|
|
17
|
+
passed: '✓',
|
|
18
|
+
failed: '✗',
|
|
19
|
+
'timed-out': '⏱',
|
|
20
|
+
'spawn-error': '⚠',
|
|
21
|
+
// Sprint 1c-revive-2-D-11-4 review P2 修复: 新增 'aborted' 状态. 跟 spawn-error
|
|
22
|
+
// 视觉区分 (⚠ vs ⛔) 让 reviewer 一眼看到"被外部 signal 干掉" vs "spawn 失败".
|
|
23
|
+
aborted: '⛔',
|
|
24
|
+
};
|
|
25
|
+
export function formatReport(report, options = {}) {
|
|
26
|
+
const verbose = options.verbose ?? false;
|
|
27
|
+
const tailLines = options.tailLines ?? 8;
|
|
28
|
+
const lines = [];
|
|
29
|
+
// Header
|
|
30
|
+
const duration = formatDuration(report.durationMs);
|
|
31
|
+
const headerStatus = report.overallStatus === 'passed' ? 'pass' : 'FAIL';
|
|
32
|
+
lines.push(`deepwhale verify — ${headerStatus} (${duration})`);
|
|
33
|
+
lines.push('');
|
|
34
|
+
// 每步
|
|
35
|
+
for (const check of report.checks) {
|
|
36
|
+
const icon = STATUS_ICON[check.status];
|
|
37
|
+
const dur = formatDuration(check.durationMs);
|
|
38
|
+
const statusText = check.status === 'passed' ? '' : ` (${check.status}`;
|
|
39
|
+
const exitPart = check.exitCode !== null ? ` exit ${check.exitCode}` : '';
|
|
40
|
+
const closeParen = check.status === 'passed' ? '' : exitPart + ')';
|
|
41
|
+
lines.push(` ${icon} ${check.name.padEnd(10)} ${dur}${statusText}${closeParen}`);
|
|
42
|
+
// 失败时附 tail
|
|
43
|
+
if (check.status !== 'passed') {
|
|
44
|
+
if (check.errorMessage) {
|
|
45
|
+
lines.push(` error: ${check.errorMessage}`);
|
|
46
|
+
}
|
|
47
|
+
const stderrTail = tailLinesOf(check.stderrTail, tailLines);
|
|
48
|
+
if (stderrTail) {
|
|
49
|
+
lines.push(` stderr tail:`);
|
|
50
|
+
for (const line of stderrTail.split('\n')) {
|
|
51
|
+
lines.push(` ${line}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (verbose) {
|
|
55
|
+
const stdoutTail = tailLinesOf(check.stdoutTail, tailLines);
|
|
56
|
+
if (stdoutTail) {
|
|
57
|
+
lines.push(` stdout tail (verbose):`);
|
|
58
|
+
for (const line of stdoutTail.split('\n')) {
|
|
59
|
+
lines.push(` ${line}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
lines.push('');
|
|
66
|
+
lines.push(`Summary: ${report.summary}`);
|
|
67
|
+
if (report.nextSuggestedAction) {
|
|
68
|
+
lines.push(`Next: ${report.nextSuggestedAction}`);
|
|
69
|
+
}
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 简化 summary 跟 nextSuggestedAction — 之前 runner 留空, formatter 拍.
|
|
74
|
+
* 拍板 (D-11, 2026-06-04): summary 给"X/Y pass", nextSuggestedAction 给 fix 提示.
|
|
75
|
+
*/
|
|
76
|
+
export function buildSummaryAndNext(report, options = {}) {
|
|
77
|
+
const total = report.checks.length;
|
|
78
|
+
const passed = report.checks.filter((c) => c.status === 'passed').length;
|
|
79
|
+
const summary = `${passed}/${total} checks ${report.overallStatus === 'passed' ? 'passed' : 'failed'}`;
|
|
80
|
+
let next;
|
|
81
|
+
if (report.overallStatus === 'passed') {
|
|
82
|
+
next = options.logFilePath
|
|
83
|
+
? `all green; full log: ${options.logFilePath}`
|
|
84
|
+
: 'all green; ready to commit';
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const failed = report.checks.filter((c) => c.status !== 'passed');
|
|
88
|
+
const firstFailed = failed[0];
|
|
89
|
+
if (firstFailed?.status === 'timed-out') {
|
|
90
|
+
next = `investigate timeout in ${firstFailed.name} (${firstFailed.durationMs}ms)`;
|
|
91
|
+
}
|
|
92
|
+
else if (firstFailed?.status === 'spawn-error') {
|
|
93
|
+
next = `fix spawn error in ${firstFailed.name}: ${firstFailed.errorMessage ?? 'unknown'}`;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
next = `fix failing check: ${firstFailed?.name ?? '?'} (see stderr tail above)`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { summary, nextSuggestedAction: next };
|
|
100
|
+
}
|
|
101
|
+
function formatDuration(ms) {
|
|
102
|
+
if (ms < 1000)
|
|
103
|
+
return `${ms}ms`;
|
|
104
|
+
const s = ms / 1000;
|
|
105
|
+
if (s < 60)
|
|
106
|
+
return `${s.toFixed(1)}s`;
|
|
107
|
+
const m = Math.floor(s / 60);
|
|
108
|
+
const rem = Math.floor(s - m * 60);
|
|
109
|
+
return `${m}m ${rem}s`;
|
|
110
|
+
}
|
|
111
|
+
function tailLinesOf(s, n) {
|
|
112
|
+
if (s.length === 0)
|
|
113
|
+
return '';
|
|
114
|
+
const lines = s.split('\n');
|
|
115
|
+
if (lines.length <= n)
|
|
116
|
+
return s.trimEnd();
|
|
117
|
+
// 取最后 n 行, 然后 join 回 "\n" (不是 "," 也不是 "")
|
|
118
|
+
return lines.slice(-n).join('\n');
|
|
119
|
+
}
|
|
120
|
+
/** @internal — 单步 status helper, 跟 status 字段对齐. 单测用. */
|
|
121
|
+
export function _checkStatusIcon(status) {
|
|
122
|
+
return STATUS_ICON[status];
|
|
123
|
+
}
|
|
124
|
+
/** @internal — 单测用: 提取 check 简短描述. */
|
|
125
|
+
export function _describeCheck(c) {
|
|
126
|
+
return `${c.name} ${c.status} (${c.durationMs}ms, exit ${c.exitCode ?? 'null'})`;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=format-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-report.js","sourceRoot":"","sources":["../../src/verify/format-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — verify module entry
|
|
3
|
+
*
|
|
4
|
+
* 公开 runVerify + formatReport + 类型, 供 REPL `/verify` 跟 CLI `deepwhale --verify` 用.
|
|
5
|
+
*/
|
|
6
|
+
export { runVerify, detectContext, pickChecksForContext, resolveRunner, looksLikeSpawnError, type VerifyCheck, type VerifyCheckResult, type VerifyCheckStatus, type VerificationReport, type VerificationOverallStatus, type VerifyContext, type RunVerifyOptions, } from './verify-runner.js';
|
|
7
|
+
export { formatReport, buildSummaryAndNext, type FormatReportOptions, } from './format-report.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verify/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deepwhale/coding-agent — verify module entry
|
|
3
|
+
*
|
|
4
|
+
* 公开 runVerify + formatReport + 类型, 供 REPL `/verify` 跟 CLI `deepwhale --verify` 用.
|
|
5
|
+
*/
|
|
6
|
+
export { runVerify, detectContext, pickChecksForContext, resolveRunner, looksLikeSpawnError, } from './verify-runner.js';
|
|
7
|
+
export { formatReport, buildSummaryAndNext, } from './format-report.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verify/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GAQpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC"}
|