@hyperdreamer/pi-webui 1.6.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 (276) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +148 -0
  3. package/dist/cli.js +975 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/apple-touch-icon.png +0 -0
  6. package/dist/client/assets/CodeViewer-aB4ZVzEu.js +4 -0
  7. package/dist/client/assets/UnifiedDiffViewer-f8X7aTkU.js +39 -0
  8. package/dist/client/assets/index-Cffeusjy.js +6022 -0
  9. package/dist/client/assets/vendor-editor-core-vUi74DnD.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +46 -0
  11. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
  12. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
  13. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
  14. package/dist/client/favicon.svg +8 -0
  15. package/dist/client/index.html +65 -0
  16. package/dist/client/manifest.webmanifest +24 -0
  17. package/dist/client/pwa-icon-192.png +0 -0
  18. package/dist/client/pwa-icon-512.png +0 -0
  19. package/dist/config.js +417 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/docker/piWebUiDockerCommandPlan.js +211 -0
  22. package/dist/docker/piWebUiDockerCommandPlan.js.map +1 -0
  23. package/dist/nativeServices/serviceDoctor.js +480 -0
  24. package/dist/nativeServices/serviceDoctor.js.map +1 -0
  25. package/dist/nativeServices/serviceInstall.js +35 -0
  26. package/dist/nativeServices/serviceInstall.js.map +1 -0
  27. package/dist/nativeServices/servicePlan.js +358 -0
  28. package/dist/nativeServices/servicePlan.js.map +1 -0
  29. package/dist/nativeServices/serviceProbe.js +447 -0
  30. package/dist/nativeServices/serviceProbe.js.map +1 -0
  31. package/dist/nativeServices/serviceRendering.js +122 -0
  32. package/dist/nativeServices/serviceRendering.js.map +1 -0
  33. package/dist/pi-webui-plugins/info/package.json +9 -0
  34. package/dist/pi-webui-plugins/info/pi-webui-plugin.js +51 -0
  35. package/dist/pi-webui-plugins/updates/package.json +9 -0
  36. package/dist/pi-webui-plugins/updates/pi-webui-plugin.js +185 -0
  37. package/dist/pi-webui-plugins/updates/updatesLogic.js +97 -0
  38. package/dist/pi-webui-plugins/workspace-tasks/config.js +91 -0
  39. package/dist/pi-webui-plugins/workspace-tasks/package.json +9 -0
  40. package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +48 -0
  41. package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +12 -0
  42. package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +288 -0
  43. package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  44. package/dist/piWebUiVersionReport.js +225 -0
  45. package/dist/piWebUiVersionReport.js.map +1 -0
  46. package/dist/plugin-api/unstable.d.ts +22 -0
  47. package/dist/plugin-api.d.ts +199 -0
  48. package/dist/server/activeAgentProfileProvider.js +25 -0
  49. package/dist/server/activeAgentProfileProvider.js.map +1 -0
  50. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  51. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  52. package/dist/server/activity/workspaceActivityService.js +98 -0
  53. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  54. package/dist/server/app.js +211 -0
  55. package/dist/server/app.js.map +1 -0
  56. package/dist/server/browserMessageProjection.js +56 -0
  57. package/dist/server/browserMessageProjection.js.map +1 -0
  58. package/dist/server/configRoutes.js +309 -0
  59. package/dist/server/configRoutes.js.map +1 -0
  60. package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
  61. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
  62. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  63. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  64. package/dist/server/git/gitEnv.js +15 -0
  65. package/dist/server/git/gitEnv.js.map +1 -0
  66. package/dist/server/git/gitService.js +123 -0
  67. package/dist/server/git/gitService.js.map +1 -0
  68. package/dist/server/gitRoutes.js +23 -0
  69. package/dist/server/gitRoutes.js.map +1 -0
  70. package/dist/server/index.js +7 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/machines/machineClient.js +172 -0
  73. package/dist/server/machines/machineClient.js.map +1 -0
  74. package/dist/server/machines/machinePluginProxyRoutes.js +190 -0
  75. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  76. package/dist/server/machines/machineProxyRoutes.js +172 -0
  77. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  78. package/dist/server/machines/machineRoutes.js +56 -0
  79. package/dist/server/machines/machineRoutes.js.map +1 -0
  80. package/dist/server/machines/machineService.js +238 -0
  81. package/dist/server/machines/machineService.js.map +1 -0
  82. package/dist/server/machines/machineStore.js +128 -0
  83. package/dist/server/machines/machineStore.js.map +1 -0
  84. package/dist/server/models/modelsConfigRoutes.js +40 -0
  85. package/dist/server/models/modelsConfigRoutes.js.map +1 -0
  86. package/dist/server/models/modelsConfigService.js +339 -0
  87. package/dist/server/models/modelsConfigService.js.map +1 -0
  88. package/dist/server/piPackagePluginsConfigRoutes.js +86 -0
  89. package/dist/server/piPackagePluginsConfigRoutes.js.map +1 -0
  90. package/dist/server/piPackagePluginsConfigService.js +311 -0
  91. package/dist/server/piPackagePluginsConfigService.js.map +1 -0
  92. package/dist/server/piPackageRoutes.js +91 -0
  93. package/dist/server/piPackageRoutes.js.map +1 -0
  94. package/dist/server/piPackageService.js +101 -0
  95. package/dist/server/piPackageService.js.map +1 -0
  96. package/dist/server/piWebUiPluginService.js +326 -0
  97. package/dist/server/piWebUiPluginService.js.map +1 -0
  98. package/dist/server/piWebUiReleaseLookupCache.js +37 -0
  99. package/dist/server/piWebUiReleaseLookupCache.js.map +1 -0
  100. package/dist/server/piWebUiStatus.js +622 -0
  101. package/dist/server/piWebUiStatus.js.map +1 -0
  102. package/dist/server/piWebUiStatusCache.js +45 -0
  103. package/dist/server/piWebUiStatusCache.js.map +1 -0
  104. package/dist/server/projects/directorySuggestions.js +37 -0
  105. package/dist/server/projects/directorySuggestions.js.map +1 -0
  106. package/dist/server/projects/projectService.js +31 -0
  107. package/dist/server/projects/projectService.js.map +1 -0
  108. package/dist/server/realtime/sessionEventHub.js +70 -0
  109. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  110. package/dist/server/sessiond/sessionDaemonStartup.js +49 -0
  111. package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -0
  112. package/dist/server/sessiond/sessionProxyRoutes.js +87 -0
  113. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  114. package/dist/server/sessiond/skillsGithubToken.js +7 -0
  115. package/dist/server/sessiond/skillsGithubToken.js.map +1 -0
  116. package/dist/server/sessiond.js +152 -0
  117. package/dist/server/sessiond.js.map +1 -0
  118. package/dist/server/sessions/attachmentService.js +119 -0
  119. package/dist/server/sessions/attachmentService.js.map +1 -0
  120. package/dist/server/sessions/authProviderOptions.js +50 -0
  121. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  122. package/dist/server/sessions/authRoutes.js +69 -0
  123. package/dist/server/sessions/authRoutes.js.map +1 -0
  124. package/dist/server/sessions/authService.js +134 -0
  125. package/dist/server/sessions/authService.js.map +1 -0
  126. package/dist/server/sessions/builtinCommands.js +27 -0
  127. package/dist/server/sessions/builtinCommands.js.map +1 -0
  128. package/dist/server/sessions/editPreview.js +196 -0
  129. package/dist/server/sessions/editPreview.js.map +1 -0
  130. package/dist/server/sessions/messagePaging.js +43 -0
  131. package/dist/server/sessions/messagePaging.js.map +1 -0
  132. package/dist/server/sessions/oauthLoginFlowService.js +349 -0
  133. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  134. package/dist/server/sessions/piSessionManagerGateway.js +115 -0
  135. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  136. package/dist/server/sessions/piSessionService.js +3230 -0
  137. package/dist/server/sessions/piSessionService.js.map +1 -0
  138. package/dist/server/sessions/plainTextTheme.js +112 -0
  139. package/dist/server/sessions/plainTextTheme.js.map +1 -0
  140. package/dist/server/sessions/sessionArchiveMigration.js +590 -0
  141. package/dist/server/sessions/sessionArchiveMigration.js.map +1 -0
  142. package/dist/server/sessions/sessionArchiveStore.js +262 -0
  143. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  144. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  145. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  146. package/dist/server/sessions/sessionCleanup.js +157 -0
  147. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  148. package/dist/server/sessions/sessionCommandService.js +313 -0
  149. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  150. package/dist/server/sessions/sessionDefaultsRoutes.js +65 -0
  151. package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -0
  152. package/dist/server/sessions/sessionDefaultsService.js +90 -0
  153. package/dist/server/sessions/sessionDefaultsService.js.map +1 -0
  154. package/dist/server/sessions/sessionHistoryExport.js +115 -0
  155. package/dist/server/sessions/sessionHistoryExport.js.map +1 -0
  156. package/dist/server/sessions/sessionMetadataStore.js +102 -0
  157. package/dist/server/sessions/sessionMetadataStore.js.map +1 -0
  158. package/dist/server/sessions/sessionNameGenerator.js +90 -0
  159. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  160. package/dist/server/sessions/sessionNotificationStore.js +484 -0
  161. package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
  162. package/dist/server/sessions/sessionRoutes.js +590 -0
  163. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  164. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  165. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  166. package/dist/server/sessions/sessionService.js +2 -0
  167. package/dist/server/sessions/sessionService.js.map +1 -0
  168. package/dist/server/sessions/sessionTreeProjection.js +250 -0
  169. package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
  170. package/dist/server/sessions/sessionUnreadStore.js +520 -0
  171. package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
  172. package/dist/server/sessions/spawnSessionTool.js +41 -0
  173. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  174. package/dist/server/sessions/spawnSubsessionTool.js +214 -0
  175. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  176. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  177. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  178. package/dist/server/sessions/subsessionTranscript.js +235 -0
  179. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  180. package/dist/server/skills/runNpx.js +30 -0
  181. package/dist/server/skills/runNpx.js.map +1 -0
  182. package/dist/server/skills/skillLock.js +115 -0
  183. package/dist/server/skills/skillLock.js.map +1 -0
  184. package/dist/server/skills/skillUpdates.js +194 -0
  185. package/dist/server/skills/skillUpdates.js.map +1 -0
  186. package/dist/server/skills/skillsConfigRoutes.js +64 -0
  187. package/dist/server/skills/skillsConfigRoutes.js.map +1 -0
  188. package/dist/server/skills/skillsConfigService.js +391 -0
  189. package/dist/server/skills/skillsConfigService.js.map +1 -0
  190. package/dist/server/storage/projectStore.js +88 -0
  191. package/dist/server/storage/projectStore.js.map +1 -0
  192. package/dist/server/systemInfoRoutes.js +265 -0
  193. package/dist/server/systemInfoRoutes.js.map +1 -0
  194. package/dist/server/terminalProxyRoutes.js +140 -0
  195. package/dist/server/terminalProxyRoutes.js.map +1 -0
  196. package/dist/server/terminals/terminalRoutes.js +155 -0
  197. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  198. package/dist/server/terminals/terminalService.js +305 -0
  199. package/dist/server/terminals/terminalService.js.map +1 -0
  200. package/dist/server/terminals/terminalSize.js +17 -0
  201. package/dist/server/terminals/terminalSize.js.map +1 -0
  202. package/dist/server/types.js +2 -0
  203. package/dist/server/types.js.map +1 -0
  204. package/dist/server/webSocketBridge.js +32 -0
  205. package/dist/server/webSocketBridge.js.map +1 -0
  206. package/dist/server/workingDirectory.js +44 -0
  207. package/dist/server/workingDirectory.js.map +1 -0
  208. package/dist/server/workspaceExplorerRoutes.js +109 -0
  209. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  210. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  211. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  212. package/dist/server/workspaces/fileContentService.js +181 -0
  213. package/dist/server/workspaces/fileContentService.js.map +1 -0
  214. package/dist/server/workspaces/fileSuggestions.js +520 -0
  215. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  216. package/dist/server/workspaces/fileTreeService.js +35 -0
  217. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  218. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  219. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  220. package/dist/server/workspaces/imagePreviewService.js +40 -0
  221. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  222. package/dist/server/workspaces/pathAccessPolicy.js +90 -0
  223. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  224. package/dist/server/workspaces/pathSafety.js +45 -0
  225. package/dist/server/workspaces/pathSafety.js.map +1 -0
  226. package/dist/server/workspaces/projectPiWebUiConfig.js +61 -0
  227. package/dist/server/workspaces/projectPiWebUiConfig.js.map +1 -0
  228. package/dist/server/workspaces/workspaceContext.js +8 -0
  229. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  230. package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
  231. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  232. package/dist/server/workspaces/workspaceService.js +39 -0
  233. package/dist/server/workspaces/workspaceService.js.map +1 -0
  234. package/dist/sessiond/activeAgentProfile.js +31 -0
  235. package/dist/sessiond/activeAgentProfile.js.map +1 -0
  236. package/dist/sessiond/config.js +9 -0
  237. package/dist/sessiond/config.js.map +1 -0
  238. package/dist/sessiond/sessionDaemonClient.js +103 -0
  239. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  240. package/dist/shared/activeAgentProfile.js +76 -0
  241. package/dist/shared/activeAgentProfile.js.map +1 -0
  242. package/dist/shared/activity.js +11 -0
  243. package/dist/shared/activity.js.map +1 -0
  244. package/dist/shared/apiTypes.d.ts +1212 -0
  245. package/dist/shared/apiTypes.js +25 -0
  246. package/dist/shared/apiTypes.js.map +1 -0
  247. package/dist/shared/capabilities.js +69 -0
  248. package/dist/shared/capabilities.js.map +1 -0
  249. package/dist/shared/federatedRoutes.js +109 -0
  250. package/dist/shared/federatedRoutes.js.map +1 -0
  251. package/dist/shared/machinePluginIds.js +41 -0
  252. package/dist/shared/machinePluginIds.js.map +1 -0
  253. package/dist/shared/piWebUiStatusParsing.js +108 -0
  254. package/dist/shared/piWebUiStatusParsing.js.map +1 -0
  255. package/dist/shared/pluginIds.js +5 -0
  256. package/dist/shared/pluginIds.js.map +1 -0
  257. package/dist/shared/promptAttachments.js +92 -0
  258. package/dist/shared/promptAttachments.js.map +1 -0
  259. package/dist/shared/thinkingLevels.d.ts +27 -0
  260. package/dist/shared/thinkingLevels.js +31 -0
  261. package/dist/shared/thinkingLevels.js.map +1 -0
  262. package/dist/shared/workspaceDeletion.js +12 -0
  263. package/dist/shared/workspaceDeletion.js.map +1 -0
  264. package/dist/shared/workspaceFiles.js +3 -0
  265. package/dist/shared/workspaceFiles.js.map +1 -0
  266. package/docs/assets/favicon.svg +8 -0
  267. package/docs/assets/pi-webui-banner.png +0 -0
  268. package/docs/assets/pi-webui-desktop.png +0 -0
  269. package/docs/assets/pi-webui-mobile.png +0 -0
  270. package/docs/assets/pi-webui-tablet.png +0 -0
  271. package/docs/config.md +265 -0
  272. package/docs/plugins.md +988 -0
  273. package/extensions/pi-webui.ts +133 -0
  274. package/package.json +143 -0
  275. package/plugin-api/unstable.d.ts +1 -0
  276. package/plugin-api.d.ts +1 -0
@@ -0,0 +1,313 @@
1
+ import crypto from "node:crypto";
2
+ import { isBuiltinCommand } from "./builtinCommands.js";
3
+ export class SessionCommandService {
4
+ constructor(getActive, prompt, events, lifecycle = {}, naming = {}) {
5
+ this.getActive = getActive;
6
+ this.prompt = prompt;
7
+ this.events = events;
8
+ this.lifecycle = lifecycle;
9
+ this.naming = naming;
10
+ this.pendingSelects = new Map();
11
+ }
12
+ async run(sessionId, text) {
13
+ const active = await this.getActive(sessionId);
14
+ const session = active.runtime.session;
15
+ const [name = "", ...args] = text.trim().replace(/^\//, "").split(/\s+/);
16
+ const rest = args.join(" ").trim();
17
+ if (this.lifecycle.isTreeNavigationActive?.(session) === true)
18
+ return treeNavigationActiveUnsupported();
19
+ if (!isBuiltinCommand(name)) {
20
+ if (this.isRuntimeCommand(session, name)) {
21
+ // The command is forwarded to the agent, which expands it (e.g. /skill:*
22
+ // into a skill block) and streams the canonical message back. That is the
23
+ // authoritative feedback, so we don't synthesize an extra "Accepted" line
24
+ // that would only vanish on reload.
25
+ await this.prompt(sessionId, text);
26
+ return { type: "done" };
27
+ }
28
+ return { type: "unsupported", message: `Unknown command: /${name}` };
29
+ }
30
+ if (name === "session")
31
+ return { type: "done", message: formatSessionStats(session) };
32
+ if (name === "name")
33
+ return this.nameSession(active, rest);
34
+ if (name === "compact")
35
+ return this.compact(session, rest);
36
+ if (name === "reload")
37
+ return this.reload(session);
38
+ if (name === "clone")
39
+ return this.clone(active);
40
+ if (name === "fork")
41
+ return this.fork(active);
42
+ if (name === "tree")
43
+ return this.tree(session);
44
+ return { type: "unsupported", message: `/${name} is not implemented in the web UI yet` };
45
+ }
46
+ async respond(sessionId, requestId, value) {
47
+ const pending = this.pendingSelects.get(requestId);
48
+ if (pending?.sessionId !== sessionId)
49
+ return { type: "unsupported", message: "Command request expired" };
50
+ this.pendingSelects.delete(requestId);
51
+ const active = await this.getActive(sessionId);
52
+ if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
53
+ return treeNavigationActiveUnsupported();
54
+ if (this.hasActiveWork(active.runtime.session))
55
+ return forkActiveUnsupported("fork");
56
+ const relatedName = await this.nextRelatedSessionName(active, "fork");
57
+ if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
58
+ return treeNavigationActiveUnsupported();
59
+ if (this.hasActiveWork(active.runtime.session))
60
+ return forkActiveUnsupported("fork");
61
+ const result = await this.runSessionReplacement(active.runtime, async () => {
62
+ const forkResult = await active.runtime.fork(value);
63
+ if (!forkResult.cancelled)
64
+ this.tryNameRelatedSession(active.runtime.session, relatedName);
65
+ return forkResult;
66
+ });
67
+ if (result.cancelled)
68
+ return { type: "done", message: "Fork cancelled" };
69
+ return { type: "done", message: "Session forked", session: clientSessionFromRuntime(active.runtime), ...promptDraft(result.selectedText) };
70
+ }
71
+ nameSession(active, name) {
72
+ if (name === "")
73
+ return { type: "unsupported", message: "Usage: /name <session name>" };
74
+ active.runtime.session.setSessionName(name);
75
+ this.publishSessionName(active.runtime.session);
76
+ return { type: "done", message: `Session named: ${name}`, session: clientSessionFromRuntime(active.runtime) };
77
+ }
78
+ compact(session, instructions) {
79
+ this.lifecycle.onCompactionStart?.(session);
80
+ void session.compact(instructions === "" ? undefined : instructions)
81
+ .then((result) => {
82
+ this.events.publish(session.sessionId, {
83
+ type: "command.output",
84
+ level: "success",
85
+ message: formatCompactionResult(result),
86
+ });
87
+ this.lifecycle.onCompactionEnd?.(session, "success");
88
+ })
89
+ .catch((error) => {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ this.events.publish(session.sessionId, { type: "command.output", level: "error", message: `Compaction failed: ${message}` });
92
+ this.events.publish(session.sessionId, { type: "session.error", message });
93
+ this.lifecycle.onCompactionEnd?.(session, "error", message);
94
+ });
95
+ return { type: "done", message: "Compaction started…" };
96
+ }
97
+ async reload(session) {
98
+ if (this.hasActiveWork(session))
99
+ return { type: "unsupported", message: "Cannot reload while the session is active. Stop current activity before reloading." };
100
+ if (this.lifecycle.reloadSession === undefined)
101
+ return { type: "unsupported", message: "/reload is not available for this session runtime." };
102
+ try {
103
+ await this.lifecycle.reloadSession(session);
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : String(error);
107
+ return { type: "unsupported", message: `Reload failed: ${message}` };
108
+ }
109
+ return { type: "done", message: "Session runtime resources reloaded. Extensions, skills, prompt templates, themes, and context/system prompt files are refreshed for this session. Reload the browser page separately for PI WEBUI browser plugin changes." };
110
+ }
111
+ async clone(active) {
112
+ if (this.hasActiveWork(active.runtime.session))
113
+ return forkActiveUnsupported("clone");
114
+ const initialLeafId = active.runtime.session.sessionManager.getLeafId();
115
+ if (initialLeafId === null || initialLeafId === "")
116
+ return { type: "unsupported", message: "Cannot clone: no current session entry" };
117
+ const relatedName = await this.nextRelatedSessionName(active, "copy");
118
+ if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
119
+ return treeNavigationActiveUnsupported();
120
+ if (this.hasActiveWork(active.runtime.session))
121
+ return forkActiveUnsupported("clone");
122
+ // The active leaf may have changed while related-session names were loaded.
123
+ // Clone the position that is current when the serialized replacement begins.
124
+ const leafId = active.runtime.session.sessionManager.getLeafId();
125
+ if (leafId === null || leafId === "")
126
+ return { type: "unsupported", message: "Cannot clone: no current session entry" };
127
+ const result = await this.runSessionReplacement(active.runtime, async () => {
128
+ const cloneResult = await active.runtime.fork(leafId, { position: "at" });
129
+ if (!cloneResult.cancelled)
130
+ this.tryNameRelatedSession(active.runtime.session, relatedName);
131
+ return cloneResult;
132
+ });
133
+ if (result.cancelled)
134
+ return { type: "done", message: "Clone cancelled" };
135
+ return { type: "done", message: "Session cloned", session: clientSessionFromRuntime(active.runtime) };
136
+ }
137
+ fork(active) {
138
+ if (this.hasActiveWork(active.runtime.session))
139
+ return forkActiveUnsupported("fork");
140
+ const messages = active.runtime.session.getUserMessagesForForking();
141
+ if (!messages.length)
142
+ return { type: "unsupported", message: "No user messages to fork from" };
143
+ const requestId = crypto.randomUUID();
144
+ this.pendingSelects.set(requestId, { sessionId: active.runtime.session.sessionId, command: "fork" });
145
+ return {
146
+ type: "select",
147
+ requestId,
148
+ title: "Fork from message",
149
+ options: [...messages].reverse().map((message) => ({ value: message.entryId, label: truncate(message.text, 140) })),
150
+ };
151
+ }
152
+ tree(session) {
153
+ if (this.hasActiveWork(session)) {
154
+ return { type: "unsupported", message: "Cannot open the session tree while the session is active. Stop current activity and try /tree again." };
155
+ }
156
+ if (this.lifecycle.getSessionTree === undefined)
157
+ return treeUnavailableUnsupported();
158
+ try {
159
+ const tree = this.lifecycle.getSessionTree(session);
160
+ if (tree === undefined)
161
+ return treeUnavailableUnsupported();
162
+ if (tree.nodes.length === 0)
163
+ return { type: "unsupported", message: "Cannot navigate an empty session tree." };
164
+ return { type: "tree", tree };
165
+ }
166
+ catch (error) {
167
+ const message = error instanceof Error ? error.message : String(error);
168
+ return { type: "unsupported", message: `Unable to open the session tree: ${message}` };
169
+ }
170
+ }
171
+ hasActiveWork(session) {
172
+ return sessionHasActiveWork(session) || this.lifecycle.hasActiveWork?.(session) === true;
173
+ }
174
+ runSessionReplacement(runtime, operation) {
175
+ const runReplacement = this.lifecycle.runSessionReplacement;
176
+ return runReplacement === undefined ? operation() : runReplacement(runtime.session, operation);
177
+ }
178
+ async nextRelatedSessionName(active, kind) {
179
+ const sourceTitle = relatedSessionSourceTitle(active.runtime.session);
180
+ const sourceName = normalizedName(active.runtime.session.sessionName);
181
+ let existingNames;
182
+ try {
183
+ existingNames = await this.naming.listSessionNames?.(active.runtime.cwd) ?? [];
184
+ }
185
+ catch {
186
+ existingNames = [];
187
+ }
188
+ return uniqueRelatedSessionName(sourceTitle, kind, sourceName === undefined ? existingNames : [...existingNames, sourceName]);
189
+ }
190
+ tryNameRelatedSession(session, name) {
191
+ try {
192
+ session.setSessionName(name);
193
+ this.publishSessionName(session);
194
+ }
195
+ catch (error) {
196
+ const message = error instanceof Error ? error.message : String(error);
197
+ this.events.publish(session.sessionId, { type: "command.output", level: "error", message: `Session created, but naming failed: ${message}` });
198
+ }
199
+ }
200
+ publishSessionName(session) {
201
+ const event = session.sessionName === undefined
202
+ ? { type: "session.name", sessionId: session.sessionId }
203
+ : { type: "session.name", sessionId: session.sessionId, name: session.sessionName };
204
+ this.events.publish(session.sessionId, event);
205
+ this.events.publishGlobal?.(event);
206
+ }
207
+ isRuntimeCommand(session, name) {
208
+ return session.extensionRunner.getRegisteredCommands().some((command) => command.invocationName === name)
209
+ || session.promptTemplates.some((template) => template.name === name)
210
+ || session.resourceLoader.getSkills().skills.some((skill) => `skill:${skill.name}` === name);
211
+ }
212
+ }
213
+ function clientSessionFromRuntime(runtime) {
214
+ const session = runtime.session;
215
+ const parentSessionPath = typeof session.sessionManager.getHeader === "function" ? session.sessionManager.getHeader()?.parentSession : undefined;
216
+ return {
217
+ id: session.sessionId,
218
+ path: session.sessionFile ?? "",
219
+ cwd: runtime.cwd,
220
+ ...(session.sessionName === undefined ? {} : { name: session.sessionName }),
221
+ created: new Date().toISOString(),
222
+ modified: new Date().toISOString(),
223
+ messageCount: session.messages.length,
224
+ firstMessage: "",
225
+ ...(parentSessionPath === undefined ? {} : { parentSessionPath }),
226
+ };
227
+ }
228
+ function relatedSessionSourceTitle(session) {
229
+ const name = normalizedName(session.sessionName);
230
+ if (name !== undefined)
231
+ return name;
232
+ for (const message of session.messages) {
233
+ const text = normalizedName(extractUserMessageText(message));
234
+ if (text !== undefined)
235
+ return truncate(text, 80);
236
+ }
237
+ return "Untitled session";
238
+ }
239
+ function uniqueRelatedSessionName(sourceTitle, kind, existingNames) {
240
+ const baseName = stripRelatedSessionSuffix(sourceTitle) || "Untitled session";
241
+ const label = kind === "fork" ? "Fork" : "Copy";
242
+ const usedNames = new Set(existingNames.map(normalizedName).filter(isDefined));
243
+ for (let counter = 1;; counter += 1) {
244
+ const candidate = `${baseName} — ${label} ${String(counter)}`;
245
+ if (!usedNames.has(candidate))
246
+ return candidate;
247
+ }
248
+ }
249
+ function stripRelatedSessionSuffix(name) {
250
+ return name.replace(/\s+(?:—|-)\s+(?:Fork|Copy|Clone)\s+\d+$/u, "").trim();
251
+ }
252
+ function extractUserMessageText(message) {
253
+ if (!isRecord(message) || message["role"] !== "user")
254
+ return undefined;
255
+ const content = message["content"];
256
+ if (typeof content === "string")
257
+ return content;
258
+ if (!Array.isArray(content))
259
+ return undefined;
260
+ return content.map((part) => {
261
+ if (!isRecord(part) || part["type"] !== "text")
262
+ return "";
263
+ return typeof part["text"] === "string" ? part["text"] : "";
264
+ }).join("");
265
+ }
266
+ function normalizedName(name) {
267
+ const trimmed = name?.replace(/\s+/g, " ").trim();
268
+ return trimmed === undefined || trimmed === "" ? undefined : trimmed;
269
+ }
270
+ function isRecord(value) {
271
+ return typeof value === "object" && value !== null;
272
+ }
273
+ function isDefined(value) {
274
+ return value !== undefined;
275
+ }
276
+ function sessionHasActiveWork(session) {
277
+ return session.isStreaming || session.isBashRunning || session.isCompacting || session.pendingMessageCount > 0;
278
+ }
279
+ function forkActiveUnsupported(command) {
280
+ return { type: "unsupported", message: `Cannot ${command} while the session is active. Stop current activity before ${command === "fork" ? "forking" : "cloning"}.` };
281
+ }
282
+ function treeUnavailableUnsupported() {
283
+ return { type: "unsupported", message: "Session tree navigation is not available with this Pi runtime." };
284
+ }
285
+ function treeNavigationActiveUnsupported() {
286
+ return { type: "unsupported", message: "Cannot run commands while session tree navigation is active. Stop or finish the navigation first." };
287
+ }
288
+ function promptDraft(text) {
289
+ return text === undefined ? {} : { promptDraft: text };
290
+ }
291
+ function formatSessionStats(session) {
292
+ const stats = session.getSessionStats();
293
+ return [
294
+ `Session: ${stats.sessionId}`,
295
+ `Messages: ${String(stats.totalMessages)} (${String(stats.userMessages)} user, ${String(stats.assistantMessages)} assistant)`,
296
+ `Tool calls: ${String(stats.toolCalls)}`,
297
+ `Tokens: ↑${String(stats.tokens.input)} ↓${String(stats.tokens.output)} total ${String(stats.tokens.total)}`,
298
+ `Cost: $${stats.cost.toFixed(4)}`,
299
+ ].join("\n");
300
+ }
301
+ function formatCompactionResult(result) {
302
+ return [
303
+ "Compaction complete.",
304
+ `Tokens before: ${String(result.tokensBefore)}`,
305
+ "",
306
+ result.summary,
307
+ ].join("\n");
308
+ }
309
+ function truncate(text, maxLength) {
310
+ const singleLine = text.replace(/\s+/g, " ").trim();
311
+ return singleLine.length <= maxLength ? singleLine : `${singleLine.slice(0, maxLength - 1)}…`;
312
+ }
313
+ //# sourceMappingURL=sessionCommandService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionCommandService.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionCommandService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { isKnownThinkingLevel } from "../../shared/thinkingLevels.js";
2
+ import { normalizeRequestCwd } from "../workingDirectory.js";
3
+ export function registerSessionDefaultsRoutes(app, service, prefix = "") {
4
+ app.get(`${prefix}/session-defaults`, async (request, reply) => {
5
+ try {
6
+ return await service.read(normalizeRequestCwd(requireString(request.query.cwd, "cwd")));
7
+ }
8
+ catch (error) {
9
+ return reply.code(400).send({ error: errorMessage(error) });
10
+ }
11
+ });
12
+ app.put(`${prefix}/session-defaults`, async (request, reply) => {
13
+ try {
14
+ const { cwd, update } = parseUpdate(request.body);
15
+ return await service.update(cwd, update);
16
+ }
17
+ catch (error) {
18
+ return reply.code(400).send({ error: errorMessage(error) });
19
+ }
20
+ });
21
+ }
22
+ function parseUpdate(value) {
23
+ const body = requireRecord(value);
24
+ const cwd = normalizeRequestCwd(requireString(body["cwd"], "cwd"));
25
+ const model = body["model"] === undefined ? undefined : parseModel(body["model"]);
26
+ const thinkingLevel = body["thinkingLevel"] === undefined ? undefined : requireThinkingLevel(body["thinkingLevel"]);
27
+ if (model === undefined && thinkingLevel === undefined)
28
+ throw new Error("A default model or thinking level is required");
29
+ return {
30
+ cwd,
31
+ update: {
32
+ ...(model === undefined ? {} : { model }),
33
+ ...(thinkingLevel === undefined ? {} : { thinkingLevel }),
34
+ },
35
+ };
36
+ }
37
+ function parseModel(value) {
38
+ const model = requireRecord(value);
39
+ return {
40
+ provider: requireString(model["provider"], "provider"),
41
+ modelId: requireString(model["modelId"], "modelId"),
42
+ };
43
+ }
44
+ function requireThinkingLevel(value) {
45
+ if (typeof value !== "string" || !isKnownThinkingLevel(value))
46
+ throw new Error("Invalid thinkingLevel");
47
+ return value;
48
+ }
49
+ function requireRecord(value) {
50
+ if (!isRecord(value))
51
+ throw new Error("Expected object body");
52
+ return value;
53
+ }
54
+ function isRecord(value) {
55
+ return typeof value === "object" && value !== null && !Array.isArray(value);
56
+ }
57
+ function requireString(value, name) {
58
+ if (typeof value !== "string" || value === "")
59
+ throw new Error(`${name} is required`);
60
+ return value;
61
+ }
62
+ function errorMessage(error) {
63
+ return error instanceof Error ? error.message : String(error);
64
+ }
65
+ //# sourceMappingURL=sessionDefaultsRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionDefaultsRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
2
+ import { SettingsManager } from "@earendil-works/pi-coding-agent";
3
+ import { KNOWN_THINKING_LEVELS, isKnownThinkingLevel } from "../../shared/thinkingLevels.js";
4
+ /** Persists Pi's default model and thinking preferences without opening a chat session. */
5
+ export class SessionDefaultsService {
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ this.createSettingsManager = deps.createSettingsManager ?? ((cwd, agentDir) => SettingsManager.create(cwd, agentDir));
9
+ this.thinkingLevelsForModel = deps.thinkingLevelsForModel ?? defaultThinkingLevelsForModel;
10
+ }
11
+ async read(cwd) {
12
+ const settings = this.createSettingsManager(cwd, this.deps.agentDir);
13
+ const models = await this.availableModels();
14
+ return this.response(settings, models);
15
+ }
16
+ async update(cwd, update) {
17
+ const settings = this.createSettingsManager(cwd, this.deps.agentDir);
18
+ const models = await this.availableModels();
19
+ let model = configuredDefaultModel(settings, models);
20
+ let changed = false;
21
+ const requestedModel = update.model;
22
+ if (requestedModel !== undefined) {
23
+ model = models.find((candidate) => candidate.provider === requestedModel.provider && candidate.id === requestedModel.modelId);
24
+ if (model === undefined)
25
+ throw new Error(`Model not available: ${requestedModel.provider}/${requestedModel.modelId}`);
26
+ if (settings.getDefaultProvider() !== model.provider || settings.getDefaultModel() !== model.id) {
27
+ settings.setDefaultModelAndProvider(model.provider, model.id);
28
+ changed = true;
29
+ }
30
+ }
31
+ const thinkingLevels = this.thinkingLevelsForModel(model);
32
+ const configuredThinkingLevel = settings.getDefaultThinkingLevel() ?? "off";
33
+ let thinkingLevel = effectiveThinkingLevel(configuredThinkingLevel, thinkingLevels);
34
+ if (update.thinkingLevel !== undefined) {
35
+ if (!isKnownThinkingLevel(update.thinkingLevel))
36
+ throw new Error(`Invalid thinking level: ${update.thinkingLevel}`);
37
+ if (!thinkingLevels.includes(update.thinkingLevel))
38
+ throw new Error(`Thinking level ${update.thinkingLevel} is not supported by the default model`);
39
+ thinkingLevel = update.thinkingLevel;
40
+ }
41
+ if (thinkingLevel !== configuredThinkingLevel) {
42
+ settings.setDefaultThinkingLevel(thinkingLevel);
43
+ changed = true;
44
+ }
45
+ if (changed)
46
+ await settings.flush();
47
+ return responseFor(models, model, thinkingLevel, thinkingLevels);
48
+ }
49
+ async availableModels() {
50
+ await this.deps.modelRuntime.reloadConfig();
51
+ return [...this.deps.modelRuntime.getAvailableSnapshot()];
52
+ }
53
+ response(settings, models) {
54
+ const model = configuredDefaultModel(settings, models);
55
+ const thinkingLevels = this.thinkingLevelsForModel(model);
56
+ const thinkingLevel = effectiveThinkingLevel(settings.getDefaultThinkingLevel() ?? "off", thinkingLevels);
57
+ return responseFor(models, model, thinkingLevel, thinkingLevels);
58
+ }
59
+ }
60
+ function defaultThinkingLevelsForModel(model) {
61
+ return model === undefined ? KNOWN_THINKING_LEVELS : getSupportedThinkingLevels(model);
62
+ }
63
+ function configuredDefaultModel(settings, models) {
64
+ const provider = settings.getDefaultProvider();
65
+ const modelId = settings.getDefaultModel();
66
+ if (provider === undefined || modelId === undefined)
67
+ return undefined;
68
+ return models.find((model) => model.provider === provider && model.id === modelId);
69
+ }
70
+ function effectiveThinkingLevel(configured, levels) {
71
+ return levels.includes(configured) ? configured : (levels[0] ?? "off");
72
+ }
73
+ function responseFor(models, model, thinkingLevel, thinkingLevels) {
74
+ return {
75
+ ...(model === undefined ? {} : { model: modelToClientModel(model) }),
76
+ thinkingLevel,
77
+ models: models.map(modelToClientModel),
78
+ thinkingLevels: [...thinkingLevels],
79
+ };
80
+ }
81
+ function modelToClientModel(model) {
82
+ return {
83
+ provider: model.provider,
84
+ id: model.id,
85
+ name: model.name,
86
+ contextWindow: model.contextWindow,
87
+ reasoning: model.reasoning,
88
+ };
89
+ }
90
+ //# sourceMappingURL=sessionDefaultsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionDefaultsService.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { getPackageDir } from "@earendil-works/pi-coding-agent";
8
+ const execFile = promisify(execFileCallback);
9
+ const EXPORT_TIMEOUT_MS = 30_000;
10
+ const EXPORT_MAX_BUFFER_BYTES = 1024 * 1024;
11
+ /**
12
+ * Generate Pi's self-contained history viewer for a persisted session file.
13
+ *
14
+ * Pi's public package entry point exposes its package directory, while the
15
+ * export CLI is the version-stable interface for rendering a session file.
16
+ */
17
+ export async function exportSessionHistoryHtml(sessionFile) {
18
+ const outputDirectory = await mkdtemp(join(tmpdir(), "pi-webui-history-"));
19
+ const outputPath = join(outputDirectory, "history.html");
20
+ try {
21
+ await execFile(process.execPath, [piCliPath(), "--export", sessionFile, outputPath], {
22
+ cwd: process.cwd(),
23
+ timeout: EXPORT_TIMEOUT_MS,
24
+ env: {
25
+ ...process.env,
26
+ PI_OFFLINE: "1",
27
+ PI_SKIP_VERSION_CHECK: "1",
28
+ },
29
+ maxBuffer: EXPORT_MAX_BUFFER_BYTES,
30
+ });
31
+ return patchSessionHistoryExportHtml(await readFile(outputPath, "utf8"));
32
+ }
33
+ finally {
34
+ await rm(outputDirectory, { recursive: true, force: true });
35
+ }
36
+ }
37
+ /**
38
+ * Pi 0.80's generated viewer uses recursion for tree preparation. Replace
39
+ * those helpers in the generated document so a long linear session remains
40
+ * viewable instead of exhausting the browser call stack.
41
+ */
42
+ export function patchSessionHistoryExportHtml(html) {
43
+ const normalizeLineEndings = (value) => value.replace(/\r\n/g, "\n");
44
+ const replaceRequired = (source, name, search, replacement) => {
45
+ const normalizedSearch = normalizeLineEndings(search);
46
+ const normalizedReplacement = normalizeLineEndings(replacement);
47
+ const matches = source.split(normalizedSearch).length - 1;
48
+ if (matches !== 1)
49
+ throw new Error(`Failed to patch exported HTML: ${name} expected 1 match, found ${String(matches)}`);
50
+ return source.replace(normalizedSearch, normalizedReplacement);
51
+ };
52
+ let patched = normalizeLineEndings(html);
53
+ patched = replaceRequired(patched, "sortChildren", ` function sortChildren(node) {
54
+ node.children.sort((a, b) =>
55
+ new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime()
56
+ );
57
+ node.children.forEach(sortChildren);
58
+ }`, ` function sortChildren(root) {
59
+ const stack = [root];
60
+ while (stack.length) {
61
+ const node = stack.pop();
62
+ node.children.sort((a, b) =>
63
+ new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime()
64
+ );
65
+ for (let i = node.children.length - 1; i >= 0; i--) {
66
+ stack.push(node.children[i]);
67
+ }
68
+ }
69
+ }`);
70
+ patched = replaceRequired(patched, "mapNodes", ` function mapNodes(node) {
71
+ treeNodeMap.set(node.entry.id, node);
72
+ node.children.forEach(mapNodes);
73
+ }
74
+ tree.forEach(mapNodes);`, ` const stack = [...tree].reverse();
75
+ while (stack.length) {
76
+ const node = stack.pop();
77
+ treeNodeMap.set(node.entry.id, node);
78
+ for (let i = node.children.length - 1; i >= 0; i--) {
79
+ stack.push(node.children[i]);
80
+ }
81
+ }`);
82
+ return replaceRequired(patched, "markActive", ` function markActive(node) {
83
+ let has = activePathIds.has(node.entry.id);
84
+ for (const child of node.children) {
85
+ if (markActive(child)) has = true;
86
+ }
87
+ containsActive.set(node, has);
88
+ return has;
89
+ }`, ` function markActive(root) {
90
+ const stack1 = [root];
91
+ const stack2 = [];
92
+ while (stack1.length) {
93
+ const node = stack1.pop();
94
+ stack2.push(node);
95
+ for (const child of node.children) {
96
+ stack1.push(child);
97
+ }
98
+ }
99
+ while (stack2.length) {
100
+ const node = stack2.pop();
101
+ let has = activePathIds.has(node.entry.id);
102
+ for (const child of node.children) {
103
+ if (containsActive.get(child)) has = true;
104
+ }
105
+ containsActive.set(node, has);
106
+ }
107
+ }`);
108
+ }
109
+ function piCliPath() {
110
+ const path = join(getPackageDir(), "dist", "cli.js");
111
+ if (!existsSync(path))
112
+ throw new Error("Pi HTML exporter is unavailable");
113
+ return path;
114
+ }
115
+ //# sourceMappingURL=sessionHistoryExport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionHistoryExport.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionHistoryExport.ts"],"names":[],"mappings":"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"}