pi-forge 1.2.5 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/{CodeMirrorEditor-DXmxwE2Z.js → CodeMirrorEditor-DOSPzCPa.js} +13 -13
  3. package/dist/client/assets/CodeMirrorEditor-DOSPzCPa.js.map +1 -0
  4. package/dist/client/assets/index-CEqSkIuy.css +1 -0
  5. package/dist/client/assets/index-D8rNSBxI.js +375 -0
  6. package/dist/client/assets/index-D8rNSBxI.js.map +1 -0
  7. package/dist/client/assets/{workbox-window.prod.es5-Cch4wiA5.js → workbox-window.prod.es5-Bd17z0YL.js} +2 -2
  8. package/dist/client/assets/{workbox-window.prod.es5-Cch4wiA5.js.map → workbox-window.prod.es5-Bd17z0YL.js.map} +1 -1
  9. package/dist/client/index.html +2 -2
  10. package/dist/client/sw.js +1 -1
  11. package/dist/client/sw.js.map +1 -1
  12. package/dist/server/git-clone.js +364 -0
  13. package/dist/server/git-clone.js.map +1 -0
  14. package/dist/server/index.js +22 -0
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/server/orchestration/config.js +61 -0
  17. package/dist/server/orchestration/config.js.map +1 -0
  18. package/dist/server/orchestration/event-bridge.js +93 -0
  19. package/dist/server/orchestration/event-bridge.js.map +1 -0
  20. package/dist/server/orchestration/inbox.js +199 -0
  21. package/dist/server/orchestration/inbox.js.map +1 -0
  22. package/dist/server/orchestration/init.js +39 -0
  23. package/dist/server/orchestration/init.js.map +1 -0
  24. package/dist/server/orchestration/store.js +352 -0
  25. package/dist/server/orchestration/store.js.map +1 -0
  26. package/dist/server/orchestration/tools.js +789 -0
  27. package/dist/server/orchestration/tools.js.map +1 -0
  28. package/dist/server/orchestration/types.js +57 -0
  29. package/dist/server/orchestration/types.js.map +1 -0
  30. package/dist/server/processes/manager.js +23 -1
  31. package/dist/server/processes/manager.js.map +1 -1
  32. package/dist/server/project-manager.js +46 -32
  33. package/dist/server/project-manager.js.map +1 -1
  34. package/dist/server/routes/control.js +9 -0
  35. package/dist/server/routes/control.js.map +1 -1
  36. package/dist/server/routes/health.js +14 -1
  37. package/dist/server/routes/health.js.map +1 -1
  38. package/dist/server/routes/orchestration.js +464 -0
  39. package/dist/server/routes/orchestration.js.map +1 -0
  40. package/dist/server/routes/projects.js +239 -14
  41. package/dist/server/routes/projects.js.map +1 -1
  42. package/dist/server/routes/sessions.js +53 -34
  43. package/dist/server/routes/sessions.js.map +1 -1
  44. package/dist/server/routes/webhooks.js +362 -0
  45. package/dist/server/routes/webhooks.js.map +1 -0
  46. package/dist/server/session-registry.js +317 -5
  47. package/dist/server/session-registry.js.map +1 -1
  48. package/dist/server/sse-bridge.js +85 -14
  49. package/dist/server/sse-bridge.js.map +1 -1
  50. package/dist/server/webhooks/dispatcher.js +254 -0
  51. package/dist/server/webhooks/dispatcher.js.map +1 -0
  52. package/dist/server/webhooks/event-bridge.js +185 -0
  53. package/dist/server/webhooks/event-bridge.js.map +1 -0
  54. package/dist/server/webhooks/init.js +55 -0
  55. package/dist/server/webhooks/init.js.map +1 -0
  56. package/dist/server/webhooks/store.js +394 -0
  57. package/dist/server/webhooks/store.js.map +1 -0
  58. package/dist/server/webhooks/types.js +32 -0
  59. package/dist/server/webhooks/types.js.map +1 -0
  60. package/package.json +4 -4
  61. package/dist/client/assets/CodeMirrorEditor-DXmxwE2Z.js.map +0 -1
  62. package/dist/client/assets/index-CMSjnWtF.js +0 -365
  63. package/dist/client/assets/index-CMSjnWtF.js.map +0 -1
  64. package/dist/client/assets/index-Cp8qEy7Q.css +0 -1
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Disk-backed persistence for orchestration metadata.
3
+ *
4
+ * Two files in `${FORGE_DATA_DIR}/`:
5
+ * - `session-orchestration.json` — supervisor opt-in + supervisor↔worker links
6
+ * - `orchestrator-inbox.json` — per-supervisor pending event queue
7
+ *
8
+ * Separate files so the chatty inbox writes don't fight the rare
9
+ * topology mutations. Same atomic-write + in-process lock pattern as
10
+ * `webhooks/store.ts` and `project-manager.ts`. Single-tenant /
11
+ * single-process assumption — cross-process safety would need a real
12
+ * file lock.
13
+ *
14
+ * Mode 0600 on both: the link file has no secrets but the inbox can
15
+ * carry assistant-message previews (which can contain anything the
16
+ * agent has been working on); both should be unreadable to other
17
+ * users on shared boxes.
18
+ */
19
+ import { randomUUID } from "node:crypto";
20
+ import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
21
+ import { join } from "node:path";
22
+ import { config } from "../config.js";
23
+ import { emptyInboxStore, emptyStore, isInboxEventType, MAX_INBOX_ITEMS, ORCHESTRATION_VERSION, } from "./types.js";
24
+ const STORE_FILE = () => join(config.forgeDataDir, "session-orchestration.json");
25
+ const INBOX_FILE = () => join(config.forgeDataDir, "orchestrator-inbox.json");
26
+ async function ensureDir() {
27
+ await mkdir(config.forgeDataDir, { recursive: true });
28
+ }
29
+ async function atomicWriteJson(target, data, mode) {
30
+ await ensureDir();
31
+ const tmp = `${target}.${randomUUID()}.tmp`;
32
+ await writeFile(tmp, JSON.stringify(data, null, 2), "utf8");
33
+ try {
34
+ await chmod(tmp, mode);
35
+ await rename(tmp, target);
36
+ }
37
+ catch (err) {
38
+ await unlink(tmp).catch(() => undefined);
39
+ throw err;
40
+ }
41
+ }
42
+ // ---- session-orchestration.json (topology) ----
43
+ let storeLock = Promise.resolve();
44
+ function withStoreLock(fn) {
45
+ const next = storeLock.then(fn, fn);
46
+ storeLock = next.catch(() => undefined);
47
+ return next;
48
+ }
49
+ function isSupervisorRecord(v) {
50
+ if (typeof v !== "object" || v === null)
51
+ return false;
52
+ const r = v;
53
+ return (typeof r.enabledAt === "string" &&
54
+ Array.isArray(r.workerIds) &&
55
+ r.workerIds.every((id) => typeof id === "string"));
56
+ }
57
+ function isWorkerRecord(v) {
58
+ if (typeof v !== "object" || v === null)
59
+ return false;
60
+ const r = v;
61
+ if (typeof r.supervisorId !== "string" || typeof r.spawnedAt !== "string")
62
+ return false;
63
+ if (r.spawnedFrom !== undefined) {
64
+ const sf = r.spawnedFrom;
65
+ if (typeof sf.sessionId !== "string")
66
+ return false;
67
+ if (sf.mode !== "fresh" && sf.mode !== "summary")
68
+ return false;
69
+ }
70
+ return true;
71
+ }
72
+ async function readStoreFile() {
73
+ await ensureDir();
74
+ try {
75
+ const raw = await readFile(STORE_FILE(), "utf8");
76
+ const parsed = JSON.parse(raw);
77
+ if (typeof parsed !== "object" || parsed === null)
78
+ return emptyStore();
79
+ const r = parsed;
80
+ const supervisors = {};
81
+ const workers = {};
82
+ if (typeof r.supervisors === "object" && r.supervisors !== null) {
83
+ for (const [id, rec] of Object.entries(r.supervisors)) {
84
+ if (isSupervisorRecord(rec))
85
+ supervisors[id] = rec;
86
+ }
87
+ }
88
+ if (typeof r.workers === "object" && r.workers !== null) {
89
+ for (const [id, rec] of Object.entries(r.workers)) {
90
+ if (isWorkerRecord(rec))
91
+ workers[id] = rec;
92
+ }
93
+ }
94
+ return { version: ORCHESTRATION_VERSION, supervisors, workers };
95
+ }
96
+ catch (err) {
97
+ if (err.code === "ENOENT")
98
+ return emptyStore();
99
+ throw err;
100
+ }
101
+ }
102
+ async function writeStoreFile(s) {
103
+ await atomicWriteJson(STORE_FILE(), s, 0o600);
104
+ }
105
+ export async function readStore() {
106
+ return readStoreFile();
107
+ }
108
+ /**
109
+ * Mark a session as a supervisor. Idempotent — calling on an
110
+ * already-enabled session updates nothing. Rejects if the session
111
+ * is currently registered as a worker (depth=1 limit).
112
+ */
113
+ export class OrchestrationError extends Error {
114
+ code;
115
+ constructor(code, message) {
116
+ super(message);
117
+ this.code = code;
118
+ this.name = "OrchestrationError";
119
+ }
120
+ }
121
+ export async function enableSupervisor(sessionId) {
122
+ return withStoreLock(async () => {
123
+ const s = await readStoreFile();
124
+ if (s.workers[sessionId] !== undefined) {
125
+ throw new OrchestrationError("depth_limit_exceeded", `Session ${sessionId} is a worker and cannot become a supervisor (depth=1).`);
126
+ }
127
+ const existing = s.supervisors[sessionId];
128
+ if (existing !== undefined)
129
+ return existing;
130
+ const rec = {
131
+ enabledAt: new Date().toISOString(),
132
+ workerIds: [],
133
+ };
134
+ s.supervisors[sessionId] = rec;
135
+ await writeStoreFile(s);
136
+ return rec;
137
+ });
138
+ }
139
+ /**
140
+ * Remove a session's supervisor mode. Detaches every worker so they
141
+ * become standalone (their session records are left alone on disk).
142
+ * No-op if the session wasn't a supervisor.
143
+ */
144
+ export async function disableSupervisor(sessionId) {
145
+ await withStoreLock(async () => {
146
+ const s = await readStoreFile();
147
+ const rec = s.supervisors[sessionId];
148
+ if (rec === undefined)
149
+ return;
150
+ for (const workerId of rec.workerIds) {
151
+ delete s.workers[workerId];
152
+ }
153
+ delete s.supervisors[sessionId];
154
+ await writeStoreFile(s);
155
+ });
156
+ }
157
+ /**
158
+ * Register a new worker session under a supervisor. Caller is
159
+ * responsible for actually creating the session (via createSession
160
+ * in session-registry); this just records the link. Rejects if the
161
+ * supervisor doesn't exist or the worker is already linked
162
+ * elsewhere. Concurrency-safe (single store lock).
163
+ */
164
+ export async function registerWorker(opts) {
165
+ await withStoreLock(async () => {
166
+ const s = await readStoreFile();
167
+ const sup = s.supervisors[opts.supervisorId];
168
+ if (sup === undefined) {
169
+ throw new OrchestrationError("supervisor_not_found", `No supervisor record for ${opts.supervisorId}.`);
170
+ }
171
+ if (s.workers[opts.workerId] !== undefined) {
172
+ throw new OrchestrationError("worker_already_linked", `Worker ${opts.workerId} is already linked to a supervisor.`);
173
+ }
174
+ if (s.supervisors[opts.workerId] !== undefined) {
175
+ throw new OrchestrationError("depth_limit_exceeded", `Session ${opts.workerId} is already a supervisor; cannot also be a worker.`);
176
+ }
177
+ sup.workerIds.push(opts.workerId);
178
+ const wrec = {
179
+ supervisorId: opts.supervisorId,
180
+ spawnedAt: new Date().toISOString(),
181
+ };
182
+ if (opts.spawnedFrom !== undefined)
183
+ wrec.spawnedFrom = opts.spawnedFrom;
184
+ s.workers[opts.workerId] = wrec;
185
+ await writeStoreFile(s);
186
+ });
187
+ }
188
+ /**
189
+ * Drop a worker's link to its supervisor. Idempotent — no-op if the
190
+ * worker wasn't registered. Used by `orchestrate_detach_worker`
191
+ * and as the cleanup step when a worker is killed.
192
+ */
193
+ export async function unregisterWorker(workerId) {
194
+ await withStoreLock(async () => {
195
+ const s = await readStoreFile();
196
+ const wrec = s.workers[workerId];
197
+ if (wrec === undefined)
198
+ return;
199
+ const sup = s.supervisors[wrec.supervisorId];
200
+ if (sup !== undefined) {
201
+ sup.workerIds = sup.workerIds.filter((id) => id !== workerId);
202
+ }
203
+ delete s.workers[workerId];
204
+ await writeStoreFile(s);
205
+ });
206
+ }
207
+ /**
208
+ * Resolve the supervisor ID for a worker session, or undefined if
209
+ * the session isn't a registered worker. Read-only — no lock
210
+ * needed because we tolerate stale reads (the event bridge reads
211
+ * this on every event and just skips when the link has been torn
212
+ * down mid-flight).
213
+ */
214
+ export async function getSupervisorIdForWorker(workerId) {
215
+ const s = await readStoreFile();
216
+ return s.workers[workerId]?.supervisorId;
217
+ }
218
+ export async function isSupervisor(sessionId) {
219
+ const s = await readStoreFile();
220
+ return s.supervisors[sessionId] !== undefined;
221
+ }
222
+ export async function isWorker(sessionId) {
223
+ const s = await readStoreFile();
224
+ return s.workers[sessionId] !== undefined;
225
+ }
226
+ export async function getWorkerIds(supervisorId) {
227
+ const s = await readStoreFile();
228
+ return [...(s.supervisors[supervisorId]?.workerIds ?? [])];
229
+ }
230
+ export async function getWorkerRecord(workerId) {
231
+ const s = await readStoreFile();
232
+ return s.workers[workerId];
233
+ }
234
+ // ---- orchestrator-inbox.json (queue) ----
235
+ let inboxLock = Promise.resolve();
236
+ function withInboxLock(fn) {
237
+ const next = inboxLock.then(fn, fn);
238
+ inboxLock = next.catch(() => undefined);
239
+ return next;
240
+ }
241
+ function isInboxItem(v) {
242
+ if (typeof v !== "object" || v === null)
243
+ return false;
244
+ const r = v;
245
+ return (typeof r.id === "string" &&
246
+ isInboxEventType(r.type) &&
247
+ typeof r.workerId === "string" &&
248
+ typeof r.occurredAt === "string" &&
249
+ typeof r.data === "object" &&
250
+ r.data !== null &&
251
+ typeof r.delivered === "boolean");
252
+ }
253
+ async function readInboxFile() {
254
+ await ensureDir();
255
+ try {
256
+ const raw = await readFile(INBOX_FILE(), "utf8");
257
+ const parsed = JSON.parse(raw);
258
+ if (typeof parsed !== "object" || parsed === null)
259
+ return emptyInboxStore();
260
+ const r = parsed;
261
+ const inboxes = {};
262
+ if (typeof r.inboxes === "object" && r.inboxes !== null) {
263
+ for (const [supId, items] of Object.entries(r.inboxes)) {
264
+ if (Array.isArray(items)) {
265
+ inboxes[supId] = items.filter(isInboxItem);
266
+ }
267
+ }
268
+ }
269
+ return { version: ORCHESTRATION_VERSION, inboxes };
270
+ }
271
+ catch (err) {
272
+ if (err.code === "ENOENT")
273
+ return emptyInboxStore();
274
+ throw err;
275
+ }
276
+ }
277
+ async function writeInboxFile(s) {
278
+ await atomicWriteJson(INBOX_FILE(), s, 0o600);
279
+ }
280
+ /**
281
+ * Append an inbox item for the supervisor. FIFO-evicts items beyond
282
+ * `MAX_INBOX_ITEMS`. Caller is responsible for resolving the
283
+ * supervisor ID (via `getSupervisorIdForWorker`) — this is a raw
284
+ * write that doesn't check the topology.
285
+ */
286
+ export async function enqueueInboxItem(supervisorId, item) {
287
+ return withInboxLock(async () => {
288
+ const s = await readInboxFile();
289
+ const existing = s.inboxes[supervisorId] ?? [];
290
+ const full = { id: randomUUID(), delivered: false, ...item };
291
+ existing.push(full);
292
+ // FIFO trim from the front so the most recent N stay.
293
+ const trimmed = existing.length > MAX_INBOX_ITEMS
294
+ ? existing.slice(existing.length - MAX_INBOX_ITEMS)
295
+ : existing;
296
+ s.inboxes[supervisorId] = trimmed;
297
+ await writeInboxFile(s);
298
+ return full;
299
+ });
300
+ }
301
+ /**
302
+ * Read pending (undelivered) items for the supervisor. Optionally
303
+ * mark them delivered as part of the same lock window so the
304
+ * agent-facing tool can advance the cursor atomically.
305
+ *
306
+ * Returns the items in chronological order (oldest first) — the
307
+ * supervisor LLM should process them in arrival order so a "ended"
308
+ * event after an "ask_user" doesn't get acted on first.
309
+ */
310
+ export async function readPendingInbox(supervisorId, opts = {}) {
311
+ return withInboxLock(async () => {
312
+ const s = await readInboxFile();
313
+ const items = s.inboxes[supervisorId] ?? [];
314
+ const pending = items.filter((it) => !it.delivered);
315
+ if (opts.markDelivered === true && pending.length > 0) {
316
+ for (const it of pending)
317
+ it.delivered = true;
318
+ s.inboxes[supervisorId] = items;
319
+ await writeInboxFile(s);
320
+ }
321
+ return pending.map((it) => ({ ...it }));
322
+ });
323
+ }
324
+ /**
325
+ * Return ALL inbox items for the supervisor (delivered + pending),
326
+ * newest first. Powers the REST UI; capped by the per-supervisor
327
+ * FIFO already, so safe to send wholesale.
328
+ */
329
+ export async function readAllInbox(supervisorId) {
330
+ const s = await readInboxFile();
331
+ const items = s.inboxes[supervisorId] ?? [];
332
+ return items.slice().reverse();
333
+ }
334
+ export async function pendingInboxCount(supervisorId) {
335
+ const s = await readInboxFile();
336
+ const items = s.inboxes[supervisorId] ?? [];
337
+ return items.filter((it) => !it.delivered).length;
338
+ }
339
+ /**
340
+ * Drop a supervisor's inbox entirely. Called when supervisor mode
341
+ * is disabled or the supervisor session is deleted.
342
+ */
343
+ export async function clearInbox(supervisorId) {
344
+ await withInboxLock(async () => {
345
+ const s = await readInboxFile();
346
+ if (s.inboxes[supervisorId] === undefined)
347
+ return;
348
+ delete s.inboxes[supervisorId];
349
+ await writeInboxFile(s);
350
+ });
351
+ }
352
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/orchestration/store.ts"],"names":[],"mappings":"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"}