@soleri/core 9.5.0 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/adapters/claude-code-adapter.d.ts +27 -0
  2. package/dist/adapters/claude-code-adapter.d.ts.map +1 -0
  3. package/dist/adapters/claude-code-adapter.js +111 -0
  4. package/dist/adapters/claude-code-adapter.js.map +1 -0
  5. package/dist/adapters/index.d.ts +9 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +10 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/registry.d.ts +21 -0
  10. package/dist/adapters/registry.d.ts.map +1 -0
  11. package/dist/adapters/registry.js +44 -0
  12. package/dist/adapters/registry.js.map +1 -0
  13. package/dist/adapters/types.d.ts +93 -0
  14. package/dist/adapters/types.d.ts.map +1 -0
  15. package/dist/adapters/types.js +10 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/brain/brain.d.ts +12 -1
  18. package/dist/brain/brain.d.ts.map +1 -1
  19. package/dist/brain/brain.js +106 -44
  20. package/dist/brain/brain.js.map +1 -1
  21. package/dist/brain/intelligence.d.ts.map +1 -1
  22. package/dist/brain/intelligence.js +36 -30
  23. package/dist/brain/intelligence.js.map +1 -1
  24. package/dist/chat/agent-loop.js +1 -1
  25. package/dist/chat/agent-loop.js.map +1 -1
  26. package/dist/chat/notifications.d.ts.map +1 -1
  27. package/dist/chat/notifications.js +4 -0
  28. package/dist/chat/notifications.js.map +1 -1
  29. package/dist/control/intent-router.d.ts +1 -0
  30. package/dist/control/intent-router.d.ts.map +1 -1
  31. package/dist/control/intent-router.js +11 -5
  32. package/dist/control/intent-router.js.map +1 -1
  33. package/dist/curator/curator.d.ts +4 -0
  34. package/dist/curator/curator.d.ts.map +1 -1
  35. package/dist/curator/curator.js +141 -27
  36. package/dist/curator/curator.js.map +1 -1
  37. package/dist/index.d.ts +22 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +18 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/llm/llm-client.d.ts.map +1 -1
  42. package/dist/llm/llm-client.js +1 -0
  43. package/dist/llm/llm-client.js.map +1 -1
  44. package/dist/packs/index.d.ts +3 -2
  45. package/dist/packs/index.d.ts.map +1 -1
  46. package/dist/packs/index.js +3 -2
  47. package/dist/packs/index.js.map +1 -1
  48. package/dist/packs/lockfile.d.ts +23 -1
  49. package/dist/packs/lockfile.d.ts.map +1 -1
  50. package/dist/packs/lockfile.js +50 -4
  51. package/dist/packs/lockfile.js.map +1 -1
  52. package/dist/packs/pack-installer.d.ts +10 -0
  53. package/dist/packs/pack-installer.d.ts.map +1 -1
  54. package/dist/packs/pack-installer.js +69 -2
  55. package/dist/packs/pack-installer.js.map +1 -1
  56. package/dist/packs/pack-lifecycle.d.ts +50 -0
  57. package/dist/packs/pack-lifecycle.d.ts.map +1 -0
  58. package/dist/packs/pack-lifecycle.js +91 -0
  59. package/dist/packs/pack-lifecycle.js.map +1 -0
  60. package/dist/packs/types.d.ts +76 -29
  61. package/dist/packs/types.d.ts.map +1 -1
  62. package/dist/packs/types.js +9 -0
  63. package/dist/packs/types.js.map +1 -1
  64. package/dist/persistence/sqlite-provider.d.ts +5 -1
  65. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  66. package/dist/persistence/sqlite-provider.js +22 -2
  67. package/dist/persistence/sqlite-provider.js.map +1 -1
  68. package/dist/planning/github-projection.d.ts +11 -9
  69. package/dist/planning/github-projection.d.ts.map +1 -1
  70. package/dist/planning/github-projection.js +47 -43
  71. package/dist/planning/github-projection.js.map +1 -1
  72. package/dist/planning/goal-ancestry.d.ts +72 -0
  73. package/dist/planning/goal-ancestry.d.ts.map +1 -0
  74. package/dist/planning/goal-ancestry.js +137 -0
  75. package/dist/planning/goal-ancestry.js.map +1 -0
  76. package/dist/planning/plan-lifecycle.d.ts +2 -0
  77. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  78. package/dist/planning/plan-lifecycle.js +1 -0
  79. package/dist/planning/plan-lifecycle.js.map +1 -1
  80. package/dist/planning/planner-types.d.ts +2 -0
  81. package/dist/planning/planner-types.d.ts.map +1 -1
  82. package/dist/plugins/types.d.ts +21 -21
  83. package/dist/queue/pipeline-runner.d.ts.map +1 -1
  84. package/dist/queue/pipeline-runner.js +4 -0
  85. package/dist/queue/pipeline-runner.js.map +1 -1
  86. package/dist/runtime/context-health.d.ts +14 -1
  87. package/dist/runtime/context-health.d.ts.map +1 -1
  88. package/dist/runtime/context-health.js +30 -2
  89. package/dist/runtime/context-health.js.map +1 -1
  90. package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
  91. package/dist/runtime/curator-extra-ops.js +9 -1
  92. package/dist/runtime/curator-extra-ops.js.map +1 -1
  93. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  94. package/dist/runtime/facades/memory-facade.js +169 -0
  95. package/dist/runtime/facades/memory-facade.js.map +1 -1
  96. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  97. package/dist/runtime/orchestrate-ops.js +133 -4
  98. package/dist/runtime/orchestrate-ops.js.map +1 -1
  99. package/dist/runtime/runtime.d.ts.map +1 -1
  100. package/dist/runtime/runtime.js +128 -90
  101. package/dist/runtime/runtime.js.map +1 -1
  102. package/dist/runtime/session-briefing.d.ts.map +1 -1
  103. package/dist/runtime/session-briefing.js +44 -11
  104. package/dist/runtime/session-briefing.js.map +1 -1
  105. package/dist/runtime/shutdown-registry.d.ts +36 -0
  106. package/dist/runtime/shutdown-registry.d.ts.map +1 -0
  107. package/dist/runtime/shutdown-registry.js +74 -0
  108. package/dist/runtime/shutdown-registry.js.map +1 -0
  109. package/dist/runtime/types.d.ts +10 -1
  110. package/dist/runtime/types.d.ts.map +1 -1
  111. package/dist/session/compaction-evaluator.d.ts +20 -0
  112. package/dist/session/compaction-evaluator.d.ts.map +1 -0
  113. package/dist/session/compaction-evaluator.js +73 -0
  114. package/dist/session/compaction-evaluator.js.map +1 -0
  115. package/dist/session/compaction-policy.d.ts +50 -0
  116. package/dist/session/compaction-policy.d.ts.map +1 -0
  117. package/dist/session/compaction-policy.js +17 -0
  118. package/dist/session/compaction-policy.js.map +1 -0
  119. package/dist/session/handoff-renderer.d.ts +22 -0
  120. package/dist/session/handoff-renderer.d.ts.map +1 -0
  121. package/dist/session/handoff-renderer.js +49 -0
  122. package/dist/session/handoff-renderer.js.map +1 -0
  123. package/dist/session/index.d.ts +6 -0
  124. package/dist/session/index.d.ts.map +1 -0
  125. package/dist/session/index.js +5 -0
  126. package/dist/session/index.js.map +1 -0
  127. package/dist/session/policy-resolver.d.ts +20 -0
  128. package/dist/session/policy-resolver.d.ts.map +1 -0
  129. package/dist/session/policy-resolver.js +28 -0
  130. package/dist/session/policy-resolver.js.map +1 -0
  131. package/dist/skills/sync-skills.d.ts +27 -0
  132. package/dist/skills/sync-skills.d.ts.map +1 -1
  133. package/dist/skills/sync-skills.js +92 -1
  134. package/dist/skills/sync-skills.js.map +1 -1
  135. package/dist/skills/trust-classifier.d.ts +32 -0
  136. package/dist/skills/trust-classifier.d.ts.map +1 -0
  137. package/dist/skills/trust-classifier.js +109 -0
  138. package/dist/skills/trust-classifier.js.map +1 -0
  139. package/dist/subagent/concurrency-manager.d.ts +29 -0
  140. package/dist/subagent/concurrency-manager.d.ts.map +1 -0
  141. package/dist/subagent/concurrency-manager.js +73 -0
  142. package/dist/subagent/concurrency-manager.js.map +1 -0
  143. package/dist/subagent/dispatcher.d.ts +45 -0
  144. package/dist/subagent/dispatcher.d.ts.map +1 -0
  145. package/dist/subagent/dispatcher.js +271 -0
  146. package/dist/subagent/dispatcher.js.map +1 -0
  147. package/dist/subagent/index.d.ts +14 -0
  148. package/dist/subagent/index.d.ts.map +1 -0
  149. package/dist/subagent/index.js +15 -0
  150. package/dist/subagent/index.js.map +1 -0
  151. package/dist/subagent/orphan-reaper.d.ts +37 -0
  152. package/dist/subagent/orphan-reaper.d.ts.map +1 -0
  153. package/dist/subagent/orphan-reaper.js +71 -0
  154. package/dist/subagent/orphan-reaper.js.map +1 -0
  155. package/dist/subagent/result-aggregator.d.ts +7 -0
  156. package/dist/subagent/result-aggregator.d.ts.map +1 -0
  157. package/dist/subagent/result-aggregator.js +57 -0
  158. package/dist/subagent/result-aggregator.js.map +1 -0
  159. package/dist/subagent/task-checkout.d.ts +36 -0
  160. package/dist/subagent/task-checkout.d.ts.map +1 -0
  161. package/dist/subagent/task-checkout.js +52 -0
  162. package/dist/subagent/task-checkout.js.map +1 -0
  163. package/dist/subagent/types.d.ts +114 -0
  164. package/dist/subagent/types.d.ts.map +1 -0
  165. package/dist/subagent/types.js +9 -0
  166. package/dist/subagent/types.js.map +1 -0
  167. package/dist/subagent/workspace-resolver.d.ts +35 -0
  168. package/dist/subagent/workspace-resolver.d.ts.map +1 -0
  169. package/dist/subagent/workspace-resolver.js +99 -0
  170. package/dist/subagent/workspace-resolver.js.map +1 -0
  171. package/dist/transport/http-server.d.ts.map +1 -1
  172. package/dist/transport/http-server.js +49 -3
  173. package/dist/transport/http-server.js.map +1 -1
  174. package/dist/transport/ws-server.d.ts.map +1 -1
  175. package/dist/transport/ws-server.js +7 -0
  176. package/dist/transport/ws-server.js.map +1 -1
  177. package/dist/vault/linking.d.ts +3 -4
  178. package/dist/vault/linking.d.ts.map +1 -1
  179. package/dist/vault/linking.js +79 -32
  180. package/dist/vault/linking.js.map +1 -1
  181. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  182. package/dist/vault/vault-maintenance.js +7 -14
  183. package/dist/vault/vault-maintenance.js.map +1 -1
  184. package/dist/vault/vault-memories.d.ts.map +1 -1
  185. package/dist/vault/vault-memories.js +19 -9
  186. package/dist/vault/vault-memories.js.map +1 -1
  187. package/dist/vault/vault-schema.d.ts +1 -0
  188. package/dist/vault/vault-schema.d.ts.map +1 -1
  189. package/dist/vault/vault-schema.js +20 -0
  190. package/dist/vault/vault-schema.js.map +1 -1
  191. package/dist/vault/vault.d.ts.map +1 -1
  192. package/dist/vault/vault.js +7 -3
  193. package/dist/vault/vault.js.map +1 -1
  194. package/package.json +5 -2
  195. package/src/__tests__/adapters/claude-code-adapter.test.ts +167 -0
  196. package/src/__tests__/adapters/registry.test.ts +100 -0
  197. package/src/__tests__/packs/pack-lifecycle.test.ts +379 -0
  198. package/src/__tests__/subagent/concurrency-manager.test.ts +132 -0
  199. package/src/__tests__/subagent/dispatcher.test.ts +195 -0
  200. package/src/__tests__/subagent/orphan-reaper.test.ts +141 -0
  201. package/src/__tests__/subagent/result-aggregator.test.ts +141 -0
  202. package/src/__tests__/subagent/task-checkout.test.ts +86 -0
  203. package/src/__tests__/subagent/workspace-resolver.test.ts +138 -0
  204. package/src/adapters/claude-code-adapter.ts +163 -0
  205. package/src/adapters/index.ts +22 -0
  206. package/src/adapters/registry.ts +53 -0
  207. package/src/adapters/types.ts +114 -0
  208. package/src/curator/curator.ts +1 -0
  209. package/src/index.ts +78 -1
  210. package/src/packs/index.ts +9 -1
  211. package/src/packs/lockfile.ts +70 -5
  212. package/src/packs/pack-installer.ts +78 -2
  213. package/src/packs/pack-lifecycle.ts +115 -0
  214. package/src/packs/pack-lockfile.test.ts +1 -1
  215. package/src/packs/pack-system.test.ts +1 -1
  216. package/src/packs/types.ts +72 -2
  217. package/src/persistence/sqlite-provider.ts +26 -2
  218. package/src/planning/github-projection.ts +6 -0
  219. package/src/planning/goal-ancestry.test.ts +427 -0
  220. package/src/planning/goal-ancestry.ts +187 -0
  221. package/src/planning/plan-lifecycle.ts +3 -0
  222. package/src/planning/planner-types.ts +2 -0
  223. package/src/runtime/admin-setup-ops.test.ts +9 -4
  224. package/src/runtime/context-health.ts +42 -2
  225. package/src/runtime/orchestrate-ops.ts +153 -1
  226. package/src/runtime/runtime.ts +15 -0
  227. package/src/runtime/session-briefing.test.ts +94 -2
  228. package/src/runtime/session-briefing.ts +48 -12
  229. package/src/runtime/types.ts +6 -0
  230. package/src/session/compaction-evaluator.ts +87 -0
  231. package/src/session/compaction-policy.ts +66 -0
  232. package/src/session/compaction.test.ts +259 -0
  233. package/src/session/handoff-renderer.ts +56 -0
  234. package/src/session/index.ts +12 -0
  235. package/src/session/policy-resolver.ts +34 -0
  236. package/src/skills/sync-skills.ts +114 -1
  237. package/src/skills/trust-classifier.test.ts +252 -0
  238. package/src/skills/trust-classifier.ts +127 -0
  239. package/src/subagent/concurrency-manager.ts +89 -0
  240. package/src/subagent/dispatcher.ts +342 -0
  241. package/src/subagent/index.ts +28 -0
  242. package/src/subagent/orphan-reaper.ts +82 -0
  243. package/src/subagent/result-aggregator.ts +66 -0
  244. package/src/subagent/task-checkout.ts +60 -0
  245. package/src/subagent/types.ts +138 -0
  246. package/src/subagent/workspace-resolver.ts +117 -0
  247. package/src/vault/vault-scaling.test.ts +3 -2
  248. package/vitest.config.ts +2 -0
  249. package/src/hooks/index.ts +0 -6
@@ -0,0 +1,271 @@
1
+ /**
2
+ * SubagentDispatcher — the core orchestrator for subagent execution.
3
+ *
4
+ * Composes: TaskCheckout, WorkspaceResolver, ConcurrencyManager,
5
+ * OrphanReaper, and RuntimeAdapterRegistry to dispatch tasks to
6
+ * child agent processes.
7
+ */
8
+ import { TaskCheckout } from './task-checkout.js';
9
+ import { WorkspaceResolver } from './workspace-resolver.js';
10
+ import { ConcurrencyManager } from './concurrency-manager.js';
11
+ import { OrphanReaper } from './orphan-reaper.js';
12
+ import { aggregate } from './result-aggregator.js';
13
+ import { GoalAncestry } from '../planning/goal-ancestry.js';
14
+ const DEFAULT_TIMEOUT = 300_000; // 5 minutes
15
+ const DEFAULT_MAX_CONCURRENT = 3;
16
+ export class SubagentDispatcher {
17
+ checkout = new TaskCheckout();
18
+ workspace;
19
+ concurrency = new ConcurrencyManager();
20
+ reaper;
21
+ adapterRegistry;
22
+ goalAncestry;
23
+ constructor(config) {
24
+ this.adapterRegistry = config.adapterRegistry;
25
+ if (config.goalRepository) {
26
+ this.goalAncestry = new GoalAncestry(config.goalRepository);
27
+ }
28
+ this.workspace = new WorkspaceResolver(config.baseDir ?? process.cwd());
29
+ this.reaper = new OrphanReaper((taskId) => {
30
+ // On orphan: release the task claim and clean up workspace
31
+ this.checkout.release(taskId);
32
+ this.workspace.cleanup(taskId);
33
+ });
34
+ }
35
+ /**
36
+ * Dispatch one or more tasks to subagents.
37
+ *
38
+ * Tasks run in parallel by default (controlled by options.parallel).
39
+ * Each task goes through: claim → resolve workspace → acquire slot →
40
+ * execute via adapter → collect result.
41
+ */
42
+ async dispatch(tasks, options = {}) {
43
+ const { parallel = true, maxConcurrent = DEFAULT_MAX_CONCURRENT, worktreeIsolation = false, timeout = DEFAULT_TIMEOUT, onTaskUpdate, } = options;
44
+ if (tasks.length === 0) {
45
+ return aggregate([]);
46
+ }
47
+ // Resolve dependency order
48
+ const ordered = this.resolveDependencies(tasks);
49
+ if (parallel) {
50
+ // Run independent tasks in parallel, respecting dependencies
51
+ const results = await this.dispatchParallel(ordered, {
52
+ maxConcurrent,
53
+ worktreeIsolation,
54
+ timeout,
55
+ onTaskUpdate,
56
+ });
57
+ return aggregate(results);
58
+ }
59
+ // Sequential dispatch — await in loop is intentional (tasks must run one at a time)
60
+ const results = [];
61
+ for (const task of ordered) {
62
+ // eslint-disable-line no-await-in-loop
63
+ onTaskUpdate?.(task.taskId, 'running');
64
+ const result = await this.executeTask(task, worktreeIsolation, timeout);
65
+ results.push(result);
66
+ onTaskUpdate?.(task.taskId, result.status);
67
+ // Stop on failure in sequential mode
68
+ if (result.exitCode !== 0)
69
+ break;
70
+ }
71
+ return aggregate(results);
72
+ }
73
+ /** Clean up all resources (worktrees, claims, concurrency) */
74
+ cleanup() {
75
+ this.workspace.cleanupAll();
76
+ this.checkout.releaseAll();
77
+ this.concurrency.reset();
78
+ this.reaper.clear();
79
+ }
80
+ /** Run orphan detection and cleanup */
81
+ reapOrphans() {
82
+ const orphaned = this.reaper.reap();
83
+ return orphaned.map((p) => ({
84
+ taskId: p.taskId,
85
+ status: 'orphaned',
86
+ exitCode: 1,
87
+ error: `Process ${p.pid} died unexpectedly`,
88
+ durationMs: Date.now() - p.registeredAt,
89
+ pid: p.pid,
90
+ }));
91
+ }
92
+ // ── Internal ──────────────────────────────────────────────────────
93
+ async dispatchParallel(tasks, opts) {
94
+ const results = new Map();
95
+ const pending = new Map();
96
+ const completed = new Set();
97
+ // Initialize all tasks as pending
98
+ for (const task of tasks) {
99
+ pending.set(task.taskId, task);
100
+ }
101
+ // Process in waves until all done
102
+ while (pending.size > 0) {
103
+ // Find tasks whose dependencies are all completed
104
+ const ready = [];
105
+ for (const [_id, task] of pending) {
106
+ const deps = task.dependencies ?? [];
107
+ if (deps.every((d) => completed.has(d))) {
108
+ ready.push(task);
109
+ }
110
+ }
111
+ if (ready.length === 0 && pending.size > 0) {
112
+ // Deadlock — remaining tasks have unmet dependencies
113
+ for (const [deadId, task] of pending) {
114
+ results.set(deadId, {
115
+ taskId: deadId,
116
+ status: 'failed',
117
+ exitCode: 1,
118
+ error: `Unresolvable dependencies: ${(task.dependencies ?? []).filter((d) => !completed.has(d)).join(', ')}`,
119
+ durationMs: 0,
120
+ });
121
+ }
122
+ break;
123
+ }
124
+ // Dispatch ready tasks in parallel with concurrency control
125
+ // eslint-disable-next-line no-await-in-loop -- waves must complete before next wave
126
+ const waveResults = await Promise.allSettled(ready.map(async (task) => {
127
+ opts.onTaskUpdate?.(task.taskId, 'running');
128
+ await this.concurrency.acquire(task.runtime ?? 'default', opts.maxConcurrent);
129
+ try {
130
+ return await this.executeTask(task, opts.worktreeIsolation, task.timeout ?? opts.timeout);
131
+ }
132
+ finally {
133
+ this.concurrency.release(task.runtime ?? 'default');
134
+ }
135
+ }));
136
+ // Collect results
137
+ for (let i = 0; i < ready.length; i++) {
138
+ const task = ready[i];
139
+ const settled = waveResults[i];
140
+ const result = settled.status === 'fulfilled'
141
+ ? settled.value
142
+ : {
143
+ taskId: task.taskId,
144
+ status: 'failed',
145
+ exitCode: 1,
146
+ error: settled.reason?.message ?? 'Unknown error',
147
+ durationMs: 0,
148
+ };
149
+ results.set(task.taskId, result);
150
+ completed.add(task.taskId);
151
+ pending.delete(task.taskId);
152
+ opts.onTaskUpdate?.(task.taskId, result.status);
153
+ }
154
+ }
155
+ // Return in original task order
156
+ return tasks.map((t) => results.get(t.taskId));
157
+ }
158
+ async executeTask(task, worktreeIsolation, timeout) {
159
+ const startTime = Date.now();
160
+ // 1. Claim the task
161
+ const claimed = this.checkout.claim(task.taskId, 'dispatcher');
162
+ if (!claimed) {
163
+ return {
164
+ taskId: task.taskId,
165
+ status: 'failed',
166
+ exitCode: 1,
167
+ error: 'Task already claimed by another process',
168
+ durationMs: Date.now() - startTime,
169
+ };
170
+ }
171
+ // 2. Resolve workspace
172
+ const workspace = this.workspace.resolve(task.taskId, task.workspace, worktreeIsolation);
173
+ // 3. Get adapter
174
+ const adapterType = task.runtime ?? this.getDefaultAdapterType();
175
+ let adapter;
176
+ try {
177
+ adapter = this.adapterRegistry.get(adapterType);
178
+ }
179
+ catch {
180
+ this.checkout.release(task.taskId);
181
+ return {
182
+ taskId: task.taskId,
183
+ status: 'failed',
184
+ exitCode: 1,
185
+ error: `Adapter '${adapterType}' not found in registry`,
186
+ durationMs: Date.now() - startTime,
187
+ };
188
+ }
189
+ // 4. Inject goal ancestry context if available
190
+ let enrichedConfig = { ...task.config, timeout };
191
+ const goalId = task.config?.goalId;
192
+ if (goalId && this.goalAncestry) {
193
+ enrichedConfig =
194
+ this.goalAncestry.inject({ config: enrichedConfig }, goalId).config ?? enrichedConfig;
195
+ }
196
+ // 5. Execute with timeout
197
+ try {
198
+ const resultPromise = adapter.execute({
199
+ runId: `subagent-${task.taskId}-${Date.now()}`,
200
+ prompt: task.prompt,
201
+ workspace,
202
+ config: enrichedConfig,
203
+ });
204
+ const timeoutPromise = new Promise((_, reject) => {
205
+ setTimeout(() => reject(new Error('Task timed out')), timeout);
206
+ });
207
+ const adapterResult = await Promise.race([resultPromise, timeoutPromise]);
208
+ return {
209
+ taskId: task.taskId,
210
+ status: adapterResult.exitCode === 0 ? 'completed' : 'failed',
211
+ exitCode: adapterResult.exitCode,
212
+ summary: adapterResult.summary,
213
+ usage: adapterResult.usage,
214
+ sessionState: adapterResult.sessionState,
215
+ durationMs: Date.now() - startTime,
216
+ };
217
+ }
218
+ catch (err) {
219
+ return {
220
+ taskId: task.taskId,
221
+ status: 'failed',
222
+ exitCode: 1,
223
+ error: err instanceof Error ? err.message : String(err),
224
+ durationMs: Date.now() - startTime,
225
+ };
226
+ }
227
+ finally {
228
+ // Cleanup
229
+ this.checkout.release(task.taskId);
230
+ if (worktreeIsolation) {
231
+ this.workspace.cleanup(task.taskId);
232
+ }
233
+ }
234
+ }
235
+ /** Topological sort by dependencies (stable — preserves input order for equal deps) */
236
+ resolveDependencies(tasks) {
237
+ const taskMap = new Map(tasks.map((t) => [t.taskId, t]));
238
+ const sorted = [];
239
+ const visited = new Set();
240
+ const visiting = new Set();
241
+ const visit = (id) => {
242
+ if (visited.has(id))
243
+ return;
244
+ if (visiting.has(id))
245
+ return; // cycle — skip
246
+ visiting.add(id);
247
+ const task = taskMap.get(id);
248
+ if (task) {
249
+ for (const dep of task.dependencies ?? []) {
250
+ visit(dep);
251
+ }
252
+ visited.add(id);
253
+ visiting.delete(id);
254
+ sorted.push(task);
255
+ }
256
+ };
257
+ for (const task of tasks) {
258
+ visit(task.taskId);
259
+ }
260
+ return sorted;
261
+ }
262
+ getDefaultAdapterType() {
263
+ try {
264
+ return this.adapterRegistry.getDefault().type;
265
+ }
266
+ catch {
267
+ return 'claude-code';
268
+ }
269
+ }
270
+ }
271
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/subagent/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Subagent runtime engine — spawn, manage, and aggregate results
3
+ * from child agent processes.
4
+ *
5
+ * @module subagent
6
+ */
7
+ export type { SubagentTask, SubagentStatus, SubagentResult, DispatchOptions, AggregatedResult, ClaimInfo, WorktreeInfo, TrackedProcess, } from './types.js';
8
+ export { TaskCheckout } from './task-checkout.js';
9
+ export { WorkspaceResolver } from './workspace-resolver.js';
10
+ export { ConcurrencyManager } from './concurrency-manager.js';
11
+ export { OrphanReaper } from './orphan-reaper.js';
12
+ export { aggregate as aggregateResults } from './result-aggregator.js';
13
+ export { SubagentDispatcher } from './dispatcher.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Subagent runtime engine — spawn, manage, and aggregate results
3
+ * from child agent processes.
4
+ *
5
+ * @module subagent
6
+ */
7
+ // Components
8
+ export { TaskCheckout } from './task-checkout.js';
9
+ export { WorkspaceResolver } from './workspace-resolver.js';
10
+ export { ConcurrencyManager } from './concurrency-manager.js';
11
+ export { OrphanReaper } from './orphan-reaper.js';
12
+ export { aggregate as aggregateResults } from './result-aggregator.js';
13
+ // Dispatcher
14
+ export { SubagentDispatcher } from './dispatcher.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,aAAa;AACb,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,aAAa;AACb,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * OrphanReaper — tracks spawned child processes and detects dead/orphaned ones.
3
+ *
4
+ * Uses `process.kill(pid, 0)` (signal 0) as an existence check:
5
+ * - No error → process is alive
6
+ * - ESRCH → process is dead (reap it)
7
+ * - EPERM → process is alive but we lack permission to signal it
8
+ */
9
+ import type { TrackedProcess } from './types.js';
10
+ export declare class OrphanReaper {
11
+ private readonly tracked;
12
+ private readonly onOrphan?;
13
+ constructor(onOrphan?: (taskId: string, pid: number) => void);
14
+ /** Start tracking a process. */
15
+ register(pid: number, taskId: string): void;
16
+ /** Stop tracking a process (called on normal completion). */
17
+ unregister(pid: number): void;
18
+ /**
19
+ * Check each tracked PID for liveness. Dead processes are removed from
20
+ * tracking, the onOrphan callback is invoked, and they are returned.
21
+ */
22
+ reap(): TrackedProcess[];
23
+ /** Return all currently tracked processes. */
24
+ listTracked(): TrackedProcess[];
25
+ /** Check if a PID is currently tracked. */
26
+ isTracked(pid: number): boolean;
27
+ /** Clear all tracked processes without killing them. */
28
+ clear(): void;
29
+ /**
30
+ * Signal-0 existence check.
31
+ * - No error → alive
32
+ * - EPERM → alive (exists but we can't signal it)
33
+ * - ESRCH → dead
34
+ */
35
+ private isAlive;
36
+ }
37
+ //# sourceMappingURL=orphan-reaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-reaper.d.ts","sourceRoot":"","sources":["../../src/subagent/orphan-reaper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAwC;gBAEtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI;IAI5D,gCAAgC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI3C,6DAA6D;IAC7D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;;OAGG;IACH,IAAI,IAAI,cAAc,EAAE;IAcxB,8CAA8C;IAC9C,WAAW,IAAI,cAAc,EAAE;IAI/B,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI/B,wDAAwD;IACxD,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * OrphanReaper — tracks spawned child processes and detects dead/orphaned ones.
3
+ *
4
+ * Uses `process.kill(pid, 0)` (signal 0) as an existence check:
5
+ * - No error → process is alive
6
+ * - ESRCH → process is dead (reap it)
7
+ * - EPERM → process is alive but we lack permission to signal it
8
+ */
9
+ export class OrphanReaper {
10
+ tracked = new Map();
11
+ onOrphan;
12
+ constructor(onOrphan) {
13
+ this.onOrphan = onOrphan;
14
+ }
15
+ /** Start tracking a process. */
16
+ register(pid, taskId) {
17
+ this.tracked.set(pid, { pid, taskId, registeredAt: Date.now() });
18
+ }
19
+ /** Stop tracking a process (called on normal completion). */
20
+ unregister(pid) {
21
+ this.tracked.delete(pid);
22
+ }
23
+ /**
24
+ * Check each tracked PID for liveness. Dead processes are removed from
25
+ * tracking, the onOrphan callback is invoked, and they are returned.
26
+ */
27
+ reap() {
28
+ const reaped = [];
29
+ for (const [pid, entry] of this.tracked) {
30
+ if (!this.isAlive(pid)) {
31
+ this.tracked.delete(pid);
32
+ this.onOrphan?.(entry.taskId, pid);
33
+ reaped.push(entry);
34
+ }
35
+ }
36
+ return reaped;
37
+ }
38
+ /** Return all currently tracked processes. */
39
+ listTracked() {
40
+ return [...this.tracked.values()];
41
+ }
42
+ /** Check if a PID is currently tracked. */
43
+ isTracked(pid) {
44
+ return this.tracked.has(pid);
45
+ }
46
+ /** Clear all tracked processes without killing them. */
47
+ clear() {
48
+ this.tracked.clear();
49
+ }
50
+ // ── internals ──────────────────────────────────────────────────────
51
+ /**
52
+ * Signal-0 existence check.
53
+ * - No error → alive
54
+ * - EPERM → alive (exists but we can't signal it)
55
+ * - ESRCH → dead
56
+ */
57
+ isAlive(pid) {
58
+ try {
59
+ process.kill(pid, 0);
60
+ return true;
61
+ }
62
+ catch (err) {
63
+ const code = err.code;
64
+ if (code === 'EPERM')
65
+ return true;
66
+ // ESRCH or any other error → treat as dead
67
+ return false;
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=orphan-reaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-reaper.js","sourceRoot":"","sources":["../../src/subagent/orphan-reaper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,QAAQ,CAAyC;IAElE,YAAY,QAAgD;QAC1D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,gCAAgC;IAChC,QAAQ,CAAC,GAAW,EAAE,MAAc;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,6DAA6D;IAC7D,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8CAA8C;IAC9C,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,2CAA2C;IAC3C,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,wDAAwD;IACxD,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,sEAAsE;IAEtE;;;;;OAKG;IACK,OAAO,CAAC,GAAW;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;YACjD,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YAClC,2CAA2C;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Result aggregator — merges results from multiple parallel subagent
3
+ * executions into a single summary.
4
+ */
5
+ import type { AggregatedResult, SubagentResult } from './types.js';
6
+ export declare function aggregate(results: SubagentResult[]): AggregatedResult;
7
+ //# sourceMappingURL=result-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-aggregator.d.ts","sourceRoot":"","sources":["../../src/subagent/result-aggregator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,gBAAgB,CA0DrE"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Result aggregator — merges results from multiple parallel subagent
3
+ * executions into a single summary.
4
+ */
5
+ export function aggregate(results) {
6
+ if (results.length === 0) {
7
+ return {
8
+ status: 'all-passed',
9
+ totalTasks: 0,
10
+ completed: 0,
11
+ failed: 0,
12
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
13
+ filesChanged: [],
14
+ combinedSummary: '',
15
+ durationMs: 0,
16
+ results: [],
17
+ };
18
+ }
19
+ const completed = results.filter((r) => r.exitCode === 0).length;
20
+ const failed = results.length - completed;
21
+ const status = failed === 0 ? 'all-passed' : completed === 0 ? 'all-failed' : 'partial';
22
+ const totalUsage = {
23
+ inputTokens: 0,
24
+ outputTokens: 0,
25
+ totalTokens: 0,
26
+ };
27
+ for (const r of results) {
28
+ totalUsage.inputTokens += r.usage?.inputTokens ?? 0;
29
+ totalUsage.outputTokens += r.usage?.outputTokens ?? 0;
30
+ totalUsage.totalTokens += r.usage?.totalTokens ?? 0;
31
+ }
32
+ const fileSet = new Set();
33
+ for (const r of results) {
34
+ if (r.filesChanged) {
35
+ for (const f of r.filesChanged)
36
+ fileSet.add(f);
37
+ }
38
+ }
39
+ const combinedSummary = results
40
+ .filter((r) => r.summary)
41
+ .map((r) => `[${r.taskId}] ${r.summary}`)
42
+ .join('\n');
43
+ // Parallel wall-clock: max of all durations
44
+ const durationMs = Math.max(...results.map((r) => r.durationMs));
45
+ return {
46
+ status,
47
+ totalTasks: results.length,
48
+ completed,
49
+ failed,
50
+ totalUsage,
51
+ filesChanged: [...fileSet],
52
+ combinedSummary,
53
+ durationMs,
54
+ results,
55
+ };
56
+ }
57
+ //# sourceMappingURL=result-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-aggregator.js","sourceRoot":"","sources":["../../src/subagent/result-aggregator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;YAC/D,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAE1C,MAAM,MAAM,GACV,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,MAAM,UAAU,GAAG;QACjB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;KACf,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;QACpD,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;QACtD,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,OAAO;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,4CAA4C;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,SAAS;QACT,MAAM;QACN,UAAU;QACV,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC;QAC1B,eAAe;QACf,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Atomic task claim system — prevents two subagents from working the same task.
3
+ *
4
+ * Pure in-memory Map backing store. No async, no external deps.
5
+ */
6
+ import type { ClaimInfo } from './types.js';
7
+ export declare class TaskCheckout {
8
+ private readonly claims;
9
+ /**
10
+ * Attempt to claim a task for a claimer.
11
+ * Returns true if the claim succeeds (or the same claimer already holds it).
12
+ * Returns false if the task is already claimed by a different claimer.
13
+ */
14
+ claim(taskId: string, claimerId: string): boolean;
15
+ /**
16
+ * Release a claimed task. Returns true if released, false if not claimed.
17
+ */
18
+ release(taskId: string): boolean;
19
+ /**
20
+ * Get claim info for a task, or undefined if unclaimed.
21
+ */
22
+ getClaimer(taskId: string): ClaimInfo | undefined;
23
+ /**
24
+ * List all active claims.
25
+ */
26
+ listClaimed(): ClaimInfo[];
27
+ /**
28
+ * Check whether a task is available (unclaimed).
29
+ */
30
+ isAvailable(taskId: string): boolean;
31
+ /**
32
+ * Clear all claims. Useful for cleanup between dispatch rounds.
33
+ */
34
+ releaseAll(): void;
35
+ }
36
+ //# sourceMappingURL=task-checkout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-checkout.d.ts","sourceRoot":"","sources":["../../src/subagent/task-checkout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEvD;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IASjD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD;;OAEG;IACH,WAAW,IAAI,SAAS,EAAE;IAI1B;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Atomic task claim system — prevents two subagents from working the same task.
3
+ *
4
+ * Pure in-memory Map backing store. No async, no external deps.
5
+ */
6
+ export class TaskCheckout {
7
+ claims = new Map();
8
+ /**
9
+ * Attempt to claim a task for a claimer.
10
+ * Returns true if the claim succeeds (or the same claimer already holds it).
11
+ * Returns false if the task is already claimed by a different claimer.
12
+ */
13
+ claim(taskId, claimerId) {
14
+ const existing = this.claims.get(taskId);
15
+ if (existing) {
16
+ return existing.claimerId === claimerId;
17
+ }
18
+ this.claims.set(taskId, { taskId, claimerId, claimedAt: Date.now() });
19
+ return true;
20
+ }
21
+ /**
22
+ * Release a claimed task. Returns true if released, false if not claimed.
23
+ */
24
+ release(taskId) {
25
+ return this.claims.delete(taskId);
26
+ }
27
+ /**
28
+ * Get claim info for a task, or undefined if unclaimed.
29
+ */
30
+ getClaimer(taskId) {
31
+ return this.claims.get(taskId);
32
+ }
33
+ /**
34
+ * List all active claims.
35
+ */
36
+ listClaimed() {
37
+ return [...this.claims.values()];
38
+ }
39
+ /**
40
+ * Check whether a task is available (unclaimed).
41
+ */
42
+ isAvailable(taskId) {
43
+ return !this.claims.has(taskId);
44
+ }
45
+ /**
46
+ * Clear all claims. Useful for cleanup between dispatch rounds.
47
+ */
48
+ releaseAll() {
49
+ this.claims.clear();
50
+ }
51
+ }
52
+ //# sourceMappingURL=task-checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-checkout.js","sourceRoot":"","sources":["../../src/subagent/task-checkout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEvD;;;;OAIG;IACH,KAAK,CAAC,MAAc,EAAE,SAAiB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}