@deepseek-harness-tui/dsh-tui 0.11.1 → 0.12.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 +70 -24
- package/assets/whale-girl/whale-girl-dark.png +0 -0
- package/assets/whale-girl/whale-girl-happy.png +0 -0
- package/assets/whale-girl/whale-girl.png +0 -0
- package/bin/dsh-tui.js +93 -6
- package/cordis.patch.yml +63 -22
- package/cordis.yml +3 -2
- package/guide/dsh-tui-guide/SKILL.md +37 -0
- package/guide/dsh-tui-guide/configuration.en.md +410 -0
- package/guide/dsh-tui-guide/configuration.md +349 -0
- package/guide/dsh-tui-guide/getting-started.en.md +398 -0
- package/guide/dsh-tui-guide/getting-started.md +397 -0
- package/guide/dsh-tui-guide/interaction.en.md +674 -0
- package/guide/dsh-tui-guide/interaction.md +747 -0
- package/guide/dsh-tui-guide/migrate.en.md +166 -0
- package/guide/dsh-tui-guide/migrate.md +132 -0
- package/guide/dsh-tui-guide/plugins.en.md +68 -0
- package/guide/dsh-tui-guide/plugins.md +56 -0
- package/guide/dsh-tui-guide/themes.en.md +192 -0
- package/guide/dsh-tui-guide/themes.md +185 -0
- package/guide/dsh-tui-guide/user-guide.en.md +608 -0
- package/guide/dsh-tui-guide/user-guide.md +586 -0
- package/guide/dsh-tui-guide/vscode.en.md +301 -0
- package/guide/dsh-tui-guide/vscode.md +272 -0
- package/lib/settings.json +1272 -0
- package/lib/types/adapter/channel/ui-policy.d.ts +10 -2
- package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui-policy.js +17 -0
- package/lib/types/adapter/kernel/replay.d.ts.map +1 -1
- package/lib/types/adapter/kernel/replay.js +2 -0
- package/lib/types/adapter/ports/channel-display.d.ts +12 -0
- package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-session.d.ts +38 -0
- package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-settings.d.ts +14 -1
- package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +75 -6
- package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts +86 -9
- package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +2 -0
- package/lib/types/components/BalanceReportRow.d.ts +10 -2
- package/lib/types/components/BalanceReportRow.d.ts.map +1 -1
- package/lib/types/components/BalanceReportRow.js +18 -4
- package/lib/types/components/Chat/JobCard.d.ts +9 -0
- package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.js +42 -15
- package/lib/types/components/Chat/SubagentMessage.js +6 -6
- package/lib/types/components/CompactionStatusRow.d.ts +24 -0
- package/lib/types/components/CompactionStatusRow.d.ts.map +1 -0
- package/lib/types/components/CompactionStatusRow.js +72 -0
- package/lib/types/components/GoalTodoPanel.js +2 -2
- package/lib/types/components/HelpMenu.d.ts +2 -2
- package/lib/types/components/HelpMenu.d.ts.map +1 -1
- package/lib/types/components/HelpMenu.js +5 -4
- package/lib/types/components/InlineMathParagraph.d.ts +22 -0
- package/lib/types/components/InlineMathParagraph.d.ts.map +1 -0
- package/lib/types/components/InlineMathParagraph.js +178 -0
- package/lib/types/components/JobsPanel.d.ts.map +1 -1
- package/lib/types/components/JobsPanel.js +80 -33
- package/lib/types/components/LogoV2.d.ts +41 -3
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +148 -24
- package/lib/types/components/Markdown.d.ts +10 -3
- package/lib/types/components/Markdown.d.ts.map +1 -1
- package/lib/types/components/Markdown.js +47 -14
- package/lib/types/components/MathBlock.d.ts +13 -0
- package/lib/types/components/MathBlock.d.ts.map +1 -0
- package/lib/types/components/MathBlock.js +136 -0
- package/lib/types/components/MessageList.d.ts +10 -1
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +16 -7
- package/lib/types/components/MigratePicker.d.ts +30 -0
- package/lib/types/components/MigratePicker.d.ts.map +1 -0
- package/lib/types/components/MigratePicker.js +38 -0
- package/lib/types/components/PresetPicker.d.ts +4 -0
- package/lib/types/components/PresetPicker.d.ts.map +1 -1
- package/lib/types/components/PresetPicker.js +5 -1
- package/lib/types/components/PromptInput.d.ts +17 -0
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +60 -8
- package/lib/types/components/SplitDiffView.d.ts.map +1 -1
- package/lib/types/components/SplitDiffView.js +2 -1
- package/lib/types/components/StarPrompt.d.ts +59 -0
- package/lib/types/components/StarPrompt.d.ts.map +1 -0
- package/lib/types/components/StarPrompt.js +326 -0
- package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
- package/lib/types/components/StreamingMarkdown.js +20 -3
- package/lib/types/components/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +8 -8
- package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
- package/lib/types/components/SubagentDetailScene.js +108 -10
- package/lib/types/components/TimelineRail.d.ts.map +1 -1
- package/lib/types/components/TimelineRail.js +9 -1
- package/lib/types/components/Whale.d.ts +17 -8
- package/lib/types/components/Whale.d.ts.map +1 -1
- package/lib/types/components/Whale.js +25 -15
- package/lib/types/components/WhaleGirl.d.ts +35 -0
- package/lib/types/components/WhaleGirl.d.ts.map +1 -0
- package/lib/types/components/WhaleGirl.js +50 -0
- package/lib/types/components/WorkingSpinner.d.ts +4 -1
- package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
- package/lib/types/components/WorkingSpinner.js +2 -2
- package/lib/types/components/bigfont.d.ts +47 -18
- package/lib/types/components/bigfont.d.ts.map +1 -1
- package/lib/types/components/bigfont.js +55 -40
- package/lib/types/components/design-system/ThemeProvider.d.ts +6 -0
- package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +40 -1
- package/lib/types/components/maidPortrait.d.ts +44 -0
- package/lib/types/components/maidPortrait.d.ts.map +1 -0
- package/lib/types/components/maidPortrait.js +178 -0
- package/lib/types/components/mathPreview.d.ts +25 -0
- package/lib/types/components/mathPreview.d.ts.map +1 -0
- package/lib/types/components/mathPreview.js +48 -0
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +6 -5
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +3 -2
- package/lib/types/components/messages/TranscriptImages.d.ts.map +1 -1
- package/lib/types/components/messages/TranscriptImages.js +11 -1
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts +14 -2
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +80 -38
- package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
- package/lib/types/components/questions/PlanReviewPanel.js +3 -3
- package/lib/types/components/sessions/ForeignSessionRow.d.ts +34 -0
- package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -0
- package/lib/types/components/sessions/ForeignSessionRow.js +43 -0
- package/lib/types/components/sessions/SourceTabs.d.ts +52 -0
- package/lib/types/components/sessions/SourceTabs.d.ts.map +1 -0
- package/lib/types/components/sessions/SourceTabs.js +70 -0
- package/lib/types/components/splashEggs.d.ts +56 -0
- package/lib/types/components/splashEggs.d.ts.map +1 -0
- package/lib/types/components/splashEggs.js +67 -0
- package/lib/types/components/splashFonts.d.ts +119 -0
- package/lib/types/components/splashFonts.d.ts.map +1 -0
- package/lib/types/components/splashFonts.js +267 -0
- package/lib/types/components/splashLayout.d.ts +41 -0
- package/lib/types/components/splashLayout.d.ts.map +1 -0
- package/lib/types/components/splashLayout.js +40 -0
- package/lib/types/components/trajectory/MiniWake.d.ts +11 -1
- package/lib/types/components/trajectory/MiniWake.d.ts.map +1 -1
- package/lib/types/components/trajectory/MiniWake.js +9 -3
- package/lib/types/components/whaleGirlSprite.d.ts +17 -0
- package/lib/types/components/whaleGirlSprite.d.ts.map +1 -0
- package/lib/types/components/whaleGirlSprite.js +47 -0
- package/lib/types/deepseekPricing.d.ts +74 -0
- package/lib/types/deepseekPricing.d.ts.map +1 -1
- package/lib/types/deepseekPricing.js +110 -11
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/action-readiness.js +6 -1
- package/lib/types/dsh-adapter/channel/background-action.d.ts +1 -0
- package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/background-action.js +1 -0
- package/lib/types/dsh-adapter/channel/binding-events.d.ts +8 -9
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +69 -21
- package/lib/types/dsh-adapter/channel/compaction.d.ts +2 -1
- package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/compaction.js +35 -2
- package/lib/types/dsh-adapter/channel/external-commands.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/external-commands.js +8 -2
- package/lib/types/dsh-adapter/channel/job-projection.d.ts +1 -0
- package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/job-projection.js +88 -3
- package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/local-actions.js +6 -1
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts +13 -0
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-actions.js +48 -7
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.js +25 -9
- package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-switch.js +5 -1
- package/lib/types/dsh-adapter/channel/paths.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/paths.js +7 -1
- package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/preferences.js +31 -5
- package/lib/types/dsh-adapter/channel/projection.d.ts +1 -2
- package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +127 -17
- package/lib/types/dsh-adapter/channel/question-record.d.ts +76 -0
- package/lib/types/dsh-adapter/channel/question-record.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/question-record.js +107 -0
- package/lib/types/dsh-adapter/channel/session-lineage.d.ts +42 -0
- package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/session-lineage.js +51 -0
- package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts +2 -0
- package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-live-adoption.js +9 -3
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts +2 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.js +39 -7
- package/lib/types/dsh-adapter/channel/session-reset.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.js +7 -0
- package/lib/types/dsh-adapter/channel/session-resume.d.ts +1 -0
- package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-resume.js +4 -2
- package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/settings-host.js +8 -0
- package/lib/types/dsh-adapter/channel/state.d.ts +17 -2
- package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/state.js +6 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts +30 -35
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.js +143 -4
- package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +35 -5
- package/lib/types/dsh-adapter/compat/messages.d.ts +6 -0
- package/lib/types/dsh-adapter/compat/messages.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/messages.js +9 -0
- package/lib/types/dsh-adapter/contract.d.ts +6 -5
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +14 -6
- package/lib/types/dsh-adapter/index.d.ts +36 -1
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +22 -6
- package/lib/types/dsh-adapter/jobs.d.ts +82 -16
- package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
- package/lib/types/dsh-adapter/jobs.js +104 -9
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts +3 -0
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.js +131 -0
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts +17 -0
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.js +329 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts +3 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.js +102 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts +16 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/codex.parse.js +289 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts +3 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.js +117 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts +13 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.js +178 -0
- package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts +3 -0
- package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/omp.js +133 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts +60 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan-fs.js +178 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts +8 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/scan.js +40 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts +3 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.js +93 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts +9 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.js +89 -0
- package/lib/types/dsh-adapter/migrate/bin-path.d.ts +6 -0
- package/lib/types/dsh-adapter/migrate/bin-path.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/bin-path.js +30 -0
- package/lib/types/dsh-adapter/migrate/browse.d.ts +42 -0
- package/lib/types/dsh-adapter/migrate/browse.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/browse.js +90 -0
- package/lib/types/dsh-adapter/migrate/cli.d.ts +9 -0
- package/lib/types/dsh-adapter/migrate/cli.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/cli.js +106 -0
- package/lib/types/dsh-adapter/migrate/import-one.d.ts +89 -0
- package/lib/types/dsh-adapter/migrate/import-one.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/import-one.js +133 -0
- package/lib/types/dsh-adapter/migrate/index.d.ts +35 -0
- package/lib/types/dsh-adapter/migrate/index.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/index.js +107 -0
- package/lib/types/dsh-adapter/migrate/parse/injection.d.ts +40 -0
- package/lib/types/dsh-adapter/migrate/parse/injection.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/parse/injection.js +127 -0
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +28 -0
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/parse/jsonl.js +40 -0
- package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts +28 -0
- package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/parse/role-turns.js +50 -0
- package/lib/types/dsh-adapter/migrate/parse/title.d.ts +18 -0
- package/lib/types/dsh-adapter/migrate/parse/title.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/parse/title.js +29 -0
- package/lib/types/dsh-adapter/migrate/parse/tools.d.ts +62 -0
- package/lib/types/dsh-adapter/migrate/parse/tools.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/parse/tools.js +110 -0
- package/lib/types/dsh-adapter/migrate/picker.d.ts +64 -0
- package/lib/types/dsh-adapter/migrate/picker.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/picker.js +86 -0
- package/lib/types/dsh-adapter/migrate/recent-agents.d.ts +40 -0
- package/lib/types/dsh-adapter/migrate/recent-agents.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/recent-agents.js +100 -0
- package/lib/types/dsh-adapter/migrate/sessionize.d.ts +39 -0
- package/lib/types/dsh-adapter/migrate/sessionize.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/sessionize.js +271 -0
- package/lib/types/dsh-adapter/migrate/types.d.ts +176 -0
- package/lib/types/dsh-adapter/migrate/types.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/types.js +11 -0
- package/lib/types/dsh-adapter/migrate/uuid.d.ts +7 -0
- package/lib/types/dsh-adapter/migrate/uuid.d.ts.map +1 -0
- package/lib/types/dsh-adapter/migrate/uuid.js +25 -0
- package/lib/types/dsh-adapter/oauth/bonus.d.ts +27 -0
- package/lib/types/dsh-adapter/oauth/bonus.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/bonus.js +69 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.d.ts +2 -1
- package/lib/types/dsh-adapter/oauth/command.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.js +7 -4
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.d.ts +13 -10
- package/lib/types/dsh-adapter/oauth/credentials.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.js +61 -23
- package/lib/types/dsh-adapter/oauth/deepseek.d.ts +39 -0
- package/lib/types/dsh-adapter/oauth/deepseek.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/deepseek.js +189 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.d.ts +24 -16
- package/lib/types/dsh-adapter/oauth/index.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.js +34 -20
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/interaction.d.ts +14 -12
- package/lib/types/dsh-adapter/oauth/interaction.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/interaction.js +283 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.d.ts +2 -1
- package/lib/types/dsh-adapter/oauth/opener.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.js +1 -1
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.d.ts +10 -3
- package/lib/types/dsh-adapter/oauth/pi-ai.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.js +8 -3
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.d.ts +6 -3
- package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.js +11 -3
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.d.ts +14 -7
- package/lib/types/dsh-adapter/oauth/service.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.js +82 -17
- package/lib/types/dsh-adapter/plugin.d.ts +12 -3
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +215 -376
- package/lib/types/dsh-adapter/presets.d.ts +6 -4
- package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/presets.js +6 -4
- package/lib/types/dsh-adapter/providerWizard.d.ts +17 -0
- package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
- package/lib/types/dsh-adapter/providerWizard.js +260 -68
- package/lib/types/dsh-adapter/questions.d.ts +22 -15
- package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/questions.js +47 -45
- package/lib/types/dsh-adapter/sessions/digest.d.ts +11 -6
- package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/digest.js +20 -13
- package/lib/types/dsh-adapter/sessions/frames.d.ts +3 -1
- package/lib/types/dsh-adapter/sessions/frames.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/frames.js +5 -4
- package/lib/types/dsh-adapter/sessions/list.d.ts +6 -1
- package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/list.js +188 -164
- package/lib/types/dsh-adapter/sessions/recovery.d.ts +16 -0
- package/lib/types/dsh-adapter/sessions/recovery.d.ts.map +1 -0
- package/lib/types/dsh-adapter/sessions/recovery.js +108 -0
- package/lib/types/dsh-adapter/sessions/snapshot.d.ts +7 -0
- package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -0
- package/lib/types/dsh-adapter/sessions/snapshot.js +90 -0
- package/lib/types/dsh-adapter/sessions/store.d.ts +10 -4
- package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/store.js +62 -25
- package/lib/types/dsh-adapter/sideQuestion.d.ts +41 -2
- package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sideQuestion.js +98 -2
- package/lib/types/dsh-adapter/subagents.d.ts +29 -3
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
- package/lib/types/dsh-adapter/subagents.js +87 -3
- package/lib/types/herdr.d.ts +2 -0
- package/lib/types/herdr.d.ts.map +1 -1
- package/lib/types/herdr.js +9 -3
- package/lib/types/i18n.d.ts +598 -60
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +198 -31
- package/lib/types/ink/components/App.d.ts +2 -2
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +15 -2
- package/lib/types/ink/components/Image.d.ts +14 -1
- package/lib/types/ink/components/Image.d.ts.map +1 -1
- package/lib/types/ink/components/Image.js +2 -2
- package/lib/types/ink/events/input-event.js +3 -3
- package/lib/types/ink/hooks/use-terminal-images.d.ts +12 -0
- package/lib/types/ink/hooks/use-terminal-images.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-terminal-images.js +13 -0
- package/lib/types/ink/ink.d.ts +6 -0
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +16 -1
- package/lib/types/ink/kitty-graphics.d.ts +44 -3
- package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
- package/lib/types/ink/kitty-graphics.js +184 -23
- package/lib/types/ink/output.d.ts +24 -2
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +83 -5
- package/lib/types/ink/parse-keypress.d.ts +61 -1
- package/lib/types/ink/parse-keypress.d.ts.map +1 -1
- package/lib/types/ink/parse-keypress.js +764 -93
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +8 -1
- package/lib/types/ink/screen.d.ts +24 -0
- package/lib/types/ink/screen.d.ts.map +1 -1
- package/lib/types/ink/screen.js +89 -0
- package/lib/types/ink/selection.d.ts +40 -18
- package/lib/types/ink/selection.d.ts.map +1 -1
- package/lib/types/ink/selection.js +142 -30
- package/lib/types/ink/sixel-codec.d.ts +12 -1
- package/lib/types/ink/sixel-codec.d.ts.map +1 -1
- package/lib/types/ink/sixel-codec.js +29 -5
- package/lib/types/ink/sixel-graphics.d.ts.map +1 -1
- package/lib/types/ink/sixel-graphics.js +5 -3
- package/lib/types/ink/styles.d.ts +9 -0
- package/lib/types/ink/styles.d.ts.map +1 -1
- package/lib/types/ink/terminal-image.d.ts +8 -0
- package/lib/types/ink/terminal-image.d.ts.map +1 -1
- package/lib/types/ink/terminal-querier.d.ts +32 -1
- package/lib/types/ink/terminal-querier.d.ts.map +1 -1
- package/lib/types/ink/terminal-querier.js +54 -2
- package/lib/types/ink/timeline-rail.d.ts +5 -0
- package/lib/types/ink/timeline-rail.d.ts.map +1 -1
- package/lib/types/ink/update-overflow-guard.d.ts +24 -0
- package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
- package/lib/types/ink/update-overflow-guard.js +25 -3
- package/lib/types/math/inline-layout.d.ts +29 -0
- package/lib/types/math/inline-layout.d.ts.map +1 -0
- package/lib/types/math/inline-layout.js +106 -0
- package/lib/types/math/layout.d.ts +58 -0
- package/lib/types/math/layout.d.ts.map +1 -0
- package/lib/types/math/layout.js +59 -0
- package/lib/types/math/renderer.d.ts +64 -0
- package/lib/types/math/renderer.d.ts.map +1 -0
- package/lib/types/math/renderer.js +256 -0
- package/lib/types/minimalUiMode.d.ts +19 -0
- package/lib/types/minimalUiMode.d.ts.map +1 -0
- package/lib/types/minimalUiMode.js +23 -0
- package/lib/types/oauth.d.ts +5 -10
- package/lib/types/oauth.d.ts.map +1 -1
- package/lib/types/oauth.js +5 -10
- package/lib/types/screens/Chat.d.ts +17 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +627 -54
- package/lib/types/screens/SessionSupervisor.d.ts +2 -1
- package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/SessionSupervisor.js +156 -19
- package/lib/types/screens/Settings.d.ts.map +1 -1
- package/lib/types/screens/Settings.js +49 -11
- package/lib/types/screens/StatusLine.d.ts +4 -0
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +57 -27
- package/lib/types/screens/chatOverlay.d.ts +5 -0
- package/lib/types/screens/chatOverlay.d.ts.map +1 -1
- package/lib/types/screens/chatOverlay.js +1 -0
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +47 -0
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -0
- package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +65 -0
- package/lib/types/screens/sessionSupervisor/model.d.ts +12 -0
- package/lib/types/screens/sessionSupervisor/model.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/model.js +26 -0
- package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts +107 -0
- package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts.map +1 -0
- package/lib/types/screens/sessionSupervisor/useForeignSessions.js +312 -0
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +4 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +97 -14
- package/lib/types/sessionHistory.d.ts +2 -2
- package/lib/types/sessionHistory.d.ts.map +1 -1
- package/lib/types/sessionHistory.js +31 -5
- package/lib/types/settings/definitions.d.ts +681 -0
- package/lib/types/settings/definitions.d.ts.map +1 -0
- package/lib/types/settings/definitions.js +511 -0
- package/lib/types/starAction.d.ts +44 -0
- package/lib/types/starAction.d.ts.map +1 -0
- package/lib/types/starAction.js +52 -0
- package/lib/types/terminal-utils/latex.d.ts +10 -0
- package/lib/types/terminal-utils/latex.d.ts.map +1 -0
- package/lib/types/terminal-utils/latex.js +1417 -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 +26 -1
- package/lib/types/terminal-utils/math.d.ts +66 -0
- package/lib/types/terminal-utils/math.d.ts.map +1 -0
- package/lib/types/terminal-utils/math.js +337 -0
- package/lib/types/tips.d.ts.map +1 -1
- package/lib/types/tips.js +16 -4
- package/lib/types/tuiDisplayPrefs.d.ts +67 -0
- package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
- package/lib/types/tuiDisplayPrefs.js +59 -0
- package/lib/types/ui.d.ts +1 -1
- package/lib/types/ui.d.ts.map +1 -1
- package/lib/types/ui.js +1 -1
- package/lib/types/update.js +2 -2
- package/lib/types/usageStats.d.ts +98 -0
- package/lib/types/usageStats.d.ts.map +1 -0
- package/lib/types/usageStats.js +169 -0
- package/lib/types/utils/bmp.d.ts +17 -0
- package/lib/types/utils/bmp.d.ts.map +1 -0
- package/lib/types/utils/bmp.js +154 -0
- package/lib/types/utils/clipboard.d.ts +14 -2
- package/lib/types/utils/clipboard.d.ts.map +1 -1
- package/lib/types/utils/clipboard.js +143 -8
- package/lib/types/utils/fold-long-lines.d.ts.map +1 -1
- package/lib/types/utils/fold-long-lines.js +2 -1
- package/lib/types/utils/keymap.d.ts +4 -1
- package/lib/types/utils/keymap.d.ts.map +1 -1
- package/lib/types/utils/keymap.js +8 -0
- package/lib/types/utils/modifiers.d.ts +4 -3
- package/lib/types/utils/modifiers.d.ts.map +1 -1
- package/lib/types/utils/modifiers.js +4 -3
- package/lib/types/utils/pastedImagePath.d.ts +8 -0
- package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
- package/lib/types/utils/pastedImagePath.js +29 -5
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/LICENSE +202 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/NOTICE +20 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/index.d.ts +16 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/bundled-packages.json +4 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs +20 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs.LEGAL.txt +35 -0
- package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/package.json +29 -0
- package/package.json +127 -102
- package/presets/liangshen/agent.cordis.yml +4 -1
- package/presets/liangshen/preset.yml +1 -1
- package/lib/types/minimalMode.d.ts +0 -13
- package/lib/types/minimalMode.d.ts.map +0 -1
- package/lib/types/minimalMode.js +0 -17
- package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +0 -21
- package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +0 -143
- package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +0 -11
- package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +0 -44
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +0 -193
- package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +0 -69
|
@@ -79,10 +79,12 @@ export declare function runningPresetOf(session: unknown): string | undefined;
|
|
|
79
79
|
*/
|
|
80
80
|
export declare function resolvePersistedRoute(ctx: Context, sessionId: SessionId): Promise<ModelRoute | undefined>;
|
|
81
81
|
/**
|
|
82
|
-
* Keep the official Minimal preset's model-facing
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
82
|
+
* Keep the official Minimal preset's model-facing catalog minimal. The preset
|
|
83
|
+
* itself declares exactly one persistent shell tool (bash on POSIX, pwsh on
|
|
84
|
+
* Windows), while the TUI mounts ask_user_question at the host layer so every
|
|
85
|
+
* other preset (including user presets) can use its questionnaire UI —
|
|
86
|
+
* that host-layer tool otherwise merges into Minimal's scoped catalog as an
|
|
87
|
+
* extra tool.
|
|
86
88
|
*
|
|
87
89
|
* This is a per-assembly filter rather than a startup-time decision because
|
|
88
90
|
* one TUI process can resume, create, or recompose sessions under different
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAWtE,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBhG;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW5G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAW/G;AAED
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAWtE,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBhG;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW5G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAW/G;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAM/G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAKpG"}
|
|
@@ -120,10 +120,12 @@ export async function resolvePersistedRoute(ctx, sessionId) {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
|
-
* Keep the official Minimal preset's model-facing
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
123
|
+
* Keep the official Minimal preset's model-facing catalog minimal. The preset
|
|
124
|
+
* itself declares exactly one persistent shell tool (bash on POSIX, pwsh on
|
|
125
|
+
* Windows), while the TUI mounts ask_user_question at the host layer so every
|
|
126
|
+
* other preset (including user presets) can use its questionnaire UI —
|
|
127
|
+
* that host-layer tool otherwise merges into Minimal's scoped catalog as an
|
|
128
|
+
* extra tool.
|
|
127
129
|
*
|
|
128
130
|
* This is a per-assembly filter rather than a startup-time decision because
|
|
129
131
|
* one TUI process can resume, create, or recompose sessions under different
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ProviderSetupHost } from '../adapter/ports/channel-settings.js';
|
|
2
2
|
export type { ProviderSetupHost, CatalogProviderCandidate, ConfiguredProvider, ProfilePathOp, OAuthSetupHost, OAuthProviderStatus, OAuthLoginResult } from '../adapter/ports/channel-settings.js';
|
|
3
3
|
import { type AskUserQuestionAnswer, type AskUserQuestionRequest } from '@deepseek-ai/dsh-user-questions';
|
|
4
|
+
import type { LlmDiscoveredModel } from '@deepseek-ai/dsh-llm';
|
|
4
5
|
/** Route id rule shared with the dsh configuration surface (web Models page). */
|
|
5
6
|
export declare const PROVIDER_ROUTE_ID: RegExp;
|
|
6
7
|
/** Wire protocols dsh-llm-pi-ai can serve on a manually declared route. */
|
|
@@ -39,4 +40,20 @@ export type ProviderWizardOutcome = 'added' | 'updated' | 'deleted' | 'signed-ou
|
|
|
39
40
|
* dismisses any question (Esc) — nothing has been written at that point.
|
|
40
41
|
*/
|
|
41
42
|
export declare function runProviderWizard(deps: ProviderWizardDeps): Promise<ProviderWizardOutcome>;
|
|
43
|
+
/** How the live endpoint probe of one discovery pass went. */
|
|
44
|
+
export type RouteDiscoveryLive = 'fetched' | 'failed' | 'unavailable';
|
|
45
|
+
export type RouteDiscoveryCatalog = 'fetched' | 'failed' | 'unavailable';
|
|
46
|
+
export type RouteDiscoveryReason = 'no-base-url' | 'unsupported-catalog' | 'custom-headers';
|
|
47
|
+
/** One route-model discovery pass, ready for the selection panel. */
|
|
48
|
+
export interface RouteDiscovery {
|
|
49
|
+
/** Merged rows: installed-catalog rows first (rich metadata), then
|
|
50
|
+
* endpoint-only ids in the order the endpoint advertised them. */
|
|
51
|
+
readonly rows: readonly LlmDiscoveredModel[];
|
|
52
|
+
/** Ids covered by the installed catalog (their rows carry catalog truth). */
|
|
53
|
+
readonly catalogIds: ReadonlySet<string>;
|
|
54
|
+
/** Whether the installed catalog lookup was authoritative. */
|
|
55
|
+
readonly catalog: RouteDiscoveryCatalog;
|
|
56
|
+
readonly live: RouteDiscoveryLive;
|
|
57
|
+
readonly reason?: RouteDiscoveryReason;
|
|
58
|
+
}
|
|
42
59
|
//# sourceMappingURL=providerWizard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providerWizard.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/providerWizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAsH,MAAM,sCAAsC,CAAA;AACjM,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAsBjM,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"providerWizard.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/providerWizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAsH,MAAM,sCAAsC,CAAA;AACjM,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAsBjM,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,QAAoC,CAAA;AAElE,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,2EAIrB,CAAA;AAEV;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,CACZ,OAAO,EAAE,sBAAsB,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KACtE,IAAI,CAAA;IACT,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;IACrE,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5E;AAED,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AA4D3G;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA8BhC;AAw3BD,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAA;AACrE,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAA;AACxE,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,qBAAqB,GACrB,gBAAgB,CAAA;AAEpB,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B;uEACmE;IACnE,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAA;IAC5C,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;CACvC"}
|
|
@@ -204,12 +204,14 @@ async function runAddFlow(deps) {
|
|
|
204
204
|
}
|
|
205
205
|
// ── 5. model discovery (draft credential, nothing persisted) ───────
|
|
206
206
|
notify(t('provider-discovery-running'));
|
|
207
|
-
const
|
|
207
|
+
const discovery = await discoverRouteModels(host, {
|
|
208
208
|
...(isCatalog ? { provider: route } : {}),
|
|
209
209
|
...(baseURL !== undefined && baseURL !== '' ? { baseURL } : {}),
|
|
210
210
|
...(api !== undefined ? { api } : {}),
|
|
211
|
-
apiKey
|
|
212
|
-
})
|
|
211
|
+
...(apiKey !== undefined && apiKey !== '' ? { apiKey } : {}),
|
|
212
|
+
});
|
|
213
|
+
const discovered = discovery.rows;
|
|
214
|
+
notifyDiscoveryStatus(notify, discovery);
|
|
213
215
|
// ── 6. model selection ─────────────────────────────────────────────
|
|
214
216
|
let models = [];
|
|
215
217
|
let discoveredById = new Map();
|
|
@@ -218,13 +220,15 @@ async function runAddFlow(deps) {
|
|
|
218
220
|
const modelsAnswer = await ask({
|
|
219
221
|
questions: [optionQuestion('models', t('provider-q-models'), discovered.map(model => ({
|
|
220
222
|
label: model.id,
|
|
221
|
-
description:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
223
|
+
description: modelRowDescription(model, isCatalog && discovery.catalog === 'fetched' && !discovery.catalogIds.has(model.id)),
|
|
224
|
+
})), {
|
|
225
|
+
multiSelect: true,
|
|
226
|
+
...(isCatalog && discovery.reason === 'no-base-url'
|
|
227
|
+
? { detail: t('provider-catalog-snapshot-note', { n: discovered.length }) }
|
|
228
|
+
: {}),
|
|
229
|
+
})],
|
|
226
230
|
});
|
|
227
|
-
models = mergeModelIds(answerSelected(modelsAnswer, 'models'),
|
|
231
|
+
models = mergeModelIds(answerSelected(modelsAnswer, 'models'), modelCustomInput(modelsAnswer, isCatalog, discovery, notify));
|
|
228
232
|
}
|
|
229
233
|
else {
|
|
230
234
|
notify(t('provider-discovery-failed'), { color: 'warning' });
|
|
@@ -247,11 +251,14 @@ async function runAddFlow(deps) {
|
|
|
247
251
|
}
|
|
248
252
|
// ── 7. confirm ─────────────────────────────────────────────────────
|
|
249
253
|
const summaryLines = buildSummaryLines({
|
|
250
|
-
route, ref, shadowed, baseURL, api, models, isCatalog, keyLine,
|
|
254
|
+
route, action: 'added', ref, shadowed, baseURL, api, models, isCatalog, keyLine,
|
|
255
|
+
});
|
|
256
|
+
const previewLines = buildSummaryLines({
|
|
257
|
+
route, action: 'preview', ref, shadowed, baseURL, api, models, isCatalog, keyLine,
|
|
251
258
|
});
|
|
252
259
|
const detail = host.routeExists(route)
|
|
253
|
-
? `${
|
|
254
|
-
:
|
|
260
|
+
? `${previewLines.join('\n')}\n${t('provider-route-exists-warning')}`
|
|
261
|
+
: previewLines.join('\n');
|
|
255
262
|
const confirmAnswer = await ask({
|
|
256
263
|
questions: [optionQuestion('confirm', t('provider-q-confirm'), [
|
|
257
264
|
{ label: t('provider-opt-confirm-write') },
|
|
@@ -273,7 +280,16 @@ async function runAddFlow(deps) {
|
|
|
273
280
|
await host.writeCredential(ref, apiKey);
|
|
274
281
|
wroteCredential = true;
|
|
275
282
|
}
|
|
276
|
-
const profile = buildProfile({
|
|
283
|
+
const profile = buildProfile({
|
|
284
|
+
isCatalog,
|
|
285
|
+
ref,
|
|
286
|
+
baseURL,
|
|
287
|
+
api,
|
|
288
|
+
models,
|
|
289
|
+
discoveredById,
|
|
290
|
+
catalogIds: discovery.catalogIds,
|
|
291
|
+
catalogDiscovery: discovery.catalog,
|
|
292
|
+
});
|
|
277
293
|
try {
|
|
278
294
|
await host.writeProfile(route, profile);
|
|
279
295
|
}
|
|
@@ -444,6 +460,7 @@ async function editApiKey(deps, provider) {
|
|
|
444
460
|
await host.writeCredential(provider.ref, value);
|
|
445
461
|
pushLocal('/provider', buildSummaryLines({
|
|
446
462
|
route: provider.route,
|
|
463
|
+
action: 'updated',
|
|
447
464
|
ref: provider.ref,
|
|
448
465
|
shadowed: provider.shadowed,
|
|
449
466
|
baseURL: provider.baseURL,
|
|
@@ -466,6 +483,7 @@ change) {
|
|
|
466
483
|
await host.mutateProfile(provider.route, [{ op: 'set', path, value }]);
|
|
467
484
|
pushLocal('/provider', buildSummaryLines({
|
|
468
485
|
route: provider.route,
|
|
486
|
+
action: 'updated',
|
|
469
487
|
ref: provider.ref,
|
|
470
488
|
shadowed: provider.shadowed,
|
|
471
489
|
baseURL: change.baseURL ?? provider.baseURL,
|
|
@@ -527,16 +545,27 @@ async function editModelList(deps, provider) {
|
|
|
527
545
|
const { host, ask, notify, pushLocal } = deps;
|
|
528
546
|
const isCatalog = provider.isCatalog;
|
|
529
547
|
const previous = provider.models ?? [];
|
|
530
|
-
|
|
548
|
+
// The credential is read only when a live probe will use it: a catalog
|
|
549
|
+
// A route without a usable live probe (no endpoint, unsupported catalog
|
|
550
|
+
// protocol, or custom headers the upstream seam cannot carry) stays on the
|
|
551
|
+
// installed-catalog listing, so no secret is resolved for nothing.
|
|
552
|
+
const endpointKnown = provider.baseURL !== undefined && provider.baseURL !== '';
|
|
553
|
+
const liveProbePossible = endpointKnown
|
|
554
|
+
&& !provider.hasCustomHeaders
|
|
555
|
+
&& (!isCatalog || provider.api !== undefined || catalogLiveApi(provider.route) !== undefined);
|
|
556
|
+
const key = provider.ref !== '' && liveProbePossible
|
|
531
557
|
? (provider.shadowed ? host.envValue(provider.ref) : await host.readCredential(provider.ref))
|
|
532
558
|
: undefined;
|
|
533
559
|
notify(t('provider-discovery-running'));
|
|
534
|
-
const
|
|
560
|
+
const discovery = await discoverRouteModels(host, {
|
|
535
561
|
...(isCatalog ? { provider: provider.route } : {}),
|
|
536
|
-
...(provider.baseURL !== undefined
|
|
562
|
+
...(provider.baseURL !== undefined ? { baseURL: provider.baseURL } : {}),
|
|
537
563
|
...(provider.api !== undefined ? { api: provider.api } : {}),
|
|
538
|
-
|
|
539
|
-
|
|
564
|
+
...(provider.hasCustomHeaders ? { hasCustomHeaders: true } : {}),
|
|
565
|
+
...(key !== undefined ? { apiKey: key } : {}),
|
|
566
|
+
});
|
|
567
|
+
const discovered = discovery.rows;
|
|
568
|
+
notifyDiscoveryStatus(notify, discovery);
|
|
540
569
|
let models;
|
|
541
570
|
let discoveredById = new Map();
|
|
542
571
|
if (discovered.length === 0) {
|
|
@@ -552,18 +581,15 @@ async function editModelList(deps, provider) {
|
|
|
552
581
|
}
|
|
553
582
|
else {
|
|
554
583
|
discoveredById = new Map(discovered.map(model => [model.id, model]));
|
|
555
|
-
// Existing models the
|
|
556
|
-
// pulled, transient discovery gap) must still appear in
|
|
557
|
-
// pre-checked and marked: options built from `discovered`
|
|
558
|
-
// silently drop them on an Enter-through confirm,
|
|
559
|
-
// stored entries and the unmodeled per-model fields.
|
|
560
|
-
// un-check removes one.
|
|
584
|
+
// Existing models neither the catalog nor the endpoint advertises
|
|
585
|
+
// (renamed, beta pulled, transient discovery gap) must still appear in
|
|
586
|
+
// the panel, pre-checked and marked: options built from `discovered`
|
|
587
|
+
// alone would silently drop them on an Enter-through confirm,
|
|
588
|
+
// destroying their stored entries and the unmodeled per-model fields.
|
|
589
|
+
// Only an explicit un-check removes one.
|
|
561
590
|
const optionRows = discovered.map(model => ({
|
|
562
591
|
label: model.id,
|
|
563
|
-
description:
|
|
564
|
-
model.name ?? '',
|
|
565
|
-
model.contextWindow !== undefined ? `${model.contextWindow}` : '',
|
|
566
|
-
].filter(part => part !== '').join(' · ') || undefined,
|
|
592
|
+
description: modelRowDescription(model, isCatalog && discovery.catalog === 'fetched' && !discovery.catalogIds.has(model.id)),
|
|
567
593
|
}));
|
|
568
594
|
const missingRows = previous
|
|
569
595
|
.filter(id => !discoveredById.has(id))
|
|
@@ -572,9 +598,15 @@ async function editModelList(deps, provider) {
|
|
|
572
598
|
description: t('provider-row-model-missing'),
|
|
573
599
|
}));
|
|
574
600
|
const modelsAnswer = await ask({
|
|
575
|
-
questions: [optionQuestion('models', t('provider-q-models'), [...optionRows, ...missingRows], {
|
|
601
|
+
questions: [optionQuestion('models', t('provider-q-models'), [...optionRows, ...missingRows], {
|
|
602
|
+
multiSelect: true,
|
|
603
|
+
defaultSelected: previous,
|
|
604
|
+
...(isCatalog && discovery.reason === 'no-base-url'
|
|
605
|
+
? { detail: t('provider-catalog-snapshot-note', { n: discovered.length }) }
|
|
606
|
+
: {}),
|
|
607
|
+
})],
|
|
576
608
|
});
|
|
577
|
-
models = mergeModelIds(answerSelected(modelsAnswer, 'models'),
|
|
609
|
+
models = mergeModelIds(answerSelected(modelsAnswer, 'models'), modelCustomInput(modelsAnswer, isCatalog, discovery, notify));
|
|
578
610
|
}
|
|
579
611
|
if (!isCatalog && models.length === 0) {
|
|
580
612
|
// A manual route without models fails the adapter validation.
|
|
@@ -586,8 +618,11 @@ async function editModelList(deps, provider) {
|
|
|
586
618
|
return 'cancelled';
|
|
587
619
|
}
|
|
588
620
|
// The new `models` value: a kept id re-enters its stored entry verbatim;
|
|
589
|
-
// a newly enabled one is built from the discovery row
|
|
590
|
-
// catalog
|
|
621
|
+
// a newly enabled one is built from the discovery row. An id the installed
|
|
622
|
+
// catalog covers stays plain `{id}` (the catalog carries the capabilities
|
|
623
|
+
// and would be overridden by entry fields); an endpoint-only id takes the
|
|
624
|
+
// capacities the live listing disclosed, falling back to the route
|
|
625
|
+
// defaults upstream when the endpoint said nothing.
|
|
591
626
|
const storedById = new Map((provider.modelEntries ?? [])
|
|
592
627
|
.flatMap(entry => typeof entry['id'] === 'string' ? [[entry['id'], entry]] : []));
|
|
593
628
|
const modelsValue = models.map(id => {
|
|
@@ -597,7 +632,7 @@ async function editModelList(deps, provider) {
|
|
|
597
632
|
const discovered = discoveredById.get(id);
|
|
598
633
|
return {
|
|
599
634
|
id,
|
|
600
|
-
...(isCatalog || discovered === undefined ? {} : {
|
|
635
|
+
...((isCatalog && (discovery.catalog !== 'fetched' || discovery.catalogIds.has(id))) || discovered === undefined ? {} : {
|
|
601
636
|
...(discovered.contextWindow !== undefined
|
|
602
637
|
? { contextWindow: discovered.contextWindow }
|
|
603
638
|
: {}),
|
|
@@ -612,6 +647,7 @@ async function editModelList(deps, provider) {
|
|
|
612
647
|
]);
|
|
613
648
|
pushLocal('/provider', buildSummaryLines({
|
|
614
649
|
route: provider.route,
|
|
650
|
+
action: 'updated-models',
|
|
615
651
|
ref: provider.ref,
|
|
616
652
|
shadowed: provider.shadowed,
|
|
617
653
|
baseURL: provider.baseURL,
|
|
@@ -621,6 +657,10 @@ async function editModelList(deps, provider) {
|
|
|
621
657
|
keyLine: provider.ref !== ''
|
|
622
658
|
? t('provider-line-key-kept', { ref: provider.ref })
|
|
623
659
|
: t('provider-line-key-none'),
|
|
660
|
+
delta: {
|
|
661
|
+
added: models.filter(id => !previous.includes(id)),
|
|
662
|
+
removed: previous.filter(id => !models.includes(id)),
|
|
663
|
+
},
|
|
624
664
|
}));
|
|
625
665
|
notify(t('provider-edit-success', { route: provider.route }), { color: 'success' });
|
|
626
666
|
return 'updated';
|
|
@@ -654,7 +694,7 @@ async function deleteConfiguredProvider(deps, provider) {
|
|
|
654
694
|
const sharers = provider.ref === ''
|
|
655
695
|
? []
|
|
656
696
|
: host.listRefUsers(provider.ref, provider.route);
|
|
657
|
-
const
|
|
697
|
+
const previewLines = buildDeleteSummary(provider);
|
|
658
698
|
let confirmAnswer;
|
|
659
699
|
try {
|
|
660
700
|
confirmAnswer = await ask({
|
|
@@ -663,8 +703,8 @@ async function deleteConfiguredProvider(deps, provider) {
|
|
|
663
703
|
{ label: t('provider-opt-confirm-cancel') },
|
|
664
704
|
], {
|
|
665
705
|
detail: sharers.length > 0
|
|
666
|
-
? `${
|
|
667
|
-
:
|
|
706
|
+
? `${previewLines.join('\n')}\n${t('provider-delete-shared-warning', { ref: provider.ref, routes: sharers.join(', ') })}`
|
|
707
|
+
: previewLines.join('\n'),
|
|
668
708
|
hideCustomInput: true,
|
|
669
709
|
})],
|
|
670
710
|
});
|
|
@@ -690,7 +730,10 @@ async function deleteConfiguredProvider(deps, provider) {
|
|
|
690
730
|
}
|
|
691
731
|
// The catalog changed from here on: report 'deleted' whatever the
|
|
692
732
|
// credential cleanup below does, so the caller invalidates completions.
|
|
693
|
-
const pushedLines = [
|
|
733
|
+
const pushedLines = [
|
|
734
|
+
t('provider-line-action-deleted', { route: provider.route }),
|
|
735
|
+
...previewLines.slice(1),
|
|
736
|
+
];
|
|
694
737
|
let keyCleanupFailed = false;
|
|
695
738
|
if (provider.ref !== '') {
|
|
696
739
|
if (provider.shadowed) {
|
|
@@ -757,13 +800,13 @@ function providerRowDescription(provider) {
|
|
|
757
800
|
* and models lines; no credential values are ever rendered). */
|
|
758
801
|
function buildDeleteSummary(provider) {
|
|
759
802
|
const lines = [t('provider-line-route', { route: provider.route })];
|
|
760
|
-
if (provider.baseURL !== undefined)
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
803
|
+
if (provider.baseURL !== undefined && provider.baseURL !== '') {
|
|
804
|
+
const endpoint = t('provider-line-endpoint', { url: provider.baseURL });
|
|
805
|
+
lines.push(provider.api !== undefined && provider.api !== ''
|
|
806
|
+
? `${endpoint} · ${provider.api}`
|
|
807
|
+
: endpoint);
|
|
808
|
+
}
|
|
809
|
+
lines.push(modelsSummaryLine(provider.models ?? [], undefined));
|
|
767
810
|
if (provider.ref !== '') {
|
|
768
811
|
lines.push(provider.shadowed
|
|
769
812
|
? t('provider-line-keyref-env', { ref: provider.ref })
|
|
@@ -774,7 +817,9 @@ function buildDeleteSummary(provider) {
|
|
|
774
817
|
/** Masked state line for one provider row in the OAuth pick question. */
|
|
775
818
|
function oauthStateDescription(status) {
|
|
776
819
|
if (status.signedIn) {
|
|
777
|
-
return
|
|
820
|
+
return status.expiresAt === undefined
|
|
821
|
+
? t('provider-oauth-state-in-no-expiry')
|
|
822
|
+
: t('provider-oauth-state-in', { time: new Date(status.expiresAt).toISOString() });
|
|
778
823
|
}
|
|
779
824
|
return status.expired
|
|
780
825
|
? t('provider-oauth-state-expired')
|
|
@@ -829,7 +874,9 @@ async function runOAuthWizard(deps, oauth) {
|
|
|
829
874
|
pushLocal('/provider', [
|
|
830
875
|
t('provider-line-oauth-provider', { provider: result.provider }),
|
|
831
876
|
t('provider-line-oauth-flow', { flow: result.oauthLabel }),
|
|
832
|
-
|
|
877
|
+
...(result.expiresAt === undefined
|
|
878
|
+
? []
|
|
879
|
+
: [t('provider-line-oauth-expires', { time: new Date(result.expiresAt).toISOString() })]),
|
|
833
880
|
t('provider-switch-hint'),
|
|
834
881
|
]);
|
|
835
882
|
notify(t('provider-oauth-login-ok', { provider: result.provider }), { color: 'success' });
|
|
@@ -868,21 +915,167 @@ function mergeModelIds(selected, custom) {
|
|
|
868
915
|
}
|
|
869
916
|
return ids;
|
|
870
917
|
}
|
|
918
|
+
function modelCustomInput(answer, isCatalog, discovery, notify) {
|
|
919
|
+
const custom = answerText(answer, 'models');
|
|
920
|
+
if (custom !== '' && isCatalog && discovery.reason === 'unsupported-catalog') {
|
|
921
|
+
notify(t('provider-catalog-models-only'), { color: 'warning' });
|
|
922
|
+
return '';
|
|
923
|
+
}
|
|
924
|
+
return custom;
|
|
925
|
+
}
|
|
926
|
+
/**
|
|
927
|
+
* Discover the models of one route or draft in two passes.
|
|
928
|
+
*
|
|
929
|
+
* The upstream discovery seam answers a request that names a catalog
|
|
930
|
+
* `provider` from the installed static catalog without touching the network.
|
|
931
|
+
* A live probe therefore omits `provider`, but only when this adapter can
|
|
932
|
+
* supply a stable protocol and the route has no custom headers (the upstream
|
|
933
|
+
* seam cannot carry the named route's headers into an anonymous request).
|
|
934
|
+
* The listings merge: an id present in both resolves to its catalog row,
|
|
935
|
+
* endpoint-only ids append — those are the new models the wizard can surface.
|
|
936
|
+
*
|
|
937
|
+
* The `apiKey` field is omitted rather than sent empty when no key is
|
|
938
|
+
* knowable: an empty string is a hard invalid-credential upstream, while an
|
|
939
|
+
* absent field probes anonymously (a local gateway that needs no auth still
|
|
940
|
+
* lists its models).
|
|
941
|
+
*/
|
|
942
|
+
async function discoverRouteModels(host, draft) {
|
|
943
|
+
const catalogResult = draft.provider !== undefined
|
|
944
|
+
? await host.discoverModels({ provider: draft.provider }).then(rows => ({ rows, catalog: 'fetched' }), () => ({ rows: [], catalog: 'failed' }))
|
|
945
|
+
: { rows: [], catalog: 'unavailable' };
|
|
946
|
+
const catalogRows = catalogResult.rows;
|
|
947
|
+
const catalogIds = new Set(catalogRows.map(row => row.id));
|
|
948
|
+
if (draft.baseURL === undefined || draft.baseURL === '') {
|
|
949
|
+
return {
|
|
950
|
+
rows: catalogRows,
|
|
951
|
+
catalogIds,
|
|
952
|
+
catalog: catalogResult.catalog,
|
|
953
|
+
live: 'unavailable',
|
|
954
|
+
reason: 'no-base-url',
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
if (draft.hasCustomHeaders) {
|
|
958
|
+
return {
|
|
959
|
+
rows: catalogRows,
|
|
960
|
+
catalogIds,
|
|
961
|
+
catalog: catalogResult.catalog,
|
|
962
|
+
live: 'unavailable',
|
|
963
|
+
reason: 'custom-headers',
|
|
964
|
+
};
|
|
965
|
+
}
|
|
966
|
+
const api = draft.api ?? (draft.provider !== undefined
|
|
967
|
+
? catalogLiveApi(draft.provider)
|
|
968
|
+
: undefined);
|
|
969
|
+
if (draft.provider !== undefined && api === undefined) {
|
|
970
|
+
return {
|
|
971
|
+
rows: catalogRows,
|
|
972
|
+
catalogIds,
|
|
973
|
+
catalog: catalogResult.catalog,
|
|
974
|
+
live: 'unavailable',
|
|
975
|
+
reason: 'unsupported-catalog',
|
|
976
|
+
};
|
|
977
|
+
}
|
|
978
|
+
const live = await host.discoverModels({
|
|
979
|
+
baseURL: draft.baseURL,
|
|
980
|
+
...(api !== undefined && api !== '' ? { api } : {}),
|
|
981
|
+
...(draft.apiKey !== undefined && draft.apiKey !== '' ? { apiKey: draft.apiKey } : {}),
|
|
982
|
+
}).then(rows => ({ rows, live: 'fetched' }), () => ({ rows: [], live: 'failed' }));
|
|
983
|
+
return {
|
|
984
|
+
rows: [...catalogRows, ...live.rows.filter(row => !catalogIds.has(row.id))],
|
|
985
|
+
catalogIds,
|
|
986
|
+
catalog: catalogResult.catalog,
|
|
987
|
+
live: live.live,
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
/** Catalog routes whose protocol is stable enough for an un-named live probe. */
|
|
991
|
+
const CATALOG_LIVE_APIS = {
|
|
992
|
+
deepseek: 'openai-completions',
|
|
993
|
+
openai: 'openai-responses',
|
|
994
|
+
anthropic: 'anthropic-messages',
|
|
995
|
+
};
|
|
996
|
+
function catalogLiveApi(provider) {
|
|
997
|
+
return CATALOG_LIVE_APIS[provider];
|
|
998
|
+
}
|
|
999
|
+
function notifyDiscoveryStatus(notify, discovery) {
|
|
1000
|
+
if (discovery.catalog === 'failed') {
|
|
1001
|
+
notify(t('provider-catalog-fetch-failed'), { color: 'warning' });
|
|
1002
|
+
}
|
|
1003
|
+
if (discovery.live === 'failed') {
|
|
1004
|
+
notify(t('provider-live-fetch-failed'), { color: 'warning' });
|
|
1005
|
+
}
|
|
1006
|
+
else if (discovery.reason === 'unsupported-catalog' || discovery.reason === 'custom-headers') {
|
|
1007
|
+
notify(t('provider-live-fetch-unavailable'), { color: 'warning' });
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
/** Compact capacity rendering for picker rows: 1000000 → 1M, 384000 → 384k. */
|
|
1011
|
+
function formatCapacity(n) {
|
|
1012
|
+
if (n >= 1_000_000 && n % 1_000_000 === 0)
|
|
1013
|
+
return `${n / 1_000_000}M`;
|
|
1014
|
+
if (n >= 1_000 && n % 1_000 === 0)
|
|
1015
|
+
return `${n / 1_000}k`;
|
|
1016
|
+
return `${n}`;
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Picker-row description for one discovered model. `isNew` tags an id the
|
|
1020
|
+
* installed catalog does not ship — it came from the live endpoint probe and
|
|
1021
|
+
* is the thing the user is most likely looking for.
|
|
1022
|
+
*/
|
|
1023
|
+
function modelRowDescription(model, isNew) {
|
|
1024
|
+
const parts = [
|
|
1025
|
+
...(isNew ? [t('provider-row-model-new')] : []),
|
|
1026
|
+
...(model.name !== undefined && model.name !== '' ? [model.name] : []),
|
|
1027
|
+
...(model.contextWindow !== undefined ? [formatCapacity(model.contextWindow)] : []),
|
|
1028
|
+
];
|
|
1029
|
+
return parts.length > 0 ? parts.join(' · ') : undefined;
|
|
1030
|
+
}
|
|
871
1031
|
function buildSummaryLines(input) {
|
|
872
|
-
const lines = [
|
|
873
|
-
|
|
1032
|
+
const lines = [input.action === 'preview'
|
|
1033
|
+
? t('provider-line-route', { route: input.route })
|
|
1034
|
+
: input.action === 'added'
|
|
1035
|
+
? t('provider-line-action-added', { route: input.route })
|
|
1036
|
+
: input.action === 'updated-models'
|
|
1037
|
+
? t('provider-line-action-updated-models', { route: input.route })
|
|
1038
|
+
: t('provider-line-action-updated', { route: input.route })];
|
|
1039
|
+
lines.push((input.action === 'preview' && !input.shadowed && input.ref !== ''
|
|
1040
|
+
? t('provider-line-keyref-preview', { ref: input.ref })
|
|
1041
|
+
: undefined) ?? input.keyLine ?? (input.shadowed
|
|
874
1042
|
? t('provider-line-keyref-env', { ref: input.ref })
|
|
875
1043
|
: t('provider-line-keyref', { ref: input.ref })));
|
|
876
1044
|
if (input.baseURL !== undefined && input.baseURL !== '') {
|
|
877
|
-
|
|
1045
|
+
// The wire protocol rides the endpoint line: it only ever varies per
|
|
1046
|
+
// endpoint, and a lone protocol row reads as filler.
|
|
1047
|
+
const endpoint = t('provider-line-endpoint', { url: input.baseURL });
|
|
1048
|
+
lines.push(input.api !== undefined && input.api !== ''
|
|
1049
|
+
? `${endpoint} · ${input.api}`
|
|
1050
|
+
: endpoint);
|
|
878
1051
|
}
|
|
879
|
-
|
|
880
|
-
lines.push(t('provider-line-protocol', { api: input.api }));
|
|
881
|
-
lines.push(input.models.length > 0
|
|
882
|
-
? t('provider-line-models', { models: input.models.join(', ') })
|
|
883
|
-
: t('provider-line-models-catalog'));
|
|
1052
|
+
lines.push(modelsSummaryLine(input.models, input.delta));
|
|
884
1053
|
return lines;
|
|
885
1054
|
}
|
|
1055
|
+
/** `Models: …` line with an optional (added · removed) delta suffix. */
|
|
1056
|
+
function modelsSummaryLine(models, delta) {
|
|
1057
|
+
const base = models.length > 0
|
|
1058
|
+
? t('provider-line-models', { models: models.join(', ') })
|
|
1059
|
+
: t('provider-line-models-catalog');
|
|
1060
|
+
if (delta === undefined)
|
|
1061
|
+
return base;
|
|
1062
|
+
const parts = [];
|
|
1063
|
+
if (delta.added.length > 0)
|
|
1064
|
+
parts.push(t('provider-models-delta-added', { n: delta.added.length }));
|
|
1065
|
+
if (delta.removed.length > 0)
|
|
1066
|
+
parts.push(t('provider-models-delta-removed', { n: delta.removed.length }));
|
|
1067
|
+
return parts.length === 0 ? base
|
|
1068
|
+
: `${base}${t('provider-models-delta-wrap', { parts: parts.join(' · ') })}`;
|
|
1069
|
+
}
|
|
1070
|
+
/** Capacity fields for one discovered row, when the listing disclosed them. */
|
|
1071
|
+
function capsOf(model) {
|
|
1072
|
+
if (model === undefined)
|
|
1073
|
+
return {};
|
|
1074
|
+
return {
|
|
1075
|
+
...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}),
|
|
1076
|
+
...(model.maxTokens !== undefined ? { maxTokens: model.maxTokens } : {}),
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
886
1079
|
function buildProfile(input) {
|
|
887
1080
|
const profile = {};
|
|
888
1081
|
// Preserve the profile's credential shape: an empty ref (no apiKeyEnv)
|
|
@@ -893,24 +1086,23 @@ function buildProfile(input) {
|
|
|
893
1086
|
profile['baseURL'] = input.baseURL;
|
|
894
1087
|
if (input.isCatalog) {
|
|
895
1088
|
// `models` replaces the catalog when present; omit it to keep the whole
|
|
896
|
-
// catalog served.
|
|
1089
|
+
// catalog served. An id the installed catalog covers stays plain `{id}`
|
|
1090
|
+
// (the catalog carries versioned capabilities); an endpoint-only id
|
|
1091
|
+
// carries what the live listing disclosed.
|
|
897
1092
|
if (input.models.length > 0) {
|
|
898
|
-
profile['models'] = input.models.map(id => ({
|
|
1093
|
+
profile['models'] = input.models.map(id => ({
|
|
1094
|
+
id,
|
|
1095
|
+
...((input.catalogDiscovery !== 'fetched' || input.catalogIds.has(id))
|
|
1096
|
+
? {}
|
|
1097
|
+
: capsOf(input.discoveredById.get(id))),
|
|
1098
|
+
}));
|
|
899
1099
|
}
|
|
900
1100
|
return profile;
|
|
901
1101
|
}
|
|
902
1102
|
profile['api'] = input.api;
|
|
903
|
-
profile['models'] = input.models.map(id => {
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
...(discovered?.contextWindow !== undefined
|
|
908
|
-
? { contextWindow: discovered.contextWindow }
|
|
909
|
-
: {}),
|
|
910
|
-
...(discovered?.maxTokens !== undefined
|
|
911
|
-
? { maxTokens: discovered.maxTokens }
|
|
912
|
-
: {}),
|
|
913
|
-
};
|
|
914
|
-
});
|
|
1103
|
+
profile['models'] = input.models.map(id => ({
|
|
1104
|
+
id,
|
|
1105
|
+
...capsOf(input.discoveredById.get(id)),
|
|
1106
|
+
}));
|
|
915
1107
|
return profile;
|
|
916
1108
|
}
|