@agimon-ai/po-web-dashboard 0.0.0-alpha.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/LICENSE +29 -0
- package/README.md +10 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/core.cjs +222 -0
- package/dist/core.d.mts +21 -0
- package/dist/core.mjs +21 -0
- package/dist/index.cjs +546 -0
- package/dist/index.d.mts +81 -0
- package/dist/index.mjs +81 -0
- package/dist/testing.cjs +18 -0
- package/dist/testing.d.mts +6 -0
- package/dist/testing.mjs +6 -0
- package/dist/types/auth.cjs +20 -0
- package/dist/types/auth.cjs.map +1 -0
- package/dist/types/auth.d.mts +160 -0
- package/dist/types/auth.d.mts.map +1 -0
- package/dist/types/auth.mjs +19 -0
- package/dist/types/auth.mjs.map +1 -0
- package/dist/types/bridge.d.mts +18 -0
- package/dist/types/bridge.d.mts.map +1 -0
- package/dist/types/devProxy.cjs +41 -0
- package/dist/types/devProxy.cjs.map +1 -0
- package/dist/types/devProxy.d.mts +54 -0
- package/dist/types/devProxy.d.mts.map +1 -0
- package/dist/types/devProxy.mjs +39 -0
- package/dist/types/devProxy.mjs.map +1 -0
- package/dist/types/hub.cjs +220 -0
- package/dist/types/hub.cjs.map +1 -0
- package/dist/types/hub.d.mts +447 -0
- package/dist/types/hub.d.mts.map +1 -0
- package/dist/types/hub.mjs +179 -0
- package/dist/types/hub.mjs.map +1 -0
- package/dist/types/media.cjs +75 -0
- package/dist/types/media.cjs.map +1 -0
- package/dist/types/media.d.mts +22 -0
- package/dist/types/media.d.mts.map +1 -0
- package/dist/types/media.mjs +70 -0
- package/dist/types/media.mjs.map +1 -0
- package/dist/types/notification.cjs +19 -0
- package/dist/types/notification.cjs.map +1 -0
- package/dist/types/notification.d.mts +10 -0
- package/dist/types/notification.d.mts.map +1 -0
- package/dist/types/notification.mjs +19 -0
- package/dist/types/notification.mjs.map +1 -0
- package/dist/types/remoteAccess.cjs +92 -0
- package/dist/types/remoteAccess.cjs.map +1 -0
- package/dist/types/remoteAccess.d.mts +214 -0
- package/dist/types/remoteAccess.d.mts.map +1 -0
- package/dist/types/remoteAccess.mjs +68 -0
- package/dist/types/remoteAccess.mjs.map +1 -0
- package/dist/types/session.cjs +23 -0
- package/dist/types/session.cjs.map +1 -0
- package/dist/types/session.d.mts +29 -0
- package/dist/types/session.d.mts.map +1 -0
- package/dist/types/session.mjs +18 -0
- package/dist/types/session.mjs.map +1 -0
- package/dist/types/sessionMcp.d.mts +56 -0
- package/dist/types/sessionMcp.d.mts.map +1 -0
- package/dist/types/settings.cjs +18 -0
- package/dist/types/settings.cjs.map +1 -0
- package/dist/types/settings.d.mts +126 -0
- package/dist/types/settings.d.mts.map +1 -0
- package/dist/types/settings.mjs +12 -0
- package/dist/types/settings.mjs.map +1 -0
- package/dist/types.cjs +101 -0
- package/dist/types.d.mts +11 -0
- package/dist/types.mjs +9 -0
- package/dist/views.cjs +120 -0
- package/dist/views.d.mts +56 -0
- package/dist/views.mjs +56 -0
- package/dist/web/components/MascotMark.cjs +18 -0
- package/dist/web/components/MascotMark.cjs.map +1 -0
- package/dist/web/components/MascotMark.d.mts +9 -0
- package/dist/web/components/MascotMark.d.mts.map +1 -0
- package/dist/web/components/MascotMark.mjs +18 -0
- package/dist/web/components/MascotMark.mjs.map +1 -0
- package/dist/web/components/PluginSurface.cjs +15 -0
- package/dist/web/components/PluginSurface.cjs.map +1 -0
- package/dist/web/components/PluginSurface.d.mts +13 -0
- package/dist/web/components/PluginSurface.d.mts.map +1 -0
- package/dist/web/components/PluginSurface.mjs +15 -0
- package/dist/web/components/PluginSurface.mjs.map +1 -0
- package/dist/web/components/QrCode.cjs +37 -0
- package/dist/web/components/QrCode.cjs.map +1 -0
- package/dist/web/components/QrCode.d.mts +22 -0
- package/dist/web/components/QrCode.d.mts.map +1 -0
- package/dist/web/components/QrCode.mjs +37 -0
- package/dist/web/components/QrCode.mjs.map +1 -0
- package/dist/web/components/Remote.fixture.cjs +73 -0
- package/dist/web/components/Remote.fixture.cjs.map +1 -0
- package/dist/web/components/Remote.fixture.mjs +72 -0
- package/dist/web/components/Remote.fixture.mjs.map +1 -0
- package/dist/web/components/SessionMcp.cjs +279 -0
- package/dist/web/components/SessionMcp.cjs.map +1 -0
- package/dist/web/components/SessionMcp.d.mts +12 -0
- package/dist/web/components/SessionMcp.d.mts.map +1 -0
- package/dist/web/components/SessionMcp.mjs +278 -0
- package/dist/web/components/SessionMcp.mjs.map +1 -0
- package/dist/web/components/Story.fixture.cjs +124 -0
- package/dist/web/components/Story.fixture.cjs.map +1 -0
- package/dist/web/components/Story.fixture.d.mts +19 -0
- package/dist/web/components/Story.fixture.d.mts.map +1 -0
- package/dist/web/components/Story.fixture.mjs +119 -0
- package/dist/web/components/Story.fixture.mjs.map +1 -0
- package/dist/web/components/Template.fixture.cjs +67 -0
- package/dist/web/components/Template.fixture.cjs.map +1 -0
- package/dist/web/components/Template.fixture.d.mts +7 -0
- package/dist/web/components/Template.fixture.d.mts.map +1 -0
- package/dist/web/components/Template.fixture.mjs +65 -0
- package/dist/web/components/Template.fixture.mjs.map +1 -0
- package/dist/web/components/ToolRendererBoundary.cjs +23 -0
- package/dist/web/components/ToolRendererBoundary.cjs.map +1 -0
- package/dist/web/components/ToolRendererBoundary.d.mts +23 -0
- package/dist/web/components/ToolRendererBoundary.d.mts.map +1 -0
- package/dist/web/components/ToolRendererBoundary.mjs +23 -0
- package/dist/web/components/ToolRendererBoundary.mjs.map +1 -0
- package/dist/web/features/activity/ActivityDock.cjs +271 -0
- package/dist/web/features/activity/ActivityDock.cjs.map +1 -0
- package/dist/web/features/activity/ActivityDock.d.mts +22 -0
- package/dist/web/features/activity/ActivityDock.d.mts.map +1 -0
- package/dist/web/features/activity/ActivityDock.mjs +271 -0
- package/dist/web/features/activity/ActivityDock.mjs.map +1 -0
- package/dist/web/features/activity/ContextItemDialog.cjs +276 -0
- package/dist/web/features/activity/ContextItemDialog.cjs.map +1 -0
- package/dist/web/features/activity/ContextItemDialog.d.mts +16 -0
- package/dist/web/features/activity/ContextItemDialog.d.mts.map +1 -0
- package/dist/web/features/activity/ContextItemDialog.mjs +276 -0
- package/dist/web/features/activity/ContextItemDialog.mjs.map +1 -0
- package/dist/web/features/activity/ContextPanel.cjs +248 -0
- package/dist/web/features/activity/ContextPanel.cjs.map +1 -0
- package/dist/web/features/activity/ContextPanel.d.mts +4 -0
- package/dist/web/features/activity/ContextPanel.d.mts.map +1 -0
- package/dist/web/features/activity/ContextPanel.mjs +248 -0
- package/dist/web/features/activity/ContextPanel.mjs.map +1 -0
- package/dist/web/features/activity/DockTabs.cjs +47 -0
- package/dist/web/features/activity/DockTabs.cjs.map +1 -0
- package/dist/web/features/activity/DockTabs.d.mts +9 -0
- package/dist/web/features/activity/DockTabs.d.mts.map +1 -0
- package/dist/web/features/activity/DockTabs.mjs +47 -0
- package/dist/web/features/activity/DockTabs.mjs.map +1 -0
- package/dist/web/features/connection/RefusedCard.cjs +76 -0
- package/dist/web/features/connection/RefusedCard.cjs.map +1 -0
- package/dist/web/features/connection/RefusedCard.d.mts +5 -0
- package/dist/web/features/connection/RefusedCard.d.mts.map +1 -0
- package/dist/web/features/connection/RefusedCard.mjs +76 -0
- package/dist/web/features/connection/RefusedCard.mjs.map +1 -0
- package/dist/web/features/dialogs/DialogOverlay.cjs +164 -0
- package/dist/web/features/dialogs/DialogOverlay.cjs.map +1 -0
- package/dist/web/features/dialogs/DialogOverlay.d.mts +15 -0
- package/dist/web/features/dialogs/DialogOverlay.d.mts.map +1 -0
- package/dist/web/features/dialogs/DialogOverlay.mjs +164 -0
- package/dist/web/features/dialogs/DialogOverlay.mjs.map +1 -0
- package/dist/web/features/leader/CommandPalette.cjs +390 -0
- package/dist/web/features/leader/CommandPalette.cjs.map +1 -0
- package/dist/web/features/leader/CommandPalette.d.mts +14 -0
- package/dist/web/features/leader/CommandPalette.d.mts.map +1 -0
- package/dist/web/features/leader/CommandPalette.mjs +390 -0
- package/dist/web/features/leader/CommandPalette.mjs.map +1 -0
- package/dist/web/features/remote/DevProxyTargets.cjs +122 -0
- package/dist/web/features/remote/DevProxyTargets.cjs.map +1 -0
- package/dist/web/features/remote/DevProxyTargets.d.mts +15 -0
- package/dist/web/features/remote/DevProxyTargets.d.mts.map +1 -0
- package/dist/web/features/remote/DevProxyTargets.mjs +122 -0
- package/dist/web/features/remote/DevProxyTargets.mjs.map +1 -0
- package/dist/web/features/remote/HandoverProgress.cjs +28 -0
- package/dist/web/features/remote/HandoverProgress.cjs.map +1 -0
- package/dist/web/features/remote/HandoverProgress.d.mts +12 -0
- package/dist/web/features/remote/HandoverProgress.d.mts.map +1 -0
- package/dist/web/features/remote/HandoverProgress.mjs +28 -0
- package/dist/web/features/remote/HandoverProgress.mjs.map +1 -0
- package/dist/web/features/remote/PairedDeviceList.cjs +37 -0
- package/dist/web/features/remote/PairedDeviceList.cjs.map +1 -0
- package/dist/web/features/remote/PairedDeviceList.d.mts +5 -0
- package/dist/web/features/remote/PairedDeviceList.d.mts.map +1 -0
- package/dist/web/features/remote/PairedDeviceList.mjs +37 -0
- package/dist/web/features/remote/PairedDeviceList.mjs.map +1 -0
- package/dist/web/features/remote/PairingApprovalDialog.cjs +65 -0
- package/dist/web/features/remote/PairingApprovalDialog.cjs.map +1 -0
- package/dist/web/features/remote/PairingApprovalDialog.d.mts +11 -0
- package/dist/web/features/remote/PairingApprovalDialog.d.mts.map +1 -0
- package/dist/web/features/remote/PairingApprovalDialog.mjs +65 -0
- package/dist/web/features/remote/PairingApprovalDialog.mjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessDialog.cjs +83 -0
- package/dist/web/features/remote/RemoteAccessDialog.cjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessDialog.d.mts +11 -0
- package/dist/web/features/remote/RemoteAccessDialog.d.mts.map +1 -0
- package/dist/web/features/remote/RemoteAccessDialog.mjs +83 -0
- package/dist/web/features/remote/RemoteAccessDialog.mjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessOptions.cjs +154 -0
- package/dist/web/features/remote/RemoteAccessOptions.cjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessOptions.d.mts +11 -0
- package/dist/web/features/remote/RemoteAccessOptions.d.mts.map +1 -0
- package/dist/web/features/remote/RemoteAccessOptions.mjs +154 -0
- package/dist/web/features/remote/RemoteAccessOptions.mjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessPairing.cjs +93 -0
- package/dist/web/features/remote/RemoteAccessPairing.cjs.map +1 -0
- package/dist/web/features/remote/RemoteAccessPairing.d.mts +5 -0
- package/dist/web/features/remote/RemoteAccessPairing.d.mts.map +1 -0
- package/dist/web/features/remote/RemoteAccessPairing.mjs +93 -0
- package/dist/web/features/remote/RemoteAccessPairing.mjs.map +1 -0
- package/dist/web/features/remote/SandboxWorkspaces.cjs +87 -0
- package/dist/web/features/remote/SandboxWorkspaces.cjs.map +1 -0
- package/dist/web/features/remote/SandboxWorkspaces.d.mts +7 -0
- package/dist/web/features/remote/SandboxWorkspaces.d.mts.map +1 -0
- package/dist/web/features/remote/SandboxWorkspaces.mjs +87 -0
- package/dist/web/features/remote/SandboxWorkspaces.mjs.map +1 -0
- package/dist/web/features/remote/TrustedDeviceList.cjs +65 -0
- package/dist/web/features/remote/TrustedDeviceList.cjs.map +1 -0
- package/dist/web/features/remote/TrustedDeviceList.d.mts +13 -0
- package/dist/web/features/remote/TrustedDeviceList.d.mts.map +1 -0
- package/dist/web/features/remote/TrustedDeviceList.mjs +64 -0
- package/dist/web/features/remote/TrustedDeviceList.mjs.map +1 -0
- package/dist/web/features/selection/SelectionBar.cjs +401 -0
- package/dist/web/features/selection/SelectionBar.cjs.map +1 -0
- package/dist/web/features/selection/SelectionBar.d.mts +14 -0
- package/dist/web/features/selection/SelectionBar.d.mts.map +1 -0
- package/dist/web/features/selection/SelectionBar.mjs +400 -0
- package/dist/web/features/selection/SelectionBar.mjs.map +1 -0
- package/dist/web/features/session/AgentLockPanel.cjs +31 -0
- package/dist/web/features/session/AgentLockPanel.cjs.map +1 -0
- package/dist/web/features/session/AgentLockPanel.mjs +31 -0
- package/dist/web/features/session/AgentLockPanel.mjs.map +1 -0
- package/dist/web/features/session/Composer.cjs +808 -0
- package/dist/web/features/session/Composer.cjs.map +1 -0
- package/dist/web/features/session/Composer.d.mts +21 -0
- package/dist/web/features/session/Composer.d.mts.map +1 -0
- package/dist/web/features/session/Composer.mjs +806 -0
- package/dist/web/features/session/Composer.mjs.map +1 -0
- package/dist/web/features/session/ComposerPrompt.cjs +47 -0
- package/dist/web/features/session/ComposerPrompt.cjs.map +1 -0
- package/dist/web/features/session/ComposerPrompt.d.mts +16 -0
- package/dist/web/features/session/ComposerPrompt.d.mts.map +1 -0
- package/dist/web/features/session/ComposerPrompt.mjs +47 -0
- package/dist/web/features/session/ComposerPrompt.mjs.map +1 -0
- package/dist/web/features/session/DormantPanel.cjs +61 -0
- package/dist/web/features/session/DormantPanel.cjs.map +1 -0
- package/dist/web/features/session/DormantPanel.d.mts +8 -0
- package/dist/web/features/session/DormantPanel.d.mts.map +1 -0
- package/dist/web/features/session/DormantPanel.mjs +61 -0
- package/dist/web/features/session/DormantPanel.mjs.map +1 -0
- package/dist/web/features/session/MentionPreviews.cjs +128 -0
- package/dist/web/features/session/MentionPreviews.cjs.map +1 -0
- package/dist/web/features/session/MentionPreviews.d.mts +17 -0
- package/dist/web/features/session/MentionPreviews.d.mts.map +1 -0
- package/dist/web/features/session/MentionPreviews.mjs +127 -0
- package/dist/web/features/session/MentionPreviews.mjs.map +1 -0
- package/dist/web/features/session/MessageMarkdown.cjs +20 -0
- package/dist/web/features/session/MessageMarkdown.cjs.map +1 -0
- package/dist/web/features/session/MessageMarkdown.d.mts +19 -0
- package/dist/web/features/session/MessageMarkdown.d.mts.map +1 -0
- package/dist/web/features/session/MessageMarkdown.mjs +20 -0
- package/dist/web/features/session/MessageMarkdown.mjs.map +1 -0
- package/dist/web/features/session/QueueSheet.cjs +189 -0
- package/dist/web/features/session/QueueSheet.cjs.map +1 -0
- package/dist/web/features/session/QueueSheet.d.mts +16 -0
- package/dist/web/features/session/QueueSheet.d.mts.map +1 -0
- package/dist/web/features/session/QueueSheet.mjs +189 -0
- package/dist/web/features/session/QueueSheet.mjs.map +1 -0
- package/dist/web/features/session/SessionActivity.cjs +88 -0
- package/dist/web/features/session/SessionActivity.cjs.map +1 -0
- package/dist/web/features/session/SessionActivity.d.mts +16 -0
- package/dist/web/features/session/SessionActivity.d.mts.map +1 -0
- package/dist/web/features/session/SessionActivity.mjs +87 -0
- package/dist/web/features/session/SessionActivity.mjs.map +1 -0
- package/dist/web/features/session/SessionTranscriptView.cjs +34 -0
- package/dist/web/features/session/SessionTranscriptView.cjs.map +1 -0
- package/dist/web/features/session/SessionTranscriptView.d.mts +16 -0
- package/dist/web/features/session/SessionTranscriptView.d.mts.map +1 -0
- package/dist/web/features/session/SessionTranscriptView.mjs +34 -0
- package/dist/web/features/session/SessionTranscriptView.mjs.map +1 -0
- package/dist/web/features/session/ThreadView.cjs +40 -0
- package/dist/web/features/session/ThreadView.cjs.map +1 -0
- package/dist/web/features/session/ThreadView.d.mts +18 -0
- package/dist/web/features/session/ThreadView.d.mts.map +1 -0
- package/dist/web/features/session/ThreadView.mjs +40 -0
- package/dist/web/features/session/ThreadView.mjs.map +1 -0
- package/dist/web/features/session/Timeline.cjs +620 -0
- package/dist/web/features/session/Timeline.cjs.map +1 -0
- package/dist/web/features/session/Timeline.d.mts +28 -0
- package/dist/web/features/session/Timeline.d.mts.map +1 -0
- package/dist/web/features/session/Timeline.mjs +619 -0
- package/dist/web/features/session/Timeline.mjs.map +1 -0
- package/dist/web/features/session/ToolCard.cjs +210 -0
- package/dist/web/features/session/ToolCard.cjs.map +1 -0
- package/dist/web/features/session/ToolCard.d.mts +16 -0
- package/dist/web/features/session/ToolCard.d.mts.map +1 -0
- package/dist/web/features/session/ToolCard.mjs +210 -0
- package/dist/web/features/session/ToolCard.mjs.map +1 -0
- package/dist/web/features/session/session.fixture.cjs +76 -0
- package/dist/web/features/session/session.fixture.cjs.map +1 -0
- package/dist/web/features/session/session.fixture.d.mts +6 -0
- package/dist/web/features/session/session.fixture.d.mts.map +1 -0
- package/dist/web/features/session/session.fixture.mjs +74 -0
- package/dist/web/features/session/session.fixture.mjs.map +1 -0
- package/dist/web/features/sessions/NewSessionDialog.cjs +70 -0
- package/dist/web/features/sessions/NewSessionDialog.cjs.map +1 -0
- package/dist/web/features/sessions/NewSessionDialog.d.mts +9 -0
- package/dist/web/features/sessions/NewSessionDialog.d.mts.map +1 -0
- package/dist/web/features/sessions/NewSessionDialog.mjs +70 -0
- package/dist/web/features/sessions/NewSessionDialog.mjs.map +1 -0
- package/dist/web/features/sessions/ResumeSessionDialog.cjs +131 -0
- package/dist/web/features/sessions/ResumeSessionDialog.cjs.map +1 -0
- package/dist/web/features/sessions/ResumeSessionDialog.d.mts +14 -0
- package/dist/web/features/sessions/ResumeSessionDialog.d.mts.map +1 -0
- package/dist/web/features/sessions/ResumeSessionDialog.mjs +131 -0
- package/dist/web/features/sessions/ResumeSessionDialog.mjs.map +1 -0
- package/dist/web/features/sessions/SessionRailDialogs.cjs +62 -0
- package/dist/web/features/sessions/SessionRailDialogs.cjs.map +1 -0
- package/dist/web/features/sessions/SessionRailDialogs.d.mts +10 -0
- package/dist/web/features/sessions/SessionRailDialogs.d.mts.map +1 -0
- package/dist/web/features/sessions/SessionRailDialogs.mjs +62 -0
- package/dist/web/features/sessions/SessionRailDialogs.mjs.map +1 -0
- package/dist/web/features/sessions/WelcomePanel.cjs +42 -0
- package/dist/web/features/sessions/WelcomePanel.cjs.map +1 -0
- package/dist/web/features/sessions/WelcomePanel.d.mts +16 -0
- package/dist/web/features/sessions/WelcomePanel.d.mts.map +1 -0
- package/dist/web/features/sessions/WelcomePanel.mjs +42 -0
- package/dist/web/features/sessions/WelcomePanel.mjs.map +1 -0
- package/dist/web/features/sessions/useNewSessionActions.cjs +38 -0
- package/dist/web/features/sessions/useNewSessionActions.cjs.map +1 -0
- package/dist/web/features/sessions/useNewSessionActions.d.mts +12 -0
- package/dist/web/features/sessions/useNewSessionActions.d.mts.map +1 -0
- package/dist/web/features/sessions/useNewSessionActions.mjs +38 -0
- package/dist/web/features/sessions/useNewSessionActions.mjs.map +1 -0
- package/dist/web/features/sessions/useSessionRail.cjs +302 -0
- package/dist/web/features/sessions/useSessionRail.cjs.map +1 -0
- package/dist/web/features/sessions/useSessionRail.d.mts +14 -0
- package/dist/web/features/sessions/useSessionRail.d.mts.map +1 -0
- package/dist/web/features/sessions/useSessionRail.mjs +302 -0
- package/dist/web/features/sessions/useSessionRail.mjs.map +1 -0
- package/dist/web/features/settings/AppearanceSettings.cjs +126 -0
- package/dist/web/features/settings/AppearanceSettings.cjs.map +1 -0
- package/dist/web/features/settings/AppearanceSettings.d.mts +12 -0
- package/dist/web/features/settings/AppearanceSettings.d.mts.map +1 -0
- package/dist/web/features/settings/AppearanceSettings.mjs +126 -0
- package/dist/web/features/settings/AppearanceSettings.mjs.map +1 -0
- package/dist/web/features/settings/ContributedSettings.cjs +257 -0
- package/dist/web/features/settings/ContributedSettings.cjs.map +1 -0
- package/dist/web/features/settings/ContributedSettings.d.mts +14 -0
- package/dist/web/features/settings/ContributedSettings.d.mts.map +1 -0
- package/dist/web/features/settings/ContributedSettings.mjs +257 -0
- package/dist/web/features/settings/ContributedSettings.mjs.map +1 -0
- package/dist/web/features/settings/ImageSettings.cjs +146 -0
- package/dist/web/features/settings/ImageSettings.cjs.map +1 -0
- package/dist/web/features/settings/ImageSettings.d.mts +12 -0
- package/dist/web/features/settings/ImageSettings.d.mts.map +1 -0
- package/dist/web/features/settings/ImageSettings.mjs +146 -0
- package/dist/web/features/settings/ImageSettings.mjs.map +1 -0
- package/dist/web/features/settings/LoginFlowDialog.cjs +226 -0
- package/dist/web/features/settings/LoginFlowDialog.cjs.map +1 -0
- package/dist/web/features/settings/LoginFlowDialog.d.mts +15 -0
- package/dist/web/features/settings/LoginFlowDialog.d.mts.map +1 -0
- package/dist/web/features/settings/LoginFlowDialog.mjs +225 -0
- package/dist/web/features/settings/LoginFlowDialog.mjs.map +1 -0
- package/dist/web/features/settings/NotificationSettings.cjs +69 -0
- package/dist/web/features/settings/NotificationSettings.cjs.map +1 -0
- package/dist/web/features/settings/NotificationSettings.d.mts +5 -0
- package/dist/web/features/settings/NotificationSettings.d.mts.map +1 -0
- package/dist/web/features/settings/NotificationSettings.mjs +69 -0
- package/dist/web/features/settings/NotificationSettings.mjs.map +1 -0
- package/dist/web/features/settings/PluginSettings.cjs +106 -0
- package/dist/web/features/settings/PluginSettings.cjs.map +1 -0
- package/dist/web/features/settings/PluginSettings.d.mts +10 -0
- package/dist/web/features/settings/PluginSettings.d.mts.map +1 -0
- package/dist/web/features/settings/PluginSettings.mjs +106 -0
- package/dist/web/features/settings/PluginSettings.mjs.map +1 -0
- package/dist/web/features/settings/ProviderSettings.cjs +323 -0
- package/dist/web/features/settings/ProviderSettings.cjs.map +1 -0
- package/dist/web/features/settings/ProviderSettings.d.mts +9 -0
- package/dist/web/features/settings/ProviderSettings.d.mts.map +1 -0
- package/dist/web/features/settings/ProviderSettings.mjs +323 -0
- package/dist/web/features/settings/ProviderSettings.mjs.map +1 -0
- package/dist/web/features/settings/RemoteControlSettings.cjs +50 -0
- package/dist/web/features/settings/RemoteControlSettings.cjs.map +1 -0
- package/dist/web/features/settings/RemoteControlSettings.d.mts +5 -0
- package/dist/web/features/settings/RemoteControlSettings.d.mts.map +1 -0
- package/dist/web/features/settings/RemoteControlSettings.mjs +50 -0
- package/dist/web/features/settings/RemoteControlSettings.mjs.map +1 -0
- package/dist/web/features/settings/RepositorySettings.cjs +318 -0
- package/dist/web/features/settings/RepositorySettings.cjs.map +1 -0
- package/dist/web/features/settings/RepositorySettings.d.mts +7 -0
- package/dist/web/features/settings/RepositorySettings.d.mts.map +1 -0
- package/dist/web/features/settings/RepositorySettings.mjs +318 -0
- package/dist/web/features/settings/RepositorySettings.mjs.map +1 -0
- package/dist/web/features/settings/RepositoryWorkspace.cjs +160 -0
- package/dist/web/features/settings/RepositoryWorkspace.cjs.map +1 -0
- package/dist/web/features/settings/RepositoryWorkspace.d.mts +10 -0
- package/dist/web/features/settings/RepositoryWorkspace.d.mts.map +1 -0
- package/dist/web/features/settings/RepositoryWorkspace.mjs +160 -0
- package/dist/web/features/settings/RepositoryWorkspace.mjs.map +1 -0
- package/dist/web/features/settings/SessionMcpSettings.cjs +488 -0
- package/dist/web/features/settings/SessionMcpSettings.cjs.map +1 -0
- package/dist/web/features/settings/SessionMcpSettings.d.mts +5 -0
- package/dist/web/features/settings/SessionMcpSettings.d.mts.map +1 -0
- package/dist/web/features/settings/SessionMcpSettings.mjs +488 -0
- package/dist/web/features/settings/SessionMcpSettings.mjs.map +1 -0
- package/dist/web/features/settings/SettingsMenu.cjs +135 -0
- package/dist/web/features/settings/SettingsMenu.cjs.map +1 -0
- package/dist/web/features/settings/SettingsMenu.d.mts +9 -0
- package/dist/web/features/settings/SettingsMenu.d.mts.map +1 -0
- package/dist/web/features/settings/SettingsMenu.mjs +135 -0
- package/dist/web/features/settings/SettingsMenu.mjs.map +1 -0
- package/dist/web/features/settings/SettingsPanelHost.cjs +32 -0
- package/dist/web/features/settings/SettingsPanelHost.cjs.map +1 -0
- package/dist/web/features/settings/SettingsPanelHost.d.mts +8 -0
- package/dist/web/features/settings/SettingsPanelHost.d.mts.map +1 -0
- package/dist/web/features/settings/SettingsPanelHost.mjs +32 -0
- package/dist/web/features/settings/SettingsPanelHost.mjs.map +1 -0
- package/dist/web/features/settings/TemplateSettings.cjs +177 -0
- package/dist/web/features/settings/TemplateSettings.cjs.map +1 -0
- package/dist/web/features/settings/TemplateSettings.d.mts +8 -0
- package/dist/web/features/settings/TemplateSettings.d.mts.map +1 -0
- package/dist/web/features/settings/TemplateSettings.mjs +177 -0
- package/dist/web/features/settings/TemplateSettings.mjs.map +1 -0
- package/dist/web/features/settings/TunnelSettings.cjs +182 -0
- package/dist/web/features/settings/TunnelSettings.cjs.map +1 -0
- package/dist/web/features/settings/TunnelSettings.d.mts +8 -0
- package/dist/web/features/settings/TunnelSettings.d.mts.map +1 -0
- package/dist/web/features/settings/TunnelSettings.mjs +182 -0
- package/dist/web/features/settings/TunnelSettings.mjs.map +1 -0
- package/dist/web/features/settings/settings.fixture.cjs +230 -0
- package/dist/web/features/settings/settings.fixture.cjs.map +1 -0
- package/dist/web/features/settings/settings.fixture.d.mts +6 -0
- package/dist/web/features/settings/settings.fixture.d.mts.map +1 -0
- package/dist/web/features/settings/settings.fixture.mjs +223 -0
- package/dist/web/features/settings/settings.fixture.mjs.map +1 -0
- package/dist/web/features/status/TopBar.cjs +200 -0
- package/dist/web/features/status/TopBar.cjs.map +1 -0
- package/dist/web/features/status/TopBar.d.mts +11 -0
- package/dist/web/features/status/TopBar.d.mts.map +1 -0
- package/dist/web/features/status/TopBar.mjs +200 -0
- package/dist/web/features/status/TopBar.mjs.map +1 -0
- package/dist/web/lib/authApi.cjs +77 -0
- package/dist/web/lib/authApi.cjs.map +1 -0
- package/dist/web/lib/authApi.d.mts +28 -0
- package/dist/web/lib/authApi.d.mts.map +1 -0
- package/dist/web/lib/authApi.mjs +72 -0
- package/dist/web/lib/authApi.mjs.map +1 -0
- package/dist/web/lib/browserNotifications.cjs +37 -0
- package/dist/web/lib/browserNotifications.cjs.map +1 -0
- package/dist/web/lib/browserNotifications.d.mts +12 -0
- package/dist/web/lib/browserNotifications.d.mts.map +1 -0
- package/dist/web/lib/browserNotifications.mjs +35 -0
- package/dist/web/lib/browserNotifications.mjs.map +1 -0
- package/dist/web/lib/browserTelemetry.cjs +158 -0
- package/dist/web/lib/browserTelemetry.cjs.map +1 -0
- package/dist/web/lib/browserTelemetry.d.mts +28 -0
- package/dist/web/lib/browserTelemetry.d.mts.map +1 -0
- package/dist/web/lib/browserTelemetry.mjs +154 -0
- package/dist/web/lib/browserTelemetry.mjs.map +1 -0
- package/dist/web/lib/commands.cjs +176 -0
- package/dist/web/lib/commands.cjs.map +1 -0
- package/dist/web/lib/commands.d.mts +53 -0
- package/dist/web/lib/commands.d.mts.map +1 -0
- package/dist/web/lib/commands.mjs +153 -0
- package/dist/web/lib/commands.mjs.map +1 -0
- package/dist/web/lib/composerSubmissions.cjs +20 -0
- package/dist/web/lib/composerSubmissions.cjs.map +1 -0
- package/dist/web/lib/composerSubmissions.d.mts +7 -0
- package/dist/web/lib/composerSubmissions.d.mts.map +1 -0
- package/dist/web/lib/composerSubmissions.mjs +19 -0
- package/dist/web/lib/composerSubmissions.mjs.map +1 -0
- package/dist/web/lib/composition.cjs +403 -0
- package/dist/web/lib/composition.cjs.map +1 -0
- package/dist/web/lib/composition.d.mts +137 -0
- package/dist/web/lib/composition.d.mts.map +1 -0
- package/dist/web/lib/composition.mjs +392 -0
- package/dist/web/lib/composition.mjs.map +1 -0
- package/dist/web/lib/contextComposition.cjs +132 -0
- package/dist/web/lib/contextComposition.cjs.map +1 -0
- package/dist/web/lib/contextComposition.d.mts +75 -0
- package/dist/web/lib/contextComposition.d.mts.map +1 -0
- package/dist/web/lib/contextComposition.mjs +127 -0
- package/dist/web/lib/contextComposition.mjs.map +1 -0
- package/dist/web/lib/contextDetailApi.cjs +61 -0
- package/dist/web/lib/contextDetailApi.cjs.map +1 -0
- package/dist/web/lib/contextDetailApi.d.mts +12 -0
- package/dist/web/lib/contextDetailApi.d.mts.map +1 -0
- package/dist/web/lib/contextDetailApi.mjs +61 -0
- package/dist/web/lib/contextDetailApi.mjs.map +1 -0
- package/dist/web/lib/dashboardRenderers.cjs +9 -0
- package/dist/web/lib/dashboardRenderers.cjs.map +1 -0
- package/dist/web/lib/dashboardRenderers.d.mts +12 -0
- package/dist/web/lib/dashboardRenderers.d.mts.map +1 -0
- package/dist/web/lib/dashboardRenderers.mjs +9 -0
- package/dist/web/lib/dashboardRenderers.mjs.map +1 -0
- package/dist/web/lib/dashboardRoute.cjs +27 -0
- package/dist/web/lib/dashboardRoute.cjs.map +1 -0
- package/dist/web/lib/dashboardRoute.d.mts +29 -0
- package/dist/web/lib/dashboardRoute.d.mts.map +1 -0
- package/dist/web/lib/dashboardRoute.mjs +26 -0
- package/dist/web/lib/dashboardRoute.mjs.map +1 -0
- package/dist/web/lib/dashboardTranscript.cjs +15 -0
- package/dist/web/lib/dashboardTranscript.cjs.map +1 -0
- package/dist/web/lib/dashboardTranscript.d.mts +6 -0
- package/dist/web/lib/dashboardTranscript.d.mts.map +1 -0
- package/dist/web/lib/dashboardTranscript.mjs +14 -0
- package/dist/web/lib/dashboardTranscript.mjs.map +1 -0
- package/dist/web/lib/devProxyApi.cjs +74 -0
- package/dist/web/lib/devProxyApi.cjs.map +1 -0
- package/dist/web/lib/devProxyApi.d.mts +21 -0
- package/dist/web/lib/devProxyApi.d.mts.map +1 -0
- package/dist/web/lib/devProxyApi.mjs +72 -0
- package/dist/web/lib/devProxyApi.mjs.map +1 -0
- package/dist/web/lib/fileMentions.cjs +30 -0
- package/dist/web/lib/fileMentions.cjs.map +1 -0
- package/dist/web/lib/fileMentions.d.mts +13 -0
- package/dist/web/lib/fileMentions.d.mts.map +1 -0
- package/dist/web/lib/fileMentions.mjs +29 -0
- package/dist/web/lib/fileMentions.mjs.map +1 -0
- package/dist/web/lib/hubApi.cjs +283 -0
- package/dist/web/lib/hubApi.cjs.map +1 -0
- package/dist/web/lib/hubApi.d.mts +109 -0
- package/dist/web/lib/hubApi.d.mts.map +1 -0
- package/dist/web/lib/hubApi.mjs +268 -0
- package/dist/web/lib/hubApi.mjs.map +1 -0
- package/dist/web/lib/leaderTree.cjs +150 -0
- package/dist/web/lib/leaderTree.cjs.map +1 -0
- package/dist/web/lib/leaderTree.d.mts +41 -0
- package/dist/web/lib/leaderTree.d.mts.map +1 -0
- package/dist/web/lib/leaderTree.mjs +149 -0
- package/dist/web/lib/leaderTree.mjs.map +1 -0
- package/dist/web/lib/livePush.cjs +97 -0
- package/dist/web/lib/livePush.cjs.map +1 -0
- package/dist/web/lib/livePush.d.mts +10 -0
- package/dist/web/lib/livePush.d.mts.map +1 -0
- package/dist/web/lib/livePush.mjs +94 -0
- package/dist/web/lib/livePush.mjs.map +1 -0
- package/dist/web/lib/modelContextAdapter.cjs +63 -0
- package/dist/web/lib/modelContextAdapter.cjs.map +1 -0
- package/dist/web/lib/modelContextAdapter.d.mts +11 -0
- package/dist/web/lib/modelContextAdapter.d.mts.map +1 -0
- package/dist/web/lib/modelContextAdapter.mjs +62 -0
- package/dist/web/lib/modelContextAdapter.mjs.map +1 -0
- package/dist/web/lib/piTransport.cjs +103 -0
- package/dist/web/lib/piTransport.cjs.map +1 -0
- package/dist/web/lib/piTransport.d.mts +8 -0
- package/dist/web/lib/piTransport.d.mts.map +1 -0
- package/dist/web/lib/piTransport.mjs +102 -0
- package/dist/web/lib/piTransport.mjs.map +1 -0
- package/dist/web/lib/pluginCompositions.cjs +57 -0
- package/dist/web/lib/pluginCompositions.cjs.map +1 -0
- package/dist/web/lib/pluginCompositions.d.mts +37 -0
- package/dist/web/lib/pluginCompositions.d.mts.map +1 -0
- package/dist/web/lib/pluginCompositions.mjs +52 -0
- package/dist/web/lib/pluginCompositions.mjs.map +1 -0
- package/dist/web/lib/pluginRegistry.cjs +675 -0
- package/dist/web/lib/pluginRegistry.cjs.map +1 -0
- package/dist/web/lib/pluginRegistry.d.mts +155 -0
- package/dist/web/lib/pluginRegistry.d.mts.map +1 -0
- package/dist/web/lib/pluginRegistry.mjs +633 -0
- package/dist/web/lib/pluginRegistry.mjs.map +1 -0
- package/dist/web/lib/pluginScopes.cjs +48 -0
- package/dist/web/lib/pluginScopes.cjs.map +1 -0
- package/dist/web/lib/pluginScopes.d.mts +8 -0
- package/dist/web/lib/pluginScopes.d.mts.map +1 -0
- package/dist/web/lib/pluginScopes.mjs +47 -0
- package/dist/web/lib/pluginScopes.mjs.map +1 -0
- package/dist/web/lib/pluginSlotProps.cjs +83 -0
- package/dist/web/lib/pluginSlotProps.cjs.map +1 -0
- package/dist/web/lib/pluginSlotProps.d.mts +21 -0
- package/dist/web/lib/pluginSlotProps.d.mts.map +1 -0
- package/dist/web/lib/pluginSlotProps.mjs +82 -0
- package/dist/web/lib/pluginSlotProps.mjs.map +1 -0
- package/dist/web/lib/promptFocus.cjs +30 -0
- package/dist/web/lib/promptFocus.cjs.map +1 -0
- package/dist/web/lib/promptFocus.d.mts +7 -0
- package/dist/web/lib/promptFocus.d.mts.map +1 -0
- package/dist/web/lib/promptFocus.mjs +29 -0
- package/dist/web/lib/promptFocus.mjs.map +1 -0
- package/dist/web/lib/protocolHubSocket.cjs +107 -0
- package/dist/web/lib/protocolHubSocket.cjs.map +1 -0
- package/dist/web/lib/protocolHubSocket.d.mts +18 -0
- package/dist/web/lib/protocolHubSocket.d.mts.map +1 -0
- package/dist/web/lib/protocolHubSocket.mjs +107 -0
- package/dist/web/lib/protocolHubSocket.mjs.map +1 -0
- package/dist/web/lib/protocolTimeline.cjs +86 -0
- package/dist/web/lib/protocolTimeline.cjs.map +1 -0
- package/dist/web/lib/protocolTimeline.d.mts +9 -0
- package/dist/web/lib/protocolTimeline.d.mts.map +1 -0
- package/dist/web/lib/protocolTimeline.mjs +85 -0
- package/dist/web/lib/protocolTimeline.mjs.map +1 -0
- package/dist/web/lib/qrMatrix.cjs +37 -0
- package/dist/web/lib/qrMatrix.cjs.map +1 -0
- package/dist/web/lib/qrMatrix.d.mts +5 -0
- package/dist/web/lib/qrMatrix.d.mts.map +1 -0
- package/dist/web/lib/qrMatrix.mjs +35 -0
- package/dist/web/lib/qrMatrix.mjs.map +1 -0
- package/dist/web/lib/remoteApi.cjs +100 -0
- package/dist/web/lib/remoteApi.cjs.map +1 -0
- package/dist/web/lib/remoteApi.d.mts +45 -0
- package/dist/web/lib/remoteApi.d.mts.map +1 -0
- package/dist/web/lib/remoteApi.mjs +92 -0
- package/dist/web/lib/remoteApi.mjs.map +1 -0
- package/dist/web/lib/sealedSession.cjs +81 -0
- package/dist/web/lib/sealedSession.cjs.map +1 -0
- package/dist/web/lib/sealedSession.d.mts +24 -0
- package/dist/web/lib/sealedSession.d.mts.map +1 -0
- package/dist/web/lib/sealedSession.mjs +75 -0
- package/dist/web/lib/sealedSession.mjs.map +1 -0
- package/dist/web/lib/sessionActivityRenderer.cjs +19 -0
- package/dist/web/lib/sessionActivityRenderer.cjs.map +1 -0
- package/dist/web/lib/sessionActivityRenderer.d.mts +10 -0
- package/dist/web/lib/sessionActivityRenderer.d.mts.map +1 -0
- package/dist/web/lib/sessionActivityRenderer.mjs +17 -0
- package/dist/web/lib/sessionActivityRenderer.mjs.map +1 -0
- package/dist/web/lib/sessionAsset.cjs +45 -0
- package/dist/web/lib/sessionAsset.cjs.map +1 -0
- package/dist/web/lib/sessionAsset.d.mts +17 -0
- package/dist/web/lib/sessionAsset.d.mts.map +1 -0
- package/dist/web/lib/sessionAsset.mjs +44 -0
- package/dist/web/lib/sessionAsset.mjs.map +1 -0
- package/dist/web/lib/sessionAvatar.cjs +18 -0
- package/dist/web/lib/sessionAvatar.cjs.map +1 -0
- package/dist/web/lib/sessionAvatar.d.mts +10 -0
- package/dist/web/lib/sessionAvatar.d.mts.map +1 -0
- package/dist/web/lib/sessionAvatar.mjs +18 -0
- package/dist/web/lib/sessionAvatar.mjs.map +1 -0
- package/dist/web/lib/sessionMcpApi.cjs +120 -0
- package/dist/web/lib/sessionMcpApi.cjs.map +1 -0
- package/dist/web/lib/sessionMcpApi.d.mts +27 -0
- package/dist/web/lib/sessionMcpApi.d.mts.map +1 -0
- package/dist/web/lib/sessionMcpApi.mjs +114 -0
- package/dist/web/lib/sessionMcpApi.mjs.map +1 -0
- package/dist/web/lib/sessionMcpPrompt.cjs +24 -0
- package/dist/web/lib/sessionMcpPrompt.cjs.map +1 -0
- package/dist/web/lib/sessionMcpPrompt.mjs +23 -0
- package/dist/web/lib/sessionMcpPrompt.mjs.map +1 -0
- package/dist/web/lib/sessionModel.cjs +970 -0
- package/dist/web/lib/sessionModel.cjs.map +1 -0
- package/dist/web/lib/sessionModel.d.mts +254 -0
- package/dist/web/lib/sessionModel.d.mts.map +1 -0
- package/dist/web/lib/sessionModel.mjs +958 -0
- package/dist/web/lib/sessionModel.mjs.map +1 -0
- package/dist/web/lib/sessionProtocolCommands.cjs +196 -0
- package/dist/web/lib/sessionProtocolCommands.cjs.map +1 -0
- package/dist/web/lib/sessionProtocolCommands.d.mts +15 -0
- package/dist/web/lib/sessionProtocolCommands.d.mts.map +1 -0
- package/dist/web/lib/sessionProtocolCommands.mjs +193 -0
- package/dist/web/lib/sessionProtocolCommands.mjs.map +1 -0
- package/dist/web/lib/sessionRailModel.cjs +107 -0
- package/dist/web/lib/sessionRailModel.cjs.map +1 -0
- package/dist/web/lib/sessionRailModel.d.mts +38 -0
- package/dist/web/lib/sessionRailModel.d.mts.map +1 -0
- package/dist/web/lib/sessionRailModel.mjs +104 -0
- package/dist/web/lib/sessionRailModel.mjs.map +1 -0
- package/dist/web/lib/sessionSummary.cjs +58 -0
- package/dist/web/lib/sessionSummary.cjs.map +1 -0
- package/dist/web/lib/sessionSummary.d.mts +39 -0
- package/dist/web/lib/sessionSummary.d.mts.map +1 -0
- package/dist/web/lib/sessionSummary.mjs +54 -0
- package/dist/web/lib/sessionSummary.mjs.map +1 -0
- package/dist/web/lib/sessionTranscriptRenderer.cjs +19 -0
- package/dist/web/lib/sessionTranscriptRenderer.cjs.map +1 -0
- package/dist/web/lib/sessionTranscriptRenderer.d.mts +11 -0
- package/dist/web/lib/sessionTranscriptRenderer.d.mts.map +1 -0
- package/dist/web/lib/sessionTranscriptRenderer.mjs +17 -0
- package/dist/web/lib/sessionTranscriptRenderer.mjs.map +1 -0
- package/dist/web/lib/settingsApi.cjs +237 -0
- package/dist/web/lib/settingsApi.cjs.map +1 -0
- package/dist/web/lib/settingsApi.d.mts +57 -0
- package/dist/web/lib/settingsApi.d.mts.map +1 -0
- package/dist/web/lib/settingsApi.mjs +230 -0
- package/dist/web/lib/settingsApi.mjs.map +1 -0
- package/dist/web/lib/settingsDraft.cjs +48 -0
- package/dist/web/lib/settingsDraft.cjs.map +1 -0
- package/dist/web/lib/settingsDraft.d.mts +28 -0
- package/dist/web/lib/settingsDraft.d.mts.map +1 -0
- package/dist/web/lib/settingsDraft.mjs +45 -0
- package/dist/web/lib/settingsDraft.mjs.map +1 -0
- package/dist/web/lib/settingsSections.cjs +108 -0
- package/dist/web/lib/settingsSections.cjs.map +1 -0
- package/dist/web/lib/settingsSections.d.mts +36 -0
- package/dist/web/lib/settingsSections.d.mts.map +1 -0
- package/dist/web/lib/settingsSections.mjs +105 -0
- package/dist/web/lib/settingsSections.mjs.map +1 -0
- package/dist/web/lib/statusLine.cjs +82 -0
- package/dist/web/lib/statusLine.cjs.map +1 -0
- package/dist/web/lib/statusLine.d.mts +27 -0
- package/dist/web/lib/statusLine.d.mts.map +1 -0
- package/dist/web/lib/statusLine.mjs +79 -0
- package/dist/web/lib/statusLine.mjs.map +1 -0
- package/dist/web/lib/stepUp.cjs +41 -0
- package/dist/web/lib/stepUp.cjs.map +1 -0
- package/dist/web/lib/stepUp.d.mts +18 -0
- package/dist/web/lib/stepUp.d.mts.map +1 -0
- package/dist/web/lib/stepUp.mjs +41 -0
- package/dist/web/lib/stepUp.mjs.map +1 -0
- package/dist/web/lib/templateCatalog.cjs +123 -0
- package/dist/web/lib/templateCatalog.cjs.map +1 -0
- package/dist/web/lib/templateCatalog.d.mts +38 -0
- package/dist/web/lib/templateCatalog.d.mts.map +1 -0
- package/dist/web/lib/templateCatalog.mjs +118 -0
- package/dist/web/lib/templateCatalog.mjs.map +1 -0
- package/dist/web/lib/threadRenderer.cjs +25 -0
- package/dist/web/lib/threadRenderer.cjs.map +1 -0
- package/dist/web/lib/threadRenderer.d.mts +17 -0
- package/dist/web/lib/threadRenderer.d.mts.map +1 -0
- package/dist/web/lib/threadRenderer.mjs +23 -0
- package/dist/web/lib/threadRenderer.mjs.map +1 -0
- package/dist/web/lib/timelineGroups.cjs +83 -0
- package/dist/web/lib/timelineGroups.cjs.map +1 -0
- package/dist/web/lib/timelineGroups.d.mts +36 -0
- package/dist/web/lib/timelineGroups.d.mts.map +1 -0
- package/dist/web/lib/timelineGroups.mjs +81 -0
- package/dist/web/lib/timelineGroups.mjs.map +1 -0
- package/dist/web/lib/toolCompletionTabs.cjs +98 -0
- package/dist/web/lib/toolCompletionTabs.cjs.map +1 -0
- package/dist/web/lib/toolCompletionTabs.d.mts +14 -0
- package/dist/web/lib/toolCompletionTabs.d.mts.map +1 -0
- package/dist/web/lib/toolCompletionTabs.mjs +98 -0
- package/dist/web/lib/toolCompletionTabs.mjs.map +1 -0
- package/dist/web/lib/toolMessageProps.cjs +19 -0
- package/dist/web/lib/toolMessageProps.cjs.map +1 -0
- package/dist/web/lib/toolMessageProps.d.mts +7 -0
- package/dist/web/lib/toolMessageProps.d.mts.map +1 -0
- package/dist/web/lib/toolMessageProps.mjs +19 -0
- package/dist/web/lib/toolMessageProps.mjs.map +1 -0
- package/dist/web/lib/toolPrompt.cjs +44 -0
- package/dist/web/lib/toolPrompt.cjs.map +1 -0
- package/dist/web/lib/toolPrompt.d.mts +34 -0
- package/dist/web/lib/toolPrompt.d.mts.map +1 -0
- package/dist/web/lib/toolPrompt.mjs +44 -0
- package/dist/web/lib/toolPrompt.mjs.map +1 -0
- package/dist/web/lib/transport.cjs +57 -0
- package/dist/web/lib/transport.cjs.map +1 -0
- package/dist/web/lib/transport.d.mts +40 -0
- package/dist/web/lib/transport.d.mts.map +1 -0
- package/dist/web/lib/transport.mjs +50 -0
- package/dist/web/lib/transport.mjs.map +1 -0
- package/dist/web/lib/useSessionMcp.cjs +65 -0
- package/dist/web/lib/useSessionMcp.cjs.map +1 -0
- package/dist/web/lib/useSessionMcp.d.mts +15 -0
- package/dist/web/lib/useSessionMcp.d.mts.map +1 -0
- package/dist/web/lib/useSessionMcp.mjs +65 -0
- package/dist/web/lib/useSessionMcp.mjs.map +1 -0
- package/dist/web/lib/webauthnClient.cjs +110 -0
- package/dist/web/lib/webauthnClient.cjs.map +1 -0
- package/dist/web/lib/webauthnClient.d.mts +32 -0
- package/dist/web/lib/webauthnClient.d.mts.map +1 -0
- package/dist/web/lib/webauthnClient.mjs +106 -0
- package/dist/web/lib/webauthnClient.mjs.map +1 -0
- package/dist/web/lib/webmcpSimulator.cjs +105 -0
- package/dist/web/lib/webmcpSimulator.cjs.map +1 -0
- package/dist/web/lib/webmcpSimulator.mjs +105 -0
- package/dist/web/lib/webmcpSimulator.mjs.map +1 -0
- package/dist/web/stores/captureStore.cjs +137 -0
- package/dist/web/stores/captureStore.cjs.map +1 -0
- package/dist/web/stores/captureStore.d.mts +13 -0
- package/dist/web/stores/captureStore.d.mts.map +1 -0
- package/dist/web/stores/captureStore.mjs +133 -0
- package/dist/web/stores/captureStore.mjs.map +1 -0
- package/dist/web/stores/composerStore.cjs +390 -0
- package/dist/web/stores/composerStore.cjs.map +1 -0
- package/dist/web/stores/composerStore.d.mts +101 -0
- package/dist/web/stores/composerStore.d.mts.map +1 -0
- package/dist/web/stores/composerStore.mjs +370 -0
- package/dist/web/stores/composerStore.mjs.map +1 -0
- package/dist/web/stores/composerSubmissionStore.cjs +88 -0
- package/dist/web/stores/composerSubmissionStore.cjs.map +1 -0
- package/dist/web/stores/composerSubmissionStore.d.mts +11 -0
- package/dist/web/stores/composerSubmissionStore.d.mts.map +1 -0
- package/dist/web/stores/composerSubmissionStore.mjs +87 -0
- package/dist/web/stores/composerSubmissionStore.mjs.map +1 -0
- package/dist/web/stores/dashboardStateStore.cjs +35 -0
- package/dist/web/stores/dashboardStateStore.cjs.map +1 -0
- package/dist/web/stores/dashboardStateStore.d.mts +11 -0
- package/dist/web/stores/dashboardStateStore.d.mts.map +1 -0
- package/dist/web/stores/dashboardStateStore.mjs +33 -0
- package/dist/web/stores/dashboardStateStore.mjs.map +1 -0
- package/dist/web/stores/devProxyStore.cjs +76 -0
- package/dist/web/stores/devProxyStore.cjs.map +1 -0
- package/dist/web/stores/devProxyStore.d.mts +25 -0
- package/dist/web/stores/devProxyStore.d.mts.map +1 -0
- package/dist/web/stores/devProxyStore.mjs +73 -0
- package/dist/web/stores/devProxyStore.mjs.map +1 -0
- package/dist/web/stores/dialogDraftStore.cjs +38 -0
- package/dist/web/stores/dialogDraftStore.cjs.map +1 -0
- package/dist/web/stores/dialogDraftStore.d.mts +13 -0
- package/dist/web/stores/dialogDraftStore.d.mts.map +1 -0
- package/dist/web/stores/dialogDraftStore.mjs +36 -0
- package/dist/web/stores/dialogDraftStore.mjs.map +1 -0
- package/dist/web/stores/fileLinkModesStore.cjs +20 -0
- package/dist/web/stores/fileLinkModesStore.cjs.map +1 -0
- package/dist/web/stores/fileLinkModesStore.d.mts +5 -0
- package/dist/web/stores/fileLinkModesStore.d.mts.map +1 -0
- package/dist/web/stores/fileLinkModesStore.mjs +20 -0
- package/dist/web/stores/fileLinkModesStore.mjs.map +1 -0
- package/dist/web/stores/menuStore.cjs +85 -0
- package/dist/web/stores/menuStore.cjs.map +1 -0
- package/dist/web/stores/menuStore.d.mts +42 -0
- package/dist/web/stores/menuStore.d.mts.map +1 -0
- package/dist/web/stores/menuStore.mjs +79 -0
- package/dist/web/stores/menuStore.mjs.map +1 -0
- package/dist/web/stores/newSessionStore.cjs +93 -0
- package/dist/web/stores/newSessionStore.cjs.map +1 -0
- package/dist/web/stores/newSessionStore.d.mts +30 -0
- package/dist/web/stores/newSessionStore.d.mts.map +1 -0
- package/dist/web/stores/newSessionStore.mjs +86 -0
- package/dist/web/stores/newSessionStore.mjs.map +1 -0
- package/dist/web/stores/pagedTranscriptStore.cjs +235 -0
- package/dist/web/stores/pagedTranscriptStore.cjs.map +1 -0
- package/dist/web/stores/pagedTranscriptStore.d.mts +12 -0
- package/dist/web/stores/pagedTranscriptStore.d.mts.map +1 -0
- package/dist/web/stores/pagedTranscriptStore.mjs +235 -0
- package/dist/web/stores/pagedTranscriptStore.mjs.map +1 -0
- package/dist/web/stores/paletteStore.cjs +37 -0
- package/dist/web/stores/paletteStore.cjs.map +1 -0
- package/dist/web/stores/paletteStore.d.mts +14 -0
- package/dist/web/stores/paletteStore.d.mts.map +1 -0
- package/dist/web/stores/paletteStore.mjs +34 -0
- package/dist/web/stores/paletteStore.mjs.map +1 -0
- package/dist/web/stores/railDialogStore.cjs +105 -0
- package/dist/web/stores/railDialogStore.cjs.map +1 -0
- package/dist/web/stores/railDialogStore.d.mts +32 -0
- package/dist/web/stores/railDialogStore.d.mts.map +1 -0
- package/dist/web/stores/railDialogStore.mjs +97 -0
- package/dist/web/stores/railDialogStore.mjs.map +1 -0
- package/dist/web/stores/remoteAccessStore.cjs +216 -0
- package/dist/web/stores/remoteAccessStore.cjs.map +1 -0
- package/dist/web/stores/remoteAccessStore.d.mts +48 -0
- package/dist/web/stores/remoteAccessStore.d.mts.map +1 -0
- package/dist/web/stores/remoteAccessStore.mjs +202 -0
- package/dist/web/stores/remoteAccessStore.mjs.map +1 -0
- package/dist/web/stores/sessionChannelHoldsStore.cjs +43 -0
- package/dist/web/stores/sessionChannelHoldsStore.cjs.map +1 -0
- package/dist/web/stores/sessionChannelHoldsStore.d.mts +9 -0
- package/dist/web/stores/sessionChannelHoldsStore.d.mts.map +1 -0
- package/dist/web/stores/sessionChannelHoldsStore.mjs +42 -0
- package/dist/web/stores/sessionChannelHoldsStore.mjs.map +1 -0
- package/dist/web/stores/sessionStore.cjs +610 -0
- package/dist/web/stores/sessionStore.cjs.map +1 -0
- package/dist/web/stores/sessionStore.d.mts +116 -0
- package/dist/web/stores/sessionStore.d.mts.map +1 -0
- package/dist/web/stores/sessionStore.mjs +568 -0
- package/dist/web/stores/sessionStore.mjs.map +1 -0
- package/dist/web/stores/sessionsStore.cjs +272 -0
- package/dist/web/stores/sessionsStore.cjs.map +1 -0
- package/dist/web/stores/sessionsStore.d.mts +74 -0
- package/dist/web/stores/sessionsStore.d.mts.map +1 -0
- package/dist/web/stores/sessionsStore.mjs +257 -0
- package/dist/web/stores/sessionsStore.mjs.map +1 -0
- package/dist/web/stores/settingsDraftStore.cjs +138 -0
- package/dist/web/stores/settingsDraftStore.cjs.map +1 -0
- package/dist/web/stores/settingsDraftStore.d.mts +27 -0
- package/dist/web/stores/settingsDraftStore.d.mts.map +1 -0
- package/dist/web/stores/settingsDraftStore.mjs +132 -0
- package/dist/web/stores/settingsDraftStore.mjs.map +1 -0
- package/dist/web/stores/templateStore.cjs +136 -0
- package/dist/web/stores/templateStore.cjs.map +1 -0
- package/dist/web/stores/templateStore.d.mts +20 -0
- package/dist/web/stores/templateStore.d.mts.map +1 -0
- package/dist/web/stores/templateStore.mjs +131 -0
- package/dist/web/stores/templateStore.mjs.map +1 -0
- package/dist/web/stores/themeStore.cjs +42 -0
- package/dist/web/stores/themeStore.cjs.map +1 -0
- package/dist/web/stores/themeStore.d.mts +20 -0
- package/dist/web/stores/themeStore.d.mts.map +1 -0
- package/dist/web/stores/themeStore.mjs +39 -0
- package/dist/web/stores/themeStore.mjs.map +1 -0
- package/dist/web/stores/threadStore.cjs +122 -0
- package/dist/web/stores/threadStore.cjs.map +1 -0
- package/dist/web/stores/threadStore.d.mts +24 -0
- package/dist/web/stores/threadStore.d.mts.map +1 -0
- package/dist/web/stores/threadStore.mjs +114 -0
- package/dist/web/stores/threadStore.mjs.map +1 -0
- package/dist/web/stores/toolPromptStore.cjs +15 -0
- package/dist/web/stores/toolPromptStore.cjs.map +1 -0
- package/dist/web/stores/toolPromptStore.d.mts +23 -0
- package/dist/web/stores/toolPromptStore.d.mts.map +1 -0
- package/dist/web/stores/toolPromptStore.mjs +14 -0
- package/dist/web/stores/toolPromptStore.mjs.map +1 -0
- package/dist/web/stores/transientTabsStore.cjs +66 -0
- package/dist/web/stores/transientTabsStore.cjs.map +1 -0
- package/dist/web/stores/transientTabsStore.d.mts +21 -0
- package/dist/web/stores/transientTabsStore.d.mts.map +1 -0
- package/dist/web/stores/transientTabsStore.mjs +59 -0
- package/dist/web/stores/transientTabsStore.mjs.map +1 -0
- package/dist/web/stores/uiStore.cjs +47 -0
- package/dist/web/stores/uiStore.cjs.map +1 -0
- package/dist/web/stores/uiStore.d.mts +18 -0
- package/dist/web/stores/uiStore.d.mts.map +1 -0
- package/dist/web/stores/uiStore.mjs +45 -0
- package/dist/web/stores/uiStore.mjs.map +1 -0
- package/dist/web/stores/useOpenTab.cjs +31 -0
- package/dist/web/stores/useOpenTab.cjs.map +1 -0
- package/dist/web/stores/useOpenTab.d.mts +9 -0
- package/dist/web/stores/useOpenTab.d.mts.map +1 -0
- package/dist/web/stores/useOpenTab.mjs +31 -0
- package/dist/web/stores/useOpenTab.mjs.map +1 -0
- package/dist/web/stores/usePluginSlotProps.cjs +115 -0
- package/dist/web/stores/usePluginSlotProps.cjs.map +1 -0
- package/dist/web/stores/usePluginSlotProps.d.mts +6 -0
- package/dist/web/stores/usePluginSlotProps.d.mts.map +1 -0
- package/dist/web/stores/usePluginSlotProps.mjs +115 -0
- package/dist/web/stores/usePluginSlotProps.mjs.map +1 -0
- package/dist/web/stores/useToolPrompt.cjs +42 -0
- package/dist/web/stores/useToolPrompt.cjs.map +1 -0
- package/dist/web/stores/useToolPrompt.d.mts +14 -0
- package/dist/web/stores/useToolPrompt.d.mts.map +1 -0
- package/dist/web/stores/useToolPrompt.mjs +42 -0
- package/dist/web/stores/useToolPrompt.mjs.map +1 -0
- package/dist/web/stores/useWebPluginRegistry.cjs +11 -0
- package/dist/web/stores/useWebPluginRegistry.cjs.map +1 -0
- package/dist/web/stores/useWebPluginRegistry.d.mts +5 -0
- package/dist/web/stores/useWebPluginRegistry.d.mts.map +1 -0
- package/dist/web/stores/useWebPluginRegistry.mjs +11 -0
- package/dist/web/stores/useWebPluginRegistry.mjs.map +1 -0
- package/dist/web/stores/workspaceAdmissionStore.cjs +67 -0
- package/dist/web/stores/workspaceAdmissionStore.cjs.map +1 -0
- package/dist/web/stores/workspaceAdmissionStore.d.mts +24 -0
- package/dist/web/stores/workspaceAdmissionStore.d.mts.map +1 -0
- package/dist/web/stores/workspaceAdmissionStore.mjs +64 -0
- package/dist/web/stores/workspaceAdmissionStore.mjs.map +1 -0
- package/dist/web/stores/workspacesStore.cjs +83 -0
- package/dist/web/stores/workspacesStore.cjs.map +1 -0
- package/dist/web/stores/workspacesStore.d.mts +17 -0
- package/dist/web/stores/workspacesStore.d.mts.map +1 -0
- package/dist/web/stores/workspacesStore.mjs +78 -0
- package/dist/web/stores/workspacesStore.mjs.map +1 -0
- package/llms.txt +3 -0
- package/package.json +107 -0
- package/styles/dashboard.css +2 -0
- package/styles/preview.css +3 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { isDesktopClient, pluginActivityGroups, pluginDockFaces, pluginFileLinks, pluginMinorModes, pluginSelectionAxes, subscribeWebPluginRegistry, webPluginRegistryRevision } from "./pluginRegistry.mjs";
|
|
2
|
+
import { stripAnsi } from "./statusLine.mjs";
|
|
3
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
4
|
+
//#region src/web/lib/composition.ts
|
|
5
|
+
const AXIS_LIST_SEPARATOR = ",";
|
|
6
|
+
/**
|
|
7
|
+
* The fallback axis table for the packaged bundle; a synced bundle carries
|
|
8
|
+
* each axis as its owning package's plugin declaration, and the registry
|
|
9
|
+
* list wins whenever any plugin declares one. Exported only so the workspace
|
|
10
|
+
* composition test can hold it equal to what the packages declare.
|
|
11
|
+
*/
|
|
12
|
+
const PACKAGED_SELECTION_AXES = [{
|
|
13
|
+
name: "profile",
|
|
14
|
+
command: "profile",
|
|
15
|
+
statusKey: "doom-profile",
|
|
16
|
+
emptyLabel: "no profile",
|
|
17
|
+
order: 10
|
|
18
|
+
}, {
|
|
19
|
+
name: "domains",
|
|
20
|
+
command: "domains",
|
|
21
|
+
statusKey: "doom-domain",
|
|
22
|
+
emptyLabel: "no domains",
|
|
23
|
+
multi: true,
|
|
24
|
+
order: 20
|
|
25
|
+
}];
|
|
26
|
+
/**
|
|
27
|
+
* The declared axes the session actually offers: an axis whose status key
|
|
28
|
+
* the session never published stays off the bar entirely, which is how a
|
|
29
|
+
* package withholds its axis when there is nothing to select.
|
|
30
|
+
*/
|
|
31
|
+
function selectionAxes(statuses) {
|
|
32
|
+
const declared = pluginSelectionAxes();
|
|
33
|
+
return (declared.length > 0 ? declared : PACKAGED_SELECTION_AXES).flatMap((source) => {
|
|
34
|
+
const raw = statuses[source.statusKey];
|
|
35
|
+
if (raw === void 0) return [];
|
|
36
|
+
const multi = source.multi === true;
|
|
37
|
+
const values = (multi ? stripAnsi(raw).split(AXIS_LIST_SEPARATOR) : [stripAnsi(raw)]).map((value) => value.trim()).filter(Boolean);
|
|
38
|
+
return [{
|
|
39
|
+
name: source.name,
|
|
40
|
+
command: source.command,
|
|
41
|
+
values,
|
|
42
|
+
emptyLabel: source.emptyLabel,
|
|
43
|
+
multi
|
|
44
|
+
}];
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The fallback minor-mode table for the packaged bundle.
|
|
49
|
+
*
|
|
50
|
+
* A synced bundle carries each mode as its package's own web plugin
|
|
51
|
+
* contribution, and the registry list wins whenever any plugin declares one.
|
|
52
|
+
* This literal survives only so the built-in-only bundle keeps rendering the
|
|
53
|
+
* modes Po ships; help is listed without a signal on purpose: it
|
|
54
|
+
* registers no footer entry, so the cockpit reports it as unavailable rather
|
|
55
|
+
* than guessing it is off. Exported only for the workspace composition test.
|
|
56
|
+
*/
|
|
57
|
+
const PACKAGED_MINOR_MODES = [
|
|
58
|
+
{
|
|
59
|
+
name: "help",
|
|
60
|
+
keys: "h e"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "plan",
|
|
64
|
+
keys: "p e",
|
|
65
|
+
statusKey: "plan-mode"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "loop",
|
|
69
|
+
keys: "l l",
|
|
70
|
+
statusKey: "doom-loop"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "goal",
|
|
74
|
+
keys: "g e",
|
|
75
|
+
statusKey: "goal"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "author",
|
|
79
|
+
keys: "o a"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "workflow",
|
|
83
|
+
keys: "w e",
|
|
84
|
+
widgetKey: "workflow-mcp-progress"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "voice",
|
|
88
|
+
modeId: "voice-auto",
|
|
89
|
+
keys: "v e",
|
|
90
|
+
statusKey: "doom-voice"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "computer use",
|
|
94
|
+
modeId: "computer-use",
|
|
95
|
+
keys: "c e",
|
|
96
|
+
statusKey: "doom-computer-use-mode",
|
|
97
|
+
hideWhenMissing: true,
|
|
98
|
+
desktopOnly: true
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
/** The declared source a catalog mode corresponds to, by id, id stem, or label. */
|
|
102
|
+
function sourceFor(sources, mode) {
|
|
103
|
+
const candidates = /* @__PURE__ */ new Set([
|
|
104
|
+
mode.id.toLowerCase(),
|
|
105
|
+
mode.id.toLowerCase().split(".")[0],
|
|
106
|
+
mode.label.toLowerCase()
|
|
107
|
+
]);
|
|
108
|
+
return sources.find((source) => [source.name, source.modeId].some((identity) => identity !== void 0 && candidates.has(identity.toLowerCase())));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Catalog-backed rows: the runtime's own activation state per mode, with the
|
|
112
|
+
* declared leader keys attached where a plugin documents them. Declared modes
|
|
113
|
+
* the catalog does not know are still listed, as unavailable, so a mode that
|
|
114
|
+
* is missing from a composition stays visible rather than silently gone.
|
|
115
|
+
*/
|
|
116
|
+
function catalogMinorModes(sources, projection) {
|
|
117
|
+
const rows = projection.modes.filter((mode) => !sourceFor(sources, mode)?.desktopOnly || isDesktopClient()).map((mode) => {
|
|
118
|
+
const source = sourceFor(sources, mode);
|
|
119
|
+
const on = mode.activation === "active" || mode.activation === "deactivating";
|
|
120
|
+
const blocked = mode.actions.length > 0 && mode.actions.every((action) => !action.enabled);
|
|
121
|
+
const reason = blocked ? mode.actions.find((action) => action.disabledReason)?.disabledReason ?? "" : "";
|
|
122
|
+
return {
|
|
123
|
+
name: source?.name ?? mode.label.toLowerCase(),
|
|
124
|
+
id: mode.id,
|
|
125
|
+
keys: source?.keys ?? "",
|
|
126
|
+
availability: blocked && !on ? "unavailable" : on ? "on" : "off",
|
|
127
|
+
...source?.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
128
|
+
detail: mode.detail ?? (mode.activation === "activating" ? "activating" : ""),
|
|
129
|
+
unavailableReason: reason
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
const seen = new Set(rows.map((row) => row.name));
|
|
133
|
+
for (const source of sources) {
|
|
134
|
+
if (source.hideWhenMissing === true || source.desktopOnly && !isDesktopClient()) continue;
|
|
135
|
+
if (!seen.has(source.name)) rows.push({
|
|
136
|
+
name: source.name,
|
|
137
|
+
id: source.modeId ?? source.name,
|
|
138
|
+
keys: source.keys,
|
|
139
|
+
availability: "unavailable",
|
|
140
|
+
...source.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
141
|
+
detail: "",
|
|
142
|
+
unavailableReason: "No package in this session registers this mode."
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return rows;
|
|
146
|
+
}
|
|
147
|
+
function minorModes(statuses, widgets, projection = null) {
|
|
148
|
+
const declared = pluginMinorModes();
|
|
149
|
+
const sources = declared.length > 0 ? declared : PACKAGED_MINOR_MODES;
|
|
150
|
+
if (projection) return catalogMinorModes(sources, projection);
|
|
151
|
+
return sources.flatMap((source) => {
|
|
152
|
+
if (source.desktopOnly && !isDesktopClient()) return [];
|
|
153
|
+
if (source.statusKey !== void 0) {
|
|
154
|
+
const raw = statuses[source.statusKey];
|
|
155
|
+
if (raw === void 0) {
|
|
156
|
+
if (source.hideWhenMissing === true) return [];
|
|
157
|
+
return [{
|
|
158
|
+
name: source.name,
|
|
159
|
+
id: source.modeId ?? source.name,
|
|
160
|
+
keys: source.keys,
|
|
161
|
+
availability: "unavailable",
|
|
162
|
+
...source.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
163
|
+
detail: "",
|
|
164
|
+
unavailableReason: "This session has not reported the mode."
|
|
165
|
+
}];
|
|
166
|
+
}
|
|
167
|
+
const detail = stripAnsi(raw).trim();
|
|
168
|
+
return {
|
|
169
|
+
name: source.name,
|
|
170
|
+
id: source.modeId ?? source.name,
|
|
171
|
+
keys: source.keys,
|
|
172
|
+
availability: detail ? "on" : "off",
|
|
173
|
+
...source.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
174
|
+
detail,
|
|
175
|
+
unavailableReason: ""
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (source.widgetKey !== void 0 && widgets.includes(source.widgetKey)) return {
|
|
179
|
+
name: source.name,
|
|
180
|
+
id: source.modeId ?? source.name,
|
|
181
|
+
keys: source.keys,
|
|
182
|
+
availability: "off",
|
|
183
|
+
...source.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
184
|
+
detail: "",
|
|
185
|
+
unavailableReason: ""
|
|
186
|
+
};
|
|
187
|
+
return {
|
|
188
|
+
name: source.name,
|
|
189
|
+
id: source.name,
|
|
190
|
+
keys: source.keys,
|
|
191
|
+
availability: "unavailable",
|
|
192
|
+
...source.activityGroup === void 0 ? {} : { activityGroup: source.activityGroup },
|
|
193
|
+
detail: "",
|
|
194
|
+
unavailableReason: "This session has not reported the mode."
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/** Subscribe to package-owned activity sources, rewiring when the focused composition changes. */
|
|
199
|
+
function subscribeActivitySources(listener) {
|
|
200
|
+
let subscriptions = [];
|
|
201
|
+
const unsubscribeSources = () => {
|
|
202
|
+
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
203
|
+
subscriptions = [];
|
|
204
|
+
};
|
|
205
|
+
const subscribeSources = () => {
|
|
206
|
+
subscriptions = pluginActivityGroups().flatMap((source) => source.activeSource === void 0 ? [] : [source.activeSource.subscribe(listener)]);
|
|
207
|
+
};
|
|
208
|
+
subscribeSources();
|
|
209
|
+
const unsubscribeRegistry = subscribeWebPluginRegistry(() => {
|
|
210
|
+
unsubscribeSources();
|
|
211
|
+
subscribeSources();
|
|
212
|
+
listener();
|
|
213
|
+
});
|
|
214
|
+
return () => {
|
|
215
|
+
unsubscribeRegistry();
|
|
216
|
+
unsubscribeSources();
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function activitySourceFingerprint(sessionId) {
|
|
220
|
+
const activeSources = pluginActivityGroups().map((source) => source.activeSource?.isActive(sessionId) === true ? "1" : "0").join("");
|
|
221
|
+
return `${webPluginRegistryRevision()}:${activeSources}`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* The groups available in this plugin composition. Status and widget signals
|
|
225
|
+
* reveal legacy groups. A package-owned active source also reveals its group,
|
|
226
|
+
* including while idle, so the section can remain a stable launcher unless it
|
|
227
|
+
* opts into `hideWhenEmpty`.
|
|
228
|
+
*
|
|
229
|
+
* A group that declared `hideWhenEmpty` goes away once its session stops
|
|
230
|
+
* reporting. Clearing a status reaches the page as an empty string rather than
|
|
231
|
+
* an absent key, because the same map tells the selection bar which minor modes
|
|
232
|
+
* exist and an absent key means "not reported" there. Emptiness is read here,
|
|
233
|
+
* where only the dock is looking.
|
|
234
|
+
*/
|
|
235
|
+
function activityGroups(statuses, widgets, sessionId = null) {
|
|
236
|
+
const groups = [];
|
|
237
|
+
for (const source of pluginActivityGroups()) {
|
|
238
|
+
const tab = source.transientTab === void 0 ? {} : { transientTab: source.transientTab };
|
|
239
|
+
const placement = {
|
|
240
|
+
...source.placement === void 0 ? {} : { placement: source.placement },
|
|
241
|
+
...source.marksBackgroundWork === false ? { marksBackgroundWork: false } : {},
|
|
242
|
+
...source.icon === void 0 ? {} : { icon: source.icon }
|
|
243
|
+
};
|
|
244
|
+
if (source.statusKey !== void 0 && statuses[source.statusKey] !== void 0) {
|
|
245
|
+
const summary = stripAnsi(statuses[source.statusKey] ?? "").trim();
|
|
246
|
+
const active = source.activeSource?.isActive(sessionId) ?? (source.marksBackgroundWork !== false && summary.length > 0);
|
|
247
|
+
if (summary.length === 0 && source.hideWhenEmpty === true && !active) continue;
|
|
248
|
+
groups.push({
|
|
249
|
+
name: source.name,
|
|
250
|
+
keys: source.keys,
|
|
251
|
+
summary,
|
|
252
|
+
active,
|
|
253
|
+
...tab,
|
|
254
|
+
...placement
|
|
255
|
+
});
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (source.widgetKeys !== void 0 && source.widgetKeys.some((key) => widgets.includes(key))) {
|
|
259
|
+
const activeKeys = source.activeWidgetKeys ?? source.widgetKeys;
|
|
260
|
+
const active = source.activeSource?.isActive(sessionId) ?? (source.marksBackgroundWork !== false && activeKeys.some((key) => widgets.includes(key)));
|
|
261
|
+
groups.push({
|
|
262
|
+
name: source.name,
|
|
263
|
+
keys: source.keys,
|
|
264
|
+
summary: "",
|
|
265
|
+
active,
|
|
266
|
+
...tab,
|
|
267
|
+
...placement
|
|
268
|
+
});
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (source.activeSource !== void 0) {
|
|
272
|
+
const active = source.activeSource.isActive(sessionId);
|
|
273
|
+
if (source.hideWhenEmpty === true && !active) continue;
|
|
274
|
+
groups.push({
|
|
275
|
+
name: source.name,
|
|
276
|
+
keys: source.keys,
|
|
277
|
+
summary: "",
|
|
278
|
+
active,
|
|
279
|
+
...tab,
|
|
280
|
+
...placement
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return groups;
|
|
285
|
+
}
|
|
286
|
+
/** Dock faces update when the active session composition changes. */
|
|
287
|
+
function useDockFaces(sessionId) {
|
|
288
|
+
useSyncExternalStore(subscribeWebPluginRegistry, webPluginRegistryRevision, webPluginRegistryRevision);
|
|
289
|
+
const subscribe = (listener) => {
|
|
290
|
+
const releases = pluginDockFaces().flatMap((face) => face.visibility ? [face.visibility.subscribe(listener)] : []);
|
|
291
|
+
return () => releases.forEach((release) => release());
|
|
292
|
+
};
|
|
293
|
+
const snapshot = () => pluginDockFaces().map((face) => face.visibility?.isVisible(sessionId) !== false ? "1" : "0").join("");
|
|
294
|
+
useSyncExternalStore(subscribe, snapshot, snapshot);
|
|
295
|
+
return pluginDockFaces().filter((face) => face.visibility?.isVisible(sessionId) !== false);
|
|
296
|
+
}
|
|
297
|
+
/** Activity groups that update when either host signals or a plugin's session store changes. */
|
|
298
|
+
function useActivityGroups(statuses, widgets, sessionId) {
|
|
299
|
+
useSyncExternalStore(subscribeActivitySources, () => activitySourceFingerprint(sessionId), () => activitySourceFingerprint(sessionId));
|
|
300
|
+
return activityGroups(statuses, widgets, sessionId);
|
|
301
|
+
}
|
|
302
|
+
let fileLinkModes;
|
|
303
|
+
const modeBindings = /* @__PURE__ */ new Set();
|
|
304
|
+
/** Binds host session facts without making the composition library own session state. */
|
|
305
|
+
function bindFileLinkModes(source) {
|
|
306
|
+
fileLinkModes = source;
|
|
307
|
+
modeBindings.forEach((listener) => listener());
|
|
308
|
+
return () => {
|
|
309
|
+
if (fileLinkModes !== source) return;
|
|
310
|
+
fileLinkModes = void 0;
|
|
311
|
+
modeBindings.forEach((listener) => listener());
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function subscribeFileLinks(sessionId, listener) {
|
|
315
|
+
let unsubscribeModes = fileLinkModes?.subscribe(sessionId, listener);
|
|
316
|
+
const rebindModes = () => {
|
|
317
|
+
unsubscribeModes?.();
|
|
318
|
+
unsubscribeModes = fileLinkModes?.subscribe(sessionId, listener);
|
|
319
|
+
listener();
|
|
320
|
+
};
|
|
321
|
+
modeBindings.add(rebindModes);
|
|
322
|
+
let subscriptions = [];
|
|
323
|
+
const unsubscribeSources = () => {
|
|
324
|
+
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
325
|
+
subscriptions = [];
|
|
326
|
+
};
|
|
327
|
+
const subscribeSources = () => {
|
|
328
|
+
subscriptions = pluginFileLinks().map((source) => source.subscribe(listener));
|
|
329
|
+
};
|
|
330
|
+
subscribeSources();
|
|
331
|
+
const unsubscribeRegistry = subscribeWebPluginRegistry(() => {
|
|
332
|
+
unsubscribeSources();
|
|
333
|
+
subscribeSources();
|
|
334
|
+
listener();
|
|
335
|
+
});
|
|
336
|
+
return () => {
|
|
337
|
+
modeBindings.delete(rebindModes);
|
|
338
|
+
unsubscribeModes?.();
|
|
339
|
+
unsubscribeRegistry();
|
|
340
|
+
unsubscribeSources();
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function activeFileLinkSources(sessionId) {
|
|
344
|
+
const enabled = new Set(fileLinkModes?.active(sessionId) ?? []);
|
|
345
|
+
return pluginFileLinks().filter((source) => source.requiredMinorMode === void 0 || enabled.has(source.requiredMinorMode));
|
|
346
|
+
}
|
|
347
|
+
function fileLinkFingerprint(sessionId) {
|
|
348
|
+
const sourceFingerprints = activeFileLinkSources(sessionId).map((source) => `${source.requiredMinorMode ?? ""}:${source.fingerprint(sessionId)}`).join("\n");
|
|
349
|
+
return `${webPluginRegistryRevision()}:${sourceFingerprints}`;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* The tab a path opens, from the first source that claims it.
|
|
353
|
+
*
|
|
354
|
+
* A path no source claims is not a link. The host cannot tell a file name from
|
|
355
|
+
* a class name, and the plugin that tracks the session's files can, so the
|
|
356
|
+
* decision belongs there rather than in a heuristic here.
|
|
357
|
+
*/
|
|
358
|
+
function fileLinkFor(sessionId, path) {
|
|
359
|
+
for (const source of activeFileLinkSources(sessionId)) {
|
|
360
|
+
const tab = source.resolve(sessionId, path);
|
|
361
|
+
if (tab !== void 0) return tab;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The tab a path the caller is sure about opens: a tool call's path argument,
|
|
366
|
+
* not a token spotted in prose.
|
|
367
|
+
*
|
|
368
|
+
* A source that offers `openPath` answers here, and it may claim a file the
|
|
369
|
+
* session never changed, which `resolve` deliberately will not. Sources
|
|
370
|
+
* without it fall back to the same guess prose gets.
|
|
371
|
+
*/
|
|
372
|
+
function fileTabForPath(sessionId, path) {
|
|
373
|
+
for (const source of activeFileLinkSources(sessionId)) {
|
|
374
|
+
const tab = source.openPath?.(sessionId, path) ?? source.resolve(sessionId, path);
|
|
375
|
+
if (tab !== void 0) return tab;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Resolves the paths a message names against the plugins that track them.
|
|
380
|
+
*
|
|
381
|
+
* The resolver's identity is stable while the linkable set is, so a component
|
|
382
|
+
* that hands it to a renderer does not rebuild that renderer on every frame of
|
|
383
|
+
* a streaming reply.
|
|
384
|
+
*/
|
|
385
|
+
function useFileLinks(sessionId) {
|
|
386
|
+
const fingerprint = useSyncExternalStore(useCallback((listener) => subscribeFileLinks(sessionId, listener), [sessionId]), () => fileLinkFingerprint(sessionId), () => fileLinkFingerprint(sessionId));
|
|
387
|
+
return useCallback((path) => fileLinkFor(sessionId, path), [sessionId, fingerprint]);
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
export { PACKAGED_MINOR_MODES, PACKAGED_SELECTION_AXES, activityGroups, bindFileLinkModes, fileLinkFor, fileTabForPath, minorModes, selectionAxes, subscribeActivitySources, useActivityGroups, useDockFaces, useFileLinks };
|
|
391
|
+
|
|
392
|
+
//# sourceMappingURL=composition.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.mjs","names":[],"sources":["../../../src/web/lib/composition.ts"],"sourcesContent":["import type {\n ActivityGroupContribution,\n DockFaceContribution,\n SelectionAxisContribution,\n TransientTab,\n} from '@agimon-ai/po-core/web';\nimport { useCallback, useSyncExternalStore } from 'react';\n\nimport type { MinorModeProjection, MinorModeRecordProjection } from '../../types/hub';\nimport {\n isDesktopClient,\n pluginActivityGroups,\n pluginDockFaces,\n pluginFileLinks,\n pluginMinorModes,\n pluginSelectionAxes,\n subscribeWebPluginRegistry,\n webPluginRegistryRevision,\n} from './pluginRegistry';\nimport { stripAnsi } from './statusLine';\n\nexport interface SelectionAxis {\n name: string;\n command: string;\n /** The current selections, empty while the session reports none; one at most unless multi. */\n values: string[];\n emptyLabel: string;\n multi: boolean;\n}\n\nconst AXIS_LIST_SEPARATOR = ',';\n\n/**\n * The fallback axis table for the packaged bundle; a synced bundle carries\n * each axis as its owning package's plugin declaration, and the registry\n * list wins whenever any plugin declares one. Exported only so the workspace\n * composition test can hold it equal to what the packages declare.\n */\nexport const PACKAGED_SELECTION_AXES: readonly SelectionAxisContribution[] = [\n { name: 'profile', command: 'profile', statusKey: 'doom-profile', emptyLabel: 'no profile', order: 10 },\n { name: 'domains', command: 'domains', statusKey: 'doom-domain', emptyLabel: 'no domains', multi: true, order: 20 },\n];\n\n/**\n * The declared axes the session actually offers: an axis whose status key\n * the session never published stays off the bar entirely, which is how a\n * package withholds its axis when there is nothing to select.\n */\nexport function selectionAxes(statuses: Record<string, string>): SelectionAxis[] {\n const declared = pluginSelectionAxes();\n const sources: readonly SelectionAxisContribution[] = declared.length > 0 ? declared : PACKAGED_SELECTION_AXES;\n return sources.flatMap((source) => {\n const raw = statuses[source.statusKey];\n if (raw === undefined) return [];\n const multi = source.multi === true;\n const values = (multi ? stripAnsi(raw).split(AXIS_LIST_SEPARATOR) : [stripAnsi(raw)])\n .map((value) => value.trim())\n .filter(Boolean);\n return [{ name: source.name, command: source.command, values, emptyLabel: source.emptyLabel, multi }];\n });\n}\n\nexport type MinorModeAvailability = 'unavailable' | 'off' | 'on';\n\nexport interface MinorMode {\n name: string;\n /** The catalog id /minor accepts; the display name until the catalog reports. */\n id: string;\n /** Leader Space key path, as the TUI documents it. */\n keys: string;\n availability: MinorModeAvailability;\n /** What the mode itself is reporting while on. */\n detail: string;\n /** Activity group to focus instead of invoking the mode command from the cockpit. */\n activityGroup?: string;\n /**\n * Why the mode cannot be driven from here, in the words of the mode itself.\n * Empty when it can. A mode may be installed and still refuse a cockpit:\n * autonomous voice captures from the terminal's own microphone, which a\n * browser talking to a headless agent does not have.\n */\n unavailableReason: string;\n}\n\nexport interface MinorModeSource {\n name: string;\n /** The catalog mode this row drives, when the runtime registers it under another id. */\n modeId?: string;\n /** Leader Space key path, as the TUI documents it. */\n keys: string;\n /** Activity group to focus instead of invoking the mode command from the cockpit. */\n activityGroup?: string;\n statusKey?: string;\n widgetKey?: string;\n hideWhenMissing?: boolean;\n desktopOnly?: boolean;\n}\n\n/**\n * The fallback minor-mode table for the packaged bundle.\n *\n * A synced bundle carries each mode as its package's own web plugin\n * contribution, and the registry list wins whenever any plugin declares one.\n * This literal survives only so the built-in-only bundle keeps rendering the\n * modes Po ships; help is listed without a signal on purpose: it\n * registers no footer entry, so the cockpit reports it as unavailable rather\n * than guessing it is off. Exported only for the workspace composition test.\n */\nexport const PACKAGED_MINOR_MODES: readonly MinorModeSource[] = [\n { name: 'help', keys: 'h e' },\n { name: 'plan', keys: 'p e', statusKey: 'plan-mode' },\n { name: 'loop', keys: 'l l', statusKey: 'doom-loop' },\n { name: 'goal', keys: 'g e', statusKey: 'goal' },\n { name: 'author', keys: 'o a' },\n { name: 'workflow', keys: 'w e', widgetKey: 'workflow-mcp-progress' },\n // `v e` drives autonomous capture, which the runtime registers as 'voice-auto'.\n { name: 'voice', modeId: 'voice-auto', keys: 'v e', statusKey: 'doom-voice' },\n {\n name: 'computer use',\n modeId: 'computer-use',\n keys: 'c e',\n statusKey: 'doom-computer-use-mode',\n hideWhenMissing: true,\n desktopOnly: true,\n },\n];\n\n/** The declared source a catalog mode corresponds to, by id, id stem, or label. */\nfunction sourceFor(sources: readonly MinorModeSource[], mode: MinorModeRecordProjection): MinorModeSource | undefined {\n const candidates = new Set([mode.id.toLowerCase(), mode.id.toLowerCase().split('.')[0], mode.label.toLowerCase()]);\n return sources.find((source) =>\n [source.name, source.modeId].some((identity) => identity !== undefined && candidates.has(identity.toLowerCase())),\n );\n}\n\n/**\n * Catalog-backed rows: the runtime's own activation state per mode, with the\n * declared leader keys attached where a plugin documents them. Declared modes\n * the catalog does not know are still listed, as unavailable, so a mode that\n * is missing from a composition stays visible rather than silently gone.\n */\nfunction catalogMinorModes(sources: readonly MinorModeSource[], projection: MinorModeProjection): MinorMode[] {\n const rows: MinorMode[] = projection.modes\n .filter((mode) => !sourceFor(sources, mode)?.desktopOnly || isDesktopClient())\n .map((mode) => {\n const source = sourceFor(sources, mode);\n const on = mode.activation === 'active' || mode.activation === 'deactivating';\n // The catalog says per action whether it can run here and why not. A mode\n // with nothing runnable is offered as a row that cannot be clicked rather\n // than one that answers \"no actions available\" after the fact.\n const blocked = mode.actions.length > 0 && mode.actions.every((action) => !action.enabled);\n const reason = blocked ? (mode.actions.find((action) => action.disabledReason)?.disabledReason ?? '') : '';\n return {\n name: source?.name ?? mode.label.toLowerCase(),\n id: mode.id,\n keys: source?.keys ?? '',\n availability: blocked && !on ? 'unavailable' : on ? 'on' : 'off',\n ...(source?.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail: mode.detail ?? (mode.activation === 'activating' ? 'activating' : ''),\n unavailableReason: reason,\n };\n });\n const seen = new Set(rows.map((row) => row.name));\n for (const source of sources) {\n if (source.hideWhenMissing === true || (source.desktopOnly && !isDesktopClient())) continue;\n if (!seen.has(source.name)) {\n rows.push({\n name: source.name,\n id: source.modeId ?? source.name,\n keys: source.keys,\n availability: 'unavailable',\n ...(source.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail: '',\n unavailableReason: 'No package in this session registers this mode.',\n });\n }\n }\n return rows;\n}\n\nexport function minorModes(\n statuses: Record<string, string>,\n widgets: readonly string[],\n projection: MinorModeProjection | null = null,\n): MinorMode[] {\n const declared = pluginMinorModes();\n const sources: readonly MinorModeSource[] = declared.length > 0 ? declared : PACKAGED_MINOR_MODES;\n if (projection) return catalogMinorModes(sources, projection);\n return sources.flatMap((source) => {\n if (source.desktopOnly && !isDesktopClient()) return [];\n if (source.statusKey !== undefined) {\n const raw = statuses[source.statusKey];\n if (raw === undefined) {\n if (source.hideWhenMissing === true) return [];\n return [\n {\n name: source.name,\n id: source.modeId ?? source.name,\n keys: source.keys,\n availability: 'unavailable' as const,\n ...(source.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail: '',\n unavailableReason: 'This session has not reported the mode.',\n },\n ];\n }\n const detail = stripAnsi(raw).trim();\n return {\n name: source.name,\n id: source.modeId ?? source.name,\n keys: source.keys,\n availability: detail ? ('on' as const) : ('off' as const),\n ...(source.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail,\n unavailableReason: '',\n };\n }\n if (source.widgetKey !== undefined && widgets.includes(source.widgetKey)) {\n return {\n name: source.name,\n id: source.modeId ?? source.name,\n keys: source.keys,\n availability: 'off' as const,\n ...(source.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail: '',\n unavailableReason: '',\n };\n }\n return {\n name: source.name,\n id: source.name,\n keys: source.keys,\n availability: 'unavailable' as const,\n ...(source.activityGroup === undefined ? {} : { activityGroup: source.activityGroup }),\n detail: '',\n unavailableReason: 'This session has not reported the mode.',\n };\n });\n}\n\nexport interface ActivityGroup {\n name: string;\n keys: string;\n /** The heading visual its package declares; the dock draws a generic one without it. */\n icon?: ActivityGroupContribution['icon'];\n /** What the publishing extension is reporting, empty when it reports nothing. */\n summary: string;\n active: boolean;\n marksBackgroundWork?: boolean;\n /** The temporary tab the group's name opens, when its package declares one. */\n transientTab?: () => TransientTab;\n /** Keeps the group visible below the dock's scrolling ordinary groups. */\n placement?: 'bottom';\n}\n\n/** Subscribe to package-owned activity sources, rewiring when the focused composition changes. */\nexport function subscribeActivitySources(listener: () => void): () => void {\n let subscriptions: (() => void)[] = [];\n const unsubscribeSources = (): void => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n subscriptions = [];\n };\n const subscribeSources = (): void => {\n subscriptions = pluginActivityGroups().flatMap((source) =>\n source.activeSource === undefined ? [] : [source.activeSource.subscribe(listener)],\n );\n };\n subscribeSources();\n const unsubscribeRegistry = subscribeWebPluginRegistry(() => {\n unsubscribeSources();\n subscribeSources();\n listener();\n });\n return () => {\n unsubscribeRegistry();\n unsubscribeSources();\n };\n}\n\nfunction activitySourceFingerprint(sessionId: string | null): string {\n const activeSources = pluginActivityGroups()\n .map((source) => (source.activeSource?.isActive(sessionId) === true ? '1' : '0'))\n .join('');\n return `${webPluginRegistryRevision()}:${activeSources}`;\n}\n\n/**\n * The groups available in this plugin composition. Status and widget signals\n * reveal legacy groups. A package-owned active source also reveals its group,\n * including while idle, so the section can remain a stable launcher unless it\n * opts into `hideWhenEmpty`.\n *\n * A group that declared `hideWhenEmpty` goes away once its session stops\n * reporting. Clearing a status reaches the page as an empty string rather than\n * an absent key, because the same map tells the selection bar which minor modes\n * exist and an absent key means \"not reported\" there. Emptiness is read here,\n * where only the dock is looking.\n */\nexport function activityGroups(\n statuses: Record<string, string>,\n widgets: readonly string[],\n sessionId: string | null = null,\n): ActivityGroup[] {\n const groups: ActivityGroup[] = [];\n for (const source of pluginActivityGroups()) {\n const tab = source.transientTab === undefined ? {} : { transientTab: source.transientTab };\n const placement = {\n ...(source.placement === undefined ? {} : { placement: source.placement }),\n ...(source.marksBackgroundWork === false ? { marksBackgroundWork: false } : {}),\n ...(source.icon === undefined ? {} : { icon: source.icon }),\n };\n if (source.statusKey !== undefined && statuses[source.statusKey] !== undefined) {\n const summary = stripAnsi(statuses[source.statusKey] ?? '').trim();\n const active =\n source.activeSource?.isActive(sessionId) ?? (source.marksBackgroundWork !== false && summary.length > 0);\n if (summary.length === 0 && source.hideWhenEmpty === true && !active) continue;\n groups.push({ name: source.name, keys: source.keys, summary, active, ...tab, ...placement });\n continue;\n }\n if (source.widgetKeys !== undefined && source.widgetKeys.some((key) => widgets.includes(key))) {\n const activeKeys = source.activeWidgetKeys ?? source.widgetKeys;\n const active =\n source.activeSource?.isActive(sessionId) ??\n (source.marksBackgroundWork !== false && activeKeys.some((key) => widgets.includes(key)));\n groups.push({ name: source.name, keys: source.keys, summary: '', active, ...tab, ...placement });\n continue;\n }\n if (source.activeSource !== undefined) {\n const active = source.activeSource.isActive(sessionId);\n if (source.hideWhenEmpty === true && !active) continue;\n groups.push({\n name: source.name,\n keys: source.keys,\n summary: '',\n active,\n ...tab,\n ...placement,\n });\n }\n }\n return groups;\n}\n\n/** Dock faces update when the active session composition changes. */\nexport function useDockFaces(sessionId: string | null): readonly DockFaceContribution[] {\n useSyncExternalStore(subscribeWebPluginRegistry, webPluginRegistryRevision, webPluginRegistryRevision);\n const subscribe = (listener: () => void) => {\n const releases = pluginDockFaces().flatMap((face) =>\n face.visibility ? [face.visibility.subscribe(listener)] : [],\n );\n return () => releases.forEach((release) => release());\n };\n const snapshot = () =>\n pluginDockFaces()\n .map((face) => (face.visibility?.isVisible(sessionId) !== false ? '1' : '0'))\n .join('');\n useSyncExternalStore(subscribe, snapshot, snapshot);\n return pluginDockFaces().filter((face) => face.visibility?.isVisible(sessionId) !== false);\n}\n\n/** Activity groups that update when either host signals or a plugin's session store changes. */\nexport function useActivityGroups(\n statuses: Record<string, string>,\n widgets: readonly string[],\n sessionId: string | null,\n): ActivityGroup[] {\n useSyncExternalStore(\n subscribeActivitySources,\n () => activitySourceFingerprint(sessionId),\n () => activitySourceFingerprint(sessionId),\n );\n return activityGroups(statuses, widgets, sessionId);\n}\n\n/** The tab one path opens, or undefined when no installed plugin recognises it. */\nexport type FileLinkResolver = (path: string) => TransientTab | undefined;\n\ninterface FileLinkModes {\n active(sessionId: string | null): readonly string[];\n subscribe(sessionId: string | null, listener: () => void): () => void;\n}\nlet fileLinkModes: FileLinkModes | undefined;\nconst modeBindings = new Set<() => void>();\n\n/** Binds host session facts without making the composition library own session state. */\nexport function bindFileLinkModes(source: FileLinkModes): () => void {\n fileLinkModes = source;\n modeBindings.forEach((listener) => listener());\n return () => {\n if (fileLinkModes !== source) return;\n fileLinkModes = undefined;\n modeBindings.forEach((listener) => listener());\n };\n}\nfunction subscribeFileLinks(sessionId: string | null, listener: () => void): () => void {\n let unsubscribeModes = fileLinkModes?.subscribe(sessionId, listener);\n const rebindModes = () => {\n unsubscribeModes?.();\n unsubscribeModes = fileLinkModes?.subscribe(sessionId, listener);\n listener();\n };\n modeBindings.add(rebindModes);\n let subscriptions: (() => void)[] = [];\n const unsubscribeSources = (): void => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n subscriptions = [];\n };\n const subscribeSources = (): void => {\n subscriptions = pluginFileLinks().map((source) => source.subscribe(listener));\n };\n subscribeSources();\n const unsubscribeRegistry = subscribeWebPluginRegistry(() => {\n unsubscribeSources();\n subscribeSources();\n listener();\n });\n return () => {\n modeBindings.delete(rebindModes);\n unsubscribeModes?.();\n unsubscribeRegistry();\n unsubscribeSources();\n };\n}\n\nfunction activeFileLinkSources(sessionId: string | null) {\n const enabled = new Set(fileLinkModes?.active(sessionId) ?? []);\n return pluginFileLinks().filter(\n (source) => source.requiredMinorMode === undefined || enabled.has(source.requiredMinorMode),\n );\n}\n\nfunction fileLinkFingerprint(sessionId: string | null): string {\n const sourceFingerprints = activeFileLinkSources(sessionId)\n .map((source) => `${source.requiredMinorMode ?? ''}:${source.fingerprint(sessionId)}`)\n .join('\\n');\n return `${webPluginRegistryRevision()}:${sourceFingerprints}`;\n}\n\n/**\n * The tab a path opens, from the first source that claims it.\n *\n * A path no source claims is not a link. The host cannot tell a file name from\n * a class name, and the plugin that tracks the session's files can, so the\n * decision belongs there rather than in a heuristic here.\n */\nexport function fileLinkFor(sessionId: string | null, path: string): TransientTab | undefined {\n for (const source of activeFileLinkSources(sessionId)) {\n const tab = source.resolve(sessionId, path);\n if (tab !== undefined) return tab;\n }\n return undefined;\n}\n\n/**\n * The tab a path the caller is sure about opens: a tool call's path argument,\n * not a token spotted in prose.\n *\n * A source that offers `openPath` answers here, and it may claim a file the\n * session never changed, which `resolve` deliberately will not. Sources\n * without it fall back to the same guess prose gets.\n */\nexport function fileTabForPath(sessionId: string | null, path: string): TransientTab | undefined {\n for (const source of activeFileLinkSources(sessionId)) {\n const tab = source.openPath?.(sessionId, path) ?? source.resolve(sessionId, path);\n if (tab !== undefined) return tab;\n }\n return undefined;\n}\n/**\n * Resolves the paths a message names against the plugins that track them.\n *\n * The resolver's identity is stable while the linkable set is, so a component\n * that hands it to a renderer does not rebuild that renderer on every frame of\n * a streaming reply.\n */\nexport function useFileLinks(sessionId: string | null): FileLinkResolver {\n const fingerprint = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeFileLinks(sessionId, listener), [sessionId]),\n () => fileLinkFingerprint(sessionId),\n () => fileLinkFingerprint(sessionId),\n );\n return useCallback(\n (path: string) => fileLinkFor(sessionId, path),\n // The fingerprint is the dependency: the same path resolves differently\n // once the session's set of tracked files changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- fingerprint is a deliberate identity buster, not a value the callback reads.\n [sessionId, fingerprint],\n );\n}\n"],"mappings":";;;;AA8BA,MAAM,sBAAsB;;;;;;;AAQ5B,MAAa,0BAAgE,CAC3E;CAAE,MAAM;CAAW,SAAS;CAAW,WAAW;CAAgB,YAAY;CAAc,OAAO;AAAG,GACtG;CAAE,MAAM;CAAW,SAAS;CAAW,WAAW;CAAe,YAAY;CAAc,OAAO;CAAM,OAAO;AAAG,CACpH;;;;;;AAOA,SAAgB,cAAc,UAAmD;CAC/E,MAAM,WAAW,oBAAoB;CAErC,QADsD,SAAS,SAAS,IAAI,WAAW,wBAAA,CACxE,SAAS,WAAW;EACjC,MAAM,MAAM,SAAS,OAAO;EAC5B,IAAI,QAAQ,KAAA,GAAW,OAAO,CAAC;EAC/B,MAAM,QAAQ,OAAO,UAAU;EAC/B,MAAM,UAAU,QAAQ,UAAU,GAAG,CAAC,CAAC,MAAM,mBAAmB,IAAI,CAAC,UAAU,GAAG,CAAC,EAAA,CAChF,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO;EACjB,OAAO,CAAC;GAAE,MAAM,OAAO;GAAM,SAAS,OAAO;GAAS;GAAQ,YAAY,OAAO;GAAY;EAAM,CAAC;CACtG,CAAC;AACH;;;;;;;;;;;AAgDA,MAAa,uBAAmD;CAC9D;EAAE,MAAM;EAAQ,MAAM;CAAM;CAC5B;EAAE,MAAM;EAAQ,MAAM;EAAO,WAAW;CAAY;CACpD;EAAE,MAAM;EAAQ,MAAM;EAAO,WAAW;CAAY;CACpD;EAAE,MAAM;EAAQ,MAAM;EAAO,WAAW;CAAO;CAC/C;EAAE,MAAM;EAAU,MAAM;CAAM;CAC9B;EAAE,MAAM;EAAY,MAAM;EAAO,WAAW;CAAwB;CAEpE;EAAE,MAAM;EAAS,QAAQ;EAAc,MAAM;EAAO,WAAW;CAAa;CAC5E;EACE,MAAM;EACN,QAAQ;EACR,MAAM;EACN,WAAW;EACX,iBAAiB;EACjB,aAAa;CACf;AACF;;AAGA,SAAS,UAAU,SAAqC,MAA8D;CACpH,MAAM,6BAAa,IAAI,IAAI;EAAC,KAAK,GAAG,YAAY;EAAG,KAAK,GAAG,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;EAAI,KAAK,MAAM,YAAY;CAAC,CAAC;CACjH,OAAO,QAAQ,MAAM,WACnB,CAAC,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM,aAAa,aAAa,KAAA,KAAa,WAAW,IAAI,SAAS,YAAY,CAAC,CAAC,CAClH;AACF;;;;;;;AAQA,SAAS,kBAAkB,SAAqC,YAA8C;CAC5G,MAAM,OAAoB,WAAW,MAClC,QAAQ,SAAS,CAAC,UAAU,SAAS,IAAI,CAAC,EAAE,eAAe,gBAAgB,CAAC,CAAC,CAC7E,KAAK,SAAS;EACb,MAAM,SAAS,UAAU,SAAS,IAAI;EACtC,MAAM,KAAK,KAAK,eAAe,YAAY,KAAK,eAAe;EAI/D,MAAM,UAAU,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,OAAO,WAAW,CAAC,OAAO,OAAO;EACzF,MAAM,SAAS,UAAW,KAAK,QAAQ,MAAM,WAAW,OAAO,cAAc,CAAC,EAAE,kBAAkB,KAAM;EACxG,OAAO;GACL,MAAM,QAAQ,QAAQ,KAAK,MAAM,YAAY;GAC7C,IAAI,KAAK;GACT,MAAM,QAAQ,QAAQ;GACtB,cAAc,WAAW,CAAC,KAAK,gBAAgB,KAAK,OAAO;GAC3D,GAAI,QAAQ,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;GACrF,QAAQ,KAAK,WAAW,KAAK,eAAe,eAAe,eAAe;GAC1E,mBAAmB;EACrB;CACF,CAAC;CACH,MAAM,OAAO,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC;CAChD,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,oBAAoB,QAAS,OAAO,eAAe,CAAC,gBAAgB,GAAI;EACnF,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,GACvB,KAAK,KAAK;GACR,MAAM,OAAO;GACb,IAAI,OAAO,UAAU,OAAO;GAC5B,MAAM,OAAO;GACb,cAAc;GACd,GAAI,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;GACpF,QAAQ;GACR,mBAAmB;EACrB,CAAC;CAEL;CACA,OAAO;AACT;AAEA,SAAgB,WACd,UACA,SACA,aAAyC,MAC5B;CACb,MAAM,WAAW,iBAAiB;CAClC,MAAM,UAAsC,SAAS,SAAS,IAAI,WAAW;CAC7E,IAAI,YAAY,OAAO,kBAAkB,SAAS,UAAU;CAC5D,OAAO,QAAQ,SAAS,WAAW;EACjC,IAAI,OAAO,eAAe,CAAC,gBAAgB,GAAG,OAAO,CAAC;EACtD,IAAI,OAAO,cAAc,KAAA,GAAW;GAClC,MAAM,MAAM,SAAS,OAAO;GAC5B,IAAI,QAAQ,KAAA,GAAW;IACrB,IAAI,OAAO,oBAAoB,MAAM,OAAO,CAAC;IAC7C,OAAO,CACL;KACE,MAAM,OAAO;KACb,IAAI,OAAO,UAAU,OAAO;KAC5B,MAAM,OAAO;KACb,cAAc;KACd,GAAI,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;KACpF,QAAQ;KACR,mBAAmB;IACrB,CACF;GACF;GACA,MAAM,SAAS,UAAU,GAAG,CAAC,CAAC,KAAK;GACnC,OAAO;IACL,MAAM,OAAO;IACb,IAAI,OAAO,UAAU,OAAO;IAC5B,MAAM,OAAO;IACb,cAAc,SAAU,OAAkB;IAC1C,GAAI,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;IACpF;IACA,mBAAmB;GACrB;EACF;EACA,IAAI,OAAO,cAAc,KAAA,KAAa,QAAQ,SAAS,OAAO,SAAS,GACrE,OAAO;GACL,MAAM,OAAO;GACb,IAAI,OAAO,UAAU,OAAO;GAC5B,MAAM,OAAO;GACb,cAAc;GACd,GAAI,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;GACpF,QAAQ;GACR,mBAAmB;EACrB;EAEF,OAAO;GACL,MAAM,OAAO;GACb,IAAI,OAAO;GACX,MAAM,OAAO;GACb,cAAc;GACd,GAAI,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,OAAO,cAAc;GACpF,QAAQ;GACR,mBAAmB;EACrB;CACF,CAAC;AACH;;AAkBA,SAAgB,yBAAyB,UAAkC;CACzE,IAAI,gBAAgC,CAAC;CACrC,MAAM,2BAAiC;EACrC,cAAc,SAAS,gBAAgB,YAAY,CAAC;EACpD,gBAAgB,CAAC;CACnB;CACA,MAAM,yBAA+B;EACnC,gBAAgB,qBAAqB,CAAC,CAAC,SAAS,WAC9C,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,CAAC,OAAO,aAAa,UAAU,QAAQ,CAAC,CACnF;CACF;CACA,iBAAiB;CACjB,MAAM,sBAAsB,iCAAiC;EAC3D,mBAAmB;EACnB,iBAAiB;EACjB,SAAS;CACX,CAAC;CACD,aAAa;EACX,oBAAoB;EACpB,mBAAmB;CACrB;AACF;AAEA,SAAS,0BAA0B,WAAkC;CACnE,MAAM,gBAAgB,qBAAqB,CAAC,CACzC,KAAK,WAAY,OAAO,cAAc,SAAS,SAAS,MAAM,OAAO,MAAM,GAAI,CAAC,CAChF,KAAK,EAAE;CACV,OAAO,GAAG,0BAA0B,EAAE,GAAG;AAC3C;;;;;;;;;;;;;AAcA,SAAgB,eACd,UACA,SACA,YAA2B,MACV;CACjB,MAAM,SAA0B,CAAC;CACjC,KAAK,MAAM,UAAU,qBAAqB,GAAG;EAC3C,MAAM,MAAM,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;EACzF,MAAM,YAAY;GAChB,GAAI,OAAO,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;GACxE,GAAI,OAAO,wBAAwB,QAAQ,EAAE,qBAAqB,MAAM,IAAI,CAAC;GAC7E,GAAI,OAAO,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;EAC3D;EACA,IAAI,OAAO,cAAc,KAAA,KAAa,SAAS,OAAO,eAAe,KAAA,GAAW;GAC9E,MAAM,UAAU,UAAU,SAAS,OAAO,cAAc,EAAE,CAAC,CAAC,KAAK;GACjE,MAAM,SACJ,OAAO,cAAc,SAAS,SAAS,MAAM,OAAO,wBAAwB,SAAS,QAAQ,SAAS;GACxG,IAAI,QAAQ,WAAW,KAAK,OAAO,kBAAkB,QAAQ,CAAC,QAAQ;GACtE,OAAO,KAAK;IAAE,MAAM,OAAO;IAAM,MAAM,OAAO;IAAM;IAAS;IAAQ,GAAG;IAAK,GAAG;GAAU,CAAC;GAC3F;EACF;EACA,IAAI,OAAO,eAAe,KAAA,KAAa,OAAO,WAAW,MAAM,QAAQ,QAAQ,SAAS,GAAG,CAAC,GAAG;GAC7F,MAAM,aAAa,OAAO,oBAAoB,OAAO;GACrD,MAAM,SACJ,OAAO,cAAc,SAAS,SAAS,MACtC,OAAO,wBAAwB,SAAS,WAAW,MAAM,QAAQ,QAAQ,SAAS,GAAG,CAAC;GACzF,OAAO,KAAK;IAAE,MAAM,OAAO;IAAM,MAAM,OAAO;IAAM,SAAS;IAAI;IAAQ,GAAG;IAAK,GAAG;GAAU,CAAC;GAC/F;EACF;EACA,IAAI,OAAO,iBAAiB,KAAA,GAAW;GACrC,MAAM,SAAS,OAAO,aAAa,SAAS,SAAS;GACrD,IAAI,OAAO,kBAAkB,QAAQ,CAAC,QAAQ;GAC9C,OAAO,KAAK;IACV,MAAM,OAAO;IACb,MAAM,OAAO;IACb,SAAS;IACT;IACA,GAAG;IACH,GAAG;GACL,CAAC;EACH;CACF;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,WAA2D;CACtF,qBAAqB,4BAA4B,2BAA2B,yBAAyB;CACrG,MAAM,aAAa,aAAyB;EAC1C,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,SAC1C,KAAK,aAAa,CAAC,KAAK,WAAW,UAAU,QAAQ,CAAC,IAAI,CAAC,CAC7D;EACA,aAAa,SAAS,SAAS,YAAY,QAAQ,CAAC;CACtD;CACA,MAAM,iBACJ,gBAAgB,CAAC,CACd,KAAK,SAAU,KAAK,YAAY,UAAU,SAAS,MAAM,QAAQ,MAAM,GAAI,CAAC,CAC5E,KAAK,EAAE;CACZ,qBAAqB,WAAW,UAAU,QAAQ;CAClD,OAAO,gBAAgB,CAAC,CAAC,QAAQ,SAAS,KAAK,YAAY,UAAU,SAAS,MAAM,KAAK;AAC3F;;AAGA,SAAgB,kBACd,UACA,SACA,WACiB;CACjB,qBACE,gCACM,0BAA0B,SAAS,SACnC,0BAA0B,SAAS,CAC3C;CACA,OAAO,eAAe,UAAU,SAAS,SAAS;AACpD;AASA,IAAI;AACJ,MAAM,+BAAe,IAAI,IAAgB;;AAGzC,SAAgB,kBAAkB,QAAmC;CACnE,gBAAgB;CAChB,aAAa,SAAS,aAAa,SAAS,CAAC;CAC7C,aAAa;EACX,IAAI,kBAAkB,QAAQ;EAC9B,gBAAgB,KAAA;EAChB,aAAa,SAAS,aAAa,SAAS,CAAC;CAC/C;AACF;AACA,SAAS,mBAAmB,WAA0B,UAAkC;CACtF,IAAI,mBAAmB,eAAe,UAAU,WAAW,QAAQ;CACnE,MAAM,oBAAoB;EACxB,mBAAmB;EACnB,mBAAmB,eAAe,UAAU,WAAW,QAAQ;EAC/D,SAAS;CACX;CACA,aAAa,IAAI,WAAW;CAC5B,IAAI,gBAAgC,CAAC;CACrC,MAAM,2BAAiC;EACrC,cAAc,SAAS,gBAAgB,YAAY,CAAC;EACpD,gBAAgB,CAAC;CACnB;CACA,MAAM,yBAA+B;EACnC,gBAAgB,gBAAgB,CAAC,CAAC,KAAK,WAAW,OAAO,UAAU,QAAQ,CAAC;CAC9E;CACA,iBAAiB;CACjB,MAAM,sBAAsB,iCAAiC;EAC3D,mBAAmB;EACnB,iBAAiB;EACjB,SAAS;CACX,CAAC;CACD,aAAa;EACX,aAAa,OAAO,WAAW;EAC/B,mBAAmB;EACnB,oBAAoB;EACpB,mBAAmB;CACrB;AACF;AAEA,SAAS,sBAAsB,WAA0B;CACvD,MAAM,UAAU,IAAI,IAAI,eAAe,OAAO,SAAS,KAAK,CAAC,CAAC;CAC9D,OAAO,gBAAgB,CAAC,CAAC,QACtB,WAAW,OAAO,sBAAsB,KAAA,KAAa,QAAQ,IAAI,OAAO,iBAAiB,CAC5F;AACF;AAEA,SAAS,oBAAoB,WAAkC;CAC7D,MAAM,qBAAqB,sBAAsB,SAAS,CAAC,CACxD,KAAK,WAAW,GAAG,OAAO,qBAAqB,GAAG,GAAG,OAAO,YAAY,SAAS,GAAG,CAAC,CACrF,KAAK,IAAI;CACZ,OAAO,GAAG,0BAA0B,EAAE,GAAG;AAC3C;;;;;;;;AASA,SAAgB,YAAY,WAA0B,MAAwC;CAC5F,KAAK,MAAM,UAAU,sBAAsB,SAAS,GAAG;EACrD,MAAM,MAAM,OAAO,QAAQ,WAAW,IAAI;EAC1C,IAAI,QAAQ,KAAA,GAAW,OAAO;CAChC;AAEF;;;;;;;;;AAUA,SAAgB,eAAe,WAA0B,MAAwC;CAC/F,KAAK,MAAM,UAAU,sBAAsB,SAAS,GAAG;EACrD,MAAM,MAAM,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO,QAAQ,WAAW,IAAI;EAChF,IAAI,QAAQ,KAAA,GAAW,OAAO;CAChC;AAEF;;;;;;;;AAQA,SAAgB,aAAa,WAA4C;CACvE,MAAM,cAAc,qBAClB,aAAa,aAAyB,mBAAmB,WAAW,QAAQ,GAAG,CAAC,SAAS,CAAC,SACpF,oBAAoB,SAAS,SAC7B,oBAAoB,SAAS,CACrC;CACA,OAAO,aACJ,SAAiB,YAAY,WAAW,IAAI,GAI7C,CAAC,WAAW,WAAW,CACzB;AACF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
const require_statusLine = require("./statusLine.cjs");
|
|
2
|
+
const require_composition = require("./composition.cjs");
|
|
3
|
+
//#region src/web/lib/contextComposition.ts
|
|
4
|
+
/** Extensions first: they are the session's own, and the eye starts there. */
|
|
5
|
+
const SOURCE_ORDER = {
|
|
6
|
+
extension: 0,
|
|
7
|
+
mcp: 1,
|
|
8
|
+
plugin: 2,
|
|
9
|
+
core: 3
|
|
10
|
+
};
|
|
11
|
+
const KIND_ORDER = {
|
|
12
|
+
major: 0,
|
|
13
|
+
minor: 1,
|
|
14
|
+
domain: 2,
|
|
15
|
+
core: 3
|
|
16
|
+
};
|
|
17
|
+
function bySource(left, right) {
|
|
18
|
+
return SOURCE_ORDER[left.source] - SOURCE_ORDER[right.source] || left.name.localeCompare(right.name);
|
|
19
|
+
}
|
|
20
|
+
/** A group with nothing priced reports null rather than a confident zero. */
|
|
21
|
+
function subtotal(items) {
|
|
22
|
+
const priced = items.filter((item) => item.tokens !== null);
|
|
23
|
+
return priced.length === 0 ? null : priced.reduce((total, item) => total + (item.tokens ?? 0), 0);
|
|
24
|
+
}
|
|
25
|
+
function group(id, label, kind, detail, items) {
|
|
26
|
+
const sorted = [...items].sort(bySource);
|
|
27
|
+
return {
|
|
28
|
+
id,
|
|
29
|
+
label,
|
|
30
|
+
kind,
|
|
31
|
+
detail,
|
|
32
|
+
items: sorted,
|
|
33
|
+
tokens: subtotal(sorted),
|
|
34
|
+
inactiveTokens: 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The composition the session is running under.
|
|
39
|
+
*
|
|
40
|
+
* Until the runtime publishes its inventory every group is empty, which is the
|
|
41
|
+
* honest reading: the modes are known from the footer the session already
|
|
42
|
+
* publishes, the tools they brought are not.
|
|
43
|
+
*/
|
|
44
|
+
function contextGroups(statuses, widgets, projection = null, items = [], attribution = {}) {
|
|
45
|
+
const selection = require_statusLine.parseSelection(statuses["doom-major-mode"] ?? "");
|
|
46
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
const key = attribution[item.name] ?? "core";
|
|
49
|
+
const bucket = byGroup.get(key);
|
|
50
|
+
if (bucket) bucket.push(item);
|
|
51
|
+
else byGroup.set(key, [item]);
|
|
52
|
+
}
|
|
53
|
+
const take = (key) => byGroup.get(key) ?? [];
|
|
54
|
+
const groups = [];
|
|
55
|
+
if (selection.majorMode) groups.push(group(selection.majorMode, selection.majorMode, "major", selection.pending ? "switching" : "", take(selection.majorMode)));
|
|
56
|
+
for (const mode of require_composition.minorModes(statuses, widgets, projection)) {
|
|
57
|
+
if (mode.availability !== "on") continue;
|
|
58
|
+
groups.push(group(mode.id, mode.name, "minor", mode.detail, take(mode.id)));
|
|
59
|
+
}
|
|
60
|
+
for (const domain of [...selection.domains].sort((left, right) => left.localeCompare(right))) groups.push(group(domain, domain, "domain", "", take(domain)));
|
|
61
|
+
const orphans = take("core");
|
|
62
|
+
if (orphans.length > 0) groups.push(group("core", "core", "core", "", orphans));
|
|
63
|
+
return groups.sort((left, right) => KIND_ORDER[left.kind] - KIND_ORDER[right.kind]);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The runtime's own grouping, used as published.
|
|
67
|
+
*
|
|
68
|
+
* Once the session reports a composition it already knows which mode admitted
|
|
69
|
+
* each tool, which is a join the page cannot make for itself. Re-deriving it
|
|
70
|
+
* here from status strings would only be able to disagree.
|
|
71
|
+
*/
|
|
72
|
+
function projectedGroups(projection) {
|
|
73
|
+
return projection.groups.map((group) => ({
|
|
74
|
+
id: group.id,
|
|
75
|
+
label: group.label,
|
|
76
|
+
kind: group.kind,
|
|
77
|
+
detail: "",
|
|
78
|
+
inactiveTokens: group.inactiveTokens,
|
|
79
|
+
items: group.items.map((item) => ({
|
|
80
|
+
name: item.name,
|
|
81
|
+
itemKind: item.itemKind,
|
|
82
|
+
source: item.source,
|
|
83
|
+
owner: item.owner,
|
|
84
|
+
tokens: item.tokens,
|
|
85
|
+
active: item.active
|
|
86
|
+
})),
|
|
87
|
+
tokens: group.tokens
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
/** The whole composition's estimate, or null while nothing is priced. */
|
|
91
|
+
function totalTokens(groups) {
|
|
92
|
+
const priced = groups.filter((entry) => entry.tokens !== null);
|
|
93
|
+
return priced.length === 0 ? null : priced.reduce((total, entry) => total + (entry.tokens ?? 0), 0);
|
|
94
|
+
}
|
|
95
|
+
/** The scope is noise once the rows beneath already name the package. */
|
|
96
|
+
function ownerLabel(owner) {
|
|
97
|
+
return owner.startsWith("@") ? owner.split("/").pop() ?? owner : owner;
|
|
98
|
+
}
|
|
99
|
+
function ownersOf(group) {
|
|
100
|
+
const byOwner = /* @__PURE__ */ new Map();
|
|
101
|
+
for (const item of group.items) {
|
|
102
|
+
const existing = byOwner.get(item.owner);
|
|
103
|
+
if (existing) {
|
|
104
|
+
existing.items.push(item);
|
|
105
|
+
existing.tokens += item.active ? item.tokens ?? 0 : 0;
|
|
106
|
+
existing.inactiveTokens += item.active ? 0 : item.tokens ?? 0;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
byOwner.set(item.owner, {
|
|
110
|
+
owner: item.owner,
|
|
111
|
+
source: item.source,
|
|
112
|
+
items: [item],
|
|
113
|
+
tokens: item.active ? item.tokens ?? 0 : 0,
|
|
114
|
+
inactiveTokens: item.active ? 0 : item.tokens ?? 0
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
for (const entry of byOwner.values()) entry.items.sort((left, right) => left.name.localeCompare(right.name));
|
|
118
|
+
return [...byOwner.values()].sort((left, right) => SOURCE_ORDER[left.source] - SOURCE_ORDER[right.source] || ownerLabel(left.owner).localeCompare(ownerLabel(right.owner)));
|
|
119
|
+
}
|
|
120
|
+
/** What every gated item across the composition would add if switched on. */
|
|
121
|
+
function inactiveTotal(groups) {
|
|
122
|
+
return groups.reduce((total, entry) => total + entry.inactiveTokens, 0);
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
exports.contextGroups = contextGroups;
|
|
126
|
+
exports.inactiveTotal = inactiveTotal;
|
|
127
|
+
exports.ownerLabel = ownerLabel;
|
|
128
|
+
exports.ownersOf = ownersOf;
|
|
129
|
+
exports.projectedGroups = projectedGroups;
|
|
130
|
+
exports.totalTokens = totalTokens;
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=contextComposition.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextComposition.cjs","names":["parseSelection","minorModes"],"sources":["../../../src/web/lib/contextComposition.ts"],"sourcesContent":["import type { ContextProjection, MinorModeProjection } from '../../types/hub';\nimport { minorModes } from './composition';\nimport { parseSelection } from './statusLine';\n\n/**\n * What the session is composed of, as opposed to what it is doing.\n *\n * The activity dock answers \"what is running\"; this answers \"what is loaded and\n * what does carrying it cost\". A group is a mode, because a mode is the thing a\n * reader can actually switch off: grouping by source would name the mechanism\n * rather than the decision. Rows inside a group are ordered by source kind so\n * the session's own extensions read before anything a server or plugin added.\n */\nexport type ContextGroupKind = 'major' | 'minor' | 'domain' | 'core';\n\nexport type ContextItemSource = 'extension' | 'mcp' | 'plugin' | 'core';\n\n/** Extensions first: they are the session's own, and the eye starts there. */\nconst SOURCE_ORDER: Record<ContextItemSource, number> = { extension: 0, mcp: 1, plugin: 2, core: 3 };\n\nconst KIND_ORDER: Record<ContextGroupKind, number> = { major: 0, minor: 1, domain: 2, core: 3 };\n\nexport interface ContextItem {\n name: string;\n itemKind: 'tool' | 'skill';\n source: ContextItemSource;\n /** The package or server that registered it. */\n owner: string;\n /** Estimated tokens, or null while the runtime has not reported a figure. */\n tokens: number | null;\n active: boolean;\n}\n\nexport interface ContextGroup {\n id: string;\n label: string;\n kind: ContextGroupKind;\n /** A short qualifier shown beside the label, e.g. a pending switch. */\n detail: string;\n items: ContextItem[];\n /** Subtotal across active items, or null when no item carries a figure. */\n tokens: number | null;\n /** What the group's gated items would add if switched on. */\n inactiveTokens: number;\n}\n\nfunction bySource(left: ContextItem, right: ContextItem): number {\n return SOURCE_ORDER[left.source] - SOURCE_ORDER[right.source] || left.name.localeCompare(right.name);\n}\n\n/** A group with nothing priced reports null rather than a confident zero. */\nfunction subtotal(items: readonly ContextItem[]): number | null {\n const priced = items.filter((item) => item.tokens !== null);\n return priced.length === 0 ? null : priced.reduce((total, item) => total + (item.tokens ?? 0), 0);\n}\n\nfunction group(id: string, label: string, kind: ContextGroupKind, detail: string, items: ContextItem[]): ContextGroup {\n const sorted = [...items].sort(bySource);\n return { id, label, kind, detail, items: sorted, tokens: subtotal(sorted), inactiveTokens: 0 };\n}\n\n/**\n * The composition the session is running under.\n *\n * Until the runtime publishes its inventory every group is empty, which is the\n * honest reading: the modes are known from the footer the session already\n * publishes, the tools they brought are not.\n */\nexport function contextGroups(\n statuses: Record<string, string>,\n widgets: readonly string[],\n projection: MinorModeProjection | null = null,\n items: readonly ContextItem[] = [],\n attribution: Readonly<Record<string, string>> = {},\n): ContextGroup[] {\n const selection = parseSelection(statuses['doom-major-mode'] ?? '');\n const byGroup = new Map<string, ContextItem[]>();\n for (const item of items) {\n const key = attribution[item.name] ?? 'core';\n const bucket = byGroup.get(key);\n if (bucket) bucket.push(item);\n else byGroup.set(key, [item]);\n }\n const take = (key: string): ContextItem[] => byGroup.get(key) ?? [];\n\n const groups: ContextGroup[] = [];\n\n if (selection.majorMode) {\n groups.push(\n group(\n selection.majorMode,\n selection.majorMode,\n 'major',\n selection.pending ? 'switching' : '',\n take(selection.majorMode),\n ),\n );\n }\n\n for (const mode of minorModes(statuses, widgets, projection)) {\n if (mode.availability !== 'on') continue;\n groups.push(group(mode.id, mode.name, 'minor', mode.detail, take(mode.id)));\n }\n\n for (const domain of [...selection.domains].sort((left, right) => left.localeCompare(right))) {\n groups.push(group(domain, domain, 'domain', '', take(domain)));\n }\n\n // Pi's own tools, and anything the runtime could not attribute. An\n // unattributed tool is still costing context, so it is listed rather than\n // dropped for failing to name a sponsor.\n const orphans = take('core');\n if (orphans.length > 0) groups.push(group('core', 'core', 'core', '', orphans));\n\n return groups.sort((left, right) => KIND_ORDER[left.kind] - KIND_ORDER[right.kind]);\n}\n\n/**\n * The runtime's own grouping, used as published.\n *\n * Once the session reports a composition it already knows which mode admitted\n * each tool, which is a join the page cannot make for itself. Re-deriving it\n * here from status strings would only be able to disagree.\n */\nexport function projectedGroups(projection: ContextProjection): ContextGroup[] {\n return projection.groups.map((group) => ({\n id: group.id,\n label: group.label,\n kind: group.kind,\n detail: '',\n inactiveTokens: group.inactiveTokens,\n items: group.items.map((item) => ({\n name: item.name,\n itemKind: item.itemKind,\n source: item.source,\n owner: item.owner,\n tokens: item.tokens,\n active: item.active,\n })),\n tokens: group.tokens,\n }));\n}\n\n/** The whole composition's estimate, or null while nothing is priced. */\nexport function totalTokens(groups: readonly ContextGroup[]): number | null {\n const priced = groups.filter((entry) => entry.tokens !== null);\n return priced.length === 0 ? null : priced.reduce((total, entry) => total + (entry.tokens ?? 0), 0);\n}\n\n/**\n * One package, server, or plugin inside a mode, with what it costs.\n *\n * A mode can admit two dozen tools from a dozen packages, and a flat list of\n * those names says nothing about which dependency to reconsider. The package is\n * the unit that gets added or removed, so it is the unit worth totalling.\n */\nexport interface ContextOwner {\n owner: string;\n /** Every tool a single owner registers shares one source kind. */\n source: ContextItemSource;\n items: ContextItem[];\n tokens: number;\n inactiveTokens: number;\n}\n\n/** The scope is noise once the rows beneath already name the package. */\nexport function ownerLabel(owner: string): string {\n return owner.startsWith('@') ? (owner.split('/').pop() ?? owner) : owner;\n}\n\nexport function ownersOf(group: ContextGroup): ContextOwner[] {\n const byOwner = new Map<string, ContextOwner>();\n for (const item of group.items) {\n const existing = byOwner.get(item.owner);\n if (existing) {\n existing.items.push(item);\n existing.tokens += item.active ? (item.tokens ?? 0) : 0;\n existing.inactiveTokens += item.active ? 0 : (item.tokens ?? 0);\n continue;\n }\n byOwner.set(item.owner, {\n owner: item.owner,\n source: item.source,\n items: [item],\n tokens: item.active ? (item.tokens ?? 0) : 0,\n inactiveTokens: item.active ? 0 : (item.tokens ?? 0),\n });\n }\n for (const entry of byOwner.values()) entry.items.sort((left, right) => left.name.localeCompare(right.name));\n return [...byOwner.values()].sort(\n (left, right) =>\n SOURCE_ORDER[left.source] - SOURCE_ORDER[right.source] ||\n ownerLabel(left.owner).localeCompare(ownerLabel(right.owner)),\n );\n}\n\n/** What every gated item across the composition would add if switched on. */\nexport function inactiveTotal(groups: readonly ContextGroup[]): number {\n return groups.reduce((total, entry) => total + entry.inactiveTokens, 0);\n}\n"],"mappings":"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"}
|