@qduc/term2 0.30.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +24 -5
- package/dist/app.js.map +1 -1
- package/dist/build-info.json +2 -2
- package/dist/cli.js +36 -25
- package/dist/cli.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +28 -23
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +124 -32
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +31 -28
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/common/Divider.d.ts.map +1 -1
- package/dist/components/common/Divider.js +5 -2
- package/dist/components/common/Divider.js.map +1 -1
- package/dist/components/common/MenuContainer.d.ts +6 -20
- package/dist/components/common/MenuContainer.d.ts.map +1 -1
- package/dist/components/common/MenuContainer.js +24 -40
- package/dist/components/common/MenuContainer.js.map +1 -1
- package/dist/components/common/ScrollableTabBar.d.ts.map +1 -1
- package/dist/components/common/ScrollableTabBar.js +6 -5
- package/dist/components/common/ScrollableTabBar.js.map +1 -1
- package/dist/components/common/SelectionMarker.d.ts +16 -0
- package/dist/components/common/SelectionMarker.d.ts.map +1 -0
- package/dist/components/common/SelectionMarker.js +20 -0
- package/dist/components/common/SelectionMarker.js.map +1 -0
- package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
- package/dist/components/input/ApplicationInputSurface.js +3 -1
- package/dist/components/input/ApplicationInputSurface.js.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.d.ts.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.js +8 -6
- package/dist/components/input/FirstRunSetupPrompt.js.map +1 -1
- package/dist/components/input/MenuSurface.d.ts.map +1 -1
- package/dist/components/input/MenuSurface.js +4 -3
- package/dist/components/input/MenuSurface.js.map +1 -1
- package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
- package/dist/components/input/ModelMenuSession.js +3 -2
- package/dist/components/input/ModelMenuSession.js.map +1 -1
- package/dist/components/input/PendingQueueList.d.ts +3 -0
- package/dist/components/input/PendingQueueList.d.ts.map +1 -1
- package/dist/components/input/PendingQueueList.js +9 -8
- package/dist/components/input/PendingQueueList.js.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.js +3 -2
- package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +113 -107
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +26 -28
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/Banner.d.ts.map +1 -1
- package/dist/components/layout/Banner.js +3 -47
- package/dist/components/layout/Banner.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +14 -34
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/DiffView.d.ts.map +1 -1
- package/dist/components/layout/DiffView.js +8 -7
- package/dist/components/layout/DiffView.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +8 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +195 -290
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/menu/CopyMenu.d.ts.map +1 -1
- package/dist/components/menu/CopyMenu.js +16 -13
- package/dist/components/menu/CopyMenu.js.map +1 -1
- package/dist/components/menu/McpSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/McpSelectionMenu.js +8 -7
- package/dist/components/menu/McpSelectionMenu.js.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js +21 -20
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/menu/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/PathSelectionMenu.js +5 -4
- package/dist/components/menu/PathSelectionMenu.js.map +1 -1
- package/dist/components/menu/ProfileSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ProfileSelectionMenu.js +17 -20
- package/dist/components/menu/ProfileSelectionMenu.js.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.js +37 -36
- package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
- package/dist/components/menu/ResumeSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ResumeSelectionMenu.js +21 -22
- package/dist/components/menu/ResumeSelectionMenu.js.map +1 -1
- package/dist/components/menu/RewindMenu.d.ts.map +1 -1
- package/dist/components/menu/RewindMenu.js +5 -4
- package/dist/components/menu/RewindMenu.js.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.js +15 -14
- package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.js +15 -14
- package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.js +17 -18
- package/dist/components/menu/SkillSelectionMenu.js.map +1 -1
- package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/menu/SlashCommandMenu.js +5 -4
- package/dist/components/menu/SlashCommandMenu.js.map +1 -1
- package/dist/components/menu/StandaloneModelPickerApp.d.ts.map +1 -1
- package/dist/components/menu/StandaloneModelPickerApp.js +3 -2
- package/dist/components/menu/StandaloneModelPickerApp.js.map +1 -1
- package/dist/components/menu/SubagentPoolSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SubagentPoolSelectionMenu.js +26 -24
- package/dist/components/menu/SubagentPoolSelectionMenu.js.map +1 -1
- package/dist/components/menu/settings-value-formatter.d.ts +3 -1
- package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
- package/dist/components/menu/settings-value-formatter.js +24 -25
- package/dist/components/menu/settings-value-formatter.js.map +1 -1
- package/dist/components/message/ChatMessage.d.ts.map +1 -1
- package/dist/components/message/ChatMessage.js +11 -7
- package/dist/components/message/ChatMessage.js.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.js +14 -11
- package/dist/components/message/CodeContextSearchRenderer.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.d.ts.map +1 -1
- package/dist/components/message/CommandGroupSummary.js +8 -36
- package/dist/components/message/CommandGroupSummary.js.map +1 -1
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +313 -329
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/GrepRenderer.d.ts.map +1 -1
- package/dist/components/message/GrepRenderer.js +12 -9
- package/dist/components/message/GrepRenderer.js.map +1 -1
- package/dist/components/message/MemoryRenderer.d.ts.map +1 -1
- package/dist/components/message/MemoryRenderer.js +45 -38
- package/dist/components/message/MemoryRenderer.js.map +1 -1
- package/dist/components/message/ReadFileRenderer.d.ts.map +1 -1
- package/dist/components/message/ReadFileRenderer.js +20 -16
- package/dist/components/message/ReadFileRenderer.js.map +1 -1
- package/dist/components/message/RunCodeRenderer.d.ts.map +1 -1
- package/dist/components/message/RunCodeRenderer.js +19 -14
- package/dist/components/message/RunCodeRenderer.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +15 -15
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/WebFetchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebFetchRenderer.js +16 -13
- package/dist/components/message/WebFetchRenderer.js.map +1 -1
- package/dist/components/message/WebSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebSearchRenderer.js +20 -16
- package/dist/components/message/WebSearchRenderer.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +2 -2
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts +12 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +100 -147
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/components/prompt/ConfirmPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ConfirmPrompt.js +7 -4
- package/dist/components/prompt/ConfirmPrompt.js.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.d.ts.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.js +7 -4
- package/dist/components/prompt/QueuePausedPrompt.js.map +1 -1
- package/dist/components/theme.d.ts +10 -52
- package/dist/components/theme.d.ts.map +1 -1
- package/dist/components/theme.js +11 -68
- package/dist/components/theme.js.map +1 -1
- package/dist/context/InputContext.d.ts +17 -0
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js +12 -0
- package/dist/context/InputContext.js.map +1 -1
- package/dist/gateway/gateway.d.ts.map +1 -1
- package/dist/gateway/gateway.js +11 -1
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/hooks/conversation-ui-reducer.d.ts +5 -2
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +9 -2
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +2 -0
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts +6 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.js +17 -11
- package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +1 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +2 -2
- package/dist/providers/model-catalog/catalog.generated.d.ts +239 -171
- package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
- package/dist/providers/model-catalog/catalog.generated.js +238 -179
- package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
- package/dist/providers/model-catalog/generate-catalog.d.ts.map +1 -1
- package/dist/providers/model-catalog/generate-catalog.js +13 -5
- package/dist/providers/model-catalog/generate-catalog.js.map +1 -1
- package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
- package/dist/providers/openai-chat-completions-model.js +5 -2
- package/dist/providers/openai-chat-completions-model.js.map +1 -1
- package/dist/services/approval/background-subagent-approval-controller.d.ts +1 -0
- package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -1
- package/dist/services/approval/background-subagent-approval-controller.js +3 -0
- package/dist/services/approval/background-subagent-approval-controller.js.map +1 -1
- package/dist/services/approval/background-subagent-approval-queue.d.ts +5 -0
- package/dist/services/approval/background-subagent-approval-queue.d.ts.map +1 -1
- package/dist/services/approval/background-subagent-approval-queue.js +18 -2
- package/dist/services/approval/background-subagent-approval-queue.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +32 -6
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.d.ts +2 -0
- package/dist/services/conversation/conversation-admission-workflow.d.ts.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.js +1 -1
- package/dist/services/conversation/conversation-admission-workflow.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +41 -21
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +4 -3
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +16 -1
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/cost/model-cost.d.ts +6 -0
- package/dist/services/cost/model-cost.d.ts.map +1 -1
- package/dist/services/cost/model-cost.js +12 -0
- package/dist/services/cost/model-cost.js.map +1 -1
- package/dist/services/cost/pricing.d.ts +1 -1
- package/dist/services/cost/pricing.d.ts.map +1 -1
- package/dist/services/cost/pricing.js +5 -5
- package/dist/services/cost/pricing.js.map +1 -1
- package/dist/services/models/model-picker-host.d.ts.map +1 -1
- package/dist/services/models/model-picker-host.js +9 -5
- package/dist/services/models/model-picker-host.js.map +1 -1
- package/dist/services/queue/queue-controller.d.ts +3 -0
- package/dist/services/queue/queue-controller.d.ts.map +1 -1
- package/dist/services/queue/queue-controller.js +53 -5
- package/dist/services/queue/queue-controller.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +4 -1
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +66 -13
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +34 -0
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +16 -0
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts +2 -0
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +2 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
- package/dist/services/settings/settings-ui-metadata.js +2 -0
- package/dist/services/settings/settings-ui-metadata.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +7 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
- package/dist/services/shell/background-shell-output-store.d.ts +4 -2
- package/dist/services/shell/background-shell-output-store.d.ts.map +1 -1
- package/dist/services/shell/background-shell-output-store.js +9 -8
- package/dist/services/shell/background-shell-output-store.js.map +1 -1
- package/dist/services/shell/background-shell-watches.d.ts.map +1 -1
- package/dist/services/shell/background-shell-watches.js +20 -9
- package/dist/services/shell/background-shell-watches.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +2 -2
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-run-control.d.ts.map +1 -1
- package/dist/services/subagents/subagent-run-control.js +3 -2
- package/dist/services/subagents/subagent-run-control.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +1 -1
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +5 -4
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/skins/SkinContext.d.ts +18 -0
- package/dist/skins/SkinContext.d.ts.map +1 -0
- package/dist/skins/SkinContext.js +23 -0
- package/dist/skins/SkinContext.js.map +1 -0
- package/dist/skins/cards/activity.d.ts +8 -0
- package/dist/skins/cards/activity.d.ts.map +1 -0
- package/dist/skins/cards/activity.js +23 -0
- package/dist/skins/cards/activity.js.map +1 -0
- package/dist/skins/cards/approval.d.ts +15 -0
- package/dist/skins/cards/approval.d.ts.map +1 -0
- package/dist/skins/cards/approval.js +64 -0
- package/dist/skins/cards/approval.js.map +1 -0
- package/dist/skins/cards/body.d.ts +14 -0
- package/dist/skins/cards/body.d.ts.map +1 -0
- package/dist/skins/cards/body.js +65 -0
- package/dist/skins/cards/body.js.map +1 -0
- package/dist/skins/cards/card.d.ts +28 -0
- package/dist/skins/cards/card.d.ts.map +1 -0
- package/dist/skins/cards/card.js +37 -0
- package/dist/skins/cards/card.js.map +1 -0
- package/dist/skins/cards/index.d.ts +9 -0
- package/dist/skins/cards/index.d.ts.map +1 -0
- package/dist/skins/cards/index.js +41 -0
- package/dist/skins/cards/index.js.map +1 -0
- package/dist/skins/cards/live-region.d.ts +16 -0
- package/dist/skins/cards/live-region.d.ts.map +1 -0
- package/dist/skins/cards/live-region.js +83 -0
- package/dist/skins/cards/live-region.js.map +1 -0
- package/dist/skins/cards/measure.d.ts +17 -0
- package/dist/skins/cards/measure.d.ts.map +1 -0
- package/dist/skins/cards/measure.js +29 -0
- package/dist/skins/cards/measure.js.map +1 -0
- package/dist/skins/cards/messages.d.ts +23 -0
- package/dist/skins/cards/messages.d.ts.map +1 -0
- package/dist/skins/cards/messages.js +80 -0
- package/dist/skins/cards/messages.js.map +1 -0
- package/dist/skins/cards/status.d.ts +9 -0
- package/dist/skins/cards/status.d.ts.map +1 -0
- package/dist/skins/cards/status.js +205 -0
- package/dist/skins/cards/status.js.map +1 -0
- package/dist/skins/cards/tools.d.ts +21 -0
- package/dist/skins/cards/tools.d.ts.map +1 -0
- package/dist/skins/cards/tools.js +101 -0
- package/dist/skins/cards/tools.js.map +1 -0
- package/dist/skins/cards/width.d.ts +4 -0
- package/dist/skins/cards/width.d.ts.map +1 -0
- package/dist/skins/cards/width.js +32 -0
- package/dist/skins/cards/width.js.map +1 -0
- package/dist/skins/classic/approval.d.ts +19 -0
- package/dist/skins/classic/approval.d.ts.map +1 -0
- package/dist/skins/classic/approval.js +50 -0
- package/dist/skins/classic/approval.js.map +1 -0
- package/dist/skins/classic/index.d.ts +7 -0
- package/dist/skins/classic/index.d.ts.map +1 -0
- package/dist/skins/classic/index.js +39 -0
- package/dist/skins/classic/index.js.map +1 -0
- package/dist/skins/classic/live-region.d.ts +19 -0
- package/dist/skins/classic/live-region.d.ts.map +1 -0
- package/dist/skins/classic/live-region.js +71 -0
- package/dist/skins/classic/live-region.js.map +1 -0
- package/dist/skins/classic/menu.d.ts +5 -0
- package/dist/skins/classic/menu.d.ts.map +1 -0
- package/dist/skins/classic/menu.js +20 -0
- package/dist/skins/classic/menu.js.map +1 -0
- package/dist/skins/classic/messages.d.ts +13 -0
- package/dist/skins/classic/messages.d.ts.map +1 -0
- package/dist/skins/classic/messages.js +65 -0
- package/dist/skins/classic/messages.js.map +1 -0
- package/dist/skins/classic/question.d.ts +5 -0
- package/dist/skins/classic/question.d.ts.map +1 -0
- package/dist/skins/classic/question.js +33 -0
- package/dist/skins/classic/question.js.map +1 -0
- package/dist/skins/classic/status.d.ts +10 -0
- package/dist/skins/classic/status.d.ts.map +1 -0
- package/dist/skins/classic/status.js +158 -0
- package/dist/skins/classic/status.js.map +1 -0
- package/dist/skins/classic/subagent.d.ts +5 -0
- package/dist/skins/classic/subagent.d.ts.map +1 -0
- package/dist/skins/classic/subagent.js +14 -0
- package/dist/skins/classic/subagent.js.map +1 -0
- package/dist/skins/classic/tool-section.d.ts +8 -0
- package/dist/skins/classic/tool-section.d.ts.map +1 -0
- package/dist/skins/classic/tool-section.js +20 -0
- package/dist/skins/classic/tool-section.js.map +1 -0
- package/dist/skins/classic/tools.d.ts +19 -0
- package/dist/skins/classic/tools.d.ts.map +1 -0
- package/dist/skins/classic/tools.js +72 -0
- package/dist/skins/classic/tools.js.map +1 -0
- package/dist/skins/ledger/activity.d.ts +6 -0
- package/dist/skins/ledger/activity.d.ts.map +1 -0
- package/dist/skins/ledger/activity.js +18 -0
- package/dist/skins/ledger/activity.js.map +1 -0
- package/dist/skins/ledger/approval.d.ts +17 -0
- package/dist/skins/ledger/approval.d.ts.map +1 -0
- package/dist/skins/ledger/approval.js +67 -0
- package/dist/skins/ledger/approval.js.map +1 -0
- package/dist/skins/ledger/body.d.ts +11 -0
- package/dist/skins/ledger/body.d.ts.map +1 -0
- package/dist/skins/ledger/body.js +77 -0
- package/dist/skins/ledger/body.js.map +1 -0
- package/dist/skins/ledger/chip.d.ts +27 -0
- package/dist/skins/ledger/chip.d.ts.map +1 -0
- package/dist/skins/ledger/chip.js +25 -0
- package/dist/skins/ledger/chip.js.map +1 -0
- package/dist/skins/ledger/index.d.ts +11 -0
- package/dist/skins/ledger/index.d.ts.map +1 -0
- package/dist/skins/ledger/index.js +44 -0
- package/dist/skins/ledger/index.js.map +1 -0
- package/dist/skins/ledger/live-region.d.ts +20 -0
- package/dist/skins/ledger/live-region.d.ts.map +1 -0
- package/dist/skins/ledger/live-region.js +89 -0
- package/dist/skins/ledger/live-region.js.map +1 -0
- package/dist/skins/ledger/messages.d.ts +17 -0
- package/dist/skins/ledger/messages.d.ts.map +1 -0
- package/dist/skins/ledger/messages.js +62 -0
- package/dist/skins/ledger/messages.js.map +1 -0
- package/dist/skins/ledger/status.d.ts +10 -0
- package/dist/skins/ledger/status.d.ts.map +1 -0
- package/dist/skins/ledger/status.js +302 -0
- package/dist/skins/ledger/status.js.map +1 -0
- package/dist/skins/ledger/tools.d.ts +20 -0
- package/dist/skins/ledger/tools.d.ts.map +1 -0
- package/dist/skins/ledger/tools.js +101 -0
- package/dist/skins/ledger/tools.js.map +1 -0
- package/dist/skins/names.d.ts +10 -0
- package/dist/skins/names.d.ts.map +1 -0
- package/dist/skins/names.js +9 -0
- package/dist/skins/names.js.map +1 -0
- package/dist/skins/rail/activity.d.ts +8 -0
- package/dist/skins/rail/activity.d.ts.map +1 -0
- package/dist/skins/rail/activity.js +23 -0
- package/dist/skins/rail/activity.js.map +1 -0
- package/dist/skins/rail/approval.d.ts +16 -0
- package/dist/skins/rail/approval.d.ts.map +1 -0
- package/dist/skins/rail/approval.js +45 -0
- package/dist/skins/rail/approval.js.map +1 -0
- package/dist/skins/rail/body.d.ts +19 -0
- package/dist/skins/rail/body.d.ts.map +1 -0
- package/dist/skins/rail/body.js +69 -0
- package/dist/skins/rail/body.js.map +1 -0
- package/dist/skins/rail/index.d.ts +12 -0
- package/dist/skins/rail/index.d.ts.map +1 -0
- package/dist/skins/rail/index.js +44 -0
- package/dist/skins/rail/index.js.map +1 -0
- package/dist/skins/rail/live-region.d.ts +19 -0
- package/dist/skins/rail/live-region.d.ts.map +1 -0
- package/dist/skins/rail/live-region.js +88 -0
- package/dist/skins/rail/live-region.js.map +1 -0
- package/dist/skins/rail/messages.d.ts +21 -0
- package/dist/skins/rail/messages.d.ts.map +1 -0
- package/dist/skins/rail/messages.js +90 -0
- package/dist/skins/rail/messages.js.map +1 -0
- package/dist/skins/rail/parts.d.ts +25 -0
- package/dist/skins/rail/parts.d.ts.map +1 -0
- package/dist/skins/rail/parts.js +37 -0
- package/dist/skins/rail/parts.js.map +1 -0
- package/dist/skins/rail/status.d.ts +10 -0
- package/dist/skins/rail/status.d.ts.map +1 -0
- package/dist/skins/rail/status.js +147 -0
- package/dist/skins/rail/status.js.map +1 -0
- package/dist/skins/rail/tools.d.ts +28 -0
- package/dist/skins/rail/tools.d.ts.map +1 -0
- package/dist/skins/rail/tools.js +85 -0
- package/dist/skins/rail/tools.js.map +1 -0
- package/dist/skins/registry.d.ts +6 -0
- package/dist/skins/registry.d.ts.map +1 -0
- package/dist/skins/registry.js +15 -0
- package/dist/skins/registry.js.map +1 -0
- package/dist/skins/shared/gauge.d.ts +17 -0
- package/dist/skins/shared/gauge.d.ts.map +1 -0
- package/dist/skins/shared/gauge.js +29 -0
- package/dist/skins/shared/gauge.js.map +1 -0
- package/dist/skins/shared/limits.d.ts +3 -0
- package/dist/skins/shared/limits.d.ts.map +1 -0
- package/dist/skins/shared/limits.js +3 -0
- package/dist/skins/shared/limits.js.map +1 -0
- package/dist/skins/shared/spinner.d.ts +14 -0
- package/dist/skins/shared/spinner.d.ts.map +1 -0
- package/dist/skins/shared/spinner.js +25 -0
- package/dist/skins/shared/spinner.js.map +1 -0
- package/dist/skins/testing/conformance.d.ts +8 -0
- package/dist/skins/testing/conformance.d.ts.map +1 -0
- package/dist/skins/testing/conformance.js +34 -0
- package/dist/skins/testing/conformance.js.map +1 -0
- package/dist/skins/testing/scenes.d.ts +45 -0
- package/dist/skins/testing/scenes.d.ts.map +1 -0
- package/dist/skins/testing/scenes.js +466 -0
- package/dist/skins/testing/scenes.js.map +1 -0
- package/dist/skins/types.d.ts +294 -0
- package/dist/skins/types.d.ts.map +1 -0
- package/dist/skins/types.js +10 -0
- package/dist/skins/types.js.map +1 -0
- package/dist/skins/zen/activity.d.ts +7 -0
- package/dist/skins/zen/activity.d.ts.map +1 -0
- package/dist/skins/zen/activity.js +22 -0
- package/dist/skins/zen/activity.js.map +1 -0
- package/dist/skins/zen/approval.d.ts +20 -0
- package/dist/skins/zen/approval.d.ts.map +1 -0
- package/dist/skins/zen/approval.js +67 -0
- package/dist/skins/zen/approval.js.map +1 -0
- package/dist/skins/zen/body.d.ts +14 -0
- package/dist/skins/zen/body.d.ts.map +1 -0
- package/dist/skins/zen/body.js +82 -0
- package/dist/skins/zen/body.js.map +1 -0
- package/dist/skins/zen/index.d.ts +12 -0
- package/dist/skins/zen/index.d.ts.map +1 -0
- package/dist/skins/zen/index.js +44 -0
- package/dist/skins/zen/index.js.map +1 -0
- package/dist/skins/zen/live-region.d.ts +21 -0
- package/dist/skins/zen/live-region.d.ts.map +1 -0
- package/dist/skins/zen/live-region.js +77 -0
- package/dist/skins/zen/live-region.js.map +1 -0
- package/dist/skins/zen/messages.d.ts +27 -0
- package/dist/skins/zen/messages.d.ts.map +1 -0
- package/dist/skins/zen/messages.js +81 -0
- package/dist/skins/zen/messages.js.map +1 -0
- package/dist/skins/zen/status.d.ts +11 -0
- package/dist/skins/zen/status.d.ts.map +1 -0
- package/dist/skins/zen/status.js +177 -0
- package/dist/skins/zen/status.js.map +1 -0
- package/dist/skins/zen/style.d.ts +26 -0
- package/dist/skins/zen/style.d.ts.map +1 -0
- package/dist/skins/zen/style.js +14 -0
- package/dist/skins/zen/style.js.map +1 -0
- package/dist/skins/zen/tools.d.ts +23 -0
- package/dist/skins/zen/tools.d.ts.map +1 -0
- package/dist/skins/zen/tools.js +81 -0
- package/dist/skins/zen/tools.js.map +1 -0
- package/dist/skins/zen/width.d.ts +12 -0
- package/dist/skins/zen/width.d.ts.map +1 -0
- package/dist/skins/zen/width.js +27 -0
- package/dist/skins/zen/width.js.map +1 -0
- package/dist/theme/ThemeContext.d.ts +26 -0
- package/dist/theme/ThemeContext.d.ts.map +1 -0
- package/dist/theme/ThemeContext.js +24 -0
- package/dist/theme/ThemeContext.js.map +1 -0
- package/dist/theme/detect-terminal-background.d.ts +29 -0
- package/dist/theme/detect-terminal-background.d.ts.map +1 -0
- package/dist/theme/detect-terminal-background.js +72 -0
- package/dist/theme/detect-terminal-background.js.map +1 -0
- package/dist/theme/palettes.d.ts +84 -0
- package/dist/theme/palettes.d.ts.map +1 -0
- package/dist/theme/palettes.js +175 -0
- package/dist/theme/palettes.js.map +1 -0
- package/dist/theme/resolve-theme.d.ts +44 -0
- package/dist/theme/resolve-theme.d.ts.map +1 -0
- package/dist/theme/resolve-theme.js +72 -0
- package/dist/theme/resolve-theme.js.map +1 -0
- package/dist/tools/file/create-file.js +1 -1
- package/dist/tools/file/create-file.js.map +1 -1
- package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
- package/dist/tools/system/run-code/run-code-runtime.js +87 -6
- package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
- package/dist/utils/shell/execute-shell.js +1 -1
- package/dist/utils/shell/execute-shell.js.map +1 -1
- package/dist/utils/value-suggestions.d.ts.map +1 -1
- package/dist/utils/value-suggestions.js +14 -0
- package/dist/utils/value-suggestions.js.map +1 -1
- package/package.json +3 -4
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { toTierModelPoolEntries } from '../../services/agent-runtime/model-resolver.js';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { Box, Text } from 'ink';
|
|
4
3
|
import { useSetting } from '../../hooks/use-setting.js';
|
|
5
4
|
import { useTerminalColumns } from '../../hooks/use-terminal-columns.js';
|
|
6
5
|
import { hasDockerHostControlProject } from '../../utils/shell/sandbox/docker-host-control-grants.js';
|
|
@@ -10,36 +9,11 @@ import { formatContextUsage } from '../../utils/ai/token-usage.js';
|
|
|
10
9
|
import { formatTokensPerSecond } from '../../utils/streaming/streaming-speed-tracker.js';
|
|
11
10
|
import { formatUsdMicros } from '../../services/cost/model-cost.js';
|
|
12
11
|
import { getActiveWorkspaceRoot } from '../../services/workspace/active-workspace-root.js';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
/**
|
|
16
|
-
* The one separator used between top-level config segments. Spacing lives
|
|
17
|
-
* here so every gap is identical; previously the same `│` was written three
|
|
18
|
-
* different ways (bare, inside `marginX`, and padded) and the bar looked
|
|
19
|
-
* ragged.
|
|
20
|
-
*/
|
|
21
|
-
const Divider = () => React.createElement(Text, { color: COLOR_TEXT_SUBTLE },
|
|
22
|
-
" ",
|
|
23
|
-
GLYPH_SEPARATOR,
|
|
24
|
-
" ");
|
|
25
|
-
/** The separator used between metrics segments — a lighter join than the `│`
|
|
26
|
-
* used elsewhere, since the metrics group is already one visual cluster. */
|
|
27
|
-
const MetricDivider = () => React.createElement(Text, { color: COLOR_TEXT_SUBTLE }, " \u00B7 ");
|
|
12
|
+
import { GLYPH_WARNING } from '../theme.js';
|
|
13
|
+
import { useSkin } from '../../skins/SkinContext.js';
|
|
28
14
|
function formatStatusBarTokens(tokens) {
|
|
29
15
|
return tokens > 1_000 ? `${(tokens / 1_000).toFixed(1)}k` : tokens.toLocaleString();
|
|
30
16
|
}
|
|
31
|
-
// terminalTextWidth counts every codepoint above U+007F as 2 columns, which is
|
|
32
|
-
// the right conservative default for CJK/emoji text but wildly overcounts the
|
|
33
|
-
// narrow box-drawing and arrow glyphs this bar is built from (│ ↑ ↓ · ▲ ❯ …).
|
|
34
|
-
// Measuring those as 2 nearly doubles the bar's apparent width and makes the
|
|
35
|
-
// budget collapse into the narrow layout far too eagerly. These specific
|
|
36
|
-
// glyphs render as exactly one cell in every terminal this app targets (they
|
|
37
|
-
// are chosen from theme.ts's "single-width on purpose" set plus the ellipsis
|
|
38
|
-
// truncateTerminalText appends), so measure them at 1 and defer to
|
|
39
|
-
// terminalTextWidth for everything else. Fix it here, not in
|
|
40
|
-
// terminalTextWidth itself — other callers of that function rely on its
|
|
41
|
-
// conservative doubling for content that really can be double-width.
|
|
42
|
-
const STATUS_BAR_NARROW_GLYPHS = new Set([GLYPH_SEPARATOR, '↑', '↓', '→', '·', GLYPH_WARNING, GLYPH_SELECTED, '…']);
|
|
43
17
|
const PROFILE_MODE_LABELS = {
|
|
44
18
|
'builtin:standard': 'Standard',
|
|
45
19
|
'builtin:lite': 'Lite',
|
|
@@ -51,86 +25,6 @@ const PROFILE_MODE_LABELS = {
|
|
|
51
25
|
function formatStatusBarRate(tps, approximate) {
|
|
52
26
|
return formatTokensPerSecond(tps, approximate).replace(' tok/s', 't/s');
|
|
53
27
|
}
|
|
54
|
-
function statusBarTextWidth(value) {
|
|
55
|
-
return Array.from(value).reduce((columns, char) => columns + (STATUS_BAR_NARROW_GLYPHS.has(char) ? 1 : terminalTextWidth(char)), 0);
|
|
56
|
-
}
|
|
57
|
-
const GROUP_SEPARATOR_TEXT = ` ${GLYPH_SEPARATOR} `;
|
|
58
|
-
const METRIC_SEPARATOR_TEXT = ' · ';
|
|
59
|
-
const GROUP_SEPARATOR_WIDTH = statusBarTextWidth(GROUP_SEPARATOR_TEXT);
|
|
60
|
-
const METRIC_SEPARATOR_WIDTH = statusBarTextWidth(METRIC_SEPARATOR_TEXT);
|
|
61
|
-
function separatorWidth(kind) {
|
|
62
|
-
if (kind === 'group')
|
|
63
|
-
return GROUP_SEPARATOR_WIDTH;
|
|
64
|
-
if (kind === 'metric')
|
|
65
|
-
return METRIC_SEPARATOR_WIDTH;
|
|
66
|
-
return 0;
|
|
67
|
-
}
|
|
68
|
-
function computeVisible(segments, dropped) {
|
|
69
|
-
const visible = [];
|
|
70
|
-
let anyBefore = false;
|
|
71
|
-
for (const segment of segments) {
|
|
72
|
-
if (!segment.text || dropped.has(segment.id))
|
|
73
|
-
continue;
|
|
74
|
-
visible.push({
|
|
75
|
-
id: segment.id,
|
|
76
|
-
text: segment.text,
|
|
77
|
-
color: segment.color,
|
|
78
|
-
bold: segment.bold,
|
|
79
|
-
showSeparator: Boolean(segment.separator) && anyBefore,
|
|
80
|
-
separator: segment.separator,
|
|
81
|
-
});
|
|
82
|
-
anyBefore = true;
|
|
83
|
-
}
|
|
84
|
-
return visible;
|
|
85
|
-
}
|
|
86
|
-
function measureVisible(visible) {
|
|
87
|
-
return visible.reduce((total, segment) => total + (segment.showSeparator ? separatorWidth(segment.separator) : 0) + statusBarTextWidth(segment.text), 0);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Fits one segment group to `budget` physical columns by dropping whole
|
|
91
|
-
* segments in ascending `tier` order (lowest tier first) until it fits, then —
|
|
92
|
-
* only as a last resort, and only for `truncatableId` — shrinking that one
|
|
93
|
-
* segment's text with an ellipsis. This is the explicit-budget approach
|
|
94
|
-
* BackgroundTasksPanel already uses: compute a hard column budget and shed
|
|
95
|
-
* content deliberately, rather than let Ink's flexbox reflow text mid-word
|
|
96
|
-
* when nothing fits.
|
|
97
|
-
*/
|
|
98
|
-
function fitGroup(defs, budget, truncatableId) {
|
|
99
|
-
const present = defs.filter((segment) => segment.text);
|
|
100
|
-
const dropped = new Set();
|
|
101
|
-
const dropOrder = present
|
|
102
|
-
.filter((segment) => segment.tier != null)
|
|
103
|
-
.sort((a, b) => a.tier - b.tier)
|
|
104
|
-
.map((segment) => segment.id);
|
|
105
|
-
let visible = computeVisible(present, dropped);
|
|
106
|
-
let width = measureVisible(visible);
|
|
107
|
-
for (const id of dropOrder) {
|
|
108
|
-
if (width <= budget)
|
|
109
|
-
break;
|
|
110
|
-
dropped.add(id);
|
|
111
|
-
visible = computeVisible(present, dropped);
|
|
112
|
-
width = measureVisible(visible);
|
|
113
|
-
}
|
|
114
|
-
if (width > budget && truncatableId) {
|
|
115
|
-
const index = visible.findIndex((segment) => segment.id === truncatableId);
|
|
116
|
-
if (index !== -1) {
|
|
117
|
-
const segment = visible[index];
|
|
118
|
-
const ownWidth = (segment.showSeparator ? separatorWidth(segment.separator) : 0) + statusBarTextWidth(segment.text);
|
|
119
|
-
const otherWidth = width - ownWidth;
|
|
120
|
-
const separatorPortion = segment.showSeparator ? separatorWidth(segment.separator) : 0;
|
|
121
|
-
const textAllowance = Math.max(1, budget - otherWidth - separatorPortion);
|
|
122
|
-
const truncated = truncateTerminalText(segment.text, textAllowance);
|
|
123
|
-
visible = visible.map((entry, entryIndex) => (entryIndex === index ? { ...entry, text: truncated } : entry));
|
|
124
|
-
width = measureVisible(visible);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return { visible, width };
|
|
128
|
-
}
|
|
129
|
-
function renderSegments(visible) {
|
|
130
|
-
return visible.map((segment) => (React.createElement(React.Fragment, { key: segment.id },
|
|
131
|
-
segment.showSeparator && (segment.separator === 'metric' ? React.createElement(MetricDivider, null) : React.createElement(Divider, null)),
|
|
132
|
-
React.createElement(Text, { color: segment.color, bold: segment.bold, wrap: "truncate-end" }, segment.text))));
|
|
133
|
-
}
|
|
134
28
|
/**
|
|
135
29
|
* formatUsdMicros renders every digit below one cent (e.g. $0.008205), which
|
|
136
30
|
* is fine standing alone but too long once it has to share a line with a
|
|
@@ -161,12 +55,131 @@ const AUTO_APPROVE_LABELS = {
|
|
|
161
55
|
auto: 'Auto',
|
|
162
56
|
always: 'YOLO',
|
|
163
57
|
};
|
|
58
|
+
/** One quota window as the classic bar prints it: `5H 42%→09:11`, or `Credits 40%` with no reset. */
|
|
59
|
+
export function formatQuotaWindow(window) {
|
|
60
|
+
return `${window.label} ${window.percent}%${window.resetText ? `→${window.resetText}` : ''}`;
|
|
61
|
+
}
|
|
62
|
+
const formatDateMonthDay = (date) => `${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}`;
|
|
63
|
+
function openCodeGoQuotaWindows(usage) {
|
|
64
|
+
if (!usage)
|
|
65
|
+
return [];
|
|
66
|
+
const formatReset = (seconds) => {
|
|
67
|
+
if (seconds < 60)
|
|
68
|
+
return `${Math.round(seconds)}s`;
|
|
69
|
+
const minutes = Math.floor(seconds / 60);
|
|
70
|
+
if (minutes < 60)
|
|
71
|
+
return `${minutes}m`;
|
|
72
|
+
const hours = Math.floor(minutes / 60);
|
|
73
|
+
return hours < 24 ? `${hours}h` : `${Math.floor(hours / 24)}d`;
|
|
74
|
+
};
|
|
75
|
+
const toWindow = (label, limit) => ({
|
|
76
|
+
label,
|
|
77
|
+
percent: Math.round(limit.usagePercent),
|
|
78
|
+
resetText: formatReset(limit.resetInSec),
|
|
79
|
+
});
|
|
80
|
+
return [
|
|
81
|
+
toWindow('Roll', usage.rollingUsage),
|
|
82
|
+
toWindow('Week', usage.weeklyUsage),
|
|
83
|
+
toWindow('Month', usage.monthlyUsage),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
function codexQuotaWindows(info) {
|
|
87
|
+
if (!info)
|
|
88
|
+
return [];
|
|
89
|
+
const isNumber = (value) => typeof value === 'number' && !isNaN(value);
|
|
90
|
+
// Codex decides which slot carries which window, so derive the unit from the
|
|
91
|
+
// window length instead of assuming primary is short and secondary is weekly.
|
|
92
|
+
const formatWindow = (minutes) => {
|
|
93
|
+
if (minutes >= 24 * 60)
|
|
94
|
+
return `${Math.round(minutes / (24 * 60))}D`;
|
|
95
|
+
if (minutes >= 60)
|
|
96
|
+
return `${Math.round(minutes / 60)}H`;
|
|
97
|
+
return `${Math.round(minutes)}M`;
|
|
98
|
+
};
|
|
99
|
+
const formatTime = (date) => date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });
|
|
100
|
+
// A reset further out than a day only needs a date. A reset landing within
|
|
101
|
+
// 24h needs the clock time, plus the date when the window itself spans days
|
|
102
|
+
// so it stays clear the reset can be tomorrow rather than later today.
|
|
103
|
+
const formatReset = (resetAt, windowMinutes) => {
|
|
104
|
+
const resetDate = new Date(resetAt * 1000);
|
|
105
|
+
const diffMs = resetDate.getTime() - Date.now();
|
|
106
|
+
const within24Hours = diffMs >= 0 && diffMs < 24 * 60 * 60 * 1000;
|
|
107
|
+
if (!within24Hours) {
|
|
108
|
+
return formatDateMonthDay(resetDate);
|
|
109
|
+
}
|
|
110
|
+
return windowMinutes >= 24 * 60
|
|
111
|
+
? `${formatDateMonthDay(resetDate)} ${formatTime(resetDate)}`
|
|
112
|
+
: formatTime(resetDate);
|
|
113
|
+
};
|
|
114
|
+
const toWindow = (window) => {
|
|
115
|
+
if (!window || !isNumber(window.window_minutes) || !isNumber(window.used_percent) || !isNumber(window.reset_at)) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
label: formatWindow(window.window_minutes),
|
|
120
|
+
percent: window.used_percent,
|
|
121
|
+
resetText: formatReset(window.reset_at, window.window_minutes),
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
return [info.primary, info.secondary]
|
|
125
|
+
.map(toWindow)
|
|
126
|
+
.filter((window) => window !== undefined);
|
|
127
|
+
}
|
|
128
|
+
// Grok reports one weekly credit percentage, not the rolling used/reset
|
|
129
|
+
// windows Codex reports, so it gets its own shape in the same slot — only one
|
|
130
|
+
// provider is active at a time.
|
|
131
|
+
function grokQuotaWindows(usage) {
|
|
132
|
+
if (!usage || typeof usage.creditUsagePercent !== 'number')
|
|
133
|
+
return [];
|
|
134
|
+
return [
|
|
135
|
+
{
|
|
136
|
+
label: 'Credits',
|
|
137
|
+
percent: Math.round(usage.creditUsagePercent),
|
|
138
|
+
resetText: usage.periodEndMs === undefined ? undefined : formatDateMonthDay(new Date(usage.periodEndMs)),
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
function formatActiveTime(ms) {
|
|
143
|
+
const totalSeconds = Math.round(ms / 1000);
|
|
144
|
+
if (totalSeconds < 60)
|
|
145
|
+
return `${totalSeconds}s`;
|
|
146
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
147
|
+
const seconds = totalSeconds % 60;
|
|
148
|
+
return seconds > 0 ? `${minutes}m${seconds}s` : `${minutes}m`;
|
|
149
|
+
}
|
|
150
|
+
// In warn mode the run keeps going past its envelope, so this line is the
|
|
151
|
+
// only signal the human gets. It states the dimension, used vs limit, and
|
|
152
|
+
// percentage consumed, not an instruction — the decision stays with the human.
|
|
153
|
+
function runBudgetNoticeText(notice) {
|
|
154
|
+
if (!notice)
|
|
155
|
+
return '';
|
|
156
|
+
if (notice.type === 'tool_stall') {
|
|
157
|
+
return `${GLYPH_WARNING} Possible stall: ${notice.toolName} ×${notice.count}`;
|
|
158
|
+
}
|
|
159
|
+
const { dimension, used, limit } = notice.evidence;
|
|
160
|
+
const percent = limit > 0 ? Math.round((used / limit) * 100) : 100;
|
|
161
|
+
switch (dimension) {
|
|
162
|
+
case 'usd':
|
|
163
|
+
return `${GLYPH_WARNING} Run ${formatUsdMicros(used)}/${formatUsdMicros(limit)} (${percent}%)`;
|
|
164
|
+
case 'unpriced_tokens':
|
|
165
|
+
return `${GLYPH_WARNING} Run tokens ${formatStatusBarTokens(used)}/${formatStatusBarTokens(limit)} (${percent}%)`;
|
|
166
|
+
case 'active_time':
|
|
167
|
+
return `${GLYPH_WARNING} Run time ${formatActiveTime(used)}/${formatActiveTime(limit)} (${percent}%)`;
|
|
168
|
+
case 'turns':
|
|
169
|
+
return `${GLYPH_WARNING} Run turns ${used}/${limit} (${percent}%)`;
|
|
170
|
+
default:
|
|
171
|
+
return `${GLYPH_WARNING} Run budget: ${percent}%`;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Builds the status view — every number, label and alert, already formatted —
|
|
176
|
+
* and hands it to the active skin to lay out. The formatting and the decisions
|
|
177
|
+
* about what is worth showing live here, so every skin shows the same facts.
|
|
178
|
+
*/
|
|
164
179
|
const StatusBar = ({ settingsService, sshInfo, lastUsage, liveStreamingSpeed, lastCodexRateLimit, grokCreditUsage, openCodeGoUsage, openRouterUpstream, upstreamProvider: upstreamProviderProp, largeUncachedWarning, hasPendingConfirmation = false, pendingLargeUncachedTokens, staticCommitBlocker = null, queueLength, costSummary, runBudgetNotice = null, columns: testColumns, }) => {
|
|
180
|
+
const { StatusBar: SkinStatusBar } = useSkin();
|
|
165
181
|
const liveColumns = useTerminalColumns();
|
|
166
182
|
const columns = testColumns ?? liveColumns;
|
|
167
|
-
// The bar applies paddingX={1} on both sides, so the budget available to
|
|
168
|
-
// segments is narrower than the terminal itself.
|
|
169
|
-
const budget = Math.max(1, columns - 2);
|
|
170
183
|
const activeProfileId = useSetting(settingsService, 'app.activeProfileId') ?? 'builtin:standard';
|
|
171
184
|
const mentorMode = activeProfileId === 'builtin:mentor';
|
|
172
185
|
const model = useSetting(settingsService, 'agent.model');
|
|
@@ -195,14 +208,11 @@ const StatusBar = ({ settingsService, sshInfo, lastUsage, liveStreamingSpeed, la
|
|
|
195
208
|
const contextWindow = model ? getModelContextWindow(providerKey, model) : undefined;
|
|
196
209
|
const contextTokens = lastUsage?.prompt_tokens;
|
|
197
210
|
const contextUsageText = contextTokens != null ? formatContextUsage(contextTokens, contextWindow) : '';
|
|
198
|
-
const
|
|
199
|
-
const glow = COLOR_WARNING;
|
|
200
|
-
const accent = COLOR_ACCENT;
|
|
201
|
-
const warnRed = COLOR_DANGER;
|
|
211
|
+
const contextPercent = contextTokens != null && contextWindow ? Math.round((contextTokens / contextWindow) * 100) : undefined;
|
|
202
212
|
const cacheReadTokens = lastUsage?.cache_read_tokens;
|
|
203
213
|
const usageHasCacheRead = cacheReadTokens != null && cacheReadTokens > 0;
|
|
204
214
|
const usageHasIntegratedWarning = Boolean(largeUncachedWarning && usageHasCacheRead);
|
|
205
|
-
const
|
|
215
|
+
const usageTone = largeUncachedWarning ? (hasPendingConfirmation ? 'danger' : 'warning') : 'textSubtle';
|
|
206
216
|
const tokenPieces = [];
|
|
207
217
|
if (lastUsage?.prompt_tokens != null)
|
|
208
218
|
tokenPieces.push(`↑${formatStatusBarTokens(lastUsage.prompt_tokens)}`);
|
|
@@ -247,111 +257,15 @@ const StatusBar = ({ settingsService, sshInfo, lastUsage, liveStreamingSpeed, la
|
|
|
247
257
|
}
|
|
248
258
|
return `${GLYPH_WARNING} cache miss risk ~${Math.round(largeUncachedWarning.estimatedTokens / 1000)}k`;
|
|
249
259
|
})();
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const hours = Math.floor(minutes / 60);
|
|
260
|
-
return hours < 24 ? `${hours}h` : `${Math.floor(hours / 24)}d`;
|
|
261
|
-
};
|
|
262
|
-
const formatLimit = (label, limit) => `${label} ${Math.round(limit.usagePercent)}%→${formatReset(limit.resetInSec)}`;
|
|
263
|
-
return [
|
|
264
|
-
formatLimit('Roll', openCodeGoUsage.rollingUsage),
|
|
265
|
-
formatLimit('Week', openCodeGoUsage.weeklyUsage),
|
|
266
|
-
formatLimit('Month', openCodeGoUsage.monthlyUsage),
|
|
267
|
-
].join(' / ');
|
|
268
|
-
})();
|
|
269
|
-
const codexRateLimitText = (() => {
|
|
270
|
-
if (!lastCodexRateLimit)
|
|
271
|
-
return '';
|
|
272
|
-
const isNumber = (value) => typeof value === 'number' && !isNaN(value);
|
|
273
|
-
// Codex decides which slot carries which window, so derive the unit from the
|
|
274
|
-
// window length instead of assuming primary is short and secondary is weekly.
|
|
275
|
-
const formatWindow = (minutes) => {
|
|
276
|
-
if (minutes >= 24 * 60)
|
|
277
|
-
return `${Math.round(minutes / (24 * 60))}D`;
|
|
278
|
-
if (minutes >= 60)
|
|
279
|
-
return `${Math.round(minutes / 60)}H`;
|
|
280
|
-
return `${Math.round(minutes)}M`;
|
|
281
|
-
};
|
|
282
|
-
const formatDate = (date) => `${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}`;
|
|
283
|
-
const formatTime = (date) => date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });
|
|
284
|
-
// A reset further out than a day only needs a date. A reset landing within
|
|
285
|
-
// 24h needs the clock time, plus the date when the window itself spans days
|
|
286
|
-
// so it stays clear the reset can be tomorrow rather than later today.
|
|
287
|
-
const formatReset = (resetAt, windowMinutes) => {
|
|
288
|
-
const resetDate = new Date(resetAt * 1000);
|
|
289
|
-
const diffMs = resetDate.getTime() - Date.now();
|
|
290
|
-
const within24Hours = diffMs >= 0 && diffMs < 24 * 60 * 60 * 1000;
|
|
291
|
-
if (!within24Hours) {
|
|
292
|
-
return formatDate(resetDate);
|
|
293
|
-
}
|
|
294
|
-
return windowMinutes >= 24 * 60 ? `${formatDate(resetDate)} ${formatTime(resetDate)}` : formatTime(resetDate);
|
|
295
|
-
};
|
|
296
|
-
const formatWindowUsage = (window) => {
|
|
297
|
-
if (!window || !isNumber(window.window_minutes) || !isNumber(window.used_percent) || !isNumber(window.reset_at)) {
|
|
298
|
-
return undefined;
|
|
299
|
-
}
|
|
300
|
-
const reset = formatReset(window.reset_at, window.window_minutes);
|
|
301
|
-
return `${formatWindow(window.window_minutes)} ${window.used_percent}%→${reset}`;
|
|
302
|
-
};
|
|
303
|
-
return [lastCodexRateLimit.primary, lastCodexRateLimit.secondary]
|
|
304
|
-
.map(formatWindowUsage)
|
|
305
|
-
.filter((part) => part !== undefined)
|
|
306
|
-
.join(' / ');
|
|
307
|
-
})();
|
|
308
|
-
// Grok reports one weekly credit percentage, not the rolling used/reset
|
|
309
|
-
// windows Codex reports, so it gets its own formatting in the same slot —
|
|
310
|
-
// only one provider is active at a time. `formatDate` and `formatTime` above
|
|
311
|
-
// belong to the Codex block; this one needs only the period end.
|
|
312
|
-
const grokCreditUsageText = (() => {
|
|
313
|
-
if (!grokCreditUsage || typeof grokCreditUsage.creditUsagePercent !== 'number')
|
|
314
|
-
return '';
|
|
315
|
-
const percent = Math.round(grokCreditUsage.creditUsagePercent);
|
|
316
|
-
const periodEndMs = grokCreditUsage.periodEndMs;
|
|
317
|
-
if (periodEndMs === undefined)
|
|
318
|
-
return `Credits ${percent}%`;
|
|
319
|
-
const resetDate = new Date(periodEndMs);
|
|
320
|
-
const reset = `${String(resetDate.getMonth() + 1).padStart(2, '0')}/${String(resetDate.getDate()).padStart(2, '0')}`;
|
|
321
|
-
return `Credits ${percent}%→${reset}`;
|
|
322
|
-
})();
|
|
323
|
-
function formatActiveTime(ms) {
|
|
324
|
-
const totalSeconds = Math.round(ms / 1000);
|
|
325
|
-
if (totalSeconds < 60)
|
|
326
|
-
return `${totalSeconds}s`;
|
|
327
|
-
const minutes = Math.floor(totalSeconds / 60);
|
|
328
|
-
const seconds = totalSeconds % 60;
|
|
329
|
-
return seconds > 0 ? `${minutes}m${seconds}s` : `${minutes}m`;
|
|
330
|
-
}
|
|
331
|
-
// In warn mode the run keeps going past its envelope, so this line is the
|
|
332
|
-
// only signal the human gets. It states the dimension, used vs limit, and
|
|
333
|
-
// percentage consumed, not an instruction — the decision stays with the human.
|
|
334
|
-
const runBudgetNoticeText = (() => {
|
|
335
|
-
if (!runBudgetNotice)
|
|
336
|
-
return '';
|
|
337
|
-
if (runBudgetNotice.type === 'tool_stall') {
|
|
338
|
-
return `${GLYPH_WARNING} Possible stall: ${runBudgetNotice.toolName} ×${runBudgetNotice.count}`;
|
|
339
|
-
}
|
|
340
|
-
const { dimension, used, limit } = runBudgetNotice.evidence;
|
|
341
|
-
const percent = limit > 0 ? Math.round((used / limit) * 100) : 100;
|
|
342
|
-
switch (dimension) {
|
|
343
|
-
case 'usd':
|
|
344
|
-
return `${GLYPH_WARNING} Run ${formatUsdMicros(used)}/${formatUsdMicros(limit)} (${percent}%)`;
|
|
345
|
-
case 'unpriced_tokens':
|
|
346
|
-
return `${GLYPH_WARNING} Run tokens ${formatStatusBarTokens(used)}/${formatStatusBarTokens(limit)} (${percent}%)`;
|
|
347
|
-
case 'active_time':
|
|
348
|
-
return `${GLYPH_WARNING} Run time ${formatActiveTime(used)}/${formatActiveTime(limit)} (${percent}%)`;
|
|
349
|
-
case 'turns':
|
|
350
|
-
return `${GLYPH_WARNING} Run turns ${used}/${limit} (${percent}%)`;
|
|
351
|
-
default:
|
|
352
|
-
return `${GLYPH_WARNING} Run budget: ${percent}%`;
|
|
353
|
-
}
|
|
354
|
-
})();
|
|
260
|
+
// Only one provider is active at a time, so at most one of these is non-empty.
|
|
261
|
+
const codexWindows = codexQuotaWindows(lastCodexRateLimit);
|
|
262
|
+
const grokWindows = grokQuotaWindows(grokCreditUsage);
|
|
263
|
+
const quotaWindows = codexWindows.length > 0
|
|
264
|
+
? codexWindows
|
|
265
|
+
: grokWindows.length > 0
|
|
266
|
+
? grokWindows
|
|
267
|
+
: openCodeGoQuotaWindows(openCodeGoUsage);
|
|
268
|
+
const quotaText = quotaWindows.map(formatQuotaWindow).join(' / ');
|
|
355
269
|
const staticCommitBlockerText = (() => {
|
|
356
270
|
if (!staticCommitBlocker) {
|
|
357
271
|
return '';
|
|
@@ -375,75 +289,80 @@ const StatusBar = ({ settingsService, sshInfo, lastUsage, liveStreamingSpeed, la
|
|
|
375
289
|
? AUTO_APPROVE_LABELS.always
|
|
376
290
|
: 'Sandboxed'
|
|
377
291
|
: AUTO_APPROVE_LABELS[autoApproveMode];
|
|
378
|
-
const
|
|
292
|
+
const safetyTone = autoApproveAlways
|
|
293
|
+
? 'danger'
|
|
294
|
+
: sandboxEnabled || autoApproveMode === 'auto'
|
|
295
|
+
? 'success'
|
|
296
|
+
: 'warning';
|
|
379
297
|
// The alert row is where every non-steady-state message lands. Keeping them
|
|
380
298
|
// in one row (rather than stacked beside the identity segments, as before)
|
|
381
299
|
// means the bar is a single line whenever nothing is wrong — which is most
|
|
382
300
|
// of the time — and grows only to say something.
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
|
|
301
|
+
const alerts = [];
|
|
302
|
+
if (warningText) {
|
|
303
|
+
alerts.push({
|
|
304
|
+
id: 'cache-warning',
|
|
305
|
+
parts: [{ text: warningText, tone: hasPendingConfirmation ? 'danger' : 'warning', bold: true }],
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (dockerHostAccess) {
|
|
309
|
+
alerts.push({
|
|
310
|
+
id: 'docker-host',
|
|
311
|
+
parts: [
|
|
312
|
+
{ text: 'Docker host: ', tone: 'textSubtle' },
|
|
313
|
+
{ text: dockerHostAccess, tone: 'warning', bold: true },
|
|
314
|
+
],
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
const budgetText = runBudgetNoticeText(runBudgetNotice);
|
|
318
|
+
if (budgetText) {
|
|
319
|
+
alerts.push({ id: 'run-budget', parts: [{ text: budgetText, tone: 'warning', bold: true }] });
|
|
320
|
+
}
|
|
321
|
+
if (debugMode && staticCommitBlockerText) {
|
|
322
|
+
alerts.push({ id: 'static-blocker', parts: [{ text: staticCommitBlockerText, tone: 'danger', bold: true }] });
|
|
323
|
+
}
|
|
386
324
|
// Segments as data: each group is fit to the *full* row budget on its own
|
|
387
|
-
// (drop order below), and only afterward
|
|
388
|
-
// compared to see whether they still coexist on one line.
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
const configSegments = [
|
|
392
|
-
{ id: 'ssh-marker', text: sshInfo ? 'SSH' : '', color: glow, bold: true, tier: 0 },
|
|
325
|
+
// (drop order below) by the skin, and only afterward are the two fitted groups
|
|
326
|
+
// compared to see whether they still coexist on one line.
|
|
327
|
+
const config = [
|
|
328
|
+
{ id: 'ssh-marker', text: sshInfo ? 'SSH' : '', tone: 'warning', bold: true, tier: 0 },
|
|
393
329
|
{
|
|
394
330
|
id: 'ssh-detail',
|
|
395
331
|
text: sshInfo ? ` ${sshInfo.user}@${sshInfo.host}:${sshInfo.remoteDir}` : '',
|
|
396
|
-
|
|
332
|
+
tone: 'textSubtle',
|
|
397
333
|
tier: 5,
|
|
398
334
|
},
|
|
399
|
-
{
|
|
400
|
-
id: 'mode',
|
|
401
|
-
text: modeLabel,
|
|
402
|
-
color: accent,
|
|
403
|
-
bold: true,
|
|
404
|
-
separator: 'group',
|
|
405
|
-
},
|
|
335
|
+
{ id: 'mode', text: modeLabel, tone: 'accent', bold: true, separator: 'group' },
|
|
406
336
|
{
|
|
407
337
|
id: 'queue',
|
|
408
338
|
text: queueLength != null && queueLength > 0 ? `[Q:${queueLength}]` : '',
|
|
409
|
-
|
|
339
|
+
tone: 'accent',
|
|
410
340
|
separator: 'group',
|
|
411
341
|
tier: 3,
|
|
412
342
|
},
|
|
413
|
-
{
|
|
414
|
-
id: 'provider-model',
|
|
415
|
-
text: model ? `${displayProviderLabel}/${model}` : '',
|
|
416
|
-
color: accent,
|
|
417
|
-
separator: 'group',
|
|
418
|
-
},
|
|
343
|
+
{ id: 'provider-model', text: model ? `${displayProviderLabel}/${model}` : '', tone: 'accent', separator: 'group' },
|
|
419
344
|
{
|
|
420
345
|
id: 'reasoning',
|
|
421
346
|
text: model && reasoningEffort && reasoningEffort !== 'default' ? ` · ${reasoningEffort}` : '',
|
|
422
|
-
|
|
347
|
+
tone: 'warning',
|
|
423
348
|
tier: 2,
|
|
424
349
|
},
|
|
425
350
|
{
|
|
426
351
|
id: 'mentor',
|
|
427
352
|
text: mentorMode && mentorModel ? mentorModel : '',
|
|
428
|
-
|
|
353
|
+
tone: 'accentAlt',
|
|
429
354
|
separator: 'group',
|
|
430
355
|
tier: 1,
|
|
431
356
|
},
|
|
432
|
-
{
|
|
433
|
-
id: 'safety',
|
|
434
|
-
text: safetyLabel,
|
|
435
|
-
color: safetyColor,
|
|
436
|
-
bold: true,
|
|
437
|
-
separator: 'group',
|
|
438
|
-
},
|
|
357
|
+
{ id: 'safety', text: safetyLabel, tone: safetyTone, bold: true, separator: 'group' },
|
|
439
358
|
];
|
|
440
|
-
const
|
|
441
|
-
{ id: 'tokens', text: tokensText,
|
|
442
|
-
{ id: 'speed', text: speedText,
|
|
359
|
+
const metrics = [
|
|
360
|
+
{ id: 'tokens', text: tokensText, tone: usageTone, bold: Boolean(largeUncachedWarning), tier: 4 },
|
|
361
|
+
{ id: 'speed', text: speedText, tone: 'textSubtle', separator: 'metric', tier: 0 },
|
|
443
362
|
{
|
|
444
363
|
id: 'cache',
|
|
445
364
|
text: cacheText,
|
|
446
|
-
|
|
365
|
+
tone: usageHasIntegratedWarning ? usageTone : 'textSubtle',
|
|
447
366
|
bold: usageHasIntegratedWarning ? Boolean(largeUncachedWarning) : false,
|
|
448
367
|
separator: 'metric',
|
|
449
368
|
// The alert variant of this segment is the warning itself, so it must
|
|
@@ -451,38 +370,24 @@ const StatusBar = ({ settingsService, sshInfo, lastUsage, liveStreamingSpeed, la
|
|
|
451
370
|
// the one thing it exists to say.
|
|
452
371
|
tier: usageHasIntegratedWarning ? undefined : 1,
|
|
453
372
|
},
|
|
454
|
-
{ id: 'context', text: contextText,
|
|
455
|
-
{ id: 'cost', text: costText,
|
|
373
|
+
{ id: 'context', text: contextText, tone: 'textSubtle', separator: 'metric', tier: 3 },
|
|
374
|
+
{ id: 'cost', text: costText, tone: 'textSubtle', separator: 'metric', tier: 2 },
|
|
456
375
|
];
|
|
457
|
-
const
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
dockerHostAccess && (React.createElement(React.Fragment, null,
|
|
473
|
-
warningText && React.createElement(Divider, null),
|
|
474
|
-
React.createElement(Text, { color: slate, wrap: "truncate-end" },
|
|
475
|
-
"Docker host:",
|
|
476
|
-
' '),
|
|
477
|
-
React.createElement(Text, { color: glow, bold: true, wrap: "truncate-end" }, dockerHostAccess))),
|
|
478
|
-
runBudgetNoticeText && (React.createElement(React.Fragment, null,
|
|
479
|
-
(warningText || dockerHostAccess) && React.createElement(Divider, null),
|
|
480
|
-
React.createElement(Text, { color: glow, bold: true, wrap: "truncate-end" }, runBudgetNoticeText))),
|
|
481
|
-
visibleStaticCommitBlockerText && (React.createElement(React.Fragment, null,
|
|
482
|
-
(warningText || dockerHostAccess || runBudgetNoticeText) && React.createElement(Divider, null),
|
|
483
|
-
React.createElement(Text, { color: warnRed, bold: true, wrap: "truncate-end" }, visibleStaticCommitBlockerText)))),
|
|
484
|
-
quotaText && (React.createElement(Box, { flexShrink: 0 },
|
|
485
|
-
React.createElement(Text, { color: slate, wrap: "truncate-end" }, quotaText)))))));
|
|
376
|
+
const view = {
|
|
377
|
+
columns,
|
|
378
|
+
config,
|
|
379
|
+
metrics,
|
|
380
|
+
alerts,
|
|
381
|
+
quotaText,
|
|
382
|
+
gauges: {
|
|
383
|
+
contextPercent,
|
|
384
|
+
contextUsedTokens: contextTokens ?? undefined,
|
|
385
|
+
contextWindowTokens: contextWindow ?? undefined,
|
|
386
|
+
cachePercent,
|
|
387
|
+
quotaWindows,
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
return React.createElement(SkinStatusBar, { ...view });
|
|
486
391
|
};
|
|
487
392
|
export default StatusBar;
|
|
488
393
|
//# sourceMappingURL=StatusBar.js.map
|