@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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cli.js +1149 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/apple-touch-icon.png +0 -0
- package/dist/client/assets/CodeViewer-D_Q6ljLV.js +4 -0
- package/dist/client/assets/TerminalPanel-CTGixJIz.js +187 -0
- package/dist/client/assets/index-C2phil_t.js +5637 -0
- package/dist/client/assets/vendor-editor-core-CXO8gGab.js +12 -0
- package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +46 -0
- package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
- package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
- package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
- package/dist/client/favicon.svg +11 -0
- package/dist/client/index.html +124 -0
- package/dist/client/manifest.webmanifest +24 -0
- package/dist/client/pwa-icon-192.png +0 -0
- package/dist/client/pwa-icon-512.png +0 -0
- package/dist/config.js +505 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/piWebDockerCommandPlan.js +212 -0
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
- package/dist/environment.js +4 -0
- package/dist/environment.js.map +1 -0
- package/dist/nativeServices/installedServiceDefinitions.js +602 -0
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
- package/dist/nativeServices/serviceAction.js +174 -0
- package/dist/nativeServices/serviceAction.js.map +1 -0
- package/dist/nativeServices/serviceDoctor.js +783 -0
- package/dist/nativeServices/serviceDoctor.js.map +1 -0
- package/dist/nativeServices/serviceInstall.js +35 -0
- package/dist/nativeServices/serviceInstall.js.map +1 -0
- package/dist/nativeServices/servicePlan.js +358 -0
- package/dist/nativeServices/servicePlan.js.map +1 -0
- package/dist/nativeServices/serviceProbe.js +447 -0
- package/dist/nativeServices/serviceProbe.js.map +1 -0
- package/dist/nativeServices/serviceRendering.js +132 -0
- package/dist/nativeServices/serviceRendering.js.map +1 -0
- package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
- package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
- package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
- package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
- package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
- package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
- package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
- package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
- package/dist/pi-web-plugins/git/git-backend.js +439 -0
- package/dist/pi-web-plugins/git/package.json +16 -0
- package/dist/pi-web-plugins/git/server-plugin.js +176 -0
- package/dist/pi-web-plugins/info/infoInternals.js +222 -0
- package/dist/pi-web-plugins/info/package.json +9 -0
- package/dist/pi-web-plugins/info/pi-web-plugin.js +48 -0
- package/dist/pi-web-plugins/relays/markdownDocument.js +81 -0
- package/dist/pi-web-plugins/relays/package.json +9 -0
- package/dist/pi-web-plugins/relays/pi-web-plugin.js +44 -0
- package/dist/pi-web-plugins/relays/relayDiscovery.js +228 -0
- package/dist/pi-web-plugins/relays/relaysPanelElement.js +550 -0
- package/dist/pi-web-plugins/relays/vendor/README.md +24 -0
- package/dist/pi-web-plugins/relays/vendor/marked.esm.js +76 -0
- package/dist/pi-web-plugins/updates/package.json +9 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +185 -0
- package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/pi-web-plugins/workspace-tasks/config.js +91 -0
- package/dist/pi-web-plugins/workspace-tasks/package.json +9 -0
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +48 -0
- package/dist/pi-web-plugins/workspace-tasks/taskRunner.js +12 -0
- package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +288 -0
- package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
- package/dist/piWebVersionReport.js +278 -0
- package/dist/piWebVersionReport.js.map +1 -0
- package/dist/plugin-api.d.ts +222 -0
- package/dist/pluginRecoveryCli.js +172 -0
- package/dist/pluginRecoveryCli.js.map +1 -0
- package/dist/server/activeAgentProfileProvider.js +25 -0
- package/dist/server/activeAgentProfileProvider.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +106 -0
- package/dist/server/activity/workspaceActivityService.js.map +1 -0
- package/dist/server/app.js +218 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/browserMessageProjection.js +54 -0
- package/dist/server/browserMessageProjection.js.map +1 -0
- package/dist/server/configRoutes.js +293 -0
- package/dist/server/configRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
- package/dist/server/git/gitEnv.js +15 -0
- package/dist/server/git/gitEnv.js.map +1 -0
- package/dist/server/goals/goalArchive.js +184 -0
- package/dist/server/goals/goalArchive.js.map +1 -0
- package/dist/server/goals/goalFile.js +200 -0
- package/dist/server/goals/goalFile.js.map +1 -0
- package/dist/server/goals/goalStore.js +65 -0
- package/dist/server/goals/goalStore.js.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/machines/machineClient.js +191 -0
- package/dist/server/machines/machineClient.js.map +1 -0
- package/dist/server/machines/machinePluginProxyRoutes.js +247 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +318 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineRoutes.js +56 -0
- package/dist/server/machines/machineRoutes.js.map +1 -0
- package/dist/server/machines/machineService.js +274 -0
- package/dist/server/machines/machineService.js.map +1 -0
- package/dist/server/machines/machineStore.js +143 -0
- package/dist/server/machines/machineStore.js.map +1 -0
- package/dist/server/piPackageRoutes.js +91 -0
- package/dist/server/piPackageRoutes.js.map +1 -0
- package/dist/server/piPackageService.js +101 -0
- package/dist/server/piPackageService.js.map +1 -0
- package/dist/server/piWebPluginCatalog.js +584 -0
- package/dist/server/piWebPluginCatalog.js.map +1 -0
- package/dist/server/piWebPluginLifecycle.js +162 -0
- package/dist/server/piWebPluginLifecycle.js.map +1 -0
- package/dist/server/piWebPluginService.js +224 -0
- package/dist/server/piWebPluginService.js.map +1 -0
- package/dist/server/piWebReleaseLookupCache.js +37 -0
- package/dist/server/piWebReleaseLookupCache.js.map +1 -0
- package/dist/server/piWebStatus.js +624 -0
- package/dist/server/piWebStatus.js.map +1 -0
- package/dist/server/piWebStatusCache.js +45 -0
- package/dist/server/piWebStatusCache.js.map +1 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js +69 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
- package/dist/server/plugins/serverPluginExec.js +184 -0
- package/dist/server/plugins/serverPluginExec.js.map +1 -0
- package/dist/server/plugins/serverPluginRuntime.js +480 -0
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
- package/dist/server/projectTrustRoutes.js +80 -0
- package/dist/server/projectTrustRoutes.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +207 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +33 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +93 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/requestCancellation.js +32 -0
- package/dist/server/requestCancellation.js.map +1 -0
- package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
- package/dist/server/sessiond/agentProcessEnvironment.js +61 -0
- package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +64 -0
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js +31 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +61 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js +34 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -0
- package/dist/server/sessiond/sessiondStateOwnership.js +235 -0
- package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js +31 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js +41 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
- package/dist/server/sessiond.js +387 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/askUserTool.js +102 -0
- package/dist/server/sessions/askUserTool.js.map +1 -0
- package/dist/server/sessions/attachmentService.js +119 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/authProviderOptions.js +50 -0
- package/dist/server/sessions/authProviderOptions.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +59 -0
- package/dist/server/sessions/authRoutes.js.map +1 -0
- package/dist/server/sessions/authService.js +122 -0
- package/dist/server/sessions/authService.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +27 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js +254 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/editPreview.js +196 -0
- package/dist/server/sessions/editPreview.js.map +1 -0
- package/dist/server/sessions/extensionDialogWaiters.js +76 -0
- package/dist/server/sessions/extensionDialogWaiters.js.map +1 -0
- package/dist/server/sessions/globalProviderPolicy.js +167 -0
- package/dist/server/sessions/globalProviderPolicy.js.map +1 -0
- package/dist/server/sessions/interruptedRunStore.js +147 -0
- package/dist/server/sessions/interruptedRunStore.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +43 -0
- package/dist/server/sessions/messagePaging.js.map +1 -0
- package/dist/server/sessions/modelCatalogRefresher.js +193 -0
- package/dist/server/sessions/modelCatalogRefresher.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +346 -0
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
- package/dist/server/sessions/pendingAskStore.js +275 -0
- package/dist/server/sessions/pendingAskStore.js.map +1 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js +196 -0
- package/dist/server/sessions/pendingExtensionDialogStore.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +246 -0
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +4059 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/plainTextTheme.js +112 -0
- package/dist/server/sessions/plainTextTheme.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +273 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionArchiveTree.js +35 -0
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
- package/dist/server/sessions/sessionCleanup.js +157 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +336 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/sessionFileFormat.js +27 -0
- package/dist/server/sessions/sessionFileFormat.js.map +1 -0
- package/dist/server/sessions/sessionFileHeader.js +104 -0
- package/dist/server/sessions/sessionFileHeader.js.map +1 -0
- package/dist/server/sessions/sessionModelScope.js +141 -0
- package/dist/server/sessions/sessionModelScope.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +90 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionNotificationStore.js +484 -0
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +744 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/sessions/sessionService.js +2 -0
- package/dist/server/sessions/sessionService.js.map +1 -0
- package/dist/server/sessions/sessionSummaryScanner.js +491 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
- package/dist/server/sessions/sessionTreeProjection.js +250 -0
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
- package/dist/server/sessions/sessionUnreadStore.js +520 -0
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
- package/dist/server/sessions/shutdownDrain.js +73 -0
- package/dist/server/sessions/shutdownDrain.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +48 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +216 -0
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +23 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/server/sessions/subsessionTranscript.js +235 -0
- package/dist/server/sessions/subsessionTranscript.js.map +1 -0
- package/dist/server/status/machineStatusRoutes.js +8 -0
- package/dist/server/status/machineStatusRoutes.js.map +1 -0
- package/dist/server/status/machineStatusService.js +181 -0
- package/dist/server/status/machineStatusService.js.map +1 -0
- package/dist/server/status/workspaceAttribution.js +87 -0
- package/dist/server/status/workspaceAttribution.js.map +1 -0
- package/dist/server/storage/projectStore.js +88 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +141 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +155 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +305 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/terminals/terminalSize.js +17 -0
- package/dist/server/terminals/terminalSize.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/updates/fleetRoutes.js +111 -0
- package/dist/server/updates/fleetRoutes.js.map +1 -0
- package/dist/server/updates/restartRoutes.js +48 -0
- package/dist/server/updates/restartRoutes.js.map +1 -0
- package/dist/server/updates/selfUpdateRoutes.js +145 -0
- package/dist/server/updates/selfUpdateRoutes.js.map +1 -0
- package/dist/server/webSocketBridge.js +32 -0
- package/dist/server/webSocketBridge.js.map +1 -0
- package/dist/server/workingDirectory.js +44 -0
- package/dist/server/workingDirectory.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +147 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +8 -0
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +190 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
- package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
- package/dist/server/workspaces/filePreviewService.js +81 -0
- package/dist/server/workspaces/filePreviewService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +520 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +35 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +90 -0
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +45 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/projectPiWebConfig.js +61 -0
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js +17 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +402 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceCatalog.js +47 -0
- package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +6 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +49 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js +651 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
- package/dist/server/workspaces/workspaceRemovalService.js +256 -0
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
- package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
- package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
- package/dist/server-plugin-api.d.ts +140 -0
- package/dist/server-plugin-api.js +2 -0
- package/dist/server-plugin-api.js.map +1 -0
- package/dist/serverPluginRecovery.js +138 -0
- package/dist/serverPluginRecovery.js.map +1 -0
- package/dist/sessiond/activeAgentProfile.js +12 -0
- package/dist/sessiond/activeAgentProfile.js.map +1 -0
- package/dist/sessiond/config.js +20 -0
- package/dist/sessiond/config.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +105 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/shared/activeAgentProfile.js +37 -0
- package/dist/shared/activeAgentProfile.js.map +1 -0
- package/dist/shared/activity.js +16 -0
- package/dist/shared/activity.js.map +1 -0
- package/dist/shared/apiTypes.js +41 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/dist/shared/capabilities.js +37 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/federatedRoutes.js +127 -0
- package/dist/shared/federatedRoutes.js.map +1 -0
- package/dist/shared/machinePluginIds.js +43 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/machineStatus.js +94 -0
- package/dist/shared/machineStatus.js.map +1 -0
- package/dist/shared/piWebStatusParsing.js +141 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -0
- package/dist/shared/pluginApiTypes.d.ts +150 -0
- package/dist/shared/pluginApiTypes.js +3 -0
- package/dist/shared/pluginApiTypes.js.map +1 -0
- package/dist/shared/pluginBackendProtocol.js +110 -0
- package/dist/shared/pluginBackendProtocol.js.map +1 -0
- package/dist/shared/pluginIds.js +10 -0
- package/dist/shared/pluginIds.js.map +1 -0
- package/dist/shared/pluginRecoveryCommands.js +14 -0
- package/dist/shared/pluginRecoveryCommands.js.map +1 -0
- package/dist/shared/promptAttachments.js +92 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/selfUpdate.js +3 -0
- package/dist/shared/selfUpdate.js.map +1 -0
- package/dist/shared/thinkingLevels.js +31 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/dist/shared/workspaceFiles.js +42 -0
- package/dist/shared/workspaceFiles.js.map +1 -0
- package/dist/shared/workspaceRemovalProtocol.js +24 -0
- package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
- package/docs/assets/favicon.svg +11 -0
- package/docs/assets/pi-web-banner.png +0 -0
- package/docs/assets/pi-web-desktop.png +0 -0
- package/docs/assets/pi-web-mobile.png +0 -0
- package/docs/assets/pi-web-tablet.png +0 -0
- package/docs/config.md +444 -0
- package/docs/plugins.md +1305 -0
- package/examples/workspace-provider-plugin/README.md +52 -0
- package/examples/workspace-provider-plugin/package.json +25 -0
- package/examples/workspace-provider-plugin/src/browser/index.ts +69 -0
- package/examples/workspace-provider-plugin/src/server.ts +64 -0
- package/examples/workspace-provider-plugin/tsconfig.json +21 -0
- package/extensions/README-pi-web-restart-migration.md +45 -0
- package/extensions/pi-web.ts +324 -0
- package/install.sh +5 -0
- package/package.json +173 -0
- package/plugin-api.d.ts +1 -0
- package/server-plugin-api.d.ts +1 -0
|
@@ -0,0 +1,336 @@
|
|
|
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
|
+
return this.forkEntry(sessionId, value);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Forks the session from a specific tree entry into a new session file, leaving
|
|
55
|
+
* the original session untouched. Shared by the `/fork` select response and the
|
|
56
|
+
* session-tree fork-from-entry path. User entries fork from "before" so their
|
|
57
|
+
* text returns as a prompt draft; every other entry forks "at" so the forked
|
|
58
|
+
* file includes it.
|
|
59
|
+
*/
|
|
60
|
+
async forkEntry(sessionId, entryId, options) {
|
|
61
|
+
const active = await this.getActive(sessionId);
|
|
62
|
+
if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
|
|
63
|
+
return treeNavigationActiveUnsupported();
|
|
64
|
+
if (this.hasActiveWork(active.runtime.session))
|
|
65
|
+
return forkActiveUnsupported("fork");
|
|
66
|
+
const relatedName = await this.nextRelatedSessionName(active, "fork");
|
|
67
|
+
if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
|
|
68
|
+
return treeNavigationActiveUnsupported();
|
|
69
|
+
if (this.hasActiveWork(active.runtime.session))
|
|
70
|
+
return forkActiveUnsupported("fork");
|
|
71
|
+
const result = await this.runSessionReplacement(active.runtime, async () => {
|
|
72
|
+
const session = active.runtime.session;
|
|
73
|
+
if (options !== undefined && session.sessionManager.getLeafId() !== options.expectedLeafId) {
|
|
74
|
+
throw new Error("The session changed since /tree was opened. Reopen /tree and try again.");
|
|
75
|
+
}
|
|
76
|
+
// Resolve the entry kind from the session state protected by the same
|
|
77
|
+
// replacement boundary as the fork, not Pi's text-only /fork selector.
|
|
78
|
+
const position = this.forkPosition(session, entryId);
|
|
79
|
+
const forkResult = await active.runtime.fork(entryId, { position });
|
|
80
|
+
if (!forkResult.cancelled)
|
|
81
|
+
this.tryNameRelatedSession(active.runtime.session, relatedName);
|
|
82
|
+
return forkResult;
|
|
83
|
+
});
|
|
84
|
+
if (result.cancelled)
|
|
85
|
+
return { type: "done", message: "Fork cancelled" };
|
|
86
|
+
return { type: "done", message: "Session forked", session: clientSessionFromRuntime(active.runtime), ...promptDraft(result.selectedText) };
|
|
87
|
+
}
|
|
88
|
+
nameSession(active, name) {
|
|
89
|
+
if (name === "")
|
|
90
|
+
return { type: "unsupported", message: "Usage: /name <session name>" };
|
|
91
|
+
active.runtime.session.setSessionName(name);
|
|
92
|
+
this.publishSessionName(active.runtime.session);
|
|
93
|
+
return { type: "done", message: `Session named: ${name}`, session: clientSessionFromRuntime(active.runtime) };
|
|
94
|
+
}
|
|
95
|
+
compact(session, instructions) {
|
|
96
|
+
this.lifecycle.onCompactionStart?.(session);
|
|
97
|
+
void session.compact(instructions === "" ? undefined : instructions)
|
|
98
|
+
.then((result) => {
|
|
99
|
+
this.events.publish(session.sessionId, {
|
|
100
|
+
type: "command.output",
|
|
101
|
+
level: "success",
|
|
102
|
+
message: formatCompactionResult(result),
|
|
103
|
+
});
|
|
104
|
+
this.lifecycle.onCompactionEnd?.(session, "success");
|
|
105
|
+
})
|
|
106
|
+
.catch((error) => {
|
|
107
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
108
|
+
this.events.publish(session.sessionId, { type: "command.output", level: "error", message: `Compaction failed: ${message}` });
|
|
109
|
+
this.events.publish(session.sessionId, { type: "session.error", message });
|
|
110
|
+
this.lifecycle.onCompactionEnd?.(session, "error", message);
|
|
111
|
+
});
|
|
112
|
+
return { type: "done", message: "Compaction started…" };
|
|
113
|
+
}
|
|
114
|
+
async reload(session) {
|
|
115
|
+
if (this.hasActiveWork(session))
|
|
116
|
+
return { type: "unsupported", message: "Cannot reload while the session is active. Stop current activity before reloading." };
|
|
117
|
+
if (this.lifecycle.reloadSession === undefined)
|
|
118
|
+
return { type: "unsupported", message: "/reload is not available for this session runtime." };
|
|
119
|
+
try {
|
|
120
|
+
await this.lifecycle.reloadSession(session);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
124
|
+
return { type: "unsupported", message: `Reload failed: ${message}` };
|
|
125
|
+
}
|
|
126
|
+
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 WEB browser plugin changes." };
|
|
127
|
+
}
|
|
128
|
+
async clone(active) {
|
|
129
|
+
if (this.hasActiveWork(active.runtime.session))
|
|
130
|
+
return forkActiveUnsupported("clone");
|
|
131
|
+
const initialLeafId = active.runtime.session.sessionManager.getLeafId();
|
|
132
|
+
if (initialLeafId === null || initialLeafId === "")
|
|
133
|
+
return { type: "unsupported", message: "Cannot clone: no current session entry" };
|
|
134
|
+
const relatedName = await this.nextRelatedSessionName(active, "copy");
|
|
135
|
+
if (this.lifecycle.isTreeNavigationActive?.(active.runtime.session) === true)
|
|
136
|
+
return treeNavigationActiveUnsupported();
|
|
137
|
+
if (this.hasActiveWork(active.runtime.session))
|
|
138
|
+
return forkActiveUnsupported("clone");
|
|
139
|
+
// The active leaf may have changed while related-session names were loaded.
|
|
140
|
+
// Clone the position that is current when the serialized replacement begins.
|
|
141
|
+
const leafId = active.runtime.session.sessionManager.getLeafId();
|
|
142
|
+
if (leafId === null || leafId === "")
|
|
143
|
+
return { type: "unsupported", message: "Cannot clone: no current session entry" };
|
|
144
|
+
const result = await this.runSessionReplacement(active.runtime, async () => {
|
|
145
|
+
const cloneResult = await active.runtime.fork(leafId, { position: "at" });
|
|
146
|
+
if (!cloneResult.cancelled)
|
|
147
|
+
this.tryNameRelatedSession(active.runtime.session, relatedName);
|
|
148
|
+
return cloneResult;
|
|
149
|
+
});
|
|
150
|
+
if (result.cancelled)
|
|
151
|
+
return { type: "done", message: "Clone cancelled" };
|
|
152
|
+
return { type: "done", message: "Session cloned", session: clientSessionFromRuntime(active.runtime) };
|
|
153
|
+
}
|
|
154
|
+
fork(active) {
|
|
155
|
+
if (this.hasActiveWork(active.runtime.session))
|
|
156
|
+
return forkActiveUnsupported("fork");
|
|
157
|
+
const messages = active.runtime.session.getUserMessagesForForking();
|
|
158
|
+
if (!messages.length)
|
|
159
|
+
return { type: "unsupported", message: "No user messages to fork from" };
|
|
160
|
+
const requestId = crypto.randomUUID();
|
|
161
|
+
this.pendingSelects.set(requestId, { sessionId: active.runtime.session.sessionId, command: "fork" });
|
|
162
|
+
return {
|
|
163
|
+
type: "select",
|
|
164
|
+
requestId,
|
|
165
|
+
title: "Fork from message",
|
|
166
|
+
options: [...messages].reverse().map((message) => ({ value: message.entryId, label: truncate(message.text, 140) })),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
tree(session) {
|
|
170
|
+
if (this.hasActiveWork(session)) {
|
|
171
|
+
return { type: "unsupported", message: "Cannot open the session tree while the session is active. Stop current activity and try /tree again." };
|
|
172
|
+
}
|
|
173
|
+
if (this.lifecycle.getSessionTree === undefined)
|
|
174
|
+
return treeUnavailableUnsupported();
|
|
175
|
+
try {
|
|
176
|
+
const tree = this.lifecycle.getSessionTree(session);
|
|
177
|
+
if (tree === undefined)
|
|
178
|
+
return treeUnavailableUnsupported();
|
|
179
|
+
if (tree.nodes.length === 0)
|
|
180
|
+
return { type: "unsupported", message: "Cannot navigate an empty session tree." };
|
|
181
|
+
return { type: "tree", tree };
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
185
|
+
return { type: "unsupported", message: `Unable to open the session tree: ${message}` };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
hasActiveWork(session) {
|
|
189
|
+
return sessionHasActiveWork(session) || this.lifecycle.hasActiveWork?.(session) === true;
|
|
190
|
+
}
|
|
191
|
+
forkPosition(session, entryId) {
|
|
192
|
+
const treeNode = this.lifecycle.getSessionTree?.(session)?.nodes.find((node) => node.id === entryId);
|
|
193
|
+
if (treeNode !== undefined)
|
|
194
|
+
return treeNode.kind === "user" ? "before" : "at";
|
|
195
|
+
return session.getUserMessagesForForking().some((message) => message.entryId === entryId) ? "before" : "at";
|
|
196
|
+
}
|
|
197
|
+
runSessionReplacement(runtime, operation) {
|
|
198
|
+
const runReplacement = this.lifecycle.runSessionReplacement;
|
|
199
|
+
return runReplacement === undefined ? operation() : runReplacement(runtime.session, operation);
|
|
200
|
+
}
|
|
201
|
+
async nextRelatedSessionName(active, kind) {
|
|
202
|
+
const sourceTitle = relatedSessionSourceTitle(active.runtime.session);
|
|
203
|
+
const sourceName = normalizedName(active.runtime.session.sessionName);
|
|
204
|
+
let existingNames;
|
|
205
|
+
try {
|
|
206
|
+
existingNames = await this.naming.listSessionNames?.(active.runtime.cwd) ?? [];
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
existingNames = [];
|
|
210
|
+
}
|
|
211
|
+
return uniqueRelatedSessionName(sourceTitle, kind, sourceName === undefined ? existingNames : [...existingNames, sourceName]);
|
|
212
|
+
}
|
|
213
|
+
tryNameRelatedSession(session, name) {
|
|
214
|
+
try {
|
|
215
|
+
session.setSessionName(name);
|
|
216
|
+
this.publishSessionName(session);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
220
|
+
this.events.publish(session.sessionId, { type: "command.output", level: "error", message: `Session created, but naming failed: ${message}` });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
publishSessionName(session) {
|
|
224
|
+
const event = session.sessionName === undefined
|
|
225
|
+
? { type: "session.name", sessionId: session.sessionId }
|
|
226
|
+
: { type: "session.name", sessionId: session.sessionId, name: session.sessionName };
|
|
227
|
+
this.events.publish(session.sessionId, event);
|
|
228
|
+
this.events.publishGlobal?.(event);
|
|
229
|
+
}
|
|
230
|
+
isRuntimeCommand(session, name) {
|
|
231
|
+
return session.extensionRunner.getRegisteredCommands().some((command) => command.invocationName === name)
|
|
232
|
+
|| session.promptTemplates.some((template) => template.name === name)
|
|
233
|
+
|| session.resourceLoader.getSkills().skills.some((skill) => `skill:${skill.name}` === name);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function clientSessionFromRuntime(runtime) {
|
|
237
|
+
const session = runtime.session;
|
|
238
|
+
const parentSessionPath = typeof session.sessionManager.getHeader === "function" ? session.sessionManager.getHeader()?.parentSession : undefined;
|
|
239
|
+
return {
|
|
240
|
+
id: session.sessionId,
|
|
241
|
+
path: session.sessionFile ?? "",
|
|
242
|
+
cwd: runtime.cwd,
|
|
243
|
+
...(session.sessionName === undefined ? {} : { name: session.sessionName }),
|
|
244
|
+
created: new Date().toISOString(),
|
|
245
|
+
modified: new Date().toISOString(),
|
|
246
|
+
messageCount: session.messages.length,
|
|
247
|
+
firstMessage: "",
|
|
248
|
+
...(parentSessionPath === undefined ? {} : { parentSessionPath }),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function relatedSessionSourceTitle(session) {
|
|
252
|
+
const name = normalizedName(session.sessionName);
|
|
253
|
+
if (name !== undefined)
|
|
254
|
+
return name;
|
|
255
|
+
for (const message of session.messages) {
|
|
256
|
+
const text = normalizedName(extractUserMessageText(message));
|
|
257
|
+
if (text !== undefined)
|
|
258
|
+
return truncate(text, 80);
|
|
259
|
+
}
|
|
260
|
+
return "Untitled session";
|
|
261
|
+
}
|
|
262
|
+
function uniqueRelatedSessionName(sourceTitle, kind, existingNames) {
|
|
263
|
+
const baseName = stripRelatedSessionSuffix(sourceTitle) || "Untitled session";
|
|
264
|
+
const label = kind === "fork" ? "Fork" : "Copy";
|
|
265
|
+
const usedNames = new Set(existingNames.map(normalizedName).filter(isDefined));
|
|
266
|
+
for (let counter = 1;; counter += 1) {
|
|
267
|
+
const candidate = `${baseName} — ${label} ${String(counter)}`;
|
|
268
|
+
if (!usedNames.has(candidate))
|
|
269
|
+
return candidate;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function stripRelatedSessionSuffix(name) {
|
|
273
|
+
return name.replace(/\s+(?:—|-)\s+(?:Fork|Copy|Clone)\s+\d+$/u, "").trim();
|
|
274
|
+
}
|
|
275
|
+
function extractUserMessageText(message) {
|
|
276
|
+
if (!isRecord(message) || message["role"] !== "user")
|
|
277
|
+
return undefined;
|
|
278
|
+
const content = message["content"];
|
|
279
|
+
if (typeof content === "string")
|
|
280
|
+
return content;
|
|
281
|
+
if (!Array.isArray(content))
|
|
282
|
+
return undefined;
|
|
283
|
+
return content.map((part) => {
|
|
284
|
+
if (!isRecord(part) || part["type"] !== "text")
|
|
285
|
+
return "";
|
|
286
|
+
return typeof part["text"] === "string" ? part["text"] : "";
|
|
287
|
+
}).join("");
|
|
288
|
+
}
|
|
289
|
+
function normalizedName(name) {
|
|
290
|
+
const trimmed = name?.replace(/\s+/g, " ").trim();
|
|
291
|
+
return trimmed === undefined || trimmed === "" ? undefined : trimmed;
|
|
292
|
+
}
|
|
293
|
+
function isRecord(value) {
|
|
294
|
+
return typeof value === "object" && value !== null;
|
|
295
|
+
}
|
|
296
|
+
function isDefined(value) {
|
|
297
|
+
return value !== undefined;
|
|
298
|
+
}
|
|
299
|
+
function sessionHasActiveWork(session) {
|
|
300
|
+
return session.isStreaming || session.isBashRunning || session.isCompacting || session.pendingMessageCount > 0;
|
|
301
|
+
}
|
|
302
|
+
function forkActiveUnsupported(command) {
|
|
303
|
+
return { type: "unsupported", message: `Cannot ${command} while the session is active. Stop current activity before ${command === "fork" ? "forking" : "cloning"}.` };
|
|
304
|
+
}
|
|
305
|
+
function treeUnavailableUnsupported() {
|
|
306
|
+
return { type: "unsupported", message: "Session tree navigation is not available with this Pi runtime." };
|
|
307
|
+
}
|
|
308
|
+
function treeNavigationActiveUnsupported() {
|
|
309
|
+
return { type: "unsupported", message: "Cannot run commands while session tree navigation is active. Stop or finish the navigation first." };
|
|
310
|
+
}
|
|
311
|
+
function promptDraft(text) {
|
|
312
|
+
return text === undefined ? {} : { promptDraft: text };
|
|
313
|
+
}
|
|
314
|
+
function formatSessionStats(session) {
|
|
315
|
+
const stats = session.getSessionStats();
|
|
316
|
+
return [
|
|
317
|
+
`Session: ${stats.sessionId}`,
|
|
318
|
+
`Messages: ${String(stats.totalMessages)} (${String(stats.userMessages)} user, ${String(stats.assistantMessages)} assistant)`,
|
|
319
|
+
`Tool calls: ${String(stats.toolCalls)}`,
|
|
320
|
+
`Tokens: ↑${String(stats.tokens.input)} ↓${String(stats.tokens.output)} total ${String(stats.tokens.total)}`,
|
|
321
|
+
`Cost: $${stats.cost.toFixed(4)}`,
|
|
322
|
+
].join("\n");
|
|
323
|
+
}
|
|
324
|
+
function formatCompactionResult(result) {
|
|
325
|
+
return [
|
|
326
|
+
"Compaction complete.",
|
|
327
|
+
`Tokens before: ${String(result.tokensBefore)}`,
|
|
328
|
+
"",
|
|
329
|
+
result.summary,
|
|
330
|
+
].join("\n");
|
|
331
|
+
}
|
|
332
|
+
function truncate(text, maxLength) {
|
|
333
|
+
const singleLine = text.replace(/\s+/g, " ").trim();
|
|
334
|
+
return singleLine.length <= maxLength ? singleLine : `${singleLine.slice(0, maxLength - 1)}…`;
|
|
335
|
+
}
|
|
336
|
+
//# 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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session environment facts appended to every session's system prompt.
|
|
3
|
+
*
|
|
4
|
+
* Sessions run inside the session daemon, and everything an agent spawns —
|
|
5
|
+
* the bash tool, terminals, subsessions — inherits the daemon's environment.
|
|
6
|
+
* That inheritance is deliberate: `PI_WEB_SESSION=1` marks every spawned
|
|
7
|
+
* process as nested inside this pi-web instance, the daemon's `PI_WEB_*`
|
|
8
|
+
* wiring stays visible, and a second pi-web instance started with those
|
|
9
|
+
* inherited values fails loudly at startup because the live instance owns the
|
|
10
|
+
* state (see `sessiondStateOwnership`).
|
|
11
|
+
*
|
|
12
|
+
* The block tells the agent the nesting exists and which precautions follow,
|
|
13
|
+
* so it learns the rules before discovering them by breaking its own session:
|
|
14
|
+
* use a distinct data dir, socket, and ports for another instance; never
|
|
15
|
+
* restart the session daemon hosting the session; and restart the web/API
|
|
16
|
+
* process before the session daemon when restarts are needed.
|
|
17
|
+
*/
|
|
18
|
+
import { piWebDataDir } from "../../config.js";
|
|
19
|
+
import { sessiondEndpointDescription } from "../../sessiond/config.js";
|
|
20
|
+
/** Agent-visible marker set by the session daemon: the process runs inside a pi-web session. */
|
|
21
|
+
export const PI_WEB_SESSION_ENV = "PI_WEB_SESSION";
|
|
22
|
+
/** Build the session environment facts block. */
|
|
23
|
+
export function sessionEnvironmentFacts({ env }) {
|
|
24
|
+
const facts = [
|
|
25
|
+
`This session runs inside a PI WEB session daemon. Every process spawned from it — the bash tool, terminals, subsessions — inherits \`${PI_WEB_SESSION_ENV}=1\`, marking it as nested inside this PI WEB instance.`,
|
|
26
|
+
`The hosting instance owns the data directory \`${piWebDataDir(env)}\` and its session daemon listens on \`${sessiondEndpointDescription(env)}\`. Spawned processes inherit the daemon's \`PI_WEB_*\` environment, which points at that same live instance.`,
|
|
27
|
+
"Starting another PI WEB instance with those inherited values fails loudly at startup because the live instance owns the state. To run a second instance, give it a distinct `PI_WEB_DATA_DIR`, `PI_WEB_SESSIOND_SOCKET` (or `PI_WEB_SESSIOND_PORT` / `PI_WEB_SESSIOND_HOST`), and `PI_WEB_PORT`.",
|
|
28
|
+
"Never restart or stop the session daemon hosting this session: it owns the terminals and the session runtime, so restarting it kills this session's own work. When PI WEB services must be restarted, restart the web/API process before the session daemon.",
|
|
29
|
+
];
|
|
30
|
+
return [
|
|
31
|
+
"<pi_web_session_environment>",
|
|
32
|
+
"Facts about the PI WEB session this agent runs in:",
|
|
33
|
+
...facts.map((fact) => `- ${fact}`),
|
|
34
|
+
"</pi_web_session_environment>",
|
|
35
|
+
].join("\n");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the system-prompt sections for session environment facts.
|
|
39
|
+
*
|
|
40
|
+
* Sessions are always nested in the daemon, so the facts apply to every
|
|
41
|
+
* deployment; only the operator switch turns them off.
|
|
42
|
+
*/
|
|
43
|
+
export function sessionEnvironmentPromptSections({ env, enabled }) {
|
|
44
|
+
if (!enabled)
|
|
45
|
+
return [];
|
|
46
|
+
return [sessionEnvironmentFacts({ env })];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=sessionEnvironmentFacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionEnvironmentFacts.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionEnvironmentFacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,gGAAgG;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAMnD,iDAAiD;AACjD,MAAM,UAAU,uBAAuB,CAAC,EAAE,GAAG,EAAgC;IAC3E,MAAM,KAAK,GAAG;QACZ,wIAAwI,kBAAkB,yDAAyD;QACnN,kDAAkD,YAAY,CAAC,GAAG,CAAC,0CAA0C,2BAA2B,CAAC,GAAG,CAAC,+GAA+G;QAC5P,kSAAkS;QAClS,8PAA8P;KAC/P,CAAC;IACF,OAAO;QACL,8BAA8B;QAC9B,oDAAoD;QACpD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,+BAA+B;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAmC;IAChG,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-level parsing shared by the two readers of Pi session files: the
|
|
3
|
+
* summary scanner and the header reader. Both follow the SDK's rule that a
|
|
4
|
+
* session file is a stream of JSON object entries, one per line, where an
|
|
5
|
+
* unparseable line is skipped rather than fatal.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The entry a session-file line carries, or undefined when the line is blank,
|
|
9
|
+
* not JSON, or not a JSON object. Scalars are not entries: the SDK's readers
|
|
10
|
+
* index into the parsed value, so only objects can be classified.
|
|
11
|
+
*/
|
|
12
|
+
export function tryParseEntry(line) {
|
|
13
|
+
if (line.trim() === "")
|
|
14
|
+
return undefined;
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(line);
|
|
17
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Whether `value` can be indexed by key, i.e. a non-null object. */
|
|
24
|
+
export function isRecord(value) {
|
|
25
|
+
return typeof value === "object" && value !== null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sessionFileFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionFileFormat.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionFileFormat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import { tryParseEntry } from "./sessionFileFormat.js";
|
|
3
|
+
/** Chunk size for streaming a session file's header region. */
|
|
4
|
+
const HEADER_READ_CHUNK_BYTES = 8192;
|
|
5
|
+
/**
|
|
6
|
+
* How far to look for the first parseable line. Headers are single-line and
|
|
7
|
+
* written at creation; the bound keeps a pathological file with a huge
|
|
8
|
+
* non-header prefix from dragging the listing and open paths.
|
|
9
|
+
*/
|
|
10
|
+
const HEADER_READ_CAP_BYTES = 262144;
|
|
11
|
+
const NEWLINE = 0x0a; // `\n`
|
|
12
|
+
const CARRIAGE_RETURN = 0x0d; // `\r`
|
|
13
|
+
/**
|
|
14
|
+
* Read a Pi session file's header without loading the whole transcript.
|
|
15
|
+
*
|
|
16
|
+
* Streams the file in chunks and stops at the first parseable line, mirroring
|
|
17
|
+
* the SDK rule the summary scanner follows: unparseable lines are skipped
|
|
18
|
+
* until one parses, and a parseable non-session entry disqualifies the file.
|
|
19
|
+
* The search is bounded to the header region; if no parseable line completes
|
|
20
|
+
* within the bound, the file is treated as headerless.
|
|
21
|
+
*
|
|
22
|
+
* Returns undefined for any unreadable file or file without a usable session
|
|
23
|
+
* header: callers use this to verify links between sessions, so an unusable
|
|
24
|
+
* header must behave the same as a missing one rather than throwing.
|
|
25
|
+
*/
|
|
26
|
+
export async function readSessionHeaderSummary(sessionFile) {
|
|
27
|
+
let file;
|
|
28
|
+
try {
|
|
29
|
+
file = await open(sessionFile, "r");
|
|
30
|
+
return await streamHeaderSummary(file);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await file?.close().catch(() => undefined);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function streamHeaderSummary(file) {
|
|
40
|
+
let pending = Buffer.alloc(0); // bytes of the current line, not yet newline-terminated
|
|
41
|
+
let position = 0;
|
|
42
|
+
for (;;) {
|
|
43
|
+
const chunk = Buffer.alloc(HEADER_READ_CHUNK_BYTES);
|
|
44
|
+
const { bytesRead } = await file.read(chunk, 0, chunk.length, position);
|
|
45
|
+
if (bytesRead === 0) {
|
|
46
|
+
// End of file: an unterminated tail is the final line (readline parity).
|
|
47
|
+
const outcome = classifyHeaderLine(pending);
|
|
48
|
+
return outcome === "skip" ? undefined : outcome;
|
|
49
|
+
}
|
|
50
|
+
position += bytesRead;
|
|
51
|
+
let chunkStart = 0;
|
|
52
|
+
for (;;) {
|
|
53
|
+
const newlineAt = chunk.indexOf(NEWLINE, chunkStart);
|
|
54
|
+
if (newlineAt === -1) {
|
|
55
|
+
pending = Buffer.concat([pending, chunk.subarray(chunkStart, bytesRead)]);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
const line = Buffer.concat([pending, chunk.subarray(chunkStart, newlineAt)]);
|
|
59
|
+
const outcome = classifyHeaderLine(line);
|
|
60
|
+
if (outcome !== "skip")
|
|
61
|
+
return outcome;
|
|
62
|
+
pending = Buffer.alloc(0);
|
|
63
|
+
chunkStart = newlineAt + 1;
|
|
64
|
+
}
|
|
65
|
+
// Bounded search: once the cap is consumed, leave the unterminated tail
|
|
66
|
+
// unclassified and report no header rather than reading without limit.
|
|
67
|
+
if (position >= HEADER_READ_CAP_BYTES)
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Classify one candidate line, mirroring the SDK's first-parseable-entry rule
|
|
73
|
+
* that the summary scanner applies: unparseable lines are skipped until one
|
|
74
|
+
* parses, and the first parseable line decides the file's fate. Returns
|
|
75
|
+
* "skip" to keep looking, undefined to reject, or the parsed header.
|
|
76
|
+
*/
|
|
77
|
+
function classifyHeaderLine(lineBytes) {
|
|
78
|
+
// Readline parity: a CRLF file yields lines without their trailing `\r`.
|
|
79
|
+
let end = lineBytes.length;
|
|
80
|
+
if (end > 0 && lineBytes[end - 1] === CARRIAGE_RETURN)
|
|
81
|
+
end -= 1;
|
|
82
|
+
const entry = tryParseEntry(lineBytes.toString("utf8", 0, end));
|
|
83
|
+
if (entry === undefined)
|
|
84
|
+
return "skip";
|
|
85
|
+
if (entry["type"] !== "session")
|
|
86
|
+
return undefined;
|
|
87
|
+
const id = entry["id"];
|
|
88
|
+
// The scanner skips headers without a usable id; the reader must agree so a
|
|
89
|
+
// link verified here can never point at an unusable session.
|
|
90
|
+
if (typeof id !== "string" || id === "")
|
|
91
|
+
return undefined;
|
|
92
|
+
const cwd = nonEmptyStringField(entry, "cwd");
|
|
93
|
+
const parentSession = nonEmptyStringField(entry, "parentSession");
|
|
94
|
+
return {
|
|
95
|
+
id,
|
|
96
|
+
...(cwd === undefined ? {} : { cwd }),
|
|
97
|
+
...(parentSession === undefined ? {} : { parentSession }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function nonEmptyStringField(header, key) {
|
|
101
|
+
const value = header[key];
|
|
102
|
+
return typeof value === "string" && value !== "" ? value : undefined;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=sessionFileHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionFileHeader.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionFileHeader.ts"],"names":[],"mappings":"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"}
|