@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,391 @@
|
|
|
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 { TASK_TYPES } from './intent-types.js';
|
|
20
|
+
import { logger } from '../core/utils/logger.js';
|
|
21
|
+
export const ACTION_VERBS = [
|
|
22
|
+
'investigate', 'fix', 'create', 'modify', 'delete',
|
|
23
|
+
'verify', 'explain', 'setup', 'migrate', 'research',
|
|
24
|
+
];
|
|
25
|
+
export const DOMAINS = [
|
|
26
|
+
'frontend', 'backend', 'database', 'devops', 'docs', 'config', 'cross',
|
|
27
|
+
];
|
|
28
|
+
export const ARTIFACTS = [
|
|
29
|
+
'code', 'test', 'config', 'doc', 'build', 'deploy', 'schema',
|
|
30
|
+
];
|
|
31
|
+
export const SCOPES = [
|
|
32
|
+
'line', 'function', 'file', 'module', 'system',
|
|
33
|
+
];
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Constants
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
38
|
+
const DEFAULT_CLARIFICATION_THRESHOLD = 0.7;
|
|
39
|
+
const MAX_CONTEXT_COMMITS = 5;
|
|
40
|
+
const MAX_CONTEXT_PROMPTS = 3;
|
|
41
|
+
const MAX_CONTEXT_FILES = 8;
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Implementation
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
export class CoTClassifier {
|
|
46
|
+
ai;
|
|
47
|
+
model;
|
|
48
|
+
timeoutMs;
|
|
49
|
+
clarificationThreshold;
|
|
50
|
+
constructor(ai, options) {
|
|
51
|
+
this.ai = ai;
|
|
52
|
+
this.model = options?.model;
|
|
53
|
+
this.timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
54
|
+
this.clarificationThreshold =
|
|
55
|
+
options?.clarificationThreshold ?? DEFAULT_CLARIFICATION_THRESHOLD;
|
|
56
|
+
}
|
|
57
|
+
async classify(input, context) {
|
|
58
|
+
const start = Date.now();
|
|
59
|
+
const aiPrompt = buildCoTPrompt(input, context);
|
|
60
|
+
let response;
|
|
61
|
+
try {
|
|
62
|
+
response = await this.completeWithTimeout(aiPrompt);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
// Timeout / API error — surface to caller (per spec). The caller decides
|
|
66
|
+
// whether to fall back to v1 classifier or to a regex pipeline.
|
|
67
|
+
logger.warn(`[CoTClassifier] AI call failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
68
|
+
throw err instanceof Error ? err : new Error(String(err));
|
|
69
|
+
}
|
|
70
|
+
const elapsed = Date.now() - start;
|
|
71
|
+
const parsed = parseCoTResponse(response, input);
|
|
72
|
+
if (!parsed) {
|
|
73
|
+
// Soft fallback: schema-invalid AI output is recoverable, so we return
|
|
74
|
+
// a degraded result rather than throwing. Hard timeouts still throw.
|
|
75
|
+
logger.warn('[CoTClassifier] Failed to parse AI response — returning fallback');
|
|
76
|
+
return this.buildFallback(input, elapsed);
|
|
77
|
+
}
|
|
78
|
+
const result = parsed;
|
|
79
|
+
result.classificationMs = elapsed;
|
|
80
|
+
if (result.finalConfidence < this.clarificationThreshold) {
|
|
81
|
+
result.needsClarification = true;
|
|
82
|
+
result.clarificationQuestion = buildClarificationQuestion(result.candidates);
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
async completeWithTimeout(prompt) {
|
|
87
|
+
let timer;
|
|
88
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
89
|
+
timer = setTimeout(() => reject(new Error(`CoT classification timeout ${this.timeoutMs}ms`)), this.timeoutMs);
|
|
90
|
+
});
|
|
91
|
+
// Attach a no-op catch so the timeout promise always has at least one
|
|
92
|
+
// handler. Without this, when the AI wins the race and the timer is
|
|
93
|
+
// cleared, any leftover micro-task could surface as an "unhandled
|
|
94
|
+
// rejection" depending on timer/microtask interleaving.
|
|
95
|
+
timeoutPromise.catch(() => { });
|
|
96
|
+
try {
|
|
97
|
+
return await Promise.race([
|
|
98
|
+
this.ai.complete(prompt, this.model ? { model: this.model } : undefined),
|
|
99
|
+
timeoutPromise,
|
|
100
|
+
]);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
// Always clear the timer so the timeout cannot fire after the AI
|
|
104
|
+
// response has won the race.
|
|
105
|
+
if (timer !== undefined)
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
buildFallback(input, elapsedMs) {
|
|
110
|
+
const text = input.textWithoutMarkers || input.originalText;
|
|
111
|
+
return {
|
|
112
|
+
requirement: text,
|
|
113
|
+
complexity: 'moderate',
|
|
114
|
+
taskType: 'other',
|
|
115
|
+
searchKeywords: [],
|
|
116
|
+
reasoning: 'Fallback: AI response could not be parsed',
|
|
117
|
+
fallbackUsed: true,
|
|
118
|
+
classificationMs: elapsedMs,
|
|
119
|
+
action: 'investigate',
|
|
120
|
+
target: { domain: 'cross', artifact: 'code', scope: 'module' },
|
|
121
|
+
candidates: [
|
|
122
|
+
{
|
|
123
|
+
action: 'investigate',
|
|
124
|
+
taskType: 'other',
|
|
125
|
+
confidence: 0.3,
|
|
126
|
+
reasoning: 'fallback default',
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
finalConfidence: 0.3,
|
|
130
|
+
reasoningSteps: [
|
|
131
|
+
{ step: 1, name: 'fallback', content: 'AI response was not valid JSON' },
|
|
132
|
+
],
|
|
133
|
+
needsClarification: true,
|
|
134
|
+
clarificationQuestion: '我没能完全理解你的意图,能再描述一下你的目标吗?(例如:是想查清原因、修复问题,还是新增功能?)',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Prompt construction
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
export function buildCoTPrompt(input, context) {
|
|
142
|
+
const parts = [];
|
|
143
|
+
parts.push('You are an intent classifier that uses Chain-of-Thought reasoning.', 'Goal: produce a structured intent graph by reasoning through 5 explicit steps.', '', '=== ENUMS (use exactly these values) ===', `action: ${ACTION_VERBS.join(' | ')}`, ` - investigate: 调查、排查、分析(不改动代码,问"为什么 X 还在/还有/失败")`, ` - fix: 修复 bug、解决报错(已知有问题,要改代码)`, ` - create: 新建功能/文件/测试`, ` - modify: 修改现有代码(重构/优化)`, ` - delete: 删除(废弃功能/代码清理)`, ` - verify: 验证(测试/review)`, ` - explain: 解释、说明(纯知识问答,例 "为什么 React 用虚拟 DOM")`, ` - setup: 配置、初始化`, ` - migrate: 迁移`, ` - research: 调研、对比方案`, '', `domain: ${DOMAINS.join(' | ')}`, `artifact: ${ARTIFACTS.join(' | ')}`, `scope: ${SCOPES.join(' | ')}`, `complexity: simple | moderate | complex`, `taskType (legacy v1 enum, choose closest one):`, ` ${TASK_TYPES.join(', ')}`, '', '=== KEY DISTINCTIONS ===', '- "为什么打包后还有方法论?" → action=investigate (用户暗示:方法论应该被删了,但还在 → 排查原因)', '- "为什么 React 用虚拟 DOM?" → action=explain (纯知识问答,无矛盾)', '- "修一下登录的报错" → action=fix (已知问题,需要改代码)', '- "加一个导出 CSV 功能" → action=create (新增能力)', '', '=== FEW-SHOT EXAMPLES ===', 'Example 1 — investigate (隐含矛盾)', 'Input: "npm 打包后为什么还有方法论?"', 'Reasoning: 用户上次说要删除方法论 (git 显示 deprecate(methodology) 提交),', '现在却说"还有",存在矛盾 → 用户想排查为什么删除没生效。', 'Output JSON:', '```json', '{', ' "reasoningSteps": [', ' {"step":1,"name":"场景理解","content":"git 最近有 deprecate(methodology) 提交,用户在做废弃工作"},', ' {"step":2,"name":"矛盾识别","content":"用户已声明删除,但 npm 包里还出现 → 删除未彻底"},', ' {"step":3,"name":"候选意图","content":"主: investigate (排查); 次: fix (修复打包流程)"},', ' {"step":4,"name":"推理链","content":"先查清原因再决定修复方式 → investigate 优先"},', ' {"step":5,"name":"最终决策","content":"action=investigate, taskType=investigate, confidence=0.85"}', ' ],', ' "action": "investigate",', ' "target": {"domain":"backend","artifact":"build","scope":"module"},', ' "candidates": [', ' {"action":"investigate","taskType":"investigate","confidence":0.85,"reasoning":"用户问\\"为什么\\" + 隐含矛盾"},', ' {"action":"fix","taskType":"fix_bug","confidence":0.45,"reasoning":"如果排查后发现是 bug 则需修复"}', ' ],', ' "finalConfidence": 0.85,', ' "complexity": "moderate",', ' "taskType": "investigate",', ' "searchKeywords": ["npm","打包","方法论","构建"],', ' "reasoning": "用户问\\"为什么\\"且暗示矛盾 → 排查类意图"', '}', '```', '', 'Example 2 — explain (纯知识)', 'Input: "为什么 React 用虚拟 DOM?"', 'Output JSON:', '```json', '{', ' "reasoningSteps": [', ' {"step":1,"name":"场景理解","content":"用户在请教技术原理,无项目矛盾"},', ' {"step":2,"name":"矛盾识别","content":"无矛盾,纯知识问答"},', ' {"step":3,"name":"候选意图","content":"主: explain; 次: research"},', ' {"step":4,"name":"推理链","content":"问\\"为什么\\"+技术名词,期望解释而非排查"},', ' {"step":5,"name":"最终决策","content":"action=explain, confidence=0.92"}', ' ],', ' "action": "explain",', ' "target": {"domain":"frontend","artifact":"doc","scope":"module"},', ' "candidates": [', ' {"action":"explain","taskType":"explain","confidence":0.92,"reasoning":"纯知识问答,无矛盾"},', ' {"action":"research","taskType":"research","confidence":0.30,"reasoning":"如要对比方案则升级"}', ' ],', ' "finalConfidence": 0.92,', ' "complexity": "simple",', ' "taskType": "explain",', ' "searchKeywords": ["React","虚拟DOM","渲染"],', ' "reasoning": "技术原理问答,无项目侧矛盾"', '}', '```', '', 'Example 3 — create', 'Input: "加一个导出 CSV 的功能"', 'Output JSON:', '```json', '{', ' "reasoningSteps": [', ' {"step":1,"name":"场景理解","content":"用户希望新增功能"},', ' {"step":2,"name":"矛盾识别","content":"无矛盾"},', ' {"step":3,"name":"候选意图","content":"主: create; 次: modify"},', ' {"step":4,"name":"推理链","content":"\\"加一个\\"=新增 → create"},', ' {"step":5,"name":"最终决策","content":"action=create, taskType=add_feature, confidence=0.88"}', ' ],', ' "action": "create",', ' "target": {"domain":"backend","artifact":"code","scope":"module"},', ' "candidates": [', ' {"action":"create","taskType":"add_feature","confidence":0.88,"reasoning":"\\"加一个\\"=新增"},', ' {"action":"modify","taskType":"add_feature","confidence":0.40,"reasoning":"如果导出已有,则是修改"}', ' ],', ' "finalConfidence": 0.88,', ' "complexity": "moderate",', ' "taskType": "add_feature",', ' "searchKeywords": ["导出","CSV","功能"],', ' "reasoning": "明确新增意图"', '}', '```', '', '=== CONTEXT ===', formatContextBlock(input, context), '', '=== TASK ===', 'Now classify the following user input. Run the 5-step reasoning silently, ', 'then output ONE JSON object wrapped in a ```json code block. ', 'Each reasoning step must be explainable: include name + content (and optional confidence).', 'Confidence values must be in [0,1]. The JSON MUST contain ALL of:', 'reasoningSteps, action, target, candidates, finalConfidence, complexity, taskType, searchKeywords, reasoning.', '', `User input: ${JSON.stringify(input.textWithoutMarkers || input.originalText)}`);
|
|
144
|
+
return parts.join('\n');
|
|
145
|
+
}
|
|
146
|
+
function formatContextBlock(input, context) {
|
|
147
|
+
const lines = [];
|
|
148
|
+
// Git
|
|
149
|
+
const commits = (context.git.recentCommits ?? []).slice(0, MAX_CONTEXT_COMMITS);
|
|
150
|
+
if (commits.length > 0) {
|
|
151
|
+
lines.push('Git recent commits:');
|
|
152
|
+
for (const c of commits)
|
|
153
|
+
lines.push(` - ${c.hash.slice(0, 7)} ${c.message}`);
|
|
154
|
+
}
|
|
155
|
+
if (context.git.branch)
|
|
156
|
+
lines.push(`Git branch: ${context.git.branch}`);
|
|
157
|
+
const uncommitted = (context.git.uncommittedFiles ?? []).slice(0, MAX_CONTEXT_FILES);
|
|
158
|
+
if (uncommitted.length > 0) {
|
|
159
|
+
lines.push(`Uncommitted files (${context.git.uncommittedFiles.length}):`);
|
|
160
|
+
for (const f of uncommitted)
|
|
161
|
+
lines.push(` - ${f}`);
|
|
162
|
+
}
|
|
163
|
+
// Conversation
|
|
164
|
+
const prevPrompts = (context.conversation.previousPrompts ?? []).slice(-MAX_CONTEXT_PROMPTS);
|
|
165
|
+
if (prevPrompts.length > 0) {
|
|
166
|
+
lines.push('Previous prompts:');
|
|
167
|
+
for (const p of prevPrompts)
|
|
168
|
+
lines.push(` - ${truncate(p, 120)}`);
|
|
169
|
+
}
|
|
170
|
+
if (context.conversation.resumeBlockContent) {
|
|
171
|
+
lines.push(`Resume block: ${truncate(context.conversation.resumeBlockContent, 200)}`);
|
|
172
|
+
}
|
|
173
|
+
// Project
|
|
174
|
+
if (context.project) {
|
|
175
|
+
if (context.project.hasFailedBuild)
|
|
176
|
+
lines.push('Project has FAILED build');
|
|
177
|
+
if (context.project.lastError) {
|
|
178
|
+
lines.push(`Last error: ${truncate(context.project.lastError, 200)}`);
|
|
179
|
+
}
|
|
180
|
+
const modified = (context.project.recentlyModifiedFiles ?? []).slice(0, MAX_CONTEXT_FILES);
|
|
181
|
+
if (modified.length > 0) {
|
|
182
|
+
lines.push('Recently modified files:');
|
|
183
|
+
for (const f of modified)
|
|
184
|
+
lines.push(` - ${f}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Multimodal
|
|
188
|
+
if (input.images.length > 0) {
|
|
189
|
+
lines.push(`Images attached: ${input.images.length}`);
|
|
190
|
+
for (const img of input.images) {
|
|
191
|
+
const errs = img.errorMessages.slice(0, 3).join(' | ');
|
|
192
|
+
lines.push(` - ${img.screenshotType}: ${truncate(img.semanticDescription, 100)}` +
|
|
193
|
+
(errs ? ` | errors: ${errs}` : ''));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (input.codeBlocks.length > 0) {
|
|
197
|
+
lines.push(`Code blocks: ${input.codeBlocks.length}`);
|
|
198
|
+
}
|
|
199
|
+
return lines.length > 0 ? lines.join('\n') : '(no extra context)';
|
|
200
|
+
}
|
|
201
|
+
function truncate(s, max) {
|
|
202
|
+
if (s.length <= max)
|
|
203
|
+
return s;
|
|
204
|
+
return s.slice(0, max - 1) + '…';
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Response parsing & validation
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* Extract a JSON object from the AI response. Tolerates:
|
|
211
|
+
* - ```json ... ``` fenced blocks
|
|
212
|
+
* - ``` ... ``` fenced blocks (no language)
|
|
213
|
+
* - bare JSON
|
|
214
|
+
*
|
|
215
|
+
* Returns the validated CoTResult, or null on any validation failure.
|
|
216
|
+
* Exported for unit tests.
|
|
217
|
+
*/
|
|
218
|
+
export function parseCoTResponse(response, input) {
|
|
219
|
+
const jsonText = extractJsonText(response);
|
|
220
|
+
if (!jsonText)
|
|
221
|
+
return null;
|
|
222
|
+
let raw;
|
|
223
|
+
try {
|
|
224
|
+
raw = JSON.parse(jsonText);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
if (!isObject(raw))
|
|
230
|
+
return null;
|
|
231
|
+
const action = pickEnum(raw['action'], ACTION_VERBS);
|
|
232
|
+
if (!action)
|
|
233
|
+
return null;
|
|
234
|
+
const target = parseTarget(raw['target']);
|
|
235
|
+
if (!target)
|
|
236
|
+
return null;
|
|
237
|
+
const candidates = parseCandidates(raw['candidates']);
|
|
238
|
+
if (!candidates || candidates.length === 0)
|
|
239
|
+
return null;
|
|
240
|
+
const finalConfidence = clamp01(toNumber(raw['finalConfidence']));
|
|
241
|
+
if (finalConfidence === null)
|
|
242
|
+
return null;
|
|
243
|
+
const reasoningSteps = parseReasoningSteps(raw['reasoningSteps']);
|
|
244
|
+
if (!reasoningSteps)
|
|
245
|
+
return null;
|
|
246
|
+
const complexity = pickEnum(raw['complexity'], ['simple', 'moderate', 'complex']);
|
|
247
|
+
const taskType = pickEnum(raw['taskType'], TASK_TYPES);
|
|
248
|
+
const searchKeywords = Array.isArray(raw['searchKeywords'])
|
|
249
|
+
? raw['searchKeywords'].filter((k) => typeof k === 'string')
|
|
250
|
+
: [];
|
|
251
|
+
const reasoning = typeof raw['reasoning'] === 'string' ? raw['reasoning'] : 'CoT classification';
|
|
252
|
+
return {
|
|
253
|
+
requirement: input.textWithoutMarkers || input.originalText,
|
|
254
|
+
complexity: complexity ?? 'moderate',
|
|
255
|
+
taskType: taskType ?? 'other',
|
|
256
|
+
searchKeywords,
|
|
257
|
+
reasoning,
|
|
258
|
+
action,
|
|
259
|
+
target,
|
|
260
|
+
candidates,
|
|
261
|
+
finalConfidence,
|
|
262
|
+
reasoningSteps,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function extractJsonText(response) {
|
|
266
|
+
const trimmed = response.trim();
|
|
267
|
+
if (!trimmed)
|
|
268
|
+
return null;
|
|
269
|
+
// Prefer fenced ```json ... ``` block
|
|
270
|
+
const fenceMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
271
|
+
if (fenceMatch && fenceMatch[1]) {
|
|
272
|
+
const inner = fenceMatch[1].trim();
|
|
273
|
+
const objMatch = inner.match(/\{[\s\S]*\}/);
|
|
274
|
+
return objMatch ? objMatch[0] : null;
|
|
275
|
+
}
|
|
276
|
+
// Fallback: first {...} block in the raw text
|
|
277
|
+
const objMatch = trimmed.match(/\{[\s\S]*\}/);
|
|
278
|
+
return objMatch ? objMatch[0] : null;
|
|
279
|
+
}
|
|
280
|
+
function parseTarget(raw) {
|
|
281
|
+
if (!isObject(raw))
|
|
282
|
+
return null;
|
|
283
|
+
const domain = pickEnum(raw['domain'], DOMAINS);
|
|
284
|
+
const artifact = pickEnum(raw['artifact'], ARTIFACTS);
|
|
285
|
+
const scope = pickEnum(raw['scope'], SCOPES);
|
|
286
|
+
if (!domain || !artifact || !scope)
|
|
287
|
+
return null;
|
|
288
|
+
return { domain, artifact, scope };
|
|
289
|
+
}
|
|
290
|
+
function parseCandidates(raw) {
|
|
291
|
+
if (!Array.isArray(raw))
|
|
292
|
+
return null;
|
|
293
|
+
const out = [];
|
|
294
|
+
for (const c of raw) {
|
|
295
|
+
if (!isObject(c))
|
|
296
|
+
continue;
|
|
297
|
+
const action = pickEnum(c['action'], ACTION_VERBS);
|
|
298
|
+
const taskType = pickEnum(c['taskType'], TASK_TYPES);
|
|
299
|
+
const confidence = clamp01(toNumber(c['confidence']));
|
|
300
|
+
const reasoning = typeof c['reasoning'] === 'string' ? c['reasoning'] : '';
|
|
301
|
+
if (!action || !taskType || confidence === null)
|
|
302
|
+
continue;
|
|
303
|
+
out.push({ action, taskType, confidence, reasoning });
|
|
304
|
+
}
|
|
305
|
+
return out.length > 0 ? out : null;
|
|
306
|
+
}
|
|
307
|
+
function parseReasoningSteps(raw) {
|
|
308
|
+
if (!Array.isArray(raw))
|
|
309
|
+
return null;
|
|
310
|
+
const out = [];
|
|
311
|
+
for (const s of raw) {
|
|
312
|
+
if (!isObject(s))
|
|
313
|
+
continue;
|
|
314
|
+
const step = toNumber(s['step']);
|
|
315
|
+
const name = typeof s['name'] === 'string' ? s['name'] : null;
|
|
316
|
+
const content = typeof s['content'] === 'string' ? s['content'] : null;
|
|
317
|
+
if (step === null || !name || content === null)
|
|
318
|
+
continue;
|
|
319
|
+
const confidence = clamp01(toNumber(s['confidence']));
|
|
320
|
+
out.push({
|
|
321
|
+
step,
|
|
322
|
+
name,
|
|
323
|
+
content,
|
|
324
|
+
...(confidence !== null ? { confidence } : {}),
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return out.length > 0 ? out : null;
|
|
328
|
+
}
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
// Clarification question
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
function buildClarificationQuestion(candidates) {
|
|
333
|
+
const sorted = [...candidates].sort((a, b) => b.confidence - a.confidence);
|
|
334
|
+
const top = sorted[0];
|
|
335
|
+
const second = sorted[1];
|
|
336
|
+
if (!second) {
|
|
337
|
+
return `我对你的意图不太确定(候选: ${describeCandidate(top)}),能再补充一下目标吗?`;
|
|
338
|
+
}
|
|
339
|
+
return [
|
|
340
|
+
'我对你的意图把握不够(置信度较低),有两种可能:',
|
|
341
|
+
`1. ${describeCandidate(top)}`,
|
|
342
|
+
`2. ${describeCandidate(second)}`,
|
|
343
|
+
'请告诉我哪一个更接近你的目标,或者补充一下细节。',
|
|
344
|
+
].join('\n');
|
|
345
|
+
}
|
|
346
|
+
function describeCandidate(c) {
|
|
347
|
+
const conf = (c.confidence * 100).toFixed(0);
|
|
348
|
+
return `${ACTION_LABEL[c.action]}(${c.taskType},置信度 ${conf}%)${c.reasoning ? ' — ' + c.reasoning : ''}`;
|
|
349
|
+
}
|
|
350
|
+
const ACTION_LABEL = {
|
|
351
|
+
investigate: '排查/调查',
|
|
352
|
+
fix: '修复',
|
|
353
|
+
create: '新建',
|
|
354
|
+
modify: '修改',
|
|
355
|
+
delete: '删除',
|
|
356
|
+
verify: '验证',
|
|
357
|
+
explain: '解释',
|
|
358
|
+
setup: '配置',
|
|
359
|
+
migrate: '迁移',
|
|
360
|
+
research: '调研',
|
|
361
|
+
};
|
|
362
|
+
// ---------------------------------------------------------------------------
|
|
363
|
+
// Type-guard utilities
|
|
364
|
+
// ---------------------------------------------------------------------------
|
|
365
|
+
function isObject(v) {
|
|
366
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
367
|
+
}
|
|
368
|
+
function pickEnum(v, allowed) {
|
|
369
|
+
if (typeof v !== 'string')
|
|
370
|
+
return null;
|
|
371
|
+
return allowed.includes(v) ? v : null;
|
|
372
|
+
}
|
|
373
|
+
function toNumber(v) {
|
|
374
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
375
|
+
return v;
|
|
376
|
+
if (typeof v === 'string') {
|
|
377
|
+
const n = Number(v);
|
|
378
|
+
return Number.isFinite(n) ? n : null;
|
|
379
|
+
}
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
function clamp01(v) {
|
|
383
|
+
if (v === null)
|
|
384
|
+
return null;
|
|
385
|
+
if (v < 0)
|
|
386
|
+
return 0;
|
|
387
|
+
if (v > 1)
|
|
388
|
+
return 1;
|
|
389
|
+
return v;
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=cot-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cot-classifier.js","sourceRoot":"","sources":["../../src/intelligence/cot-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,14 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import type { SQLiteStorage } from '../core/storage/sqlite.js';
|
|
23
23
|
import type { AIProvider } from '../core/ai/types.js';
|
|
24
|
+
import type { TaskType, Complexity } from './intent-types.js';
|
|
25
|
+
import type { ActionVerb } from './cot-classifier.js';
|
|
26
|
+
/** TaskType → 中文标签(展示格式:`中文(英文)`) */
|
|
27
|
+
export declare const TASK_TYPE_CN: Record<TaskType, string>;
|
|
28
|
+
/** Complexity → 中文标签 */
|
|
29
|
+
export declare const COMPLEXITY_CN: Record<Complexity, string>;
|
|
30
|
+
/** ActionVerb → 中文标签(V2 字段,留作未来字段使用) */
|
|
31
|
+
export declare const ACTION_VERB_CN: Record<ActionVerb, string>;
|
|
24
32
|
export declare class ExecutionDocBuilder {
|
|
25
33
|
private storage;
|
|
26
34
|
private ai;
|
|
@@ -36,7 +44,58 @@ export declare class ExecutionDocBuilder {
|
|
|
36
44
|
private renderAgentExecution;
|
|
37
45
|
private renderSkillExecution;
|
|
38
46
|
private renderOverview;
|
|
47
|
+
/**
|
|
48
|
+
* 重写 index.md(人类友好视图)+ index-raw.md(原始技术视图)。
|
|
49
|
+
*
|
|
50
|
+
* 主索引为倒序:最新的执行排在最上面,列包含:
|
|
51
|
+
* - 倒序编号(# 列:最新条目数字最大,等于总数)
|
|
52
|
+
* - 时间(今天 HH:MM / 昨天 HH:MM / MM-DD HH:MM / YYYY-MM-DD HH:MM)
|
|
53
|
+
* - 任务描述(来自 overview.md frontmatter.prompt 或 body 中的 Prompt 行,截 40 字符)
|
|
54
|
+
* - 执行者(聚合 agent-*.md 文件名:单个/× N/最多列两个 +N)
|
|
55
|
+
* - 状态(基于 verdict 字段映射的中文标签)
|
|
56
|
+
* - 详情链接(相对路径)
|
|
57
|
+
*
|
|
58
|
+
* 容错策略:缺少 overview.md / frontmatter 解析失败 → 显示占位符,不中断生成。
|
|
59
|
+
*/
|
|
39
60
|
private updateIndex;
|
|
61
|
+
/** 从单个 routeId 目录收集索引所需的元数据 */
|
|
62
|
+
private collectIndexEntry;
|
|
63
|
+
/** 兜底:当 overview.md 缺失时,从目录名 `<uuid>:<unix_ms>` 中解析时间 */
|
|
64
|
+
private fallbackStartedAtFromDirName;
|
|
65
|
+
/** 简化版 YAML frontmatter 解析(key: value 单行格式) */
|
|
66
|
+
private parseFrontmatter;
|
|
67
|
+
/** 当 frontmatter 没有 prompt 时,从 body 的 "| Prompt | ... |" 行兜底提取 */
|
|
68
|
+
private extractPromptFromBody;
|
|
69
|
+
/** 渲染主索引(人类友好视图) */
|
|
70
|
+
private renderIndexMd;
|
|
71
|
+
/** 渲染原始技术视图(保留 routeId + 文件列表,供系统/Agent 使用) */
|
|
72
|
+
private renderRawIndexMd;
|
|
73
|
+
/** 索引头部生成时间:YYYY-MM-DD HH:MM */
|
|
74
|
+
private formatGenerationTime;
|
|
75
|
+
/** 列表中的时间格式:今天/昨天/本年/跨年四档 */
|
|
76
|
+
private formatIndexTime;
|
|
77
|
+
private pad2;
|
|
78
|
+
/**
|
|
79
|
+
* 任务描述清洗与截断。
|
|
80
|
+
* - 剥离系统消息标签(<task-notification>, <system-reminder>, <local-command-*>)
|
|
81
|
+
* 只保留标签内的实际任务内容;如果整段都是系统消息则降级到 "[系统通知]"
|
|
82
|
+
* - 移除常见 markdown 噪声([Image #N] 等)
|
|
83
|
+
* - 多行/多空白归一为单空格
|
|
84
|
+
* - 超过 maxLen 字符(基于 JS 字符串 length,对中文 1:1)→ 尾加 "..."
|
|
85
|
+
* - 空字符串 → "—"
|
|
86
|
+
*/
|
|
87
|
+
private truncatePromptForIndex;
|
|
88
|
+
/**
|
|
89
|
+
* 执行者列表格式化:
|
|
90
|
+
* - 0 个 → "—"
|
|
91
|
+
* - 1 个 → "name"
|
|
92
|
+
* - 多个同名(理论上文件名不会重复,但兼容) → "name × N"
|
|
93
|
+
* - 2 个不同 → "a, b"
|
|
94
|
+
* - 多于 2 个不同 → "a, b, +N"
|
|
95
|
+
*/
|
|
96
|
+
private formatAgentList;
|
|
97
|
+
/** verdict → 状态展示标签 */
|
|
98
|
+
private mapVerdictToStatus;
|
|
40
99
|
private tryGenerateSummary;
|
|
41
100
|
private buildFallbackSummary;
|
|
42
101
|
private buildTimelineRows;
|
|
@@ -51,6 +110,37 @@ export declare class ExecutionDocBuilder {
|
|
|
51
110
|
private countTools;
|
|
52
111
|
private formatToolCounts;
|
|
53
112
|
private formatDuration;
|
|
113
|
+
/**
|
|
114
|
+
* 人性化耗时:
|
|
115
|
+
* - null/<=0 → "—"
|
|
116
|
+
* - < 1s → "<1 秒"
|
|
117
|
+
* - < 60s → "X.X 秒"(一位小数,整秒去掉 .0)
|
|
118
|
+
* - < 60min → "X 分 Y 秒"(整分钟省略秒部分)
|
|
119
|
+
* - >= 60min → "X 小时 Y 分"
|
|
120
|
+
*/
|
|
121
|
+
private formatDurationHuman;
|
|
122
|
+
/** TaskType 显示:`中文(英文)`,未知值原样返回。 */
|
|
123
|
+
private taskTypeLabel;
|
|
124
|
+
/** Complexity 显示:`中文(英文)`,未知值原样返回。 */
|
|
125
|
+
private complexityLabel;
|
|
126
|
+
/** 路由目标:`Agent → name` / `Skill → name` / `未路由`。 */
|
|
127
|
+
private routedToLabel;
|
|
128
|
+
/** 文件改动动作:英文 → 中文动词。 */
|
|
129
|
+
private fileActionLabel;
|
|
130
|
+
/**
|
|
131
|
+
* 人性化日期时间:`YYYY-MM-DD HH:mm:ss`(本地时区)
|
|
132
|
+
* 失败时回退到原值。
|
|
133
|
+
*/
|
|
134
|
+
private formatDateTimeHuman;
|
|
135
|
+
/**
|
|
136
|
+
* YAML frontmatter 单行字符串值(无引号,依赖 parseFrontmatter 的 indexOf(':') 切分):
|
|
137
|
+
* - 去除换行 / 多余空白(避免破坏行结构)
|
|
138
|
+
* - 去除前导 `---`(避免与 frontmatter 终止符歧义)
|
|
139
|
+
* - 不加引号 —— Agent A 的 parseFrontmatter 不做反引号处理
|
|
140
|
+
*
|
|
141
|
+
* 注意:若 prompt 很长,索引层会再做截断展示。
|
|
142
|
+
*/
|
|
143
|
+
private frontmatterValue;
|
|
54
144
|
private formatTime;
|
|
55
145
|
private extractTarget;
|
|
56
146
|
private truncate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-doc-builder.d.ts","sourceRoot":"","sources":["../../src/intelligence/execution-doc-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-doc-builder.d.ts","sourceRoot":"","sources":["../../src/intelligence/execution-doc-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,qCAAqC;AACrC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CA+BjD,CAAC;AAEF,wBAAwB;AACxB,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIpD,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAWrD,CAAC;AAoDF,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,EAAE;gBADF,OAAO,EAAE,aAAa,EACtB,EAAE,GAAE,UAAU,GAAG,IAAW;IAGtC;;;OAGG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAwCpD,aAAa;IAuD3B,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,yBAAyB;YAiBnB,oBAAoB;IA8HlC,OAAO,CAAC,oBAAoB;IAiE5B,OAAO,CAAC,cAAc;IA+FtB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,WAAW;IAyBnB,+BAA+B;IAC/B,OAAO,CAAC,iBAAiB;IA+CzB,yDAAyD;IACzD,OAAO,CAAC,4BAA4B;IAUpC,+CAA+C;IAC/C,OAAO,CAAC,gBAAgB;IAcxB,kEAAkE;IAClE,OAAO,CAAC,qBAAqB;IAM7B,oBAAoB;IACpB,OAAO,CAAC,aAAa;IAuCrB,+CAA+C;IAC/C,OAAO,CAAC,gBAAgB;IAwBxB,gCAAgC;IAChC,OAAO,CAAC,oBAAoB;IAQ5B,6BAA6B;IAC7B,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,IAAI;IAIZ;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IAgC9B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAoBvB,uBAAuB;IACvB,OAAO,CAAC,kBAAkB;YAmBZ,kBAAkB;IAyChC,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,6BAA6B;IAiBrC,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;IAOtB;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAuB3B,oCAAoC;IACpC,OAAO,CAAC,aAAa;IAKrB,sCAAsC;IACtC,OAAO,CAAC,eAAe;IAKvB,oDAAoD;IACpD,OAAO,CAAC,aAAa;IAWrB,wBAAwB;IACxB,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,wBAAwB;CAYjC"}
|