@chainingintention/pi-web-cn 1.202607.9 → 1.202607.11

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.
@@ -53,7 +53,7 @@
53
53
  html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
54
54
  body { min-height: 100dvh; }
55
55
  </style>
56
- <script type="module" crossorigin src="./assets/index-DS5Xapk8.js"></script>
56
+ <script type="module" crossorigin src="./assets/index-kgpXTDyy.js"></script>
57
57
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
58
58
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
59
59
  </head>
@@ -5,6 +5,7 @@ export class SessionEventHub {
5
5
  constructor() {
6
6
  this.socketsBySession = new Map();
7
7
  this.globalSocketsByScope = new Map();
8
+ this.seqBySessionScope = new Map();
8
9
  }
9
10
  add(sessionId, socket, scope = NORMAL_SESSION_EVENT_SCOPE) {
10
11
  const key = sessionScopeKey(sessionId, scope);
@@ -28,12 +29,18 @@ export class SessionEventHub {
28
29
  socket.on("close", () => sockets.delete(socket));
29
30
  }
30
31
  publish(sessionId, event, scope = NORMAL_SESSION_EVENT_SCOPE) {
31
- const payload = JSON.stringify(projectBrowserSessionEvent(event));
32
- for (const socket of this.socketsBySession.get(sessionScopeKey(sessionId, scope)) ?? []) {
32
+ const key = sessionScopeKey(sessionId, scope);
33
+ const seq = (this.seqBySessionScope.get(key) ?? 0) + 1;
34
+ this.seqBySessionScope.set(key, seq);
35
+ const payload = JSON.stringify({ ...projectBrowserSessionEvent(event), seq });
36
+ for (const socket of this.socketsBySession.get(key) ?? []) {
33
37
  if (socket.readyState === socket.OPEN)
34
38
  socket.send(payload);
35
39
  }
36
40
  }
41
+ currentSeq(sessionId, scope = NORMAL_SESSION_EVENT_SCOPE) {
42
+ return this.seqBySessionScope.get(sessionScopeKey(sessionId, scope)) ?? 0;
43
+ }
37
44
  publishGlobal(event, scope = NORMAL_SESSION_EVENT_SCOPE) {
38
45
  this.publishRealtime(event, scope);
39
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessionEventHub.js","sourceRoot":"","sources":["../../../src/server/realtime/sessionEventHub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAA0B,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,0BAA0B,EAA0B,MAAM,wBAAwB,CAAC;AAS5F,MAAM,OAAO,eAAe;IAA5B;QACmB,qBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC1D,yBAAoB,GAAG,IAAI,GAAG,EAA0C,CAAC;IA0C5F,CAAC;IAxCC,GAAG,CAAC,SAAiB,EAAE,MAAsB,EAAE,QAA2B,0BAA0B;QAClG,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAsB,EAAE,QAA2B,0BAA0B;QACrF,IAAI,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,KAAqB,EAAE,QAA2B,0BAA0B;QACrG,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACxF,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAyB,EAAE,QAA2B,0BAA0B;QAC5F,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,KAAoB,EAAE,QAA2B,0BAA0B;QACzF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF;AAED,SAAS,eAAe,CAAC,SAAiB,EAAE,KAAwB;IAClE,OAAO,GAAG,KAAK,KAAK,SAAS,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"sessionEventHub.js","sourceRoot":"","sources":["../../../src/server/realtime/sessionEventHub.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ export class AuthService {
17
17
  this.listeners.clear();
18
18
  }
19
19
  async authProviders(mode, authType) {
20
- await this.modelRuntime.reloadConfig();
20
+ await this.modelRuntime.refresh();
21
21
  const providers = mode === "logout"
22
22
  ? await getLogoutProviderOptions(this.modelRuntime)
23
23
  : getLoginProviderOptions(this.modelRuntime, authType);
@@ -1 +1 @@
1
- {"version":3,"file":"authService.js","sourceRoot":"","sources":["../../../src/server/sessions/authService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authService.js","sourceRoot":"","sources":["../../../src/server/sessions/authService.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { statSync } from "node:fs";
2
2
  import { open, readFile, writeFile } from "node:fs/promises";
3
3
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
4
4
  import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, createEditToolDefinition, createFindToolDefinition, createGrepToolDefinition, getAgentDir, createLsToolDefinition, createReadToolDefinition, createWriteToolDefinition, defineTool, ModelRuntime, SessionManager, } from "@earendil-works/pi-coding-agent";
5
+ import { projectBrowserMessage } from "../browserMessageProjection.js";
5
6
  import { pageMessagesAtSafeBoundary } from "./messagePaging.js";
6
7
  import { eventScopeFromManagementContext, managementContextKey, NORMAL_SESSION_EVENT_SCOPE } from "../realtime/sessionEventScope.js";
7
8
  import { BUILTIN_COMMANDS } from "./builtinCommands.js";
@@ -14,6 +15,8 @@ import { attachmentsToInlineImages, saveAttachmentsToWorkspace } from "./attachm
14
15
  import { parsePromptAttachments } from "../../shared/promptAttachments.js";
15
16
  import { createPiSessionManagerGateway } from "./piSessionManagerGateway.js";
16
17
  import { SessionPinStore } from "./sessionPinStore.js";
18
+ import { SessionActivityCoordinator } from "./sessionActivityCoordinator.js";
19
+ import { searchSessionContent } from "./sessionContentSearch.js";
17
20
  import { canonicalizeStoredCwd, cwdPathsEqual } from "../workingDirectory.js";
18
21
  import { piWebDataDir } from "../../config.js";
19
22
  import { createScopedSettingsManager, resolveSettingsScopeDirectory } from "./projectSettingsScope.js";
@@ -222,7 +225,7 @@ export class PiSessionService {
222
225
  this.events = events;
223
226
  this.active = new Map();
224
227
  this.pendingSessionOpens = new Map();
225
- this.activities = new Map();
228
+ this.activities = new SessionActivityCoordinator();
226
229
  this.compactionPromptQueues = new Map();
227
230
  this.compactionDrainTimers = new Map();
228
231
  this.authLossWarnings = new Set();
@@ -371,15 +374,26 @@ export class PiSessionService {
371
374
  const normalizedQuery = query.trim().toLocaleLowerCase();
372
375
  if (normalizedQuery === "")
373
376
  return this.list(cwd, managementContext);
374
- const listing = await this.listWorkspaceSessions(cwd, managementContext);
375
- const matches = await Promise.all(listing.sessions.map(async (session) => {
376
- const entry = listing.entriesById.get(session.id);
377
- const archived = listing.archivedById.get(session.id);
378
- const archivedText = archived?.archivePath === undefined ? "" : await readArchivedSessionText(archived.archivePath);
379
- const haystack = [session.id, session.name ?? "", session.firstMessage, entry?.allMessagesText ?? "", archivedText].join("\n").toLocaleLowerCase();
380
- return haystack.includes(normalizedQuery) ? session : undefined;
381
- }));
382
- return matches.filter(isDefined);
377
+ const { sessions } = await this.searchCandidates(cwd, normalizedQuery, managementContext);
378
+ return sessions;
379
+ }
380
+ async searchContent(cwd, query, managementContext) {
381
+ const normalizedQuery = query.trim();
382
+ if (normalizedQuery === "")
383
+ return { results: [], matchCount: 0, truncated: false };
384
+ const maxMatches = 200;
385
+ const { listing, sessions } = await this.searchCandidates(cwd, normalizedQuery.toLocaleLowerCase(), managementContext);
386
+ const results = [];
387
+ let matchCount = 0;
388
+ for (const session of sessions) {
389
+ const remaining = maxMatches - results.reduce((count, result) => count + result.matches.length, 0);
390
+ const messages = this.searchableSessionHistory(session, listing, managementContext);
391
+ const view = searchSessionContent(messages, normalizedQuery, Math.max(1, remaining));
392
+ matchCount += view.matchCount;
393
+ if (remaining > 0 && view.matches.length > 0)
394
+ results.push({ session, matches: view.matches.slice(0, remaining) });
395
+ }
396
+ return { results, matchCount, truncated: matchCount > maxMatches };
383
397
  }
384
398
  async listPinned(cwd, managementContext) {
385
399
  const listing = await this.listWorkspaceSessions(cwd, managementContext);
@@ -797,9 +811,38 @@ export class PiSessionService {
797
811
  async status(ref, managementContext) {
798
812
  return this.statusFromSession(await this.getOrOpen(ref, managementContext));
799
813
  }
814
+ async searchCandidates(cwd, normalizedQuery, managementContext) {
815
+ const listing = await this.listWorkspaceSessions(cwd, managementContext);
816
+ const matches = await Promise.all(listing.sessions.map(async (session) => {
817
+ const entry = listing.entriesById.get(session.id);
818
+ const archived = listing.archivedById.get(session.id);
819
+ const archivedText = archived?.archivePath === undefined ? "" : await readArchivedSessionText(archived.archivePath);
820
+ const haystack = [session.id, session.name ?? "", session.firstMessage, entry?.allMessagesText ?? "", archivedText].join("\n").toLocaleLowerCase();
821
+ return haystack.includes(normalizedQuery) ? session : undefined;
822
+ }));
823
+ return { listing, sessions: matches.filter(isDefined) };
824
+ }
825
+ searchableSessionHistory(session, listing, managementContext) {
826
+ const eventScope = eventScopeFromManagementContext(managementContext);
827
+ const active = this.activeForSessionIdAndScope(session.id, eventScope);
828
+ if (active !== undefined && cwdPathsEqual(active.runtime.cwd, session.cwd))
829
+ return historyMessages(active.runtime.session);
830
+ const path = listing.archivedById.get(session.id)?.archivePath ?? listing.entriesById.get(session.id)?.path;
831
+ return path === undefined ? [] : historyMessagesFromManager(this.sessionManager.open(path));
832
+ }
833
+ async streamSnapshot(ref, managementContext) {
834
+ const session = await this.getOrOpen(ref, managementContext);
835
+ const eventScope = this.eventScopeForSession(session);
836
+ const seq = this.events.currentSeq(session.sessionId, eventScope);
837
+ const streamingMessage = session.state.streamingMessage;
838
+ const partial = streamingMessage === undefined || streamingMessage === null
839
+ ? null
840
+ : projectBrowserMessage(streamingMessage);
841
+ return { seq, partial };
842
+ }
800
843
  async availableModels(ref, managementContext) {
801
844
  const session = await this.getOrOpen(ref, managementContext);
802
- await session.modelRuntime.reloadConfig();
845
+ await session.modelRuntime.refresh();
803
846
  const models = session.scopedModels.length > 0
804
847
  ? session.scopedModels.map((scoped) => scoped.model)
805
848
  : await session.modelRuntime.getAvailable();
@@ -808,7 +851,7 @@ export class PiSessionService {
808
851
  async setModel(ref, provider, modelId, managementContext) {
809
852
  await this.assertWritable(ref);
810
853
  const session = await this.getOrOpen(ref, managementContext);
811
- await session.modelRuntime.reloadConfig();
854
+ await session.modelRuntime.refresh();
812
855
  const candidates = session.scopedModels.length > 0
813
856
  ? session.scopedModels.map((scoped) => scoped.model)
814
857
  : await session.modelRuntime.getAvailable();
@@ -1671,7 +1714,7 @@ export class PiSessionService {
1671
1714
  const model = session.model;
1672
1715
  if (model === undefined)
1673
1716
  return;
1674
- void generateShortSessionName(session.agent.streamFn, model, firstMessage).then((name) => {
1717
+ void generateShortSessionName(session.agent.streamFunction, model, firstMessage).then((name) => {
1675
1718
  this.applyGeneratedSessionName(session, name ?? fallbackSessionName(firstMessage));
1676
1719
  }).catch(() => {
1677
1720
  this.applyGeneratedSessionName(session, fallbackSessionName(firstMessage));
@@ -1774,7 +1817,11 @@ export class PiSessionService {
1774
1817
  }
1775
1818
  if (eventType === "agent_end") {
1776
1819
  this.publishActivity(session, "idle", "idle");
1777
- setTimeout(() => {
1820
+ const eventScope = this.eventScopeForSession(session);
1821
+ const sessionKey = activeSessionKey(session.sessionId, eventScope);
1822
+ this.activities.scheduleSettledRefresh(sessionKey, () => {
1823
+ if (this.active.get(sessionKey)?.runtime.session !== session)
1824
+ return;
1778
1825
  this.publishActivity(session, "idle", "idle");
1779
1826
  this.publishStatus(session);
1780
1827
  }, 250);
@@ -2223,8 +2270,11 @@ function stringValue(value) {
2223
2270
  return typeof value === "string" ? value : "";
2224
2271
  }
2225
2272
  function historyMessages(session) {
2273
+ return historyMessagesFromManager(session.sessionManager);
2274
+ }
2275
+ function historyMessagesFromManager(sessionManager) {
2226
2276
  const messages = [];
2227
- for (const entry of session.sessionManager.getBranch()) {
2277
+ for (const entry of sessionManager.getBranch()) {
2228
2278
  if (!isRecord(entry))
2229
2279
  continue;
2230
2280
  if (entry["type"] === "message")