@jingyi0605/codingns4dsh 0.2.1-beta.9 → 0.2.1-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +10 -6
- package/README.md +12 -9
- package/assets/provider-icons/magpie.png +0 -0
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts.map +1 -1
- package/data/build/dist/client/account-bar.d.ts.map +1 -1
- package/data/build/dist/client/account-bar.js +24 -70
- package/data/build/dist/client/account-bar.js.map +1 -1
- package/data/build/dist/client/adapter-catalog-watch.d.ts +10 -2
- package/data/build/dist/client/adapter-catalog-watch.d.ts.map +1 -1
- package/data/build/dist/client/adapter-catalog-watch.js +16 -4
- package/data/build/dist/client/adapter-catalog-watch.js.map +1 -1
- package/data/build/dist/client/bundle.js +55627 -31591
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-management-dialog.d.ts +21 -0
- package/data/build/dist/client/cli-management-dialog.d.ts.map +1 -0
- package/data/build/dist/client/cli-management-dialog.js +215 -0
- package/data/build/dist/client/cli-management-dialog.js.map +1 -0
- package/data/build/dist/client/cli-management-terminal.d.ts +9 -0
- package/data/build/dist/client/cli-management-terminal.d.ts.map +1 -0
- package/data/build/dist/client/cli-management-terminal.js +30 -0
- package/data/build/dist/client/cli-management-terminal.js.map +1 -0
- package/data/build/dist/client/cli-settings-dialog.d.ts +9 -0
- package/data/build/dist/client/cli-settings-dialog.d.ts.map +1 -0
- package/data/build/dist/client/cli-settings-dialog.js +45 -0
- package/data/build/dist/client/cli-settings-dialog.js.map +1 -0
- package/data/build/dist/client/cli-settings-rpc.js +1 -1
- package/data/build/dist/client/cli-settings-rpc.js.map +1 -1
- package/data/build/dist/client/cli-slots.d.ts +17 -3
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +300 -41
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.assistant-configuration-view.js +4 -3
- package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -1
- package/data/build/dist/client/client.delegate-command.js +44 -26
- package/data/build/dist/client/client.delegate-command.js.map +1 -1
- package/data/build/dist/client/client.editor-engine.js +4 -1
- package/data/build/dist/client/client.editor-engine.js.map +1 -1
- package/data/build/dist/client/{client.model-catalog-cache.js → client.magpie-model-tag.js} +393 -14
- package/data/build/dist/client/client.magpie-model-tag.js.map +1 -0
- package/data/build/dist/client/client.moss-voice-output.js +415 -0
- package/data/build/dist/client/client.moss-voice-output.js.map +1 -0
- package/data/build/dist/client/client.native-workspace-store.js +91 -15
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.primitives-adapter.js +128 -0
- package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
- package/data/build/dist/client/client.react-dom.js +0 -404
- package/data/build/dist/client/client.react-dom.js.map +1 -1
- package/data/build/dist/client/client.session-translation.js +121 -2
- package/data/build/dist/client/client.session-translation.js.map +1 -1
- package/data/build/dist/client/client.transport.js +1415 -57
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/conversation-translation-settings.d.ts +11 -0
- package/data/build/dist/client/conversation-translation-settings.d.ts.map +1 -0
- package/data/build/dist/client/conversation-translation-settings.js +54 -0
- package/data/build/dist/client/conversation-translation-settings.js.map +1 -0
- package/data/build/dist/client/delegate-command.d.ts.map +1 -1
- package/data/build/dist/client/delegate-command.js +36 -7
- package/data/build/dist/client/delegate-command.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +1948 -494
- package/data/build/dist/client/editor-engine.d.ts +1 -1
- package/data/build/dist/client/editor-engine.d.ts.map +1 -1
- package/data/build/dist/client/editor-engine.js +4 -1
- package/data/build/dist/client/editor-engine.js.map +1 -1
- package/data/build/dist/client/feature-requirement.d.ts +43 -0
- package/data/build/dist/client/feature-requirement.d.ts.map +1 -0
- package/data/build/dist/client/feature-requirement.js +105 -0
- package/data/build/dist/client/feature-requirement.js.map +1 -0
- package/data/build/dist/client/features/cli-adapters.d.ts +3 -1
- package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
- package/data/build/dist/client/features/cli-adapters.js +207 -112
- package/data/build/dist/client/features/cli-adapters.js.map +1 -1
- package/data/build/dist/client/features/file-management.d.ts.map +1 -1
- package/data/build/dist/client/features/file-management.js +18 -0
- package/data/build/dist/client/features/file-management.js.map +1 -1
- package/data/build/dist/client/features/index.d.ts +1 -0
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +5 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/lan-access-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/lan-access-panel.js +1 -0
- package/data/build/dist/client/features/lan-access-panel.js.map +1 -1
- package/data/build/dist/client/features/magpie-management-controls.d.ts +46 -0
- package/data/build/dist/client/features/magpie-management-controls.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management-controls.js +759 -0
- package/data/build/dist/client/features/magpie-management-controls.js.map +1 -0
- package/data/build/dist/client/features/magpie-management-page.d.ts +124 -0
- package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management-page.js +1256 -0
- package/data/build/dist/client/features/magpie-management-page.js.map +1 -0
- package/data/build/dist/client/features/magpie-management.d.ts +7 -0
- package/data/build/dist/client/features/magpie-management.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management.js +154 -0
- package/data/build/dist/client/features/magpie-management.js.map +1 -0
- package/data/build/dist/client/features/magpie-mark.d.ts +10 -0
- package/data/build/dist/client/features/magpie-mark.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-mark.js +21 -0
- package/data/build/dist/client/features/magpie-mark.js.map +1 -0
- package/data/build/dist/client/features/magpie-provider-logo.d.ts +11 -0
- package/data/build/dist/client/features/magpie-provider-logo.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-provider-logo.js +35 -0
- package/data/build/dist/client/features/magpie-provider-logo.js.map +1 -0
- package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access.js +7 -0
- package/data/build/dist/client/features/mobile-access.js.map +1 -1
- package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/client/features/peer-host.js +6 -0
- package/data/build/dist/client/features/peer-host.js.map +1 -1
- package/data/build/dist/client/features/quick-apps.d.ts +3 -0
- package/data/build/dist/client/features/quick-apps.d.ts.map +1 -0
- package/data/build/dist/client/features/quick-apps.js +14 -0
- package/data/build/dist/client/features/quick-apps.js.map +1 -0
- package/data/build/dist/client/features/session-translation.d.ts.map +1 -1
- package/data/build/dist/client/features/session-translation.js +50 -49
- package/data/build/dist/client/features/session-translation.js.map +1 -1
- package/data/build/dist/client/features/subscription-quota-groups.d.ts +193 -0
- package/data/build/dist/client/features/subscription-quota-groups.d.ts.map +1 -0
- package/data/build/dist/client/features/subscription-quota-groups.js +548 -0
- package/data/build/dist/client/features/subscription-quota-groups.js.map +1 -0
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.js +6 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
- package/data/build/dist/client/file-management-dom.d.ts +20 -1
- package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
- package/data/build/dist/client/file-management-dom.js +94 -18
- package/data/build/dist/client/file-management-dom.js.map +1 -1
- package/data/build/dist/client/file-viewer-copy-path-menu.d.ts +27 -0
- package/data/build/dist/client/file-viewer-copy-path-menu.d.ts.map +1 -0
- package/data/build/dist/client/file-viewer-copy-path-menu.js +101 -0
- package/data/build/dist/client/file-viewer-copy-path-menu.js.map +1 -0
- package/data/build/dist/client/git-management-settings.d.ts +4 -0
- package/data/build/dist/client/git-management-settings.d.ts.map +1 -0
- package/data/build/dist/client/git-management-settings.js +73 -0
- package/data/build/dist/client/git-management-settings.js.map +1 -0
- package/data/build/dist/client/git-management.d.ts +2 -1
- package/data/build/dist/client/git-management.d.ts.map +1 -1
- package/data/build/dist/client/git-management.js +64 -41
- package/data/build/dist/client/git-management.js.map +1 -1
- package/data/build/dist/client/git-panel-styles.d.ts +4 -0
- package/data/build/dist/client/git-panel-styles.d.ts.map +1 -1
- package/data/build/dist/client/git-panel-styles.js +15 -0
- package/data/build/dist/client/git-panel-styles.js.map +1 -1
- package/data/build/dist/client/html-workspace-files.d.ts +4 -0
- package/data/build/dist/client/html-workspace-files.d.ts.map +1 -0
- package/data/build/dist/client/html-workspace-files.js +114 -0
- package/data/build/dist/client/html-workspace-files.js.map +1 -0
- package/data/build/dist/client/index.d.ts +1 -1
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/index.js +1 -1
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +29 -2
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/cliManagement.d.ts +3 -0
- package/data/build/dist/client/locales/cliManagement.d.ts.map +1 -0
- package/data/build/dist/client/locales/cliManagement.js +155 -0
- package/data/build/dist/client/locales/cliManagement.js.map +1 -0
- package/data/build/dist/client/locales/fileWorkspace.d.ts.map +1 -1
- package/data/build/dist/client/locales/fileWorkspace.js +8 -0
- package/data/build/dist/client/locales/fileWorkspace.js.map +1 -1
- package/data/build/dist/client/locales/git.d.ts.map +1 -1
- package/data/build/dist/client/locales/git.js +30 -2
- package/data/build/dist/client/locales/git.js.map +1 -1
- package/data/build/dist/client/locales/magpie.d.ts +4 -0
- package/data/build/dist/client/locales/magpie.d.ts.map +1 -0
- package/data/build/dist/client/locales/magpie.js +622 -0
- package/data/build/dist/client/locales/magpie.js.map +1 -0
- package/data/build/dist/client/locales/panels.d.ts.map +1 -1
- package/data/build/dist/client/locales/panels.js +103 -11
- package/data/build/dist/client/locales/panels.js.map +1 -1
- package/data/build/dist/client/locales/peerHost.d.ts.map +1 -1
- package/data/build/dist/client/locales/peerHost.js +2 -0
- package/data/build/dist/client/locales/peerHost.js.map +1 -1
- package/data/build/dist/client/locales/quickApps.d.ts +136 -0
- package/data/build/dist/client/locales/quickApps.d.ts.map +1 -0
- package/data/build/dist/client/locales/quickApps.js +162 -0
- package/data/build/dist/client/locales/quickApps.js.map +1 -0
- package/data/build/dist/client/locales/usage.d.ts.map +1 -1
- package/data/build/dist/client/locales/usage.js +150 -0
- package/data/build/dist/client/locales/usage.js.map +1 -1
- package/data/build/dist/client/magpie-model-tag.d.ts +16 -0
- package/data/build/dist/client/magpie-model-tag.d.ts.map +1 -0
- package/data/build/dist/client/magpie-model-tag.js +62 -0
- package/data/build/dist/client/magpie-model-tag.js.map +1 -0
- package/data/build/dist/client/mobile-team-panel-dom.d.ts +14 -0
- package/data/build/dist/client/mobile-team-panel-dom.d.ts.map +1 -0
- package/data/build/dist/client/mobile-team-panel-dom.js +164 -0
- package/data/build/dist/client/mobile-team-panel-dom.js.map +1 -0
- package/data/build/dist/client/model-catalog-cache.d.ts.map +1 -1
- package/data/build/dist/client/model-catalog-cache.js +66 -12
- package/data/build/dist/client/model-catalog-cache.js.map +1 -1
- package/data/build/dist/client/model-priority-pool.d.ts +23 -0
- package/data/build/dist/client/model-priority-pool.d.ts.map +1 -0
- package/data/build/dist/client/model-priority-pool.js +245 -0
- package/data/build/dist/client/model-priority-pool.js.map +1 -0
- package/data/build/dist/client/native-model-translation-menu.d.ts +13 -0
- package/data/build/dist/client/native-model-translation-menu.d.ts.map +1 -0
- package/data/build/dist/client/native-model-translation-menu.js +159 -0
- package/data/build/dist/client/native-model-translation-menu.js.map +1 -0
- package/data/build/dist/client/native-translation-default.d.ts +6 -0
- package/data/build/dist/client/native-translation-default.d.ts.map +1 -0
- package/data/build/dist/client/native-translation-default.js +30 -0
- package/data/build/dist/client/native-translation-default.js.map +1 -0
- package/data/build/dist/client/provider-icons.d.ts +8 -0
- package/data/build/dist/client/provider-icons.d.ts.map +1 -1
- package/data/build/dist/client/provider-icons.js +125 -3
- package/data/build/dist/client/provider-icons.js.map +1 -1
- package/data/build/dist/client/quick-apps/browser-storage.d.ts +24 -0
- package/data/build/dist/client/quick-apps/browser-storage.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/browser-storage.js +114 -0
- package/data/build/dist/client/quick-apps/browser-storage.js.map +1 -0
- package/data/build/dist/client/quick-apps/client.d.ts +31 -0
- package/data/build/dist/client/quick-apps/client.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/client.js +68 -0
- package/data/build/dist/client/quick-apps/client.js.map +1 -0
- package/data/build/dist/client/quick-apps/document.d.ts +26 -0
- package/data/build/dist/client/quick-apps/document.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/document.js +110 -0
- package/data/build/dist/client/quick-apps/document.js.map +1 -0
- package/data/build/dist/client/quick-apps/file-picker.d.ts +14 -0
- package/data/build/dist/client/quick-apps/file-picker.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/file-picker.js +51 -0
- package/data/build/dist/client/quick-apps/file-picker.js.map +1 -0
- package/data/build/dist/client/quick-apps/launcher.d.ts +7 -0
- package/data/build/dist/client/quick-apps/launcher.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/launcher.js +267 -0
- package/data/build/dist/client/quick-apps/launcher.js.map +1 -0
- package/data/build/dist/client/quick-apps/presentation.d.ts +16 -0
- package/data/build/dist/client/quick-apps/presentation.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/presentation.js +47 -0
- package/data/build/dist/client/quick-apps/presentation.js.map +1 -0
- package/data/build/dist/client/quick-apps/rail-preference.d.ts +5 -0
- package/data/build/dist/client/quick-apps/rail-preference.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/rail-preference.js +19 -0
- package/data/build/dist/client/quick-apps/rail-preference.js.map +1 -0
- package/data/build/dist/client/quick-apps/reorder-animation.d.ts +6 -0
- package/data/build/dist/client/quick-apps/reorder-animation.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/reorder-animation.js +50 -0
- package/data/build/dist/client/quick-apps/reorder-animation.js.map +1 -0
- package/data/build/dist/client/quick-apps/reorder.d.ts +26 -0
- package/data/build/dist/client/quick-apps/reorder.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/reorder.js +128 -0
- package/data/build/dist/client/quick-apps/reorder.js.map +1 -0
- package/data/build/dist/client/quick-apps/styles.d.ts +3 -0
- package/data/build/dist/client/quick-apps/styles.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/styles.js +153 -0
- package/data/build/dist/client/quick-apps/styles.js.map +1 -0
- package/data/build/dist/client/quick-apps/ui.d.ts +20 -0
- package/data/build/dist/client/quick-apps/ui.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/ui.js +21 -0
- package/data/build/dist/client/quick-apps/ui.js.map +1 -0
- package/data/build/dist/client/quick-apps/viewer.d.ts +16 -0
- package/data/build/dist/client/quick-apps/viewer.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/viewer.js +165 -0
- package/data/build/dist/client/quick-apps/viewer.js.map +1 -0
- package/data/build/dist/client/quick-apps/workspace-picker.d.ts +19 -0
- package/data/build/dist/client/quick-apps/workspace-picker.d.ts.map +1 -0
- package/data/build/dist/client/quick-apps/workspace-picker.js +30 -0
- package/data/build/dist/client/quick-apps/workspace-picker.js.map +1 -0
- package/data/build/dist/client/session-translation-chat.d.ts +68 -2
- package/data/build/dist/client/session-translation-chat.d.ts.map +1 -1
- package/data/build/dist/client/session-translation-chat.js +297 -109
- package/data/build/dist/client/session-translation-chat.js.map +1 -1
- package/data/build/dist/client/session-translation-interactions.d.ts +31 -0
- package/data/build/dist/client/session-translation-interactions.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-interactions.js +158 -0
- package/data/build/dist/client/session-translation-interactions.js.map +1 -0
- package/data/build/dist/client/session-translation-pending-dom.d.ts +8 -0
- package/data/build/dist/client/session-translation-pending-dom.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-pending-dom.js +58 -0
- package/data/build/dist/client/session-translation-pending-dom.js.map +1 -0
- package/data/build/dist/client/session-translation-retry.d.ts +16 -0
- package/data/build/dist/client/session-translation-retry.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-retry.js +66 -0
- package/data/build/dist/client/session-translation-retry.js.map +1 -0
- package/data/build/dist/client/session-translation-rules.d.ts +13 -0
- package/data/build/dist/client/session-translation-rules.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-rules.js +58 -0
- package/data/build/dist/client/session-translation-rules.js.map +1 -0
- package/data/build/dist/client/settings-bridge.d.ts +1 -0
- package/data/build/dist/client/settings-bridge.d.ts.map +1 -1
- package/data/build/dist/client/settings-bridge.js +29 -10
- package/data/build/dist/client/settings-bridge.js.map +1 -1
- package/data/build/dist/client/settings-section.d.ts.map +1 -1
- package/data/build/dist/client/settings-section.js +21 -3
- package/data/build/dist/client/settings-section.js.map +1 -1
- package/data/build/dist/client/sidebar-footer-style.d.ts +13 -0
- package/data/build/dist/client/sidebar-footer-style.d.ts.map +1 -0
- package/data/build/dist/client/sidebar-footer-style.js +54 -0
- package/data/build/dist/client/sidebar-footer-style.js.map +1 -0
- package/data/build/dist/client/style.css +279 -276
- package/data/build/dist/client/subscription-slot.d.ts +26 -2
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +679 -24
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/client/terminal/model.d.ts.map +1 -1
- package/data/build/dist/client/terminal/model.js +2 -1
- package/data/build/dist/client/terminal/model.js.map +1 -1
- package/data/build/dist/client/workspace-session-archive-dom.d.ts +1 -0
- package/data/build/dist/client/workspace-session-archive-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-archive-dom.js +68 -8
- package/data/build/dist/client/workspace-session-archive-dom.js.map +1 -1
- package/data/build/dist/client/workspace-session-rightbar-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-rightbar-dom.js +12 -21
- package/data/build/dist/client/workspace-session-rightbar-dom.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +43 -10
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.d.ts +8 -0
- package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.js +71 -0
- package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts +4 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js +8 -0
- package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts +27 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js +109 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts +30 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js +93 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts +12 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js +181 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.d.ts +19 -0
- package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.js +39 -0
- package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.d.ts +3 -0
- package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.js +27 -0
- package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +36 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +88 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts +20 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.js +65 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts +18 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js +11 -0
- package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts +9 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +75 -0
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts +3 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js +22 -0
- package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts +32 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js +90 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts +52 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js +109 -0
- package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.d.ts +10 -0
- package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.js +34 -0
- package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.d.ts +21 -0
- package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.js +11 -0
- package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts +11 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js +97 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts +36 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js +164 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts +44 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js +240 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts +37 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js +35 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts +13 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js +30 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts +21 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js +132 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts +10 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.js +33 -0
- package/data/build/dist/dsh-capabilities/host/quick-app-transport.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-activation-adapter.d.ts +17 -0
- package/data/build/dist/dsh-capabilities/host/session-activation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-activation-adapter.js +37 -0
- package/data/build/dist/dsh-capabilities/host/session-activation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts +17 -0
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js +45 -0
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +7 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +18 -0
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts +28 -0
- package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js +31 -0
- package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts +2 -1
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js +32 -2
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts +13 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js +24 -0
- package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +23 -5
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts +1 -0
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +50 -3
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +27 -0
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js +94 -16
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.js +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/attachment-utils.d.ts +4 -3
- package/data/build/dist/host/cli-adapters/attachment-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/attachment-utils.js +9 -8
- package/data/build/dist/host/cli-adapters/attachment-utils.js.map +1 -1
- package/data/build/dist/host/cli-adapters/binary-detection.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/binary-detection.js +7 -3
- package/data/build/dist/host/cli-adapters/binary-detection.js.map +1 -1
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/claude-driver.js +184 -21
- package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +28 -0
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +158 -22
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts +91 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.js +8 -0
- package/data/build/dist/host/cli-adapters/codex-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance.d.ts +16 -0
- package/data/build/dist/host/cli-adapters/codex-performance.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-performance.js +81 -0
- package/data/build/dist/host/cli-adapters/codex-performance.js.map +1 -0
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts +6 -2
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js +198 -26
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js +33 -5
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts +3 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.js +41 -4
- package/data/build/dist/host/cli-adapters/desktop-app-runtime.js.map +1 -1
- package/data/build/dist/host/cli-adapters/driver.d.ts +2 -0
- package/data/build/dist/host/cli-adapters/driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +5 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +65 -17
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-tool-history.js +3 -2
- package/data/build/dist/host/cli-adapters/dsh-tool-history.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js +3 -2
- package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts +17 -0
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +972 -102
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/gemini-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/gemini-driver.js +5 -3
- package/data/build/dist/host/cli-adapters/gemini-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts +7 -0
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.js +463 -59
- package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts +123 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.js +48 -0
- package/data/build/dist/host/cli-adapters/grok-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-usage.d.ts +45 -0
- package/data/build/dist/host/cli-adapters/grok-usage.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/grok-usage.js +197 -0
- package/data/build/dist/host/cli-adapters/grok-usage.js.map +1 -0
- package/data/build/dist/host/cli-adapters/kimi-driver.js +2 -2
- package/data/build/dist/host/cli-adapters/kimi-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.js +20 -3
- package/data/build/dist/host/cli-adapters/legacy-session-adapter.js.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-detection.d.ts +72 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.js +298 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-management.d.ts +50 -0
- package/data/build/dist/host/cli-adapters/magpie-management.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-management.js +1268 -0
- package/data/build/dist/host/cli-adapters/magpie-management.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-session-routing.d.ts +9 -0
- package/data/build/dist/host/cli-adapters/magpie-session-routing.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-session-routing.js +90 -0
- package/data/build/dist/host/cli-adapters/magpie-session-routing.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-update.d.ts +59 -0
- package/data/build/dist/host/cli-adapters/magpie-update.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-update.js +249 -0
- package/data/build/dist/host/cli-adapters/magpie-update.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-usage.d.ts +148 -0
- package/data/build/dist/host/cli-adapters/magpie-usage.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-usage.js +1710 -0
- package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-web.d.ts +54 -0
- package/data/build/dist/host/cli-adapters/magpie-web.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-web.js +407 -0
- package/data/build/dist/host/cli-adapters/magpie-web.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management-installation.d.ts +5 -0
- package/data/build/dist/host/cli-adapters/management-installation.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-installation.js +131 -0
- package/data/build/dist/host/cli-adapters/management-installation.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management-methods.d.ts +37 -0
- package/data/build/dist/host/cli-adapters/management-methods.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-methods.js +144 -0
- package/data/build/dist/host/cli-adapters/management-methods.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management-process.d.ts +7 -0
- package/data/build/dist/host/cli-adapters/management-process.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management-process.js +62 -0
- package/data/build/dist/host/cli-adapters/management-process.js.map +1 -0
- package/data/build/dist/host/cli-adapters/management.d.ts +32 -0
- package/data/build/dist/host/cli-adapters/management.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/management.js +177 -0
- package/data/build/dist/host/cli-adapters/management.js.map +1 -0
- package/data/build/dist/host/cli-adapters/mcode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/mcode-driver.js +12 -5
- package/data/build/dist/host/cli-adapters/mcode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/model-catalog.js +70 -7
- package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +13 -5
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts +7 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/native-team-subagent.js +6 -3
- package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +22 -0
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-driver.js +105 -17
- package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +4 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
- package/data/build/dist/host/cli-adapters/pi-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/pi-driver.js +45 -11
- package/data/build/dist/host/cli-adapters/pi-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.d.ts +4 -0
- package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.js +20 -11
- package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts +7 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +141 -51
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
- package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts +74 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.js +83 -0
- package/data/build/dist/host/cli-adapters/session-performance-projection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js +4 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts +3 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/stream-normalizer.js +2 -0
- package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.d.ts +26 -0
- package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.js +30 -0
- package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.js.map +1 -0
- package/data/build/dist/host/cli-adapters/subagent-tool.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/subagent-tool.js +7 -6
- package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
- package/data/build/dist/host/cli-adapters/team-input.d.ts +17 -0
- package/data/build/dist/host/cli-adapters/team-input.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/team-input.js +67 -0
- package/data/build/dist/host/cli-adapters/team-input.js.map +1 -0
- package/data/build/dist/host/cli-adapters/update-check.d.ts +34 -0
- package/data/build/dist/host/cli-adapters/update-check.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/update-check.js +263 -0
- package/data/build/dist/host/cli-adapters/update-check.js.map +1 -0
- package/data/build/dist/host/cli-adapters/zcode-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/zcode-driver.js +7 -2
- package/data/build/dist/host/cli-adapters/zcode-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/zcode-update.d.ts +8 -0
- package/data/build/dist/host/cli-adapters/zcode-update.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/zcode-update.js +149 -0
- package/data/build/dist/host/cli-adapters/zcode-update.js.map +1 -0
- package/data/build/dist/host/cli-bridge/bridge-holder.d.ts +14 -0
- package/data/build/dist/host/cli-bridge/bridge-holder.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-holder.js +53 -6
- package/data/build/dist/host/cli-bridge/bridge-holder.js.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.d.ts +8 -0
- package/data/build/dist/host/cli-bridge/bridge-server.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/bridge-server.js +63 -6
- package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/command-code-mod.js +128 -0
- package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js +1 -1
- package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
- package/data/build/dist/host/cli-bridge/fetch-dispatch.d.ts +23 -0
- package/data/build/dist/host/cli-bridge/fetch-dispatch.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/fetch-dispatch.js +73 -0
- package/data/build/dist/host/cli-bridge/fetch-dispatch.js.map +1 -0
- package/data/build/dist/host/cli-bridge/injections.d.ts +14 -0
- package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
- package/data/build/dist/host/cli-bridge/injections.js +69 -7
- package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.d.ts +1 -1
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +102 -7
- package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
- package/data/build/dist/host/cli-bridge/pi-extension-entry.d.ts +3 -0
- package/data/build/dist/host/cli-bridge/pi-extension-entry.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/pi-extension-entry.js +9 -0
- package/data/build/dist/host/cli-bridge/pi-extension-entry.js.map +1 -0
- package/data/build/dist/host/cli-bridge/pi-extension.d.ts +52 -0
- package/data/build/dist/host/cli-bridge/pi-extension.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/pi-extension.js +311 -0
- package/data/build/dist/host/cli-bridge/pi-extension.js.map +1 -0
- package/data/build/dist/host/cli-bridge/search-dispatch.d.ts +20 -0
- package/data/build/dist/host/cli-bridge/search-dispatch.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/search-dispatch.js +61 -0
- package/data/build/dist/host/cli-bridge/search-dispatch.js.map +1 -0
- package/data/build/dist/host/cli-bridge/team-adapters.d.ts +11 -0
- package/data/build/dist/host/cli-bridge/team-adapters.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-adapters.js +23 -0
- package/data/build/dist/host/cli-bridge/team-adapters.js.map +1 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.d.ts +28 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.js +208 -0
- package/data/build/dist/host/cli-bridge/team-dispatch.js.map +1 -0
- package/data/build/dist/host/cli-bridge/team-tool.d.ts +3 -0
- package/data/build/dist/host/cli-bridge/team-tool.d.ts.map +1 -0
- package/data/build/dist/host/cli-bridge/team-tool.js +18 -0
- package/data/build/dist/host/cli-bridge/team-tool.js.map +1 -0
- package/data/build/dist/host/dsh-gateway-feature.d.ts.map +1 -1
- package/data/build/dist/host/dsh-gateway-feature.js +26 -3
- package/data/build/dist/host/dsh-gateway-feature.js.map +1 -1
- package/data/build/dist/host/features/file-management.d.ts.map +1 -1
- package/data/build/dist/host/features/file-management.js +10 -1
- package/data/build/dist/host/features/file-management.js.map +1 -1
- package/data/build/dist/host/features/git-commit-message.d.ts +5 -0
- package/data/build/dist/host/features/git-commit-message.d.ts.map +1 -0
- package/data/build/dist/host/features/git-commit-message.js +66 -0
- package/data/build/dist/host/features/git-commit-message.js.map +1 -0
- package/data/build/dist/host/features/git-management.d.ts +11 -2
- package/data/build/dist/host/features/git-management.d.ts.map +1 -1
- package/data/build/dist/host/features/git-management.js +61 -7
- package/data/build/dist/host/features/git-management.js.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.js +2 -3
- package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
- package/data/build/dist/host/features/host-status.d.ts +25 -0
- package/data/build/dist/host/features/host-status.d.ts.map +1 -1
- package/data/build/dist/host/features/host-status.js +60 -6
- package/data/build/dist/host/features/host-status.js.map +1 -1
- package/data/build/dist/host/features/index.d.ts.map +1 -1
- package/data/build/dist/host/features/index.js +2 -0
- package/data/build/dist/host/features/index.js.map +1 -1
- package/data/build/dist/host/features/interaction-translation.d.ts +10 -0
- package/data/build/dist/host/features/interaction-translation.d.ts.map +1 -0
- package/data/build/dist/host/features/interaction-translation.js +219 -0
- package/data/build/dist/host/features/interaction-translation.js.map +1 -0
- package/data/build/dist/host/features/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/features/lan-access-dsh.js +64 -13
- package/data/build/dist/host/features/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/host/features/peer-host.js +13 -6
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/quick-apps.d.ts +4 -0
- package/data/build/dist/host/features/quick-apps.d.ts.map +1 -0
- package/data/build/dist/host/features/quick-apps.js +158 -0
- package/data/build/dist/host/features/quick-apps.js.map +1 -0
- package/data/build/dist/host/features/session-prompt-translation.d.ts +10 -0
- package/data/build/dist/host/features/session-prompt-translation.d.ts.map +1 -0
- package/data/build/dist/host/features/session-prompt-translation.js +227 -0
- package/data/build/dist/host/features/session-prompt-translation.js.map +1 -0
- package/data/build/dist/host/features/session-translation-protection.d.ts +22 -0
- package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-protection.js +205 -0
- package/data/build/dist/host/features/session-translation-protection.js.map +1 -0
- package/data/build/dist/host/features/session-translation-recovery.d.ts +21 -0
- package/data/build/dist/host/features/session-translation-recovery.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-recovery.js +125 -0
- package/data/build/dist/host/features/session-translation-recovery.js.map +1 -0
- package/data/build/dist/host/features/session-translation-runtime.d.ts +16 -0
- package/data/build/dist/host/features/session-translation-runtime.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-runtime.js +85 -0
- package/data/build/dist/host/features/session-translation-runtime.js.map +1 -0
- package/data/build/dist/host/features/session-translation-service.d.ts +19 -4
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-service.js +249 -210
- package/data/build/dist/host/features/session-translation-service.js.map +1 -1
- package/data/build/dist/host/features/session-translation.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation.js +6 -3
- package/data/build/dist/host/features/session-translation.js.map +1 -1
- package/data/build/dist/host/features/types.d.ts +10 -0
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/html-workspace-files.d.ts +3 -0
- package/data/build/dist/host/html-workspace-files.d.ts.map +1 -0
- package/data/build/dist/host/html-workspace-files.js +135 -0
- package/data/build/dist/host/html-workspace-files.js.map +1 -0
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +32 -39
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/lan-access-dsh.d.ts +14 -2
- package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/lan-access-dsh.js +87 -15
- package/data/build/dist/host/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +2 -2
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +10 -9
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts +3 -3
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js +26 -14
- package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js.map +1 -1
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts +5 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts.map +1 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.js +27 -0
- package/data/build/dist/host/modules/peer-host/quick-app-gateway.js.map +1 -0
- package/data/build/dist/host/modules/pwa/pwa-session-notifications.js +2 -1
- package/data/build/dist/host/modules/pwa/pwa-session-notifications.js.map +1 -1
- package/data/build/dist/host/modules/quick-apps/browse.d.ts +5 -0
- package/data/build/dist/host/modules/quick-apps/browse.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/browse.js +37 -0
- package/data/build/dist/host/modules/quick-apps/browse.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.d.ts +4 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.js +39 -0
- package/data/build/dist/host/modules/quick-apps/code-revision.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/documents.d.ts +14 -0
- package/data/build/dist/host/modules/quick-apps/documents.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/documents.js +87 -0
- package/data/build/dist/host/modules/quick-apps/documents.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/egress.d.ts +35 -0
- package/data/build/dist/host/modules/quick-apps/egress.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/egress.js +244 -0
- package/data/build/dist/host/modules/quick-apps/egress.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/errors.d.ts +8 -0
- package/data/build/dist/host/modules/quick-apps/errors.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/errors.js +15 -0
- package/data/build/dist/host/modules/quick-apps/errors.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/file-api.d.ts +30 -0
- package/data/build/dist/host/modules/quick-apps/file-api.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/file-api.js +149 -0
- package/data/build/dist/host/modules/quick-apps/file-api.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/launches.d.ts +35 -0
- package/data/build/dist/host/modules/quick-apps/launches.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/launches.js +80 -0
- package/data/build/dist/host/modules/quick-apps/launches.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/paths.d.ts +14 -0
- package/data/build/dist/host/modules/quick-apps/paths.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/paths.js +72 -0
- package/data/build/dist/host/modules/quick-apps/paths.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/registry.d.ts +30 -0
- package/data/build/dist/host/modules/quick-apps/registry.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/registry.js +195 -0
- package/data/build/dist/host/modules/quick-apps/registry.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/remote.d.ts +38 -0
- package/data/build/dist/host/modules/quick-apps/remote.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/remote.js +238 -0
- package/data/build/dist/host/modules/quick-apps/remote.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/service.d.ts +27 -0
- package/data/build/dist/host/modules/quick-apps/service.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/service.js +174 -0
- package/data/build/dist/host/modules/quick-apps/service.js.map +1 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.d.ts +8 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.d.ts.map +1 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.js +213 -0
- package/data/build/dist/host/modules/quick-apps/static-handler.js.map +1 -0
- package/data/build/dist/host/native-session-bridge.d.ts +7 -1
- package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +10 -15
- package/data/build/dist/host/native-session-bridge.js.map +1 -1
- package/data/build/dist/host/rpc.d.ts +15 -2
- package/data/build/dist/host/rpc.d.ts.map +1 -1
- package/data/build/dist/host/rpc.js +67 -15
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/host/session-changes.d.ts.map +1 -1
- package/data/build/dist/host/session-changes.js +6 -2
- package/data/build/dist/host/session-changes.js.map +1 -1
- package/data/build/dist/host/session-migration-repair.js +48 -35
- package/data/build/dist/host/session-migration-repair.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +36 -2
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/host/workspace-file-mutations.d.ts +2 -0
- package/data/build/dist/host/workspace-file-mutations.d.ts.map +1 -0
- package/data/build/dist/host/workspace-file-mutations.js +15 -0
- package/data/build/dist/host/workspace-file-mutations.js.map +1 -0
- package/data/build/dist/host/workspace-root.d.ts +14 -0
- package/data/build/dist/host/workspace-root.d.ts.map +1 -0
- package/data/build/dist/host/workspace-root.js +99 -0
- package/data/build/dist/host/workspace-root.js.map +1 -0
- package/data/build/dist/shared/attachment-prompts.d.ts +11 -0
- package/data/build/dist/shared/attachment-prompts.d.ts.map +1 -0
- package/data/build/dist/shared/attachment-prompts.js +17 -0
- package/data/build/dist/shared/attachment-prompts.js.map +1 -0
- package/data/build/dist/shared/cli-provider-route.d.ts +7 -0
- package/data/build/dist/shared/cli-provider-route.d.ts.map +1 -0
- package/data/build/dist/shared/cli-provider-route.js +13 -0
- package/data/build/dist/shared/cli-provider-route.js.map +1 -0
- package/data/build/dist/shared/codex-performance.d.ts +3 -0
- package/data/build/dist/shared/codex-performance.d.ts.map +1 -0
- package/data/build/dist/shared/codex-performance.js +2 -0
- package/data/build/dist/shared/codex-performance.js.map +1 -0
- package/data/build/dist/shared/contracts/agent-team.d.ts +14 -0
- package/data/build/dist/shared/contracts/agent-team.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/agent-team.js +48 -0
- package/data/build/dist/shared/contracts/agent-team.js.map +1 -0
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +62 -1
- package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/cli-management.d.ts +29 -0
- package/data/build/dist/shared/contracts/cli-management.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/cli-management.js +2 -0
- package/data/build/dist/shared/contracts/cli-management.js.map +1 -0
- package/data/build/dist/shared/contracts/config.d.ts +25 -1
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +11 -0
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +2 -2
- package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/feature.d.ts +7 -0
- package/data/build/dist/shared/contracts/feature.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/git.d.ts +17 -0
- package/data/build/dist/shared/contracts/git.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/git.js +27 -1
- package/data/build/dist/shared/contracts/git.js.map +1 -1
- package/data/build/dist/shared/contracts/interaction-presentation.d.ts +32 -0
- package/data/build/dist/shared/contracts/interaction-presentation.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/interaction-presentation.js +2 -0
- package/data/build/dist/shared/contracts/interaction-presentation.js.map +1 -0
- package/data/build/dist/shared/contracts/interaction-translation.d.ts +53 -0
- package/data/build/dist/shared/contracts/interaction-translation.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/interaction-translation.js +44 -0
- package/data/build/dist/shared/contracts/interaction-translation.js.map +1 -0
- package/data/build/dist/shared/contracts/magpie-management.d.ts +395 -0
- package/data/build/dist/shared/contracts/magpie-management.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/magpie-management.js +2 -0
- package/data/build/dist/shared/contracts/magpie-management.js.map +1 -0
- package/data/build/dist/shared/contracts/quick-apps.d.ts +70 -0
- package/data/build/dist/shared/contracts/quick-apps.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/quick-apps.js +4 -0
- package/data/build/dist/shared/contracts/quick-apps.js.map +1 -0
- package/data/build/dist/shared/contracts/session-translation.d.ts +82 -9
- package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/session-translation.js +146 -2
- package/data/build/dist/shared/contracts/session-translation.js.map +1 -1
- package/data/build/dist/shared/contracts/subscription.d.ts +161 -0
- package/data/build/dist/shared/contracts/subscription.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/subscription.js.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +9 -15
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +8 -14
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/data/build/dist/shared/index.d.ts +4 -2
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js +3 -2
- package/data/build/dist/shared/index.js.map +1 -1
- package/data/build/dist/shared/peer-host-http-routes.d.ts +4 -0
- package/data/build/dist/shared/peer-host-http-routes.d.ts.map +1 -1
- package/data/build/dist/shared/peer-host-http-routes.js +4 -0
- package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
- package/data/build/dist/shared/provider-icon-resources.d.ts.map +1 -1
- package/data/build/dist/shared/provider-icon-resources.js +1 -0
- package/data/build/dist/shared/provider-icon-resources.js.map +1 -1
- package/data/build/dist/shared/quick-app-browser-storage.d.ts +33 -0
- package/data/build/dist/shared/quick-app-browser-storage.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-browser-storage.js +33 -0
- package/data/build/dist/shared/quick-app-browser-storage.js.map +1 -0
- package/data/build/dist/shared/quick-app-network-allow.d.ts +8 -0
- package/data/build/dist/shared/quick-app-network-allow.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-network-allow.js +192 -0
- package/data/build/dist/shared/quick-app-network-allow.js.map +1 -0
- package/data/build/dist/shared/quick-app-network-bootstrap.d.ts +9 -0
- package/data/build/dist/shared/quick-app-network-bootstrap.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-network-bootstrap.js +134 -0
- package/data/build/dist/shared/quick-app-network-bootstrap.js.map +1 -0
- package/data/build/dist/shared/quick-app-proxy-path.d.ts +6 -0
- package/data/build/dist/shared/quick-app-proxy-path.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-proxy-path.js +18 -0
- package/data/build/dist/shared/quick-app-proxy-path.js.map +1 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts +9 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts.map +1 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.js +189 -0
- package/data/build/dist/shared/quick-app-storage-bootstrap.js.map +1 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts +7 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts.map +1 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.js +10 -0
- package/data/build/dist/shared/quick-apps-bootstrap-locale.js.map +1 -0
- package/data/build/dist/shared/request-performance.d.ts +15 -0
- package/data/build/dist/shared/request-performance.d.ts.map +1 -0
- package/data/build/dist/shared/request-performance.js +3 -0
- package/data/build/dist/shared/request-performance.js.map +1 -0
- package/data/build/dist/shared/session-title.d.ts.map +1 -1
- package/data/build/dist/shared/session-title.js +10 -4
- package/data/build/dist/shared/session-title.js.map +1 -1
- package/data/build/dist/shared/translation-indicator.d.ts +26 -0
- package/data/build/dist/shared/translation-indicator.d.ts.map +1 -0
- package/data/build/dist/shared/translation-indicator.js +29 -0
- package/data/build/dist/shared/translation-indicator.js.map +1 -0
- package/package.json +35 -34
- package/profile/README.md +2 -2
- package/profile/package.json +3 -3
- package/profile/version.json +3 -3
- package/version.json +3 -3
- package/data/build/dist/client/client.model-catalog-cache.js.map +0 -1
|
@@ -0,0 +1,1256 @@
|
|
|
1
|
+
import { createElement, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
|
|
2
|
+
import { CODINGNS_SUBSCRIPTION_REPORTS_FIELD, DEFAULT_SUBSCRIPTION_REPORT_SETTINGS, normalizeSubscriptionReportSettings, } from '../../shared/contracts/config.js';
|
|
3
|
+
import { useCodingNsTranslator } from '../locale.js';
|
|
4
|
+
import { callCodingNsRpcResult } from '../rpc-call.js';
|
|
5
|
+
import { uiFontSize } from '../font-scale.js';
|
|
6
|
+
import { MagpieProviderLogo } from './magpie-provider-logo.js';
|
|
7
|
+
import { MagpieGroupsPage, MagpieProvidersPage } from './magpie-management-controls.js';
|
|
8
|
+
import { groupQuotaRowsByProvider, resolveQuotaAccountBalance } from './subscription-quota-groups.js';
|
|
9
|
+
const PERIODS = [
|
|
10
|
+
{ id: 'today', key: 'magpie.today' },
|
|
11
|
+
{ id: 'week', key: 'magpie.week' },
|
|
12
|
+
{ id: 'month', key: 'magpie.month' },
|
|
13
|
+
{ id: 'all', key: 'magpie.all' },
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Top-level tab order mirrors native Magpie: Overview, Providers, Routing groups, Usage.
|
|
17
|
+
*
|
|
18
|
+
* The third tab edits the `group/<id>` entries Magpie draws under "Routing groups"; its label
|
|
19
|
+
* says so, because a provider editor on the Providers tab also edits that provider's routing.
|
|
20
|
+
*/
|
|
21
|
+
const PAGE_TABS = [
|
|
22
|
+
{ id: 'overview', label: 'magpie.overview', icon: '◫' },
|
|
23
|
+
{ id: 'providers', label: 'magpie.management.providers', icon: '◈' },
|
|
24
|
+
{ id: 'groups', label: 'magpie.management.groupsTab', icon: '⇄' },
|
|
25
|
+
{ id: 'usage', label: 'magpie.usage', icon: '◷' },
|
|
26
|
+
];
|
|
27
|
+
/** Native Magpie order inside Usage: Subscriptions, Sessions, Requests. */
|
|
28
|
+
const USAGE_TABS = [
|
|
29
|
+
{ id: 'quotas', label: 'magpie.quotas', icon: '◉' },
|
|
30
|
+
{ id: 'sessions', label: 'magpie.sessions', icon: '◷' },
|
|
31
|
+
{ id: 'requests', label: 'magpie.requests', icon: '↗' },
|
|
32
|
+
];
|
|
33
|
+
const PAGE_SIZE = 50;
|
|
34
|
+
/** 请求视图每页条数;底部弹层复用同一分页尺寸。 */
|
|
35
|
+
export const MAGPIE_REQUESTS_PAGE_SIZE = PAGE_SIZE;
|
|
36
|
+
/** 订阅卡显示口径的切换项;顺序与截图一致:先「已用」,再「剩余」。 */
|
|
37
|
+
const QUOTA_VIEWS = [
|
|
38
|
+
{ id: 'used', label: 'magpie.quotaViewUsed' },
|
|
39
|
+
{ id: 'remaining', label: 'magpie.quotaViewRemaining' },
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* 读取 Host 保存的订阅卡显示口径,并返回一个写入函数。
|
|
43
|
+
*
|
|
44
|
+
* 设置只影响读法,所以读取失败或没有设置存储时静默回落到默认值:
|
|
45
|
+
* 页面照常显示额度,不会因为偏好读不到而变成空态。
|
|
46
|
+
*/
|
|
47
|
+
export function useQuotaView(settings) {
|
|
48
|
+
const [saveFailed, setSaveFailed] = useState(false);
|
|
49
|
+
// `settings` 可能是 undefined;用稳定的空实现代替它交给 useSyncExternalStore。
|
|
50
|
+
const subscribe = useCallback((listener) => (settings === undefined ? () => undefined : settings.subscribe(listener)), [settings]);
|
|
51
|
+
const read = useCallback(() => settings === undefined
|
|
52
|
+
? EMPTY_QUOTA_VIEW_SNAPSHOT
|
|
53
|
+
: settings.getSnapshot(), [settings]);
|
|
54
|
+
const snapshot = useSyncExternalStore(subscribe, read, read);
|
|
55
|
+
const quotaView = normalizeSubscriptionReportSettings(snapshot.value?.subscriptionReports).quotaView;
|
|
56
|
+
const writable = settings !== undefined && snapshot.status === 'ready' && snapshot.writable;
|
|
57
|
+
const selectQuotaView = useCallback((next) => {
|
|
58
|
+
if (settings === undefined)
|
|
59
|
+
return;
|
|
60
|
+
setSaveFailed(false);
|
|
61
|
+
void settings.mutate([{
|
|
62
|
+
op: 'set',
|
|
63
|
+
path: [CODINGNS_SUBSCRIPTION_REPORTS_FIELD, 'quotaView'],
|
|
64
|
+
value: next,
|
|
65
|
+
}]).then((accepted) => {
|
|
66
|
+
if (!accepted)
|
|
67
|
+
setSaveFailed(true);
|
|
68
|
+
}).catch(() => setSaveFailed(true));
|
|
69
|
+
}, [settings]);
|
|
70
|
+
return { quotaView, selectQuotaView, writable, saveFailed };
|
|
71
|
+
}
|
|
72
|
+
/** 没有设置存储时的稳定空快照;`useSyncExternalStore` 要求同一引用。 */
|
|
73
|
+
const EMPTY_QUOTA_VIEW_SNAPSHOT = {
|
|
74
|
+
value: undefined,
|
|
75
|
+
revision: undefined,
|
|
76
|
+
writable: false,
|
|
77
|
+
status: 'unavailable',
|
|
78
|
+
};
|
|
79
|
+
export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview', initialUsageTab = 'quotas', settings }) {
|
|
80
|
+
const t = useCodingNsTranslator(locale);
|
|
81
|
+
const { quotaView, selectQuotaView, writable: quotaViewWritable, saveFailed: quotaViewSaveFailed } = useQuotaView(settings);
|
|
82
|
+
const [pageTab, setPageTab] = useState(initialPageTab);
|
|
83
|
+
const [usageTab, setUsageTab] = useState(initialUsageTab);
|
|
84
|
+
const section = pageTab === 'usage' ? usageTab : pageTab;
|
|
85
|
+
const selectPageTab = (next) => setPageTab(next);
|
|
86
|
+
const selectUsageTab = (next) => {
|
|
87
|
+
setPageTab('usage');
|
|
88
|
+
setUsageTab(next);
|
|
89
|
+
};
|
|
90
|
+
const [period, setPeriod] = useState('today');
|
|
91
|
+
const [dashboard, setDashboard] = useState(null);
|
|
92
|
+
const [dashboardLoading, setDashboardLoading] = useState(true);
|
|
93
|
+
const [dashboardError, setDashboardError] = useState(false);
|
|
94
|
+
const [dashboardIssue, setDashboardIssue] = useState(null);
|
|
95
|
+
const [chartMetric, setChartMetric] = useState('calls');
|
|
96
|
+
const [sessionSearch, setSessionSearch] = useState('');
|
|
97
|
+
const [selectedSession, setSelectedSession] = useState(null);
|
|
98
|
+
const [requestPage, setRequestPage] = useState(null);
|
|
99
|
+
const [requestLoading, setRequestLoading] = useState(false);
|
|
100
|
+
const [requestError, setRequestError] = useState(false);
|
|
101
|
+
const [requestOffset, setRequestOffset] = useState(0);
|
|
102
|
+
const [management, setManagement] = useState(null);
|
|
103
|
+
const [managementLoading, setManagementLoading] = useState(true);
|
|
104
|
+
const [managementIssue, setManagementIssue] = useState(null);
|
|
105
|
+
const [managementWriting, setManagementWriting] = useState(false);
|
|
106
|
+
const [updateStatus, setUpdateStatus] = useState(null);
|
|
107
|
+
const [updateNotes, setUpdateNotes] = useState(null);
|
|
108
|
+
const [updateLoading, setUpdateLoading] = useState(true);
|
|
109
|
+
const [updateError, setUpdateError] = useState(null);
|
|
110
|
+
const [updateConfirming, setUpdateConfirming] = useState(false);
|
|
111
|
+
const [updateNotice, setUpdateNotice] = useState('');
|
|
112
|
+
const [updateOpen, setUpdateOpen] = useState(false);
|
|
113
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
114
|
+
const dashboardSequence = useRef(0);
|
|
115
|
+
const requestSequence = useRef(0);
|
|
116
|
+
const managementSequence = useRef(0);
|
|
117
|
+
const loadDashboard = useCallback(async (signal) => {
|
|
118
|
+
const sequence = dashboardSequence.current + 1;
|
|
119
|
+
dashboardSequence.current = sequence;
|
|
120
|
+
setDashboardLoading(true);
|
|
121
|
+
setDashboardError(false);
|
|
122
|
+
setDashboardIssue(null);
|
|
123
|
+
try {
|
|
124
|
+
const next = await callMagpieRpc(rpc, 'usage/dashboard', { period }, signal);
|
|
125
|
+
if (signal.aborted || sequence !== dashboardSequence.current)
|
|
126
|
+
return;
|
|
127
|
+
setDashboard(next);
|
|
128
|
+
const issue = next?.availabilityIssue ?? (next === null ? 'host-rpc-outdated' : null);
|
|
129
|
+
setDashboardIssue(issue);
|
|
130
|
+
setDashboardError(issue !== null);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (signal.aborted || sequence !== dashboardSequence.current)
|
|
134
|
+
return;
|
|
135
|
+
const issue = magpieDashboardIssueForRpcError(error);
|
|
136
|
+
setDashboardIssue(issue);
|
|
137
|
+
setDashboardError(true);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
if (!signal.aborted && sequence === dashboardSequence.current)
|
|
141
|
+
setDashboardLoading(false);
|
|
142
|
+
}
|
|
143
|
+
}, [period, rpc]);
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
const controller = new AbortController();
|
|
146
|
+
void loadDashboard(controller.signal);
|
|
147
|
+
return () => controller.abort();
|
|
148
|
+
}, [loadDashboard, refreshKey]);
|
|
149
|
+
const loadManagement = useCallback(async (signal) => {
|
|
150
|
+
const sequence = managementSequence.current + 1;
|
|
151
|
+
managementSequence.current = sequence;
|
|
152
|
+
setManagementLoading(true);
|
|
153
|
+
setManagementIssue(null);
|
|
154
|
+
try {
|
|
155
|
+
const next = await callMagpieRpc(rpc, 'management/snapshot', {}, signal);
|
|
156
|
+
if (signal.aborted || sequence !== managementSequence.current)
|
|
157
|
+
return;
|
|
158
|
+
setManagement(next);
|
|
159
|
+
setManagementIssue(next?.availabilityIssue ?? (next === null ? 'host-rpc-outdated' : null));
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (signal.aborted || sequence !== managementSequence.current)
|
|
163
|
+
return;
|
|
164
|
+
setManagementIssue(magpieManagementIssueForRpcError(error));
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
if (!signal.aborted && sequence === managementSequence.current)
|
|
168
|
+
setManagementLoading(false);
|
|
169
|
+
}
|
|
170
|
+
}, [rpc]);
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
const controller = new AbortController();
|
|
173
|
+
void loadManagement(controller.signal);
|
|
174
|
+
return () => controller.abort();
|
|
175
|
+
}, [loadManagement, refreshKey]);
|
|
176
|
+
const loadUpdates = useCallback(async (signal) => {
|
|
177
|
+
setUpdateLoading(true);
|
|
178
|
+
setUpdateError(null);
|
|
179
|
+
try {
|
|
180
|
+
const [status, notes] = await Promise.all([
|
|
181
|
+
callMagpieRpc(rpc, 'update/status', {}, signal),
|
|
182
|
+
callMagpieRpc(rpc, 'update/notes', {}, signal),
|
|
183
|
+
]);
|
|
184
|
+
if (signal.aborted)
|
|
185
|
+
return;
|
|
186
|
+
setUpdateStatus(status);
|
|
187
|
+
setUpdateNotes(notes);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (signal.aborted)
|
|
191
|
+
return;
|
|
192
|
+
setUpdateError(magpieUpdateIssueForRpcError(error));
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
if (!signal.aborted)
|
|
196
|
+
setUpdateLoading(false);
|
|
197
|
+
}
|
|
198
|
+
}, [rpc]);
|
|
199
|
+
useEffect(() => {
|
|
200
|
+
const controller = new AbortController();
|
|
201
|
+
void loadUpdates(controller.signal);
|
|
202
|
+
return () => controller.abort();
|
|
203
|
+
}, [loadUpdates, refreshKey]);
|
|
204
|
+
const checkForUpdate = useCallback(async () => {
|
|
205
|
+
setUpdateLoading(true);
|
|
206
|
+
setUpdateError(null);
|
|
207
|
+
setUpdateNotice('');
|
|
208
|
+
try {
|
|
209
|
+
const [status, notes] = await Promise.all([
|
|
210
|
+
callMagpieRpc(rpc, 'update/check', {}, undefined),
|
|
211
|
+
callMagpieRpc(rpc, 'update/notes', {}, undefined),
|
|
212
|
+
]);
|
|
213
|
+
setUpdateStatus(status);
|
|
214
|
+
setUpdateNotes(notes);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
setUpdateError(magpieUpdateIssueForRpcError(error));
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
setUpdateLoading(false);
|
|
221
|
+
}
|
|
222
|
+
}, [rpc]);
|
|
223
|
+
const installUpdate = useCallback(async () => {
|
|
224
|
+
setUpdateLoading(true);
|
|
225
|
+
setUpdateError(null);
|
|
226
|
+
setUpdateNotice('');
|
|
227
|
+
try {
|
|
228
|
+
const result = await callMagpieRpc(rpc, 'update/install', { confirmed: true }, undefined);
|
|
229
|
+
if (result.status !== null)
|
|
230
|
+
setUpdateStatus(result.status);
|
|
231
|
+
setUpdateConfirming(false);
|
|
232
|
+
setUpdateNotice(result.restartExpected ? t('magpie.update.restartRequested') : t('magpie.update.requested'));
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
setUpdateError(magpieUpdateIssueForRpcError(error));
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
setUpdateLoading(false);
|
|
239
|
+
}
|
|
240
|
+
}, [rpc, t]);
|
|
241
|
+
useEffect(() => {
|
|
242
|
+
if (!updateOpen)
|
|
243
|
+
return;
|
|
244
|
+
const closeOnEscape = (event) => {
|
|
245
|
+
if (event.key === 'Escape')
|
|
246
|
+
setUpdateOpen(false);
|
|
247
|
+
};
|
|
248
|
+
window.addEventListener('keydown', closeOnEscape);
|
|
249
|
+
return () => window.removeEventListener('keydown', closeOnEscape);
|
|
250
|
+
}, [updateOpen]);
|
|
251
|
+
const updateProvider = useCallback(async (update) => {
|
|
252
|
+
setManagementWriting(true);
|
|
253
|
+
try {
|
|
254
|
+
const result = await callMagpieRpc(rpc, 'management/provider/update', update);
|
|
255
|
+
setManagement(result.snapshot);
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
setManagementWriting(false);
|
|
259
|
+
}
|
|
260
|
+
}, [rpc]);
|
|
261
|
+
const updateGroup = useCallback(async (update) => {
|
|
262
|
+
setManagementWriting(true);
|
|
263
|
+
try {
|
|
264
|
+
const result = await callMagpieRpc(rpc, 'management/group/update', update);
|
|
265
|
+
setManagement(result.snapshot);
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
setManagementWriting(false);
|
|
269
|
+
}
|
|
270
|
+
}, [rpc]);
|
|
271
|
+
const updateAccount = useCallback(async (update) => {
|
|
272
|
+
setManagementWriting(true);
|
|
273
|
+
try {
|
|
274
|
+
const result = await callMagpieRpc(rpc, 'management/account/update', update);
|
|
275
|
+
setManagement(result.snapshot);
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
setManagementWriting(false);
|
|
279
|
+
}
|
|
280
|
+
}, [rpc]);
|
|
281
|
+
useEffect(() => {
|
|
282
|
+
if (section !== 'requests')
|
|
283
|
+
return;
|
|
284
|
+
const controller = new AbortController();
|
|
285
|
+
const sequence = requestSequence.current + 1;
|
|
286
|
+
requestSequence.current = sequence;
|
|
287
|
+
setRequestLoading(true);
|
|
288
|
+
setRequestError(false);
|
|
289
|
+
void callMagpieRpc(rpc, 'usage/requests', {
|
|
290
|
+
period,
|
|
291
|
+
offset: requestOffset,
|
|
292
|
+
limit: PAGE_SIZE,
|
|
293
|
+
...(selectedSession === null ? {} : { sessionId: selectedSession.id, sessionAgent: selectedSession.agent }),
|
|
294
|
+
}, controller.signal).then((next) => {
|
|
295
|
+
if (controller.signal.aborted || sequence !== requestSequence.current)
|
|
296
|
+
return;
|
|
297
|
+
setRequestPage(next);
|
|
298
|
+
setRequestError(next === null);
|
|
299
|
+
}).catch(() => {
|
|
300
|
+
if (controller.signal.aborted || sequence !== requestSequence.current)
|
|
301
|
+
return;
|
|
302
|
+
setRequestError(true);
|
|
303
|
+
}).finally(() => {
|
|
304
|
+
if (!controller.signal.aborted && sequence === requestSequence.current)
|
|
305
|
+
setRequestLoading(false);
|
|
306
|
+
});
|
|
307
|
+
return () => controller.abort();
|
|
308
|
+
}, [period, requestOffset, rpc, section, selectedSession]);
|
|
309
|
+
const filteredSessions = useMemo(() => {
|
|
310
|
+
const query = sessionSearch.trim().toLocaleLowerCase();
|
|
311
|
+
const sessions = dashboard?.sessions ?? [];
|
|
312
|
+
if (query === '')
|
|
313
|
+
return sessions;
|
|
314
|
+
return sessions.filter((session) => session.agent.toLocaleLowerCase().includes(query) || session.id.toLocaleLowerCase().includes(query));
|
|
315
|
+
}, [dashboard?.sessions, sessionSearch]);
|
|
316
|
+
const openSession = (session) => {
|
|
317
|
+
setSelectedSession(session);
|
|
318
|
+
setRequestOffset(0);
|
|
319
|
+
setRequestPage(null);
|
|
320
|
+
selectUsageTab('requests');
|
|
321
|
+
};
|
|
322
|
+
const clearSession = () => {
|
|
323
|
+
setSelectedSession(null);
|
|
324
|
+
setRequestOffset(0);
|
|
325
|
+
setRequestPage(null);
|
|
326
|
+
};
|
|
327
|
+
const style = pageStyle;
|
|
328
|
+
const capturedAt = dashboard?.capturedAt ?? management?.capturedAt ?? null;
|
|
329
|
+
const usageReports = pageTab === 'usage';
|
|
330
|
+
/** Provider and routing-group settings are not period-scoped, so the period filter is hidden there. */
|
|
331
|
+
const periodScoped = pageTab === 'overview' || pageTab === 'usage';
|
|
332
|
+
return createElement('div', {
|
|
333
|
+
className: 'codingns-magpie-page',
|
|
334
|
+
role: 'region',
|
|
335
|
+
'aria-label': t('magpie.pageTitle'),
|
|
336
|
+
style,
|
|
337
|
+
}, createElement('style', undefined, MAGPIE_PAGE_CSS), createElement('header', { className: 'codingns-magpie-topbar' }, createElement('div', { className: 'codingns-magpie-topbar-left' }, periodScoped && createElement('div', { className: 'codingns-magpie-periods', role: 'group', 'aria-label': t('magpie.periodLabel') }, ...PERIODS.map((entry) => createElement('button', {
|
|
338
|
+
key: entry.id,
|
|
339
|
+
type: 'button',
|
|
340
|
+
className: `codingns-magpie-period${period === entry.id ? ' is-active' : ''}`,
|
|
341
|
+
'aria-pressed': period === entry.id,
|
|
342
|
+
onClick: () => {
|
|
343
|
+
setPeriod(entry.id);
|
|
344
|
+
setRequestOffset(0);
|
|
345
|
+
setRequestPage(null);
|
|
346
|
+
},
|
|
347
|
+
}, t(entry.key))))), createElement('nav', { className: 'codingns-magpie-tabs', 'aria-label': t('magpie.pageTitle') }, ...PAGE_TABS.map((entry) => createElement('button', {
|
|
348
|
+
key: entry.id,
|
|
349
|
+
type: 'button',
|
|
350
|
+
className: `codingns-magpie-tab${pageTab === entry.id ? ' is-active' : ''}`,
|
|
351
|
+
'aria-current': pageTab === entry.id ? 'page' : undefined,
|
|
352
|
+
onClick: () => selectPageTab(entry.id),
|
|
353
|
+
}, createElement('span', { className: 'codingns-magpie-tab-icon', 'aria-hidden': true }, entry.icon), createElement('span', { className: 'codingns-magpie-tab-label' }, t(entry.label))))), createElement('div', { className: 'codingns-magpie-topbar-right' }, createElement('button', {
|
|
354
|
+
type: 'button',
|
|
355
|
+
className: 'codingns-magpie-version-button',
|
|
356
|
+
'aria-haspopup': 'dialog',
|
|
357
|
+
'aria-expanded': updateOpen,
|
|
358
|
+
onClick: () => setUpdateOpen(value => !value),
|
|
359
|
+
'aria-label': t('magpie.update.open', { version: updateStatus?.current ?? '—' }),
|
|
360
|
+
title: t('magpie.update.open', { version: updateStatus?.current ?? '—' }),
|
|
361
|
+
}, updateStatus?.current ?? '—'), createElement('button', {
|
|
362
|
+
type: 'button',
|
|
363
|
+
className: 'codingns-magpie-icon-button',
|
|
364
|
+
disabled: dashboardLoading || managementLoading || managementWriting,
|
|
365
|
+
'aria-busy': dashboardLoading || managementLoading,
|
|
366
|
+
onClick: () => setRefreshKey((value) => value + 1),
|
|
367
|
+
'aria-label': t(dashboardLoading || managementLoading ? 'magpie.refreshing' : 'magpie.refresh'),
|
|
368
|
+
title: t(dashboardLoading || managementLoading ? 'magpie.refreshing' : 'magpie.refresh'),
|
|
369
|
+
}, createElement(RefreshIcon, { busy: dashboardLoading || managementLoading })))), updateOpen && createElement(MagpieUpdateDialog, {
|
|
370
|
+
status: updateStatus,
|
|
371
|
+
notes: updateNotes,
|
|
372
|
+
loading: updateLoading,
|
|
373
|
+
error: updateError,
|
|
374
|
+
confirming: updateConfirming,
|
|
375
|
+
notice: updateNotice,
|
|
376
|
+
t,
|
|
377
|
+
onCheck: checkForUpdate,
|
|
378
|
+
onConfirm: installUpdate,
|
|
379
|
+
onConfirmingChange: setUpdateConfirming,
|
|
380
|
+
onRefresh: () => {
|
|
381
|
+
const controller = new AbortController();
|
|
382
|
+
void loadUpdates(controller.signal);
|
|
383
|
+
},
|
|
384
|
+
onClose: () => setUpdateOpen(false),
|
|
385
|
+
}), usageReports && createElement('div', { className: 'codingns-magpie-toolbar has-tabs' }, createElement('div', { className: 'codingns-magpie-toolbar-left' }, createElement('div', { className: 'codingns-magpie-usage-tabs', role: 'group', 'aria-label': t('magpie.usage') }, ...USAGE_TABS.map((entry) => createElement('button', {
|
|
386
|
+
key: entry.id,
|
|
387
|
+
type: 'button',
|
|
388
|
+
className: `codingns-magpie-usage-tab${usageTab === entry.id ? ' is-active' : ''}`,
|
|
389
|
+
'aria-pressed': usageTab === entry.id,
|
|
390
|
+
onClick: () => selectUsageTab(entry.id),
|
|
391
|
+
}, t(entry.label))))),
|
|
392
|
+
// 口径切换只作用于「订阅」页的额度卡;其他用量报表没有"剩余"这个概念。
|
|
393
|
+
section === 'quotas' && createElement('div', { className: 'codingns-magpie-toolbar-right' }, createElement(QuotaViewSwitch, {
|
|
394
|
+
value: quotaView,
|
|
395
|
+
// 没有设置存储(测试/静态预览)时控件只展示、不写回,因此不禁用。
|
|
396
|
+
disabled: settings === undefined ? false : !quotaViewWritable,
|
|
397
|
+
failed: quotaViewSaveFailed,
|
|
398
|
+
onChange: selectQuotaView,
|
|
399
|
+
t,
|
|
400
|
+
}))), createElement('main', { className: 'codingns-magpie-main' }, section === 'providers' || section === 'groups'
|
|
401
|
+
? managementIssue !== null && management === null
|
|
402
|
+
? createElement(EmptyState, { message: t(managementIssueLocaleKey(managementIssue)) })
|
|
403
|
+
: managementLoading && management === null
|
|
404
|
+
? createElement(EmptyState, { message: t('magpie.management.loading'), loading: true })
|
|
405
|
+
: management?.availabilityIssue !== null && management?.availabilityIssue !== undefined
|
|
406
|
+
? createElement(EmptyState, { message: t(managementIssueLocaleKey(management.availabilityIssue)) })
|
|
407
|
+
: section === 'providers'
|
|
408
|
+
? createElement(MagpieProvidersPage, { snapshot: management, t, onUpdate: updateProvider, onAccountUpdate: updateAccount, writing: managementWriting })
|
|
409
|
+
: createElement(MagpieGroupsPage, { snapshot: management, t, onUpdate: updateGroup })
|
|
410
|
+
: dashboardIssue !== null
|
|
411
|
+
? createElement(EmptyState, { message: t(dashboardIssueLocaleKey(dashboardIssue)) })
|
|
412
|
+
: dashboardLoading && dashboard === null
|
|
413
|
+
? createElement(EmptyState, { message: t('magpie.loading'), loading: true })
|
|
414
|
+
: dashboardError && dashboard === null
|
|
415
|
+
? createElement(EmptyState, { message: t('magpie.unavailable') })
|
|
416
|
+
: section === 'overview'
|
|
417
|
+
? createElement(OverviewPage, {
|
|
418
|
+
dashboard, loading: dashboardLoading, error: dashboardError, chartMetric, onChartMetricChange: setChartMetric, t, onOpenSession: openSession,
|
|
419
|
+
})
|
|
420
|
+
: section === 'sessions'
|
|
421
|
+
? createElement(SessionsPage, { dashboard, sessions: filteredSessions, search: sessionSearch, onSearch: setSessionSearch, onOpenSession: openSession, t })
|
|
422
|
+
: section === 'requests'
|
|
423
|
+
? createElement(RequestsPage, { page: requestPage, loading: requestLoading, error: requestError, selectedSession, offset: requestOffset, onOffsetChange: setRequestOffset, onClearSession: clearSession, t })
|
|
424
|
+
: createElement(QuotasPage, { dashboard, loading: dashboardLoading, quotaView, t })));
|
|
425
|
+
}
|
|
426
|
+
export function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, t, onOpenSession }) {
|
|
427
|
+
const [modelBreakdownMode, setModelBreakdownMode] = useState('aggregate');
|
|
428
|
+
const metrics = dashboard?.aggregate;
|
|
429
|
+
if (dashboard === null || dashboard.usageStatus === 'unavailable' || metrics == null) {
|
|
430
|
+
return createElement(EmptyState, { message: t(error ? 'magpie.usageUnavailable' : 'magpie.noUsage'), loading });
|
|
431
|
+
}
|
|
432
|
+
const ioTokens = sumNullable(metrics.inputTokens, metrics.outputTokens);
|
|
433
|
+
const stats = [
|
|
434
|
+
{ label: t('magpie.statTokens'), value: formatCompact(ioTokens), detail: `${t('magpie.metricInput')} ${formatCompact(metrics.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(metrics.outputTokens)}` },
|
|
435
|
+
{ label: t('magpie.metricCacheRead'), value: formatCompact(metrics.cacheReadTokens), detail: `${t('magpie.metricCacheWrite')} ${formatCompact(metrics.cacheWriteTokens)}` },
|
|
436
|
+
{ label: t('magpie.metricReasoning'), value: formatCompact(metrics.reasoningTokens), detail: `${t('magpie.statWriteDown')} ${formatCompact(metrics.outputTokens)}` },
|
|
437
|
+
{ label: t('magpie.statCalls'), value: formatInteger(metrics.calls), detail: `${formatInteger(metrics.errors)} ${t('magpie.metricErrors')} · ${formatInteger(metrics.retried)} ${t('magpie.metricRetries')}` },
|
|
438
|
+
];
|
|
439
|
+
return createElement('div', { className: 'codingns-magpie-view' }, error && createElement(InlineNotice, { message: t('magpie.usageUnavailable') }), createElement(StatStrip, { stats }), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-barchart-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', { className: 'codingns-magpie-chart-switch', role: 'group', 'aria-label': t('magpie.timeline') }, ...['calls', 'tokens', 'cost'].map((metric) => createElement('button', {
|
|
440
|
+
key: metric,
|
|
441
|
+
type: 'button',
|
|
442
|
+
'aria-pressed': chartMetric === metric,
|
|
443
|
+
className: chartMetric === metric ? 'is-active' : '',
|
|
444
|
+
onClick: () => onChartMetricChange(metric),
|
|
445
|
+
}, metric === 'calls' ? t('magpie.metricCalls') : metric === 'tokens' ? t('magpie.tokens') : t('magpie.metricCost'))))), createElement(BarChart, { points: dashboard.series, metric: chartMetric, label: t(`magpie.chart.${chartMetric}`) })), createElement(ProgressSection, { title: t('magpie.byAgent'), rows: dashboard.agents, t }), createElement(ModelProgressSection, { rows: dashboard.models, mode: modelBreakdownMode, onModeChange: setModelBreakdownMode, t }), dashboard.sessions.length > 0 && createElement(ProgressSection, {
|
|
446
|
+
title: t('magpie.topSessions'),
|
|
447
|
+
rows: dashboard.sessions.map((session) => ({
|
|
448
|
+
...session,
|
|
449
|
+
id: `${session.agent}:${session.id}`,
|
|
450
|
+
name: session.dshSessionName ?? session.agent,
|
|
451
|
+
model: session.id,
|
|
452
|
+
provider: null,
|
|
453
|
+
account: null,
|
|
454
|
+
})),
|
|
455
|
+
t,
|
|
456
|
+
onOpen: (row) => {
|
|
457
|
+
const target = dashboard.sessions.find((item) => `${item.agent}:${item.id}` === row.id);
|
|
458
|
+
if (target !== undefined)
|
|
459
|
+
onOpenSession(target);
|
|
460
|
+
},
|
|
461
|
+
}));
|
|
462
|
+
}
|
|
463
|
+
function MagpieUpdateDialog({ status, notes, loading, error, confirming, notice, t, onCheck, onConfirm, onConfirmingChange, onRefresh, onClose }) {
|
|
464
|
+
return createElement('div', {
|
|
465
|
+
className: 'codingns-magpie-update-overlay',
|
|
466
|
+
role: 'presentation',
|
|
467
|
+
onMouseDown: (event) => {
|
|
468
|
+
if (event.target === event.currentTarget)
|
|
469
|
+
onClose();
|
|
470
|
+
},
|
|
471
|
+
}, createElement('div', {
|
|
472
|
+
className: 'codingns-magpie-update-dialog',
|
|
473
|
+
role: 'dialog',
|
|
474
|
+
'aria-modal': true,
|
|
475
|
+
'aria-label': t('magpie.update.title'),
|
|
476
|
+
onMouseDown: (event) => event.stopPropagation(),
|
|
477
|
+
}, createElement(MagpieUpdatePanel, {
|
|
478
|
+
status,
|
|
479
|
+
notes,
|
|
480
|
+
loading,
|
|
481
|
+
error,
|
|
482
|
+
confirming,
|
|
483
|
+
notice,
|
|
484
|
+
t,
|
|
485
|
+
onCheck,
|
|
486
|
+
onConfirm,
|
|
487
|
+
onConfirmingChange,
|
|
488
|
+
onRefresh,
|
|
489
|
+
onClose,
|
|
490
|
+
})));
|
|
491
|
+
}
|
|
492
|
+
function MagpieUpdatePanel({ status, notes, loading, error, confirming, notice, t, onCheck, onConfirm, onConfirmingChange, onRefresh, onClose }) {
|
|
493
|
+
const updateAvailable = status !== null && ['found', 'ready', 'available', 'error'].includes(status.state);
|
|
494
|
+
const release = notes?.releases.find(item => item.version === status?.latest) ?? notes?.releases[0];
|
|
495
|
+
const progress = status?.state === 'downloading' && status.total !== null && status.total > 0 && status.done !== null
|
|
496
|
+
? Math.max(0, Math.min(100, Math.round(status.done / status.total * 100)))
|
|
497
|
+
: null;
|
|
498
|
+
return createElement('section', { className: 'codingns-magpie-panel codingns-magpie-update-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.update.title')), createElement('p', undefined, t('magpie.update.description'))), createElement('div', { className: 'codingns-magpie-update-panel-actions' }, createElement('button', {
|
|
499
|
+
type: 'button',
|
|
500
|
+
className: 'codingns-magpie-text-button',
|
|
501
|
+
disabled: loading,
|
|
502
|
+
onClick: onRefresh,
|
|
503
|
+
}, t(loading ? 'magpie.refreshing' : 'magpie.refresh')), createElement('button', {
|
|
504
|
+
type: 'button',
|
|
505
|
+
className: 'codingns-magpie-update-close',
|
|
506
|
+
onClick: onClose,
|
|
507
|
+
'aria-label': t('magpie.update.close'),
|
|
508
|
+
title: t('magpie.update.close'),
|
|
509
|
+
}, '×'))), error !== null
|
|
510
|
+
? createElement(InlineNotice, { message: t(updateIssueLocaleKey(error)) })
|
|
511
|
+
: status === null
|
|
512
|
+
? createElement(EmptyState, { message: t(loading ? 'magpie.loading' : 'magpie.update.unavailable'), loading })
|
|
513
|
+
: createElement('div', { className: 'codingns-magpie-update-body' }, createElement('div', { className: 'codingns-magpie-update-status' }, createElement('strong', undefined, updateStateLabel(status.state, t)), createElement('span', undefined, t('magpie.update.current', { version: status.current })), status.latest !== null && status.latest !== status.current && createElement('span', undefined, t('magpie.update.latest', { version: status.latest }))), status.error !== null && createElement('div', { className: 'codingns-magpie-management-message' }, status.error), progress !== null && createElement('div', { className: 'codingns-magpie-update-progress' }, createElement('span', { style: { width: `${progress}%` } }), createElement('small', undefined, `${progress}%`)), release !== undefined && release.notes.trim() !== '' && createElement('details', {
|
|
514
|
+
className: 'codingns-magpie-update-notes',
|
|
515
|
+
open: status.latest !== null && status.latest !== status.current,
|
|
516
|
+
}, createElement('summary', undefined, t('magpie.update.releaseNotes', { version: release.version })), createElement('div', undefined, release.notes)), confirming && updateAvailable
|
|
517
|
+
? createElement('div', { className: 'codingns-magpie-confirm codingns-magpie-update-confirm' }, createElement('strong', undefined, t('magpie.update.confirmTitle')), createElement('span', undefined, t('magpie.update.confirmWarning')), createElement('div', { className: 'codingns-magpie-management-actions' }, createElement('button', { type: 'button', disabled: loading, onClick: () => onConfirmingChange(false) }, t('magpie.management.cancel')), createElement('button', { type: 'button', className: 'is-primary', disabled: loading, onClick: onConfirm }, loading ? t('magpie.refreshing') : t('magpie.update.confirm'))))
|
|
518
|
+
: createElement('div', { className: 'codingns-magpie-management-actions' }, updateAvailable && createElement('button', {
|
|
519
|
+
type: 'button',
|
|
520
|
+
className: 'is-primary',
|
|
521
|
+
disabled: loading,
|
|
522
|
+
onClick: () => onConfirmingChange(true),
|
|
523
|
+
}, t(status.state === 'error' && status.retry ? 'magpie.update.retry' : 'magpie.update.manual')), status.state === 'checking' && createElement('span', { className: 'codingns-magpie-management-message' }, t('magpie.update.checking')), status.state === 'downloading' && createElement('span', { className: 'codingns-magpie-management-message' }, t('magpie.update.downloading'))), notice !== '' && createElement('div', { className: 'codingns-magpie-management-message', role: 'status' }, notice), !confirming && createElement('div', { className: 'codingns-magpie-update-actions' }, createElement('button', { type: 'button', disabled: loading, onClick: onCheck }, loading ? t('magpie.refreshing') : t('magpie.update.check')))));
|
|
524
|
+
}
|
|
525
|
+
export function ModelProgressSection({ rows, mode, onModeChange, t }) {
|
|
526
|
+
const controls = createElement('div', { className: 'codingns-magpie-chart-switch', role: 'group', 'aria-label': t('magpie.modelBreakdown') }, ...['aggregate', 'account'].map((value) => createElement('button', {
|
|
527
|
+
key: value,
|
|
528
|
+
type: 'button',
|
|
529
|
+
className: mode === value ? 'is-active' : '',
|
|
530
|
+
'aria-pressed': mode === value,
|
|
531
|
+
onClick: () => onModeChange(value),
|
|
532
|
+
}, value === 'aggregate' ? t('magpie.modelAggregate') : t('magpie.modelPerAccount'))));
|
|
533
|
+
const displayRows = modelBreakdownRows(rows, mode);
|
|
534
|
+
return createElement(ProgressSection, {
|
|
535
|
+
// The two modes have different row identity semantics; remount the list so React cannot
|
|
536
|
+
// retain an account row when returning to the aggregated view.
|
|
537
|
+
key: `model-breakdown-${mode}`,
|
|
538
|
+
title: t('magpie.byModel'),
|
|
539
|
+
rows: displayRows,
|
|
540
|
+
t,
|
|
541
|
+
header: controls,
|
|
542
|
+
...(mode === 'aggregate' ? { limit: 8 } : {}),
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
export function SessionsPage({ dashboard, sessions, search, onSearch, onOpenSession, t }) {
|
|
546
|
+
const [agentFilter, setAgentFilter] = useState('');
|
|
547
|
+
const agentNames = useMemo(() => [...new Set(sessions.map((session) => session.agent))].sort(), [sessions]);
|
|
548
|
+
const visible = agentFilter === '' ? sessions : sessions.filter((session) => session.agent === agentFilter);
|
|
549
|
+
const aggregate = sumSessions(visible);
|
|
550
|
+
const metrics = dashboard?.aggregate;
|
|
551
|
+
const stats = [
|
|
552
|
+
{ label: t('magpie.statSessions'), value: formatInteger(visible.length), detail: t('magpie.sessionsCount', { count: visible.length }) },
|
|
553
|
+
{ label: t('magpie.statTokens'), value: formatCompact(sumNullable(aggregate.inputTokens, aggregate.outputTokens)), detail: `${t('magpie.metricInput')} ${formatCompact(aggregate.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(aggregate.outputTokens)}` },
|
|
554
|
+
{ label: t('magpie.metricCost'), value: formatValue(aggregate.cost), detail: `${formatInteger(aggregate.unpriced)} ${t('magpie.metricUnpriced')}` },
|
|
555
|
+
{ label: t('magpie.metricCacheRead'), value: formatCompact(aggregate.cacheReadTokens), detail: `${t('magpie.metricCacheWrite')} ${formatCompact(aggregate.cacheWriteTokens)}` },
|
|
556
|
+
{ label: t('magpie.statReasoning'), value: formatCompact(aggregate.reasoningTokens), detail: t('magpie.statReasoningNote') },
|
|
557
|
+
];
|
|
558
|
+
return createElement('div', { className: 'codingns-magpie-view' }, createElement('div', { className: 'codingns-magpie-chiprow', role: 'group', 'aria-label': t('magpie.sessions') }, createElement('button', { type: 'button', className: `codingns-magpie-chip${agentFilter === '' ? ' is-active' : ''}`, onClick: () => setAgentFilter('') }, t('magpie.all')), ...agentNames.map((agent) => createElement('button', { key: agent, type: 'button', className: `codingns-magpie-chip${agentFilter === agent ? ' is-active' : ''}`, onClick: () => setAgentFilter(agent) }, createElement(MagpieProviderLogo, { identities: [agent], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), agent))), createElement('div', { className: 'codingns-magpie-filterrow' }, createElement('label', { className: 'codingns-magpie-search codingns-magpie-grow' }, createElement(SearchIcon), createElement('input', { type: 'search', value: search, onChange: (event) => onSearch(event.currentTarget.value), placeholder: t('magpie.sessionSearch'), 'aria-label': t('magpie.sessionSearch') })), metrics != null && createElement('span', { className: 'codingns-magpie-filter-summary' }, t('magpie.sessionCountUnknown') === '' ? '' : t('magpie.sessionsCount', { count: dashboard?.sessionCount ?? visible.length }))), createElement(StatStrip, { stats }), dashboard !== null && dashboard.series.length > 1 && createElement('section', { className: 'codingns-magpie-panel codingns-magpie-barchart-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.dailyTrend')))), createElement(BarChart, { points: dashboard.series, metric: 'tokens', label: t('magpie.chart.tokens') })), visible.length === 0
|
|
559
|
+
? createElement(EmptyState, { message: t(search === '' && agentFilter === '' ? 'magpie.noSessions' : 'magpie.noRequests') })
|
|
560
|
+
: createElement('section', { className: 'codingns-magpie-panel codingns-magpie-toplist-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('h2', undefined, t('magpie.topSessions'))), ...visible.slice(0, 40).map((session) => createElement('button', {
|
|
561
|
+
key: `${session.agent}:${session.id}`,
|
|
562
|
+
type: 'button',
|
|
563
|
+
className: 'codingns-magpie-toprow',
|
|
564
|
+
onClick: () => onOpenSession(session),
|
|
565
|
+
}, createElement(MagpieProviderLogo, { identities: [session.agent], size: 28, className: 'codingns-magpie-provider-logo', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-toprow-main' }, createElement('strong', undefined, session.dshSessionName ?? session.agent), session.dshSessionName !== undefined && createElement('small', { title: session.agent }, session.agent), createElement('small', { title: session.id }, session.id)), createElement('span', { className: 'codingns-magpie-toprow-metrics' }, createElement('span', undefined, formatCompact(sumNullable(session.inputTokens, session.outputTokens))), createElement('span', undefined, formatInteger(session.calls)), createElement('span', undefined, formatValue(session.cost)))))));
|
|
566
|
+
}
|
|
567
|
+
function sumSessions(sessions) {
|
|
568
|
+
const total = { calls: 0, errors: 0, retried: 0, inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, reasoningTokens: 0, cost: 0, unpriced: 0 };
|
|
569
|
+
let any = false;
|
|
570
|
+
for (const session of sessions) {
|
|
571
|
+
any = true;
|
|
572
|
+
total.calls += session.calls ?? 0;
|
|
573
|
+
total.errors += session.errors ?? 0;
|
|
574
|
+
total.retried += session.retried ?? 0;
|
|
575
|
+
total.inputTokens += session.inputTokens ?? 0;
|
|
576
|
+
total.outputTokens += session.outputTokens ?? 0;
|
|
577
|
+
total.cacheReadTokens += session.cacheReadTokens ?? 0;
|
|
578
|
+
total.cacheWriteTokens += session.cacheWriteTokens ?? 0;
|
|
579
|
+
total.reasoningTokens += session.reasoningTokens ?? 0;
|
|
580
|
+
total.cost += session.cost ?? 0;
|
|
581
|
+
total.unpriced += session.unpriced ?? 0;
|
|
582
|
+
}
|
|
583
|
+
return any ? total : { ...total };
|
|
584
|
+
}
|
|
585
|
+
export function RequestsPage({ page, loading, error, selectedSession, offset, onOffsetChange, onClearSession, t }) {
|
|
586
|
+
const items = page?.items ?? [];
|
|
587
|
+
const aggregate = sumRequests(items);
|
|
588
|
+
const stats = [
|
|
589
|
+
{ label: t('magpie.statTokens'), value: formatCompact(sumNullable(aggregate.inputTokens, aggregate.outputTokens)), detail: `${t('magpie.metricInput')} ${formatCompact(aggregate.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(aggregate.outputTokens)}` },
|
|
590
|
+
{ label: t('magpie.statCalls'), value: formatInteger(page?.total ?? aggregate.calls), detail: `${formatInteger(aggregate.errors)} ${t('magpie.metricErrors')} · ${formatInteger(aggregate.retried)} ${t('magpie.metricRetries')}` },
|
|
591
|
+
{ label: t('magpie.metricCost'), value: formatValue(aggregate.cost), detail: `${formatInteger(aggregate.unpriced)} ${t('magpie.metricUnpriced')}` },
|
|
592
|
+
{ label: t('magpie.statSpeed'), value: aggregate.decodeTokens === null ? '—' : `${formatValue(aggregate.decodeTokens)} token/s`, detail: aggregate.decodeCount === null ? undefined : `${formatInteger(aggregate.decodeCount)} ${t('magpie.metricDecodeCount')}` },
|
|
593
|
+
{ label: t('magpie.statLatency'), value: aggregate.ttftMs === null ? '—' : `${formatValue(aggregate.ttftMs)} ms`, detail: t('magpie.statLatencyNote') },
|
|
594
|
+
];
|
|
595
|
+
return createElement('div', { className: 'codingns-magpie-view' }, selectedSession !== null && createElement('div', { className: 'codingns-magpie-selection' }, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [selectedSession.agent], size: 20, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), selectedSession.dshSessionName ?? t('magpie.requestFor', { agent: selectedSession.agent, id: selectedSession.id })), onClearSession !== null && createElement('button', { type: 'button', className: 'codingns-magpie-text-button', onClick: onClearSession }, t('magpie.clearSession'))), error && createElement(InlineNotice, { message: t('magpie.usageUnavailable') }), loading && page === null
|
|
596
|
+
? createElement(EmptyState, { message: t('magpie.loading'), loading: true })
|
|
597
|
+
: page === null || items.length === 0
|
|
598
|
+
? createElement(EmptyState, { message: t('magpie.noRequests') })
|
|
599
|
+
: createElement('div', undefined, createElement(StatStrip, { stats }), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-request-panel' }, createElement('div', { className: 'codingns-magpie-reqlist' }, ...items.map((request, index) => createElement(NativeRequestCard, { key: `${request.routeId ?? offset + index}:${request.time ?? ''}`, request, t }))), createElement('div', { className: 'codingns-magpie-table-scroll' }, createElement('table', { className: 'codingns-magpie-table codingns-magpie-native-table' }, createElement('thead', undefined, createElement('tr', undefined, createElement('th', undefined, t('magpie.ncolTime')), createElement('th', undefined, 'AGENT'), createElement('th', undefined, t('magpie.ncolRequested')), createElement('th', undefined, t('magpie.ncolProvider')), createElement('th', undefined, t('magpie.ncolServed')), createElement('th', undefined, t('magpie.ncolInput')), createElement('th', undefined, t('magpie.ncolOutput')), createElement('th', undefined, t('magpie.ncolCost')), createElement('th', undefined, t('magpie.ncolFirstText')), createElement('th', undefined, t('magpie.ncolDuration')), createElement('th', undefined, t('magpie.ncolSpeed')), createElement('th', undefined, t('magpie.ncolStatus')))), createElement('tbody', undefined, ...items.map((request, index) => createElement(NativeRequestRow, { key: `${request.routeId ?? offset + index}:${request.time ?? ''}`, request, t }))))), createElement('div', { className: 'codingns-magpie-pagination' }, createElement('span', undefined, page.total === null ? t('magpie.pageOf', { page: Math.floor(offset / PAGE_SIZE) + 1 }) : `${offset + 1}–${Math.min(offset + items.length, page.total)} / ${formatInteger(page.total)}`), createElement('div', undefined, createElement('button', { type: 'button', disabled: offset === 0 || loading, onClick: () => onOffsetChange(Math.max(0, offset - PAGE_SIZE)) }, t('magpie.previous')), createElement('button', { type: 'button', disabled: !page.hasMore || loading, onClick: () => onOffsetChange(offset + PAGE_SIZE) }, t('magpie.next')))))));
|
|
600
|
+
}
|
|
601
|
+
function sumRequests(items) {
|
|
602
|
+
const total = { calls: 0, errors: 0, retried: 0, inputTokens: 0, outputTokens: 0, cost: 0, unpriced: 0 };
|
|
603
|
+
let ttftSum = 0;
|
|
604
|
+
let ttftCount = 0;
|
|
605
|
+
let speedSum = 0;
|
|
606
|
+
let speedCount = 0;
|
|
607
|
+
for (const item of items) {
|
|
608
|
+
total.calls += item.status !== null && /^2/u.test(item.status) ? 1 : 1;
|
|
609
|
+
if (item.status !== null && !/^2/u.test(item.status))
|
|
610
|
+
total.errors += 1;
|
|
611
|
+
total.inputTokens += item.inputTokens ?? 0;
|
|
612
|
+
total.outputTokens += item.outputTokens ?? 0;
|
|
613
|
+
total.cost += item.cost ?? 0;
|
|
614
|
+
if (item.priced === false)
|
|
615
|
+
total.unpriced += 1;
|
|
616
|
+
if (item.firstTextMs !== null) {
|
|
617
|
+
ttftSum += item.firstTextMs;
|
|
618
|
+
ttftCount += 1;
|
|
619
|
+
}
|
|
620
|
+
if (item.durationMs !== null && item.outputTokens !== null && item.durationMs > 0) {
|
|
621
|
+
speedSum += item.outputTokens / (item.durationMs / 1000);
|
|
622
|
+
speedCount += 1;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return {
|
|
626
|
+
calls: total.calls,
|
|
627
|
+
errors: total.errors,
|
|
628
|
+
retried: 0,
|
|
629
|
+
inputTokens: total.inputTokens,
|
|
630
|
+
outputTokens: total.outputTokens,
|
|
631
|
+
cost: total.cost,
|
|
632
|
+
unpriced: total.unpriced,
|
|
633
|
+
ttftMs: ttftCount === 0 ? null : ttftSum / ttftCount,
|
|
634
|
+
decodeTokens: speedCount === 0 ? null : speedSum / speedCount,
|
|
635
|
+
decodeCount: speedCount === 0 ? null : speedCount,
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
function NativeRequestRow({ request, t }) {
|
|
639
|
+
const speed = request.durationMs !== null && request.outputTokens !== null && request.durationMs > 0
|
|
640
|
+
? `${formatValue(request.outputTokens / (request.durationMs / 1000))} token/s`
|
|
641
|
+
: '—';
|
|
642
|
+
return createElement('tr', undefined, createElement('td', { className: 'codingns-magpie-time-cell' }, formatTimestamp(request.time)), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.agent], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-agent-tag' }, request.agent ?? '—'))), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-route-model', title: request.requestedModel ?? '' }, request.requestedModel ?? '—')), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.provider], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-provider-name' }, request.provider ?? '—')), request.account !== null && createElement('small', { className: 'codingns-magpie-table-secondary' }, request.account)), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-route-model' }, request.servedModel ?? '—')), createElement('td', undefined, formatCompact(request.inputTokens)), createElement('td', undefined, formatCompact(request.outputTokens)), createElement('td', { className: 'codingns-magpie-cost-cell' }, formatValue(request.cost)), createElement('td', undefined, request.firstTextMs === null ? '—' : `${formatValue(request.firstTextMs)} ms`), createElement('td', undefined, request.durationMs === null ? '—' : `${formatValue(request.durationMs / 1000)} s`), createElement('td', undefined, speed), createElement('td', undefined, createElement('span', { className: `codingns-magpie-status ${request.status !== null && /^2/u.test(request.status) ? 'is-ok' : 'is-warn'}` }, request.status ?? '—')));
|
|
643
|
+
}
|
|
644
|
+
/** Compact ledger card used below 650px: same fields as the native table, stacked for narrow screens. */
|
|
645
|
+
function NativeRequestCard({ request, t }) {
|
|
646
|
+
const speed = request.durationMs !== null && request.outputTokens !== null && request.durationMs > 0
|
|
647
|
+
? `${formatValue(request.outputTokens / (request.durationMs / 1000))} token/s`
|
|
648
|
+
: '—';
|
|
649
|
+
const facts = [
|
|
650
|
+
`${t('magpie.ncolInput')} ${formatCompact(request.inputTokens)}`,
|
|
651
|
+
`${t('magpie.ncolOutput')} ${formatCompact(request.outputTokens)}`,
|
|
652
|
+
`${t('magpie.ncolCost')} ${formatValue(request.cost)}`,
|
|
653
|
+
request.firstTextMs === null ? null : `${t('magpie.ncolFirstText')} ${formatValue(request.firstTextMs)} ms`,
|
|
654
|
+
request.durationMs === null ? null : `${t('magpie.ncolDuration')} ${formatValue(request.durationMs / 1000)} s`,
|
|
655
|
+
`${t('magpie.ncolSpeed')} ${speed}`,
|
|
656
|
+
].filter((item) => item !== null);
|
|
657
|
+
return createElement('article', { className: 'codingns-magpie-reqcard' }, createElement('div', { className: 'codingns-magpie-reqcard-top' }, createElement('span', { className: 'codingns-magpie-time-cell' }, formatTimestamp(request.time)), createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.agent], size: 16, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-agent-tag' }, request.agent ?? '—')), createElement('span', { className: `codingns-magpie-status ${request.status !== null && /^2/u.test(request.status) ? 'is-ok' : 'is-warn'}` }, request.status ?? '—')), createElement('div', { className: 'codingns-magpie-reqcard-route' }, createElement('span', { className: 'codingns-magpie-route-model', title: request.requestedModel ?? '' }, request.requestedModel ?? '—'), createElement('span', { className: 'codingns-magpie-reqcard-arrow', 'aria-hidden': true }, '→'), createElement('span', { className: 'codingns-magpie-route-model' }, request.servedModel ?? '—')), createElement('div', { className: 'codingns-magpie-reqcard-sub' }, createElement('span', { className: 'codingns-magpie-provider-name' }, request.provider ?? '—'), request.account !== null && createElement('span', { className: 'codingns-magpie-table-secondary' }, request.account)), createElement('div', { className: 'codingns-magpie-reqcard-facts' }, ...facts.map((fact) => createElement('span', { key: fact }, fact))));
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* 订阅卡显示口径的切换控件。
|
|
661
|
+
*
|
|
662
|
+
* 与原生 Magpie 一样是一个两段式分段控件,固定贴在工具栏最右侧;选中结果写回
|
|
663
|
+
* Host 设置,因此刷新页面或换设备后仍保持同一读法。设置不可写时按钮禁用而不隐藏,
|
|
664
|
+
* 避免控件在布局里消失导致工具栏跳动。
|
|
665
|
+
*/
|
|
666
|
+
export function QuotaViewSwitch({ value, disabled, failed, onChange, t }) {
|
|
667
|
+
const label = t('magpie.quotaViewLabel');
|
|
668
|
+
return createElement('div', { className: 'codingns-magpie-quota-view', role: 'group', 'aria-label': label },
|
|
669
|
+
// 图标只提供视觉锚点;口径名称放在 aria-label 里,读屏仍能读出整个控件。
|
|
670
|
+
createElement('span', { className: 'codingns-magpie-quota-view-icon', 'aria-hidden': true, title: failed ? t('magpie.quotaViewFailed') : label }, createElement(QuotaViewIcon, {})), createElement('div', { className: 'codingns-magpie-quota-view-segment' }, ...QUOTA_VIEWS.map((entry) => createElement('button', {
|
|
671
|
+
key: entry.id,
|
|
672
|
+
type: 'button',
|
|
673
|
+
className: `codingns-magpie-quota-view-option${value === entry.id ? ' is-active' : ''}`,
|
|
674
|
+
'aria-pressed': value === entry.id,
|
|
675
|
+
disabled,
|
|
676
|
+
onClick: () => {
|
|
677
|
+
if (value !== entry.id)
|
|
678
|
+
onChange(entry.id);
|
|
679
|
+
},
|
|
680
|
+
}, t(entry.label)))));
|
|
681
|
+
}
|
|
682
|
+
/** 口径控件左侧的圆形图标:半实心圆表示"部分已用",与进度条的语义一致。 */
|
|
683
|
+
function QuotaViewIcon() {
|
|
684
|
+
return createElement('svg', {
|
|
685
|
+
width: 15,
|
|
686
|
+
height: 15,
|
|
687
|
+
viewBox: '0 0 16 16',
|
|
688
|
+
fill: 'none',
|
|
689
|
+
'aria-hidden': true,
|
|
690
|
+
className: 'codingns-magpie-quota-view-icon-svg',
|
|
691
|
+
}, createElement('circle', { cx: 8, cy: 8, r: 6.25, stroke: 'currentColor', strokeWidth: 1.5, opacity: 0.45 }), createElement('path', { d: 'M8 1.75a6.25 6.25 0 0 1 0 12.5z', fill: 'currentColor' }));
|
|
692
|
+
}
|
|
693
|
+
export function QuotasPage({ dashboard, loading, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t }) {
|
|
694
|
+
const quotaUnavailable = dashboard?.quotaStatus !== 'available';
|
|
695
|
+
const quotas = dashboard?.quotas ?? [];
|
|
696
|
+
const quotaHistory = dashboard?.quotaHistory ?? [];
|
|
697
|
+
return createElement('div', { className: 'codingns-magpie-view' }, quotaUnavailable
|
|
698
|
+
? createElement(EmptyState, { message: t(dashboard === null && loading ? 'magpie.loading' : 'magpie.quotaUnavailable'), loading: dashboard === null && loading })
|
|
699
|
+
: quotas.length === 0
|
|
700
|
+
? createElement(EmptyState, { message: t('magpie.noQuotas') })
|
|
701
|
+
: createElement('div', { className: 'codingns-magpie-quota-grid' }, ...groupQuotaRowsByProvider(quotas).map((group) => createElement(QuotaGroupCard, { key: group.provider, group, quotaView, t }))), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-history-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.quotaHistory')), createElement('p', undefined, t('magpie.quotaHistoryNote')))), quotaHistory.length === 0
|
|
702
|
+
? createElement('div', { className: 'codingns-magpie-inline-empty' }, t(dashboard === null && loading ? 'magpie.loading' : dashboard?.quotaHistoryStatus === 'available' ? 'magpie.noHistory' : 'magpie.historyUnavailable'))
|
|
703
|
+
: createElement('div', { className: 'codingns-magpie-history-grid' }, ...quotaHistory.map((history) => createElement(QuotaHistoryCard, { key: `${history.provider}:${history.user ?? ''}`, history })))));
|
|
704
|
+
}
|
|
705
|
+
function StatStrip({ stats }) {
|
|
706
|
+
return createElement('div', { className: 'codingns-magpie-statstrip' }, ...stats.map((stat) => createElement('div', { key: stat.label, className: 'codingns-magpie-statcell' }, createElement('span', { className: 'codingns-magpie-statcell-label' }, stat.label), createElement('strong', { className: 'codingns-magpie-statcell-value' }, stat.value), stat.detail !== undefined && stat.detail !== '' && createElement('small', { className: 'codingns-magpie-statcell-detail' }, stat.detail))));
|
|
707
|
+
}
|
|
708
|
+
function BarChart({ points, metric, label }) {
|
|
709
|
+
const values = points.map((point) => metric === 'calls'
|
|
710
|
+
? point.calls
|
|
711
|
+
: metric === 'tokens' ? sumNullable(point.inputTokens, point.outputTokens) : point.cost);
|
|
712
|
+
const known = values.filter((value) => value !== null && Number.isFinite(value));
|
|
713
|
+
if (known.length === 0)
|
|
714
|
+
return createElement('div', { className: 'codingns-magpie-inline-empty' }, '—');
|
|
715
|
+
const max = Math.max(1, ...known);
|
|
716
|
+
const labelEvery = Math.max(1, Math.ceil(points.length / 12));
|
|
717
|
+
return createElement('div', { className: 'codingns-magpie-barchart' }, createElement('div', { className: 'codingns-magpie-barchart-plot', role: 'img', 'aria-label': label }, ...points.map((point, index) => {
|
|
718
|
+
const value = values[index] ?? null;
|
|
719
|
+
const height = value === null || !Number.isFinite(value) ? 0 : Math.max(2, (value / max) * 100);
|
|
720
|
+
return createElement('div', { key: `${point.time ?? point.label ?? index}`, className: 'codingns-magpie-bar-slot', title: `${point.label ?? point.time ?? ''} ${value === null ? '—' : formatValue(value)}` }, createElement('span', { className: 'codingns-magpie-bar', style: { height: `${height}%` } }, value !== null && createElement('span', { className: 'codingns-magpie-bar-cap' })));
|
|
721
|
+
})), createElement('div', { className: 'codingns-magpie-barchart-axis' }, ...points.flatMap((point, index) => index % labelEvery === 0
|
|
722
|
+
? [createElement('span', { key: `${point.time ?? index}`, className: 'codingns-magpie-barchart-tick' }, point.label ?? '')]
|
|
723
|
+
: [])), createElement('div', { className: 'codingns-magpie-barchart-peak' }, formatValue(Math.max(...known))));
|
|
724
|
+
}
|
|
725
|
+
function ProgressSection({ title, rows, t, onOpen, header, limit = 8 }) {
|
|
726
|
+
const sorted = [...rows].sort((left, right) => (right.cost ?? -1) - (left.cost ?? -1) || (right.calls ?? -1) - (left.calls ?? -1));
|
|
727
|
+
const display = limit === undefined ? sorted : sorted.slice(0, limit);
|
|
728
|
+
const hasCost = display.some((row) => row.cost !== null);
|
|
729
|
+
const max = Math.max(1, ...display.map((row) => hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
|
|
730
|
+
return createElement('section', { className: 'codingns-magpie-panel codingns-magpie-progress-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('h2', undefined, title), header), display.length === 0
|
|
731
|
+
? createElement('div', { className: 'codingns-magpie-inline-empty' }, '—')
|
|
732
|
+
: createElement('div', { className: 'codingns-magpie-progress-list' }, ...display.map((row) => {
|
|
733
|
+
const label = row.label ?? row.name ?? row.model ?? row.account ?? row.provider ?? row.agent ?? row.id;
|
|
734
|
+
const weight = Math.max(0, (hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
|
|
735
|
+
const body = createElement('div', { className: 'codingns-magpie-progress-row' }, createElement('div', { className: 'codingns-magpie-progress-head' }, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [row.agent, row.provider, row.model, row.id], size: 20, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-progress-copy' }, createElement('span', { className: 'codingns-magpie-progress-name', title: label }, label), (row.account ?? row.provider) !== null && createElement('small', { className: 'codingns-magpie-progress-context', title: row.account ?? row.provider ?? '' }, row.account ?? row.provider))), createElement('strong', { className: 'codingns-magpie-progress-value' }, hasCost ? formatValue(row.cost) : formatCompact(sumNullable(row.inputTokens, row.outputTokens)))), createElement('div', { className: 'codingns-magpie-progress-track' }, createElement('span', { style: { width: `${Math.max(2, (weight / max) * 100)}%` } })), createElement('small', { className: 'codingns-magpie-progress-meta' }, `${formatInteger(row.calls)} ${t('magpie.metricCalls')} · ${formatCompact(sumNullable(row.inputTokens, row.outputTokens))} token · ${formatValue(row.cost)}`));
|
|
736
|
+
return onOpen === undefined
|
|
737
|
+
? createElement('div', { key: row.id, className: 'codingns-magpie-progress-item' }, body)
|
|
738
|
+
: createElement('button', { key: row.id, type: 'button', className: 'codingns-magpie-progress-item is-button', onClick: () => onOpen(row) }, body);
|
|
739
|
+
})));
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* 一个厂商的订阅卡:卡头是厂商本身,卡内按账号分段列出额度。
|
|
743
|
+
*
|
|
744
|
+
* 同一厂商的多个账号(如 WorkBuddy 的 4 个)共用一张卡,避免每个账号各占一张卡导致
|
|
745
|
+
* 同类账号被拆散在网格各处;单账号厂商的读法与改造前一致。
|
|
746
|
+
*/
|
|
747
|
+
function QuotaGroupCard({ group, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t }) {
|
|
748
|
+
const first = group.accounts[0];
|
|
749
|
+
// 默认展开:只有用户主动收起后才是折叠态。
|
|
750
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
751
|
+
const multi = group.accounts.length > 1;
|
|
752
|
+
const visible = multi && collapsed ? group.accounts.slice(0, 1) : group.accounts;
|
|
753
|
+
const hidden = group.accounts.length - visible.length;
|
|
754
|
+
return createElement('article', { className: 'codingns-magpie-panel codingns-magpie-quota-card' }, createElement('div', { className: 'codingns-magpie-quota-topline' }, createElement(MagpieProviderLogo, { identities: [group.provider, group.name], logoDataUrl: group.logoDataUrl, size: 52, className: 'codingns-magpie-quota-icon codingns-magpie-provider-logo' }), createElement('div', undefined, createElement('h2', undefined, group.name || group.provider), createElement('p', undefined, first.plan ?? first.kind ?? group.provider)), multi && createElement('button', {
|
|
755
|
+
type: 'button',
|
|
756
|
+
className: 'codingns-magpie-quota-count',
|
|
757
|
+
'aria-expanded': !collapsed,
|
|
758
|
+
onClick: () => setCollapsed((value) => !value),
|
|
759
|
+
title: collapsed ? t('magpie.quotaShowAllAccounts') : t('magpie.quotaShowMainAccount'),
|
|
760
|
+
}, collapsed
|
|
761
|
+
? `${t('magpie.quotaAccounts', { count: group.accounts.length })} · ${t('magpie.quotaRemainingAccounts', { count: hidden })}`
|
|
762
|
+
: t('magpie.quotaCollapseAccounts', { count: group.accounts.length }))), ...visible.map((quota, index) => createElement(QuotaAccountSection, {
|
|
763
|
+
key: `${group.provider}:${quota.user ?? index}`,
|
|
764
|
+
quota,
|
|
765
|
+
quotaView,
|
|
766
|
+
t,
|
|
767
|
+
// 单账号时不重复显示账号段头,保持与改造前一致的读法。
|
|
768
|
+
showHeading: multi,
|
|
769
|
+
})));
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* 卡内单个账号:账号行、余额、窗口进度条与每日用量。
|
|
773
|
+
*
|
|
774
|
+
* 有百分比的账号走进度条;没有百分比但有余额的账号(New-API 的 `$74.14`、
|
|
775
|
+
* Sub2api 的钱包余额、按积分计量的 WorkBuddy)单独显示余额行,与 Magpie 原生卡片
|
|
776
|
+
* 一致——过去这些账号只剩一条空进度条,余额被完全藏起来。
|
|
777
|
+
*/
|
|
778
|
+
function QuotaAccountSection({ quota, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t, showHeading }) {
|
|
779
|
+
// `daily` 现在带 `since`,按日点位于 `days` 里。
|
|
780
|
+
const dailyValues = quota.daily.days.map((point) => point.used).filter((value) => value !== null);
|
|
781
|
+
const balance = resolveQuotaAccountBalance(quota);
|
|
782
|
+
// 只有真正带百分比的窗口才画进度条;纯金额窗口在余额行里已经有完整读法。
|
|
783
|
+
const percentWindows = quota.windows.filter((window) => window.usedPercent !== null || window.remainingPercent !== null);
|
|
784
|
+
return createElement('div', { className: 'codingns-magpie-quota-account-block' }, showHeading && createElement('div', { className: 'codingns-magpie-quota-account-head' }, createElement('strong', undefined, quota.alias ?? quota.name), quota.user !== null && createElement('span', undefined, t('magpie.account', { account: quota.user })), quota.plan !== null && createElement('small', undefined, quota.plan)), !showHeading && quota.user !== null && createElement('div', { className: 'codingns-magpie-quota-account' }, t('magpie.account', { account: quota.user })), balance !== null && createElement('div', { className: 'codingns-magpie-quota-balance' }, createElement('span', { className: 'codingns-magpie-quota-balance-label' }, t('magpie.balance')), createElement('strong', { className: balance.money ? 'codingns-magpie-quota-balance-value is-money' : 'codingns-magpie-quota-balance-value', title: balance.raw }, balance.text)), quota.windows.length === 0
|
|
785
|
+
? balance === null && createElement('div', { className: 'codingns-magpie-inline-empty' }, t('magpie.noLimit'))
|
|
786
|
+
: percentWindows.length > 0 && percentWindows.map((window) => {
|
|
787
|
+
const used = window.usedPercent ?? (window.remainingPercent === null ? null : 100 - window.remainingPercent);
|
|
788
|
+
const remaining = window.remainingPercent ?? (used === null ? null : 100 - used);
|
|
789
|
+
// 口径只改读法:同一组百分比既可以读成"已用多少",也可以读成"还剩多少",
|
|
790
|
+
// 进度条宽度随口径取对应值,顶部标签也换成对应的本地化文案。
|
|
791
|
+
const barPercent = quotaView === 'used' ? used : remaining;
|
|
792
|
+
const headline = quotaView === 'used'
|
|
793
|
+
? (used === null ? window.display ?? '—' : t('magpie.used', { percent: Math.round(used) }))
|
|
794
|
+
: (remaining === null ? window.display ?? '—' : t('magpie.remaining', { percent: Math.round(remaining) }));
|
|
795
|
+
return createElement('div', { key: window.name, className: 'codingns-magpie-quota-window' }, createElement('div', { className: 'codingns-magpie-quota-window-head' }, createElement('strong', undefined, window.name), createElement('span', undefined, headline)), createElement('div', { className: 'codingns-magpie-track quota-track' }, used === null || remaining === null
|
|
796
|
+
? null
|
|
797
|
+
: createElement('span', { style: { width: `${Math.max(0, Math.min(100, barPercent ?? 0))}%` } })), createElement('div', { className: 'codingns-magpie-quota-foot' }, createElement('span', undefined, window.amount !== null && window.limit !== null ? `${formatValue(window.amount)} / ${formatValue(window.limit)} ${window.unit ?? ''}` : window.display ?? ''), window.resetsAt !== null && createElement('span', undefined, t('magpie.resets', { time: formatTimestamp(window.resetsAt) }))));
|
|
798
|
+
}),
|
|
799
|
+
// 有余额但没有百分比的账号,把重置时间单独留在余额下面。
|
|
800
|
+
balance !== null && percentWindows.length === 0 && quota.windows.some((window) => window.resetsAt !== null) && createElement('div', { className: 'codingns-magpie-quota-foot' }, ...quota.windows.filter((window) => window.resetsAt !== null).map((window) => createElement('span', { key: window.name }, t('magpie.resets', { time: formatTimestamp(window.resetsAt) })))), quota.daily.days.length > 1 && createElement('div', { className: 'codingns-magpie-daily-chart' }, createElement(Sparkline, { values: dailyValues }), createElement('small', undefined, t('magpie.dailyUsage'))));
|
|
801
|
+
}
|
|
802
|
+
function QuotaHistoryCard({ history }) {
|
|
803
|
+
return createElement('div', { className: 'codingns-magpie-history-card' }, createElement('div', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [history.provider], size: 22, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('strong', undefined, history.provider)), history.user !== null && createElement('small', undefined, history.user), ...history.lines.map((line) => createElement('div', { key: line.name, className: 'codingns-magpie-history-line' }, createElement('div', { className: 'codingns-magpie-history-line-head' }, createElement('span', undefined, line.name), createElement('span', undefined, line.points.at(-1)?.left === null || line.points.at(-1)?.left === undefined ? '—' : formatValue(line.points.at(-1).left))), createElement(Sparkline, { values: line.points.map((point) => point.left).filter((value) => value !== null) }))));
|
|
804
|
+
}
|
|
805
|
+
function Sparkline({ values }) {
|
|
806
|
+
const max = Math.max(1, ...values);
|
|
807
|
+
const points = values.map((value, index) => `${values.length <= 1 ? 50 : 2 + (index * 96) / (values.length - 1)},${32 - (Math.max(0, value) / max) * 28}`).join(' ');
|
|
808
|
+
return createElement('svg', { className: 'codingns-magpie-sparkline', viewBox: '0 0 100 36', preserveAspectRatio: 'none', 'aria-hidden': true }, createElement('polyline', { points, fill: 'none' }));
|
|
809
|
+
}
|
|
810
|
+
function EmptyState({ message, loading = false }) {
|
|
811
|
+
return createElement('div', { className: `codingns-magpie-empty${loading ? ' is-loading' : ''}`, role: loading ? 'status' : 'note' }, createElement('span', { className: 'codingns-magpie-empty-mark', 'aria-hidden': true }, loading ? createElement('span', { className: 'codingns-magpie-spinner' }) : '∅'), createElement('span', undefined, message));
|
|
812
|
+
}
|
|
813
|
+
function InlineNotice({ message }) {
|
|
814
|
+
return createElement('div', { className: 'codingns-magpie-notice', role: 'status' }, createElement('span', undefined, 'i'), message);
|
|
815
|
+
}
|
|
816
|
+
/** 刷新图标沿用 DSH 的 1.6 描边简约样式;加载时整体旋转,静默重绘状态下保持静止。 */
|
|
817
|
+
function RefreshIcon({ busy = false }) {
|
|
818
|
+
return createElement('svg', {
|
|
819
|
+
className: `codingns-magpie-refresh-icon${busy ? ' is-spinning' : ''}`,
|
|
820
|
+
width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.6,
|
|
821
|
+
strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true,
|
|
822
|
+
}, createElement('path', { d: 'M20 11a8 8 0 1 0-2.3 5.6' }), createElement('path', { d: 'M20 4.5V11h-6.5' }));
|
|
823
|
+
}
|
|
824
|
+
function SearchIcon() {
|
|
825
|
+
return createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', 'aria-hidden': true }, createElement('circle', { cx: 10.8, cy: 10.8, r: 6.8 }), createElement('path', { d: 'm16 16 4.4 4.4' }));
|
|
826
|
+
}
|
|
827
|
+
export async function callMagpieRpc(rpc, action, payload, signal) {
|
|
828
|
+
const result = await callCodingNsRpcResult(rpc, `magpie/${action}`, payload, signal);
|
|
829
|
+
if (!result.ok)
|
|
830
|
+
throw Object.assign(new Error(result.error.message), { code: result.error.code });
|
|
831
|
+
return result.value;
|
|
832
|
+
}
|
|
833
|
+
export function magpieUpdateIssueForRpcError(error) {
|
|
834
|
+
const record = error !== null && typeof error === 'object' ? error : undefined;
|
|
835
|
+
const code = typeof record?.code === 'string' ? record.code : '';
|
|
836
|
+
const message = typeof record?.message === 'string' ? record.message : '';
|
|
837
|
+
if (code === 'CODINGNS_MAGPIE_UPDATE_UNSUPPORTED')
|
|
838
|
+
return 'cli-version-unsupported';
|
|
839
|
+
if (code === 'CODINGNS_MAGPIE_UPDATE_INVALID')
|
|
840
|
+
return 'update-response-invalid';
|
|
841
|
+
if (code === 'CODINGNS_MAGPIE_UPDATE_CONFIRMATION_REQUIRED')
|
|
842
|
+
return 'host-request-failed';
|
|
843
|
+
if (code === 'CODINGNS_RPC_NOT_FOUND'
|
|
844
|
+
|| (code === 'Error' && /^Unknown Magpie RPC: update\/(?:status|notes|check|install)$/u.test(message))) {
|
|
845
|
+
return 'host-rpc-outdated';
|
|
846
|
+
}
|
|
847
|
+
if (code === 'CODINGNS_MAGPIE_DISABLED')
|
|
848
|
+
return 'feature-disabled';
|
|
849
|
+
return 'host-request-failed';
|
|
850
|
+
}
|
|
851
|
+
export function magpieDashboardIssueForRpcError(error) {
|
|
852
|
+
const code = error !== null && typeof error === 'object' && 'code' in error && typeof error.code === 'string'
|
|
853
|
+
? error.code
|
|
854
|
+
: '';
|
|
855
|
+
if (code === 'CODINGNS_RPC_NOT_FOUND')
|
|
856
|
+
return 'host-rpc-outdated';
|
|
857
|
+
if (code === 'CODINGNS_MAGPIE_DISABLED')
|
|
858
|
+
return 'feature-disabled';
|
|
859
|
+
return 'host-request-failed';
|
|
860
|
+
}
|
|
861
|
+
export function magpieManagementIssueForRpcError(error) {
|
|
862
|
+
const record = error !== null && typeof error === 'object' ? error : undefined;
|
|
863
|
+
const code = typeof record?.code === 'string' ? record.code : '';
|
|
864
|
+
const message = typeof record?.message === 'string' ? record.message : '';
|
|
865
|
+
if (code === 'CODINGNS_RPC_NOT_FOUND'
|
|
866
|
+
|| (code === 'Error' && /^Unknown Magpie RPC: management\/(?:snapshot|provider\/update|group\/update|account\/update)$/u.test(message))) {
|
|
867
|
+
return 'host-rpc-outdated';
|
|
868
|
+
}
|
|
869
|
+
if (code === 'CODINGNS_MAGPIE_DISABLED')
|
|
870
|
+
return 'feature-disabled';
|
|
871
|
+
return 'host-request-failed';
|
|
872
|
+
}
|
|
873
|
+
function dashboardIssueLocaleKey(issue) {
|
|
874
|
+
switch (issue) {
|
|
875
|
+
case 'web-api-unavailable': return 'magpie.webApiUnavailable';
|
|
876
|
+
case 'cli-unavailable': return 'magpie.cliUnavailable';
|
|
877
|
+
case 'cli-version-unsupported': return 'magpie.cliVersionUnsupported';
|
|
878
|
+
case 'model-catalog-unavailable': return 'magpie.catalogUnavailable';
|
|
879
|
+
case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
|
|
880
|
+
case 'feature-disabled': return 'magpie.featureDisabled';
|
|
881
|
+
case 'host-request-failed': return 'magpie.hostRequestFailed';
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
function managementIssueLocaleKey(issue) {
|
|
885
|
+
switch (issue) {
|
|
886
|
+
case 'web-api-unavailable': return 'magpie.webApiUnavailable';
|
|
887
|
+
case 'cli-unavailable': return 'magpie.cliUnavailable';
|
|
888
|
+
case 'cli-version-unsupported': return 'magpie.management.cliVersionUnsupported';
|
|
889
|
+
case 'providers-unavailable': return 'magpie.management.providersUnavailable';
|
|
890
|
+
case 'groups-unavailable': return 'magpie.management.groupsUnavailable';
|
|
891
|
+
case 'accounts-unavailable': return 'magpie.management.accountsUnavailable';
|
|
892
|
+
case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
|
|
893
|
+
case 'feature-disabled': return 'magpie.featureDisabled';
|
|
894
|
+
case 'host-request-failed': return 'magpie.hostRequestFailed';
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
function updateIssueLocaleKey(issue) {
|
|
898
|
+
switch (issue) {
|
|
899
|
+
case 'web-api-unavailable': return 'magpie.webApiUnavailable';
|
|
900
|
+
case 'cli-unavailable': return 'magpie.cliUnavailable';
|
|
901
|
+
case 'cli-version-unsupported': return 'magpie.update.unsupported';
|
|
902
|
+
case 'update-response-invalid': return 'magpie.update.invalid';
|
|
903
|
+
case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
|
|
904
|
+
case 'feature-disabled': return 'magpie.featureDisabled';
|
|
905
|
+
case 'host-request-failed': return 'magpie.hostRequestFailed';
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
function updateStateLabel(state, t) {
|
|
909
|
+
return t(`magpie.update.state.${state}`);
|
|
910
|
+
}
|
|
911
|
+
function sumNullable(left, right) {
|
|
912
|
+
return left === null && right === null ? null : (left ?? 0) + (right ?? 0);
|
|
913
|
+
}
|
|
914
|
+
/** Collapse raw model rows while retaining an identity only when it is unambiguous. */
|
|
915
|
+
export function aggregateModelUsageRows(rows) {
|
|
916
|
+
const grouped = new Map();
|
|
917
|
+
const nameKeys = new Map();
|
|
918
|
+
for (const row of rows) {
|
|
919
|
+
const modelKey = modelUsageKey(row);
|
|
920
|
+
if (modelKey === '')
|
|
921
|
+
continue;
|
|
922
|
+
const nameKey = modelUsageNameKey(row);
|
|
923
|
+
// Some Magpie versions qualify the model ID differently for each account. When the
|
|
924
|
+
// account rows share a provider and display name, the display name is the stable model
|
|
925
|
+
// identity and must win over that account-specific ID.
|
|
926
|
+
const groupKey = nameKey === null ? modelKey : nameKeys.get(nameKey) ?? modelKey;
|
|
927
|
+
if (nameKey !== null)
|
|
928
|
+
nameKeys.set(nameKey, groupKey);
|
|
929
|
+
const current = grouped.get(groupKey);
|
|
930
|
+
if (current === undefined) {
|
|
931
|
+
grouped.set(groupKey, { ...row, id: `model:${groupKey}`, account: null });
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
934
|
+
grouped.set(groupKey, {
|
|
935
|
+
...current,
|
|
936
|
+
name: current.name ?? row.name,
|
|
937
|
+
provider: mergeIdentity(current.provider, row.provider),
|
|
938
|
+
model: current.model ?? row.model,
|
|
939
|
+
agent: mergeIdentity(current.agent, row.agent),
|
|
940
|
+
calls: sumNullable(current.calls, row.calls),
|
|
941
|
+
errors: sumNullable(current.errors, row.errors),
|
|
942
|
+
retried: sumNullable(current.retried, row.retried),
|
|
943
|
+
inputTokens: sumNullable(current.inputTokens, row.inputTokens),
|
|
944
|
+
outputTokens: sumNullable(current.outputTokens, row.outputTokens),
|
|
945
|
+
cacheReadTokens: sumNullable(current.cacheReadTokens, row.cacheReadTokens),
|
|
946
|
+
cacheWriteTokens: sumNullable(current.cacheWriteTokens, row.cacheWriteTokens),
|
|
947
|
+
reasoningTokens: sumNullable(current.reasoningTokens, row.reasoningTokens),
|
|
948
|
+
cost: sumNullable(current.cost, row.cost),
|
|
949
|
+
unpriced: sumNullable(current.unpriced, row.unpriced),
|
|
950
|
+
credits: sumNullable(current.credits, row.credits),
|
|
951
|
+
credited: sumNullable(current.credited, row.credited),
|
|
952
|
+
timed: sumNullable(current.timed, row.timed),
|
|
953
|
+
ttftMs: sumNullable(current.ttftMs, row.ttftMs),
|
|
954
|
+
decodeMs: sumNullable(current.decodeMs, row.decodeMs),
|
|
955
|
+
decodeTokens: sumNullable(current.decodeTokens, row.decodeTokens),
|
|
956
|
+
decodeCount: sumNullable(current.decodeCount, row.decodeCount),
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
return [...grouped.values()];
|
|
960
|
+
}
|
|
961
|
+
/** Return rows with unique React identities so duplicate Magpie IDs cannot leak across modes. */
|
|
962
|
+
export function modelBreakdownRows(rows, mode) {
|
|
963
|
+
if (mode === 'aggregate')
|
|
964
|
+
return aggregateModelUsageRows(rows);
|
|
965
|
+
const seen = new Map();
|
|
966
|
+
return rows.map((row, index) => {
|
|
967
|
+
const baseId = row.id.trim() || `row-${index}`;
|
|
968
|
+
const occurrence = seen.get(baseId) ?? 0;
|
|
969
|
+
seen.set(baseId, occurrence + 1);
|
|
970
|
+
return occurrence === 0 ? row : { ...row, id: `${baseId}#${occurrence}` };
|
|
971
|
+
});
|
|
972
|
+
}
|
|
973
|
+
function modelUsageKey(row) {
|
|
974
|
+
return (row.model ?? row.name ?? row.id).trim().toLocaleLowerCase();
|
|
975
|
+
}
|
|
976
|
+
function modelUsageNameKey(row) {
|
|
977
|
+
if (row.account === null)
|
|
978
|
+
return null;
|
|
979
|
+
const name = row.name?.trim().toLocaleLowerCase() ?? '';
|
|
980
|
+
const provider = row.provider?.trim().toLocaleLowerCase() ?? '';
|
|
981
|
+
return name === '' ? null : `${provider}\u0000${name}`;
|
|
982
|
+
}
|
|
983
|
+
function mergeIdentity(left, right) {
|
|
984
|
+
if (left === null)
|
|
985
|
+
return right;
|
|
986
|
+
if (right === null || left === right)
|
|
987
|
+
return left;
|
|
988
|
+
return null;
|
|
989
|
+
}
|
|
990
|
+
function formatInteger(value) {
|
|
991
|
+
return value === null ? '—' : new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value);
|
|
992
|
+
}
|
|
993
|
+
function formatCompact(value) {
|
|
994
|
+
return value === null ? '—' : new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 }).format(value);
|
|
995
|
+
}
|
|
996
|
+
function formatValue(value) {
|
|
997
|
+
return value === null ? '—' : new Intl.NumberFormat(undefined, { maximumFractionDigits: value >= 100 ? 1 : 4 }).format(value);
|
|
998
|
+
}
|
|
999
|
+
function formatTimestamp(value) {
|
|
1000
|
+
if (value === null)
|
|
1001
|
+
return '—';
|
|
1002
|
+
const parsed = Date.parse(value);
|
|
1003
|
+
if (!Number.isFinite(parsed))
|
|
1004
|
+
return value;
|
|
1005
|
+
return new Intl.DateTimeFormat(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(parsed);
|
|
1006
|
+
}
|
|
1007
|
+
const pageStyle = {
|
|
1008
|
+
display: 'flex', flexDirection: 'column', width: '100%', height: '100%', minWidth: 0, minHeight: 0, boxSizing: 'border-box',
|
|
1009
|
+
paddingTop: 'var(--dsh-frame-top-clearance, 0px)',
|
|
1010
|
+
color: 'var(--dsw-alias-label-primary,CanvasText)', background: 'var(--mp-surface)',
|
|
1011
|
+
border: 0, borderRadius: 0, boxShadow: 'none', overflow: 'hidden',
|
|
1012
|
+
};
|
|
1013
|
+
const MAGPIE_PAGE_CSS = `
|
|
1014
|
+
.codingns-magpie-page{--mp-accent:var(--dsw-alias-state-business-primary,#4176e6);--mp-chart:var(--mp-accent);--mp-ink:var(--dsw-alias-label-primary,CanvasText);--mp-muted:var(--dsw-alias-label-tertiary,GrayText);--mp-caption:var(--dsw-alias-label-caption,GrayText);--mp-line:var(--dsw-alias-border-l2,rgba(0,0,0,.1));--mp-line-strong:var(--dsw-alias-border-l3,rgba(0,0,0,.12));--mp-card:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,transparent));--mp-layer:var(--dsw-alias-bg-module-platform,var(--dsw-alias-bg-layer-2,rgba(127,127,127,.06)));--mp-hover:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.1));--mp-surface:var(--dsw-alias-bg-base,Canvas);--mp-radius:var(--dsw-radius-lg,12px);position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;font:inherit;color:var(--mp-ink);background:var(--mp-surface)}
|
|
1015
|
+
.codingns-magpie-page *{box-sizing:border-box}
|
|
1016
|
+
.codingns-magpie-topbar{flex:0 0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:12px;min-height:56px;padding:var(--mp-topbar-pad-y) calc(var(--mp-topbar-pad-x) + var(--mp-leading-inset));border-bottom:.5px solid var(--mp-line-strong);background:var(--mp-surface)}
|
|
1017
|
+
.codingns-magpie-topbar-left{display:flex;align-items:center;justify-self:start;min-width:0;max-width:100%}
|
|
1018
|
+
.codingns-magpie-topbar-right{display:flex;align-items:center;justify-self:end;gap:8px;min-width:0}
|
|
1019
|
+
.codingns-magpie-version-button{display:inline-flex;align-items:center;min-height:30px;padding:0 9px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:var(--mp-card);color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};font-variant-numeric:tabular-nums;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.codingns-magpie-version-button:hover,.codingns-magpie-version-button[aria-expanded=true]{border-color:color-mix(in srgb,var(--mp-accent) 55%,var(--mp-line-strong));background:color-mix(in srgb,var(--mp-accent) 8%,var(--mp-card));color:var(--mp-ink)}.codingns-magpie-version-button:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
|
|
1020
|
+
.codingns-magpie-icon-button{display:grid;place-items:center;flex:0 0 auto;width:30px;height:30px;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);cursor:pointer;transition:background .15s,color .15s}
|
|
1021
|
+
.codingns-magpie-icon-button:hover{background:var(--mp-hover);color:var(--mp-ink)}
|
|
1022
|
+
.codingns-magpie-icon-button:active{background:var(--mp-layer)}
|
|
1023
|
+
.codingns-magpie-icon-button:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
|
|
1024
|
+
.codingns-magpie-icon-button:disabled{opacity:.5;cursor:default;background:transparent;color:var(--mp-muted)}
|
|
1025
|
+
.codingns-magpie-refresh-icon{display:block;flex:0 0 auto;transition:transform .2s}
|
|
1026
|
+
.codingns-magpie-refresh-icon.is-spinning{animation:magpie-spin .9s linear infinite}
|
|
1027
|
+
@media(prefers-reduced-motion:reduce){.codingns-magpie-refresh-icon.is-spinning{animation:none}}
|
|
1028
|
+
.codingns-magpie-tabs{display:flex;align-items:center;justify-content:center;gap:2px;justify-self:center;min-width:0;overflow-x:auto;scrollbar-width:none}
|
|
1029
|
+
.codingns-magpie-tabs::-webkit-scrollbar{display:none}
|
|
1030
|
+
.codingns-magpie-tab{position:relative;display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;min-height:42px;padding:0 12px;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:color .16s,background .16s}
|
|
1031
|
+
.codingns-magpie-tab:hover{color:var(--mp-ink);background:var(--mp-hover)}
|
|
1032
|
+
.codingns-magpie-tab.is-active{background:transparent;color:var(--mp-ink);font-weight:600;box-shadow:none}
|
|
1033
|
+
.codingns-magpie-tab.is-active:after{content:'';position:absolute;left:10px;right:10px;bottom:0;height:2px;border-radius:2px;background:var(--mp-accent)}
|
|
1034
|
+
.codingns-magpie-tab-icon{display:grid;place-items:center;width:15px;font-size:${uiFontSize(13)};line-height:1;opacity:.85}
|
|
1035
|
+
.codingns-magpie-toolbar{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:14px;min-height:46px;padding:0 20px;border-bottom:.5px solid var(--mp-line);background:var(--mp-surface)}
|
|
1036
|
+
.codingns-magpie-toolbar-left{display:flex;align-items:center;gap:12px;min-width:0}
|
|
1037
|
+
.codingns-magpie-periods{flex-direction:row;overflow:auto;display:flex;align-items:center;gap:2px;min-width:0;padding:2px;border-radius:999px;background:var(--mp-layer);scrollbar-width:none}
|
|
1038
|
+
.codingns-magpie-periods::-webkit-scrollbar{display:none}
|
|
1039
|
+
.codingns-magpie-period{flex:0 0 auto;min-height:26px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
|
|
1040
|
+
.codingns-magpie-period:hover{color:var(--mp-ink)}
|
|
1041
|
+
.codingns-magpie-period.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
|
|
1042
|
+
.codingns-magpie-live-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--dsw-alias-state-success-primary,#3f9d6b);box-shadow:0 0 0 4px color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent)}
|
|
1043
|
+
.codingns-magpie-main{flex:1 1 0;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;background:var(--mp-surface)}
|
|
1044
|
+
.codingns-magpie-view{max-width:1320px;margin:0 auto;padding:18px clamp(16px,2.4vw,28px) 40px}
|
|
1045
|
+
.codingns-magpie-panel{min-width:0;border:.5px solid var(--mp-line);border-radius:var(--mp-radius);background:var(--mp-card)}
|
|
1046
|
+
.codingns-magpie-panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:13px}
|
|
1047
|
+
.codingns-magpie-panel-head h2{margin:0;font-size:${uiFontSize(14)};font-weight:600}.codingns-magpie-panel-head p{margin:4px 0 0;color:var(--mp-muted);font-size:${uiFontSize(13)};line-height:1.5}
|
|
1048
|
+
.codingns-magpie-chart-switch{display:flex;flex-wrap:wrap;gap:2px;padding:2px;border:0;border-radius:999px;background:var(--mp-layer)}
|
|
1049
|
+
.codingns-magpie-chart-switch button{border:0;border-radius:999px;padding:5px 10px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}.codingns-magpie-chart-switch button.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
|
|
1050
|
+
.codingns-magpie-track{height:4px;margin:7px 0 5px;border-radius:99px;background:var(--mp-hover);overflow:hidden}.codingns-magpie-track span{display:block;height:100%;min-width:2px;border-radius:inherit;background:linear-gradient(90deg,var(--mp-accent),color-mix(in srgb,var(--mp-accent) 55%,transparent));transition:width .35s ease}
|
|
1051
|
+
.codingns-magpie-text-button{border:0;background:transparent;color:var(--dsw-alias-link,var(--mp-accent));font:inherit;font-size:${uiFontSize(13)};font-weight:600;cursor:pointer}.codingns-magpie-text-button:hover{text-decoration:underline}
|
|
1052
|
+
.codingns-magpie-search{display:flex;align-items:center;gap:9px;max-width:420px;margin:0 0 14px;padding:8px 12px;border:.5px solid var(--dsw-alias-border-l4,rgba(0,0,0,.16));border-radius:10px;color:var(--mp-muted);background:var(--mp-card)}.codingns-magpie-search input{width:100%;border:0;outline:0;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)}}
|
|
1053
|
+
.codingns-magpie-request-panel{overflow:hidden}.codingns-magpie-table-scroll{overflow:auto;overscroll-behavior-inline:contain}.codingns-magpie-table{width:100%;min-width:880px;border-collapse:collapse}.codingns-magpie-table th{padding:9px 12px;border-bottom:.5px solid var(--mp-line);color:var(--mp-caption);font-size:${uiFontSize(13)};font-weight:600;text-align:left;white-space:nowrap}.codingns-magpie-table td{max-width:250px;padding:10px 12px;border-bottom:.5px solid var(--mp-line);font-size:${uiFontSize(13)};vertical-align:middle}.codingns-magpie-table tbody tr:last-child td{border-bottom:0}.codingns-magpie-table tbody tr:hover{background:var(--mp-card)}
|
|
1054
|
+
.codingns-magpie-time-cell{white-space:nowrap;color:var(--mp-muted)}.codingns-magpie-provider-name,.codingns-magpie-route-model{display:block;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:620}.codingns-magpie-table-secondary{display:block;max-width:220px;margin-top:3px;overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(12)};text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-cost-cell{font-variant-numeric:tabular-nums}
|
|
1055
|
+
.codingns-magpie-status{display:inline-block;padding:2px 7px;border-radius:6px;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 12%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(12)};font-variant-numeric:tabular-nums}.codingns-magpie-status.is-ok{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent);color:var(--dsw-alias-state-success-primary,#3f9d6b)}
|
|
1056
|
+
.codingns-magpie-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-top:.5px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-pagination div{display:flex;gap:6px}.codingns-magpie-pagination button{min-height:28px;padding:0 10px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};cursor:pointer}.codingns-magpie-pagination button:disabled{opacity:.4;cursor:not-allowed}
|
|
1057
|
+
/* Lay the subscription cards out in a multi-column flow: a CSS Grid row is as
|
|
1058
|
+
tall as its tallest card, which leaves large gaps under short cards when a
|
|
1059
|
+
provider has several accounts but a single window. Each column fills top to
|
|
1060
|
+
bottom instead, matching Magpie's own layout. */
|
|
1061
|
+
.codingns-magpie-quota-grid{column-width:340px;column-gap:12px;margin-bottom:13px}
|
|
1062
|
+
/* Never split a card across two columns: its title and quota stay together. */
|
|
1063
|
+
.codingns-magpie-quota-card{display:inline-block;width:100%;margin:0 0 12px;vertical-align:top;padding:17px;break-inside:avoid;page-break-inside:avoid}.codingns-magpie-quota-topline{display:flex;align-items:center;gap:10px;margin-bottom:13px}.codingns-magpie-quota-icon{display:grid;place-items:center;width:34px;height:34px;border-radius:9px;background:var(--mp-layer);color:var(--mp-accent);font-weight:700}.codingns-magpie-quota-topline h2{margin:0;font-size:${uiFontSize(14)};font-weight:600}.codingns-magpie-quota-topline p{margin:3px 0 0;color:var(--mp-caption);font-size:${uiFontSize(13)}}.codingns-magpie-quota-account{margin:-5px 0 11px;color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-quota-count{margin-left:auto;flex:none;min-height:26px;padding:0 9px;border:1px solid var(--mp-line);border-radius:999px;background:transparent;color:var(--mp-muted);font-size:${uiFontSize(12)};cursor:pointer;white-space:nowrap}.codingns-magpie-quota-count:hover{color:var(--mp-fg);border-color:var(--mp-accent)}.codingns-magpie-quota-count:focus-visible{outline:none;box-shadow:0 0 0 2px var(--mp-accent)}.codingns-magpie-quota-account-block + .codingns-magpie-quota-account-block{margin-top:12px;padding-top:11px;border-top:1px solid var(--mp-line)}.codingns-magpie-quota-account-head{display:flex;align-items:baseline;gap:8px;min-width:0;margin-bottom:9px;font-size:${uiFontSize(13)}}.codingns-magpie-quota-account-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-quota-account-head span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-quota-account-head small{margin-left:auto;flex:none;color:var(--mp-caption);font-size:${uiFontSize(12)}}
|
|
1064
|
+
.codingns-magpie-quota-balance{display:flex;align-items:baseline;justify-content:space-between;gap:10px;min-width:0;margin:0 0 4px;padding:9px 0 2px}
|
|
1065
|
+
.codingns-magpie-quota-balance-label{flex:0 0 auto;color:var(--mp-muted);font-size:${uiFontSize(13)}}
|
|
1066
|
+
.codingns-magpie-quota-balance-value{min-width:0;overflow:hidden;color:var(--mp-ink);font-size:${uiFontSize(15)};font-weight:600;font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap}
|
|
1067
|
+
.codingns-magpie-quota-balance-value.is-money{font-size:${uiFontSize(17)};letter-spacing:-.01em}
|
|
1068
|
+
.codingns-magpie-quota-window{padding:11px 0;border-top:.5px solid var(--mp-line)}.codingns-magpie-quota-window-head,.codingns-magpie-quota-foot,.codingns-magpie-history-line-head{display:flex;align-items:center;justify-content:space-between;gap:9px}.codingns-magpie-quota-window-head{font-size:${uiFontSize(13)};font-weight:500}.codingns-magpie-quota-window-head span{color:var(--mp-muted);font-variant-numeric:tabular-nums}.quota-track{height:6px}.quota-track span{background:linear-gradient(90deg,var(--mp-accent),color-mix(in srgb,var(--mp-accent) 55%,transparent))}.codingns-magpie-quota-foot{color:var(--mp-caption);font-size:${uiFontSize(12)}}
|
|
1069
|
+
.codingns-magpie-daily-chart{display:grid;grid-template-columns:1fr auto;align-items:center;gap:9px;margin-top:4px;padding-top:10px;border-top:.5px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-sparkline{width:100%;height:30px;overflow:visible}.codingns-magpie-sparkline polyline{stroke:var(--mp-accent);stroke-width:2;vector-effect:non-scaling-stroke}
|
|
1070
|
+
.codingns-magpie-history-panel{padding:17px;margin-top:14px}.codingns-magpie-history-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.codingns-magpie-history-card{padding:12px;border:1px solid var(--mp-line);border-radius:9px;background:var(--mp-card)}.codingns-magpie-history-card>strong,.codingns-magpie-history-card>small{display:block}.codingns-magpie-history-card>strong{font-size:${uiFontSize(13)};font-weight:600}.codingns-magpie-history-card>small{margin-top:3px;color:var(--mp-caption);font-size:${uiFontSize(12)}}.codingns-magpie-history-line{margin-top:10px}.codingns-magpie-history-line-head{font-size:${uiFontSize(12)}}.codingns-magpie-history-line-head span:last-child{font-variant-numeric:tabular-nums;font-weight:650}
|
|
1071
|
+
.codingns-magpie-update-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:flex-start;justify-content:center;overflow:auto;padding:calc(var(--dsh-frame-top-clearance,0px) + 68px) 18px 24px;background:color-mix(in srgb,var(--mp-surface) 72%,rgba(0,0,0,.28));backdrop-filter:blur(3px)}.codingns-magpie-update-dialog{width:min(720px,100%);max-height:100%;overflow:auto;border:.5px solid var(--mp-line-strong);border-radius:var(--mp-radius);background:var(--mp-surface);box-shadow:var(--dsw-elevation-prominent,0 18px 48px rgba(0,0,0,.22))}.codingns-magpie-update-panel{padding:16px 17px;margin-bottom:0;border:0}.codingns-magpie-update-panel .codingns-magpie-panel-head{align-items:flex-start}.codingns-magpie-update-panel-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto}.codingns-magpie-update-close{display:grid;place-items:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);font:inherit;font-size:20px;line-height:1;cursor:pointer}.codingns-magpie-update-close:hover{background:var(--mp-hover);color:var(--mp-ink)}.codingns-magpie-update-close:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}.codingns-magpie-update-body{display:grid;gap:9px}.codingns-magpie-update-status{display:flex;align-items:center;flex-wrap:wrap;gap:8px;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-update-status strong{color:var(--mp-ink);font-size:${uiFontSize(14)}}.codingns-magpie-update-progress{position:relative;height:7px;overflow:hidden;border-radius:999px;background:var(--mp-layer)}.codingns-magpie-update-progress span{display:block;height:100%;border-radius:inherit;background:var(--mp-accent);transition:width .2s ease}.codingns-magpie-update-progress small{display:block;margin-top:4px;color:var(--mp-caption);font-size:${uiFontSize(11)}}.codingns-magpie-update-notes{padding:9px 10px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card);color:var(--mp-muted);font-size:${uiFontSize(12)};line-height:1.5}.codingns-magpie-update-notes summary{cursor:pointer;color:var(--mp-ink);font-weight:600}.codingns-magpie-update-notes div{white-space:pre-wrap;overflow-wrap:anywhere}.codingns-magpie-update-actions{display:flex;justify-content:flex-start}.codingns-magpie-update-actions button{min-height:30px;padding:0 11px;border:1px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}.codingns-magpie-update-actions button:disabled{opacity:.45;cursor:not-allowed}
|
|
1072
|
+
.codingns-magpie-management-grid{display:grid;grid-template-columns:minmax(190px,260px) minmax(0,1fr);align-items:start;gap:12px}.codingns-magpie-management-list{max-height:calc(100vh - 190px);overflow:auto;padding:5px}.codingns-magpie-management-row{width:100%;display:flex;align-items:center;justify-content:space-between;gap:9px;min-height:48px;padding:8px 10px;border:0;border-bottom:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer}.codingns-magpie-management-row:last-child{border-bottom:0}.codingns-magpie-management-row:hover,.codingns-magpie-management-row.is-active{background:var(--mp-hover)}.codingns-magpie-management-row.is-active{box-shadow:inset 2px 0 var(--mp-accent)}.codingns-magpie-management-row-main{display:flex;flex:1 1 auto;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;text-align:left}.codingns-magpie-management-row-main strong,.codingns-magpie-management-row-main small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-management-row-main strong{max-width:100%;text-align:left;font-size:${uiFontSize(13)};font-weight:600}.codingns-magpie-management-row-main small{color:var(--mp-caption);font-size:${uiFontSize(12)}}.codingns-magpie-state{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;padding:3px 7px;border-radius:999px;background:var(--mp-layer);color:var(--mp-muted);font-size:${uiFontSize(11)};font-weight:700}.codingns-magpie-state:before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor}.codingns-magpie-state.is-on{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent);color:var(--mp-accent)}.codingns-magpie-state.is-off{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 12%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c))}.codingns-magpie-management-editor{padding:17px}.codingns-magpie-management-statusline{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:-2px 0 13px;color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-field{display:flex;flex:1 1 150px;flex-direction:column;gap:6px;min-width:0;margin:0 0 12px;color:var(--mp-muted);font-size:${uiFontSize(13)};font-weight:500}.codingns-magpie-field small{font-size:${uiFontSize(11)};font-weight:400;line-height:1.4}.codingns-magpie-field input,.codingns-magpie-field select,.codingns-magpie-field textarea{width:100%;min-width:0;box-sizing:border-box;padding:7px 10px;border:.5px solid var(--dsw-alias-border-l4,rgba(0,0,0,.16));border-radius:var(--dsw-radius-sm,8px);background:var(--mp-card);color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};outline:none}.codingns-magpie-field textarea{resize:vertical;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.codingns-magpie-field-row{display:flex;gap:9px;align-items:stretch}.codingns-magpie-management-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:7px;margin-top:10px}.codingns-magpie-management-actions button{min-height:32px;padding:0 12px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};cursor:pointer}.codingns-magpie-management-actions button.is-primary{border-color:transparent;background:var(--dsw-alias-button-primary-fill,var(--mp-accent));color:var(--dsw-alias-label-primary-foreground,#fff)}.codingns-magpie-management-actions button:disabled{opacity:.45;cursor:not-allowed}.codingns-magpie-confirm{display:grid;gap:7px;margin:12px 0;padding:11px;border:1px solid rgba(59,126,98,.24);border-radius:9px;background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 8%,transparent);font-size:${uiFontSize(11)}}.codingns-magpie-confirm>span{overflow-wrap:anywhere;color:var(--mp-muted);line-height:1.5}.codingns-magpie-management-message{margin-top:10px;color:var(--mp-accent);font-size:${uiFontSize(11)}}.codingns-magpie-management-account-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.codingns-magpie-management-account{padding:16px}.codingns-magpie-management-balance{margin:8px 0;color:var(--mp-ink);font-size:${uiFontSize(14)};font-weight:700}.codingns-magpie-management-window{padding:10px 0;border-top:1px solid var(--mp-line)}.codingns-magpie-management-window>small,.codingns-magpie-management-readat{display:block;margin-top:5px;color:var(--mp-muted);font-size:${uiFontSize(11)}}.codingns-magpie-management-members{display:flex;flex-wrap:wrap;gap:5px;margin:-2px 0 13px}.codingns-magpie-member-chip{max-width:100%;overflow:hidden;padding:4px 7px;border:1px solid var(--mp-line);border-radius:6px;background:var(--mp-card);color:var(--mp-ink);font-size:${uiFontSize(11)};text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-member-chip.is-muted{opacity:.55}.codingns-magpie-management-policy{flex:0 0 auto;color:var(--mp-muted);font-size:${uiFontSize(11)}}.codingns-magpie-checkbox{display:flex;align-items:center;gap:8px;margin:0;color:var(--mp-ink);font-size:${uiFontSize(13)}}.codingns-magpie-checkbox input{accent-color:var(--mp-accent)}
|
|
1073
|
+
.codingns-magpie-field-checkbox{margin:2px 0 12px}.codingns-magpie-management-hint{margin:0 0 14px;color:var(--mp-caption);font-size:${uiFontSize(11)};line-height:1.5}
|
|
1074
|
+
.codingns-magpie-checkbox-list{display:grid;gap:4px;padding:8px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card)}
|
|
1075
|
+
.codingns-magpie-checkbox-list .codingns-magpie-model-option{min-height:34px;padding:4px 7px}
|
|
1076
|
+
.codingns-magpie-checkbox-list .codingns-magpie-model-id{font-weight:600;color:var(--mp-ink)}
|
|
1077
|
+
.codingns-magpie-segmented{display:inline-flex;flex-wrap:wrap;gap:2px;align-self:flex-start;padding:2px;border-radius:999px;background:var(--mp-layer)}
|
|
1078
|
+
.codingns-magpie-segmented button{min-height:26px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
|
|
1079
|
+
.codingns-magpie-segmented button:hover{color:var(--mp-ink)}
|
|
1080
|
+
.codingns-magpie-segmented button.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
|
|
1081
|
+
.codingns-magpie-levels{display:flex;flex-wrap:wrap;gap:5px}
|
|
1082
|
+
.codingns-magpie-level{min-height:28px;padding:0 11px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};cursor:pointer;transition:background .14s,color .14s,border-color .14s}
|
|
1083
|
+
.codingns-magpie-level:hover{color:var(--mp-ink)}
|
|
1084
|
+
.codingns-magpie-level.is-on{border-color:transparent;background:color-mix(in srgb,var(--mp-accent) 14%,transparent);color:var(--mp-accent);font-weight:600}
|
|
1085
|
+
.codingns-magpie-context-input{width:120px!important;max-width:100%;font-variant-numeric:tabular-nums}
|
|
1086
|
+
.codingns-magpie-field-error{margin-top:-2px;color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(11)};line-height:1.4}.codingns-magpie-management-empty{display:flex;min-height:150px;align-items:center;justify-content:center;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}.codingns-magpie-model-editor{display:grid;gap:4px;padding:8px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card)}.codingns-magpie-model-actions{display:flex;gap:6px;flex-wrap:wrap}.codingns-magpie-model-actions button,.codingns-magpie-group-model-actions button{min-height:28px;padding:0 8px;border:1px solid var(--mp-line);border-radius:6px;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(11)};cursor:pointer}.codingns-magpie-model-actions button:disabled,.codingns-magpie-group-model-actions button:disabled{opacity:.45;cursor:not-allowed}.codingns-magpie-model-option{display:flex;align-items:center;gap:9px;min-width:0;min-height:40px;padding:6px 9px;border:.5px solid transparent;border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font-weight:400}.codingns-magpie-model-option:hover{border-color:var(--mp-line-strong);background:var(--mp-hover)}.codingns-magpie-model-option input,.codingns-magpie-group-model-check input{flex:0 0 auto;width:16px;height:16px;margin:0;accent-color:var(--mp-accent)}.codingns-magpie-model-option-copy{display:flex;flex:1 1 auto;min-width:0;overflow:hidden;flex-direction:column;gap:3px}.codingns-magpie-model-name{display:block;min-width:0;overflow:hidden;color:var(--mp-ink);font-size:${uiFontSize(13)};font-weight:600;line-height:1.3;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-model-meta{display:flex;align-items:center;min-width:0;gap:7px;color:var(--mp-caption);font-size:${uiFontSize(12)};line-height:1.25}.codingns-magpie-model-provider,.codingns-magpie-model-id{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-model-provider{font-weight:650}.codingns-magpie-model-id{font-family:var(--dsw-font-family-mono,ui-monospace,SFMono-Regular,Menlo,monospace);color:var(--mp-muted)}.codingns-magpie-group-model-editor{display:grid;gap:6px;padding:10px;border:1px solid var(--mp-line);border-radius:9px;background:var(--mp-card)}.codingns-magpie-group-model-option{display:flex;align-items:center;gap:8px;min-width:0;min-height:45px;padding:6px 8px;border:1px solid transparent;border-radius:7px;background:var(--mp-surface);color:var(--mp-ink);transition:border-color .15s,background .15s,box-shadow .15s}.codingns-magpie-group-model-option:hover{border-color:color-mix(in srgb,var(--mp-accent) 48%,transparent);background:color-mix(in srgb,var(--mp-accent) 5%,transparent)}.codingns-magpie-group-model-option.is-selected{cursor:grab;border-color:color-mix(in srgb,var(--mp-accent) 32%,transparent);background:color-mix(in srgb,var(--mp-accent) 5%,transparent);box-shadow:inset 2px 0 var(--mp-accent)}.codingns-magpie-group-model-option.is-dragging{opacity:.55;box-shadow:inset 2px 0 var(--mp-accent),0 5px 14px rgba(30,70,50,.12)}.codingns-magpie-group-model-check{display:flex;align-items:center;flex:1 1 auto;gap:8px;min-width:0;cursor:pointer}.codingns-magpie-group-model-actions{display:flex;align-items:center;flex:0 0 auto;gap:4px}.codingns-magpie-group-model-actions button{display:grid;place-items:center;width:26px;height:26px;min-height:26px;padding:0;border-radius:6px;font-size:${uiFontSize(13)};line-height:1}.codingns-magpie-group-model-order{display:grid;place-items:center;flex:0 0 20px;width:20px;height:20px;border-radius:5px;background:var(--mp-card);color:var(--mp-muted);font-size:${uiFontSize(11)};font-variant-numeric:tabular-nums}.codingns-magpie-group-model-add{display:flex;align-items:center;gap:8px;margin-top:3px;padding-top:8px;border-top:.5px solid var(--mp-line);color:var(--mp-muted)}.codingns-magpie-group-model-add-icon{display:grid;place-items:center;flex:0 0 20px;width:20px;height:20px;border:1px dashed var(--mp-line);border-radius:5px;color:var(--mp-accent);font-size:${uiFontSize(16)};line-height:1}.codingns-magpie-group-model-add select{flex:1 1 auto;min-width:0;min-height:32px;padding:5px 8px;border:1px solid var(--mp-line);border-radius:7px;background:var(--mp-surface);color:var(--mp-ink);font:inherit;font-size:${uiFontSize(11)}}.codingns-magpie-management-empty{display:flex;min-height:150px;align-items:center;justify-content:center;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}
|
|
1087
|
+
.codingns-magpie-empty{min-height:180px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}.codingns-magpie-empty-mark{display:grid;place-items:center;width:38px;height:38px;border:.5px solid var(--mp-line);border-radius:12px;color:var(--mp-muted);font-size:${uiFontSize(18)}}.codingns-magpie-spinner{width:16px;height:16px;border:2px solid var(--mp-line);border-top-color:var(--mp-accent);border-radius:50%;animation:magpie-spin .8s linear infinite}.codingns-magpie-inline-empty{padding:18px;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-notice{display:flex;align-items:center;gap:8px;margin:-5px 0 12px;padding:9px 11px;border:.5px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 26%,transparent);border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 10%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(13)}}.codingns-magpie-notice span{display:grid;place-items:center;width:17px;height:17px;border-radius:50%;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 15%,transparent);font-weight:700}
|
|
1088
|
+
.codingns-magpie-usage-tabs{display:flex;align-items:center;gap:2px;min-width:0;padding:2px;border-radius:999px;background:var(--mp-layer);overflow-x:auto;scrollbar-width:none}
|
|
1089
|
+
.codingns-magpie-usage-tabs::-webkit-scrollbar{display:none}
|
|
1090
|
+
.codingns-magpie-usage-tab{flex:0 0 auto;min-height:26px;padding:0 13px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
|
|
1091
|
+
.codingns-magpie-usage-tab:hover{color:var(--mp-ink)}
|
|
1092
|
+
.codingns-magpie-usage-tab.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
|
|
1093
|
+
/* Pin the usage-view switch to the toolbar's right edge so the icon and the
|
|
1094
|
+
segmented control stay together instead of wrapping with the left tabs. */
|
|
1095
|
+
.codingns-magpie-toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex:0 0 auto;margin-left:auto;min-width:0}
|
|
1096
|
+
.codingns-magpie-quota-view{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0;color:var(--mp-muted);font-size:${uiFontSize(13)}}
|
|
1097
|
+
.codingns-magpie-quota-view-icon{display:grid;place-items:center;flex:0 0 auto;width:22px;height:22px;color:var(--mp-muted)}
|
|
1098
|
+
.codingns-magpie-quota-view-icon-svg{display:block}
|
|
1099
|
+
.codingns-magpie-quota-view-segment{display:flex;align-items:center;gap:2px;padding:2px;border-radius:999px;background:var(--mp-layer)}
|
|
1100
|
+
.codingns-magpie-quota-view-option{flex:0 0 auto;min-height:26px;padding:0 13px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
|
|
1101
|
+
.codingns-magpie-quota-view-option:hover{color:var(--mp-ink)}
|
|
1102
|
+
.codingns-magpie-quota-view-option.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
|
|
1103
|
+
.codingns-magpie-quota-view-option:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
|
|
1104
|
+
.codingns-magpie-quota-view-option:disabled{opacity:.5;cursor:not-allowed}
|
|
1105
|
+
.codingns-magpie-statstrip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));border:.5px solid var(--mp-line);border-radius:var(--mp-radius);background:var(--mp-card);margin-bottom:14px;overflow:hidden}
|
|
1106
|
+
.codingns-magpie-statcell{display:flex;flex-direction:column;gap:5px;min-width:0;padding:15px 18px;border-left:.5px solid var(--mp-line)}
|
|
1107
|
+
.codingns-magpie-statcell:first-child{border-left:0}
|
|
1108
|
+
.codingns-magpie-statcell-label{color:var(--mp-muted);font-size:${uiFontSize(13)}}
|
|
1109
|
+
.codingns-magpie-statcell-value{font-size:${uiFontSize(22)};line-height:1.1;font-weight:600;letter-spacing:-.01em;font-variant-numeric:tabular-nums;color:var(--mp-ink)}
|
|
1110
|
+
.codingns-magpie-statcell-detail{color:var(--mp-caption);font-size:${uiFontSize(13)};line-height:1.4}
|
|
1111
|
+
.codingns-magpie-barchart-panel{padding:16px 18px 14px;margin-bottom:14px}
|
|
1112
|
+
.codingns-magpie-barchart{position:relative;display:flex;flex-direction:column;gap:8px}
|
|
1113
|
+
.codingns-magpie-barchart-plot{display:flex;align-items:flex-end;gap:2px;height:170px;padding:8px 0 0;border-bottom:.5px solid var(--mp-line)}
|
|
1114
|
+
.codingns-magpie-bar-slot{flex:1 1 0;display:flex;align-items:flex-end;justify-content:center;height:100%;min-width:2px}
|
|
1115
|
+
.codingns-magpie-bar{display:block;width:100%;max-width:26px;min-height:2px;border-radius:2px 2px 0 0;background:color-mix(in srgb,var(--mp-accent) 32%,transparent);transition:height .3s ease}
|
|
1116
|
+
.codingns-magpie-bar-cap{display:block;width:100%;height:4px;border-radius:2px 2px 0 0;background:var(--mp-accent)}
|
|
1117
|
+
.codingns-magpie-barchart-axis{display:flex;justify-content:space-between;gap:4px;color:var(--mp-caption);font-size:${uiFontSize(12)}}
|
|
1118
|
+
.codingns-magpie-barchart-tick{flex:0 0 auto;white-space:nowrap}
|
|
1119
|
+
.codingns-magpie-barchart-peak{position:absolute;top:0;left:0;padding:0 4px;border-radius:4px;background:var(--mp-surface);color:var(--mp-caption);font-size:${uiFontSize(12)}}
|
|
1120
|
+
.codingns-magpie-progress-panel{padding:16px 18px 8px;margin-bottom:14px}
|
|
1121
|
+
.codingns-magpie-progress-list{display:flex;flex-direction:column}
|
|
1122
|
+
.codingns-magpie-progress-item{display:block;width:100%;padding:11px 0;border:0;border-top:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left}
|
|
1123
|
+
.codingns-magpie-progress-item.is-button{cursor:pointer;border-radius:8px;padding-left:6px;padding-right:6px;transition:background .14s}
|
|
1124
|
+
.codingns-magpie-progress-item.is-button:hover{background:var(--mp-hover)}
|
|
1125
|
+
.codingns-magpie-progress-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}
|
|
1126
|
+
.codingns-magpie-progress-copy{display:flex;flex:1 1 auto;min-width:0;overflow:hidden;flex-direction:column;gap:1px}.codingns-magpie-progress-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:${uiFontSize(13)}}
|
|
1127
|
+
.codingns-magpie-progress-context{min-width:0;overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(11)};text-overflow:ellipsis;white-space:nowrap}
|
|
1128
|
+
.codingns-magpie-progress-value{flex:0 0 auto;font-size:${uiFontSize(13)};font-weight:600;font-variant-numeric:tabular-nums}
|
|
1129
|
+
.codingns-magpie-progress-track{height:4px;border-radius:99px;background:var(--mp-hover);overflow:hidden}
|
|
1130
|
+
.codingns-magpie-progress-track span{display:block;height:100%;min-width:2px;border-radius:inherit;background:linear-gradient(90deg,var(--mp-chart,var(--mp-accent)),color-mix(in srgb,var(--mp-chart,var(--mp-accent)),transparent 45%))}
|
|
1131
|
+
.codingns-magpie-progress-meta{display:block;margin-top:5px;color:var(--mp-caption);font-size:${uiFontSize(12)}}
|
|
1132
|
+
.codingns-magpie-chiprow{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
|
|
1133
|
+
.codingns-magpie-chip{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;min-height:28px;padding:0 12px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};cursor:pointer;transition:background .14s,color .14s,border-color .14s}
|
|
1134
|
+
.codingns-magpie-chip:hover{color:var(--mp-ink)}
|
|
1135
|
+
.codingns-magpie-chip.is-active{background:var(--dsw-alias-button-primary-fill,var(--mp-accent));border-color:transparent;color:var(--dsw-alias-label-primary-foreground,#fff);font-weight:600}
|
|
1136
|
+
.codingns-magpie-filterrow{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
|
1137
|
+
.codingns-magpie-grow{flex:1 1 auto;max-width:none;margin:0}
|
|
1138
|
+
.codingns-magpie-provider-logo{display:grid;flex:0 0 auto;place-items:center;box-sizing:border-box;object-fit:contain;padding:3px;border-radius:10px;background:var(--mp-layer);color:var(--mp-accent);font-size:${uiFontSize(12)};font-weight:750}
|
|
1139
|
+
.codingns-magpie-provider-logo-compact{border-radius:7px;padding:2px}
|
|
1140
|
+
.codingns-magpie-provider-logo[data-host-asset]{background:#fff;object-fit:contain}
|
|
1141
|
+
.codingns-magpie-provider-inline{display:inline-flex;align-items:center;gap:7px;min-width:0}
|
|
1142
|
+
.codingns-magpie-provider-heading{display:flex;align-items:center;gap:10px}
|
|
1143
|
+
.codingns-magpie-filter-summary{color:var(--mp-muted);font-size:${uiFontSize(12)};white-space:nowrap}
|
|
1144
|
+
.codingns-magpie-toplist-panel{padding:16px 18px 8px}
|
|
1145
|
+
.codingns-magpie-toprow{display:flex;align-items:center;gap:12px;width:100%;padding:10px 6px;border:0;border-top:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer;border-radius:var(--dsw-radius-sm,8px);transition:background .14s}
|
|
1146
|
+
.codingns-magpie-toprow:hover{background:var(--mp-hover)}
|
|
1147
|
+
.codingns-magpie-toprow-main{display:flex;flex-direction:column;gap:3px;flex:1 1 auto;min-width:0}
|
|
1148
|
+
.codingns-magpie-toprow-main strong{font-size:${uiFontSize(13)}}
|
|
1149
|
+
.codingns-magpie-toprow-main small{overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(12)};text-overflow:ellipsis;white-space:nowrap}
|
|
1150
|
+
.codingns-magpie-toprow-metrics{display:flex;flex:0 0 auto;gap:16px;font-size:${uiFontSize(13)};font-variant-numeric:tabular-nums;color:var(--mp-muted)}
|
|
1151
|
+
.codingns-magpie-selection{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;padding:9px 12px;border:.5px solid var(--mp-line);border-radius:10px;background:var(--mp-card);color:var(--mp-ink);font-size:${uiFontSize(13)}}
|
|
1152
|
+
.codingns-magpie-agent-tag{display:inline-block;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:620}
|
|
1153
|
+
.codingns-magpie-native-table{min-width:1240px}
|
|
1154
|
+
.codingns-magpie-native-table th{font-size:${uiFontSize(13)};letter-spacing:.01em}
|
|
1155
|
+
.codingns-magpie-native-table td{max-width:none;font-size:${uiFontSize(13)};white-space:nowrap}
|
|
1156
|
+
@keyframes magpie-rise{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@keyframes magpie-spin{to{transform:rotate(360deg)}}
|
|
1157
|
+
@media(max-width:900px){.codingns-magpie-topbar{--mp-topbar-pad-x:14px;--mp-topbar-pad-y:9px;grid-template-columns:minmax(0,1fr) auto;row-gap:8px;min-height:58px}.codingns-magpie-topbar-left{grid-column:1;grid-row:2;margin-left:calc(-1 * var(--mp-leading-inset))}.codingns-magpie-tabs{grid-column:1;grid-row:1;justify-self:start;flex-wrap:wrap;row-gap:2px;overflow:visible}.codingns-magpie-topbar-right{grid-column:2;grid-row:1}}
|
|
1158
|
+
@media(max-width:650px){.codingns-magpie-topbar{--mp-topbar-pad-x:12px;--mp-topbar-pad-y:8px;min-height:56px;gap:8px}.codingns-magpie-tab{min-height:32px;padding:0 9px;font-size:${uiFontSize(12)}}.codingns-magpie-tab-icon{display:none}.codingns-magpie-toolbar{min-height:44px;padding:0 12px;gap:8px}.codingns-magpie-periods{flex-direction:row;overflow:auto;max-width:100%}.codingns-magpie-period{min-height:28px;padding:0 9px}.codingns-magpie-barchart-panel,.codingns-magpie-progress-panel,.codingns-magpie-toplist-panel,.codingns-magpie-history-panel,.codingns-magpie-quota-card,.codingns-magpie-management-editor{padding:13px}.codingns-magpie-toprow-metrics{gap:10px}.codingns-magpie-chip{min-height:32px}.codingns-magpie-history-grid,.codingns-magpie-management-account-grid{grid-template-columns:1fr}.codingns-magpie-quota-grid{column-width:auto;column-count:1}.codingns-magpie-management-grid{grid-template-columns:minmax(0,1fr);gap:8px}.codingns-magpie-management-list{display:flex;max-height:none;gap:4px;overflow:auto;padding:4px}.codingns-magpie-management-row{flex:0 0 auto;width:auto;max-width:220px;min-height:42px;border:1px solid var(--mp-line);border-radius:8px}.codingns-magpie-management-row.is-active{box-shadow:inset 0 -2px var(--mp-accent)}.codingns-magpie-management-row-main{max-width:145px;text-align:left}.codingns-magpie-field-row{flex-wrap:wrap;gap:0}.codingns-magpie-chart-switch{align-self:flex-start}.codingns-magpie-page .codingns-magpie-table{min-width:900px}}
|
|
1159
|
+
@media(prefers-reduced-motion:reduce){.codingns-magpie-page *{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
|
|
1160
|
+
.codingns-magpie-group-model-add{position:relative;display:block;margin-top:3px;padding-top:8px;border-top:1px solid var(--mp-line);color:var(--mp-muted)}
|
|
1161
|
+
.codingns-magpie-group-model-add-button{display:inline-flex;align-items:center;gap:8px;min-height:30px;padding:4px 10px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}
|
|
1162
|
+
.codingns-magpie-group-model-add-button:hover{border-color:color-mix(in srgb,var(--mp-accent) 50%,transparent);background:color-mix(in srgb,var(--mp-accent) 6%,transparent)}
|
|
1163
|
+
.codingns-magpie-group-model-add-button[aria-expanded=true]{border-color:var(--mp-accent);color:var(--mp-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--mp-accent) 10%,transparent)}
|
|
1164
|
+
.codingns-magpie-group-model-add-icon{display:grid;place-items:center;flex:0 0 18px;width:18px;height:18px;border:1px dashed currentColor;border-radius:5px;color:var(--mp-accent);font-size:${uiFontSize(15)};line-height:1}
|
|
1165
|
+
.codingns-magpie-group-model-picker{position:absolute;z-index:5;top:calc(100% + 8px);left:0;width:min(520px,calc(100vw - 36px));max-width:100%;box-sizing:border-box;overflow:hidden;border:1px solid var(--mp-line);border-radius:10px;background:var(--mp-surface);box-shadow:var(--dsw-elevation-prominent,0 12px 28px rgba(0,0,0,.18))}
|
|
1166
|
+
.codingns-magpie-group-model-picker-search{display:flex;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--mp-line);color:var(--mp-muted);background:var(--mp-card)}
|
|
1167
|
+
.codingns-magpie-group-model-picker-search>span{font-size:${uiFontSize(15)};line-height:1}
|
|
1168
|
+
.codingns-magpie-group-model-picker-search input{width:100%;min-width:0;padding:4px 0;border:0;outline:0;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)}}
|
|
1169
|
+
.codingns-magpie-group-model-picker-list{max-height:min(380px,50vh);overflow:auto;padding:4px 5px 7px}
|
|
1170
|
+
.codingns-magpie-group-model-picker-group{padding:0 0 5px}
|
|
1171
|
+
.codingns-magpie-group-model-picker-heading{margin:0;padding:8px 8px 5px;border-bottom:1px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(11)};font-weight:750;letter-spacing:.06em;text-transform:uppercase}
|
|
1172
|
+
.codingns-magpie-group-model-picker-option{display:flex;align-items:center;gap:9px;width:100%;min-width:0;min-height:43px;margin-top:2px;padding:6px 8px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer}
|
|
1173
|
+
.codingns-magpie-group-model-picker-option:hover,.codingns-magpie-group-model-picker-option[aria-selected=true]{border-color:var(--mp-line-strong);background:var(--mp-hover)}
|
|
1174
|
+
.codingns-magpie-group-model-picker-option .codingns-magpie-model-option-copy{gap:2px}
|
|
1175
|
+
.codingns-magpie-group-model-picker-option .codingns-magpie-model-name{font-size:${uiFontSize(11)}}
|
|
1176
|
+
.codingns-magpie-group-model-picker-option .codingns-magpie-model-meta{font-size:${uiFontSize(11)}}
|
|
1177
|
+
.codingns-magpie-group-model-picker-mark{display:grid;place-items:center;flex:0 0 24px;width:24px;height:24px;border-radius:7px;background:color-mix(in srgb,var(--mp-accent) 10%,transparent);color:var(--mp-accent);font-size:${uiFontSize(11)};font-weight:750}
|
|
1178
|
+
/* -- Mobile layout --
|
|
1179
|
+
With the sidebar hidden DSH keeps only a floating logo button at the top-left, so the
|
|
1180
|
+
page stops indenting by the whole clearance width: the page fills the viewport, only the
|
|
1181
|
+
header's first row is pushed past the button, and the body, toolbar, and tables start at
|
|
1182
|
+
the left edge. This section must come after every default rule so it overrides the
|
|
1183
|
+
desktop paddings above. */
|
|
1184
|
+
.codingns-magpie-page{--mp-topbar-pad-x:16px;--mp-topbar-pad-y:0px;--mp-leading-inset:0px;padding-left:var(--dsh-frame-leading-clearance,0px)}
|
|
1185
|
+
.codingns-magpie-topbar{padding-right:var(--mp-topbar-pad-x);padding-left:calc(var(--mp-topbar-pad-x) + var(--mp-leading-inset))}
|
|
1186
|
+
html[data-codingns-mobile-sidebar="on"] .codingns-magpie-page{padding-left:0;--mp-leading-inset:max(0px,calc(var(--dsh-frame-leading-clearance,0px) - 20px))}
|
|
1187
|
+
@media(max-width:900px){.codingns-magpie-topbar{--mp-topbar-pad-x:14px;--mp-topbar-pad-y:9px}.codingns-magpie-topbar-left{margin-left:calc(-1 * var(--mp-leading-inset))}}
|
|
1188
|
+
@media(max-width:650px){.codingns-magpie-topbar{--mp-topbar-pad-x:12px;--mp-topbar-pad-y:8px}.codingns-magpie-icon-button{width:36px;height:36px}.codingns-magpie-toolbar:not(.has-tabs){display:none}.codingns-magpie-view{padding:14px 12px 30px}.codingns-magpie-statstrip{grid-template-columns:repeat(2,minmax(0,1fr))}.codingns-magpie-statcell{padding:13px;border-left:0}.codingns-magpie-statcell:nth-child(2n){border-left:.5px solid var(--mp-line)}.codingns-magpie-statcell:nth-child(n+3){border-top:.5px solid var(--mp-line)}.codingns-magpie-statcell:last-child:nth-child(odd){grid-column:1/-1}.codingns-magpie-statcell-value{font-size:${uiFontSize(22)}}.codingns-magpie-barchart-plot{height:132px}.codingns-magpie-barchart-axis{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:0;overflow:hidden;font-size:${uiFontSize(9)}}.codingns-magpie-barchart-tick{overflow:hidden;text-overflow:clip}}
|
|
1189
|
+
.codingns-magpie-reqlist{display:none}
|
|
1190
|
+
.codingns-magpie-reqcard{display:flex;flex-direction:column;gap:5px;padding:11px 14px;border-top:.5px solid var(--mp-line)}
|
|
1191
|
+
.codingns-magpie-reqcard:first-child{border-top:0}
|
|
1192
|
+
.codingns-magpie-reqcard-top{display:flex;align-items:center;gap:8px;min-width:0}
|
|
1193
|
+
.codingns-magpie-reqcard-top .codingns-magpie-time-cell{flex:0 0 auto;font-size:${uiFontSize(12)}}
|
|
1194
|
+
.codingns-magpie-reqcard-top .codingns-magpie-provider-inline{flex:1 1 auto;min-width:0}
|
|
1195
|
+
.codingns-magpie-reqcard-route{display:flex;align-items:center;gap:6px;min-width:0;font-size:${uiFontSize(12)}}
|
|
1196
|
+
.codingns-magpie-reqcard-arrow{flex:0 0 auto;color:var(--mp-caption)}
|
|
1197
|
+
.codingns-magpie-reqcard-route .codingns-magpie-route-model{flex:0 1 auto;max-width:47%}
|
|
1198
|
+
.codingns-magpie-reqcard-sub{display:flex;align-items:center;gap:6px;min-width:0;font-size:${uiFontSize(11)};color:var(--mp-caption)}
|
|
1199
|
+
.codingns-magpie-reqcard-sub .codingns-magpie-provider-name{max-width:62%;font-weight:500;color:var(--mp-muted)}
|
|
1200
|
+
.codingns-magpie-reqcard-sub .codingns-magpie-table-secondary{margin-top:0}
|
|
1201
|
+
.codingns-magpie-reqcard-facts{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:${uiFontSize(11)};color:var(--mp-muted);font-variant-numeric:tabular-nums}
|
|
1202
|
+
|
|
1203
|
+
@media(max-width:650px){
|
|
1204
|
+
.codingns-magpie-view{padding:12px 12px 26px}
|
|
1205
|
+
.codingns-magpie-tab{min-height:38px;padding:0 10px}
|
|
1206
|
+
.codingns-magpie-toolbar{min-height:40px}
|
|
1207
|
+
.codingns-magpie-statcell-label{font-size:${uiFontSize(11)}}
|
|
1208
|
+
.codingns-magpie-statcell-value{font-size:${uiFontSize(19)}}
|
|
1209
|
+
.codingns-magpie-statcell-detail{font-size:${uiFontSize(11)};white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
1210
|
+
.codingns-magpie-barchart-plot{height:118px}
|
|
1211
|
+
.codingns-magpie-barchart-panel,.codingns-magpie-progress-panel,.codingns-magpie-toplist-panel,.codingns-magpie-history-panel,.codingns-magpie-quota-card,.codingns-magpie-management-editor{padding:12px}
|
|
1212
|
+
.codingns-magpie-panel-head{margin-bottom:10px}
|
|
1213
|
+
.codingns-magpie-progress-item{padding:9px 0}
|
|
1214
|
+
.codingns-magpie-toprow{padding:8px 4px}
|
|
1215
|
+
.codingns-magpie-chip{min-height:28px;padding:0 10px}
|
|
1216
|
+
.codingns-magpie-quota-icon{width:28px;height:28px;border-radius:8px;font-size:${uiFontSize(12)}}
|
|
1217
|
+
.codingns-magpie-quota-topline{gap:8px;margin-bottom:9px}
|
|
1218
|
+
.codingns-magpie-quota-card{padding:11px 12px}
|
|
1219
|
+
.codingns-magpie-quota-topline h2{font-size:${uiFontSize(13)}}
|
|
1220
|
+
.codingns-magpie-quota-topline p{font-size:${uiFontSize(11)}}
|
|
1221
|
+
.codingns-magpie-quota-account{font-size:${uiFontSize(12)};margin:-3px 0 7px}
|
|
1222
|
+
.codingns-magpie-quota-window{padding:8px 0}
|
|
1223
|
+
.codingns-magpie-daily-chart{margin-top:2px;padding-top:6px}
|
|
1224
|
+
.codingns-magpie-pagination{padding:8px 10px}
|
|
1225
|
+
.codingns-magpie-selection{padding:8px 10px}
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
@media(max-width:900px){
|
|
1229
|
+
.codingns-magpie-table-scroll{display:none}
|
|
1230
|
+
.codingns-magpie-reqlist{display:block}
|
|
1231
|
+
.codingns-magpie-statstrip{display:flex;flex-wrap:wrap;gap:.5px;background:var(--mp-line)}
|
|
1232
|
+
.codingns-magpie-statcell,.codingns-magpie-statcell:nth-child(2n),.codingns-magpie-statcell:nth-child(n+3){flex:1 1 calc(33.333% - .5px);border:0;background:var(--mp-card)}
|
|
1233
|
+
.codingns-magpie-statcell:last-child:nth-child(odd){grid-column:auto}
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
`;
|
|
1237
|
+
/** 管理页样式的固定标识;重复注入时直接复用已有样式表。 */
|
|
1238
|
+
const MAGPIE_PAGE_STYLE_ID = 'codingns4dsh-magpie-page-style';
|
|
1239
|
+
/**
|
|
1240
|
+
* 把管理页样式注入 `document.head`(只注入一次)。
|
|
1241
|
+
*
|
|
1242
|
+
* 管理页自身在根节点里内联 `<style>`;底部弹层等嵌入式视图没有这个根节点,
|
|
1243
|
+
* 复用请求明细前必须先装上同一份样式表。
|
|
1244
|
+
*/
|
|
1245
|
+
export function installMagpiePageStyles() {
|
|
1246
|
+
if (typeof document === 'undefined')
|
|
1247
|
+
return;
|
|
1248
|
+
if (document.querySelector(`style[data-plugin-css="${MAGPIE_PAGE_STYLE_ID}"]`) !== null)
|
|
1249
|
+
return;
|
|
1250
|
+
const style = document.createElement('style');
|
|
1251
|
+
style.dataset.plugin = 'codingns4dsh';
|
|
1252
|
+
style.dataset.pluginCss = MAGPIE_PAGE_STYLE_ID;
|
|
1253
|
+
style.textContent = MAGPIE_PAGE_CSS;
|
|
1254
|
+
document.head.appendChild(style);
|
|
1255
|
+
}
|
|
1256
|
+
//# sourceMappingURL=magpie-management-page.js.map
|