@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,370 @@
|
|
|
1
|
+
import { Store } from "@tanstack/store";
|
|
2
|
+
import { useStore } from "@tanstack/react-store";
|
|
3
|
+
//#region src/web/stores/composerStore.ts
|
|
4
|
+
const MAX_COMPOSER_ATTACHMENTS = 8;
|
|
5
|
+
const MAX_COMPOSER_IMAGE_BYTES = 10485760;
|
|
6
|
+
const MAX_COMPOSER_TOTAL_IMAGE_BYTES = 20971520;
|
|
7
|
+
const MAX_COMPOSER_TEXT_BYTES = 102400;
|
|
8
|
+
const MAX_COMPOSER_TOTAL_TEXT_BYTES = 204800;
|
|
9
|
+
/** The host's upload limit for one stored attachment. */
|
|
10
|
+
const MAX_COMPOSER_UPLOAD_BYTES = 8388608;
|
|
11
|
+
/** Bytes counted against the inline text budget: stored files and images travel separately. */
|
|
12
|
+
function inlineTextBytes(attachments) {
|
|
13
|
+
return attachments.reduce((total, attachment) => total + (attachment.kind === "text" || attachment.kind === "context" ? attachment.size : 0), 0);
|
|
14
|
+
}
|
|
15
|
+
const EMPTY_COMPOSER_SESSION = {
|
|
16
|
+
draft: "",
|
|
17
|
+
caret: 0,
|
|
18
|
+
dismissedToken: null,
|
|
19
|
+
attachments: [],
|
|
20
|
+
attachmentError: "",
|
|
21
|
+
nextAttachmentId: 0,
|
|
22
|
+
pendingAttachments: 0
|
|
23
|
+
};
|
|
24
|
+
/** Browser-only composer state, retained independently for each live session. */
|
|
25
|
+
const composerStore = new Store({});
|
|
26
|
+
function composerStateOf(state, sessionId) {
|
|
27
|
+
return (sessionId === null ? void 0 : state[sessionId]) ?? EMPTY_COMPOSER_SESSION;
|
|
28
|
+
}
|
|
29
|
+
function useComposerState(sessionId) {
|
|
30
|
+
return useStore(composerStore, (state) => composerStateOf(state, sessionId));
|
|
31
|
+
}
|
|
32
|
+
function updateComposerState(sessionId, update) {
|
|
33
|
+
if (sessionId === null) return;
|
|
34
|
+
composerStore.setState((state) => ({
|
|
35
|
+
...state,
|
|
36
|
+
[sessionId]: update(composerStateOf(state, sessionId))
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
/** Appends non-empty text to the latest draft for one session. */
|
|
40
|
+
function appendComposerDraft(sessionId, text) {
|
|
41
|
+
const transcript = text.trim();
|
|
42
|
+
if (sessionId === null || transcript === "") return;
|
|
43
|
+
updateComposerState(sessionId, (state) => {
|
|
44
|
+
const separator = state.draft === "" || /\s$/.test(state.draft) ? "" : " ";
|
|
45
|
+
const draft = `${state.draft}${separator}${transcript}`;
|
|
46
|
+
return {
|
|
47
|
+
...state,
|
|
48
|
+
draft,
|
|
49
|
+
caret: draft.length,
|
|
50
|
+
dismissedToken: null
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function contextFields(item) {
|
|
55
|
+
const name = item.label.trim().replace(/[\r\n]+/g, " ").slice(0, 200);
|
|
56
|
+
const content = item.content.trim();
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
content,
|
|
60
|
+
valid: item.kind.trim() !== "" && item.source.trim() !== "" && item.id.trim() !== "" && name !== "" && content !== ""
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** The open tab's context for one message. Slash commands, invalid items and failing reads send without it. */
|
|
64
|
+
function tabComposerContext(read, sessionId, draft) {
|
|
65
|
+
if (read === void 0 || draft.trim().startsWith("/")) return void 0;
|
|
66
|
+
let item;
|
|
67
|
+
try {
|
|
68
|
+
item = read(sessionId);
|
|
69
|
+
} catch {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (item === void 0) return void 0;
|
|
73
|
+
const { name, content, valid } = contextFields(item);
|
|
74
|
+
if (!valid || new TextEncoder().encode(content).byteLength > 102400) return void 0;
|
|
75
|
+
return {
|
|
76
|
+
...item,
|
|
77
|
+
label: name,
|
|
78
|
+
content
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function isCaptureShape(capture) {
|
|
82
|
+
const context = capture.context;
|
|
83
|
+
if (typeof capture.data !== "string" || capture.mimeType !== "image/png" && capture.mimeType !== "image/jpeg") return false;
|
|
84
|
+
if (typeof context !== "object" || context === null || Array.isArray(context)) return false;
|
|
85
|
+
const item = context;
|
|
86
|
+
return typeof item.kind === "string" && typeof item.source === "string" && typeof item.id === "string" && typeof item.label === "string" && typeof item.content === "string" && (item.url === void 0 || typeof item.url === "string");
|
|
87
|
+
}
|
|
88
|
+
const MAX_COMPOSER_CAPTURE_DIMENSION = 1600;
|
|
89
|
+
function decodeCanonicalBase64(data) {
|
|
90
|
+
if (data === "" || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(data)) return null;
|
|
91
|
+
try {
|
|
92
|
+
const decoded = atob(data);
|
|
93
|
+
return btoa(decoded) === data ? decoded : null;
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function uint16(binary, offset) {
|
|
99
|
+
return binary.charCodeAt(offset) * 256 + binary.charCodeAt(offset + 1);
|
|
100
|
+
}
|
|
101
|
+
function uint32(binary, offset) {
|
|
102
|
+
return binary.charCodeAt(offset) * 16777216 + binary.charCodeAt(offset + 1) * 65536 + binary.charCodeAt(offset + 2) * 256 + binary.charCodeAt(offset + 3);
|
|
103
|
+
}
|
|
104
|
+
function pngDimensions(binary) {
|
|
105
|
+
if (binary.length < 24 || !binary.startsWith("PNG\r\n\n") || binary.slice(12, 16) !== "IHDR") return null;
|
|
106
|
+
return {
|
|
107
|
+
width: uint32(binary, 16),
|
|
108
|
+
height: uint32(binary, 20)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function jpegDimensions(binary) {
|
|
112
|
+
if (binary.length < 4 || binary.charCodeAt(0) !== 255 || binary.charCodeAt(1) !== 216 || binary.charCodeAt(2) !== 255) return null;
|
|
113
|
+
const startOfFrameMarkers = /* @__PURE__ */ new Set([
|
|
114
|
+
192,
|
|
115
|
+
193,
|
|
116
|
+
194,
|
|
117
|
+
195,
|
|
118
|
+
197,
|
|
119
|
+
198,
|
|
120
|
+
199,
|
|
121
|
+
201,
|
|
122
|
+
202,
|
|
123
|
+
203,
|
|
124
|
+
205,
|
|
125
|
+
206,
|
|
126
|
+
207
|
|
127
|
+
]);
|
|
128
|
+
let offset = 2;
|
|
129
|
+
while (offset < binary.length) {
|
|
130
|
+
if (binary.charCodeAt(offset) !== 255) return null;
|
|
131
|
+
while (binary.charCodeAt(offset) === 255) offset += 1;
|
|
132
|
+
if (offset >= binary.length) return null;
|
|
133
|
+
const marker = binary.charCodeAt(offset);
|
|
134
|
+
offset += 1;
|
|
135
|
+
if (marker === 217 || marker === 218) return null;
|
|
136
|
+
if (marker === 1 || marker >= 208 && marker <= 216) continue;
|
|
137
|
+
if (offset + 2 > binary.length) return null;
|
|
138
|
+
const segmentLength = uint16(binary, offset);
|
|
139
|
+
if (segmentLength < 2 || offset + segmentLength > binary.length) return null;
|
|
140
|
+
if (startOfFrameMarkers.has(marker)) {
|
|
141
|
+
if (segmentLength < 7) return null;
|
|
142
|
+
return {
|
|
143
|
+
width: uint16(binary, offset + 5),
|
|
144
|
+
height: uint16(binary, offset + 3)
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
offset += segmentLength;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
function validCaptureDimensions(binary, mimeType) {
|
|
152
|
+
const dimensions = mimeType === "image/png" ? pngDimensions(binary) : jpegDimensions(binary);
|
|
153
|
+
return dimensions !== null && dimensions.width > 0 && dimensions.height > 0 && dimensions.width <= MAX_COMPOSER_CAPTURE_DIMENSION && dimensions.height <= MAX_COMPOSER_CAPTURE_DIMENSION;
|
|
154
|
+
}
|
|
155
|
+
/** Adds structured plugin context without changing the visible composer draft. */
|
|
156
|
+
function attachComposerContext(sessionId, item) {
|
|
157
|
+
if (sessionId === null) return;
|
|
158
|
+
const { name, content, valid } = contextFields(item);
|
|
159
|
+
updateComposerState(sessionId, (state) => {
|
|
160
|
+
if (!valid) return {
|
|
161
|
+
...state,
|
|
162
|
+
attachmentError: "Context needs a source, id, label, and content."
|
|
163
|
+
};
|
|
164
|
+
if (state.attachments.length >= 8) return {
|
|
165
|
+
...state,
|
|
166
|
+
attachmentError: `Only ${String(8)} attachments are allowed.`
|
|
167
|
+
};
|
|
168
|
+
const size = new TextEncoder().encode(content).byteLength;
|
|
169
|
+
if (size > 102400) return {
|
|
170
|
+
...state,
|
|
171
|
+
attachmentError: `${name} exceeds the 100 KB context limit.`
|
|
172
|
+
};
|
|
173
|
+
if (inlineTextBytes(state.attachments) + size > 204800) return {
|
|
174
|
+
...state,
|
|
175
|
+
attachmentError: `${name} exceeds the 200 KB total text limit.`
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
...state,
|
|
179
|
+
attachments: [...state.attachments, {
|
|
180
|
+
id: `context-${String(state.nextAttachmentId)}`,
|
|
181
|
+
kind: "context",
|
|
182
|
+
name,
|
|
183
|
+
size,
|
|
184
|
+
content,
|
|
185
|
+
source: item.source,
|
|
186
|
+
contextId: item.id,
|
|
187
|
+
contextKind: item.kind,
|
|
188
|
+
...item.url === void 0 ? {} : { url: item.url }
|
|
189
|
+
}],
|
|
190
|
+
attachmentError: "",
|
|
191
|
+
nextAttachmentId: state.nextAttachmentId + 1
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/** Validates a standalone capture without reading or changing the composer. */
|
|
196
|
+
function validateComposerCapture(capture) {
|
|
197
|
+
if (!isCaptureShape(capture) || !contextFields(capture.context).valid) throw new Error("Capture needs a base64 PNG or JPEG image and valid context.");
|
|
198
|
+
if (capture.data.length > Math.ceil(10485760 / 3) * 4) throw new Error("Capture exceeds the 10 MB image limit.");
|
|
199
|
+
const image = decodeCanonicalBase64(capture.data);
|
|
200
|
+
if (image === null || !validCaptureDimensions(image, capture.mimeType)) throw new Error("Capture needs a valid PNG or JPEG image.");
|
|
201
|
+
if (image.length > 10485760 || new TextEncoder().encode(capture.context.content).byteLength > 102400) throw new Error("Capture exceeds the attachment budget.");
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Stages a capture as one image and one context chip in a single store update.
|
|
205
|
+
* Nothing is transported until the reader explicitly submits or queues it.
|
|
206
|
+
*/
|
|
207
|
+
function attachComposerCapture(sessionId, capture) {
|
|
208
|
+
if (sessionId === null) return;
|
|
209
|
+
updateComposerState(sessionId, (state) => {
|
|
210
|
+
if (!isCaptureShape(capture)) return {
|
|
211
|
+
...state,
|
|
212
|
+
attachmentError: "Capture needs a base64 PNG or JPEG image and valid context."
|
|
213
|
+
};
|
|
214
|
+
const { name, content, valid } = contextFields(capture.context);
|
|
215
|
+
if (!valid) return {
|
|
216
|
+
...state,
|
|
217
|
+
attachmentError: "Capture needs a base64 PNG or JPEG image and valid context."
|
|
218
|
+
};
|
|
219
|
+
if (capture.data.length > Math.ceil(10485760 / 3) * 4) return {
|
|
220
|
+
...state,
|
|
221
|
+
attachmentError: `${name} exceeds the 10 MB image limit.`
|
|
222
|
+
};
|
|
223
|
+
const decodedImage = decodeCanonicalBase64(capture.data);
|
|
224
|
+
if (decodedImage === null || !validCaptureDimensions(decodedImage, capture.mimeType)) return {
|
|
225
|
+
...state,
|
|
226
|
+
attachmentError: "Capture needs a base64 PNG or JPEG image and valid context."
|
|
227
|
+
};
|
|
228
|
+
const imageSize = decodedImage.length;
|
|
229
|
+
if (state.attachments.length > 6) return {
|
|
230
|
+
...state,
|
|
231
|
+
attachmentError: `Only ${String(8)} attachments are allowed.`
|
|
232
|
+
};
|
|
233
|
+
if (imageSize > 10485760) return {
|
|
234
|
+
...state,
|
|
235
|
+
attachmentError: `${name} exceeds the 10 MB image limit.`
|
|
236
|
+
};
|
|
237
|
+
if (state.attachments.reduce((total, attachment) => total + (attachment.kind === "image" ? attachment.size : 0), 0) + imageSize > 20971520) return {
|
|
238
|
+
...state,
|
|
239
|
+
attachmentError: `${name} exceeds the 20 MB total image limit.`
|
|
240
|
+
};
|
|
241
|
+
const contextSize = new TextEncoder().encode(content).byteLength;
|
|
242
|
+
if (contextSize > 102400) return {
|
|
243
|
+
...state,
|
|
244
|
+
attachmentError: `${name} exceeds the 100 KB context limit.`
|
|
245
|
+
};
|
|
246
|
+
if (inlineTextBytes(state.attachments) + contextSize > 204800) return {
|
|
247
|
+
...state,
|
|
248
|
+
attachmentError: `${name} exceeds the 200 KB total text limit.`
|
|
249
|
+
};
|
|
250
|
+
const imageId = state.nextAttachmentId;
|
|
251
|
+
const extension = capture.mimeType === "image/png" ? "png" : "jpg";
|
|
252
|
+
return {
|
|
253
|
+
...state,
|
|
254
|
+
attachments: [
|
|
255
|
+
...state.attachments,
|
|
256
|
+
{
|
|
257
|
+
id: `capture-${String(imageId)}`,
|
|
258
|
+
kind: "image",
|
|
259
|
+
name: `${name}.${extension}`,
|
|
260
|
+
size: imageSize,
|
|
261
|
+
dataUrl: `data:${capture.mimeType};base64,${capture.data}`,
|
|
262
|
+
data: capture.data,
|
|
263
|
+
mimeType: capture.mimeType
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: `context-${String(imageId + 1)}`,
|
|
267
|
+
kind: "context",
|
|
268
|
+
name,
|
|
269
|
+
size: contextSize,
|
|
270
|
+
content,
|
|
271
|
+
source: capture.context.source,
|
|
272
|
+
contextId: capture.context.id,
|
|
273
|
+
contextKind: capture.context.kind,
|
|
274
|
+
...capture.context.url === void 0 ? {} : { url: capture.context.url }
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
attachmentError: "",
|
|
278
|
+
nextAttachmentId: imageId + 2
|
|
279
|
+
};
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/** Adds message text as a Markdown blockquote and leaves the caret ready for an instruction. */
|
|
283
|
+
function appendComposerQuote(sessionId, text) {
|
|
284
|
+
const transcript = text.trim().replace(/\r\n?/g, "\n");
|
|
285
|
+
if (sessionId === null || transcript === "") return null;
|
|
286
|
+
let caret = 0;
|
|
287
|
+
updateComposerState(sessionId, (state) => {
|
|
288
|
+
const separator = state.draft === "" ? "" : state.draft.endsWith("\n\n") ? "" : state.draft.endsWith("\n") ? "\n" : "\n\n";
|
|
289
|
+
const quote = transcript.split("\n").map((line) => line === "" ? ">" : `> ${line}`).join("\n");
|
|
290
|
+
const draft = `${state.draft}${separator}${quote}\n\n`;
|
|
291
|
+
caret = draft.length;
|
|
292
|
+
return {
|
|
293
|
+
...state,
|
|
294
|
+
draft,
|
|
295
|
+
caret,
|
|
296
|
+
dismissedToken: null
|
|
297
|
+
};
|
|
298
|
+
});
|
|
299
|
+
return caret;
|
|
300
|
+
}
|
|
301
|
+
/** Empties the composer but keeps the id counter and pending batches, so a batch still uploading lands with a fresh id. */
|
|
302
|
+
function clearComposerState(sessionId) {
|
|
303
|
+
if (sessionId === null) return;
|
|
304
|
+
updateComposerState(sessionId, ({ nextAttachmentId, pendingAttachments }) => ({
|
|
305
|
+
...EMPTY_COMPOSER_SESSION,
|
|
306
|
+
nextAttachmentId,
|
|
307
|
+
pendingAttachments
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
/** A session that left takes its unfinished composer state with it. */
|
|
311
|
+
function dropComposerState(sessionId) {
|
|
312
|
+
composerStore.setState((state) => {
|
|
313
|
+
if (!(sessionId in state)) return state;
|
|
314
|
+
const next = { ...state };
|
|
315
|
+
delete next[sessionId];
|
|
316
|
+
return next;
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
const DRAFT_STORAGE_KEY = "po:composer-drafts";
|
|
320
|
+
/**
|
|
321
|
+
* Holds unsent text across a reload the person did not ask for.
|
|
322
|
+
*
|
|
323
|
+
* A verified bundle update reloads the page underneath whoever is typing, so
|
|
324
|
+
* the text has to outlive the document. Only the draft and the caret travel:
|
|
325
|
+
* attachments carry base64 image payloads that would not fit a storage quota,
|
|
326
|
+
* and re-attaching a file is a smaller loss than losing a written message.
|
|
327
|
+
*/
|
|
328
|
+
function saveComposerDrafts() {
|
|
329
|
+
try {
|
|
330
|
+
const drafts = {};
|
|
331
|
+
for (const [sessionId, state] of Object.entries(composerStore.state)) if (state !== void 0 && state.draft !== "") drafts[sessionId] = {
|
|
332
|
+
draft: state.draft,
|
|
333
|
+
caret: state.caret
|
|
334
|
+
};
|
|
335
|
+
if (Object.keys(drafts).length === 0) window.sessionStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
336
|
+
else window.sessionStorage.setItem(DRAFT_STORAGE_KEY, JSON.stringify(drafts));
|
|
337
|
+
} catch {}
|
|
338
|
+
}
|
|
339
|
+
/** Seeds the store from the last save, then forgets it so a later reload starts clean. */
|
|
340
|
+
function restoreComposerDrafts() {
|
|
341
|
+
let stored;
|
|
342
|
+
try {
|
|
343
|
+
const raw = window.sessionStorage.getItem(DRAFT_STORAGE_KEY);
|
|
344
|
+
window.sessionStorage.removeItem(DRAFT_STORAGE_KEY);
|
|
345
|
+
if (raw === null) return;
|
|
346
|
+
stored = JSON.parse(raw);
|
|
347
|
+
} catch {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (typeof stored !== "object" || stored === null || Array.isArray(stored)) return;
|
|
351
|
+
for (const [sessionId, value] of Object.entries(stored)) {
|
|
352
|
+
if (typeof value !== "object" || value === null) continue;
|
|
353
|
+
const entry = value;
|
|
354
|
+
if (typeof entry.draft !== "string" || entry.draft === "" || !Number.isSafeInteger(entry.caret)) continue;
|
|
355
|
+
const caret = Math.max(0, Math.min(Number(entry.caret), entry.draft.length));
|
|
356
|
+
updateComposerState(sessionId, (state) => ({
|
|
357
|
+
...state,
|
|
358
|
+
draft: entry.draft,
|
|
359
|
+
caret
|
|
360
|
+
}));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/** Test seam. */
|
|
364
|
+
function resetComposerStore() {
|
|
365
|
+
composerStore.setState(() => ({}));
|
|
366
|
+
}
|
|
367
|
+
//#endregion
|
|
368
|
+
export { MAX_COMPOSER_ATTACHMENTS, MAX_COMPOSER_IMAGE_BYTES, MAX_COMPOSER_TEXT_BYTES, MAX_COMPOSER_TOTAL_IMAGE_BYTES, MAX_COMPOSER_TOTAL_TEXT_BYTES, MAX_COMPOSER_UPLOAD_BYTES, appendComposerDraft, appendComposerQuote, attachComposerCapture, attachComposerContext, clearComposerState, composerStore, dropComposerState, inlineTextBytes, resetComposerStore, restoreComposerDrafts, saveComposerDrafts, tabComposerContext, updateComposerState, useComposerState, validateComposerCapture };
|
|
369
|
+
|
|
370
|
+
//# sourceMappingURL=composerStore.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composerStore.mjs","names":[],"sources":["../../../src/web/stores/composerStore.ts"],"sourcesContent":["import type { ComposerCapture, TransientTab, WebPluginContextItem } from '@agimon-ai/po-core/web';\nimport { useStore } from '@tanstack/react-store';\nimport { Store } from '@tanstack/store';\n\nexport interface ComposerImageAttachment {\n id: string;\n kind: 'image';\n name: string;\n size: number;\n dataUrl: string;\n data: string;\n mimeType: string;\n /** Where the host stored a copy, when the best-effort upload succeeded. */\n path?: string;\n}\n\nexport interface ComposerTextAttachment {\n id: string;\n kind: 'text';\n name: string;\n size: number;\n content: string;\n /** Where the host stored a copy, when the best-effort upload succeeded. */\n path?: string;\n}\n\n/** Any other file: stored on the host and referenced by path, never inlined. */\nexport interface ComposerFileAttachment {\n id: string;\n kind: 'file';\n name: string;\n size: number;\n mimeType: string;\n path: string;\n}\n\nexport interface ComposerContextAttachment {\n id: string;\n kind: 'context';\n name: string;\n size: number;\n content: string;\n source: string;\n contextId: string;\n contextKind: string;\n url?: string;\n}\n\nexport type ComposerAttachment =\n | ComposerContextAttachment\n | ComposerFileAttachment\n | ComposerImageAttachment\n | ComposerTextAttachment;\n\nexport const MAX_COMPOSER_ATTACHMENTS = 8;\nexport const MAX_COMPOSER_IMAGE_BYTES = 10 * 1024 * 1024;\nexport const MAX_COMPOSER_TOTAL_IMAGE_BYTES = 20 * 1024 * 1024;\nexport const MAX_COMPOSER_TEXT_BYTES = 100 * 1024;\nexport const MAX_COMPOSER_TOTAL_TEXT_BYTES = 200 * 1024;\n/** The host's upload limit for one stored attachment. */\nexport const MAX_COMPOSER_UPLOAD_BYTES = 8 * 1024 * 1024;\n\n/** Bytes counted against the inline text budget: stored files and images travel separately. */\nexport function inlineTextBytes(attachments: ComposerAttachment[]): number {\n return attachments.reduce(\n (total, attachment) => total + (attachment.kind === 'text' || attachment.kind === 'context' ? attachment.size : 0),\n 0,\n );\n}\n\nexport interface ComposerSessionState {\n draft: string;\n caret: number;\n dismissedToken: number | null;\n attachments: ComposerAttachment[];\n attachmentError: string;\n nextAttachmentId: number;\n /** File batches still being read or uploaded; sending waits until they are staged. */\n pendingAttachments: number;\n}\n\ntype ComposerState = Partial<Record<string, ComposerSessionState>>;\n\nconst EMPTY_COMPOSER_SESSION: ComposerSessionState = {\n draft: '',\n caret: 0,\n dismissedToken: null,\n attachments: [],\n attachmentError: '',\n nextAttachmentId: 0,\n pendingAttachments: 0,\n};\n\n/** Browser-only composer state, retained independently for each live session. */\nexport const composerStore = new Store<ComposerState>({});\n\nfunction composerStateOf(state: ComposerState, sessionId: string | null): ComposerSessionState {\n return (sessionId === null ? undefined : state[sessionId]) ?? EMPTY_COMPOSER_SESSION;\n}\n\nexport function useComposerState(sessionId: string | null): ComposerSessionState {\n return useStore(composerStore, (state) => composerStateOf(state, sessionId));\n}\n\nexport function updateComposerState(\n sessionId: string | null,\n update: (state: ComposerSessionState) => ComposerSessionState,\n): void {\n if (sessionId === null) return;\n composerStore.setState((state) => ({ ...state, [sessionId]: update(composerStateOf(state, sessionId)) }));\n}\n\n/** Appends non-empty text to the latest draft for one session. */\nexport function appendComposerDraft(sessionId: string | null, text: string): void {\n const transcript = text.trim();\n if (sessionId === null || transcript === '') return;\n updateComposerState(sessionId, (state) => {\n const separator = state.draft === '' || /\\s$/.test(state.draft) ? '' : ' ';\n const draft = `${state.draft}${separator}${transcript}`;\n return { ...state, draft, caret: draft.length, dismissedToken: null };\n });\n}\n\nfunction contextFields(item: WebPluginContextItem): { name: string; content: string; valid: boolean } {\n const name = item.label\n .trim()\n .replace(/[\\r\\n]+/g, ' ')\n .slice(0, 200);\n const content = item.content.trim();\n return {\n name,\n content,\n valid:\n item.kind.trim() !== '' && item.source.trim() !== '' && item.id.trim() !== '' && name !== '' && content !== '',\n };\n}\n\n/** The open tab's context for one message. Slash commands, invalid items and failing reads send without it. */\nexport function tabComposerContext(\n read: TransientTab['composerContext'],\n sessionId: string,\n draft: string,\n): WebPluginContextItem | undefined {\n // A slash command is an action: appended text would become its arguments (builtinCommandFrame).\n if (read === undefined || draft.trim().startsWith('/')) return undefined;\n let item: WebPluginContextItem | undefined;\n try {\n item = read(sessionId);\n } catch {\n return undefined; // Documented fallback: a plugin bug must not block the user's message.\n }\n if (item === undefined) return undefined;\n const { name, content, valid } = contextFields(item);\n if (!valid || new TextEncoder().encode(content).byteLength > MAX_COMPOSER_TEXT_BYTES) return undefined;\n return { ...item, label: name, content };\n}\n\nfunction isCaptureShape(capture: ComposerCapture): boolean {\n const context: unknown = capture.context;\n if (typeof capture.data !== 'string' || (capture.mimeType !== 'image/png' && capture.mimeType !== 'image/jpeg')) {\n return false;\n }\n if (typeof context !== 'object' || context === null || Array.isArray(context)) return false;\n const item = context as Record<string, unknown>;\n return (\n typeof item.kind === 'string' &&\n typeof item.source === 'string' &&\n typeof item.id === 'string' &&\n typeof item.label === 'string' &&\n typeof item.content === 'string' &&\n (item.url === undefined || typeof item.url === 'string')\n );\n}\n\nconst MAX_COMPOSER_CAPTURE_DIMENSION = 1600;\n\nfunction decodeCanonicalBase64(data: string): string | null {\n if (data === '' || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(data)) return null;\n try {\n const decoded = atob(data);\n return btoa(decoded) === data ? decoded : null;\n } catch {\n return null;\n }\n}\n\nfunction uint16(binary: string, offset: number): number {\n return binary.charCodeAt(offset) * 0x100 + binary.charCodeAt(offset + 1);\n}\n\nfunction uint32(binary: string, offset: number): number {\n return (\n binary.charCodeAt(offset) * 0x1000000 +\n binary.charCodeAt(offset + 1) * 0x10000 +\n binary.charCodeAt(offset + 2) * 0x100 +\n binary.charCodeAt(offset + 3)\n );\n}\n\nfunction pngDimensions(binary: string): { width: number; height: number } | null {\n const signature = '\\x89PNG\\r\\n\\x1a\\n';\n if (binary.length < 24 || !binary.startsWith(signature) || binary.slice(12, 16) !== 'IHDR') return null;\n return { width: uint32(binary, 16), height: uint32(binary, 20) };\n}\n\nfunction jpegDimensions(binary: string): { width: number; height: number } | null {\n if (\n binary.length < 4 ||\n binary.charCodeAt(0) !== 0xff ||\n binary.charCodeAt(1) !== 0xd8 ||\n binary.charCodeAt(2) !== 0xff\n ) {\n return null;\n }\n const startOfFrameMarkers = new Set([0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf]);\n let offset = 2;\n while (offset < binary.length) {\n if (binary.charCodeAt(offset) !== 0xff) return null;\n while (binary.charCodeAt(offset) === 0xff) offset += 1;\n if (offset >= binary.length) return null;\n const marker = binary.charCodeAt(offset);\n offset += 1;\n if (marker === 0xd9 || marker === 0xda) return null;\n if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd8)) continue;\n if (offset + 2 > binary.length) return null;\n const segmentLength = uint16(binary, offset);\n if (segmentLength < 2 || offset + segmentLength > binary.length) return null;\n if (startOfFrameMarkers.has(marker)) {\n if (segmentLength < 7) return null;\n return { width: uint16(binary, offset + 5), height: uint16(binary, offset + 3) };\n }\n offset += segmentLength;\n }\n return null;\n}\n\nfunction validCaptureDimensions(binary: string, mimeType: ComposerCapture['mimeType']): boolean {\n const dimensions = mimeType === 'image/png' ? pngDimensions(binary) : jpegDimensions(binary);\n return (\n dimensions !== null &&\n dimensions.width > 0 &&\n dimensions.height > 0 &&\n dimensions.width <= MAX_COMPOSER_CAPTURE_DIMENSION &&\n dimensions.height <= MAX_COMPOSER_CAPTURE_DIMENSION\n );\n}\n\n/** Adds structured plugin context without changing the visible composer draft. */\nexport function attachComposerContext(sessionId: string | null, item: WebPluginContextItem): void {\n if (sessionId === null) return;\n const { name, content, valid } = contextFields(item);\n updateComposerState(sessionId, (state) => {\n if (!valid) {\n return { ...state, attachmentError: 'Context needs a source, id, label, and content.' };\n }\n if (state.attachments.length >= MAX_COMPOSER_ATTACHMENTS) {\n return { ...state, attachmentError: `Only ${String(MAX_COMPOSER_ATTACHMENTS)} attachments are allowed.` };\n }\n const size = new TextEncoder().encode(content).byteLength;\n if (size > MAX_COMPOSER_TEXT_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 100 KB context limit.` };\n }\n const textBytes = inlineTextBytes(state.attachments);\n if (textBytes + size > MAX_COMPOSER_TOTAL_TEXT_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 200 KB total text limit.` };\n }\n return {\n ...state,\n attachments: [\n ...state.attachments,\n {\n id: `context-${String(state.nextAttachmentId)}`,\n kind: 'context',\n name,\n size,\n content,\n source: item.source,\n contextId: item.id,\n contextKind: item.kind,\n ...(item.url === undefined ? {} : { url: item.url }),\n },\n ],\n attachmentError: '',\n nextAttachmentId: state.nextAttachmentId + 1,\n };\n });\n}\n\n/** Validates a standalone capture without reading or changing the composer. */\nexport function validateComposerCapture(capture: ComposerCapture): void {\n if (!isCaptureShape(capture) || !contextFields(capture.context).valid) {\n throw new Error('Capture needs a base64 PNG or JPEG image and valid context.');\n }\n if (capture.data.length > Math.ceil(MAX_COMPOSER_IMAGE_BYTES / 3) * 4) {\n throw new Error('Capture exceeds the 10 MB image limit.');\n }\n const image = decodeCanonicalBase64(capture.data);\n if (image === null || !validCaptureDimensions(image, capture.mimeType)) {\n throw new Error('Capture needs a valid PNG or JPEG image.');\n }\n if (\n image.length > MAX_COMPOSER_IMAGE_BYTES ||\n new TextEncoder().encode(capture.context.content).byteLength > MAX_COMPOSER_TEXT_BYTES\n ) {\n throw new Error('Capture exceeds the attachment budget.');\n }\n}\n\n/**\n * Stages a capture as one image and one context chip in a single store update.\n * Nothing is transported until the reader explicitly submits or queues it.\n */\nexport function attachComposerCapture(sessionId: string | null, capture: ComposerCapture): void {\n if (sessionId === null) return;\n updateComposerState(sessionId, (state) => {\n if (!isCaptureShape(capture)) {\n return { ...state, attachmentError: 'Capture needs a base64 PNG or JPEG image and valid context.' };\n }\n const { name, content, valid } = contextFields(capture.context);\n if (!valid) {\n return { ...state, attachmentError: 'Capture needs a base64 PNG or JPEG image and valid context.' };\n }\n if (capture.data.length > Math.ceil(MAX_COMPOSER_IMAGE_BYTES / 3) * 4) {\n return { ...state, attachmentError: `${name} exceeds the 10 MB image limit.` };\n }\n const decodedImage = decodeCanonicalBase64(capture.data);\n if (decodedImage === null || !validCaptureDimensions(decodedImage, capture.mimeType)) {\n return { ...state, attachmentError: 'Capture needs a base64 PNG or JPEG image and valid context.' };\n }\n const imageSize = decodedImage.length;\n if (state.attachments.length > MAX_COMPOSER_ATTACHMENTS - 2) {\n return { ...state, attachmentError: `Only ${String(MAX_COMPOSER_ATTACHMENTS)} attachments are allowed.` };\n }\n if (imageSize > MAX_COMPOSER_IMAGE_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 10 MB image limit.` };\n }\n const imageBytes = state.attachments.reduce(\n (total, attachment) => total + (attachment.kind === 'image' ? attachment.size : 0),\n 0,\n );\n if (imageBytes + imageSize > MAX_COMPOSER_TOTAL_IMAGE_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 20 MB total image limit.` };\n }\n const contextSize = new TextEncoder().encode(content).byteLength;\n if (contextSize > MAX_COMPOSER_TEXT_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 100 KB context limit.` };\n }\n const textBytes = inlineTextBytes(state.attachments);\n if (textBytes + contextSize > MAX_COMPOSER_TOTAL_TEXT_BYTES) {\n return { ...state, attachmentError: `${name} exceeds the 200 KB total text limit.` };\n }\n\n const imageId = state.nextAttachmentId;\n const extension = capture.mimeType === 'image/png' ? 'png' : 'jpg';\n return {\n ...state,\n attachments: [\n ...state.attachments,\n {\n id: `capture-${String(imageId)}`,\n kind: 'image',\n name: `${name}.${extension}`,\n size: imageSize,\n dataUrl: `data:${capture.mimeType};base64,${capture.data}`,\n data: capture.data,\n mimeType: capture.mimeType,\n },\n {\n id: `context-${String(imageId + 1)}`,\n kind: 'context',\n name,\n size: contextSize,\n content,\n source: capture.context.source,\n contextId: capture.context.id,\n contextKind: capture.context.kind,\n ...(capture.context.url === undefined ? {} : { url: capture.context.url }),\n },\n ],\n attachmentError: '',\n nextAttachmentId: imageId + 2,\n };\n });\n}\n/** Adds message text as a Markdown blockquote and leaves the caret ready for an instruction. */\nexport function appendComposerQuote(sessionId: string | null, text: string): number | null {\n const transcript = text.trim().replace(/\\r\\n?/g, '\\n');\n if (sessionId === null || transcript === '') return null;\n let caret = 0;\n updateComposerState(sessionId, (state) => {\n const separator =\n state.draft === '' ? '' : state.draft.endsWith('\\n\\n') ? '' : state.draft.endsWith('\\n') ? '\\n' : '\\n\\n';\n const quote = transcript\n .split('\\n')\n .map((line) => (line === '' ? '>' : `> ${line}`))\n .join('\\n');\n const draft = `${state.draft}${separator}${quote}\\n\\n`;\n caret = draft.length;\n return { ...state, draft, caret, dismissedToken: null };\n });\n return caret;\n}\n\n/** Empties the composer but keeps the id counter and pending batches, so a batch still uploading lands with a fresh id. */\nexport function clearComposerState(sessionId: string | null): void {\n if (sessionId === null) return;\n updateComposerState(sessionId, ({ nextAttachmentId, pendingAttachments }) => ({\n ...EMPTY_COMPOSER_SESSION,\n nextAttachmentId,\n pendingAttachments,\n }));\n}\n\n/** A session that left takes its unfinished composer state with it. */\nexport function dropComposerState(sessionId: string): void {\n composerStore.setState((state) => {\n if (!(sessionId in state)) return state;\n const next = { ...state };\n delete next[sessionId];\n return next;\n });\n}\n\nconst DRAFT_STORAGE_KEY = 'po:composer-drafts';\n\ninterface StoredDraft {\n draft: string;\n caret: number;\n}\n\n/**\n * Holds unsent text across a reload the person did not ask for.\n *\n * A verified bundle update reloads the page underneath whoever is typing, so\n * the text has to outlive the document. Only the draft and the caret travel:\n * attachments carry base64 image payloads that would not fit a storage quota,\n * and re-attaching a file is a smaller loss than losing a written message.\n */\nexport function saveComposerDrafts(): void {\n try {\n const drafts: Record<string, StoredDraft> = {};\n for (const [sessionId, state] of Object.entries(composerStore.state)) {\n if (state !== undefined && state.draft !== '') drafts[sessionId] = { draft: state.draft, caret: state.caret };\n }\n if (Object.keys(drafts).length === 0) window.sessionStorage.removeItem(DRAFT_STORAGE_KEY);\n else window.sessionStorage.setItem(DRAFT_STORAGE_KEY, JSON.stringify(drafts));\n } catch {\n // Losing a draft is not worth breaking the reload that was already decided.\n }\n}\n\n/** Seeds the store from the last save, then forgets it so a later reload starts clean. */\nexport function restoreComposerDrafts(): void {\n let stored: unknown;\n try {\n const raw = window.sessionStorage.getItem(DRAFT_STORAGE_KEY);\n window.sessionStorage.removeItem(DRAFT_STORAGE_KEY);\n if (raw === null) return;\n stored = JSON.parse(raw);\n } catch {\n return;\n }\n if (typeof stored !== 'object' || stored === null || Array.isArray(stored)) return;\n for (const [sessionId, value] of Object.entries(stored as Record<string, unknown>)) {\n if (typeof value !== 'object' || value === null) continue;\n const entry = value as Record<string, unknown>;\n if (typeof entry.draft !== 'string' || entry.draft === '' || !Number.isSafeInteger(entry.caret)) continue;\n const caret = Math.max(0, Math.min(Number(entry.caret), entry.draft.length));\n updateComposerState(sessionId, (state) => ({ ...state, draft: entry.draft as string, caret }));\n }\n}\n\n/** Test seam. */\nexport function resetComposerStore(): void {\n composerStore.setState(() => ({}));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const require_composerSubmissions = require("../lib/composerSubmissions.cjs");
|
|
2
|
+
const require_composerStore = require("./composerStore.cjs");
|
|
3
|
+
const require_sessionsStore = require("./sessionsStore.cjs");
|
|
4
|
+
const require_sessionStore = require("./sessionStore.cjs");
|
|
5
|
+
//#region src/web/stores/composerSubmissionStore.ts
|
|
6
|
+
/** Admission belongs to the session, not to whichever template currently shows its composer. */
|
|
7
|
+
const composerSubmissionStore = new (require("@tanstack/store")).Store(/* @__PURE__ */ new Set());
|
|
8
|
+
function toolPathHint(path) {
|
|
9
|
+
return `To send it to a tool's file parameter, pass {"path": ${JSON.stringify(path)}}.`;
|
|
10
|
+
}
|
|
11
|
+
function attachmentPrompt(draft, attachments, tabContext) {
|
|
12
|
+
const parts = [];
|
|
13
|
+
const trimmed = draft.trim();
|
|
14
|
+
if (trimmed) parts.push(trimmed);
|
|
15
|
+
for (const attachment of attachments) {
|
|
16
|
+
if (attachment.kind === "image") continue;
|
|
17
|
+
const safeName = attachment.name.replace(/[\r\n]/g, " ").slice(0, 200);
|
|
18
|
+
if (attachment.kind === "file") {
|
|
19
|
+
parts.push(`Attached file "${safeName}" (${attachment.mimeType}, ${String(attachment.size)} bytes) saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
parts.push(attachment.kind === "context" ? `Referenced context "${safeName}":\n\n${attachment.content}` : `Attached file "${safeName}":\n\n${attachment.content}`);
|
|
23
|
+
if (attachment.kind === "text" && attachment.path !== void 0) parts.push(`"${safeName}" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
24
|
+
}
|
|
25
|
+
if (parts.length === 0 && attachments.some((attachment) => attachment.kind === "image")) parts.push("Please review the attached image.");
|
|
26
|
+
for (const attachment of attachments) {
|
|
27
|
+
if (attachment.kind !== "image" || attachment.path === void 0) continue;
|
|
28
|
+
const safeName = attachment.name.replace(/[\r\n]/g, " ").slice(0, 200);
|
|
29
|
+
parts.push(`Attached image "${safeName}" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
30
|
+
}
|
|
31
|
+
if (tabContext !== void 0) parts.push(`Referenced context "${tabContext.label}":\n\n${tabContext.content}`);
|
|
32
|
+
return parts.join("\n\n");
|
|
33
|
+
}
|
|
34
|
+
/** Reads the latest draft and claims admission synchronously, including across a dashboard remount. */
|
|
35
|
+
async function submitComposerDraft(sessionId, delivery, composerContext) {
|
|
36
|
+
if (sessionId === null || composerSubmissionStore.state.has(sessionId)) return false;
|
|
37
|
+
const meta = require_sessionsStore.sessionsStore.state.byId[sessionId];
|
|
38
|
+
const draft = require_composerStore.composerStore.state[sessionId];
|
|
39
|
+
if (!draft || draft.pendingAttachments > 0 || !draft.draft.trim() && draft.attachments.length === 0 || meta?.attach !== "attached" || meta.summary.dormant) return false;
|
|
40
|
+
composerSubmissionStore.setState((pending) => /* @__PURE__ */ new Set([...pending, sessionId]));
|
|
41
|
+
try {
|
|
42
|
+
const tabContext = require_composerStore.tabComposerContext(composerContext, sessionId, draft.draft);
|
|
43
|
+
const message = attachmentPrompt(draft.draft, draft.attachments, tabContext);
|
|
44
|
+
const images = draft.attachments.filter((attachment) => attachment.kind === "image").map(({ data, mimeType }) => ({
|
|
45
|
+
type: "image",
|
|
46
|
+
data,
|
|
47
|
+
mimeType
|
|
48
|
+
}));
|
|
49
|
+
const contextItems = draft.attachments.flatMap((attachment) => attachment.kind === "context" ? [{
|
|
50
|
+
kind: attachment.contextKind,
|
|
51
|
+
source: attachment.source,
|
|
52
|
+
id: attachment.contextId,
|
|
53
|
+
label: attachment.name,
|
|
54
|
+
content: attachment.content,
|
|
55
|
+
...attachment.url === void 0 ? {} : { url: attachment.url }
|
|
56
|
+
}] : []);
|
|
57
|
+
if (tabContext !== void 0) contextItems.push(tabContext);
|
|
58
|
+
if (!(delivery === "submit" ? await require_sessionStore.submitMessageWithAck(message, images, sessionId) : await require_sessionStore.queueFollowUpWithAck(message, images, sessionId))) return false;
|
|
59
|
+
require_composerSubmissions.publishComposerSubmission({
|
|
60
|
+
sessionId,
|
|
61
|
+
message,
|
|
62
|
+
delivery,
|
|
63
|
+
submittedAt: Date.now(),
|
|
64
|
+
contextItems
|
|
65
|
+
});
|
|
66
|
+
const current = require_composerStore.composerStore.state[sessionId];
|
|
67
|
+
if (current?.draft === draft.draft && current.attachments === draft.attachments) require_composerStore.clearComposerState(sessionId);
|
|
68
|
+
return true;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
require_sessionStore.applySessionFrame(sessionId, {
|
|
71
|
+
type: "error",
|
|
72
|
+
message: error instanceof Error ? error.message : String(error)
|
|
73
|
+
});
|
|
74
|
+
return false;
|
|
75
|
+
} finally {
|
|
76
|
+
composerSubmissionStore.setState((pending) => {
|
|
77
|
+
const next = new Set(pending);
|
|
78
|
+
next.delete(sessionId);
|
|
79
|
+
return next;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
exports.attachmentPrompt = attachmentPrompt;
|
|
85
|
+
exports.composerSubmissionStore = composerSubmissionStore;
|
|
86
|
+
exports.submitComposerDraft = submitComposerDraft;
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=composerSubmissionStore.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composerSubmissionStore.cjs","names":["Store","sessionsStore","composerStore","tabComposerContext","submitMessageWithAck","queueFollowUpWithAck"],"sources":["../../../src/web/stores/composerSubmissionStore.ts"],"sourcesContent":["import type { TransientTab, WebPluginContextItem } from '@agimon-ai/po-core/web';\nimport { Store } from '@tanstack/store';\n\nimport { publishComposerSubmission } from '../lib/composerSubmissions';\nimport {\n clearComposerState,\n composerStore,\n type ComposerAttachment,\n type ComposerImageAttachment,\n tabComposerContext,\n} from './composerStore';\nimport { sessionsStore } from './sessionsStore';\nimport { applySessionFrame, queueFollowUpWithAck, submitMessageWithAck } from './sessionStore';\n\n/** Admission belongs to the session, not to whichever template currently shows its composer. */\nexport const composerSubmissionStore = new Store<ReadonlySet<string>>(new Set<string>());\n\nfunction toolPathHint(path: string): string {\n return `To send it to a tool's file parameter, pass {\"path\": ${JSON.stringify(path)}}.`;\n}\n\nexport function attachmentPrompt(\n draft: string,\n attachments: ComposerAttachment[],\n tabContext?: WebPluginContextItem,\n): string {\n const parts: string[] = [];\n const trimmed = draft.trim();\n if (trimmed) parts.push(trimmed);\n for (const attachment of attachments) {\n if (attachment.kind === 'image') continue;\n const safeName = attachment.name.replace(/[\\r\\n]/g, ' ').slice(0, 200);\n if (attachment.kind === 'file') {\n parts.push(\n `Attached file \"${safeName}\" (${attachment.mimeType}, ${String(attachment.size)} bytes) saved at ${attachment.path}. ${toolPathHint(attachment.path)}`,\n );\n continue;\n }\n parts.push(\n attachment.kind === 'context'\n ? `Referenced context \"${safeName}\":\\n\\n${attachment.content}`\n : `Attached file \"${safeName}\":\\n\\n${attachment.content}`,\n );\n if (attachment.kind === 'text' && attachment.path !== undefined) {\n parts.push(`\"${safeName}\" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);\n }\n }\n if (parts.length === 0 && attachments.some((attachment) => attachment.kind === 'image')) {\n parts.push('Please review the attached image.');\n }\n for (const attachment of attachments) {\n if (attachment.kind !== 'image' || attachment.path === undefined) continue;\n const safeName = attachment.name.replace(/[\\r\\n]/g, ' ').slice(0, 200);\n parts.push(`Attached image \"${safeName}\" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);\n }\n if (tabContext !== undefined) parts.push(`Referenced context \"${tabContext.label}\":\\n\\n${tabContext.content}`);\n return parts.join('\\n\\n');\n}\n\n/** Reads the latest draft and claims admission synchronously, including across a dashboard remount. */\nexport async function submitComposerDraft(\n sessionId: string | null,\n delivery: 'submit' | 'queue',\n composerContext?: TransientTab['composerContext'],\n): Promise<boolean> {\n if (sessionId === null || composerSubmissionStore.state.has(sessionId)) return false;\n const meta = sessionsStore.state.byId[sessionId];\n const draft = composerStore.state[sessionId];\n if (\n !draft ||\n draft.pendingAttachments > 0 ||\n (!draft.draft.trim() && draft.attachments.length === 0) ||\n meta?.attach !== 'attached' ||\n meta.summary.dormant\n )\n return false;\n\n composerSubmissionStore.setState((pending) => new Set([...pending, sessionId]));\n try {\n const tabContext = tabComposerContext(composerContext, sessionId, draft.draft);\n const message = attachmentPrompt(draft.draft, draft.attachments, tabContext);\n const images = draft.attachments\n .filter((attachment): attachment is ComposerImageAttachment => attachment.kind === 'image')\n .map(({ data, mimeType }) => ({ type: 'image' as const, data, mimeType }));\n const contextItems: WebPluginContextItem[] = draft.attachments.flatMap((attachment) =>\n attachment.kind === 'context'\n ? [\n {\n kind: attachment.contextKind,\n source: attachment.source,\n id: attachment.contextId,\n label: attachment.name,\n content: attachment.content,\n ...(attachment.url === undefined ? {} : { url: attachment.url }),\n },\n ]\n : [],\n );\n if (tabContext !== undefined) contextItems.push(tabContext);\n const accepted =\n delivery === 'submit'\n ? await submitMessageWithAck(message, images, sessionId)\n : await queueFollowUpWithAck(message, images, sessionId);\n if (!accepted) return false;\n publishComposerSubmission({ sessionId, message, delivery, submittedAt: Date.now(), contextItems });\n const current = composerStore.state[sessionId];\n if (current?.draft === draft.draft && current.attachments === draft.attachments) clearComposerState(sessionId);\n return true;\n } catch (error) {\n applySessionFrame(sessionId, { type: 'error', message: error instanceof Error ? error.message : String(error) });\n return false;\n } finally {\n composerSubmissionStore.setState((pending) => {\n const next = new Set(pending);\n next.delete(sessionId);\n return next;\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ComposerAttachment } from "./composerStore.mjs";
|
|
2
|
+
import { TransientTab, WebPluginContextItem } from "@agimon-ai/po-core/web";
|
|
3
|
+
import { Store } from "@tanstack/store";
|
|
4
|
+
//#region src/web/stores/composerSubmissionStore.d.ts
|
|
5
|
+
/** Admission belongs to the session, not to whichever template currently shows its composer. */
|
|
6
|
+
export declare const composerSubmissionStore: Store<ReadonlySet<string>, never>;
|
|
7
|
+
export declare function attachmentPrompt(draft: string, attachments: ComposerAttachment[], tabContext?: WebPluginContextItem): string;
|
|
8
|
+
/** Reads the latest draft and claims admission synchronously, including across a dashboard remount. */
|
|
9
|
+
export declare function submitComposerDraft(sessionId: string | null, delivery: 'submit' | 'queue', composerContext?: TransientTab['composerContext']): Promise<boolean>;
|
|
10
|
+
//#endregion
|
|
11
|
+
//# sourceMappingURL=composerSubmissionStore.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composerSubmissionStore.d.mts","names":[],"sources":["../../../src/web/stores/composerSubmissionStore.ts"],"mappings":";;;;;qBAea,yBAAuB,MAAA;wBAMpB,iBACd,eACA,aAAa,sBACb,aAAa;;wBAoCO,oBACpB,0BACA,8BACA,kBAAkB,kCACjB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { publishComposerSubmission } from "../lib/composerSubmissions.mjs";
|
|
2
|
+
import { clearComposerState, composerStore, tabComposerContext } from "./composerStore.mjs";
|
|
3
|
+
import { sessionsStore } from "./sessionsStore.mjs";
|
|
4
|
+
import { applySessionFrame, queueFollowUpWithAck, submitMessageWithAck } from "./sessionStore.mjs";
|
|
5
|
+
import { Store } from "@tanstack/store";
|
|
6
|
+
//#region src/web/stores/composerSubmissionStore.ts
|
|
7
|
+
/** Admission belongs to the session, not to whichever template currently shows its composer. */
|
|
8
|
+
const composerSubmissionStore = new Store(/* @__PURE__ */ new Set());
|
|
9
|
+
function toolPathHint(path) {
|
|
10
|
+
return `To send it to a tool's file parameter, pass {"path": ${JSON.stringify(path)}}.`;
|
|
11
|
+
}
|
|
12
|
+
function attachmentPrompt(draft, attachments, tabContext) {
|
|
13
|
+
const parts = [];
|
|
14
|
+
const trimmed = draft.trim();
|
|
15
|
+
if (trimmed) parts.push(trimmed);
|
|
16
|
+
for (const attachment of attachments) {
|
|
17
|
+
if (attachment.kind === "image") continue;
|
|
18
|
+
const safeName = attachment.name.replace(/[\r\n]/g, " ").slice(0, 200);
|
|
19
|
+
if (attachment.kind === "file") {
|
|
20
|
+
parts.push(`Attached file "${safeName}" (${attachment.mimeType}, ${String(attachment.size)} bytes) saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
parts.push(attachment.kind === "context" ? `Referenced context "${safeName}":\n\n${attachment.content}` : `Attached file "${safeName}":\n\n${attachment.content}`);
|
|
24
|
+
if (attachment.kind === "text" && attachment.path !== void 0) parts.push(`"${safeName}" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
25
|
+
}
|
|
26
|
+
if (parts.length === 0 && attachments.some((attachment) => attachment.kind === "image")) parts.push("Please review the attached image.");
|
|
27
|
+
for (const attachment of attachments) {
|
|
28
|
+
if (attachment.kind !== "image" || attachment.path === void 0) continue;
|
|
29
|
+
const safeName = attachment.name.replace(/[\r\n]/g, " ").slice(0, 200);
|
|
30
|
+
parts.push(`Attached image "${safeName}" is also saved at ${attachment.path}. ${toolPathHint(attachment.path)}`);
|
|
31
|
+
}
|
|
32
|
+
if (tabContext !== void 0) parts.push(`Referenced context "${tabContext.label}":\n\n${tabContext.content}`);
|
|
33
|
+
return parts.join("\n\n");
|
|
34
|
+
}
|
|
35
|
+
/** Reads the latest draft and claims admission synchronously, including across a dashboard remount. */
|
|
36
|
+
async function submitComposerDraft(sessionId, delivery, composerContext) {
|
|
37
|
+
if (sessionId === null || composerSubmissionStore.state.has(sessionId)) return false;
|
|
38
|
+
const meta = sessionsStore.state.byId[sessionId];
|
|
39
|
+
const draft = composerStore.state[sessionId];
|
|
40
|
+
if (!draft || draft.pendingAttachments > 0 || !draft.draft.trim() && draft.attachments.length === 0 || meta?.attach !== "attached" || meta.summary.dormant) return false;
|
|
41
|
+
composerSubmissionStore.setState((pending) => /* @__PURE__ */ new Set([...pending, sessionId]));
|
|
42
|
+
try {
|
|
43
|
+
const tabContext = tabComposerContext(composerContext, sessionId, draft.draft);
|
|
44
|
+
const message = attachmentPrompt(draft.draft, draft.attachments, tabContext);
|
|
45
|
+
const images = draft.attachments.filter((attachment) => attachment.kind === "image").map(({ data, mimeType }) => ({
|
|
46
|
+
type: "image",
|
|
47
|
+
data,
|
|
48
|
+
mimeType
|
|
49
|
+
}));
|
|
50
|
+
const contextItems = draft.attachments.flatMap((attachment) => attachment.kind === "context" ? [{
|
|
51
|
+
kind: attachment.contextKind,
|
|
52
|
+
source: attachment.source,
|
|
53
|
+
id: attachment.contextId,
|
|
54
|
+
label: attachment.name,
|
|
55
|
+
content: attachment.content,
|
|
56
|
+
...attachment.url === void 0 ? {} : { url: attachment.url }
|
|
57
|
+
}] : []);
|
|
58
|
+
if (tabContext !== void 0) contextItems.push(tabContext);
|
|
59
|
+
if (!(delivery === "submit" ? await submitMessageWithAck(message, images, sessionId) : await queueFollowUpWithAck(message, images, sessionId))) return false;
|
|
60
|
+
publishComposerSubmission({
|
|
61
|
+
sessionId,
|
|
62
|
+
message,
|
|
63
|
+
delivery,
|
|
64
|
+
submittedAt: Date.now(),
|
|
65
|
+
contextItems
|
|
66
|
+
});
|
|
67
|
+
const current = composerStore.state[sessionId];
|
|
68
|
+
if (current?.draft === draft.draft && current.attachments === draft.attachments) clearComposerState(sessionId);
|
|
69
|
+
return true;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
applySessionFrame(sessionId, {
|
|
72
|
+
type: "error",
|
|
73
|
+
message: error instanceof Error ? error.message : String(error)
|
|
74
|
+
});
|
|
75
|
+
return false;
|
|
76
|
+
} finally {
|
|
77
|
+
composerSubmissionStore.setState((pending) => {
|
|
78
|
+
const next = new Set(pending);
|
|
79
|
+
next.delete(sessionId);
|
|
80
|
+
return next;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { attachmentPrompt, composerSubmissionStore, submitComposerDraft };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=composerSubmissionStore.mjs.map
|