@voybio/ace-swarm 0.2.5 → 2.4.1

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 (144) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +21 -13
  3. package/assets/.agents/ACE/agent-qa/instructions.md +11 -0
  4. package/assets/agent-state/EVIDENCE_LOG.md +1 -1
  5. package/assets/agent-state/MODULES/roles/capability-framework.json +41 -0
  6. package/assets/agent-state/MODULES/roles/capability-git.json +33 -0
  7. package/assets/agent-state/MODULES/roles/capability-safety.json +37 -0
  8. package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +21 -0
  9. package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +43 -0
  10. package/assets/agent-state/MODULES/schemas/RUNTIME_TOOL_SPEC_REGISTRY.schema.json +43 -0
  11. package/assets/agent-state/MODULES/schemas/WORKSPACE_SESSION_REGISTRY.schema.json +11 -0
  12. package/assets/agent-state/STATUS.md +2 -2
  13. package/assets/agent-state/runtime-tool-specs.json +70 -2
  14. package/assets/instructions/ACE_Coder.instructions.md +13 -0
  15. package/assets/instructions/ACE_UI.instructions.md +11 -0
  16. package/assets/scripts/ace-hook-dispatch.mjs +70 -6
  17. package/assets/scripts/render-mcp-configs.sh +19 -5
  18. package/dist/ace-context.js +91 -11
  19. package/dist/ace-internal-tools.d.ts +3 -1
  20. package/dist/ace-internal-tools.js +10 -2
  21. package/dist/ace-server-instructions.js +3 -3
  22. package/dist/ace-state-resolver.js +5 -3
  23. package/dist/agent-runtime/role-adapters.d.ts +18 -1
  24. package/dist/agent-runtime/role-adapters.js +49 -5
  25. package/dist/astgrep-index.d.ts +57 -1
  26. package/dist/astgrep-index.js +140 -4
  27. package/dist/cli.js +232 -35
  28. package/dist/discovery-runtime-wrappers.d.ts +108 -0
  29. package/dist/discovery-runtime-wrappers.js +615 -0
  30. package/dist/handoff-registry.js +5 -5
  31. package/dist/helpers/artifacts.d.ts +19 -0
  32. package/dist/helpers/artifacts.js +152 -0
  33. package/dist/helpers/bootstrap.d.ts +24 -0
  34. package/dist/helpers/bootstrap.js +894 -0
  35. package/dist/helpers/constants.d.ts +53 -0
  36. package/dist/helpers/constants.js +295 -0
  37. package/dist/helpers/drift.d.ts +13 -0
  38. package/dist/helpers/drift.js +45 -0
  39. package/dist/helpers/path-utils.d.ts +24 -0
  40. package/dist/helpers/path-utils.js +123 -0
  41. package/dist/helpers/store-resolution.d.ts +19 -0
  42. package/dist/helpers/store-resolution.js +305 -0
  43. package/dist/helpers/workspace-root.d.ts +3 -0
  44. package/dist/helpers/workspace-root.js +80 -0
  45. package/dist/helpers.d.ts +8 -125
  46. package/dist/helpers.js +8 -1768
  47. package/dist/job-scheduler.js +33 -7
  48. package/dist/json-sanitizer.d.ts +16 -0
  49. package/dist/json-sanitizer.js +26 -0
  50. package/dist/local-model-policy.d.ts +27 -0
  51. package/dist/local-model-policy.js +84 -0
  52. package/dist/local-model-runtime.d.ts +6 -0
  53. package/dist/local-model-runtime.js +33 -21
  54. package/dist/model-bridge.d.ts +13 -1
  55. package/dist/model-bridge.js +410 -23
  56. package/dist/orchestrator-supervisor.d.ts +56 -0
  57. package/dist/orchestrator-supervisor.js +179 -1
  58. package/dist/plan-proposal.d.ts +115 -0
  59. package/dist/plan-proposal.js +1073 -0
  60. package/dist/run-ledger.js +3 -3
  61. package/dist/runtime-command.d.ts +8 -0
  62. package/dist/runtime-command.js +38 -6
  63. package/dist/runtime-executor.d.ts +20 -1
  64. package/dist/runtime-executor.js +737 -172
  65. package/dist/runtime-profile.d.ts +32 -0
  66. package/dist/runtime-profile.js +89 -13
  67. package/dist/runtime-tool-specs.d.ts +39 -0
  68. package/dist/runtime-tool-specs.js +144 -28
  69. package/dist/safe-edit.d.ts +7 -0
  70. package/dist/safe-edit.js +163 -37
  71. package/dist/schemas.js +48 -1
  72. package/dist/server.js +51 -0
  73. package/dist/shared.d.ts +3 -2
  74. package/dist/shared.js +2 -0
  75. package/dist/status-events.js +9 -6
  76. package/dist/store/ace-packed-store.d.ts +3 -2
  77. package/dist/store/ace-packed-store.js +188 -110
  78. package/dist/store/bootstrap-store.d.ts +2 -1
  79. package/dist/store/bootstrap-store.js +102 -83
  80. package/dist/store/cache-workspace.js +11 -5
  81. package/dist/store/materializers/context-snapshot-materializer.js +6 -2
  82. package/dist/store/materializers/hook-context-materializer.d.ts +6 -9
  83. package/dist/store/materializers/hook-context-materializer.js +11 -21
  84. package/dist/store/materializers/host-file-materializer.js +6 -0
  85. package/dist/store/materializers/projection-manager.d.ts +0 -1
  86. package/dist/store/materializers/projection-manager.js +5 -13
  87. package/dist/store/materializers/scheduler-projection-materializer.js +1 -1
  88. package/dist/store/materializers/vericify-projector.d.ts +7 -7
  89. package/dist/store/materializers/vericify-projector.js +11 -11
  90. package/dist/store/repositories/local-model-runtime-repository.d.ts +120 -3
  91. package/dist/store/repositories/local-model-runtime-repository.js +242 -6
  92. package/dist/store/repositories/vericify-repository.d.ts +1 -1
  93. package/dist/store/skills-install.d.ts +4 -0
  94. package/dist/store/skills-install.js +21 -12
  95. package/dist/store/state-reader.d.ts +2 -0
  96. package/dist/store/state-reader.js +20 -0
  97. package/dist/store/store-artifacts.d.ts +7 -0
  98. package/dist/store/store-artifacts.js +27 -1
  99. package/dist/store/store-authority-audit.d.ts +18 -1
  100. package/dist/store/store-authority-audit.js +115 -5
  101. package/dist/store/store-snapshot.d.ts +3 -0
  102. package/dist/store/store-snapshot.js +22 -2
  103. package/dist/store/workspace-store-paths.d.ts +39 -0
  104. package/dist/store/workspace-store-paths.js +94 -0
  105. package/dist/store/write-coordinator.d.ts +65 -0
  106. package/dist/store/write-coordinator.js +386 -0
  107. package/dist/todo-state.js +5 -5
  108. package/dist/tools-agent.d.ts +20 -0
  109. package/dist/tools-agent.js +789 -25
  110. package/dist/tools-discovery.js +136 -1
  111. package/dist/tools-files.d.ts +7 -0
  112. package/dist/tools-files.js +1002 -11
  113. package/dist/tools-framework.js +105 -66
  114. package/dist/tools-handoff.js +2 -2
  115. package/dist/tools-lifecycle.js +4 -4
  116. package/dist/tools-memory.js +6 -6
  117. package/dist/tools-todo.js +2 -2
  118. package/dist/tracker-adapters.d.ts +1 -1
  119. package/dist/tracker-adapters.js +13 -18
  120. package/dist/tracker-sync.js +5 -3
  121. package/dist/tui/agent-runner.js +3 -1
  122. package/dist/tui/chat.js +103 -7
  123. package/dist/tui/dashboard.d.ts +1 -0
  124. package/dist/tui/dashboard.js +43 -0
  125. package/dist/tui/index.js +10 -1
  126. package/dist/tui/layout.d.ts +20 -0
  127. package/dist/tui/layout.js +31 -1
  128. package/dist/tui/local-model-contract.d.ts +6 -2
  129. package/dist/tui/local-model-contract.js +16 -3
  130. package/dist/tui/ollama.d.ts +8 -1
  131. package/dist/tui/ollama.js +53 -12
  132. package/dist/tui/openai-compatible.d.ts +13 -0
  133. package/dist/tui/openai-compatible.js +305 -5
  134. package/dist/tui/provider-discovery.d.ts +1 -0
  135. package/dist/tui/provider-discovery.js +35 -11
  136. package/dist/vericify-bridge.d.ts +6 -1
  137. package/dist/vericify-bridge.js +27 -3
  138. package/dist/workspace-manager.d.ts +30 -3
  139. package/dist/workspace-manager.js +257 -27
  140. package/package.json +1 -2
  141. package/dist/internal-tool-runtime.d.ts +0 -21
  142. package/dist/internal-tool-runtime.js +0 -136
  143. package/dist/store/workspace-snapshot.d.ts +0 -26
  144. package/dist/store/workspace-snapshot.js +0 -107
@@ -1,4 +1,5 @@
1
1
  import type { BridgeResult } from "./model-bridge.js";
2
+ import type { LocalModelRuntimeRepository } from "./store/repositories/local-model-runtime-repository.js";
2
3
  export type TaskStepStatus = "planned" | "running" | "done" | "failed" | "skipped" | "blocked";
3
4
  export type TaskPlanStatus = "planning" | "executing" | "reviewing" | "blocked" | "done" | "failed";
4
5
  export interface TaskStep {
@@ -14,6 +15,25 @@ export interface TaskStep {
14
15
  job_id?: string;
15
16
  handoff_id?: string;
16
17
  blocked_reason?: string;
18
+ upstream_outputs?: {
19
+ step_id: string;
20
+ result_summary: string;
21
+ evidence_refs: string[];
22
+ }[];
23
+ expected_output_class?: "plain_text_plan" | "tool_envelope" | "code_artifact" | "structural_edit_plan" | "qa_verdict";
24
+ expected_artifacts?: Array<{
25
+ path: string;
26
+ required?: boolean;
27
+ evidence_ref_kind?: "artifact" | "diff" | "hash" | "test" | "gate";
28
+ }>;
29
+ allowed_tools?: string[];
30
+ forbidden_patterns?: string[];
31
+ required_evidence_refs?: string[];
32
+ structural_edit_plan_required?: boolean;
33
+ structural_edit_waiver?: {
34
+ reason: string;
35
+ evidence_ref: string;
36
+ };
17
37
  }
18
38
  export interface TaskPlan {
19
39
  plan_id: string;
@@ -36,6 +56,14 @@ export interface TaskPlanAmendment {
36
56
  reorder_step_ids?: string[];
37
57
  execution_mode?: TaskPlan["execution_mode"];
38
58
  vcx_cursor?: string;
59
+ evidence_refs?: string[];
60
+ }
61
+ export type IntentVerificationOutcome = "ok" | "revisit_step" | "replan_required";
62
+ export interface IntentVerificationResult {
63
+ outcome: IntentVerificationOutcome;
64
+ reason: string;
65
+ reason_code?: string;
66
+ uncovered_clauses?: string[];
39
67
  }
40
68
  export interface SupervisorHooks {
41
69
  spawnStep: (step: TaskStep, plan: TaskPlan) => Promise<BridgeResult>;
@@ -73,6 +101,26 @@ export interface SupervisorHooks {
73
101
  summary: string;
74
102
  step_id?: string;
75
103
  }) => Promise<void>;
104
+ verifyIntent?: (input: {
105
+ plan: TaskPlan;
106
+ step: TaskStep;
107
+ result: BridgeResult;
108
+ intent_contract: unknown;
109
+ vericify_delta?: unknown;
110
+ }) => Promise<IntentVerificationResult>;
111
+ recordIntentVerificationFailure?: (input: {
112
+ plan: TaskPlan;
113
+ step: TaskStep;
114
+ result: BridgeResult;
115
+ verification: IntentVerificationResult;
116
+ from: TaskStepStatus;
117
+ to: TaskStepStatus;
118
+ }) => Promise<void>;
119
+ /** Called when replan_required: returns an amendment to insert steps covering uncovered clauses. */
120
+ replanForClauses?: (input: {
121
+ plan: TaskPlan;
122
+ uncovered_clauses: string[];
123
+ }) => Promise<TaskPlanAmendment | undefined>;
76
124
  }
77
125
  export interface SupervisorRunResult {
78
126
  plan: TaskPlan;
@@ -80,6 +128,7 @@ export interface SupervisorRunResult {
80
128
  job_ids: string[];
81
129
  circuit_opened: boolean;
82
130
  final_gate?: unknown;
131
+ blocked_reason?: string;
83
132
  }
84
133
  export declare function deriveTaskPlanStatus(plan: TaskPlan): TaskPlanStatus;
85
134
  export declare function createTaskPlan(input: {
@@ -92,6 +141,13 @@ export declare function getReadyTaskSteps(plan: TaskPlan): TaskStep[];
92
141
  export declare function markTaskStepStatus(plan: TaskPlan, stepId: string, status: TaskStepStatus, patch?: Partial<Omit<TaskStep, "step_id" | "status">>): TaskPlan;
93
142
  export declare function applyBridgeResultToStep(plan: TaskPlan, stepId: string, result: BridgeResult): TaskPlan;
94
143
  export declare function amendTaskPlan(plan: TaskPlan, amendment: TaskPlanAmendment): TaskPlan;
144
+ export declare function collectUpstreamOutputs(plan: TaskPlan, step: TaskStep): {
145
+ step_id: string;
146
+ result_summary: string;
147
+ evidence_refs: string[];
148
+ }[];
149
+ export declare function applyBridgeResultToStepWithTransition(plan: TaskPlan, stepId: string, result: BridgeResult, repo?: LocalModelRuntimeRepository): Promise<TaskPlan>;
150
+ export declare function amendTaskPlanWithTransition(plan: TaskPlan, amendment: TaskPlanAmendment, repo?: LocalModelRuntimeRepository, reason?: string, reason_code?: string): Promise<TaskPlan>;
95
151
  export declare function promoteParallelGroupToScheduler(plan: TaskPlan, parallelGroup: string, owner?: string): Promise<{
96
152
  plan: TaskPlan;
97
153
  job_ids: string[];
@@ -212,6 +212,63 @@ export function amendTaskPlan(plan, amendment) {
212
212
  vcx_cursor: amendment.vcx_cursor ?? plan.vcx_cursor,
213
213
  });
214
214
  }
215
+ export function collectUpstreamOutputs(plan, step) {
216
+ const dependencyOutputs = (step.depends_on ?? [])
217
+ .map((depId) => plan.steps.find((s) => s.step_id === depId))
218
+ .filter((dep) => dep?.status === "done")
219
+ .map((dep) => ({
220
+ step_id: dep.step_id,
221
+ result_summary: dep.result_summary ?? "",
222
+ evidence_refs: dep.evidence_refs ?? [],
223
+ }));
224
+ const carriedOutputs = (step.upstream_outputs ?? []).filter((output) => Boolean(output) &&
225
+ typeof output.step_id === "string" &&
226
+ typeof output.result_summary === "string" &&
227
+ Array.isArray(output.evidence_refs));
228
+ const merged = new Map();
229
+ for (const output of [...dependencyOutputs, ...carriedOutputs]) {
230
+ merged.set(output.step_id, output);
231
+ }
232
+ return [...merged.values()];
233
+ }
234
+ export async function applyBridgeResultToStepWithTransition(plan, stepId, result, repo) {
235
+ const updated = applyBridgeResultToStep(plan, stepId, result);
236
+ if (repo && plan.plan_id) {
237
+ const step = plan.steps.find((s) => s.step_id === stepId);
238
+ const updatedStep = updated.steps.find((s) => s.step_id === stepId);
239
+ if (step && updatedStep) {
240
+ await repo.appendTransitionRecord({
241
+ subject_kind: "plan_step",
242
+ subject_id: `${plan.plan_id}/${stepId}`,
243
+ from: step.status,
244
+ to: updatedStep.status,
245
+ reason: result.summary ?? "(bridge result applied)",
246
+ reason_code: updatedStep.status === "done"
247
+ ? "step_completed"
248
+ : updatedStep.status === "blocked"
249
+ ? "step_blocked"
250
+ : "step_failed",
251
+ evidence_refs: result.evidence_refs ?? [],
252
+ });
253
+ }
254
+ }
255
+ return updated;
256
+ }
257
+ export async function amendTaskPlanWithTransition(plan, amendment, repo, reason, reason_code) {
258
+ const updated = amendTaskPlan(plan, amendment);
259
+ if (repo && plan.plan_id) {
260
+ await repo.appendTransitionRecord({
261
+ subject_kind: "plan_step",
262
+ subject_id: plan.plan_id,
263
+ from: plan.status,
264
+ to: updated.status,
265
+ reason: reason ?? "(plan amended)",
266
+ reason_code: reason_code ?? "manual_amendment",
267
+ evidence_refs: amendment.evidence_refs ?? [],
268
+ });
269
+ }
270
+ return updated;
271
+ }
215
272
  export async function promoteParallelGroupToScheduler(plan, parallelGroup, owner = "capability-ops") {
216
273
  const readySteps = getReadyTaskSteps(plan).filter((step) => step.parallel_group === parallelGroup);
217
274
  if (readySteps.length === 0) {
@@ -285,6 +342,10 @@ export async function superviseTaskPlan(inputPlan, hooks) {
285
342
  });
286
343
  const handoffIds = [];
287
344
  const jobIds = [];
345
+ // Intent verification loop counters (Task 7)
346
+ let replanCount = 0;
347
+ const stepRetryCount = new Map();
348
+ let intentContract = undefined;
288
349
  if (!plan.vcx_cursor && hooks.getVericifyContext) {
289
350
  const contextPacket = await hooks.getVericifyContext(plan);
290
351
  const vcxCursor = extractVcxCursor(contextPacket);
@@ -311,7 +372,10 @@ export async function superviseTaskPlan(inputPlan, hooks) {
311
372
  }
312
373
  }
313
374
  const currentStep = readySteps[0];
314
- plan = markTaskStepStatus(plan, currentStep.step_id, "running");
375
+ const upstreamOutputs = collectUpstreamOutputs(plan, currentStep);
376
+ plan = markTaskStepStatus(plan, currentStep.step_id, "running", {
377
+ upstream_outputs: upstreamOutputs.length > 0 ? upstreamOutputs : undefined,
378
+ });
315
379
  await hooks.emitStatusEvent?.({
316
380
  status: "in_progress",
317
381
  summary: `Running ${currentStep.step_id}: ${currentStep.task}`,
@@ -347,6 +411,102 @@ export async function superviseTaskPlan(inputPlan, hooks) {
347
411
  };
348
412
  }
349
413
  }
414
+ // ── Intent verification loop (Task 7) ────────────────────────────────
415
+ if (hooks.verifyIntent) {
416
+ const verificationStep = plan.steps.find((s) => s.step_id === currentStep.step_id) ?? currentStep;
417
+ const verification = await hooks.verifyIntent({
418
+ plan,
419
+ step: verificationStep,
420
+ result,
421
+ intent_contract: intentContract,
422
+ vericify_delta: vericifyDelta,
423
+ });
424
+ if (verification.outcome === "revisit_step") {
425
+ const retries = stepRetryCount.get(currentStep.step_id) ?? 0;
426
+ if (retries < 1) {
427
+ stepRetryCount.set(currentStep.step_id, retries + 1);
428
+ await hooks.recordIntentVerificationFailure?.({
429
+ plan,
430
+ step: verificationStep,
431
+ result,
432
+ verification,
433
+ from: verificationStep.status,
434
+ to: "planned",
435
+ });
436
+ // Re-queue the step by resetting it to planned with failure context as upstream
437
+ const retryContext = {
438
+ step_id: `${currentStep.step_id}-retry-context`,
439
+ result_summary: `Intent verification requested revisit: ${verification.reason}`,
440
+ evidence_refs: verification.uncovered_clauses ?? [],
441
+ };
442
+ plan = amendTaskPlan(plan, {
443
+ update_steps: [{
444
+ step_id: currentStep.step_id,
445
+ patch: {
446
+ status: "planned",
447
+ result_summary: undefined,
448
+ upstream_outputs: [
449
+ ...(verificationStep.upstream_outputs ?? []),
450
+ retryContext,
451
+ ],
452
+ },
453
+ }],
454
+ });
455
+ // Do not call amendPlan this iteration — continue to next loop pass
456
+ continue;
457
+ }
458
+ else {
459
+ await hooks.recordIntentVerificationFailure?.({
460
+ plan,
461
+ step: verificationStep,
462
+ result,
463
+ verification,
464
+ from: verificationStep.status,
465
+ to: "blocked",
466
+ });
467
+ plan = amendTaskPlan(plan, {
468
+ update_steps: [{
469
+ step_id: currentStep.step_id,
470
+ patch: {
471
+ status: "blocked",
472
+ blocked_reason: verification.reason_code
473
+ ? `Intent verification failed (${verification.reason_code}): ${verification.reason}`
474
+ : `Intent verification failed: ${verification.reason}`,
475
+ },
476
+ }],
477
+ });
478
+ }
479
+ }
480
+ else if (verification.outcome === "replan_required") {
481
+ await hooks.recordIntentVerificationFailure?.({
482
+ plan,
483
+ step: verificationStep,
484
+ result,
485
+ verification,
486
+ from: verificationStep.status,
487
+ to: "planned",
488
+ });
489
+ if (replanCount >= 2) {
490
+ const blockedPlan = { ...plan, status: "blocked" };
491
+ return {
492
+ plan: withDerivedStatus(blockedPlan),
493
+ handoff_ids: handoffIds,
494
+ job_ids: jobIds,
495
+ circuit_opened: false,
496
+ blocked_reason: "intent_drift_unresolvable",
497
+ };
498
+ }
499
+ replanCount += 1;
500
+ const uncovered = verification.uncovered_clauses ?? [];
501
+ if (hooks.replanForClauses && uncovered.length > 0) {
502
+ const replanAmendment = await hooks.replanForClauses({ plan, uncovered_clauses: uncovered });
503
+ if (replanAmendment) {
504
+ plan = amendTaskPlan(plan, replanAmendment);
505
+ }
506
+ }
507
+ }
508
+ }
509
+ // ── End intent verification loop ─────────────────────────────────────
350
510
  const amended = await hooks.amendPlan?.({
351
511
  plan,
352
512
  step: plan.steps.find((step) => step.step_id === currentStep.step_id) ?? currentStep,
@@ -372,6 +532,24 @@ export async function superviseTaskPlan(inputPlan, hooks) {
372
532
  }
373
533
  if (plan.steps.length > 0 && plan.steps.every((step) => step.status === "done" || step.status === "skipped")) {
374
534
  const finalGate = await hooks.executeGates?.(plan);
535
+ if (finalGate && typeof finalGate === "object" && finalGate.ok === false) {
536
+ const blockedPlan = {
537
+ ...plan,
538
+ status: "blocked",
539
+ };
540
+ await hooks.contextSnapshot?.(blockedPlan);
541
+ await hooks.emitStatusEvent?.({
542
+ status: "blocked",
543
+ summary: `Task plan ${plan.plan_id} blocked by failing gates`,
544
+ });
545
+ return {
546
+ plan: blockedPlan,
547
+ handoff_ids: handoffIds,
548
+ job_ids: jobIds,
549
+ circuit_opened: false,
550
+ final_gate: finalGate,
551
+ };
552
+ }
375
553
  await hooks.contextSnapshot?.(plan);
376
554
  await hooks.emitStatusEvent?.({
377
555
  status: "done",
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Workstream J — Planner contract: propose_plan, validate_plan, loadAcceptanceTraceContract.
3
+ * Extracted to its own module so both tools-agent.ts and runtime-executor.ts can import without
4
+ * a circular dependency (tools-agent already imports from runtime-executor).
5
+ */
6
+ export type OrchestratorPlanSource = "explicit_steps" | "orchestrator_default_step" | "planner_model" | "deterministic_fallback";
7
+ export type ExpectedOutputClass = "plain_text_plan" | "tool_envelope" | "code_artifact" | "structural_edit_plan" | "qa_verdict";
8
+ export interface ContractArtifactExpectation {
9
+ path: string;
10
+ required?: boolean;
11
+ evidence_ref_kind?: "artifact" | "diff" | "hash" | "test" | "gate";
12
+ }
13
+ export interface PlanProposalStep {
14
+ role: string;
15
+ task: string;
16
+ depends_on?: string[];
17
+ tool_scope?: string[];
18
+ acceptance_criteria: string[];
19
+ stop_condition?: string[];
20
+ expected_output_class?: ExpectedOutputClass;
21
+ expected_artifacts?: ContractArtifactExpectation[];
22
+ allowed_tools?: string[];
23
+ forbidden_patterns?: string[];
24
+ required_evidence_refs?: string[];
25
+ structural_edit_plan_required?: boolean;
26
+ structural_edit_waiver?: {
27
+ reason: string;
28
+ evidence_ref: string;
29
+ };
30
+ }
31
+ export interface PlanProposal {
32
+ intent_summary: string;
33
+ success_criteria: string[];
34
+ steps: PlanProposalStep[];
35
+ }
36
+ export interface PlanValidationVerdict {
37
+ ok: boolean;
38
+ score: number;
39
+ blocking_findings: string[];
40
+ soft_findings: string[];
41
+ }
42
+ export interface ProposePlanResult {
43
+ plan_id: string;
44
+ status: "planning";
45
+ intent_summary: string;
46
+ success_criteria: string[];
47
+ steps: PlanProposalStep[];
48
+ plan_source: OrchestratorPlanSource;
49
+ }
50
+ export interface AcceptanceTraceContractStep {
51
+ step_id: string;
52
+ role: string;
53
+ task: string;
54
+ depends_on: string[];
55
+ tool_scope: string[];
56
+ verification_role: string | null;
57
+ acceptance_criteria?: string[];
58
+ stop_condition?: string[];
59
+ expected_output_class?: ExpectedOutputClass;
60
+ expected_artifacts?: ContractArtifactExpectation[];
61
+ allowed_tools?: string[];
62
+ forbidden_patterns?: string[];
63
+ required_evidence_refs?: string[];
64
+ structural_edit_plan_required?: boolean;
65
+ structural_edit_waiver?: {
66
+ reason: string;
67
+ evidence_ref: string;
68
+ };
69
+ }
70
+ export interface AcceptanceTraceContract {
71
+ version: number;
72
+ generated_at: string;
73
+ plan_id: string;
74
+ task: string;
75
+ plan_source: string;
76
+ intent_summary?: string;
77
+ success_criteria?: string[];
78
+ validation_verdict?: PlanValidationVerdict;
79
+ policies: {
80
+ inserted_research_before_spec: boolean;
81
+ ship_fanout_enabled: boolean;
82
+ };
83
+ steps: AcceptanceTraceContractStep[];
84
+ }
85
+ export declare function lookupProposal(plan_id: string): ProposePlanResult | undefined;
86
+ export declare function inferExpectedOutputClass(step: Pick<PlanProposalStep, "role" | "tool_scope">): ExpectedOutputClass;
87
+ /**
88
+ * Lightweight synchronous variant used in runtime preflights.
89
+ * Skips the model bridge call entirely and returns the deterministic goal scaffold.
90
+ * This keeps the preflight free of network I/O that could delay session startup.
91
+ */
92
+ export declare function proposePlanDeterministic(task: string): ProposePlanResult;
93
+ export declare function proposePlan(task: string, sessionId?: string): Promise<ProposePlanResult>;
94
+ export declare function validatePlan(input: {
95
+ plan_id?: string;
96
+ proposal?: ProposePlanResult;
97
+ sessionId?: string;
98
+ }): Promise<PlanValidationVerdict & {
99
+ plan_id: string;
100
+ }>;
101
+ export declare function loadAcceptanceTraceContract(plan_id: string): AcceptanceTraceContract | undefined;
102
+ export declare function persistAcceptanceTraceMapWithContract(input: {
103
+ plan_id: string;
104
+ task: string;
105
+ plan_source: string;
106
+ intent_summary?: string;
107
+ success_criteria?: string[];
108
+ validation_verdict?: PlanValidationVerdict;
109
+ policies: {
110
+ inserted_research_before_spec: boolean;
111
+ ship_fanout_enabled: boolean;
112
+ };
113
+ steps: AcceptanceTraceContractStep[];
114
+ }): Promise<string>;
115
+ //# sourceMappingURL=plan-proposal.d.ts.map