@gjczone/pi-swarm 0.1.2
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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/controller.d.ts +86 -0
- package/dist/shared/controller.d.ts.map +1 -0
- package/dist/shared/controller.js +662 -0
- package/dist/shared/controller.js.map +1 -0
- package/dist/shared/pi-invoke.d.ts +31 -0
- package/dist/shared/pi-invoke.d.ts.map +1 -0
- package/dist/shared/pi-invoke.js +54 -0
- package/dist/shared/pi-invoke.js.map +1 -0
- package/dist/shared/render.d.ts +44 -0
- package/dist/shared/render.d.ts.map +1 -0
- package/dist/shared/render.js +116 -0
- package/dist/shared/render.js.map +1 -0
- package/dist/shared/spawner.d.ts +26 -0
- package/dist/shared/spawner.d.ts.map +1 -0
- package/dist/shared/spawner.js +226 -0
- package/dist/shared/spawner.js.map +1 -0
- package/dist/shared/types.d.ts +182 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +8 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/state/persistence.d.ts +83 -0
- package/dist/state/persistence.d.ts.map +1 -0
- package/dist/state/persistence.js +215 -0
- package/dist/state/persistence.js.map +1 -0
- package/dist/state/recovery.d.ts +35 -0
- package/dist/state/recovery.d.ts.map +1 -0
- package/dist/state/recovery.js +149 -0
- package/dist/state/recovery.js.map +1 -0
- package/dist/swarm/command.d.ts +36 -0
- package/dist/swarm/command.d.ts.map +1 -0
- package/dist/swarm/command.js +113 -0
- package/dist/swarm/command.js.map +1 -0
- package/dist/swarm/mode.d.ts +58 -0
- package/dist/swarm/mode.d.ts.map +1 -0
- package/dist/swarm/mode.js +87 -0
- package/dist/swarm/mode.js.map +1 -0
- package/dist/swarm/tool.d.ts +11 -0
- package/dist/swarm/tool.d.ts.map +1 -0
- package/dist/swarm/tool.js +190 -0
- package/dist/swarm/tool.js.map +1 -0
- package/dist/team/command.d.ts +11 -0
- package/dist/team/command.d.ts.map +1 -0
- package/dist/team/command.js +32 -0
- package/dist/team/command.js.map +1 -0
- package/dist/team/mailbox.d.ts +61 -0
- package/dist/team/mailbox.d.ts.map +1 -0
- package/dist/team/mailbox.js +160 -0
- package/dist/team/mailbox.js.map +1 -0
- package/dist/team/supervisor.d.ts +77 -0
- package/dist/team/supervisor.d.ts.map +1 -0
- package/dist/team/supervisor.js +195 -0
- package/dist/team/supervisor.js.map +1 -0
- package/dist/team/task-graph.d.ts +61 -0
- package/dist/team/task-graph.d.ts.map +1 -0
- package/dist/team/task-graph.js +193 -0
- package/dist/team/task-graph.js.map +1 -0
- package/dist/team/tool.d.ts +11 -0
- package/dist/team/tool.d.ts.map +1 -0
- package/dist/team/tool.js +210 -0
- package/dist/team/tool.js.map +1 -0
- package/dist/tui/permission-prompt.d.ts +26 -0
- package/dist/tui/permission-prompt.d.ts.map +1 -0
- package/dist/tui/permission-prompt.js +94 -0
- package/dist/tui/permission-prompt.js.map +1 -0
- package/dist/tui/progress.d.ts +64 -0
- package/dist/tui/progress.d.ts.map +1 -0
- package/dist/tui/progress.js +260 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/swarm-markers.d.ts +20 -0
- package/dist/tui/swarm-markers.d.ts.map +1 -0
- package/dist/tui/swarm-markers.js +61 -0
- package/dist/tui/swarm-markers.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-swarm — shared type definitions.
|
|
3
|
+
*
|
|
4
|
+
* All swarm and team modules import from here.
|
|
5
|
+
* No pi or tui imports — pure data types.
|
|
6
|
+
*/
|
|
7
|
+
/** Phase of a single subagent during execution. */
|
|
8
|
+
export type SubagentPhase = "pending" | "prompting" | "working" | "completed" | "failed" | "cancelled" | "suspended";
|
|
9
|
+
/** Terminal outcome of a subagent run. */
|
|
10
|
+
export type SubagentOutcome = "completed" | "failed" | "aborted";
|
|
11
|
+
/** State marker for whether a subagent was ever started. */
|
|
12
|
+
export type SubagentStartState = "started" | "not_started";
|
|
13
|
+
/**
|
|
14
|
+
* A single subagent's result after execution.
|
|
15
|
+
*/
|
|
16
|
+
export interface SubagentResult<T = unknown> {
|
|
17
|
+
/** The task that produced this result. */
|
|
18
|
+
readonly task: QueuedSubagentTask<T>;
|
|
19
|
+
/** Agent identifier assigned at spawn time. */
|
|
20
|
+
readonly agentId?: string;
|
|
21
|
+
/** Terminal outcome. */
|
|
22
|
+
readonly status: SubagentOutcome;
|
|
23
|
+
/** Whether this task was ever started. */
|
|
24
|
+
readonly state?: SubagentStartState;
|
|
25
|
+
/** Result text (for completed tasks). */
|
|
26
|
+
readonly result?: string;
|
|
27
|
+
/** Error message (for failed/aborted tasks). */
|
|
28
|
+
readonly error?: string;
|
|
29
|
+
}
|
|
30
|
+
/** A new subagent spawned from a template item. */
|
|
31
|
+
export interface SwarmSpawnSpec {
|
|
32
|
+
readonly kind: "spawn";
|
|
33
|
+
/** 1-based index in the swarm. */
|
|
34
|
+
readonly index: number;
|
|
35
|
+
/** The template item value. */
|
|
36
|
+
readonly item: string;
|
|
37
|
+
/** The concrete prompt (template with {{item}} replaced). */
|
|
38
|
+
readonly prompt: string;
|
|
39
|
+
}
|
|
40
|
+
/** A resumed subagent from a previous run. */
|
|
41
|
+
export interface SwarmResumeSpec {
|
|
42
|
+
readonly kind: "resume";
|
|
43
|
+
/** 1-based index in the swarm. */
|
|
44
|
+
readonly index: number;
|
|
45
|
+
/** Existing agent id to resume. */
|
|
46
|
+
readonly agentId: string;
|
|
47
|
+
/** Original item value (if known). */
|
|
48
|
+
readonly item?: string;
|
|
49
|
+
/** Resume prompt. */
|
|
50
|
+
readonly prompt: string;
|
|
51
|
+
}
|
|
52
|
+
/** Union of all spec kinds tracked by the swarm tool. */
|
|
53
|
+
export type SwarmSpec = SwarmSpawnSpec | SwarmResumeSpec;
|
|
54
|
+
/** Predefined agent roles for team mode. */
|
|
55
|
+
export type AgentRole = "explorer" | "planner" | "coder" | "reviewer" | "tester" | "fixer";
|
|
56
|
+
/** Configuration for a single role in a team run. */
|
|
57
|
+
export interface AgentRoleConfig {
|
|
58
|
+
readonly role: AgentRole;
|
|
59
|
+
/** Model override for this role (optional). */
|
|
60
|
+
readonly model?: string;
|
|
61
|
+
/** Tool allowlist (default: all). */
|
|
62
|
+
readonly tools?: string[];
|
|
63
|
+
/** Role-specific system prompt addition. */
|
|
64
|
+
readonly systemPrompt?: string;
|
|
65
|
+
}
|
|
66
|
+
/** A team phase with role assignment. */
|
|
67
|
+
export interface TeamPhase {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly role: AgentRole;
|
|
70
|
+
/** Phases that must complete before this one starts. */
|
|
71
|
+
readonly dependsOn?: string[];
|
|
72
|
+
}
|
|
73
|
+
/** A mailbox message for inter-agent communication. */
|
|
74
|
+
export interface MailboxMessage {
|
|
75
|
+
readonly messageId: string;
|
|
76
|
+
readonly runId: string;
|
|
77
|
+
readonly timestamp: string;
|
|
78
|
+
readonly from: string;
|
|
79
|
+
readonly to: string;
|
|
80
|
+
readonly type: "task_assignment" | "task_result" | "handoff" | "state_sync";
|
|
81
|
+
readonly payload: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
/** Options passed through to every subagent run. */
|
|
84
|
+
export interface RunSubagentOptions {
|
|
85
|
+
readonly parentToolCallId: string;
|
|
86
|
+
readonly parentToolCallUuid?: string;
|
|
87
|
+
readonly prompt: string;
|
|
88
|
+
readonly description: string;
|
|
89
|
+
readonly swarmIndex?: number;
|
|
90
|
+
readonly runInBackground: boolean;
|
|
91
|
+
readonly signal: AbortSignal;
|
|
92
|
+
readonly onReady?: () => void;
|
|
93
|
+
readonly suppressRateLimitFailureEvent?: boolean;
|
|
94
|
+
readonly timeout?: number;
|
|
95
|
+
}
|
|
96
|
+
/** Options specific to spawning a NEW subagent. */
|
|
97
|
+
export interface SpawnSubagentOptions extends RunSubagentOptions {
|
|
98
|
+
readonly profileName: string;
|
|
99
|
+
readonly swarmItem?: string;
|
|
100
|
+
readonly model?: string;
|
|
101
|
+
readonly tools?: string[];
|
|
102
|
+
readonly cwd?: string;
|
|
103
|
+
}
|
|
104
|
+
/** Result returned by the subagent launcher. */
|
|
105
|
+
export interface SubagentCompletion {
|
|
106
|
+
readonly result: string;
|
|
107
|
+
readonly usage?: SubagentUsage;
|
|
108
|
+
}
|
|
109
|
+
/** Handle to a running subagent. */
|
|
110
|
+
export interface SubagentHandle {
|
|
111
|
+
readonly agentId: string;
|
|
112
|
+
readonly profileName: string;
|
|
113
|
+
readonly resumed: boolean;
|
|
114
|
+
readonly completion: Promise<SubagentCompletion>;
|
|
115
|
+
}
|
|
116
|
+
/** Token usage for a subagent. */
|
|
117
|
+
export interface SubagentUsage {
|
|
118
|
+
readonly input: number;
|
|
119
|
+
readonly output: number;
|
|
120
|
+
readonly cacheRead: number;
|
|
121
|
+
readonly cacheWrite: number;
|
|
122
|
+
readonly totalTokens: number;
|
|
123
|
+
}
|
|
124
|
+
/** Base fields every queued task carries. */
|
|
125
|
+
export interface BaseQueuedSubagentTask<T = unknown> {
|
|
126
|
+
/** Caller-owned payload (SwarmSpec, team task, etc.). */
|
|
127
|
+
readonly data: T;
|
|
128
|
+
/** Subagent profile name. */
|
|
129
|
+
readonly profileName: string;
|
|
130
|
+
/** Parent tool-call id for nesting. */
|
|
131
|
+
readonly parentToolCallId: string;
|
|
132
|
+
/** Parent tool-call uuid for event correlation. */
|
|
133
|
+
readonly parentToolCallUuid?: string;
|
|
134
|
+
/** Concrete prompt sent to the subagent. */
|
|
135
|
+
readonly prompt: string;
|
|
136
|
+
/** Human-readable description for logging/UI. */
|
|
137
|
+
readonly description: string;
|
|
138
|
+
/** 1-based position in the batch (optional). */
|
|
139
|
+
readonly swarmIndex?: number;
|
|
140
|
+
/** Item value the subagent works on (optional). */
|
|
141
|
+
readonly swarmItem?: string;
|
|
142
|
+
/** Whether the subagent runs in background. */
|
|
143
|
+
readonly runInBackground: boolean;
|
|
144
|
+
/** Timeout in ms (optional). */
|
|
145
|
+
readonly timeout?: number;
|
|
146
|
+
/** Abort signal for cancellation. */
|
|
147
|
+
readonly signal?: AbortSignal;
|
|
148
|
+
}
|
|
149
|
+
/** A task that spawns a NEW subagent. */
|
|
150
|
+
export interface SpawnQueuedSubagentTask<T = unknown> extends BaseQueuedSubagentTask<T> {
|
|
151
|
+
readonly kind: "spawn";
|
|
152
|
+
}
|
|
153
|
+
/** A task that RESUMES an existing subagent. */
|
|
154
|
+
export interface ResumeQueuedSubagentTask<T = unknown> extends BaseQueuedSubagentTask<T> {
|
|
155
|
+
readonly kind: "resume";
|
|
156
|
+
readonly resumeAgentId: string;
|
|
157
|
+
}
|
|
158
|
+
/** Union of queued task kinds. */
|
|
159
|
+
export type QueuedSubagentTask<T = unknown> = SpawnQueuedSubagentTask<T> | ResumeQueuedSubagentTask<T>;
|
|
160
|
+
/** Options for the batch concurrency controller. */
|
|
161
|
+
export interface SubagentBatchOptions {
|
|
162
|
+
/**
|
|
163
|
+
* Optional cap on concurrent subagents during the normal phase.
|
|
164
|
+
* `undefined` means no cap (legacy ramp behavior).
|
|
165
|
+
*/
|
|
166
|
+
readonly maxConcurrency?: number;
|
|
167
|
+
}
|
|
168
|
+
/** Emitted when a subagent is suspended due to rate limiting. */
|
|
169
|
+
export interface SubagentSuspendedEvent {
|
|
170
|
+
readonly agentId: string;
|
|
171
|
+
readonly reason: string;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Interface the controller uses to launch subagents.
|
|
175
|
+
* Implementations can use pi --print, in-process SDK, or other backends.
|
|
176
|
+
*/
|
|
177
|
+
export interface SubagentBatchLauncher {
|
|
178
|
+
spawn(options: SpawnSubagentOptions): Promise<SubagentHandle>;
|
|
179
|
+
resume(agentId: string, options: RunSubagentOptions): Promise<SubagentHandle>;
|
|
180
|
+
retry(agentId: string, options: RunSubagentOptions): Promise<SubagentHandle>;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state/persistence — durable file-based state for swarm and team runs.
|
|
3
|
+
*
|
|
4
|
+
* Every run has a manifest file, a task state file, and an append-only
|
|
5
|
+
* event log. This module provides atomic reads and writes so crash
|
|
6
|
+
* recovery can rebuild correct state.
|
|
7
|
+
*
|
|
8
|
+
* Directory layout:
|
|
9
|
+
* .pi/swarm/state/runs/{runId}/
|
|
10
|
+
* manifest.json -- run metadata, status, agent IDs
|
|
11
|
+
* tasks.json -- task graph & per-task status
|
|
12
|
+
* events.jsonl -- append-only event log
|
|
13
|
+
* agents/{agentId}/
|
|
14
|
+
* status.json -- per-agent status
|
|
15
|
+
* output.log -- agent stdout capture
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the crew root directory.
|
|
19
|
+
*
|
|
20
|
+
* Always uses `.pi/swarm/` under the project root. Creates `.pi/`
|
|
21
|
+
* if it does not already exist.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveCrewRoot(cwd: string): string;
|
|
24
|
+
/** Resolve the state directory for a specific run. */
|
|
25
|
+
export declare function resolveRunStateDir(crewRoot: string, runId: string): string;
|
|
26
|
+
/** Resolve per-agent state directory. */
|
|
27
|
+
export declare function resolveAgentStateDir(crewRoot: string, runId: string, agentId: string): string;
|
|
28
|
+
export interface RunManifest {
|
|
29
|
+
readonly runId: string;
|
|
30
|
+
readonly type: "swarm" | "team";
|
|
31
|
+
status: "running" | "completed" | "failed" | "abandoned";
|
|
32
|
+
goal?: string;
|
|
33
|
+
startedAt: number;
|
|
34
|
+
completedAt?: number;
|
|
35
|
+
agentIds: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a new run manifest and write it to disk.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createManifest(crewRoot: string, manifest: RunManifest): void;
|
|
41
|
+
/**
|
|
42
|
+
* Read a run manifest from disk.
|
|
43
|
+
* Returns null if the manifest does not exist.
|
|
44
|
+
*/
|
|
45
|
+
export declare function readManifest(crewRoot: string, runId: string): RunManifest | null;
|
|
46
|
+
/**
|
|
47
|
+
* Update a run manifest (overwrites the file atomically).
|
|
48
|
+
*/
|
|
49
|
+
export declare function updateManifest(crewRoot: string, manifest: RunManifest): void;
|
|
50
|
+
/**
|
|
51
|
+
* Persist task state (task graph) to disk.
|
|
52
|
+
*/
|
|
53
|
+
export declare function saveTaskState(crewRoot: string, runId: string, data: Record<string, unknown>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Load task state from disk.
|
|
56
|
+
* Returns null if the file does not exist.
|
|
57
|
+
*/
|
|
58
|
+
export declare function loadTaskState(crewRoot: string, runId: string): Record<string, unknown> | null;
|
|
59
|
+
/**
|
|
60
|
+
* Append an event to the run's event log.
|
|
61
|
+
*/
|
|
62
|
+
export declare function appendEvent(crewRoot: string, runId: string, event: Record<string, unknown>): void;
|
|
63
|
+
/**
|
|
64
|
+
* Read all events from the run's event log.
|
|
65
|
+
*/
|
|
66
|
+
export declare function readEvents(crewRoot: string, runId: string): Record<string, unknown>[];
|
|
67
|
+
/**
|
|
68
|
+
* Save per-agent status.
|
|
69
|
+
*/
|
|
70
|
+
export declare function saveAgentStatus(crewRoot: string, runId: string, agentId: string, status: Record<string, unknown>): void;
|
|
71
|
+
/**
|
|
72
|
+
* Load per-agent status.
|
|
73
|
+
*/
|
|
74
|
+
export declare function loadAgentStatus(crewRoot: string, runId: string, agentId: string): Record<string, unknown> | null;
|
|
75
|
+
/**
|
|
76
|
+
* List all active run IDs in the state directory.
|
|
77
|
+
*/
|
|
78
|
+
export declare function listActiveRuns(crewRoot: string): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Delete the entire run state directory.
|
|
81
|
+
*/
|
|
82
|
+
export declare function deleteRunState(crewRoot: string, runId: string): void;
|
|
83
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CASR;AAMD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,GACpB,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,IAAI,CAWpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,GACpB,IAAI,CAON;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAsB3B;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAQzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state/persistence — durable file-based state for swarm and team runs.
|
|
3
|
+
*
|
|
4
|
+
* Every run has a manifest file, a task state file, and an append-only
|
|
5
|
+
* event log. This module provides atomic reads and writes so crash
|
|
6
|
+
* recovery can rebuild correct state.
|
|
7
|
+
*
|
|
8
|
+
* Directory layout:
|
|
9
|
+
* .pi/swarm/state/runs/{runId}/
|
|
10
|
+
* manifest.json -- run metadata, status, agent IDs
|
|
11
|
+
* tasks.json -- task graph & per-task status
|
|
12
|
+
* events.jsonl -- append-only event log
|
|
13
|
+
* agents/{agentId}/
|
|
14
|
+
* status.json -- per-agent status
|
|
15
|
+
* output.log -- agent stdout capture
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Path resolution
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the crew root directory.
|
|
24
|
+
*
|
|
25
|
+
* Always uses `.pi/swarm/` under the project root. Creates `.pi/`
|
|
26
|
+
* if it does not already exist.
|
|
27
|
+
*/
|
|
28
|
+
export function resolveCrewRoot(cwd) {
|
|
29
|
+
const piDir = path.join(cwd, ".pi");
|
|
30
|
+
if (!fs.existsSync(piDir)) {
|
|
31
|
+
fs.mkdirSync(piDir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
const swarmDir = path.join(piDir, "swarm");
|
|
34
|
+
if (!fs.existsSync(swarmDir)) {
|
|
35
|
+
fs.mkdirSync(swarmDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
return swarmDir;
|
|
38
|
+
}
|
|
39
|
+
/** Resolve the state directory for a specific run. */
|
|
40
|
+
export function resolveRunStateDir(crewRoot, runId) {
|
|
41
|
+
return path.join(crewRoot, "state", "runs", runId);
|
|
42
|
+
}
|
|
43
|
+
/** Resolve per-agent state directory. */
|
|
44
|
+
export function resolveAgentStateDir(crewRoot, runId, agentId) {
|
|
45
|
+
return path.join(crewRoot, "state", "runs", runId, "agents", agentId);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a new run manifest and write it to disk.
|
|
49
|
+
*/
|
|
50
|
+
export function createManifest(crewRoot, manifest) {
|
|
51
|
+
const dir = resolveRunStateDir(crewRoot, manifest.runId);
|
|
52
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
53
|
+
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Read a run manifest from disk.
|
|
57
|
+
* Returns null if the manifest does not exist.
|
|
58
|
+
*/
|
|
59
|
+
export function readManifest(crewRoot, runId) {
|
|
60
|
+
const filePath = path.join(resolveRunStateDir(crewRoot, runId), "manifest.json");
|
|
61
|
+
try {
|
|
62
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
63
|
+
return JSON.parse(raw);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Update a run manifest (overwrites the file atomically).
|
|
71
|
+
*/
|
|
72
|
+
export function updateManifest(crewRoot, manifest) {
|
|
73
|
+
const dir = resolveRunStateDir(crewRoot, manifest.runId);
|
|
74
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
75
|
+
writeAtomic(path.join(dir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Task state
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
/**
|
|
81
|
+
* Persist task state (task graph) to disk.
|
|
82
|
+
*/
|
|
83
|
+
export function saveTaskState(crewRoot, runId, data) {
|
|
84
|
+
const dir = resolveRunStateDir(crewRoot, runId);
|
|
85
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
86
|
+
writeAtomic(path.join(dir, "tasks.json"), JSON.stringify(data, null, 2));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Load task state from disk.
|
|
90
|
+
* Returns null if the file does not exist.
|
|
91
|
+
*/
|
|
92
|
+
export function loadTaskState(crewRoot, runId) {
|
|
93
|
+
const filePath = path.join(resolveRunStateDir(crewRoot, runId), "tasks.json");
|
|
94
|
+
try {
|
|
95
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
96
|
+
return JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Event log
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
/**
|
|
106
|
+
* Append an event to the run's event log.
|
|
107
|
+
*/
|
|
108
|
+
export function appendEvent(crewRoot, runId, event) {
|
|
109
|
+
const dir = resolveRunStateDir(crewRoot, runId);
|
|
110
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
111
|
+
const filePath = path.join(dir, "events.jsonl");
|
|
112
|
+
const line = JSON.stringify(event) + "\n";
|
|
113
|
+
fs.appendFileSync(filePath, line, "utf-8");
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Read all events from the run's event log.
|
|
117
|
+
*/
|
|
118
|
+
export function readEvents(crewRoot, runId) {
|
|
119
|
+
const filePath = path.join(resolveRunStateDir(crewRoot, runId), "events.jsonl");
|
|
120
|
+
try {
|
|
121
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
122
|
+
if (!raw.trim())
|
|
123
|
+
return [];
|
|
124
|
+
return raw
|
|
125
|
+
.trim()
|
|
126
|
+
.split("\n")
|
|
127
|
+
.map((line) => {
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(line);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
.filter((e) => e !== null);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Agent state
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
/**
|
|
145
|
+
* Save per-agent status.
|
|
146
|
+
*/
|
|
147
|
+
export function saveAgentStatus(crewRoot, runId, agentId, status) {
|
|
148
|
+
const dir = resolveAgentStateDir(crewRoot, runId, agentId);
|
|
149
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
150
|
+
writeAtomic(path.join(dir, "status.json"), JSON.stringify(status, null, 2));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Load per-agent status.
|
|
154
|
+
*/
|
|
155
|
+
export function loadAgentStatus(crewRoot, runId, agentId) {
|
|
156
|
+
const filePath = path.join(resolveAgentStateDir(crewRoot, runId, agentId), "status.json");
|
|
157
|
+
try {
|
|
158
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
159
|
+
return JSON.parse(raw);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* List all active run IDs in the state directory.
|
|
167
|
+
*/
|
|
168
|
+
export function listActiveRuns(crewRoot) {
|
|
169
|
+
const runsDir = path.join(crewRoot, "state", "runs");
|
|
170
|
+
if (!fs.existsSync(runsDir))
|
|
171
|
+
return [];
|
|
172
|
+
return fs
|
|
173
|
+
.readdirSync(runsDir, { withFileTypes: true })
|
|
174
|
+
.filter((d) => d.isDirectory())
|
|
175
|
+
.map((d) => d.name);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Delete the entire run state directory.
|
|
179
|
+
*/
|
|
180
|
+
export function deleteRunState(crewRoot, runId) {
|
|
181
|
+
const dir = resolveRunStateDir(crewRoot, runId);
|
|
182
|
+
if (fs.existsSync(dir)) {
|
|
183
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// Atomic write helper
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
/**
|
|
190
|
+
* Write a file atomically using a temp file + rename.
|
|
191
|
+
* On POSIX rename is atomic; on Windows it replaces the target.
|
|
192
|
+
*/
|
|
193
|
+
function writeAtomic(filePath, content) {
|
|
194
|
+
const tmpPath = filePath + ".tmp." + randomId();
|
|
195
|
+
try {
|
|
196
|
+
fs.writeFileSync(tmpPath, content, "utf-8");
|
|
197
|
+
fs.renameSync(tmpPath, filePath);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
// Clean up temp file on failure
|
|
201
|
+
try {
|
|
202
|
+
if (fs.existsSync(tmpPath)) {
|
|
203
|
+
fs.unlinkSync(tmpPath);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Best effort
|
|
208
|
+
}
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function randomId() {
|
|
213
|
+
return Math.random().toString(36).slice(2, 10);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/state/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state/recovery — crash recovery and stale run detection.
|
|
3
|
+
*
|
|
4
|
+
* On session start, scans for incomplete runs. If the parent Pi
|
|
5
|
+
* process is no longer alive, marks the run as abandoned. Completed
|
|
6
|
+
* runs older than 7 days are cleaned up automatically.
|
|
7
|
+
*/
|
|
8
|
+
import { type RunManifest } from "./persistence.js";
|
|
9
|
+
export interface RecoveryResult {
|
|
10
|
+
/** Runs that were active and can be resumed. */
|
|
11
|
+
readonly resumable: RunManifest[];
|
|
12
|
+
/** Runs that were abandoned (dead parent process). */
|
|
13
|
+
readonly abandoned: RunManifest[];
|
|
14
|
+
/** Runs that were cleaned up (expired completed runs). */
|
|
15
|
+
readonly cleanedUp: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run recovery on session start.
|
|
19
|
+
*
|
|
20
|
+
* - Marks stale "running" runs as abandoned.
|
|
21
|
+
* - Cleans up expired completed runs.
|
|
22
|
+
* - Returns lists of resumable and abandoned runs.
|
|
23
|
+
*/
|
|
24
|
+
export declare function recoverRuns(cwd: string): RecoveryResult;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether a run has unfinished tasks.
|
|
27
|
+
* Used to decide whether to offer resume or start fresh.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasUnfinishedTasks(crewRoot: string, runId: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get resumable agent IDs from a run.
|
|
32
|
+
* Returns a map of agentId → last known status.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getResumableAgents(crewRoot: string, runId: string): Map<string, string>;
|
|
35
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAML,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAoFvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAkBT;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBrB"}
|