@winspan/claude-forge 8.28.1 → 8.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -215
- package/dist/capability/execution-manager.d.ts +59 -0
- package/dist/capability/execution-manager.d.ts.map +1 -0
- package/dist/capability/execution-manager.js +168 -0
- package/dist/capability/execution-manager.js.map +1 -0
- package/dist/capability/executor/background-executor.d.ts +57 -0
- package/dist/capability/executor/background-executor.d.ts.map +1 -0
- package/dist/capability/executor/background-executor.js +299 -0
- package/dist/capability/executor/background-executor.js.map +1 -0
- package/dist/capability/executor/foreground-executor.d.ts +26 -0
- package/dist/capability/executor/foreground-executor.d.ts.map +1 -0
- package/dist/capability/executor/foreground-executor.js +82 -0
- package/dist/capability/executor/foreground-executor.js.map +1 -0
- package/dist/capability/executor/orchestrator.d.ts +25 -0
- package/dist/capability/executor/orchestrator.d.ts.map +1 -0
- package/dist/capability/executor/orchestrator.js +79 -0
- package/dist/capability/executor/orchestrator.js.map +1 -0
- package/dist/capability/executor/stream-parser.d.ts +73 -0
- package/dist/capability/executor/stream-parser.d.ts.map +1 -0
- package/dist/capability/executor/stream-parser.js +56 -0
- package/dist/capability/executor/stream-parser.js.map +1 -0
- package/dist/capability/executor/types.d.ts +44 -0
- package/dist/capability/executor/types.d.ts.map +1 -0
- package/dist/capability/executor/types.js +9 -0
- package/dist/capability/executor/types.js.map +1 -0
- package/dist/capability/executor/worker-auth-probe.d.ts +30 -0
- package/dist/capability/executor/worker-auth-probe.d.ts.map +1 -0
- package/dist/capability/executor/worker-auth-probe.js +99 -0
- package/dist/capability/executor/worker-auth-probe.js.map +1 -0
- package/dist/capability/methodology-planner.d.ts.map +1 -1
- package/dist/capability/methodology-planner.js +10 -7
- package/dist/capability/methodology-planner.js.map +1 -1
- package/dist/capability/types.d.ts +10 -1
- package/dist/capability/types.d.ts.map +1 -1
- package/dist/core/storage/sqlite.d.ts +18 -0
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +75 -4
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/daemon/handlers/methodology-formatter.d.ts +7 -0
- package/dist/daemon/handlers/methodology-formatter.d.ts.map +1 -1
- package/dist/daemon/handlers/methodology-formatter.js +46 -0
- package/dist/daemon/handlers/methodology-formatter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +6 -3
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +6 -1
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +45 -1
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +34 -1
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +20 -1
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/methodology-pending-queue.d.ts +33 -0
- package/dist/daemon/methodology-pending-queue.d.ts.map +1 -0
- package/dist/daemon/methodology-pending-queue.js +120 -0
- package/dist/daemon/methodology-pending-queue.js.map +1 -0
- package/dist/web/server.d.ts +6 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +127 -7
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/assets/AIConfig-nZgwaowr.js +2 -0
- package/dist/web/static/assets/AIConfig-nZgwaowr.js.map +1 -0
- package/dist/web/static/assets/Agents-BZGXKWC7.js +2 -0
- package/dist/web/static/assets/Agents-BZGXKWC7.js.map +1 -0
- package/dist/web/static/assets/CodeBlock--H53gk46.js +2 -0
- package/dist/web/static/assets/CodeBlock--H53gk46.js.map +1 -0
- package/dist/web/static/assets/Dashboard-qUCxXFSI.js +2 -0
- package/dist/web/static/assets/Dashboard-qUCxXFSI.js.map +1 -0
- package/dist/web/static/assets/Drawer-DeKukfwJ.js +2 -0
- package/dist/web/static/assets/Drawer-DeKukfwJ.js.map +1 -0
- package/dist/web/static/assets/Events-CnA3f740.js +2 -0
- package/dist/web/static/assets/Events-CnA3f740.js.map +1 -0
- package/dist/web/static/assets/ExecutionTrace-ClPfFIQa.js +2 -0
- package/dist/web/static/assets/ExecutionTrace-ClPfFIQa.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +2 -0
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +1 -0
- package/dist/web/static/assets/Methodologies-CAXUXeox.js +2 -0
- package/dist/web/static/assets/Methodologies-CAXUXeox.js.map +1 -0
- package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js +2 -0
- package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js.map +1 -0
- package/dist/web/static/assets/Routing-CFmM7JuB.js +2 -0
- package/dist/web/static/assets/Routing-CFmM7JuB.js.map +1 -0
- package/dist/web/static/assets/SessionDetail-DzTue2xK.js +2 -0
- package/dist/web/static/assets/SessionDetail-DzTue2xK.js.map +1 -0
- package/dist/web/static/assets/Sessions-DwWOKgnl.js +2 -0
- package/dist/web/static/assets/Sessions-DwWOKgnl.js.map +1 -0
- package/dist/web/static/assets/Skills-DhM6ALhr.js +2 -0
- package/dist/web/static/assets/Skills-DhM6ALhr.js.map +1 -0
- package/dist/web/static/assets/charts-CLrM0_uM.js +37 -0
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +1 -0
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +2 -0
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +1 -0
- package/dist/web/static/assets/export-CEzDNM66.js +4 -0
- package/dist/web/static/assets/export-CEzDNM66.js.map +1 -0
- package/dist/web/static/assets/index-CVWult53.css +1 -0
- package/dist/web/static/assets/index-DUYj2ek1.js +3 -0
- package/dist/web/static/assets/index-DUYj2ek1.js.map +1 -0
- package/dist/web/static/assets/lucide-DjB4fWNj.js +227 -0
- package/dist/web/static/assets/lucide-DjB4fWNj.js.map +1 -0
- package/dist/web/static/assets/query-C99w429o.js +2 -0
- package/dist/web/static/assets/query-C99w429o.js.map +1 -0
- package/dist/web/static/assets/react-router-I-HqunH7.js +20 -0
- package/dist/web/static/assets/react-router-I-HqunH7.js.map +1 -0
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +49 -0
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +9 -0
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +1 -0
- package/dist/web/static/assets/vendor-CMMjVdZs.js +64 -0
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +1 -0
- package/dist/web/static/index.html +8 -2
- package/package.json +1 -1
- package/dist/web/static/assets/index-CtylfoaN.css +0 -1
- package/dist/web/static/assets/index-DnaQt27h.js +0 -388
- package/dist/web/static/assets/index-DnaQt27h.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse Claude CLI --output-format stream-json lines.
|
|
3
|
+
*
|
|
4
|
+
* 实际观测到的事件形状(claude 2.1.119):
|
|
5
|
+
* - {"type":"system","subtype":"init", session_id, tools, model, ...}
|
|
6
|
+
* - {"type":"assistant","message":{"content":[{"type":"text","text":"..."} | {"type":"tool_use", name, input, id}]}, session_id, uuid}
|
|
7
|
+
* - {"type":"user","message":{"content":[{"type":"tool_result", tool_use_id, content}]}, session_id}
|
|
8
|
+
* - {"type":"result","subtype":"success"|"error", is_error, result, total_cost_usd, duration_ms, session_id, ...}
|
|
9
|
+
*
|
|
10
|
+
* 本模块只做轻量抽取,不把所有字段建模 —— 用 as StreamEvent 读取关心的几个。
|
|
11
|
+
*/
|
|
12
|
+
export function parseStreamLine(line) {
|
|
13
|
+
const trimmed = line.trim();
|
|
14
|
+
if (!trimmed)
|
|
15
|
+
return { event: null };
|
|
16
|
+
try {
|
|
17
|
+
const obj = JSON.parse(trimmed);
|
|
18
|
+
if (obj && typeof obj === 'object' && 'type' in obj) {
|
|
19
|
+
return { event: obj };
|
|
20
|
+
}
|
|
21
|
+
return { event: null, error: 'not a stream-json event (missing type)' };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return { event: null, error: `JSON parse failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Extract final assistant text from a result event (success subtype has `result` field).
|
|
29
|
+
*/
|
|
30
|
+
export function extractResultText(event) {
|
|
31
|
+
if (event.type === 'result' && 'result' in event && typeof event.result === 'string') {
|
|
32
|
+
return event.result;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract tool_use blocks from an assistant message event (for observability / agent detection).
|
|
38
|
+
*/
|
|
39
|
+
export function extractToolUses(event) {
|
|
40
|
+
if (event.type !== 'assistant')
|
|
41
|
+
return [];
|
|
42
|
+
const blocks = event.message?.content ?? [];
|
|
43
|
+
const out = [];
|
|
44
|
+
for (const b of blocks) {
|
|
45
|
+
if (b.type === 'tool_use')
|
|
46
|
+
out.push({ id: b.id, name: b.name, input: b.input });
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Does this event signal the end of the turn? Result events mark completion.
|
|
52
|
+
*/
|
|
53
|
+
export function isTerminal(event) {
|
|
54
|
+
return event.type === 'result';
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=stream-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-parser.js","sourceRoot":"","sources":["../../../src/capability/executor/stream-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2BH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAC/C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC1G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrF,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAwD,EAAE,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Methodology Phase Executor — 接口 & 公共类型
|
|
3
|
+
*
|
|
4
|
+
* 两种执行模式复用同一份 plan 数据:
|
|
5
|
+
* - foreground:走 hook 注入,Claude 主会话执行(现有机制 + Phase A 兜底)
|
|
6
|
+
* - background:spawn `claude -p` 子进程独立驱动(Phase C)
|
|
7
|
+
*/
|
|
8
|
+
import type { MethodologyExecution, PlannedPhase } from '../types.js';
|
|
9
|
+
export type ExecutorMode = 'foreground' | 'background';
|
|
10
|
+
export interface PhaseExecutionResult {
|
|
11
|
+
/** 'injected' — foreground 已把指令注入;实际执行由 hook 链路完成 */
|
|
12
|
+
/** 'completed' — background 子进程跑完并标记 phase 完成 */
|
|
13
|
+
/** 'failed' — 执行失败(error 字段说明原因) */
|
|
14
|
+
/** 'cancelled' — 被手动取消 */
|
|
15
|
+
status: 'injected' | 'completed' | 'failed' | 'cancelled';
|
|
16
|
+
phase_index: number;
|
|
17
|
+
phase_id: string;
|
|
18
|
+
output_text?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
duration_ms?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ExecutorEvent {
|
|
23
|
+
type: 'phase-start' | 'phase-log' | 'phase-finish' | 'done' | 'error';
|
|
24
|
+
execution_id: number;
|
|
25
|
+
phase_index?: number;
|
|
26
|
+
phase_id?: string;
|
|
27
|
+
payload?: unknown;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
}
|
|
30
|
+
export type ExecutorEventListener = (event: ExecutorEvent) => void;
|
|
31
|
+
export interface PhaseExecutor {
|
|
32
|
+
readonly mode: ExecutorMode;
|
|
33
|
+
/**
|
|
34
|
+
* 执行一个 phase。各模式的语义:
|
|
35
|
+
* - foreground:把 directive 放入 pending queue,立即返回 status='injected'
|
|
36
|
+
* - background:spawn claude -p 并等待返回,更新 phase_executions 表
|
|
37
|
+
*/
|
|
38
|
+
executePhase(execution: MethodologyExecution, phase: PlannedPhase, phaseIndex: number): Promise<PhaseExecutionResult>;
|
|
39
|
+
/** 取消正在运行的 execution(background 会 kill 子进程;foreground 清队列) */
|
|
40
|
+
cancel(execution_id: number): Promise<void>;
|
|
41
|
+
/** 监听执行过程事件(用于 SSE / UI 实时展示) */
|
|
42
|
+
subscribe(listener: ExecutorEventListener): () => void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/capability/executor/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,iDAAiD;IACjD,oCAAoC;IACpC,0BAA0B;IAC1B,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EACA,aAAa,GACb,WAAW,GACX,cAAc,GACd,MAAM,GACN,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B;;;;OAIG;IACH,YAAY,CACV,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,8DAA8D;IAC9D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,iCAAiC;IACjC,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAAC;CACxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/capability/executor/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worker-auth-probe —— 轻量探测 claude CLI 是否拥有可用认证。
|
|
3
|
+
*
|
|
4
|
+
* 设计原则:
|
|
5
|
+
* - 不启动子进程、不做网络调用,只看 env / 磁盘文件
|
|
6
|
+
* - 宁可 false-negative(判 available=true 实际失败后由 worker 报错),
|
|
7
|
+
* 也不 false-positive 阻断能跑的场景
|
|
8
|
+
* - 只检查 env `ANTHROPIC_API_KEY` 和 `~/.claude/.credentials.json`,
|
|
9
|
+
* 不探测 macOS keychain(平台相关,成本高于收益)
|
|
10
|
+
*/
|
|
11
|
+
export type WorkerAuthMethod = 'api-key-env' | 'oauth-token' | 'keychain' | 'unknown' | 'none';
|
|
12
|
+
export interface WorkerAuthProbe {
|
|
13
|
+
available: boolean;
|
|
14
|
+
method: WorkerAuthMethod;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 后台 worker 认证缺失错误,带 `code` 便于上层(Web API)分流返回 503。
|
|
19
|
+
*/
|
|
20
|
+
export declare class WorkerAuthError extends Error {
|
|
21
|
+
readonly code: "AUTH_REQUIRED";
|
|
22
|
+
readonly probe: WorkerAuthProbe;
|
|
23
|
+
constructor(probe: WorkerAuthProbe);
|
|
24
|
+
}
|
|
25
|
+
export interface ProbeOptions {
|
|
26
|
+
/** 覆盖凭据文件路径,便于测试 */
|
|
27
|
+
credentialsPath?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function probeWorkerAuth(options?: ProbeOptions): WorkerAuthProbe;
|
|
30
|
+
//# sourceMappingURL=worker-auth-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-auth-probe.d.ts","sourceRoot":"","sources":["../../../src/capability/executor/worker-auth-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,aAAa,GACb,UAAU,GACV,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;IACzC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;gBAEpB,KAAK,EAAE,eAAe;CAQnC;AAoCD,MAAM,WAAW,YAAY;IAC3B,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,YAAiB,GAAG,eAAe,CAoC3E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worker-auth-probe —— 轻量探测 claude CLI 是否拥有可用认证。
|
|
3
|
+
*
|
|
4
|
+
* 设计原则:
|
|
5
|
+
* - 不启动子进程、不做网络调用,只看 env / 磁盘文件
|
|
6
|
+
* - 宁可 false-negative(判 available=true 实际失败后由 worker 报错),
|
|
7
|
+
* 也不 false-positive 阻断能跑的场景
|
|
8
|
+
* - 只检查 env `ANTHROPIC_API_KEY` 和 `~/.claude/.credentials.json`,
|
|
9
|
+
* 不探测 macOS keychain(平台相关,成本高于收益)
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* 后台 worker 认证缺失错误,带 `code` 便于上层(Web API)分流返回 503。
|
|
16
|
+
*/
|
|
17
|
+
export class WorkerAuthError extends Error {
|
|
18
|
+
code = 'AUTH_REQUIRED';
|
|
19
|
+
probe;
|
|
20
|
+
constructor(probe) {
|
|
21
|
+
super(`Background mode requires Claude authentication: ${probe.message}. ` +
|
|
22
|
+
'Set ANTHROPIC_API_KEY env var or run `claude login` first.');
|
|
23
|
+
this.name = 'WorkerAuthError';
|
|
24
|
+
this.probe = probe;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 默认 OAuth 凭据文件路径:`~/.claude/.credentials.json`
|
|
29
|
+
* 官方 claude-code 在首次登录后写到这里。
|
|
30
|
+
*/
|
|
31
|
+
function defaultCredentialsPath() {
|
|
32
|
+
return path.join(homedir(), '.claude', '.credentials.json');
|
|
33
|
+
}
|
|
34
|
+
function isNonEmptyString(v) {
|
|
35
|
+
return typeof v === 'string' && v.trim().length > 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 粗判 credentials.json 是否"像"一份合法的 OAuth 凭据。
|
|
39
|
+
* 只要能 parse 出对象且含任何 token 形字段就算通过——实际有效性交给 worker 验证。
|
|
40
|
+
*/
|
|
41
|
+
function looksLikeOAuthCredentials(raw) {
|
|
42
|
+
try {
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
if (!parsed || typeof parsed !== 'object')
|
|
45
|
+
return false;
|
|
46
|
+
const obj = parsed;
|
|
47
|
+
// 常见字段:claudeAiOauth.accessToken / accessToken / oauth / tokens 等
|
|
48
|
+
// 宽松识别即可:有对象内容就认为配过
|
|
49
|
+
if (isNonEmptyString(obj.accessToken))
|
|
50
|
+
return true;
|
|
51
|
+
if (obj.claudeAiOauth && typeof obj.claudeAiOauth === 'object')
|
|
52
|
+
return true;
|
|
53
|
+
if (obj.oauth && typeof obj.oauth === 'object')
|
|
54
|
+
return true;
|
|
55
|
+
if (obj.tokens && typeof obj.tokens === 'object')
|
|
56
|
+
return true;
|
|
57
|
+
// 兜底:只要 JSON 不是空对象就当有配置
|
|
58
|
+
return Object.keys(obj).length > 0;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function probeWorkerAuth(options = {}) {
|
|
65
|
+
// 1) env 优先
|
|
66
|
+
const envKey = process.env.ANTHROPIC_API_KEY;
|
|
67
|
+
if (isNonEmptyString(envKey)) {
|
|
68
|
+
return {
|
|
69
|
+
available: true,
|
|
70
|
+
method: 'api-key-env',
|
|
71
|
+
message: 'ANTHROPIC_API_KEY env is set',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// 2) OAuth credentials 文件
|
|
75
|
+
const credPath = options.credentialsPath ?? defaultCredentialsPath();
|
|
76
|
+
if (existsSync(credPath)) {
|
|
77
|
+
try {
|
|
78
|
+
const raw = readFileSync(credPath, 'utf-8');
|
|
79
|
+
if (looksLikeOAuthCredentials(raw)) {
|
|
80
|
+
return {
|
|
81
|
+
available: true,
|
|
82
|
+
method: 'oauth-token',
|
|
83
|
+
message: `OAuth credentials found at ${credPath}`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// ignore — 读失败当作不可用
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 3) 都没有
|
|
92
|
+
return {
|
|
93
|
+
available: false,
|
|
94
|
+
method: 'none',
|
|
95
|
+
message: 'no ANTHROPIC_API_KEY env and no OAuth credentials on disk ' +
|
|
96
|
+
`(expected ${credPath})`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=worker-auth-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-auth-probe.js","sourceRoot":"","sources":["../../../src/capability/executor/worker-auth-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-planner.d.ts","sourceRoot":"","sources":["../../src/capability/methodology-planner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAG3E,qBAAa,kBAAkB;IACjB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU,GAAG,IAAI;IAEzC;;OAEG;IACG,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,aAAa,CAAC;IAqBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"methodology-planner.d.ts","sourceRoot":"","sources":["../../src/capability/methodology-planner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAG3E,qBAAa,kBAAkB;IACjB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU,GAAG,IAAI;IAEzC;;OAEG;IACG,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,aAAa,CAAC;IAqBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwD1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;IACH,OAAO,CAAC,YAAY;IA+CpB;;OAEG;IACH,OAAO,CAAC,SAAS;CAgBlB"}
|
|
@@ -36,7 +36,7 @@ export class MethodologyPlanner {
|
|
|
36
36
|
*/
|
|
37
37
|
buildPlannerPrompt(userPrompt, intent, methodology) {
|
|
38
38
|
const phaseDescriptions = Object.entries(methodology.phase_templates)
|
|
39
|
-
.map(([id, template]) => `- ${id}: ${template.description || template.prompt_template}`)
|
|
39
|
+
.map(([id, template]) => `- ${id} (agent: ${template.agent}): ${template.description || template.prompt_template}`)
|
|
40
40
|
.join('\n');
|
|
41
41
|
const decisionRules = methodology.decision_rules
|
|
42
42
|
?.map(rule => `- ${rule.condition} → [${rule.phases.join(', ')}]: ${rule.description}`)
|
|
@@ -50,7 +50,7 @@ Intent Analysis:
|
|
|
50
50
|
- Complexity: ${intent.complexity}
|
|
51
51
|
- Requirement: ${intent.requirement}
|
|
52
52
|
|
|
53
|
-
Available Phases:
|
|
53
|
+
Available Phases (phase id → agent binding is FIXED, do NOT change the agent):
|
|
54
54
|
${phaseDescriptions}
|
|
55
55
|
|
|
56
56
|
Decision Rules (as reference):
|
|
@@ -64,13 +64,13 @@ Guidelines:
|
|
|
64
64
|
3. Complex tasks (complexity: complex): Use full workflow (3-4+)
|
|
65
65
|
4. Consider task type: bug fix needs less phases than architecture change
|
|
66
66
|
5. Each phase must have a clear rationale
|
|
67
|
+
6. NEVER invent agent names — agent is bound by phase id above
|
|
67
68
|
|
|
68
69
|
Output JSON (no markdown, just JSON):
|
|
69
70
|
{
|
|
70
71
|
"phases": [
|
|
71
72
|
{
|
|
72
|
-
"id": "
|
|
73
|
-
"agent": "agent_name",
|
|
73
|
+
"id": "phase_id_from_available_phases",
|
|
74
74
|
"prompt": "Specific instruction for this phase",
|
|
75
75
|
"rationale": "Why this phase is needed"
|
|
76
76
|
}
|
|
@@ -78,7 +78,10 @@ Output JSON (no markdown, just JSON):
|
|
|
78
78
|
"rationale": "Overall plan rationale"
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
IMPORTANT:
|
|
81
|
+
IMPORTANT:
|
|
82
|
+
- Output ONLY valid JSON, no markdown code blocks.
|
|
83
|
+
- Do NOT include an "agent" field — it is determined by phase id.
|
|
84
|
+
- Only use phase ids listed in Available Phases.`;
|
|
82
85
|
}
|
|
83
86
|
/**
|
|
84
87
|
* 解析 AI 响应
|
|
@@ -97,7 +100,7 @@ IMPORTANT: Output ONLY valid JSON, no markdown code blocks.`;
|
|
|
97
100
|
}
|
|
98
101
|
cleaned = cleaned.trim();
|
|
99
102
|
const parsed = JSON.parse(cleaned);
|
|
100
|
-
// 验证和补充 phases
|
|
103
|
+
// 验证和补充 phases(agent 字段以 YAML template 为权威,忽略 AI 可能返回的 agent)
|
|
101
104
|
const phases = parsed.phases.map((phase) => {
|
|
102
105
|
const template = methodology.phase_templates[phase.id];
|
|
103
106
|
if (!template) {
|
|
@@ -105,7 +108,7 @@ IMPORTANT: Output ONLY valid JSON, no markdown code blocks.`;
|
|
|
105
108
|
}
|
|
106
109
|
return {
|
|
107
110
|
id: phase.id,
|
|
108
|
-
agent:
|
|
111
|
+
agent: template.agent,
|
|
109
112
|
prompt: phase.prompt,
|
|
110
113
|
rationale: phase.rationale,
|
|
111
114
|
artifacts: template.artifacts,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-planner.js","sourceRoot":"","sources":["../../src/capability/methodology-planner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,OAAO,kBAAkB;IACT;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,UAAkB,EAClB,MAAsB,EACtB,WAAwB;QAExB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,YAAY;YACZ,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC9C,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4CAA4C,GAAG,kBAAkB,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,UAAkB,EAClB,MAAsB,EACtB,WAAwB;QAExB,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC;aAClE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"methodology-planner.js","sourceRoot":"","sources":["../../src/capability/methodology-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,7 +51,10 @@ export interface MethodologyExecution {
|
|
|
51
51
|
methodology_id: string;
|
|
52
52
|
plan_json: string;
|
|
53
53
|
current_phase_index: number;
|
|
54
|
-
status: 'running' | 'completed' | 'failed';
|
|
54
|
+
status: 'running' | 'completed' | 'failed' | 'cancelled';
|
|
55
|
+
mode?: 'foreground' | 'background';
|
|
56
|
+
worker_pid?: number | null;
|
|
57
|
+
worker_session_id?: string | null;
|
|
55
58
|
started_at: number;
|
|
56
59
|
completed_at?: number;
|
|
57
60
|
}
|
|
@@ -59,10 +62,16 @@ export interface PhaseExecution {
|
|
|
59
62
|
id: number;
|
|
60
63
|
methodology_execution_id: number;
|
|
61
64
|
phase_id: string;
|
|
65
|
+
phase_index: number;
|
|
62
66
|
agent_name: string;
|
|
63
67
|
prompt: string;
|
|
64
68
|
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
65
69
|
started_at?: number;
|
|
66
70
|
completed_at?: number;
|
|
71
|
+
duration_ms?: number;
|
|
72
|
+
artifacts_json?: string | null;
|
|
73
|
+
output_text?: string | null;
|
|
74
|
+
error_message?: string | null;
|
|
75
|
+
stream_log_path?: string | null;
|
|
67
76
|
}
|
|
68
77
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/capability/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAGD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/capability/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAGD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACzD,IAAI,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB,EAAE,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC"}
|
|
@@ -97,6 +97,13 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
97
97
|
private dbPath;
|
|
98
98
|
constructor(dbPath: string);
|
|
99
99
|
private initSchema;
|
|
100
|
+
private hasColumn;
|
|
101
|
+
private addColumnIfMissing;
|
|
102
|
+
/**
|
|
103
|
+
* Incremental schema migrations. Kept idempotent so daemon restarts are safe.
|
|
104
|
+
* New columns since the base schema.sql go here.
|
|
105
|
+
*/
|
|
106
|
+
private runMigrations;
|
|
100
107
|
getDatabase(): Database.Database;
|
|
101
108
|
getDbPath(): string;
|
|
102
109
|
writeEvent(event: ForgeEvent): void;
|
|
@@ -212,14 +219,22 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
212
219
|
session_id: string;
|
|
213
220
|
methodology_id: string;
|
|
214
221
|
plan_json: string;
|
|
222
|
+
mode?: 'foreground' | 'background';
|
|
215
223
|
}): number;
|
|
216
224
|
getActiveMethodologyExecution(session_id: string): any | null;
|
|
217
225
|
updateMethodologyExecution(id: number, data: {
|
|
218
226
|
current_phase_index?: number;
|
|
219
227
|
status?: string;
|
|
220
228
|
completed_at?: number;
|
|
229
|
+
worker_pid?: number | null;
|
|
230
|
+
worker_session_id?: string | null;
|
|
221
231
|
}): void;
|
|
222
232
|
getMethodologyExecution(id: number): any | null;
|
|
233
|
+
/**
|
|
234
|
+
* List all methodology_executions with status='running' and mode='background'.
|
|
235
|
+
* Used at daemon startup to detect crashed workers (worker_pid not alive).
|
|
236
|
+
*/
|
|
237
|
+
listRunningBackgroundExecutions(): any[];
|
|
223
238
|
createPhaseExecution(data: {
|
|
224
239
|
methodology_execution_id: number;
|
|
225
240
|
phase_id: string;
|
|
@@ -231,6 +246,9 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
231
246
|
status?: string;
|
|
232
247
|
completed_at?: number;
|
|
233
248
|
artifacts_json?: string;
|
|
249
|
+
output_text?: string | null;
|
|
250
|
+
error_message?: string | null;
|
|
251
|
+
stream_log_path?: string | null;
|
|
234
252
|
}): void;
|
|
235
253
|
getPhaseExecutions(methodology_execution_id: number): any[];
|
|
236
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/core/storage/sqlite.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/core/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
27
27
|
this.db.pragma(`cache_size = ${DATABASE.CACHE_SIZE}`);
|
|
28
28
|
this.db.pragma(`busy_timeout = ${DATABASE.BUSY_TIMEOUT}`);
|
|
29
29
|
this.initSchema();
|
|
30
|
+
this.runMigrations();
|
|
30
31
|
}
|
|
31
32
|
initSchema() {
|
|
32
33
|
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
@@ -52,6 +53,40 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
52
53
|
`);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
56
|
+
hasColumn(table, column) {
|
|
57
|
+
try {
|
|
58
|
+
const rows = this.db.prepare(`PRAGMA table_info(${table})`).all();
|
|
59
|
+
return rows.some(r => r.name === column);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
addColumnIfMissing(table, column, definition) {
|
|
66
|
+
if (!this.hasColumn(table, column)) {
|
|
67
|
+
try {
|
|
68
|
+
this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
69
|
+
logger.info(`[SQLiteStorage] migration: added ${table}.${column}`);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
logger.warn(`[SQLiteStorage] migration: ALTER ${table} ADD ${column} failed: ${err}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Incremental schema migrations. Kept idempotent so daemon restarts are safe.
|
|
78
|
+
* New columns since the base schema.sql go here.
|
|
79
|
+
*/
|
|
80
|
+
runMigrations() {
|
|
81
|
+
// methodology_executions: mode / worker_pid / worker_session_id
|
|
82
|
+
this.addColumnIfMissing('methodology_executions', 'mode', "TEXT NOT NULL DEFAULT 'foreground'");
|
|
83
|
+
this.addColumnIfMissing('methodology_executions', 'worker_pid', 'INTEGER');
|
|
84
|
+
this.addColumnIfMissing('methodology_executions', 'worker_session_id', 'TEXT');
|
|
85
|
+
// phase_executions: output_text / error_message / stream_log_path
|
|
86
|
+
this.addColumnIfMissing('phase_executions', 'output_text', 'TEXT');
|
|
87
|
+
this.addColumnIfMissing('phase_executions', 'error_message', 'TEXT');
|
|
88
|
+
this.addColumnIfMissing('phase_executions', 'stream_log_path', 'TEXT');
|
|
89
|
+
}
|
|
55
90
|
getDatabase() {
|
|
56
91
|
return this.db;
|
|
57
92
|
}
|
|
@@ -506,10 +541,11 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
506
541
|
}
|
|
507
542
|
// ── Methodology Executions ─────────────────────────────────────────────
|
|
508
543
|
createMethodologyExecution(data) {
|
|
544
|
+
const mode = data.mode ?? 'foreground';
|
|
509
545
|
const result = this.db.prepare(`
|
|
510
|
-
INSERT INTO methodology_executions (session_id, methodology_id, plan_json, started_at)
|
|
511
|
-
VALUES (?, ?, ?, ?)
|
|
512
|
-
`).run(data.session_id, data.methodology_id, data.plan_json, Date.now());
|
|
546
|
+
INSERT INTO methodology_executions (session_id, methodology_id, plan_json, mode, started_at)
|
|
547
|
+
VALUES (?, ?, ?, ?, ?)
|
|
548
|
+
`).run(data.session_id, data.methodology_id, data.plan_json, mode, Date.now());
|
|
513
549
|
return result.lastInsertRowid;
|
|
514
550
|
}
|
|
515
551
|
getActiveMethodologyExecution(session_id) {
|
|
@@ -534,6 +570,14 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
534
570
|
updates.push('completed_at = ?');
|
|
535
571
|
values.push(data.completed_at);
|
|
536
572
|
}
|
|
573
|
+
if (data.worker_pid !== undefined) {
|
|
574
|
+
updates.push('worker_pid = ?');
|
|
575
|
+
values.push(data.worker_pid);
|
|
576
|
+
}
|
|
577
|
+
if (data.worker_session_id !== undefined) {
|
|
578
|
+
updates.push('worker_session_id = ?');
|
|
579
|
+
values.push(data.worker_session_id);
|
|
580
|
+
}
|
|
537
581
|
if (updates.length > 0) {
|
|
538
582
|
values.push(id);
|
|
539
583
|
this.db.prepare(`
|
|
@@ -548,6 +592,17 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
548
592
|
SELECT * FROM methodology_executions WHERE id = ?
|
|
549
593
|
`).get(id) || null;
|
|
550
594
|
}
|
|
595
|
+
/**
|
|
596
|
+
* List all methodology_executions with status='running' and mode='background'.
|
|
597
|
+
* Used at daemon startup to detect crashed workers (worker_pid not alive).
|
|
598
|
+
*/
|
|
599
|
+
listRunningBackgroundExecutions() {
|
|
600
|
+
return this.db.prepare(`
|
|
601
|
+
SELECT * FROM methodology_executions
|
|
602
|
+
WHERE status = 'running' AND mode = 'background'
|
|
603
|
+
ORDER BY id DESC
|
|
604
|
+
`).all();
|
|
605
|
+
}
|
|
551
606
|
// ── Phase Executions ───────────────────────────────────────────────────
|
|
552
607
|
createPhaseExecution(data) {
|
|
553
608
|
const result = this.db.prepare(`
|
|
@@ -568,13 +623,29 @@ export class SQLiteStorage extends EventEmitter {
|
|
|
568
623
|
updates.push('completed_at = ?');
|
|
569
624
|
values.push(data.completed_at);
|
|
570
625
|
if (data.status === 'completed') {
|
|
571
|
-
|
|
626
|
+
// SQLite UPDATE 的 SET 子句里引用列名取的是更新前的值,
|
|
627
|
+
// 不能写 `duration_ms = completed_at - started_at`(RHS 的 completed_at 仍是 NULL)。
|
|
628
|
+
// 用参数占位符复写一次 completed_at 的值,减去旧的 started_at。
|
|
629
|
+
updates.push('duration_ms = ? - started_at');
|
|
630
|
+
values.push(data.completed_at);
|
|
572
631
|
}
|
|
573
632
|
}
|
|
574
633
|
if (data.artifacts_json) {
|
|
575
634
|
updates.push('artifacts_json = ?');
|
|
576
635
|
values.push(data.artifacts_json);
|
|
577
636
|
}
|
|
637
|
+
if (data.output_text !== undefined) {
|
|
638
|
+
updates.push('output_text = ?');
|
|
639
|
+
values.push(data.output_text);
|
|
640
|
+
}
|
|
641
|
+
if (data.error_message !== undefined) {
|
|
642
|
+
updates.push('error_message = ?');
|
|
643
|
+
values.push(data.error_message);
|
|
644
|
+
}
|
|
645
|
+
if (data.stream_log_path !== undefined) {
|
|
646
|
+
updates.push('stream_log_path = ?');
|
|
647
|
+
values.push(data.stream_log_path);
|
|
648
|
+
}
|
|
578
649
|
if (updates.length > 0) {
|
|
579
650
|
values.push(id);
|
|
580
651
|
this.db.prepare(`
|