@chainingintention/pi-web-cn 2.0.0 → 2.202610.0
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/README.md +61 -106
- package/dist/.plugins-ready +1 -0
- package/dist/cli.js +331 -174
- package/dist/cli.js.map +1 -1
- package/dist/client/apple-touch-icon-dev.png +0 -0
- package/dist/client/assets/PiWebApp-BXSziMEg.js +4921 -0
- package/dist/client/assets/classic-CyM97Akm.css +54 -0
- package/dist/client/assets/external-B9K8duyP.js +2 -0
- package/dist/client/assets/graphite-DquaqFXU.css +54 -0
- package/dist/client/assets/index-cdtUOfOW.js +2 -0
- package/dist/client/assets/paper-CB1oLuRr.css +54 -0
- package/dist/client/assets/pi-web-dark-D_KtbM95.css +54 -0
- package/dist/client/assets/pi-web-light-DSNLMIBI.css +54 -0
- package/dist/client/assets/vendor-editor-core-BfnHL1Dg.js +10 -0
- package/dist/client/assets/vendor-editor-languages-bNquDJP0.js +28 -0
- package/dist/client/favicon-dev.svg +8 -0
- package/dist/client/index.html +7 -51
- package/dist/client/manifest.webmanifest +2 -1
- package/dist/client/pwa-icon-dev-192.png +0 -0
- package/dist/client/pwa-icon-dev-512.png +0 -0
- package/dist/config.js +55 -8
- package/dist/config.js.map +1 -1
- package/dist/docker/piWebDockerCommandPlan.js +13 -4
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
- package/dist/environment.js +4 -0
- package/dist/environment.js.map +1 -0
- package/dist/localization.js +24 -0
- package/dist/localization.js.map +1 -0
- package/dist/nativeServices/installedServiceDefinitions.js +617 -0
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -0
- package/dist/nativeServices/serviceAction.js +78 -20
- package/dist/nativeServices/serviceAction.js.map +1 -1
- package/dist/nativeServices/serviceDoctor.js +418 -114
- package/dist/nativeServices/serviceDoctor.js.map +1 -1
- package/dist/nativeServices/servicePlan.js +2 -2
- package/dist/nativeServices/servicePlan.js.map +1 -1
- package/dist/pi-packages/captains-log/README.md +11 -0
- package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +29 -0
- package/dist/pi-packages/captains-log/dist/browser/index.js +143 -0
- package/dist/pi-packages/captains-log/dist/browser/markdown.js +68 -0
- package/dist/pi-packages/captains-log/dist/browser/panel.js +148 -0
- package/dist/pi-packages/captains-log/dist/browser/protocol.js +26 -0
- package/dist/pi-packages/captains-log/dist/companion.js +126 -0
- package/dist/pi-packages/captains-log/dist/roundtrip.js +62 -0
- package/dist/pi-packages/captains-log/dist/server.js +210 -0
- package/dist/pi-packages/captains-log/dist/store.js +75 -0
- package/dist/pi-packages/captains-log/docs/usage.md +29 -0
- package/dist/pi-packages/captains-log/i18n.js +7 -0
- package/dist/pi-packages/captains-log/package.json +35 -0
- package/dist/pi-packages/captains-log/tsconfig.json +21 -0
- package/dist/pi-packages/captains-log/vite.config.mjs +28 -0
- package/dist/pi-packages/relays/extensions/index.js +61 -0
- package/dist/pi-packages/relays/i18n.js +7 -0
- package/dist/{pi-web-plugins → pi-packages}/relays/markdownDocument.js +3 -2
- package/dist/pi-packages/relays/package.json +20 -0
- package/dist/pi-packages/relays/pi-web-plugin.js +96 -0
- package/dist/pi-packages/relays/prompts/relay-worktree.md +18 -0
- package/dist/pi-packages/relays/prompts/relay.md +18 -0
- package/dist/{pi-web-plugins → pi-packages}/relays/relayDiscovery.js +2 -2
- package/dist/pi-packages/relays/relayDispatch.js +67 -0
- package/dist/pi-packages/relays/relayIdentity.js +37 -0
- package/dist/{pi-web-plugins → pi-packages}/relays/relaysPanelElement.js +98 -59
- package/dist/pi-packages/relays/skills/relay/SKILL.md +50 -0
- package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +74 -0
- package/dist/pi-packages/workflows/browser/pi-web-plugin.js +42 -0
- package/dist/pi-packages/workflows/browser/worktreeDialog.js +170 -0
- package/dist/pi-packages/workflows/package.json +23 -0
- package/dist/pi-packages/workflows/prompts/worktree.md +21 -0
- package/dist/pi-packages/workflows/server-plugin.js +586 -0
- package/dist/pi-packages/workflows/vite.config.mjs +17 -0
- package/dist/pi-web-plugins/code-highlight/browser/pi-web-plugin.js +22 -0
- package/dist/pi-web-plugins/code-highlight/package.json +13 -0
- package/dist/pi-web-plugins/files/browser/assets/files-icon-DZObYhxb.svg +3 -0
- package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +466 -0
- package/dist/pi-web-plugins/files/package.json +15 -0
- package/dist/pi-web-plugins/git/browser/git-contract.js +22 -11
- package/dist/pi-web-plugins/git/browser/git-panel.js +228 -100
- package/dist/pi-web-plugins/git/browser/i18n.js +7 -0
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +28 -4
- package/dist/pi-web-plugins/git/git-backend.js +61 -21
- package/dist/pi-web-plugins/git/gitStatusCache.js +48 -0
- package/dist/pi-web-plugins/git/i18n.js +7 -0
- package/dist/pi-web-plugins/git/package.json +1 -0
- package/dist/pi-web-plugins/git/server-plugin.js +45 -24
- package/dist/pi-web-plugins/git/workspace-discovery-notify.cjs +14 -0
- package/dist/pi-web-plugins/git/workspaceDiscoveryHooks.js +186 -0
- package/dist/pi-web-plugins/info/i18n.js +7 -0
- package/dist/pi-web-plugins/info/infoInternals.js +76 -65
- package/dist/pi-web-plugins/info/package.json +1 -1
- package/dist/pi-web-plugins/info/pi-web-plugin.js +40 -42
- package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +4255 -0
- package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +11 -0
- package/dist/pi-web-plugins/mermaid/package.json +13 -0
- package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +219 -0
- package/dist/pi-web-plugins/terminal/i18n.js +7 -0
- package/dist/pi-web-plugins/terminal/package.json +16 -0
- package/dist/pi-web-plugins/terminal/server-plugin.js +367 -0
- package/dist/pi-web-plugins/terminal/terminalService.js +436 -0
- package/dist/pi-web-plugins/updates/i18n.js +7 -0
- package/dist/pi-web-plugins/updates/package.json +1 -1
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +143 -140
- package/dist/pi-web-plugins/updates/updatesLogic.js +24 -24
- package/dist/pi-web-plugins/workspace-tasks/config.js +12 -11
- package/dist/pi-web-plugins/workspace-tasks/i18n.js +7 -0
- package/dist/pi-web-plugins/workspace-tasks/package.json +1 -1
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +31 -9
- package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +54 -36
- package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +12 -11
- package/dist/pi-web-plugins/zh-cn/auth.json +9 -0
- package/dist/pi-web-plugins/zh-cn/bundled.json +219 -0
- package/dist/pi-web-plugins/zh-cn/cli.json +230 -0
- package/dist/pi-web-plugins/zh-cn/client.json +225 -0
- package/dist/pi-web-plugins/zh-cn/components.json +1252 -0
- package/dist/pi-web-plugins/zh-cn/config-errors.json +188 -0
- package/dist/pi-web-plugins/zh-cn/files.json +50 -0
- package/dist/pi-web-plugins/zh-cn/machines.json +28 -0
- package/dist/pi-web-plugins/zh-cn/main.json +459 -0
- package/dist/pi-web-plugins/zh-cn/management-errors.json +23 -0
- package/dist/pi-web-plugins/zh-cn/manifest.webmanifest +25 -0
- package/dist/pi-web-plugins/zh-cn/metadata.json +3 -0
- package/dist/pi-web-plugins/zh-cn/package.json +10 -0
- package/dist/pi-web-plugins/zh-cn/pi-web-plugin.js +16 -0
- package/dist/pi-web-plugins/zh-cn/projects.json +6 -0
- package/dist/pi-web-plugins/zh-cn/provider-auth.json +18 -0
- package/dist/pi-web-plugins/zh-cn/routing.json +68 -0
- package/dist/pi-web-plugins/zh-cn/server-main.json +99 -0
- package/dist/pi-web-plugins/zh-cn/server.json +256 -0
- package/dist/piAi.js +4 -0
- package/dist/piAi.js.map +1 -0
- package/dist/piRuntime.js +150 -0
- package/dist/piRuntime.js.map +1 -0
- package/dist/piSdk.js +5 -0
- package/dist/piSdk.js.map +1 -0
- package/dist/piWebUpdate.js +508 -0
- package/dist/piWebUpdate.js.map +1 -0
- package/dist/piWebVersionReport.js +109 -41
- package/dist/piWebVersionReport.js.map +1 -1
- package/dist/plugin-api.d.ts +609 -29
- package/dist/plugin-api.js +1 -0
- package/dist/pluginRecoveryCli.js +27 -25
- package/dist/pluginRecoveryCli.js.map +1 -1
- package/dist/server/activity/workspaceActivityService.js +13 -6
- package/dist/server/activity/workspaceActivityService.js.map +1 -1
- package/dist/server/app.js +155 -77
- package/dist/server/app.js.map +1 -1
- package/dist/server/audit/managementAuditStore.js +6 -1
- package/dist/server/audit/managementAuditStore.js.map +1 -1
- package/dist/server/audit/normalToolAuditCli.js +45 -43
- package/dist/server/audit/normalToolAuditCli.js.map +1 -1
- package/dist/server/browserMessageProjection.js +39 -22
- package/dist/server/browserMessageProjection.js.map +1 -1
- package/dist/server/configRoutes.js +54 -33
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/deploymentIdentity.js +67 -0
- package/dist/server/deploymentIdentity.js.map +1 -0
- package/dist/server/deploymentIdentityRoutes.js +22 -0
- package/dist/server/deploymentIdentityRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js +7 -6
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -1
- package/dist/server/diagnostics/nodePtySpawnHelper.js +21 -20
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -1
- package/dist/server/index.js +10 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/knownAutoInstallPiPackages.js +36 -0
- package/dist/server/knownAutoInstallPiPackages.js.map +1 -0
- package/dist/server/knownPiPackages.js +12 -0
- package/dist/server/knownPiPackages.js.map +1 -0
- package/dist/server/machines/machineClient.js +23 -19
- package/dist/server/machines/machineClient.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +131 -31
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +138 -47
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineRoutes.js +18 -13
- package/dist/server/machines/machineRoutes.js.map +1 -1
- package/dist/server/machines/machineService.js +40 -18
- package/dist/server/machines/machineService.js.map +1 -1
- package/dist/server/managementEmbed.js +149 -30
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/managementPrivileges.js +21 -0
- package/dist/server/managementPrivileges.js.map +1 -0
- package/dist/server/managementTerminalProxyRoutes.js +124 -0
- package/dist/server/managementTerminalProxyRoutes.js.map +1 -0
- package/dist/server/navigationPreferenceRoutes.js +59 -0
- package/dist/server/navigationPreferenceRoutes.js.map +1 -0
- package/dist/server/normalAuth.js +77 -53
- package/dist/server/normalAuth.js.map +1 -1
- package/dist/server/notices/serverNoticeRoutes.js +43 -0
- package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
- package/dist/server/notices/serverNoticeService.js +26 -0
- package/dist/server/notices/serverNoticeService.js.map +1 -0
- package/dist/server/notices/serverNoticeStore.js +122 -0
- package/dist/server/notices/serverNoticeStore.js.map +1 -0
- package/dist/server/passwordVerifier.js +91 -0
- package/dist/server/passwordVerifier.js.map +1 -0
- package/dist/server/piPackageIdentity.js +25 -0
- package/dist/server/piPackageIdentity.js.map +1 -0
- package/dist/server/piPackageService.js +72 -9
- package/dist/server/piPackageService.js.map +1 -1
- package/dist/server/piWebPluginCatalog.js +212 -35
- package/dist/server/piWebPluginCatalog.js.map +1 -1
- package/dist/server/piWebPluginLifecycle.js +29 -3
- package/dist/server/piWebPluginLifecycle.js.map +1 -1
- package/dist/server/piWebPluginService.js +199 -292
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/piWebStatus.js +57 -100
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/pluginCallbackDrain.js +35 -0
- package/dist/server/pluginCallbackDrain.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +84 -0
- package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js +234 -0
- package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +61 -0
- package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js +47 -57
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
- package/dist/server/plugins/pluginBackendRegistry.js +804 -0
- package/dist/server/plugins/pluginBackendRegistry.js.map +1 -0
- package/dist/server/plugins/projectPluginSettings.js +95 -0
- package/dist/server/plugins/projectPluginSettings.js.map +1 -0
- package/dist/server/plugins/serverPluginCatalogCapability.js +106 -0
- package/dist/server/plugins/serverPluginCatalogCapability.js.map +1 -0
- package/dist/server/plugins/serverPluginPiSessionEventsCapability.js +34 -0
- package/dist/server/plugins/serverPluginPiSessionEventsCapability.js.map +1 -0
- package/dist/server/plugins/serverPluginPiSessionsCapability.js +185 -0
- package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -0
- package/dist/server/plugins/serverPluginRuntime.js +1088 -108
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
- package/dist/server/plugins/serverPluginWorkspacesCapability.js +114 -0
- package/dist/server/plugins/serverPluginWorkspacesCapability.js.map +1 -0
- package/dist/server/projectTrustRoutes.js +86 -0
- package/dist/server/projectTrustRoutes.js.map +1 -0
- package/dist/server/projects/projectLifecycleService.js +94 -0
- package/dist/server/projects/projectLifecycleService.js.map +1 -0
- package/dist/server/projects/projectService.js +7 -4
- package/dist/server/projects/projectService.js.map +1 -1
- package/dist/server/realtime/sessionEventHub.js +58 -39
- package/dist/server/realtime/sessionEventHub.js.map +1 -1
- package/dist/server/realtime/sessionEventScope.js +4 -0
- package/dist/server/realtime/sessionEventScope.js.map +1 -1
- package/dist/server/requestCancellation.js +15 -1
- package/dist/server/requestCancellation.js.map +1 -1
- package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
- package/dist/server/sessiond/autoInstallPiPackages.js +63 -0
- package/dist/server/sessiond/autoInstallPiPackages.js.map +1 -0
- package/dist/server/sessiond/pluginBackendChannelRoutes.js +410 -0
- package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +64 -47
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
- package/dist/server/sessiond/pluginCatalogRoutes.js +41 -0
- package/dist/server/sessiond/pluginCatalogRoutes.js.map +1 -0
- package/dist/server/sessiond/projectMutationRoutes.js +39 -0
- package/dist/server/sessiond/projectMutationRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js +36 -0
- package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonStartup.js +30 -4
- package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -1
- package/dist/server/sessiond/sessionProxyRoutes.js +263 -91
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +5 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond/sessiondStateOwnership.js +174 -39
- package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -1
- package/dist/server/sessiond/workspaceCatalogRoutes.js +11 -5
- package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -1
- package/dist/server/sessiond/workspaceNotificationRoutes.js +55 -0
- package/dist/server/sessiond/workspaceNotificationRoutes.js.map +1 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js +1 -1
- package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -1
- package/dist/server/sessiond.js +313 -69
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/askUserDomain.js +232 -0
- package/dist/server/sessions/askUserDomain.js.map +1 -0
- package/dist/server/sessions/askUserTool.js +18 -21
- package/dist/server/sessions/askUserTool.js.map +1 -1
- package/dist/server/sessions/attachmentService.js +2 -6
- package/dist/server/sessions/attachmentService.js.map +1 -1
- package/dist/server/sessions/authRoutes.js +32 -19
- package/dist/server/sessions/authRoutes.js.map +1 -1
- package/dist/server/sessions/authService.js +31 -11
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/builtinCommands.js +28 -21
- package/dist/server/sessions/builtinCommands.js.map +1 -1
- package/dist/server/sessions/builtinExtensionFactories.js +36 -0
- package/dist/server/sessions/builtinExtensionFactories.js.map +1 -0
- package/dist/server/sessions/clientSessionPreview.js +14 -0
- package/dist/server/sessions/clientSessionPreview.js.map +1 -0
- package/dist/server/sessions/companionBackend.js +286 -0
- package/dist/server/sessions/companionBackend.js.map +1 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js +98 -10
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -1
- package/dist/server/sessions/extensionSessionDispatch.js +76 -0
- package/dist/server/sessions/extensionSessionDispatch.js.map +1 -0
- package/dist/server/sessions/globalProviderPolicy.js +88 -19
- package/dist/server/sessions/globalProviderPolicy.js.map +1 -1
- package/dist/server/sessions/managementAgentTools.js +116 -6
- package/dist/server/sessions/managementAgentTools.js.map +1 -1
- package/dist/server/sessions/managementPermissionSystem.js +36 -14
- package/dist/server/sessions/managementPermissionSystem.js.map +1 -1
- package/dist/server/sessions/managementSandbox.js +7 -18
- package/dist/server/sessions/managementSandbox.js.map +1 -1
- package/dist/server/sessions/mcpAuthFlowService.js +289 -0
- package/dist/server/sessions/mcpAuthFlowService.js.map +1 -0
- package/dist/server/sessions/mcpAuthRoutes.js +104 -0
- package/dist/server/sessions/mcpAuthRoutes.js.map +1 -0
- package/dist/server/sessions/mcpOAuthCredentialAdapter.js +92 -0
- package/dist/server/sessions/mcpOAuthCredentialAdapter.js.map +1 -0
- package/dist/server/sessions/messageHistoryTarget.js +79 -0
- package/dist/server/sessions/messageHistoryTarget.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +2 -2
- package/dist/server/sessions/messagePaging.js.map +1 -1
- package/dist/server/sessions/modelCatalogRefresher.js +4 -3
- package/dist/server/sessions/modelCatalogRefresher.js.map +1 -1
- package/dist/server/sessions/oauthLoginFlowService.js +19 -20
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/piSessionEventConnections.js +68 -0
- package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +206 -27
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +2508 -991
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/plainTextTheme.js +1 -1
- package/dist/server/sessions/plainTextTheme.js.map +1 -1
- package/dist/server/sessions/projectAuthService.js +35 -6
- package/dist/server/sessions/projectAuthService.js.map +1 -1
- package/dist/server/sessions/projectSettingsScope.js +88 -33
- package/dist/server/sessions/projectSettingsScope.js.map +1 -1
- package/dist/server/sessions/projectTrust.js +119 -0
- package/dist/server/sessions/projectTrust.js.map +1 -0
- package/dist/server/sessions/queuedMessageMutation.js +170 -0
- package/dist/server/sessions/queuedMessageMutation.js.map +1 -0
- package/dist/server/sessions/relaySkill.js +169 -0
- package/dist/server/sessions/relaySkill.js.map +1 -0
- package/dist/server/sessions/sessionActivityMarker.js +105 -0
- package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
- package/dist/server/sessions/sessionArchiveMapping.js +16 -15
- package/dist/server/sessions/sessionArchiveMapping.js.map +1 -1
- package/dist/server/sessions/sessionArchiveStore.js +5 -1
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -1
- package/dist/server/sessions/sessionArchiveTree.js +2 -2
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -1
- package/dist/server/sessions/sessionCleanup.js +4 -3
- package/dist/server/sessions/sessionCleanup.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +79 -87
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionEnvironmentFacts.js +5 -4
- package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -1
- package/dist/server/sessions/sessionFileHeader.js +41 -0
- package/dist/server/sessions/sessionFileHeader.js.map +1 -1
- package/dist/server/sessions/sessionImageDimensions.js +31 -0
- package/dist/server/sessions/sessionImageDimensions.js.map +1 -0
- package/dist/server/sessions/sessionMediaIndex.js +191 -0
- package/dist/server/sessions/sessionMediaIndex.js.map +1 -0
- package/dist/server/sessions/sessionMetadata.js +51 -0
- package/dist/server/sessions/sessionMetadata.js.map +1 -0
- package/dist/server/sessions/sessionModelScope.js +160 -0
- package/dist/server/sessions/sessionModelScope.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +16 -35
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
- package/dist/server/sessions/sessionNotificationStore.js +14 -11
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -1
- package/dist/server/sessions/sessionReadAccess.js +41 -0
- package/dist/server/sessions/sessionReadAccess.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +221 -78
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionSummaryScanner.js +62 -5
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
- package/dist/server/sessions/sessionTreeProjection.js +50 -49
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -1
- package/dist/server/sessions/sessionUiEvents.js +22 -10
- package/dist/server/sessions/sessionUiEvents.js.map +1 -1
- package/dist/server/sessions/sessionUnreadStore.js +53 -3
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -1
- package/dist/server/sessions/spawnSessionTool.js +14 -6
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +40 -24
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/spawnTargetResolver.js +1 -1
- package/dist/server/sessions/subsessionCompletionDelivery.js +15 -0
- package/dist/server/sessions/subsessionCompletionDelivery.js.map +1 -0
- package/dist/server/sessions/subsessionCompletionInbox.js +134 -0
- package/dist/server/sessions/subsessionCompletionInbox.js.map +1 -0
- package/dist/server/sessions/subsessionProvenance.js +27 -0
- package/dist/server/sessions/subsessionProvenance.js.map +1 -0
- package/dist/server/sessions/transcriptBranchCache.js +81 -0
- package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
- package/dist/server/sessions/transcriptMarkdown.js +48 -0
- package/dist/server/sessions/transcriptMarkdown.js.map +1 -0
- package/dist/server/sessions/transcriptMessages.js +57 -0
- package/dist/server/sessions/transcriptMessages.js.map +1 -0
- package/dist/server/startupLogger.js +13 -0
- package/dist/server/startupLogger.js.map +1 -0
- package/dist/server/startupUrls.js +27 -0
- package/dist/server/startupUrls.js.map +1 -0
- package/dist/server/status/machineStatusService.js +15 -7
- package/dist/server/status/machineStatusService.js.map +1 -1
- package/dist/server/storage/navigationPreferenceStore.js +138 -0
- package/dist/server/storage/navigationPreferenceStore.js.map +1 -0
- package/dist/server/storage/piPackageDismissalStore.js +78 -0
- package/dist/server/storage/piPackageDismissalStore.js.map +1 -0
- package/dist/server/terminals/{terminalService.js → managementCommandRunService.js} +98 -102
- package/dist/server/terminals/managementCommandRunService.js.map +1 -0
- package/dist/server/terminals/managementTerminalRoutes.js +91 -0
- package/dist/server/terminals/managementTerminalRoutes.js.map +1 -0
- package/dist/server/terminals/requiredTerminalService.js +103 -0
- package/dist/server/terminals/requiredTerminalService.js.map +1 -0
- package/dist/server/webSocketBridge.js +348 -0
- package/dist/server/webSocketBridge.js.map +1 -1
- package/dist/server/workbench/accessStateStore.js +33 -5
- package/dist/server/workbench/accessStateStore.js.map +1 -1
- package/dist/server/workbench/capabilitySearch.js +3 -2
- package/dist/server/workbench/capabilitySearch.js.map +1 -1
- package/dist/server/workbench/gatewayIntegration.js +40 -13
- package/dist/server/workbench/gatewayIntegration.js.map +1 -1
- package/dist/server/workbench/knowledgeSearch.js +100 -0
- package/dist/server/workbench/knowledgeSearch.js.map +1 -0
- package/dist/server/workbench/mcpClient.js +41 -8
- package/dist/server/workbench/mcpClient.js.map +1 -1
- package/dist/server/workbench/skillSync.js +11 -3
- package/dist/server/workbench/skillSync.js.map +1 -1
- package/dist/server/workbench/workbenchClient.js +130 -7
- package/dist/server/workbench/workbenchClient.js.map +1 -1
- package/dist/server/workbench/workbenchTools.js +196 -14
- package/dist/server/workbench/workbenchTools.js.map +1 -1
- package/dist/server/workingDirectory.js +3 -2
- package/dist/server/workingDirectory.js.map +1 -1
- package/dist/server/workspaceExplorerRoutes.js +53 -21
- package/dist/server/workspaceExplorerRoutes.js.map +1 -1
- package/dist/server/workspaces/fileContentService.js +31 -16
- package/dist/server/workspaces/fileContentService.js.map +1 -1
- package/dist/server/workspaces/fileOperationService.js +11 -9
- package/dist/server/workspaces/fileOperationService.js.map +1 -1
- package/dist/server/workspaces/filePreviewService.js +10 -6
- package/dist/server/workspaces/filePreviewService.js.map +1 -1
- package/dist/server/workspaces/fileSuggestions.js +77 -10
- package/dist/server/workspaces/fileSuggestions.js.map +1 -1
- package/dist/server/workspaces/fileTreeService.js +103 -15
- package/dist/server/workspaces/fileTreeService.js.map +1 -1
- package/dist/server/workspaces/normalProjectCwdResolver.js +35 -0
- package/dist/server/workspaces/normalProjectCwdResolver.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +24 -18
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -1
- package/dist/server/workspaces/pathSafety.js +6 -5
- package/dist/server/workspaces/pathSafety.js.map +1 -1
- package/dist/server/workspaces/projectPiWebConfig.js +95 -8
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
- package/dist/server/workspaces/projectWorkspaceCwds.js +0 -5
- package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +37 -22
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
- package/dist/server/workspaces/workspaceCatalog.js +6 -4
- package/dist/server/workspaces/workspaceCatalog.js.map +1 -1
- package/dist/server/workspaces/workspaceChangeNotifier.js +12 -0
- package/dist/server/workspaces/workspaceChangeNotifier.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +9 -70
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
- package/dist/server/workspaces/workspaceNotificationCommand.js +64 -0
- package/dist/server/workspaces/workspaceNotificationCommand.js.map +1 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js +128 -24
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
- package/dist/server/workspaces/workspaceRemovalService.js +41 -7
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
- package/dist/server/workspaces/workspaceRouteContext.js +1 -1
- package/dist/server/workspaces/workspaceRouteContext.js.map +1 -1
- package/dist/server/workspaces/workspaceRouteErrors.js +4 -2
- package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -1
- package/dist/server/workspaces/workspaceUserError.js +18 -0
- package/dist/server/workspaces/workspaceUserError.js.map +1 -0
- package/dist/server-plugin-api.d.ts +349 -49
- package/dist/server-plugin-api.js +344 -2
- package/dist/server-plugin-api.js.map +1 -1
- package/dist/serverPluginRecovery.js +6 -1
- package/dist/serverPluginRecovery.js.map +1 -1
- package/dist/sessiond/activeAgentProfile.js +27 -2
- package/dist/sessiond/activeAgentProfile.js.map +1 -1
- package/dist/sessiond/config.js +4 -3
- package/dist/sessiond/config.js.map +1 -1
- package/dist/sessiond/sessionDaemonClient.js +75 -19
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/sessiond/sessionDaemonErrors.js +49 -0
- package/dist/sessiond/sessionDaemonErrors.js.map +1 -0
- package/dist/shared/activeAgentProfile.js +2 -34
- package/dist/shared/activeAgentProfile.js.map +1 -1
- package/dist/shared/activity.js +0 -3
- package/dist/shared/activity.js.map +1 -1
- package/dist/shared/apiTypes.js +10 -3
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +8 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +77 -11
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/i18n.js +41 -0
- package/dist/shared/i18n.js.map +1 -0
- package/dist/shared/machinePluginIds.js +30 -7
- package/dist/shared/machinePluginIds.js.map +1 -1
- package/dist/shared/machineStatus.js +46 -3
- package/dist/shared/machineStatus.js.map +1 -1
- package/dist/shared/navigationPreferences.js +6 -0
- package/dist/shared/navigationPreferences.js.map +1 -0
- package/dist/shared/piWebConfigParsing.js +118 -49
- package/dist/shared/piWebConfigParsing.js.map +1 -1
- package/dist/shared/piWebStatusParsing.js +33 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -1
- package/dist/shared/pluginApiTypes.d.ts +87 -8
- package/dist/shared/pluginApiTypes.js +2 -0
- package/dist/shared/pluginApiTypes.js.map +1 -0
- package/dist/shared/pluginBackendProtocol.js +218 -2
- package/dist/shared/pluginBackendProtocol.js.map +1 -1
- package/dist/shared/pluginCatalogTypes.d.ts +49 -0
- package/dist/shared/pluginCatalogTypes.js +156 -0
- package/dist/shared/pluginCatalogTypes.js.map +1 -0
- package/dist/shared/pluginIds.js +10 -1
- package/dist/shared/pluginIds.js.map +1 -1
- package/dist/shared/requiredTerminalPlugin.js +6 -0
- package/dist/shared/requiredTerminalPlugin.js.map +1 -0
- package/dist/shared/serverNoticeContract.js +88 -0
- package/dist/shared/serverNoticeContract.js.map +1 -0
- package/dist/shared/sessionDefaults.js +42 -0
- package/dist/shared/sessionDefaults.js.map +1 -0
- package/dist/shared/sessionMedia.js +12 -0
- package/dist/shared/sessionMedia.js.map +1 -0
- package/dist/shared/streamingBehavior.js +8 -0
- package/dist/shared/streamingBehavior.js.map +1 -0
- package/dist/shared/themePreference.js +24 -0
- package/dist/shared/themePreference.js.map +1 -0
- package/dist/shared/thinkingLevels.js +17 -16
- package/dist/shared/thinkingLevels.js.map +1 -1
- package/dist/shared/workspaceFiles.js.map +1 -1
- package/dist/workspaceNotificationCli.js +95 -0
- package/dist/workspaceNotificationCli.js.map +1 -0
- package/docs/README.md +31 -0
- package/docs/config.md +344 -277
- package/docs/plugins.md +204 -930
- package/examples/session-bridge-plugin/README.md +20 -0
- package/examples/session-bridge-plugin/docs/usage.md +54 -0
- package/examples/session-bridge-plugin/package.json +26 -0
- package/examples/session-bridge-plugin/src/browser/index.ts +87 -0
- package/examples/session-bridge-plugin/src/browser/protocol.ts +24 -0
- package/examples/session-bridge-plugin/src/companion.ts +65 -0
- package/examples/session-bridge-plugin/src/reviewRun.ts +39 -0
- package/examples/session-bridge-plugin/src/server.ts +85 -0
- package/examples/session-bridge-plugin/src/store.ts +80 -0
- package/examples/session-bridge-plugin/tsconfig.json +21 -0
- package/examples/workspace-provider-plugin/README.md +39 -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 +68 -0
- package/examples/workspace-provider-plugin/tsconfig.json +21 -0
- package/extensions/pi-web.ts +3 -1
- package/package.json +59 -36
- package/skills/README.md +28 -2
- package/skills/relay/SKILL.md +24 -89
- package/skills/relay-runner/SKILL.md +74 -0
- package/dist/client/assets/CodeViewer-DCl56K0Z.js +0 -4
- package/dist/client/assets/TerminalPanel-DCvoEjUF.js +0 -187
- package/dist/client/assets/index-CMvms5cF.js +0 -4325
- package/dist/client/assets/vendor-editor-core-vUi74DnD.js +0 -12
- package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +0 -46
- package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +0 -1
- package/dist/client/assets/vendor-terminal-BrP-ENHg.css +0 -1
- package/dist/client/assets/vendor-terminal-D8k4UKM2.js +0 -35
- package/dist/pi-web-plugins/relays/package.json +0 -9
- package/dist/pi-web-plugins/relays/pi-web-plugin.js +0 -44
- package/dist/server/git/gitService.js +0 -290
- package/dist/server/git/gitService.js.map +0 -1
- package/dist/server/gitRoutes.js +0 -23
- package/dist/server/gitRoutes.js.map +0 -1
- package/dist/server/sessions/pendingAskStore.js +0 -278
- package/dist/server/sessions/pendingAskStore.js.map +0 -1
- package/dist/server/terminalProxyRoutes.js +0 -178
- package/dist/server/terminalProxyRoutes.js.map +0 -1
- package/dist/server/terminals/terminalRoutes.js +0 -164
- package/dist/server/terminals/terminalRoutes.js.map +0 -1
- package/dist/server/terminals/terminalService.js.map +0 -1
- package/dist/server/terminals/terminalSize.js +0 -17
- package/dist/server/terminals/terminalSize.js.map +0 -1
- package/dist/server/workspaces/gitWorktreeDiscovery.js +0 -43
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +0 -1
- package/dist/server/workspaces/workspaceService.js +0 -52
- package/dist/server/workspaces/workspaceService.js.map +0 -1
- /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/README.md +0 -0
- /package/dist/{pi-web-plugins → pi-packages}/relays/vendor/marked.esm.js +0 -0
|
@@ -1,14 +1,20 @@
|
|
|
1
|
+
import { UserFacingError, userFacingErrorMessage } from "../../shared/i18n.js";
|
|
2
|
+
import { loadNodeTranslator } from "../../localization.js";
|
|
1
3
|
import { ASK_USER_ID_MAX_LENGTH, ASK_USER_OPTION_LIMIT, ASK_USER_OTHER_TEXT_MAX_LENGTH, ASK_USER_QUESTION_LIMIT, EXTENSION_DIALOG_ID_MAX_LENGTH, EXTENSION_DIALOG_INPUT_MAX_LENGTH, SESSION_TREE_CUSTOM_INSTRUCTIONS_MAX_LENGTH, SESSION_UNREAD_CATALOG_ID_MAX_LENGTH, SESSION_UNREAD_CWD_MAX_LENGTH, SESSION_UNREAD_SESSION_ID_MAX_LENGTH } from "../../shared/apiTypes.js";
|
|
2
|
-
import {
|
|
4
|
+
import { parseSessionDefaultsUpdate } from "../../shared/sessionDefaults.js";
|
|
5
|
+
import { projectBrowserMessageResponse, projectBrowserStreamSnapshot, projectBrowserTranscriptSnapshot } from "../browserMessageProjection.js";
|
|
6
|
+
import { isSessionMediaId, SESSION_MEDIA_MODE } from "../../shared/sessionMedia.js";
|
|
7
|
+
import { isSessionImageMimeType } from "./sessionMediaIndex.js";
|
|
3
8
|
import { normalizeRequestCwd } from "../workingDirectory.js";
|
|
4
9
|
import { attachWorkbenchAccessHandle, decodeManagementContext, MANAGEMENT_EMBED_CONTEXT_HEADER, WORKBENCH_ACCESS_HANDLE_HEADER } from "../managementEmbed.js";
|
|
5
10
|
import { eventScopeFromManagementContext } from "../realtime/sessionEventScope.js";
|
|
6
11
|
import { normalizeSessionCleanupRequest } from "./sessionCleanup.js";
|
|
12
|
+
import { parseQueueMessageMutation } from "./queuedMessageMutation.js";
|
|
7
13
|
const MAX_NOTIFICATION_SESSION_ID_LENGTH = 512;
|
|
8
14
|
const MAX_NOTIFICATION_CWD_LENGTH = 32 * 1024;
|
|
9
15
|
const MAX_NOTIFICATION_DAEMON_ID_LENGTH = 512;
|
|
10
16
|
const MAX_NOTIFICATION_ID_LENGTH = 1024;
|
|
11
|
-
export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
17
|
+
export function registerSessionRoutes(app, sessions, eventHub, prefix = "", t = loadNodeTranslator("server")) {
|
|
12
18
|
app.get(`${prefix}/sessions`, async (request, reply) => {
|
|
13
19
|
if (request.query.cwd === undefined || request.query.cwd === "")
|
|
14
20
|
return reply.code(400).send({ error: "cwd query parameter is required" });
|
|
@@ -16,7 +22,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
16
22
|
return await sessions.list(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
|
|
17
23
|
}
|
|
18
24
|
catch (error) {
|
|
19
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
25
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
20
26
|
}
|
|
21
27
|
});
|
|
22
28
|
app.get(`${prefix}/sessions/search`, async (request, reply) => {
|
|
@@ -28,7 +34,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
28
34
|
return await sessions.search(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
|
|
29
35
|
}
|
|
30
36
|
catch (error) {
|
|
31
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
37
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
32
38
|
}
|
|
33
39
|
});
|
|
34
40
|
app.get(`${prefix}/sessions/pins`, async (request, reply) => {
|
|
@@ -38,7 +44,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
38
44
|
return await sessions.listPinned(normalizeRequestCwd(request.query.cwd), managementContextFromHeaders(request.headers));
|
|
39
45
|
}
|
|
40
46
|
catch (error) {
|
|
41
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
47
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
42
48
|
}
|
|
43
49
|
});
|
|
44
50
|
app.post(`${prefix}/sessions`, async (request, reply) => {
|
|
@@ -55,23 +61,23 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
55
61
|
});
|
|
56
62
|
}
|
|
57
63
|
catch (error) {
|
|
58
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
64
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
59
65
|
}
|
|
60
66
|
});
|
|
61
|
-
app.get(`${prefix}/sessions/notifications`, async (
|
|
67
|
+
app.get(`${prefix}/sessions/notifications`, async (request, reply) => {
|
|
62
68
|
try {
|
|
63
|
-
return await sessions.notificationCatalog();
|
|
69
|
+
return await sessions.notificationCatalog(managementContextFromHeaders(request.headers));
|
|
64
70
|
}
|
|
65
71
|
catch (error) {
|
|
66
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
72
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
67
73
|
}
|
|
68
74
|
});
|
|
69
|
-
app.get(`${prefix}/sessions/unread`, async (
|
|
75
|
+
app.get(`${prefix}/sessions/unread`, async (request, reply) => {
|
|
70
76
|
try {
|
|
71
|
-
return await sessions.unreadCatalog();
|
|
77
|
+
return await sessions.unreadCatalog(managementContextFromHeaders(request.headers));
|
|
72
78
|
}
|
|
73
79
|
catch (error) {
|
|
74
|
-
return reply.code(503).send({ error: errorMessage(error) });
|
|
80
|
+
return reply.code(503).send({ error: errorMessage(error, t) });
|
|
75
81
|
}
|
|
76
82
|
});
|
|
77
83
|
app.post(`${prefix}/sessions/:sessionId/unread/acknowledge`, async (request, reply) => {
|
|
@@ -87,13 +93,13 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
87
93
|
};
|
|
88
94
|
}
|
|
89
95
|
catch (error) {
|
|
90
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
96
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
91
97
|
}
|
|
92
98
|
try {
|
|
93
|
-
return await sessions.acknowledgeUnread(sessionId, acknowledgement);
|
|
99
|
+
return await sessions.acknowledgeUnread(sessionId, acknowledgement, managementContextFromHeaders(request.headers));
|
|
94
100
|
}
|
|
95
101
|
catch (error) {
|
|
96
|
-
return reply.code(503).send({ error: errorMessage(error) });
|
|
102
|
+
return reply.code(503).send({ error: errorMessage(error, t) });
|
|
97
103
|
}
|
|
98
104
|
});
|
|
99
105
|
app.post(`${prefix}/sessions/cleanup/preview`, async (request, reply) => {
|
|
@@ -101,15 +107,15 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
101
107
|
return await sessions.cleanupPreview(normalizeSessionCleanupRequest(optionalRecord(request.body)));
|
|
102
108
|
}
|
|
103
109
|
catch (error) {
|
|
104
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
110
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
105
111
|
}
|
|
106
112
|
});
|
|
107
113
|
app.post(`${prefix}/sessions/cleanup`, async (request, reply) => {
|
|
108
114
|
try {
|
|
109
|
-
return await sessions.cleanup(normalizeSessionCleanupRequest(optionalRecord(request.body)));
|
|
115
|
+
return await sessions.cleanup(normalizeSessionCleanupRequest(optionalRecord(request.body)), managementContextFromHeaders(request.headers));
|
|
110
116
|
}
|
|
111
117
|
catch (error) {
|
|
112
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
118
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
113
119
|
}
|
|
114
120
|
});
|
|
115
121
|
app.post(`${prefix}/sessions/bulk/archive`, async (request, reply) => {
|
|
@@ -117,7 +123,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
117
123
|
return await sessions.archiveMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
|
|
118
124
|
}
|
|
119
125
|
catch (error) {
|
|
120
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
126
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
121
127
|
}
|
|
122
128
|
});
|
|
123
129
|
app.post(`${prefix}/sessions/bulk/delete-archived`, async (request, reply) => {
|
|
@@ -125,7 +131,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
125
131
|
return await sessions.deleteArchivedMany(bulkMutationRefsFromBody(request.body), managementContextFromHeaders(request.headers));
|
|
126
132
|
}
|
|
127
133
|
catch (error) {
|
|
128
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
134
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
129
135
|
}
|
|
130
136
|
});
|
|
131
137
|
app.put(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
|
|
@@ -134,7 +140,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
134
140
|
return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, body), true, managementContextFromHeaders(request.headers));
|
|
135
141
|
}
|
|
136
142
|
catch (error) {
|
|
137
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
143
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
138
144
|
}
|
|
139
145
|
});
|
|
140
146
|
app.delete(`${prefix}/sessions/:sessionId/pin`, async (request, reply) => {
|
|
@@ -142,15 +148,15 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
142
148
|
return await sessions.setPinned(sessionLookupFromRequiredCwd(request.params.sessionId, request.query), false, managementContextFromHeaders(request.headers));
|
|
143
149
|
}
|
|
144
150
|
catch (error) {
|
|
145
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
151
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
146
152
|
}
|
|
147
153
|
});
|
|
148
154
|
app.get(`${prefix}/sessions/:sessionId/notifications`, async (request, reply) => {
|
|
149
155
|
try {
|
|
150
|
-
return await sessions.notificationInbox(notificationRefFromQuery(request.params.sessionId, request.query));
|
|
156
|
+
return await sessions.notificationInbox(notificationRefFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
|
|
151
157
|
}
|
|
152
158
|
catch (error) {
|
|
153
|
-
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
159
|
+
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
154
160
|
}
|
|
155
161
|
});
|
|
156
162
|
app.post(`${prefix}/sessions/:sessionId/notifications/dismiss`, async (request, reply) => {
|
|
@@ -160,10 +166,10 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
160
166
|
return await sessions.dismissNotification(ref, {
|
|
161
167
|
daemonInstanceId: requireNonEmptyBoundedString(body["daemonInstanceId"], "daemonInstanceId", MAX_NOTIFICATION_DAEMON_ID_LENGTH),
|
|
162
168
|
notificationId: requireNonEmptyBoundedString(body["notificationId"], "notificationId", MAX_NOTIFICATION_ID_LENGTH),
|
|
163
|
-
});
|
|
169
|
+
}, managementContextFromHeaders(request.headers));
|
|
164
170
|
}
|
|
165
171
|
catch (error) {
|
|
166
|
-
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
172
|
+
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
167
173
|
}
|
|
168
174
|
});
|
|
169
175
|
app.post(`${prefix}/sessions/:sessionId/notifications/dismiss-all`, async (request, reply) => {
|
|
@@ -174,28 +180,59 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
174
180
|
daemonInstanceId: requireNonEmptyBoundedString(body["daemonInstanceId"], "daemonInstanceId", MAX_NOTIFICATION_DAEMON_ID_LENGTH),
|
|
175
181
|
throughOrder: requireNonNegativeSafeInteger(body["throughOrder"], "throughOrder"),
|
|
176
182
|
throughOverflowWatermark: requireNonNegativeSafeInteger(body["throughOverflowWatermark"], "throughOverflowWatermark"),
|
|
177
|
-
});
|
|
183
|
+
}, managementContextFromHeaders(request.headers));
|
|
178
184
|
}
|
|
179
185
|
catch (error) {
|
|
180
|
-
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
186
|
+
return reply.code(notificationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
181
187
|
}
|
|
182
188
|
});
|
|
183
189
|
app.get(`${prefix}/sessions/:sessionId/messages`, async (request, reply) => {
|
|
190
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
191
|
+
if (ref === undefined)
|
|
192
|
+
return reply;
|
|
184
193
|
try {
|
|
185
194
|
const page = { ...optionalField("before", optionalNumber(request.query.before)), ...optionalField("limit", optionalNumber(request.query.limit)) };
|
|
186
|
-
const messages = await sessions.messages(
|
|
187
|
-
return projectBrowserMessageResponse(messages);
|
|
195
|
+
const messages = await sessions.messages(ref, page, managementContextFromHeaders(request.headers));
|
|
196
|
+
return projectBrowserMessageResponse(messages, imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
app.get(`${prefix}/sessions/:sessionId/media/:mediaId`, async (request, reply) => {
|
|
203
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
204
|
+
if (ref === undefined)
|
|
205
|
+
return reply;
|
|
206
|
+
if (!isSessionMediaId(request.params.mediaId))
|
|
207
|
+
return reply.code(400).send({ error: "Invalid media id" });
|
|
208
|
+
try {
|
|
209
|
+
const media = await sessions.media(ref, request.params.mediaId, managementContextFromHeaders(request.headers));
|
|
210
|
+
if (media === undefined)
|
|
211
|
+
return await reply.code(404).send({ error: "Session media not found" });
|
|
212
|
+
if (!isSessionImageMimeType(media.mimeType))
|
|
213
|
+
throw new Error("Unsupported session image MIME type");
|
|
214
|
+
return await reply
|
|
215
|
+
.type(media.mimeType)
|
|
216
|
+
.header("Cache-Control", "private, max-age=31536000, immutable")
|
|
217
|
+
.header("Content-Length", media.data.byteLength)
|
|
218
|
+
.header("X-Content-Type-Options", "nosniff")
|
|
219
|
+
.send(media.data);
|
|
188
220
|
}
|
|
189
221
|
catch (error) {
|
|
190
|
-
|
|
222
|
+
if (isSessionNotFoundError(error))
|
|
223
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
224
|
+
throw error; // Fastify logs unexpected failures and returns 500, not a false miss.
|
|
191
225
|
}
|
|
192
226
|
});
|
|
193
227
|
app.get(`${prefix}/sessions/:sessionId/status`, async (request, reply) => {
|
|
228
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
229
|
+
if (ref === undefined)
|
|
230
|
+
return reply;
|
|
194
231
|
try {
|
|
195
|
-
return await sessions.status(
|
|
232
|
+
return await sessions.status(ref, managementContextFromHeaders(request.headers));
|
|
196
233
|
}
|
|
197
234
|
catch (error) {
|
|
198
|
-
return reply.code(
|
|
235
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
199
236
|
}
|
|
200
237
|
});
|
|
201
238
|
app.get(`${prefix}/sessions/search-content`, async (request, reply) => {
|
|
@@ -207,23 +244,73 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
207
244
|
return await sessions.searchContent(normalizeRequestCwd(request.query.cwd), request.query.q, managementContextFromHeaders(request.headers));
|
|
208
245
|
}
|
|
209
246
|
catch (error) {
|
|
210
|
-
return reply.code(400).send({ error: errorMessage(error) });
|
|
247
|
+
return reply.code(400).send({ error: errorMessage(error, t) });
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
app.get(`${prefix}/sessions/:sessionId/transcript-snapshot`, async (request, reply) => {
|
|
251
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
252
|
+
if (ref === undefined)
|
|
253
|
+
return reply;
|
|
254
|
+
try {
|
|
255
|
+
const snapshot = await sessions.transcriptSnapshot(ref, { ...optionalField("limit", optionalNumber(request.query.limit)) }, managementContextFromHeaders(request.headers));
|
|
256
|
+
return projectBrowserTranscriptSnapshot(snapshot, imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
211
260
|
}
|
|
212
261
|
});
|
|
213
262
|
app.get(`${prefix}/sessions/:sessionId/stream-snapshot`, async (request, reply) => {
|
|
263
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
264
|
+
if (ref === undefined)
|
|
265
|
+
return reply;
|
|
214
266
|
try {
|
|
215
|
-
return await sessions.streamSnapshot(
|
|
267
|
+
return projectBrowserStreamSnapshot(await sessions.streamSnapshot(ref, managementContextFromHeaders(request.headers)), imageProjector(request.query, eventHub, ref, eventScopeFromHeaders(request.headers)));
|
|
216
268
|
}
|
|
217
269
|
catch (error) {
|
|
218
|
-
return reply.code(
|
|
270
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
219
271
|
}
|
|
220
272
|
});
|
|
221
273
|
app.get(`${prefix}/sessions/:sessionId/models`, async (request, reply) => {
|
|
274
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
275
|
+
if (ref === undefined)
|
|
276
|
+
return reply;
|
|
277
|
+
try {
|
|
278
|
+
return { models: await sessions.availableModels(ref, managementContextFromHeaders(request.headers)) };
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
app.get(`${prefix}/sessions/:sessionId/models/catalog`, async (request, reply) => {
|
|
285
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
286
|
+
if (ref === undefined)
|
|
287
|
+
return reply;
|
|
288
|
+
try {
|
|
289
|
+
return { models: await sessions.modelCatalog(ref, managementContextFromHeaders(request.headers)) };
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
app.post(`${prefix}/sessions/:sessionId/models/enabled`, async (request, reply) => {
|
|
296
|
+
try {
|
|
297
|
+
const body = optionalRecord(request.body);
|
|
298
|
+
return { models: await sessions.setModelEnabled(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), requireBoolean(body, "enabled"), managementContextFromHeaders(request.headers)) };
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
app.post(`${prefix}/sessions/:sessionId/models/scope`, async (request, reply) => {
|
|
222
305
|
try {
|
|
223
|
-
|
|
306
|
+
const body = optionalRecord(request.body);
|
|
307
|
+
const mode = body["mode"];
|
|
308
|
+
if (!isSessionModelScopeMode(mode))
|
|
309
|
+
throw new Error(t("server.main.6a6ece1f173c", "mode field must be all or current"));
|
|
310
|
+
return { models: await sessions.setModelScope(sessionLookupFromBody(request.params.sessionId, body), mode, managementContextFromHeaders(request.headers)) };
|
|
224
311
|
}
|
|
225
312
|
catch (error) {
|
|
226
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
313
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
227
314
|
}
|
|
228
315
|
});
|
|
229
316
|
app.post(`${prefix}/sessions/:sessionId/model`, async (request, reply) => {
|
|
@@ -232,7 +319,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
232
319
|
return await sessions.setModel(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "provider"), requireString(body, "modelId"), managementContextFromHeaders(request.headers));
|
|
233
320
|
}
|
|
234
321
|
catch (error) {
|
|
235
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
322
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
236
323
|
}
|
|
237
324
|
});
|
|
238
325
|
app.post(`${prefix}/sessions/:sessionId/model/cycle`, async (request, reply) => {
|
|
@@ -244,15 +331,35 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
244
331
|
return await sessions.cycleModel(sessionLookupFromBody(request.params.sessionId, body), direction ?? "forward", managementContextFromHeaders(request.headers));
|
|
245
332
|
}
|
|
246
333
|
catch (error) {
|
|
247
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
334
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
app.get(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
|
|
338
|
+
try {
|
|
339
|
+
return await sessions.getSessionDefaults(sessionLookupFromQuery(request.params.sessionId, request.query), managementContextFromHeaders(request.headers));
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
app.post(`${prefix}/sessions/:sessionId/defaults`, async (request, reply) => {
|
|
346
|
+
try {
|
|
347
|
+
const body = requireRecord(request.body);
|
|
348
|
+
return await sessions.setSessionDefaults(sessionLookupFromBody(request.params.sessionId, body), parseSessionDefaultsUpdate(body), managementContextFromHeaders(request.headers));
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
248
352
|
}
|
|
249
353
|
});
|
|
250
354
|
app.get(`${prefix}/sessions/:sessionId/thinking-levels`, async (request, reply) => {
|
|
355
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
356
|
+
if (ref === undefined)
|
|
357
|
+
return reply;
|
|
251
358
|
try {
|
|
252
|
-
return { levels: await sessions.availableThinkingLevels(
|
|
359
|
+
return { levels: await sessions.availableThinkingLevels(ref, managementContextFromHeaders(request.headers)) };
|
|
253
360
|
}
|
|
254
361
|
catch (error) {
|
|
255
|
-
return reply.code(
|
|
362
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
256
363
|
}
|
|
257
364
|
});
|
|
258
365
|
app.post(`${prefix}/sessions/:sessionId/thinking-level`, async (request, reply) => {
|
|
@@ -263,7 +370,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
263
370
|
return await sessions.setThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), requireThinkingLevel(body["level"]), managementContextFromHeaders(request.headers));
|
|
264
371
|
}
|
|
265
372
|
catch (error) {
|
|
266
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
373
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
267
374
|
}
|
|
268
375
|
});
|
|
269
376
|
app.post(`${prefix}/sessions/:sessionId/thinking-level/cycle`, async (request, reply) => {
|
|
@@ -272,15 +379,18 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
272
379
|
return await sessions.cycleThinkingLevel(sessionLookupFromBody(request.params.sessionId, body), managementContextFromHeaders(request.headers));
|
|
273
380
|
}
|
|
274
381
|
catch (error) {
|
|
275
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
382
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
276
383
|
}
|
|
277
384
|
});
|
|
278
385
|
app.get(`${prefix}/sessions/:sessionId/commands`, async (request, reply) => {
|
|
386
|
+
const ref = sessionRefFromQueryOr400(request.params.sessionId, request.query, reply, t);
|
|
387
|
+
if (ref === undefined)
|
|
388
|
+
return reply;
|
|
279
389
|
try {
|
|
280
|
-
return await sessions.commands(
|
|
390
|
+
return await sessions.commands(ref, managementContextFromHeaders(request.headers));
|
|
281
391
|
}
|
|
282
392
|
catch (error) {
|
|
283
|
-
return reply.code(
|
|
393
|
+
return reply.code(404).send({ error: errorMessage(error, t) });
|
|
284
394
|
}
|
|
285
395
|
});
|
|
286
396
|
app.post(`${prefix}/sessions/:sessionId/prompt`, async (request, reply) => {
|
|
@@ -291,7 +401,16 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
291
401
|
return { accepted: true };
|
|
292
402
|
}
|
|
293
403
|
catch (error) {
|
|
294
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
404
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
app.post(`${prefix}/sessions/:sessionId/queue/message`, async (request, reply) => {
|
|
408
|
+
try {
|
|
409
|
+
const body = requireRecord(request.body);
|
|
410
|
+
return await sessions.mutateQueueMessage(sessionLookupFromRequiredCwd(request.params.sessionId, body), parseQueueMessageMutation(body), managementContextFromHeaders(request.headers));
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
295
414
|
}
|
|
296
415
|
});
|
|
297
416
|
app.post(`${prefix}/sessions/:sessionId/queue/clear`, async (request, reply) => {
|
|
@@ -299,7 +418,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
299
418
|
return await sessions.clearQueue(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
|
|
300
419
|
}
|
|
301
420
|
catch (error) {
|
|
302
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
421
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
303
422
|
}
|
|
304
423
|
});
|
|
305
424
|
app.post(`${prefix}/sessions/:sessionId/ask/submit`, async (request, reply) => {
|
|
@@ -309,7 +428,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
309
428
|
return await sessions.submitAsk(sessionLookupFromBody(request.params.sessionId, body), askId, askUserSubmissionFromBody(body), managementContextFromHeaders(request.headers));
|
|
310
429
|
}
|
|
311
430
|
catch (error) {
|
|
312
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
431
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
313
432
|
}
|
|
314
433
|
});
|
|
315
434
|
app.post(`${prefix}/sessions/:sessionId/ask/cancel`, async (request, reply) => {
|
|
@@ -318,7 +437,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
318
437
|
return await sessions.cancelAsk(sessionLookupFromBody(request.params.sessionId, body), requireBoundedId(body["askId"], "askId"), managementContextFromHeaders(request.headers));
|
|
319
438
|
}
|
|
320
439
|
catch (error) {
|
|
321
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
440
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
322
441
|
}
|
|
323
442
|
});
|
|
324
443
|
app.post(`${prefix}/sessions/:sessionId/dialogs/answer`, async (request, reply) => {
|
|
@@ -328,7 +447,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
328
447
|
return await sessions.answerDialog(sessionLookupFromBody(request.params.sessionId, body), answer.dialogId, answer.value, managementContextFromHeaders(request.headers));
|
|
329
448
|
}
|
|
330
449
|
catch (error) {
|
|
331
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
450
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
332
451
|
}
|
|
333
452
|
});
|
|
334
453
|
app.post(`${prefix}/sessions/:sessionId/dialogs/cancel`, async (request, reply) => {
|
|
@@ -338,16 +457,16 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
338
457
|
return await sessions.cancelDialog(sessionLookupFromBody(request.params.sessionId, body), cancel.dialogId, managementContextFromHeaders(request.headers));
|
|
339
458
|
}
|
|
340
459
|
catch (error) {
|
|
341
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
460
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
342
461
|
}
|
|
343
462
|
});
|
|
344
463
|
app.post(`${prefix}/sessions/:sessionId/warnings/dismiss`, async (request, reply) => {
|
|
345
464
|
try {
|
|
346
465
|
const body = optionalRecord(request.body);
|
|
347
|
-
return await sessions.dismissWarning(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "dismissId"));
|
|
466
|
+
return await sessions.dismissWarning(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "dismissId"), managementContextFromHeaders(request.headers));
|
|
348
467
|
}
|
|
349
468
|
catch (error) {
|
|
350
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
469
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
351
470
|
}
|
|
352
471
|
});
|
|
353
472
|
app.post(`${prefix}/sessions/:sessionId/attachments`, async (request, reply) => {
|
|
@@ -360,7 +479,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
360
479
|
return { attachments };
|
|
361
480
|
}
|
|
362
481
|
catch (error) {
|
|
363
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
482
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
364
483
|
}
|
|
365
484
|
});
|
|
366
485
|
app.post(`${prefix}/sessions/:sessionId/shell`, async (request, reply) => {
|
|
@@ -370,7 +489,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
370
489
|
return { accepted: true };
|
|
371
490
|
}
|
|
372
491
|
catch (error) {
|
|
373
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
492
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
374
493
|
}
|
|
375
494
|
});
|
|
376
495
|
app.post(`${prefix}/sessions/:sessionId/commands/run`, async (request, reply) => {
|
|
@@ -379,7 +498,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
379
498
|
return await sessions.runCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "text"), managementContextFromHeaders(request.headers));
|
|
380
499
|
}
|
|
381
500
|
catch (error) {
|
|
382
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
501
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
383
502
|
}
|
|
384
503
|
});
|
|
385
504
|
app.post(`${prefix}/sessions/:sessionId/commands/respond`, async (request, reply) => {
|
|
@@ -388,7 +507,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
388
507
|
return await sessions.respondToCommand(sessionLookupFromBody(request.params.sessionId, body), requireString(body, "requestId"), requireString(body, "value"), managementContextFromHeaders(request.headers));
|
|
389
508
|
}
|
|
390
509
|
catch (error) {
|
|
391
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
510
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
392
511
|
}
|
|
393
512
|
});
|
|
394
513
|
app.post(`${prefix}/sessions/:sessionId/tree/navigate`, async (request, reply) => {
|
|
@@ -397,7 +516,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
397
516
|
return await sessions.navigateTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeNavigateRequestFromBody(body), managementContextFromHeaders(request.headers));
|
|
398
517
|
}
|
|
399
518
|
catch (error) {
|
|
400
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
519
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
401
520
|
}
|
|
402
521
|
});
|
|
403
522
|
app.post(`${prefix}/sessions/:sessionId/tree/fork`, async (request, reply) => {
|
|
@@ -406,7 +525,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
406
525
|
return await sessions.forkFromTree(sessionLookupFromBody(request.params.sessionId, body), sessionTreeForkRequestFromBody(body), managementContextFromHeaders(request.headers));
|
|
407
526
|
}
|
|
408
527
|
catch (error) {
|
|
409
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
528
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
410
529
|
}
|
|
411
530
|
});
|
|
412
531
|
app.post(`${prefix}/sessions/:sessionId/abort`, async (request, reply) => {
|
|
@@ -415,7 +534,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
415
534
|
return { aborted: true };
|
|
416
535
|
}
|
|
417
536
|
catch (error) {
|
|
418
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
537
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
419
538
|
}
|
|
420
539
|
});
|
|
421
540
|
app.post(`${prefix}/sessions/:sessionId/stop`, async (request, reply) => {
|
|
@@ -424,7 +543,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
424
543
|
return { stopped: true };
|
|
425
544
|
}
|
|
426
545
|
catch (error) {
|
|
427
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
546
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
428
547
|
}
|
|
429
548
|
});
|
|
430
549
|
app.post(`${prefix}/sessions/:sessionId/archive`, async (request, reply) => {
|
|
@@ -433,7 +552,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
433
552
|
return { archived: true };
|
|
434
553
|
}
|
|
435
554
|
catch (error) {
|
|
436
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
555
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
437
556
|
}
|
|
438
557
|
});
|
|
439
558
|
app.post(`${prefix}/sessions/:sessionId/archive-tree`, async (request, reply) => {
|
|
@@ -441,7 +560,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
441
560
|
return await sessions.archiveTree(sessionLookupFromBody(request.params.sessionId, optionalRecord(request.body)), managementContextFromHeaders(request.headers));
|
|
442
561
|
}
|
|
443
562
|
catch (error) {
|
|
444
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
563
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
445
564
|
}
|
|
446
565
|
});
|
|
447
566
|
app.post(`${prefix}/sessions/:sessionId/restore`, async (request, reply) => {
|
|
@@ -450,7 +569,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
450
569
|
return { restored: true };
|
|
451
570
|
}
|
|
452
571
|
catch (error) {
|
|
453
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
572
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
454
573
|
}
|
|
455
574
|
});
|
|
456
575
|
app.delete(`${prefix}/sessions/:sessionId`, async (request, reply) => {
|
|
@@ -459,7 +578,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
459
578
|
return { deleted: true };
|
|
460
579
|
}
|
|
461
580
|
catch (error) {
|
|
462
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
581
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
463
582
|
}
|
|
464
583
|
});
|
|
465
584
|
app.post(`${prefix}/sessions/:sessionId/reload`, async (request, reply) => {
|
|
@@ -468,7 +587,7 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
468
587
|
return { reloaded: true };
|
|
469
588
|
}
|
|
470
589
|
catch (error) {
|
|
471
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
590
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
472
591
|
}
|
|
473
592
|
});
|
|
474
593
|
app.post(`${prefix}/sessions/:sessionId/detach-parent`, async (request, reply) => {
|
|
@@ -477,13 +596,13 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
477
596
|
return { detached: true };
|
|
478
597
|
}
|
|
479
598
|
catch (error) {
|
|
480
|
-
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error) });
|
|
599
|
+
return reply.code(mutationErrorStatus(error)).send({ error: errorMessage(error, t) });
|
|
481
600
|
}
|
|
482
601
|
});
|
|
483
602
|
app.get(`${prefix}/sessions/:sessionId/events`, { websocket: true }, (socket, request) => {
|
|
484
603
|
// Only the id matters for event subscription; cwd is intentionally ignored
|
|
485
604
|
// so a malformed value cannot throw inside the websocket handler.
|
|
486
|
-
eventHub.add(request.params.sessionId, socket, eventScopeFromHeaders(request.headers));
|
|
605
|
+
eventHub.add(request.params.sessionId, socket, eventScopeFromHeaders(request.headers), request.query.media === SESSION_MEDIA_MODE ? SESSION_MEDIA_MODE : undefined);
|
|
487
606
|
});
|
|
488
607
|
app.get(`${prefix}/sessions/events`, { websocket: true }, (socket, request) => {
|
|
489
608
|
eventHub.addGlobal(socket, eventScopeFromHeaders(request.headers));
|
|
@@ -492,6 +611,9 @@ export function registerSessionRoutes(app, sessions, eventHub, prefix = "") {
|
|
|
492
611
|
eventHub.addGlobal(socket, eventScopeFromHeaders(request.headers));
|
|
493
612
|
});
|
|
494
613
|
}
|
|
614
|
+
function imageProjector(query, hub, ref, eventScope) {
|
|
615
|
+
return query.media === SESSION_MEDIA_MODE ? (image) => hub.mediaIndex.reference({ ...ref, eventScope }, image) : undefined;
|
|
616
|
+
}
|
|
495
617
|
function bulkMutationRefsFromBody(body) {
|
|
496
618
|
const record = requireRecord(body);
|
|
497
619
|
const sessions = record["sessions"];
|
|
@@ -506,7 +628,7 @@ function parseBulkMutationRef(value) {
|
|
|
506
628
|
throw new Error("id field must not be empty");
|
|
507
629
|
const cwd = record["cwd"];
|
|
508
630
|
if (typeof cwd !== "string" || cwd === "")
|
|
509
|
-
throw new
|
|
631
|
+
throw new UserFacingError("routing.cwdRequired", "cwd field is required");
|
|
510
632
|
return { id, cwd: normalizeRequestCwd(cwd) };
|
|
511
633
|
}
|
|
512
634
|
function notificationRefFromQuery(id, query) {
|
|
@@ -523,6 +645,15 @@ function notificationRef(id, cwd) {
|
|
|
523
645
|
cwd: normalizeRequestCwd(cwd),
|
|
524
646
|
};
|
|
525
647
|
}
|
|
648
|
+
function sessionRefFromQueryOr400(id, query, reply, t) {
|
|
649
|
+
try {
|
|
650
|
+
return sessionLookupFromQuery(id, query);
|
|
651
|
+
}
|
|
652
|
+
catch (error) {
|
|
653
|
+
reply.code(400).send({ error: errorMessage(error, t) });
|
|
654
|
+
return undefined;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
526
657
|
function sessionLookupFromQuery(id, query) {
|
|
527
658
|
return sessionLookupFromRequiredCwd(id, query, "cwd query parameter is required");
|
|
528
659
|
}
|
|
@@ -543,13 +674,13 @@ function sessionLookupFromBody(id, body) {
|
|
|
543
674
|
function sessionLookupFromRequiredCwd(id, value, message = "cwd query parameter is required") {
|
|
544
675
|
const cwd = value.cwd;
|
|
545
676
|
if (typeof cwd !== "string" || cwd === "")
|
|
546
|
-
throw new
|
|
677
|
+
throw new UserFacingError(message === "cwd field is required" ? "routing.cwdRequired" : "routing.cwdQueryRequired", message);
|
|
547
678
|
return { id, cwd: normalizeRequestCwd(cwd) };
|
|
548
679
|
}
|
|
549
680
|
function sessionTreeNavigateRequestFromBody(body) {
|
|
550
681
|
const targetId = requireNonEmptyString(body, "targetId");
|
|
551
682
|
const expectedLeafId = requireNullableString(body, "expectedLeafId");
|
|
552
|
-
return { targetId, expectedLeafId, summary: sessionTreeSummaryChoice(body["summary"]) };
|
|
683
|
+
return { targetId, expectedLeafId, summary: sessionTreeSummaryChoice(body["summary"]), ...optionalField("retainCheckpoint", optionalBoolean(body, "retainCheckpoint")) };
|
|
553
684
|
}
|
|
554
685
|
function sessionTreeSummaryChoice(value) {
|
|
555
686
|
const summary = requireRecord(value);
|
|
@@ -615,7 +746,7 @@ function requireBoundedId(value, field) {
|
|
|
615
746
|
function sessionTreeForkRequestFromBody(body) {
|
|
616
747
|
const entryId = requireNonEmptyString(body, "entryId");
|
|
617
748
|
const expectedLeafId = requireNullableString(body, "expectedLeafId");
|
|
618
|
-
return { entryId, expectedLeafId };
|
|
749
|
+
return { entryId, expectedLeafId, ...optionalField("retainCheckpoint", optionalBoolean(body, "retainCheckpoint")) };
|
|
619
750
|
}
|
|
620
751
|
function extensionDialogAnswerFromBody(body) {
|
|
621
752
|
const dialogId = requireNonEmptyBoundedString(body["dialogId"], "dialogId", EXTENSION_DIALOG_ID_MAX_LENGTH);
|
|
@@ -624,10 +755,10 @@ function extensionDialogAnswerFromBody(body) {
|
|
|
624
755
|
return { dialogId, value };
|
|
625
756
|
if (typeof value === "string") {
|
|
626
757
|
if (value.length > EXTENSION_DIALOG_INPUT_MAX_LENGTH)
|
|
627
|
-
throw new
|
|
758
|
+
throw new UserFacingError("routing.valueLength", "value exceeds its length limit");
|
|
628
759
|
return { dialogId, value };
|
|
629
760
|
}
|
|
630
|
-
throw new
|
|
761
|
+
throw new UserFacingError("routing.valueType", "value must be a boolean or string");
|
|
631
762
|
}
|
|
632
763
|
function extensionDialogCancelFromBody(body) {
|
|
633
764
|
return { dialogId: requireNonEmptyBoundedString(body["dialogId"], "dialogId", EXTENSION_DIALOG_ID_MAX_LENGTH) };
|
|
@@ -648,6 +779,15 @@ function requireString(record, field) {
|
|
|
648
779
|
throw new Error(`${field} field must be a string`);
|
|
649
780
|
return value;
|
|
650
781
|
}
|
|
782
|
+
function requireBoolean(record, field) {
|
|
783
|
+
const value = record[field];
|
|
784
|
+
if (typeof value !== "boolean")
|
|
785
|
+
throw new Error(`${field} field must be a boolean`);
|
|
786
|
+
return value;
|
|
787
|
+
}
|
|
788
|
+
function optionalBoolean(record, field) {
|
|
789
|
+
return record[field] === undefined ? undefined : requireBoolean(record, field);
|
|
790
|
+
}
|
|
651
791
|
function requireNonEmptyString(record, field) {
|
|
652
792
|
const value = requireString(record, field);
|
|
653
793
|
if (value.trim() === "")
|
|
@@ -701,8 +841,11 @@ function optionalNumber(value) {
|
|
|
701
841
|
const parsed = Number(value);
|
|
702
842
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
703
843
|
}
|
|
704
|
-
function
|
|
705
|
-
return
|
|
844
|
+
function isSessionModelScopeMode(value) {
|
|
845
|
+
return value === "all" || value === "current";
|
|
846
|
+
}
|
|
847
|
+
function errorMessage(error, t = loadNodeTranslator("server")) {
|
|
848
|
+
return userFacingErrorMessage(error, t);
|
|
706
849
|
}
|
|
707
850
|
function mutationErrorStatus(error) {
|
|
708
851
|
return isSessionNotFoundError(error) ? 404 : 400;
|
|
@@ -711,7 +854,7 @@ function notificationErrorStatus(error) {
|
|
|
711
854
|
return isSessionNotFoundError(error) ? 404 : 400;
|
|
712
855
|
}
|
|
713
856
|
function isSessionNotFoundError(error) {
|
|
714
|
-
const message =
|
|
857
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
715
858
|
return message === "Session not found" || message === "Archived session not found" || message === "未找到会话" || message === "未找到已归档会话";
|
|
716
859
|
}
|
|
717
860
|
function isRecord(value) {
|