@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,4 +1,5 @@
|
|
|
1
1
|
// Generated from pi-web-plugins/git/browser/git-panel.ts. Do not edit directly.
|
|
2
|
+
import { t } from "./i18n.js";
|
|
2
3
|
import { GIT_DIFF_OPERATION, GIT_STATUS_OPERATION, parseGitDiffResponse, parseGitStatusResponse, } from "./git-contract.js";
|
|
3
4
|
import { buildGitFileList } from "./gitFileList.js";
|
|
4
5
|
import { buildGitFileTree, collectGitFileTreeDirectoryPaths } from "./gitFileTree.js";
|
|
@@ -7,19 +8,22 @@ import { createGitDiffRoute } from "./gitRoute.js";
|
|
|
7
8
|
import { parseUnifiedDiff } from "./unifiedDiff.js";
|
|
8
9
|
const GIT_PANEL_LOCAL_ID = "workspace.git";
|
|
9
10
|
const GIT_POLL_INTERVAL_MS = 8_000;
|
|
11
|
+
const LARGE_GIT_POLL_INTERVAL_MS = 30_000;
|
|
12
|
+
const LARGE_GIT_FILE_COUNT = 1_000;
|
|
13
|
+
const GIT_FILE_RENDER_BATCH = 500;
|
|
10
14
|
// Keep navigation state for a few recent workspaces; heavy diff views are
|
|
11
15
|
// released as soon as another machine/workspace becomes active.
|
|
12
16
|
const GIT_WORKSPACE_STATE_LIMIT = 8;
|
|
13
17
|
const activityElementTag = "pi-web-git-panel-activity";
|
|
14
18
|
const EMPTY_LIST_MODEL = { submodules: [], files: [] };
|
|
15
19
|
const EMPTY_VIEW_STATE = { nodes: [], listModel: EMPTY_LIST_MODEL, expandablePaths: [] };
|
|
16
|
-
export function createGitBrowserContributions(sourcePluginId, runtimePluginId, html, svg) {
|
|
20
|
+
export function createGitBrowserContributions(sourcePluginId, runtimePluginId, html, svg, stylesheetIntegration = () => undefined) {
|
|
17
21
|
const panelId = `${runtimePluginId}:${GIT_PANEL_LOCAL_ID}`;
|
|
18
22
|
const controller = new GitUiController(sourcePluginId, createGitDiffRoute(panelId));
|
|
19
23
|
defineGitPanelActivityElement();
|
|
20
24
|
return {
|
|
21
25
|
actions: createGitActions(panelId, controller),
|
|
22
|
-
workspacePanels: [createGitPanel(html, svg, controller)],
|
|
26
|
+
workspacePanels: [createGitPanel(html, svg, controller, stylesheetIntegration)],
|
|
23
27
|
};
|
|
24
28
|
}
|
|
25
29
|
class GitUiController {
|
|
@@ -34,8 +38,8 @@ class GitUiController {
|
|
|
34
38
|
this.sourcePluginId = sourcePluginId;
|
|
35
39
|
this.route = route;
|
|
36
40
|
}
|
|
37
|
-
|
|
38
|
-
return workspace
|
|
41
|
+
canInspectWorkspace(workspace) {
|
|
42
|
+
return workspace !== undefined && (workspace.provider === undefined || workspace.provider.pluginId === this.sourcePluginId);
|
|
39
43
|
}
|
|
40
44
|
state(context) {
|
|
41
45
|
return this.stateFor(context);
|
|
@@ -51,8 +55,8 @@ class GitUiController {
|
|
|
51
55
|
this.synchronizeRoute(state, changedWorkspace);
|
|
52
56
|
if (state.status === undefined && state.statusRequest === undefined)
|
|
53
57
|
void this.refresh(context);
|
|
54
|
-
else if (state.selectedDiffPath !== undefined && (state.selectedDiff === undefined || state.selectedStagedDiff === undefined) && !state.diffLoading) {
|
|
55
|
-
if (state.status
|
|
58
|
+
else if (state.status !== undefined && state.selectedDiffPath !== undefined && (state.selectedDiff === undefined || state.selectedStagedDiff === undefined) && !state.diffLoading) {
|
|
59
|
+
if (state.status.files.some((file) => file.path === state.selectedDiffPath))
|
|
56
60
|
void this.refreshDiff(state, state.selectedDiffPath, context);
|
|
57
61
|
else
|
|
58
62
|
this.clearSelection(state, true);
|
|
@@ -70,37 +74,63 @@ class GitUiController {
|
|
|
70
74
|
this.requestRender(this.stateFor(context));
|
|
71
75
|
}
|
|
72
76
|
poll(context) {
|
|
73
|
-
|
|
77
|
+
if (typeof document !== "undefined" && document.visibilityState !== "visible")
|
|
78
|
+
return;
|
|
79
|
+
const state = this.stateFor(context);
|
|
80
|
+
const interval = (state.status?.files.length ?? 0) > LARGE_GIT_FILE_COUNT ? LARGE_GIT_POLL_INTERVAL_MS : GIT_POLL_INTERVAL_MS;
|
|
81
|
+
if (Date.now() - state.lastStatusRefreshAt < interval)
|
|
82
|
+
return;
|
|
83
|
+
void this.refresh(context, false);
|
|
74
84
|
}
|
|
75
85
|
invalidate(context) {
|
|
76
|
-
if (!this.
|
|
86
|
+
if (!this.canInspectWorkspace(context.workspace))
|
|
77
87
|
return Promise.resolve();
|
|
78
88
|
const state = this.stateFor(context);
|
|
79
89
|
state.stale = state.status !== undefined;
|
|
80
90
|
this.requestRender(state);
|
|
81
91
|
return this.refresh(context);
|
|
82
92
|
}
|
|
83
|
-
refresh(context) {
|
|
93
|
+
refresh(context, force = true) {
|
|
84
94
|
const state = this.stateFor(context);
|
|
85
|
-
|
|
95
|
+
const background = !force;
|
|
96
|
+
if (state.statusRequest !== undefined) {
|
|
97
|
+
if (!background && !state.statusLoading) {
|
|
98
|
+
state.statusLoading = true;
|
|
99
|
+
this.requestRender(state);
|
|
100
|
+
}
|
|
86
101
|
return state.statusRequest;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const
|
|
102
|
+
}
|
|
103
|
+
const previousStatus = state.status;
|
|
104
|
+
const previousError = state.error;
|
|
105
|
+
const previousStale = state.stale;
|
|
106
|
+
const previousPath = state.selectedDiffPath;
|
|
107
|
+
const showLoading = !background || state.status === undefined;
|
|
108
|
+
if (showLoading) {
|
|
109
|
+
state.statusLoading = true;
|
|
110
|
+
this.requestRender(state);
|
|
111
|
+
}
|
|
112
|
+
state.lastStatusRefreshAt = Date.now();
|
|
113
|
+
const request = requestGitBackend(context, GIT_STATUS_OPERATION, force ? { refresh: true } : null)
|
|
90
114
|
.then(parseGitStatusResponse)
|
|
91
115
|
.then(async (status) => {
|
|
92
116
|
if (!state.retained)
|
|
93
117
|
return;
|
|
94
|
-
|
|
118
|
+
if (state.status?.hash !== status.hash) {
|
|
119
|
+
state.status = status;
|
|
120
|
+
state.visibleFileLimit = GIT_FILE_RENDER_BATCH;
|
|
121
|
+
revealSelectedFile(state, this.view);
|
|
122
|
+
}
|
|
95
123
|
state.stale = false;
|
|
96
|
-
state.error = undefined;
|
|
97
124
|
const path = state.selectedDiffPath;
|
|
98
|
-
if (path
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
else
|
|
103
|
-
|
|
125
|
+
if (path !== undefined && status.files.some((file) => file.path === path)
|
|
126
|
+
&& this.connectedWorkspaceKey === workspaceContextKey(context)) {
|
|
127
|
+
await this.refreshDiff(state, path, context, background);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
state.error = undefined;
|
|
131
|
+
if (path !== undefined && !status.files.some((file) => file.path === path))
|
|
132
|
+
this.clearSelection(state, true);
|
|
133
|
+
}
|
|
104
134
|
})
|
|
105
135
|
.catch((error) => {
|
|
106
136
|
if (state.retained)
|
|
@@ -110,8 +140,11 @@ class GitUiController {
|
|
|
110
140
|
if (state.statusRequest !== request)
|
|
111
141
|
return;
|
|
112
142
|
state.statusRequest = undefined;
|
|
143
|
+
const wasLoading = state.statusLoading;
|
|
113
144
|
state.statusLoading = false;
|
|
114
|
-
|
|
145
|
+
if (wasLoading || previousStatus !== state.status || previousError !== state.error
|
|
146
|
+
|| previousStale !== state.stale || previousPath !== state.selectedDiffPath)
|
|
147
|
+
this.requestRender(state);
|
|
115
148
|
});
|
|
116
149
|
state.statusRequest = request;
|
|
117
150
|
return request;
|
|
@@ -119,6 +152,7 @@ class GitUiController {
|
|
|
119
152
|
selectDiff(context, path) {
|
|
120
153
|
const state = this.stateFor(context);
|
|
121
154
|
state.selectedDiffPath = path;
|
|
155
|
+
revealSelectedFile(state, this.view);
|
|
122
156
|
state.selectedDiff = undefined;
|
|
123
157
|
state.selectedStagedDiff = undefined;
|
|
124
158
|
state.diffLoading = true;
|
|
@@ -144,12 +178,18 @@ class GitUiController {
|
|
|
144
178
|
}
|
|
145
179
|
viewState(state) {
|
|
146
180
|
const cached = state.viewStateCache;
|
|
147
|
-
if (cached !== undefined && cached.status === state.status && cached.view === this.view)
|
|
181
|
+
if (cached !== undefined && cached.status === state.status && cached.view === this.view && cached.visibleFileLimit === state.visibleFileLimit)
|
|
148
182
|
return cached.viewState;
|
|
149
183
|
const viewState = buildViewState(state.status, this.view);
|
|
150
|
-
state.viewStateCache = { status: state.status, view: this.view, viewState };
|
|
184
|
+
state.viewStateCache = { status: state.status, view: this.view, viewState, visibleFileLimit: state.visibleFileLimit };
|
|
151
185
|
return viewState;
|
|
152
186
|
}
|
|
187
|
+
showMore(context) {
|
|
188
|
+
const state = this.stateFor(context);
|
|
189
|
+
state.visibleFileLimit += GIT_FILE_RENDER_BATCH;
|
|
190
|
+
state.viewStateCache = undefined;
|
|
191
|
+
this.requestRender(state);
|
|
192
|
+
}
|
|
153
193
|
toggleDirectory(context, path) {
|
|
154
194
|
const state = this.stateFor(context);
|
|
155
195
|
const next = new Set(state.expandedDirectories);
|
|
@@ -191,6 +231,10 @@ class GitUiController {
|
|
|
191
231
|
statusRequest: undefined,
|
|
192
232
|
diffRequestSequence: 0,
|
|
193
233
|
viewStateCache: undefined,
|
|
234
|
+
visibleFileLimit: GIT_FILE_RENDER_BATCH,
|
|
235
|
+
remainingRows: GIT_FILE_RENDER_BATCH,
|
|
236
|
+
hasMoreRows: false,
|
|
237
|
+
lastStatusRefreshAt: 0,
|
|
194
238
|
};
|
|
195
239
|
this.states.set(key, created);
|
|
196
240
|
return created;
|
|
@@ -237,6 +281,7 @@ class GitUiController {
|
|
|
237
281
|
if (state.selectedDiffPath === path)
|
|
238
282
|
return;
|
|
239
283
|
state.selectedDiffPath = path;
|
|
284
|
+
revealSelectedFile(state, this.view);
|
|
240
285
|
state.selectedDiff = undefined;
|
|
241
286
|
state.selectedStagedDiff = undefined;
|
|
242
287
|
state.diffLoading = false;
|
|
@@ -248,11 +293,17 @@ class GitUiController {
|
|
|
248
293
|
this.route.write(undefined, { replace: true });
|
|
249
294
|
}
|
|
250
295
|
}
|
|
251
|
-
async refreshDiff(state, path, context) {
|
|
296
|
+
async refreshDiff(state, path, context, background = false) {
|
|
252
297
|
const sequence = state.diffRequestSequence + 1;
|
|
253
298
|
state.diffRequestSequence = sequence;
|
|
254
|
-
|
|
255
|
-
|
|
299
|
+
const previousDiff = state.selectedDiff;
|
|
300
|
+
const previousStagedDiff = state.selectedStagedDiff;
|
|
301
|
+
const previousError = state.error;
|
|
302
|
+
const showLoading = !background || previousDiff === undefined || previousStagedDiff === undefined;
|
|
303
|
+
if (showLoading) {
|
|
304
|
+
state.diffLoading = true;
|
|
305
|
+
this.requestRender(state);
|
|
306
|
+
}
|
|
256
307
|
try {
|
|
257
308
|
const [selectedDiff, selectedStagedDiff] = await Promise.all([
|
|
258
309
|
requestGitBackend(context, GIT_DIFF_OPERATION, { path }).then(parseGitDiffResponse),
|
|
@@ -271,8 +322,11 @@ class GitUiController {
|
|
|
271
322
|
}
|
|
272
323
|
finally {
|
|
273
324
|
if (state.retained && state.diffRequestSequence === sequence && state.selectedDiffPath === path) {
|
|
325
|
+
const wasLoading = state.diffLoading;
|
|
274
326
|
state.diffLoading = false;
|
|
275
|
-
|
|
327
|
+
if (wasLoading || previousDiff !== state.selectedDiff || previousStagedDiff !== state.selectedStagedDiff
|
|
328
|
+
|| previousError !== state.error)
|
|
329
|
+
this.requestRender(state);
|
|
276
330
|
}
|
|
277
331
|
}
|
|
278
332
|
}
|
|
@@ -282,29 +336,29 @@ class GitUiController {
|
|
|
282
336
|
}
|
|
283
337
|
}
|
|
284
338
|
function createGitActions(panelId, controller) {
|
|
285
|
-
const hasGitWorkspace = (context) => controller.
|
|
339
|
+
const hasGitWorkspace = (context) => controller.canInspectWorkspace(context.state.selectedWorkspace);
|
|
286
340
|
return [
|
|
287
341
|
{
|
|
288
342
|
id: "view.git",
|
|
289
|
-
title: "
|
|
343
|
+
title: t("client.actions.go.to.git.0d4886", "Go to Git"),
|
|
290
344
|
shortcut: "mod+3",
|
|
291
345
|
shortcutAliases: ["core:view.git"],
|
|
292
|
-
group: "
|
|
346
|
+
group: t("client.actions.navigation.e72622", "Navigation"),
|
|
293
347
|
enabled: hasGitWorkspace,
|
|
294
|
-
run: (context) => { context.
|
|
348
|
+
run: (context) => { context.selectWorkspaceTool(panelId); },
|
|
295
349
|
},
|
|
296
350
|
{
|
|
297
351
|
id: "workspace.refresh-git",
|
|
298
|
-
title: "
|
|
352
|
+
title: t("client.actions.refresh.git.496f8a", "Refresh Git"),
|
|
299
353
|
shortcut: "mod+shift+g",
|
|
300
354
|
shortcutAliases: ["core:workspace.refresh-git"],
|
|
301
|
-
group: "
|
|
355
|
+
group: t("bundled.workspace-tasks.workspace.379798", "Workspace"),
|
|
302
356
|
enabled: hasGitWorkspace,
|
|
303
|
-
run: (context) => context.refreshWorkspacePanels
|
|
357
|
+
run: (context) => context.refreshWorkspacePanels(panelId),
|
|
304
358
|
},
|
|
305
359
|
];
|
|
306
360
|
}
|
|
307
|
-
function createGitPanel(html, svg, controller) {
|
|
361
|
+
function createGitPanel(html, svg, controller, stylesheetIntegration) {
|
|
308
362
|
return {
|
|
309
363
|
id: GIT_PANEL_LOCAL_ID,
|
|
310
364
|
title: "Git",
|
|
@@ -320,36 +374,38 @@ function createGitPanel(html, svg, controller) {
|
|
|
320
374
|
`,
|
|
321
375
|
order: 20,
|
|
322
376
|
routeAliases: ["git", "core:workspace.git"],
|
|
323
|
-
|
|
377
|
+
navigationAliases: ["core:workspace.git"],
|
|
378
|
+
visible: (context) => controller.canInspectWorkspace(context.workspace),
|
|
324
379
|
onInvalidate: (context) => controller.invalidate(context),
|
|
325
|
-
render: (context) => renderGitPanel(html, controller, context),
|
|
380
|
+
render: (context) => renderGitPanel(html, controller, context, stylesheetIntegration()),
|
|
326
381
|
};
|
|
327
382
|
}
|
|
328
383
|
function requestGitBackend(context, operation, input) {
|
|
329
|
-
if (context.
|
|
330
|
-
return Promise.reject(new Error("Git
|
|
384
|
+
if (context.peer?.request === undefined) {
|
|
385
|
+
return Promise.reject(new Error(t("ui.main.fc3b27465765", "Git workspace backend is unavailable. Update and restart PI WEB on this machine, then reload the browser.")));
|
|
331
386
|
}
|
|
332
|
-
return context.
|
|
387
|
+
return context.peer.request(operation, input);
|
|
333
388
|
}
|
|
334
|
-
function renderGitPanel(html, controller, context) {
|
|
389
|
+
function renderGitPanel(html, controller, context, stylesheetIntegration) {
|
|
335
390
|
const state = controller.state(context);
|
|
336
391
|
const viewState = controller.viewState(state);
|
|
337
392
|
return html `
|
|
338
393
|
<section class="git-panel">
|
|
339
|
-
<style .textContent=${gitPanelStyles}></style>
|
|
340
|
-
<pi-web-git-panel-activity .controller=${controller} .context=${context}></pi-web-git-panel-activity>
|
|
341
|
-
<section class="git-toolbar">
|
|
394
|
+
<style data-git-styles .textContent=${gitPanelStyles}></style>
|
|
395
|
+
<pi-web-git-panel-activity .stylesheetIntegration=${stylesheetIntegration} .controller=${controller} .context=${context}></pi-web-git-panel-activity>
|
|
396
|
+
<section class="ui-toolbar git-toolbar">
|
|
342
397
|
<strong>Git</strong>
|
|
343
|
-
${state.stale ? html `<span class="git-stale"
|
|
344
|
-
<div class="git-toolbar-actions">
|
|
398
|
+
${state.stale ? html `<span class="git-stale">${t("ui.main.3468df3f1fe9", "stale")}</span>` : null}
|
|
399
|
+
<div class="ui-toolbar-group git-toolbar-actions">
|
|
345
400
|
${viewState.expandablePaths.length === 0 ? null : renderExpandCollapseAll(html, controller, context, state, viewState.expandablePaths)}
|
|
346
401
|
${renderViewToggle(html, controller, context)}
|
|
347
|
-
<button type="button" ?disabled=${state.statusLoading} @click=${() => { void controller.refresh(context); }}
|
|
402
|
+
<button class="ui-button" type="button" ?disabled=${state.statusLoading} @click=${() => { void controller.refresh(context); }}>${t("bundled.relays.refresh.aee887", "Refresh")}</button>
|
|
348
403
|
</div>
|
|
349
404
|
</section>
|
|
350
405
|
${state.error === undefined ? null : html `<div class="git-error" role="alert">${state.error}</div>`}
|
|
406
|
+
${state.status?.truncated === true ? html `<div class="git-warning" role="status">${t("ui.main.1634590c49b8", "Git status output was too large; the file list was truncated.")}</div>` : null}
|
|
351
407
|
<section class="git-split">
|
|
352
|
-
<div class="git-file-list">${renderFileList(html, controller, context, state, viewState)}</div>
|
|
408
|
+
<div class="ui-file-list git-file-list">${renderFileList(html, controller, context, state, viewState)}</div>
|
|
353
409
|
<div class="git-viewer">${renderDiffViewer(html, state)}</div>
|
|
354
410
|
</section>
|
|
355
411
|
</section>
|
|
@@ -357,33 +413,39 @@ function renderGitPanel(html, controller, context) {
|
|
|
357
413
|
}
|
|
358
414
|
function renderViewToggle(html, controller, context) {
|
|
359
415
|
return html `
|
|
360
|
-
<div class="git-view-toggle" role="group" aria-label="
|
|
361
|
-
${renderViewToggleButton(html, controller, context, "list", "
|
|
362
|
-
${renderViewToggleButton(html, controller, context, "tree", "
|
|
416
|
+
<div class="ui-toolbar-group git-view-toggle" role="group" aria-label="${t("ui.main.898449210b9d", "Changed files view")}">
|
|
417
|
+
${renderViewToggleButton(html, controller, context, "list", t("ui.workspaceGitPanel.list", "List"))}
|
|
418
|
+
${renderViewToggleButton(html, controller, context, "tree", t("ui.main.7f32c63d2d35", "Tree"))}
|
|
363
419
|
</div>
|
|
364
420
|
`;
|
|
365
421
|
}
|
|
366
422
|
function renderViewToggleButton(html, controller, context, view, label) {
|
|
367
423
|
const active = controller.currentView() === view;
|
|
368
|
-
return html `<button type="button" class
|
|
424
|
+
return html `<button type="button" class="ui-button" aria-pressed=${String(active)} @click=${() => { controller.setView(context, view); }}>${label}</button>`;
|
|
369
425
|
}
|
|
370
426
|
function renderExpandCollapseAll(html, controller, context, state, expandablePaths) {
|
|
371
427
|
const allExpanded = expandablePaths.every((path) => state.expandedDirectories.has(path));
|
|
372
|
-
return html `<button type="button" @click=${() => { controller.toggleExpandAll(context, expandablePaths, allExpanded); }}>${allExpanded ? "
|
|
428
|
+
return html `<button class="ui-button" type="button" @click=${() => { controller.toggleExpandAll(context, expandablePaths, allExpanded); }}>${allExpanded ? t("ui.workspaceGitPanel.collapseAll", "Collapse all") : t("ui.workspaceGitPanel.expandAll", "Expand all")}</button>`;
|
|
373
429
|
}
|
|
374
430
|
function renderFileList(html, controller, context, state, viewState) {
|
|
375
431
|
const status = state.status;
|
|
376
432
|
if (status === undefined)
|
|
377
|
-
return html `<p class="git-muted">${state.error === undefined ? "
|
|
433
|
+
return html `<p class="git-muted">${state.error === undefined ? t("ui.main.f2cb84a98270", "Loading status…") : t("ui.main.d2302e08b20b", "Status unavailable.")}</p>`;
|
|
378
434
|
if (!status.isGitRepo)
|
|
379
|
-
return html `<p class="git-muted"
|
|
435
|
+
return html `<p class="git-muted">${t("ui.main.b4b1ea928fc3", "Not a git repository.")}</p>`;
|
|
380
436
|
const summary = html `<p class="git-summary">${gitSummary(status)}</p>`;
|
|
381
437
|
if (status.files.length === 0)
|
|
382
|
-
return html `${summary}<p class="git-muted"
|
|
438
|
+
return html `${summary}<p class="git-muted">${t("ui.workspaceGitPanel.noChanges", "No changes.")}</p>`;
|
|
439
|
+
state.remainingRows = state.visibleFileLimit;
|
|
440
|
+
state.hasMoreRows = status.files.length > state.visibleFileLimit;
|
|
383
441
|
const body = controller.currentView() === "tree"
|
|
384
442
|
? viewState.nodes.map((node) => renderTreeNode(html, controller, context, state, node, 0))
|
|
385
443
|
: renderListBody(html, controller, context, state, viewState.listModel);
|
|
386
|
-
|
|
444
|
+
const rendered = Math.min(state.visibleFileLimit, status.files.length);
|
|
445
|
+
const more = state.hasMoreRows || rendered < status.files.length
|
|
446
|
+
? html `<button type="button" class="git-load-more" @click=${() => { controller.showMore(context); }}>${t("ui.main.34f2d3bdae3d", "Show more (")}${String(rendered)}/${String(status.files.length)})</button>`
|
|
447
|
+
: null;
|
|
448
|
+
return html `${summary}${body}${more}`;
|
|
387
449
|
}
|
|
388
450
|
function renderListBody(html, controller, context, state, model) {
|
|
389
451
|
return html `
|
|
@@ -392,11 +454,13 @@ function renderListBody(html, controller, context, state, model) {
|
|
|
392
454
|
`;
|
|
393
455
|
}
|
|
394
456
|
function renderSubmoduleGroup(html, controller, context, state, group) {
|
|
457
|
+
if (!consumeGitRow(state))
|
|
458
|
+
return html ``;
|
|
395
459
|
const expanded = state.expandedDirectories.has(group.path);
|
|
396
460
|
return html `
|
|
397
|
-
<button type="button" class="
|
|
398
|
-
<span class="
|
|
399
|
-
<span>${group.name}${submoduleBadge(html)}</span>
|
|
461
|
+
<button type="button" class="ui-button ui-file-row" style="--depth:0" title=${group.path} aria-expanded=${String(expanded)} @click=${() => { controller.toggleDirectory(context, group.path); }}>
|
|
462
|
+
<span class="ui-file-leading" aria-hidden="true">${expanded ? "▾" : "▸"}</span>
|
|
463
|
+
<span class="ui-file-label">${group.name}${submoduleBadge(html)}</span>
|
|
400
464
|
</button>
|
|
401
465
|
${expanded ? html `
|
|
402
466
|
${group.pointer === undefined ? null : renderSelectableRow(html, controller, context, state, group.path, group.pointer.name, group.pointer.file, 1)}
|
|
@@ -409,11 +473,13 @@ function renderSubmoduleFileRow(html, controller, context, state, entry) {
|
|
|
409
473
|
}
|
|
410
474
|
function renderTreeNode(html, controller, context, state, node, depth) {
|
|
411
475
|
if (node.kind === "directory") {
|
|
476
|
+
if (!consumeGitRow(state))
|
|
477
|
+
return html ``;
|
|
412
478
|
const expanded = state.expandedDirectories.has(node.path);
|
|
413
479
|
return html `
|
|
414
|
-
<button type="button" class="
|
|
415
|
-
<span class="
|
|
416
|
-
<span>${node.name}${node.isSubmodule === true ? submoduleBadge(html) : null}</span>
|
|
480
|
+
<button type="button" class="ui-button ui-file-row" style=${`--depth:${String(depth)}`} title=${node.path} aria-expanded=${String(expanded)} @click=${() => { controller.toggleDirectory(context, node.path); }}>
|
|
481
|
+
<span class="ui-file-leading" aria-hidden="true">${expanded ? "▾" : "▸"}</span>
|
|
482
|
+
<span class="ui-file-label">${node.name}${node.isSubmodule === true ? submoduleBadge(html) : null}</span>
|
|
417
483
|
</button>
|
|
418
484
|
${expanded ? node.children.map((child) => renderTreeNode(html, controller, context, state, child, depth + 1)) : null}
|
|
419
485
|
`;
|
|
@@ -424,35 +490,46 @@ function renderFileRow(html, controller, context, state, file) {
|
|
|
424
490
|
return renderSelectableRow(html, controller, context, state, file.path, file.path, file, 0);
|
|
425
491
|
}
|
|
426
492
|
function renderSelectableRow(html, controller, context, state, path, label, file, depth) {
|
|
493
|
+
if (!consumeGitRow(state))
|
|
494
|
+
return html ``;
|
|
427
495
|
const selected = state.selectedDiffPath === path;
|
|
428
496
|
return html `
|
|
429
|
-
<button type="button" class=${selected ? "
|
|
430
|
-
<span
|
|
431
|
-
<span>${label}</span>
|
|
497
|
+
<button type="button" class=${selected ? "ui-button ui-file-row selected" : "ui-button ui-file-row"} style=${`--depth:${String(depth)}`} title=${path} aria-current=${selected ? "page" : "false"} @click=${() => { controller.selectDiff(context, path); }}>
|
|
498
|
+
<span class="ui-file-leading" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z"></path><path d="M14 2v6h6"></path></svg></span>
|
|
499
|
+
<span class="ui-file-label">${label}</span>
|
|
500
|
+
<span class="ui-file-meta">${stateLabel(file.index, file.workingTree)}</span>
|
|
432
501
|
</button>
|
|
433
502
|
`;
|
|
434
503
|
}
|
|
435
504
|
function renderDiffViewer(html, state) {
|
|
436
505
|
if (state.selectedDiffPath === undefined)
|
|
437
|
-
return html `<p class="git-muted"
|
|
506
|
+
return html `<p class="git-muted">${t("ui.main.77ed4aee3792", "Select a changed file.")}</p>`;
|
|
438
507
|
const unstaged = state.selectedDiff;
|
|
439
508
|
const staged = state.selectedStagedDiff;
|
|
440
509
|
if (unstaged === undefined || staged === undefined)
|
|
441
|
-
return html `<p class="git-muted"
|
|
510
|
+
return html `<p class="git-muted">${t("ui.workspaceGitPanel.loadingDiff", "Loading diff…")}</p>`;
|
|
442
511
|
const diffs = [staged, unstaged].filter((diff) => diff.response.diff !== "");
|
|
443
512
|
if (diffs.length === 0)
|
|
444
|
-
return html `<p class="git-muted"
|
|
513
|
+
return html `<p class="git-muted">${t("ui.workspaceGitPanel.noStagedOrUnstagedDiff", "No staged or unstaged diff.")}</p>`;
|
|
445
514
|
return html `<div class=${diffs.length === 1 ? "git-diffs is-single" : "git-diffs"}>${diffs.map((diff) => renderDiffSection(html, diff))}</div>`;
|
|
446
515
|
}
|
|
516
|
+
function consumeGitRow(state) {
|
|
517
|
+
if (state.remainingRows > 0) {
|
|
518
|
+
state.remainingRows -= 1;
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
state.hasMoreRows = true;
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
447
524
|
function renderDiffSection(html, view) {
|
|
448
525
|
const diff = view.response;
|
|
449
526
|
const lines = view.lines ??= parseUnifiedDiff(diff.diff);
|
|
450
527
|
return html `
|
|
451
528
|
<section class="git-diff-section">
|
|
452
|
-
<div class="git-viewer-header"><strong>${diff.path ?? "
|
|
453
|
-
${lines.length === 0 ? html `<p class="git-muted"
|
|
529
|
+
<div class="git-viewer-header"><strong>${diff.path ?? t("ui.workspaceGitPanel.diff", "Diff")}</strong><small>${diff.staged ? t("ui.workspaceGitPanel.staged", "Staged") : t("ui.workspaceGitPanel.unstaged", "Unstaged")}${diff.truncated ? t("ui.workspaceGitPanel.truncated", " · Truncated") : ""}</small></div>
|
|
530
|
+
${lines.length === 0 ? html `<p class="git-muted">${t("ui.unifiedDiffViewer.noDiff", "No diff.")}</p>` : html `
|
|
454
531
|
<div class="git-diff-scroller">
|
|
455
|
-
<div class="git-diff-grid" role="table" aria-label="
|
|
532
|
+
<div class="git-diff-grid" role="table" aria-label="${t("ui.unifiedDiffViewer.unifiedDiff", "Unified diff")}">
|
|
456
533
|
${lines.map((line) => renderDiffLine(html, line))}
|
|
457
534
|
</div>
|
|
458
535
|
</div>
|
|
@@ -476,13 +553,38 @@ function renderDiffSpans(html, spans) {
|
|
|
476
553
|
function buildViewState(status, view) {
|
|
477
554
|
if (status === undefined || !status.isGitRepo || status.files.length === 0)
|
|
478
555
|
return EMPTY_VIEW_STATE;
|
|
556
|
+
const visibleStatus = status;
|
|
479
557
|
if (view === "tree") {
|
|
480
|
-
const nodes = buildGitFileTree(
|
|
558
|
+
const nodes = buildGitFileTree(visibleStatus.files, visibleStatus.submodules);
|
|
481
559
|
return { nodes, listModel: EMPTY_LIST_MODEL, expandablePaths: collectGitFileTreeDirectoryPaths(nodes) };
|
|
482
560
|
}
|
|
483
|
-
const listModel = buildGitFileList(
|
|
561
|
+
const listModel = buildGitFileList(visibleStatus.files, visibleStatus.submodules);
|
|
484
562
|
return { nodes: [], listModel, expandablePaths: listModel.submodules.map((group) => group.path) };
|
|
485
563
|
}
|
|
564
|
+
function revealSelectedFile(state, view) {
|
|
565
|
+
const path = state.selectedDiffPath;
|
|
566
|
+
if (path === undefined || state.status === undefined)
|
|
567
|
+
return;
|
|
568
|
+
let selectedRow = state.status.files.findIndex((file) => file.path === path) + state.status.submodules.length + 1;
|
|
569
|
+
if (view === "tree") {
|
|
570
|
+
const nodes = buildGitFileTree(state.status.files, state.status.submodules);
|
|
571
|
+
for (const directory of collectGitFileTreeDirectoryPaths(nodes))
|
|
572
|
+
if (path.startsWith(`${directory}/`))
|
|
573
|
+
state.expandedDirectories.add(directory);
|
|
574
|
+
let row = 0;
|
|
575
|
+
const visit = (children) => {
|
|
576
|
+
for (const node of children) {
|
|
577
|
+
row += 1;
|
|
578
|
+
if (node.path === path)
|
|
579
|
+
selectedRow = row;
|
|
580
|
+
if (node.kind === "directory" && state.expandedDirectories.has(node.path))
|
|
581
|
+
visit(node.children);
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
visit(nodes);
|
|
585
|
+
}
|
|
586
|
+
state.visibleFileLimit = Math.max(state.visibleFileLimit, Math.ceil(selectedRow / GIT_FILE_RENDER_BATCH) * GIT_FILE_RENDER_BATCH);
|
|
587
|
+
}
|
|
486
588
|
function defineGitPanelActivityElement() {
|
|
487
589
|
if (typeof customElements === "undefined" || typeof HTMLElement === "undefined" || customElements.get(activityElementTag) !== undefined)
|
|
488
590
|
return;
|
|
@@ -490,6 +592,24 @@ function defineGitPanelActivityElement() {
|
|
|
490
592
|
controllerValue;
|
|
491
593
|
contextValue;
|
|
492
594
|
pollTimer;
|
|
595
|
+
integration;
|
|
596
|
+
releaseStyles;
|
|
597
|
+
set stylesheetIntegration(value) {
|
|
598
|
+
if (this.integration === value)
|
|
599
|
+
return;
|
|
600
|
+
this.releaseStyles?.();
|
|
601
|
+
this.releaseStyles = undefined;
|
|
602
|
+
this.integration = value;
|
|
603
|
+
this.registerStyles();
|
|
604
|
+
}
|
|
605
|
+
registerStyles() {
|
|
606
|
+
if (!this.isConnected || this.releaseStyles !== undefined)
|
|
607
|
+
return;
|
|
608
|
+
const root = this.getRootNode();
|
|
609
|
+
// The activity element shares the host panel's root; it owns only this opt-in.
|
|
610
|
+
if (root instanceof ShadowRoot)
|
|
611
|
+
this.releaseStyles = this.integration?.registerRoot(root, { sharedUi: true });
|
|
612
|
+
}
|
|
493
613
|
set controller(value) {
|
|
494
614
|
if (this.controllerValue === value)
|
|
495
615
|
return;
|
|
@@ -503,18 +623,23 @@ function defineGitPanelActivityElement() {
|
|
|
503
623
|
this.restart();
|
|
504
624
|
}
|
|
505
625
|
connectedCallback() {
|
|
626
|
+
this.registerStyles();
|
|
506
627
|
window.addEventListener("popstate", this.onPopState);
|
|
628
|
+
document.addEventListener("visibilitychange", this.onVisibilityChange);
|
|
507
629
|
this.restart();
|
|
508
630
|
}
|
|
509
631
|
disconnectedCallback() {
|
|
632
|
+
this.releaseStyles?.();
|
|
633
|
+
this.releaseStyles = undefined;
|
|
510
634
|
window.removeEventListener("popstate", this.onPopState);
|
|
635
|
+
document.removeEventListener("visibilitychange", this.onVisibilityChange);
|
|
511
636
|
if (this.controllerValue !== undefined && this.contextValue !== undefined)
|
|
512
637
|
this.controllerValue.disconnect(this.contextValue);
|
|
513
638
|
this.stopTimer();
|
|
514
639
|
}
|
|
515
640
|
restart() {
|
|
516
641
|
this.stopTimer();
|
|
517
|
-
if (!this.isConnected || this.controllerValue === undefined || this.contextValue === undefined)
|
|
642
|
+
if (!this.isConnected || document.visibilityState !== "visible" || this.controllerValue === undefined || this.contextValue === undefined)
|
|
518
643
|
return;
|
|
519
644
|
this.controllerValue.connect(this.contextValue);
|
|
520
645
|
this.pollTimer = window.setInterval(() => {
|
|
@@ -531,14 +656,21 @@ function defineGitPanelActivityElement() {
|
|
|
531
656
|
if (this.controllerValue !== undefined && this.contextValue !== undefined)
|
|
532
657
|
this.controllerValue.handlePopState(this.contextValue);
|
|
533
658
|
};
|
|
659
|
+
onVisibilityChange = () => {
|
|
660
|
+
this.stopTimer();
|
|
661
|
+
if (document.visibilityState === "visible" && this.controllerValue !== undefined && this.contextValue !== undefined) {
|
|
662
|
+
this.restart();
|
|
663
|
+
void this.controllerValue.refresh(this.contextValue);
|
|
664
|
+
}
|
|
665
|
+
};
|
|
534
666
|
}
|
|
535
667
|
customElements.define(activityElementTag, GitPanelActivityElement);
|
|
536
668
|
}
|
|
537
669
|
function submoduleBadge(html) {
|
|
538
|
-
return html `<span class="submodule-badge"
|
|
670
|
+
return html `<span class="submodule-badge">${t("ui.workspaceGitPanel.submodule", "Submodule")}</span>`;
|
|
539
671
|
}
|
|
540
672
|
function gitSummary(status) {
|
|
541
|
-
const branch = status.branch ?? "
|
|
673
|
+
const branch = status.branch ?? t("ui.workspaceGitPanel.detachedHead", "Detached HEAD");
|
|
542
674
|
const ahead = status.ahead ?? 0;
|
|
543
675
|
const behind = status.behind ?? 0;
|
|
544
676
|
return ahead === 0 && behind === 0 ? branch : `${branch} · ↑${String(ahead)} ↓${String(behind)}`;
|
|
@@ -551,10 +683,12 @@ function formatLineNumber(lineNumber) {
|
|
|
551
683
|
return lineNumber === undefined ? "" : String(lineNumber);
|
|
552
684
|
}
|
|
553
685
|
function createDiffView(response, previous) {
|
|
554
|
-
|
|
555
|
-
response,
|
|
556
|
-
|
|
557
|
-
|
|
686
|
+
if (previous?.response.hash !== response.hash)
|
|
687
|
+
return { response, lines: undefined };
|
|
688
|
+
if (previous.response.path === response.path && previous.response.staged === response.staged
|
|
689
|
+
&& previous.response.truncated === response.truncated)
|
|
690
|
+
return previous;
|
|
691
|
+
return { response, lines: previous.lines };
|
|
558
692
|
}
|
|
559
693
|
function workspaceContextKey(context) {
|
|
560
694
|
return JSON.stringify([context.machine.id, context.workspace.projectId, context.workspace.id]);
|
|
@@ -563,28 +697,22 @@ function errorMessage(error) {
|
|
|
563
697
|
return error instanceof Error ? error.message : String(error);
|
|
564
698
|
}
|
|
565
699
|
const gitPanelStyles = `
|
|
566
|
-
.git-panel { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; color: var(--pi-text); background: var(--pi-bg); font: 13px system-ui, sans-serif; }
|
|
700
|
+
.git-panel { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; color: var(--pi-text); background: var(--pi-bg); font: 13px var(--pi-font, system-ui, sans-serif); }
|
|
567
701
|
.git-panel ${activityElementTag} { display: none; }
|
|
568
|
-
.git-panel button { display: inline-flex; align-items: center; gap: 5px; border: 1px solid var(--pi-border); border-radius: 7px; background: var(--pi-surface); color: var(--pi-text); padding: 5px 7px; cursor: pointer; }
|
|
569
|
-
.git-panel button:disabled { cursor: wait; opacity: .65; }
|
|
570
702
|
.git-panel small, .git-panel .git-muted { color: var(--pi-muted); }
|
|
571
703
|
.git-panel p { margin: 10px; }
|
|
572
|
-
.git-panel .git-toolbar { flex: 0 0 auto;
|
|
573
|
-
.git-panel .git-toolbar-actions {
|
|
574
|
-
.git-panel .git-
|
|
575
|
-
.git-panel .git-
|
|
576
|
-
.git-panel .git-
|
|
577
|
-
.git-panel .git-
|
|
578
|
-
.git-panel .git-view-toggle button.is-selected { position: relative; z-index: 1; border-color: var(--pi-accent); background: var(--pi-selection-bg); }
|
|
579
|
-
.git-panel .git-stale { border: 1px solid var(--pi-warning-border); border-radius: 999px; color: var(--pi-warning); padding: 1px 6px; font-size: 12px; }
|
|
704
|
+
.git-panel .git-toolbar { flex: 0 0 auto; border-bottom: 1px solid var(--pi-border-muted); font-size: 12px; color: var(--pi-muted); }
|
|
705
|
+
.git-panel .git-toolbar-actions { margin-left: auto; }
|
|
706
|
+
.git-panel .git-toolbar > strong { display: flex; align-items: center; padding-inline: 10px; font-weight: 500; }
|
|
707
|
+
.git-panel .git-toolbar .ui-button { white-space: nowrap; }
|
|
708
|
+
.git-panel .git-toolbar .ui-button[aria-pressed="true"] { background: var(--pi-surface-hover); color: var(--pi-text); }
|
|
709
|
+
.git-panel .git-stale { border: 1px solid var(--pi-warning-border); border-radius: 999px; color: var(--pi-warning); padding: 1px 6px; font-size: 12px; align-self: center; }
|
|
580
710
|
.git-panel .git-error { flex: 0 0 auto; margin: 8px; border: 1px solid var(--pi-danger); border-radius: 7px; color: var(--pi-danger); padding: 8px; }
|
|
711
|
+
.git-panel .git-warning { flex: 0 0 auto; margin: 8px; border: 1px solid var(--pi-warning-border); border-radius: 7px; color: var(--pi-warning); padding: 8px; }
|
|
712
|
+
.git-panel .git-load-more { margin: 8px auto; }
|
|
581
713
|
.git-panel .git-split { flex: 1 1 auto; min-height: 0; display: grid; grid-template-rows: minmax(160px, 34%) minmax(0, 1fr); }
|
|
582
|
-
.git-panel .git-file-list {
|
|
583
|
-
.git-panel .git-
|
|
584
|
-
.git-panel .git-row:hover, .git-panel .git-row.is-selected { background: var(--pi-selection-bg); }
|
|
585
|
-
.git-panel .git-row span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
586
|
-
.git-panel .git-twisty { color: var(--pi-dim, var(--pi-muted)); }
|
|
587
|
-
.git-panel .git-summary { margin: 4px 6px 8px; color: var(--pi-muted); }
|
|
714
|
+
.git-panel .git-file-list { border-bottom: 1px solid var(--pi-border); }
|
|
715
|
+
.git-panel .git-summary { margin: 10px 12px 8px; color: var(--pi-muted); }
|
|
588
716
|
.git-panel .submodule-badge { display: inline-block; margin-left: 6px; border: 1px solid var(--pi-border); border-radius: 999px; color: var(--pi-muted); padding: 0 5px; font-size: 11px; font-weight: 400; vertical-align: baseline; }
|
|
589
717
|
.git-panel .git-viewer { min-height: 0; overflow: auto; display: flex; flex-direction: column; }
|
|
590
718
|
.git-panel .git-diffs { flex: 1 1 auto; min-height: 0; overflow: auto; display: grid; grid-template-rows: minmax(120px, 1fr) minmax(120px, 1fr); }
|
|
@@ -594,7 +722,7 @@ const gitPanelStyles = `
|
|
|
594
722
|
.git-panel .git-viewer-header { position: sticky; top: 0; display: flex; justify-content: space-between; gap: 8px; padding: 8px; border-bottom: 1px solid var(--pi-border-muted); background: var(--pi-bg); }
|
|
595
723
|
.git-panel .git-viewer-header strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
596
724
|
.git-panel .git-diff-scroller { flex: 1 1 auto; min-height: 0; overflow: auto; background: var(--pi-bg); }
|
|
597
|
-
.git-panel .git-diff-grid { display: grid; grid-template-columns: max-content max-content 2ch max-content; width: max-content; min-width: 100%; padding: 6px 0; font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; line-height: 1.45; }
|
|
725
|
+
.git-panel .git-diff-grid { display: grid; grid-template-columns: max-content max-content 2ch max-content; width: max-content; min-width: 100%; padding: 6px 0; font: 12px var(--pi-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace); line-height: 1.45; }
|
|
598
726
|
.git-panel .git-diff-line { display: contents; }
|
|
599
727
|
.git-panel .git-diff-cell { min-height: 1.45em; white-space: pre; }
|
|
600
728
|
.git-panel .git-line-number { min-width: 4ch; padding: 0 8px; border-right: 1px solid var(--pi-border-muted); color: var(--pi-dim); text-align: right; user-select: none; }
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Generated from pi-web-plugins/git/browser/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));
|