iosm-cli 0.1.3 → 0.2.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 (132) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +88 -46
  3. package/dist/core/agent-teams.d.ts.map +1 -1
  4. package/dist/core/agent-teams.js +38 -11
  5. package/dist/core/agent-teams.js.map +1 -1
  6. package/dist/core/blast.d.ts +62 -0
  7. package/dist/core/blast.d.ts.map +1 -0
  8. package/dist/core/blast.js +448 -0
  9. package/dist/core/blast.js.map +1 -0
  10. package/dist/core/contract.d.ts +54 -0
  11. package/dist/core/contract.d.ts.map +1 -0
  12. package/dist/core/contract.js +300 -0
  13. package/dist/core/contract.js.map +1 -0
  14. package/dist/core/failure-retrospective.d.ts +12 -0
  15. package/dist/core/failure-retrospective.d.ts.map +1 -0
  16. package/dist/core/failure-retrospective.js +115 -0
  17. package/dist/core/failure-retrospective.js.map +1 -0
  18. package/dist/core/project-index/index.d.ts +17 -0
  19. package/dist/core/project-index/index.d.ts.map +1 -0
  20. package/dist/core/project-index/index.js +323 -0
  21. package/dist/core/project-index/index.js.map +1 -0
  22. package/dist/core/project-index/types.d.ts +34 -0
  23. package/dist/core/project-index/types.d.ts.map +1 -0
  24. package/dist/core/project-index/types.js +2 -0
  25. package/dist/core/project-index/types.js.map +1 -0
  26. package/dist/core/sdk.d.ts.map +1 -1
  27. package/dist/core/sdk.js +8 -0
  28. package/dist/core/sdk.js.map +1 -1
  29. package/dist/core/semantic/config.d.ts.map +1 -1
  30. package/dist/core/semantic/config.js +5 -0
  31. package/dist/core/semantic/config.js.map +1 -1
  32. package/dist/core/semantic/index.d.ts +1 -1
  33. package/dist/core/semantic/index.d.ts.map +1 -1
  34. package/dist/core/semantic/index.js +1 -1
  35. package/dist/core/semantic/index.js.map +1 -1
  36. package/dist/core/semantic/runtime.d.ts.map +1 -1
  37. package/dist/core/semantic/runtime.js +12 -1
  38. package/dist/core/semantic/runtime.js.map +1 -1
  39. package/dist/core/semantic/types.d.ts +6 -0
  40. package/dist/core/semantic/types.d.ts.map +1 -1
  41. package/dist/core/semantic/types.js +6 -0
  42. package/dist/core/semantic/types.js.map +1 -1
  43. package/dist/core/shadow-guard.d.ts +30 -0
  44. package/dist/core/shadow-guard.d.ts.map +1 -0
  45. package/dist/core/shadow-guard.js +81 -0
  46. package/dist/core/shadow-guard.js.map +1 -0
  47. package/dist/core/shared-memory.d.ts +46 -0
  48. package/dist/core/shared-memory.d.ts.map +1 -0
  49. package/dist/core/shared-memory.js +253 -0
  50. package/dist/core/shared-memory.js.map +1 -0
  51. package/dist/core/singular.d.ts +73 -0
  52. package/dist/core/singular.d.ts.map +1 -0
  53. package/dist/core/singular.js +413 -0
  54. package/dist/core/singular.js.map +1 -0
  55. package/dist/core/slash-commands.d.ts.map +1 -1
  56. package/dist/core/slash-commands.js +14 -2
  57. package/dist/core/slash-commands.js.map +1 -1
  58. package/dist/core/subagents.js +1 -1
  59. package/dist/core/subagents.js.map +1 -1
  60. package/dist/core/swarm/gates.d.ts +9 -0
  61. package/dist/core/swarm/gates.d.ts.map +1 -0
  62. package/dist/core/swarm/gates.js +65 -0
  63. package/dist/core/swarm/gates.js.map +1 -0
  64. package/dist/core/swarm/index.d.ts +9 -0
  65. package/dist/core/swarm/index.d.ts.map +1 -0
  66. package/dist/core/swarm/index.js +9 -0
  67. package/dist/core/swarm/index.js.map +1 -0
  68. package/dist/core/swarm/locks.d.ts +21 -0
  69. package/dist/core/swarm/locks.d.ts.map +1 -0
  70. package/dist/core/swarm/locks.js +93 -0
  71. package/dist/core/swarm/locks.js.map +1 -0
  72. package/dist/core/swarm/planner.d.ts +16 -0
  73. package/dist/core/swarm/planner.d.ts.map +1 -0
  74. package/dist/core/swarm/planner.js +137 -0
  75. package/dist/core/swarm/planner.js.map +1 -0
  76. package/dist/core/swarm/retry.d.ts +16 -0
  77. package/dist/core/swarm/retry.d.ts.map +1 -0
  78. package/dist/core/swarm/retry.js +32 -0
  79. package/dist/core/swarm/retry.js.map +1 -0
  80. package/dist/core/swarm/scheduler.d.ts +48 -0
  81. package/dist/core/swarm/scheduler.d.ts.map +1 -0
  82. package/dist/core/swarm/scheduler.js +554 -0
  83. package/dist/core/swarm/scheduler.js.map +1 -0
  84. package/dist/core/swarm/spawn.d.ts +16 -0
  85. package/dist/core/swarm/spawn.d.ts.map +1 -0
  86. package/dist/core/swarm/spawn.js +42 -0
  87. package/dist/core/swarm/spawn.js.map +1 -0
  88. package/dist/core/swarm/state-store.d.ts +35 -0
  89. package/dist/core/swarm/state-store.d.ts.map +1 -0
  90. package/dist/core/swarm/state-store.js +106 -0
  91. package/dist/core/swarm/state-store.js.map +1 -0
  92. package/dist/core/swarm/types.d.ts +116 -0
  93. package/dist/core/swarm/types.d.ts.map +1 -0
  94. package/dist/core/swarm/types.js +2 -0
  95. package/dist/core/swarm/types.js.map +1 -0
  96. package/dist/core/system-prompt.d.ts.map +1 -1
  97. package/dist/core/system-prompt.js +6 -3
  98. package/dist/core/system-prompt.js.map +1 -1
  99. package/dist/core/tools/semantic-search.d.ts.map +1 -1
  100. package/dist/core/tools/semantic-search.js +1 -0
  101. package/dist/core/tools/semantic-search.js.map +1 -1
  102. package/dist/core/tools/shared-memory.d.ts +23 -0
  103. package/dist/core/tools/shared-memory.d.ts.map +1 -0
  104. package/dist/core/tools/shared-memory.js +134 -0
  105. package/dist/core/tools/shared-memory.js.map +1 -0
  106. package/dist/core/tools/task.d.ts +8 -1
  107. package/dist/core/tools/task.d.ts.map +1 -1
  108. package/dist/core/tools/task.js +664 -123
  109. package/dist/core/tools/task.js.map +1 -1
  110. package/dist/main.d.ts.map +1 -1
  111. package/dist/main.js +8 -1
  112. package/dist/main.js.map +1 -1
  113. package/dist/modes/interactive/components/custom-editor.d.ts +8 -0
  114. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  115. package/dist/modes/interactive/components/custom-editor.js +70 -1
  116. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  117. package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
  118. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  119. package/dist/modes/interactive/components/login-dialog.js +27 -4
  120. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  121. package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/subagent-message.js +14 -0
  123. package/dist/modes/interactive/components/subagent-message.js.map +1 -1
  124. package/dist/modes/interactive/interactive-mode.d.ts +81 -0
  125. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  126. package/dist/modes/interactive/interactive-mode.js +3481 -870
  127. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  128. package/docs/cli-reference.md +29 -1
  129. package/docs/configuration.md +5 -0
  130. package/docs/interactive-mode.md +171 -2
  131. package/docs/orchestration-and-subagents.md +96 -169
  132. package/package.json +4 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/core/swarm/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EngineeringContract } from \"../contract.js\";\nimport { touchesConflict, HierarchicalLockManager } from \"./locks.js\";\nimport { evaluateRunGates, evaluateTaskGates } from \"./gates.js\";\nimport { DEFAULT_RETRY_POLICY, shouldRetry, type SwarmRetryPolicy } from \"./retry.js\";\nimport { SwarmSpawnQueue } from \"./spawn.js\";\nimport type {\n\tSwarmDispatchResult,\n\tSwarmEvent,\n\tSwarmGateResult,\n\tSwarmPlan,\n\tSwarmRunGateResult,\n\tSwarmRuntimeState,\n\tSwarmSchedulerResult,\n\tSwarmTaskPlan,\n\tSwarmTaskRuntimeState,\n} from \"./types.js\";\n\nconst TERMINAL_STATUSES = new Set<SwarmTaskRuntimeState[\"status\"]>([\"done\", \"error\", \"cancelled\", \"blocked\"]);\n\nfunction nowIso(): string {\n\treturn new Date().toISOString();\n}\n\nfunction compact(values: string[]): string[] {\n\treturn [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))];\n}\n\nfunction isTerminal(status: SwarmTaskRuntimeState[\"status\"]): boolean {\n\treturn TERMINAL_STATUSES.has(status);\n}\n\nfunction severityWeight(task: SwarmTaskPlan): number {\n\tif (task.severity === \"high\") return 3;\n\tif (task.severity === \"medium\") return 2;\n\treturn 1;\n}\n\nfunction collectDependents(plan: SwarmPlan): Map<string, number> {\n\tconst result = new Map<string, number>();\n\tfor (const task of plan.tasks) {\n\t\tfor (const dep of task.depends_on) {\n\t\t\tresult.set(dep, (result.get(dep) ?? 0) + 1);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction createTaskRuntimeState(task: SwarmTaskPlan): SwarmTaskRuntimeState {\n\treturn {\n\t\tid: task.id,\n\t\tstatus: task.depends_on.length === 0 ? \"ready\" : \"pending\",\n\t\tattempts: 0,\n\t\tdepends_on: [...task.depends_on],\n\t\ttouches: [...task.touches],\n\t\tscopes: [...task.scopes],\n\t};\n}\n\nfunction buildInitialState(input: {\n\trunId: string;\n\tplan: SwarmPlan;\n\tbudgetUsd?: number;\n\texistingState?: SwarmRuntimeState;\n}): SwarmRuntimeState {\n\tif (input.existingState) {\n\t\treturn {\n\t\t\t...input.existingState,\n\t\t\tupdatedAt: nowIso(),\n\t\t\tstatus: input.existingState.status === \"completed\" ? \"running\" : input.existingState.status,\n\t\t};\n\t}\n\n\tconst tasks: Record<string, SwarmTaskRuntimeState> = {};\n\tfor (const task of input.plan.tasks) {\n\t\ttasks[task.id] = createTaskRuntimeState(task);\n\t}\n\n\treturn {\n\t\trunId: input.runId,\n\t\tstatus: \"running\",\n\t\tcreatedAt: nowIso(),\n\t\tupdatedAt: nowIso(),\n\t\ttick: 0,\n\t\tnoProgressTicks: 0,\n\t\treadyQueue: Object.values(tasks)\n\t\t\t.filter((task) => task.status === \"ready\")\n\t\t\t.map((task) => task.id),\n\t\tblockedTasks: [],\n\t\ttasks,\n\t\tlocks: {},\n\t\tretries: {},\n\t\tbudget: {\n\t\t\tlimitUsd: input.budgetUsd,\n\t\t\tspentUsd: 0,\n\t\t\twarned80: false,\n\t\t\thardStopped: false,\n\t\t},\n\t};\n}\n\nfunction runHasOnlyBlockedTasks(state: SwarmRuntimeState): boolean {\n\tconst tasks = Object.values(state.tasks);\n\tconst unfinished = tasks.filter((task) => !isTerminal(task.status));\n\tif (unfinished.length > 0) return false;\n\treturn tasks.length > 0 && tasks.some((task) => task.status === \"blocked\");\n}\n\nfunction collectReadyTasks(state: SwarmRuntimeState, planById: Map<string, SwarmTaskPlan>): string[] {\n\tconst ready: string[] = [];\n\tfor (const [taskId, runtime] of Object.entries(state.tasks)) {\n\t\tif (runtime.status !== \"pending\" && runtime.status !== \"ready\") continue;\n\t\tconst plan = planById.get(taskId);\n\t\tif (!plan) continue;\n\t\tconst depsDone = plan.depends_on.every((dep) => state.tasks[dep]?.status === \"done\");\n\t\tif (!depsDone) {\n\t\t\truntime.status = \"pending\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (runtime.status !== \"ready\") {\n\t\t\truntime.status = \"ready\";\n\t\t}\n\t\tready.push(taskId);\n\t}\n\treturn ready;\n}\n\nfunction selectBatch(input: {\n\treadyTaskIds: string[];\n\tplanById: Map<string, SwarmTaskPlan>;\n\tmaxParallel: number;\n\tdependents: Map<string, number>;\n}): string[] {\n\tconst sorted = [...input.readyTaskIds].sort((a, b) => {\n\t\tconst taskA = input.planById.get(a);\n\t\tconst taskB = input.planById.get(b);\n\t\tif (!taskA || !taskB) return a.localeCompare(b);\n\t\tconst severityDelta = severityWeight(taskB) - severityWeight(taskA);\n\t\tif (severityDelta !== 0) return severityDelta;\n\t\tconst dependentDelta = (input.dependents.get(b) ?? 0) - (input.dependents.get(a) ?? 0);\n\t\tif (dependentDelta !== 0) return dependentDelta;\n\t\treturn a.localeCompare(b);\n\t});\n\n\tconst selected: string[] = [];\n\tfor (const taskId of sorted) {\n\t\tconst plan = input.planById.get(taskId);\n\t\tif (!plan) continue;\n\t\tconst hasConflictWithSelected = selected.some((existingId) => {\n\t\t\tconst existing = input.planById.get(existingId);\n\t\t\tif (!existing) return false;\n\t\t\treturn touchesConflict(existing.touches, plan.touches);\n\t\t});\n\t\tif (hasConflictWithSelected) continue;\n\t\tselected.push(taskId);\n\t\tif (selected.length >= Math.max(1, input.maxParallel)) break;\n\t}\n\treturn selected;\n}\n\nfunction progressScore(task: SwarmTaskPlan, dependents: Map<string, number>): number {\n\tconst dependentWeight = dependents.get(task.id) ?? 0;\n\tconst touchWeight = Math.min(3, Math.max(1, task.touches.length));\n\treturn severityWeight(task) * 3 + dependentWeight * 2 + touchWeight;\n}\n\nfunction applyProgressHeuristic(input: {\n\treadyTaskIds: string[];\n\tplanById: Map<string, SwarmTaskPlan>;\n\tdependents: Map<string, number>;\n\tstate: SwarmRuntimeState;\n\tactivateAfterNoProgressTicks: number;\n\tminScore: number;\n}): string[] {\n\tif (input.readyTaskIds.length <= 1) return input.readyTaskIds;\n\tif (input.state.noProgressTicks < input.activateAfterNoProgressTicks) return input.readyTaskIds;\n\n\tconst scored = input.readyTaskIds\n\t\t.map((taskId) => {\n\t\t\tconst plan = input.planById.get(taskId);\n\t\t\tif (!plan) return undefined;\n\t\t\treturn { taskId, score: progressScore(plan, input.dependents), severity: plan.severity };\n\t\t})\n\t\t.filter((item): item is { taskId: string; score: number; severity: SwarmTaskPlan[\"severity\"] } => item !== undefined)\n\t\t.sort((a, b) => b.score - a.score || a.taskId.localeCompare(b.taskId));\n\tif (scored.length === 0) return input.readyTaskIds;\n\n\tconst topScore = scored[0]!.score;\n\tconst threshold = Math.max(input.minScore, topScore - 2);\n\tconst filtered = scored\n\t\t.filter((item) => item.score >= threshold || item.severity === \"high\")\n\t\t.map((item) => item.taskId);\n\treturn filtered.length > 0 ? filtered : [scored[0]!.taskId];\n}\n\nfunction conflictDensity(input: { taskIds: string[]; planById: Map<string, SwarmTaskPlan> }): number {\n\tconst count = input.taskIds.length;\n\tif (count < 2) return 0;\n\tlet conflictingPairs = 0;\n\tlet totalPairs = 0;\n\tfor (let i = 0; i < count; i += 1) {\n\t\tconst a = input.planById.get(input.taskIds[i]!);\n\t\tif (!a) continue;\n\t\tfor (let j = i + 1; j < count; j += 1) {\n\t\t\tconst b = input.planById.get(input.taskIds[j]!);\n\t\t\tif (!b) continue;\n\t\t\ttotalPairs += 1;\n\t\t\tif (touchesConflict(a.touches, b.touches)) {\n\t\t\t\tconflictingPairs += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn totalPairs > 0 ? conflictingPairs / totalPairs : 0;\n}\n\nfunction applyConflictDensityGuard(input: {\n\treadyTaskIds: string[];\n\tplanById: Map<string, SwarmTaskPlan>;\n\tmaxParallel: number;\n\tthreshold: number;\n\tminParallel: number;\n}): { effectiveMaxParallel: number; density: number } {\n\tconst density = conflictDensity({ taskIds: input.readyTaskIds, planById: input.planById });\n\tif (density < input.threshold) {\n\t\treturn { effectiveMaxParallel: input.maxParallel, density };\n\t}\n\tconst scaled = Math.max(\n\t\tinput.minParallel,\n\t\tMath.floor(input.maxParallel * Math.max(0.2, 1 - density)),\n\t);\n\treturn {\n\t\teffectiveMaxParallel: Math.max(1, Math.min(input.maxParallel, scaled)),\n\t\tdensity,\n\t};\n}\n\nfunction shouldStopForBudget(state: SwarmRuntimeState): boolean {\n\tconst limit = state.budget.limitUsd;\n\tif (limit === undefined || limit <= 0) return false;\n\tif (!state.budget.warned80 && state.budget.spentUsd >= limit * 0.8) {\n\t\tstate.budget.warned80 = true;\n\t}\n\tif (state.budget.spentUsd >= limit) {\n\t\tstate.budget.hardStopped = true;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport interface RunSwarmSchedulerOptions {\n\trunId: string;\n\tplan: SwarmPlan;\n\tcontract: EngineeringContract;\n\tmaxParallel: number;\n\tbudgetUsd?: number;\n\texistingState?: SwarmRuntimeState;\n\tretryPolicy?: SwarmRetryPolicy;\n\tnoProgressTickLimit?: number;\n\tspawnCap?: number;\n\tprogressHeuristic?: {\n\t\tenabled?: boolean;\n\t\tactivateAfterNoProgressTicks?: number;\n\t\tminScore?: number;\n\t};\n\tconflictDensityGuard?: {\n\t\tenabled?: boolean;\n\t\tthreshold?: number;\n\t\tminParallel?: number;\n\t};\n\tconfirmSpawn?: (input: {\n\t\tcandidate: NonNullable<SwarmDispatchResult[\"spawnCandidates\"]>[number];\n\t\tparentTask: SwarmTaskPlan;\n\t\tparentTaskRuntime: SwarmTaskRuntimeState;\n\t\tstate: SwarmRuntimeState;\n\t}) => Promise<boolean>;\n\tdispatchTask: (input: {\n\t\ttask: SwarmTaskPlan;\n\t\truntime: SwarmTaskRuntimeState;\n\t\ttick: number;\n\t}) => Promise<SwarmDispatchResult>;\n\tonEvent?: (event: SwarmEvent, state: SwarmRuntimeState) => void;\n\tonStateChanged?: (state: SwarmRuntimeState) => void;\n\tshouldStop?: () => boolean;\n}\n\nexport interface RunSwarmSchedulerExtendedResult extends SwarmSchedulerResult {\n\tspawnBacklog: Array<{ fingerprint: string; description: string; path: string; changeType: string }>;\n}\n\nexport async function runSwarmScheduler(\n\toptions: RunSwarmSchedulerOptions,\n): Promise<RunSwarmSchedulerExtendedResult> {\n\tconst planById = new Map(options.plan.tasks.map((task) => [task.id, task]));\n\tconst dependents = collectDependents(options.plan);\n\tconst retryPolicy = options.retryPolicy ?? DEFAULT_RETRY_POLICY;\n\tconst noProgressLimit = Math.max(3, options.noProgressTickLimit ?? 8);\n\tconst spawnCap = Math.max(1, options.spawnCap ?? 30);\n\tconst progressHeuristicEnabled = options.progressHeuristic?.enabled !== false;\n\tconst progressHeuristicActivateAfter = Math.max(1, options.progressHeuristic?.activateAfterNoProgressTicks ?? 2);\n\tconst progressHeuristicMinScore = Math.max(1, options.progressHeuristic?.minScore ?? 4);\n\tconst conflictGuardEnabled = options.conflictDensityGuard?.enabled !== false;\n\tconst conflictGuardThreshold = Math.min(1, Math.max(0, options.conflictDensityGuard?.threshold ?? 0.45));\n\tconst conflictGuardMinParallel = Math.max(1, options.conflictDensityGuard?.minParallel ?? 1);\n\n\tconst state = buildInitialState({\n\t\trunId: options.runId,\n\t\tplan: options.plan,\n\t\tbudgetUsd: options.budgetUsd,\n\t\texistingState: options.existingState,\n\t});\n\tconst lockManager = new HierarchicalLockManager();\n\tconst taskGateByTaskId = new Map<string, SwarmGateResult>();\n\tconst spawned = new SwarmSpawnQueue();\n\tconst events: SwarmEvent[] = [];\n\n\tfor (const [taskId, taskState] of Object.entries(state.tasks)) {\n\t\tif (taskState.status === \"running\") {\n\t\t\ttaskState.status = \"pending\";\n\t\t\ttaskState.startedAt = undefined;\n\t\t}\n\t\tif (taskState.status === \"done\") {\n\t\t\tconst plan = planById.get(taskId);\n\t\t\tif (plan) {\n\t\t\t\ttaskGateByTaskId.set(taskId, evaluateTaskGates({ ...plan, touches: taskState.touches }, options.contract));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst emit = (type: SwarmEvent[\"type\"], message: string, payload?: Record<string, unknown>, taskId?: string): void => {\n\t\tconst event: SwarmEvent = {\n\t\t\ttype,\n\t\t\ttimestamp: nowIso(),\n\t\t\trunId: options.runId,\n\t\t\ttick: state.tick,\n\t\t\tmessage,\n\t\t\tpayload,\n\t\t\t...(taskId ? { taskId } : {}),\n\t\t};\n\t\tevents.push(event);\n\t\toptions.onEvent?.(event, state);\n\t};\n\n\temit(\"run_started\", `Swarm run ${options.runId} started`, {\n\t\ttasks: options.plan.tasks.length,\n\t\tmaxParallel: options.maxParallel,\n\t\tbudgetUsd: options.budgetUsd,\n\t});\n\toptions.onStateChanged?.(state);\n\n\twhile (true) {\n\t\tif (options.shouldStop?.()) {\n\t\t\tstate.status = \"stopped\";\n\t\t\tstate.lastError = \"Run interrupted by user.\";\n\t\t\temit(\"run_stopped\", state.lastError);\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.tick += 1;\n\t\tstate.updatedAt = nowIso();\n\t\temit(\"tick\", `scheduler_tick=${state.tick}`);\n\n\t\tif (shouldStopForBudget(state)) {\n\t\t\tstate.status = \"stopped\";\n\t\t\tstate.lastError = \"Budget hard-stop reached.\";\n\t\t\temit(\"run_stopped\", state.lastError, {\n\t\t\t\tbudgetLimitUsd: state.budget.limitUsd,\n\t\t\t\tspentUsd: state.budget.spentUsd,\n\t\t\t});\n\t\t\toptions.onStateChanged?.(state);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst readyTaskIds = collectReadyTasks(state, planById);\n\t\tstate.readyQueue = [...readyTaskIds];\n\t\tstate.blockedTasks = Object.values(state.tasks)\n\t\t\t.filter((task) => task.status === \"blocked\")\n\t\t\t.map((task) => task.id)\n\t\t\t.sort((a, b) => a.localeCompare(b));\n\n\t\tif (readyTaskIds.length === 0) {\n\t\t\tconst allTerminal = Object.values(state.tasks).every((task) => isTerminal(task.status));\n\t\t\tif (allTerminal) {\n\t\t\t\tconst runGate = evaluateRunGates({\n\t\t\t\t\ttaskStates: state.tasks,\n\t\t\t\t\ttaskGateResults: [...taskGateByTaskId.values()],\n\t\t\t\t\tcontract: options.contract,\n\t\t\t\t});\n\t\t\t\temit(\"gate_run\", runGate.pass ? \"run_gates_passed\" : \"run_gates_failed\", {\n\t\t\t\t\twarnings: runGate.warnings,\n\t\t\t\t\tfailures: runGate.failures,\n\t\t\t\t});\n\t\t\t\tif (runGate.pass && Object.values(state.tasks).every((task) => task.status === \"done\" || task.status === \"blocked\")) {\n\t\t\t\t\tstate.status = runHasOnlyBlockedTasks(state) ? \"blocked\" : \"completed\";\n\t\t\t\t\temit(state.status === \"completed\" ? \"run_completed\" : \"run_blocked\", `Swarm run ${state.status}`);\n\t\t\t\t} else {\n\t\t\t\t\tstate.status = \"failed\";\n\t\t\t\t\tstate.lastError = runGate.failures.join(\" | \") || \"Run gates failed.\";\n\t\t\t\t\temit(\"run_failed\", state.lastError);\n\t\t\t\t}\n\t\t\t\toptions.onStateChanged?.(state);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tstate.noProgressTicks += 1;\n\t\t\tif (state.noProgressTicks >= noProgressLimit) {\n\t\t\t\tstate.status = \"blocked\";\n\t\t\t\tstate.lastError = \"No progress threshold reached.\";\n\t\t\t\temit(\"run_blocked\", state.lastError, { noProgressTicks: state.noProgressTicks });\n\t\t\t\toptions.onStateChanged?.(state);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\toptions.onStateChanged?.(state);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst progressReady = progressHeuristicEnabled\n\t\t\t? applyProgressHeuristic({\n\t\t\t\treadyTaskIds,\n\t\t\t\tplanById,\n\t\t\t\tdependents,\n\t\t\t\tstate,\n\t\t\t\tactivateAfterNoProgressTicks: progressHeuristicActivateAfter,\n\t\t\t\tminScore: progressHeuristicMinScore,\n\t\t\t})\n\t\t\t: readyTaskIds;\n\n\t\tconst guard = conflictGuardEnabled\n\t\t\t? applyConflictDensityGuard({\n\t\t\t\treadyTaskIds: progressReady,\n\t\t\t\tplanById,\n\t\t\t\tmaxParallel: options.maxParallel,\n\t\t\t\tthreshold: conflictGuardThreshold,\n\t\t\t\tminParallel: conflictGuardMinParallel,\n\t\t\t})\n\t\t\t: { effectiveMaxParallel: options.maxParallel, density: conflictDensity({ taskIds: progressReady, planById }) };\n\t\temit(\"tick\", \"scheduler_guards\", {\n\t\t\tready: readyTaskIds.length,\n\t\t\tprogress_candidates: progressReady.length,\n\t\t\tconflict_density: Number(guard.density.toFixed(3)),\n\t\t\teffective_max_parallel: guard.effectiveMaxParallel,\n\t\t\tno_progress_ticks: state.noProgressTicks,\n\t\t});\n\n\t\tconst preselected = selectBatch({\n\t\t\treadyTaskIds: progressReady,\n\t\t\tplanById,\n\t\t\tmaxParallel: guard.effectiveMaxParallel,\n\t\t\tdependents,\n\t\t});\n\n\t\tconst selected: string[] = [];\n\t\tfor (const taskId of preselected) {\n\t\t\tconst plan = planById.get(taskId);\n\t\t\tif (!plan) continue;\n\t\t\tconst lockCheck = lockManager.canAcquire(taskId, plan.touches);\n\t\t\tif (!lockCheck.ok) {\n\t\t\t\tconst runtime = state.tasks[taskId];\n\t\t\t\tif (runtime) {\n\t\t\t\t\truntime.status = \"blocked\";\n\t\t\t\t\truntime.lastError = `Lock conflict: ${lockCheck.conflicts\n\t\t\t\t\t\t.map((conflict) => `${conflict.touch}<->${conflict.conflictingTouch}`)\n\t\t\t\t\t\t.join(\", \")}`;\n\t\t\t\t\temit(\"task_blocked\", runtime.lastError, { conflicts: lockCheck.conflicts }, taskId);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push(taskId);\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\tstate.noProgressTicks += 1;\n\t\t\tif (state.noProgressTicks >= noProgressLimit) {\n\t\t\t\tstate.status = \"blocked\";\n\t\t\t\tstate.lastError = \"No dispatch candidates after lock/budget filters.\";\n\t\t\t\temit(\"run_blocked\", state.lastError, { ready: readyTaskIds });\n\t\t\t\toptions.onStateChanged?.(state);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\toptions.onStateChanged?.(state);\n\t\t\tcontinue;\n\t\t}\n\n\t\t\tlet progressThisTick = false;\n\t\t\tconst dispatchContexts: Array<{ taskId: string; plan: SwarmTaskPlan; runtime: SwarmTaskRuntimeState }> = [];\n\t\t\tfor (const taskId of selected) {\n\t\t\t\tconst plan = planById.get(taskId);\n\t\t\t\tconst runtime = state.tasks[taskId];\n\t\t\t\tif (!plan || !runtime) continue;\n\t\t\t\tlockManager.acquire(taskId, runtime.touches.length > 0 ? runtime.touches : plan.touches);\n\t\t\t\tstate.locks = lockManager.snapshot();\n\t\t\t\temit(\"lock_acquired\", `lock acquired for ${taskId}`, { touches: runtime.touches }, taskId);\n\n\t\t\t\truntime.status = \"running\";\n\t\t\t\truntime.attempts += 1;\n\t\t\t\truntime.startedAt = nowIso();\n\t\t\t\temit(\"task_running\", `task ${taskId} running`, { attempt: runtime.attempts }, taskId);\n\t\t\t\tdispatchContexts.push({ taskId, plan, runtime });\n\t\t\t}\n\t\t\toptions.onStateChanged?.(state);\n\n\t\t\tconst dispatchResults = await Promise.all(\n\t\t\t\tdispatchContexts.map(async ({ taskId, plan, runtime }) => {\n\t\t\t\t\tlet result: SwarmDispatchResult;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresult = await options.dispatchTask({\n\t\t\t\t\t\t\ttask: plan,\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\ttick: state.tick,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tresult = {\n\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn { taskId, plan, runtime, result };\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tfor (const { taskId, plan, runtime, result } of dispatchResults) {\n\t\t\t\tif (result.touchesRefined && result.touchesRefined.length > 0) {\n\t\t\t\t\truntime.touches = compact(result.touchesRefined);\n\t\t\t\t\tlockManager.downgrade(taskId, runtime.touches);\n\t\t\t\t\tstate.locks = lockManager.snapshot();\n\t\t\t\t}\n\n\t\t\t\tif (typeof result.costUsd === \"number\" && Number.isFinite(result.costUsd) && result.costUsd > 0) {\n\t\t\t\t\tstate.budget.spentUsd += result.costUsd;\n\t\t\t\t}\n\n\t\t\t\tif (result.status === \"done\") {\n\t\t\t\t\truntime.status = \"done\";\n\t\t\t\t\truntime.completedAt = nowIso();\n\t\t\t\t\truntime.lastError = undefined;\n\t\t\t\t\tprogressThisTick = true;\n\t\t\t\t\temit(\"task_done\", `task ${taskId} done`, undefined, taskId);\n\n\t\t\t\t\tconst gateResult = evaluateTaskGates({ ...plan, touches: runtime.touches }, options.contract);\n\t\t\t\t\ttaskGateByTaskId.set(taskId, gateResult);\n\t\t\t\t\temit(\n\t\t\t\t\t\t\"gate_task\",\n\t\t\t\t\t\tgateResult.pass ? \"task_gates_passed\" : \"task_gates_failed\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twarnings: gateResult.warnings,\n\t\t\t\t\t\t\tfailures: gateResult.failures,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t);\n\t\t\t\t} else if (result.status === \"blocked\") {\n\t\t\t\t\truntime.status = \"blocked\";\n\t\t\t\t\truntime.lastError = result.error ?? \"Task blocked by user input or policy.\";\n\t\t\t\t\temit(\"task_blocked\", runtime.lastError, undefined, taskId);\n\t\t\t\t} else {\n\t\t\t\t\tconst errorMessage = result.error ?? \"Unknown task failure.\";\n\t\t\t\t\tconst currentRetries = state.retries[taskId] ?? 0;\n\t\t\t\t\t\tconst retryDecision = shouldRetry({\n\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\tcurrentRetries,\n\t\t\t\t\t\t\tpolicy: retryPolicy,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (retryDecision.retry) {\n\t\t\t\t\t\t\tstate.retries[taskId] = currentRetries + 1;\n\t\t\t\t\t\t\truntime.status = \"ready\";\n\t\t\t\t\t\t\truntime.lastError = errorMessage;\n\t\t\t\t\t\t\temit(\n\t\t\t\t\t\t\t\t\"task_retry\",\n\t\t\t\t\t\t\t\t`retry ${state.retries[taskId]}/${retryDecision.max} for ${taskId} (${retryDecision.bucket})`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\terror: errorMessage,\n\t\t\t\t\t\t\t\t\tbucket: retryDecision.bucket,\n\t\t\t\t\t\t\t\t\tfailureCause: result.failureCause ?? retryDecision.bucket,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\truntime.status = \"error\";\n\t\t\t\t\t\t\truntime.completedAt = nowIso();\n\t\t\t\t\t\t\truntime.lastError = errorMessage;\n\t\t\t\t\t\t\temit(\n\t\t\t\t\t\t\t\t\"task_error\",\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\t{ bucket: retryDecision.bucket, failureCause: result.failureCause ?? retryDecision.bucket },\n\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tfor (const candidate of result.spawnCandidates ?? []) {\n\t\t\t\t\tif (spawned.size() >= spawnCap) break;\n\t\t\t\t\tconst requiresConfirmation = candidate.severity === \"high\" || plan.spawn_policy === \"manual_high_risk\";\n\t\t\t\t\tif (requiresConfirmation && options.confirmSpawn) {\n\t\t\t\t\t\tconst approved = await options.confirmSpawn({\n\t\t\t\t\t\t\tcandidate,\n\t\t\t\t\t\t\tparentTask: plan,\n\t\t\t\t\t\t\tparentTaskRuntime: runtime,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!approved) {\n\t\t\t\t\t\t\temit(\n\t\t\t\t\t\t\t\t\"spawn_rejected\",\n\t\t\t\t\t\t\t\t`spawn rejected from ${taskId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdescription: candidate.description,\n\t\t\t\t\t\t\t\t\tpath: candidate.path,\n\t\t\t\t\t\t\t\t\tchangeType: candidate.changeType,\n\t\t\t\t\t\t\t\t\tseverity: candidate.severity,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst queued = spawned.enqueue(candidate);\n\t\t\t\t\tif (!queued.accepted) continue;\n\t\t\t\t\temit(\n\t\t\t\t\t\t\"spawn_enqueued\",\n\t\t\t\t\t\t`spawn queued from ${taskId}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfingerprint: queued.fingerprint,\n\t\t\t\t\t\t\tdescription: candidate.description,\n\t\t\t\t\t\t\tpath: candidate.path,\n\t\t\t\t\t\t\tchangeType: candidate.changeType,\n\t\t\t\t\t\t\tseverity: candidate.severity,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlockManager.release(taskId);\n\t\t\t\tstate.locks = lockManager.snapshot();\n\t\t\t\temit(\"lock_released\", `lock released for ${taskId}`, undefined, taskId);\n\t\t\t\toptions.onStateChanged?.(state);\n\t\t\t}\n\n\t\tif (shouldStopForBudget(state)) {\n\t\t\tstate.status = \"stopped\";\n\t\t\tstate.lastError = \"Budget hard-stop reached.\";\n\t\t\temit(\"run_stopped\", state.lastError, {\n\t\t\t\tbudgetLimitUsd: state.budget.limitUsd,\n\t\t\t\tspentUsd: state.budget.spentUsd,\n\t\t\t});\n\t\t\toptions.onStateChanged?.(state);\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.noProgressTicks = progressThisTick ? 0 : state.noProgressTicks + 1;\n\t\toptions.onStateChanged?.(state);\n\t\tif (!progressThisTick && state.noProgressTicks >= noProgressLimit) {\n\t\t\tstate.status = \"blocked\";\n\t\t\tstate.lastError = \"No measurable progress within scheduler threshold.\";\n\t\t\temit(\"run_blocked\", state.lastError, { noProgressTicks: state.noProgressTicks });\n\t\t\toptions.onStateChanged?.(state);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst runGate: SwarmRunGateResult = evaluateRunGates({\n\t\ttaskStates: state.tasks,\n\t\ttaskGateResults: [...taskGateByTaskId.values()],\n\t\tcontract: options.contract,\n\t});\n\tif (state.status === \"completed\" && !runGate.pass) {\n\t\tstate.status = \"failed\";\n\t\tstate.lastError = runGate.failures.join(\" | \") || \"Run gates failed.\";\n\t\temit(\"run_failed\", state.lastError);\n\t}\n\n\tconst drainedSpawn = spawned.drain(spawnCap).map(({ fingerprint, candidate }) => ({\n\t\tfingerprint,\n\t\tdescription: candidate.description,\n\t\tpath: candidate.path,\n\t\tchangeType: candidate.changeType,\n\t}));\n\n\treturn {\n\t\tstate,\n\t\ttaskGates: [...taskGateByTaskId.values()],\n\t\trunGate,\n\t\tevents,\n\t\tspawnBacklog: drainedSpawn,\n\t};\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { SwarmSpawnCandidate } from "./types.js";
2
+ export declare function createSpawnFingerprint(candidate: Pick<SwarmSpawnCandidate, "description" | "path" | "changeType">): string;
3
+ export declare class SwarmSpawnQueue {
4
+ private readonly byFingerprint;
5
+ private readonly order;
6
+ enqueue(candidate: SwarmSpawnCandidate): {
7
+ accepted: boolean;
8
+ fingerprint: string;
9
+ };
10
+ drain(limit: number): Array<{
11
+ fingerprint: string;
12
+ candidate: SwarmSpawnCandidate;
13
+ }>;
14
+ size(): number;
15
+ }
16
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/core/swarm/spawn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG,MAAM,CAG1H;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IAEtC,OAAO,CAAC,SAAS,EAAE,mBAAmB,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAUnF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAcpF,IAAI,IAAI,MAAM;CAGd"}
@@ -0,0 +1,42 @@
1
+ import { createHash } from "node:crypto";
2
+ function normalize(input) {
3
+ return input.trim().toLowerCase().replace(/\s+/g, " ");
4
+ }
5
+ export function createSpawnFingerprint(candidate) {
6
+ const payload = [normalize(candidate.description), normalize(candidate.path), normalize(candidate.changeType)].join("|");
7
+ return createHash("sha256").update(payload).digest("hex").slice(0, 24);
8
+ }
9
+ export class SwarmSpawnQueue {
10
+ constructor() {
11
+ this.byFingerprint = new Map();
12
+ this.order = [];
13
+ }
14
+ enqueue(candidate) {
15
+ const fingerprint = createSpawnFingerprint(candidate);
16
+ if (this.byFingerprint.has(fingerprint)) {
17
+ return { accepted: false, fingerprint };
18
+ }
19
+ this.byFingerprint.set(fingerprint, candidate);
20
+ this.order.push(fingerprint);
21
+ return { accepted: true, fingerprint };
22
+ }
23
+ drain(limit) {
24
+ const result = [];
25
+ const max = Math.max(0, limit);
26
+ while (this.order.length > 0 && result.length < max) {
27
+ const fingerprint = this.order.shift();
28
+ if (!fingerprint)
29
+ break;
30
+ const candidate = this.byFingerprint.get(fingerprint);
31
+ if (!candidate)
32
+ continue;
33
+ this.byFingerprint.delete(fingerprint);
34
+ result.push({ fingerprint, candidate });
35
+ }
36
+ return result;
37
+ }
38
+ size() {
39
+ return this.byFingerprint.size;
40
+ }
41
+ }
42
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/core/swarm/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,SAAS,SAAS,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAA2E;IACjH,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,eAAe;IAA5B;QACkB,kBAAa,GAAG,IAAI,GAAG,EAA+B,CAAC;QACvD,UAAK,GAAa,EAAE,CAAC;IA6BvC,CAAC;IA3BA,OAAO,CAAC,SAA8B;QACrC,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,KAAa;QAClB,MAAM,MAAM,GAAmE,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW;gBAAE,MAAM;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI;QACH,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IAChC,CAAC;CACD","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { SwarmSpawnCandidate } from \"./types.js\";\n\nfunction normalize(input: string): string {\n\treturn input.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function createSpawnFingerprint(candidate: Pick<SwarmSpawnCandidate, \"description\" | \"path\" | \"changeType\">): string {\n\tconst payload = [normalize(candidate.description), normalize(candidate.path), normalize(candidate.changeType)].join(\"|\");\n\treturn createHash(\"sha256\").update(payload).digest(\"hex\").slice(0, 24);\n}\n\nexport class SwarmSpawnQueue {\n\tprivate readonly byFingerprint = new Map<string, SwarmSpawnCandidate>();\n\tprivate readonly order: string[] = [];\n\n\tenqueue(candidate: SwarmSpawnCandidate): { accepted: boolean; fingerprint: string } {\n\t\tconst fingerprint = createSpawnFingerprint(candidate);\n\t\tif (this.byFingerprint.has(fingerprint)) {\n\t\t\treturn { accepted: false, fingerprint };\n\t\t}\n\t\tthis.byFingerprint.set(fingerprint, candidate);\n\t\tthis.order.push(fingerprint);\n\t\treturn { accepted: true, fingerprint };\n\t}\n\n\tdrain(limit: number): Array<{ fingerprint: string; candidate: SwarmSpawnCandidate }> {\n\t\tconst result: Array<{ fingerprint: string; candidate: SwarmSpawnCandidate }> = [];\n\t\tconst max = Math.max(0, limit);\n\t\twhile (this.order.length > 0 && result.length < max) {\n\t\t\tconst fingerprint = this.order.shift();\n\t\t\tif (!fingerprint) break;\n\t\t\tconst candidate = this.byFingerprint.get(fingerprint);\n\t\t\tif (!candidate) continue;\n\t\t\tthis.byFingerprint.delete(fingerprint);\n\t\t\tresult.push({ fingerprint, candidate });\n\t\t}\n\t\treturn result;\n\t}\n\n\tsize(): number {\n\t\treturn this.byFingerprint.size;\n\t}\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import type { SwarmEvent, SwarmPlan, SwarmRunMeta, SwarmRuntimeState } from "./types.js";
2
+ export interface SwarmReportsPayload {
3
+ integrationReport: string;
4
+ gates: Record<string, unknown>;
5
+ sharedContext: string;
6
+ }
7
+ export declare class SwarmStateStore {
8
+ private readonly cwd;
9
+ private readonly runId;
10
+ private readonly rootDir;
11
+ private readonly reportsDir;
12
+ constructor(cwd: string, runId: string);
13
+ getRunDir(): string;
14
+ getStatePath(): string;
15
+ private getRunPath;
16
+ private getDagPath;
17
+ private getEventsPath;
18
+ private getCheckpointPath;
19
+ init(meta: SwarmRunMeta, plan: SwarmPlan, state: SwarmRuntimeState): void;
20
+ appendEvent(event: SwarmEvent): void;
21
+ saveState(state: SwarmRuntimeState): void;
22
+ saveCheckpoint(state: SwarmRuntimeState): void;
23
+ loadMeta(): SwarmRunMeta | undefined;
24
+ loadPlan(): SwarmPlan | undefined;
25
+ saveMeta(meta: SwarmRunMeta): void;
26
+ savePlan(plan: SwarmPlan): void;
27
+ loadState(): SwarmRuntimeState | undefined;
28
+ writeReports(payload: SwarmReportsPayload): void;
29
+ static listRuns(cwd: string, limit?: number): Array<{
30
+ runId: string;
31
+ runPath: string;
32
+ statePath: string;
33
+ }>;
34
+ }
35
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../../src/core/swarm/state-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAezF,MAAM,WAAW,mBAAmB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAIf,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,GAAG,EAAE,MAAM,EAAmB,KAAK,EAAE,MAAM;IAKxE,SAAS,IAAI,MAAM;IAInB,YAAY,IAAI,MAAM;IAItB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;IAIzB,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IASzE,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQpC,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKzC,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAQ9C,QAAQ,IAAI,YAAY,GAAG,SAAS;IAIpC,QAAQ,IAAI,SAAS,GAAG,SAAS;IAIjC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKlC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK/B,SAAS,IAAI,iBAAiB,GAAG,SAAS;IAI1C,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAOhD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CActG"}
@@ -0,0 +1,106 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ function writeJson(filePath, payload) {
4
+ writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
5
+ }
6
+ function readJson(filePath) {
7
+ if (!existsSync(filePath))
8
+ return undefined;
9
+ try {
10
+ return JSON.parse(readFileSync(filePath, "utf8"));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ export class SwarmStateStore {
17
+ constructor(cwd, runId) {
18
+ this.cwd = cwd;
19
+ this.runId = runId;
20
+ this.rootDir = join(cwd, ".iosm", "orchestrate", runId);
21
+ this.reportsDir = join(this.rootDir, "reports");
22
+ }
23
+ getRunDir() {
24
+ return this.rootDir;
25
+ }
26
+ getStatePath() {
27
+ return join(this.rootDir, "state.json");
28
+ }
29
+ getRunPath() {
30
+ return join(this.rootDir, "run.json");
31
+ }
32
+ getDagPath() {
33
+ return join(this.rootDir, "dag.json");
34
+ }
35
+ getEventsPath() {
36
+ return join(this.rootDir, "events.jsonl");
37
+ }
38
+ getCheckpointPath() {
39
+ return join(this.rootDir, "checkpoints", "latest.json");
40
+ }
41
+ init(meta, plan, state) {
42
+ mkdirSync(join(this.rootDir, "checkpoints"), { recursive: true });
43
+ mkdirSync(this.reportsDir, { recursive: true });
44
+ writeJson(this.getRunPath(), meta);
45
+ writeJson(this.getDagPath(), plan);
46
+ this.saveState(state);
47
+ this.saveCheckpoint(state);
48
+ }
49
+ appendEvent(event) {
50
+ mkdirSync(this.rootDir, { recursive: true });
51
+ writeFileSync(this.getEventsPath(), `${JSON.stringify(event)}\n`, {
52
+ encoding: "utf8",
53
+ flag: "a",
54
+ });
55
+ }
56
+ saveState(state) {
57
+ mkdirSync(this.rootDir, { recursive: true });
58
+ writeJson(this.getStatePath(), state);
59
+ }
60
+ saveCheckpoint(state) {
61
+ mkdirSync(join(this.rootDir, "checkpoints"), { recursive: true });
62
+ writeJson(this.getCheckpointPath(), {
63
+ savedAt: new Date().toISOString(),
64
+ state,
65
+ });
66
+ }
67
+ loadMeta() {
68
+ return readJson(this.getRunPath());
69
+ }
70
+ loadPlan() {
71
+ return readJson(this.getDagPath());
72
+ }
73
+ saveMeta(meta) {
74
+ mkdirSync(this.rootDir, { recursive: true });
75
+ writeJson(this.getRunPath(), meta);
76
+ }
77
+ savePlan(plan) {
78
+ mkdirSync(this.rootDir, { recursive: true });
79
+ writeJson(this.getDagPath(), plan);
80
+ }
81
+ loadState() {
82
+ return readJson(this.getStatePath());
83
+ }
84
+ writeReports(payload) {
85
+ mkdirSync(this.reportsDir, { recursive: true });
86
+ writeFileSync(join(this.reportsDir, "integration_report.md"), `${payload.integrationReport.trim()}\n`, "utf8");
87
+ writeJson(join(this.reportsDir, "gates.json"), payload.gates);
88
+ writeFileSync(join(this.reportsDir, "shared_context.md"), `${payload.sharedContext.trim()}\n`, "utf8");
89
+ }
90
+ static listRuns(cwd, limit = 20) {
91
+ const root = join(cwd, ".iosm", "orchestrate");
92
+ if (!existsSync(root))
93
+ return [];
94
+ const names = readdirSync(root, { withFileTypes: true })
95
+ .filter((entry) => entry.isDirectory())
96
+ .map((entry) => entry.name)
97
+ .sort((a, b) => b.localeCompare(a))
98
+ .slice(0, Math.max(1, limit));
99
+ return names.map((runId) => ({
100
+ runId,
101
+ runPath: join(root, runId, "run.json"),
102
+ statePath: join(root, runId, "state.json"),
103
+ }));
104
+ }
105
+ }
106
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../../src/core/swarm/state-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SwarmEvent, SwarmPlan, SwarmRunMeta, SwarmRuntimeState } from \"./types.js\";\n\nfunction writeJson(filePath: string, payload: unknown): void {\n\twriteFileSync(filePath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction readJson<T>(filePath: string): T | undefined {\n\tif (!existsSync(filePath)) return undefined;\n\ttry {\n\t\treturn JSON.parse(readFileSync(filePath, \"utf8\")) as T;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport interface SwarmReportsPayload {\n\tintegrationReport: string;\n\tgates: Record<string, unknown>;\n\tsharedContext: string;\n}\n\nexport class SwarmStateStore {\n\tprivate readonly rootDir: string;\n\tprivate readonly reportsDir: string;\n\n\tconstructor(private readonly cwd: string, private readonly runId: string) {\n\t\tthis.rootDir = join(cwd, \".iosm\", \"orchestrate\", runId);\n\t\tthis.reportsDir = join(this.rootDir, \"reports\");\n\t}\n\n\tgetRunDir(): string {\n\t\treturn this.rootDir;\n\t}\n\n\tgetStatePath(): string {\n\t\treturn join(this.rootDir, \"state.json\");\n\t}\n\n\tprivate getRunPath(): string {\n\t\treturn join(this.rootDir, \"run.json\");\n\t}\n\n\tprivate getDagPath(): string {\n\t\treturn join(this.rootDir, \"dag.json\");\n\t}\n\n\tprivate getEventsPath(): string {\n\t\treturn join(this.rootDir, \"events.jsonl\");\n\t}\n\n\tprivate getCheckpointPath(): string {\n\t\treturn join(this.rootDir, \"checkpoints\", \"latest.json\");\n\t}\n\n\tinit(meta: SwarmRunMeta, plan: SwarmPlan, state: SwarmRuntimeState): void {\n\t\tmkdirSync(join(this.rootDir, \"checkpoints\"), { recursive: true });\n\t\tmkdirSync(this.reportsDir, { recursive: true });\n\t\twriteJson(this.getRunPath(), meta);\n\t\twriteJson(this.getDagPath(), plan);\n\t\tthis.saveState(state);\n\t\tthis.saveCheckpoint(state);\n\t}\n\n\tappendEvent(event: SwarmEvent): void {\n\t\tmkdirSync(this.rootDir, { recursive: true });\n\t\twriteFileSync(this.getEventsPath(), `${JSON.stringify(event)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"a\",\n\t\t});\n\t}\n\n\tsaveState(state: SwarmRuntimeState): void {\n\t\tmkdirSync(this.rootDir, { recursive: true });\n\t\twriteJson(this.getStatePath(), state);\n\t}\n\n\tsaveCheckpoint(state: SwarmRuntimeState): void {\n\t\tmkdirSync(join(this.rootDir, \"checkpoints\"), { recursive: true });\n\t\twriteJson(this.getCheckpointPath(), {\n\t\t\tsavedAt: new Date().toISOString(),\n\t\t\tstate,\n\t\t});\n\t}\n\n\tloadMeta(): SwarmRunMeta | undefined {\n\t\treturn readJson<SwarmRunMeta>(this.getRunPath());\n\t}\n\n\tloadPlan(): SwarmPlan | undefined {\n\t\treturn readJson<SwarmPlan>(this.getDagPath());\n\t}\n\n\tsaveMeta(meta: SwarmRunMeta): void {\n\t\tmkdirSync(this.rootDir, { recursive: true });\n\t\twriteJson(this.getRunPath(), meta);\n\t}\n\n\tsavePlan(plan: SwarmPlan): void {\n\t\tmkdirSync(this.rootDir, { recursive: true });\n\t\twriteJson(this.getDagPath(), plan);\n\t}\n\n\tloadState(): SwarmRuntimeState | undefined {\n\t\treturn readJson<SwarmRuntimeState>(this.getStatePath());\n\t}\n\n\twriteReports(payload: SwarmReportsPayload): void {\n\t\tmkdirSync(this.reportsDir, { recursive: true });\n\t\twriteFileSync(join(this.reportsDir, \"integration_report.md\"), `${payload.integrationReport.trim()}\\n`, \"utf8\");\n\t\twriteJson(join(this.reportsDir, \"gates.json\"), payload.gates);\n\t\twriteFileSync(join(this.reportsDir, \"shared_context.md\"), `${payload.sharedContext.trim()}\\n`, \"utf8\");\n\t}\n\n\tstatic listRuns(cwd: string, limit = 20): Array<{ runId: string; runPath: string; statePath: string }> {\n\t\tconst root = join(cwd, \".iosm\", \"orchestrate\");\n\t\tif (!existsSync(root)) return [];\n\t\tconst names = readdirSync(root, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.isDirectory())\n\t\t\t.map((entry) => entry.name)\n\t\t\t.sort((a, b) => b.localeCompare(a))\n\t\t\t.slice(0, Math.max(1, limit));\n\t\treturn names.map((runId) => ({\n\t\t\trunId,\n\t\t\trunPath: join(root, runId, \"run.json\"),\n\t\t\tstatePath: join(root, runId, \"state.json\"),\n\t\t}));\n\t}\n}\n"]}
@@ -0,0 +1,116 @@
1
+ import type { EngineeringContract } from "../contract.js";
2
+ import type { RepoScaleMode } from "../project-index/types.js";
3
+ export type SwarmTaskStatus = "pending" | "ready" | "running" | "done" | "error" | "blocked" | "cancelled";
4
+ export type SwarmRunStatus = "running" | "completed" | "blocked" | "stopped" | "failed";
5
+ export type SwarmSeverity = "low" | "medium" | "high";
6
+ export type SwarmConcurrencyClass = "default" | "analysis" | "implementation" | "verification" | "docs" | "tests";
7
+ export type SwarmSpawnPolicy = "allow" | "manual_high_risk" | "deny";
8
+ export interface SwarmTaskPlan {
9
+ id: string;
10
+ brief: string;
11
+ depends_on: string[];
12
+ scopes: string[];
13
+ touches: string[];
14
+ concurrency_class: SwarmConcurrencyClass;
15
+ severity: SwarmSeverity;
16
+ needs_user_input: boolean;
17
+ model_hint?: string;
18
+ spawn_policy?: SwarmSpawnPolicy;
19
+ }
20
+ export interface SwarmTaskRuntimeState {
21
+ id: string;
22
+ status: SwarmTaskStatus;
23
+ attempts: number;
24
+ depends_on: string[];
25
+ startedAt?: string;
26
+ completedAt?: string;
27
+ lastError?: string;
28
+ touches: string[];
29
+ scopes: string[];
30
+ }
31
+ export interface SwarmBudgetState {
32
+ limitUsd?: number;
33
+ spentUsd: number;
34
+ warned80: boolean;
35
+ hardStopped: boolean;
36
+ }
37
+ export interface SwarmRuntimeState {
38
+ runId: string;
39
+ status: SwarmRunStatus;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ tick: number;
43
+ noProgressTicks: number;
44
+ readyQueue: string[];
45
+ blockedTasks: string[];
46
+ tasks: Record<string, SwarmTaskRuntimeState>;
47
+ locks: Record<string, string[]>;
48
+ retries: Record<string, number>;
49
+ budget: SwarmBudgetState;
50
+ lastError?: string;
51
+ }
52
+ export type SwarmEventType = "run_started" | "tick" | "task_ready" | "task_running" | "task_done" | "task_error" | "task_blocked" | "task_retry" | "lock_acquired" | "lock_released" | "spawn_enqueued" | "spawn_rejected" | "run_completed" | "run_blocked" | "run_stopped" | "run_failed" | "gate_task" | "gate_run";
53
+ export interface SwarmEvent {
54
+ type: SwarmEventType;
55
+ timestamp: string;
56
+ runId: string;
57
+ tick?: number;
58
+ taskId?: string;
59
+ message: string;
60
+ payload?: Record<string, unknown>;
61
+ }
62
+ export interface SwarmGateResult {
63
+ taskId: string;
64
+ pass: boolean;
65
+ warnings: string[];
66
+ failures: string[];
67
+ checks: string[];
68
+ }
69
+ export interface SwarmRunGateResult {
70
+ pass: boolean;
71
+ warnings: string[];
72
+ failures: string[];
73
+ }
74
+ export interface SwarmSpawnCandidate {
75
+ description: string;
76
+ path: string;
77
+ changeType: string;
78
+ severity: SwarmSeverity;
79
+ parentTaskId?: string;
80
+ }
81
+ export interface SwarmDispatchResult {
82
+ taskId: string;
83
+ status: "done" | "error" | "blocked";
84
+ error?: string;
85
+ failureCause?: string;
86
+ costUsd?: number;
87
+ touchesRefined?: string[];
88
+ spawnCandidates?: SwarmSpawnCandidate[];
89
+ }
90
+ export interface SwarmPlan {
91
+ source: "plain" | "singular";
92
+ request: string;
93
+ tasks: SwarmTaskPlan[];
94
+ notes: string[];
95
+ }
96
+ export interface SwarmRunMeta {
97
+ runId: string;
98
+ createdAt: string;
99
+ source: "plain" | "singular";
100
+ request: string;
101
+ contract: EngineeringContract;
102
+ contractHash: string;
103
+ repoScaleMode: RepoScaleMode;
104
+ semanticStatus?: string;
105
+ maxParallel: number;
106
+ budgetUsd?: number;
107
+ linkedSingularRunId?: string;
108
+ linkedSingularOption?: string;
109
+ }
110
+ export interface SwarmSchedulerResult {
111
+ state: SwarmRuntimeState;
112
+ taskGates: SwarmGateResult[];
113
+ runGate: SwarmRunGateResult;
114
+ events: SwarmEvent[];
115
+ }
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/swarm/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/swarm/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EngineeringContract } from \"../contract.js\";\nimport type { RepoScaleMode } from \"../project-index/types.js\";\n\nexport type SwarmTaskStatus = \"pending\" | \"ready\" | \"running\" | \"done\" | \"error\" | \"blocked\" | \"cancelled\";\nexport type SwarmRunStatus = \"running\" | \"completed\" | \"blocked\" | \"stopped\" | \"failed\";\nexport type SwarmSeverity = \"low\" | \"medium\" | \"high\";\nexport type SwarmConcurrencyClass = \"default\" | \"analysis\" | \"implementation\" | \"verification\" | \"docs\" | \"tests\";\nexport type SwarmSpawnPolicy = \"allow\" | \"manual_high_risk\" | \"deny\";\n\nexport interface SwarmTaskPlan {\n\tid: string;\n\tbrief: string;\n\tdepends_on: string[];\n\tscopes: string[];\n\ttouches: string[];\n\tconcurrency_class: SwarmConcurrencyClass;\n\tseverity: SwarmSeverity;\n\tneeds_user_input: boolean;\n\tmodel_hint?: string;\n\tspawn_policy?: SwarmSpawnPolicy;\n}\n\nexport interface SwarmTaskRuntimeState {\n\tid: string;\n\tstatus: SwarmTaskStatus;\n\tattempts: number;\n\tdepends_on: string[];\n\tstartedAt?: string;\n\tcompletedAt?: string;\n\tlastError?: string;\n\ttouches: string[];\n\tscopes: string[];\n}\n\nexport interface SwarmBudgetState {\n\tlimitUsd?: number;\n\tspentUsd: number;\n\twarned80: boolean;\n\thardStopped: boolean;\n}\n\nexport interface SwarmRuntimeState {\n\trunId: string;\n\tstatus: SwarmRunStatus;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\ttick: number;\n\tnoProgressTicks: number;\n\treadyQueue: string[];\n\tblockedTasks: string[];\n\ttasks: Record<string, SwarmTaskRuntimeState>;\n\tlocks: Record<string, string[]>;\n\tretries: Record<string, number>;\n\tbudget: SwarmBudgetState;\n\tlastError?: string;\n}\n\nexport type SwarmEventType =\n\t| \"run_started\"\n\t| \"tick\"\n\t| \"task_ready\"\n\t| \"task_running\"\n\t| \"task_done\"\n\t| \"task_error\"\n\t| \"task_blocked\"\n\t| \"task_retry\"\n\t| \"lock_acquired\"\n\t| \"lock_released\"\n\t| \"spawn_enqueued\"\n\t| \"spawn_rejected\"\n\t| \"run_completed\"\n\t| \"run_blocked\"\n\t| \"run_stopped\"\n\t| \"run_failed\"\n\t| \"gate_task\"\n\t| \"gate_run\";\n\nexport interface SwarmEvent {\n\ttype: SwarmEventType;\n\ttimestamp: string;\n\trunId: string;\n\ttick?: number;\n\ttaskId?: string;\n\tmessage: string;\n\tpayload?: Record<string, unknown>;\n}\n\nexport interface SwarmGateResult {\n\ttaskId: string;\n\tpass: boolean;\n\twarnings: string[];\n\tfailures: string[];\n\tchecks: string[];\n}\n\nexport interface SwarmRunGateResult {\n\tpass: boolean;\n\twarnings: string[];\n\tfailures: string[];\n}\n\nexport interface SwarmSpawnCandidate {\n\tdescription: string;\n\tpath: string;\n\tchangeType: string;\n\tseverity: SwarmSeverity;\n\tparentTaskId?: string;\n}\n\nexport interface SwarmDispatchResult {\n\ttaskId: string;\n\tstatus: \"done\" | \"error\" | \"blocked\";\n\terror?: string;\n\tfailureCause?: string;\n\tcostUsd?: number;\n\ttouchesRefined?: string[];\n\tspawnCandidates?: SwarmSpawnCandidate[];\n}\n\nexport interface SwarmPlan {\n\tsource: \"plain\" | \"singular\";\n\trequest: string;\n\ttasks: SwarmTaskPlan[];\n\tnotes: string[];\n}\n\nexport interface SwarmRunMeta {\n\trunId: string;\n\tcreatedAt: string;\n\tsource: \"plain\" | \"singular\";\n\trequest: string;\n\tcontract: EngineeringContract;\n\tcontractHash: string;\n\trepoScaleMode: RepoScaleMode;\n\tsemanticStatus?: string;\n\tmaxParallel: number;\n\tbudgetUsd?: number;\n\tlinkedSingularRunId?: string;\n\tlinkedSingularOption?: string;\n}\n\nexport interface SwarmSchedulerResult {\n\tstate: SwarmRuntimeState;\n\ttaskGates: SwarmGateResult[];\n\trunGate: SwarmRunGateResult;\n\tevents: SwarmEvent[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AA0BhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAmRhF"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AA0BhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAwRhF"}
@@ -132,7 +132,7 @@ export function buildSystemPrompt(options = {}) {
132
132
  }
133
133
  if (hasSemanticSearch) {
134
134
  addGuideline("Use semantic_search for intent/meaning queries that are hard to express with regex; use rg/ast_grep for exact symbol and syntax matches");
135
- addGuideline("If semantic_search reports stale/missing index, run semantic_search status and then semantic_search index (or rebuild when required) before semantic queries");
135
+ addGuideline("semantic_search query can auto-refresh stale indexes when semantic auto-index is enabled (default); if disabled or if provider/chunk/filter changes require it, run semantic_search index/rebuild explicitly");
136
136
  }
137
137
  if (hasRg || hasAstGrep || hasComby) {
138
138
  addGuideline("For rg/ast_grep/comby, pass explicit target paths to avoid cwd ambiguity; if syntax errors occur (especially ast_grep), retry once with version-compatible command forms before concluding no matches");
@@ -166,6 +166,8 @@ export function buildSystemPrompt(options = {}) {
166
166
  addGuideline("Do not claim success without evidence; if you could not verify, say so explicitly");
167
167
  addGuideline("Complete the requested task end-to-end when possible instead of stopping at analysis");
168
168
  addGuideline("For code review requests, lead with findings and risks before summaries");
169
+ addGuideline("When an active engineering contract is present in context, treat its constraints, quality gates, and definition_of_done as execution requirements unless user overrides them.");
170
+ addGuideline("For major feature forks, run a /singular feasibility pass before coding to compare implementation options.");
169
171
  for (const guideline of promptGuidelines ?? []) {
170
172
  const normalized = guideline.trim();
171
173
  if (normalized.length > 0) {
@@ -204,8 +206,9 @@ Operating defaults:
204
206
  - For explicit subagent/orchestration requests, execute at least one task tool call before giving a final prose-only answer.
205
207
  - Do not expose internal orchestration scaffolding to the user (for example: [ORCHESTRATION_DIRECTIVE], pseudo tool-call JSON, or raw task arguments).
206
208
  - When invoking tools, call them directly without preambles like "I will now call tool X"; only report outcomes that matter to the user.
207
- - Respect orchestration constraints from the user exactly: count, parallel vs sequential execution, per-agent profile, and per-agent working directory (cwd) when provided.
208
- - For explicit parallel orchestration requests, issue multiple independent task tool calls to match the requested agent count; do not collapse to a single subagent unless the user asks for one.
209
+ - Respect orchestration constraints from the user exactly: count, parallel vs sequential execution, per-agent profile, and per-agent working directory (cwd) when provided.
210
+ - Treat explicit orchestration requests in any language as constraints (including non-English text and minor typos).
211
+ - For explicit parallel orchestration requests, issue multiple independent task tool calls to match the requested agent count; do not collapse to a single subagent unless the user asks for one.
209
212
  - For explicit parallel orchestration requests, emit independent task calls in a single assistant turn whenever possible so they can be launched together.
210
213
  - Runtime note: when parallel orchestration is requested, emit independent task calls in one assistant turn so they can run concurrently; avoid background mode unless the user explicitly asks for detached async runs.
211
214
  - If orchestration constraints are ambiguous or conflict, ask one concise clarification (or use ask_user when available) before launching subagents.