@tienne/gestalt 0.1.1 → 0.5.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/CLAUDE.md +175 -6
- package/README.md +381 -14
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
- package/dist/benchmarks/types.d.ts +148 -0
- package/dist/benchmarks/types.d.ts.map +1 -0
- package/dist/benchmarks/types.js +2 -0
- package/dist/benchmarks/types.js.map +1 -0
- package/dist/package.json +61 -0
- package/dist/schemas/gestalt.schema.json +98 -0
- package/dist/src/agent/parser.d.ts.map +1 -1
- package/dist/src/agent/parser.js +2 -0
- package/dist/src/agent/parser.js.map +1 -1
- package/dist/src/agent/passthrough-generator.d.ts +27 -0
- package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
- package/dist/src/agent/passthrough-generator.js +133 -0
- package/dist/src/agent/passthrough-generator.js.map +1 -0
- package/dist/src/agent/registry.d.ts +1 -0
- package/dist/src/agent/registry.d.ts.map +1 -1
- package/dist/src/agent/registry.js +4 -1
- package/dist/src/agent/registry.js.map +1 -1
- package/dist/src/agent/role-agent-registry.d.ts +18 -0
- package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
- package/dist/src/agent/role-agent-registry.js +62 -0
- package/dist/src/agent/role-agent-registry.js.map +1 -0
- package/dist/src/agent/role-consensus-engine.d.ts +9 -0
- package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
- package/dist/src/agent/role-consensus-engine.js +35 -0
- package/dist/src/agent/role-consensus-engine.js.map +1 -0
- package/dist/src/agent/role-match-engine.d.ts +14 -0
- package/dist/src/agent/role-match-engine.d.ts.map +1 -0
- package/dist/src/agent/role-match-engine.js +46 -0
- package/dist/src/agent/role-match-engine.js.map +1 -0
- package/dist/src/agent/role-prompt-generator.d.ts +10 -0
- package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
- package/dist/src/agent/role-prompt-generator.js +22 -0
- package/dist/src/agent/role-prompt-generator.js.map +1 -0
- package/dist/src/cli/commands/interview.js +2 -2
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/commands/monitor.d.ts +2 -0
- package/dist/src/cli/commands/monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/monitor.js +13 -0
- package/dist/src/cli/commands/monitor.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts +2 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +20 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/spec.js +2 -2
- package/dist/src/cli/commands/spec.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +3 -3
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +16 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +80 -17
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +141 -31
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/constants.d.ts +2 -2
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +2 -2
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/errors.d.ts +3 -0
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +6 -0
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/types.d.ts +83 -3
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/version.d.ts +10 -0
- package/dist/src/core/version.d.ts.map +1 -0
- package/dist/src/core/version.js +89 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/events/types.d.ts +16 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +19 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +44 -2
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +245 -10
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/repository.d.ts.map +1 -1
- package/dist/src/execute/repository.js +24 -0
- package/dist/src/execute/repository.js.map +1 -1
- package/dist/src/execute/session.d.ts +6 -1
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +60 -0
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +513 -9
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +102 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +253 -38
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/execute-passthrough.js +126 -0
- package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
- package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/review-passthrough.js +134 -0
- package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +2 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +81 -26
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/resilience/lateral.d.ts +17 -0
- package/dist/src/resilience/lateral.d.ts.map +1 -0
- package/dist/src/resilience/lateral.js +62 -0
- package/dist/src/resilience/lateral.js.map +1 -0
- package/dist/src/resilience/prompts.d.ts +5 -0
- package/dist/src/resilience/prompts.d.ts.map +1 -0
- package/dist/src/resilience/prompts.js +130 -0
- package/dist/src/resilience/prompts.js.map +1 -0
- package/dist/src/resilience/stagnation-detector.d.ts +19 -0
- package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
- package/dist/src/resilience/stagnation-detector.js +38 -0
- package/dist/src/resilience/stagnation-detector.js.map +1 -0
- package/dist/src/resilience/types.d.ts +39 -0
- package/dist/src/resilience/types.d.ts.map +1 -0
- package/dist/src/resilience/types.js +17 -0
- package/dist/src/resilience/types.js.map +1 -0
- package/dist/src/review/agent-matcher.d.ts +15 -0
- package/dist/src/review/agent-matcher.d.ts.map +1 -0
- package/dist/src/review/agent-matcher.js +61 -0
- package/dist/src/review/agent-matcher.js.map +1 -0
- package/dist/src/review/context-collector.d.ts +7 -0
- package/dist/src/review/context-collector.d.ts.map +1 -0
- package/dist/src/review/context-collector.js +44 -0
- package/dist/src/review/context-collector.js.map +1 -0
- package/dist/src/review/passthrough-engine.d.ts +53 -0
- package/dist/src/review/passthrough-engine.d.ts.map +1 -0
- package/dist/src/review/passthrough-engine.js +257 -0
- package/dist/src/review/passthrough-engine.js.map +1 -0
- package/dist/src/review/report-generator.d.ts +7 -0
- package/dist/src/review/report-generator.d.ts.map +1 -0
- package/dist/src/review/report-generator.js +82 -0
- package/dist/src/review/report-generator.js.map +1 -0
- package/dist/src/tui/components/TUIApp.d.ts +20 -0
- package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
- package/dist/src/tui/components/TUIApp.js +84 -0
- package/dist/src/tui/components/TUIApp.js.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.js +143 -0
- package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
- package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.js +132 -0
- package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
- package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
- package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DebugScreen.js +40 -0
- package/dist/src/tui/screens/DebugScreen.js.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.js +136 -0
- package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
- package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
- package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
- package/dist/src/tui/screens/HUDPanel.js +13 -0
- package/dist/src/tui/screens/HUDPanel.js.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.js +103 -0
- package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
- package/dist/src/tui/screens/LogScreen.d.ts +4 -0
- package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/LogScreen.js +83 -0
- package/dist/src/tui/screens/LogScreen.js.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.js +71 -0
- package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
- package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.js +27 -0
- package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
- package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
- package/package.json +11 -3
- package/schemas/gestalt.schema.json +98 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export function handleReviewPassthrough(reviewEngine, executeEngine, roleAgentRegistry, input) {
|
|
2
|
+
try {
|
|
3
|
+
switch (input.action) {
|
|
4
|
+
case 'review_start':
|
|
5
|
+
return handleReviewStart(reviewEngine, executeEngine, roleAgentRegistry, input);
|
|
6
|
+
case 'review_submit':
|
|
7
|
+
return handleReviewSubmit(reviewEngine, input);
|
|
8
|
+
case 'review_consensus':
|
|
9
|
+
return handleReviewConsensus(reviewEngine, input);
|
|
10
|
+
case 'review_fix':
|
|
11
|
+
return handleReviewFix(reviewEngine, input);
|
|
12
|
+
default:
|
|
13
|
+
return JSON.stringify({ error: `Unknown review action: ${input.action}` });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
return JSON.stringify({ error: e instanceof Error ? e.message : String(e) });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function handleReviewStart(reviewEngine, executeEngine, roleAgentRegistry, input) {
|
|
21
|
+
if (!input.sessionId) {
|
|
22
|
+
return JSON.stringify({ error: 'sessionId (execute session) is required for review_start' });
|
|
23
|
+
}
|
|
24
|
+
const executeSession = executeEngine.getSession(input.sessionId);
|
|
25
|
+
const roleAgents = roleAgentRegistry?.getAll() ?? [];
|
|
26
|
+
// Get review-specific agents from role agent registry (pipeline: review)
|
|
27
|
+
const allRoleAgents = roleAgentRegistry?.getAll() ?? [];
|
|
28
|
+
const reviewAgents = allRoleAgents.filter((a) => a.frontmatter.pipeline === 'review');
|
|
29
|
+
const result = reviewEngine.startReview(executeSession, roleAgents, reviewAgents);
|
|
30
|
+
if (!result.ok)
|
|
31
|
+
return JSON.stringify({ error: result.error.message });
|
|
32
|
+
const { sessionId, reviewStartContext } = result.value;
|
|
33
|
+
return JSON.stringify({
|
|
34
|
+
status: 'review_started',
|
|
35
|
+
reviewSessionId: sessionId,
|
|
36
|
+
executeSessionId: input.sessionId,
|
|
37
|
+
reviewStartContext: {
|
|
38
|
+
systemPrompt: reviewStartContext.systemPrompt,
|
|
39
|
+
reviewPrompt: reviewStartContext.reviewPrompt,
|
|
40
|
+
matchContext: reviewStartContext.matchContext,
|
|
41
|
+
changedFiles: reviewStartContext.reviewContext.changedFiles,
|
|
42
|
+
dependencyFiles: reviewStartContext.reviewContext.dependencyFiles,
|
|
43
|
+
},
|
|
44
|
+
message: 'Use matchContext to select review agents, then submit each agent\'s review with review_submit.',
|
|
45
|
+
}, null, 2);
|
|
46
|
+
}
|
|
47
|
+
function handleReviewSubmit(reviewEngine, input) {
|
|
48
|
+
if (!input.reviewSessionId) {
|
|
49
|
+
return JSON.stringify({ error: 'reviewSessionId is required for review_submit' });
|
|
50
|
+
}
|
|
51
|
+
if (!input.reviewAgentName) {
|
|
52
|
+
return JSON.stringify({ error: 'reviewAgentName is required for review_submit' });
|
|
53
|
+
}
|
|
54
|
+
if (!input.reviewResult) {
|
|
55
|
+
return JSON.stringify({ error: 'reviewResult is required for review_submit' });
|
|
56
|
+
}
|
|
57
|
+
const result = reviewEngine.submitReview(input.reviewSessionId, input.reviewAgentName, {
|
|
58
|
+
agentName: input.reviewAgentName,
|
|
59
|
+
issues: input.reviewResult.issues.map((i) => ({
|
|
60
|
+
...i,
|
|
61
|
+
reportedBy: input.reviewAgentName,
|
|
62
|
+
line: i.line,
|
|
63
|
+
})),
|
|
64
|
+
approved: input.reviewResult.approved,
|
|
65
|
+
summary: input.reviewResult.summary,
|
|
66
|
+
});
|
|
67
|
+
if (!result.ok)
|
|
68
|
+
return JSON.stringify({ error: result.error.message });
|
|
69
|
+
return JSON.stringify({
|
|
70
|
+
status: 'review_submitted',
|
|
71
|
+
reviewSessionId: input.reviewSessionId,
|
|
72
|
+
...result.value,
|
|
73
|
+
message: 'Submit more reviews or call review_consensus to merge all reviews.',
|
|
74
|
+
}, null, 2);
|
|
75
|
+
}
|
|
76
|
+
function handleReviewConsensus(reviewEngine, input) {
|
|
77
|
+
if (!input.reviewSessionId) {
|
|
78
|
+
return JSON.stringify({ error: 'reviewSessionId is required for review_consensus' });
|
|
79
|
+
}
|
|
80
|
+
if (!input.reviewConsensus) {
|
|
81
|
+
return JSON.stringify({ error: 'reviewConsensus is required for review_consensus' });
|
|
82
|
+
}
|
|
83
|
+
const result = reviewEngine.submitConsensus(input.reviewSessionId, input.reviewConsensus);
|
|
84
|
+
if (!result.ok)
|
|
85
|
+
return JSON.stringify({ error: result.error.message });
|
|
86
|
+
const { approved, report, needsFix, canFix, criticalHighCount } = result.value;
|
|
87
|
+
return JSON.stringify({
|
|
88
|
+
status: approved ? 'review_passed' : 'review_blocked',
|
|
89
|
+
reviewSessionId: input.reviewSessionId,
|
|
90
|
+
approved,
|
|
91
|
+
criticalHighCount,
|
|
92
|
+
report: report.markdown,
|
|
93
|
+
needsFix,
|
|
94
|
+
canFix,
|
|
95
|
+
message: approved
|
|
96
|
+
? 'Code review passed! All critical/high issues resolved.'
|
|
97
|
+
: canFix
|
|
98
|
+
? `${criticalHighCount} critical/high issues found. Use review_fix to auto-fix.`
|
|
99
|
+
: `${criticalHighCount} critical/high issues remain after max attempts. Review the report.`,
|
|
100
|
+
}, null, 2);
|
|
101
|
+
}
|
|
102
|
+
function handleReviewFix(reviewEngine, input) {
|
|
103
|
+
if (!input.reviewSessionId) {
|
|
104
|
+
return JSON.stringify({ error: 'reviewSessionId is required for review_fix' });
|
|
105
|
+
}
|
|
106
|
+
// If no fix result provided, start fix (return fix context)
|
|
107
|
+
const startResult = reviewEngine.startFix(input.reviewSessionId);
|
|
108
|
+
if (!startResult.ok)
|
|
109
|
+
return JSON.stringify({ error: startResult.error.message });
|
|
110
|
+
const value = startResult.value;
|
|
111
|
+
// Check if exhausted
|
|
112
|
+
if ('exhausted' in value) {
|
|
113
|
+
return JSON.stringify({
|
|
114
|
+
status: 'review_exhausted',
|
|
115
|
+
reviewSessionId: input.reviewSessionId,
|
|
116
|
+
report: value.report.markdown,
|
|
117
|
+
message: 'Max fix attempts exceeded. Review the report and fix remaining issues manually.',
|
|
118
|
+
}, null, 2);
|
|
119
|
+
}
|
|
120
|
+
// Return fix context for caller
|
|
121
|
+
return JSON.stringify({
|
|
122
|
+
status: 'review_fix_context',
|
|
123
|
+
reviewSessionId: input.reviewSessionId,
|
|
124
|
+
fixContext: {
|
|
125
|
+
systemPrompt: value.systemPrompt,
|
|
126
|
+
fixPrompt: value.fixPrompt,
|
|
127
|
+
issues: value.issues,
|
|
128
|
+
attempt: value.attempt,
|
|
129
|
+
maxAttempts: value.maxAttempts,
|
|
130
|
+
},
|
|
131
|
+
message: `Fix attempt ${value.attempt}/${value.maxAttempts}. Fix the issues and run structural checks, then call review_start to re-review.`,
|
|
132
|
+
}, null, 2);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=review-passthrough.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-passthrough.js","sourceRoot":"","sources":["../../../../src/mcp/tools/review-passthrough.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { InterviewEngine } from '../../interview/engine.js';
|
|
2
2
|
import type { StatusInput } from '../schemas.js';
|
|
3
|
-
|
|
3
|
+
import type { EventStore } from '../../events/store.js';
|
|
4
|
+
export declare function handleStatus(engine: InterviewEngine, input: StatusInput, eventStore?: EventStore): string;
|
|
4
5
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,WAAW,EAClB,UAAU,CAAC,EAAE,UAAU,GACtB,MAAM,CAkFR"}
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
import { ExecuteSessionRepository } from '../../execute/repository.js';
|
|
2
|
+
import { getVersion, getCachedUpdateResult } from '../../core/version.js';
|
|
3
|
+
export function handleStatus(engine, input, eventStore) {
|
|
4
|
+
const updateResult = getCachedUpdateResult();
|
|
5
|
+
const versionInfo = {
|
|
6
|
+
current: getVersion(),
|
|
7
|
+
latest: updateResult?.latestVersion ?? null,
|
|
8
|
+
updateAvailable: updateResult?.updateAvailable ?? false,
|
|
9
|
+
};
|
|
10
|
+
const sessionType = input.sessionType ?? 'all';
|
|
2
11
|
try {
|
|
3
12
|
if (input.sessionId) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
session
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
// Try interview first
|
|
14
|
+
try {
|
|
15
|
+
const session = engine.getSession(input.sessionId);
|
|
16
|
+
return JSON.stringify({
|
|
17
|
+
versionInfo,
|
|
18
|
+
type: 'interview',
|
|
19
|
+
session: {
|
|
20
|
+
sessionId: session.sessionId,
|
|
21
|
+
topic: session.topic,
|
|
22
|
+
status: session.status,
|
|
23
|
+
projectType: session.projectType,
|
|
24
|
+
totalRounds: session.rounds.length,
|
|
25
|
+
answeredRounds: session.rounds.filter((r) => r.userResponse).length,
|
|
26
|
+
ambiguityScore: session.ambiguityScore
|
|
27
|
+
? {
|
|
28
|
+
overall: session.ambiguityScore.overall.toFixed(2),
|
|
29
|
+
isReady: session.ambiguityScore.isReady,
|
|
30
|
+
}
|
|
31
|
+
: null,
|
|
32
|
+
createdAt: session.createdAt,
|
|
33
|
+
updatedAt: session.updatedAt,
|
|
34
|
+
},
|
|
35
|
+
}, null, 2);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Not found in interview — try execute if eventStore available
|
|
39
|
+
if (eventStore) {
|
|
40
|
+
const repo = new ExecuteSessionRepository(eventStore);
|
|
41
|
+
const execSession = repo.reconstruct(input.sessionId);
|
|
42
|
+
if (execSession) {
|
|
43
|
+
return JSON.stringify({
|
|
44
|
+
versionInfo,
|
|
45
|
+
type: 'execute',
|
|
46
|
+
session: formatExecuteSessionBasic(execSession),
|
|
47
|
+
}, null, 2);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Session not found: ${input.sessionId}`);
|
|
51
|
+
}
|
|
23
52
|
}
|
|
24
|
-
// List
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
sessions: sessions.map((s) => ({
|
|
53
|
+
// List mode
|
|
54
|
+
const interviewSessions = (sessionType === 'interview' || sessionType === 'all')
|
|
55
|
+
? engine.listSessions().map((s) => ({
|
|
28
56
|
sessionId: s.sessionId,
|
|
29
57
|
topic: s.topic,
|
|
30
58
|
status: s.status,
|
|
@@ -32,8 +60,18 @@ export function handleStatus(engine, input) {
|
|
|
32
60
|
totalRounds: s.rounds.length,
|
|
33
61
|
ambiguityScore: s.ambiguityScore?.overall.toFixed(2) ?? 'N/A',
|
|
34
62
|
createdAt: s.createdAt,
|
|
35
|
-
}))
|
|
36
|
-
|
|
63
|
+
}))
|
|
64
|
+
: [];
|
|
65
|
+
let executeSessions = [];
|
|
66
|
+
if ((sessionType === 'execute' || sessionType === 'all') && eventStore) {
|
|
67
|
+
const repo = new ExecuteSessionRepository(eventStore);
|
|
68
|
+
executeSessions = repo.reconstructAll().map(formatExecuteSessionBasic);
|
|
69
|
+
}
|
|
70
|
+
return JSON.stringify({
|
|
71
|
+
versionInfo,
|
|
72
|
+
interviewSessions,
|
|
73
|
+
executeSessions,
|
|
74
|
+
total: { interview: interviewSessions.length, execute: executeSessions.length },
|
|
37
75
|
}, null, 2);
|
|
38
76
|
}
|
|
39
77
|
catch (e) {
|
|
@@ -42,4 +80,21 @@ export function handleStatus(engine, input) {
|
|
|
42
80
|
}, null, 2);
|
|
43
81
|
}
|
|
44
82
|
}
|
|
83
|
+
function formatExecuteSessionBasic(session) {
|
|
84
|
+
const totalTasks = session.executionPlan?.atomicTasks.length ?? 0;
|
|
85
|
+
const completedTasks = session.taskResults.filter((t) => t.status === 'completed').length;
|
|
86
|
+
return {
|
|
87
|
+
sessionId: session.sessionId,
|
|
88
|
+
specId: session.specId,
|
|
89
|
+
status: session.status,
|
|
90
|
+
goal: session.spec.goal,
|
|
91
|
+
taskProgress: totalTasks > 0 ? `${completedTasks}/${totalTasks}` : null,
|
|
92
|
+
evaluationScore: session.evaluationResult?.overallScore ?? null,
|
|
93
|
+
goalAlignment: session.evaluationResult?.goalAlignment ?? null,
|
|
94
|
+
currentGeneration: session.currentGeneration,
|
|
95
|
+
terminationReason: session.terminationReason ?? null,
|
|
96
|
+
createdAt: session.createdAt,
|
|
97
|
+
updatedAt: session.updatedAt,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
45
100
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAC1B,MAAuB,EACvB,KAAkB;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Spec, EvaluationResult, EvolutionGeneration } from '../core/types.js';
|
|
2
|
+
import type { StagnationPattern, LateralPersonaName, LateralContext, EscalationContext } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* pattern에 매핑된 1순위 persona를 먼저 시도하고,
|
|
5
|
+
* 이미 시도했으면 나머지 중 미시도 persona를 순서대로 반환.
|
|
6
|
+
* 모두 소진되면 null.
|
|
7
|
+
*/
|
|
8
|
+
export declare function suggestPersona(pattern: StagnationPattern, triedPersonas: LateralPersonaName[]): LateralPersonaName | null;
|
|
9
|
+
/**
|
|
10
|
+
* LateralContext 조립
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildLateralContext(persona: LateralPersonaName, pattern: StagnationPattern, spec: Spec, evaluationResult: EvaluationResult, evolutionHistory: EvolutionGeneration[], attemptNumber: number): LateralContext;
|
|
13
|
+
/**
|
|
14
|
+
* EscalationContext 조립 — 모든 persona 소진 시 호출
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildEscalationContext(triedPersonas: LateralPersonaName[], evaluationResult: EvaluationResult, evolutionHistory: EvolutionGeneration[]): EscalationContext;
|
|
17
|
+
//# sourceMappingURL=lateral.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lateral.d.ts","sourceRoot":"","sources":["../../../src/resilience/lateral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAOpB;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,iBAAiB,EAC1B,aAAa,EAAE,kBAAkB,EAAE,GAClC,kBAAkB,GAAG,IAAI,CAiB3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,mBAAmB,EAAE,EACvC,aAAa,EAAE,MAAM,GACpB,cAAc,CAkBhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,kBAAkB,EAAE,EACnC,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,mBAAmB,EAAE,GACtC,iBAAiB,CAoBnB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { STAGNATION_PERSONA_MAP } from './types.js';
|
|
2
|
+
import { getLateralSystemPrompt, buildLateralPrompt } from './prompts.js';
|
|
3
|
+
/** 모든 persona 이름 (순회 순서) */
|
|
4
|
+
const ALL_PERSONAS = ['multistability', 'simplicity', 'reification', 'invariance'];
|
|
5
|
+
/**
|
|
6
|
+
* pattern에 매핑된 1순위 persona를 먼저 시도하고,
|
|
7
|
+
* 이미 시도했으면 나머지 중 미시도 persona를 순서대로 반환.
|
|
8
|
+
* 모두 소진되면 null.
|
|
9
|
+
*/
|
|
10
|
+
export function suggestPersona(pattern, triedPersonas) {
|
|
11
|
+
const tried = new Set(triedPersonas);
|
|
12
|
+
// 1순위: pattern에 매핑된 persona
|
|
13
|
+
const primary = STAGNATION_PERSONA_MAP[pattern];
|
|
14
|
+
if (!tried.has(primary)) {
|
|
15
|
+
return primary;
|
|
16
|
+
}
|
|
17
|
+
// 2순위: 나머지 중 미시도
|
|
18
|
+
for (const persona of ALL_PERSONAS) {
|
|
19
|
+
if (!tried.has(persona)) {
|
|
20
|
+
return persona;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* LateralContext 조립
|
|
27
|
+
*/
|
|
28
|
+
export function buildLateralContext(persona, pattern, spec, evaluationResult, evolutionHistory, attemptNumber) {
|
|
29
|
+
return {
|
|
30
|
+
systemPrompt: getLateralSystemPrompt(persona),
|
|
31
|
+
lateralPrompt: buildLateralPrompt(persona, pattern, spec, evaluationResult, evolutionHistory, attemptNumber),
|
|
32
|
+
phase: 'evolving',
|
|
33
|
+
stage: 'lateral',
|
|
34
|
+
persona,
|
|
35
|
+
pattern,
|
|
36
|
+
attemptNumber,
|
|
37
|
+
previousScores: evolutionHistory.map((g) => g.evaluationScore),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* EscalationContext 조립 — 모든 persona 소진 시 호출
|
|
42
|
+
*/
|
|
43
|
+
export function buildEscalationContext(triedPersonas, evaluationResult, evolutionHistory) {
|
|
44
|
+
const scores = evolutionHistory.map((g) => g.evaluationScore);
|
|
45
|
+
const bestScore = scores.length > 0 ? Math.max(...scores) : evaluationResult.overallScore;
|
|
46
|
+
const unsatisfiedACs = evaluationResult.verifications
|
|
47
|
+
.filter((v) => !v.satisfied)
|
|
48
|
+
.map((v) => `AC[${v.acIndex}]: ${v.gaps.join(', ')}`);
|
|
49
|
+
return {
|
|
50
|
+
phase: 'evolving',
|
|
51
|
+
stage: 'human_escalation',
|
|
52
|
+
message: `All ${triedPersonas.length} lateral thinking personas have been exhausted without reaching the success threshold. Human intervention is required.`,
|
|
53
|
+
triedPersonas,
|
|
54
|
+
bestScore,
|
|
55
|
+
lastEvaluationResult: evaluationResult,
|
|
56
|
+
suggestions: [
|
|
57
|
+
...evaluationResult.recommendations,
|
|
58
|
+
...unsatisfiedACs.map((ac) => `Unresolved: ${ac}`),
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=lateral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lateral.js","sourceRoot":"","sources":["../../../src/resilience/lateral.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1E,4BAA4B;AAC5B,MAAM,YAAY,GAAyB,CAAC,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AAEzG;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,aAAmC;IAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAErC,4BAA4B;IAC5B,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,iBAAiB;IACjB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA2B,EAC3B,OAA0B,EAC1B,IAAU,EACV,gBAAkC,EAClC,gBAAuC,EACvC,aAAqB;IAErB,OAAO;QACL,YAAY,EAAE,sBAAsB,CAAC,OAAO,CAAC;QAC7C,aAAa,EAAE,kBAAkB,CAC/B,OAAO,EACP,OAAO,EACP,IAAI,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,CACd;QACD,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO;QACP,OAAO;QACP,aAAa;QACb,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,aAAmC,EACnC,gBAAkC,EAClC,gBAAuC;IAEvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAE1F,MAAM,cAAc,GAAG,gBAAgB,CAAC,aAAa;SAClD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAExD,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,kBAAkB;QACzB,OAAO,EAAE,OAAO,aAAa,CAAC,MAAM,wHAAwH;QAC5J,aAAa;QACb,SAAS;QACT,oBAAoB,EAAE,gBAAgB;QACtC,WAAW,EAAE;YACX,GAAG,gBAAgB,CAAC,eAAe;YACnC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;SACnD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Spec, EvaluationResult, EvolutionGeneration } from '../core/types.js';
|
|
2
|
+
import type { LateralPersonaName, StagnationPattern } from './types.js';
|
|
3
|
+
export declare function getLateralSystemPrompt(persona: LateralPersonaName): string;
|
|
4
|
+
export declare function buildLateralPrompt(persona: LateralPersonaName, pattern: StagnationPattern, spec: Spec, evaluationResult: EvaluationResult, evolutionHistory: EvolutionGeneration[], attemptNumber: number): string;
|
|
5
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/resilience/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoExE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAE1E;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,mBAAmB,EAAE,EACvC,aAAa,EAAE,MAAM,GACpB,MAAM,CAqER"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// ─── Persona System Prompts ────────────────────────────────────
|
|
2
|
+
const PERSONA_SYSTEM_PROMPTS = {
|
|
3
|
+
multistability: `You are Multistability — a Gestalt-inspired lateral thinker who sees the Necker Cube effect in requirements. When a system is stuck spinning at hard capacity, you flip the perceptual frame entirely.
|
|
4
|
+
|
|
5
|
+
## Your Strategy: Perspective Inversion
|
|
6
|
+
- Reframe the problem from a completely different angle
|
|
7
|
+
- What if the current "figure" requirements become "ground" and vice versa?
|
|
8
|
+
- Challenge the implicit assumptions baked into the current AC structure
|
|
9
|
+
- Look for hidden constraint interactions that block progress
|
|
10
|
+
- Consider: Is the goal being pursued from the wrong direction?
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
1. Generate a SpecPatch that reframes (not just tweaks) the approach
|
|
14
|
+
2. Respect patch scope: L1(AC) + L2(constraints) free, L3(ontology) add/modify only, L4(goal) FORBIDDEN
|
|
15
|
+
3. Your patch should break the deadlock by offering an alternative path to the same goal
|
|
16
|
+
4. Respond with ONLY a JSON object matching the specified schema`,
|
|
17
|
+
simplicity: `You are Simplicity — a Gestalt-inspired lateral thinker guided by Prägnanz (the law of good form). When a system oscillates between approaches, you converge toward the simplest viable solution.
|
|
18
|
+
|
|
19
|
+
## Your Strategy: Simplification & Convergence
|
|
20
|
+
- Identify the oscillation pattern: what two states is the system bouncing between?
|
|
21
|
+
- Find the simpler middle ground that satisfies both
|
|
22
|
+
- Remove over-specified or conflicting acceptance criteria
|
|
23
|
+
- Reduce constraints to their essential minimum
|
|
24
|
+
- Apply Occam's razor: the simplest solution that satisfies the goal
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
1. Generate a SpecPatch that simplifies rather than adds complexity
|
|
28
|
+
2. Respect patch scope: L1(AC) + L2(constraints) free, L3(ontology) add/modify only, L4(goal) FORBIDDEN
|
|
29
|
+
3. Prefer removing or merging ACs over adding new ones
|
|
30
|
+
4. Respond with ONLY a JSON object matching the specified schema`,
|
|
31
|
+
reification: `You are Reification — a Gestalt-inspired lateral thinker who perceives structure where none is explicitly shown. When a system shows no drift (zero progress), you construct the missing scaffolding.
|
|
32
|
+
|
|
33
|
+
## Your Strategy: Missing Structure Construction
|
|
34
|
+
- The system isn't moving because something essential is missing from the spec
|
|
35
|
+
- Look for implicit requirements that bridge existing ACs
|
|
36
|
+
- Identify missing entities or relations in the ontology
|
|
37
|
+
- Add intermediate acceptance criteria that create stepping stones
|
|
38
|
+
- Fill the "closure gap" — what would make the spec feel complete?
|
|
39
|
+
|
|
40
|
+
## Rules
|
|
41
|
+
1. Generate a SpecPatch that adds missing structure to unblock progress
|
|
42
|
+
2. Respect patch scope: L1(AC) + L2(constraints) free, L3(ontology) add/modify only, L4(goal) FORBIDDEN
|
|
43
|
+
3. Focus on adding bridging elements, not replacing existing ones
|
|
44
|
+
4. Respond with ONLY a JSON object matching the specified schema`,
|
|
45
|
+
invariance: `You are Invariance — a Gestalt-inspired lateral thinker who recognizes stable structure beneath surface changes. When progress diminishes, you identify the invariant core and rebuild around it.
|
|
46
|
+
|
|
47
|
+
## Your Strategy: Invariant Core Recognition
|
|
48
|
+
- Identify what IS working (the stable, satisfied parts)
|
|
49
|
+
- Recognize the structural pattern that successful ACs share
|
|
50
|
+
- Restructure the failing ACs to follow the same invariant pattern
|
|
51
|
+
- The diminishing returns signal that surface changes aren't enough — find the deeper structure
|
|
52
|
+
- Preserve what's proven, transform what's stuck
|
|
53
|
+
|
|
54
|
+
## Rules
|
|
55
|
+
1. Generate a SpecPatch that restructures failing parts to match the invariant pattern of successes
|
|
56
|
+
2. Respect patch scope: L1(AC) + L2(constraints) free, L3(ontology) add/modify only, L4(goal) FORBIDDEN
|
|
57
|
+
3. Explicitly reference the successful patterns you're extending
|
|
58
|
+
4. Respond with ONLY a JSON object matching the specified schema`,
|
|
59
|
+
};
|
|
60
|
+
// ─── Lateral Prompt Builder ────────────────────────────────────
|
|
61
|
+
export function getLateralSystemPrompt(persona) {
|
|
62
|
+
return PERSONA_SYSTEM_PROMPTS[persona];
|
|
63
|
+
}
|
|
64
|
+
export function buildLateralPrompt(persona, pattern, spec, evaluationResult, evolutionHistory, attemptNumber) {
|
|
65
|
+
const unsatisfied = evaluationResult.verifications
|
|
66
|
+
.filter((v) => !v.satisfied)
|
|
67
|
+
.map((v) => ` [${v.acIndex}] ${spec.acceptanceCriteria[v.acIndex] ?? 'N/A'}\n gaps: ${v.gaps.join('; ')}`)
|
|
68
|
+
.join('\n');
|
|
69
|
+
const satisfied = evaluationResult.verifications
|
|
70
|
+
.filter((v) => v.satisfied)
|
|
71
|
+
.map((v) => ` [${v.acIndex}] ${spec.acceptanceCriteria[v.acIndex] ?? 'N/A'}`)
|
|
72
|
+
.join('\n');
|
|
73
|
+
const historySummary = evolutionHistory.length > 0
|
|
74
|
+
? evolutionHistory
|
|
75
|
+
.map((g) => ` Gen ${g.generation}: score=${g.evaluationScore.toFixed(2)}, goalAlign=${g.goalAlignment.toFixed(2)}, delta=[${g.delta.fieldsChanged.join(', ')}]`)
|
|
76
|
+
.join('\n')
|
|
77
|
+
: ' (none)';
|
|
78
|
+
const patternDescription = {
|
|
79
|
+
spinning: 'The system has hit a hard cap — multiple evolution attempts have not converged. A fundamentally different approach is needed.',
|
|
80
|
+
oscillation: 'The system is oscillating between states — scores go up then down repeatedly. Convergence to a stable solution is needed.',
|
|
81
|
+
no_drift: 'The system shows zero progress — score changes are negligible. Something essential is missing from the spec.',
|
|
82
|
+
diminishing_returns: 'Progress is diminishing — each iteration yields less improvement. The current approach may have a structural ceiling.',
|
|
83
|
+
};
|
|
84
|
+
return `## Lateral Thinking — ${persona.charAt(0).toUpperCase() + persona.slice(1)} Persona (Attempt ${attemptNumber}/4)
|
|
85
|
+
|
|
86
|
+
**Stagnation Pattern**: ${pattern}
|
|
87
|
+
${patternDescription[pattern]}
|
|
88
|
+
|
|
89
|
+
**Spec Goal** (IMMUTABLE): ${spec.goal}
|
|
90
|
+
|
|
91
|
+
**Current Constraints**: ${spec.constraints.map((c, i) => `\n [${i}] ${c}`).join('')}
|
|
92
|
+
|
|
93
|
+
**Current Acceptance Criteria**: ${spec.acceptanceCriteria.map((ac, i) => `\n [${i}] ${ac}`).join('')}
|
|
94
|
+
|
|
95
|
+
**Current Ontology**:
|
|
96
|
+
- Entities: ${spec.ontologySchema.entities.map((e) => `${e.name} (${e.attributes.join(', ')})`).join('; ')}
|
|
97
|
+
- Relations: ${spec.ontologySchema.relations.map((r) => `${r.from}→${r.to}[${r.type}]`).join(', ')}
|
|
98
|
+
|
|
99
|
+
**Satisfied Criteria**:
|
|
100
|
+
${satisfied || ' (none)'}
|
|
101
|
+
|
|
102
|
+
**Unsatisfied Criteria**:
|
|
103
|
+
${unsatisfied || ' (none)'}
|
|
104
|
+
|
|
105
|
+
**Evaluation Score**: ${evaluationResult.overallScore.toFixed(2)} | **Goal Alignment**: ${evaluationResult.goalAlignment.toFixed(2)}
|
|
106
|
+
**Recommendations**: ${evaluationResult.recommendations.join('; ')}
|
|
107
|
+
|
|
108
|
+
**Evolution History** (${evolutionHistory.length} generations):
|
|
109
|
+
${historySummary}
|
|
110
|
+
|
|
111
|
+
Apply your lateral thinking strategy and generate a Spec patch. Respond with ONLY a JSON object:
|
|
112
|
+
{
|
|
113
|
+
"specPatch": {
|
|
114
|
+
"acceptanceCriteria": ["updated AC list if changed"],
|
|
115
|
+
"constraints": ["updated constraints if changed"],
|
|
116
|
+
"ontologySchema": {
|
|
117
|
+
"entities": [{"name": "...", "description": "...", "attributes": ["..."]}],
|
|
118
|
+
"relations": [{"from": "...", "to": "...", "type": "..."}]
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"description": "Brief explanation of your lateral thinking approach and what you changed"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
Rules:
|
|
125
|
+
- Only include specPatch fields that need to change
|
|
126
|
+
- acceptanceCriteria/constraints: provide the FULL list (not just additions)
|
|
127
|
+
- ontologySchema: must include ALL existing entities/relations + any new ones
|
|
128
|
+
- Your approach MUST differ from previous evolution attempts`;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/resilience/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EvolutionGeneration, TerminationCondition } from '../core/types.js';
|
|
2
|
+
import type { StagnationPattern } from './types.js';
|
|
3
|
+
interface ClassifyInput {
|
|
4
|
+
evolutionHistory: EvolutionGeneration[];
|
|
5
|
+
currentScore: number;
|
|
6
|
+
termination: TerminationCondition;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Stagnation Detector — termination 사유를 세분화된 StagnationPattern으로 분류한다.
|
|
10
|
+
*
|
|
11
|
+
* - hard_cap → spinning (다른 각도로 보기)
|
|
12
|
+
* - oscillation → oscillation (단순하게 줄이기)
|
|
13
|
+
* - stagnation → score delta 패턴 분석:
|
|
14
|
+
* - delta가 점점 줄어드는 패턴 → diminishing_returns
|
|
15
|
+
* - delta가 거의 0 → no_drift
|
|
16
|
+
*/
|
|
17
|
+
export declare function classifyStagnation(input: ClassifyInput): StagnationPattern;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=stagnation-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagnation-detector.d.ts","sourceRoot":"","sources":["../../../src/resilience/stagnation-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,UAAU,aAAa;IACrB,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAmC1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stagnation Detector — termination 사유를 세분화된 StagnationPattern으로 분류한다.
|
|
3
|
+
*
|
|
4
|
+
* - hard_cap → spinning (다른 각도로 보기)
|
|
5
|
+
* - oscillation → oscillation (단순하게 줄이기)
|
|
6
|
+
* - stagnation → score delta 패턴 분석:
|
|
7
|
+
* - delta가 점점 줄어드는 패턴 → diminishing_returns
|
|
8
|
+
* - delta가 거의 0 → no_drift
|
|
9
|
+
*/
|
|
10
|
+
export function classifyStagnation(input) {
|
|
11
|
+
const { evolutionHistory, termination } = input;
|
|
12
|
+
if (termination.hardCapReached) {
|
|
13
|
+
return 'spinning';
|
|
14
|
+
}
|
|
15
|
+
if (termination.oscillationDetected) {
|
|
16
|
+
return 'oscillation';
|
|
17
|
+
}
|
|
18
|
+
// stagnation → delta 패턴 분석
|
|
19
|
+
if (termination.stagnationDetected && evolutionHistory.length >= 2) {
|
|
20
|
+
const deltas = [];
|
|
21
|
+
const scores = termination.scoreHistory;
|
|
22
|
+
for (let i = 1; i < scores.length; i++) {
|
|
23
|
+
deltas.push(Math.abs(scores[i] - scores[i - 1]));
|
|
24
|
+
}
|
|
25
|
+
if (deltas.length >= 2) {
|
|
26
|
+
// delta가 줄어드는 추세인지 확인 (마지막 2개 비교)
|
|
27
|
+
const lastDelta = deltas[deltas.length - 1];
|
|
28
|
+
const prevDelta = deltas[deltas.length - 2];
|
|
29
|
+
if (prevDelta > lastDelta && prevDelta > 0.001) {
|
|
30
|
+
return 'diminishing_returns';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return 'no_drift';
|
|
34
|
+
}
|
|
35
|
+
// fallback: hard_cap가 아닌 reason이더라도 spinning으로 분류
|
|
36
|
+
return 'spinning';
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=stagnation-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagnation-detector.js","sourceRoot":"","sources":["../../../src/resilience/stagnation-detector.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEhD,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,2BAA2B;IAC3B,IAAI,WAAW,CAAC,kBAAkB,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,kCAAkC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;YAE7C,IAAI,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;gBAC/C,OAAO,qBAAqB,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,kDAAkD;IAClD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|