@tienne/gestalt 0.15.1 → 0.16.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 (57) hide show
  1. package/CLAUDE.md +2 -2
  2. package/README.ko.md +4 -0
  3. package/README.md +4 -0
  4. package/dist/package.json +1 -1
  5. package/dist/src/cli/commands/init.d.ts.map +1 -1
  6. package/dist/src/cli/commands/init.js +37 -15
  7. package/dist/src/cli/commands/init.js.map +1 -1
  8. package/dist/src/core/errors.d.ts +4 -2
  9. package/dist/src/core/errors.d.ts.map +1 -1
  10. package/dist/src/core/errors.js +14 -5
  11. package/dist/src/core/errors.js.map +1 -1
  12. package/dist/src/core/types.d.ts +15 -0
  13. package/dist/src/core/types.d.ts.map +1 -1
  14. package/dist/src/execute/drift-detector.d.ts.map +1 -1
  15. package/dist/src/execute/drift-detector.js +18 -1
  16. package/dist/src/execute/drift-detector.js.map +1 -1
  17. package/dist/src/execute/orchestrators/evaluation.d.ts +27 -0
  18. package/dist/src/execute/orchestrators/evaluation.d.ts.map +1 -0
  19. package/dist/src/execute/orchestrators/evaluation.js +169 -0
  20. package/dist/src/execute/orchestrators/evaluation.js.map +1 -0
  21. package/dist/src/execute/orchestrators/evolution.d.ts +50 -0
  22. package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -0
  23. package/dist/src/execute/orchestrators/evolution.js +391 -0
  24. package/dist/src/execute/orchestrators/evolution.js.map +1 -0
  25. package/dist/src/execute/orchestrators/execution.d.ts +38 -0
  26. package/dist/src/execute/orchestrators/execution.d.ts.map +1 -0
  27. package/dist/src/execute/orchestrators/execution.js +328 -0
  28. package/dist/src/execute/orchestrators/execution.js.map +1 -0
  29. package/dist/src/execute/orchestrators/planning.d.ts +26 -0
  30. package/dist/src/execute/orchestrators/planning.d.ts.map +1 -0
  31. package/dist/src/execute/orchestrators/planning.js +269 -0
  32. package/dist/src/execute/orchestrators/planning.js.map +1 -0
  33. package/dist/src/execute/orchestrators/types.d.ts +137 -0
  34. package/dist/src/execute/orchestrators/types.d.ts.map +1 -0
  35. package/dist/src/execute/orchestrators/types.js +2 -0
  36. package/dist/src/execute/orchestrators/types.js.map +1 -0
  37. package/dist/src/execute/passthrough-engine.d.ts +9 -201
  38. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  39. package/dist/src/execute/passthrough-engine.js +37 -1075
  40. package/dist/src/execute/passthrough-engine.js.map +1 -1
  41. package/dist/src/gestalt/analyzer.d.ts.map +1 -1
  42. package/dist/src/gestalt/analyzer.js +10 -0
  43. package/dist/src/gestalt/analyzer.js.map +1 -1
  44. package/dist/src/mcp/schemas.d.ts +6 -0
  45. package/dist/src/mcp/schemas.d.ts.map +1 -1
  46. package/dist/src/mcp/schemas.js +11 -0
  47. package/dist/src/mcp/schemas.js.map +1 -1
  48. package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
  49. package/dist/src/mcp/tools/execute-passthrough.js +197 -5
  50. package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
  51. package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -1
  52. package/dist/src/mcp/tools/spec-passthrough.js +16 -2
  53. package/dist/src/mcp/tools/spec-passthrough.js.map +1 -1
  54. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  55. package/dist/src/mcp/tools/status.js +29 -2
  56. package/dist/src/mcp/tools/status.js.map +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,328 @@
1
+ import { ExecuteError, ExecuteSessionNotFoundError, TaskExecutionError, } from '../../core/errors.js';
2
+ import { ok, err } from '../../core/result.js';
3
+ import { EXECUTION_PRINCIPLE_STRATEGY } from '../../core/constants.js';
4
+ import { GestaltPrinciple } from '../../core/types.js';
5
+ import { EventType } from '../../events/types.js';
6
+ import { EXECUTE_EXECUTION_SYSTEM_PROMPT, buildTaskExecutionPrompt, buildDriftRetrospectivePrompt, } from '../prompts.js';
7
+ import { measureDrift } from '../drift-detector.js';
8
+ import { DRIFT_THRESHOLD } from '../../core/constants.js';
9
+ import { mergeSystemPrompt } from '../../agent/prompt-resolver.js';
10
+ import { codeGraphEngine } from '../../code-graph/index.js';
11
+ import { RoleMatchEngine } from '../../agent/role-match-engine.js';
12
+ import { RolePromptGenerator } from '../../agent/role-prompt-generator.js';
13
+ import { RoleConsensusEngine } from '../../agent/role-consensus-engine.js';
14
+ // ─── Helpers ─────────────────────────────────────────────────────
15
+ function extractKeywords(text) {
16
+ const stopWords = new Set([
17
+ 'the',
18
+ 'a',
19
+ 'an',
20
+ 'and',
21
+ 'or',
22
+ 'but',
23
+ 'in',
24
+ 'on',
25
+ 'at',
26
+ 'to',
27
+ 'for',
28
+ 'of',
29
+ 'with',
30
+ 'by',
31
+ '—',
32
+ '+',
33
+ ]);
34
+ return text
35
+ .replace(/[^\w\s가-힣]/g, ' ')
36
+ .split(/\s+/)
37
+ .filter((w) => w.length > 2 && !stopWords.has(w.toLowerCase()))
38
+ .slice(0, 5);
39
+ }
40
+ export class ExecutionOrchestrator {
41
+ sessionManager;
42
+ eventStore;
43
+ agentRegistry;
44
+ roleAgentRegistry;
45
+ constructor(sessionManager, eventStore, agentRegistry, roleAgentRegistry) {
46
+ this.sessionManager = sessionManager;
47
+ this.eventStore = eventStore;
48
+ this.agentRegistry = agentRegistry;
49
+ this.roleAgentRegistry = roleAgentRegistry;
50
+ }
51
+ startExecution(sessionId) {
52
+ try {
53
+ const session = this.sessionManager.get(sessionId);
54
+ if (session.status !== 'plan_complete') {
55
+ return err(new TaskExecutionError(`Cannot start execution: session status is "${session.status}", expected "plan_complete"`));
56
+ }
57
+ if (!session.executionPlan) {
58
+ return err(new TaskExecutionError('No execution plan found'));
59
+ }
60
+ this.sessionManager.startExecution(sessionId);
61
+ const taskContext = this.buildNextTaskContext(this.sessionManager.get(sessionId));
62
+ return ok({
63
+ session: this.sessionManager.get(sessionId),
64
+ taskContext,
65
+ allTasksCompleted: taskContext === null,
66
+ });
67
+ }
68
+ catch (e) {
69
+ if (e instanceof ExecuteSessionNotFoundError)
70
+ return err(e);
71
+ return err(new TaskExecutionError(`Failed to start execution: ${e instanceof Error ? e.message : String(e)}`));
72
+ }
73
+ }
74
+ submitTaskResult(sessionId, taskResult, driftThreshold) {
75
+ try {
76
+ const session = this.sessionManager.get(sessionId);
77
+ if (session.status !== 'executing') {
78
+ return err(new TaskExecutionError(`Cannot submit task result: session status is "${session.status}", expected "executing"`));
79
+ }
80
+ if (!session.executionPlan) {
81
+ return err(new TaskExecutionError('No execution plan found'));
82
+ }
83
+ // Validate taskId exists in plan
84
+ const task = session.executionPlan.atomicTasks.find((t) => t.taskId === taskResult.taskId);
85
+ if (!task) {
86
+ return err(new TaskExecutionError(`Task "${taskResult.taskId}" not found in execution plan`));
87
+ }
88
+ this.sessionManager.addTaskResult(sessionId, taskResult);
89
+ // Clear role state from previous role_match/role_consensus cycle
90
+ this.sessionManager.clearRoleState(sessionId);
91
+ // Drift Detection (only for completed tasks)
92
+ let driftScore;
93
+ let retrospectiveContext;
94
+ if (taskResult.status === 'completed') {
95
+ const threshold = driftThreshold ?? DRIFT_THRESHOLD;
96
+ driftScore = measureDrift(session.spec, task, taskResult, threshold);
97
+ this.sessionManager.addDriftScore(sessionId, driftScore);
98
+ if (driftScore.thresholdExceeded) {
99
+ this.eventStore.append('execute', sessionId, EventType.EXECUTE_DRIFT_RETROSPECTIVE, {
100
+ taskId: taskResult.taskId,
101
+ driftScore,
102
+ });
103
+ retrospectiveContext = {
104
+ systemPrompt: mergeSystemPrompt(EXECUTE_EXECUTION_SYSTEM_PROMPT, this.agentRegistry, 'execute'),
105
+ retrospectivePrompt: buildDriftRetrospectivePrompt(session.spec, task, taskResult, driftScore),
106
+ driftScore,
107
+ };
108
+ }
109
+ }
110
+ const updatedSession = this.sessionManager.get(sessionId);
111
+ const taskContext = this.buildNextTaskContext(updatedSession);
112
+ const allTasksCompleted = taskContext === null;
113
+ return ok({
114
+ session: updatedSession,
115
+ taskContext,
116
+ allTasksCompleted,
117
+ driftScore,
118
+ retrospectiveContext,
119
+ });
120
+ }
121
+ catch (e) {
122
+ if (e instanceof ExecuteSessionNotFoundError)
123
+ return err(e);
124
+ return err(new TaskExecutionError(`Failed to submit task result: ${e instanceof Error ? e.message : String(e)}`));
125
+ }
126
+ }
127
+ // ─── Role Agent System ──────────────────────────────────────
128
+ /**
129
+ * role_match: 2-call passthrough pattern.
130
+ * - Call 1 (no matchResult): Returns matchContext for current task
131
+ * - Call 2 (with matchResult): Stores matches, returns perspectivePrompts
132
+ */
133
+ roleMatch(sessionId, matchResult) {
134
+ try {
135
+ const session = this.sessionManager.get(sessionId);
136
+ if (session.status !== 'executing') {
137
+ return err(new TaskExecutionError(`Cannot perform role match: session status is "${session.status}", expected "executing"`));
138
+ }
139
+ const currentTask = this.getCurrentTask(session);
140
+ if (!currentTask) {
141
+ return err(new TaskExecutionError('No pending task found for role matching'));
142
+ }
143
+ // Call 1: Return match context
144
+ if (!matchResult) {
145
+ if (!this.roleAgentRegistry) {
146
+ return err(new ExecuteError('RoleAgentRegistry not configured'));
147
+ }
148
+ this.eventStore.append('execute', sessionId, EventType.ROLE_MATCH_STARTED, {
149
+ taskId: currentTask.taskId,
150
+ });
151
+ const engine = new RoleMatchEngine();
152
+ const matchContext = engine.generateMatchContext(currentTask.taskId, currentTask.title, currentTask.description, this.roleAgentRegistry.getAll());
153
+ return ok({ session, matchContext });
154
+ }
155
+ // Call 2: Submit match results, return perspective prompts
156
+ this.sessionManager.setRoleMatches(sessionId, currentTask.taskId, matchResult);
157
+ if (matchResult.length === 0) {
158
+ return ok({
159
+ session: this.sessionManager.get(sessionId),
160
+ perspectivePrompts: [],
161
+ });
162
+ }
163
+ if (!this.roleAgentRegistry) {
164
+ return err(new ExecuteError('RoleAgentRegistry not configured'));
165
+ }
166
+ const matchedAgents = matchResult
167
+ .map((m) => this.roleAgentRegistry.getByName(m.agentName))
168
+ .filter((a) => a !== undefined);
169
+ const generator = new RolePromptGenerator();
170
+ const perspectivePrompts = generator.generatePerspectivePrompts(currentTask.title, currentTask.description, matchedAgents);
171
+ return ok({
172
+ session: this.sessionManager.get(sessionId),
173
+ perspectivePrompts,
174
+ });
175
+ }
176
+ catch (e) {
177
+ if (e instanceof ExecuteSessionNotFoundError)
178
+ return err(e);
179
+ return err(new ExecuteError(`Failed role match: ${e instanceof Error ? e.message : String(e)}`));
180
+ }
181
+ }
182
+ /**
183
+ * role_consensus: 2-call passthrough pattern.
184
+ * - Call 1 (perspectives, no consensus): Returns synthesisContext
185
+ * - Call 2 (consensus): Stores consensus, returns roleGuidance
186
+ */
187
+ roleConsensus(sessionId, perspectives, consensus) {
188
+ try {
189
+ const session = this.sessionManager.get(sessionId);
190
+ if (session.status !== 'executing') {
191
+ return err(new TaskExecutionError(`Cannot perform role consensus: session status is "${session.status}", expected "executing"`));
192
+ }
193
+ const currentTask = this.getCurrentTask(session);
194
+ if (!currentTask) {
195
+ return err(new TaskExecutionError('No pending task found for role consensus'));
196
+ }
197
+ // Call 1: Submit perspectives, return synthesis context
198
+ if (perspectives && !consensus) {
199
+ this.eventStore.append('execute', sessionId, EventType.ROLE_CONSENSUS_STARTED, {
200
+ taskId: currentTask.taskId,
201
+ perspectiveCount: perspectives.length,
202
+ });
203
+ const engine = new RoleConsensusEngine();
204
+ const synthesisContext = engine.generateSynthesisContext(currentTask.title, currentTask.description, perspectives);
205
+ return ok({ session, synthesisContext });
206
+ }
207
+ // Call 2: Submit consensus, store in session
208
+ if (consensus) {
209
+ this.sessionManager.setRoleConsensus(sessionId, currentTask.taskId, consensus);
210
+ const roleGuidance = {
211
+ agents: consensus.perspectives,
212
+ consensus: consensus.consensus,
213
+ conflictResolutions: consensus.conflictResolutions,
214
+ };
215
+ return ok({
216
+ session: this.sessionManager.get(sessionId),
217
+ roleGuidance,
218
+ });
219
+ }
220
+ return err(new ExecuteError('Either perspectives or consensus must be provided'));
221
+ }
222
+ catch (e) {
223
+ if (e instanceof ExecuteSessionNotFoundError)
224
+ return err(e);
225
+ return err(new ExecuteError(`Failed role consensus: ${e instanceof Error ? e.message : String(e)}`));
226
+ }
227
+ }
228
+ // ─── Semantic Hydration ───────────────────────────────────────────
229
+ /**
230
+ * suggestedFiles를 searchByHybrid(키워드+의미론)로 업그레이드.
231
+ * buildNextTaskContext()는 동기 유지, 호출측에서 필요 시 이 메서드로 보강한다.
232
+ */
233
+ async hydrateSuggestedFiles(context, repoRoot) {
234
+ if (!codeGraphEngine.dbExists(repoRoot))
235
+ return context;
236
+ try {
237
+ const query = extractKeywords(context.currentTask.title + ' ' + context.currentTask.description).join(' ');
238
+ const files = await codeGraphEngine.searchByHybrid(repoRoot, query, 10);
239
+ return { ...context, suggestedFiles: files };
240
+ }
241
+ catch {
242
+ // semantic 실패 시 기존 keyword-based suggestedFiles 유지
243
+ return context;
244
+ }
245
+ }
246
+ // ─── Execution context builders ────────────────────────────────
247
+ getCurrentTask(session) {
248
+ if (!session.executionPlan)
249
+ return null;
250
+ const plan = session.executionPlan;
251
+ const completedIds = new Set(session.taskResults
252
+ .filter((r) => r.status === 'completed' || r.status === 'skipped')
253
+ .map((r) => r.taskId));
254
+ const failedIds = new Set(session.taskResults.filter((r) => r.status === 'failed').map((r) => r.taskId));
255
+ const topoOrder = plan.dagValidation.topologicalOrder;
256
+ for (const taskId of topoOrder) {
257
+ if (completedIds.has(taskId) || failedIds.has(taskId))
258
+ continue;
259
+ const task = plan.atomicTasks.find((t) => t.taskId === taskId);
260
+ if (!task)
261
+ continue;
262
+ const depsResolved = task.dependsOn.every((dep) => completedIds.has(dep) || failedIds.has(dep));
263
+ if (depsResolved)
264
+ return task;
265
+ }
266
+ return null;
267
+ }
268
+ buildNextTaskContext(session) {
269
+ const nextTask = this.getCurrentTask(session);
270
+ if (!nextTask)
271
+ return null;
272
+ const plan = session.executionPlan;
273
+ const completedIds = new Set(session.taskResults
274
+ .filter((r) => r.status === 'completed' || r.status === 'skipped')
275
+ .map((r) => r.taskId));
276
+ const failedIds = new Set(session.taskResults.filter((r) => r.status === 'failed').map((r) => r.taskId));
277
+ // Find similar completed tasks (Similarity principle)
278
+ const similarTasks = this.findSimilarTasks(nextTask, plan.atomicTasks, completedIds);
279
+ const completedResults = session.taskResults.filter((r) => r.status === 'completed');
280
+ const pendingTasks = plan.atomicTasks.filter((t) => !completedIds.has(t.taskId) && !failedIds.has(t.taskId) && t.taskId !== nextTask.taskId);
281
+ // suggestedFiles 계산 (code-graph searchByKeywords 기반 — 동기 fallback)
282
+ // Semantic/hybrid upgrade는 호출측(MCP handler 등)에서 hydrateTaskContextSuggestedFiles()로 수행
283
+ let suggestedFiles;
284
+ if (session.codeGraphRepoRoot && codeGraphEngine.dbExists(session.codeGraphRepoRoot)) {
285
+ try {
286
+ const keywords = extractKeywords(nextTask.title + ' ' + nextTask.description);
287
+ const files = codeGraphEngine.searchByKeywords(session.codeGraphRepoRoot, keywords);
288
+ suggestedFiles = files.slice(0, 10);
289
+ }
290
+ catch {
291
+ // graceful fallback — suggestedFiles remains undefined
292
+ }
293
+ }
294
+ const taskPrompt = buildTaskExecutionPrompt(nextTask, session.spec, completedResults, similarTasks, suggestedFiles);
295
+ // Include roleGuidance if available from a previous role_match/role_consensus cycle
296
+ const roleGuidance = session.roleConsensus
297
+ ? {
298
+ agents: session.roleConsensus.perspectives,
299
+ consensus: session.roleConsensus.consensus,
300
+ conflictResolutions: session.roleConsensus.conflictResolutions,
301
+ }
302
+ : undefined;
303
+ return {
304
+ systemPrompt: mergeSystemPrompt(EXECUTE_EXECUTION_SYSTEM_PROMPT, this.agentRegistry, 'execute'),
305
+ taskPrompt,
306
+ phase: 'executing',
307
+ currentTask: nextTask,
308
+ similarityStrategy: EXECUTION_PRINCIPLE_STRATEGY[GestaltPrinciple.SIMILARITY],
309
+ pendingTasks,
310
+ completedTaskIds: Array.from(completedIds),
311
+ roleGuidance,
312
+ suggestedFiles,
313
+ };
314
+ }
315
+ findSimilarTasks(target, allTasks, completedIds) {
316
+ return allTasks.filter((t) => {
317
+ if (!completedIds.has(t.taskId))
318
+ return false;
319
+ if (t.taskId === target.taskId)
320
+ return false;
321
+ // Same complexity or overlapping sourceAC = similar
322
+ const sharedAC = t.sourceAC.some((ac) => target.sourceAC.includes(ac));
323
+ const sameComplexity = t.estimatedComplexity === target.estimatedComplexity;
324
+ return sharedAC || sameComplexity;
325
+ });
326
+ }
327
+ }
328
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../src/execute/orchestrators/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Spec, PlanningStepResult } from '../../core/types.js';
2
+ import { ExecuteError } from '../../core/errors.js';
3
+ import { type Result } from '../../core/result.js';
4
+ import { EventStore } from '../../events/store.js';
5
+ import { ExecuteSessionManager } from '../session.js';
6
+ import type { AgentRegistry } from '../../agent/registry.js';
7
+ import type { RoleAgentRegistry } from '../../agent/role-agent-registry.js';
8
+ import type { PassthroughStartResult, PassthroughPlanStepResult, PassthroughPlanCompleteResult } from './types.js';
9
+ export declare class PlanningOrchestrator {
10
+ private sessionManager;
11
+ private eventStore;
12
+ private agentRegistry?;
13
+ constructor(sessionManager: ExecuteSessionManager, eventStore: EventStore, agentRegistry?: AgentRegistry | undefined, _roleAgentRegistry?: RoleAgentRegistry);
14
+ start(spec: Spec, opts?: {
15
+ codeGraphRepoRoot?: string;
16
+ }): Result<PassthroughStartResult, ExecuteError>;
17
+ planStep(sessionId: string, stepResult: PlanningStepResult): Result<PassthroughPlanStepResult, ExecuteError>;
18
+ planComplete(sessionId: string): Result<PassthroughPlanCompleteResult, ExecuteError>;
19
+ private validateStepResult;
20
+ private validateFigureGround;
21
+ private validateClosure;
22
+ private validateProximity;
23
+ private crossValidateDAG;
24
+ private buildExecuteContext;
25
+ }
26
+ //# sourceMappingURL=planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../../src/execute/orchestrators/planning.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EAGJ,kBAAkB,EAKnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,sBAAsB,CAAC;AAQ5D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAEV,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,YAAY,CAAC;AAEpB,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;gBAFd,cAAc,EAAE,qBAAqB,EACrC,UAAU,EAAE,UAAU,EACtB,aAAa,CAAC,EAAE,aAAa,YAAA,EACrC,kBAAkB,CAAC,EAAE,iBAAiB;IAGxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,IAAI,GAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,MAAM,CAAC,sBAAsB,EAAE,YAAY,CAAC;IAkB/C,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAAC,yBAAyB,EAAE,YAAY,CAAC;IAoElD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,6BAA6B,EAAE,YAAY,CAAC;IAwEpF,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,eAAe;IAgDvB,OAAO,CAAC,iBAAiB;IAkDzB,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,mBAAmB;CAoB5B"}
@@ -0,0 +1,269 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { ExecuteError, ExecuteSessionNotFoundError, InvalidPlanningStepError, } from '../../core/errors.js';
3
+ import { ok, err } from '../../core/result.js';
4
+ import { PLANNING_PRINCIPLE_SEQUENCE, PLANNING_TOTAL_STEPS, PLANNING_PRINCIPLE_STRATEGIES, MAX_ATOMIC_TASKS, MAX_TASK_GROUPS, } from '../../core/constants.js';
5
+ import { EventType } from '../../events/types.js';
6
+ import { EXECUTE_SYSTEM_PROMPT, buildPlanningStepPrompt } from '../prompts.js';
7
+ import { validateDAG } from '../dag-validator.js';
8
+ import { computeParallelGroups } from '../parallel-groups.js';
9
+ import { mergeSystemPrompt } from '../../agent/prompt-resolver.js';
10
+ export class PlanningOrchestrator {
11
+ sessionManager;
12
+ eventStore;
13
+ agentRegistry;
14
+ constructor(sessionManager, eventStore, agentRegistry, _roleAgentRegistry) {
15
+ this.sessionManager = sessionManager;
16
+ this.eventStore = eventStore;
17
+ this.agentRegistry = agentRegistry;
18
+ }
19
+ start(spec, opts = {}) {
20
+ try {
21
+ const session = this.sessionManager.create(spec, {
22
+ codeGraphRepoRoot: opts.codeGraphRepoRoot,
23
+ });
24
+ const executeContext = this.buildExecuteContext(spec, 1, []);
25
+ return ok({ session, executeContext });
26
+ }
27
+ catch (e) {
28
+ return err(new ExecuteError(`Failed to start execute session: ${e instanceof Error ? e.message : String(e)}`));
29
+ }
30
+ }
31
+ planStep(sessionId, stepResult) {
32
+ try {
33
+ const session = this.sessionManager.get(sessionId);
34
+ if (session.status !== 'planning') {
35
+ return err(new ExecuteError(`Session is not in planning state: ${session.status}`));
36
+ }
37
+ // Validate step order
38
+ const expectedStep = session.planningSteps.length + 1;
39
+ const expectedPrinciple = PLANNING_PRINCIPLE_SEQUENCE[expectedStep - 1];
40
+ if (stepResult.principle !== expectedPrinciple) {
41
+ return err(new InvalidPlanningStepError(`Expected principle "${expectedPrinciple}" for step ${expectedStep}, got "${stepResult.principle}"`));
42
+ }
43
+ // Validate step result content
44
+ const validationError = this.validateStepResult(session, stepResult);
45
+ if (validationError) {
46
+ return err(new InvalidPlanningStepError(validationError));
47
+ }
48
+ // For Continuity step: server-side cross-validation
49
+ if (stepResult.principle === 'continuity') {
50
+ const crossValidation = this.crossValidateDAG(session, stepResult);
51
+ if (crossValidation) {
52
+ return err(new InvalidPlanningStepError(crossValidation));
53
+ }
54
+ }
55
+ this.sessionManager.addPlanningStep(sessionId, stepResult);
56
+ const isLastStep = session.planningSteps.length >= PLANNING_TOTAL_STEPS;
57
+ if (isLastStep) {
58
+ return ok({
59
+ session: this.sessionManager.get(sessionId),
60
+ isLastStep: true,
61
+ });
62
+ }
63
+ const nextStep = session.planningSteps.length + 1;
64
+ const executeContext = this.buildExecuteContext(session.spec, nextStep, session.planningSteps);
65
+ return ok({
66
+ session: this.sessionManager.get(sessionId),
67
+ executeContext,
68
+ isLastStep: false,
69
+ });
70
+ }
71
+ catch (e) {
72
+ if (e instanceof ExecuteSessionNotFoundError || e instanceof InvalidPlanningStepError) {
73
+ return err(e);
74
+ }
75
+ return err(new ExecuteError(`Failed to process planning step: ${e instanceof Error ? e.message : String(e)}`));
76
+ }
77
+ }
78
+ planComplete(sessionId) {
79
+ try {
80
+ const session = this.sessionManager.get(sessionId);
81
+ if (session.planningSteps.length < PLANNING_TOTAL_STEPS) {
82
+ return err(new ExecuteError(`Planning is not complete: ${session.planningSteps.length}/${PLANNING_TOTAL_STEPS} steps done`));
83
+ }
84
+ // Assemble ExecutionPlan from all steps
85
+ const fgStep = session.planningSteps.find((s) => s.principle === 'figure_ground');
86
+ const closureStep = session.planningSteps.find((s) => s.principle === 'closure');
87
+ const proximityStep = session.planningSteps.find((s) => s.principle === 'proximity');
88
+ const continuityStep = session.planningSteps.find((s) => s.principle === 'continuity');
89
+ if (!fgStep || !closureStep || !proximityStep || !continuityStep) {
90
+ return err(new ExecuteError('Missing planning step results'));
91
+ }
92
+ // Final DAG validation on server side
93
+ const serverDAG = validateDAG(closureStep.atomicTasks, proximityStep.taskGroups);
94
+ this.eventStore.append('execute', sessionId, EventType.EXECUTE_PLAN_VALIDATED, {
95
+ callerValid: continuityStep.dagValidation.isValid,
96
+ serverValid: serverDAG.isValid,
97
+ });
98
+ const parallelGroups = computeParallelGroups(closureStep.atomicTasks, serverDAG.topologicalOrder);
99
+ const plan = {
100
+ planId: randomUUID(),
101
+ specId: session.specId,
102
+ classifiedACs: fgStep.classifiedACs,
103
+ atomicTasks: closureStep.atomicTasks,
104
+ taskGroups: proximityStep.taskGroups,
105
+ dagValidation: serverDAG,
106
+ parallelGroups,
107
+ createdAt: new Date().toISOString(),
108
+ };
109
+ this.sessionManager.completePlan(sessionId, plan);
110
+ return ok({
111
+ session: this.sessionManager.get(sessionId),
112
+ executionPlan: plan,
113
+ });
114
+ }
115
+ catch (e) {
116
+ if (e instanceof ExecuteSessionNotFoundError) {
117
+ return err(e);
118
+ }
119
+ return err(new ExecuteError(`Failed to complete plan: ${e instanceof Error ? e.message : String(e)}`));
120
+ }
121
+ }
122
+ // ─── Validation helpers ───────────────────────────────────────
123
+ validateStepResult(session, stepResult) {
124
+ switch (stepResult.principle) {
125
+ case 'figure_ground':
126
+ return this.validateFigureGround(session.spec, stepResult);
127
+ case 'closure':
128
+ return this.validateClosure(session, stepResult);
129
+ case 'proximity':
130
+ return this.validateProximity(session, stepResult);
131
+ case 'continuity':
132
+ return null; // Cross-validated separately
133
+ default:
134
+ return `Unknown principle: ${stepResult.principle}`;
135
+ }
136
+ }
137
+ validateFigureGround(spec, result) {
138
+ const { classifiedACs } = result;
139
+ if (!classifiedACs || classifiedACs.length === 0) {
140
+ return 'classifiedACs is required and must not be empty';
141
+ }
142
+ const acCount = spec.acceptanceCriteria.length;
143
+ const indices = new Set(classifiedACs.map((ac) => ac.acIndex));
144
+ // Check all ACs are classified
145
+ for (let i = 0; i < acCount; i++) {
146
+ if (!indices.has(i)) {
147
+ return `AC index ${i} is not classified`;
148
+ }
149
+ }
150
+ // Check for out-of-range indices
151
+ for (const ac of classifiedACs) {
152
+ if (ac.acIndex < 0 || ac.acIndex >= acCount) {
153
+ return `AC index ${ac.acIndex} is out of range (0-${acCount - 1})`;
154
+ }
155
+ }
156
+ return null;
157
+ }
158
+ validateClosure(session, result) {
159
+ const { atomicTasks } = result;
160
+ if (!atomicTasks || atomicTasks.length === 0) {
161
+ return 'atomicTasks is required and must not be empty';
162
+ }
163
+ if (atomicTasks.length > MAX_ATOMIC_TASKS) {
164
+ return `Too many atomic tasks: ${atomicTasks.length} (max ${MAX_ATOMIC_TASKS})`;
165
+ }
166
+ // Check taskId uniqueness
167
+ const taskIds = new Set();
168
+ for (const task of atomicTasks) {
169
+ if (taskIds.has(task.taskId)) {
170
+ return `Duplicate taskId: ${task.taskId}`;
171
+ }
172
+ taskIds.add(task.taskId);
173
+ }
174
+ // Check sourceAC references
175
+ const fgStep = session.planningSteps.find((s) => s.principle === 'figure_ground');
176
+ if (fgStep) {
177
+ const validIndices = new Set(fgStep.classifiedACs.map((ac) => ac.acIndex));
178
+ for (const task of atomicTasks) {
179
+ if (!task.isImplicit) {
180
+ for (const acIdx of task.sourceAC) {
181
+ if (!validIndices.has(acIdx)) {
182
+ return `Task "${task.taskId}" references invalid AC index ${acIdx}`;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // Check dependsOn references
189
+ for (const task of atomicTasks) {
190
+ for (const dep of task.dependsOn) {
191
+ if (!taskIds.has(dep)) {
192
+ return `Task "${task.taskId}" depends on non-existent task "${dep}"`;
193
+ }
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+ validateProximity(session, result) {
199
+ const { taskGroups } = result;
200
+ if (!taskGroups || taskGroups.length === 0) {
201
+ return 'taskGroups is required and must not be empty';
202
+ }
203
+ if (taskGroups.length > MAX_TASK_GROUPS) {
204
+ return `Too many task groups: ${taskGroups.length} (max ${MAX_TASK_GROUPS})`;
205
+ }
206
+ // Get valid task IDs from Closure step
207
+ const closureStep = session.planningSteps.find((s) => s.principle === 'closure');
208
+ if (!closureStep) {
209
+ return 'Closure step must be completed before Proximity';
210
+ }
211
+ const validTaskIds = new Set(closureStep.atomicTasks.map((t) => t.taskId));
212
+ const assignedTaskIds = new Set();
213
+ // Check groupId uniqueness
214
+ const groupIds = new Set();
215
+ for (const group of taskGroups) {
216
+ if (groupIds.has(group.groupId)) {
217
+ return `Duplicate groupId: ${group.groupId}`;
218
+ }
219
+ groupIds.add(group.groupId);
220
+ for (const tid of group.taskIds) {
221
+ if (!validTaskIds.has(tid)) {
222
+ return `Group "${group.groupId}" references invalid task "${tid}"`;
223
+ }
224
+ if (assignedTaskIds.has(tid)) {
225
+ return `Task "${tid}" is assigned to multiple groups`;
226
+ }
227
+ assignedTaskIds.add(tid);
228
+ }
229
+ }
230
+ // Check all tasks are grouped
231
+ for (const tid of validTaskIds) {
232
+ if (!assignedTaskIds.has(tid)) {
233
+ return `Task "${tid}" is not assigned to any group`;
234
+ }
235
+ }
236
+ return null;
237
+ }
238
+ crossValidateDAG(session, continuityResult) {
239
+ const closureStep = session.planningSteps.find((s) => s.principle === 'closure');
240
+ const proximityStep = session.planningSteps.find((s) => s.principle === 'proximity');
241
+ if (!closureStep || !proximityStep) {
242
+ return 'Closure and Proximity steps must be completed before Continuity';
243
+ }
244
+ const serverDAG = validateDAG(closureStep.atomicTasks, proximityStep.taskGroups);
245
+ // If caller says valid but server finds issues, flag it
246
+ if (continuityResult.dagValidation.isValid && !serverDAG.isValid) {
247
+ const issues = [...(serverDAG.cycleDetails ?? []), ...(serverDAG.conflictDetails ?? [])].join('; ');
248
+ return `Server-side DAG validation disagrees: ${issues}`;
249
+ }
250
+ return null;
251
+ }
252
+ // ─── Context builder ──────────────────────────────────────────
253
+ buildExecuteContext(spec, stepNumber, previousSteps) {
254
+ const principle = PLANNING_PRINCIPLE_SEQUENCE[stepNumber - 1];
255
+ const planningPrompt = buildPlanningStepPrompt(spec, stepNumber, previousSteps);
256
+ return {
257
+ systemPrompt: mergeSystemPrompt(EXECUTE_SYSTEM_PROMPT, this.agentRegistry, 'execute'),
258
+ planningPrompt,
259
+ currentPrinciple: principle,
260
+ principleStrategy: PLANNING_PRINCIPLE_STRATEGIES[principle],
261
+ phase: 'planning',
262
+ stepNumber,
263
+ totalSteps: PLANNING_TOTAL_STEPS,
264
+ spec,
265
+ previousSteps,
266
+ };
267
+ }
268
+ }
269
+ //# sourceMappingURL=planning.js.map