@askdkc/dsh-cli 0.13.4 → 0.14.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/bin/{dsh-tui.js → dsh-cli.js} +27 -27
- package/cordis.patch.yml +32 -32
- package/cordis.yml +17 -17
- package/lib/types/activityPrefs.d.ts +2 -2
- package/lib/types/activityPrefs.js +2 -2
- package/lib/types/adapter/channel/actions.js +1 -1
- package/lib/types/adapter/channel/consumer.js +1 -1
- package/lib/types/adapter/channel/internal-token.js +1 -1
- package/lib/types/adapter/channel/plugins.js +1 -1
- package/lib/types/adapter/channel/session-projection.js +3 -3
- package/lib/types/adapter/channel/transcript.js +1 -1
- package/lib/types/adapter/channel/ui.js +3 -3
- package/lib/types/adapter/kernel/host-facade.d.ts +1 -1
- package/lib/types/adapter/kernel/host-facade.js +6 -6
- package/lib/types/adapter/kernel/host-probe-access.d.ts +1 -1
- package/lib/types/adapter/kernel/host-probe-access.js +6 -6
- package/lib/types/adapter/kernel/kernel-runtime.js +1 -1
- package/lib/types/adapter/kernel/legacy-facade.d.ts +1 -1
- package/lib/types/adapter/kernel/legacy-facade.js +1 -1
- package/lib/types/adapter/kernel/replay-isolation.js +1 -1
- package/lib/types/adapter/kernel/runtime.d.ts +1 -1
- package/lib/types/adapter/kernel/runtime.js +7 -7
- package/lib/types/adapter/ports/channel-display.d.ts +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +15 -15
- package/lib/types/adapter/standard/descriptor.d.ts +1 -1
- package/lib/types/adapter/standard/descriptor.js +2 -2
- package/lib/types/adapter/standard/registry.d.ts +1 -1
- package/lib/types/adapter/standard/registry.js +2 -2
- package/lib/types/adapter/standard/tui-extension.d.ts +2 -2
- package/lib/types/adapter/standard/tui-extension.js +3 -3
- package/lib/types/adapter/upstream/channel-driver.js +10 -10
- package/lib/types/adapter/upstream/decisions-driver.js +3 -3
- package/lib/types/adapter/upstream/extensions-driver.js +18 -18
- package/lib/types/adapter/upstream/host-descriptor-driver.js +4 -4
- package/lib/types/adapter/upstream/presentation-driver.js +5 -5
- package/lib/types/adapter/upstream/scenes-driver.js +4 -4
- package/lib/types/adapter/upstream/settings-driver.js +4 -4
- package/lib/types/adapter/upstream/workspace-driver.js +2 -2
- package/lib/types/bootstrap/state.d.ts +4 -4
- package/lib/types/bootstrap/state.js +4 -4
- package/lib/types/{tuiDisplayPrefs.d.ts → cliDisplayPrefs.d.ts} +1 -1
- package/lib/types/{tuiDisplayPrefs.d.ts.map → cliDisplayPrefs.d.ts.map} +1 -1
- package/lib/types/{tuiDisplayPrefs.js → cliDisplayPrefs.js} +1 -1
- package/lib/types/commands.js +7 -7
- package/lib/types/components/AutoRecapRow.d.ts +1 -1
- package/lib/types/components/AutoRecapRow.js +1 -1
- package/lib/types/components/HelpMenu.d.ts +1 -1
- package/lib/types/components/HelpMenu.js +1 -1
- package/lib/types/components/LogoV2.d.ts +2 -2
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +5 -19
- package/lib/types/components/MermaidDiagram.js +1 -1
- package/lib/types/components/MessageList.d.ts +2 -2
- package/lib/types/components/MessageList.js +1 -1
- package/lib/types/components/PageMargin.d.ts +3 -3
- package/lib/types/components/PageMargin.js +1 -1
- package/lib/types/components/PluginSceneBoundary.d.ts +1 -1
- package/lib/types/components/PluginSceneBoundary.js +1 -1
- package/lib/types/components/PromptInput.d.ts +1 -1
- package/lib/types/components/PromptInput.js +3 -3
- package/lib/types/components/ScrollbarGutter.d.ts +1 -1
- package/lib/types/components/ScrollbarGutter.js +1 -1
- package/lib/types/components/Select.d.ts +1 -1
- package/lib/types/components/Select.js +1 -1
- package/lib/types/components/SplitDiffView.d.ts +1 -1
- package/lib/types/components/ThemePicker.d.ts +1 -1
- package/lib/types/components/ThemePicker.js +1 -1
- package/lib/types/components/activityFrames.d.ts +1 -1
- package/lib/types/components/activityFrames.js +1 -1
- package/lib/types/components/design-system/Byline.d.ts +1 -1
- package/lib/types/components/design-system/Byline.js +1 -1
- package/lib/types/components/design-system/Divider.d.ts +1 -1
- package/lib/types/components/design-system/Divider.js +1 -1
- package/lib/types/components/design-system/StatusIcon.d.ts +1 -1
- package/lib/types/components/design-system/StatusIcon.js +1 -1
- package/lib/types/components/design-system/ThemeProvider.d.ts +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +11 -11
- package/lib/types/components/design-system/ThemedBox.d.ts +1 -1
- package/lib/types/components/design-system/ThemedBox.js +1 -1
- package/lib/types/components/design-system/ThemedText.d.ts +1 -1
- package/lib/types/components/design-system/ThemedText.js +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts +3 -3
- package/lib/types/components/messages/AssistantToolUseMessage.js +1 -1
- package/lib/types/components/messages/originalImage.js +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +1 -1
- package/lib/types/components/smoothReveal.d.ts +1 -1
- package/lib/types/components/smoothReveal.js +1 -1
- package/lib/types/customTheme.d.ts +5 -5
- package/lib/types/customTheme.js +7 -7
- package/lib/types/dsh-adapter/activity-store.d.ts +1 -1
- package/lib/types/dsh-adapter/activity-store.js +3 -3
- package/lib/types/dsh-adapter/bundled-presets.js +2 -2
- package/lib/types/dsh-adapter/channel/action-readiness.js +2 -2
- package/lib/types/dsh-adapter/channel/agent-view-projection.js +1 -1
- package/lib/types/dsh-adapter/channel/background-action.js +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +1 -1
- package/lib/types/dsh-adapter/channel/binding.js +14 -14
- package/lib/types/dsh-adapter/channel/external-commands.js +3 -3
- package/lib/types/dsh-adapter/channel/input-delivery.js +1 -1
- package/lib/types/dsh-adapter/channel/job-projection.js +1 -1
- package/lib/types/dsh-adapter/channel/lifetime-resources.js +1 -1
- package/lib/types/dsh-adapter/channel/local-actions.js +1 -1
- package/lib/types/dsh-adapter/channel/mode-actions.js +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission.js +6 -6
- package/lib/types/dsh-adapter/channel/mode-roster.js +1 -1
- package/lib/types/dsh-adapter/channel/owner.js +2 -2
- package/lib/types/dsh-adapter/channel/preferences.js +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +1 -1
- package/lib/types/dsh-adapter/channel/reports.js +3 -3
- package/lib/types/dsh-adapter/channel/session-fork.js +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts +4 -4
- package/lib/types/dsh-adapter/channel/session-metadata.js +2 -2
- package/lib/types/dsh-adapter/channel/session-rewind.js +2 -2
- package/lib/types/dsh-adapter/channel/state.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/state.js +1 -1
- package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
- package/lib/types/dsh-adapter/channel-ui.js +2 -2
- package/lib/types/dsh-adapter/channel.js +9 -9
- package/lib/types/dsh-adapter/cli-registration.d.ts.map +1 -1
- package/lib/types/dsh-adapter/cli-registration.js +5 -4
- package/lib/types/dsh-adapter/command-trees.d.ts +1 -1
- package/lib/types/dsh-adapter/command-trees.js +2 -2
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts +3 -3
- package/lib/types/dsh-adapter/compat/sessionLog.js +5 -5
- package/lib/types/dsh-adapter/compat/settings.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/settings.js +15 -7
- package/lib/types/dsh-adapter/decision-guard.d.ts +3 -3
- package/lib/types/dsh-adapter/decision-guard.js +6 -6
- package/lib/types/dsh-adapter/dialogs.d.ts +1 -1
- package/lib/types/dsh-adapter/dialogs.js +7 -7
- package/lib/types/dsh-adapter/effect-ledger.d.ts +2 -2
- package/lib/types/dsh-adapter/effect-ledger.js +5 -5
- package/lib/types/dsh-adapter/extension-events.js +10 -10
- package/lib/types/dsh-adapter/extensions.d.ts +3 -3
- package/lib/types/dsh-adapter/extensions.js +3 -3
- package/lib/types/dsh-adapter/host-access.js +11 -11
- package/lib/types/dsh-adapter/ide-channel.d.ts +6 -6
- package/lib/types/dsh-adapter/ide-channel.js +6 -6
- package/lib/types/dsh-adapter/index.d.ts +18 -18
- package/lib/types/dsh-adapter/index.js +5 -5
- package/lib/types/dsh-adapter/inject-channel.d.ts +4 -4
- package/lib/types/dsh-adapter/inject-channel.js +5 -5
- package/lib/types/dsh-adapter/invariant.d.ts +1 -1
- package/lib/types/dsh-adapter/invariant.js +1 -1
- package/lib/types/dsh-adapter/message-observer.d.ts +2 -2
- package/lib/types/dsh-adapter/message-observer.js +23 -23
- package/lib/types/dsh-adapter/migrate/adapters/scan.js +1 -1
- package/lib/types/dsh-adapter/migrate/bin-path.d.ts +1 -1
- package/lib/types/dsh-adapter/migrate/bin-path.js +4 -4
- package/lib/types/dsh-adapter/migrate/picker.d.ts +1 -1
- package/lib/types/dsh-adapter/migrate/picker.js +1 -1
- package/lib/types/dsh-adapter/migrate/uuid.js +1 -1
- package/lib/types/dsh-adapter/packaged-presets.js +1 -1
- package/lib/types/dsh-adapter/plugin-host.d.ts +2 -2
- package/lib/types/dsh-adapter/plugin-host.js +32 -32
- package/lib/types/dsh-adapter/plugin-storage.d.ts +3 -3
- package/lib/types/dsh-adapter/plugin-storage.js +5 -5
- package/lib/types/dsh-adapter/plugin.d.ts +4 -4
- package/lib/types/dsh-adapter/plugin.js +89 -89
- package/lib/types/dsh-adapter/preset-resolution.d.ts +1 -1
- package/lib/types/dsh-adapter/presets.js +1 -1
- package/lib/types/dsh-adapter/promptDebug.js +1 -1
- package/lib/types/dsh-adapter/questions.d.ts +1 -1
- package/lib/types/dsh-adapter/questions.js +1 -1
- package/lib/types/dsh-adapter/renderers.js +7 -7
- package/lib/types/dsh-adapter/scenes.d.ts +1 -1
- package/lib/types/dsh-adapter/scenes.js +6 -6
- package/lib/types/dsh-adapter/settings-sections.d.ts +1 -1
- package/lib/types/dsh-adapter/settings-sections.js +5 -5
- package/lib/types/dsh-adapter/sharp.js +1 -1
- package/lib/types/dsh-adapter/shortcuts.js +9 -9
- package/lib/types/dsh-adapter/status.js +21 -21
- package/lib/types/dsh-adapter/themes.js +2 -2
- package/lib/types/dsh-adapter/toast.js +7 -7
- package/lib/types/dsh-adapter/workspaces.d.ts +1 -1
- package/lib/types/dsh-adapter/workspaces.js +6 -6
- package/lib/types/effortPrefs.d.ts +2 -2
- package/lib/types/effortPrefs.js +2 -2
- package/lib/types/force-production-react.js +1 -1
- package/lib/types/herdr.js +4 -4
- package/lib/types/homePrefs.js +1 -1
- package/lib/types/i18n.d.ts +54 -54
- package/lib/types/i18n.js +39 -39
- package/lib/types/ink/clearTerminal.d.ts +1 -1
- package/lib/types/ink/clearTerminal.js +1 -1
- package/lib/types/ink/colorize.js +1 -1
- package/lib/types/ink/components/App.d.ts +1 -1
- package/lib/types/ink/components/App.js +5 -5
- package/lib/types/ink/components/Text.d.ts +1 -1
- package/lib/types/ink/devtools.d.ts +1 -1
- package/lib/types/ink/dom.d.ts +1 -1
- package/lib/types/ink/dom.js +1 -1
- package/lib/types/ink/geometry-trace.js +4 -4
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +8 -19
- package/lib/types/ink/reconciler.d.ts +1 -1
- package/lib/types/ink/reconciler.d.ts.map +1 -1
- package/lib/types/ink/reconciler.js +6 -3
- package/lib/types/ink/render-to-screen.d.ts.map +1 -1
- package/lib/types/ink/render-to-screen.js +0 -5
- package/lib/types/ink/terminal.js +3 -3
- package/lib/types/ink/termio/osc.js +1 -1
- package/lib/types/ink/update-overflow-guard.js +2 -2
- package/lib/types/minimalMode.d.ts +2 -2
- package/lib/types/minimalMode.js +2 -2
- package/lib/types/modelGroups.d.ts +1 -1
- package/lib/types/modelGroups.js +1 -1
- package/lib/types/modelPrefs.d.ts +1 -1
- package/lib/types/modelPrefs.js +1 -1
- package/lib/types/modelRecents.d.ts +2 -2
- package/lib/types/modelRecents.js +2 -2
- package/lib/types/package-version.d.ts +3 -0
- package/lib/types/package-version.d.ts.map +1 -0
- package/lib/types/package-version.js +25 -0
- package/lib/types/presetPrefs.d.ts +1 -1
- package/lib/types/presetPrefs.js +1 -1
- package/lib/types/reload.d.ts +8 -8
- package/lib/types/reload.js +4 -4
- package/lib/types/screens/Chat.js +27 -27
- package/lib/types/screens/StatusLine.js +1 -1
- package/lib/types/screens/StatusMetrics.js +1 -1
- package/lib/types/sessionHistory.d.ts +3 -3
- package/lib/types/sessionHistory.js +7 -7
- package/lib/types/sessionModes.js +1 -1
- package/lib/types/sessionMounts.d.ts +1 -1
- package/lib/types/sessionMounts.js +1 -1
- package/lib/types/sessionPins.d.ts +1 -1
- package/lib/types/sessionPins.js +1 -1
- package/lib/types/terminal-utils/cliHighlight.d.ts +1 -1
- package/lib/types/terminal-utils/hash.d.ts +1 -1
- package/lib/types/terminal-utils/hash.js +1 -1
- package/lib/types/terminal-utils/mermaid.d.ts +1 -1
- package/lib/types/terminal-utils/syntaxTheme.js +1 -1
- package/lib/types/theme.d.ts +3 -3
- package/lib/types/theme.js +3 -3
- package/lib/types/themePrefs.d.ts +3 -3
- package/lib/types/themePrefs.js +3 -3
- package/lib/types/tips.js +4 -4
- package/lib/types/trajectory/effortIgnition.d.ts +1 -1
- package/lib/types/trajectoryPrefs.d.ts +1 -1
- package/lib/types/trajectoryPrefs.js +1 -1
- package/lib/types/ui.d.ts +1 -1
- package/lib/types/ui.js +1 -1
- package/lib/types/update.d.ts +25 -26
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +55 -73
- package/lib/types/utils/clipboard.js +1 -1
- package/lib/types/utils/credentials.js +2 -2
- package/lib/types/utils/debug.d.ts +3 -3
- package/lib/types/utils/debug.js +6 -6
- package/lib/types/utils/earlyInput.d.ts +1 -1
- package/lib/types/utils/earlyInput.js +1 -1
- package/lib/types/utils/externalEditor.js +1 -1
- package/lib/types/utils/fullscreen.d.ts +3 -3
- package/lib/types/utils/fullscreen.js +4 -4
- package/lib/types/utils/log.js +1 -1
- package/lib/types/utils/paths.d.ts +3 -3
- package/lib/types/utils/paths.js +4 -4
- package/lib/types/working-activity.js +1 -1
- package/node_modules/@askdkc/dsh-auth/dsh-plugin.json +1 -1
- package/node_modules/@askdkc/dsh-auth/lib/index.d.ts +2 -2
- package/node_modules/@askdkc/dsh-auth/lib/index.js +2 -2
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.d.ts +0 -2
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.js +0 -2
- package/node_modules/@askdkc/dsh-auth/lib/service.d.ts +1 -1
- package/node_modules/@askdkc/dsh-auth/lib/service.js +2 -2
- package/node_modules/dsh-working-activity/lib/client.js.map +1 -1
- package/node_modules/dsh-working-activity/lib/types/client/index.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/config.d.ts +2 -2
- package/node_modules/dsh-working-activity/lib/types/config.js +2 -2
- package/node_modules/dsh-working-activity/lib/types/frames.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/frames.js +1 -1
- package/node_modules/dsh-working-activity/lib/types/index.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/index.js +2 -2
- package/node_modules/dsh-working-activity/lib/types/lang.d.ts +5 -5
- package/node_modules/dsh-working-activity/lib/types/lang.js +8 -8
- package/node_modules/dsh-working-activity/lib/types/projection.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/projection.js +1 -1
- package/node_modules/dsh-working-activity/lib/types/status.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/status.js +1 -1
- package/node_modules/dsh-working-activity/src/client/index.ts +1 -1
- package/node_modules/dsh-working-activity/src/config.ts +2 -2
- package/node_modules/dsh-working-activity/src/frames.ts +1 -1
- package/node_modules/dsh-working-activity/src/index.ts +4 -4
- package/node_modules/dsh-working-activity/src/lang.ts +8 -8
- package/node_modules/dsh-working-activity/src/projection.ts +1 -1
- package/node_modules/dsh-working-activity/src/status.ts +1 -1
- package/package.json +8 -8
- package/presets/liangshen/agent.cordis.yml +1 -1
- package/presets/liangshen/custom-bash.mjs +2 -2
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* 可用。shellQuote 等小工具在此内联。
|
|
26
26
|
*
|
|
27
27
|
* 面向用户的消息走 MSG 双语表:与 TUI 的语言契约一致——
|
|
28
|
-
* `
|
|
28
|
+
* `DSH_CLI_LANG` 显式指定时从其值,否则默认英文(同 src/i18n.ts 的缺省)。
|
|
29
29
|
*/
|
|
30
30
|
import { spawn, spawnSync } from 'node:child_process'
|
|
31
31
|
import { existsSync, readFileSync, readdirSync, realpathSync, rmSync } from 'node:fs'
|
|
@@ -33,9 +33,9 @@ import { homedir } from 'node:os'
|
|
|
33
33
|
import { dirname, isAbsolute, join, resolve } from 'node:path'
|
|
34
34
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
35
35
|
|
|
36
|
-
if (process.platform === 'win32' && process.env.
|
|
36
|
+
if (process.platform === 'win32' && process.env.DSH_CLI_STANDALONE_BINARY && process.argv[2] !== 'safe') {
|
|
37
37
|
try {
|
|
38
|
-
const oldBinary = `${process.env.
|
|
38
|
+
const oldBinary = `${process.env.DSH_CLI_STANDALONE_BINARY}.old`
|
|
39
39
|
if (existsSync(oldBinary)) rmSync(oldBinary, { force: true })
|
|
40
40
|
} catch {
|
|
41
41
|
// Best effort cleanup.
|
|
@@ -133,15 +133,15 @@ const isVersionNewer = (a, b) => {
|
|
|
133
133
|
return false
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
const lang = process.env.
|
|
136
|
+
const lang = process.env.DSH_CLI_LANG === 'zh' ? 'zh' : 'en'
|
|
137
137
|
const MSG = {
|
|
138
138
|
noDsh: {
|
|
139
|
-
en: '[dsh-cli] dsh CLI not found. Install it or set
|
|
140
|
-
zh: '[dsh-cli] 未检测到 dsh CLI。可安装官方客户端,或将
|
|
139
|
+
en: '[dsh-cli] dsh CLI not found. Install it or set DSH_CLI_DSH_ROOT to a built Harness checkout:\n npm install -g @deepseek-ai/dsh',
|
|
140
|
+
zh: '[dsh-cli] 未检测到 dsh CLI。可安装官方客户端,或将 DSH_CLI_DSH_ROOT 指向已构建的 Harness 源码目录:\n npm install -g @deepseek-ai/dsh',
|
|
141
141
|
},
|
|
142
142
|
invalidDshRoot: {
|
|
143
|
-
en: root => `[dsh-cli]
|
|
144
|
-
zh: root => `[dsh-cli]
|
|
143
|
+
en: root => `[dsh-cli] DSH_CLI_DSH_ROOT must be an absolute, built DeepSeek Harness checkout: ${root}`,
|
|
144
|
+
zh: root => `[dsh-cli] DSH_CLI_DSH_ROOT 必须指向已构建的 DeepSeek Harness 源码绝对路径:${root}`,
|
|
145
145
|
},
|
|
146
146
|
noPnpm: {
|
|
147
147
|
en: '[dsh-cli] The first-time setup needs pnpm (dsh plugin delegates installs to it):\n npm install -g pnpm (or via corepack: corepack enable pnpm)',
|
|
@@ -446,7 +446,7 @@ const MSG = {
|
|
|
446
446
|
},
|
|
447
447
|
helpText: {
|
|
448
448
|
en:
|
|
449
|
-
`Usage: dsh-cli
|
|
449
|
+
`Usage: dsh-cli [command] [options] [path|url]\n\n` +
|
|
450
450
|
`Commands:\n` +
|
|
451
451
|
` update Update the ${PROFILE} profile to the latest release\n` +
|
|
452
452
|
` migrate [agent] Import conversations from claude-code/codex/omp/zcode/grok-build (--dry-run to preview)\n` +
|
|
@@ -461,7 +461,7 @@ const MSG = {
|
|
|
461
461
|
` <path|url> Open with the given workspace target\n\n` +
|
|
462
462
|
`Any other argument is forwarded to \`dsh --profile ${PROFILE}\`.`,
|
|
463
463
|
zh:
|
|
464
|
-
`用法:dsh-cli
|
|
464
|
+
`用法:dsh-cli [命令] [选项] [路径|URL]\n\n` +
|
|
465
465
|
`命令:\n` +
|
|
466
466
|
` update 将 ${PROFILE} profile 升级到最新版本\n` +
|
|
467
467
|
` migrate [agent] 迁移 claude-code/codex/omp/zcode/grok-build 的对话(--dry-run 预览)\n` +
|
|
@@ -480,7 +480,7 @@ const MSG = {
|
|
|
480
480
|
const msg = key => MSG[key][lang]
|
|
481
481
|
|
|
482
482
|
// React 开发构建会把每次渲染的 performance.measure() 堆进无界缓冲区导致
|
|
483
|
-
// 长会话 OOM——与仓库根 dsh-
|
|
483
|
+
// 长会话 OOM——与仓库根 dsh-cli.cmd 保持一致,强制 production。
|
|
484
484
|
process.env.NODE_ENV ??= 'production'
|
|
485
485
|
|
|
486
486
|
const sameDir = (a, b) => {
|
|
@@ -494,7 +494,7 @@ const sameDir = (a, b) => {
|
|
|
494
494
|
const dshHome = process.env.DSH_HOME || join(homedir(), '.dsh')
|
|
495
495
|
const profileDir = join(dshHome, 'profiles', PROFILE)
|
|
496
496
|
const profilePkgDir = join(profileDir, 'node_modules', '@askdkc', 'dsh-cli')
|
|
497
|
-
const profileBin = join(profilePkgDir, 'bin', 'dsh-
|
|
497
|
+
const profileBin = join(profilePkgDir, 'bin', 'dsh-cli.js')
|
|
498
498
|
const installedPkgPath = join(profilePkgDir, 'package.json')
|
|
499
499
|
const runningInsideProfile = sameDir(ownDir, profilePkgDir)
|
|
500
500
|
const rescueProfileDir = join(dshHome, 'profiles', RESCUE_PROFILE)
|
|
@@ -547,7 +547,7 @@ if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
|
|
|
547
547
|
}
|
|
548
548
|
// A source checkout does not put `dsh` on PATH. An explicit Harness root lets
|
|
549
549
|
// the launcher run its built CLI while keeping the caller's project cwd.
|
|
550
|
-
const dshRoot = process.env.
|
|
550
|
+
const dshRoot = process.env.DSH_CLI_DSH_ROOT
|
|
551
551
|
let dshBin
|
|
552
552
|
if (dshRoot !== undefined) {
|
|
553
553
|
const candidate = join(dshRoot, 'apps', 'cli', 'lib', 'bin.js')
|
|
@@ -638,7 +638,7 @@ const runDoctorChecks = () => {
|
|
|
638
638
|
'DEEPSEEK_API_KEY',
|
|
639
639
|
keyFromEnv ? L.keySetEnv : keyFromStore ? L.keySetStore : L.keyMissing,
|
|
640
640
|
)
|
|
641
|
-
for (const candidate of [join(homedir(), '.dsh-
|
|
641
|
+
for (const candidate of [join(homedir(), '.dsh-cli', 'cordis.yml'), join(profileDir, 'cordis.patch.yml')]) {
|
|
642
642
|
report(existsSync(candidate), 'config', `${candidate}${existsSync(candidate) ? '' : ` ${L.missing}`}`)
|
|
643
643
|
}
|
|
644
644
|
return { hardFailure, lines }
|
|
@@ -757,7 +757,7 @@ const startDshSession = (dshArgs, profile = PROFILE, env = process.env) =>
|
|
|
757
757
|
// 那个会话,dsh 会在恢复时再报一次错,正好污染最该干净的通道。其余宿主变量
|
|
758
758
|
// (PATH / DSH_HOME / 凭据…)是救援能工作的前提,照常继承。
|
|
759
759
|
// home 层补丁不在此列:它由 createRescueProfile 的干净性门禁单独把关。
|
|
760
|
-
const RESCUE_DROPPED_ENV = ['
|
|
760
|
+
const RESCUE_DROPPED_ENV = ['DSH_CLI_RESUME_SESSION', 'DSH_CLI_WORKSPACE_TARGET']
|
|
761
761
|
const rescueEnv = () => {
|
|
762
762
|
const env = { ...process.env }
|
|
763
763
|
for (const key of RESCUE_DROPPED_ENV) delete env[key]
|
|
@@ -1234,7 +1234,7 @@ if (subcommand === 'safe') {
|
|
|
1234
1234
|
// 顶层处理、两种角色同一条路径——不放进委托链。委托会把 update 交给
|
|
1235
1235
|
// profile 内的旧 bin:旧副本不认识这个词,只会当参数透传,恰好是「profile
|
|
1236
1236
|
// 落后、最需要升级」的用户永远到不了新入口。这里统一动态 import **profile
|
|
1237
|
-
// 的**编译产物(不是本副本的——
|
|
1237
|
+
// 的**编译产物(不是本副本的——DSH_CLI_NO_DELEGATE 下两者不同包,读本副本
|
|
1238
1238
|
// 会拿全局包版本误判 already-latest/half-updated);瘦壳零 lib 静态依赖的
|
|
1239
1239
|
// 迁移契约不变。profile 未初始化时先走既有自举(dsh/pnpm 预检在其中);
|
|
1240
1240
|
// 编译产物缺失或没有 cliUpdate 导出(半更新的旧版)给手工升级指引退出 1。
|
|
@@ -1282,23 +1282,23 @@ if (subcommand === 'migrate') {
|
|
|
1282
1282
|
}
|
|
1283
1283
|
|
|
1284
1284
|
// ─── 全局副本:瘦壳角色 ───────────────────────────────────────────────────────
|
|
1285
|
-
//
|
|
1285
|
+
// DSH_CLI_NO_DELEGATE=1 是测试/调试逃生口:强制走完整逻辑(verify-launcher
|
|
1286
1286
|
// 的沙箱用它直接驱动全量路径;现场排查委托链时同样可用)。
|
|
1287
|
-
if (!runningInsideProfile && ownVersion !== undefined && process.env.
|
|
1287
|
+
if (!runningInsideProfile && ownVersion !== undefined && process.env.DSH_CLI_NO_DELEGATE !== '1') {
|
|
1288
1288
|
if (!profileReady()) bootstrapProfile()
|
|
1289
1289
|
// Refuse to delegate into a profile from an older release line: the profile
|
|
1290
1290
|
// copy would launch `dsh --profile dsh-cli` against a composition built from
|
|
1291
1291
|
// this launcher's patch surface and fail inside the loader.
|
|
1292
1292
|
checkProfileAlignment(profileVersion())
|
|
1293
1293
|
// 委托 profile 内副本执行全部启动逻辑。外层代际通过
|
|
1294
|
-
//
|
|
1294
|
+
// DSH_CLI_LAUNCHER_VERSION 交代(/update 的对齐诊断沿用该契约)。
|
|
1295
1295
|
try {
|
|
1296
1296
|
readFileSync(profileBin, 'utf8')
|
|
1297
1297
|
} catch {
|
|
1298
1298
|
console.error(msg('delegateFailed')(profileBin))
|
|
1299
1299
|
process.exit(1)
|
|
1300
1300
|
}
|
|
1301
|
-
process.env.
|
|
1301
|
+
process.env.DSH_CLI_LAUNCHER_VERSION = ownVersion
|
|
1302
1302
|
const child = spawn(process.execPath, [profileBin, ...process.argv.slice(2)], {
|
|
1303
1303
|
stdio: 'inherit',
|
|
1304
1304
|
env: process.env,
|
|
@@ -1332,18 +1332,18 @@ if (!runningInsideProfile && ownVersion !== undefined && process.env.DSH_TUI_NO_
|
|
|
1332
1332
|
}
|
|
1333
1333
|
}
|
|
1334
1334
|
// 版本错位诊断与瘦壳委托路径共用同一实现(见 checkProfileAlignment)。
|
|
1335
|
-
// `!runningInsideProfile` 只在
|
|
1335
|
+
// `!runningInsideProfile` 只在 DSH_CLI_NO_DELEGATE=1 的调试口下成立,因此
|
|
1336
1336
|
// 该判定不能只留在这里——委派出去的子进程就是 profile 副本,看不到外层
|
|
1337
1337
|
// 启动器版本。
|
|
1338
1338
|
if (!runningInsideProfile) checkProfileAlignment(installedVersion)
|
|
1339
1339
|
|
|
1340
1340
|
// --resume / 工作区目标拦截(launcher 契约,见 src/sessionHistory.ts)。
|
|
1341
1341
|
const setResumeEnv = sessionId => {
|
|
1342
|
-
process.env.
|
|
1342
|
+
process.env.DSH_CLI_RESUME_SESSION = sessionId
|
|
1343
1343
|
}
|
|
1344
1344
|
const readLastResumeTarget = () => {
|
|
1345
1345
|
try {
|
|
1346
|
-
return readFileSync(join(homedir(), '.dsh-
|
|
1346
|
+
return readFileSync(join(homedir(), '.dsh-cli', 'resume.txt'), 'utf8').trim()
|
|
1347
1347
|
} catch {
|
|
1348
1348
|
// 没有历史会话可恢复——静默忽略,正常冷启动。
|
|
1349
1349
|
}
|
|
@@ -1363,19 +1363,19 @@ if (!runningInsideProfile && ownVersion !== undefined && process.env.DSH_TUI_NO_
|
|
|
1363
1363
|
if (!sessionId) sessionId = readLastResumeTarget()
|
|
1364
1364
|
if (sessionId) setResumeEnv(sessionId)
|
|
1365
1365
|
} else if (
|
|
1366
|
-
process.env.
|
|
1366
|
+
process.env.DSH_CLI_WORKSPACE_TARGET === undefined
|
|
1367
1367
|
&& !a.startsWith('-')
|
|
1368
1368
|
&& (isAbsolute(a) || /^[a-z][a-z0-9+.-]*:\/\//iu.test(a) || existsSync(resolve(a)))
|
|
1369
1369
|
) {
|
|
1370
|
-
process.env.
|
|
1370
|
+
process.env.DSH_CLI_WORKSPACE_TARGET = a
|
|
1371
1371
|
} else {
|
|
1372
1372
|
args.push(a)
|
|
1373
1373
|
}
|
|
1374
1374
|
}
|
|
1375
1375
|
|
|
1376
1376
|
// 启动:被委托场景下本副本自己的版本即对齐诊断所见的启动器代际。
|
|
1377
|
-
if (process.env.
|
|
1378
|
-
process.env.
|
|
1377
|
+
if (process.env.DSH_CLI_LAUNCHER_VERSION === undefined && ownVersion !== undefined) {
|
|
1378
|
+
process.env.DSH_CLI_LAUNCHER_VERSION = ownVersion
|
|
1379
1379
|
}
|
|
1380
1380
|
|
|
1381
1381
|
const firstArgs = args
|
package/cordis.patch.yml
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# The dsh-
|
|
1
|
+
# The dsh-cli bundle patch: the interactive terminal front door over the
|
|
2
2
|
# dsh-base layer. Applied after dsh-base's insert; rows here override base
|
|
3
3
|
# rows by id, with the profile's own cordis.patch.yml and any --patch
|
|
4
4
|
# overlays still to come.
|
|
5
5
|
#
|
|
6
6
|
# A patch replaces the targeted row's whole `config`, so each row below
|
|
7
7
|
# restates every key it owns (see the dsh-base patch for the shared
|
|
8
|
-
# defaults). The dsh-base core rows that need no dsh-
|
|
8
|
+
# defaults). The dsh-base core rows that need no dsh-cli value — tools,
|
|
9
9
|
# sandbox/approval policy, skills, goal, plan mode, workspace context,
|
|
10
10
|
# telemetry — are inherited unless this surface explicitly restates them.
|
|
11
11
|
|
|
12
12
|
# ── surface-specific values over the dsh-base layer ─────────────────────────
|
|
13
13
|
|
|
14
|
-
# Deployment persona, overridden by
|
|
14
|
+
# Deployment persona, overridden by DSH_CLI_PERSONA.
|
|
15
15
|
- id: system-prompt
|
|
16
16
|
config: !!js >-
|
|
17
|
-
({ personaPrefix: process.env.
|
|
17
|
+
({ personaPrefix: process.env.DSH_CLI_PERSONA ?? "You are a coding agent. Respond in the language of the user's request; use English when it is unclear. Do not infer the response language from instructions, quoted text, files, tool output, or the interface language." })
|
|
18
18
|
|
|
19
19
|
# The native DeepSeek adapter, pinned to the harness defaults: full thinking
|
|
20
20
|
# at max effort, key and base URL from the launching environment. The base
|
|
@@ -160,16 +160,16 @@
|
|
|
160
160
|
# Sessions live in the shared JSONL store (~/.dsh/sessions) — the same
|
|
161
161
|
# backend dsh web writes — so /resume here and the web session list see each
|
|
162
162
|
# other (#24). The row itself comes from the dsh-base layer; this override
|
|
163
|
-
# only re-points the root when
|
|
163
|
+
# only re-points the root when DSH_CLI_SESSION_ROOT is set (test isolation).
|
|
164
164
|
- id: session-persistence-jsonl
|
|
165
165
|
config:
|
|
166
|
-
root: !!js process.env.
|
|
166
|
+
root: !!js process.env.DSH_CLI_SESSION_ROOT ?? dshHomePath('sessions')
|
|
167
167
|
|
|
168
|
-
# ── dsh-
|
|
168
|
+
# ── dsh-cli rows ────────────────────────────────────────────────────────────
|
|
169
169
|
|
|
170
170
|
# The `user-interaction` service row comes from the dsh-base bundle layer
|
|
171
171
|
# (mounted before this layer); do not insert it again — the include patch
|
|
172
|
-
# semantics would create a duplicate row. dsh-
|
|
172
|
+
# semantics would create a duplicate row. dsh-cli defensively creates the
|
|
173
173
|
# service on its own context when no composition provides it (bare
|
|
174
174
|
# `dsh --config cordis.yml` boots), then mounts the model-facing
|
|
175
175
|
# ask_user_question tool. On legacy hosts it registers the TUI provider on
|
|
@@ -183,21 +183,21 @@
|
|
|
183
183
|
#
|
|
184
184
|
# These rows own host-plane services that the official web-app bundle may
|
|
185
185
|
# already mount. Loader entry ids are process-global, so these
|
|
186
|
-
# rows use dsh-
|
|
186
|
+
# rows use dsh-cli-* scoped ids and self-disable when an enabled row with
|
|
187
187
|
# the official id/name is already present in the tree. The disabled check
|
|
188
188
|
# is evaluated during the same include update that inserts every row, so
|
|
189
189
|
# it sees the web-app rows regardless of their activation state.
|
|
190
|
-
- id: dsh-
|
|
190
|
+
- id: dsh-cli-storage
|
|
191
191
|
name: '@deepseek-ai/dsh-storage'
|
|
192
192
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'storage' && entry.options.name === '@deepseek-ai/dsh-storage' && !entry.disabled)"
|
|
193
193
|
|
|
194
|
-
- id: dsh-
|
|
194
|
+
- id: dsh-cli-storage-json
|
|
195
195
|
name: '@deepseek-ai/dsh-storage-json'
|
|
196
196
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'storage-json' && entry.options.name === '@deepseek-ai/dsh-storage-json' && !entry.disabled)"
|
|
197
197
|
config:
|
|
198
198
|
root: !!js dshHomePath('storages')
|
|
199
199
|
|
|
200
|
-
- id: dsh-
|
|
200
|
+
- id: dsh-cli-storage-domain
|
|
201
201
|
name: '@deepseek-ai/dsh-storage-domain'
|
|
202
202
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'storage-domain' && entry.options.name === '@deepseek-ai/dsh-storage-domain' && !entry.disabled)"
|
|
203
203
|
config:
|
|
@@ -205,33 +205,33 @@
|
|
|
205
205
|
|
|
206
206
|
# Scoped services yield to active official rows in mixed profiles.
|
|
207
207
|
|
|
208
|
-
- id: dsh-
|
|
208
|
+
- id: dsh-cli-workspace
|
|
209
209
|
name: '@deepseek-ai/dsh-workspace'
|
|
210
210
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'workspace' && entry.options.name === '@deepseek-ai/dsh-workspace' && !entry.disabled)"
|
|
211
211
|
|
|
212
212
|
# Delegation settings yield to the official row in mixed profiles.
|
|
213
|
-
- id: dsh-
|
|
213
|
+
- id: dsh-cli-subagent-model-selection-settings
|
|
214
214
|
name: '@deepseek-ai/dsh-tool-subagent/model-selection-settings'
|
|
215
215
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'subagent-model-selection-settings' && entry.options.name === '@deepseek-ai/dsh-tool-subagent/model-selection-settings' && !entry.disabled)"
|
|
216
216
|
|
|
217
217
|
# Generic terminal workspace registry. Optional plugins add providers;
|
|
218
218
|
# the TUI itself always supplies LOCAL and has no provider-specific code.
|
|
219
|
-
- id: dsh-
|
|
219
|
+
- id: dsh-cli-workspaces
|
|
220
220
|
name: '@askdkc/dsh-cli/workspaces'
|
|
221
221
|
|
|
222
222
|
# Optional plugins contribute nested slash-command completion here;
|
|
223
223
|
# execution and durable command events remain owned by dsh-commands.
|
|
224
|
-
- id: dsh-
|
|
224
|
+
- id: dsh-cli-command-trees
|
|
225
225
|
name: '@askdkc/dsh-cli/command-trees'
|
|
226
226
|
# Optional plugins declare editable settings sections here (issue #165);
|
|
227
227
|
# storage, validation and writes remain owned by the dsh settings service.
|
|
228
|
-
- id: dsh-
|
|
228
|
+
- id: dsh-cli-settings-sections
|
|
229
229
|
name: '@askdkc/dsh-cli/settings-sections'
|
|
230
230
|
|
|
231
231
|
# Optional plugins register full-screen scenes (trajectory-style whole-
|
|
232
232
|
# terminal views) here and open them from their own command handlers;
|
|
233
233
|
# rendering and input ownership remain owned by the TUI's Chat screen.
|
|
234
|
-
- id: dsh-
|
|
234
|
+
- id: dsh-cli-scenes
|
|
235
235
|
name: '@askdkc/dsh-cli/scenes'
|
|
236
236
|
|
|
237
237
|
# Plugin-interop anchor (Community Consensus v0.15): the unified grant
|
|
@@ -240,7 +240,7 @@
|
|
|
240
240
|
# ledger) mount off THIS row's apply, so the patch surface changes only
|
|
241
241
|
# once for the whole alignment. Mounted ahead of the extensions row and
|
|
242
242
|
# any third-party plugin row.
|
|
243
|
-
- id: dsh-
|
|
243
|
+
- id: dsh-cli-plugin-host
|
|
244
244
|
name: '@askdkc/dsh-cli/plugin-host'
|
|
245
245
|
|
|
246
246
|
# Plugin-facing UI seams (the pi-style extension surface): managed
|
|
@@ -249,11 +249,11 @@
|
|
|
249
249
|
# decision events (tui/input, tui/rewind-prompt, tui/session-switch,
|
|
250
250
|
# tui/compact, …) are fired by the channel on the cordis bus directly
|
|
251
251
|
# and need no row.
|
|
252
|
-
- id: dsh-
|
|
252
|
+
- id: dsh-cli-extensions
|
|
253
253
|
name: '@askdkc/dsh-cli/extensions'
|
|
254
254
|
|
|
255
255
|
# Current declarative registry. Web may already own this seat.
|
|
256
|
-
- id: dsh-
|
|
256
|
+
- id: dsh-cli-agent-preset-registry
|
|
257
257
|
name: '@deepseek-ai/dsh-agent-preset-registry'
|
|
258
258
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'agent-preset-registry' && entry.options.name === '@deepseek-ai/dsh-agent-preset-registry' && !entry.disabled)"
|
|
259
259
|
config:
|
|
@@ -263,7 +263,7 @@
|
|
|
263
263
|
# waits on (dynamicCordisRunner/cordisInspect); dsh-base carries no such
|
|
264
264
|
# row — the official web app inserts it the same way, so this copy yields
|
|
265
265
|
# to it when it is already present.
|
|
266
|
-
- id: dsh-
|
|
266
|
+
- id: dsh-cli-cordis-host-runner
|
|
267
267
|
name: '@deepseek-ai/dsh-cordis-host-runner'
|
|
268
268
|
disabled: !!js "[...ctx.loader.entries()].some(entry => entry.options.id === 'cordis-host-runner' && entry.options.name === '@deepseek-ai/dsh-cordis-host-runner' && !entry.disabled)"
|
|
269
269
|
|
|
@@ -273,21 +273,21 @@
|
|
|
273
273
|
# the ctx.dshAuth service this row provides. Entry-level inject only —
|
|
274
274
|
# the plugin module's own inject is empty so a stale patch cannot
|
|
275
275
|
# deadlock a composition lacking these services (#183 pattern).
|
|
276
|
-
- id: dsh-
|
|
276
|
+
- id: dsh-cli-auth
|
|
277
277
|
name: '@askdkc/dsh-cli/oauth'
|
|
278
278
|
inject: [llm, commands]
|
|
279
279
|
|
|
280
280
|
# The interactive front door. The plugin creates/resumes its agent at
|
|
281
281
|
# runtime, seeds the startup status line, and disposes the whole app tree
|
|
282
|
-
# (exiting the process) when the TUI unmounts. `dsh-
|
|
283
|
-
# feeds the session id through
|
|
282
|
+
# (exiting the process) when the TUI unmounts. `dsh-cli --resume`
|
|
283
|
+
# feeds the session id through DSH_CLI_RESUME_SESSION (see
|
|
284
284
|
# src/sessionHistory.ts for the launcher contract).
|
|
285
|
-
- id: dsh-
|
|
285
|
+
- id: dsh-cli
|
|
286
286
|
name: '@askdkc/dsh-cli'
|
|
287
287
|
# The entry-level dependency augments the plugin's `agents` inject and
|
|
288
288
|
# prevents startup Session creation from racing WorkspaceRegistry init.
|
|
289
289
|
inject: [workspaceRegistry, agents, tuiWorkspaces, tuiScenes, tuiDialogs, tuiStatus, tuiShortcuts, tuiRenderers, tuiThemes]
|
|
290
|
-
# `tuiWorkspaces`/`tuiScenes` (and the dsh-
|
|
290
|
+
# `tuiWorkspaces`/`tuiScenes` (and the dsh-cli-extensions services,
|
|
291
291
|
# including `tuiThemes`)
|
|
292
292
|
# live in the entry-level inject ONLY as an ordering (and reload-rebind)
|
|
293
293
|
# guarantee alongside their service rows
|
|
@@ -337,12 +337,12 @@
|
|
|
337
337
|
# plan: false
|
|
338
338
|
# sandbox: danger-full-access
|
|
339
339
|
# approval: never
|
|
340
|
-
# Static preset choice (
|
|
341
|
-
# persisted `/preset` preference (~/.dsh-
|
|
340
|
+
# Static preset choice (DSH_CLI_PRESET overrides): wins over the
|
|
341
|
+
# persisted `/preset` preference (~/.dsh-cli/agent-preset.json), which
|
|
342
342
|
# wins over the roster default (standard).
|
|
343
|
-
preset: !!js process.env.
|
|
344
|
-
workspace: !!js process.env.
|
|
345
|
-
sessionId: !!js process.env.
|
|
343
|
+
preset: !!js process.env.DSH_CLI_PRESET ?? undefined
|
|
344
|
+
workspace: !!js process.env.DSH_CLI_WORKSPACE_TARGET ?? undefined
|
|
345
|
+
sessionId: !!js process.env.DSH_CLI_RESUME_SESSION ?? undefined
|
|
346
346
|
|
|
347
347
|
# Live working-line data source (thinking copy / running tool / turn
|
|
348
348
|
# summary). Mounted through dsh-cli's own
|
package/cordis.yml
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# dsh-
|
|
1
|
+
# dsh-cli interactive front door over the agent-spine bundle.
|
|
2
2
|
# Run with: dsh --config cordis.yml (或 npm 安装后走 dsh plugin 机制)
|
|
3
3
|
# Requires DEEPSEEK_API_KEY; a terminal TTY is mandatory.
|
|
4
4
|
|
|
5
5
|
# The user-interaction service: hosts `ctx.userQuestions`, the seam behind
|
|
6
|
-
# the model-facing ask_user_question tool. dsh-
|
|
6
|
+
# the model-facing ask_user_question tool. dsh-cli uses the legacy provider
|
|
7
7
|
# API when present, otherwise the scoped user-questions/request waterfall;
|
|
8
8
|
# the service must live at the root so the agent loop's tool execution can
|
|
9
9
|
# reach it.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
# The approval service (issue #49): the harness's sandbox escalation seam
|
|
14
14
|
# (`sandbox_permissions: danger-full-access`) asks ApprovalService.request(),
|
|
15
|
-
# which dispatches an `approval/request` waterfall; dsh-
|
|
15
|
+
# which dispatches an `approval/request` waterfall; dsh-cli registers itself
|
|
16
16
|
# as the interactive answerer (ApprovalStore + approval panel). Without this
|
|
17
17
|
# row the waterfall has no service and fail-closes to 'unavailable'. Policy
|
|
18
18
|
# expression mirrors the profile cordis.patch.yml row exactly (verified by
|
|
@@ -24,35 +24,35 @@
|
|
|
24
24
|
config:
|
|
25
25
|
policy: !!js "process.platform === 'win32' ? 'never' : ((process.env.DSH_PERMISSION_MODE ?? 'workspace-write') === 'danger-full-access' ? 'never' : 'ask')"
|
|
26
26
|
|
|
27
|
-
- id: dsh-
|
|
27
|
+
- id: dsh-cli-workspaces
|
|
28
28
|
name: '@askdkc/dsh-cli/workspaces'
|
|
29
29
|
|
|
30
|
-
- id: dsh-
|
|
30
|
+
- id: dsh-cli-command-trees
|
|
31
31
|
name: '@askdkc/dsh-cli/command-trees'
|
|
32
32
|
|
|
33
33
|
# Optional plugins declare editable settings sections here (issue #165);
|
|
34
34
|
# storage, validation and writes remain owned by the dsh settings service.
|
|
35
|
-
- id: dsh-
|
|
35
|
+
- id: dsh-cli-settings-sections
|
|
36
36
|
name: '@askdkc/dsh-cli/settings-sections'
|
|
37
37
|
|
|
38
|
-
- id: dsh-
|
|
38
|
+
- id: dsh-cli-scenes
|
|
39
39
|
name: '@askdkc/dsh-cli/scenes'
|
|
40
40
|
|
|
41
41
|
# Plugin-interop anchor (v0.15): unified grant store, runtime generation
|
|
42
42
|
# id, Host Descriptor; later contract surfaces mount off this row's apply.
|
|
43
|
-
- id: dsh-
|
|
43
|
+
- id: dsh-cli-plugin-host
|
|
44
44
|
name: '@askdkc/dsh-cli/plugin-host'
|
|
45
45
|
|
|
46
46
|
# Plugin-facing UI seams: managed dialogs, status-line contributions,
|
|
47
47
|
# keyboard shortcuts, custom session-entry renderers, and runtime themes
|
|
48
48
|
# (decision events are fired by the channel and need no row).
|
|
49
|
-
- id: dsh-
|
|
49
|
+
- id: dsh-cli-extensions
|
|
50
50
|
name: '@askdkc/dsh-cli/extensions'
|
|
51
51
|
|
|
52
|
-
- id: dsh-
|
|
52
|
+
- id: dsh-cli
|
|
53
53
|
name: '@askdkc/dsh-cli'
|
|
54
54
|
# Entry-level only: orders/rebinds optional extension services on reload;
|
|
55
|
-
# dsh-
|
|
55
|
+
# dsh-cli does not hard-inject them at code level, so stale profiles degrade
|
|
56
56
|
# to static themes and inert extension surfaces instead of deadlocking boot.
|
|
57
57
|
inject: [agents, tuiWorkspaces, tuiScenes, tuiDialogs, tuiStatus, tuiShortcuts, tuiRenderers, tuiThemes]
|
|
58
58
|
config:
|
|
@@ -89,8 +89,8 @@
|
|
|
89
89
|
# approval: never
|
|
90
90
|
# feeds the chosen session id through this env var (see
|
|
91
91
|
# src/sessionHistory.ts for the launcher contract).
|
|
92
|
-
sessionId: !!js process.env.
|
|
93
|
-
workspace: !!js process.env.
|
|
92
|
+
sessionId: !!js process.env.DSH_CLI_RESUME_SESSION ?? undefined
|
|
93
|
+
workspace: !!js process.env.DSH_CLI_WORKSPACE_TARGET ?? undefined
|
|
94
94
|
|
|
95
95
|
# The DeepSeek adapter. Shipped default: full thinking at max effort.
|
|
96
96
|
# rc.6 schema key is `apiKeyEnv` (a credential-ref env var NAME, default
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
- id: agent-spine
|
|
173
173
|
name: '@deepseek-ai/dsh-agent-spine-demo'
|
|
174
174
|
config:
|
|
175
|
-
persona: !!js process.env.
|
|
175
|
+
persona: !!js process.env.DSH_CLI_PERSONA ?? "You are a coding agent. Respond in the language of the user's request; use English when it is unclear. Do not infer the response language from instructions, quoted text, files, tool output, or the interface language."
|
|
176
176
|
# Workspace context (AGENTS.md injection) at the standard 64KB cap;
|
|
177
177
|
# task tools stay at their DSH defaults (on).
|
|
178
178
|
workspaceContext:
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
- id: sessions
|
|
228
228
|
name: '@deepseek-ai/dsh-session-persistence-jsonl'
|
|
229
229
|
config:
|
|
230
|
-
root: !!js process.env.
|
|
230
|
+
root: !!js process.env.DSH_CLI_SESSION_ROOT ?? (process.env.USERPROFILE ?? process.env.HOME) + '/.dsh-cli/sessions'
|
|
231
231
|
|
|
232
232
|
# Read-only session lineage — the subagent service's /agents listing reads it.
|
|
233
233
|
- id: session-query
|
|
@@ -247,5 +247,5 @@
|
|
|
247
247
|
# would never make manual /compact useful. Default 20% (200k tokens)
|
|
248
248
|
# with a 5% retained tail; both are overridable for tests and must keep
|
|
249
249
|
# retainRatio < thresholdRatio (BasicCompactConfig validates this).
|
|
250
|
-
thresholdRatio: !!js parseFloat(process.env.
|
|
251
|
-
retainRatio: !!js parseFloat(process.env.
|
|
250
|
+
thresholdRatio: !!js parseFloat(process.env.DSH_CLI_COMPACT_RATIO ?? '0.2')
|
|
251
|
+
retainRatio: !!js parseFloat(process.env.DSH_CLI_COMPACT_RETAIN ?? '0.05')
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persisted working-activity indicator preference, mirroring the pi
|
|
3
3
|
* working-activity extension's `~/.pi/agent/working-activity.json`
|
|
4
|
-
* (`frames` key). dsh-
|
|
5
|
-
* `~/.dsh-
|
|
4
|
+
* (`frames` key). dsh-cli keeps its own copy at
|
|
5
|
+
* `~/.dsh-cli/working-activity.json` so the `/activity` choice survives
|
|
6
6
|
* restarts. The file is best-effort: a missing or corrupt file (or an
|
|
7
7
|
* unknown preset left behind by an older version) just falls back to the
|
|
8
8
|
* default preset.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persisted working-activity indicator preference, mirroring the pi
|
|
3
3
|
* working-activity extension's `~/.pi/agent/working-activity.json`
|
|
4
|
-
* (`frames` key). dsh-
|
|
5
|
-
* `~/.dsh-
|
|
4
|
+
* (`frames` key). dsh-cli keeps its own copy at
|
|
5
|
+
* `~/.dsh-cli/working-activity.json` so the `/activity` choice survives
|
|
6
6
|
* restarts. The file is best-effort: a missing or corrupt file (or an
|
|
7
7
|
* unknown preset left behind by an older version) just falls back to the
|
|
8
8
|
* default preset.
|
|
@@ -14,7 +14,7 @@ import { CHANNEL_SPLIT_TOKEN } from './internal-token.js';
|
|
|
14
14
|
/** Build the host-internal action surface over one live Channel. */
|
|
15
15
|
export function createChannelActions(channel, token) {
|
|
16
16
|
if (token !== CHANNEL_SPLIT_TOKEN) {
|
|
17
|
-
throw new Error('dsh-
|
|
17
|
+
throw new Error('dsh-cli: Channel split actions require the internal host token');
|
|
18
18
|
}
|
|
19
19
|
return Object.freeze({
|
|
20
20
|
submit: text => channel.submit(text),
|
|
@@ -38,7 +38,7 @@ export function createChannelConsumer(provider, options = {}) {
|
|
|
38
38
|
}
|
|
39
39
|
const hasNewError = continuityErrors.length > errorCountBefore;
|
|
40
40
|
if (hasNewError && failClosed) {
|
|
41
|
-
throw new Error(`dsh-
|
|
41
|
+
throw new Error(`dsh-cli: Channel continuity violation: ${continuityErrors[continuityErrors.length - 1]}`);
|
|
42
42
|
}
|
|
43
43
|
// When not fail-closed, keep advancing `last` to the snapshot that was
|
|
44
44
|
// actually observed so later continuity messages describe the real
|
|
@@ -33,7 +33,7 @@ function projectSettingsSection(section) {
|
|
|
33
33
|
/** Build the host-internal plugin-facing surface over one live Channel. */
|
|
34
34
|
export function createChannelPlugins(channel, token) {
|
|
35
35
|
if (token !== CHANNEL_SPLIT_TOKEN) {
|
|
36
|
-
throw new Error('dsh-
|
|
36
|
+
throw new Error('dsh-cli: Channel split plugins require the internal host token');
|
|
37
37
|
}
|
|
38
38
|
return Object.freeze({
|
|
39
39
|
async runExternalCommand(name, rawInput) {
|
|
@@ -59,7 +59,7 @@ export const KNOWN_DSH_EVENT_TYPES = new Set([
|
|
|
59
59
|
// here so the conformance sweep over that file stays total; it folds to no
|
|
60
60
|
// row like every other non-transcript type.
|
|
61
61
|
'session/not-found',
|
|
62
|
-
// Known dsh-
|
|
62
|
+
// Known dsh-cli / ecosystem plugin event types (exact, not prefix-based)
|
|
63
63
|
'session/created',
|
|
64
64
|
'session/disposed',
|
|
65
65
|
'session/flush',
|
|
@@ -112,8 +112,8 @@ export const KNOWN_DSH_EVENT_TYPES = new Set([
|
|
|
112
112
|
'tool/ptc-dispatch',
|
|
113
113
|
'tool/ptc-dispatch-start',
|
|
114
114
|
'web/deepseek-search-llm-request',
|
|
115
|
-
'dsh-
|
|
116
|
-
'dsh-
|
|
115
|
+
'dsh-cli/btw',
|
|
116
|
+
'dsh-cli/recap',
|
|
117
117
|
'dsh-working-activity/config',
|
|
118
118
|
'dsh-working-activity/status',
|
|
119
119
|
'activity/status',
|
|
@@ -13,7 +13,7 @@ import { CHANNEL_SPLIT_TOKEN } from './internal-token.js';
|
|
|
13
13
|
/** Build the host-internal transcript surface over one live Channel. */
|
|
14
14
|
export function createChannelTranscript(channel, token) {
|
|
15
15
|
if (token !== CHANNEL_SPLIT_TOKEN) {
|
|
16
|
-
throw new Error('dsh-
|
|
16
|
+
throw new Error('dsh-cli: Channel split transcript requires the internal host token');
|
|
17
17
|
}
|
|
18
18
|
return Object.freeze({
|
|
19
19
|
rows: () => projectChannelRows(channel.rows),
|
|
@@ -18,7 +18,7 @@ export function createChannelUiLease(isCurrent) {
|
|
|
18
18
|
return {
|
|
19
19
|
assertActive() {
|
|
20
20
|
if (!active || !isCurrent())
|
|
21
|
-
throw new Error('dsh-
|
|
21
|
+
throw new Error('dsh-cli: Channel UI lifetime has ended');
|
|
22
22
|
},
|
|
23
23
|
own(dispose) {
|
|
24
24
|
let released = false;
|
|
@@ -48,7 +48,7 @@ export function createChannelUiLease(isCurrent) {
|
|
|
48
48
|
failures.push(error);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
throwCleanupFailures(failures, 'dsh-
|
|
51
|
+
throwCleanupFailures(failures, 'dsh-cli: Channel UI cleanup failed');
|
|
52
52
|
},
|
|
53
53
|
};
|
|
54
54
|
}
|
|
@@ -71,7 +71,7 @@ export function createChannelUi(channel, mode, lease) {
|
|
|
71
71
|
for (const key of Object.keys(effects)) {
|
|
72
72
|
const fn = target[key];
|
|
73
73
|
if (typeof fn !== 'function')
|
|
74
|
-
throw new Error(`dsh-
|
|
74
|
+
throw new Error(`dsh-cli: missing Channel handle method ${key}`);
|
|
75
75
|
result[key] = (...args) => {
|
|
76
76
|
check(effects[key]);
|
|
77
77
|
return settle(Reflect.apply(fn, target, args));
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* P2 callers normally obtain this from `KernelRuntime.facade()`, which backs
|
|
5
5
|
* the descriptor port with the unified kernel lifecycle evidence.
|
|
6
6
|
* `facadeFromLegacy` remains only as a long-term compatibility fallback for
|
|
7
|
-
* bare/test compositions (outside P6 removal scope; owner: dsh-
|
|
7
|
+
* bare/test compositions (outside P6 removal scope; owner: dsh-cli adapter).
|
|
8
8
|
* Hard rules:
|
|
9
9
|
* - It performs no business logic, no protocol translation, no capability
|
|
10
10
|
* detection, no registry, and stores no mutable host state.
|