@winspan/claude-forge 8.33.5 → 8.35.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/agents/definition.d.ts +3 -0
- package/dist/agents/definition.d.ts.map +1 -1
- package/dist/agents/definition.js +3 -0
- package/dist/agents/definition.js.map +1 -1
- package/dist/agents/official-agents.d.ts.map +1 -1
- package/dist/agents/official-agents.js +6 -3
- package/dist/agents/official-agents.js.map +1 -1
- package/dist/agents/registry.d.ts +17 -1
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +106 -7
- package/dist/agents/registry.js.map +1 -1
- 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/cli/commands/executions.d.ts +3 -0
- package/dist/cli/commands/executions.d.ts.map +1 -0
- package/dist/cli/commands/executions.js +109 -0
- package/dist/cli/commands/executions.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +83 -20
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/storage/rows.d.ts +14 -36
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +27 -45
- package/dist/core/storage/sqlite.d.ts +11 -79
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +35 -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 +5 -15
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +25 -93
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +3 -5
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +39 -98
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +11 -56
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/routing-observer.d.ts.map +1 -1
- package/dist/daemon/routing-observer.js +24 -1
- package/dist/daemon/routing-observer.js.map +1 -1
- package/dist/intelligence/execution-doc-builder.d.ts +61 -0
- package/dist/intelligence/execution-doc-builder.d.ts.map +1 -0
- package/dist/intelligence/execution-doc-builder.js +601 -0
- package/dist/intelligence/execution-doc-builder.js.map +1 -0
- package/dist/skills/invocation-guard.d.ts +45 -0
- package/dist/skills/invocation-guard.d.ts.map +1 -0
- package/dist/skills/invocation-guard.js +82 -0
- package/dist/skills/invocation-guard.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/skills/registry.d.ts +22 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +30 -2
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +36 -0
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -0
- package/dist/skills/tools/skill-invoke.js +82 -0
- package/dist/skills/tools/skill-invoke.js.map +1 -0
- package/dist/skills/tools/skill-list.d.ts +26 -0
- package/dist/skills/tools/skill-list.d.ts.map +1 -0
- package/dist/skills/tools/skill-list.js +35 -0
- package/dist/skills/tools/skill-list.js.map +1 -0
- package/dist/web/routes/execution-trace.d.ts.map +1 -1
- package/dist/web/routes/execution-trace.js +16 -0
- package/dist/web/routes/execution-trace.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts +12 -0
- package/dist/web/routes/skill-stats.d.ts.map +1 -0
- package/dist/web/routes/skill-stats.js +72 -0
- package/dist/web/routes/skill-stats.js.map +1 -0
- 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-BbwRuWzm.js → AIConfig-DiUFET_Q.js} +2 -2
- package/dist/web/static/assets/{AIConfig-BbwRuWzm.js.map → AIConfig-DiUFET_Q.js.map} +1 -1
- package/dist/web/static/assets/{Agents-FyKzsN-g.js → Agents-bNNGbQnL.js} +2 -2
- package/dist/web/static/assets/{Agents-FyKzsN-g.js.map → Agents-bNNGbQnL.js.map} +1 -1
- package/dist/web/static/assets/{Events-C2OCOKAD.js → Events-DQHP6Uaq.js} +2 -2
- package/dist/web/static/assets/{Events-C2OCOKAD.js.map → Events-DQHP6Uaq.js.map} +1 -1
- package/dist/web/static/assets/ExecutionTrace-Co8ARdg-.js +3 -0
- package/dist/web/static/assets/ExecutionTrace-Co8ARdg-.js.map +1 -0
- package/dist/web/static/assets/{Methodologies-DwYLXc8o.js → Methodologies-CXNrDXwG.js} +2 -2
- package/dist/web/static/assets/{Methodologies-DwYLXc8o.js.map → Methodologies-CXNrDXwG.js.map} +1 -1
- package/dist/web/static/assets/{Sessions-CFpFk-5I.js → Sessions-ZQSCgXyy.js} +2 -2
- package/dist/web/static/assets/{Sessions-CFpFk-5I.js.map → Sessions-ZQSCgXyy.js.map} +1 -1
- package/dist/web/static/assets/{Skills-BkbegTV1.js → Skills-C5-5zOSH.js} +2 -2
- package/dist/web/static/assets/{Skills-BkbegTV1.js.map → Skills-C5-5zOSH.js.map} +1 -1
- package/dist/web/static/assets/{index-CIRlno4E.js → index-DJK5beK6.js} +3 -3
- package/dist/web/static/assets/{index-CIRlno4E.js.map → index-DJK5beK6.js.map} +1 -1
- package/dist/web/static/assets/index-phpuytMI.css +1 -0
- package/dist/web/static/index.html +2 -2
- 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/ExecutionTrace-BsWSpu2v.js +0 -3
- package/dist/web/static/assets/ExecutionTrace-BsWSpu2v.js.map +0 -1
- package/dist/web/static/assets/index-N1EByy_h.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../../src/core/utils/token-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../../src/core/utils/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,26 +5,18 @@
|
|
|
5
5
|
* 1. Review code changes via QualityGate
|
|
6
6
|
* 2. Print terminal warnings for fail/warn
|
|
7
7
|
* 3. Inject correction directive if needed
|
|
8
|
-
* 4. Advance methodology phases when Agent is invoked
|
|
9
8
|
*/
|
|
10
9
|
import type { ForgeEvent, HookResult } from '../../core/types.js';
|
|
11
10
|
import type { QualityGate } from '../../intelligence/quality-gate.js';
|
|
12
11
|
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
13
12
|
import type { RoutingObserver } from '../routing-observer.js';
|
|
14
|
-
import type { MethodologyRegistry } from '../../capability/methodology-registry.js';
|
|
15
13
|
export declare class PostToolUseHandler {
|
|
16
14
|
private qualityGate;
|
|
17
15
|
private storage;
|
|
18
16
|
private observer;
|
|
19
|
-
private methodologyRegistry;
|
|
20
17
|
private tokenTracker;
|
|
21
|
-
constructor(qualityGate: QualityGate, storage?: SQLiteStorage | null, observer?: RoutingObserver | null
|
|
18
|
+
constructor(qualityGate: QualityGate, storage?: SQLiteStorage | null, observer?: RoutingObserver | null);
|
|
22
19
|
handle(event: ForgeEvent): Promise<HookResult>;
|
|
23
|
-
/**
|
|
24
|
-
* Advance methodology phase when Agent (Task) tool is invoked.
|
|
25
|
-
* Returns the next phase directive (or completion message) to inject.
|
|
26
|
-
*/
|
|
27
|
-
private advanceMethodologyPhase;
|
|
28
20
|
private recordQualityIssues;
|
|
29
21
|
}
|
|
30
22
|
//# sourceMappingURL=post-tool-use.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-tool-use.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/post-tool-use.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"post-tool-use.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/post-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9D,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,YAAY,CAA6B;gBAGvC,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,aAAa,GAAG,IAAW,EACpC,QAAQ,GAAE,eAAe,GAAG,IAAW;IAO3C,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAiEpD,OAAO,CAAC,mBAAmB;CAkC5B"}
|
|
@@ -5,23 +5,19 @@
|
|
|
5
5
|
* 1. Review code changes via QualityGate
|
|
6
6
|
* 2. Print terminal warnings for fail/warn
|
|
7
7
|
* 3. Inject correction directive if needed
|
|
8
|
-
* 4. Advance methodology phases when Agent is invoked
|
|
9
8
|
*/
|
|
10
9
|
import { randomUUID } from 'node:crypto';
|
|
11
10
|
import { logger } from '../../core/utils/logger.js';
|
|
12
11
|
import { TokenTracker } from '../../core/utils/token-tracker.js';
|
|
13
|
-
import { formatMethodologyPhaseDirective, formatMethodologyCompletionMessage } from './methodology-formatter.js';
|
|
14
12
|
export class PostToolUseHandler {
|
|
15
13
|
qualityGate;
|
|
16
14
|
storage;
|
|
17
15
|
observer;
|
|
18
|
-
methodologyRegistry;
|
|
19
16
|
tokenTracker = null;
|
|
20
|
-
constructor(qualityGate, storage = null, observer = null
|
|
17
|
+
constructor(qualityGate, storage = null, observer = null) {
|
|
21
18
|
this.qualityGate = qualityGate;
|
|
22
19
|
this.storage = storage;
|
|
23
20
|
this.observer = observer;
|
|
24
|
-
this.methodologyRegistry = methodologyRegistry;
|
|
25
21
|
if (storage) {
|
|
26
22
|
this.tokenTracker = new TokenTracker(storage);
|
|
27
23
|
}
|
|
@@ -37,23 +33,9 @@ export class PostToolUseHandler {
|
|
|
37
33
|
logger.debug(`[PostToolUse] observer failed: ${err}`);
|
|
38
34
|
}
|
|
39
35
|
}
|
|
40
|
-
// Methodology phase advancement (NEW)
|
|
41
|
-
let methodologyMessage = null;
|
|
42
|
-
if (this.storage && this.methodologyRegistry && event.tool_name === 'Task') {
|
|
43
|
-
try {
|
|
44
|
-
methodologyMessage = await this.advanceMethodologyPhase(event);
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
logger.warn(`[PostToolUse] Methodology phase advancement failed: ${err}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
36
|
try {
|
|
51
37
|
const result = this.qualityGate ? await this.qualityGate.review(event) : null;
|
|
52
38
|
if (!result) {
|
|
53
|
-
// Return methodology message if any
|
|
54
|
-
if (methodologyMessage) {
|
|
55
|
-
return { allow: true, additionalContext: methodologyMessage };
|
|
56
|
-
}
|
|
57
39
|
return { allow: true };
|
|
58
40
|
}
|
|
59
41
|
if (result.level === 'fail' || result.level === 'warn') {
|
|
@@ -74,20 +56,12 @@ export class PostToolUseHandler {
|
|
|
74
56
|
};
|
|
75
57
|
}
|
|
76
58
|
if (result.directive) {
|
|
77
|
-
// Combine methodology message with quality directive
|
|
78
|
-
const additionalContext = methodologyMessage
|
|
79
|
-
? `${methodologyMessage}\n\n[Forge 质量检查] ${result.summary}`
|
|
80
|
-
: `[Forge 质量检查] ${result.summary}`;
|
|
81
59
|
return {
|
|
82
60
|
allow: true,
|
|
83
61
|
systemMessage: result.directive,
|
|
84
|
-
additionalContext
|
|
62
|
+
additionalContext: `[Forge 质量检查] ${result.summary}`,
|
|
85
63
|
};
|
|
86
64
|
}
|
|
87
|
-
// Return methodology message if any
|
|
88
|
-
if (methodologyMessage) {
|
|
89
|
-
return { allow: true, additionalContext: methodologyMessage };
|
|
90
|
-
}
|
|
91
65
|
return { allow: true };
|
|
92
66
|
}
|
|
93
67
|
catch (err) {
|
|
@@ -95,77 +69,6 @@ export class PostToolUseHandler {
|
|
|
95
69
|
return { allow: true };
|
|
96
70
|
}
|
|
97
71
|
}
|
|
98
|
-
/**
|
|
99
|
-
* Advance methodology phase when Agent (Task) tool is invoked.
|
|
100
|
-
* Returns the next phase directive (or completion message) to inject.
|
|
101
|
-
*/
|
|
102
|
-
async advanceMethodologyPhase(event) {
|
|
103
|
-
if (!this.storage || !this.methodologyRegistry)
|
|
104
|
-
return null;
|
|
105
|
-
const execution = this.storage.getActiveMethodologyExecution(event.session_id);
|
|
106
|
-
if (!execution)
|
|
107
|
-
return null;
|
|
108
|
-
const plan = JSON.parse(execution.plan_json);
|
|
109
|
-
const currentPhaseIndex = execution.current_phase_index;
|
|
110
|
-
const currentPhase = plan.phases[currentPhaseIndex];
|
|
111
|
-
if (!currentPhase)
|
|
112
|
-
return null;
|
|
113
|
-
// Get the agent that was actually invoked
|
|
114
|
-
const invokedAgent = event.tool_input?.subagent_type;
|
|
115
|
-
// Check if invoked agent matches expected agent.
|
|
116
|
-
// 兼容历史 plan:AI Planner 早期版本曾把 phase.id 写成 agent 名,
|
|
117
|
-
// 所以 invokedAgent 等于 phase.agent 或 phase.id 都视为命中。
|
|
118
|
-
const matches = invokedAgent === currentPhase.agent || invokedAgent === currentPhase.id;
|
|
119
|
-
if (!matches) {
|
|
120
|
-
logger.warn(`[Methodology] Phase ${currentPhaseIndex + 1} expected agent "${currentPhase.agent}" (or id "${currentPhase.id}") but got "${invokedAgent}"`);
|
|
121
|
-
// Don't advance phase if wrong agent invoked
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
// Mark current phase as completed
|
|
125
|
-
const phaseExecutions = this.storage.getPhaseExecutions(execution.id);
|
|
126
|
-
const currentPhaseExec = phaseExecutions.find(p => p.phase_index === currentPhaseIndex);
|
|
127
|
-
if (currentPhaseExec) {
|
|
128
|
-
this.storage.updatePhaseExecution(currentPhaseExec.id, {
|
|
129
|
-
status: 'completed',
|
|
130
|
-
completed_at: Date.now(),
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
logger.info(`[Methodology] Phase ${currentPhaseIndex + 1} (${currentPhase.id}) completed`);
|
|
134
|
-
// Advance to next phase
|
|
135
|
-
const nextPhaseIndex = currentPhaseIndex + 1;
|
|
136
|
-
const nextPhase = plan.phases[nextPhaseIndex];
|
|
137
|
-
if (!nextPhase) {
|
|
138
|
-
// All phases completed
|
|
139
|
-
this.storage.updateMethodologyExecution(execution.id, {
|
|
140
|
-
status: 'completed',
|
|
141
|
-
completed_at: Date.now(),
|
|
142
|
-
last_progress_at: Date.now(),
|
|
143
|
-
});
|
|
144
|
-
logger.info(`[Methodology] Execution ${execution.id} completed (all ${plan.phases.length} phases)`);
|
|
145
|
-
return formatMethodologyCompletionMessage(plan);
|
|
146
|
-
}
|
|
147
|
-
// Update execution to point to next phase
|
|
148
|
-
this.storage.updateMethodologyExecution(execution.id, {
|
|
149
|
-
current_phase_index: nextPhaseIndex,
|
|
150
|
-
last_progress_at: Date.now(),
|
|
151
|
-
});
|
|
152
|
-
// Create next phase execution record
|
|
153
|
-
this.storage.createPhaseExecution({
|
|
154
|
-
methodology_execution_id: execution.id,
|
|
155
|
-
phase_id: nextPhase.id,
|
|
156
|
-
phase_index: nextPhaseIndex,
|
|
157
|
-
agent_name: nextPhase.agent,
|
|
158
|
-
prompt: nextPhase.prompt,
|
|
159
|
-
});
|
|
160
|
-
// Get methodology definition for formatting
|
|
161
|
-
const methodology = this.methodologyRegistry.get(execution.methodology_id);
|
|
162
|
-
if (!methodology) {
|
|
163
|
-
logger.warn(`[Methodology] Definition not found: ${execution.methodology_id}`);
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
logger.info(`[Methodology] Advanced to Phase ${nextPhaseIndex + 1}: ${nextPhase.id} → ${nextPhase.agent}`);
|
|
167
|
-
return formatMethodologyPhaseDirective(methodology, plan, nextPhase, nextPhaseIndex, execution.id);
|
|
168
|
-
}
|
|
169
72
|
recordQualityIssues(event, result) {
|
|
170
73
|
if (!this.storage)
|
|
171
74
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../../src/daemon/handlers/post-tool-use.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../../src/daemon/handlers/post-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,MAAM,OAAO,kBAAkB;IAInB;IACA;IACA;IALF,YAAY,GAAwB,IAAI,CAAC;IAEjD,YACU,WAAwB,EACxB,UAAgC,IAAI,EACpC,WAAmC,IAAI;QAFvC,gBAAW,GAAX,WAAW,CAAa;QACxB,YAAO,GAAP,OAAO,CAA6B;QACpC,aAAQ,GAAR,QAAQ,CAA+B;QAE/C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,qEAAqE;QACrE,4BAA4B;QAC5B,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CACvB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACd,KAAK,CAAC,UAAsC,IAAI,EAAE,CACpD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBACvD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC7C,OAAO,CAAC,KAAK,CACX,4BAA4B,SAAS,KAAK,MAAM,CAAC,OAAO,SAAS,CAClE,CAAC;gBAEF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACtD,OAAO,CAAC,KAAK,CACX,kBAAkB,cAAc,SAAS,CAC1C,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,IAAI,CACT,+BAA+B,SAAS,KAAK,MAAM,CAAC,OAAO,EAAE,CAC9D,CAAC;gBAEF,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,gBAAgB,MAAM,CAAC,OAAO,EAAE;oBACxC,aAAa,EAAE,MAAM,CAAC,SAAS;iBAChC,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,aAAa,EAAE,MAAM,CAAC,SAAS;oBAC/B,iBAAiB,EAAE,gBAAgB,MAAM,CAAC,OAAO,EAAE;iBACpD,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,mBAAmB,CACzB,KAAiB,EACjB,MAA+E;QAE/E,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,QAAQ,GAAI,KAAK,CAAC,UAAqC,EAAE,SAAS,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAEtC,4CAA4C;YAC5C,EAAE,CAAC,OAAO,CAAC;;;;OAIV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YAErC,oBAAoB;YACpB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAGvB,CAAC,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM;oBAAE,SAAS;gBACrC,IAAI,CAAC,GAAG,CACN,UAAU,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,EAClD,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,kDAAkD,GAAG,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -12,7 +12,8 @@ import type { ResumeManager } from '../../claudemd/resume-manager.js';
|
|
|
12
12
|
import type { RoutingObserver } from '../routing-observer.js';
|
|
13
13
|
import type { TaskSegmenter } from '../../intelligence/task-segmenter.js';
|
|
14
14
|
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
15
|
-
import type {
|
|
15
|
+
import type { InvocationGuard } from '../../skills/invocation-guard.js';
|
|
16
|
+
import type { ExecutionDocBuilder } from '../../intelligence/execution-doc-builder.js';
|
|
16
17
|
export declare class StopHandler {
|
|
17
18
|
private distiller;
|
|
18
19
|
private exporter;
|
|
@@ -20,20 +21,9 @@ export declare class StopHandler {
|
|
|
20
21
|
private observer;
|
|
21
22
|
private taskSegmenter;
|
|
22
23
|
private storage;
|
|
23
|
-
private
|
|
24
|
-
|
|
24
|
+
private invocationGuard;
|
|
25
|
+
private executionDocBuilder;
|
|
26
|
+
constructor(distiller: Distiller, exporter: HistoryExporter, resume?: ResumeManager | null, observer?: RoutingObserver | null, taskSegmenter?: TaskSegmenter | null, storage?: SQLiteStorage | null, invocationGuard?: InvocationGuard | null, executionDocBuilder?: ExecutionDocBuilder | null);
|
|
25
27
|
handle(event: ForgeEvent): Promise<HookResult>;
|
|
26
|
-
/**
|
|
27
|
-
* Session 结束时清理当前 session 上"从没推进过"的 methodology:
|
|
28
|
-
* 只处理 current_phase_index === 0 且 phase 0 状态还是 pending/running 的
|
|
29
|
-
* execution —— 也就是"创建了但 Claude 从没听指令"的。已经推进到 phase 1+
|
|
30
|
-
* 或 phase 0 已 completed 的保留,由 checkMethodologyStall 的 pending
|
|
31
|
-
* 队列机制接管(用户 resume 时继续)。
|
|
32
|
-
*
|
|
33
|
-
* 为防御 legacy 数据(可能有多个 running 行漏出排他检查),这里遍历
|
|
34
|
-
* 所有 running 行,而不是只用 getActiveMethodologyExecution 取最新一条。
|
|
35
|
-
*/
|
|
36
|
-
private cancelZeroProgressMethodologies;
|
|
37
|
-
private checkMethodologyStall;
|
|
38
28
|
}
|
|
39
29
|
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAGvF,qBAAa,WAAW;IAEpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,mBAAmB;gBAPnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,eAAe,EACzB,MAAM,GAAE,aAAa,GAAG,IAAW,EACnC,QAAQ,GAAE,eAAe,GAAG,IAAW,EACvC,aAAa,GAAE,aAAa,GAAG,IAAW,EAC1C,OAAO,GAAE,aAAa,GAAG,IAAW,EACpC,eAAe,GAAE,eAAe,GAAG,IAAW,EAC9C,mBAAmB,GAAE,mBAAmB,GAAG,IAAW;IAG1D,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAoErD"}
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
* 2. Export session history to .claude-forge/history/
|
|
7
7
|
*/
|
|
8
8
|
import { logger } from '../../core/utils/logger.js';
|
|
9
|
-
import { getMethodologyPendingQueue } from '../methodology-pending-queue.js';
|
|
10
|
-
import { formatMethodologyPhaseDirective } from './methodology-formatter.js';
|
|
11
9
|
export class StopHandler {
|
|
12
10
|
distiller;
|
|
13
11
|
exporter;
|
|
@@ -15,15 +13,17 @@ export class StopHandler {
|
|
|
15
13
|
observer;
|
|
16
14
|
taskSegmenter;
|
|
17
15
|
storage;
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
invocationGuard;
|
|
17
|
+
executionDocBuilder;
|
|
18
|
+
constructor(distiller, exporter, resume = null, observer = null, taskSegmenter = null, storage = null, invocationGuard = null, executionDocBuilder = null) {
|
|
20
19
|
this.distiller = distiller;
|
|
21
20
|
this.exporter = exporter;
|
|
22
21
|
this.resume = resume;
|
|
23
22
|
this.observer = observer;
|
|
24
23
|
this.taskSegmenter = taskSegmenter;
|
|
25
24
|
this.storage = storage;
|
|
26
|
-
this.
|
|
25
|
+
this.invocationGuard = invocationGuard;
|
|
26
|
+
this.executionDocBuilder = executionDocBuilder;
|
|
27
27
|
}
|
|
28
28
|
async handle(event) {
|
|
29
29
|
// Flush any pending routing observation (obeyed=NULL if still unset,
|
|
@@ -47,15 +47,6 @@ export class StopHandler {
|
|
|
47
47
|
logger.debug(`[Stop] task completion failed: ${err}`);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
// 1a. Methodology 前台兜底:若当前 session 有 running execution 且
|
|
51
|
-
// 当前阶段没推进,把该阶段指令放入 pending 队列,下一轮
|
|
52
|
-
// UserPromptSubmit 会自动再注入一次(解决 3 小时 0% 的体验问题)。
|
|
53
|
-
//
|
|
54
|
-
// 先做"零推进即取消"清理:session 都结束了还停在 phase 0 未启动的
|
|
55
|
-
// execution,保留只会污染后续 session 的排他检查。已推进一轮以上的
|
|
56
|
-
// 仍保留(用户 resume 可能继续),由 pending 队列负责下次恢复。
|
|
57
|
-
this.cancelZeroProgressMethodologies(event.session_id);
|
|
58
|
-
this.checkMethodologyStall(event.session_id);
|
|
59
50
|
// 2. Save resume info
|
|
60
51
|
if (this.resume) {
|
|
61
52
|
const resumeContent = this.resume.generate(event.session_id, event.project_path);
|
|
@@ -67,95 +58,36 @@ export class StopHandler {
|
|
|
67
58
|
// 2. Distill session
|
|
68
59
|
logger.info(`[Stop] Distilling session ${event.session_id}`);
|
|
69
60
|
await this.distiller.distill(event.session_id, event.project_path);
|
|
61
|
+
// 2a. 生成 Agent/Skill 执行文档(异步 tail,不阻塞 hook)
|
|
62
|
+
if (this.executionDocBuilder) {
|
|
63
|
+
// setImmediate 让 hook 立刻返回,不等文档生成完
|
|
64
|
+
setImmediate(async () => {
|
|
65
|
+
try {
|
|
66
|
+
await this.executionDocBuilder.build(event.session_id, event.project_path);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logger.warn(`[Stop] ExecutionDocBuilder failed: ${err}`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
70
73
|
// 3. Export history
|
|
71
74
|
logger.info(`[Stop] Exporting history for session ${event.session_id}`);
|
|
72
75
|
await this.exporter.export(event);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
catch (err) {
|
|
76
|
-
logger.warn(`[Stop] Handler failed: ${err}`);
|
|
77
|
-
return { allow: true };
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Session 结束时清理当前 session 上"从没推进过"的 methodology:
|
|
82
|
-
* 只处理 current_phase_index === 0 且 phase 0 状态还是 pending/running 的
|
|
83
|
-
* execution —— 也就是"创建了但 Claude 从没听指令"的。已经推进到 phase 1+
|
|
84
|
-
* 或 phase 0 已 completed 的保留,由 checkMethodologyStall 的 pending
|
|
85
|
-
* 队列机制接管(用户 resume 时继续)。
|
|
86
|
-
*
|
|
87
|
-
* 为防御 legacy 数据(可能有多个 running 行漏出排他检查),这里遍历
|
|
88
|
-
* 所有 running 行,而不是只用 getActiveMethodologyExecution 取最新一条。
|
|
89
|
-
*/
|
|
90
|
-
cancelZeroProgressMethodologies(session_id) {
|
|
91
|
-
if (!this.storage)
|
|
92
|
-
return;
|
|
93
|
-
try {
|
|
94
|
-
const allRunning = this.storage
|
|
95
|
-
.listRunningForegroundExecutions()
|
|
96
|
-
.filter((row) => row.session_id === session_id);
|
|
97
|
-
if (allRunning.length === 0)
|
|
98
|
-
return;
|
|
99
|
-
const now = Date.now();
|
|
100
|
-
for (const exec of allRunning) {
|
|
101
|
-
const idx = exec.current_phase_index ?? 0;
|
|
102
|
-
if (idx !== 0)
|
|
103
|
-
continue; // 已推进过至少一轮,保留给下次 resume
|
|
104
|
-
const phaseExecs = this.storage.getPhaseExecutions(exec.id);
|
|
105
|
-
const phase0 = phaseExecs.find((p) => p.phase_index === 0);
|
|
106
|
-
const status = phase0?.status;
|
|
107
|
-
// phase 0 不存在或仍处于 pending/running —— 等同于"从没推进"
|
|
108
|
-
const neverProgressed = !phase0 || status === 'pending' || status === 'running';
|
|
109
|
-
if (!neverProgressed)
|
|
110
|
-
continue;
|
|
76
|
+
// 4. Clear skill invocation guard for this session
|
|
77
|
+
if (this.invocationGuard) {
|
|
111
78
|
try {
|
|
112
|
-
this.
|
|
113
|
-
|
|
114
|
-
completed_at: now,
|
|
115
|
-
});
|
|
116
|
-
logger.info(`[Stop] Cancelled zero-progress methodology execution=${exec.id} session=${session_id} (phase 0 ${status ?? 'missing'})`);
|
|
79
|
+
this.invocationGuard.clear(event.session_id);
|
|
80
|
+
logger.debug(`[Stop] InvocationGuard cleared for session ${event.session_id}`);
|
|
117
81
|
}
|
|
118
82
|
catch (err) {
|
|
119
|
-
logger.
|
|
83
|
+
logger.debug(`[Stop] InvocationGuard clear failed: ${err}`);
|
|
120
84
|
}
|
|
121
85
|
}
|
|
86
|
+
return { allow: true };
|
|
122
87
|
}
|
|
123
88
|
catch (err) {
|
|
124
|
-
logger.
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
checkMethodologyStall(session_id) {
|
|
128
|
-
if (!this.storage || !this.methodologyRegistry)
|
|
129
|
-
return;
|
|
130
|
-
try {
|
|
131
|
-
const execution = this.storage.getActiveMethodologyExecution(session_id);
|
|
132
|
-
if (!execution)
|
|
133
|
-
return;
|
|
134
|
-
const plan = JSON.parse(execution.plan_json);
|
|
135
|
-
const idx = execution.current_phase_index ?? 0;
|
|
136
|
-
const phase = plan.phases[idx];
|
|
137
|
-
if (!phase)
|
|
138
|
-
return;
|
|
139
|
-
const phaseExecs = this.storage.getPhaseExecutions(execution.id);
|
|
140
|
-
const currentExec = phaseExecs.find(p => p.phase_index === idx);
|
|
141
|
-
if (currentExec?.status === 'completed')
|
|
142
|
-
return;
|
|
143
|
-
const methodology = this.methodologyRegistry.get(execution.methodology_id);
|
|
144
|
-
if (!methodology)
|
|
145
|
-
return;
|
|
146
|
-
const directive = formatMethodologyPhaseDirective(methodology, plan, phase, idx, execution.id);
|
|
147
|
-
getMethodologyPendingQueue().enqueue({
|
|
148
|
-
session_id,
|
|
149
|
-
execution_id: execution.id,
|
|
150
|
-
phase_index: idx,
|
|
151
|
-
directive,
|
|
152
|
-
enqueued_at: Date.now(),
|
|
153
|
-
reason: 'stop-fallback',
|
|
154
|
-
});
|
|
155
|
-
logger.info(`[Stop] Methodology phase ${idx + 1}/${plan.phases.length} not progressed — queued directive for next UserPromptSubmit`);
|
|
156
|
-
}
|
|
157
|
-
catch (err) {
|
|
158
|
-
logger.debug(`[Stop] methodology stall check failed: ${err}`);
|
|
89
|
+
logger.warn(`[Stop] Handler failed: ${err}`);
|
|
90
|
+
return { allow: true };
|
|
159
91
|
}
|
|
160
92
|
}
|
|
161
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/daemon/handlers/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/daemon/handlers/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,7 @@ import type { ExperimentRouter } from '../../engine/experiment-router.js';
|
|
|
18
18
|
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
19
19
|
import type { RoutingObserver } from '../routing-observer.js';
|
|
20
20
|
import type { AgentRegistry } from '../../agents/registry.js';
|
|
21
|
-
import type {
|
|
22
|
-
import type { MethodologyPlanner } from '../../capability/methodology-planner.js';
|
|
21
|
+
import type { SkillRegistry } from '../../skills/registry.js';
|
|
23
22
|
export declare const INJECTION_VERSION = "v1-declarative-2026-05-08";
|
|
24
23
|
export declare class UserPromptHandler {
|
|
25
24
|
private classifier;
|
|
@@ -29,11 +28,10 @@ export declare class UserPromptHandler {
|
|
|
29
28
|
private agents;
|
|
30
29
|
private storage;
|
|
31
30
|
private observer;
|
|
32
|
-
private
|
|
33
|
-
private methodologyPlanner;
|
|
31
|
+
private skillRegistry;
|
|
34
32
|
private resumeInjected;
|
|
35
33
|
private conventionInjected;
|
|
36
|
-
constructor(classifier: IntentClassifier, resume?: ResumeManager | null, conventionExtractor?: ConventionExtractor | null, router?: ExperimentRouter | null, agents?: AgentRegistry | null, storage?: SQLiteStorage | null, observer?: RoutingObserver | null,
|
|
34
|
+
constructor(classifier: IntentClassifier, resume?: ResumeManager | null, conventionExtractor?: ConventionExtractor | null, router?: ExperimentRouter | null, agents?: AgentRegistry | null, storage?: SQLiteStorage | null, observer?: RoutingObserver | null, skillRegistry?: SkillRegistry | null);
|
|
37
35
|
handle(event: ForgeEvent): Promise<HookResult>;
|
|
38
36
|
}
|
|
39
37
|
//# sourceMappingURL=user-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,mCAAmC,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"user-prompt.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,mCAAmC,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IAXvB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,kBAAkB,CAAqB;gBAGrC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,GAAE,aAAa,GAAG,IAAW,EACnC,mBAAmB,GAAE,mBAAmB,GAAG,IAAW,EACtD,MAAM,GAAE,gBAAgB,GAAG,IAAW,EACtC,MAAM,GAAE,aAAa,GAAG,IAAW,EACnC,OAAO,GAAE,aAAa,GAAG,IAAW,EACpC,QAAQ,GAAE,eAAe,GAAG,IAAW,EACvC,aAAa,GAAE,aAAa,GAAG,IAAW;IAG9C,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAkKrD"}
|