@jmfederico/pi-web 1.202608.2 → 1.202609.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.
- package/dist/client/apple-touch-icon-dev.png +0 -0
- package/dist/client/assets/{CodeViewer-BMWwxG7q.js → CodeViewer-CGAlg9S8.js} +1 -1
- package/dist/client/assets/{TerminalPanel-CacQDIYn.js → TerminalPanel-xhJRhOas.js} +1 -1
- package/dist/client/assets/{index-DUW2xnoV.js → index-DXQKhn1P.js} +370 -323
- package/dist/client/favicon-dev.svg +8 -0
- package/dist/client/index.html +2 -2
- package/dist/client/pwa-icon-dev-192.png +0 -0
- package/dist/client/pwa-icon-dev-512.png +0 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -1
- package/dist/nativeServices/installedServiceDefinitions.js +5 -6
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
- package/dist/pi-packages/relays/package.json +1 -1
- package/dist/pi-packages/relays/prompts/relay-worktree.md +13 -142
- package/dist/pi-packages/relays/prompts/relay.md +25 -132
- package/dist/pi-packages/relays/relayDiscovery.js +2 -2
- package/dist/pi-packages/relays/relaysPanelElement.js +1 -1
- package/dist/pi-packages/relays/skills/relay/SKILL.md +59 -88
- package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +245 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +44 -34
- package/dist/server/app.js +13 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +6 -1
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/deploymentIdentity.js +67 -0
- package/dist/server/deploymentIdentity.js.map +1 -0
- package/dist/server/deploymentIdentityRoutes.js +22 -0
- package/dist/server/deploymentIdentityRoutes.js.map +1 -0
- package/dist/server/knownAutoInstallPiPackages.js +1 -1
- package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
- package/dist/server/notices/serverNoticeRoutes.js +34 -0
- package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
- package/dist/server/notices/serverNoticeService.js +26 -0
- package/dist/server/notices/serverNoticeService.js.map +1 -0
- package/dist/server/notices/serverNoticeStore.js +78 -0
- package/dist/server/notices/serverNoticeStore.js.map +1 -0
- package/dist/server/piWebStatus.js +1 -1
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/sessiond/sessionProxyRoutes.js +2 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond.js +15 -4
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/attachmentService.js +1 -5
- package/dist/server/sessions/attachmentService.js.map +1 -1
- package/dist/server/sessions/piSessionManagerGateway.js +171 -1
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +177 -8
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/transcriptBranchCache.js +81 -0
- package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
- package/dist/server/terminals/terminalService.js +18 -1
- package/dist/server/terminals/terminalService.js.map +1 -1
- package/dist/server/workspaces/projectPiWebConfig.js +6 -1
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
- package/dist/server/workspaces/workspaceRemovalService.js +16 -5
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/federatedRoutes.js +2 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/docs/config.md +30 -4
- package/docs/plugins.md +9 -5
- package/package.json +5 -5
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { mkdir, realpath, writeFile } from "node:fs/promises";
|
|
2
2
|
import { basename, extname, join } from "node:path";
|
|
3
3
|
import { formatDimensionNote, resizeImage } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { DEFAULT_ATTACHMENT_FOLDER } from "../../config.js";
|
|
4
5
|
import { extensionForImageMimeType } from "../../shared/promptAttachments.js";
|
|
5
6
|
import { ensureInside, isNodeErrorWithCode, resolveParentInsideWorkspace } from "../workspaces/pathSafety.js";
|
|
6
|
-
/**
|
|
7
|
-
* Default workspace-relative folder used when saving pasted/dropped
|
|
8
|
-
* attachments for the agent to read with its own tools.
|
|
9
|
-
*/
|
|
10
|
-
export const DEFAULT_ATTACHMENT_FOLDER = ".pi-web/attachments";
|
|
11
7
|
/**
|
|
12
8
|
* Convert validated attachments into pi-compatible inline image content.
|
|
13
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachmentService.js","sourceRoot":"","sources":["../../../src/server/sessions/attachmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"attachmentService.js","sourceRoot":"","sources":["../../../src/server/sessions/attachmentService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { readdir } from "node:fs/promises";
|
|
1
|
+
import { open, readFile, readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { SessionManager, SettingsManager } from "@earendil-works/pi-coding-agent";
|
|
5
5
|
import { AGENT_SESSION_DIR_ENV_KEYS } from "../../config.js";
|
|
6
6
|
import { canonicalizeStoredCwd, cwdPathsEqual } from "../workingDirectory.js";
|
|
7
|
+
import { isNodeErrorWithCode } from "../workspaces/pathSafety.js";
|
|
7
8
|
import { readSessionHeaderSummary } from "./sessionFileHeader.js";
|
|
9
|
+
import { tryParseEntry } from "./sessionFileFormat.js";
|
|
8
10
|
import { SessionSummaryScanner } from "./sessionSummaryScanner.js";
|
|
11
|
+
import { TranscriptBranchCache } from "./transcriptBranchCache.js";
|
|
9
12
|
export class SessionDirResolver {
|
|
10
13
|
constructor(options) {
|
|
11
14
|
this.agentDir = options.agentDir;
|
|
@@ -52,6 +55,15 @@ class SettingsAwarePiSessionManagerGateway {
|
|
|
52
55
|
* in-place rewrites those checks cannot see.
|
|
53
56
|
*/
|
|
54
57
|
this.summaryScanner = new SessionSummaryScanner();
|
|
58
|
+
// Idle-session transcript snapshots, memoized by file signature and bounded
|
|
59
|
+
// (LRU) so daemon-lifetime polling cannot retain every session ever read.
|
|
60
|
+
// Snapshots keep their parsed entries so a file that grew by append only is
|
|
61
|
+
// extended from the appended bytes instead of re-parsed whole.
|
|
62
|
+
this.transcriptBranches = new TranscriptBranchCache();
|
|
63
|
+
// In-flight snapshot reads, deduplicated per path. Each entry removes itself
|
|
64
|
+
// when its read settles, so this map only ever holds genuinely concurrent
|
|
65
|
+
// reads and needs no bound of its own.
|
|
66
|
+
this.pendingTranscriptBranches = new Map();
|
|
55
67
|
}
|
|
56
68
|
async list(cwd) {
|
|
57
69
|
const resolution = this.resolver.resolve(cwd);
|
|
@@ -79,6 +91,56 @@ class SettingsAwarePiSessionManagerGateway {
|
|
|
79
91
|
const resolution = this.resolver.resolve(cwd);
|
|
80
92
|
return SessionManager.create(cwd, resolution.sessionDir, options?.parentSession === undefined ? undefined : { parentSession: options.parentSession });
|
|
81
93
|
}
|
|
94
|
+
async readBranch(path) {
|
|
95
|
+
// A session whose path is known may still have no file on disk (created in
|
|
96
|
+
// memory, never persisted) or be removed externally at any moment. Absence
|
|
97
|
+
// is not a failure: it means there is no disk snapshot to serve.
|
|
98
|
+
const file = await statIfPresent(path);
|
|
99
|
+
if (file === undefined)
|
|
100
|
+
return undefined;
|
|
101
|
+
const signature = transcriptFileSignature(file);
|
|
102
|
+
const cached = this.transcriptBranches.get(path, signature);
|
|
103
|
+
if (cached !== undefined)
|
|
104
|
+
return cached.branch;
|
|
105
|
+
const pending = this.pendingTranscriptBranches.get(path);
|
|
106
|
+
if (pending !== undefined)
|
|
107
|
+
return pending;
|
|
108
|
+
const read = this.readSnapshot(path, file, signature)
|
|
109
|
+
.then((snapshot) => {
|
|
110
|
+
this.transcriptBranches.set(path, snapshot);
|
|
111
|
+
return snapshot.branch;
|
|
112
|
+
})
|
|
113
|
+
.catch((error) => {
|
|
114
|
+
// Deleted between the stat above and the read: again, no snapshot.
|
|
115
|
+
if (isNodeErrorWithCode(error, "ENOENT"))
|
|
116
|
+
return undefined;
|
|
117
|
+
throw error;
|
|
118
|
+
})
|
|
119
|
+
.finally(() => { this.pendingTranscriptBranches.delete(path); });
|
|
120
|
+
this.pendingTranscriptBranches.set(path, read);
|
|
121
|
+
return read;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse the transcript snapshot for `path`. When the memoized snapshot's
|
|
125
|
+
* file grew by append only — same identity, larger size, and the appended
|
|
126
|
+
* bytes start on a line boundary — parse just those bytes and extend the
|
|
127
|
+
* memoized entries; any anomaly falls back to a full re-read.
|
|
128
|
+
*/
|
|
129
|
+
async readSnapshot(path, file, signature) {
|
|
130
|
+
const identity = transcriptFileIdentity(file);
|
|
131
|
+
const previous = this.transcriptBranches.getLatest(path);
|
|
132
|
+
// A zero-size cached prefix has no boundary byte to verify against, but a
|
|
133
|
+
// full re-read of a file that was empty one poll ago is trivial anyway.
|
|
134
|
+
if (previous?.identity === identity && previous.size > 0 && previous.size < file.size) {
|
|
135
|
+
const appended = await readAppendedEntries(path, previous.size, file.size, identity);
|
|
136
|
+
if (appended !== undefined) {
|
|
137
|
+
const entries = [...previous.entries, ...appended];
|
|
138
|
+
return { signature, identity, size: file.size, entries, branch: deriveTranscriptBranch(entries) };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const entries = parseTranscriptEntries(await readFile(path, "utf8"));
|
|
142
|
+
return { signature, identity, size: file.size, entries, branch: deriveTranscriptBranch(entries) };
|
|
143
|
+
}
|
|
82
144
|
async listAll() {
|
|
83
145
|
const envSessionDir = this.resolver.globalEnvSessionDir();
|
|
84
146
|
const [defaultSessions, envSessions] = await Promise.all([
|
|
@@ -91,6 +153,114 @@ class SettingsAwarePiSessionManagerGateway {
|
|
|
91
153
|
return SessionManager.open(path, dirname(path));
|
|
92
154
|
}
|
|
93
155
|
}
|
|
156
|
+
/** Stat a transcript path that may be absent; any error other than absence stays a failure. */
|
|
157
|
+
async function statIfPresent(path) {
|
|
158
|
+
try {
|
|
159
|
+
return await stat(path);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (isNodeErrorWithCode(error, "ENOENT"))
|
|
163
|
+
return undefined;
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** The device + inode pair that identifies a transcript file independently of its path. */
|
|
168
|
+
function transcriptFileIdentity(file) {
|
|
169
|
+
return `${String(file.dev)}:${String(file.ino)}`;
|
|
170
|
+
}
|
|
171
|
+
/** The signature a memoized snapshot is validated against: identity, size, and mtime. */
|
|
172
|
+
function transcriptFileSignature(file) {
|
|
173
|
+
return `${transcriptFileIdentity(file)}:${String(file.size)}:${String(file.mtimeMs)}`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Read and parse only the bytes appended to a transcript since `offset`, the
|
|
177
|
+
* size the memoized snapshot was parsed from.
|
|
178
|
+
*
|
|
179
|
+
* Returns `undefined` when the append assumption does not hold — the file was
|
|
180
|
+
* replaced since the stat that produced `identity`, the byte before the
|
|
181
|
+
* offset is not a line boundary, the first appended line does not parse, or
|
|
182
|
+
* the read came back short (truncated mid-read) — so the caller falls back to
|
|
183
|
+
* a full re-read. An unparseable line later in the chunk is skipped, matching
|
|
184
|
+
* full-read behavior, and a final line still being written simply fails to
|
|
185
|
+
* parse until the next poll completes it.
|
|
186
|
+
*/
|
|
187
|
+
async function readAppendedEntries(path, offset, size, identity) {
|
|
188
|
+
const handle = await open(path, "r");
|
|
189
|
+
try {
|
|
190
|
+
const current = await handle.stat();
|
|
191
|
+
if (transcriptFileIdentity(current) !== identity)
|
|
192
|
+
return undefined;
|
|
193
|
+
// Read the byte before the offset along with the appended bytes: it must
|
|
194
|
+
// end a line, proving the cached prefix still ends on a line boundary in
|
|
195
|
+
// the file's current content (i.e. this really is a pure append).
|
|
196
|
+
const length = size - offset + 1;
|
|
197
|
+
const buffer = Buffer.alloc(length);
|
|
198
|
+
const { bytesRead } = await handle.read(buffer, 0, length, offset - 1);
|
|
199
|
+
if (bytesRead !== length)
|
|
200
|
+
return undefined;
|
|
201
|
+
if (buffer[0] !== 0x0a)
|
|
202
|
+
return undefined;
|
|
203
|
+
const lines = buffer.toString("utf8", 1).split("\n");
|
|
204
|
+
const appended = [];
|
|
205
|
+
let firstLine = true;
|
|
206
|
+
for (const line of lines) {
|
|
207
|
+
const entry = tryParseEntry(line);
|
|
208
|
+
if (entry === undefined) {
|
|
209
|
+
// A first appended line that does not parse means the offset did not
|
|
210
|
+
// land on a real content boundary after all; later lines may be
|
|
211
|
+
// skipped the way a full read skips them.
|
|
212
|
+
if (firstLine && line.trim() !== "")
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
else if (entry["type"] !== "session") {
|
|
216
|
+
appended.push(entry);
|
|
217
|
+
}
|
|
218
|
+
firstLine = false;
|
|
219
|
+
}
|
|
220
|
+
return appended;
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
await handle.close();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** Parse every entry line in transcript `content`, skipping unreadable lines and session headers. */
|
|
227
|
+
function parseTranscriptEntries(content) {
|
|
228
|
+
const entries = [];
|
|
229
|
+
for (const line of content.split("\n")) {
|
|
230
|
+
const entry = tryParseEntry(line);
|
|
231
|
+
if (entry !== undefined && entry["type"] !== "session")
|
|
232
|
+
entries.push(entry);
|
|
233
|
+
}
|
|
234
|
+
return entries;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* SDK-compatible active-branch projection with no migration or write side
|
|
238
|
+
* effects: the walk from the last id-bearing entry through `parentId` links,
|
|
239
|
+
* oldest first. Cheap enough to re-run over merged entries after an append.
|
|
240
|
+
*/
|
|
241
|
+
function deriveTranscriptBranch(entries) {
|
|
242
|
+
const byId = new Map();
|
|
243
|
+
let leafId;
|
|
244
|
+
for (const entry of entries) {
|
|
245
|
+
const id = entry["id"];
|
|
246
|
+
if (typeof id !== "string")
|
|
247
|
+
continue;
|
|
248
|
+
byId.set(id, entry);
|
|
249
|
+
leafId = id;
|
|
250
|
+
}
|
|
251
|
+
const branch = [];
|
|
252
|
+
const visited = new Set();
|
|
253
|
+
let currentId = leafId;
|
|
254
|
+
while (currentId !== undefined && !visited.has(currentId)) {
|
|
255
|
+
visited.add(currentId);
|
|
256
|
+
const entry = byId.get(currentId);
|
|
257
|
+
if (entry === undefined)
|
|
258
|
+
break;
|
|
259
|
+
branch.push(entry);
|
|
260
|
+
currentId = typeof entry["parentId"] === "string" ? entry["parentId"] : undefined;
|
|
261
|
+
}
|
|
262
|
+
return branch.reverse();
|
|
263
|
+
}
|
|
94
264
|
export async function listSessionsInDir(sessionDir) {
|
|
95
265
|
// listAll(sessionDir) lists without the SDK's internal cwd filter, which would
|
|
96
266
|
// otherwise compare against this process's cwd and drop other projects' sessions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piSessionManagerGateway.js","sourceRoot":"","sources":["../../../src/server/sessions/piSessionManagerGateway.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"piSessionManagerGateway.js","sourceRoot":"","sources":["../../../src/server/sessions/piSessionManagerGateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { findArchiveCandidateByIdOrPrefix, planSessionArchiveTree } from "./sess
|
|
|
12
12
|
import { deterministicSessionName, fallbackSessionName, generateShortSessionName } from "./sessionNameGenerator.js";
|
|
13
13
|
import { computeEditPreview } from "./editPreview.js";
|
|
14
14
|
import { attachmentsToInlineImages, saveAttachmentsToWorkspace } from "./attachmentService.js";
|
|
15
|
+
import { loadEffectiveProjectAttachmentsConfig } from "../workspaces/projectPiWebConfig.js";
|
|
15
16
|
import { parsePromptAttachments } from "../../shared/promptAttachments.js";
|
|
16
17
|
import { ASK_USER_ANSWERS_CUSTOM_TYPE, SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH, SESSION_UNREAD_LIMIT } from "../../shared/apiTypes.js";
|
|
17
18
|
import { canonicalizeStoredCwd, cwdPathsEqual } from "../workingDirectory.js";
|
|
@@ -47,6 +48,15 @@ const STARTUP_PHASE_EXTENSIONS = "Loading session extensions";
|
|
|
47
48
|
const STARTUP_CONCURRENT_CATALOG_REFRESH = "provider model lists are refreshing";
|
|
48
49
|
const MAX_UNREAD_PUBLICATION_RETRY_MS = 30_000;
|
|
49
50
|
const MAX_PENDING_UNREAD_MUTATIONS = SESSION_UNREAD_LIMIT + 1;
|
|
51
|
+
/**
|
|
52
|
+
* Upper bound on how often one idle runtime re-resolves its transcript file.
|
|
53
|
+
* A runtime created in memory and never persisted has no session file, so
|
|
54
|
+
* every poll would otherwise rescan the session directory; throttling keeps
|
|
55
|
+
* steady-state polling of such a session O(1). The window can only delay
|
|
56
|
+
* noticing a file the runtime did not write itself: once the runtime
|
|
57
|
+
* persists, `getSessionFile()` answers and this throttle is bypassed.
|
|
58
|
+
*/
|
|
59
|
+
const IDLE_SESSION_FILE_RESOLUTION_THROTTLE_MS = 30_000;
|
|
50
60
|
function noop() {
|
|
51
61
|
// Intentionally empty default unsubscribe callback.
|
|
52
62
|
}
|
|
@@ -510,6 +520,12 @@ export class PiSessionService {
|
|
|
510
520
|
this.activities = new Map();
|
|
511
521
|
/** Runtime-identity gate held while Pi may await abandoned-branch summarization. */
|
|
512
522
|
this.treeNavigations = new WeakSet();
|
|
523
|
+
/**
|
|
524
|
+
* Bare live leaf selected without an appended summary entry. Recording that
|
|
525
|
+
* leaf distinguishes the unpersisted move from a later runtime append that
|
|
526
|
+
* can anchor the selected branch on disk.
|
|
527
|
+
*/
|
|
528
|
+
this.unpersistedTreeBranchLeaves = new WeakMap();
|
|
513
529
|
/** Counts async operations that may append an entry before they settle. */
|
|
514
530
|
this.sessionEntryMutationCounts = new WeakMap();
|
|
515
531
|
/** Settings-wide queue preventing enabled-model read/modify/write races across sessions. */
|
|
@@ -545,6 +561,8 @@ export class PiSessionService {
|
|
|
545
561
|
*/
|
|
546
562
|
this.subsessionNotifyArmed = new Map();
|
|
547
563
|
this.notificationGenerationBySession = new WeakMap();
|
|
564
|
+
/** Last idle-poll transcript file resolution per runtime, throttled; entries die with their runtime. */
|
|
565
|
+
this.idleSessionFileResolutions = new WeakMap();
|
|
548
566
|
/** The parked extension Promise resolvers behind the store's open dialogs. */
|
|
549
567
|
this.dialogWaiters = new ExtensionDialogWaiters();
|
|
550
568
|
this.pendingUnreadMutations = [];
|
|
@@ -564,6 +582,7 @@ export class PiSessionService {
|
|
|
564
582
|
this.pendingExtensionDialogStore = deps.pendingExtensionDialogStore ?? new PendingExtensionDialogStore();
|
|
565
583
|
this.extensionDialogsTimeoutMs = deps.extensionDialogsTimeoutMs ?? DEFAULT_EXTENSION_DIALOGS_TIMEOUT_MS;
|
|
566
584
|
this.catalogRefreshStatus = deps.catalogRefreshStatus;
|
|
585
|
+
this.config = deps.config;
|
|
567
586
|
this.unreadPublicationRetryInitialMs = Math.max(0, deps.unreadPublicationRetryDelayMs ?? DEFAULT_UNREAD_PUBLICATION_RETRY_MS);
|
|
568
587
|
this.unreadPublicationRetryDelayMs = this.unreadPublicationRetryInitialMs;
|
|
569
588
|
// Subsessions are gated behind their own flag, and they
|
|
@@ -1520,10 +1539,14 @@ export class PiSessionService {
|
|
|
1520
1539
|
}
|
|
1521
1540
|
async messages(ref, page) {
|
|
1522
1541
|
const session = await this.getOrOpen(ref);
|
|
1523
|
-
return pageMessagesAtSafeBoundary(
|
|
1542
|
+
return pageMessagesAtSafeBoundary(historyMessagesFromEntries(await this.readableSessionBranch(ref, session)), page);
|
|
1524
1543
|
}
|
|
1525
1544
|
async status(ref) {
|
|
1526
|
-
|
|
1545
|
+
const session = await this.sessionForStatusOrDialogClose(ref);
|
|
1546
|
+
if (this.hasActiveWork(session))
|
|
1547
|
+
return this.statusFromSession(session);
|
|
1548
|
+
const branch = await this.readableSessionBranch(ref, session);
|
|
1549
|
+
return this.statusFromSession(session, transcriptMessageCount(branch));
|
|
1527
1550
|
}
|
|
1528
1551
|
/**
|
|
1529
1552
|
* Join-time snapshot of the in-flight assistant stream. The `seq` watermark and
|
|
@@ -1742,7 +1765,25 @@ export class PiSessionService {
|
|
|
1742
1765
|
return [];
|
|
1743
1766
|
await this.assertWritable(ref);
|
|
1744
1767
|
const active = await this.getActive(ref);
|
|
1745
|
-
|
|
1768
|
+
const cwd = active.runtime.cwd;
|
|
1769
|
+
// An explicit request folder wins; the config lookup below is only the
|
|
1770
|
+
// fallback for folder-less calls (see workspaceAttachmentsConfig).
|
|
1771
|
+
const effectiveFolder = folder ?? (await this.workspaceAttachmentsConfig(cwd)).defaultFolder;
|
|
1772
|
+
return saveAttachmentsToWorkspace(cwd, parsed, effectiveFolder === undefined ? {} : { folder: effectiveFolder });
|
|
1773
|
+
}
|
|
1774
|
+
/**
|
|
1775
|
+
* Fallback attachments config for save requests that omit an explicit
|
|
1776
|
+
* folder: the live global config merged with the session cwd's own
|
|
1777
|
+
* project-local override. Unlike `workspaceEffectiveConfig` in app.ts (which
|
|
1778
|
+
* resolves from the owning project's path), this lookup keys off the cwd
|
|
1779
|
+
* itself, so for secondary (worktree) workspaces it cannot see the owning
|
|
1780
|
+
* project's override. The composer therefore always sends the
|
|
1781
|
+
* workspace-effective folder it displayed explicitly; this cwd-based
|
|
1782
|
+
* resolution only governs folder-less API calls.
|
|
1783
|
+
*/
|
|
1784
|
+
async workspaceAttachmentsConfig(cwd) {
|
|
1785
|
+
const globalConfig = this.config === undefined ? {} : (await this.config.read()).effectiveConfig;
|
|
1786
|
+
return loadEffectiveProjectAttachmentsConfig(cwd, globalConfig);
|
|
1746
1787
|
}
|
|
1747
1788
|
async shell(ref, text) {
|
|
1748
1789
|
await this.assertWritable(ref);
|
|
@@ -1807,18 +1848,53 @@ export class PiSessionService {
|
|
|
1807
1848
|
// may enter this runtime until Pi's potentially asynchronous summary settles.
|
|
1808
1849
|
this.treeNavigations.add(session);
|
|
1809
1850
|
try {
|
|
1810
|
-
|
|
1851
|
+
const oldLeafId = session.sessionManager.getLeafId();
|
|
1852
|
+
if (oldLeafId !== request.expectedLeafId) {
|
|
1811
1853
|
throw new Error("The session changed since /tree was opened. Reopen /tree and try again.");
|
|
1812
1854
|
}
|
|
1855
|
+
const activeEditableTargetParentId = activeEditableTreeTargetParentId(session.sessionManager, request.targetId, oldLeafId);
|
|
1813
1856
|
this.publishActivity(session, options.summarize ? "summarizing branch" : "navigating session tree", "active");
|
|
1814
1857
|
this.publishStatus(session);
|
|
1815
|
-
|
|
1858
|
+
let result = await session.navigateTree(request.targetId, options);
|
|
1859
|
+
if (activeEditableTargetParentId !== undefined
|
|
1860
|
+
&& !result.cancelled
|
|
1861
|
+
&& result.editorText === undefined
|
|
1862
|
+
&& result.summaryEntry === undefined
|
|
1863
|
+
&& session.sessionManager.getLeafId() === oldLeafId) {
|
|
1864
|
+
// Supported Pi versions can return early when the target is already the
|
|
1865
|
+
// leaf, before applying their user/custom-message edit semantics. Move
|
|
1866
|
+
// to the target's parent and delegate again so Pi still owns editor-text
|
|
1867
|
+
// extraction, agent-context rebuilding, and tree extension events.
|
|
1868
|
+
setSessionTreeLeaf(session.sessionManager, activeEditableTargetParentId);
|
|
1869
|
+
try {
|
|
1870
|
+
result = await session.navigateTree(request.targetId, options);
|
|
1871
|
+
}
|
|
1872
|
+
catch (error) {
|
|
1873
|
+
session.sessionManager.branch(request.targetId);
|
|
1874
|
+
throw error;
|
|
1875
|
+
}
|
|
1876
|
+
if (result.cancelled)
|
|
1877
|
+
session.sessionManager.branch(request.targetId);
|
|
1878
|
+
}
|
|
1816
1879
|
if (result.cancelled) {
|
|
1817
1880
|
if (this.isCurrentActiveSession(session)) {
|
|
1818
1881
|
this.publishActivity(session, result.aborted === true ? "branch summary aborted" : "tree navigation cancelled", "idle");
|
|
1819
1882
|
}
|
|
1820
1883
|
return { cancelled: true, ...(result.aborted === undefined ? {} : { aborted: result.aborted }) };
|
|
1821
1884
|
}
|
|
1885
|
+
if (result.summaryEntry !== undefined) {
|
|
1886
|
+
// A summary entry durably identifies the selected branch as the file's
|
|
1887
|
+
// newest leaf, superseding any earlier bare selection.
|
|
1888
|
+
this.unpersistedTreeBranchLeaves.delete(session);
|
|
1889
|
+
}
|
|
1890
|
+
else {
|
|
1891
|
+
const selectedLeafId = session.sessionManager.getLeafId();
|
|
1892
|
+
if (selectedLeafId !== oldLeafId) {
|
|
1893
|
+
// SessionManager.branch()/resetLeaf() only move Pi's in-memory leaf.
|
|
1894
|
+
// Keep that branch authoritative until a later append makes disk agree.
|
|
1895
|
+
this.unpersistedTreeBranchLeaves.set(session, selectedLeafId);
|
|
1896
|
+
}
|
|
1897
|
+
}
|
|
1822
1898
|
if (this.isCurrentActiveSession(session))
|
|
1823
1899
|
this.publishActivity(session, "session tree navigated", "idle");
|
|
1824
1900
|
return { cancelled: false, ...(result.editorText === undefined ? {} : { editorText: result.editorText }) };
|
|
@@ -2429,6 +2505,63 @@ export class PiSessionService {
|
|
|
2429
2505
|
async getOrOpen(ref) {
|
|
2430
2506
|
return (await this.getActive(ref)).runtime.session;
|
|
2431
2507
|
}
|
|
2508
|
+
/**
|
|
2509
|
+
* An idle runtime is only Pi Web's cached control view. Another Pi process may
|
|
2510
|
+
* keep appending to the same JSONL file, so transcript reads must open a fresh
|
|
2511
|
+
* read-only snapshot rather than serving that cached branch forever. Active
|
|
2512
|
+
* runtimes remain authoritative and are never replaced, reloaded, or aborted.
|
|
2513
|
+
*/
|
|
2514
|
+
async readableSessionBranch(ref, session) {
|
|
2515
|
+
if (this.hasActiveWork(session) || this.sessionManager.readBranch === undefined)
|
|
2516
|
+
return session.sessionManager.getBranch();
|
|
2517
|
+
const sessionFile = session.sessionFile ?? session.sessionManager.getSessionFile();
|
|
2518
|
+
const resolvedPath = sessionFile === undefined ? await this.idleSessionFilePath(ref, session) : undefined;
|
|
2519
|
+
if (this.hasActiveWork(session))
|
|
2520
|
+
return session.sessionManager.getBranch();
|
|
2521
|
+
const path = sessionFile ?? resolvedPath;
|
|
2522
|
+
if (path === undefined)
|
|
2523
|
+
return session.sessionManager.getBranch();
|
|
2524
|
+
const snapshot = await this.sessionManager.readBranch(path);
|
|
2525
|
+
// No snapshot exists when the transcript file is absent (a session known
|
|
2526
|
+
// by path but never persisted, or externally removed): the runtime branch
|
|
2527
|
+
// is the only readable branch then.
|
|
2528
|
+
if (snapshot === undefined)
|
|
2529
|
+
return session.sessionManager.getBranch();
|
|
2530
|
+
// Reading also yields. A prompt that started meanwhile must still win over
|
|
2531
|
+
// the completed disk snapshot and its potentially older event watermark.
|
|
2532
|
+
if (this.hasActiveWork(session))
|
|
2533
|
+
return session.sessionManager.getBranch();
|
|
2534
|
+
const selectedLeafId = this.unpersistedTreeBranchLeaves.get(session);
|
|
2535
|
+
if (selectedLeafId !== undefined) {
|
|
2536
|
+
const runtimeLeafId = session.sessionManager.getLeafId();
|
|
2537
|
+
const selectedBranchIsAnchored = runtimeLeafId !== null
|
|
2538
|
+
&& runtimeLeafId !== selectedLeafId
|
|
2539
|
+
&& transcriptBranchIncludesEntry(snapshot, runtimeLeafId);
|
|
2540
|
+
if (!selectedBranchIsAnchored)
|
|
2541
|
+
return session.sessionManager.getBranch();
|
|
2542
|
+
// A later runtime append now anchors the live selection in this persisted
|
|
2543
|
+
// branch. Resume ordinary idle snapshots, including external descendants.
|
|
2544
|
+
this.unpersistedTreeBranchLeaves.delete(session);
|
|
2545
|
+
}
|
|
2546
|
+
return snapshot;
|
|
2547
|
+
}
|
|
2548
|
+
/**
|
|
2549
|
+
* Resolve the transcript file for an idle runtime that does not know one,
|
|
2550
|
+
* at most once per {@link IDLE_SESSION_FILE_RESOLUTION_THROTTLE_MS}. The
|
|
2551
|
+
* negative result (no file yet) is the hot case: a never-persisted session
|
|
2552
|
+
* is polled every few seconds, and re-scanning its directory each tick is
|
|
2553
|
+
* pure waste. `getActive` never uses this path, so prompt routing always
|
|
2554
|
+
* sees a fresh resolution.
|
|
2555
|
+
*/
|
|
2556
|
+
async idleSessionFilePath(ref, session) {
|
|
2557
|
+
const cached = this.idleSessionFileResolutions.get(session);
|
|
2558
|
+
const at = this.now().getTime();
|
|
2559
|
+
if (cached !== undefined && at - cached.at < IDLE_SESSION_FILE_RESOLUTION_THROTTLE_MS)
|
|
2560
|
+
return cached.path;
|
|
2561
|
+
const match = await this.sessionManager.resolveSessionFile(ref.cwd, ref.id);
|
|
2562
|
+
this.idleSessionFileResolutions.set(session, { at, path: match?.path });
|
|
2563
|
+
return match?.path;
|
|
2564
|
+
}
|
|
2432
2565
|
async getActive(ref, options = {}) {
|
|
2433
2566
|
const active = this.activeForRef(ref);
|
|
2434
2567
|
if (active !== undefined)
|
|
@@ -3270,7 +3403,7 @@ export class PiSessionService {
|
|
|
3270
3403
|
this.events.publish(session.sessionId, { type: "activity.update", activity });
|
|
3271
3404
|
this.events.publishGlobal({ type: "activity.update", activity });
|
|
3272
3405
|
}
|
|
3273
|
-
statusFromSession(session) {
|
|
3406
|
+
statusFromSession(session, messageCount = session.messages.length) {
|
|
3274
3407
|
const stats = session.getSessionStats();
|
|
3275
3408
|
const model = session.model === undefined ? undefined : modelToClientModel(session.model);
|
|
3276
3409
|
const contextUsage = session.getContextUsage();
|
|
@@ -3287,7 +3420,7 @@ export class PiSessionService {
|
|
|
3287
3420
|
isBashRunning: session.isBashRunning,
|
|
3288
3421
|
pendingMessageCount: this.pendingMessageCount(session),
|
|
3289
3422
|
queuedMessages: queuedMessagesFromSession(session, this.compactionQueuedMessages(session.sessionId)),
|
|
3290
|
-
messageCount
|
|
3423
|
+
messageCount,
|
|
3291
3424
|
tokens: stats.tokens,
|
|
3292
3425
|
cost: stats.cost,
|
|
3293
3426
|
...(contextUsage === undefined ? {} : { contextUsage }),
|
|
@@ -3759,11 +3892,14 @@ function annotateAssistantThinkingLevel(message, thinkingLevel) {
|
|
|
3759
3892
|
return { ...message, thinkingLevel };
|
|
3760
3893
|
}
|
|
3761
3894
|
function historyMessages(session) {
|
|
3895
|
+
return historyMessagesFromEntries(session.sessionManager.getBranch());
|
|
3896
|
+
}
|
|
3897
|
+
function historyMessagesFromEntries(entries) {
|
|
3762
3898
|
const messages = [];
|
|
3763
3899
|
// Pi records the initial level at session creation and every later change, so
|
|
3764
3900
|
// walking the branch yields the level in effect for each assistant message.
|
|
3765
3901
|
let thinkingLevel;
|
|
3766
|
-
for (const entry of
|
|
3902
|
+
for (const entry of entries) {
|
|
3767
3903
|
if (!isRecord(entry))
|
|
3768
3904
|
continue;
|
|
3769
3905
|
if (entry["type"] === "message")
|
|
@@ -3782,6 +3918,39 @@ function historyMessages(session) {
|
|
|
3782
3918
|
}
|
|
3783
3919
|
return messages;
|
|
3784
3920
|
}
|
|
3921
|
+
function transcriptMessageCount(entries) {
|
|
3922
|
+
let count = 0;
|
|
3923
|
+
for (const entry of entries) {
|
|
3924
|
+
if (isRecord(entry) && entry["type"] === "message")
|
|
3925
|
+
count += 1;
|
|
3926
|
+
}
|
|
3927
|
+
return count;
|
|
3928
|
+
}
|
|
3929
|
+
function activeEditableTreeTargetParentId(manager, targetId, activeLeafId) {
|
|
3930
|
+
if (activeLeafId !== targetId)
|
|
3931
|
+
return undefined;
|
|
3932
|
+
const entry = manager.getBranch().at(-1);
|
|
3933
|
+
if (!isRecord(entry) || entry["id"] !== targetId)
|
|
3934
|
+
return undefined;
|
|
3935
|
+
const isUserMessage = entry["type"] === "message"
|
|
3936
|
+
&& isRecord(entry["message"])
|
|
3937
|
+
&& entry["message"]["role"] === "user";
|
|
3938
|
+
if (!isUserMessage && entry["type"] !== "custom_message")
|
|
3939
|
+
return undefined;
|
|
3940
|
+
const parentId = entry["parentId"];
|
|
3941
|
+
if (parentId === targetId)
|
|
3942
|
+
return undefined;
|
|
3943
|
+
return parentId === null || typeof parentId === "string" ? parentId : undefined;
|
|
3944
|
+
}
|
|
3945
|
+
function setSessionTreeLeaf(manager, leafId) {
|
|
3946
|
+
if (leafId === null)
|
|
3947
|
+
manager.resetLeaf();
|
|
3948
|
+
else
|
|
3949
|
+
manager.branch(leafId);
|
|
3950
|
+
}
|
|
3951
|
+
function transcriptBranchIncludesEntry(entries, entryId) {
|
|
3952
|
+
return entries.some((entry) => isRecord(entry) && entry["id"] === entryId);
|
|
3953
|
+
}
|
|
3785
3954
|
/** custom entry type used to persist parent -> child subsession links outside LLM context. */
|
|
3786
3955
|
const SUBSESSION_LINK_CUSTOM_TYPE = "pi-web.subsession.link";
|
|
3787
3956
|
/** custom entry type used to mark a child as created by spawn_subsession. */
|