@chainingintention/pi-web-cn 1.202609.0 → 1.202609.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 (98) hide show
  1. package/dist/cli.js +24 -14
  2. package/dist/cli.js.map +1 -1
  3. package/dist/client/apple-touch-icon-dev.png +0 -0
  4. package/dist/client/assets/{CodeViewer-gfeiLsvJ.js → CodeViewer-CY319sHK.js} +1 -1
  5. package/dist/client/assets/{TerminalPanel-CF7TJrJF.js → TerminalPanel-DvFd2ZkS.js} +1 -1
  6. package/dist/client/assets/{index-Y2sFZ4_U.js → index-Lt_wrMvn.js} +423 -359
  7. package/dist/client/favicon-dev.svg +8 -0
  8. package/dist/client/index.html +1 -1
  9. package/dist/client/pwa-icon-dev-192.png +0 -0
  10. package/dist/client/pwa-icon-dev-512.png +0 -0
  11. package/dist/config.js +14 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/environment.js +4 -0
  14. package/dist/environment.js.map +1 -0
  15. package/dist/nativeServices/installedServiceDefinitions.js +601 -0
  16. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
  17. package/dist/nativeServices/serviceDoctor.js +47 -16
  18. package/dist/nativeServices/serviceDoctor.js.map +1 -1
  19. package/dist/{pi-web-plugins → pi-packages}/relays/markdownDocument.js +1 -1
  20. package/dist/pi-packages/relays/package.json +11 -0
  21. package/dist/{pi-web-plugins → pi-packages}/relays/pi-web-plugin.js +1 -1
  22. package/dist/pi-packages/relays/prompts/relay-worktree.md +28 -0
  23. package/dist/pi-packages/relays/prompts/relay.md +45 -0
  24. package/dist/{pi-web-plugins → pi-packages}/relays/relayDiscovery.js +2 -2
  25. package/dist/{pi-web-plugins → pi-packages}/relays/relaysPanelElement.js +2 -2
  26. package/dist/pi-packages/relays/skills/relay/SKILL.md +94 -0
  27. package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +245 -0
  28. package/dist/pi-web-plugins/updates/pi-web-plugin.js +34 -36
  29. package/dist/server/app.js +14 -3
  30. package/dist/server/app.js.map +1 -1
  31. package/dist/server/configRoutes.js +6 -1
  32. package/dist/server/configRoutes.js.map +1 -1
  33. package/dist/server/deploymentIdentity.js +67 -0
  34. package/dist/server/deploymentIdentity.js.map +1 -0
  35. package/dist/server/deploymentIdentityRoutes.js +22 -0
  36. package/dist/server/deploymentIdentityRoutes.js.map +1 -0
  37. package/dist/server/knownAutoInstallPiPackages.js +30 -0
  38. package/dist/server/knownAutoInstallPiPackages.js.map +1 -0
  39. package/dist/server/managementEmbed.js +9 -0
  40. package/dist/server/managementEmbed.js.map +1 -1
  41. package/dist/server/notices/serverNoticeRoutes.js +43 -0
  42. package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
  43. package/dist/server/notices/serverNoticeService.js +26 -0
  44. package/dist/server/notices/serverNoticeService.js.map +1 -0
  45. package/dist/server/notices/serverNoticeStore.js +78 -0
  46. package/dist/server/notices/serverNoticeStore.js.map +1 -0
  47. package/dist/server/piPackageIdentity.js +25 -0
  48. package/dist/server/piPackageIdentity.js.map +1 -0
  49. package/dist/server/piPackageService.js +69 -8
  50. package/dist/server/piPackageService.js.map +1 -1
  51. package/dist/server/piWebStatus.js +1 -1
  52. package/dist/server/piWebStatus.js.map +1 -1
  53. package/dist/server/plugins/pluginBackendProxyRoutes.js +1 -10
  54. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
  55. package/dist/server/sessiond/autoInstallPiPackages.js +63 -0
  56. package/dist/server/sessiond/autoInstallPiPackages.js.map +1 -0
  57. package/dist/server/sessiond/sessionProxyRoutes.js +3 -10
  58. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  59. package/dist/server/sessiond.js +26 -5
  60. package/dist/server/sessiond.js.map +1 -1
  61. package/dist/server/sessions/attachmentService.js +2 -5
  62. package/dist/server/sessions/attachmentService.js.map +1 -1
  63. package/dist/server/sessions/piSessionManagerGateway.js +122 -1
  64. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  65. package/dist/server/sessions/piSessionService.js +205 -57
  66. package/dist/server/sessions/piSessionService.js.map +1 -1
  67. package/dist/server/sessions/projectSettingsScope.js +12 -31
  68. package/dist/server/sessions/projectSettingsScope.js.map +1 -1
  69. package/dist/server/sessions/sessionModelScope.js +23 -8
  70. package/dist/server/sessions/sessionModelScope.js.map +1 -1
  71. package/dist/server/sessions/sessionRoutes.js +15 -0
  72. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  73. package/dist/server/sessions/transcriptBranchCache.js +81 -0
  74. package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
  75. package/dist/server/storage/piPackageDismissalStore.js +78 -0
  76. package/dist/server/storage/piPackageDismissalStore.js.map +1 -0
  77. package/dist/server/terminals/terminalService.js +18 -1
  78. package/dist/server/terminals/terminalService.js.map +1 -1
  79. package/dist/server/workspaces/projectPiWebConfig.js +6 -1
  80. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
  81. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +1 -10
  82. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
  83. package/dist/server/workspaces/workspaceDeletionRoutes.js +1 -10
  84. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  85. package/dist/server/workspaces/workspaceRemovalService.js +16 -5
  86. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
  87. package/dist/shared/apiTypes.js.map +1 -1
  88. package/dist/shared/federatedRoutes.js +3 -0
  89. package/dist/shared/federatedRoutes.js.map +1 -1
  90. package/dist/shared/piWebConfigParsing.js +10 -0
  91. package/dist/shared/piWebConfigParsing.js.map +1 -1
  92. package/docs/config.md +26 -2
  93. package/docs/plugins.md +4 -2
  94. package/package.json +2 -2
  95. package/skills/relay/SKILL.md +59 -80
  96. package/dist/pi-web-plugins/relays/package.json +0 -9
  97. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/README.md +0 -0
  98. /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/marked.esm.js +0 -0
@@ -1,10 +1,13 @@
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 { canonicalizeStoredCwd, cwdPathsEqual } from "../workingDirectory.js";
6
+ import { isNodeErrorWithCode } from "../workspaces/pathSafety.js";
6
7
  import { readSessionHeaderSummary } from "./sessionFileHeader.js";
8
+ import { tryParseEntry } from "./sessionFileFormat.js";
7
9
  import { SessionSummaryScanner } from "./sessionSummaryScanner.js";
10
+ import { TranscriptBranchCache } from "./transcriptBranchCache.js";
8
11
  export class SessionDirResolver {
9
12
  constructor(options) {
10
13
  this.agentDir = options.agentDir;
@@ -48,6 +51,8 @@ class SettingsAwarePiSessionManagerGateway {
48
51
  * in-place rewrites those checks cannot see.
49
52
  */
50
53
  this.summaryScanner = new SessionSummaryScanner();
54
+ this.transcriptBranches = new TranscriptBranchCache();
55
+ this.pendingTranscriptBranches = new Map();
51
56
  }
52
57
  async list(cwd) {
53
58
  const resolution = this.resolver.resolve(cwd);
@@ -75,6 +80,44 @@ class SettingsAwarePiSessionManagerGateway {
75
80
  const resolution = this.resolver.resolve(cwd);
76
81
  return SessionManager.create(cwd, resolution.sessionDir, options?.parentSession === undefined ? undefined : { parentSession: options.parentSession });
77
82
  }
83
+ async readBranch(path) {
84
+ const file = await statIfPresent(path);
85
+ if (file === undefined)
86
+ return undefined;
87
+ const signature = transcriptFileSignature(file);
88
+ const cached = this.transcriptBranches.get(path, signature);
89
+ if (cached !== undefined)
90
+ return cached.branch;
91
+ const pending = this.pendingTranscriptBranches.get(path);
92
+ if (pending !== undefined)
93
+ return pending;
94
+ const read = this.readSnapshot(path, file, signature)
95
+ .then((snapshot) => {
96
+ this.transcriptBranches.set(path, snapshot);
97
+ return snapshot.branch;
98
+ })
99
+ .catch((error) => {
100
+ if (isNodeErrorWithCode(error, "ENOENT"))
101
+ return undefined;
102
+ throw error;
103
+ })
104
+ .finally(() => { this.pendingTranscriptBranches.delete(path); });
105
+ this.pendingTranscriptBranches.set(path, read);
106
+ return read;
107
+ }
108
+ async readSnapshot(path, file, signature) {
109
+ const identity = transcriptFileIdentity(file);
110
+ const previous = this.transcriptBranches.getLatest(path);
111
+ if (previous?.identity === identity && previous.size > 0 && previous.size < file.size) {
112
+ const appended = await readAppendedEntries(path, previous.size, file.size, identity);
113
+ if (appended !== undefined) {
114
+ const entries = [...previous.entries, ...appended];
115
+ return { signature, identity, size: file.size, entries, branch: deriveTranscriptBranch(entries) };
116
+ }
117
+ }
118
+ const entries = parseTranscriptEntries(await readFile(path, "utf8"));
119
+ return { signature, identity, size: file.size, entries, branch: deriveTranscriptBranch(entries) };
120
+ }
78
121
  async listAll() {
79
122
  const envSessionDir = this.resolver.globalEnvSessionDir();
80
123
  const [defaultSessions, envSessions] = await Promise.all([
@@ -87,6 +130,84 @@ class SettingsAwarePiSessionManagerGateway {
87
130
  return SessionManager.open(path, dirname(path));
88
131
  }
89
132
  }
133
+ async function statIfPresent(path) {
134
+ try {
135
+ return await stat(path);
136
+ }
137
+ catch (error) {
138
+ if (isNodeErrorWithCode(error, "ENOENT"))
139
+ return undefined;
140
+ throw error;
141
+ }
142
+ }
143
+ function transcriptFileIdentity(file) {
144
+ return `${String(file.dev)}:${String(file.ino)}`;
145
+ }
146
+ function transcriptFileSignature(file) {
147
+ return `${transcriptFileIdentity(file)}:${String(file.size)}:${String(file.mtimeMs)}`;
148
+ }
149
+ async function readAppendedEntries(path, offset, size, identity) {
150
+ const handle = await open(path, "r");
151
+ try {
152
+ const current = await handle.stat();
153
+ if (transcriptFileIdentity(current) !== identity)
154
+ return undefined;
155
+ const length = size - offset + 1;
156
+ const buffer = Buffer.alloc(length);
157
+ const { bytesRead } = await handle.read(buffer, 0, length, offset - 1);
158
+ if (bytesRead !== length || buffer[0] !== 0x0a)
159
+ return undefined;
160
+ const appended = [];
161
+ let firstLine = true;
162
+ for (const line of buffer.toString("utf8", 1).split("\n")) {
163
+ const entry = tryParseEntry(line);
164
+ if (entry === undefined) {
165
+ if (firstLine && line.trim() !== "")
166
+ return undefined;
167
+ }
168
+ else if (entry["type"] !== "session") {
169
+ appended.push(entry);
170
+ }
171
+ firstLine = false;
172
+ }
173
+ return appended;
174
+ }
175
+ finally {
176
+ await handle.close();
177
+ }
178
+ }
179
+ function parseTranscriptEntries(content) {
180
+ const entries = [];
181
+ for (const line of content.split("\n")) {
182
+ const entry = tryParseEntry(line);
183
+ if (entry !== undefined && entry["type"] !== "session")
184
+ entries.push(entry);
185
+ }
186
+ return entries;
187
+ }
188
+ function deriveTranscriptBranch(entries) {
189
+ const byId = new Map();
190
+ let leafId;
191
+ for (const entry of entries) {
192
+ const id = entry["id"];
193
+ if (typeof id !== "string")
194
+ continue;
195
+ byId.set(id, entry);
196
+ leafId = id;
197
+ }
198
+ const branch = [];
199
+ const visited = new Set();
200
+ let currentId = leafId;
201
+ while (currentId !== undefined && !visited.has(currentId)) {
202
+ visited.add(currentId);
203
+ const entry = byId.get(currentId);
204
+ if (entry === undefined)
205
+ break;
206
+ branch.push(entry);
207
+ currentId = typeof entry["parentId"] === "string" ? entry["parentId"] : undefined;
208
+ }
209
+ return branch.reverse();
210
+ }
90
211
  export async function listSessionsInDir(sessionDir) {
91
212
  // listAll(sessionDir) lists without the SDK's internal cwd filter, which would
92
213
  // 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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"}
@@ -14,6 +14,7 @@ import { findArchiveCandidateByIdOrPrefix, planSessionArchiveTree } from "./sess
14
14
  import { deterministicSessionName, fallbackSessionName, generateShortSessionName } from "./sessionNameGenerator.js";
15
15
  import { computeEditPreview } from "./editPreview.js";
16
16
  import { attachmentsToInlineImages, saveAttachmentsToWorkspace } from "./attachmentService.js";
17
+ import { loadEffectiveProjectAttachmentsConfig } from "../workspaces/projectPiWebConfig.js";
17
18
  import { parsePromptAttachments } from "../../shared/promptAttachments.js";
18
19
  import { ASK_USER_ANSWERS_CUSTOM_TYPE, SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH, SESSION_UNREAD_LIMIT } from "../../shared/apiTypes.js";
19
20
  import { createPiSessionManagerGateway } from "./piSessionManagerGateway.js";
@@ -43,7 +44,7 @@ import { archiveCandidateFromActiveSession, archiveCandidateFromArchivedRecord,
43
44
  import { annotateAssistantThinkingLevel, getBoolean, getProperty, getString, toClientEvent } from "./sessionUiEvents.js";
44
45
  import { WorkbenchHttpError } from "../workbench/workbenchClient.js";
45
46
  import { createWorkbenchToolDefinitions } from "../workbench/workbenchTools.js";
46
- import { applyEnabledModelToggle, catalogWithEnabledFirst, liveScopedModelIds, modelScopeId, persistedEnabledModelPatterns, resolveEnabledModelIds, resolveSessionModelOptions } from "./sessionModelScope.js";
47
+ import { applyEnabledModelToggle, catalogWithEnabledFirst, modelScopeId, persistedEnabledModelPatterns, resolveEnabledModelIds, resolveSessionModelOptions, scopedModelsFromEnabledIds } from "./sessionModelScope.js";
47
48
  const noopLogger = { info() { } };
48
49
  const DEFAULT_UNREAD_PUBLICATION_RETRY_MS = 1_000;
49
50
  /**
@@ -62,6 +63,7 @@ const STARTUP_PHASE_EXTENSIONS = "正在加载会话扩展";
62
63
  const STARTUP_CONCURRENT_CATALOG_REFRESH = "服务商模型列表正在刷新";
63
64
  const MAX_UNREAD_PUBLICATION_RETRY_MS = 30_000;
64
65
  const MAX_PENDING_UNREAD_MUTATIONS = SESSION_UNREAD_LIMIT + 1;
66
+ const IDLE_SESSION_FILE_RESOLUTION_THROTTLE_MS = 30_000;
65
67
  function auditVisibleAssistantMessage(message) {
66
68
  if (!isAuditRecord(message))
67
69
  return message;
@@ -609,6 +611,13 @@ export class PiSessionService {
609
611
  this.treeNavigations = new WeakSet();
610
612
  /** Counts async operations that may append an entry before they settle. */
611
613
  this.sessionEntryMutationCounts = new WeakMap();
614
+ /** Serializes enabled-model read/modify/write operations. */
615
+ this.modelScopeMutationQueue = Promise.resolve();
616
+ /** Effective enabled-model state keyed by the project-scoped settings store. */
617
+ this.modelScopeStates = new Map();
618
+ this.modelScopeInitializations = new Map();
619
+ this.modelScopeRevision = 0;
620
+ this.modelScopeCache = new WeakMap();
612
621
  /** Runtime/session-identity reservations for operations that must not overlap tree navigation. */
613
622
  this.treeExclusiveRuntimeOperationCounts = new WeakMap();
614
623
  this.treeExclusiveSessionOperationCounts = new Map();
@@ -633,6 +642,7 @@ export class PiSessionService {
633
642
  */
634
643
  this.subsessionNotifyArmed = new Map();
635
644
  this.notificationGenerationBySession = new WeakMap();
645
+ this.idleSessionFileResolutions = new WeakMap();
636
646
  /** The parked extension Promise resolvers behind the store's open dialogs. */
637
647
  this.dialogWaiters = new ExtensionDialogWaiters();
638
648
  this.pendingUnreadMutations = [];
@@ -671,6 +681,7 @@ export class PiSessionService {
671
681
  this.pendingExtensionDialogStore = deps.pendingExtensionDialogStore ?? new PendingExtensionDialogStore();
672
682
  this.extensionDialogsTimeoutMs = deps.extensionDialogsTimeoutMs ?? DEFAULT_EXTENSION_DIALOGS_TIMEOUT_MS;
673
683
  this.catalogRefreshStatus = deps.catalogRefreshStatus;
684
+ this.config = deps.config;
674
685
  this.unreadPublicationRetryInitialMs = Math.max(0, deps.unreadPublicationRetryDelayMs ?? DEFAULT_UNREAD_PUBLICATION_RETRY_MS);
675
686
  this.unreadPublicationRetryDelayMs = this.unreadPublicationRetryInitialMs;
676
687
  // Subsessions are gated behind their own flag, and they
@@ -987,24 +998,84 @@ export class PiSessionService {
987
998
  ...(modelUsed === undefined ? {} : { model: modelSpecOf(modelUsed) }),
988
999
  };
989
1000
  }
990
- /**
991
- * The models a session may pick from: its scoped set when model-scoped,
992
- * otherwise the runtime's available snapshot. Refreshes the runtime catalog
993
- * first so callers see newly configured providers and models.
994
- */
1001
+ modelScopeContext(session) {
1002
+ const settingsKey = session.settingsManager.piWebScopeKey ?? "global";
1003
+ const projectSettings = session.settingsManager.getProjectSettings?.() ?? {};
1004
+ if (Object.hasOwn(projectSettings, "enabledModels")) {
1005
+ const workspace = canonicalizeStoredCwd(session.sessionManager.getCwd());
1006
+ return { key: `${settingsKey}:workspace:${workspace}`, editable: false };
1007
+ }
1008
+ return { key: settingsKey, editable: session.settingsManager.piWebModelScopeEditable !== false };
1009
+ }
1010
+ async modelScopeSnapshot(session, context = this.modelScopeContext(session)) {
1011
+ const existing = this.modelScopeStates.get(context.key);
1012
+ if (existing !== undefined)
1013
+ return existing;
1014
+ const pending = this.modelScopeInitializations.get(context.key);
1015
+ if (pending !== undefined)
1016
+ return pending;
1017
+ const initialization = (async () => {
1018
+ const enabledIds = await resolveEnabledModelIds({
1019
+ settingsManager: session.settingsManager,
1020
+ // Runtime-backed sessions always hold the SDK ModelRuntime; PiAgentSession keeps a narrow public seam for tests.
1021
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1022
+ modelRuntime: session.modelRuntime,
1023
+ scopedModels: session.scopedModels,
1024
+ });
1025
+ const snapshot = { enabledIds: enabledIds === null ? null : [...enabledIds], revision: 0 };
1026
+ this.modelScopeStates.set(context.key, snapshot);
1027
+ return snapshot;
1028
+ })();
1029
+ this.modelScopeInitializations.set(context.key, initialization);
1030
+ try {
1031
+ return await initialization;
1032
+ }
1033
+ finally {
1034
+ if (this.modelScopeInitializations.get(context.key) === initialization)
1035
+ this.modelScopeInitializations.delete(context.key);
1036
+ }
1037
+ }
1038
+ async synchronizeSessionModelScope(session, available) {
1039
+ const context = this.modelScopeContext(session);
1040
+ const snapshot = await this.modelScopeSnapshot(session, context);
1041
+ const catalogKey = available.map(modelScopeId).join("\0");
1042
+ const cached = this.modelScopeCache.get(session);
1043
+ if (cached?.scopeKey === context.key && cached.revision === snapshot.revision && cached.catalogKey === catalogKey)
1044
+ return;
1045
+ session.setScopedModels(scopedModelsFromEnabledIds(available, snapshot.enabledIds, session.scopedModels));
1046
+ this.modelScopeCache.set(session, { scopeKey: context.key, revision: snapshot.revision, catalogKey });
1047
+ }
995
1048
  async sessionModelCandidates(session) {
996
- // Pi 0.84 keeps request paths local-only; the bounded catalog refresher is
997
- // the only path allowed to fetch provider catalogs over the network.
998
1049
  await session.modelRuntime.refresh({ allowNetwork: false });
999
- return session.scopedModels.length > 0
1000
- ? session.scopedModels.map((scoped) => scoped.model)
1001
- : await session.modelRuntime.getAvailable();
1050
+ const available = session.modelRuntime.getAvailableSnapshot();
1051
+ await this.synchronizeSessionModelScope(session, available);
1052
+ return session.scopedModels.length > 0 ? session.scopedModels.map((scoped) => scoped.model) : available;
1002
1053
  }
1003
- async enabledModelCatalog(runtime) {
1004
- const session = runtime.session;
1054
+ async enabledModelCatalog(session) {
1005
1055
  await session.modelRuntime.refresh({ allowNetwork: false });
1006
- const enabledIds = await resolveEnabledModelIds(sessionScopeSource(runtime));
1007
- return catalogWithEnabledFirst(session.modelRuntime.getAvailableSnapshot(), enabledIds);
1056
+ const available = session.modelRuntime.getAvailableSnapshot();
1057
+ await this.synchronizeSessionModelScope(session, available);
1058
+ const context = this.modelScopeContext(session);
1059
+ return catalogWithEnabledFirst(available, (await this.modelScopeSnapshot(session, context)).enabledIds);
1060
+ }
1061
+ runModelScopeMutation(operation) {
1062
+ const queued = this.modelScopeMutationQueue.then(operation);
1063
+ this.modelScopeMutationQueue = queued.then(() => undefined, () => undefined);
1064
+ return queued;
1065
+ }
1066
+ applyEnabledModelScope(session, available, enabledIds) {
1067
+ const context = this.modelScopeContext(session);
1068
+ const availableIds = available.map(modelScopeId);
1069
+ const persisted = persistedEnabledModelPatterns(enabledIds, availableIds);
1070
+ const nextState = {
1071
+ enabledIds: persisted === undefined ? null : enabledIds === null ? [] : [...enabledIds],
1072
+ revision: ++this.modelScopeRevision,
1073
+ };
1074
+ session.settingsManager.setEnabledModels(persisted);
1075
+ this.modelScopeStates.set(context.key, nextState);
1076
+ session.setScopedModels(scopedModelsFromEnabledIds(available, nextState.enabledIds, session.scopedModels));
1077
+ this.modelScopeCache.set(session, { scopeKey: context.key, revision: nextState.revision, catalogKey: available.map(modelScopeId).join("\0") });
1078
+ this.events.publishGlobal({ type: "models.changed", revision: nextState.revision });
1008
1079
  }
1009
1080
  /**
1010
1081
  * Resolve a strict `provider/model-id` spec from a spawn tool against the
@@ -1548,10 +1619,14 @@ export class PiSessionService {
1548
1619
  }
1549
1620
  async messages(ref, page, managementContext) {
1550
1621
  const session = await this.getOrOpen(ref, managementContext);
1551
- return pageMessagesAtSafeBoundary(historyMessages(session), page);
1622
+ return pageMessagesAtSafeBoundary(historyMessagesFromEntries(await this.readableSessionBranch(session)), page);
1552
1623
  }
1553
1624
  async status(ref, managementContext) {
1554
- return this.statusFromSession(await this.sessionForStatusOrDialogClose(ref, managementContext));
1625
+ const session = await this.sessionForStatusOrDialogClose(ref, managementContext);
1626
+ if (this.hasActiveWork(session))
1627
+ return this.statusFromSession(session);
1628
+ const branch = await this.readableSessionBranch(session);
1629
+ return this.statusFromSession(session, transcriptMessageCount(branch));
1555
1630
  }
1556
1631
  async searchCandidates(cwd, normalizedQuery, managementContext) {
1557
1632
  const listing = await this.listWorkspaceSessions(cwd, managementContext);
@@ -1588,38 +1663,60 @@ export class PiSessionService {
1588
1663
  return models.map(modelToClientModel);
1589
1664
  }
1590
1665
  async modelCatalog(ref, managementContext) {
1591
- const runtime = (await this.getActive(ref, managementContext)).runtime;
1592
- return (await this.enabledModelCatalog(runtime)).map(catalogEntryToClientModel);
1666
+ const session = await this.getOrOpen(ref, managementContext);
1667
+ const scope = this.modelScopeContext(session);
1668
+ return (await this.enabledModelCatalog(session)).map((entry) => catalogEntryToClientModel(entry, scope.editable));
1593
1669
  }
1594
1670
  async setModelEnabled(ref, provider, modelId, enabled, managementContext) {
1595
1671
  if (managementContext !== undefined)
1596
1672
  throw new Error("管理嵌入模式不允许修改已启用模型范围");
1597
1673
  await this.assertWritable(ref);
1598
- const runtime = (await this.getActive(ref)).runtime;
1599
- const session = runtime.session;
1600
- this.assertTreeNavigationInactive(session, "change enabled models");
1601
- await session.modelRuntime.refresh({ allowNetwork: false });
1602
- const currentIds = await resolveEnabledModelIds(sessionScopeSource(runtime));
1603
- const available = session.modelRuntime.getAvailableSnapshot();
1604
- const availableIds = available.map(modelScopeId);
1605
- const targetId = `${provider}/${modelId}`;
1606
- if (!availableIds.includes(targetId))
1607
- throw new Error(`未找到模型:${targetId}`);
1608
- const nextIds = applyEnabledModelToggle(currentIds, availableIds, targetId, enabled);
1609
- this.assertTreeNavigationInactive(session, "change enabled models");
1610
- if (nextIds !== currentIds) {
1611
- const liveIds = liveScopedModelIds(nextIds, availableIds);
1612
- const modelsById = new Map(available.map((model) => [modelScopeId(model), model]));
1613
- const scoped = liveIds === null
1614
- ? []
1615
- : liveIds.flatMap((id) => {
1616
- const model = modelsById.get(id);
1617
- return model === undefined ? [] : [{ model }];
1618
- });
1619
- session.settingsManager.setEnabledModels(persistedEnabledModelPatterns(nextIds, availableIds));
1620
- session.setScopedModels(scoped);
1621
- }
1622
- return (await this.enabledModelCatalog(runtime)).map(catalogEntryToClientModel);
1674
+ const session = await this.getOrOpen(ref);
1675
+ return this.runModelScopeMutation(async () => {
1676
+ const scope = this.modelScopeContext(session);
1677
+ if (!scope.editable)
1678
+ throw new Error("模型可用范围由此工作区的 .pi/settings.json 控制");
1679
+ this.assertTreeNavigationInactive(session, "change enabled models");
1680
+ await session.modelRuntime.refresh({ allowNetwork: false });
1681
+ const currentIds = (await this.modelScopeSnapshot(session, scope)).enabledIds;
1682
+ const available = session.modelRuntime.getAvailableSnapshot();
1683
+ const availableIds = available.map(modelScopeId);
1684
+ const targetId = `${provider}/${modelId}`;
1685
+ if (!availableIds.includes(targetId))
1686
+ throw new Error(`未找到模型:${targetId}`);
1687
+ if (!enabled && session.model !== undefined && modelScopeId(session.model) === targetId)
1688
+ throw new Error("不能停用当前模型");
1689
+ const nextIds = applyEnabledModelToggle(currentIds, availableIds, targetId, enabled);
1690
+ this.assertTreeNavigationInactive(session, "change enabled models");
1691
+ if (nextIds !== currentIds)
1692
+ this.applyEnabledModelScope(session, available, nextIds);
1693
+ return (await this.enabledModelCatalog(session)).map((entry) => catalogEntryToClientModel(entry));
1694
+ });
1695
+ }
1696
+ async setModelScope(ref, mode, managementContext) {
1697
+ if (managementContext !== undefined)
1698
+ throw new Error("管理嵌入模式不允许修改已启用模型范围");
1699
+ await this.assertWritable(ref);
1700
+ const session = await this.getOrOpen(ref);
1701
+ return this.runModelScopeMutation(async () => {
1702
+ const scope = this.modelScopeContext(session);
1703
+ if (!scope.editable)
1704
+ throw new Error("模型可用范围由此工作区的 .pi/settings.json 控制");
1705
+ this.assertTreeNavigationInactive(session, "change enabled models");
1706
+ await session.modelRuntime.refresh({ allowNetwork: false });
1707
+ const available = session.modelRuntime.getAvailableSnapshot();
1708
+ const availableIds = available.map(modelScopeId);
1709
+ let nextIds = null;
1710
+ if (mode === "current") {
1711
+ const current = session.model;
1712
+ if (current === undefined || !availableIds.includes(modelScopeId(current)))
1713
+ throw new Error("当前模型不可用");
1714
+ nextIds = [modelScopeId(current)];
1715
+ }
1716
+ this.assertTreeNavigationInactive(session, "change enabled models");
1717
+ this.applyEnabledModelScope(session, available, nextIds);
1718
+ return (await this.enabledModelCatalog(session)).map((entry) => catalogEntryToClientModel(entry));
1719
+ });
1623
1720
  }
1624
1721
  async setModel(ref, provider, modelId, managementContext) {
1625
1722
  await this.assertWritable(ref);
@@ -1639,7 +1736,11 @@ export class PiSessionService {
1639
1736
  async cycleModel(ref, direction, managementContext) {
1640
1737
  await this.assertWritable(ref);
1641
1738
  const session = await this.getOrOpen(ref, managementContext);
1642
- const result = await this.runSessionEntryMutation(session, "change models", () => session.cycleModel(direction));
1739
+ const result = await this.runModelScopeMutation(async () => {
1740
+ await session.modelRuntime.refresh({ allowNetwork: false });
1741
+ await this.synchronizeSessionModelScope(session, session.modelRuntime.getAvailableSnapshot());
1742
+ return this.runSessionEntryMutation(session, "change models", () => session.cycleModel(direction));
1743
+ });
1643
1744
  if (result === undefined)
1644
1745
  throw new Error(session.scopedModels.length > 0 ? "作用域内只有一个模型" : "只有一个可用模型");
1645
1746
  this.publishActivity(session, `模型:${result.model.id}`, "idle", result.model.provider);
@@ -1752,7 +1853,13 @@ export class PiSessionService {
1752
1853
  return [];
1753
1854
  await this.assertWritable(ref);
1754
1855
  const active = await this.getActive(ref, managementContext);
1755
- return saveAttachmentsToWorkspace(active.runtime.cwd, parsed, folder === undefined ? {} : { folder });
1856
+ const cwd = active.runtime.cwd;
1857
+ const effectiveFolder = folder ?? (await this.workspaceAttachmentsConfig(cwd)).defaultFolder;
1858
+ return saveAttachmentsToWorkspace(cwd, parsed, effectiveFolder === undefined ? {} : { folder: effectiveFolder });
1859
+ }
1860
+ async workspaceAttachmentsConfig(cwd) {
1861
+ const globalConfig = this.config === undefined ? {} : (await this.config.read()).effectiveConfig;
1862
+ return loadEffectiveProjectAttachmentsConfig(cwd, globalConfig);
1756
1863
  }
1757
1864
  async shell(ref, text, managementContext) {
1758
1865
  await this.assertWritable(ref);
@@ -2492,6 +2599,35 @@ export class PiSessionService {
2492
2599
  const reachable = this.activeForLookup(ref, managementContext)?.runtime.session ?? this.startupSessionForLookup(ref, managementContext);
2493
2600
  return reachable ?? this.getOrOpen(ref, managementContext);
2494
2601
  }
2602
+ async readableSessionBranch(session) {
2603
+ if (this.hasActiveWork(session) || this.sessionManager.readBranch === undefined)
2604
+ return session.sessionManager.getBranch();
2605
+ const leafId = session.sessionManager.getLeafId();
2606
+ const latestEntry = session.sessionManager.getEntries?.().at(-1);
2607
+ // Unsummarized tree navigation changes only the SDK's in-memory leaf.
2608
+ if (isRecord(latestEntry) && typeof latestEntry["id"] === "string" && latestEntry["id"] !== leafId)
2609
+ return session.sessionManager.getBranch();
2610
+ const sessionFile = session.sessionFile ?? session.sessionManager.getSessionFile();
2611
+ const resolvedPath = sessionFile === undefined ? await this.idleSessionFilePath(session) : undefined;
2612
+ if (this.hasActiveWork(session))
2613
+ return session.sessionManager.getBranch();
2614
+ const path = sessionFile ?? resolvedPath;
2615
+ if (path === undefined)
2616
+ return session.sessionManager.getBranch();
2617
+ const snapshot = await this.sessionManager.readBranch(path);
2618
+ if (snapshot === undefined)
2619
+ return session.sessionManager.getBranch();
2620
+ return this.hasActiveWork(session) || session.sessionManager.getLeafId() !== leafId ? session.sessionManager.getBranch() : snapshot;
2621
+ }
2622
+ async idleSessionFilePath(session) {
2623
+ const cached = this.idleSessionFileResolutions.get(session);
2624
+ const at = this.now().getTime();
2625
+ if (cached !== undefined && at - cached.at < IDLE_SESSION_FILE_RESOLUTION_THROTTLE_MS)
2626
+ return cached.path;
2627
+ const match = await this.sessionManager.resolveSessionFile?.(session.sessionManager.getCwd(), session.sessionId);
2628
+ this.idleSessionFileResolutions.set(session, { at, path: match?.path });
2629
+ return match?.path;
2630
+ }
2495
2631
  async getActive(ref, managementContext) {
2496
2632
  const active = this.activeForLookup(ref, managementContext);
2497
2633
  if (active !== undefined)
@@ -3153,7 +3289,7 @@ export class PiSessionService {
3153
3289
  for (const session of sessions)
3154
3290
  this.publishStatus(session);
3155
3291
  }
3156
- statusFromSession(session) {
3292
+ statusFromSession(session, messageCount = session.messages.length) {
3157
3293
  const stats = session.getSessionStats();
3158
3294
  const model = session.model === undefined ? undefined : modelToClientModel(session.model);
3159
3295
  const contextUsage = session.getContextUsage();
@@ -3170,7 +3306,7 @@ export class PiSessionService {
3170
3306
  isBashRunning: session.isBashRunning,
3171
3307
  pendingMessageCount: this.pendingMessageCount(session),
3172
3308
  queuedMessages: queuedMessagesFromSession(session, this.compactionQueuedMessages(session.sessionId)),
3173
- messageCount: session.messages.length,
3309
+ messageCount,
3174
3310
  tokens: stats.tokens,
3175
3311
  cost: stats.cost,
3176
3312
  ...(contextUsage === undefined ? {} : { contextUsage }),
@@ -3684,14 +3820,15 @@ function modelToClientModel(model) {
3684
3820
  ...(reasoning === undefined ? {} : { reasoning }),
3685
3821
  };
3686
3822
  }
3687
- function sessionScopeSource(runtime) {
3688
- const modelRuntime = runtime.services?.modelRuntime;
3689
- if (modelRuntime === undefined)
3690
- throw new Error("会话模型目录不可用");
3691
- return { settingsManager: runtime.session.settingsManager, modelRuntime, scopedModels: runtime.session.scopedModels };
3692
- }
3693
- function catalogEntryToClientModel(entry) {
3694
- return { ...modelToClientModel(entry.model), provider: entry.model.provider, id: entry.model.id, enabled: entry.enabled };
3823
+ function catalogEntryToClientModel(entry, editable = true) {
3824
+ return {
3825
+ ...modelToClientModel(entry.model),
3826
+ provider: entry.model.provider,
3827
+ id: entry.model.id,
3828
+ enabled: entry.enabled,
3829
+ catalogIndex: entry.catalogIndex,
3830
+ ...(editable ? {} : { editable: false }),
3831
+ };
3695
3832
  }
3696
3833
  function notificationIdentityForSession(session) {
3697
3834
  return {
@@ -3963,9 +4100,12 @@ function historyMessages(session) {
3963
4100
  return historyMessagesFromManager(session.sessionManager);
3964
4101
  }
3965
4102
  function historyMessagesFromManager(sessionManager) {
4103
+ return historyMessagesFromEntries(sessionManager.getBranch());
4104
+ }
4105
+ function historyMessagesFromEntries(entries) {
3966
4106
  const messages = [];
3967
4107
  let thinkingLevel;
3968
- for (const entry of sessionManager.getBranch()) {
4108
+ for (const entry of entries) {
3969
4109
  if (!isRecord(entry))
3970
4110
  continue;
3971
4111
  if (entry["type"] === "message")
@@ -3984,6 +4124,14 @@ function historyMessagesFromManager(sessionManager) {
3984
4124
  }
3985
4125
  return messages;
3986
4126
  }
4127
+ function transcriptMessageCount(entries) {
4128
+ let count = 0;
4129
+ for (const entry of entries) {
4130
+ if (isRecord(entry) && entry["type"] === "message")
4131
+ count += 1;
4132
+ }
4133
+ return count;
4134
+ }
3987
4135
  /** custom entry type used to persist parent -> child subsession links outside LLM context. */
3988
4136
  const SUBSESSION_LINK_CUSTOM_TYPE = "pi-web.subsession.link";
3989
4137
  /** custom entry type used to mark a child as created by spawn_subsession. */