@vincenthanxiaodu/pi-web 1.202608.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 (376) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/cli.js +1149 -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-D_Q6ljLV.js +4 -0
  7. package/dist/client/assets/TerminalPanel-CTGixJIz.js +187 -0
  8. package/dist/client/assets/index-C2phil_t.js +5637 -0
  9. package/dist/client/assets/vendor-editor-core-CXO8gGab.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-CpW4sJsX.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 +11 -0
  15. package/dist/client/index.html +124 -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 +505 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/docker/piWebDockerCommandPlan.js +212 -0
  22. package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
  23. package/dist/environment.js +4 -0
  24. package/dist/environment.js.map +1 -0
  25. package/dist/nativeServices/installedServiceDefinitions.js +602 -0
  26. package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
  27. package/dist/nativeServices/serviceAction.js +174 -0
  28. package/dist/nativeServices/serviceAction.js.map +1 -0
  29. package/dist/nativeServices/serviceDoctor.js +783 -0
  30. package/dist/nativeServices/serviceDoctor.js.map +1 -0
  31. package/dist/nativeServices/serviceInstall.js +35 -0
  32. package/dist/nativeServices/serviceInstall.js.map +1 -0
  33. package/dist/nativeServices/servicePlan.js +358 -0
  34. package/dist/nativeServices/servicePlan.js.map +1 -0
  35. package/dist/nativeServices/serviceProbe.js +447 -0
  36. package/dist/nativeServices/serviceProbe.js.map +1 -0
  37. package/dist/nativeServices/serviceRendering.js +132 -0
  38. package/dist/nativeServices/serviceRendering.js.map +1 -0
  39. package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
  40. package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
  41. package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
  42. package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
  43. package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
  44. package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
  45. package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
  46. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
  47. package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
  48. package/dist/pi-web-plugins/git/git-backend.js +439 -0
  49. package/dist/pi-web-plugins/git/package.json +16 -0
  50. package/dist/pi-web-plugins/git/server-plugin.js +176 -0
  51. package/dist/pi-web-plugins/info/infoInternals.js +222 -0
  52. package/dist/pi-web-plugins/info/package.json +9 -0
  53. package/dist/pi-web-plugins/info/pi-web-plugin.js +48 -0
  54. package/dist/pi-web-plugins/relays/markdownDocument.js +81 -0
  55. package/dist/pi-web-plugins/relays/package.json +9 -0
  56. package/dist/pi-web-plugins/relays/pi-web-plugin.js +44 -0
  57. package/dist/pi-web-plugins/relays/relayDiscovery.js +228 -0
  58. package/dist/pi-web-plugins/relays/relaysPanelElement.js +550 -0
  59. package/dist/pi-web-plugins/relays/vendor/README.md +24 -0
  60. package/dist/pi-web-plugins/relays/vendor/marked.esm.js +76 -0
  61. package/dist/pi-web-plugins/updates/package.json +9 -0
  62. package/dist/pi-web-plugins/updates/pi-web-plugin.js +185 -0
  63. package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
  64. package/dist/pi-web-plugins/workspace-tasks/config.js +91 -0
  65. package/dist/pi-web-plugins/workspace-tasks/package.json +9 -0
  66. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +48 -0
  67. package/dist/pi-web-plugins/workspace-tasks/taskRunner.js +12 -0
  68. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +288 -0
  69. package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  70. package/dist/piWebVersionReport.js +278 -0
  71. package/dist/piWebVersionReport.js.map +1 -0
  72. package/dist/plugin-api.d.ts +222 -0
  73. package/dist/pluginRecoveryCli.js +172 -0
  74. package/dist/pluginRecoveryCli.js.map +1 -0
  75. package/dist/server/activeAgentProfileProvider.js +25 -0
  76. package/dist/server/activeAgentProfileProvider.js.map +1 -0
  77. package/dist/server/activity/workspaceActivityService.js +106 -0
  78. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  79. package/dist/server/app.js +218 -0
  80. package/dist/server/app.js.map +1 -0
  81. package/dist/server/browserMessageProjection.js +54 -0
  82. package/dist/server/browserMessageProjection.js.map +1 -0
  83. package/dist/server/configRoutes.js +293 -0
  84. package/dist/server/configRoutes.js.map +1 -0
  85. package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
  86. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
  87. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  88. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  89. package/dist/server/git/gitEnv.js +15 -0
  90. package/dist/server/git/gitEnv.js.map +1 -0
  91. package/dist/server/goals/goalArchive.js +184 -0
  92. package/dist/server/goals/goalArchive.js.map +1 -0
  93. package/dist/server/goals/goalFile.js +200 -0
  94. package/dist/server/goals/goalFile.js.map +1 -0
  95. package/dist/server/goals/goalStore.js +65 -0
  96. package/dist/server/goals/goalStore.js.map +1 -0
  97. package/dist/server/index.js +7 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/server/machines/machineClient.js +191 -0
  100. package/dist/server/machines/machineClient.js.map +1 -0
  101. package/dist/server/machines/machinePluginProxyRoutes.js +247 -0
  102. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  103. package/dist/server/machines/machineProxyRoutes.js +318 -0
  104. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  105. package/dist/server/machines/machineRoutes.js +56 -0
  106. package/dist/server/machines/machineRoutes.js.map +1 -0
  107. package/dist/server/machines/machineService.js +274 -0
  108. package/dist/server/machines/machineService.js.map +1 -0
  109. package/dist/server/machines/machineStore.js +143 -0
  110. package/dist/server/machines/machineStore.js.map +1 -0
  111. package/dist/server/piPackageRoutes.js +91 -0
  112. package/dist/server/piPackageRoutes.js.map +1 -0
  113. package/dist/server/piPackageService.js +101 -0
  114. package/dist/server/piPackageService.js.map +1 -0
  115. package/dist/server/piWebPluginCatalog.js +584 -0
  116. package/dist/server/piWebPluginCatalog.js.map +1 -0
  117. package/dist/server/piWebPluginLifecycle.js +162 -0
  118. package/dist/server/piWebPluginLifecycle.js.map +1 -0
  119. package/dist/server/piWebPluginService.js +224 -0
  120. package/dist/server/piWebPluginService.js.map +1 -0
  121. package/dist/server/piWebReleaseLookupCache.js +37 -0
  122. package/dist/server/piWebReleaseLookupCache.js.map +1 -0
  123. package/dist/server/piWebStatus.js +624 -0
  124. package/dist/server/piWebStatus.js.map +1 -0
  125. package/dist/server/piWebStatusCache.js +45 -0
  126. package/dist/server/piWebStatusCache.js.map +1 -0
  127. package/dist/server/plugins/pluginBackendProxyRoutes.js +69 -0
  128. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
  129. package/dist/server/plugins/serverPluginExec.js +184 -0
  130. package/dist/server/plugins/serverPluginExec.js.map +1 -0
  131. package/dist/server/plugins/serverPluginRuntime.js +480 -0
  132. package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
  133. package/dist/server/projectTrustRoutes.js +80 -0
  134. package/dist/server/projectTrustRoutes.js.map +1 -0
  135. package/dist/server/projects/directorySuggestions.js +207 -0
  136. package/dist/server/projects/directorySuggestions.js.map +1 -0
  137. package/dist/server/projects/projectService.js +33 -0
  138. package/dist/server/projects/projectService.js.map +1 -0
  139. package/dist/server/realtime/sessionEventHub.js +93 -0
  140. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  141. package/dist/server/requestCancellation.js +32 -0
  142. package/dist/server/requestCancellation.js.map +1 -0
  143. package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
  144. package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
  145. package/dist/server/sessiond/agentProcessEnvironment.js +61 -0
  146. package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
  147. package/dist/server/sessiond/pluginBackendRoutes.js +64 -0
  148. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
  149. package/dist/server/sessiond/sessionDaemonShutdown.js +31 -0
  150. package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
  151. package/dist/server/sessiond/sessionProxyRoutes.js +61 -0
  152. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  153. package/dist/server/sessiond/sessionServiceDependencies.js +34 -0
  154. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -0
  155. package/dist/server/sessiond/sessiondStateOwnership.js +235 -0
  156. package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
  157. package/dist/server/sessiond/workspaceCatalogRoutes.js +31 -0
  158. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
  159. package/dist/server/sessiond/workspaceRemovalRoutes.js +41 -0
  160. package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
  161. package/dist/server/sessiond.js +387 -0
  162. package/dist/server/sessiond.js.map +1 -0
  163. package/dist/server/sessions/askUserTool.js +102 -0
  164. package/dist/server/sessions/askUserTool.js.map +1 -0
  165. package/dist/server/sessions/attachmentService.js +119 -0
  166. package/dist/server/sessions/attachmentService.js.map +1 -0
  167. package/dist/server/sessions/authProviderOptions.js +50 -0
  168. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  169. package/dist/server/sessions/authRoutes.js +59 -0
  170. package/dist/server/sessions/authRoutes.js.map +1 -0
  171. package/dist/server/sessions/authService.js +122 -0
  172. package/dist/server/sessions/authService.js.map +1 -0
  173. package/dist/server/sessions/builtinCommands.js +27 -0
  174. package/dist/server/sessions/builtinCommands.js.map +1 -0
  175. package/dist/server/sessions/dockerEnvironmentFacts.js +254 -0
  176. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
  177. package/dist/server/sessions/editPreview.js +196 -0
  178. package/dist/server/sessions/editPreview.js.map +1 -0
  179. package/dist/server/sessions/extensionDialogWaiters.js +76 -0
  180. package/dist/server/sessions/extensionDialogWaiters.js.map +1 -0
  181. package/dist/server/sessions/globalProviderPolicy.js +167 -0
  182. package/dist/server/sessions/globalProviderPolicy.js.map +1 -0
  183. package/dist/server/sessions/interruptedRunStore.js +147 -0
  184. package/dist/server/sessions/interruptedRunStore.js.map +1 -0
  185. package/dist/server/sessions/messagePaging.js +43 -0
  186. package/dist/server/sessions/messagePaging.js.map +1 -0
  187. package/dist/server/sessions/modelCatalogRefresher.js +193 -0
  188. package/dist/server/sessions/modelCatalogRefresher.js.map +1 -0
  189. package/dist/server/sessions/oauthLoginFlowService.js +346 -0
  190. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  191. package/dist/server/sessions/pendingAskStore.js +275 -0
  192. package/dist/server/sessions/pendingAskStore.js.map +1 -0
  193. package/dist/server/sessions/pendingExtensionDialogStore.js +196 -0
  194. package/dist/server/sessions/pendingExtensionDialogStore.js.map +1 -0
  195. package/dist/server/sessions/piSessionManagerGateway.js +246 -0
  196. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  197. package/dist/server/sessions/piSessionService.js +4059 -0
  198. package/dist/server/sessions/piSessionService.js.map +1 -0
  199. package/dist/server/sessions/plainTextTheme.js +112 -0
  200. package/dist/server/sessions/plainTextTheme.js.map +1 -0
  201. package/dist/server/sessions/sessionArchiveStore.js +273 -0
  202. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  203. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  204. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  205. package/dist/server/sessions/sessionCleanup.js +157 -0
  206. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  207. package/dist/server/sessions/sessionCommandService.js +336 -0
  208. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  209. package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
  210. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
  211. package/dist/server/sessions/sessionFileFormat.js +27 -0
  212. package/dist/server/sessions/sessionFileFormat.js.map +1 -0
  213. package/dist/server/sessions/sessionFileHeader.js +104 -0
  214. package/dist/server/sessions/sessionFileHeader.js.map +1 -0
  215. package/dist/server/sessions/sessionModelScope.js +141 -0
  216. package/dist/server/sessions/sessionModelScope.js.map +1 -0
  217. package/dist/server/sessions/sessionNameGenerator.js +90 -0
  218. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  219. package/dist/server/sessions/sessionNotificationStore.js +484 -0
  220. package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
  221. package/dist/server/sessions/sessionRoutes.js +744 -0
  222. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  223. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  224. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  225. package/dist/server/sessions/sessionService.js +2 -0
  226. package/dist/server/sessions/sessionService.js.map +1 -0
  227. package/dist/server/sessions/sessionSummaryScanner.js +491 -0
  228. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
  229. package/dist/server/sessions/sessionTreeProjection.js +250 -0
  230. package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
  231. package/dist/server/sessions/sessionUnreadStore.js +520 -0
  232. package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
  233. package/dist/server/sessions/shutdownDrain.js +73 -0
  234. package/dist/server/sessions/shutdownDrain.js.map +1 -0
  235. package/dist/server/sessions/spawnSessionTool.js +48 -0
  236. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  237. package/dist/server/sessions/spawnSubsessionTool.js +216 -0
  238. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  239. package/dist/server/sessions/spawnTargetResolver.js +23 -0
  240. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  241. package/dist/server/sessions/subsessionTranscript.js +235 -0
  242. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  243. package/dist/server/status/machineStatusRoutes.js +8 -0
  244. package/dist/server/status/machineStatusRoutes.js.map +1 -0
  245. package/dist/server/status/machineStatusService.js +181 -0
  246. package/dist/server/status/machineStatusService.js.map +1 -0
  247. package/dist/server/status/workspaceAttribution.js +87 -0
  248. package/dist/server/status/workspaceAttribution.js.map +1 -0
  249. package/dist/server/storage/projectStore.js +88 -0
  250. package/dist/server/storage/projectStore.js.map +1 -0
  251. package/dist/server/terminalProxyRoutes.js +141 -0
  252. package/dist/server/terminalProxyRoutes.js.map +1 -0
  253. package/dist/server/terminals/terminalRoutes.js +155 -0
  254. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  255. package/dist/server/terminals/terminalService.js +305 -0
  256. package/dist/server/terminals/terminalService.js.map +1 -0
  257. package/dist/server/terminals/terminalSize.js +17 -0
  258. package/dist/server/terminals/terminalSize.js.map +1 -0
  259. package/dist/server/types.js +2 -0
  260. package/dist/server/types.js.map +1 -0
  261. package/dist/server/updates/fleetRoutes.js +111 -0
  262. package/dist/server/updates/fleetRoutes.js.map +1 -0
  263. package/dist/server/updates/restartRoutes.js +48 -0
  264. package/dist/server/updates/restartRoutes.js.map +1 -0
  265. package/dist/server/updates/selfUpdateRoutes.js +145 -0
  266. package/dist/server/updates/selfUpdateRoutes.js.map +1 -0
  267. package/dist/server/webSocketBridge.js +32 -0
  268. package/dist/server/webSocketBridge.js.map +1 -0
  269. package/dist/server/workingDirectory.js +44 -0
  270. package/dist/server/workingDirectory.js.map +1 -0
  271. package/dist/server/workspaceExplorerRoutes.js +147 -0
  272. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  273. package/dist/server/workspaces/effectivePathAccess.js +8 -0
  274. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  275. package/dist/server/workspaces/fileContentService.js +190 -0
  276. package/dist/server/workspaces/fileContentService.js.map +1 -0
  277. package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
  278. package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
  279. package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
  280. package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
  281. package/dist/server/workspaces/filePreviewService.js +81 -0
  282. package/dist/server/workspaces/filePreviewService.js.map +1 -0
  283. package/dist/server/workspaces/fileSuggestions.js +520 -0
  284. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  285. package/dist/server/workspaces/fileTreeService.js +35 -0
  286. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  287. package/dist/server/workspaces/pathAccessPolicy.js +90 -0
  288. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  289. package/dist/server/workspaces/pathSafety.js +45 -0
  290. package/dist/server/workspaces/pathSafety.js.map +1 -0
  291. package/dist/server/workspaces/projectPiWebConfig.js +61 -0
  292. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
  293. package/dist/server/workspaces/projectWorkspaceCwds.js +17 -0
  294. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -0
  295. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +402 -0
  296. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
  297. package/dist/server/workspaces/workspaceCatalog.js +47 -0
  298. package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
  299. package/dist/server/workspaces/workspaceContext.js +6 -0
  300. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  301. package/dist/server/workspaces/workspaceDeletionRoutes.js +49 -0
  302. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  303. package/dist/server/workspaces/workspaceProviderRegistry.js +651 -0
  304. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
  305. package/dist/server/workspaces/workspaceRemovalService.js +256 -0
  306. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
  307. package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
  308. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
  309. package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
  310. package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
  311. package/dist/server-plugin-api.d.ts +140 -0
  312. package/dist/server-plugin-api.js +2 -0
  313. package/dist/server-plugin-api.js.map +1 -0
  314. package/dist/serverPluginRecovery.js +138 -0
  315. package/dist/serverPluginRecovery.js.map +1 -0
  316. package/dist/sessiond/activeAgentProfile.js +12 -0
  317. package/dist/sessiond/activeAgentProfile.js.map +1 -0
  318. package/dist/sessiond/config.js +20 -0
  319. package/dist/sessiond/config.js.map +1 -0
  320. package/dist/sessiond/sessionDaemonClient.js +105 -0
  321. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  322. package/dist/shared/activeAgentProfile.js +37 -0
  323. package/dist/shared/activeAgentProfile.js.map +1 -0
  324. package/dist/shared/activity.js +16 -0
  325. package/dist/shared/activity.js.map +1 -0
  326. package/dist/shared/apiTypes.js +41 -0
  327. package/dist/shared/apiTypes.js.map +1 -0
  328. package/dist/shared/capabilities.js +37 -0
  329. package/dist/shared/capabilities.js.map +1 -0
  330. package/dist/shared/federatedRoutes.js +127 -0
  331. package/dist/shared/federatedRoutes.js.map +1 -0
  332. package/dist/shared/machinePluginIds.js +43 -0
  333. package/dist/shared/machinePluginIds.js.map +1 -0
  334. package/dist/shared/machineStatus.js +94 -0
  335. package/dist/shared/machineStatus.js.map +1 -0
  336. package/dist/shared/piWebStatusParsing.js +141 -0
  337. package/dist/shared/piWebStatusParsing.js.map +1 -0
  338. package/dist/shared/pluginApiTypes.d.ts +150 -0
  339. package/dist/shared/pluginApiTypes.js +3 -0
  340. package/dist/shared/pluginApiTypes.js.map +1 -0
  341. package/dist/shared/pluginBackendProtocol.js +110 -0
  342. package/dist/shared/pluginBackendProtocol.js.map +1 -0
  343. package/dist/shared/pluginIds.js +10 -0
  344. package/dist/shared/pluginIds.js.map +1 -0
  345. package/dist/shared/pluginRecoveryCommands.js +14 -0
  346. package/dist/shared/pluginRecoveryCommands.js.map +1 -0
  347. package/dist/shared/promptAttachments.js +92 -0
  348. package/dist/shared/promptAttachments.js.map +1 -0
  349. package/dist/shared/selfUpdate.js +3 -0
  350. package/dist/shared/selfUpdate.js.map +1 -0
  351. package/dist/shared/thinkingLevels.js +31 -0
  352. package/dist/shared/thinkingLevels.js.map +1 -0
  353. package/dist/shared/workspaceDeletion.js +12 -0
  354. package/dist/shared/workspaceDeletion.js.map +1 -0
  355. package/dist/shared/workspaceFiles.js +42 -0
  356. package/dist/shared/workspaceFiles.js.map +1 -0
  357. package/dist/shared/workspaceRemovalProtocol.js +24 -0
  358. package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
  359. package/docs/assets/favicon.svg +11 -0
  360. package/docs/assets/pi-web-banner.png +0 -0
  361. package/docs/assets/pi-web-desktop.png +0 -0
  362. package/docs/assets/pi-web-mobile.png +0 -0
  363. package/docs/assets/pi-web-tablet.png +0 -0
  364. package/docs/config.md +444 -0
  365. package/docs/plugins.md +1305 -0
  366. package/examples/workspace-provider-plugin/README.md +52 -0
  367. package/examples/workspace-provider-plugin/package.json +25 -0
  368. package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
  369. package/examples/workspace-provider-plugin/src/server.ts +64 -0
  370. package/examples/workspace-provider-plugin/tsconfig.json +21 -0
  371. package/extensions/README-pi-web-restart-migration.md +45 -0
  372. package/extensions/pi-web.ts +324 -0
  373. package/install.sh +5 -0
  374. package/package.json +173 -0
  375. package/plugin-api.d.ts +1 -0
  376. package/server-plugin-api.d.ts +1 -0
@@ -0,0 +1,48 @@
1
+ import { Type } from "typebox";
2
+ import { defineTool } from "@earendil-works/pi-coding-agent";
3
+ const SpawnSessionParams = Type.Object({
4
+ prompt: Type.String({
5
+ description: "The first instruction to send to the newly created session. The new session runs independently; you do not receive its output.",
6
+ }),
7
+ cwd: Type.Optional(Type.String({
8
+ description: "Working directory for the new session. Must be a workspace (worktree, or root) of the same project as this session. Defaults to this session's working directory.",
9
+ })),
10
+ model: Type.Optional(Type.String({
11
+ description: 'Model for the new session, as an exact "provider/model-id" such as "anthropic/claude-sonnet-4-5". When the user references a model as #provider/model-id in their request, forward it here. An unknown value is rejected. Omit to inherit this session\'s model.',
12
+ })),
13
+ });
14
+ /**
15
+ * Custom tool that lets the LLM start a new, independent pi-web session and
16
+ * deliver an initial prompt to it. The spawned session is a normal pi-web session
17
+ * a human can open and interact with. The tool is constructed per-session, so it
18
+ * carries the spawning session's cwd for project-scope validation.
19
+ */
20
+ export function createSpawnSessionToolDefinition(spawningCwd, deps) {
21
+ return defineTool({
22
+ name: "spawn_session",
23
+ label: "Spawn session",
24
+ description: "Start a fully independent session; its transcript and results are unavailable here. Use only when the user or active workflow explicitly requests a separate session.",
25
+ promptSnippet: "spawn_session: independent session; results unavailable here; explicit requests only",
26
+ parameters: SpawnSessionParams,
27
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
28
+ // Failures throw: the agent loop turns the thrown message into an error
29
+ // tool result the model sees, so the spawning agent can adapt (e.g. pick a
30
+ // valid workspace) rather than crash.
31
+ const result = await deps.spawn({
32
+ spawningCwd,
33
+ spawningSessionId: ctx.sessionManager.getSessionId(),
34
+ prompt: params.prompt,
35
+ cwd: params.cwd,
36
+ ...(ctx.model === undefined ? {} : { model: ctx.model }),
37
+ ...(params.model === undefined ? {} : { modelSpec: params.model }),
38
+ ...(ctx.thinkingLevel === undefined ? {} : { thinkingLevel: ctx.thinkingLevel }),
39
+ });
40
+ const modelNote = result.model === undefined ? "" : ` using model ${result.model}`;
41
+ return {
42
+ content: [{ type: "text", text: `Started independent session ${result.sessionId} in ${result.cwd}${modelNote}.` }],
43
+ details: result,
44
+ };
45
+ },
46
+ });
47
+ }
48
+ //# sourceMappingURL=spawnSessionTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnSessionTool.js","sourceRoot":"","sources":["../../../src/server/sessions/spawnSessionTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAyB,MAAM,iCAAiC,CAAC;AAgCpF,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,gIAAgI;KAC9I,CAAC;IACF,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B,WAAW,EAAE,mKAAmK;KACjL,CAAC,CAAC;IACH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,WAAW,EAAE,kQAAkQ;KAChR,CAAC,CAAC;CACJ,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAAC,WAAmB,EAAE,IAA0B;IAC9F,OAAO,UAAU,CAAqD;QACpE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,uKAAuK;QACpL,aAAa,EAAE,sFAAsF;QACrG,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG;YACxD,wEAAwE;YACxE,2EAA2E;YAC3E,sCAAsC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;gBAC9B,WAAW;gBACX,iBAAiB,EAAE,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE;gBACpD,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;gBACxD,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClE,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;aACjF,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC;YACnF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,MAAM,CAAC,SAAS,OAAO,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC;gBAClH,OAAO,EAAE,MAAM;aAChB,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,216 @@
1
+ import { Type } from "typebox";
2
+ import { defineTool } from "@earendil-works/pi-coding-agent";
3
+ const SpawnSubsessionParams = Type.Object({
4
+ prompt: Type.String({
5
+ description: "Initial instruction for the tracked child.",
6
+ }),
7
+ model: Type.Optional(Type.String({
8
+ description: 'Model for the child session, as an exact "provider/model-id" such as "anthropic/claude-sonnet-4-5". When the user references a model as #provider/model-id in their request, forward it here. An unknown value is rejected. Omit to inherit this session\'s model.',
9
+ })),
10
+ });
11
+ const ListSubsessionsParams = Type.Object({});
12
+ const YieldToSubsessionsParams = Type.Object({});
13
+ const CheckSubsessionParams = Type.Object({
14
+ sessionId: Type.String({
15
+ description: "Tracked child id from spawn_subsession or list_subsessions.",
16
+ }),
17
+ });
18
+ const ReadSubsessionParams = Type.Object({
19
+ sessionId: Type.String({
20
+ description: "Tracked child id from spawn_subsession or list_subsessions.",
21
+ }),
22
+ roles: Type.Optional(Type.Array(Type.Union([Type.Literal("assistant"), Type.Literal("user"), Type.Literal("tool"), Type.Literal("system"), Type.Literal("custom")]), { description: "Roles to include; omit for all." })),
23
+ include: Type.Optional(Type.Array(Type.Union([Type.Literal("text"), Type.Literal("thinking"), Type.Literal("tool_call"), Type.Literal("tool_result"), Type.Literal("image")]), { description: "Content kinds to include; omit for all." })),
24
+ search: Type.Optional(Type.String({
25
+ description: "Case-insensitive text or tool-name substring; searches full content before maxChars truncation.",
26
+ })),
27
+ maxChars: Type.Optional(Type.Integer({
28
+ minimum: 0,
29
+ description: "Maximum characters per text, thinking, or tool-result value; omit for no truncation.",
30
+ })),
31
+ includeToolArgs: Type.Optional(Type.Boolean({
32
+ description: "Include raw tool-call arguments; summaries are always included.",
33
+ })),
34
+ before: Type.Optional(Type.Integer({
35
+ minimum: 0,
36
+ description: "Return messages before this index; use the previous start to page backward.",
37
+ })),
38
+ limit: Type.Optional(Type.Integer({
39
+ minimum: 1,
40
+ description: "Maximum recent matches, in chronological order. Defaults to 50.",
41
+ })),
42
+ });
43
+ function statusLine(summary) {
44
+ return `- ${summary.sessionId} [${summary.status}] in ${summary.cwd}`;
45
+ }
46
+ function workingInspectionGuidance(sessionId) {
47
+ return `Subsession ${sessionId} is working; partial output is withheld. Continue other work, or call yield_to_subsessions alone and last at the join point. Completion notices wake you; do not poll.`;
48
+ }
49
+ function renderEntry(entry) {
50
+ const header = `#${String(entry.index)} ${entry.role}`;
51
+ const body = entry.parts.map(renderPart).filter((line) => line !== "").join("\n");
52
+ return body === "" ? header : `${header}\n${body}`;
53
+ }
54
+ function clipNotice(part) {
55
+ if ((part.kind === "text" || part.kind === "thinking" || part.kind === "tool_result") && part.truncated !== undefined) {
56
+ return ` [+${String(part.truncated.full - part.truncated.shown)} chars truncated]`;
57
+ }
58
+ return "";
59
+ }
60
+ function renderPart(part) {
61
+ if (part.kind === "text")
62
+ return `${part.text}${clipNotice(part)}`;
63
+ if (part.kind === "thinking")
64
+ return `[thinking] ${part.text}${clipNotice(part)}`;
65
+ if (part.kind === "tool_call") {
66
+ // Raw args are only present when the caller asked (includeToolArgs); when
67
+ // present, surface them in the model-facing text, not just `details`.
68
+ const args = "args" in part && part.args !== undefined ? `\n args: ${JSON.stringify(part.args)}` : "";
69
+ return `[tool ${part.toolName}] ${part.summary}${args}`;
70
+ }
71
+ if (part.kind === "tool_result")
72
+ return `[result${part.isError ? " error" : ""}${part.toolName === undefined ? "" : ` ${part.toolName}`}] ${part.text}${clipNotice(part)}`;
73
+ return "[image]";
74
+ }
75
+ function renderTranscript(result) {
76
+ const last = result.entries[result.entries.length - 1];
77
+ // Distinguish "nothing matched at all" (widen filters) from "matches exist but
78
+ // this page/window is empty" (page differently) so the agent isn't misled.
79
+ const range = last === undefined
80
+ ? (result.matched === 0
81
+ ? "no messages matched your filters"
82
+ : `no messages in this window (${String(result.matched)} matched outside it)`)
83
+ : `messages ${String(result.start)}–${String(last.index)} of ${String(result.total)} (${String(result.matched)} matched)`;
84
+ const more = result.hasMore ? ` Earlier matching messages exist before index ${String(result.start)}.` : "";
85
+ // Empty entries with matches means the `before` cursor excluded every match
86
+ // (they all sit at index >= before): the agent paged too far back and should
87
+ // raise `before` or omit it, not page back further.
88
+ const body = result.entries.length > 0
89
+ ? result.entries.map(renderEntry).join("\n\n")
90
+ : (result.matched === 0
91
+ ? "(no messages matched the filters)"
92
+ : `(no messages before index ${String(result.start)}; all ${String(result.matched)} matches have later indexes)`);
93
+ return `Subsession ${result.sessionId} [${result.status}] — ${range}.${more}\n\n--- SUBSESSION TRANSCRIPT: ${result.sessionId} ---\n${body}`;
94
+ }
95
+ /**
96
+ * Tools that let an agent spawn *tracked* child sessions, inspect them, and
97
+ * explicitly yield at a join point.
98
+ *
99
+ * A subsession records its parent in its session header, the parent is notified
100
+ * when it stops working, and the parent may read its transcript/result. The
101
+ * tools are constructed per-session, carrying the spawning cwd, which is both
102
+ * the project-scope validation input and the child's workspace; the parent's
103
+ * identity is taken from the live extension context at call time.
104
+ */
105
+ export function createSubsessionToolDefinitions(spawningCwd, deps) {
106
+ const spawnTool = defineTool({
107
+ name: "spawn_subsession",
108
+ label: "Spawn subsession",
109
+ description: "Start a tracked child session in this session's working directory to carry out part of the current task and return immediately. Its transcript and result are available here after it finishes.",
110
+ promptSnippet: "spawn_subsession: tracked child work in this workspace; result available after completion",
111
+ parameters: SpawnSubsessionParams,
112
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
113
+ const parentSessionId = ctx.sessionManager.getSessionId();
114
+ const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
115
+ const result = await deps.spawn({
116
+ spawningCwd,
117
+ parentSessionId,
118
+ parentSessionFile,
119
+ prompt: params.prompt,
120
+ ...(ctx.model === undefined ? {} : { model: ctx.model }),
121
+ ...(params.model === undefined ? {} : { modelSpec: params.model }),
122
+ ...(ctx.thinkingLevel === undefined ? {} : { thinkingLevel: ctx.thinkingLevel }),
123
+ });
124
+ const modelNote = result.model === undefined ? "" : ` using model ${result.model}`;
125
+ return {
126
+ content: [{ type: "text", text: `Started tracked subsession ${result.sessionId} in ${result.cwd}${modelNote}. Continue other work, then join with yield_to_subsessions; do not poll.` }],
127
+ details: result,
128
+ };
129
+ },
130
+ });
131
+ const listTool = defineTool({
132
+ name: "list_subsessions",
133
+ label: "List subsessions",
134
+ description: "List tracked child statuses. Never yields or changes control flow; do not poll.",
135
+ promptSnippet: "list_subsessions: inspect child statuses; never yields",
136
+ parameters: ListSubsessionsParams,
137
+ async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
138
+ const parentSessionId = ctx.sessionManager.getSessionId();
139
+ const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
140
+ const subsessions = await deps.list(parentSessionId, parentSessionFile);
141
+ const text = subsessions.length === 0
142
+ ? "No tracked subsessions."
143
+ : `Tracked subsessions:\n${subsessions.map(statusLine).join("\n")}`;
144
+ return { content: [{ type: "text", text }], details: { subsessions } };
145
+ },
146
+ });
147
+ const checkTool = defineTool({
148
+ name: "check_subsession",
149
+ label: "Check subsession",
150
+ description: "Get a tracked child's status and latest output. Working output is withheld. Never yields; do not poll.",
151
+ promptSnippet: "check_subsession: inspect child status and available output; never yields",
152
+ parameters: CheckSubsessionParams,
153
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
154
+ const parentSessionId = ctx.sessionManager.getSessionId();
155
+ const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
156
+ const result = await deps.check(parentSessionId, params.sessionId, parentSessionFile);
157
+ const body = result.finalText === "" ? "(no output yet)" : result.finalText;
158
+ const text = result.status === "working"
159
+ ? workingInspectionGuidance(result.sessionId)
160
+ : `Subsession ${result.sessionId} [${result.status}].\n\n--- SUBSESSION OUTPUT: ${result.sessionId} ---\n${body}`;
161
+ return {
162
+ content: [{ type: "text", text }],
163
+ details: result,
164
+ };
165
+ },
166
+ });
167
+ const readTool = defineTool({
168
+ name: "read_subsession",
169
+ label: "Read subsession",
170
+ description: "Read a tracked child's filtered transcript. Working transcripts are withheld. Never yields; do not poll.",
171
+ promptSnippet: "read_subsession: inspect an available child transcript; never yields",
172
+ parameters: ReadSubsessionParams,
173
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
174
+ const parentSessionId = ctx.sessionManager.getSessionId();
175
+ const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
176
+ const { sessionId, ...query } = params;
177
+ const result = await deps.read(parentSessionId, sessionId, query, parentSessionFile);
178
+ const text = result.status === "working"
179
+ ? workingInspectionGuidance(result.sessionId)
180
+ : renderTranscript(result);
181
+ return {
182
+ content: [{ type: "text", text }],
183
+ details: result,
184
+ };
185
+ },
186
+ });
187
+ const yieldTool = defineTool({
188
+ name: "yield_to_subsessions",
189
+ label: "Yield to subsessions",
190
+ description: "At a join point, end this run while tracked children work; completion notices wake you. If none work, continue. Call alone and last; do not poll.",
191
+ promptSnippet: "yield_to_subsessions: end the run at a join point; call alone and last",
192
+ promptGuidelines: [
193
+ "After calling spawn_subsession, you can continue with other work. At the join point, call yield_to_subsessions alone and last; completion notices wake you, so do not poll.",
194
+ ],
195
+ parameters: YieldToSubsessionsParams,
196
+ async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
197
+ const parentSessionId = ctx.sessionManager.getSessionId();
198
+ const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
199
+ const subsessions = await deps.list(parentSessionId, parentSessionFile);
200
+ const working = subsessions.filter(({ status }) => status === "working");
201
+ if (working.length === 0) {
202
+ return {
203
+ content: [{ type: "text", text: "No tracked subsessions are working; continuing." }],
204
+ details: { subsessions },
205
+ };
206
+ }
207
+ return {
208
+ content: [{ type: "text", text: `Working: ${working.map(({ sessionId }) => sessionId).join(", ")}. Ending this run; completion notices will wake you.` }],
209
+ details: { subsessions },
210
+ terminate: true,
211
+ };
212
+ },
213
+ });
214
+ return [spawnTool, listTool, checkTool, readTool, yieldTool];
215
+ }
216
+ //# sourceMappingURL=spawnSubsessionTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnSubsessionTool.js","sourceRoot":"","sources":["../../../src/server/sessions/spawnSubsessionTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { cwdPathsEqual } from "../workingDirectory.js";
2
+ import { RegisteredProjectWorkspaceCwds } from "../workspaces/projectWorkspaceCwds.js";
3
+ /**
4
+ * Default resolver composing the project registry and live provider resolution.
5
+ * It finds the registered project whose current workspace set contains the
6
+ * spawning session's cwd, then validates the requested target against that set.
7
+ */
8
+ export class ProjectScopedSpawnTargetResolver {
9
+ constructor(deps) {
10
+ this.projectWorkspaces = new RegisteredProjectWorkspaceCwds(deps);
11
+ }
12
+ async resolveSpawnTarget(spawningCwd, requestedCwd) {
13
+ const allowedCwds = await this.projectWorkspaces.forCwd(spawningCwd);
14
+ if (allowedCwds === undefined)
15
+ return { allowed: false, reason: "not-registered" };
16
+ const target = requestedCwd === undefined || requestedCwd === "" ? spawningCwd : requestedCwd;
17
+ const match = allowedCwds.find((path) => cwdPathsEqual(path, target));
18
+ if (match === undefined)
19
+ return { allowed: false, reason: "out-of-project", allowedCwds };
20
+ return { allowed: true, cwd: match };
21
+ }
22
+ }
23
+ //# sourceMappingURL=spawnTargetResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnTargetResolver.js","sourceRoot":"","sources":["../../../src/server/sessions/spawnTargetResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAA4D,MAAM,uCAAuC,CAAC;AAoCjJ;;;;GAIG;AACH,MAAM,OAAO,gCAAgC;IAG3C,YAAY,IAA0C;QACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,WAAmB,EAAE,YAAgC;QAC5E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC9F,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;QAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Pure helpers for the `read_subsession` tool: turn a subsession's normalized
3
+ * history (as produced by `historyMessages`) into a filtered, projected,
4
+ * paginated view the parent agent can explore.
5
+ *
6
+ * The agent drives the read: it picks which roles and content kinds it cares
7
+ * about, how much detail it wants, and how far back to look. If a narrow read
8
+ * does not answer its question it can widen the filters or page further back,
9
+ * the same grep-then-read loop it already uses on files. Everything here is a
10
+ * pure transform over an array so it can be unit-tested without a live session.
11
+ */
12
+ const DEFAULT_LIMIT = 50;
13
+ const MAX_LIMIT = 200;
14
+ /**
15
+ * Build a filtered, projected, paginated view of a normalized transcript.
16
+ *
17
+ * Filtering happens before paging for *semantics*, not speed: `search`, the
18
+ * `matched` count, and "page backward through matches" all require scanning the
19
+ * whole transcript, so a window-first approach could not answer them. The
20
+ * tradeoff is an O(total) scan per call (paging a raw window first would be
21
+ * cheaper), but `total` is a single session's history and this runs once per
22
+ * tool call, so the scan is negligible. The cost that matters for an LLM tool,
23
+ * the tokens returned, is bounded by `limit` regardless of ordering; `matched`
24
+ * is only a count, so the agent learns whether widening or paging is worthwhile
25
+ * without paying to receive every match.
26
+ */
27
+ export function buildTranscriptView(messages, query = {}) {
28
+ const total = messages.length;
29
+ // Explicit, caller-owned truncation: only when provided, and a malformed
30
+ // value (negative/fractional) is coerced to a safe non-negative integer
31
+ // rather than silently meaning "no cap".
32
+ const maxChars = query.maxChars === undefined ? undefined : Math.max(0, Math.floor(query.maxChars));
33
+ const includeToolArgs = query.includeToolArgs === true;
34
+ const roleFilter = query.roles === undefined ? undefined : new Set(query.roles);
35
+ const includeFilter = query.include === undefined ? undefined : new Set(query.include);
36
+ const search = query.search !== undefined && query.search !== "" ? query.search.toLowerCase() : undefined;
37
+ // Extract *full* (untruncated) parts and run all filtering/search on them, so
38
+ // matching never depends on `maxChars`. Projection (clipping, arg dropping)
39
+ // happens later and only on the entries we actually return.
40
+ const matchedEntries = [];
41
+ for (let index = 0; index < total; index++) {
42
+ const role = roleOf(messages[index]);
43
+ if (role === undefined)
44
+ continue;
45
+ if (roleFilter !== undefined && !roleFilter.has(role))
46
+ continue;
47
+ let parts = fullPartsOf(messages[index], role);
48
+ if (includeFilter !== undefined)
49
+ parts = parts.filter((part) => includeFilter.has(part.kind));
50
+ if (parts.length === 0)
51
+ continue;
52
+ if (search !== undefined && !partsMatchSearch(parts, search))
53
+ continue;
54
+ matchedEntries.push({ index, role, parts });
55
+ }
56
+ const matched = matchedEntries.length;
57
+ const before = clampInteger(query.before ?? total, 0, total);
58
+ const limit = clampInteger(query.limit ?? DEFAULT_LIMIT, 1, MAX_LIMIT);
59
+ const inWindow = matchedEntries.filter((entry) => entry.index < before);
60
+ const windowed = inWindow.slice(Math.max(0, inWindow.length - limit));
61
+ const entries = windowed.map((entry) => projectEntry(entry, maxChars, includeToolArgs));
62
+ const first = windowed[0];
63
+ const start = first === undefined ? before : first.index;
64
+ const hasMore = inWindow.length > windowed.length;
65
+ return { entries, total, matched, start, hasMore };
66
+ }
67
+ function partsMatchSearch(parts, needle) {
68
+ return parts.some((part) => {
69
+ if (part.kind === "text" || part.kind === "thinking")
70
+ return part.text.toLowerCase().includes(needle);
71
+ if (part.kind === "tool_result")
72
+ return part.text.toLowerCase().includes(needle) || (part.toolName?.toLowerCase().includes(needle) ?? false);
73
+ // Search the *full* serialized args, not the lossy one-line summary, so a
74
+ // term inside edit/write content, nested objects, or long values is found.
75
+ if (part.kind === "tool_call")
76
+ return part.toolName.toLowerCase().includes(needle) || stringifyArgs(part.args).toLowerCase().includes(needle);
77
+ return false;
78
+ });
79
+ }
80
+ /** Full, search-friendly serialization of tool-call args (distinct from the lossy display summary). */
81
+ function stringifyArgs(args) {
82
+ if (args === undefined)
83
+ return "";
84
+ if (typeof args === "string")
85
+ return args;
86
+ try {
87
+ // JSON.stringify can return undefined at runtime (e.g. a function/symbol),
88
+ // despite its string-typed signature; normalize that to "".
89
+ const json = JSON.stringify(args);
90
+ return typeof json === "string" ? json : "";
91
+ }
92
+ catch {
93
+ return "";
94
+ }
95
+ }
96
+ /** Project a fully-extracted entry into the returned shape, clipping only when `maxChars` is set. */
97
+ function projectEntry(entry, maxChars, includeToolArgs) {
98
+ return { index: entry.index, role: entry.role, parts: entry.parts.map((part) => projectPart(part, maxChars, includeToolArgs)) };
99
+ }
100
+ function projectPart(part, maxChars, includeToolArgs) {
101
+ if (part.kind === "text")
102
+ return { kind: "text", ...clip(part.text, maxChars) };
103
+ if (part.kind === "thinking")
104
+ return { kind: "thinking", ...clip(part.text, maxChars) };
105
+ if (part.kind === "tool_result") {
106
+ return {
107
+ kind: "tool_result",
108
+ ...(part.toolName === undefined ? {} : { toolName: part.toolName }),
109
+ isError: part.isError,
110
+ ...clip(part.text, maxChars),
111
+ };
112
+ }
113
+ if (part.kind === "tool_call") {
114
+ return {
115
+ kind: "tool_call",
116
+ toolName: part.toolName,
117
+ summary: summarizeToolArgs(part.args),
118
+ ...(includeToolArgs && part.args !== undefined ? { args: part.args } : {}),
119
+ };
120
+ }
121
+ return { kind: "image" };
122
+ }
123
+ /** Clip text to `maxChars`, attaching a `truncated` marker when it actually shortens. */
124
+ function clip(text, maxChars) {
125
+ if (maxChars === undefined || text.length <= maxChars)
126
+ return { text };
127
+ return { text: text.slice(0, maxChars), truncated: { shown: maxChars, full: text.length } };
128
+ }
129
+ /** Map a raw history message to one of the agent-facing roles, or undefined to drop it. */
130
+ function roleOf(message) {
131
+ const role = getString(message, "role");
132
+ if (role === "assistant")
133
+ return "assistant";
134
+ if (role === "user")
135
+ return "user";
136
+ if (role === "toolResult")
137
+ return "tool";
138
+ if (role === "custom")
139
+ return "custom";
140
+ if (role === "system")
141
+ return "system";
142
+ return undefined;
143
+ }
144
+ /** Extract a message's *full* (untruncated) parts; projection happens later. */
145
+ function fullPartsOf(message, role) {
146
+ if (role === "tool")
147
+ return toolResultParts(message);
148
+ const content = getProperty(message, "content");
149
+ if (typeof content === "string")
150
+ return content === "" ? [] : [{ kind: "text", text: content }];
151
+ if (!Array.isArray(content))
152
+ return [];
153
+ return content.flatMap(contentPart);
154
+ }
155
+ function toolResultParts(message) {
156
+ const text = stringifyContent(getProperty(message, "content")) || (getString(message, "text") ?? "");
157
+ const toolName = getString(message, "toolName");
158
+ const isError = getProperty(message, "isError") === true;
159
+ return [{ kind: "tool_result", ...(toolName === undefined ? {} : { toolName }), text, isError }];
160
+ }
161
+ function contentPart(part) {
162
+ const type = getString(part, "type");
163
+ if (type === "text") {
164
+ const text = getString(part, "text") ?? "";
165
+ return text === "" ? [] : [{ kind: "text", text }];
166
+ }
167
+ if (type === "thinking") {
168
+ const text = getString(part, "thinking") ?? getString(part, "text") ?? "";
169
+ return text === "" ? [] : [{ kind: "thinking", text }];
170
+ }
171
+ if (type === "toolCall") {
172
+ const toolName = getString(part, "name") ?? "tool";
173
+ const args = getProperty(part, "arguments");
174
+ return [{ kind: "tool_call", toolName, ...(args === undefined ? {} : { args }) }];
175
+ }
176
+ if (type === "image")
177
+ return [{ kind: "image" }];
178
+ return [];
179
+ }
180
+ /** Compact one-line description of tool arguments (mirrors the UI's summary). */
181
+ function summarizeToolArgs(args) {
182
+ if (!isRecord(args))
183
+ return typeof args === "string" ? args : "";
184
+ const command = getString(args, "command");
185
+ if (command !== undefined)
186
+ return command;
187
+ const path = getString(args, "path");
188
+ if (path !== undefined)
189
+ return path;
190
+ if (typeof args["oldText"] === "string" && typeof args["newText"] === "string")
191
+ return "edit text replacement";
192
+ const edits = args["edits"];
193
+ if (Array.isArray(edits))
194
+ return `${String(edits.length)} edit${edits.length === 1 ? "" : "s"}`;
195
+ const entries = Object.entries(args).filter(([, value]) => value != null).slice(0, 3);
196
+ return entries.map(([key, value]) => `${key}: ${shortValue(value)}`).join(" · ");
197
+ }
198
+ function shortValue(value) {
199
+ if (typeof value === "string")
200
+ return value.length > 80 ? `${value.slice(0, 77)}…` : value;
201
+ if (typeof value === "number" || typeof value === "boolean")
202
+ return String(value);
203
+ if (Array.isArray(value))
204
+ return `${String(value.length)} item${value.length === 1 ? "" : "s"}`;
205
+ if (typeof value === "object" && value !== null)
206
+ return "object";
207
+ return "";
208
+ }
209
+ function stringifyContent(content) {
210
+ if (typeof content === "string")
211
+ return content;
212
+ if (Array.isArray(content)) {
213
+ return content
214
+ .map((part) => (getString(part, "type") === "image" ? "[image]" : getString(part, "text") ?? ""))
215
+ .filter((text) => text !== "")
216
+ .join("\n");
217
+ }
218
+ return "";
219
+ }
220
+ function clampInteger(value, min, max) {
221
+ if (!Number.isFinite(value))
222
+ return max;
223
+ return Math.max(min, Math.min(max, Math.floor(value)));
224
+ }
225
+ function isRecord(value) {
226
+ return typeof value === "object" && value !== null;
227
+ }
228
+ function getProperty(value, key) {
229
+ return isRecord(value) ? value[key] : undefined;
230
+ }
231
+ function getString(value, key) {
232
+ const property = getProperty(value, key);
233
+ return typeof property === "string" ? property : undefined;
234
+ }
235
+ //# sourceMappingURL=subsessionTranscript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsessionTranscript.js","sourceRoot":"","sources":["../../../src/server/sessions/subsessionTranscript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Serves the same snapshot the realtime socket delivers, for the browser's
3
+ * explicit refresh paths and for the federated HTTP route.
4
+ */
5
+ export function registerMachineStatusRoutes(app, status, prefix = "") {
6
+ app.get(`${prefix}/status`, () => status.snapshot());
7
+ }
8
+ //# sourceMappingURL=machineStatusRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineStatusRoutes.js","sourceRoot":"","sources":["../../../src/server/status/machineStatusRoutes.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAoB,EAAE,MAAiC,EAAE,MAAM,GAAG,EAAE;IAC9G,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC"}