@deepseek-harness-tui/dsh-tui 0.14.1 → 0.16.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/README.md +163 -17
- package/bin/dsh-tui.js +200 -34
- package/cordis.patch.yml +16 -52
- package/cordis.yml +6 -2
- package/guide/dsh-tui-guide/claude-backend.en.md +44 -7
- package/guide/dsh-tui-guide/claude-backend.md +28 -6
- package/guide/dsh-tui-guide/codex-backend.en.md +47 -10
- package/guide/dsh-tui-guide/codex-backend.md +26 -4
- package/guide/dsh-tui-guide/configuration.en.md +168 -18
- package/guide/dsh-tui-guide/configuration.md +144 -16
- package/guide/dsh-tui-guide/getting-started.en.md +15 -0
- package/guide/dsh-tui-guide/getting-started.md +15 -0
- package/guide/dsh-tui-guide/interaction.en.md +64 -24
- package/guide/dsh-tui-guide/interaction.md +49 -19
- package/guide/dsh-tui-guide/plugins.en.md +97 -3
- package/guide/dsh-tui-guide/plugins.md +55 -2
- package/guide/dsh-tui-guide/themes.en.md +23 -14
- package/guide/dsh-tui-guide/themes.md +19 -12
- package/guide/dsh-tui-guide/user-guide.en.md +53 -21
- package/guide/dsh-tui-guide/user-guide.md +43 -22
- package/lib/settings.json +103 -9
- package/lib/types/adapter/channel/projection.d.ts.map +1 -1
- package/lib/types/adapter/channel/projection.js +1 -0
- package/lib/types/adapter/channel/ui-policy.d.ts +1 -1
- package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui-policy.js +4 -0
- package/lib/types/adapter/channel/ui.d.ts +2 -0
- package/lib/types/adapter/channel/ui.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui.js +6 -2
- package/lib/types/adapter/kernel/runtime.d.ts.map +1 -1
- package/lib/types/adapter/kernel/runtime.js +2 -0
- package/lib/types/adapter/ports/channel-catalog.d.ts +5 -1
- package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-settings.d.ts +14 -3
- package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +56 -12
- package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts +68 -0
- package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel.d.ts +2 -0
- package/lib/types/adapter/ports/channel.d.ts.map +1 -1
- package/lib/types/adapter/spec/backend-capabilities.d.ts +22 -0
- package/lib/types/adapter/spec/backend-capabilities.d.ts.map +1 -0
- package/lib/types/adapter/spec/backend-capabilities.js +49 -0
- package/lib/types/adapter/spec/protocol-constants.d.ts.map +1 -1
- package/lib/types/adapter/spec/protocol-constants.js +10 -3
- package/lib/types/adapter/spec/tui-contributions.d.ts +3 -0
- package/lib/types/adapter/spec/tui-contributions.d.ts.map +1 -1
- package/lib/types/adapter/spec/tui-contributions.js +7 -0
- package/lib/types/adapter/standard/registry.d.ts +6 -0
- package/lib/types/adapter/standard/registry.d.ts.map +1 -1
- package/lib/types/adapter/standard/registry.js +65 -15
- package/lib/types/adapter/standard/tui-extension.d.ts.map +1 -1
- package/lib/types/adapter/standard/tui-extension.js +7 -1
- package/lib/types/adapter/standard/types.d.ts +10 -1
- package/lib/types/adapter/standard/types.d.ts.map +1 -1
- package/lib/types/adapter/upstream/host-descriptor-driver.d.ts.map +1 -1
- package/lib/types/adapter/upstream/host-descriptor-driver.js +52 -0
- package/lib/types/agent/backend-manifest.d.ts +152 -0
- package/lib/types/agent/backend-manifest.d.ts.map +1 -0
- package/lib/types/agent/backend-manifest.js +14 -0
- package/lib/types/agent/backend.d.ts +71 -5
- package/lib/types/agent/backend.d.ts.map +1 -1
- package/lib/types/agent/capabilities.d.ts +6 -0
- package/lib/types/agent/capabilities.d.ts.map +1 -1
- package/lib/types/agent/events.d.ts +3 -2
- package/lib/types/agent/events.d.ts.map +1 -1
- package/lib/types/agent/index.d.ts +2 -0
- package/lib/types/agent/index.d.ts.map +1 -1
- package/lib/types/agent/refs.d.ts +11 -1
- package/lib/types/agent/refs.d.ts.map +1 -1
- package/lib/types/agent/starting-session.d.ts +4 -0
- package/lib/types/agent/starting-session.d.ts.map +1 -0
- package/lib/types/agent/starting-session.js +19 -0
- package/lib/types/backends/claude/activity.d.ts +1 -1
- package/lib/types/backends/claude/activity.d.ts.map +1 -1
- package/lib/types/backends/claude/activity.js +5 -5
- package/lib/types/backends/claude/auth.d.ts.map +1 -1
- package/lib/types/backends/claude/auth.js +10 -3
- package/lib/types/backends/claude/backend.d.ts.map +1 -1
- package/lib/types/backends/claude/backend.js +103 -29
- package/lib/types/backends/claude/catalog.d.ts +2 -1
- package/lib/types/backends/claude/catalog.d.ts.map +1 -1
- package/lib/types/backends/claude/catalog.js +15 -5
- package/lib/types/backends/claude/channels.d.ts +5 -3
- package/lib/types/backends/claude/channels.d.ts.map +1 -1
- package/lib/types/backends/claude/channels.js +5 -4
- package/lib/types/backends/claude/contract.d.ts +4 -0
- package/lib/types/backends/claude/contract.d.ts.map +1 -1
- package/lib/types/backends/claude/contract.js +4 -0
- package/lib/types/backends/claude/controls.d.ts +4 -0
- package/lib/types/backends/claude/controls.d.ts.map +1 -1
- package/lib/types/backends/claude/controls.js +34 -42
- package/lib/types/backends/claude/dialogs.d.ts +8 -2
- package/lib/types/backends/claude/dialogs.d.ts.map +1 -1
- package/lib/types/backends/claude/dialogs.js +24 -16
- package/lib/types/backends/claude/images.d.ts +1 -1
- package/lib/types/backends/claude/images.d.ts.map +1 -1
- package/lib/types/backends/claude/images.js +7 -7
- package/lib/types/backends/claude/manifest.d.ts +21 -0
- package/lib/types/backends/claude/manifest.d.ts.map +1 -0
- package/lib/types/backends/claude/manifest.js +29 -0
- package/lib/types/backends/claude/older-history.js +2 -2
- package/lib/types/backends/claude/permissions.js +11 -11
- package/lib/types/backends/claude/prefs.d.ts +4 -2
- package/lib/types/backends/claude/prefs.d.ts.map +1 -1
- package/lib/types/backends/claude/prefs.js +4 -3
- package/lib/types/backends/claude/process.d.ts +16 -4
- package/lib/types/backends/claude/process.d.ts.map +1 -1
- package/lib/types/backends/claude/process.js +100 -37
- package/lib/types/backends/claude/send-message.d.ts +1 -1
- package/lib/types/backends/claude/send-message.d.ts.map +1 -1
- package/lib/types/backends/claude/session/auth.js +22 -22
- package/lib/types/backends/claude/session/channels.d.ts +4 -0
- package/lib/types/backends/claude/session/channels.d.ts.map +1 -1
- package/lib/types/backends/claude/session/channels.js +5 -3
- package/lib/types/backends/claude/session/lifecycle.d.ts.map +1 -1
- package/lib/types/backends/claude/session/lifecycle.js +31 -23
- package/lib/types/backends/claude/session/store.js +8 -8
- package/lib/types/backends/claude/session/subagents.js +2 -2
- package/lib/types/backends/claude/session/types.d.ts +7 -0
- package/lib/types/backends/claude/session/types.d.ts.map +1 -1
- package/lib/types/backends/claude/side-query.js +3 -3
- package/lib/types/backends/claude/task-output.js +5 -5
- package/lib/types/backends/claude/text.d.ts +778 -0
- package/lib/types/backends/claude/text.d.ts.map +1 -0
- package/lib/types/backends/claude/text.js +298 -0
- package/lib/types/backends/claude/transcript-file.d.ts +1 -1
- package/lib/types/backends/claude/transcript-file.d.ts.map +1 -1
- package/lib/types/backends/claude/transcript-file.js +4 -4
- package/lib/types/backends/claude/translate/attempts.js +2 -2
- package/lib/types/backends/claude/translate/core.js +3 -3
- package/lib/types/backends/claude/translate/messages.js +4 -4
- package/lib/types/backends/claude/translate/system.js +14 -14
- package/lib/types/backends/claude/translate/tasks.js +2 -2
- package/lib/types/backends/claude/translate/types.d.ts +1 -1
- package/lib/types/backends/claude/translate/types.d.ts.map +1 -1
- package/lib/types/backends/codex/auth/external-tokens.js +16 -16
- package/lib/types/backends/codex/auth/status.js +14 -14
- package/lib/types/backends/codex/backend.d.ts +4 -19
- package/lib/types/backends/codex/backend.d.ts.map +1 -1
- package/lib/types/backends/codex/backend.js +118 -25
- package/lib/types/backends/codex/catalog.d.ts +2 -1
- package/lib/types/backends/codex/catalog.d.ts.map +1 -1
- package/lib/types/backends/codex/catalog.js +63 -18
- package/lib/types/backends/codex/channels.d.ts +6 -3
- package/lib/types/backends/codex/channels.d.ts.map +1 -1
- package/lib/types/backends/codex/channels.js +15 -13
- package/lib/types/backends/codex/contract.d.ts +3 -0
- package/lib/types/backends/codex/contract.d.ts.map +1 -1
- package/lib/types/backends/codex/contract.js +3 -0
- package/lib/types/backends/codex/detect.d.ts.map +1 -1
- package/lib/types/backends/codex/detect.js +9 -6
- package/lib/types/backends/codex/manifest.d.ts +30 -0
- package/lib/types/backends/codex/manifest.d.ts.map +1 -0
- package/lib/types/backends/codex/manifest.js +23 -0
- package/lib/types/backends/codex/prefs.d.ts +4 -2
- package/lib/types/backends/codex/prefs.d.ts.map +1 -1
- package/lib/types/backends/codex/prefs.js +4 -3
- package/lib/types/backends/codex/rpc/hub.js +2 -2
- package/lib/types/backends/codex/session/activity.d.ts +1 -1
- package/lib/types/backends/codex/session/activity.d.ts.map +1 -1
- package/lib/types/backends/codex/session/activity.js +13 -13
- package/lib/types/backends/codex/session/approvals.js +30 -30
- package/lib/types/backends/codex/session/async-questions.d.ts +17 -0
- package/lib/types/backends/codex/session/async-questions.d.ts.map +1 -0
- package/lib/types/backends/codex/session/async-questions.js +89 -0
- package/lib/types/backends/codex/session/commands.d.ts +8 -2
- package/lib/types/backends/codex/session/commands.d.ts.map +1 -1
- package/lib/types/backends/codex/session/commands.js +71 -23
- package/lib/types/backends/codex/session/controls.d.ts +1 -1
- package/lib/types/backends/codex/session/controls.d.ts.map +1 -1
- package/lib/types/backends/codex/session/controls.js +21 -16
- package/lib/types/backends/codex/session/goals.d.ts.map +1 -1
- package/lib/types/backends/codex/session/goals.js +3 -3
- package/lib/types/backends/codex/session/history.js +2 -2
- package/lib/types/backends/codex/session/images.js +8 -8
- package/lib/types/backends/codex/session/input.d.ts +6 -2
- package/lib/types/backends/codex/session/input.d.ts.map +1 -1
- package/lib/types/backends/codex/session/input.js +55 -13
- package/lib/types/backends/codex/session/plan-review.js +6 -6
- package/lib/types/backends/codex/session/session.d.ts.map +1 -1
- package/lib/types/backends/codex/session/session.js +100 -42
- package/lib/types/backends/codex/session/side-query.d.ts.map +1 -1
- package/lib/types/backends/codex/session/side-query.js +27 -9
- package/lib/types/backends/codex/session/state.d.ts +6 -1
- package/lib/types/backends/codex/session/state.d.ts.map +1 -1
- package/lib/types/backends/codex/session/subagents.js +5 -5
- package/lib/types/backends/codex/session/tasks.js +4 -4
- package/lib/types/backends/codex/text.d.ts +933 -0
- package/lib/types/backends/codex/text.d.ts.map +1 -0
- package/lib/types/backends/codex/text.js +313 -0
- package/lib/types/backends/codex/translate/items.d.ts.map +1 -1
- package/lib/types/backends/codex/translate/items.js +7 -5
- package/lib/types/backends/codex/translate/live.d.ts.map +1 -1
- package/lib/types/backends/codex/translate/live.js +11 -8
- package/lib/types/backends/codex/translate/notices.js +10 -10
- package/lib/types/backends/codex/translate/question-reply.d.ts +11 -0
- package/lib/types/backends/codex/translate/question-reply.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/question-reply.js +53 -0
- package/lib/types/backends/shared/channel-slug.d.ts +4 -0
- package/lib/types/backends/shared/channel-slug.d.ts.map +1 -0
- package/lib/types/backends/shared/channel-slug.js +25 -0
- package/lib/types/backends/shared/channel-tokens.d.ts.map +1 -1
- package/lib/types/backends/shared/channel-tokens.js +30 -23
- package/lib/types/{channel → backends/shared}/elicitation.d.ts +78 -21
- package/lib/types/backends/shared/elicitation.d.ts.map +1 -0
- package/lib/types/{channel → backends/shared}/elicitation.js +64 -66
- package/lib/types/backends/shared/image-size.d.ts +33 -0
- package/lib/types/backends/shared/image-size.d.ts.map +1 -0
- package/lib/types/backends/shared/image-size.js +134 -0
- package/lib/types/{utils → backends/shared}/jsonl.d.ts +5 -1
- package/lib/types/backends/shared/jsonl.d.ts.map +1 -0
- package/lib/types/{utils → backends/shared}/jsonl.js +5 -1
- package/lib/types/backends/shared/localized-text.d.ts +30 -0
- package/lib/types/backends/shared/localized-text.d.ts.map +1 -0
- package/lib/types/backends/shared/localized-text.js +24 -0
- package/lib/types/backends/shared/platform-text.d.ts +88 -0
- package/lib/types/backends/shared/platform-text.d.ts.map +1 -0
- package/lib/types/backends/shared/platform-text.js +33 -0
- package/lib/types/branding.d.ts +13 -0
- package/lib/types/branding.d.ts.map +1 -1
- package/lib/types/branding.js +18 -0
- package/lib/types/channel/channel-slug.d.ts +3 -1
- package/lib/types/channel/channel-slug.d.ts.map +1 -1
- package/lib/types/channel/channel-slug.js +3 -1
- package/lib/types/channel/projection.d.ts.map +1 -1
- package/lib/types/channel/projection.js +10 -0
- package/lib/types/channel/sanitize.d.ts +7 -0
- package/lib/types/channel/sanitize.d.ts.map +1 -1
- package/lib/types/channel/sanitize.js +9 -0
- package/lib/types/channel/usage.d.ts.map +1 -1
- package/lib/types/channel/usage.js +5 -0
- package/lib/types/commands.d.ts +15 -0
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +58 -10
- package/lib/types/components/AgentMessageComposer.d.ts.map +1 -1
- package/lib/types/components/AgentMessageComposer.js +3 -2
- package/lib/types/components/BtwPanel.d.ts.map +1 -1
- package/lib/types/components/BtwPanel.js +4 -2
- package/lib/types/components/Chat/JobCard.js +3 -3
- package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
- package/lib/types/components/CommandSuggestions.js +24 -7
- package/lib/types/components/ContextBarView.d.ts +5 -1
- package/lib/types/components/ContextBarView.d.ts.map +1 -1
- package/lib/types/components/ContextBarView.js +6 -3
- package/lib/types/components/ExtensionDialog.d.ts.map +1 -1
- package/lib/types/components/ExtensionDialog.js +2 -3
- package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
- package/lib/types/components/GoalTodoPanel.js +14 -3
- package/lib/types/components/InlineMathParagraph.js +1 -1
- package/lib/types/components/KernelPicker.d.ts.map +1 -1
- package/lib/types/components/KernelPicker.js +1 -1
- package/lib/types/components/LogoV2.d.ts +4 -1
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +14 -9
- package/lib/types/components/MarkdownTable.d.ts.map +1 -1
- package/lib/types/components/MarkdownTable.js +4 -3
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +109 -15
- package/lib/types/components/ModelPicker.d.ts +24 -31
- package/lib/types/components/ModelPicker.d.ts.map +1 -1
- package/lib/types/components/ModelPicker.js +115 -40
- package/lib/types/components/PermissionsPicker.d.ts +10 -1
- package/lib/types/components/PermissionsPicker.d.ts.map +1 -1
- package/lib/types/components/PermissionsPicker.js +24 -16
- package/lib/types/components/PluginInstallPane.d.ts +21 -0
- package/lib/types/components/PluginInstallPane.d.ts.map +1 -0
- package/lib/types/components/PluginInstallPane.js +84 -0
- package/lib/types/components/PluginManagePane.d.ts +21 -0
- package/lib/types/components/PluginManagePane.d.ts.map +1 -0
- package/lib/types/components/PluginManagePane.js +69 -0
- package/lib/types/components/PromptEditor.d.ts +3 -3
- package/lib/types/components/PromptInput.d.ts +21 -3
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +65 -121
- package/lib/types/components/SdkInstallWizard.d.ts +3 -1
- package/lib/types/components/SdkInstallWizard.d.ts.map +1 -1
- package/lib/types/components/SdkInstallWizard.js +8 -1
- package/lib/types/components/SearchBox.d.ts +13 -15
- package/lib/types/components/SearchBox.d.ts.map +1 -1
- package/lib/types/components/SearchBox.js +58 -27
- package/lib/types/components/SubagentCard.d.ts +13 -1
- package/lib/types/components/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +27 -12
- package/lib/types/components/SubagentDashboard.d.ts +8 -1
- package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
- package/lib/types/components/SubagentDashboard.js +58 -16
- package/lib/types/components/ThemePicker.d.ts +1 -1
- package/lib/types/components/ThemePicker.d.ts.map +1 -1
- package/lib/types/components/ThemePicker.js +14 -11
- package/lib/types/components/Tooltip.js +1 -1
- package/lib/types/components/WorkingSpinner.js +1 -1
- package/lib/types/components/WorkspaceFlowPicker.d.ts.map +1 -1
- package/lib/types/components/WorkspaceFlowPicker.js +4 -3
- package/lib/types/components/composerImageTokens.d.ts +24 -0
- package/lib/types/components/composerImageTokens.d.ts.map +1 -0
- package/lib/types/components/composerImageTokens.js +37 -0
- package/lib/types/components/design-system/InputCaret.d.ts +7 -0
- package/lib/types/components/design-system/InputCaret.d.ts.map +1 -0
- package/lib/types/components/design-system/InputCaret.js +9 -0
- package/lib/types/components/design-system/ListItem.d.ts +13 -2
- package/lib/types/components/design-system/ListItem.d.ts.map +1 -1
- package/lib/types/components/design-system/ListItem.js +11 -5
- package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +6 -8
- package/lib/types/components/kernelCatalog.d.ts +55 -11
- package/lib/types/components/kernelCatalog.d.ts.map +1 -1
- package/lib/types/components/kernelCatalog.js +42 -23
- package/lib/types/components/launchpadActions.d.ts +4 -0
- package/lib/types/components/launchpadActions.d.ts.map +1 -1
- package/lib/types/components/launchpadActions.js +5 -4
- package/lib/types/components/launchpadLayout.d.ts +14 -1
- package/lib/types/components/launchpadLayout.d.ts.map +1 -1
- package/lib/types/components/launchpadLayout.js +38 -19
- package/lib/types/components/messages/TeamMessageBubble.d.ts +20 -0
- package/lib/types/components/messages/TeamMessageBubble.d.ts.map +1 -0
- package/lib/types/components/messages/TeamMessageBubble.js +15 -0
- package/lib/types/components/messages/UserPromptMessage.d.ts +4 -3
- package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -1
- package/lib/types/components/messages/UserPromptMessage.js +4 -3
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +8 -3
- package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
- package/lib/types/components/questions/PlanReviewPanel.js +4 -3
- package/lib/types/components/questions/ProviderModelEditor.d.ts.map +1 -1
- package/lib/types/components/questions/ProviderModelEditor.js +3 -13
- package/lib/types/components/sessions/ForeignSessionRow.d.ts +3 -1
- package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -1
- package/lib/types/components/sessions/ForeignSessionRow.js +5 -2
- package/lib/types/components/sessions/SessionListRow.d.ts +3 -1
- package/lib/types/components/sessions/SessionListRow.d.ts.map +1 -1
- package/lib/types/components/sessions/SessionListRow.js +5 -2
- package/lib/types/components/sidePanel/PanelBar.d.ts +1 -0
- package/lib/types/components/sidePanel/PanelBar.d.ts.map +1 -1
- package/lib/types/components/sidePanel/PanelBar.js +21 -17
- package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -1
- package/lib/types/components/sidePanel/PanelHost.js +5 -1
- package/lib/types/components/sidePanel/PanelStore.d.ts +8 -0
- package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
- package/lib/types/components/sidePanel/PanelStore.js +11 -0
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts +1 -1
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
- package/lib/types/components/sidePanel/SidePanelColumn.js +15 -2
- package/lib/types/components/sidePanel/SidePanelLayout.d.ts +6 -4
- package/lib/types/components/sidePanel/SidePanelLayout.d.ts.map +1 -1
- package/lib/types/components/sidePanel/SidePanelLayout.js +33 -7
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +7 -0
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -1
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +4 -0
- package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +7 -2
- package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -1
- package/lib/types/components/sidePanel/btw/BtwComposer.js +28 -8
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +2 -1
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -1
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +156 -21
- package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +6 -2
- package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -1
- package/lib/types/components/sidePanel/btw/BtwThreadScene.js +64 -16
- package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +15 -5
- package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -1
- package/lib/types/components/sidePanel/btw/BtwThreadView.js +101 -10
- package/lib/types/components/sidePanel/btw/threads.d.ts +18 -0
- package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -1
- package/lib/types/components/sidePanel/btw/threads.js +51 -0
- package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
- package/lib/types/components/sidePanel/builtinPanels.js +5 -1
- package/lib/types/components/sidePanel/companion/CompanionPanel.js +2 -2
- package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +5 -1
- package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -1
- package/lib/types/components/sidePanel/companion/SplashMascot.js +19 -4
- package/lib/types/components/sidePanel/companion/skins.d.ts +8 -0
- package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
- package/lib/types/components/sidePanel/companion/skins.js +57 -12
- package/lib/types/components/sidePanel/types.d.ts +7 -1
- package/lib/types/components/sidePanel/types.d.ts.map +1 -1
- package/lib/types/components/sidePanel/useSidePanel.d.ts +2 -0
- package/lib/types/components/sidePanel/useSidePanel.d.ts.map +1 -1
- package/lib/types/components/sidePanel/useSidePanel.js +11 -1
- package/lib/types/components/splashArtRows.d.ts +29 -0
- package/lib/types/components/splashArtRows.d.ts.map +1 -0
- package/lib/types/components/splashArtRows.js +31 -0
- package/lib/types/components/splashFonts.d.ts +24 -1
- package/lib/types/components/splashFonts.d.ts.map +1 -1
- package/lib/types/components/splashFonts.js +40 -5
- package/lib/types/components/teamRoster.d.ts +70 -0
- package/lib/types/components/teamRoster.d.ts.map +1 -0
- package/lib/types/components/teamRoster.js +78 -0
- package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts +3 -1
- package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts.map +1 -1
- package/lib/types/components/workspaces/HomeWorkspaceRow.js +5 -2
- package/lib/types/dsh-adapter/admission-loader.d.ts +102 -0
- package/lib/types/dsh-adapter/admission-loader.d.ts.map +1 -0
- package/lib/types/dsh-adapter/admission-loader.js +301 -0
- package/lib/types/dsh-adapter/agent-view.d.ts.map +1 -1
- package/lib/types/dsh-adapter/agent-view.js +3 -1
- package/lib/types/dsh-adapter/approvals.d.ts +7 -0
- package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
- package/lib/types/dsh-adapter/approvals.js +45 -1
- package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -1
- package/lib/types/dsh-adapter/backend/translate.js +71 -8
- package/lib/types/dsh-adapter/backend-admission.d.ts +64 -0
- package/lib/types/dsh-adapter/backend-admission.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend-admission.js +34 -0
- package/lib/types/dsh-adapter/backend-assembly.d.ts +31 -0
- package/lib/types/dsh-adapter/backend-assembly.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend-assembly.js +225 -0
- package/lib/types/dsh-adapter/backend-contribution.d.ts +62 -0
- package/lib/types/dsh-adapter/backend-contribution.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend-contribution.js +78 -0
- package/lib/types/dsh-adapter/backend-registry.d.ts +136 -0
- package/lib/types/dsh-adapter/backend-registry.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend-registry.js +304 -0
- package/lib/types/dsh-adapter/backends.d.ts +67 -24
- package/lib/types/dsh-adapter/backends.d.ts.map +1 -1
- package/lib/types/dsh-adapter/backends.generated.d.ts +12 -0
- package/lib/types/dsh-adapter/backends.generated.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backends.generated.js +6 -0
- package/lib/types/dsh-adapter/backends.js +91 -46
- package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/bundled-presets.js +60 -3
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts +2 -0
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/action-readiness.js +9 -3
- package/lib/types/dsh-adapter/channel/agent-view-projection.js +2 -2
- package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/background-action.js +8 -3
- package/lib/types/dsh-adapter/channel/binding-events.d.ts +17 -3
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +19 -46
- package/lib/types/dsh-adapter/channel/channel-host.d.ts +45 -0
- package/lib/types/dsh-adapter/channel/channel-host.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/channel-host.js +1 -0
- package/lib/types/dsh-adapter/channel/command-completions.d.ts +5 -0
- package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/command-completions.js +79 -6
- package/lib/types/dsh-adapter/channel/compaction.d.ts +7 -2
- package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/compaction.js +100 -26
- package/lib/types/dsh-adapter/channel/composer-images.d.ts +4 -2
- package/lib/types/dsh-adapter/channel/composer-images.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/composer-images.js +36 -5
- package/lib/types/dsh-adapter/channel/cordis-host.d.ts +14 -0
- package/lib/types/dsh-adapter/channel/cordis-host.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/cordis-host.js +35 -0
- package/lib/types/dsh-adapter/channel/core/actions.d.ts +3 -3
- package/lib/types/dsh-adapter/channel/core/actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/actions.js +15 -6
- package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +10 -3
- package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/binding-feed.js +5 -1
- package/lib/types/dsh-adapter/channel/core/compose.d.ts +12 -28
- package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/compose.js +330 -117
- package/lib/types/dsh-adapter/channel/core/files.d.ts +7 -2
- package/lib/types/dsh-adapter/channel/core/files.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/files.js +1 -0
- package/lib/types/dsh-adapter/channel/core/host.d.ts +12 -6
- package/lib/types/dsh-adapter/channel/core/host.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/host.js +69 -35
- package/lib/types/dsh-adapter/channel/core/local-actions.d.ts +5 -3
- package/lib/types/dsh-adapter/channel/core/local-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/local-actions.js +5 -2
- package/lib/types/dsh-adapter/channel/core/session-controls.js +2 -2
- package/lib/types/dsh-adapter/channel/core/session-switch.d.ts +7 -4
- package/lib/types/dsh-adapter/channel/core/session-switch.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/session-switch.js +8 -4
- package/lib/types/dsh-adapter/channel/core/sessions.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/core/sessions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/core/sessions.js +75 -16
- package/lib/types/dsh-adapter/channel/extensions.d.ts +4 -3
- package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/extensions.js +109 -30
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts +2 -2
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/input-delivery.js +14 -5
- package/lib/types/dsh-adapter/channel/job-projection.d.ts +4 -0
- package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/job-projection.js +205 -24
- package/lib/types/dsh-adapter/channel/mentions.d.ts +3 -3
- package/lib/types/dsh-adapter/channel/mentions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +7 -0
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.js +235 -13
- package/lib/types/dsh-adapter/channel/model-actions.d.ts +5 -1
- package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-actions.js +48 -29
- package/lib/types/dsh-adapter/channel/model-selection.d.ts +17 -0
- package/lib/types/dsh-adapter/channel/model-selection.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/model-selection.js +109 -0
- package/lib/types/dsh-adapter/channel/model-switch.d.ts +12 -21
- package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-switch.js +39 -102
- package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/permissions.js +4 -1
- package/lib/types/dsh-adapter/channel/projection-helpers.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/projection-helpers.js +2 -0
- package/lib/types/dsh-adapter/channel/projection.js +1 -1
- package/lib/types/dsh-adapter/channel/reports.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/reports.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/reports.js +11 -3
- package/lib/types/dsh-adapter/channel/session-fork.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-fork.js +33 -20
- package/lib/types/dsh-adapter/channel/session-listing.d.ts +20 -0
- package/lib/types/dsh-adapter/channel/session-listing.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/session-listing.js +51 -0
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts +3 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.js +60 -30
- package/lib/types/dsh-adapter/channel/session-reset.js +2 -2
- package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-resume.js +22 -8
- package/lib/types/dsh-adapter/channel/session-rewind.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-rewind.js +38 -24
- package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-tree-actions.js +38 -24
- package/lib/types/dsh-adapter/channel/settings-host.d.ts +5 -2
- package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/settings-host.js +136 -5
- package/lib/types/dsh-adapter/channel/state.d.ts +43 -1
- package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/state.js +14 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.js +84 -12
- package/lib/types/dsh-adapter/channel/task-completion.d.ts +6 -0
- package/lib/types/dsh-adapter/channel/task-completion.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/task-completion.js +114 -0
- package/lib/types/dsh-adapter/channel/transcript.d.ts +8 -1
- package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/transcript.js +20 -3
- package/lib/types/dsh-adapter/channel/upstream-retry.d.ts +81 -0
- package/lib/types/dsh-adapter/channel/upstream-retry.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/upstream-retry.js +138 -0
- package/lib/types/dsh-adapter/channel/workspace-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/workspace-actions.js +9 -8
- package/lib/types/dsh-adapter/channel-ui.d.ts +3 -1
- package/lib/types/dsh-adapter/channel-ui.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel-ui.js +4 -2
- package/lib/types/dsh-adapter/channel.d.ts +2 -2
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +19 -5
- package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts +55 -0
- package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts.map +1 -0
- package/lib/types/dsh-adapter/compat/agent-team-0.2.0.js +96 -0
- package/lib/types/dsh-adapter/context-occupancy.d.ts +81 -4
- package/lib/types/dsh-adapter/context-occupancy.d.ts.map +1 -1
- package/lib/types/dsh-adapter/context-occupancy.js +108 -17
- package/lib/types/dsh-adapter/contract.d.ts +4 -4
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +20 -5
- package/lib/types/dsh-adapter/effect-ledger.d.ts +7 -0
- package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -1
- package/lib/types/dsh-adapter/effect-ledger.js +8 -1
- package/lib/types/dsh-adapter/entry-slot.d.ts +38 -0
- package/lib/types/dsh-adapter/entry-slot.d.ts.map +1 -0
- package/lib/types/dsh-adapter/entry-slot.js +28 -0
- package/lib/types/dsh-adapter/fresh-agent.d.ts +22 -0
- package/lib/types/dsh-adapter/fresh-agent.d.ts.map +1 -0
- package/lib/types/dsh-adapter/fresh-agent.js +226 -0
- package/lib/types/dsh-adapter/host-access.d.ts +16 -1
- package/lib/types/dsh-adapter/host-access.d.ts.map +1 -1
- package/lib/types/dsh-adapter/host-access.js +148 -2
- package/lib/types/dsh-adapter/host-contract.d.ts +103 -0
- package/lib/types/dsh-adapter/host-contract.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-contract.js +77 -0
- package/lib/types/dsh-adapter/host-dsh.d.ts +112 -0
- package/lib/types/dsh-adapter/host-dsh.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-dsh.js +481 -0
- package/lib/types/dsh-adapter/host-entry.d.ts +9 -0
- package/lib/types/dsh-adapter/host-entry.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-entry.js +253 -0
- package/lib/types/dsh-adapter/index.d.ts +53 -17
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +63 -9
- package/lib/types/dsh-adapter/install/executors.d.ts +44 -0
- package/lib/types/dsh-adapter/install/executors.d.ts.map +1 -0
- package/lib/types/dsh-adapter/install/executors.js +15 -0
- package/lib/types/dsh-adapter/install/pnpm-profile-add.d.ts +3 -0
- package/lib/types/dsh-adapter/install/pnpm-profile-add.d.ts.map +1 -0
- package/lib/types/dsh-adapter/install/pnpm-profile-add.js +150 -0
- package/lib/types/dsh-adapter/invariant.d.ts +7 -2
- package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
- package/lib/types/dsh-adapter/invariant.js +6 -3
- package/lib/types/dsh-adapter/jobs.d.ts +7 -0
- package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
- package/lib/types/dsh-adapter/jobs.js +13 -0
- package/lib/types/dsh-adapter/lite-profile.d.ts +50 -0
- package/lib/types/dsh-adapter/lite-profile.d.ts.map +1 -0
- package/lib/types/dsh-adapter/lite-profile.js +49 -0
- package/lib/types/dsh-adapter/migrate/index.js +2 -2
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +1 -1
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -1
- package/lib/types/dsh-adapter/migrate/parse/jsonl.js +4 -3
- package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -1
- package/lib/types/dsh-adapter/oauth/profiles.js +5 -1
- package/lib/types/dsh-adapter/panels.d.ts +7 -0
- package/lib/types/dsh-adapter/panels.d.ts.map +1 -1
- package/lib/types/dsh-adapter/panels.js +41 -2
- package/lib/types/dsh-adapter/plugin-completions.d.ts +32 -0
- package/lib/types/dsh-adapter/plugin-completions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-completions.js +80 -0
- package/lib/types/dsh-adapter/plugin-declaration.d.ts +119 -0
- package/lib/types/dsh-adapter/plugin-declaration.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-declaration.js +183 -0
- package/lib/types/dsh-adapter/plugin-feed.d.ts +94 -0
- package/lib/types/dsh-adapter/plugin-feed.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-feed.js +135 -0
- package/lib/types/dsh-adapter/plugin-guard.d.ts +115 -0
- package/lib/types/dsh-adapter/plugin-guard.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-guard.js +108 -0
- package/lib/types/dsh-adapter/plugin-host.d.ts +13 -2
- package/lib/types/dsh-adapter/plugin-host.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin-host.js +34 -8
- package/lib/types/dsh-adapter/plugin-install.d.ts +160 -0
- package/lib/types/dsh-adapter/plugin-install.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-install.js +545 -0
- package/lib/types/dsh-adapter/plugin-manage.d.ts +178 -0
- package/lib/types/dsh-adapter/plugin-manage.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-manage.js +468 -0
- package/lib/types/dsh-adapter/plugin-manager.d.ts +144 -0
- package/lib/types/dsh-adapter/plugin-manager.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-manager.js +83 -0
- package/lib/types/dsh-adapter/plugin.d.ts +50 -1
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +918 -234
- package/lib/types/dsh-adapter/plugins-info.d.ts +130 -8
- package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugins-info.js +469 -44
- package/lib/types/dsh-adapter/process-exit.d.ts +43 -0
- package/lib/types/dsh-adapter/process-exit.d.ts.map +1 -0
- package/lib/types/dsh-adapter/process-exit.js +60 -0
- package/lib/types/dsh-adapter/root-dispose.d.ts +18 -0
- package/lib/types/dsh-adapter/root-dispose.d.ts.map +1 -0
- package/lib/types/dsh-adapter/root-dispose.js +28 -0
- package/lib/types/dsh-adapter/session-list-metadata.d.ts +20 -0
- package/lib/types/dsh-adapter/session-list-metadata.d.ts.map +1 -0
- package/lib/types/dsh-adapter/session-list-metadata.js +56 -0
- package/lib/types/dsh-adapter/session-projection-store.d.ts +66 -0
- package/lib/types/dsh-adapter/session-projection-store.d.ts.map +1 -0
- package/lib/types/dsh-adapter/session-projection-store.js +149 -0
- package/lib/types/dsh-adapter/session-seed.d.ts +11 -0
- package/lib/types/dsh-adapter/session-seed.d.ts.map +1 -0
- package/lib/types/dsh-adapter/session-seed.js +47 -0
- package/lib/types/dsh-adapter/sessions/list.d.ts +3 -1
- package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/list.js +11 -5
- package/lib/types/dsh-adapter/sessions/snapshot.d.ts +0 -2
- package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/snapshot.js +7 -70
- package/lib/types/dsh-adapter/settingsEditor.js +2 -2
- package/lib/types/dsh-adapter/sideQuestion.d.ts +21 -0
- package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sideQuestion.js +53 -0
- package/lib/types/dsh-adapter/startup-args.d.ts +2 -0
- package/lib/types/dsh-adapter/startup-args.d.ts.map +1 -1
- package/lib/types/dsh-adapter/startup-args.js +5 -0
- package/lib/types/dsh-adapter/subagents.d.ts +33 -1
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
- package/lib/types/dsh-adapter/subagents.js +112 -9
- package/lib/types/dsh-adapter/team-mode.d.ts +74 -0
- package/lib/types/dsh-adapter/team-mode.d.ts.map +1 -0
- package/lib/types/dsh-adapter/team-mode.js +188 -0
- package/lib/types/dsh-adapter/team-roster.d.ts +67 -0
- package/lib/types/dsh-adapter/team-roster.d.ts.map +1 -0
- package/lib/types/dsh-adapter/team-roster.js +136 -0
- package/lib/types/dsh-adapter/team-tools.d.ts +58 -0
- package/lib/types/dsh-adapter/team-tools.d.ts.map +1 -0
- package/lib/types/dsh-adapter/team-tools.js +208 -0
- package/lib/types/dsh-adapter/tui-settings.d.ts +57 -0
- package/lib/types/dsh-adapter/tui-settings.d.ts.map +1 -0
- package/lib/types/dsh-adapter/tui-settings.js +199 -0
- package/lib/types/dsh-adapter/types.d.ts +1 -1
- package/lib/types/dsh-adapter/types.d.ts.map +1 -1
- package/lib/types/effortPrefs.d.ts +6 -3
- package/lib/types/effortPrefs.d.ts.map +1 -1
- package/lib/types/effortPrefs.js +7 -4
- package/lib/types/hostEntryRoute.d.ts +18 -0
- package/lib/types/hostEntryRoute.d.ts.map +1 -0
- package/lib/types/hostEntryRoute.js +57 -0
- package/lib/types/i18n.d.ts +961 -1439
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +443 -387
- package/lib/types/ink/components/AlternateScreen.js +2 -2
- package/lib/types/ink/components/App.d.ts +1 -0
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +16 -4
- package/lib/types/ink/components/CursorDeclarationContext.d.ts +9 -0
- package/lib/types/ink/components/CursorDeclarationContext.d.ts.map +1 -1
- package/lib/types/ink/components/CursorDeclarationContext.js +2 -0
- package/lib/types/ink/components/ScrollBox.d.ts +9 -0
- package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
- package/lib/types/ink/components/ScrollBox.js +23 -0
- package/lib/types/ink/dom.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-copy-on-select.d.ts +2 -2
- package/lib/types/ink/hooks/use-copy-on-select.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-copy-on-select.js +13 -7
- package/lib/types/ink/hooks/use-declared-cursor.d.ts +11 -3
- package/lib/types/ink/hooks/use-declared-cursor.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-declared-cursor.js +30 -10
- package/lib/types/ink/ink.d.ts +22 -17
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +151 -40
- package/lib/types/ink/kitty-graphics.d.ts +2 -0
- package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
- package/lib/types/ink/kitty-graphics.js +6 -1
- package/lib/types/ink/node-cache.d.ts +2 -1
- package/lib/types/ink/node-cache.d.ts.map +1 -1
- package/lib/types/ink/output.d.ts +10 -4
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +14 -10
- package/lib/types/ink/render-node-to-output.d.ts +5 -2
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +27 -9
- package/lib/types/ink/renderer.d.ts +1 -0
- package/lib/types/ink/renderer.d.ts.map +1 -1
- package/lib/types/ink/renderer.js +4 -3
- package/lib/types/ink/root.d.ts +4 -1
- package/lib/types/ink/root.d.ts.map +1 -1
- package/lib/types/ink/screen.d.ts +4 -2
- package/lib/types/ink/screen.d.ts.map +1 -1
- package/lib/types/ink/selection.d.ts +10 -1
- package/lib/types/ink/selection.d.ts.map +1 -1
- package/lib/types/ink/selection.js +94 -25
- package/lib/types/ink/stdin-handoff.d.ts +11 -0
- package/lib/types/ink/stdin-handoff.d.ts.map +1 -0
- package/lib/types/ink/stdin-handoff.js +20 -0
- package/lib/types/ink/styles.d.ts +2 -1
- package/lib/types/ink/styles.d.ts.map +1 -1
- package/lib/types/ink/terminal-image.d.ts +6 -4
- package/lib/types/ink/terminal-image.d.ts.map +1 -1
- package/lib/types/ink/terminal-image.js +16 -39
- package/lib/types/ink/terminal-notification.d.ts +8 -0
- package/lib/types/ink/terminal-notification.d.ts.map +1 -0
- package/lib/types/ink/terminal-notification.js +83 -0
- package/lib/types/ink/terminal.d.ts +9 -0
- package/lib/types/ink/terminal.d.ts.map +1 -1
- package/lib/types/ink/terminal.js +34 -1
- package/lib/types/ink/termio/csi.d.ts +11 -0
- package/lib/types/ink/termio/csi.d.ts.map +1 -1
- package/lib/types/ink/termio/csi.js +13 -0
- package/lib/types/ink/update-overflow-guard.d.ts +6 -0
- package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
- package/lib/types/ink/update-overflow-guard.js +17 -0
- package/lib/types/ink/wrap-text.d.ts +6 -0
- package/lib/types/ink/wrap-text.d.ts.map +1 -1
- package/lib/types/ink/wrap-text.js +17 -0
- package/lib/types/kernelPrefs.d.ts +130 -17
- package/lib/types/kernelPrefs.d.ts.map +1 -1
- package/lib/types/kernelPrefs.js +98 -35
- package/lib/types/math/inline-layout.d.ts +2 -0
- package/lib/types/math/inline-layout.d.ts.map +1 -1
- package/lib/types/math/inline-layout.js +5 -27
- package/lib/types/modelGroups.d.ts +15 -27
- package/lib/types/modelGroups.d.ts.map +1 -1
- package/lib/types/modelGroups.js +17 -31
- package/lib/types/modelPrefs.d.ts +5 -4
- package/lib/types/modelPrefs.d.ts.map +1 -1
- package/lib/types/modelPrefs.js +5 -4
- package/lib/types/modelRoute.d.ts +23 -9
- package/lib/types/modelRoute.d.ts.map +1 -1
- package/lib/types/modelRoute.js +25 -11
- package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
- package/lib/types/native-ts/yoga-layout/index.js +8 -1
- package/lib/types/permissionPrefs.d.ts +34 -0
- package/lib/types/permissionPrefs.d.ts.map +1 -0
- package/lib/types/permissionPrefs.js +61 -0
- package/lib/types/permissionPresetLabels.d.ts +25 -0
- package/lib/types/permissionPresetLabels.d.ts.map +1 -0
- package/lib/types/permissionPresetLabels.js +33 -0
- package/lib/types/plugin-host.d.ts +1 -0
- package/lib/types/plugin-host.d.ts.map +1 -1
- package/lib/types/preset-patch.d.ts +22 -0
- package/lib/types/preset-patch.d.ts.map +1 -0
- package/lib/types/preset-patch.js +14 -0
- package/lib/types/presetPrefs.d.ts +17 -3
- package/lib/types/presetPrefs.d.ts.map +1 -1
- package/lib/types/presetPrefs.js +20 -3
- package/lib/types/reload.d.ts +6 -10
- package/lib/types/reload.d.ts.map +1 -1
- package/lib/types/reload.js +14 -14
- package/lib/types/screens/Chat.d.ts +55 -16
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +742 -280
- package/lib/types/screens/Launchpad.d.ts +33 -17
- package/lib/types/screens/Launchpad.d.ts.map +1 -1
- package/lib/types/screens/Launchpad.js +256 -78
- package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/SessionSupervisor.js +53 -12
- package/lib/types/screens/Settings.d.ts.map +1 -1
- package/lib/types/screens/Settings.js +7 -0
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +24 -7
- package/lib/types/screens/StatusMetrics.d.ts +46 -1
- package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
- package/lib/types/screens/StatusMetrics.js +72 -0
- package/lib/types/screens/chat/useKernelPicker.d.ts +8 -4
- package/lib/types/screens/chat/useKernelPicker.d.ts.map +1 -1
- package/lib/types/screens/chat/useKernelPicker.js +61 -21
- package/lib/types/screens/chat/useModelPicker.d.ts +42 -0
- package/lib/types/screens/chat/useModelPicker.d.ts.map +1 -0
- package/lib/types/screens/chat/useModelPicker.js +182 -0
- package/lib/types/screens/chat/usePluginWriteFlow.d.ts +68 -0
- package/lib/types/screens/chat/usePluginWriteFlow.d.ts.map +1 -0
- package/lib/types/screens/chat/usePluginWriteFlow.js +92 -0
- package/lib/types/screens/chatOverlay.d.ts +30 -5
- package/lib/types/screens/chatOverlay.d.ts.map +1 -1
- package/lib/types/screens/chatOverlay.js +0 -1
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +4 -1
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +26 -5
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +1 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +51 -29
- package/lib/types/sessionHistory.d.ts +5 -0
- package/lib/types/sessionHistory.d.ts.map +1 -1
- package/lib/types/sessionHistory.js +5 -0
- package/lib/types/sessionModes.d.ts +5 -3
- package/lib/types/sessionModes.d.ts.map +1 -1
- package/lib/types/sessionModes.js +9 -3
- package/lib/types/sessions/listSnapshot.d.ts +6 -0
- package/lib/types/sessions/listSnapshot.d.ts.map +1 -0
- package/lib/types/sessions/listSnapshot.js +67 -0
- package/lib/types/settings/definitions.d.ts +50 -0
- package/lib/types/settings/definitions.d.ts.map +1 -1
- package/lib/types/settings/definitions.js +42 -8
- package/lib/types/terminal-utils/cjk-emphasis.d.ts +28 -0
- package/lib/types/terminal-utils/cjk-emphasis.d.ts.map +1 -0
- package/lib/types/terminal-utils/cjk-emphasis.js +31 -0
- package/lib/types/terminal-utils/markdown.d.ts +3 -1
- package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
- package/lib/types/terminal-utils/markdown.js +7 -2
- package/lib/types/theme.d.ts +29 -12
- package/lib/types/theme.d.ts.map +1 -1
- package/lib/types/theme.js +310 -23
- package/lib/types/themeCatalog.d.ts.map +1 -1
- package/lib/types/themeCatalog.js +21 -2
- package/lib/types/tips.js +4 -4
- package/lib/types/tuiSettingsFile.d.ts +56 -0
- package/lib/types/tuiSettingsFile.d.ts.map +1 -0
- package/lib/types/tuiSettingsFile.js +206 -0
- package/lib/types/ui.d.ts +2 -0
- package/lib/types/ui.d.ts.map +1 -1
- package/lib/types/ui.js +2 -0
- package/lib/types/update.d.ts +72 -26
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +131 -43
- package/lib/types/utils/bmp.d.ts +7 -0
- package/lib/types/utils/bmp.d.ts.map +1 -1
- package/lib/types/utils/bmp.js +27 -0
- package/lib/types/utils/bootTrace.d.ts +2 -0
- package/lib/types/utils/bootTrace.d.ts.map +1 -0
- package/lib/types/utils/bootTrace.js +20 -0
- package/lib/types/utils/clipboard.d.ts.map +1 -1
- package/lib/types/utils/clipboard.js +11 -3
- package/lib/types/utils/credentials.d.ts +14 -2
- package/lib/types/utils/credentials.d.ts.map +1 -1
- package/lib/types/utils/credentials.js +34 -11
- package/lib/types/utils/imageResize.d.ts +10 -20
- package/lib/types/utils/imageResize.d.ts.map +1 -1
- package/lib/types/utils/imageResize.js +61 -134
- package/lib/types/utils/inputPaste.d.ts +2 -2
- package/lib/types/utils/inputPaste.js +2 -2
- package/lib/types/utils/pastedImagePath.d.ts +5 -0
- package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
- package/lib/types/utils/pastedImagePath.js +33 -0
- package/lib/types/utils/paths.d.ts +11 -0
- package/lib/types/utils/paths.d.ts.map +1 -1
- package/lib/types/utils/paths.js +13 -0
- package/package.json +150 -114
- package/presets/winbash.mjs +716 -0
- package/tui-profile/feed/README.md +63 -0
- package/tui-profile/feed/first-party.json +10 -0
- package/tui-profile/protocols/profile-definitions.d.ts +1 -0
- package/tui-profile/protocols/profile-definitions.js +14 -0
- package/tui-profile/protocols/tui-contributions.d.ts +55 -0
- package/tui-profile/protocols/tui-contributions.js +141 -0
- package/tui-profile/registry/contracts/backend-v1alpha1.json +13 -0
- package/tui-profile/registry/registry-0.15.json +12 -0
- package/lib/types/backends/claude/install.d.ts +0 -15
- package/lib/types/backends/claude/install.d.ts.map +0 -1
- package/lib/types/backends/claude/install.js +0 -91
- package/lib/types/channel/elicitation.d.ts.map +0 -1
- package/lib/types/dsh-adapter/channel/session-lineage.d.ts +0 -42
- package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +0 -1
- package/lib/types/dsh-adapter/channel/session-lineage.js +0 -51
- package/lib/types/utils/jsonl.d.ts.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getLang, LANGS } from '../i18n.js';
|
|
2
|
+
import { extraBundles, pluginManagerOf, pluginTitleIn } from './plugin-manager.js';
|
|
3
|
+
import { cleanScalarText } from './sanitize.js';
|
|
4
|
+
/**
|
|
5
|
+
* Display-cell budget for one description. The popup truncates to its own row
|
|
6
|
+
* width at render, so this only bounds what a bundle's metadata may park in the
|
|
7
|
+
* cache — a title is host input and arrives as wide as it likes.
|
|
8
|
+
*/
|
|
9
|
+
const DESCRIPTION_CELLS = 200;
|
|
10
|
+
/**
|
|
11
|
+
* What one bundle answers to, version included, in every shipped language. The
|
|
12
|
+
* title is host metadata landing in the popup's row, so it is sanitized and
|
|
13
|
+
* capped as a display string (`cleanScalarText`: a newline in a title would
|
|
14
|
+
* leave the row, ANSI would paint it). Every language is built at warm time
|
|
15
|
+
* because the cache loads once; `CommandSuggestions` resolves `descriptions` at
|
|
16
|
+
* render (`localizedDescription`), so `/lang` repaints the popup without a
|
|
17
|
+
* reload and the popup titles a bundle exactly as `/plugin info` does.
|
|
18
|
+
*/
|
|
19
|
+
function bundleDescriptions(bundle) {
|
|
20
|
+
const version = bundle.version === undefined ? '' : ` · ${bundle.version}`;
|
|
21
|
+
const built = {};
|
|
22
|
+
for (const lang of LANGS) {
|
|
23
|
+
built[lang] = cleanScalarText(`${pluginTitleIn(bundle, lang, bundle.name)}${version}`, DESCRIPTION_CELLS);
|
|
24
|
+
}
|
|
25
|
+
return built;
|
|
26
|
+
}
|
|
27
|
+
/** The warm-and-read pair the slash completion tree consumes. */
|
|
28
|
+
export function createPluginCompletionCatalog(ctx, deps) {
|
|
29
|
+
let nodes;
|
|
30
|
+
let load;
|
|
31
|
+
const warmPluginNames = () => {
|
|
32
|
+
if (load !== undefined)
|
|
33
|
+
return;
|
|
34
|
+
const manager = pluginManagerOf(ctx);
|
|
35
|
+
if (manager === undefined) {
|
|
36
|
+
nodes = [];
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
let pending;
|
|
40
|
+
try {
|
|
41
|
+
pending = manager.listBundles();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// The service threw before it returned a promise; `.catch` only covers a
|
|
45
|
+
// rejection, so the raw throw would otherwise reach the keystroke path
|
|
46
|
+
// that asked for the names. Answer an empty list like an absent service,
|
|
47
|
+
// and leave `load` unset so a later warm can try again.
|
|
48
|
+
nodes = [];
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const live = () => deps.owner.current() && !deps.owner.signal.aborted;
|
|
52
|
+
load = pending.then(bundles => {
|
|
53
|
+
// A late answer after a release would write into a dead channel; let a
|
|
54
|
+
// later warm try again instead of pinning the empty result.
|
|
55
|
+
if (!live()) {
|
|
56
|
+
load = undefined;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
nodes = extraBundles(bundles).map(bundle => {
|
|
60
|
+
// The package name is what `/plugin info` matches, so it is the token;
|
|
61
|
+
// the title and version are what a person recognizes in the popup. Both
|
|
62
|
+
// come from the report's own reader, per language, so the two never
|
|
63
|
+
// disagree — and neither renders raw host metadata.
|
|
64
|
+
const descriptions = bundleDescriptions(bundle);
|
|
65
|
+
return {
|
|
66
|
+
name: bundle.name,
|
|
67
|
+
description: descriptions[getLang()] ?? bundle.name,
|
|
68
|
+
descriptions,
|
|
69
|
+
...(bundle.enabled ? {} : { tag: 'off' }),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
deps.emit();
|
|
73
|
+
}).catch(() => {
|
|
74
|
+
load = undefined;
|
|
75
|
+
if (live())
|
|
76
|
+
nodes = [];
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
return { warmPluginNames, pluginNames: () => nodes ?? [] };
|
|
80
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { type BackendSpec } from '../adapter/spec/tui-contributions.js';
|
|
3
|
+
/** One package's declaration: the file it lives in and its exact bytes. */
|
|
4
|
+
export interface PluginDeclaration {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly source: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The package-root `dsh-plugin.json` of `packageName`, or `undefined` when the
|
|
10
|
+
* package is not resolvable from this composition or ships no declaration.
|
|
11
|
+
* Tolerant by design: a broken install answers "no declaration", never a throw.
|
|
12
|
+
*/
|
|
13
|
+
export declare function pluginDeclarationOf(ctx: Context, packageName: string): PluginDeclaration | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* One `Backend` contribution a package declaration carries, as this host's own
|
|
16
|
+
* `Backend` definition reads it (D-1).
|
|
17
|
+
*/
|
|
18
|
+
export interface DeclaredBackend {
|
|
19
|
+
/** The declaration's own `name` (the contribution's local name, distinct from
|
|
20
|
+
* the backend id its `spec` carries). */
|
|
21
|
+
readonly name: string;
|
|
22
|
+
/** The public declaration, already validated: `validateBackendSpec()`'s result. */
|
|
23
|
+
readonly spec: BackendSpec;
|
|
24
|
+
}
|
|
25
|
+
/** What one declaration contributes, and what could not be read out of it. */
|
|
26
|
+
export interface DeclaredBackends {
|
|
27
|
+
readonly backends: readonly DeclaredBackend[];
|
|
28
|
+
/** Entries that announced themselves as `Backend` contributions but are not
|
|
29
|
+
* one this host can read; each names the entry and why. Empty is the normal
|
|
30
|
+
* answer for a package that contributes no backend. */
|
|
31
|
+
readonly problems: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The `Backend` contributions of one `dsh-plugin.json` record.
|
|
35
|
+
*
|
|
36
|
+
* One reader for every consumer — the C-5 residue watch (`plugin-manage.ts`) and
|
|
37
|
+
* the D-1 assembly both ask this — so the two cannot disagree about which entries
|
|
38
|
+
* are backend contributions. It applies the same gates the admission path
|
|
39
|
+
* applies, in the same order: the definition's own coordinate (`apiVersion` +
|
|
40
|
+
* `kind`), the contribution's outer `id`, the definition's metadata rule
|
|
41
|
+
* (`name`), then the family validator. An entry that fails any of them is
|
|
42
|
+
* reported in `problems` rather than dropped in silence; a `null`/non-object
|
|
43
|
+
* record simply contributes nothing. Below that, silence means absence only: a
|
|
44
|
+
* `contributes` that is not an object, and an `x-dsh-tui` point that is not an
|
|
45
|
+
* array, are malformed declarations, reported like any other gate (the canonical
|
|
46
|
+
* validator refuses both shapes).
|
|
47
|
+
*
|
|
48
|
+
* `projectManifest` drops contributions without a string outer `id`; this
|
|
49
|
+
* reader must not register one either. That contribution id may differ from
|
|
50
|
+
* the backend id in `spec.id`.
|
|
51
|
+
*
|
|
52
|
+
* Identity is deliberately not this function's business: it reads a record the
|
|
53
|
+
* caller already obtained, and says nothing about which package that record
|
|
54
|
+
* belongs to (#1568 — a manifest counts only beside the package root that
|
|
55
|
+
* establishes it).
|
|
56
|
+
* A claimed backend also requires a valid canonical manifest projection; in
|
|
57
|
+
* particular, duplicate contribution identities must not bypass admission.
|
|
58
|
+
*/
|
|
59
|
+
export declare function declaredBackendsOf(record: unknown): DeclaredBackends;
|
|
60
|
+
/**
|
|
61
|
+
* {@link declaredBackendsOf} over a declaration's raw bytes. A declaration that
|
|
62
|
+
* does not parse is a problem, not an empty answer: the file is there and says
|
|
63
|
+
* something this host cannot read.
|
|
64
|
+
*/
|
|
65
|
+
export declare function declaredBackendsIn(source: string): DeclaredBackends;
|
|
66
|
+
/** This application's own package: the composition, never a plugin of it. */
|
|
67
|
+
export declare const COMPOSITION_PACKAGE = "@deepseek-harness-tui/dsh-tui";
|
|
68
|
+
/**
|
|
69
|
+
* What a listed bundle belongs to the composition itself rather than to the
|
|
70
|
+
* plugins a person installs. Gate 1 is a statement about *plugins* ("this
|
|
71
|
+
* package declares no TUI contribution"), so applying it to the host's own
|
|
72
|
+
* rows — or to this application — would report the composition as a missing
|
|
73
|
+
* declaration. Everything else is judged by its declaration alone.
|
|
74
|
+
*/
|
|
75
|
+
export declare function isCompositionOwned(packageName: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* The package-root declaration of a directory that is not installed yet: a
|
|
78
|
+
* `/plugin install <path>` spec names its directory, so the pre-install notice
|
|
79
|
+
* can read the same file the admission path will read after the install.
|
|
80
|
+
* Tolerant like {@link pluginDeclarationOf}: a missing or unreadable file
|
|
81
|
+
* answers "no declaration", never a throw. A spec that names a tarball, a git
|
|
82
|
+
* URL or a registry package has no directory here — the caller reports the
|
|
83
|
+
* notice as unjudged rather than guessing.
|
|
84
|
+
*/
|
|
85
|
+
export declare function pluginDeclarationIn(directory: string): PluginDeclaration | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Gate 1's pre-install statement about a package, as data (Stage C-4).
|
|
88
|
+
*
|
|
89
|
+
* `unjudged` is the honest answer for anything whose declaration is not on
|
|
90
|
+
* this machine yet — a registry spec has no package-root file to read before
|
|
91
|
+
* the install runs. The notice therefore never claims "this package supports
|
|
92
|
+
* dsh-tui"; it says either what it read, or that the answer arrives with the
|
|
93
|
+
* install (the standing tag in `/plugin` is what really reports it, C-3).
|
|
94
|
+
*/
|
|
95
|
+
export type PluginInstallNotice =
|
|
96
|
+
/** A declaration was read and this profile accepts it. */
|
|
97
|
+
{
|
|
98
|
+
readonly kind: 'declared';
|
|
99
|
+
}
|
|
100
|
+
/** Read, and the package ships no package-root `dsh-plugin.json`. */
|
|
101
|
+
| {
|
|
102
|
+
readonly kind: 'undeclared';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Read, and this profile cannot accept it: it does not parse, does not
|
|
106
|
+
* project, or fails the admission catalog's validation. The five-state
|
|
107
|
+
* negotiation is deliberately not part of this answer — it is a statement
|
|
108
|
+
* about a *running* host, and the standing tag in `/plugin` reports it after
|
|
109
|
+
* the install.
|
|
110
|
+
*/
|
|
111
|
+
| {
|
|
112
|
+
readonly kind: 'invalid';
|
|
113
|
+
readonly error: string;
|
|
114
|
+
}
|
|
115
|
+
/** Nothing on disk to read yet: the answer arrives with the install. */
|
|
116
|
+
| {
|
|
117
|
+
readonly kind: 'unjudged';
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=plugin-declaration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-declaration.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/plugin-declaration.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,sCAAsC,CAAA;AAIrG,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAepG;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;8CAC0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAC3B;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;IAC7C;;4DAEwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAwDpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAQnE;AAED,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,kCAAkC,CAAA;AAElE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAQpF;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB;AAC7B,0DAA0D;AACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE;AAC/B,qEAAqE;GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE;AACjC;;;;;;GAMG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACtD,wEAAwE;GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAA"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a plugin package states what it contributes (gate 1's evidence).
|
|
3
|
+
*
|
|
4
|
+
* A plugin declares itself by shipping a package-root `dsh-plugin.json` — the
|
|
5
|
+
* pinned `@dsh-std/manifest` shape this profile's admission catalog validates
|
|
6
|
+
* (`docs/plugin-admission-and-development.md`). That is the same artifact the
|
|
7
|
+
* plugin-host admits third-party activations from (`./admission-loader.ts`),
|
|
8
|
+
* so the list and the admission path read one declaration, not two.
|
|
9
|
+
*
|
|
10
|
+
* Resolution follows `./bundled-presets.ts`: bare package names resolve from
|
|
11
|
+
* the composition's `baseUrl` (the profile directory a `dsh --profile` boot
|
|
12
|
+
* sets), so this reads the profile's own install tree and never scans
|
|
13
|
+
* node_modules. The package.json hop goes through `findPackageJSON`, which
|
|
14
|
+
* still finds the package when its `exports` map hides the extra file.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { findPackageJSON } from 'node:module';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
import { BACKEND, validateBackendSpec } from '../adapter/spec/tui-contributions.js';
|
|
20
|
+
import { projectManifest } from '../adapter/standard/protocols.js';
|
|
21
|
+
/**
|
|
22
|
+
* The package-root `dsh-plugin.json` of `packageName`, or `undefined` when the
|
|
23
|
+
* package is not resolvable from this composition or ships no declaration.
|
|
24
|
+
* Tolerant by design: a broken install answers "no declaration", never a throw.
|
|
25
|
+
*/
|
|
26
|
+
export function pluginDeclarationOf(ctx, packageName) {
|
|
27
|
+
let manifestPath;
|
|
28
|
+
try {
|
|
29
|
+
manifestPath = findPackageJSON(packageName, ctx.baseUrl ?? import.meta.url);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
if (manifestPath === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
const file = join(dirname(manifestPath), 'dsh-plugin.json');
|
|
37
|
+
if (!existsSync(file))
|
|
38
|
+
return undefined;
|
|
39
|
+
try {
|
|
40
|
+
return { path: file, source: readFileSync(file, 'utf8') };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const NO_BACKENDS = Object.freeze({ backends: Object.freeze([]), problems: Object.freeze([]) });
|
|
47
|
+
/**
|
|
48
|
+
* The `Backend` contributions of one `dsh-plugin.json` record.
|
|
49
|
+
*
|
|
50
|
+
* One reader for every consumer — the C-5 residue watch (`plugin-manage.ts`) and
|
|
51
|
+
* the D-1 assembly both ask this — so the two cannot disagree about which entries
|
|
52
|
+
* are backend contributions. It applies the same gates the admission path
|
|
53
|
+
* applies, in the same order: the definition's own coordinate (`apiVersion` +
|
|
54
|
+
* `kind`), the contribution's outer `id`, the definition's metadata rule
|
|
55
|
+
* (`name`), then the family validator. An entry that fails any of them is
|
|
56
|
+
* reported in `problems` rather than dropped in silence; a `null`/non-object
|
|
57
|
+
* record simply contributes nothing. Below that, silence means absence only: a
|
|
58
|
+
* `contributes` that is not an object, and an `x-dsh-tui` point that is not an
|
|
59
|
+
* array, are malformed declarations, reported like any other gate (the canonical
|
|
60
|
+
* validator refuses both shapes).
|
|
61
|
+
*
|
|
62
|
+
* `projectManifest` drops contributions without a string outer `id`; this
|
|
63
|
+
* reader must not register one either. That contribution id may differ from
|
|
64
|
+
* the backend id in `spec.id`.
|
|
65
|
+
*
|
|
66
|
+
* Identity is deliberately not this function's business: it reads a record the
|
|
67
|
+
* caller already obtained, and says nothing about which package that record
|
|
68
|
+
* belongs to (#1568 — a manifest counts only beside the package root that
|
|
69
|
+
* establishes it).
|
|
70
|
+
* A claimed backend also requires a valid canonical manifest projection; in
|
|
71
|
+
* particular, duplicate contribution identities must not bypass admission.
|
|
72
|
+
*/
|
|
73
|
+
export function declaredBackendsOf(record) {
|
|
74
|
+
if (record === null || typeof record !== 'object')
|
|
75
|
+
return NO_BACKENDS;
|
|
76
|
+
const contributes = record.contributes;
|
|
77
|
+
// Absent declares nothing — the normal answer for a package that contributes no
|
|
78
|
+
// TUI row. Present but not an object (`null`, a primitive, an array) is a
|
|
79
|
+
// malformed declaration, not an empty one: the canonical validator refuses those
|
|
80
|
+
// shapes too (`contributes must be an object`), and reading them as "nothing
|
|
81
|
+
// declared" would pass the bundle over without a word.
|
|
82
|
+
if (contributes === undefined)
|
|
83
|
+
return NO_BACKENDS;
|
|
84
|
+
if (contributes === null || typeof contributes !== 'object' || Array.isArray(contributes)) {
|
|
85
|
+
return { backends: [], problems: ['contributes must be an object'] };
|
|
86
|
+
}
|
|
87
|
+
const entries = contributes['x-dsh-tui'];
|
|
88
|
+
// The same rule one level down, for the same reason.
|
|
89
|
+
if (entries === undefined)
|
|
90
|
+
return NO_BACKENDS;
|
|
91
|
+
if (!Array.isArray(entries)) {
|
|
92
|
+
return { backends: [], problems: [`contributes['x-dsh-tui'] must be an array`] };
|
|
93
|
+
}
|
|
94
|
+
const backends = [];
|
|
95
|
+
const problems = [];
|
|
96
|
+
for (const [index, entry] of entries.entries()) {
|
|
97
|
+
if (entry === null || typeof entry !== 'object')
|
|
98
|
+
continue;
|
|
99
|
+
const candidate = entry;
|
|
100
|
+
if (candidate.kind !== BACKEND.kind)
|
|
101
|
+
continue;
|
|
102
|
+
const where = `contributes['x-dsh-tui'][${index}]`;
|
|
103
|
+
if (candidate.apiVersion !== BACKEND.apiVersion) {
|
|
104
|
+
problems.push(`${where} is a ${BACKEND.kind} of ${String(candidate.apiVersion)}, not ${BACKEND.apiVersion}`);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// The canonical projection drops such a contribution before it reads its
|
|
108
|
+
// spec (`@dsh-std/manifest`'s extension loop), so a backend it does not
|
|
109
|
+
// count must not be registered here either.
|
|
110
|
+
if (typeof candidate.id !== 'string') {
|
|
111
|
+
problems.push(`${where}.id is missing or not a string`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const name = candidate.name;
|
|
115
|
+
if (typeof name !== 'string' || !/^[a-z][a-z0-9_-]*$/u.test(name)) {
|
|
116
|
+
problems.push(`${where}.name is missing or invalid`);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
backends.push({ name, spec: validateBackendSpec(candidate.spec) });
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
problems.push(`${where} (${name}) has an invalid Backend content: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (backends.length > 0) {
|
|
127
|
+
try {
|
|
128
|
+
projectManifest(record);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
problems.push(`the declaration could not be projected (${error instanceof Error ? error.message : String(error)})`);
|
|
132
|
+
return { backends: [], problems };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { backends, problems };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* {@link declaredBackendsOf} over a declaration's raw bytes. A declaration that
|
|
139
|
+
* does not parse is a problem, not an empty answer: the file is there and says
|
|
140
|
+
* something this host cannot read.
|
|
141
|
+
*/
|
|
142
|
+
export function declaredBackendsIn(source) {
|
|
143
|
+
let parsed;
|
|
144
|
+
try {
|
|
145
|
+
parsed = JSON.parse(source);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return { backends: [], problems: [`the declaration is not valid JSON (${error instanceof Error ? error.message : String(error)})`] };
|
|
149
|
+
}
|
|
150
|
+
return declaredBackendsOf(parsed);
|
|
151
|
+
}
|
|
152
|
+
/** This application's own package: the composition, never a plugin of it. */
|
|
153
|
+
export const COMPOSITION_PACKAGE = '@deepseek-harness-tui/dsh-tui';
|
|
154
|
+
/**
|
|
155
|
+
* What a listed bundle belongs to the composition itself rather than to the
|
|
156
|
+
* plugins a person installs. Gate 1 is a statement about *plugins* ("this
|
|
157
|
+
* package declares no TUI contribution"), so applying it to the host's own
|
|
158
|
+
* rows — or to this application — would report the composition as a missing
|
|
159
|
+
* declaration. Everything else is judged by its declaration alone.
|
|
160
|
+
*/
|
|
161
|
+
export function isCompositionOwned(packageName) {
|
|
162
|
+
return packageName.startsWith('@deepseek-ai/') || packageName === COMPOSITION_PACKAGE;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The package-root declaration of a directory that is not installed yet: a
|
|
166
|
+
* `/plugin install <path>` spec names its directory, so the pre-install notice
|
|
167
|
+
* can read the same file the admission path will read after the install.
|
|
168
|
+
* Tolerant like {@link pluginDeclarationOf}: a missing or unreadable file
|
|
169
|
+
* answers "no declaration", never a throw. A spec that names a tarball, a git
|
|
170
|
+
* URL or a registry package has no directory here — the caller reports the
|
|
171
|
+
* notice as unjudged rather than guessing.
|
|
172
|
+
*/
|
|
173
|
+
export function pluginDeclarationIn(directory) {
|
|
174
|
+
const file = join(directory, 'dsh-plugin.json');
|
|
175
|
+
if (!existsSync(file))
|
|
176
|
+
return undefined;
|
|
177
|
+
try {
|
|
178
|
+
return { path: file, source: readFileSync(file, 'utf8') };
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** The shipped feed, relative to the package root. */
|
|
2
|
+
export declare const FIRST_PARTY_FEED_FILE = "tui-profile/feed/first-party.json";
|
|
3
|
+
/** One curated entry: the exact artifact this project vouches for. */
|
|
4
|
+
export interface FirstPartyEntry {
|
|
5
|
+
/**
|
|
6
|
+
* The full package name, scope included. Matched verbatim. `feedVersion: 1`
|
|
7
|
+
* carries scoped names only: an unscoped name has no publisher a file can
|
|
8
|
+
* assert offline, so admitting one is a deliberate format decision (a new
|
|
9
|
+
* feedVersion), not an entry somebody adds.
|
|
10
|
+
*/
|
|
11
|
+
readonly name: string;
|
|
12
|
+
/**
|
|
13
|
+
* The expected publisher. Must equal the name's own scope — npm lets only
|
|
14
|
+
* that scope's owners publish under it, which is the whole offline publisher
|
|
15
|
+
* argument the feed can make. The gate holds the two fields together; the
|
|
16
|
+
* verdict itself reads the name, because the name already carries the scope.
|
|
17
|
+
*/
|
|
18
|
+
readonly scope: string;
|
|
19
|
+
/** The exact version. Ranges are rejected by the gate, never resolved here. */
|
|
20
|
+
readonly version: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FirstPartyFeed {
|
|
23
|
+
readonly feedVersion: 1;
|
|
24
|
+
readonly entries: readonly FirstPartyEntry[];
|
|
25
|
+
}
|
|
26
|
+
/** Why an artifact is not on the feed. Every value is a fail-closed answer. */
|
|
27
|
+
export type FirstPartyReason =
|
|
28
|
+
/** The feed file is missing or unreadable: nothing can be vouched for. */
|
|
29
|
+
'no-feed'
|
|
30
|
+
/** The spec named no package (a path, a git URL the upstream left unnamed). */
|
|
31
|
+
| 'unidentified'
|
|
32
|
+
/** The feed carries entries, but not this name. */
|
|
33
|
+
| 'not-listed'
|
|
34
|
+
/** The name is listed, but not at this exact version (or at no version). */
|
|
35
|
+
| 'version-mismatch'
|
|
36
|
+
/**
|
|
37
|
+
* The artifact is not a published one: a directory, tarball or git checkout
|
|
38
|
+
* can call itself anything, and its manifest is the artifact vouching for
|
|
39
|
+
* itself. The feed lists what we published, so it has nothing to say here.
|
|
40
|
+
*/
|
|
41
|
+
| 'unverifiable-source';
|
|
42
|
+
export type FirstPartyVerdict = {
|
|
43
|
+
readonly kind: 'first-party';
|
|
44
|
+
readonly entry: FirstPartyEntry;
|
|
45
|
+
/**
|
|
46
|
+
* The provenance seam. Any future source of publisher identity starts
|
|
47
|
+
* here: an answer that contradicts {@link entry} must demote this verdict
|
|
48
|
+
* to the third-party branch (one vote to veto); it may never upgrade a
|
|
49
|
+
* third-party verdict to this one.
|
|
50
|
+
*/
|
|
51
|
+
readonly corroboration: 'unavailable';
|
|
52
|
+
} | {
|
|
53
|
+
readonly kind: 'third-party';
|
|
54
|
+
readonly reason: FirstPartyReason;
|
|
55
|
+
/** What the loader said when the feed itself was the problem. */
|
|
56
|
+
readonly detail?: string;
|
|
57
|
+
};
|
|
58
|
+
/** The feed as the loader found it: present and shaped, or not usable at all. */
|
|
59
|
+
export type FirstPartyFeedLoad = {
|
|
60
|
+
readonly kind: 'ok';
|
|
61
|
+
readonly path: string;
|
|
62
|
+
readonly feed: FirstPartyFeed;
|
|
63
|
+
} | {
|
|
64
|
+
readonly kind: 'unavailable';
|
|
65
|
+
readonly reason: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Where the feed lives, in both the `src/` (tsx) and the compiled npm layouts —
|
|
69
|
+
* the same pair `packagedPresetRoot()` uses, for the same reason.
|
|
70
|
+
*/
|
|
71
|
+
export declare function firstPartyFeedCandidates(moduleUrl?: string): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Read the shipped feed. Tolerant about the world, strict about the file: an
|
|
74
|
+
* absent, unreadable, unparsable or unrecognized feed answers `unavailable`
|
|
75
|
+
* with a readable reason, and never throws — the caller decides what to say
|
|
76
|
+
* and always falls back to "third-party".
|
|
77
|
+
*/
|
|
78
|
+
export declare function loadFirstPartyFeed(moduleUrl?: string): FirstPartyFeedLoad;
|
|
79
|
+
/**
|
|
80
|
+
* Whether an artifact is the exact one the feed pins. Pure: the feed is an
|
|
81
|
+
* argument, so a caller can answer the same question for a fixture, and the
|
|
82
|
+
* gate can drive every branch without a filesystem.
|
|
83
|
+
*
|
|
84
|
+
* Only a registry artifact can be first-party. A directory or git checkout is
|
|
85
|
+
* inspected from the manifest it ships, so treating its `name`/`version` as
|
|
86
|
+
* evidence would let whoever wrote that directory claim any feed entry and skip
|
|
87
|
+
* the trust confirmation — the one decision this verdict makes.
|
|
88
|
+
*/
|
|
89
|
+
export declare function firstPartyVerdict(load: FirstPartyFeedLoad, artifact: {
|
|
90
|
+
readonly name?: string | undefined;
|
|
91
|
+
readonly version?: string | undefined;
|
|
92
|
+
readonly kind?: string | undefined;
|
|
93
|
+
}): FirstPartyVerdict;
|
|
94
|
+
//# sourceMappingURL=plugin-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-feed.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/plugin-feed.ts"],"names":[],"mappings":"AAmCA,sDAAsD;AACtD,eAAO,MAAM,qBAAqB,sCAAsC,CAAA;AAExE,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;CAC7C;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB;AAC1B,0EAA0E;AACxE,SAAS;AACX,+EAA+E;GAC7E,cAAc;AAChB,mDAAmD;GACjD,YAAY;AACd,4EAA4E;GAC1E,kBAAkB;AACpB;;;;GAIG;GACD,qBAAqB,CAAA;AAEzB,MAAM,MAAM,iBAAiB,GACzB;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;CACtC,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;IACjC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAEH,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,GAAE,MAAwB,GAAG,MAAM,EAAE,CAGtF;AAgBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,MAAwB,GAAG,kBAAkB,CAgC1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC1H,iBAAiB,CASnB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The first-party feed: the curated list of plugin packages this project
|
|
3
|
+
* publishes, pinned per release (Stage C-4; the file's own README is
|
|
4
|
+
* `tui-profile/feed/README.md`).
|
|
5
|
+
*
|
|
6
|
+
* The feed is a packaged **data** file, not a protocol artifact. It answers one
|
|
7
|
+
* question for gate 3's trust routing — "is this exact artifact one we
|
|
8
|
+
* published?" — offline, with no registry round trip. It never replaces the
|
|
9
|
+
* admission registry (`tui-profile/registry/`); a miss only means the caller
|
|
10
|
+
* asks the person to confirm, which is what any third-party install does.
|
|
11
|
+
*
|
|
12
|
+
* Two policies here are deliberate:
|
|
13
|
+
*
|
|
14
|
+
* - A missing or malformed file is NOT the same as "no entry matched". The
|
|
15
|
+
* loader answers `unavailable` with a reason, so a caller can say what is
|
|
16
|
+
* wrong instead of quietly trusting everything — or refusing everything
|
|
17
|
+
* without saying why. (A silent `undefined`, the `loadSpecData()` posture, is
|
|
18
|
+
* the anti-pattern this avoids: for a trust input, "absent" and "unreadable"
|
|
19
|
+
* must stay distinguishable.)
|
|
20
|
+
* - Every uncertain answer is third-party (fail closed). A spec without a
|
|
21
|
+
* version resolves to "latest" at install time, which is not the artifact the
|
|
22
|
+
* feed pinned, so that is a version mismatch rather than a hit.
|
|
23
|
+
*
|
|
24
|
+
* Provenance is a seam, not an implementation: the host service's published
|
|
25
|
+
* surface carries no provenance/publisher/attestation API at all, and this
|
|
26
|
+
* package has no registry client, so the first-party branch records
|
|
27
|
+
* `corroboration: 'unavailable'`. The rule that keeps the seam honest — a
|
|
28
|
+
* source that ever contradicts an entry must demote the verdict to
|
|
29
|
+
* third-party (one vote to veto, never a vote to allow) — is written down in
|
|
30
|
+
* the feed README and `tui-profile/notes/0009-backend-contribution.md`.
|
|
31
|
+
*/
|
|
32
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
33
|
+
import { dirname, join } from 'node:path';
|
|
34
|
+
import { fileURLToPath } from 'node:url';
|
|
35
|
+
/** The shipped feed, relative to the package root. */
|
|
36
|
+
export const FIRST_PARTY_FEED_FILE = 'tui-profile/feed/first-party.json';
|
|
37
|
+
/**
|
|
38
|
+
* Where the feed lives, in both the `src/` (tsx) and the compiled npm layouts —
|
|
39
|
+
* the same pair `packagedPresetRoot()` uses, for the same reason.
|
|
40
|
+
*/
|
|
41
|
+
export function firstPartyFeedCandidates(moduleUrl = import.meta.url) {
|
|
42
|
+
const directory = dirname(fileURLToPath(moduleUrl));
|
|
43
|
+
return [join(directory, '../../', FIRST_PARTY_FEED_FILE), join(directory, '../../../', FIRST_PARTY_FEED_FILE)];
|
|
44
|
+
}
|
|
45
|
+
/** One entry, structurally. `undefined` for anything the feed must not carry. */
|
|
46
|
+
function asEntry(value) {
|
|
47
|
+
if (typeof value !== 'object' || value === null)
|
|
48
|
+
return undefined;
|
|
49
|
+
const record = value;
|
|
50
|
+
const keys = Object.keys(record);
|
|
51
|
+
if (keys.length !== 3 || !keys.includes('name') || !keys.includes('scope') || !keys.includes('version'))
|
|
52
|
+
return undefined;
|
|
53
|
+
const { name, scope, version } = record;
|
|
54
|
+
if (typeof name !== 'string' || name.length === 0)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (typeof scope !== 'string' || scope.length === 0)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (typeof version !== 'string' || version.length === 0)
|
|
59
|
+
return undefined;
|
|
60
|
+
if (!/^@[^/]+\/[^/]+$/u.test(name) || scope !== name.slice(0, name.indexOf('/')))
|
|
61
|
+
return undefined;
|
|
62
|
+
return { name, scope, version };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read the shipped feed. Tolerant about the world, strict about the file: an
|
|
66
|
+
* absent, unreadable, unparsable or unrecognized feed answers `unavailable`
|
|
67
|
+
* with a readable reason, and never throws — the caller decides what to say
|
|
68
|
+
* and always falls back to "third-party".
|
|
69
|
+
*/
|
|
70
|
+
export function loadFirstPartyFeed(moduleUrl = import.meta.url) {
|
|
71
|
+
const candidates = firstPartyFeedCandidates(moduleUrl);
|
|
72
|
+
const path = candidates.find(candidate => existsSync(candidate));
|
|
73
|
+
if (path === undefined)
|
|
74
|
+
return { kind: 'unavailable', reason: `feed file is missing (checked ${candidates.join(', ')})` };
|
|
75
|
+
let source;
|
|
76
|
+
try {
|
|
77
|
+
source = readFileSync(path, 'utf8');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return { kind: 'unavailable', reason: `feed file is unreadable: ${error instanceof Error ? error.message : String(error)}` };
|
|
81
|
+
}
|
|
82
|
+
let value;
|
|
83
|
+
try {
|
|
84
|
+
value = JSON.parse(source);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return { kind: 'unavailable', reason: `feed file is not JSON: ${error instanceof Error ? error.message : String(error)}` };
|
|
88
|
+
}
|
|
89
|
+
if (typeof value !== 'object' || value === null)
|
|
90
|
+
return { kind: 'unavailable', reason: 'feed file is not an object' };
|
|
91
|
+
const record = value;
|
|
92
|
+
const keys = Object.keys(record);
|
|
93
|
+
if (keys.length !== 2 || !keys.includes('feedVersion') || !keys.includes('entries')) {
|
|
94
|
+
return { kind: 'unavailable', reason: `feed file carries unexpected top-level fields: ${keys.join(', ')}` };
|
|
95
|
+
}
|
|
96
|
+
if (record.feedVersion !== 1)
|
|
97
|
+
return { kind: 'unavailable', reason: `feed file has an unknown feedVersion: ${String(record.feedVersion)}` };
|
|
98
|
+
if (!Array.isArray(record.entries))
|
|
99
|
+
return { kind: 'unavailable', reason: 'feed file entries is not an array' };
|
|
100
|
+
const entries = [];
|
|
101
|
+
for (const candidate of record.entries) {
|
|
102
|
+
const entry = asEntry(candidate);
|
|
103
|
+
if (entry === undefined)
|
|
104
|
+
return { kind: 'unavailable', reason: `feed file carries an unrecognized entry: ${JSON.stringify(candidate)}` };
|
|
105
|
+
entries.push(entry);
|
|
106
|
+
}
|
|
107
|
+
if (entries.length === 0)
|
|
108
|
+
return { kind: 'unavailable', reason: 'feed file carries no entries' };
|
|
109
|
+
return { kind: 'ok', path, feed: { feedVersion: 1, entries } };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether an artifact is the exact one the feed pins. Pure: the feed is an
|
|
113
|
+
* argument, so a caller can answer the same question for a fixture, and the
|
|
114
|
+
* gate can drive every branch without a filesystem.
|
|
115
|
+
*
|
|
116
|
+
* Only a registry artifact can be first-party. A directory or git checkout is
|
|
117
|
+
* inspected from the manifest it ships, so treating its `name`/`version` as
|
|
118
|
+
* evidence would let whoever wrote that directory claim any feed entry and skip
|
|
119
|
+
* the trust confirmation — the one decision this verdict makes.
|
|
120
|
+
*/
|
|
121
|
+
export function firstPartyVerdict(load, artifact) {
|
|
122
|
+
if (load.kind !== 'ok')
|
|
123
|
+
return { kind: 'third-party', reason: 'no-feed', detail: load.reason };
|
|
124
|
+
if (artifact.kind !== undefined && artifact.kind !== 'registry')
|
|
125
|
+
return { kind: 'third-party', reason: 'unverifiable-source' };
|
|
126
|
+
const name = artifact.name;
|
|
127
|
+
if (typeof name !== 'string' || name.length === 0)
|
|
128
|
+
return { kind: 'third-party', reason: 'unidentified' };
|
|
129
|
+
const entry = load.feed.entries.find(candidate => candidate.name === name);
|
|
130
|
+
if (entry === undefined)
|
|
131
|
+
return { kind: 'third-party', reason: 'not-listed' };
|
|
132
|
+
if (artifact.version !== entry.version)
|
|
133
|
+
return { kind: 'third-party', reason: 'version-mismatch' };
|
|
134
|
+
return { kind: 'first-party', entry, corroboration: 'unavailable' };
|
|
135
|
+
}
|