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.
- package/CHANGELOG.md +27 -0
- package/README.md +88 -46
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +38 -11
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/blast.d.ts +62 -0
- package/dist/core/blast.d.ts.map +1 -0
- package/dist/core/blast.js +448 -0
- package/dist/core/blast.js.map +1 -0
- package/dist/core/contract.d.ts +54 -0
- package/dist/core/contract.d.ts.map +1 -0
- package/dist/core/contract.js +300 -0
- package/dist/core/contract.js.map +1 -0
- package/dist/core/failure-retrospective.d.ts +12 -0
- package/dist/core/failure-retrospective.d.ts.map +1 -0
- package/dist/core/failure-retrospective.js +115 -0
- package/dist/core/failure-retrospective.js.map +1 -0
- package/dist/core/project-index/index.d.ts +17 -0
- package/dist/core/project-index/index.d.ts.map +1 -0
- package/dist/core/project-index/index.js +323 -0
- package/dist/core/project-index/index.js.map +1 -0
- package/dist/core/project-index/types.d.ts +34 -0
- package/dist/core/project-index/types.d.ts.map +1 -0
- package/dist/core/project-index/types.js +2 -0
- package/dist/core/project-index/types.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +8 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic/config.d.ts.map +1 -1
- package/dist/core/semantic/config.js +5 -0
- package/dist/core/semantic/config.js.map +1 -1
- package/dist/core/semantic/index.d.ts +1 -1
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +1 -1
- package/dist/core/semantic/index.js.map +1 -1
- package/dist/core/semantic/runtime.d.ts.map +1 -1
- package/dist/core/semantic/runtime.js +12 -1
- package/dist/core/semantic/runtime.js.map +1 -1
- package/dist/core/semantic/types.d.ts +6 -0
- package/dist/core/semantic/types.d.ts.map +1 -1
- package/dist/core/semantic/types.js +6 -0
- package/dist/core/semantic/types.js.map +1 -1
- package/dist/core/shadow-guard.d.ts +30 -0
- package/dist/core/shadow-guard.d.ts.map +1 -0
- package/dist/core/shadow-guard.js +81 -0
- package/dist/core/shadow-guard.js.map +1 -0
- package/dist/core/shared-memory.d.ts +46 -0
- package/dist/core/shared-memory.d.ts.map +1 -0
- package/dist/core/shared-memory.js +253 -0
- package/dist/core/shared-memory.js.map +1 -0
- package/dist/core/singular.d.ts +73 -0
- package/dist/core/singular.d.ts.map +1 -0
- package/dist/core/singular.js +413 -0
- package/dist/core/singular.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +14 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagents.js +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/swarm/gates.d.ts +9 -0
- package/dist/core/swarm/gates.d.ts.map +1 -0
- package/dist/core/swarm/gates.js +65 -0
- package/dist/core/swarm/gates.js.map +1 -0
- package/dist/core/swarm/index.d.ts +9 -0
- package/dist/core/swarm/index.d.ts.map +1 -0
- package/dist/core/swarm/index.js +9 -0
- package/dist/core/swarm/index.js.map +1 -0
- package/dist/core/swarm/locks.d.ts +21 -0
- package/dist/core/swarm/locks.d.ts.map +1 -0
- package/dist/core/swarm/locks.js +93 -0
- package/dist/core/swarm/locks.js.map +1 -0
- package/dist/core/swarm/planner.d.ts +16 -0
- package/dist/core/swarm/planner.d.ts.map +1 -0
- package/dist/core/swarm/planner.js +137 -0
- package/dist/core/swarm/planner.js.map +1 -0
- package/dist/core/swarm/retry.d.ts +16 -0
- package/dist/core/swarm/retry.d.ts.map +1 -0
- package/dist/core/swarm/retry.js +32 -0
- package/dist/core/swarm/retry.js.map +1 -0
- package/dist/core/swarm/scheduler.d.ts +48 -0
- package/dist/core/swarm/scheduler.d.ts.map +1 -0
- package/dist/core/swarm/scheduler.js +554 -0
- package/dist/core/swarm/scheduler.js.map +1 -0
- package/dist/core/swarm/spawn.d.ts +16 -0
- package/dist/core/swarm/spawn.d.ts.map +1 -0
- package/dist/core/swarm/spawn.js +42 -0
- package/dist/core/swarm/spawn.js.map +1 -0
- package/dist/core/swarm/state-store.d.ts +35 -0
- package/dist/core/swarm/state-store.d.ts.map +1 -0
- package/dist/core/swarm/state-store.js +106 -0
- package/dist/core/swarm/state-store.js.map +1 -0
- package/dist/core/swarm/types.d.ts +116 -0
- package/dist/core/swarm/types.d.ts.map +1 -0
- package/dist/core/swarm/types.js +2 -0
- package/dist/core/swarm/types.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +6 -3
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/semantic-search.d.ts.map +1 -1
- package/dist/core/tools/semantic-search.js +1 -0
- package/dist/core/tools/semantic-search.js.map +1 -1
- package/dist/core/tools/shared-memory.d.ts +23 -0
- package/dist/core/tools/shared-memory.d.ts.map +1 -0
- package/dist/core/tools/shared-memory.js +134 -0
- package/dist/core/tools/shared-memory.js.map +1 -0
- package/dist/core/tools/task.d.ts +8 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +664 -123
- package/dist/core/tools/task.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +8 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +70 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +27 -4
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/subagent-message.js +14 -0
- package/dist/modes/interactive/components/subagent-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +81 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3481 -870
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +29 -1
- package/docs/configuration.md +5 -0
- package/docs/interactive-mode.md +171 -2
- package/docs/orchestration-and-subagents.md +96 -169
- 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":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;AAC3G,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AACxF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACtD,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,UAAU,GAAG,gBAAgB,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAClH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,aAAa,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GACvB,aAAa,GACb,MAAM,GACN,YAAY,GACZ,cAAc,GACd,WAAW,GACX,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,aAAa,GACb,YAAY,GACZ,WAAW,GACX,UAAU,CAAC;AAEd,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,UAAU,EAAE,CAAC;CACrB"}
|
|
@@ -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,
|
|
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("
|
|
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
|
-
-
|
|
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.
|