@martinloop/mcp 0.7.0 → 0.8.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 (73) hide show
  1. package/dist/package-version.d.ts +1 -1
  2. package/dist/package-version.js +1 -1
  3. package/dist/vendor/adapters/claude-cli.d.ts +11 -1
  4. package/dist/vendor/adapters/claude-cli.js +285 -71
  5. package/dist/vendor/adapters/cli-bridge.d.ts +12 -3
  6. package/dist/vendor/adapters/cli-bridge.js +129 -149
  7. package/dist/vendor/adapters/codex-cli.d.ts +3 -3
  8. package/dist/vendor/adapters/codex-cli.js +10 -24
  9. package/dist/vendor/adapters/codex-host.js +127 -132
  10. package/dist/vendor/adapters/index.d.ts +2 -1
  11. package/dist/vendor/adapters/index.js +2 -1
  12. package/dist/vendor/adapters/openai-compatible.js +88 -6
  13. package/dist/vendor/adapters/process-supervisor.d.ts +60 -0
  14. package/dist/vendor/adapters/process-supervisor.js +541 -0
  15. package/dist/vendor/adapters/verifier-only.d.ts +10 -1
  16. package/dist/vendor/adapters/verifier-only.js +43 -1
  17. package/dist/vendor/contracts/external-outcome.d.ts +102 -0
  18. package/dist/vendor/contracts/external-outcome.js +226 -0
  19. package/dist/vendor/contracts/index.d.ts +8 -1
  20. package/dist/vendor/contracts/index.js +2 -0
  21. package/dist/vendor/contracts/swarm-hosted.d.ts +204 -0
  22. package/dist/vendor/contracts/swarm-hosted.js +629 -0
  23. package/dist/vendor/contracts/swarm.d.ts +449 -0
  24. package/dist/vendor/contracts/swarm.js +550 -0
  25. package/dist/vendor/core/external-outcome.d.ts +34 -0
  26. package/dist/vendor/core/external-outcome.js +515 -0
  27. package/dist/vendor/core/grounding.js +1 -1
  28. package/dist/vendor/core/index.d.ts +47 -1
  29. package/dist/vendor/core/index.js +53 -3
  30. package/dist/vendor/core/leash.d.ts +1 -0
  31. package/dist/vendor/core/leash.js +13 -0
  32. package/dist/vendor/core/persistence/integrity.d.ts +4 -0
  33. package/dist/vendor/core/persistence/integrity.js +19 -6
  34. package/dist/vendor/core/persistence/swarm-integrity.d.ts +63 -0
  35. package/dist/vendor/core/persistence/swarm-integrity.js +309 -0
  36. package/dist/vendor/core/swarm/candidates.d.ts +78 -0
  37. package/dist/vendor/core/swarm/candidates.js +810 -0
  38. package/dist/vendor/core/swarm/evidence-projection.d.ts +87 -0
  39. package/dist/vendor/core/swarm/evidence-projection.js +128 -0
  40. package/dist/vendor/core/swarm/evidence.d.ts +40 -0
  41. package/dist/vendor/core/swarm/evidence.js +575 -0
  42. package/dist/vendor/core/swarm/hosted-export.d.ts +48 -0
  43. package/dist/vendor/core/swarm/hosted-export.js +362 -0
  44. package/dist/vendor/core/swarm/hosted-projection.d.ts +5 -0
  45. package/dist/vendor/core/swarm/hosted-projection.js +258 -0
  46. package/dist/vendor/core/swarm/index.d.ts +110 -0
  47. package/dist/vendor/core/swarm/index.js +1060 -0
  48. package/dist/vendor/core/swarm/integration.d.ts +76 -0
  49. package/dist/vendor/core/swarm/integration.js +615 -0
  50. package/dist/vendor/core/swarm/lifecycle.d.ts +72 -0
  51. package/dist/vendor/core/swarm/lifecycle.js +252 -0
  52. package/dist/vendor/core/swarm/live-runtime.d.ts +78 -0
  53. package/dist/vendor/core/swarm/live-runtime.js +1482 -0
  54. package/dist/vendor/core/swarm/live-store.d.ts +99 -0
  55. package/dist/vendor/core/swarm/live-store.js +860 -0
  56. package/dist/vendor/core/swarm/operational-reader.d.ts +17 -0
  57. package/dist/vendor/core/swarm/operational-reader.js +96 -0
  58. package/dist/vendor/core/swarm/operations.d.ts +29 -0
  59. package/dist/vendor/core/swarm/operations.js +128 -0
  60. package/dist/vendor/core/swarm/parent-receipt.d.ts +13 -0
  61. package/dist/vendor/core/swarm/parent-receipt.js +489 -0
  62. package/dist/vendor/core/swarm/receipt-projection.d.ts +26 -0
  63. package/dist/vendor/core/swarm/receipt-projection.js +120 -0
  64. package/dist/vendor/core/swarm/scheduler.d.ts +92 -0
  65. package/dist/vendor/core/swarm/scheduler.js +555 -0
  66. package/dist/vendor/core/swarm/verification.d.ts +70 -0
  67. package/dist/vendor/core/swarm/verification.js +295 -0
  68. package/dist/vendor/core/swarm/workspaces.d.ts +77 -0
  69. package/dist/vendor/core/swarm/workspaces.js +488 -0
  70. package/dist/vendor/core/verified-handoff.d.ts +4 -0
  71. package/dist/vendor/core/verified-handoff.js +4 -0
  72. package/package.json +1 -1
  73. package/server.json +2 -2
@@ -0,0 +1,72 @@
1
+ import { SWARM_SCHEMA_VERSION, type SwarmBudgetLedger, type SwarmCleanupRecord, type SwarmEvent, type SwarmRunRecord } from "../../contracts/index.js";
2
+ import type { SwarmWorkspaceManager, SwarmWorkspaceRuntimeHandle } from "./workspaces.js";
3
+ export interface SwarmChildProcessClosure {
4
+ readonly state: "closed" | "failed";
5
+ readonly completedAt: string;
6
+ readonly errorCode?: string;
7
+ }
8
+ export interface SwarmLifecycleTerminalEvidence {
9
+ readonly schemaVersion: typeof SWARM_SCHEMA_VERSION;
10
+ readonly swarmId: string;
11
+ readonly agentId: string;
12
+ readonly childRunId: string;
13
+ readonly taskId: string;
14
+ readonly workspaceId: string;
15
+ readonly leaseId: string;
16
+ readonly processCloseState: "closed" | "failed";
17
+ readonly leaseState: "settled" | "overspent" | "released" | "failed";
18
+ readonly reason: "cancelled" | "child_terminal_failure";
19
+ readonly recordedAt: string;
20
+ readonly errorCode?: string;
21
+ }
22
+ export interface SwarmLifecyclePreCleanupEvidence {
23
+ readonly terminal: SwarmLifecycleTerminalEvidence;
24
+ readonly childEvent: SwarmEvent;
25
+ readonly budgetLedger: SwarmBudgetLedger;
26
+ readonly cleanupIntent: {
27
+ readonly workspaceId: string;
28
+ readonly workspaceKind: "child";
29
+ readonly force: true;
30
+ };
31
+ }
32
+ export interface SwarmChildLifecycleEvidenceWriter {
33
+ persistBeforeCleanup(evidence: SwarmLifecyclePreCleanupEvidence): Promise<void>;
34
+ }
35
+ export interface SwarmLifecycleEvidenceStore {
36
+ persistCleanupEvidence(cleanup: SwarmCleanupRecord): Promise<void>;
37
+ persistTerminalRecord(record: SwarmRunRecord): Promise<void>;
38
+ }
39
+ export interface ActiveSwarmChildRegistration {
40
+ readonly swarmId: string;
41
+ readonly agentId: string;
42
+ readonly childRunId: string;
43
+ readonly taskId: string;
44
+ readonly leaseId: string;
45
+ readonly workspace: SwarmWorkspaceRuntimeHandle;
46
+ readonly abortController: AbortController;
47
+ readonly processClosed: Promise<SwarmChildProcessClosure>;
48
+ readonly evidenceWriter: SwarmChildLifecycleEvidenceWriter;
49
+ }
50
+ export interface SwarmLifecycleControllerInput {
51
+ readonly record: SwarmRunRecord;
52
+ readonly workspaceManager: SwarmWorkspaceManager;
53
+ readonly evidenceStore: SwarmLifecycleEvidenceStore;
54
+ readonly now?: () => string;
55
+ readonly createCleanupId?: () => string;
56
+ }
57
+ export interface SwarmLifecycleCancellationResult {
58
+ readonly acceptingWork: false;
59
+ readonly state: "stopped" | "needs_review";
60
+ readonly record: SwarmRunRecord;
61
+ readonly terminalEvidence: readonly SwarmLifecycleTerminalEvidence[];
62
+ readonly cleanupEvidence: readonly SwarmCleanupRecord[];
63
+ readonly unresolvedChildRunIds: readonly string[];
64
+ }
65
+ export interface SwarmLifecycleController {
66
+ readonly swarmId: string;
67
+ assertAcceptingWork(): void;
68
+ registerActiveChild(registration: ActiveSwarmChildRegistration): void;
69
+ cancel(reason: "cancelled" | "child_terminal_failure"): Promise<SwarmLifecycleCancellationResult>;
70
+ }
71
+ /** Internal parent capability. This module is intentionally absent from Core root exports. */
72
+ export declare function createSwarmLifecycleController(input: SwarmLifecycleControllerInput): SwarmLifecycleController;
@@ -0,0 +1,252 @@
1
+ import { SWARM_SCHEMA_VERSION } from "../../contracts/index.js";
2
+ import { releaseSwarmBudgetLease } from "./scheduler.js";
3
+ const controllerAuthority = new WeakMap();
4
+ /** Internal parent capability. This module is intentionally absent from Core root exports. */
5
+ export function createSwarmLifecycleController(input) {
6
+ const state = {
7
+ acceptingWork: true,
8
+ record: cloneRecord(input.record),
9
+ registrations: new Map(),
10
+ input
11
+ };
12
+ const controller = Object.freeze({
13
+ swarmId: state.record.swarmId,
14
+ assertAcceptingWork() {
15
+ if (!authority(controller).acceptingWork)
16
+ throw new Error("Swarm is no longer accepting scheduling or admission work.");
17
+ },
18
+ registerActiveChild(registration) {
19
+ const current = authority(controller);
20
+ if (!current.acceptingWork)
21
+ throw new Error("Cannot register a child after swarm cancellation begins.");
22
+ assertRegistration(current, registration);
23
+ current.registrations.set(registration.childRunId, registration);
24
+ },
25
+ cancel(reason) {
26
+ const current = authority(controller);
27
+ current.acceptingWork = false;
28
+ current.cancellation ??= cancelRegisteredChildren(current, reason);
29
+ return current.cancellation;
30
+ }
31
+ });
32
+ controllerAuthority.set(controller, state);
33
+ return controller;
34
+ }
35
+ async function cancelRegisteredChildren(state, reason) {
36
+ const now = state.input.now ?? (() => new Date().toISOString());
37
+ const registrations = [...state.registrations.values()];
38
+ // cancel() closes the scheduling/admission gate synchronously before abort.
39
+ for (const registration of registrations)
40
+ registration.abortController.abort(reason);
41
+ // The shared process supervisor owns bounded grace and escalation. Never race
42
+ // its closure promise with a second timeout that could leave descendants live.
43
+ const closures = await Promise.all(registrations.map(async (registration) => ({
44
+ registration,
45
+ closure: await registration.processClosed.catch(() => ({
46
+ state: "failed",
47
+ completedAt: now(),
48
+ errorCode: "PROCESS_CLOSE_FAILED"
49
+ }))
50
+ })));
51
+ let ledger = cloneLedger(state.record.budgetLedger);
52
+ const terminalEvidence = [];
53
+ const childEvents = [];
54
+ const persisted = new Set();
55
+ const unresolved = new Set();
56
+ // Persist pre-cleanup evidence for every registration before any removal.
57
+ for (const { registration, closure } of closures) {
58
+ const lease = ledger.leases.find((candidate) => candidate.leaseId === registration.leaseId);
59
+ let leaseState = "failed";
60
+ if (lease && lease.agentId === registration.agentId && lease.taskId === registration.taskId) {
61
+ if (lease.status === "reserved") {
62
+ const released = releaseSwarmBudgetLease(ledger, lease.leaseId);
63
+ if (released.ok) {
64
+ ledger = released.ledger;
65
+ leaseState = "released";
66
+ }
67
+ }
68
+ else {
69
+ leaseState = lease.status;
70
+ }
71
+ }
72
+ if (leaseState === "failed" || closure.state !== "closed")
73
+ unresolved.add(registration.childRunId);
74
+ const terminal = Object.freeze({
75
+ schemaVersion: SWARM_SCHEMA_VERSION,
76
+ swarmId: state.record.swarmId,
77
+ agentId: registration.agentId,
78
+ childRunId: registration.childRunId,
79
+ taskId: registration.taskId,
80
+ workspaceId: registration.workspace.record.workspaceId,
81
+ leaseId: registration.leaseId,
82
+ processCloseState: closure.state,
83
+ leaseState,
84
+ reason,
85
+ recordedAt: now(),
86
+ ...(closure.errorCode ? { errorCode: closure.errorCode } : {})
87
+ });
88
+ const childEvent = Object.freeze({
89
+ type: closure.state === "closed" ? "CHILD_STOPPED" : "CHILD_NEEDS_REVIEW",
90
+ swarmId: state.record.swarmId,
91
+ timestamp: terminal.recordedAt,
92
+ parentPolicyVersion: state.record.parentContract.policyVersion,
93
+ taskId: registration.taskId,
94
+ agentId: registration.agentId,
95
+ childRunId: registration.childRunId,
96
+ payload: Object.freeze({ reason, processCloseState: closure.state, leaseState })
97
+ });
98
+ terminalEvidence.push(terminal);
99
+ childEvents.push(childEvent);
100
+ try {
101
+ await registration.evidenceWriter.persistBeforeCleanup({
102
+ terminal,
103
+ childEvent,
104
+ budgetLedger: cloneLedger(ledger),
105
+ cleanupIntent: {
106
+ workspaceId: registration.workspace.record.workspaceId,
107
+ workspaceKind: "child",
108
+ force: true
109
+ }
110
+ });
111
+ persisted.add(registration.childRunId);
112
+ }
113
+ catch {
114
+ unresolved.add(registration.childRunId);
115
+ }
116
+ }
117
+ const cleanupEvidence = [];
118
+ for (const { registration, closure } of closures) {
119
+ if (closure.state !== "closed" || !persisted.has(registration.childRunId))
120
+ continue;
121
+ let cleanup;
122
+ try {
123
+ cleanup = await state.input.workspaceManager.removeWorkspace(registration.workspace, {
124
+ evidencePersisted: true,
125
+ processTreeClosed: true,
126
+ force: true
127
+ });
128
+ }
129
+ catch (error) {
130
+ cleanup = failedCleanupRecord(state, registration, error, now, state.input.createCleanupId);
131
+ }
132
+ cleanupEvidence.push(cleanup);
133
+ if (cleanup.state !== "completed")
134
+ unresolved.add(registration.childRunId);
135
+ try {
136
+ await state.input.evidenceStore.persistCleanupEvidence(cleanup);
137
+ }
138
+ catch {
139
+ unresolved.add(registration.childRunId);
140
+ }
141
+ }
142
+ const completedAt = now();
143
+ let record = buildTerminalRecord(state.record, closures, childEvents, ledger, unresolved, reason, completedAt);
144
+ try {
145
+ await state.input.evidenceStore.persistTerminalRecord(record);
146
+ }
147
+ catch {
148
+ unresolved.add("parent-record");
149
+ record = buildTerminalRecord(state.record, closures, childEvents, ledger, unresolved, reason, completedAt);
150
+ }
151
+ const finalState = unresolved.size === 0 ? "stopped" : "needs_review";
152
+ state.record = record;
153
+ return Object.freeze({
154
+ acceptingWork: false,
155
+ state: finalState,
156
+ record,
157
+ terminalEvidence: Object.freeze(terminalEvidence),
158
+ cleanupEvidence: Object.freeze(cleanupEvidence),
159
+ unresolvedChildRunIds: Object.freeze([...unresolved].sort())
160
+ });
161
+ }
162
+ function buildTerminalRecord(record, closures, childEvents, ledger, unresolved, reason, completedAt) {
163
+ const terminalState = unresolved.size === 0 ? "stopped" : "needs_review";
164
+ const unresolvedChildRunIds = [...unresolved].sort();
165
+ const terminalEvent = Object.freeze({
166
+ type: terminalState === "stopped" ? "SWARM_STOPPED" : "SWARM_NEEDS_REVIEW",
167
+ swarmId: record.swarmId,
168
+ timestamp: completedAt,
169
+ parentPolicyVersion: record.parentContract.policyVersion,
170
+ payload: Object.freeze({ reason, unresolvedChildRunIds })
171
+ });
172
+ return cloneRecord({
173
+ ...record,
174
+ budgetLedger: ledger,
175
+ agents: record.agents.map((agent) => {
176
+ const registration = closures.find(({ registration: candidate }) => candidate.agentId === agent.agentId)?.registration;
177
+ return registration
178
+ ? { ...agent, status: unresolved.has(registration.childRunId) ? "needs_review" : "stopped" }
179
+ : { ...agent };
180
+ }),
181
+ tasks: record.tasks.map((task) => {
182
+ const registration = closures.find(({ registration: candidate }) => candidate.taskId === task.taskId)?.registration;
183
+ return registration
184
+ ? { ...task, status: unresolved.has(registration.childRunId) ? "needs_review" : "stopped" }
185
+ : { ...task };
186
+ }),
187
+ outcome: {
188
+ state: terminalState,
189
+ reason: terminalState === "stopped"
190
+ ? "Parent cancellation completed after process closure and evidence-safe cleanup."
191
+ : unresolved.has("parent-record")
192
+ ? "Terminal parent evidence could not be persisted."
193
+ : "Parent cancellation retained unresolved process, evidence, lease, or cleanup state."
194
+ },
195
+ events: [...record.events, ...childEvents, terminalEvent],
196
+ updatedAt: completedAt
197
+ });
198
+ }
199
+ function authority(controller) {
200
+ const state = controllerAuthority.get(controller);
201
+ if (!state)
202
+ throw new Error("Unknown swarm lifecycle authority.");
203
+ return state;
204
+ }
205
+ function assertRegistration(state, registration) {
206
+ const agent = state.record.agents.find((candidate) => candidate.agentId === registration.agentId);
207
+ const task = state.record.tasks.find((candidate) => candidate.taskId === registration.taskId);
208
+ const lease = state.record.budgetLedger.leases.find((candidate) => candidate.leaseId === registration.leaseId);
209
+ if (registration.swarmId !== state.record.swarmId
210
+ || registration.workspace.record.kind !== "child"
211
+ || registration.workspace.record.swarmId !== state.record.swarmId
212
+ || registration.workspace.record.childRunId !== registration.childRunId
213
+ || registration.workspace.record.agentId !== registration.agentId
214
+ || !registration.workspace.record.taskIds.includes(registration.taskId)
215
+ || agent?.childRunId !== registration.childRunId
216
+ || !agent.contract.taskIds.includes(registration.taskId)
217
+ || task?.assignedAgentId !== registration.agentId
218
+ || lease?.agentId !== registration.agentId
219
+ || lease.taskId !== registration.taskId
220
+ || state.registrations.has(registration.childRunId))
221
+ throw new Error("Active swarm child registration is duplicate or authority-mismatched.");
222
+ }
223
+ function failedCleanupRecord(state, registration, error, now, createCleanupId) {
224
+ const code = typeof error === "object" && error !== null && "code" in error
225
+ ? String(error.code ?? "WORKSPACE_REMOVE_FAILED")
226
+ : "WORKSPACE_REMOVE_FAILED";
227
+ return Object.freeze({
228
+ schemaVersion: SWARM_SCHEMA_VERSION,
229
+ cleanupId: createCleanupId?.() ?? `cleanup-failed-${registration.workspace.record.workspaceId}`,
230
+ swarmId: state.record.swarmId,
231
+ workspaceId: registration.workspace.record.workspaceId,
232
+ workspaceKind: "child",
233
+ evidencePersisted: true,
234
+ processCloseState: "closed",
235
+ removalState: "failed",
236
+ state: code === "EPERM" || code === "EBUSY" ? "cleanup_pending" : "failed",
237
+ attemptedAt: now(),
238
+ errorCode: code
239
+ });
240
+ }
241
+ function cloneLedger(ledger) {
242
+ return {
243
+ ...ledger,
244
+ leases: ledger.leases.map((lease) => ({
245
+ ...lease,
246
+ ...(lease.actualUsage ? { actualUsage: { ...lease.actualUsage } } : {})
247
+ }))
248
+ };
249
+ }
250
+ function cloneRecord(record) {
251
+ return JSON.parse(JSON.stringify(record));
252
+ }
@@ -0,0 +1,78 @@
1
+ import { type SwarmAgentRecord, type SwarmEvent, type SwarmLiveEngineProfile, type SwarmLivePlan, type SwarmOutcome, type SwarmRunRecord, type SwarmTaskNode } from "../../contracts/index.js";
2
+ import { type MartinAdapter } from "../index.js";
3
+ export { readSwarmReceiptProjection, verifySwarmReceiptProjection, type SwarmReceiptProjection, } from "./receipt-projection.js";
4
+ import { type CaptureSwarmCandidateInput, type CaptureSwarmCandidateResult, type SwarmCandidateArtifactWriter, type SwarmProcessClosureEvidence } from "./candidates.js";
5
+ import { type ParentSwarmPipelineEvidenceStore, type PersistedSwarmChildCompletionEvidence, type RunParentSwarmPipelineInput, type RunParentSwarmPipelineResult } from "./index.js";
6
+ import type { SwarmChildLifecycleEvidenceWriter, SwarmLifecycleEvidenceStore } from "./lifecycle.js";
7
+ import { type SwarmLiveStore } from "./live-store.js";
8
+ import type { SwarmVerifierExecutor } from "./verification.js";
9
+ import { type SwarmWorkspaceManager, type SwarmWorkspaceRuntimeHandle } from "./workspaces.js";
10
+ export interface SwarmChildAdapterFactoryInput {
11
+ readonly engine: SwarmLiveEngineProfile;
12
+ readonly task: SwarmTaskNode;
13
+ readonly agent: SwarmAgentRecord;
14
+ readonly childRunId: string;
15
+ readonly workspace: SwarmWorkspaceRuntimeHandle;
16
+ readonly budget: SwarmAgentRecord["contract"]["budget"];
17
+ }
18
+ export interface SwarmChildAdapterHandle {
19
+ readonly adapter: MartinAdapter;
20
+ /** Required for write tasks and must exactly match the Git-observed delta. */
21
+ readonly declaredPaths: readonly string[];
22
+ }
23
+ export type SwarmChildAdapterFactory = (input: SwarmChildAdapterFactoryInput) => MartinAdapter | SwarmChildAdapterHandle;
24
+ export interface SwarmLiveRuntimeEvidenceStore extends ParentSwarmPipelineEvidenceStore, SwarmCandidateArtifactWriter, SwarmLifecycleEvidenceStore, SwarmChildLifecycleEvidenceWriter {
25
+ persistProcessClosure(evidence: SwarmProcessClosureEvidence): Promise<void>;
26
+ persistChildCompletion(evidence: PersistedSwarmChildCompletionEvidence): Promise<void>;
27
+ }
28
+ export interface RunLiveSwarmInput {
29
+ readonly plan: SwarmLivePlan;
30
+ readonly liveStore: SwarmLiveStore;
31
+ readonly workspaceManager: SwarmWorkspaceManager;
32
+ readonly evidenceStore: SwarmLiveRuntimeEvidenceStore;
33
+ readonly adapterFactory: SwarmChildAdapterFactory;
34
+ readonly verifierExecutor: SwarmVerifierExecutor;
35
+ readonly runsRoot: string;
36
+ signal?: AbortSignal;
37
+ readonly now?: () => string;
38
+ readonly createId?: (prefix: string) => string;
39
+ readonly nowMs?: () => number;
40
+ }
41
+ export interface RunLiveSwarmResult {
42
+ readonly record: SwarmRunRecord;
43
+ readonly outcome: SwarmOutcome;
44
+ readonly candidateIds: readonly string[];
45
+ readonly parent?: RunParentSwarmPipelineResult;
46
+ }
47
+ /** Checks in-process Core authority; structurally forged CLI/test objects cannot pass. */
48
+ export declare function isAuthoritativeLiveSwarmVerified(result: RunLiveSwarmResult): boolean;
49
+ export interface RunProductionLiveSwarmInput {
50
+ readonly plan: SwarmLivePlan;
51
+ readonly canonicalRoot: string;
52
+ readonly ownedRoot: string;
53
+ readonly storeRoot: string;
54
+ readonly runsRoot: string;
55
+ readonly workspaceIsolationMode?: "worktree" | "independent_clone";
56
+ readonly adapterFactory: SwarmChildAdapterFactory;
57
+ readonly verifierExecutor: SwarmVerifierExecutor;
58
+ signal?: AbortSignal;
59
+ }
60
+ interface LiveRuntimeDependencies {
61
+ captureCandidate(input: CaptureSwarmCandidateInput): Promise<CaptureSwarmCandidateResult>;
62
+ inventoryCandidatePaths(workspacePath: string): Promise<string[]>;
63
+ parentPipeline(input: RunParentSwarmPipelineInput): Promise<RunParentSwarmPipelineResult>;
64
+ sealTerminal?(result: RunLiveSwarmResult): Promise<void>;
65
+ }
66
+ /** Public high-level live entrypoint. Raw lifecycle and finalization authority stay internal. */
67
+ export declare function runLiveSwarm(input: RunLiveSwarmInput): Promise<RunLiveSwarmResult>;
68
+ /**
69
+ * Production composition boundary for CLI/operator callers. It accepts only
70
+ * validated operator paths plus narrow child/verifier executors. Raw store,
71
+ * worktree, evidence, lifecycle, and parent-finalization authority remain
72
+ * inside Core and are never exported from the package root.
73
+ */
74
+ export declare function runProductionLiveSwarm(input: RunProductionLiveSwarmInput): Promise<RunLiveSwarmResult>;
75
+ /** Internal test seam; intentionally not re-exported from the Core package root. */
76
+ export declare function runLiveSwarmWithDependencies(input: RunLiveSwarmInput, dependencies: LiveRuntimeDependencies): Promise<RunLiveSwarmResult>;
77
+ /** Internal production identity seam; intentionally not exported from the Core root. */
78
+ export declare function sameCanonicalSwarmEvent(left: SwarmEvent, right: SwarmEvent): boolean;