pi-forge 1.3.5 → 1.3.7
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/README.md +1 -1
- package/dist/client/assets/{CodeMirrorEditor-iLMm0PBW.js → CodeMirrorEditor-BklpCqAo.js} +2 -2
- package/dist/client/assets/{CodeMirrorEditor-iLMm0PBW.js.map → CodeMirrorEditor-BklpCqAo.js.map} +1 -1
- package/dist/client/assets/index-CfPBiBJW.css +1 -0
- package/dist/client/assets/{index-ChVHn55j.js → index-EU82nCUh.js} +85 -84
- package/dist/client/assets/index-EU82nCUh.js.map +1 -0
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.map +1 -1
- package/dist/server/cli.js +122 -1
- package/dist/server/cli.js.map +1 -1
- package/dist/server/config.js +69 -4
- package/dist/server/config.js.map +1 -1
- package/dist/server/git-runner.js +57 -0
- package/dist/server/git-runner.js.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/ldap-auth.js +103 -0
- package/dist/server/ldap-auth.js.map +1 -0
- package/dist/server/lifecycle-notifications.js +44 -0
- package/dist/server/lifecycle-notifications.js.map +1 -0
- package/dist/server/mcp/manager.js +40 -5
- package/dist/server/mcp/manager.js.map +1 -1
- package/dist/server/mcp/tool-bridge.js +12 -8
- package/dist/server/mcp/tool-bridge.js.map +1 -1
- package/dist/server/orchestration/config.js +10 -36
- package/dist/server/orchestration/config.js.map +1 -1
- package/dist/server/orchestration/event-bridge.js +80 -28
- package/dist/server/orchestration/event-bridge.js.map +1 -1
- package/dist/server/orchestration/inbox.js +157 -124
- package/dist/server/orchestration/inbox.js.map +1 -1
- package/dist/server/orchestration/init.js +1 -1
- package/dist/server/orchestration/store.js +44 -4
- package/dist/server/orchestration/store.js.map +1 -1
- package/dist/server/orchestration/tools.js +51 -132
- package/dist/server/orchestration/tools.js.map +1 -1
- package/dist/server/orchestration/types.js +8 -4
- package/dist/server/orchestration/types.js.map +1 -1
- package/dist/server/orchestration/worker-lifecycle.js +68 -0
- package/dist/server/orchestration/worker-lifecycle.js.map +1 -0
- package/dist/server/routes/_schemas.js +6 -0
- package/dist/server/routes/_schemas.js.map +1 -1
- package/dist/server/routes/auth.js +31 -9
- package/dist/server/routes/auth.js.map +1 -1
- package/dist/server/routes/control.js +52 -13
- package/dist/server/routes/control.js.map +1 -1
- package/dist/server/routes/git.js +227 -216
- package/dist/server/routes/git.js.map +1 -1
- package/dist/server/routes/health.js +3 -4
- package/dist/server/routes/health.js.map +1 -1
- package/dist/server/routes/orchestration.js +41 -15
- package/dist/server/routes/orchestration.js.map +1 -1
- package/dist/server/routes/prompt.js +40 -2
- package/dist/server/routes/prompt.js.map +1 -1
- package/dist/server/routes/sessions.js +142 -18
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/stream.js +77 -2
- package/dist/server/routes/stream.js.map +1 -1
- package/dist/server/routes/terminal.js +18 -7
- package/dist/server/routes/terminal.js.map +1 -1
- package/dist/server/session-registry.js +159 -32
- package/dist/server/session-registry.js.map +1 -1
- package/dist/server/sse-bridge.js +58 -29
- package/dist/server/sse-bridge.js.map +1 -1
- package/dist/server/subagents-external.js +319 -0
- package/dist/server/subagents-external.js.map +1 -0
- package/package.json +5 -4
- package/dist/client/assets/index-ChVHn55j.js.map +0 -1
- package/dist/client/assets/index-D311Lak3.css +0 -1
|
@@ -3,6 +3,7 @@ import { getSession } from "./session-registry.js";
|
|
|
3
3
|
import { getPendingForSession as getPendingAskQuestions, subscribe as subscribeAskQuestions, } from "./ask-user-question/registry.js";
|
|
4
4
|
import { peekCached as peekCachedTodo, subscribe as subscribeTodo } from "./todo/store.js";
|
|
5
5
|
import { processManager } from "./processes/manager.js";
|
|
6
|
+
import { sendCustomLifecycleMessage } from "./lifecycle-notifications.js";
|
|
6
7
|
/**
|
|
7
8
|
* Per-client outbound-buffer cap. When Node's internal socket buffer
|
|
8
9
|
* for a given client exceeds this many bytes, we drop the client
|
|
@@ -87,6 +88,18 @@ const HEARTBEAT_LINE = `: heartbeat ${"_".repeat(HEARTBEAT_PADDING_BYTES - 14)}\
|
|
|
87
88
|
*/
|
|
88
89
|
const COMPACTION_START_PADDING_BYTES = 2048;
|
|
89
90
|
const COMPACTION_START_PADDING_LINE = `: pad-flush ${"_".repeat(COMPACTION_START_PADDING_BYTES - 14)}\n\n`;
|
|
91
|
+
/**
|
|
92
|
+
* One-shot padding flush for tiny forge-native session-list nudges.
|
|
93
|
+
*
|
|
94
|
+
* `session_list_changed` is intentionally a small event (usually just
|
|
95
|
+
* projectId + reason), which makes it vulnerable to L7 proxy buffering in
|
|
96
|
+
* the exact path where users need it most: long-running supervisor turns
|
|
97
|
+
* that spawn a worker, then continue working while the sidebar should update.
|
|
98
|
+
* Follow the data frame with a padded SSE comment so nginx/HAProxy/Vite proxy
|
|
99
|
+
* release it immediately instead of batching it with a later heartbeat.
|
|
100
|
+
*/
|
|
101
|
+
const SESSION_LIST_CHANGED_PADDING_BYTES = 2048;
|
|
102
|
+
const SESSION_LIST_CHANGED_PADDING_LINE = `: session-list-changed ${"_".repeat(SESSION_LIST_CHANGED_PADDING_BYTES - 24)}\n\n`;
|
|
90
103
|
/**
|
|
91
104
|
* Event types we forward to browser clients. Anything else from the SDK is
|
|
92
105
|
* dropped on the floor — keeps the wire stream stable across SDK upgrades and
|
|
@@ -130,6 +143,10 @@ const ALLOWED_EVENT_TYPES = new Set([
|
|
|
130
143
|
"process_update",
|
|
131
144
|
"process_output",
|
|
132
145
|
"process_watch",
|
|
146
|
+
// Forge-native session-list invalidation used when tools create sessions
|
|
147
|
+
// out-of-band relative to the user's current sidebar list: pi-subagents'
|
|
148
|
+
// `subagent` and orchestration's `orchestrate_spawn_worker`.
|
|
149
|
+
"session_list_changed",
|
|
133
150
|
]);
|
|
134
151
|
export function isAllowedEvent(event) {
|
|
135
152
|
return ALLOWED_EVENT_TYPES.has(event.type);
|
|
@@ -203,42 +220,51 @@ export function initProcessesFanout() {
|
|
|
203
220
|
return;
|
|
204
221
|
}
|
|
205
222
|
if (event.type === "process_alert") {
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
// we don't await it (the SSE fanout shouldn't block on a
|
|
212
|
-
// round-trip; agent processing happens in the background and
|
|
213
|
-
// the result lands in the session JSONL like any other turn).
|
|
214
|
-
//
|
|
215
|
-
// deliverAs: "followUp" — if the agent is mid-turn, queue the
|
|
216
|
-
// alert until that turn completes. If idle, sendUserMessage
|
|
217
|
-
// kicks off a fresh turn immediately. Either way the user
|
|
218
|
-
// sees the alert message in the chat as a normal user bubble
|
|
219
|
-
// (with the `[process alert]` prefix making it obvious it's
|
|
220
|
-
// automated).
|
|
223
|
+
// Lifecycle alerts are status messages, not user-authored chat.
|
|
224
|
+
// Custom messages let the client render a compact status card
|
|
225
|
+
// and let the server decide per outcome whether the parent
|
|
226
|
+
// agent should take a turn. Clean exits are informational;
|
|
227
|
+
// failures/kills preserve the old "wake the agent" behavior.
|
|
221
228
|
const reasonText = event.reason === "success"
|
|
222
229
|
? `finished successfully (exit ${event.info.exitCode ?? "?"})`
|
|
223
230
|
: event.reason === "failure"
|
|
224
231
|
? `failed with exit code ${event.info.exitCode ?? "?"}`
|
|
225
232
|
: "was killed externally";
|
|
226
|
-
const
|
|
233
|
+
const content = `Process "${event.info.name}" (id=${event.info.id}) ${reasonText}. ` +
|
|
227
234
|
`Use \`process output\` to inspect what it produced if you need to react.`;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
msg: "process-alert sendUserMessage failed",
|
|
237
|
-
sessionId: event.sessionId,
|
|
238
|
-
processId: event.info.id,
|
|
235
|
+
const triggerTurn = event.reason !== "success";
|
|
236
|
+
sendCustomLifecycleMessage(live.session, {
|
|
237
|
+
customType: "process-notify",
|
|
238
|
+
content,
|
|
239
|
+
display: true,
|
|
240
|
+
details: {
|
|
241
|
+
source: "process",
|
|
242
|
+
state: event.reason,
|
|
239
243
|
reason: event.reason,
|
|
240
|
-
|
|
241
|
-
|
|
244
|
+
processId: event.info.id,
|
|
245
|
+
name: event.info.name,
|
|
246
|
+
command: event.info.command,
|
|
247
|
+
pid: event.info.pid,
|
|
248
|
+
exitCode: event.info.exitCode,
|
|
249
|
+
success: event.info.success,
|
|
250
|
+
status: event.info.status,
|
|
251
|
+
},
|
|
252
|
+
}, {
|
|
253
|
+
triggerTurn,
|
|
254
|
+
onError: (err) => {
|
|
255
|
+
// Swallow — most likely failure mode is "session was
|
|
256
|
+
// disposed between fanout and queue-write," which is benign.
|
|
257
|
+
process.stderr.write(JSON.stringify({
|
|
258
|
+
level: "warn",
|
|
259
|
+
time: new Date().toISOString(),
|
|
260
|
+
msg: "process-alert sendCustomMessage failed",
|
|
261
|
+
sessionId: event.sessionId,
|
|
262
|
+
processId: event.info.id,
|
|
263
|
+
reason: event.reason,
|
|
264
|
+
triggerTurn,
|
|
265
|
+
err: err instanceof Error ? err.message : String(err),
|
|
266
|
+
}) + "\n");
|
|
267
|
+
},
|
|
242
268
|
});
|
|
243
269
|
return;
|
|
244
270
|
}
|
|
@@ -419,6 +445,9 @@ export function createSSEClient(reply, live) {
|
|
|
419
445
|
if (event.type === "compaction_start") {
|
|
420
446
|
writeRaw(COMPACTION_START_PADDING_LINE);
|
|
421
447
|
}
|
|
448
|
+
if (event.type === "session_list_changed") {
|
|
449
|
+
writeRaw(SESSION_LIST_CHANGED_PADDING_LINE);
|
|
450
|
+
}
|
|
422
451
|
};
|
|
423
452
|
const client = { id, send, close };
|
|
424
453
|
registeredClient = client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-bridge.js","sourceRoot":"","sources":["../src/sse-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,oBAAoB,IAAI,sBAAsB,EAC9C,SAAS,IAAI,qBAAqB,GACnC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"sse-bridge.js","sourceRoot":"","sources":["../src/sse-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { existsSync, watch } from "node:fs";
|
|
2
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import { SessionManager } from "@earendil-works/pi-coding-agent";
|
|
6
|
+
import { getSession } from "./session-registry.js";
|
|
7
|
+
function sanitizeTempScopeSegment(value) {
|
|
8
|
+
const sanitized = value
|
|
9
|
+
.trim()
|
|
10
|
+
.replace(/[^A-Za-z0-9._-]+/g, "-")
|
|
11
|
+
.replace(/^-+|-+$/g, "");
|
|
12
|
+
return sanitized || "unknown";
|
|
13
|
+
}
|
|
14
|
+
function resolveTempScopeId() {
|
|
15
|
+
if (typeof process.getuid === "function")
|
|
16
|
+
return `uid-${process.getuid()}`;
|
|
17
|
+
for (const key of ["USERNAME", "USER", "LOGNAME"]) {
|
|
18
|
+
const value = process.env[key];
|
|
19
|
+
if (value)
|
|
20
|
+
return `user-${sanitizeTempScopeSegment(value)}`;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const username = os.userInfo().username;
|
|
24
|
+
if (username)
|
|
25
|
+
return `user-${sanitizeTempScopeSegment(username)}`;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// fall through
|
|
29
|
+
}
|
|
30
|
+
const homedir = process.env.USERPROFILE ?? process.env.HOME ?? os.homedir();
|
|
31
|
+
if (homedir)
|
|
32
|
+
return `home-${sanitizeTempScopeSegment(homedir)}`;
|
|
33
|
+
return "shared";
|
|
34
|
+
}
|
|
35
|
+
export const SUBAGENTS_TEMP_ROOT = join(os.tmpdir(), `pi-subagents-${resolveTempScopeId()}`);
|
|
36
|
+
export const SUBAGENTS_RESULTS_DIR = join(SUBAGENTS_TEMP_ROOT, "async-subagent-results");
|
|
37
|
+
export const SUBAGENTS_ASYNC_DIR = join(SUBAGENTS_TEMP_ROOT, "async-subagent-runs");
|
|
38
|
+
const TERMINAL_STATES = new Set(["complete", "failed", "paused"]);
|
|
39
|
+
const ACTIVE_STATES = new Set(["queued", "running"]);
|
|
40
|
+
const deliveredCompletionKeys = new Set();
|
|
41
|
+
const deliveredSessionListKeys = new Set();
|
|
42
|
+
let watcherStarted = false;
|
|
43
|
+
let asyncWatcher;
|
|
44
|
+
let resultsWatcher;
|
|
45
|
+
let scanTimer;
|
|
46
|
+
function rootRunId(runId) {
|
|
47
|
+
return runId?.split(/[\\/]/, 1)[0];
|
|
48
|
+
}
|
|
49
|
+
function isExternalState(value) {
|
|
50
|
+
return (value === "queued" ||
|
|
51
|
+
value === "running" ||
|
|
52
|
+
value === "complete" ||
|
|
53
|
+
value === "failed" ||
|
|
54
|
+
value === "paused");
|
|
55
|
+
}
|
|
56
|
+
async function readJson(path) {
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function readStatusByRoot(root) {
|
|
65
|
+
const statusPath = join(SUBAGENTS_ASYNC_DIR, root, "status.json");
|
|
66
|
+
const status = await readJson(statusPath);
|
|
67
|
+
if (!isExternalState(status?.state))
|
|
68
|
+
return undefined;
|
|
69
|
+
const resultPath = join(SUBAGENTS_RESULTS_DIR, `${root}.json`);
|
|
70
|
+
const out = {
|
|
71
|
+
runId: status.runId ?? root,
|
|
72
|
+
rootRunId: root,
|
|
73
|
+
state: status.state,
|
|
74
|
+
isExternalLive: ACTIVE_STATES.has(status.state),
|
|
75
|
+
statusPath,
|
|
76
|
+
};
|
|
77
|
+
if (existsSync(resultPath))
|
|
78
|
+
out.resultPath = resultPath;
|
|
79
|
+
if (typeof status.sessionId === "string")
|
|
80
|
+
out.parentSessionId = status.sessionId;
|
|
81
|
+
if (typeof status.sessionFile === "string")
|
|
82
|
+
out.sessionFile = status.sessionFile;
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
function statusMatchesSession(status, sessionPath) {
|
|
86
|
+
if (sessionPath === undefined)
|
|
87
|
+
return true;
|
|
88
|
+
return status.sessionFile === sessionPath;
|
|
89
|
+
}
|
|
90
|
+
async function readStatusRoots() {
|
|
91
|
+
try {
|
|
92
|
+
return await readdir(SUBAGENTS_ASYNC_DIR);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function statusFileSessionPaths(status) {
|
|
99
|
+
const paths = [];
|
|
100
|
+
if (typeof status.sessionFile === "string")
|
|
101
|
+
paths.push(status.sessionFile);
|
|
102
|
+
for (const step of status.steps ?? []) {
|
|
103
|
+
if (typeof step.sessionFile === "string")
|
|
104
|
+
paths.push(step.sessionFile);
|
|
105
|
+
}
|
|
106
|
+
return paths;
|
|
107
|
+
}
|
|
108
|
+
async function readStatusByRootForSessionPath(root, sessionPath) {
|
|
109
|
+
const statusPath = join(SUBAGENTS_ASYNC_DIR, root, "status.json");
|
|
110
|
+
const raw = await readJson(statusPath);
|
|
111
|
+
if (!isExternalState(raw?.state))
|
|
112
|
+
return undefined;
|
|
113
|
+
if (!statusFileSessionPaths(raw).includes(sessionPath))
|
|
114
|
+
return undefined;
|
|
115
|
+
const base = await readStatusByRoot(root);
|
|
116
|
+
if (base === undefined)
|
|
117
|
+
return undefined;
|
|
118
|
+
return { ...base, sessionFile: sessionPath };
|
|
119
|
+
}
|
|
120
|
+
async function findExternalSubagentStatusForSessionPath(sessionPath) {
|
|
121
|
+
if (sessionPath === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
const roots = await readStatusRoots();
|
|
124
|
+
for (const root of roots) {
|
|
125
|
+
const status = await readStatusByRootForSessionPath(root, sessionPath);
|
|
126
|
+
if (status !== undefined)
|
|
127
|
+
return status;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
export async function getExternalSubagentStatusForRun(runId) {
|
|
132
|
+
const root = rootRunId(runId);
|
|
133
|
+
if (root === undefined || root.length === 0)
|
|
134
|
+
return undefined;
|
|
135
|
+
return readStatusByRoot(root);
|
|
136
|
+
}
|
|
137
|
+
export async function getExternalSubagentStatusForSession(info) {
|
|
138
|
+
const status = await getExternalSubagentStatusForRun(info.runId);
|
|
139
|
+
if (status !== undefined && statusMatchesSession(status, info.path))
|
|
140
|
+
return status;
|
|
141
|
+
// pi-subagents async status run ids are not always the same as the nested
|
|
142
|
+
// session directory segments that pi-forge discovers in the sidebar. In
|
|
143
|
+
// current pi-subagents, status.json can identify the child by exact
|
|
144
|
+
// `steps[].sessionFile` instead. That path match is the authoritative signal
|
|
145
|
+
// for protecting an externally running child.
|
|
146
|
+
return findExternalSubagentStatusForSessionPath(info.path);
|
|
147
|
+
}
|
|
148
|
+
export async function isExternallyActiveSubagentSession(info) {
|
|
149
|
+
const status = await getExternalSubagentStatusForSession(info);
|
|
150
|
+
return status?.isExternalLive === true;
|
|
151
|
+
}
|
|
152
|
+
export function readSessionMessagesFromDisk(sessionPath, workspacePath) {
|
|
153
|
+
const manager = SessionManager.open(sessionPath, undefined, workspacePath);
|
|
154
|
+
return manager.buildSessionContext().messages;
|
|
155
|
+
}
|
|
156
|
+
function formatCompletionContent(result, status) {
|
|
157
|
+
const state = result?.state === "paused" || status.state === "paused"
|
|
158
|
+
? "paused"
|
|
159
|
+
: result?.success === false || status.state === "failed"
|
|
160
|
+
? "failed"
|
|
161
|
+
: "completed";
|
|
162
|
+
const agent = result?.agent ?? result?.results?.[0]?.agent ?? "subagent";
|
|
163
|
+
const summary = result?.summary ??
|
|
164
|
+
result?.results?.[0]?.output ??
|
|
165
|
+
result?.results?.[0]?.error ??
|
|
166
|
+
`(background run ${status.rootRunId} ${state})`;
|
|
167
|
+
const sessionFile = result?.sessionFile ??
|
|
168
|
+
result?.results?.find((r) => typeof r.sessionFile === "string")?.sessionFile ??
|
|
169
|
+
status.sessionFile;
|
|
170
|
+
return [
|
|
171
|
+
`Background task ${state}: **${agent}**`,
|
|
172
|
+
"",
|
|
173
|
+
summary.trim() || "(no output)",
|
|
174
|
+
sessionFile ? "" : undefined,
|
|
175
|
+
sessionFile ? `Session file: ${sessionFile}` : undefined,
|
|
176
|
+
]
|
|
177
|
+
.filter((line) => line !== undefined)
|
|
178
|
+
.join("\n");
|
|
179
|
+
}
|
|
180
|
+
async function sessionIdFromSessionReference(ref) {
|
|
181
|
+
if (ref === undefined)
|
|
182
|
+
return undefined;
|
|
183
|
+
if (getSession(ref) !== undefined)
|
|
184
|
+
return ref;
|
|
185
|
+
try {
|
|
186
|
+
const firstLine = (await readFile(ref, "utf8")).split(/\r?\n/, 1)[0];
|
|
187
|
+
if (firstLine === undefined)
|
|
188
|
+
return undefined;
|
|
189
|
+
const header = JSON.parse(firstLine);
|
|
190
|
+
return header.type === "session" && typeof header.id === "string" ? header.id : undefined;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function hasDeliveredCompletionMessage(messages, root, state, content) {
|
|
197
|
+
return messages.some((message) => {
|
|
198
|
+
if (message.role !== "custom" || message.customType !== "subagent-notify")
|
|
199
|
+
return false;
|
|
200
|
+
const details = message.details;
|
|
201
|
+
if (details?.source === "pi-subagents" && details.runId === root && details.state === state) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
// Backward-compatible durable dedupe for notifications written before we
|
|
205
|
+
// started persisting run metadata in details. This also covers SDK versions
|
|
206
|
+
// that might omit details from rebuilt custom-message state. The formatted
|
|
207
|
+
// completion includes the child session file when available, so exact
|
|
208
|
+
// content matching is stable enough to prevent restart replays without
|
|
209
|
+
// suppressing unrelated runs.
|
|
210
|
+
return message.content === content;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export async function deliverExternalSubagentCompletionForRun(root) {
|
|
214
|
+
const status = await readStatusByRoot(root);
|
|
215
|
+
if (status === undefined || !TERMINAL_STATES.has(status.state))
|
|
216
|
+
return;
|
|
217
|
+
const resultPath = join(SUBAGENTS_RESULTS_DIR, `${root}.json`);
|
|
218
|
+
const result = await readJson(resultPath);
|
|
219
|
+
const parentId = await sessionIdFromSessionReference(result?.sessionId ?? status.parentSessionId);
|
|
220
|
+
if (parentId === undefined)
|
|
221
|
+
return;
|
|
222
|
+
const live = getSession(parentId);
|
|
223
|
+
if (live === undefined)
|
|
224
|
+
return;
|
|
225
|
+
const key = `${parentId}:${root}:${status.state}`;
|
|
226
|
+
if (deliveredCompletionKeys.has(key))
|
|
227
|
+
return;
|
|
228
|
+
const content = formatCompletionContent(result, status);
|
|
229
|
+
if (hasDeliveredCompletionMessage(live.session.messages, root, status.state, content)) {
|
|
230
|
+
deliveredCompletionKeys.add(key);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
deliveredCompletionKeys.add(key);
|
|
234
|
+
await live.session.sendCustomMessage({
|
|
235
|
+
customType: "subagent-notify",
|
|
236
|
+
content,
|
|
237
|
+
display: true,
|
|
238
|
+
details: { source: "pi-subagents", runId: root, state: status.state },
|
|
239
|
+
}, { triggerTurn: true });
|
|
240
|
+
for (const c of live.clients) {
|
|
241
|
+
c.send({
|
|
242
|
+
type: "session_list_changed",
|
|
243
|
+
sessionId: parentId,
|
|
244
|
+
projectId: live.projectId,
|
|
245
|
+
reason: "subagent_async_complete",
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function deliverExternalSubagentSessionListChange(root) {
|
|
250
|
+
const status = await readStatusByRoot(root);
|
|
251
|
+
if (status === undefined)
|
|
252
|
+
return;
|
|
253
|
+
const parentId = await sessionIdFromSessionReference(status.parentSessionId);
|
|
254
|
+
if (parentId === undefined)
|
|
255
|
+
return;
|
|
256
|
+
const live = getSession(parentId);
|
|
257
|
+
if (live === undefined)
|
|
258
|
+
return;
|
|
259
|
+
const key = `${parentId}:${root}:${status.state}`;
|
|
260
|
+
if (TERMINAL_STATES.has(status.state)) {
|
|
261
|
+
if (deliveredSessionListKeys.has(key))
|
|
262
|
+
return;
|
|
263
|
+
deliveredSessionListKeys.add(key);
|
|
264
|
+
}
|
|
265
|
+
for (const c of live.clients) {
|
|
266
|
+
c.send({
|
|
267
|
+
type: "session_list_changed",
|
|
268
|
+
sessionId: parentId,
|
|
269
|
+
projectId: live.projectId,
|
|
270
|
+
reason: `subagent_async_${status.state}`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function scanSubagentRuns() {
|
|
275
|
+
let entries;
|
|
276
|
+
try {
|
|
277
|
+
entries = await readdir(SUBAGENTS_ASYNC_DIR);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
await Promise.all(entries.map(async (root) => {
|
|
283
|
+
await deliverExternalSubagentSessionListChange(root);
|
|
284
|
+
await deliverExternalSubagentCompletionForRun(root);
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
export function startExternalSubagentsWatcher() {
|
|
288
|
+
if (watcherStarted)
|
|
289
|
+
return;
|
|
290
|
+
watcherStarted = true;
|
|
291
|
+
void scanSubagentRuns();
|
|
292
|
+
scanTimer = setInterval(() => void scanSubagentRuns(), 3000);
|
|
293
|
+
scanTimer.unref?.();
|
|
294
|
+
try {
|
|
295
|
+
asyncWatcher = watch(SUBAGENTS_ASYNC_DIR, () => void scanSubagentRuns());
|
|
296
|
+
asyncWatcher.unref?.();
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// Directory may not exist until pi-subagents first runs. Explicit checks in routes still work.
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
resultsWatcher = watch(SUBAGENTS_RESULTS_DIR, () => void scanSubagentRuns());
|
|
303
|
+
resultsWatcher.unref?.();
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Result files are optional and may be consumed by pi-subagents itself.
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
export function stopExternalSubagentsWatcher() {
|
|
310
|
+
asyncWatcher?.close();
|
|
311
|
+
resultsWatcher?.close();
|
|
312
|
+
if (scanTimer !== undefined)
|
|
313
|
+
clearInterval(scanTimer);
|
|
314
|
+
asyncWatcher = undefined;
|
|
315
|
+
resultsWatcher = undefined;
|
|
316
|
+
scanTimer = undefined;
|
|
317
|
+
watcherStarted = false;
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=subagents-external.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagents-external.js","sourceRoot":"","sources":["../src/subagents-external.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-forge",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.7",
|
|
4
4
|
"description": "Browser UI for the pi coding agent — embedded HTTP server with a React workbench (chat, file browser, terminal, git, MCP).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi",
|
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
"postinstall": "node bin/fix-pty-perms.mjs"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
+
"@earendil-works/pi-agent-core": "0.78.0",
|
|
42
|
+
"@earendil-works/pi-ai": "0.78.0",
|
|
43
|
+
"@earendil-works/pi-coding-agent": "0.78.0",
|
|
41
44
|
"@fastify/cors": "^11.0.1",
|
|
42
45
|
"@fastify/multipart": "^10.0.0",
|
|
43
46
|
"@fastify/rate-limit": "^10.2.2",
|
|
@@ -45,13 +48,11 @@
|
|
|
45
48
|
"@fastify/swagger": "^9.5.0",
|
|
46
49
|
"@fastify/swagger-ui": "^5.2.3",
|
|
47
50
|
"@fastify/websocket": "^11.0.2",
|
|
48
|
-
"@earendil-works/pi-agent-core": "0.76.0",
|
|
49
|
-
"@earendil-works/pi-ai": "0.76.0",
|
|
50
|
-
"@earendil-works/pi-coding-agent": "0.76.0",
|
|
51
51
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
52
52
|
"exceljs": "^4.4.0",
|
|
53
53
|
"fastify": "^5.3.2",
|
|
54
54
|
"jsonwebtoken": "^9.0.2",
|
|
55
|
+
"ldapts": "^8.1.8",
|
|
55
56
|
"mammoth": "^1.12.0",
|
|
56
57
|
"node-pty": "^1.0.0",
|
|
57
58
|
"pdf-parse": "^2.4.5",
|