@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.
Files changed (218) hide show
  1. package/CLAUDE.md +175 -6
  2. package/README.md +381 -14
  3. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
  4. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
  5. package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
  6. package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
  7. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
  8. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
  9. package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
  10. package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
  11. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
  12. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
  13. package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
  14. package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
  15. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
  16. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
  17. package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
  18. package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
  19. package/dist/benchmarks/types.d.ts +148 -0
  20. package/dist/benchmarks/types.d.ts.map +1 -0
  21. package/dist/benchmarks/types.js +2 -0
  22. package/dist/benchmarks/types.js.map +1 -0
  23. package/dist/package.json +61 -0
  24. package/dist/schemas/gestalt.schema.json +98 -0
  25. package/dist/src/agent/parser.d.ts.map +1 -1
  26. package/dist/src/agent/parser.js +2 -0
  27. package/dist/src/agent/parser.js.map +1 -1
  28. package/dist/src/agent/passthrough-generator.d.ts +27 -0
  29. package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
  30. package/dist/src/agent/passthrough-generator.js +133 -0
  31. package/dist/src/agent/passthrough-generator.js.map +1 -0
  32. package/dist/src/agent/registry.d.ts +1 -0
  33. package/dist/src/agent/registry.d.ts.map +1 -1
  34. package/dist/src/agent/registry.js +4 -1
  35. package/dist/src/agent/registry.js.map +1 -1
  36. package/dist/src/agent/role-agent-registry.d.ts +18 -0
  37. package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
  38. package/dist/src/agent/role-agent-registry.js +62 -0
  39. package/dist/src/agent/role-agent-registry.js.map +1 -0
  40. package/dist/src/agent/role-consensus-engine.d.ts +9 -0
  41. package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
  42. package/dist/src/agent/role-consensus-engine.js +35 -0
  43. package/dist/src/agent/role-consensus-engine.js.map +1 -0
  44. package/dist/src/agent/role-match-engine.d.ts +14 -0
  45. package/dist/src/agent/role-match-engine.d.ts.map +1 -0
  46. package/dist/src/agent/role-match-engine.js +46 -0
  47. package/dist/src/agent/role-match-engine.js.map +1 -0
  48. package/dist/src/agent/role-prompt-generator.d.ts +10 -0
  49. package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
  50. package/dist/src/agent/role-prompt-generator.js +22 -0
  51. package/dist/src/agent/role-prompt-generator.js.map +1 -0
  52. package/dist/src/cli/commands/interview.js +2 -2
  53. package/dist/src/cli/commands/interview.js.map +1 -1
  54. package/dist/src/cli/commands/monitor.d.ts +2 -0
  55. package/dist/src/cli/commands/monitor.d.ts.map +1 -0
  56. package/dist/src/cli/commands/monitor.js +13 -0
  57. package/dist/src/cli/commands/monitor.js.map +1 -0
  58. package/dist/src/cli/commands/setup.d.ts +2 -0
  59. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  60. package/dist/src/cli/commands/setup.js +20 -0
  61. package/dist/src/cli/commands/setup.js.map +1 -0
  62. package/dist/src/cli/commands/spec.js +2 -2
  63. package/dist/src/cli/commands/spec.js.map +1 -1
  64. package/dist/src/cli/commands/status.d.ts.map +1 -1
  65. package/dist/src/cli/commands/status.js +3 -3
  66. package/dist/src/cli/commands/status.js.map +1 -1
  67. package/dist/src/cli/index.d.ts.map +1 -1
  68. package/dist/src/cli/index.js +16 -1
  69. package/dist/src/cli/index.js.map +1 -1
  70. package/dist/src/core/config.d.ts +80 -17
  71. package/dist/src/core/config.d.ts.map +1 -1
  72. package/dist/src/core/config.js +141 -31
  73. package/dist/src/core/config.js.map +1 -1
  74. package/dist/src/core/constants.d.ts +2 -2
  75. package/dist/src/core/constants.d.ts.map +1 -1
  76. package/dist/src/core/constants.js +2 -2
  77. package/dist/src/core/constants.js.map +1 -1
  78. package/dist/src/core/errors.d.ts +3 -0
  79. package/dist/src/core/errors.d.ts.map +1 -1
  80. package/dist/src/core/errors.js +6 -0
  81. package/dist/src/core/errors.js.map +1 -1
  82. package/dist/src/core/types.d.ts +83 -3
  83. package/dist/src/core/types.d.ts.map +1 -1
  84. package/dist/src/core/version.d.ts +10 -0
  85. package/dist/src/core/version.d.ts.map +1 -0
  86. package/dist/src/core/version.js +89 -0
  87. package/dist/src/core/version.js.map +1 -0
  88. package/dist/src/events/types.d.ts +16 -1
  89. package/dist/src/events/types.d.ts.map +1 -1
  90. package/dist/src/events/types.js +19 -0
  91. package/dist/src/events/types.js.map +1 -1
  92. package/dist/src/execute/passthrough-engine.d.ts +44 -2
  93. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  94. package/dist/src/execute/passthrough-engine.js +245 -10
  95. package/dist/src/execute/passthrough-engine.js.map +1 -1
  96. package/dist/src/execute/repository.d.ts.map +1 -1
  97. package/dist/src/execute/repository.js +24 -0
  98. package/dist/src/execute/repository.js.map +1 -1
  99. package/dist/src/execute/session.d.ts +6 -1
  100. package/dist/src/execute/session.d.ts.map +1 -1
  101. package/dist/src/execute/session.js +60 -0
  102. package/dist/src/execute/session.js.map +1 -1
  103. package/dist/src/mcp/schemas.d.ts +513 -9
  104. package/dist/src/mcp/schemas.d.ts.map +1 -1
  105. package/dist/src/mcp/schemas.js +102 -0
  106. package/dist/src/mcp/schemas.js.map +1 -1
  107. package/dist/src/mcp/server.d.ts.map +1 -1
  108. package/dist/src/mcp/server.js +253 -38
  109. package/dist/src/mcp/server.js.map +1 -1
  110. package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
  111. package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
  112. package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
  113. package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
  114. package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
  115. package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
  116. package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
  117. package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
  118. package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
  119. package/dist/src/mcp/tools/execute-passthrough.js +126 -0
  120. package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
  121. package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
  122. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
  123. package/dist/src/mcp/tools/review-passthrough.js +134 -0
  124. package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
  125. package/dist/src/mcp/tools/status.d.ts +2 -1
  126. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  127. package/dist/src/mcp/tools/status.js +81 -26
  128. package/dist/src/mcp/tools/status.js.map +1 -1
  129. package/dist/src/resilience/lateral.d.ts +17 -0
  130. package/dist/src/resilience/lateral.d.ts.map +1 -0
  131. package/dist/src/resilience/lateral.js +62 -0
  132. package/dist/src/resilience/lateral.js.map +1 -0
  133. package/dist/src/resilience/prompts.d.ts +5 -0
  134. package/dist/src/resilience/prompts.d.ts.map +1 -0
  135. package/dist/src/resilience/prompts.js +130 -0
  136. package/dist/src/resilience/prompts.js.map +1 -0
  137. package/dist/src/resilience/stagnation-detector.d.ts +19 -0
  138. package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
  139. package/dist/src/resilience/stagnation-detector.js +38 -0
  140. package/dist/src/resilience/stagnation-detector.js.map +1 -0
  141. package/dist/src/resilience/types.d.ts +39 -0
  142. package/dist/src/resilience/types.d.ts.map +1 -0
  143. package/dist/src/resilience/types.js +17 -0
  144. package/dist/src/resilience/types.js.map +1 -0
  145. package/dist/src/review/agent-matcher.d.ts +15 -0
  146. package/dist/src/review/agent-matcher.d.ts.map +1 -0
  147. package/dist/src/review/agent-matcher.js +61 -0
  148. package/dist/src/review/agent-matcher.js.map +1 -0
  149. package/dist/src/review/context-collector.d.ts +7 -0
  150. package/dist/src/review/context-collector.d.ts.map +1 -0
  151. package/dist/src/review/context-collector.js +44 -0
  152. package/dist/src/review/context-collector.js.map +1 -0
  153. package/dist/src/review/passthrough-engine.d.ts +53 -0
  154. package/dist/src/review/passthrough-engine.d.ts.map +1 -0
  155. package/dist/src/review/passthrough-engine.js +257 -0
  156. package/dist/src/review/passthrough-engine.js.map +1 -0
  157. package/dist/src/review/report-generator.d.ts +7 -0
  158. package/dist/src/review/report-generator.d.ts.map +1 -0
  159. package/dist/src/review/report-generator.js +82 -0
  160. package/dist/src/review/report-generator.js.map +1 -0
  161. package/dist/src/tui/components/TUIApp.d.ts +20 -0
  162. package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
  163. package/dist/src/tui/components/TUIApp.js +84 -0
  164. package/dist/src/tui/components/TUIApp.js.map +1 -0
  165. package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
  166. package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
  167. package/dist/src/tui/hooks/event-store-reader.js +143 -0
  168. package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
  169. package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
  170. package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
  171. package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
  172. package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
  173. package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
  174. package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
  175. package/dist/src/tui/screens/DashboardScreen.js +132 -0
  176. package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
  177. package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
  178. package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
  179. package/dist/src/tui/screens/DebugScreen.js +40 -0
  180. package/dist/src/tui/screens/DebugScreen.js.map +1 -0
  181. package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
  182. package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
  183. package/dist/src/tui/screens/EvolutionScreen.js +136 -0
  184. package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
  185. package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
  186. package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
  187. package/dist/src/tui/screens/HUDPanel.js +13 -0
  188. package/dist/src/tui/screens/HUDPanel.js.map +1 -0
  189. package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
  190. package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
  191. package/dist/src/tui/screens/InterviewScreen.js +103 -0
  192. package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
  193. package/dist/src/tui/screens/LogScreen.d.ts +4 -0
  194. package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
  195. package/dist/src/tui/screens/LogScreen.js +83 -0
  196. package/dist/src/tui/screens/LogScreen.js.map +1 -0
  197. package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
  198. package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
  199. package/dist/src/tui/screens/SessionListScreen.js +71 -0
  200. package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
  201. package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
  202. package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
  203. package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
  204. package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
  205. package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
  206. package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
  207. package/dist/src/tui/widgets/DriftMeter.js +27 -0
  208. package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
  209. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
  210. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
  211. package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
  212. package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
  213. package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
  214. package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
  215. package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
  216. package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
  217. package/package.json +11 -3
  218. 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
- export declare function handleStatus(engine: InterviewEngine, input: StatusInput): string;
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;AAEjD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,WAAW,GACjB,MAAM,CA2CR"}
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
- export function handleStatus(engine, input) {
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
- const session = engine.getSession(input.sessionId);
5
- return JSON.stringify({
6
- session: {
7
- sessionId: session.sessionId,
8
- topic: session.topic,
9
- status: session.status,
10
- projectType: session.projectType,
11
- totalRounds: session.rounds.length,
12
- answeredRounds: session.rounds.filter((r) => r.userResponse).length,
13
- ambiguityScore: session.ambiguityScore
14
- ? {
15
- overall: session.ambiguityScore.overall.toFixed(2),
16
- isReady: session.ambiguityScore.isReady,
17
- }
18
- : null,
19
- createdAt: session.createdAt,
20
- updatedAt: session.updatedAt,
21
- },
22
- }, null, 2);
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 all sessions
25
- const sessions = engine.listSessions();
26
- return JSON.stringify({
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
- total: sessions.length,
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;IAElB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE;oBACP,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;oBAClC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM;oBACnE,cAAc,EAAE,OAAO,CAAC,cAAc;wBACpC,CAAC,CAAC;4BACE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;4BAClD,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,OAAO;yBACxC;wBACH,CAAC,CAAC,IAAI;oBACR,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B;aACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACd,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;gBAC5B,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK;gBAC7D,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,KAAK,EAAE,QAAQ,CAAC,MAAM;SACvB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SAClD,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,CAAC;AACH,CAAC"}
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"}