@chainingintention/pi-web-cn 2.0.0 → 2.202610.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/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-vueV4eKR.js +4938 -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-C8f0d0CR.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 +158 -89
- 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,10 +1,34 @@
|
|
|
1
1
|
// Generated from pi-web-plugins/git/browser/pi-web-plugin.ts. Do not edit directly.
|
|
2
|
+
import { setTranslator } from "./i18n.js";
|
|
2
3
|
import { createGitBrowserContributions } from "./git-panel.js";
|
|
4
|
+
const stylesheetIntegrationCapability = {
|
|
5
|
+
pluginId: "pi-web", id: "stylesheet-integration", version: 1,
|
|
6
|
+
parse: (value) => {
|
|
7
|
+
if (!isStylesheetIntegration(value)) {
|
|
8
|
+
throw new Error("Invalid PI WEB stylesheet integration capability v1");
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
function isStylesheetIntegration(value) {
|
|
14
|
+
return typeof value === "object" && value !== null
|
|
15
|
+
&& "registerRoot" in value && typeof value.registerRoot === "function"
|
|
16
|
+
&& "subscribe" in value && typeof value.subscribe === "function"
|
|
17
|
+
&& "createController" in value && typeof value.createController === "function";
|
|
18
|
+
}
|
|
3
19
|
const plugin = {
|
|
4
|
-
apiVersion:
|
|
20
|
+
apiVersion: 4,
|
|
5
21
|
name: "Git",
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
22
|
+
requires: [stylesheetIntegrationCapability],
|
|
23
|
+
activate: ({ pluginId, runtimePluginId, html, svg, translate }) => {
|
|
24
|
+
setTranslator(translate);
|
|
25
|
+
let stylesheetIntegration;
|
|
26
|
+
return {
|
|
27
|
+
start: ({ capabilities }) => {
|
|
28
|
+
stylesheetIntegration = capabilities.resolve(stylesheetIntegrationCapability);
|
|
29
|
+
},
|
|
30
|
+
contributions: createGitBrowserContributions(pluginId, runtimePluginId, html, svg, () => stylesheetIntegration),
|
|
31
|
+
};
|
|
32
|
+
},
|
|
9
33
|
};
|
|
10
34
|
export default plugin;
|
|
@@ -1,38 +1,58 @@
|
|
|
1
1
|
// Generated from pi-web-plugins/git/git-backend.ts. Do not edit directly.
|
|
2
|
+
import { t } from "./i18n.js";
|
|
2
3
|
import { createHash } from "node:crypto";
|
|
3
4
|
import { realpath } from "node:fs/promises";
|
|
5
|
+
import { GitStatusCache } from "./gitStatusCache.js";
|
|
4
6
|
import { isAbsolute, join, relative, sep } from "node:path";
|
|
5
7
|
import { GIT_DIFF_OPERATION, GIT_STATUS_OPERATION, } from "./browser/git-contract.js";
|
|
6
8
|
export { GIT_DIFF_OPERATION, GIT_STATUS_OPERATION } from "./browser/git-contract.js";
|
|
7
9
|
const GIT_COMMAND_TIMEOUT_MS = 10_000;
|
|
10
|
+
const statusCaches = new WeakMap();
|
|
8
11
|
const GIT_LOCAL_ENV_VARS = Object.freeze([
|
|
9
12
|
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
10
13
|
"GIT_COMMON_DIR",
|
|
14
|
+
"GIT_CONFIG",
|
|
15
|
+
"GIT_CONFIG_COUNT",
|
|
16
|
+
"GIT_CONFIG_PARAMETERS",
|
|
11
17
|
"GIT_DIR",
|
|
18
|
+
"GIT_GRAFT_FILE",
|
|
19
|
+
"GIT_IMPLICIT_WORK_TREE",
|
|
12
20
|
"GIT_INDEX_FILE",
|
|
21
|
+
"GIT_NO_REPLACE_OBJECTS",
|
|
13
22
|
"GIT_OBJECT_DIRECTORY",
|
|
14
23
|
"GIT_PREFIX",
|
|
15
24
|
"GIT_QUARANTINE_PATH",
|
|
25
|
+
"GIT_REPLACE_REF_BASE",
|
|
26
|
+
"GIT_SHALLOW_FILE",
|
|
16
27
|
"GIT_WORK_TREE",
|
|
17
28
|
]);
|
|
18
|
-
/** Dispatch the Git
|
|
29
|
+
/** Dispatch the Git status/diff schema through the package peer request seam. */
|
|
19
30
|
export async function requestGitBackend(activationContext, request) {
|
|
20
31
|
const runGit = createGitRunner(activationContext, request.signal);
|
|
21
32
|
if (request.operation === GIT_STATUS_OPERATION) {
|
|
22
33
|
requireStatusInput(request.input);
|
|
23
|
-
|
|
34
|
+
let cache = statusCaches.get(activationContext);
|
|
35
|
+
if (cache === undefined) {
|
|
36
|
+
cache = new GitStatusCache((cwd, signal) => gitStatus(activationContext, cwd, signal));
|
|
37
|
+
statusCaches.set(activationContext, cache);
|
|
38
|
+
}
|
|
39
|
+
const key = JSON.stringify([request.project.id, request.project.path, request.workspace.id, request.workspace.path, request.workspace.provider]);
|
|
40
|
+
return statusPeerResponse(await cache.get(key, request.workspace.path, request.signal, request.input !== null));
|
|
24
41
|
}
|
|
25
42
|
if (request.operation === GIT_DIFF_OPERATION) {
|
|
26
|
-
return
|
|
43
|
+
return diffPeerResponse(await gitDiffWithRunner(runGit, request.workspace.path, parseDiffInput(request.input)));
|
|
27
44
|
}
|
|
28
45
|
throw new Error(`Unsupported Git workspace backend operation: ${request.operation}`);
|
|
29
46
|
}
|
|
47
|
+
export async function gitStatus(context, cwd, signal) {
|
|
48
|
+
return gitStatusWithRunner(createGitRunner(context, signal), cwd);
|
|
49
|
+
}
|
|
30
50
|
async function gitStatusWithRunner(runGit, cwd) {
|
|
31
51
|
const result = await runGit(cwd, ["status", "--porcelain=v2", "--branch", "--untracked-files=all", "-z"]);
|
|
32
52
|
if (result.code !== 0)
|
|
33
|
-
return { isGitRepo: false, hash: hash(result.stdout + result.stderr), files: [], submodules: [] };
|
|
34
|
-
const parsed = parseStatus(result.stdout, { deferSubmodules: true });
|
|
35
|
-
return expandSubmodules(runGit, cwd, parsed, result.stdout);
|
|
53
|
+
return { isGitRepo: false, hash: hash(result.stdout + result.stderr), files: [], submodules: [], ...(result.truncated ? { truncated: true } : {}) };
|
|
54
|
+
const parsed = parseStatus(result.truncated ? result.stdout.slice(0, result.stdout.lastIndexOf("\0") + 1) : result.stdout, { deferSubmodules: true });
|
|
55
|
+
return expandSubmodules(runGit, await gitWorktreeRoot(runGit, cwd), parsed, result.stdout, result.truncated);
|
|
36
56
|
}
|
|
37
57
|
/**
|
|
38
58
|
* Merge each dirty submodule's own changes into the flat file list. A moved
|
|
@@ -41,7 +61,7 @@ async function gitStatusWithRunner(runGit, cwd) {
|
|
|
41
61
|
* entries under `<submodule>/<inner path>`. A plain `-dirty` pointer (commit
|
|
42
62
|
* unchanged) is intentionally not surfaced as a pointer entry.
|
|
43
63
|
*/
|
|
44
|
-
async function expandSubmodules(runGit, cwd, parsed, topRaw) {
|
|
64
|
+
async function expandSubmodules(runGit, cwd, parsed, topRaw, topTruncated) {
|
|
45
65
|
// Fan out concurrently — one `git status` per dirty submodule plus one
|
|
46
66
|
// `git rev-parse` per unstaged pointer move — then concatenate in input
|
|
47
67
|
// order so the file list and hash are identical to a serial pass.
|
|
@@ -55,10 +75,12 @@ async function expandSubmodules(runGit, cwd, parsed, topRaw) {
|
|
|
55
75
|
const files = [...parsed.files];
|
|
56
76
|
const dirtySubmodulePaths = [];
|
|
57
77
|
let extraForHash = "";
|
|
78
|
+
let truncated = topTruncated;
|
|
58
79
|
for (const part of expanded) {
|
|
59
80
|
dirtySubmodulePaths.push(part.path);
|
|
60
81
|
files.push(...part.files);
|
|
61
82
|
extraForHash += part.extraForHash;
|
|
83
|
+
truncated ||= part.truncated;
|
|
62
84
|
}
|
|
63
85
|
return {
|
|
64
86
|
isGitRepo: true,
|
|
@@ -69,12 +91,14 @@ async function expandSubmodules(runGit, cwd, parsed, topRaw) {
|
|
|
69
91
|
...(parsed.behind === undefined ? {} : { behind: parsed.behind }),
|
|
70
92
|
files,
|
|
71
93
|
submodules: dirtySubmodulePaths,
|
|
94
|
+
...(truncated ? { truncated: true } : {}),
|
|
72
95
|
};
|
|
73
96
|
}
|
|
74
97
|
/** Expand one dirty submodule: the pointer entry first, then its inner files. */
|
|
75
98
|
async function expandSubmodule(runGit, sub, location) {
|
|
76
99
|
const files = [];
|
|
77
100
|
let extraForHash = "";
|
|
101
|
+
let truncated = false;
|
|
78
102
|
if (sub.commitChanged) {
|
|
79
103
|
files.push({
|
|
80
104
|
path: sub.path,
|
|
@@ -86,9 +110,10 @@ async function expandSubmodule(runGit, sub, location) {
|
|
|
86
110
|
}
|
|
87
111
|
if ((sub.hasModifiedContent || sub.hasUntrackedContent) && location !== undefined) {
|
|
88
112
|
const inner = await runGit(location.cwd, ["status", "--porcelain=v2", "--untracked-files=all", "-z"]);
|
|
113
|
+
truncated = inner.truncated;
|
|
89
114
|
if (inner.code === 0) {
|
|
90
115
|
extraForHash = `\0${sub.path}\0${inner.stdout}`;
|
|
91
|
-
const innerFiles = parseStatus(inner.stdout, { deferSubmodules: false }).files;
|
|
116
|
+
const innerFiles = parseStatus(inner.truncated ? inner.stdout.slice(0, inner.stdout.lastIndexOf("\0") + 1) : inner.stdout, { deferSubmodules: false }).files;
|
|
92
117
|
for (const file of innerFiles) {
|
|
93
118
|
files.push({
|
|
94
119
|
...file,
|
|
@@ -99,7 +124,7 @@ async function expandSubmodule(runGit, sub, location) {
|
|
|
99
124
|
}
|
|
100
125
|
// non-zero exit: uninitialized / unreadable submodule — skip silently
|
|
101
126
|
}
|
|
102
|
-
return { files, extraForHash };
|
|
127
|
+
return { files, extraForHash, truncated };
|
|
103
128
|
}
|
|
104
129
|
async function resolveSubmoduleToCommit(runGit, cwd, sub) {
|
|
105
130
|
// Staged pointer moves already expose the new commit as the index OID; an
|
|
@@ -111,11 +136,16 @@ async function resolveSubmoduleToCommit(runGit, cwd, sub) {
|
|
|
111
136
|
const resolved = head.stdout.trim();
|
|
112
137
|
return head.code === 0 && resolved !== "" ? resolved : sub.indexOid;
|
|
113
138
|
}
|
|
139
|
+
export async function gitDiff(context, cwd, options, signal) {
|
|
140
|
+
return gitDiffWithRunner(createGitRunner(context, signal), cwd, options);
|
|
141
|
+
}
|
|
114
142
|
async function gitDiffWithRunner(runGit, cwd, options) {
|
|
115
143
|
const staged = options.staged === true;
|
|
116
144
|
let path;
|
|
117
145
|
if (options.path !== undefined && options.path !== "")
|
|
118
146
|
path = normalizeRelativePath(options.path);
|
|
147
|
+
// Diff/status paths belong to the repository, not a folder project's session cwd.
|
|
148
|
+
cwd = await gitWorktreeRoot(runGit, cwd);
|
|
119
149
|
if (path !== undefined) {
|
|
120
150
|
const owner = await submoduleForPath(runGit, cwd, path);
|
|
121
151
|
if (owner !== undefined)
|
|
@@ -128,11 +158,11 @@ async function gitDiffWithRunner(runGit, cwd, options) {
|
|
|
128
158
|
args.push("--", path);
|
|
129
159
|
const result = await runGit(cwd, args);
|
|
130
160
|
if (result.code !== 0)
|
|
131
|
-
throw new Error(result.stderr.trim() || "git diff
|
|
161
|
+
throw new Error(result.stderr.trim() || t("ui.main.0a7b52df3fee", "git diff failed"));
|
|
132
162
|
if (!staged && path !== undefined && result.stdout === "" && await isUntracked(runGit, cwd, path)) {
|
|
133
163
|
const untracked = await runGit(cwd, ["diff", "--no-ext-diff", "--color=never", "--no-index", "/dev/null", "--", path]);
|
|
134
164
|
if (untracked.code !== 0 && untracked.code !== 1)
|
|
135
|
-
throw new Error(untracked.stderr.trim() || "git diff
|
|
165
|
+
throw new Error(untracked.stderr.trim() || t("ui.main.0a7b52df3fee", "git diff failed"));
|
|
136
166
|
return { path, staged, hash: hash(untracked.stdout), diff: untracked.stdout, truncated: untracked.truncated };
|
|
137
167
|
}
|
|
138
168
|
return { ...(path === undefined ? {} : { path }), staged, hash: hash(result.stdout), diff: result.stdout, truncated: result.truncated };
|
|
@@ -152,15 +182,24 @@ async function submoduleDiff(runGit, owner, path, staged) {
|
|
|
152
182
|
args.push("--", rel);
|
|
153
183
|
const result = await runGit(subCwd, args);
|
|
154
184
|
if (result.code !== 0)
|
|
155
|
-
throw new Error(result.stderr.trim() || "git diff
|
|
185
|
+
throw new Error(result.stderr.trim() || t("ui.main.0a7b52df3fee", "git diff failed"));
|
|
156
186
|
if (!staged && result.stdout === "" && await isUntracked(runGit, subCwd, rel)) {
|
|
157
187
|
const untracked = await runGit(subCwd, ["diff", "--no-ext-diff", "--color=never", "--no-index", "/dev/null", "--", rel]);
|
|
158
188
|
if (untracked.code !== 0 && untracked.code !== 1)
|
|
159
|
-
throw new Error(untracked.stderr.trim() || "git diff
|
|
189
|
+
throw new Error(untracked.stderr.trim() || t("ui.main.0a7b52df3fee", "git diff failed"));
|
|
160
190
|
return { path, staged, hash: hash(untracked.stdout), diff: untracked.stdout, truncated: untracked.truncated };
|
|
161
191
|
}
|
|
162
192
|
return { path, staged, hash: hash(result.stdout), diff: result.stdout, truncated: result.truncated };
|
|
163
193
|
}
|
|
194
|
+
async function gitWorktreeRoot(runGit, cwd) {
|
|
195
|
+
const result = await runGit(cwd, ["rev-parse", "--show-toplevel"]);
|
|
196
|
+
if (result.code !== 0)
|
|
197
|
+
throw new Error(result.stderr.trim() || t("git.cwdRootUnavailable", "Cannot resolve Git worktree root"));
|
|
198
|
+
const root = result.stdout.replace(/\r?\n$/u, "");
|
|
199
|
+
if (!isAbsolute(root))
|
|
200
|
+
throw new Error(t("git.cwdRootInvalid", "Git returned an invalid worktree root"));
|
|
201
|
+
return root;
|
|
202
|
+
}
|
|
164
203
|
async function isUntracked(runGit, cwd, path) {
|
|
165
204
|
const result = await runGit(cwd, ["ls-files", "--others", "--exclude-standard", "-z", "--", path]);
|
|
166
205
|
return result.code === 0 && result.stdout.split("\0").includes(path);
|
|
@@ -345,7 +384,7 @@ function displayFromCommit(headOid) {
|
|
|
345
384
|
function hash(value) {
|
|
346
385
|
return createHash("sha1").update(value).digest("hex");
|
|
347
386
|
}
|
|
348
|
-
function
|
|
387
|
+
function statusPeerResponse(status) {
|
|
349
388
|
return {
|
|
350
389
|
isGitRepo: status.isGitRepo,
|
|
351
390
|
hash: status.hash,
|
|
@@ -362,9 +401,10 @@ function statusProviderResponse(status) {
|
|
|
362
401
|
...(file.submoduleToCommit === undefined ? {} : { submoduleToCommit: file.submoduleToCommit }),
|
|
363
402
|
})),
|
|
364
403
|
submodules: status.submodules,
|
|
404
|
+
...(status.truncated === true ? { truncated: true } : {}),
|
|
365
405
|
};
|
|
366
406
|
}
|
|
367
|
-
function
|
|
407
|
+
function diffPeerResponse(diff) {
|
|
368
408
|
return {
|
|
369
409
|
...(diff.path === undefined ? {} : { path: diff.path }),
|
|
370
410
|
staged: diff.staged,
|
|
@@ -397,21 +437,21 @@ function commandResult(result, args) {
|
|
|
397
437
|
};
|
|
398
438
|
}
|
|
399
439
|
function requireStatusInput(input) {
|
|
400
|
-
if (input !== null)
|
|
401
|
-
throw new Error("Git
|
|
440
|
+
if (input !== null && !(isRecord(input) && input["refresh"] === true && Object.keys(input).length === 1))
|
|
441
|
+
throw new Error(t("ui.main.ec33070a9080", "Git status input must be null or a refresh object"));
|
|
402
442
|
}
|
|
403
443
|
function parseDiffInput(input) {
|
|
404
444
|
if (!isRecord(input))
|
|
405
|
-
throw new Error("Git
|
|
445
|
+
throw new Error(t("ui.main.4ae7ff3e02c0", "Git diff input must be an object"));
|
|
406
446
|
const unsupported = Object.keys(input).find((key) => key !== "path" && key !== "staged");
|
|
407
447
|
if (unsupported !== undefined)
|
|
408
|
-
throw new Error(
|
|
448
|
+
throw new Error(t("ui.main.629f180b2bba", "Git diff input contains an unsupported field: {arg0}", { arg0: unsupported }));
|
|
409
449
|
const path = input["path"];
|
|
410
450
|
const staged = input["staged"];
|
|
411
451
|
if (path !== undefined && typeof path !== "string")
|
|
412
|
-
throw new Error("Git
|
|
452
|
+
throw new Error(t("ui.main.f1d20e0c6fa6", "Git diff input path must be a string"));
|
|
413
453
|
if (staged !== undefined && typeof staged !== "boolean")
|
|
414
|
-
throw new Error("Git
|
|
454
|
+
throw new Error(t("ui.main.bebd7c4f895a", "Git diff input staged must be a boolean"));
|
|
415
455
|
return {
|
|
416
456
|
...(path === undefined ? {} : { path }),
|
|
417
457
|
...(staged === undefined ? {} : { staged }),
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Generated from pi-web-plugins/git/gitStatusCache.ts. Do not edit directly.
|
|
2
|
+
/** Completed snapshots are shared; cancellable scans belong to their exact invocation signal. */
|
|
3
|
+
export class GitStatusCache {
|
|
4
|
+
scan;
|
|
5
|
+
now;
|
|
6
|
+
entries = new Map();
|
|
7
|
+
constructor(scan, now = Date.now) {
|
|
8
|
+
this.scan = scan;
|
|
9
|
+
this.now = now;
|
|
10
|
+
}
|
|
11
|
+
get(key, cwd, signal, force = false) {
|
|
12
|
+
signal.throwIfAborted();
|
|
13
|
+
const entry = this.entries.get(key) ?? { expires: 0, generation: 0, pending: new Map() };
|
|
14
|
+
const pending = entry.pending.get(signal);
|
|
15
|
+
if (pending !== undefined)
|
|
16
|
+
return pending;
|
|
17
|
+
if (!force && entry.value !== undefined && entry.expires > this.now())
|
|
18
|
+
return Promise.resolve(entry.value);
|
|
19
|
+
this.entries.set(key, entry);
|
|
20
|
+
if (force)
|
|
21
|
+
delete entry.value;
|
|
22
|
+
const generation = ++entry.generation;
|
|
23
|
+
const request = Promise.resolve().then(() => this.scan(cwd, signal)).then((status) => {
|
|
24
|
+
signal.throwIfAborted();
|
|
25
|
+
if (entry.generation === generation) {
|
|
26
|
+
if (status.isGitRepo) {
|
|
27
|
+
entry.value = status;
|
|
28
|
+
entry.expires = this.now() + 2000;
|
|
29
|
+
}
|
|
30
|
+
else
|
|
31
|
+
delete entry.value;
|
|
32
|
+
}
|
|
33
|
+
return status;
|
|
34
|
+
}).catch((error) => {
|
|
35
|
+
if (entry.generation === generation)
|
|
36
|
+
delete entry.value;
|
|
37
|
+
throw error;
|
|
38
|
+
}).finally(() => {
|
|
39
|
+
entry.pending.delete(signal);
|
|
40
|
+
for (const [oldKey, old] of this.entries) {
|
|
41
|
+
if (old.pending.size === 0 && (old.value === undefined || old.expires <= this.now()))
|
|
42
|
+
this.entries.delete(oldKey);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
entry.pending.set(signal, request);
|
|
46
|
+
return request;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Generated from pi-web-plugins/git/i18n.ts. Do not edit directly.
|
|
2
|
+
let translate;
|
|
3
|
+
export function setTranslator(value) {
|
|
4
|
+
translate = value;
|
|
5
|
+
}
|
|
6
|
+
export const t = (key, fallback, params) => translate?.(key, fallback, params)
|
|
7
|
+
?? fallback.replace(/\{([A-Za-z0-9_]+)\}/g, (match, name) => String(params?.[name] ?? match));
|
|
@@ -1,47 +1,68 @@
|
|
|
1
1
|
// Generated from pi-web-plugins/git/server-plugin.ts. Do not edit directly.
|
|
2
|
+
import { t, setTranslator } from "./i18n.js";
|
|
2
3
|
import { basename, resolve } from "node:path";
|
|
3
4
|
import { requestGitBackend } from "./git-backend.js";
|
|
5
|
+
import { createWorkspaceDiscoveryHooks } from "./workspaceDiscoveryHooks.js";
|
|
4
6
|
const GIT_LOCAL_ENV_VARS = Object.freeze([
|
|
5
7
|
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
6
8
|
"GIT_COMMON_DIR",
|
|
9
|
+
"GIT_CONFIG",
|
|
10
|
+
"GIT_CONFIG_COUNT",
|
|
11
|
+
"GIT_CONFIG_PARAMETERS",
|
|
7
12
|
"GIT_DIR",
|
|
13
|
+
"GIT_GRAFT_FILE",
|
|
14
|
+
"GIT_IMPLICIT_WORK_TREE",
|
|
8
15
|
"GIT_INDEX_FILE",
|
|
16
|
+
"GIT_NO_REPLACE_OBJECTS",
|
|
9
17
|
"GIT_OBJECT_DIRECTORY",
|
|
10
18
|
"GIT_PREFIX",
|
|
11
19
|
"GIT_QUARANTINE_PATH",
|
|
20
|
+
"GIT_REPLACE_REF_BASE",
|
|
21
|
+
"GIT_SHALLOW_FILE",
|
|
12
22
|
"GIT_WORK_TREE",
|
|
13
23
|
]);
|
|
14
24
|
const plugin = {
|
|
15
|
-
apiVersion:
|
|
25
|
+
apiVersion: 3,
|
|
16
26
|
name: "Git",
|
|
17
27
|
activate(context) {
|
|
18
|
-
|
|
28
|
+
setTranslator(context.translate);
|
|
29
|
+
return {
|
|
30
|
+
workspaceProvider: createGitWorkspaceProvider(context, process.env["PI_WEB_INSTANCE_NAMESPACE"] ?? ""),
|
|
31
|
+
peer: { request: (request) => requestGitBackend(context, request) },
|
|
32
|
+
};
|
|
19
33
|
},
|
|
20
34
|
};
|
|
21
35
|
export default plugin;
|
|
22
|
-
export function createGitWorkspaceProvider(context) {
|
|
36
|
+
export function createGitWorkspaceProvider(context, instanceNamespace = "") {
|
|
23
37
|
return Object.freeze({
|
|
24
38
|
fallback: true,
|
|
39
|
+
integration: createWorkspaceDiscoveryHooks(context, (cwd, args, signal) => runGit(context, cwd, args, signal), process.execPath, instanceNamespace),
|
|
25
40
|
async probe(project, signal) {
|
|
26
41
|
const result = await runGit(context, project.path, ["rev-parse", "--is-inside-work-tree"], signal);
|
|
27
42
|
if (result.signal !== null)
|
|
28
|
-
throw new Error(
|
|
43
|
+
throw new Error(t("ui.main.8919cbc9c0bd", "Git repository probe ended with signal {arg0}", { arg0: result.signal }));
|
|
29
44
|
if (result.exitCode !== 0)
|
|
30
45
|
return "pass";
|
|
31
|
-
|
|
46
|
+
if (result.stdout.trim() !== "true")
|
|
47
|
+
return "pass";
|
|
48
|
+
const root = await requireGit(runGit(context, project.path, ["rev-parse", "--show-toplevel"], signal), t("ui.main.49c35c822771", "resolve the Git worktree root"));
|
|
49
|
+
if (root.stdout.trim() === "")
|
|
50
|
+
throw new Error(t("ui.main.f1639c9e2fd7", "Git returned an empty worktree root"));
|
|
51
|
+
// A folder project keeps its cwd; only checkout roots own worktree discovery.
|
|
52
|
+
return resolve(root.stdout.trim()) === resolve(project.path) ? "claim" : "pass";
|
|
32
53
|
},
|
|
33
54
|
async list(project, signal) {
|
|
34
|
-
const rootResult = await requireGit(runGit(context, project.path, ["rev-parse", "--show-toplevel"], signal), "
|
|
55
|
+
const rootResult = await requireGit(runGit(context, project.path, ["rev-parse", "--show-toplevel"], signal), t("ui.main.49c35c822771", "resolve the Git worktree root"));
|
|
35
56
|
const mainRootOutput = rootResult.stdout.trim();
|
|
36
57
|
if (mainRootOutput === "")
|
|
37
|
-
throw new Error("Git
|
|
58
|
+
throw new Error(t("ui.main.f1639c9e2fd7", "Git returned an empty worktree root"));
|
|
38
59
|
const mainRoot = resolve(mainRootOutput);
|
|
39
|
-
const commonDirectoryResult = await requireGit(runGit(context, project.path, ["rev-parse", "--git-common-dir"], signal), "resolve the Git common directory");
|
|
60
|
+
const commonDirectoryResult = await requireGit(runGit(context, project.path, ["rev-parse", "--git-common-dir"], signal), t("ui.main.d59fce8c03cf", "resolve the Git common directory"));
|
|
40
61
|
const commonDirectoryOutput = commonDirectoryResult.stdout.trim();
|
|
41
62
|
if (commonDirectoryOutput === "")
|
|
42
|
-
throw new Error("Git
|
|
63
|
+
throw new Error(t("ui.main.8d51c7fbda53", "Git returned an empty common directory"));
|
|
43
64
|
const commonDirectory = resolve(project.path, commonDirectoryOutput);
|
|
44
|
-
const listResult = await requireGit(runGit(context, project.path, ["worktree", "list", "--porcelain", "-z"], signal), "
|
|
65
|
+
const listResult = await requireGit(runGit(context, project.path, ["worktree", "list", "--porcelain", "-z"], signal), t("ui.main.09734cee0f68", "list Git worktrees"));
|
|
45
66
|
const worktrees = parseGitWorktreeList(listResult.stdout)
|
|
46
67
|
.filter((worktree) => worktree.bare !== true)
|
|
47
68
|
.map((worktree) => {
|
|
@@ -60,7 +81,7 @@ export function createGitWorkspaceProvider(context) {
|
|
|
60
81
|
if (selectable.length === 0)
|
|
61
82
|
return [singleGitWorkspace(project)];
|
|
62
83
|
return selectable.map(({ worktree, path, isMain }) => {
|
|
63
|
-
const label = worktree.branch ?? (worktree.detached === true ? "
|
|
84
|
+
const label = worktree.branch ?? (worktree.detached === true ? t("ui.workspaceGitPanel.detachedHead", "Detached HEAD") : basename(worktree.path) || worktree.path);
|
|
64
85
|
return {
|
|
65
86
|
key: path,
|
|
66
87
|
path,
|
|
@@ -80,22 +101,21 @@ export function createGitWorkspaceProvider(context) {
|
|
|
80
101
|
};
|
|
81
102
|
});
|
|
82
103
|
},
|
|
83
|
-
request: (request) => requestGitBackend(context, request),
|
|
84
104
|
async prepareRemove({ project, workspace, signal }) {
|
|
85
105
|
const privatePath = gitPrivateWorktreePath(workspace);
|
|
86
106
|
if (resolve(privatePath) !== workspace.path) {
|
|
87
|
-
throw new Error("Git
|
|
107
|
+
throw new Error(t("ui.main.ee323b371b28", "Git workspace removal data no longer matches the current workspace path"));
|
|
88
108
|
}
|
|
89
|
-
const listResult = await requireGit(runGit(context, project.path, ["worktree", "list", "--porcelain", "-z"], signal), "
|
|
109
|
+
const listResult = await requireGit(runGit(context, project.path, ["worktree", "list", "--porcelain", "-z"], signal), t("ui.main.67b7774d37e3", "validate the Git worktree before removal"));
|
|
90
110
|
const current = parseGitWorktreeList(listResult.stdout)
|
|
91
111
|
.find((worktree) => resolve(worktree.path) === workspace.path);
|
|
92
112
|
if (current === undefined || current.prunable === true) {
|
|
93
|
-
throw new Error("Git
|
|
113
|
+
throw new Error(t("ui.main.2eaaec45ffc2", "Git worktree is no longer available for removal"));
|
|
94
114
|
}
|
|
95
115
|
if (current.bare === true)
|
|
96
|
-
throw new Error("
|
|
116
|
+
throw new Error(t("ui.main.e316bd0c1e32", "A bare Git workspace cannot be removed as a linked worktree"));
|
|
97
117
|
return {
|
|
98
|
-
title:
|
|
118
|
+
title: t("ui.shared.168f8f19045c", "Delete workspace: {workspace}", { workspace: workspace.label }),
|
|
99
119
|
command: `git worktree remove ${shellQuote(workspace.path)}`,
|
|
100
120
|
};
|
|
101
121
|
},
|
|
@@ -137,18 +157,18 @@ function singleGitWorkspace(project) {
|
|
|
137
157
|
}
|
|
138
158
|
function gitRemovalPresentation(label, path) {
|
|
139
159
|
return {
|
|
140
|
-
actionLabel: "
|
|
141
|
-
confirmation:
|
|
160
|
+
actionLabel: t("client.actions.delete.workspace.1bca7e", "Delete workspace"),
|
|
161
|
+
confirmation: t("ui.main.8e2b2416adcd", "Delete workspace {arg0}?\n\nThis runs git worktree remove and deletes:\n{arg1}\n\nThe corresponding Git branch will not be deleted.", { arg0: label, arg1: path }),
|
|
142
162
|
};
|
|
143
163
|
}
|
|
144
164
|
function gitPrivateWorktreePath(workspace) {
|
|
145
165
|
const data = workspace.data;
|
|
146
166
|
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
147
|
-
throw new Error("Git
|
|
167
|
+
throw new Error(t("ui.main.b6c981521483", "Git workspace removal data is unavailable"));
|
|
148
168
|
}
|
|
149
169
|
const path = Reflect.get(data, "worktreePath");
|
|
150
170
|
if (typeof path !== "string" || path === "")
|
|
151
|
-
throw new Error("
|
|
171
|
+
throw new Error(t("ui.main.2f42169d50eb", "Git worktree path is unavailable for removal"));
|
|
152
172
|
return path;
|
|
153
173
|
}
|
|
154
174
|
function shellQuote(value) {
|
|
@@ -159,10 +179,11 @@ async function runGit(context, cwd, args, signal) {
|
|
|
159
179
|
file: "git",
|
|
160
180
|
args: ["-C", cwd, ...args],
|
|
161
181
|
unsetEnv: GIT_LOCAL_ENV_VARS,
|
|
182
|
+
timeoutMs: 10_000,
|
|
162
183
|
signal,
|
|
163
184
|
});
|
|
164
185
|
if (result.stdoutTruncated || result.stderrTruncated) {
|
|
165
|
-
throw new Error(
|
|
186
|
+
throw new Error(t("ui.main.f1dbb26bf138", "git {arg0} exceeded the host output limit", { arg0: args.join(" ") }));
|
|
166
187
|
}
|
|
167
188
|
return result;
|
|
168
189
|
}
|
|
@@ -171,6 +192,6 @@ async function requireGit(resultPromise, action) {
|
|
|
171
192
|
if (result.signal === null && result.exitCode === 0)
|
|
172
193
|
return result;
|
|
173
194
|
const detail = result.stderr.trim();
|
|
174
|
-
const outcome = result.signal === null ?
|
|
175
|
-
throw new Error(
|
|
195
|
+
const outcome = result.signal === null ? t("client.shellMessages.exit.code.2beadf", "Exit code {value1}", { value1: String(result.exitCode) }) : t("ui.main.c008196ee907", "signal {arg0}", { arg0: result.signal });
|
|
196
|
+
throw new Error(t("ui.main.0def9a625382", "Could not {arg0} ({arg1}){arg2}", { arg0: action, arg1: outcome, arg2: detail === "" ? "" : `:${detail}` }));
|
|
176
197
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Packaged with PI WEB: best-effort discovery hint, never Git authority.
|
|
2
|
+
const { spawnSync } = require("node:child_process");
|
|
3
|
+
const [notification, ...args] = process.argv.slice(2);
|
|
4
|
+
|
|
5
|
+
// Initial worktree checkout has a null previous OID and branch flag 1.
|
|
6
|
+
// --no-checkout skips this hook; ordinary catalog access still discovers it.
|
|
7
|
+
if (args.length === 3 && /^(?:0{40}|0{64})$/.test(args[0]) && args[2] === "1") {
|
|
8
|
+
try {
|
|
9
|
+
const command = JSON.parse(notification);
|
|
10
|
+
if (Array.isArray(command) && command.length > 0 && command.every((value) => typeof value === "string")) {
|
|
11
|
+
spawnSync(command[0], command.slice(1), { stdio: "ignore", timeout: 2000, killSignal: "SIGKILL" });
|
|
12
|
+
}
|
|
13
|
+
} catch { /* Invalid arguments, missing commands, and daemon failures must not affect Git. */ }
|
|
14
|
+
}
|