@chainingintention/pi-web-cn 1.202610.1 → 1.202610.3
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 +60 -106
- package/dist/.plugins-ready +1 -0
- package/dist/cli.js +161 -45
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/index-CFhaGb5m.js +4357 -0
- package/dist/client/assets/vendor-editor-core-YWog6mAR.js +10 -0
- package/dist/client/assets/vendor-editor-languages-DOCw3vc9.js +28 -0
- package/dist/client/index.html +5 -5
- package/dist/config.js +30 -6
- package/dist/config.js.map +1 -1
- package/dist/docker/piWebDockerCommandPlan.js +13 -4
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
- package/dist/nativeServices/installedServiceDefinitions.js +23 -10
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
- package/dist/nativeServices/serviceAction.js +78 -20
- package/dist/nativeServices/serviceAction.js.map +1 -1
- package/dist/nativeServices/serviceDoctor.js +339 -67
- 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 +146 -0
- package/dist/pi-packages/captains-log/dist/browser/markdown.js +67 -0
- package/dist/pi-packages/captains-log/dist/browser/panel.js +151 -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/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/pi-web-plugin.js +9 -9
- package/dist/pi-packages/relays/prompts/relay.md +1 -1
- package/dist/pi-packages/relays/relaysPanelElement.js +8 -8
- package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +21 -13
- 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 +456 -0
- package/dist/pi-web-plugins/files/package.json +15 -0
- package/dist/pi-web-plugins/git/browser/git-panel.js +55 -32
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +2 -2
- package/dist/pi-web-plugins/git/git-backend.js +19 -26
- package/dist/pi-web-plugins/git/gitStatusCache.js +48 -0
- package/dist/pi-web-plugins/git/package.json +1 -0
- package/dist/pi-web-plugins/git/server-plugin.js +11 -10
- package/dist/pi-web-plugins/info/infoInternals.js +4 -1
- package/dist/pi-web-plugins/info/package.json +1 -1
- package/dist/pi-web-plugins/info/pi-web-plugin.js +8 -8
- package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +3590 -0
- package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +6 -0
- package/dist/pi-web-plugins/mermaid/package.json +13 -0
- package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +210 -0
- package/dist/pi-web-plugins/terminal/package.json +16 -0
- package/dist/pi-web-plugins/terminal/server-plugin.js +365 -0
- package/dist/pi-web-plugins/terminal/terminalService.js +435 -0
- package/dist/pi-web-plugins/updates/package.json +1 -1
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +69 -68
- package/dist/pi-web-plugins/workspace-tasks/package.json +1 -1
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +3 -3
- package/dist/piWebVersionReport.js +47 -24
- package/dist/piWebVersionReport.js.map +1 -1
- package/dist/plugin-api.d.ts +260 -25
- package/dist/plugin-api.js +1 -0
- package/dist/pluginRecoveryCli.js +3 -2
- package/dist/pluginRecoveryCli.js.map +1 -1
- package/dist/server/activity/workspaceActivityService.js +5 -5
- package/dist/server/activity/workspaceActivityService.js.map +1 -1
- package/dist/server/app.js +71 -44
- package/dist/server/app.js.map +1 -1
- package/dist/server/audit/managementAuditStore.js +1 -1
- package/dist/server/browserMessageProjection.js +0 -2
- package/dist/server/browserMessageProjection.js.map +1 -1
- package/dist/server/configRoutes.js +1 -2
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/knownPiPackages.js +12 -0
- package/dist/server/knownPiPackages.js.map +1 -0
- package/dist/server/machines/machineClient.js +2 -2
- package/dist/server/machines/machineClient.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +120 -21
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +80 -22
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineService.js +22 -0
- package/dist/server/machines/machineService.js.map +1 -1
- package/dist/server/managementEmbed.js +1 -1
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/managementPrivileges.js +7 -1
- package/dist/server/managementPrivileges.js.map +1 -1
- package/dist/server/managementTerminalProxyRoutes.js +124 -0
- package/dist/server/managementTerminalProxyRoutes.js.map +1 -0
- package/dist/server/normalAuth.js +5 -1
- package/dist/server/normalAuth.js.map +1 -1
- package/dist/server/notices/serverNoticeStore.js +50 -6
- package/dist/server/notices/serverNoticeStore.js.map +1 -1
- package/dist/server/piPackageService.js +5 -5
- package/dist/server/piPackageService.js.map +1 -1
- package/dist/server/piWebPluginCatalog.js +211 -34
- 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 +176 -291
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/piWebStatus.js +45 -55
- 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 +63 -0
- package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js +7 -4
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
- package/dist/server/plugins/pluginBackendRegistry.js +773 -0
- package/dist/server/plugins/pluginBackendRegistry.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 +1049 -107
- 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 +84 -0
- package/dist/server/projects/projectLifecycleService.js.map +1 -0
- package/dist/server/projects/projectService.js +2 -0
- package/dist/server/projects/projectService.js.map +1 -1
- package/dist/server/realtime/sessionEventHub.js +35 -41
- package/dist/server/realtime/sessionEventHub.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/pluginBackendChannelRoutes.js +397 -0
- package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +19 -9
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
- package/dist/server/sessiond/projectMutationRoutes.js +38 -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 +47 -15
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +4 -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/workspaceRemovalRoutes.js +1 -1
- package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -1
- package/dist/server/sessiond.js +226 -56
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/askUserTool.js +0 -3
- package/dist/server/sessions/askUserTool.js.map +1 -1
- package/dist/server/sessions/attachmentService.js +0 -1
- package/dist/server/sessions/attachmentService.js.map +1 -1
- package/dist/server/sessions/authService.js +8 -1
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/builtinCommands.js +2 -2
- package/dist/server/sessions/builtinCommands.js.map +1 -1
- package/dist/server/sessions/clientSessionPreview.js +14 -0
- package/dist/server/sessions/clientSessionPreview.js.map +1 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js +82 -9
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -1
- package/dist/server/sessions/managementAgentTools.js +11 -6
- package/dist/server/sessions/managementAgentTools.js.map +1 -1
- package/dist/server/sessions/managementPermissionSystem.js +16 -4
- package/dist/server/sessions/managementPermissionSystem.js.map +1 -1
- 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 +2 -5
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/pendingAskStore.js +0 -3
- package/dist/server/sessions/pendingAskStore.js.map +1 -1
- package/dist/server/sessions/piSessionEventConnections.js +65 -0
- package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +56 -3
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +774 -448
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/projectAuthService.js +29 -2
- package/dist/server/sessions/projectAuthService.js.map +1 -1
- package/dist/server/sessions/projectSettingsScope.js +12 -4
- 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/sessionActivityMarker.js +105 -0
- package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
- package/dist/server/sessions/sessionArchiveMapping.js +2 -8
- package/dist/server/sessions/sessionArchiveMapping.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +12 -10
- 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/sessionModelScope.js +42 -5
- package/dist/server/sessions/sessionModelScope.js.map +1 -1
- package/dist/server/sessions/sessionNameGenerator.js +6 -6
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +63 -15
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionTreeProjection.js +29 -29
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -1
- package/dist/server/sessions/sessionUiEvents.js +6 -7
- package/dist/server/sessions/sessionUiEvents.js.map +1 -1
- package/dist/server/sessions/sessionUnreadStore.js +26 -1
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -1
- package/dist/server/sessions/spawnSessionTool.js +3 -3
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +5 -5
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/spawnTargetResolver.js +1 -1
- package/dist/server/sessions/transcriptMessages.js +54 -0
- package/dist/server/sessions/transcriptMessages.js.map +1 -0
- package/dist/server/status/machineStatusService.js +3 -1
- package/dist/server/status/machineStatusService.js.map +1 -1
- package/dist/server/terminals/{terminalService.js → managementCommandRunService.js} +79 -107
- 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 +339 -0
- package/dist/server/webSocketBridge.js.map +1 -1
- package/dist/server/workbench/gatewayIntegration.js +4 -1
- package/dist/server/workbench/gatewayIntegration.js.map +1 -1
- package/dist/server/workspaceExplorerRoutes.js +13 -12
- package/dist/server/workspaceExplorerRoutes.js.map +1 -1
- package/dist/server/workspaces/fileContentService.js +9 -7
- package/dist/server/workspaces/fileContentService.js.map +1 -1
- package/dist/server/workspaces/fileOperationService.js +4 -3
- package/dist/server/workspaces/fileOperationService.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 +36 -12
- 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/workspaceDeletionRoutes.js +5 -57
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
- package/dist/server/workspaces/workspaceProviderRegistry.js +75 -24
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
- package/dist/server/workspaces/workspaceRemovalService.js +25 -3
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
- package/dist/server-plugin-api.d.ts +274 -44
- package/dist/server-plugin-api.js +319 -2
- package/dist/server-plugin-api.js.map +1 -1
- package/dist/serverPluginRecovery.js +4 -0
- 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 +29 -8
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- 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 +7 -2
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +5 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +49 -9
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/machinePluginIds.js +30 -7
- package/dist/shared/machinePluginIds.js.map +1 -1
- package/dist/shared/machineStatus.js +35 -1
- package/dist/shared/machineStatus.js.map +1 -1
- package/dist/shared/piWebStatusParsing.js +29 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -1
- package/dist/shared/pluginApiTypes.d.ts +24 -9
- package/dist/shared/pluginApiTypes.js +2 -0
- package/dist/shared/pluginApiTypes.js.map +1 -0
- package/dist/shared/pluginBackendProtocol.js +163 -2
- package/dist/shared/pluginBackendProtocol.js.map +1 -1
- 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 +41 -0
- package/dist/shared/sessionDefaults.js.map +1 -0
- package/dist/shared/workspaceFiles.js.map +1 -1
- package/docs/config.md +270 -323
- package/docs/plugins.md +171 -956
- 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/package.json +22 -13
- package/skills/README.md +27 -2
- package/skills/relay-runner/SKILL.md +21 -13
- package/dist/client/assets/CodeViewer-CZHnKRwQ.js +0 -4
- package/dist/client/assets/TerminalPanel-B_EaRPHY.js +0 -187
- package/dist/client/assets/index-Bv1v-Jz7.js +0 -4717
- 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/server/git/gitService.js +0 -316
- 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/terminalProxyRoutes.js +0 -181
- 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/docs/config.md
CHANGED
|
@@ -1,197 +1,184 @@
|
|
|
1
|
-
# PI WEB
|
|
1
|
+
# PI WEB 配置参考
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本页说明机器与项目配置、路径访问、上传和提示词附件、会话守护进程能力、插件期望状态与恢复、快捷键以及运行时环境。便于扫描的默认值、作用域和重启规则见[配置页面](https://pi-web.dev/config)。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<a id="config-files"></a>
|
|
6
|
+
## 配置文件
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
- **机器配置**:`$PI_WEB_CONFIG`;未设置时使用 `$XDG_CONFIG_HOME/pi-web/config.json` 或 `~/.config/pi-web/config.json`。
|
|
9
|
+
- **项目配置**:`<project>/.pi-web/config.json`,可提交到仓库。
|
|
10
|
+
- **托管数据**:`$PI_WEB_DATA_DIR`(默认 `~/.pi-web`),不是用户可编辑配置 API。
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
联邦模式下,会影响工作执行的设置针对所选机器:路径访问、上传/附件默认目录、上传限制、会话工具、插件启用与配置。网关 host/port/allowed-hosts、快捷键、机器注册和令牌仍保存在网关。远端不支持某项功能时明确报错,不静默使用网关配置。
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
- **Project-local PI WEB config:** `<project>/.pi-web/config.json` for commit-able project settings.
|
|
14
|
+
Pi 包由目标机器的 `pi install`、`pi remove`、`pi update` 或 **设置 → Pi 包** 管理;PI WEB 的 `plugins` 只控制已发现的纯浏览器、纯服务端与双入口插件的期望状态,不安装、移除或更新包。
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
普通模式模型凭据和自定义模型按注册项目存放在托管目录的 `auth.json`、`models.json`。同一项目所有工作区共享项目存储;首次使用从有效全局 Pi agent 文件复制一次,之后不回退或覆盖。认证、启动与列表请求必须解析到注册项目;运行中的会话保留创建时的项目 registry,即使项目之后关闭。管理嵌入使用独立的 `management-embed/auth.json` 与 `models.json`,不混用普通项目凭据。
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
- All worktrees belonging to the same project share those two files.
|
|
18
|
-
- On first use, PI WEB copies the existing global Pi files from the effective Pi agent directory (by default `~/.pi/agent/auth.json` and `~/.pi/agent/models.json`) into the project store. Later changes are independent; the global files are not a fallback.
|
|
19
|
-
- Normal-mode auth requests and new session/list requests must resolve to a registered project. Existing active sessions keep the project registry they were opened with, even if the project is later closed. All management-embed sessions on one machine share the separate `$PI_WEB_DATA_DIR/management-embed/auth.json` and `$PI_WEB_DATA_DIR/management-embed/models.json` files.
|
|
18
|
+
### 已安装服务的自定义配置路径
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
`start`、`restart`、`doctor` 的就绪检查默认使用已安装服务保存的配置路径;命令的非空 `PI_WEB_CONFIG` 可覆盖。`doctor` 检查受管理安装,不代表所有自定义环境。
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
| 情况 | 行为或处理 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| 使用已安装路径 | 正常执行 `pi-web start`、`restart`、`doctor` |
|
|
25
|
+
| 单次命令覆盖 | 设置非空 `PI_WEB_CONFIG`,不重写服务定义 |
|
|
26
|
+
| 更改服务路径 | `pi-web install --config /path/to/config.json` 重新生成 Web/API 和 daemon 定义 |
|
|
27
|
+
| 旧安装仅 Web 保存路径 | 重跑上述安装命令,对齐两个服务 |
|
|
28
|
+
| systemd 无法验证实际环境 | 管理器状态过期、实际 fragment 不同或管理值不可验证时失败,不猜测;受管理 `Environment=`(当前 `PI_WEB_CONFIG`)必须与定义一致;无关变量忽略,未改管理值的 drop-in 允许 |
|
|
29
|
+
| systemd 使用 `EnvironmentFile=` | 本地保留严格检查:无法验证文件内实际覆盖时失败,不采用上游仅警告的宽松策略 |
|
|
30
|
+
| launchd 使用旧路径或其他 plist 标签 | `start`/`doctor` 失败;`restart` 重新加载已安装 plist,可修复过期状态 |
|
|
24
31
|
|
|
25
|
-
|
|
32
|
+
<a id="startup-model-and-thinking-defaults"></a>
|
|
33
|
+
## 新会话模型与思考默认值
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
在模型或思考等级选择器中点击“新会话默认值”星标。实心星标表示已保存的默认值;点击选项本身只改变当前会话,星标不改变当前会话。
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
`defaultProvider`、`defaultModel`、`defaultThinkingLevel` 按机器上 **模式 × 项目** 保存至托管 `settings.preferences.json`,不写回共享 agent `settings.json`。普通模式与项目认证同目录;管理模式使用 `management-embed/projects/<hash>/`,不能唯一归属项目时使用 `management-embed/orphan/<cwdHash>/`。普通模式的 `enabledModels` 也按项目保存,管理模式不展示。
|
|
30
38
|
|
|
31
|
-
|
|
39
|
+
默认值无需重启,适用于新会话。项目 Pi 设置、显式启动选择及每模型思考设置仍有既定优先级。默认模型必须启用,否则选择首个启用模型。恢复会话保留原模型与思考等级。其他共享 agent 设置(包、扩展、代理等)继续读真实 agent 目录的 `settings.json`。
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+
<a id="reverse-proxy-deployment-paths"></a>
|
|
42
|
+
## 反向代理部署前缀
|
|
34
43
|
|
|
35
|
-
|
|
44
|
+
PI WEB 不需要专门的 URL 前缀配置。同一发布产物可用于 `/`、`/ai/`、`/test/ai/`。代理必须先把不带尾斜线的前缀重定向到带斜线地址,再剥离前缀转发同一认证范围的 HTTP 与 WebSocket。页面相对资源和 PWA 路径依赖这一契约,详见[反向代理安装指南](https://pi-web.dev/install#reverse-proxy-prefix)。
|
|
36
45
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
Supported project-local settings are then applied for that project's workspaces. For upload and prompt-attachment defaults, `<project>/.pi-web/config.json` overrides the global value.
|
|
46
|
+
<a id="precedence"></a>
|
|
47
|
+
<a id="precedence-and-reloads"></a>
|
|
48
|
+
## 优先级与生效条件
|
|
42
49
|
|
|
43
|
-
|
|
50
|
+
机器运行配置顺序:内置默认值 → 全局配置 → 环境覆盖。支持的项目键之后应用,上传与附件目录以项目值覆盖,允许路径列表合并去重。
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
环境覆盖包含 `PI_WEB_HOST`、`PI_WEB_PORT`/`PORT`、`PI_WEB_ALLOWED_HOSTS`、`PI_WEB_MAX_UPLOAD_BYTES`、`PI_CODING_AGENT_DIR`、`PI_CODING_AGENT_SESSION_DIR`、`PI_WEB_SPAWN_SESSIONS`、`PI_WEB_SUBSESSIONS`、`PI_WEB_ASK_USER`、`PI_WEB_ENVIRONMENT_FACTS`。本地保留的旧 agent/companion 输入另见下文。
|
|
46
53
|
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- `
|
|
53
|
-
- `
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
- `shortcuts`: saved settings apply in the browser after config refresh/save.
|
|
54
|
+
- host/port:重启 Web/API。
|
|
55
|
+
- 上传大小:目标机器 Web/API 与 daemon 都重启。
|
|
56
|
+
- 会话工具、扩展对话框超时、环境事实:重启 daemon。
|
|
57
|
+
- 路径访问:下次请求生效;已有视图可需刷新。
|
|
58
|
+
- 上传/附件目录:配置或工作区刷新后的新批次生效。
|
|
59
|
+
- 纯浏览器插件:刷新浏览器。影响 `serverModule` 的启用、设置、包来源或版本:手动重启目标 daemon,再刷新。
|
|
60
|
+
- `serverPlugins.safeStart`:下次 daemon 启动前、发现/导入插件前生效,通过恢复 CLI 管理。
|
|
61
|
+
- Pi 普通资源变更:每个空闲会话执行 `/reload`。服务端插件或全局提供器定义/连接变更仍需手动重启 daemon;已知提供器仅模型列表刷新无需重启。
|
|
62
|
+
- 快捷键:保存或配置刷新后生效。
|
|
63
|
+
- `workbenchIntegration`、管理特权配置或跨进程审计配置:Web/API 与 daemon 保持一致并重启;签名授权仍必须显式允许对应权限。
|
|
58
64
|
|
|
59
|
-
|
|
65
|
+
<a id="global-config-example"></a>
|
|
66
|
+
## 全局配置示例
|
|
60
67
|
|
|
61
68
|
```json
|
|
62
69
|
{
|
|
63
70
|
"host": "127.0.0.1",
|
|
64
71
|
"port": 8504,
|
|
65
|
-
"pathAccess": {
|
|
66
|
-
|
|
67
|
-
},
|
|
68
|
-
"uploads": {
|
|
69
|
-
"defaultFolder": ".pi-web/uploads"
|
|
70
|
-
},
|
|
71
|
-
"attachments": {
|
|
72
|
-
"defaultFolder": ".pi-web/attachments"
|
|
73
|
-
},
|
|
72
|
+
"pathAccess": { "allowedPaths": ["~/SDKs", "/opt/reference"] },
|
|
73
|
+
"uploads": { "defaultFolder": ".pi-web/uploads" },
|
|
74
|
+
"attachments": { "defaultFolder": ".pi-web/attachments" },
|
|
74
75
|
"maxUploadBytes": 67108864,
|
|
75
|
-
"agent": {
|
|
76
|
-
"command": "pi",
|
|
77
|
-
"dir": "~/agent-profiles/research"
|
|
78
|
-
},
|
|
79
76
|
"spawnSessions": true,
|
|
80
77
|
"subsessions": true,
|
|
81
78
|
"askUser": true,
|
|
82
79
|
"extensionDialogsTimeoutMs": 300000,
|
|
83
|
-
"
|
|
84
|
-
|
|
85
|
-
"mcpUrl": "http://mcp:8000/mcp",
|
|
86
|
-
"requestTimeoutMs": 10000,
|
|
87
|
-
"capabilityTimeoutMs": 30000,
|
|
88
|
-
"skillBundleMaxBytes": 10485760,
|
|
89
|
-
"skillFileMaxBytes": 2097152,
|
|
90
|
-
"skillFileCountMax": 200
|
|
91
|
-
},
|
|
92
|
-
"auditLog": {
|
|
93
|
-
"normalMode": {
|
|
94
|
-
"enabled": true,
|
|
95
|
-
"retentionDays": 90,
|
|
96
|
-
"maxRows": 500000
|
|
97
|
-
},
|
|
98
|
-
"managementMode": {
|
|
99
|
-
"enabled": true,
|
|
100
|
-
"baseUrl": "https://elasticsearch.internal:9200",
|
|
101
|
-
"indexPrefix": "pi-web-management-audit",
|
|
102
|
-
"retentionDays": 365
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
"plugins": {
|
|
106
|
-
"workspace-tasks": { "enabled": true },
|
|
107
|
-
"updates": { "enabled": true },
|
|
108
|
-
"info": { "enabled": false }
|
|
109
|
-
},
|
|
110
|
-
"shortcuts": {
|
|
111
|
-
"core:view.chat": "mod+1",
|
|
112
|
-
"core:session.stop": null
|
|
113
|
-
}
|
|
80
|
+
"environmentFacts": true,
|
|
81
|
+
"plugins": { "workspace-tasks": { "enabled": true }, "updates": { "enabled": false } }
|
|
114
82
|
}
|
|
115
83
|
```
|
|
116
84
|
|
|
117
|
-
|
|
85
|
+
合并到已有文件,不覆盖无关设置或用户数据。
|
|
118
86
|
|
|
119
|
-
|
|
87
|
+
<a id="project-local-config-example"></a>
|
|
88
|
+
<a id="project-local-config"></a>
|
|
89
|
+
## 项目配置示例
|
|
120
90
|
|
|
121
91
|
```json
|
|
122
92
|
{
|
|
123
93
|
"version": 1,
|
|
124
|
-
"pathAccess": {
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
"uploads": {
|
|
128
|
-
"defaultFolder": "manual/uploads"
|
|
129
|
-
},
|
|
130
|
-
"attachments": {
|
|
131
|
-
"defaultFolder": "prompt-assets"
|
|
132
|
-
}
|
|
94
|
+
"pathAccess": { "allowedPaths": ["~/project-reference"] },
|
|
95
|
+
"uploads": { "defaultFolder": "manual/uploads" },
|
|
96
|
+
"attachments": { "defaultFolder": "prompt-attachments" }
|
|
133
97
|
}
|
|
134
98
|
```
|
|
135
99
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
|
|
|
157
|
-
|
|
|
158
|
-
|
|
|
159
|
-
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
|
178
|
-
|
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
|
|
|
182
|
-
|
|
|
183
|
-
|
|
|
184
|
-
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
100
|
+
路径根必须是宿主绝对路径或 `~` 前缀,不支持相对根。项目上传/附件目录通过工作区有效配置返回,联邦访问使用目标项目的值;不依赖旧远端可选字段回退。插件可拥有独立文件,如 `.pi-web/tasks.json`。
|
|
101
|
+
|
|
102
|
+
<a id="worktree-pre-remove-hook"></a>
|
|
103
|
+
## 工作区删除前钩子
|
|
104
|
+
|
|
105
|
+
在删除命令运行的工作区提供可执行 `.pi-web/hooks/worktree-pre-remove`,可清理绑定工作区的开发容器或其他资源。通常从项目主工作区运行,钩子可随仓库提交。
|
|
106
|
+
|
|
107
|
+
存在且可执行时,钩子与删除组成同一终端命令:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
'<hook path>' '<workspace path>' && <workspace removal command>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Git 删除命令为 `git worktree remove '<worktree path>'`。
|
|
114
|
+
|
|
115
|
+
| 契约 | 行为 |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| 参数 | 恰好一个参数:被删除工作区的绝对路径 |
|
|
118
|
+
| 工作目录 | 删除命令执行的工作区,不是被删除的工作区 |
|
|
119
|
+
| 返回 0 | 继续删除 |
|
|
120
|
+
| 非零退出 | `&&` 失败关闭,工作区保留在磁盘 |
|
|
121
|
+
| 不存在或不可执行 | 当作无钩子,单独执行删除 |
|
|
122
|
+
| 无法探测且不是普通缺失 | 在关闭工作区终端之前失败 |
|
|
123
|
+
| 输出 | 与“删除工作区”终端命令一起展示 |
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
#!/bin/sh
|
|
127
|
+
# .pi-web/hooks/worktree-pre-remove
|
|
128
|
+
set -eu
|
|
129
|
+
worktree_path="$1"
|
|
130
|
+
# 停止绑定该工作区的开发容器,释放项目资源。
|
|
131
|
+
# 非零退出会阻止删除。
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
这是不限制工具的项目扩展点,不假定特定容器或资源管理系统。
|
|
135
|
+
|
|
136
|
+
<a id="configuration-matrix"></a>
|
|
137
|
+
## 配置矩阵
|
|
138
|
+
|
|
139
|
+
“机器”为所选机器;“网关”为当前浏览器连接的机器。`—` 为无配置文件键的纯环境变量。
|
|
140
|
+
|
|
141
|
+
| 配置 | JSON 键 | 环境变量 | 作用域 | 项目行为 / 生效 |
|
|
142
|
+
| --- | --- | --- | --- | --- |
|
|
143
|
+
| 监听地址 | `host` | `PI_WEB_HOST` | 网关 | 无项目键;重启 Web/API |
|
|
144
|
+
| 监听端口 | `port` | `PI_WEB_PORT`、`PORT` | 网关 | 无项目键;重启 Web/API |
|
|
145
|
+
| 开发允许主机 | `allowedHosts` | `PI_WEB_ALLOWED_HOSTS` | 网关开发服务 | 重启开发 Web/UI |
|
|
146
|
+
| 外部路径根 | `pathAccess.allowedPaths` | — | 机器 + 项目 | 全局后加项目,去重;下次文件请求 |
|
|
147
|
+
| 上传目录 | `uploads.defaultFolder` | — | 机器 + 项目 | 项目覆盖;新对话框/拖放批次 |
|
|
148
|
+
| 附件目录 | `attachments.defaultFolder` | — | 机器 + 项目 | 项目覆盖;新附件保存 |
|
|
149
|
+
| 请求大小 | `maxUploadBytes` | `PI_WEB_MAX_UPLOAD_BYTES` | 机器 | Web/API 与 daemon 重启 |
|
|
150
|
+
| 独立会话 | `spawnSessions` | `PI_WEB_SPAWN_SESSIONS` | daemon | 重启 daemon |
|
|
151
|
+
| 跟踪子会话 | `subsessions` | `PI_WEB_SUBSESSIONS` | daemon | 也需要 `spawnSessions`;重启 |
|
|
152
|
+
| 问题表单 | `askUser` | `PI_WEB_ASK_USER` | daemon | 重启 daemon |
|
|
153
|
+
| 扩展对话框超时 | `extensionDialogsTimeoutMs` | — | daemon | 重启 daemon |
|
|
154
|
+
| 环境事实 | `environmentFacts` | `PI_WEB_ENVIRONMENT_FACTS` | daemon | 重启 daemon |
|
|
155
|
+
| 插件期望状态 | `plugins.<id>.enabled/settings` | — | 机器 | 浏览器刷新;服务端重启后刷新 |
|
|
156
|
+
| 插件恢复 | `serverPlugins.safeStart` | — | 机器离线恢复 | 下次 daemon 启动前应用 |
|
|
157
|
+
| 快捷键 | `shortcuts.<actionId>` | — | 网关 | 保存/刷新配置 |
|
|
158
|
+
| 项目版本 | `version` | — | 项目 | 存在时必须为 `1` |
|
|
159
|
+
| 配置文件 | — | `PI_WEB_CONFIG`、`XDG_CONFIG_HOME` | 进程 | 改环境后重启;不是项目配置 |
|
|
160
|
+
| 托管数据 | — | `PI_WEB_DATA_DIR` | Web/API + daemon | 两进程对齐重启;不自动迁移数据 |
|
|
161
|
+
| daemon socket | — | `PI_WEB_SESSIOND_SOCKET` | Web/API + daemon | 两端一致并重启;默认 `$PI_WEB_DATA_DIR/sessiond.sock` |
|
|
162
|
+
| daemon TCP 端口 | — | `PI_WEB_SESSIOND_PORT` | daemon | 重启并同步 Web 的 URL |
|
|
163
|
+
| daemon TCP 主机 | — | `PI_WEB_SESSIOND_HOST` | daemon | 重启 daemon |
|
|
164
|
+
| Web 到 daemon URL | — | `PI_WEB_SESSIOND_URL` | Web/API | 重启 Web/API |
|
|
165
|
+
| 项目注册表 | — | `PI_WEB_PROJECTS_FILE` | Web/API + daemon | 高级状态覆盖;两进程重启 |
|
|
166
|
+
| 远端注册表 | — | `PI_WEB_MACHINES_FILE` | Web/API | 高级状态覆盖;重启 Web |
|
|
167
|
+
| Pi 状态目录 | — | `PI_CODING_AGENT_DIR` | daemon | 重启;包/插件/共享 agent 设置使用该目录 |
|
|
168
|
+
| Pi 会话目录 | — | `PI_CODING_AGENT_SESSION_DIR` | daemon | 独立会话存储覆盖;重启 |
|
|
169
|
+
| 跳过版本检查 | — | `PI_WEB_SKIP_VERSION_CHECK`、`PI_SKIP_VERSION_CHECK` | Web/API | 重启 Web;不禁止模型目录刷新 |
|
|
170
|
+
| 离线 | — | `PI_WEB_OFFLINE`、`PI_OFFLINE` | Web/API + daemon | 两进程重启;也禁用模型目录网络刷新 |
|
|
171
|
+
| Docker 开发 socket | — | `PI_WEB_DEV_SESSIOND_SOCKET` | Docker 开发环境 | 默认 `/data/pi-web/sessiond-dev.sock`;生成配置和健康检查使用此值,不改变生产 socket |
|
|
172
|
+
|
|
173
|
+
<a id="key-details"></a>
|
|
174
|
+
## 关键细节
|
|
175
|
+
|
|
176
|
+
<a id="ordinary-mode-tool-audit"></a>
|
|
177
|
+
### 普通模式工具审计
|
|
178
|
+
|
|
179
|
+
保留 Pino/服务日志,同时将普通模式工具调用元数据存入 `$PI_WEB_DATA_DIR/audit/normal-tool-calls.sqlite`;管理调用不进入该数据库。行包含会话、工作区、工具/call ID、起止时间、耗时及 `started`、`completed`、`failed`、`interrupted` 状态,不保存参数、结果、提示词、模型回复或凭据。
|
|
180
|
+
|
|
181
|
+
`auditLog.normalMode.enabled` 默认 `true`,`retentionDays` 默认 `90`,`maxRows` 默认 `500000`。daemon 启动和每 24 小时清理;数据库错误记日志,不停止工具。WAL 允许 daemon 活跃时读取;优雅关闭和下次启动将未完成调用标记为 interrupted。改变配置重启 daemon。
|
|
195
182
|
|
|
196
183
|
```bash
|
|
197
184
|
pi-web audit list --since 24h
|
|
@@ -202,262 +189,222 @@ pi-web audit prune --before 2026-05-01
|
|
|
202
189
|
pi-web audit vacuum
|
|
203
190
|
```
|
|
204
191
|
|
|
205
|
-
|
|
192
|
+
<a id="management-mode-elasticsearch-audit"></a>
|
|
193
|
+
### 管理模式 Elasticsearch 审计
|
|
206
194
|
|
|
207
|
-
|
|
195
|
+
保留服务日志,可通过 `auditLog.managementMode.enabled: true` 与 `baseUrl`(或 `PI_WEB_AUDIT_ES_URL`)开启 Elasticsearch。认证只读 daemon 环境:`PI_WEB_AUDIT_ES_API_KEY` 优先,基本认证须同时有 `PI_WEB_AUDIT_ES_USERNAME`/`PI_WEB_AUDIT_ES_PASSWORD`;URL 禁止携带凭据。
|
|
208
196
|
|
|
209
|
-
|
|
197
|
+
按上海日历 ISO 周写入如 `pi-web-management-audit-2026-w32` 的索引,`indexPrefix` 默认 `pi-web-management-audit`,`retentionDays` 默认 `365`。daemon 安装严格模板,经 Bulk API 批写,启动/每日维护;上海日历每月首次成功维护删除早于截止的 `@timestamp` 文档。
|
|
210
198
|
|
|
211
|
-
|
|
199
|
+
记录 `user.id`、`user.root_user_id`、实际工作区所属授权项目、Pi 会话和适用的 Workbench Agent Session。受限和完整特权管理会话均在 `content` 中保留用户问题文本、模型可见回复(排除 `thinking` 块)、工具参数和结果;该字段只存储、不建立索引。服务日志仍仅记录元数据,管理调用不进入普通模式 SQLite。Workbench 专项能力、知识检索、Skill 事件仍只存固定资源版本、授权修订、run/trace ID、状态、耗时、重试或结果数量等元数据;同一调用作为工具执行时,其参数与结果按工具审计保存。不额外记录认证状态中的令牌、API key、cookie 或票据。
|
|
212
200
|
|
|
213
|
-
|
|
201
|
+
ES 错误记日志,不停止管理会话。有界内存队列重试,并在优雅关闭刷写;崩溃可能丢失尚未送达记录。正文及工具内容可能含敏感数据,须用 ES/Kibana 索引权限限制审计访问。共享跨进程配置保持 Web/API 与 daemon 一致;升级审计实现后需手动重启 `pi-web-sessiond.service`。
|
|
214
202
|
|
|
215
|
-
|
|
203
|
+
<a id="workbench-and-mcp-integration"></a>
|
|
204
|
+
### Workbench 与 MCP 集成
|
|
216
205
|
|
|
217
|
-
|
|
206
|
+
`workbenchIntegration` 是管理嵌入的受控适配器,不限制普通会话。`baseUrl` 为服务器可访问的 Workbench 后端 origin,`mcpUrl` 为 MCP Streamable HTTP endpoint,两者必需。环境覆盖:`PI_WEB_WORKBENCH_URL`、`PI_WEB_MCP_URL`、`PI_WEB_WORKBENCH_TIMEOUT_MS`、`PI_WEB_MCP_TIMEOUT_MS`、`PI_WEB_SKILL_BUNDLE_MAX_BYTES`、`PI_WEB_SKILL_FILE_MAX_BYTES`、`PI_WEB_SKILL_FILE_COUNT_MAX`。
|
|
218
207
|
|
|
219
|
-
|
|
208
|
+
默认 request/capability 超时 10000/30000ms、Skill bundle/file 上限 10485760/2097152 字节、文件数 200。适配器把一次性管理 token 换成私有 Agent Session,仅加载授权固定资源快照;并发同 entry token 复用该 Agent Session。
|
|
220
209
|
|
|
221
|
-
|
|
210
|
+
受控工具为 `icnoc_search_capabilities`、`icnoc_call_capability`、`workbench_search_knowledge`、`workbench_retrieve_knowledge`、`workbench_retrieve_bookstack`、管理文件工具与 Bubblewrap 隔离的 `python`。知识访问经后端短期一次性 token,PI WEB 不配置 RAGFlow/BookStack 服务凭据,工具不接受 tenant/dataset ID。来源链接不是连接配置。全局开关允许时再提供 spawn/跟踪子会话/ask_user,子会话继承管理上下文及显式拒绝。
|
|
222
211
|
|
|
223
|
-
|
|
212
|
+
Python 与受限 bash 默认无网络,只绑定管理工作区及必要的只读运行库;bash 可在该工作区沙盒内执行命令,不默认暴露其他宿主目录。通用 MCP、HTTP、Web 搜索、宿主 shell 和交互终端默认拒绝。签名 token 的 `privileged.bash`/`privileged.network` 仅在机器 `managementEmbed.allowPrivileged: true`(默认 false)时生效;仅 tools.allow 不足以获得特权。单项授权仍采用受限模式,tools.allow/deny 继续有效:仅 bash 授权可提供工作区可写、其他宿主目录只读的沙盒;仅网络授权可启用 http/webfetch/websearch 并移除管理 Python/bash/terminal-command-runs 的 `--unshare-net`,但不增加宿主文件可见性。
|
|
224
213
|
|
|
225
|
-
|
|
214
|
+
**完整特权管理会话**要求机器 `managementEmbed.allowPrivileged: true`,且签名 token 的 `privileged.bash` 与 `privileged.network` 都为 true。此时代理使用与普通模式相同的 SDK 工具及资源加载机制,忽略管理 token 的 tools.allow/deny,不再应用管理工具的工作区沙盒和资源过滤。管理嵌入会话直接通过项目信任,无需普通页面预先批准,也不改写普通模式的信任决定。其宿主文件读写、网络和已配置 MCP 等能力受运行 daemon 的系统账号和普通权限配置约束,不代表自动获取操作系统 root 权限。
|
|
226
215
|
|
|
227
|
-
|
|
216
|
+
此模式不注册管理专属工作台工具及其“L0 只读能力”指令,不以工作台资源续期作为代理启动门槛,也不强制同步工作台 Skills 或覆盖项目 Relay 模板。工具定义和系统提示由普通会话相同的加载路径生成;已有项目文件不自动删除或改写,仍按普通模式加载。工作台外部服务自身的授权规则不会因此被改写。
|
|
228
217
|
|
|
229
|
-
|
|
218
|
+
平台标记的管理 AGENTS 指令,以及与签名上下文明确匹配的旧平台指令,不加入完整特权代理的系统提示;原文件不删除,用户自行编写的项目或全局指令保留。操作者的普通权限策略配置继续生效,不安装“全允许”策略,也不清空其环境配置。此切换仅影响代理运行时,不改变浏览器交互终端端点的独立授权。
|
|
230
219
|
|
|
231
|
-
|
|
220
|
+
完整特权不改变管理身份、独立模型认证及偏好存储、审计或子会话管理上下文,也不允许普通会话连接读取管理会话。Web/API 与 daemon 的特权配置须一致。仅向受信任的签名入口发放双授权;旧管理 allow/deny 不能限制这种完整特权会话。
|
|
232
221
|
|
|
233
|
-
|
|
222
|
+
Skill bundle 只从 MCP origin 下载,校验授权固定版本与 manifest,写入管理项目 `.pi/skills/`;token/票据不离开服务端。管理启动只在所属工作区同步 relay/relay-runner 模板,普通启动不覆盖项目技能。
|
|
234
223
|
|
|
235
|
-
|
|
224
|
+
`workbench_search_knowledge` 检索授权元数据,可用 provider=ragflow/bookstack;RAGFlow 内容用 retrieve_knowledge,BookStack 用 retrieve_bookstack,参数 resource_name、简洁 question、可选 resource_version=live、top_k 默认 8/最大 20。通过后端 `POST /api/knowledge-access/bookstack/retrieval` 读取独立授权的已发布书籍当前非草稿页,不编辑、不提供语义检索。返回纯文本、修订、更新时间、源 URL 与 knowledge:// 引用;truncated 表示搜索/文本限制,不保证包含所有匹配。上限五批各 100 候选、每页 8000 字符、总 40000。源链接仍需要读者自身浏览器权限,工具不授予 BookStack 登录。
|
|
236
225
|
|
|
237
|
-
|
|
226
|
+
先部署支持资源快照、knowledge token 和检索 endpoint 的 Workbench 后端,再更新 PI WEB;BookStack 凭据只在后端,不新增 PI WEB BookStack 配置。工具更新重启 daemon;共享 endpoint/limit 改变重启两进程。签名 `projects[].agentsInstructions` 仅在项目 AGENTS.md 不存在时独占创建,已有内容不覆盖,无此字段仍兼容,普通项目不受影响。
|
|
238
227
|
|
|
239
|
-
|
|
228
|
+
<a id="managed-data-directory"></a>
|
|
229
|
+
### 托管数据目录
|
|
240
230
|
|
|
241
|
-
|
|
231
|
+
默认 `~/.pi-web` 保存项目/机器注册表、本地插件、默认 daemon socket、归档及项目认证/偏好。新目录是独立实例,没有原注册表和归档,不自动迁移。需要迁移时先停服务,复制 `archived-sessions.json` 和 `archived-sessions/` 后再启动。
|
|
242
232
|
|
|
243
|
-
|
|
233
|
+
一个目录只能有一个活跃 daemon。第二实例需要独立数据目录、daemon endpoint 和 Web 端口。过期所有权通常自动恢复;启动仍拒绝时,必须先确认所报进程已退出,再按错误提示处理 `sessiond-owner.json`。不要删除活跃所有权文件。
|
|
244
234
|
|
|
245
|
-
|
|
235
|
+
所有权标记更新使用短时互斥目录 `sessiond-owner.json.lock`,不会按年龄自动抢占。若启动/停止进程在更新期间崩溃,后续操作会明确报锁冲突;必须确认没有 daemon 正在启动或停止,才可删除该残留空目录后重试。升级这一保护机制时,先完整停止旧 daemon,再启动新版本,避免旧版本绕过互斥保护。
|
|
246
236
|
|
|
247
|
-
|
|
237
|
+
该变量不改变 `PI_WEB_CONFIG` 或 Pi 自有会话存储。
|
|
248
238
|
|
|
249
|
-
|
|
239
|
+
<a id="agent-process-environment"></a>
|
|
240
|
+
### 代理进程环境
|
|
250
241
|
|
|
251
|
-
|
|
242
|
+
普通代理 shell、终端和子会话继承 daemon 环境;移除 `NODE_ENV`、`PORT`,避免 daemon 生产设置影响开发命令。PATH、HOME、代理变量和 `PI_WEB_*` 保留。daemon 导出已解析的 `PI_CODING_AGENT_DIR`/`PI_CODING_AGENT_SESSION_DIR`;运行时读取共享 agent 设置与会话路径,但模型认证仍遵循 owning-project registry,不能由子进程环境说明推断普通项目共享凭据。
|
|
252
243
|
|
|
253
|
-
|
|
244
|
+
会话启动的进程继承 `PI_WEB_SESSION=1`,表示处于现有 PI WEB 中。继承变量指向当前实例;误启动第二实例会因活跃数据目录所有权失败。刻意运行独立实例必须另设目录、endpoint 和端口。
|
|
254
245
|
|
|
255
|
-
|
|
256
|
-
- Home-relative paths: `~/SDKs`
|
|
257
|
-
- Windows absolute paths on Windows hosts: `C:\Users\dev\SDKs`
|
|
246
|
+
系统提示词默认包含嵌套及 Docker 布局事实,提醒不要从需要保留的会话内重启宿主 daemon,并在受支持的开发重启中先启动 Web/API。可用 `environmentFacts: false` 或 `PI_WEB_ENVIRONMENT_FACTS=false` 禁用。管理嵌入仍使用受控工具和既定 Bubblewrap/网络/宿主权限策略,不直接继承普通模式工具权限。
|
|
258
247
|
|
|
259
|
-
|
|
248
|
+
<a id="external-path-access"></a>
|
|
249
|
+
### 外部路径访问
|
|
260
250
|
|
|
261
|
-
|
|
251
|
+
默认相对读取只在工作区内,绝对路径拒绝。`pathAccess.allowedPaths` 允许浏览器文件面板和绝对 `@` 补全列出/读取指定外部根。
|
|
262
252
|
|
|
263
|
-
|
|
253
|
+
允许 Unix 绝对路径 `/opt/reference`、家目录相对 `~/SDKs`、Windows 宿主上的 `C:\Users\dev\SDKs`。展开 `~`,通过 `realpath` 规范化根,要求存在目录,拒绝符号链接逃逸。不支持相对根。设置保存在所选机器,网关网络设置仍在网关。
|
|
264
254
|
|
|
265
|
-
|
|
255
|
+
这不是普通 Pi 代理或 OS 用户的沙箱,只约束浏览器/API 外部文件暴露。
|
|
266
256
|
|
|
267
|
-
|
|
257
|
+
<a id="manual-upload-defaults"></a>
|
|
258
|
+
### 手动上传默认目录
|
|
268
259
|
|
|
269
|
-
|
|
270
|
-
- Use the toolbar **Upload** button to open the review dialog, edit the destination, and opt into upload options.
|
|
260
|
+
文件面板支持多文件:直接拖放立即上传到工作区有效目录;“上传”按钮打开审核对话框,可修改目录和选项。默认 `.pi-web/uploads`,项目 `uploads.defaultFolder` 覆盖机器默认值。
|
|
271
261
|
|
|
272
|
-
|
|
262
|
+
目录非空且必须相对工作区;重复分隔符和反斜线规范化为 `/`,绝对路径与 `..` 逃逸拒绝。仅审核对话框允许清空目录,把该批次上传到工作区根。默认创建父目录,不覆盖已有文件;审核可显式覆盖,直接拖放从不覆盖。进度展示完成、冲突和错误。联邦使用目标机器/项目目录,大小限制由服务上传的机器控制。
|
|
273
263
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
"defaultFolder": "manual/uploads"
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
The value must be a non-empty workspace-relative folder. PI WEB normalizes repeated separators and backslashes to `/`, and rejects absolute paths or `..` traversal. In the upload dialog only, clearing the destination field uploads that batch to the workspace root.
|
|
283
|
-
|
|
284
|
-
Manual uploads use the workspace file-write path: paths stay workspace-relative, parent folder creation is enabled by default, and overwrite is disabled by default. Direct drag/drop always keeps `overwrite` off; the review dialog lets you explicitly enable overwrite when needed. Browser-owned XHR progress is shown per batch/file, conflicts and errors stay visible in the upload progress UI, and the final file-write response is the source of truth.
|
|
285
|
-
|
|
286
|
-
For machine federation, Settings saves the global upload default on the selected machine. Current remote PI WEB servers also return `workspace.effectiveConfig.uploads.defaultFolder` on the existing workspace-list response. Older remote servers can omit that optional field without breaking clients; the Files panel falls back to the global/default upload folder.
|
|
287
|
-
|
|
288
|
-
The per-request size limit is still controlled by `maxUploadBytes` / `PI_WEB_MAX_UPLOAD_BYTES` on the machine serving the upload.
|
|
264
|
+
<a id="prompt-attachment-defaults"></a>
|
|
265
|
+
<a id="prompt-attachments"></a>
|
|
266
|
+
### 提示词附件默认目录
|
|
289
267
|
|
|
290
|
-
|
|
268
|
+
附件投递“保存到…”把文件写入工作区,并在提示词中引用路径,不以内联方式附加内容。默认 `.pi-web/attachments`,项目 `attachments.defaultFolder` 覆盖机器默认值;格式/逃逸规则与上传目录一致。显式附件 API 请求目录优先于配置。联邦设置保存在目标机器,编辑器使用有效项目目录。
|
|
291
269
|
|
|
292
|
-
|
|
270
|
+
<a id="agent-state-directory"></a>
|
|
271
|
+
<a id="agent-runtime"></a>
|
|
272
|
+
<a id="pi-compatible-agent-profile-and-companion-cli"></a>
|
|
273
|
+
### Pi 状态目录与本地兼容输入
|
|
293
274
|
|
|
294
|
-
|
|
295
|
-
{
|
|
296
|
-
"attachments": {
|
|
297
|
-
"defaultFolder": "prompt-assets"
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
```
|
|
275
|
+
会话使用内置 Pi SDK,doctor、状态和更新流程检查机器 PATH 上的 Pi companion CLI。标准 `PI_CODING_AGENT_DIR`(默认 `~/.pi/agent`)选择共享 agent 设置、包与默认会话路径;`PI_CODING_AGENT_SESSION_DIR` 可独立指定会话路径,标准契约仅环境变量,没有新配置文件键。
|
|
301
276
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
PI WEB embeds Pi Coding Agent `0.84.x` or newer compatible runtime packages. The session daemon owns one resolved Pi state directory and refuses to start a second daemon against the same `PI_WEB_DATA_DIR`; use distinct data and endpoint variables for another instance.
|
|
307
|
-
|
|
308
|
-
`agent.command` selects the Pi-compatible companion CLI used by `pi-web doctor` and, when it can be generated safely, package-managed update commands. It defaults to `pi`. This setting does **not** replace the embedded runtime: every session continues to use PI WEB's bundled Pi SDK.
|
|
309
|
-
|
|
310
|
-
`agent.dir` selects the Pi-compatible state profile used for auth providers, models, settings, sessions, Pi packages, and Pi-package-backed PI WEB plugin discovery. It defaults to `~/.pi/agent` only for a canonical Pi companion command. The directory must use the data layout supported by the bundled Pi SDK; PI WEB does not load or convert incompatible fork formats, migrate profile data, or repartition PI WEB-managed archives when the profile changes.
|
|
311
|
-
|
|
312
|
-
```json
|
|
313
|
-
{
|
|
314
|
-
"agent": {
|
|
315
|
-
"command": "pi-lab",
|
|
316
|
-
"dir": "/opt/pi-profiles/lab"
|
|
317
|
-
}
|
|
318
|
-
}
|
|
277
|
+
```sh
|
|
278
|
+
PI_CODING_AGENT_DIR=/opt/pi-profiles/lab
|
|
279
|
+
PI_CODING_AGENT_SESSION_DIR=/opt/pi-profiles/lab-sessions
|
|
319
280
|
```
|
|
320
281
|
|
|
321
|
-
|
|
282
|
+
目录必须符合内置 SDK 数据布局;不转换不兼容格式,不迁移 profile,也不移动 PI WEB 归档。
|
|
322
283
|
|
|
323
|
-
|
|
284
|
+
daemon 启动时解析并固定目录,终端、bash、子会话使用相同值。运行期间改变环境不生效;包管理、插件发现、状态/安装识别和更新计划仍使用 daemon 的有效目录。Web 重启恢复同一有效目录,不独立解析新值。daemon 无法报告有效目录时,相关操作不可用,不自行回退。仅有效目录和可执行 companion CLI 都具备时提供包管理更新命令,并固定目录。
|
|
324
285
|
|
|
325
|
-
`
|
|
286
|
+
本地保留旧 `agent.command`/`agent.dir`、`PI_WEB_AGENT_COMMAND`/`PI_WEB_AGENT_DIR`/`PI_WEB_AGENT_SESSION_DIR` 和 Windows command/sessionDirEnvKeys 扩展,用于已有内部配置与 companion 行为;不扩展或拒绝上游两字段公开 v2 profile,不自动重写用户配置。弃用输入通过诊断提示,迁移请使用标准 Pi 环境变量;改变内部有效目录或命令仍需重启 daemon。
|
|
326
287
|
|
|
327
|
-
|
|
288
|
+
<a id="pi-extension-provider-baseline"></a>
|
|
289
|
+
### Pi 扩展提供器基线
|
|
328
290
|
|
|
329
|
-
|
|
291
|
+
普通模式提供器归属于注册项目的 `ProjectAuthService` 模型 registry,而不是全机共享;同项目工作区共享,其他项目和管理模式隔离。基线由 Pi 内置提供器、环境凭据、该项目托管 `models.json` 及全局 Pi 扩展/包建立;首次项目文件复制规则见[配置文件](#config-files)。PI WEB 工作区插件是另一概念。
|
|
330
292
|
|
|
331
|
-
|
|
293
|
+
连接设置在对应运行时基线建立后固定。项目扩展和 `/reload` 不能新增、替换或删除提供器;扩展其他功能正常加载与刷新。全局提供器定义、凭据/连接配置或实现变化需要手动重启 daemon,Web 重启和 `/reload` 不重建基线。
|
|
332
294
|
|
|
333
|
-
|
|
295
|
+
已知提供器仅模型列表变化、其他设置保持不变时可立即接受刷新,无需重启。更新按精确 registry 身份应用,只影响 owning project;同项目两个工作区注册不同列表时后注册者生效,不影响别的项目。模型条目可带 `baseUrl`/`headers`,覆盖该模型的提供器值;扩展仍是可信进程内代码,不是安全沙箱。
|
|
334
296
|
|
|
335
|
-
|
|
297
|
+
daemon 日志记录忽略的配置变更与模型列表应用,不输出提供器配置或凭据,不生成浏览器通知。管理 registry 独立;不能为对齐上游全局刷新而恢复跨项目共享。
|
|
336
298
|
|
|
337
|
-
|
|
299
|
+
<a id="background-model-catalog-refresh"></a>
|
|
300
|
+
<a id="catalog-refresh"></a>
|
|
301
|
+
### 后台模型目录刷新
|
|
338
302
|
|
|
339
|
-
|
|
303
|
+
目录网络刷新由 daemon 后台调度,请求自身不发起目录抓取,慢提供器不单独阻塞模型选择、启动或认证对话框。已在途刷新可能短暂影响对应 runtime 状态读取;会话活动行说明启动步骤及并发目录刷新,这是并发提示,不断言因果。
|
|
340
304
|
|
|
341
|
-
|
|
305
|
+
- daemon 启动 **15 秒**后首次运行,随后**每小时**检查。Pi 已保存目录四小时内视为新鲜,多数检查不联网。
|
|
306
|
+
- 登录/注销后按精确项目 registry 立即刷新,绕过新鲜度;管理 registry 独立。
|
|
307
|
+
- 每次最多 **60 秒**,超时/不可达五分钟后**只重试一次**;HTTP 错误留到下次计划。
|
|
308
|
+
- 失败不清空目录,保留最后成功结果并记日志;daemon 关闭会中止在途刷新。
|
|
309
|
+
- 下次请求模型列表才见新目录,已打开选择器可需重新打开。
|
|
310
|
+
- 设置 daemon 环境 `PI_WEB_OFFLINE` 或 `PI_OFFLINE` 后重启,完全禁止目录联网,包括登录后刷新;读取对应存储已有目录。
|
|
311
|
+
- `PI_WEB_SKIP_VERSION_CHECK`/`PI_SKIP_VERSION_CHECK` 只抑制版本检查,不禁止目录刷新。以上离线/跳过标记任意非空值(包括字符串 `0`、`false`)都启用,清空或移除才关闭。
|
|
342
312
|
|
|
343
|
-
-
|
|
344
|
-
|
|
313
|
+
<a id="project-trust-for-project-local-resources"></a>
|
|
314
|
+
### 项目信任
|
|
345
315
|
|
|
346
|
-
|
|
316
|
+
普通模式每次启动都先遵循 Pi 项目信任,再加载 `.pi/extensions/*`、`.pi/settings.json` 的包及其他项目资源,不能用配置关闭信任门槛。已有 `respectProjectTrust` 已移除,配置保存时移除该废弃键;读取不改写文件,也不会自动把已有项目设为可信。
|
|
347
317
|
|
|
348
|
-
|
|
318
|
+
优先级与 Pi 无交互提示时一致:没有需要信任资源则正常加载;全局扩展 `project_trust` 决定优先,可请求 `remember` 写入 agent `trust.json`;否则已保存决定优先;最后 `defaultProjectTrust` 的 `always` 加载,`never`/`ask` 跳过(没有浏览器运行时信任弹窗)。
|
|
349
319
|
|
|
350
|
-
|
|
320
|
+
添加项目可显式勾选“信任此项目”,不操作不写决定;工作区菜单可切换“已信任”。服务器解析授权工作区路径,远端保存于远端。下次运行时创建/打开读决定,既有运行时不立即重新加载,`/reload` 保留运行时信任状态。项目 auth/model/preferences 存储不迁入 trust;管理嵌入不读取/写入普通信任 API,继续独立授权资源与沙箱。
|
|
351
321
|
|
|
352
|
-
|
|
322
|
+
<a id="session-daemon-tools"></a>
|
|
323
|
+
<a id="session-tools"></a>
|
|
324
|
+
### 会话守护进程工具
|
|
353
325
|
|
|
354
|
-
|
|
326
|
+
`spawnSessions` 默认 `true`,提供 `spawn_session`,在同一项目其他工作区发起独立会话,发起后不向父会话回传结果。`subsessions` 默认 `true`,同时要求 `spawnSessions`,提供跟踪子会话工具。子会话始终使用父 cwd,`spawn_subsession` 没有 `cwd`;其他工作区使用独立 `spawn_session`。
|
|
355
327
|
|
|
356
|
-
|
|
328
|
+
跟踪子会话完成会自动通知/唤醒空闲父会话,无需轮询。父会话可继续独立工作,或在 join 点单独调用 `yield_to_subsessions` 作为批次最后动作:仍有工作则结束当前代理运行,没有工作则明确报告且不结束。`list_subsessions`、`check_subsession`、`read_subsession` 用于有意检查,不更改控制流;工作期间隐藏部分输出,完成后输出可用。过长完成结果不重复截断进上下文,指引使用 `check_subsession`。
|
|
357
329
|
|
|
358
|
-
|
|
330
|
+
两种 spawn 都支持精确 `provider/model-id` 的 `model`;未知/错误格式拒绝。省略时继承父模型,思考级别也继承并限制到模型能力。`#provider/model-id` 引用表达用户模型选择,不自动改变当前会话。
|
|
359
331
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
PI WEB shares one model runtime across all sessions, and provider model catalogs are refreshed over the network only on the session daemon's own background schedule. Requests never start a catalog fetch of their own, so a slow or unreachable provider cannot stall opening the model selector, starting a session, or the auth dialogs on its own account.
|
|
363
|
-
|
|
364
|
-
A refresh that is *already* in flight can still briefly delay starting or opening a session, because the shared runtime is read while that refresh is running. PI WEB says so while you wait: the session's activity line names the startup step it is on and adds `provider model lists are refreshing` when a background refresh is running at the same time. That note reports what is happening concurrently, not a proven cause.
|
|
365
|
-
|
|
366
|
-
The session daemon runs the refresh:
|
|
367
|
-
|
|
368
|
-
- **15 seconds after the daemon starts**, then **hourly**. Pi treats stored catalogs as fresh for four hours, so most hourly ticks make no network request at all; the shorter tick only makes sure a due refresh is not delayed to the next tick.
|
|
369
|
-
- **Immediately after a provider login or logout**, bypassing that freshness window, because the cached catalog is known to be wrong.
|
|
370
|
-
|
|
371
|
-
Each run is bounded: it is aborted after **60 seconds**, and a run that times out or cannot reach a provider earns **one retry after five minutes**; a provider that answers with an error status is retried on the next scheduled refresh instead. Failures never clear the stored catalogs — the last successfully fetched models stay in use and the daemon log records what failed. A refresh in flight is also aborted when the daemon shuts down.
|
|
372
|
-
|
|
373
|
-
Models fetched by a background refresh appear the next time a client asks for the model list, so a model selector left open across a refresh may need to be reopened.
|
|
374
|
-
|
|
375
|
-
To turn the background refresh off entirely, set `PI_WEB_OFFLINE` or `PI_OFFLINE` in the session daemon's environment and restart it. In offline mode PI WEB performs no provider catalog network requests, including after logins, and sessions use the catalogs already stored in the agent profile. The `PI_WEB_SKIP_VERSION_CHECK` and `PI_SKIP_VERSION_CHECK` keys do **not** affect this refresh; they only suppress PI WEB release checks.
|
|
376
|
-
|
|
377
|
-
### Session daemon tools
|
|
378
|
-
|
|
379
|
-
`spawnSessions` controls whether agents receive the `spawn_session` tool. It defaults to `true`; set it to `false` if you do not want an agent to start independent PI WEB sessions.
|
|
380
|
-
|
|
381
|
-
`subsessions` controls whether agents receive the tracked-subsession tools: `spawn_subsession`, `list_subsessions`, `check_subsession`, `read_subsession`, and `yield_to_subsessions`. It defaults to `true` and also requires `spawnSessions` to be enabled.
|
|
382
|
-
|
|
383
|
-
Tracked subsessions are join-oriented. Calling `spawn_subsession` returns immediately, so the parent can continue independent work while the child runs. Work whose result the parent does not need to join belongs in the fire-and-forget `spawn_session` tool instead.
|
|
384
|
-
|
|
385
|
-
A tracked subsession always runs in the spawning session's working directory, so it stays in that workspace's session tree next to its parent. `spawn_subsession` takes no `cwd`. For work in another workspace, use `spawn_session` to create an independent session there.
|
|
386
|
-
|
|
387
|
-
At a join point, after finishing its independent work, the parent calls `yield_to_subsessions` alone as the final action in its tool batch. Pi ends a tool batch early only when every result in that batch is terminating. If any tracked child is still working, the action ends the current agent run so the parent becomes idle. If none are working, it does not end the run and clearly reports that there is nothing to wait for.
|
|
388
|
-
|
|
389
|
-
A completion notice wakes an idle parent or queues behind in-flight work. Each notice lists any other tracked children still working, so the parent can continue work or call `yield_to_subsessions` again at the next join point. Further notices arrive automatically; do not poll. The notice includes the child's final output when it fits. If that output is too long, PI WEB omits it entirely instead of adding a truncated duplicate to the parent's context and directs the parent to retrieve it with `check_subsession`.
|
|
390
|
-
|
|
391
|
-
`list_subsessions`, `check_subsession`, and `read_subsession` never yield or change control flow. They are for deliberate inspection or recovery, not completion polling. While a child works, agent-facing `check_subsession` and `read_subsession` withhold partial output and direct the parent to continue independent work or yield at the join point. Output becomes available when the child stops. Included output and transcripts follow a labeled marker and come last, after PI WEB guidance.
|
|
392
|
-
|
|
393
|
-
`spawn_session` 和 `spawn_subsession` 都接受可选的 `model` 参数,其值必须是精确的 `provider/model-id`,例如 `anthropic/claude-sonnet-4-5`。设置后,新会话会使用该模型,而不是继承发起会话的模型。匹配是严格的:未知值或格式错误的值会被拒绝并返回错误。用户可以在提示词中通过 `#provider/model-id` 引用指定模型(见[提示词补全](#prompt-completions)),代理会将该引用作为此参数传递。新会话还会继承发起会话当前的思考级别,并根据所选模型的能力自动限制该级别。
|
|
394
|
-
|
|
395
|
-
In **Settings → Session daemon**, these keys are saved on the selected machine. Restart the session daemon on that machine after changing them.
|
|
396
|
-
|
|
397
|
-
#### `askUser` and `ask_user`
|
|
398
|
-
|
|
399
|
-
`askUser` controls whether agents receive the core `ask_user` tool. It defaults to `true`; set it to `false`, or set `PI_WEB_ASK_USER=false`, to remove the tool. The environment override accepts `0|1|true|false` and takes precedence over the config file.
|
|
400
|
-
|
|
401
|
-
Use **Settings → Session daemon → Allow agents to ask questions** to change `askUser` on the selected machine. An environment override makes the toggle read-only.
|
|
402
|
-
|
|
403
|
-
The tool accepts one set of 1–20 questions. Each question has a unique `id`, its `question` text, optional supporting `detail`, up to 12 options with stable values and user-facing labels, and an optional `multiple` flag. The browser always adds a **Custom** free-text answer, including when the model supplies no options. No question is required: the user may leave any of them unanswered.
|
|
404
|
-
|
|
405
|
-
Calling `ask_user` posts the whole set as one browser form and ends the current agent run instead of waiting for the user. The open form is owned by the session daemon, so it survives a browser disconnect, browser reload, or web/API restart while that daemon keeps running. When the user submits, the answers arrive as a follow-up that wakes the session; each question is reported with its selected option values or free text, or explicitly as unanswered.
|
|
406
|
-
|
|
407
|
-
PI WEB confirms a partial submission before sending it and names the unanswered questions. Only one ask can be open per session: a later `ask_user` call supersedes the earlier one, reports that fact and its unanswered questions to the model, and turns the earlier card into a read-only transcript record. Submitted and cancelled asks likewise remain readable in the transcript.
|
|
408
|
-
|
|
409
|
-
Sending an ordinary chat message while a form is open voids the form: the card closes as cancelled and the model is told its questions went unanswered as part of the turn the message itself starts.
|
|
410
|
-
|
|
411
|
-
Restart the session daemon after changing `askUser` or after upgrading PI WEB to a version that introduces this tool. For the systemd user service, run `systemctl --user restart pi-web-sessiond`.
|
|
332
|
+
`askUser` 默认 `true`,可在 **设置 → 会话守护进程** 切换。问题表单支持 1–20 问,每问最多 12 选项、可选多选、始终可自定义文本,可以不回答。普通消息取消开放表单,新表单替代旧表单;daemon 仍活跃时开放表单可跨浏览器/Web 重启保留。修改开关或升级工具实现需重启 daemon。管理生成子会话仍保留原管理上下文及显式工具拒绝。
|
|
412
333
|
|
|
334
|
+
<a id="extension-dialogs"></a>
|
|
413
335
|
### 扩展对话框
|
|
414
336
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
`extensionDialogsTimeoutMs` 是无人处理对话框时的安全超时:会话守护进程等待回答的最长时间,超时后将以对应类型的取消值结束对话框(确认框为 `false`,选择框和输入框为 `undefined`)。默认值为 `300000`(5 分钟);设为 `0` 时永久等待。扩展自身设置的 `timeout` 仍然生效,最终期限取两者中较早的时间。
|
|
418
|
-
|
|
419
|
-
该配置项直接在全局配置文件中编辑。修改后需要重启会话守护进程;使用 systemd 用户服务时运行 `systemctl --user restart pi-web-sessiond`。
|
|
337
|
+
扩展 `ctx.ui.confirm()`/`select()`/`input()` 以内联卡片显示,包括会话启动和运行中工具钩子。支持始终启用,无单独开关;回答走 daemon 独立通道,不经过提示词队列。详见[插件说明](https://pi-web.dev/plugins#pi-extension-dialogs)。
|
|
420
338
|
|
|
421
|
-
|
|
339
|
+
`extensionDialogsTimeoutMs` 默认 `300000`(五分钟),`0` 无限等待,与扩展自己的 timeout 取较早期限。取消值为确认 `false`,选择/输入 `undefined`。全局配置编辑后重启 daemon。
|
|
422
340
|
|
|
423
|
-
|
|
341
|
+
<a id="pi-web-plugin-config-and-recovery"></a>
|
|
342
|
+
<a id="plugin-config"></a>
|
|
343
|
+
### 插件配置与恢复
|
|
424
344
|
|
|
425
|
-
|
|
345
|
+
`plugins` 控制纯浏览器、纯服务端与双入口的期望启用状态和 JSON 设置,不管理 Pi 包安装。默认启用,包可声明 `defaultEnabled: false`,Captain's Log 如此;显式配置覆盖包默认。必需 `pi-web.terminal` 普通启动不能禁用,设置中不可编辑。服务端设置启动时生效,诊断不暴露设置值。
|
|
426
346
|
|
|
427
347
|
```json
|
|
428
348
|
{
|
|
429
349
|
"plugins": {
|
|
430
|
-
"
|
|
350
|
+
"git": { "enabled": true, "settings": {} },
|
|
351
|
+
"workspace-tasks": { "enabled": true },
|
|
431
352
|
"updates": { "enabled": false }
|
|
432
353
|
}
|
|
433
354
|
}
|
|
434
355
|
```
|
|
435
356
|
|
|
436
|
-
|
|
357
|
+
保存或换包改变期望状态,不替换运行代码。禁用服务端插件及配套 UI 可在重启前仍运行;包/设置不匹配、健康或兼容异常时暂缓配套 UI。设置区分期望与实际状态,daemon 不可用时实际状态不可用。混合版本不支持,远端插件/Git 可不可用或 404;网关/目标一起升级,重启更新的 Web/API 与目标 daemon 后刷新。不能回退到网关。
|
|
437
358
|
|
|
438
|
-
|
|
359
|
+
顺序:安装/更新目标包 → 保存期望配置 → 纯浏览器刷新;服务端则手动重启目标 daemon、等就绪、再刷新。重启可能中断活跃会话和所有权。仅浏览器刷新、Web/UI 自动重载、Web/API 重启、Pi `/reload` 都不激活服务端变化。
|
|
439
360
|
|
|
440
|
-
|
|
361
|
+
恢复 CLI 离线编辑全局配置,不连接 daemon、不发现/导入包、不带机器凭据;直接在目标机器运行,自定义配置加 `--config /path/to/config.json`:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
pi-web plugins disable <plugin-id> --restart
|
|
365
|
+
pi-web plugins safe-start show
|
|
366
|
+
pi-web plugins safe-start set bundled-only --restart
|
|
367
|
+
pi-web plugins safe-start set none --restart
|
|
368
|
+
pi-web plugins safe-start clear --restart
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
`disable` 保存 `enabled: false`,但拒绝必需终端。`bundled-only` 在发现/导入之前过滤外部插件,仍要求终端;`none` 跳过全部服务端插件,保留内核项目目录与诊断/设置,无终端工作流。`clear` 下次恢复普通发现。不支持的 safeStart 形状/值按 `none` 失败关闭,通过 show/set/clear 修复。
|
|
372
|
+
|
|
373
|
+
`--restart` 只执行识别的安全安装计划,否则打印手动指引。先持久化再重启,服务管理器失败后手动重启。一般失败尽可能隔离,但插件共享 daemon event loop,不是真正崩溃隔离;bundled-only 绕过外部失败,none 连内置失败也绕过,改变后仍需重启。
|
|
374
|
+
|
|
375
|
+
<a id="keyboard-shortcuts"></a>
|
|
376
|
+
<a id="shortcut-config"></a>
|
|
377
|
+
### 快捷键
|
|
378
|
+
|
|
379
|
+
`shortcuts.<actionId>` 值如 `mod+k`、`g p`、`shift+enter`,`null` 禁用该动作。
|
|
441
380
|
|
|
442
381
|
```json
|
|
443
382
|
{
|
|
444
383
|
"shortcuts": {
|
|
445
384
|
"core:view.chat": "mod+1",
|
|
446
|
-
"core:session.stop": null
|
|
385
|
+
"core:session.stop": null,
|
|
386
|
+
"app.navigation.focus-projects": "g p",
|
|
387
|
+
"composer.send.desktop": "mod+enter",
|
|
388
|
+
"composer.send.mobile": "shift+enter"
|
|
447
389
|
}
|
|
448
390
|
}
|
|
449
391
|
```
|
|
450
392
|
|
|
451
|
-
|
|
393
|
+
从 **设置 → 键盘** 编辑、录制、禁用或重置。`mod` 为 Ctrl/⌘,浏览器/系统可占用组合。应用支持单键和序列;无修饰键及仅 Shift 的绑定不在 input/textarea/select/contenteditable 内开始。序列 1.2 秒到期,Escape/焦点变化取消;自定义优先,同优先级按 action ID;短绑定遮蔽同前缀长序列。
|
|
452
394
|
|
|
453
|
-
|
|
395
|
+
编辑器发送绑定只接受一个组合。桌面默认 Enter;粗主指针(常见触屏)或 ≤760px 默认 Shift+Enter,键仍为 `composer.send.mobile`。未分配 Enter/Shift+Enter 插入换行;普通 Enter 优先接受选中补全。编辑器内发送绑定优先于应用快捷键,空草稿或不可发送时也如此。`null` 禁用键盘提交,不禁用按钮。
|
|
454
396
|
|
|
455
|
-
|
|
397
|
+
对应绑定未配置前保留浏览器旧 Enter 偏好,重置回该回退;不把旧偏好自动复制到共享配置。触屏键盘自动首字母大写不视为 Shift。
|
|
398
|
+
|
|
399
|
+
<a id="prompt-completions"></a>
|
|
400
|
+
## 提示词补全
|
|
456
401
|
|
|
457
|
-
-
|
|
458
|
-
- `@`
|
|
459
|
-
- `#`
|
|
402
|
+
- 草稿开头 `/` 补全会话命令。参数提示显示在名称旁,选择后一次性灰色提示在下次编辑/移动光标时消失。
|
|
403
|
+
- `@` 补全已跟踪文件;`@ `(at 后空格)或 `!@` 补全全部文件。选择插入路径引用,含空格自动加引号。
|
|
404
|
+
- `#` 补全当前会话可用模型,不区分大小写,最多 12 项。选择插入 `#provider/model-id`,指引代理使用模型,例如 spawn 的 model 参数。
|
|
460
405
|
|
|
461
|
-
|
|
406
|
+
<a id="completion-tools"></a>
|
|
407
|
+
<a id="optional-completion-tools"></a>
|
|
408
|
+
## 补全工具
|
|
462
409
|
|
|
463
|
-
|
|
410
|
+
可在服务器 PATH 安装 `fzf` 改善文件补全排序;不安装也能补全,`rg` 用于文件发现。
|