@winspan/claude-forge 8.34.0 → 8.36.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 +10 -30
- package/dist/capability/index.d.ts +6 -5
- package/dist/capability/index.d.ts.map +1 -1
- package/dist/capability/index.js +6 -5
- package/dist/capability/index.js.map +1 -1
- package/dist/capability/types.d.ts +5 -74
- package/dist/capability/types.d.ts.map +1 -1
- package/dist/capability/types.js +4 -1
- package/dist/capability/types.js.map +1 -1
- package/dist/core/ai/provider.d.ts +23 -1
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js +67 -1
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +28 -0
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/storage/rows.d.ts +0 -36
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +1 -45
- package/dist/core/storage/sqlite.d.ts +2 -79
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +3 -362
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/utils/token-tracker.d.ts +0 -1
- package/dist/core/utils/token-tracker.d.ts.map +1 -1
- package/dist/core/utils/token-tracker.js +0 -1
- package/dist/core/utils/token-tracker.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +1 -9
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +2 -99
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +1 -15
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +1 -95
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +1 -5
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +29 -99
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +9 -56
- package/dist/daemon/index.js.map +1 -1
- package/dist/engine/agent-router.d.ts +37 -0
- package/dist/engine/agent-router.d.ts.map +1 -1
- package/dist/engine/agent-router.js +58 -0
- package/dist/engine/agent-router.js.map +1 -1
- package/dist/engine/conventions/routing.yaml +31 -2
- package/dist/intelligence/classifier.d.ts +63 -43
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +256 -191
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/intelligence/context-gatherer.d.ts +101 -0
- package/dist/intelligence/context-gatherer.d.ts.map +1 -0
- package/dist/intelligence/context-gatherer.js +417 -0
- package/dist/intelligence/context-gatherer.js.map +1 -0
- package/dist/intelligence/cot-classifier.d.ts +95 -0
- package/dist/intelligence/cot-classifier.d.ts.map +1 -0
- package/dist/intelligence/cot-classifier.js +391 -0
- package/dist/intelligence/cot-classifier.js.map +1 -0
- package/dist/intelligence/execution-doc-builder.d.ts +90 -0
- package/dist/intelligence/execution-doc-builder.d.ts.map +1 -1
- package/dist/intelligence/execution-doc-builder.js +459 -42
- package/dist/intelligence/execution-doc-builder.js.map +1 -1
- package/dist/intelligence/intent-types.d.ts +13 -0
- package/dist/intelligence/intent-types.d.ts.map +1 -0
- package/dist/intelligence/intent-types.js +19 -0
- package/dist/intelligence/intent-types.js.map +1 -0
- package/dist/intelligence/multimodal-parser.d.ts +105 -0
- package/dist/intelligence/multimodal-parser.d.ts.map +1 -0
- package/dist/intelligence/multimodal-parser.js +425 -0
- package/dist/intelligence/multimodal-parser.js.map +1 -0
- package/dist/skills/official-skills.d.ts.map +1 -1
- package/dist/skills/official-skills.js +218 -20
- package/dist/skills/official-skills.js.map +1 -1
- package/dist/web/routes/status.d.ts.map +1 -1
- package/dist/web/routes/status.js +8 -10
- package/dist/web/routes/status.js.map +1 -1
- package/dist/web/routes/token-usage.d.ts +1 -1
- package/dist/web/routes/token-usage.d.ts.map +1 -1
- package/dist/web/routes/token-usage.js +1 -16
- package/dist/web/routes/token-usage.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -6
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/server.d.ts +0 -6
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +0 -5
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/assets/{AIConfig-DiUFET_Q.js → AIConfig-D4VglzCl.js} +2 -2
- package/dist/web/static/assets/{AIConfig-DiUFET_Q.js.map → AIConfig-D4VglzCl.js.map} +1 -1
- package/dist/web/static/assets/{Agents-bNNGbQnL.js → Agents-ne5lXc7V.js} +2 -2
- package/dist/web/static/assets/{Agents-bNNGbQnL.js.map → Agents-ne5lXc7V.js.map} +1 -1
- package/dist/web/static/assets/Dashboard-D4j0Zmek.js +2 -0
- package/dist/web/static/assets/Dashboard-D4j0Zmek.js.map +1 -0
- package/dist/web/static/assets/{Drawer-DOUcx6m1.js → Drawer-Lo5ihVP-.js} +2 -2
- package/dist/web/static/assets/{Drawer-DOUcx6m1.js.map → Drawer-Lo5ihVP-.js.map} +1 -1
- package/dist/web/static/assets/{Events-DQHP6Uaq.js → Events-DBJ1B7OW.js} +2 -2
- package/dist/web/static/assets/{Events-DQHP6Uaq.js.map → Events-DBJ1B7OW.js.map} +1 -1
- package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js → ExecutionTrace-Du9XADc1.js} +2 -2
- package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js.map → ExecutionTrace-Du9XADc1.js.map} +1 -1
- package/dist/web/static/assets/{Routing-BW3eGD-8.js → Routing-BNQ09OlH.js} +2 -2
- package/dist/web/static/assets/{Routing-BW3eGD-8.js.map → Routing-BNQ09OlH.js.map} +1 -1
- package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js → SessionDetail-BPrPyMNa.js} +2 -2
- package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js.map → SessionDetail-BPrPyMNa.js.map} +1 -1
- package/dist/web/static/assets/{Sessions-ZQSCgXyy.js → Sessions-o3EXsXz9.js} +2 -2
- package/dist/web/static/assets/{Sessions-ZQSCgXyy.js.map → Sessions-o3EXsXz9.js.map} +1 -1
- package/dist/web/static/assets/{Skills-C5-5zOSH.js → Skills-Czt5mkyc.js} +2 -2
- package/dist/web/static/assets/{Skills-C5-5zOSH.js.map → Skills-Czt5mkyc.js.map} +1 -1
- package/dist/web/static/assets/{export-CbQTOt71.js → export-C0mlC4AT.js} +2 -2
- package/dist/web/static/assets/{export-CbQTOt71.js.map → export-C0mlC4AT.js.map} +1 -1
- package/dist/web/static/assets/index-B1J7nBu0.js +3 -0
- package/dist/web/static/assets/index-B1J7nBu0.js.map +1 -0
- package/dist/web/static/assets/index-BVqk4bSO.css +1 -0
- package/dist/web/static/assets/{lucide-BanPULT1.js → lucide-Bu44HVAM.js} +33 -73
- package/dist/web/static/assets/lucide-Bu44HVAM.js.map +1 -0
- package/dist/web/static/index.html +3 -3
- package/package.json +2 -2
- package/dist/capability/execution-manager.d.ts +0 -96
- package/dist/capability/execution-manager.d.ts.map +0 -1
- package/dist/capability/execution-manager.js +0 -260
- package/dist/capability/execution-manager.js.map +0 -1
- package/dist/capability/executor/background-executor.d.ts +0 -58
- package/dist/capability/executor/background-executor.d.ts.map +0 -1
- package/dist/capability/executor/background-executor.js +0 -322
- package/dist/capability/executor/background-executor.js.map +0 -1
- package/dist/capability/executor/foreground-executor.d.ts +0 -26
- package/dist/capability/executor/foreground-executor.d.ts.map +0 -1
- package/dist/capability/executor/foreground-executor.js +0 -82
- package/dist/capability/executor/foreground-executor.js.map +0 -1
- package/dist/capability/executor/orchestrator.d.ts +0 -38
- package/dist/capability/executor/orchestrator.d.ts.map +0 -1
- package/dist/capability/executor/orchestrator.js +0 -158
- package/dist/capability/executor/orchestrator.js.map +0 -1
- package/dist/capability/executor/stream-parser.d.ts +0 -73
- package/dist/capability/executor/stream-parser.d.ts.map +0 -1
- package/dist/capability/executor/stream-parser.js +0 -56
- package/dist/capability/executor/stream-parser.js.map +0 -1
- package/dist/capability/executor/types.d.ts +0 -44
- package/dist/capability/executor/types.d.ts.map +0 -1
- package/dist/capability/executor/types.js +0 -9
- package/dist/capability/executor/types.js.map +0 -1
- package/dist/capability/executor/worker-auth-probe.d.ts +0 -30
- package/dist/capability/executor/worker-auth-probe.d.ts.map +0 -1
- package/dist/capability/executor/worker-auth-probe.js +0 -108
- package/dist/capability/executor/worker-auth-probe.js.map +0 -1
- package/dist/capability/methodologies/bmad.yaml +0 -81
- package/dist/capability/methodologies/code-quality-audit.yaml +0 -26
- package/dist/capability/methodologies/harness-engineering.yaml +0 -75
- package/dist/capability/methodologies/test-coverage-scan.yaml +0 -26
- package/dist/capability/methodology-planner.d.ts +0 -49
- package/dist/capability/methodology-planner.d.ts.map +0 -1
- package/dist/capability/methodology-planner.js +0 -306
- package/dist/capability/methodology-planner.js.map +0 -1
- package/dist/capability/methodology-registry.d.ts +0 -32
- package/dist/capability/methodology-registry.d.ts.map +0 -1
- package/dist/capability/methodology-registry.js +0 -113
- package/dist/capability/methodology-registry.js.map +0 -1
- package/dist/daemon/handlers/methodology-formatter.d.ts +0 -16
- package/dist/daemon/handlers/methodology-formatter.d.ts.map +0 -1
- package/dist/daemon/handlers/methodology-formatter.js +0 -119
- package/dist/daemon/handlers/methodology-formatter.js.map +0 -1
- package/dist/daemon/idle-detector.d.ts +0 -35
- package/dist/daemon/idle-detector.d.ts.map +0 -1
- package/dist/daemon/idle-detector.js +0 -56
- package/dist/daemon/idle-detector.js.map +0 -1
- package/dist/daemon/idle-trigger.d.ts +0 -53
- package/dist/daemon/idle-trigger.d.ts.map +0 -1
- package/dist/daemon/idle-trigger.js +0 -153
- package/dist/daemon/idle-trigger.js.map +0 -1
- package/dist/daemon/methodology-pending-queue.d.ts +0 -33
- package/dist/daemon/methodology-pending-queue.d.ts.map +0 -1
- package/dist/daemon/methodology-pending-queue.js +0 -120
- package/dist/daemon/methodology-pending-queue.js.map +0 -1
- package/dist/web/routes/methodology.d.ts +0 -12
- package/dist/web/routes/methodology.d.ts.map +0 -1
- package/dist/web/routes/methodology.js +0 -228
- package/dist/web/routes/methodology.js.map +0 -1
- package/dist/web/static/assets/Dashboard-Ciyyw6ph.js +0 -2
- package/dist/web/static/assets/Dashboard-Ciyyw6ph.js.map +0 -1
- package/dist/web/static/assets/Methodologies-CXNrDXwG.js +0 -5
- package/dist/web/static/assets/Methodologies-CXNrDXwG.js.map +0 -1
- package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js +0 -2
- package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js.map +0 -1
- package/dist/web/static/assets/index-DJK5beK6.js +0 -3
- package/dist/web/static/assets/index-DJK5beK6.js.map +0 -1
- package/dist/web/static/assets/index-phpuytMI.css +0 -1
- package/dist/web/static/assets/lucide-BanPULT1.js.map +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextGatherer — 在意图分类前并行收集多源上下文
|
|
3
|
+
*
|
|
4
|
+
* 设计目标:
|
|
5
|
+
* - 给 IntentClassifier 注入 git 状态、对话历史、项目状态等额外信号
|
|
6
|
+
* - 总耗时 < 200ms(所有字段并行收集)
|
|
7
|
+
* - 单点失败不污染主流程:每个字段独立 try/catch,错误进入 meta.errors
|
|
8
|
+
*
|
|
9
|
+
* 数据来源:
|
|
10
|
+
* - git: `child_process.execFile`(log / status / branch / rev-list),单命令 2s 超时
|
|
11
|
+
* - 对话历史: SQLite `routing_events`(首选)→ `events`(兜底,仅 prompts)
|
|
12
|
+
* - resume 块: 项目根 CLAUDE.md → `decodeForgeResumeInnerFromClaudeMd`
|
|
13
|
+
* - 项目状态(可选): `git diff` 最近修改文件 + `dist/` mtime 启发
|
|
14
|
+
*
|
|
15
|
+
* 调用约束:
|
|
16
|
+
* - 严格 TS,禁止扩散 any
|
|
17
|
+
* - 不反向依赖业务层(位于 intelligence 层,仅可依赖 core)
|
|
18
|
+
*/
|
|
19
|
+
import type { SQLiteStorage } from '../core/storage/sqlite.js';
|
|
20
|
+
import type { IntentAnalysis } from './classifier.js';
|
|
21
|
+
export interface GitContext {
|
|
22
|
+
recentCommits: Array<{
|
|
23
|
+
hash: string;
|
|
24
|
+
message: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
}>;
|
|
27
|
+
uncommittedFiles: string[];
|
|
28
|
+
branch: string;
|
|
29
|
+
remoteStatus: 'ahead' | 'behind' | 'diverged' | 'synced' | 'unknown';
|
|
30
|
+
aheadCount?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ConversationContext {
|
|
33
|
+
previousPrompts: string[];
|
|
34
|
+
previousIntents: IntentAnalysis[];
|
|
35
|
+
resumeBlockContent?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ProjectContext {
|
|
38
|
+
recentlyModifiedFiles: string[];
|
|
39
|
+
hasFailedBuild: boolean;
|
|
40
|
+
lastError?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ClassificationContext {
|
|
43
|
+
git: GitContext;
|
|
44
|
+
conversation: ConversationContext;
|
|
45
|
+
project?: ProjectContext;
|
|
46
|
+
meta: {
|
|
47
|
+
gatherTimeMs: number;
|
|
48
|
+
fieldsGathered: string[];
|
|
49
|
+
errors: string[];
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface ContextGathererOptions {
|
|
53
|
+
includeProject?: boolean;
|
|
54
|
+
maxHistoryDepth?: number;
|
|
55
|
+
projectPath?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare class ContextGatherer {
|
|
58
|
+
private storage;
|
|
59
|
+
private projectPath;
|
|
60
|
+
constructor(storage: SQLiteStorage, projectPath: string);
|
|
61
|
+
/**
|
|
62
|
+
* 并行收集所有上下文字段。
|
|
63
|
+
*
|
|
64
|
+
* 流程:
|
|
65
|
+
* 1. 用 Promise.allSettled 拉起 git / 对话历史 / resume / project(可选)
|
|
66
|
+
* 2. 每个 settled 结果转换为 (value, error) 对,error 进入 meta.errors
|
|
67
|
+
* 3. 所有字段都有 fallback 默认值,保证返回结构完整可用
|
|
68
|
+
*/
|
|
69
|
+
gather(sessionId: string, options?: ContextGathererOptions): Promise<ClassificationContext>;
|
|
70
|
+
/**
|
|
71
|
+
* 并行拉起所有 git 子查询;任一失败都不会拖垮其他。
|
|
72
|
+
*
|
|
73
|
+
* 非 git 目录会让 `git branch --show-current` 等命令以非 0 退出,整体
|
|
74
|
+
* 退化为 EMPTY_GIT_CONTEXT 的子集 — 没分支、没 commit,但不抛出。
|
|
75
|
+
*/
|
|
76
|
+
private gatherGit;
|
|
77
|
+
/**
|
|
78
|
+
* 三段式收集:
|
|
79
|
+
* A. routing_events 反查 prompt + intent_json(首选,命中即返回)
|
|
80
|
+
* B. routing_events 没有命中 → events 表回退查 user_prompt(仅 prompts)
|
|
81
|
+
* C. CLAUDE.md 的 forge:resume 内容(独立任务,不阻塞 A/B)
|
|
82
|
+
*/
|
|
83
|
+
private gatherConversation;
|
|
84
|
+
/**
|
|
85
|
+
* 读 CLAUDE.md 并提取 forge:resume 内容。
|
|
86
|
+
*
|
|
87
|
+
* 容错:
|
|
88
|
+
* - ENOENT / 权限错误 → 返回 undefined(不视为错误)
|
|
89
|
+
* - 文件存在但没 resume 块 → decodeForgeResumeInnerFromClaudeMd 返回 '',按 undefined 处理
|
|
90
|
+
*/
|
|
91
|
+
private readResumeBlock;
|
|
92
|
+
/**
|
|
93
|
+
* 项目状态收集 — 默认关闭,调用方按需开启。
|
|
94
|
+
*
|
|
95
|
+
* 当前启发:
|
|
96
|
+
* - recentlyModifiedFiles:HEAD~5..HEAD 的差异文件名
|
|
97
|
+
* - hasFailedBuild:dist/ 不存在或 mtime 早于 src/ 的某个时间窗口
|
|
98
|
+
*/
|
|
99
|
+
private gatherProject;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=context-gatherer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gatherer.d.ts","sourceRoot":"","sources":["../../src/intelligence/context-gatherer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,UAAU,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8ID,qBAAa,eAAe;IAExB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBADX,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM;IAG7B;;;;;;;OAOG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IA4EjC;;;;;OAKG;YACW,SAAS;IAuDvB;;;;;OAKG;YACW,kBAAkB;IAmEhC;;;;;;OAMG;YACW,eAAe;IAoB7B;;;;;;OAMG;YACW,aAAa;CAuC5B"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextGatherer — 在意图分类前并行收集多源上下文
|
|
3
|
+
*
|
|
4
|
+
* 设计目标:
|
|
5
|
+
* - 给 IntentClassifier 注入 git 状态、对话历史、项目状态等额外信号
|
|
6
|
+
* - 总耗时 < 200ms(所有字段并行收集)
|
|
7
|
+
* - 单点失败不污染主流程:每个字段独立 try/catch,错误进入 meta.errors
|
|
8
|
+
*
|
|
9
|
+
* 数据来源:
|
|
10
|
+
* - git: `child_process.execFile`(log / status / branch / rev-list),单命令 2s 超时
|
|
11
|
+
* - 对话历史: SQLite `routing_events`(首选)→ `events`(兜底,仅 prompts)
|
|
12
|
+
* - resume 块: 项目根 CLAUDE.md → `decodeForgeResumeInnerFromClaudeMd`
|
|
13
|
+
* - 项目状态(可选): `git diff` 最近修改文件 + `dist/` mtime 启发
|
|
14
|
+
*
|
|
15
|
+
* 调用约束:
|
|
16
|
+
* - 严格 TS,禁止扩散 any
|
|
17
|
+
* - 不反向依赖业务层(位于 intelligence 层,仅可依赖 core)
|
|
18
|
+
*/
|
|
19
|
+
import { execFile } from 'node:child_process';
|
|
20
|
+
import { promisify } from 'node:util';
|
|
21
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { decodeForgeResumeInnerFromClaudeMd } from '../core/utils/forge-resume-block.js';
|
|
24
|
+
import { logger } from '../core/utils/logger.js';
|
|
25
|
+
const execFileAsync = promisify(execFile);
|
|
26
|
+
// ── Defaults ──────────────────────────────────────────────────────────────
|
|
27
|
+
const DEFAULT_HISTORY_DEPTH = 5;
|
|
28
|
+
const GIT_COMMAND_TIMEOUT_MS = 2_000;
|
|
29
|
+
const GIT_LOG_COUNT = 10;
|
|
30
|
+
const EMPTY_GIT_CONTEXT = {
|
|
31
|
+
recentCommits: [],
|
|
32
|
+
uncommittedFiles: [],
|
|
33
|
+
branch: '',
|
|
34
|
+
remoteStatus: 'unknown',
|
|
35
|
+
};
|
|
36
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* 错误归一化:把 unknown 异常压成单行字符串,避免日志溢出。
|
|
39
|
+
*/
|
|
40
|
+
function describeError(err) {
|
|
41
|
+
if (err instanceof Error)
|
|
42
|
+
return err.message;
|
|
43
|
+
if (typeof err === 'string')
|
|
44
|
+
return err;
|
|
45
|
+
try {
|
|
46
|
+
return JSON.stringify(err);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return String(err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 跑 git 子命令,2s 超时;失败时把错误信息抛给调用方,由上层决定降级策略。
|
|
54
|
+
*
|
|
55
|
+
* 用 execFile 而非 execSync:
|
|
56
|
+
* - 不阻塞 event loop,可以参与 Promise.all
|
|
57
|
+
* - 参数数组形式天然抗 shell 注入
|
|
58
|
+
*/
|
|
59
|
+
async function runGit(args, cwd, timeoutMs = GIT_COMMAND_TIMEOUT_MS) {
|
|
60
|
+
const { stdout } = await execFileAsync('git', args, {
|
|
61
|
+
cwd,
|
|
62
|
+
timeout: timeoutMs,
|
|
63
|
+
maxBuffer: 1024 * 1024, // 1MB 防御异常输出(仓库异常时 git status 可能爆量)
|
|
64
|
+
encoding: 'utf-8',
|
|
65
|
+
});
|
|
66
|
+
return stdout;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 解析 `git log --format="%h|%s|%ct"` 单行输出。
|
|
70
|
+
* 注意:commit message 内本身可能含 `|`,所以只 split 前两个分隔符。
|
|
71
|
+
*/
|
|
72
|
+
function parseLogLine(line) {
|
|
73
|
+
if (!line.trim())
|
|
74
|
+
return null;
|
|
75
|
+
const firstPipe = line.indexOf('|');
|
|
76
|
+
const lastPipe = line.lastIndexOf('|');
|
|
77
|
+
if (firstPipe < 0 || lastPipe <= firstPipe)
|
|
78
|
+
return null;
|
|
79
|
+
const hash = line.slice(0, firstPipe);
|
|
80
|
+
const message = line.slice(firstPipe + 1, lastPipe);
|
|
81
|
+
const tsSec = Number(line.slice(lastPipe + 1));
|
|
82
|
+
if (!Number.isFinite(tsSec))
|
|
83
|
+
return null;
|
|
84
|
+
return { hash, message, timestamp: tsSec * 1000 };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 解析 `git status --porcelain` 输出为受影响文件路径数组。
|
|
88
|
+
*
|
|
89
|
+
* porcelain v1 格式:`XY <path>` 或 `XY <orig> -> <new>`(rename)。
|
|
90
|
+
* 此处对 rename 也只保留新路径(更符合"最近被改的文件"语义)。
|
|
91
|
+
*/
|
|
92
|
+
function parseStatusFiles(stdout) {
|
|
93
|
+
const files = [];
|
|
94
|
+
for (const raw of stdout.split('\n')) {
|
|
95
|
+
if (!raw)
|
|
96
|
+
continue;
|
|
97
|
+
// 去掉前 3 个字符的 XY+空格,保留剩余路径
|
|
98
|
+
const rest = raw.slice(3).trim();
|
|
99
|
+
if (!rest)
|
|
100
|
+
continue;
|
|
101
|
+
const arrowIdx = rest.indexOf(' -> ');
|
|
102
|
+
files.push(arrowIdx >= 0 ? rest.slice(arrowIdx + 4) : rest);
|
|
103
|
+
}
|
|
104
|
+
return files;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 解析 `git rev-list --left-right --count origin/<branch>...HEAD` 输出。
|
|
108
|
+
*
|
|
109
|
+
* 输出形如 "<behind>\t<ahead>",左侧是远程领先、右侧是本地领先。
|
|
110
|
+
*/
|
|
111
|
+
function parseAheadBehind(stdout) {
|
|
112
|
+
const parts = stdout.trim().split(/\s+/);
|
|
113
|
+
if (parts.length < 2)
|
|
114
|
+
return null;
|
|
115
|
+
const behind = Number(parts[0]);
|
|
116
|
+
const ahead = Number(parts[1]);
|
|
117
|
+
if (!Number.isFinite(behind) || !Number.isFinite(ahead))
|
|
118
|
+
return null;
|
|
119
|
+
return { behind, ahead };
|
|
120
|
+
}
|
|
121
|
+
function classifyRemoteStatus(ahead, behind) {
|
|
122
|
+
if (ahead > 0 && behind > 0)
|
|
123
|
+
return 'diverged';
|
|
124
|
+
if (ahead > 0)
|
|
125
|
+
return 'ahead';
|
|
126
|
+
if (behind > 0)
|
|
127
|
+
return 'behind';
|
|
128
|
+
return 'synced';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 安全反序列化 intent_json:失败时返回 null,由上层过滤。
|
|
132
|
+
*
|
|
133
|
+
* 不做完整 schema 校验(routing_events 写入由 classifier 控制),只确保
|
|
134
|
+
* 顶层是对象且关键字段类型大致正确。
|
|
135
|
+
*/
|
|
136
|
+
function safeParseIntent(json) {
|
|
137
|
+
if (!json)
|
|
138
|
+
return null;
|
|
139
|
+
try {
|
|
140
|
+
const parsed = JSON.parse(json);
|
|
141
|
+
if (!parsed || typeof parsed !== 'object')
|
|
142
|
+
return null;
|
|
143
|
+
const obj = parsed;
|
|
144
|
+
// 至少有 taskType / complexity / requirement / searchKeywords / reasoning 任一即可视作有效
|
|
145
|
+
if (typeof obj.taskType === 'string' ||
|
|
146
|
+
typeof obj.complexity === 'string' ||
|
|
147
|
+
typeof obj.requirement === 'string') {
|
|
148
|
+
return parsed;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ── Main class ────────────────────────────────────────────────────────────
|
|
157
|
+
export class ContextGatherer {
|
|
158
|
+
storage;
|
|
159
|
+
projectPath;
|
|
160
|
+
constructor(storage, projectPath) {
|
|
161
|
+
this.storage = storage;
|
|
162
|
+
this.projectPath = projectPath;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 并行收集所有上下文字段。
|
|
166
|
+
*
|
|
167
|
+
* 流程:
|
|
168
|
+
* 1. 用 Promise.allSettled 拉起 git / 对话历史 / resume / project(可选)
|
|
169
|
+
* 2. 每个 settled 结果转换为 (value, error) 对,error 进入 meta.errors
|
|
170
|
+
* 3. 所有字段都有 fallback 默认值,保证返回结构完整可用
|
|
171
|
+
*/
|
|
172
|
+
async gather(sessionId, options) {
|
|
173
|
+
const start = Date.now();
|
|
174
|
+
const cwd = options?.projectPath ?? this.projectPath;
|
|
175
|
+
const depth = options?.maxHistoryDepth ?? DEFAULT_HISTORY_DEPTH;
|
|
176
|
+
const includeProject = options?.includeProject === true;
|
|
177
|
+
const fieldsGathered = [];
|
|
178
|
+
const errors = [];
|
|
179
|
+
// 各个收集任务彼此独立,用 allSettled 防止一个 reject 短路其他
|
|
180
|
+
const gitTask = this.gatherGit(cwd);
|
|
181
|
+
const conversationTask = this.gatherConversation(sessionId, cwd, depth);
|
|
182
|
+
const projectTask = includeProject
|
|
183
|
+
? this.gatherProject(cwd)
|
|
184
|
+
: Promise.resolve(undefined);
|
|
185
|
+
const [gitResult, conversationResult, projectResult] = await Promise.allSettled([
|
|
186
|
+
gitTask,
|
|
187
|
+
conversationTask,
|
|
188
|
+
projectTask,
|
|
189
|
+
]);
|
|
190
|
+
// git
|
|
191
|
+
let git = EMPTY_GIT_CONTEXT;
|
|
192
|
+
if (gitResult.status === 'fulfilled') {
|
|
193
|
+
git = gitResult.value;
|
|
194
|
+
fieldsGathered.push('git');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
errors.push(`git: ${describeError(gitResult.reason)}`);
|
|
198
|
+
}
|
|
199
|
+
// conversation
|
|
200
|
+
let conversation = {
|
|
201
|
+
previousPrompts: [],
|
|
202
|
+
previousIntents: [],
|
|
203
|
+
};
|
|
204
|
+
if (conversationResult.status === 'fulfilled') {
|
|
205
|
+
conversation = conversationResult.value;
|
|
206
|
+
fieldsGathered.push('conversation');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
errors.push(`conversation: ${describeError(conversationResult.reason)}`);
|
|
210
|
+
}
|
|
211
|
+
// project(可选)
|
|
212
|
+
let project;
|
|
213
|
+
if (includeProject) {
|
|
214
|
+
if (projectResult.status === 'fulfilled' && projectResult.value) {
|
|
215
|
+
project = projectResult.value;
|
|
216
|
+
fieldsGathered.push('project');
|
|
217
|
+
}
|
|
218
|
+
else if (projectResult.status === 'rejected') {
|
|
219
|
+
errors.push(`project: ${describeError(projectResult.reason)}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const elapsed = Date.now() - start;
|
|
223
|
+
if (errors.length > 0) {
|
|
224
|
+
logger.debug(`[ContextGatherer] gather completed in ${elapsed}ms with ${errors.length} non-fatal error(s)`);
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
git,
|
|
228
|
+
conversation,
|
|
229
|
+
project,
|
|
230
|
+
meta: {
|
|
231
|
+
gatherTimeMs: elapsed,
|
|
232
|
+
fieldsGathered,
|
|
233
|
+
errors,
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// ── Git ─────────────────────────────────────────────────────────────────
|
|
238
|
+
/**
|
|
239
|
+
* 并行拉起所有 git 子查询;任一失败都不会拖垮其他。
|
|
240
|
+
*
|
|
241
|
+
* 非 git 目录会让 `git branch --show-current` 等命令以非 0 退出,整体
|
|
242
|
+
* 退化为 EMPTY_GIT_CONTEXT 的子集 — 没分支、没 commit,但不抛出。
|
|
243
|
+
*/
|
|
244
|
+
async gatherGit(cwd) {
|
|
245
|
+
const [logResult, statusResult, branchResult] = await Promise.allSettled([
|
|
246
|
+
runGit(['log', `-${GIT_LOG_COUNT}`, '--format=%h|%s|%ct'], cwd),
|
|
247
|
+
runGit(['status', '--porcelain'], cwd),
|
|
248
|
+
runGit(['branch', '--show-current'], cwd),
|
|
249
|
+
]);
|
|
250
|
+
const recentCommits = [];
|
|
251
|
+
if (logResult.status === 'fulfilled') {
|
|
252
|
+
for (const line of logResult.value.split('\n')) {
|
|
253
|
+
const parsed = parseLogLine(line);
|
|
254
|
+
if (parsed)
|
|
255
|
+
recentCommits.push(parsed);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const uncommittedFiles = statusResult.status === 'fulfilled' ? parseStatusFiles(statusResult.value) : [];
|
|
259
|
+
const branch = branchResult.status === 'fulfilled' ? branchResult.value.trim() : '';
|
|
260
|
+
// ahead/behind 依赖 branch 名(origin/<branch>),若没分支就跳过
|
|
261
|
+
let remoteStatus = 'unknown';
|
|
262
|
+
let aheadCount;
|
|
263
|
+
if (branch) {
|
|
264
|
+
try {
|
|
265
|
+
const stdout = await runGit(['rev-list', '--left-right', '--count', `origin/${branch}...HEAD`], cwd);
|
|
266
|
+
const counts = parseAheadBehind(stdout);
|
|
267
|
+
if (counts) {
|
|
268
|
+
remoteStatus = classifyRemoteStatus(counts.ahead, counts.behind);
|
|
269
|
+
aheadCount = counts.ahead;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// 没有 origin/<branch>(如新建本地分支、离线仓库)— 保持 unknown
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const ctx = {
|
|
277
|
+
recentCommits,
|
|
278
|
+
uncommittedFiles,
|
|
279
|
+
branch,
|
|
280
|
+
remoteStatus,
|
|
281
|
+
};
|
|
282
|
+
if (aheadCount !== undefined) {
|
|
283
|
+
ctx.aheadCount = aheadCount;
|
|
284
|
+
}
|
|
285
|
+
return ctx;
|
|
286
|
+
}
|
|
287
|
+
// ── Conversation ────────────────────────────────────────────────────────
|
|
288
|
+
/**
|
|
289
|
+
* 三段式收集:
|
|
290
|
+
* A. routing_events 反查 prompt + intent_json(首选,命中即返回)
|
|
291
|
+
* B. routing_events 没有命中 → events 表回退查 user_prompt(仅 prompts)
|
|
292
|
+
* C. CLAUDE.md 的 forge:resume 内容(独立任务,不阻塞 A/B)
|
|
293
|
+
*/
|
|
294
|
+
async gatherConversation(sessionId, cwd, depth) {
|
|
295
|
+
const historyPromise = (async () => {
|
|
296
|
+
// A: 优先 routing_events
|
|
297
|
+
const routingRows = this.storage.queryRoutingEvents({
|
|
298
|
+
session_id: sessionId,
|
|
299
|
+
limit: depth,
|
|
300
|
+
});
|
|
301
|
+
if (routingRows.length > 0) {
|
|
302
|
+
const prompts = [];
|
|
303
|
+
const intents = [];
|
|
304
|
+
for (const r of routingRows) {
|
|
305
|
+
if (typeof r.prompt === 'string' && r.prompt.length > 0) {
|
|
306
|
+
prompts.push(r.prompt);
|
|
307
|
+
}
|
|
308
|
+
const intent = safeParseIntent(r.intent_json);
|
|
309
|
+
if (intent)
|
|
310
|
+
intents.push(intent);
|
|
311
|
+
}
|
|
312
|
+
return { previousPrompts: prompts, previousIntents: intents };
|
|
313
|
+
}
|
|
314
|
+
// B: 回退到 events 表
|
|
315
|
+
const events = this.storage.queryEvents({
|
|
316
|
+
session_id: sessionId,
|
|
317
|
+
hook_type: 'UserPromptSubmit',
|
|
318
|
+
limit: depth,
|
|
319
|
+
});
|
|
320
|
+
const prompts = [];
|
|
321
|
+
for (const e of events) {
|
|
322
|
+
if (typeof e.user_prompt === 'string' && e.user_prompt.length > 0) {
|
|
323
|
+
prompts.push(e.user_prompt);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return { previousPrompts: prompts, previousIntents: [] };
|
|
327
|
+
})();
|
|
328
|
+
const resumePromise = this.readResumeBlock(cwd);
|
|
329
|
+
const [historyResult, resumeResult] = await Promise.allSettled([
|
|
330
|
+
historyPromise,
|
|
331
|
+
resumePromise,
|
|
332
|
+
]);
|
|
333
|
+
const result = {
|
|
334
|
+
previousPrompts: [],
|
|
335
|
+
previousIntents: [],
|
|
336
|
+
};
|
|
337
|
+
if (historyResult.status === 'fulfilled') {
|
|
338
|
+
result.previousPrompts = historyResult.value.previousPrompts;
|
|
339
|
+
result.previousIntents = historyResult.value.previousIntents;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
throw historyResult.reason;
|
|
343
|
+
}
|
|
344
|
+
if (resumeResult.status === 'fulfilled' && resumeResult.value) {
|
|
345
|
+
result.resumeBlockContent = resumeResult.value;
|
|
346
|
+
}
|
|
347
|
+
// resume 单点失败静默:CLAUDE.md 不存在是常态,不污染 errors
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 读 CLAUDE.md 并提取 forge:resume 内容。
|
|
352
|
+
*
|
|
353
|
+
* 容错:
|
|
354
|
+
* - ENOENT / 权限错误 → 返回 undefined(不视为错误)
|
|
355
|
+
* - 文件存在但没 resume 块 → decodeForgeResumeInnerFromClaudeMd 返回 '',按 undefined 处理
|
|
356
|
+
*/
|
|
357
|
+
async readResumeBlock(cwd) {
|
|
358
|
+
const claudeMdPath = join(cwd, 'CLAUDE.md');
|
|
359
|
+
try {
|
|
360
|
+
const content = await readFile(claudeMdPath, 'utf-8');
|
|
361
|
+
const inner = decodeForgeResumeInnerFromClaudeMd(content);
|
|
362
|
+
return inner ? inner : undefined;
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
// 文件不存在是正常情况,不打 warn
|
|
366
|
+
const code = err?.code;
|
|
367
|
+
if (code !== 'ENOENT') {
|
|
368
|
+
logger.debug(`[ContextGatherer] readResumeBlock failed: ${describeError(err)}`);
|
|
369
|
+
}
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// ── Project(可选)─────────────────────────────────────────────────────
|
|
374
|
+
/**
|
|
375
|
+
* 项目状态收集 — 默认关闭,调用方按需开启。
|
|
376
|
+
*
|
|
377
|
+
* 当前启发:
|
|
378
|
+
* - recentlyModifiedFiles:HEAD~5..HEAD 的差异文件名
|
|
379
|
+
* - hasFailedBuild:dist/ 不存在或 mtime 早于 src/ 的某个时间窗口
|
|
380
|
+
*/
|
|
381
|
+
async gatherProject(cwd) {
|
|
382
|
+
const filesPromise = (async () => {
|
|
383
|
+
try {
|
|
384
|
+
const stdout = await runGit(['diff', '--name-only', 'HEAD~5..HEAD'], cwd);
|
|
385
|
+
return stdout
|
|
386
|
+
.split('\n')
|
|
387
|
+
.map((s) => s.trim())
|
|
388
|
+
.filter((s) => s.length > 0);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
return [];
|
|
392
|
+
}
|
|
393
|
+
})();
|
|
394
|
+
const buildPromise = (async () => {
|
|
395
|
+
const distPath = join(cwd, 'dist');
|
|
396
|
+
try {
|
|
397
|
+
const distStat = await stat(distPath);
|
|
398
|
+
// dist 存在但太老(>7 天)视作失败/过期;这里只判断"不存在"作为最稳妥信号
|
|
399
|
+
const ageDays = (Date.now() - distStat.mtimeMs) / (1000 * 60 * 60 * 24);
|
|
400
|
+
return ageDays > 7;
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// 不存在 → 视作 hasFailedBuild = true(项目可能未构建过)
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
})();
|
|
407
|
+
const [recentlyModifiedFiles, hasFailedBuild] = await Promise.all([
|
|
408
|
+
filesPromise,
|
|
409
|
+
buildPromise,
|
|
410
|
+
]);
|
|
411
|
+
return {
|
|
412
|
+
recentlyModifiedFiles,
|
|
413
|
+
hasFailedBuild,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=context-gatherer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gatherer.js","sourceRoot":"","sources":["../../src/intelligence/context-gatherer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoTClassifier — Chain-of-Thought intent classifier (v2)
|
|
3
|
+
*
|
|
4
|
+
* Replaces a single-shot classification with a 5-step reasoning prompt.
|
|
5
|
+
* Returns a richer intent graph (action / target / candidates) while staying
|
|
6
|
+
* backward compatible with v1's `IntentAnalysis` shape (taskType / complexity).
|
|
7
|
+
*
|
|
8
|
+
* Pipeline:
|
|
9
|
+
* 1. Build the CoT prompt (scene / contradictions / candidates / chain / final)
|
|
10
|
+
* 2. Call AI provider with hard timeout (Promise.race)
|
|
11
|
+
* 3. Extract JSON (strip markdown fences) and strictly validate enums
|
|
12
|
+
* 4. If finalConfidence < threshold, mark needsClarification + generate question
|
|
13
|
+
* 5. On parse / validation failure, return a fallback result (fallbackUsed=true)
|
|
14
|
+
*
|
|
15
|
+
* The classifier deliberately does NOT keep an LRU cache here: v2 results
|
|
16
|
+
* depend on `ClassificationContext` (git / conversation / project), which is
|
|
17
|
+
* mutable across calls. Caching is the caller's responsibility.
|
|
18
|
+
*/
|
|
19
|
+
import type { AIProvider } from '../core/ai/types.js';
|
|
20
|
+
import type { Complexity, TaskType } from './intent-types.js';
|
|
21
|
+
import type { ClassificationContext } from './context-gatherer.js';
|
|
22
|
+
import type { MultimodalInput } from './multimodal-parser.js';
|
|
23
|
+
export type { ClassificationContext, MultimodalInput };
|
|
24
|
+
export type ActionVerb = 'investigate' | 'fix' | 'create' | 'modify' | 'delete' | 'verify' | 'explain' | 'setup' | 'migrate' | 'research';
|
|
25
|
+
export declare const ACTION_VERBS: readonly ActionVerb[];
|
|
26
|
+
export type Domain = 'frontend' | 'backend' | 'database' | 'devops' | 'docs' | 'config' | 'cross';
|
|
27
|
+
export declare const DOMAINS: readonly Domain[];
|
|
28
|
+
export type Artifact = 'code' | 'test' | 'config' | 'doc' | 'build' | 'deploy' | 'schema';
|
|
29
|
+
export declare const ARTIFACTS: readonly Artifact[];
|
|
30
|
+
export type Scope = 'line' | 'function' | 'file' | 'module' | 'system';
|
|
31
|
+
export declare const SCOPES: readonly Scope[];
|
|
32
|
+
export interface IntentTarget {
|
|
33
|
+
domain: Domain;
|
|
34
|
+
artifact: Artifact;
|
|
35
|
+
scope: Scope;
|
|
36
|
+
}
|
|
37
|
+
export interface ReasoningStep {
|
|
38
|
+
step: number;
|
|
39
|
+
name: string;
|
|
40
|
+
content: string;
|
|
41
|
+
confidence?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface IntentCandidate {
|
|
44
|
+
action: ActionVerb;
|
|
45
|
+
taskType: TaskType;
|
|
46
|
+
confidence: number;
|
|
47
|
+
reasoning: string;
|
|
48
|
+
}
|
|
49
|
+
export interface CoTResult {
|
|
50
|
+
requirement: string;
|
|
51
|
+
complexity: Complexity;
|
|
52
|
+
taskType: TaskType;
|
|
53
|
+
searchKeywords: string[];
|
|
54
|
+
reasoning: string;
|
|
55
|
+
fallbackUsed?: boolean;
|
|
56
|
+
classificationMs?: number;
|
|
57
|
+
isMetaPrompt?: boolean;
|
|
58
|
+
action: ActionVerb;
|
|
59
|
+
target: IntentTarget;
|
|
60
|
+
candidates: IntentCandidate[];
|
|
61
|
+
finalConfidence: number;
|
|
62
|
+
reasoningSteps: ReasoningStep[];
|
|
63
|
+
needsClarification?: boolean;
|
|
64
|
+
clarificationQuestion?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface CoTClassifierOptions {
|
|
67
|
+
/** Override model used for classification. */
|
|
68
|
+
model?: string;
|
|
69
|
+
/** Hard timeout in ms (default 15_000). */
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
/** finalConfidence below this triggers clarification (default 0.7). */
|
|
72
|
+
clarificationThreshold?: number;
|
|
73
|
+
}
|
|
74
|
+
export declare class CoTClassifier {
|
|
75
|
+
private ai;
|
|
76
|
+
private readonly model?;
|
|
77
|
+
private readonly timeoutMs;
|
|
78
|
+
private readonly clarificationThreshold;
|
|
79
|
+
constructor(ai: AIProvider, options?: CoTClassifierOptions);
|
|
80
|
+
classify(input: MultimodalInput, context: ClassificationContext): Promise<CoTResult>;
|
|
81
|
+
private completeWithTimeout;
|
|
82
|
+
private buildFallback;
|
|
83
|
+
}
|
|
84
|
+
export declare function buildCoTPrompt(input: MultimodalInput, context: ClassificationContext): string;
|
|
85
|
+
/**
|
|
86
|
+
* Extract a JSON object from the AI response. Tolerates:
|
|
87
|
+
* - ```json ... ``` fenced blocks
|
|
88
|
+
* - ``` ... ``` fenced blocks (no language)
|
|
89
|
+
* - bare JSON
|
|
90
|
+
*
|
|
91
|
+
* Returns the validated CoTResult, or null on any validation failure.
|
|
92
|
+
* Exported for unit tests.
|
|
93
|
+
*/
|
|
94
|
+
export declare function parseCoTResponse(response: string, input: MultimodalInput): CoTResult | null;
|
|
95
|
+
//# sourceMappingURL=cot-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cot-classifier.d.ts","sourceRoot":"","sources":["../../src/intelligence/cot-classifier.ts"],"names":[],"mappings":"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"}
|