dsh-oc-tui 0.2.0 → 0.3.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.
Files changed (50) hide show
  1. package/README.md +21 -563
  2. package/bin/mcp-sse-bridge.mjs +499 -499
  3. package/docs/assets/conversation.png +0 -0
  4. package/docs/assets/cover.png +0 -0
  5. package/docs/assets/home.png +0 -0
  6. package/docs/assets/settings.png +0 -0
  7. package/docs/dsh-std-/346/216/245/345/205/245/350/257/264/346/230/216.md +566 -0
  8. package/docs/user-guide.md +616 -0
  9. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +607 -593
  10. package/dsh-plugin.json +69 -69
  11. package/lib/boot-block.js +129 -0
  12. package/lib/diagnostics.js +162 -120
  13. package/lib/dsh-version.js +161 -0
  14. package/lib/git-branch.js +157 -157
  15. package/lib/i18n.js +283 -283
  16. package/lib/image.js +2 -1
  17. package/lib/index.js +5183 -4812
  18. package/lib/locales/ar.js +670 -635
  19. package/lib/locales/de.js +639 -604
  20. package/lib/locales/en.js +35 -0
  21. package/lib/locales/es.js +639 -604
  22. package/lib/locales/fr.js +639 -604
  23. package/lib/locales/id.js +641 -606
  24. package/lib/locales/it.js +639 -604
  25. package/lib/locales/ja.js +639 -604
  26. package/lib/locales/ko.js +639 -604
  27. package/lib/locales/nl.js +639 -604
  28. package/lib/locales/pl.js +653 -618
  29. package/lib/locales/pt-BR.js +639 -604
  30. package/lib/locales/ru.js +653 -618
  31. package/lib/locales/tr.js +639 -604
  32. package/lib/locales/vi.js +641 -606
  33. package/lib/locales/zh-CN.js +640 -605
  34. package/lib/locales/zh-TW.js +640 -605
  35. package/lib/markdown.js +101 -27
  36. package/lib/mcp-monitor.js +189 -0
  37. package/lib/mcp-skill.js +93 -93
  38. package/lib/mcp.js +865 -838
  39. package/lib/model-route.js +66 -0
  40. package/lib/providers.js +712 -712
  41. package/lib/screenshot.js +140 -0
  42. package/lib/splash-opencode.js +29 -26
  43. package/lib/startup.js +66 -48
  44. package/lib/term.js +53 -11
  45. package/lib/themes.js +101 -0
  46. package/lib/ui.js +685 -443
  47. package/lib/updates.js +5 -2
  48. package/lib/web-settings.js +52 -21
  49. package/package.json +160 -146
  50. package/skills/mcp-import/SKILL.md +216 -216
package/lib/updates.js CHANGED
@@ -12,7 +12,7 @@ import { homedir } from 'node:os'
12
12
  import { fileURLToPath } from 'node:url'
13
13
  import { stripAnsi } from './util.js'
14
14
  import { SETTINGS_MENU, resolveTuiSetting } from './web-settings.js'
15
- import { t, valueChoices } from './i18n.js'
15
+ import { t, tv, valueChoices } from './i18n.js'
16
16
 
17
17
  export const DSH_PACKAGE = '@deepseek-ai/dsh'
18
18
  export const TUI_PACKAGE = 'dsh-oc-tui'
@@ -899,7 +899,10 @@ export function buildUpdateItems(state) {
899
899
  value: startupCheck,
900
900
  // The stored id is what gets committed; the row shows its catalog label
901
901
  // (the same valueLabel convention lib/web-settings.js uses for choice rows).
902
- valueLabel: t(startupCheck === 'off' ? 'value.off' : 'value.on'),
902
+ // `tv()` and not `t()`: `on`/`off` are shared `common.*` values, and a
903
+ // literal `value.on` key has no catalog entry — `t()` would then paint the
904
+ // key itself, which is exactly how this row used to read "value.on".
905
+ valueLabel: tv(startupCheck === 'off' ? 'off' : 'on'),
903
906
  options: valueChoices(['on', 'off']),
904
907
  revision: state.startupCheckRevision ?? 0,
905
908
  disabled: state.startupCheck === null || state.settingsWritable === false,
@@ -2,6 +2,7 @@ import z from '@deepseek-ai/schemastery'
2
2
  import { dirname } from 'node:path'
3
3
  import { collectServers } from './mcp.js'
4
4
  import { LOCALES, isLocaleId, localeInfo, resolveLocale, setLocale, t, tn, tv, valueChoices } from './i18n.js'
5
+ import { DEFAULT_THEME, THEME_IDS, themeId } from './themes.js'
5
6
  import {
6
7
  ACCOUNT_ROUTE,
7
8
  URL_FAMILIES,
@@ -32,8 +33,10 @@ export const TUI_SETTINGS = [
32
33
  // setting must not drag the other's language with it. `system` follows the
33
34
  // POSIX/Windows language variables (see lib/i18n.js detectSystemLocale).
34
35
  { namespace: 'tui-locale', field: 'preference', configField: 'locale' },
36
+ { namespace: 'tui-theme', field: 'preference', configField: 'theme' },
35
37
  { namespace: 'ui-conversation', field: 'busyEnter', configField: 'busyEnter' },
36
38
  { namespace: 'tui-updates', field: 'startupCheck', configField: 'startupCheck' },
39
+ { namespace: 'tui-screenshot', field: 'directory', configField: 'screenshotDirectory' },
37
40
  // TUI-owned graphics pipeline. `graphics: off` disables protocol rendering
38
41
  // entirely; `imageFallback` decides what pixels become on terminals with no
39
42
  // graphics protocol; `mermaid` gates the provider chain (local mmdc and/or
@@ -42,6 +45,10 @@ export const TUI_SETTINGS = [
42
45
  { namespace: 'tui-graphics', field: 'imageFallback', configField: 'imageFallback' },
43
46
  { namespace: 'tui-graphics', field: 'imageMaxRows', configField: 'imageMaxRows' },
44
47
  { namespace: 'tui-graphics', field: 'mermaid', configField: 'mermaid' },
48
+ // Developer options. `contextDetails: hide` drops the harness's own
49
+ // plumbing boxes (runtime-context snapshot, system prompt, system
50
+ // reminders) from the transcript; they are collapsible either way.
51
+ { namespace: 'tui-dev', field: 'contextDetails', configField: 'contextDetails' },
45
52
  ]
46
53
 
47
54
  const WEB_SETTING_SCHEMAS = [
@@ -54,12 +61,15 @@ const WEB_SETTING_SCHEMAS = [
54
61
  ['ui-conversation', z.object({ busyEnter: z.union(['queue', 'steer']).default('queue') })],
55
62
  ['tui-updates', z.object({ startupCheck: z.union(['on', 'off']).default('on') })],
56
63
  ['tui-locale', z.object({ preference: z.string().default('system') })],
64
+ ['tui-theme', z.object({ preference: z.union(THEME_IDS).default(DEFAULT_THEME) })],
65
+ ['tui-screenshot', z.object({ directory: z.string().default('') })],
57
66
  ['tui-graphics', z.object({
58
67
  graphics: z.union(['auto', 'off']).default('auto'),
59
68
  imageFallback: z.union(['halfblock', 'chip']).default('halfblock'),
60
69
  imageMaxRows: z.union(['10', '15', '20', '28', '40']).default('20'),
61
70
  mermaid: z.union(['auto', 'local', 'off']).default('auto'),
62
71
  })],
72
+ ['tui-dev', z.object({ contextDetails: z.union(['show', 'hide']).default('show') })],
63
73
  ]
64
74
 
65
75
  // The settings dialog's left menu: Main keeps the general settings, Model
@@ -99,16 +109,17 @@ function effortOptions(models, selectedModel) {
99
109
  return undefined
100
110
  }
101
111
 
112
+ function hasConfigForms(settings) {
113
+ try { return Boolean(settings?.ownerContext?.configEditor) } catch { return false }
114
+ }
115
+
102
116
  export function installWebSettingSchemas(ctx) {
103
117
  const settings = ctx.get('settings')
104
118
  if (!settings) return
105
- // dsh 0.2.0 replaced the namespace registry with per-entry Config forms
106
- // (`SettingsForms`): the service no longer exposes `register`, and the
107
- // namespaces that survive there are the ones whose host rows declare
108
- // volatile Config fields. One build serves both hosts — and a settings
109
- // failure must never take the TUI down, so registration is guarded as a
110
- // whole rather than trusted to succeed.
111
- if (typeof settings.register !== 'function') return
119
+ // Some Config-form hosts also expose a legacy register() compatibility API,
120
+ // while update() still writes only plugin entries. Do not create namespaces
121
+ // that their settings page cannot update.
122
+ if (typeof settings.register !== 'function' || hasConfigForms(settings)) return
112
123
  try {
113
124
  const registered = new Set(settings.describe().map((entry) => String(entry.ns)))
114
125
  for (const [namespace, schema] of WEB_SETTING_SCHEMAS) {
@@ -134,7 +145,7 @@ export async function loadWebSettings(ctx) {
134
145
  const add = (ns, field, label, options, extra = {}) => {
135
146
  const owned = TUI_SETTINGS.some((entry) => entry.namespace === ns && entry.field === field)
136
147
  const target = owned ? resolveTuiSetting(ctx, descriptors, ns, field) : undefined
137
- const descriptor = target?.descriptor ?? descriptors.get(ns)
148
+ const descriptor = owned ? target?.descriptor : descriptors.get(ns)
138
149
  if (!descriptor || typeof descriptor.value !== 'object' || descriptor.value === null) return
139
150
  const raw = target ? target.value : descriptor.value[field]
140
151
  const stored = raw === undefined ? 'system' : String(raw)
@@ -171,7 +182,18 @@ export async function loadWebSettings(ctx) {
171
182
  valueLabel: describeLocale(normalizePreference(locale.value)),
172
183
  })
173
184
  }
185
+ const theme = resolveTuiSetting(ctx, descriptors, 'tui-theme', 'preference')
186
+ if (theme) {
187
+ const selected = themeId(theme.value)
188
+ add('tui-theme', 'preference', t('settings.theme'), THEME_IDS.map((id) => ({
189
+ value: id, label: t('theme.' + id),
190
+ })), { value: selected, valueLabel: t('theme.' + selected) })
191
+ }
174
192
  add('ui-conversation', 'busyEnter', t('settings.busyEnter'), ['queue', 'steer'], { translateValues: true })
193
+ const screenshotDirectory = resolveTuiSetting(ctx, descriptors, 'tui-screenshot', 'directory')?.value
194
+ add('tui-screenshot', 'directory', t('screenshot.directory'), undefined, {
195
+ valueLabel: screenshotDirectory || tv('system'),
196
+ })
175
197
  const agentPresets = ctx.get('agentPresets')
176
198
  let presetOptions
177
199
  if (agentPresets) {
@@ -206,6 +228,10 @@ export async function loadWebSettings(ctx) {
206
228
  let settingsDocumentPath
207
229
  try { settingsDocumentPath = settings.documentPath } catch { /* no configuration editor */ }
208
230
  if (settingsDocumentPath) items.push({ label: t('settings.settingsFile'), value: settingsDocumentPath, disabled: true })
231
+ // Last, and deliberately small: the switches here change what the transcript
232
+ // draws, not how the session behaves.
233
+ items.push({ kind: 'header', label: t('settings.developer'), value: '', disabled: true })
234
+ add('tui-dev', 'contextDetails', t('settings.contextDetails'), ['show', 'hide'], { translateValues: true })
209
235
  return { settings, items, title: t('settings.title'), menu: SETTINGS_MENU, menuIndex: 0 }
210
236
  }
211
237
 
@@ -267,22 +293,27 @@ function ownEntryDescriptor(ctx, descriptors) {
267
293
  // caller omits the row rather than rendering one that cannot be read or written.
268
294
  export function resolveTuiSetting(ctx, descriptors, namespace, field) {
269
295
  const declared = TUI_SETTINGS.find((entry) => entry.namespace === namespace && entry.field === field)
270
- const legacy = descriptors.get(namespace)
271
- if (legacy && typeof legacy.value === 'object' && legacy.value !== null) {
272
- return { ns: namespace, field, configField: declared?.configField, legacy: true, descriptor: legacy, value: legacy.value[field] }
273
- }
274
296
  if (!declared) return undefined
275
297
  const own = ownEntryDescriptor(ctx, descriptors)
276
- if (!own || typeof own.descriptor.value !== 'object' || own.descriptor.value === null) return undefined
277
- if (!Object.hasOwn(own.descriptor.value, declared.configField)) return undefined
278
- return {
279
- ns: own.ns,
280
- field: declared.configField,
281
- configField: declared.configField,
282
- legacy: false,
283
- descriptor: own.descriptor,
284
- value: own.descriptor.value[declared.configField],
298
+ if (own && typeof own.descriptor.value === 'object' && own.descriptor.value !== null
299
+ && Object.hasOwn(own.descriptor.value, declared.configField)) {
300
+ return {
301
+ ns: own.ns,
302
+ field: declared.configField,
303
+ configField: declared.configField,
304
+ legacy: false,
305
+ descriptor: own.descriptor,
306
+ value: own.descriptor.value[declared.configField],
307
+ }
308
+ }
309
+ // The form may not be active during apply(); readTuiSetting then falls back
310
+ // to the running Config instead of a stale compatibility registration.
311
+ if (hasConfigForms(ctx?.get?.('settings'))) return undefined
312
+ const legacy = descriptors.get(namespace)
313
+ if (legacy && typeof legacy.value === 'object' && legacy.value !== null) {
314
+ return { ns: namespace, field, configField: declared.configField, legacy: true, descriptor: legacy, value: legacy.value[field] }
285
315
  }
316
+ return undefined
286
317
  }
287
318
 
288
319
  // Read one TUI-owned setting without requiring a settings service. The stored
package/package.json CHANGED
@@ -1,146 +1,160 @@
1
- {
2
- "name": "dsh-oc-tui",
3
- "version": "0.2.0",
4
- "type": "module",
5
- "description": "A terminal UI (TUI) for DeepSeek Harness — an opencode-inspired chat client that boots as a dsh profile app plugin. | DeepSeek Harness 的终端界面(TUI),受 opencode 启发,以 dsh profile 应用插件形式启动。",
6
- "keywords": [
7
- "deepseek",
8
- "deepseek-harness",
9
- "dsh",
10
- "dsh-plugin",
11
- "tui",
12
- "terminal",
13
- "cli",
14
- "opencode",
15
- "cordis"
16
- ],
17
- "homepage": "https://github.com/rayafriandion/dsh-oc-tui#readme",
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/rayafriandion/dsh-oc-tui.git"
21
- },
22
- "bugs": {
23
- "url": "https://github.com/rayafriandion/dsh-oc-tui/issues"
24
- },
25
- "author": "rayafriandion",
26
- "license": "LGPL-3.0-or-later",
27
- "scripts": {
28
- "test": "node tests/smoke.test.mjs && node tests/i18n.test.mjs && node tests/locale.test.mjs && node tests/locale-forms.test.mjs && node tests/provider-form.test.mjs && node tests/graphics.test.mjs && node tests/render.test.mjs && node tests/reasoning.test.mjs && node tests/diagnostics.test.mjs && node tests/media.test.mjs && node tests/rail.test.mjs && node tests/rewind.test.mjs && node tests/git-branch.test.mjs && node tests/std.test.mjs && node tests/resume.test.mjs && node tests/mcp.test.mjs && node tests/mcp-form.test.mjs && node tests/mcp-sse-bridge.test.mjs && node tests/mcp-skill.test.mjs && node tests/mcp-live.test.mjs && node tests/esc-questions.test.mjs && node tests/deadline.test.mjs && node tests/secret-prompt.test.mjs && node tests/settings-paste.test.mjs && node tests/test-mermaid-ascii.mjs",
29
- "check": "node --check lib/index.js && node --check lib/ui.js && node --check lib/term.js && node --check lib/diagnostics.js && node --check lib/caps.js && node --check lib/image.js && node --check lib/mcp.js && node --check lib/mcp-skill.js && node --check lib/mermaid.js && node --check lib/mermaid-ascii.js && node --check lib/providers.js && node --check lib/util.js && node --check lib/metrics.js && node --check lib/interrupt.js && node --check lib/web-settings.js && node --check lib/updates.js && node --check lib/rewind.js && node --check lib/git-branch.js && node --check lib/bridge.js && node --check lib/facet.js && node --check lib/i18n.js && node --check lib/locales/en.js && node --check lib/locales/zh-CN.js && node --check lib/locales/zh-TW.js && node --check lib/locales/ja.js && node --check lib/locales/ko.js && node --check lib/locales/de.js && node --check lib/locales/fr.js && node --check lib/locales/es.js && node --check lib/locales/pt-BR.js && node --check lib/locales/ru.js && node --check lib/locales/it.js && node --check lib/locales/tr.js && node --check lib/locales/vi.js && node --check lib/locales/id.js && node --check lib/locales/pl.js && node --check lib/locales/nl.js && node --check lib/locales/ar.js && node --check lib/std/adapt.js && node --check lib/std/presentation.js && node --check lib/std/command-list.js && node --check lib/std/commands.js && node --check bin/dsh-oc-tui.js && node --check bin/apply-update.cjs && node --check bin/mcp-sse-bridge.mjs"
30
- },
31
- "main": "lib/index.js",
32
- "exports": {
33
- ".": "./lib/index.js",
34
- "./startup": "./lib/startup.js"
35
- },
36
- "bin": {
37
- "dsh-oc-tui": "bin/dsh-oc-tui.js"
38
- },
39
- "files": [
40
- "lib",
41
- "bin",
42
- "skills",
43
- "cordis.patch.yml",
44
- "dsh-plugin.json",
45
- "docs/用户手册.md"
46
- ],
47
- "engines": {
48
- "node": "^22.19 || >=24",
49
- "dsh": ">=0.1.1-rc.2 <0.3.0-0"
50
- },
51
- "peerDependencies": {
52
- "@deepseek-ai/cordis": "*",
53
- "@deepseek-ai/dsh-agent": "*",
54
- "@deepseek-ai/dsh-agent-loop": "*",
55
- "@deepseek-ai/dsh-agent-presets": "*",
56
- "@deepseek-ai/dsh-cmdline": "*",
57
- "@deepseek-ai/dsh-commands": "*",
58
- "@deepseek-ai/dsh-llm": "*",
59
- "@deepseek-ai/dsh-session": "*",
60
- "@deepseek-ai/dsh-session-persistence": "*",
61
- "@deepseek-ai/dsh-user-approval": "*",
62
- "@deepseek-ai/dsh-user-questions": "*",
63
- "@deepseek-ai/schemastery": "*",
64
- "@dsh-std/command": "0.1.1-rc.1",
65
- "@dsh-std/presentation": "0.1.1-rc.1",
66
- "@dsh-std/sdk": "0.1.1-rc.2",
67
- "@dsh-std/ui": "0.1.1-rc.1"
68
- },
69
- "peerDependenciesMeta": {
70
- "@deepseek-ai/cordis": {
71
- "optional": false
72
- },
73
- "@deepseek-ai/dsh-agent": {
74
- "optional": true
75
- },
76
- "@deepseek-ai/dsh-agent-loop": {
77
- "optional": true
78
- },
79
- "@deepseek-ai/dsh-agent-presets": {
80
- "optional": true
81
- },
82
- "@deepseek-ai/dsh-commands": {
83
- "optional": true
84
- },
85
- "@deepseek-ai/dsh-cmdline": {
86
- "optional": true
87
- },
88
- "@deepseek-ai/dsh-llm": {
89
- "optional": true
90
- },
91
- "@deepseek-ai/dsh-session": {
92
- "optional": true
93
- },
94
- "@deepseek-ai/dsh-session-persistence": {
95
- "optional": true
96
- },
97
- "@deepseek-ai/dsh-user-approval": {
98
- "optional": true
99
- },
100
- "@deepseek-ai/dsh-user-questions": {
101
- "optional": true
102
- },
103
- "@deepseek-ai/schemastery": {
104
- "optional": false
105
- },
106
- "@dsh-std/command": {
107
- "optional": true
108
- },
109
- "@dsh-std/presentation": {
110
- "optional": true
111
- },
112
- "@dsh-std/sdk": {
113
- "optional": true
114
- },
115
- "@dsh-std/ui": {
116
- "optional": true
117
- }
118
- },
119
- "dsh": {
120
- "bundle": {
121
- "patch": "./cordis.patch.yml"
122
- }
123
- },
124
- "dependencies": {
125
- "commander": "^15.0.0",
126
- "highlight.js": "^11.12.0",
127
- "lovely-mermaid": "^0.3.3",
128
- "markdown-it": "^15.0.2",
129
- "sharp": "^0.35.4"
130
- },
131
- "devDependencies": {
132
- "@deepseek-ai/cordis": "^4.0.4",
133
- "@deepseek-ai/dsh-commands": "^0.0.1-rc.5",
134
- "@deepseek-ai/dsh-llm": "^0.0.1-rc.5",
135
- "@deepseek-ai/dsh-scope": "^0.0.1-rc.5",
136
- "@deepseek-ai/dsh-session": "^0.0.1-rc.5",
137
- "@deepseek-ai/dsh-timeout": "^0.0.1-rc.5",
138
- "@deepseek-ai/dsh-user-questions": "^0.0.1-rc.5",
139
- "@deepseek-ai/schemastery": "^3.18.4",
140
- "@dsh-std/command": "0.1.1-rc.1",
141
- "@dsh-std/manifest": "0.1.1-rc.3",
142
- "@dsh-std/presentation": "0.1.1-rc.1",
143
- "@dsh-std/sdk": "0.1.1-rc.2",
144
- "@dsh-std/ui": "0.1.1-rc.1"
145
- }
146
- }
1
+ {
2
+ "name": "dsh-oc-tui",
3
+ "version": "0.3.0",
4
+ "type": "module",
5
+ "description": "A terminal UI (TUI) for DeepSeek Harness — an opencode-inspired chat client that boots as a dsh profile app plugin. | DeepSeek Harness 的终端界面(TUI),受 opencode 启发,以 dsh profile 应用插件形式启动。",
6
+ "keywords": [
7
+ "deepseek",
8
+ "deepseek-harness",
9
+ "dsh",
10
+ "dsh-plugin",
11
+ "tui",
12
+ "terminal",
13
+ "cli",
14
+ "opencode",
15
+ "cordis"
16
+ ],
17
+ "homepage": "https://github.com/rayafriandion/dsh-oc-tui#readme",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/rayafriandion/dsh-oc-tui.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/rayafriandion/dsh-oc-tui/issues"
24
+ },
25
+ "author": "rayafriandion",
26
+ "license": "LGPL-3.0-or-later",
27
+ "scripts": {
28
+ "test": "node tests/screenshot.test.mjs && node tests/smoke.test.mjs && node tests/i18n.test.mjs && node tests/locale.test.mjs && node tests/locale-forms.test.mjs && node tests/settings-mixed.test.mjs && node tests/provider-form.test.mjs && node tests/graphics.test.mjs && node tests/render.test.mjs && node tests/reasoning.test.mjs && node tests/diagnostics.test.mjs && node tests/media.test.mjs && node tests/rail.test.mjs && node tests/rewind.test.mjs && node tests/git-branch.test.mjs && node tests/std.test.mjs && node tests/resume.test.mjs && node tests/boot-gate.test.mjs && node tests/mcp.test.mjs && node tests/mcp-monitor.test.mjs && node tests/mcp-form.test.mjs && node tests/mcp-sse-bridge.test.mjs && node tests/mcp-skill.test.mjs && node tests/mcp-live.test.mjs && node tests/esc-questions.test.mjs && node tests/deadline.test.mjs && node tests/secret-prompt.test.mjs && node tests/settings-paste.test.mjs && node tests/test-mermaid-ascii.mjs",
29
+ "check": "node --check lib/themes.js && node --check lib/screenshot.js && node --check lib/index.js && node --check lib/ui.js && node --check lib/term.js && node --check lib/diagnostics.js && node --check lib/caps.js && node --check lib/image.js && node --check lib/mcp.js && node --check lib/mcp-monitor.js && node --check lib/mcp-skill.js && node --check lib/mermaid.js && node --check lib/mermaid-ascii.js && node --check lib/providers.js && node --check lib/util.js && node --check lib/metrics.js && node --check lib/interrupt.js && node --check lib/web-settings.js && node --check lib/model-route.js && node --check lib/dsh-version.js && node --check lib/boot-block.js && node --check lib/updates.js && node --check lib/rewind.js && node --check lib/git-branch.js && node --check lib/bridge.js && node --check lib/facet.js && node --check lib/i18n.js && node --check lib/locales/en.js && node --check lib/locales/zh-CN.js && node --check lib/locales/zh-TW.js && node --check lib/locales/ja.js && node --check lib/locales/ko.js && node --check lib/locales/de.js && node --check lib/locales/fr.js && node --check lib/locales/es.js && node --check lib/locales/pt-BR.js && node --check lib/locales/ru.js && node --check lib/locales/it.js && node --check lib/locales/tr.js && node --check lib/locales/vi.js && node --check lib/locales/id.js && node --check lib/locales/pl.js && node --check lib/locales/nl.js && node --check lib/locales/ar.js && node --check lib/std/adapt.js && node --check lib/std/presentation.js && node --check lib/std/command-list.js && node --check lib/std/commands.js && node --check bin/dsh-oc-tui.js && node --check bin/apply-update.cjs && node --check bin/mcp-sse-bridge.mjs"
30
+ },
31
+ "main": "lib/index.js",
32
+ "exports": {
33
+ ".": "./lib/index.js",
34
+ "./startup": "./lib/startup.js"
35
+ },
36
+ "bin": {
37
+ "dsh-oc-tui": "bin/dsh-oc-tui.js"
38
+ },
39
+ "files": [
40
+ "lib",
41
+ "bin",
42
+ "skills",
43
+ "cordis.patch.yml",
44
+ "dsh-plugin.json",
45
+ "docs/用户手册.md",
46
+ "docs/user-guide.md",
47
+ "docs/dsh-std-接入说明.md",
48
+ "docs/assets"
49
+ ],
50
+ "engines": {
51
+ "node": "^22.19 || >=24",
52
+ "dsh": ">=0.1.1-rc.2 <0.3.0-0"
53
+ },
54
+ "dshSupport": {
55
+ "recommended": "0.2.2-rc.1",
56
+ "tested": [
57
+ "0.1.1-rc.2",
58
+ "0.1.2-rc.1",
59
+ "0.2.0-rc.2",
60
+ "0.2.1-rc.2",
61
+ "0.2.1-rc.5",
62
+ "0.2.2-rc.1"
63
+ ]
64
+ },
65
+ "peerDependencies": {
66
+ "@deepseek-ai/cordis": "*",
67
+ "@deepseek-ai/dsh-agent": "*",
68
+ "@deepseek-ai/dsh-agent-loop": "*",
69
+ "@deepseek-ai/dsh-agent-presets": "*",
70
+ "@deepseek-ai/dsh-cmdline": "*",
71
+ "@deepseek-ai/dsh-commands": "*",
72
+ "@deepseek-ai/dsh-llm": "*",
73
+ "@deepseek-ai/dsh-session": "*",
74
+ "@deepseek-ai/dsh-session-persistence": "*",
75
+ "@deepseek-ai/dsh-user-approval": "*",
76
+ "@deepseek-ai/dsh-user-questions": "*",
77
+ "@deepseek-ai/schemastery": "*",
78
+ "@dsh-std/command": "0.1.1-rc.1",
79
+ "@dsh-std/presentation": "0.1.1-rc.1",
80
+ "@dsh-std/sdk": "0.1.1-rc.2",
81
+ "@dsh-std/ui": "0.1.1-rc.1"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "@deepseek-ai/cordis": {
85
+ "optional": false
86
+ },
87
+ "@deepseek-ai/dsh-agent": {
88
+ "optional": true
89
+ },
90
+ "@deepseek-ai/dsh-agent-loop": {
91
+ "optional": true
92
+ },
93
+ "@deepseek-ai/dsh-agent-presets": {
94
+ "optional": true
95
+ },
96
+ "@deepseek-ai/dsh-commands": {
97
+ "optional": true
98
+ },
99
+ "@deepseek-ai/dsh-cmdline": {
100
+ "optional": true
101
+ },
102
+ "@deepseek-ai/dsh-llm": {
103
+ "optional": true
104
+ },
105
+ "@deepseek-ai/dsh-session": {
106
+ "optional": true
107
+ },
108
+ "@deepseek-ai/dsh-session-persistence": {
109
+ "optional": true
110
+ },
111
+ "@deepseek-ai/dsh-user-approval": {
112
+ "optional": true
113
+ },
114
+ "@deepseek-ai/dsh-user-questions": {
115
+ "optional": true
116
+ },
117
+ "@deepseek-ai/schemastery": {
118
+ "optional": false
119
+ },
120
+ "@dsh-std/command": {
121
+ "optional": true
122
+ },
123
+ "@dsh-std/presentation": {
124
+ "optional": true
125
+ },
126
+ "@dsh-std/sdk": {
127
+ "optional": true
128
+ },
129
+ "@dsh-std/ui": {
130
+ "optional": true
131
+ }
132
+ },
133
+ "dsh": {
134
+ "bundle": {
135
+ "patch": "./cordis.patch.yml"
136
+ }
137
+ },
138
+ "dependencies": {
139
+ "commander": "^15.0.0",
140
+ "highlight.js": "^11.12.0",
141
+ "lovely-mermaid": "^0.3.3",
142
+ "markdown-it": "^15.0.2",
143
+ "sharp": "^0.35.4"
144
+ },
145
+ "devDependencies": {
146
+ "@deepseek-ai/cordis": "^4.0.4",
147
+ "@deepseek-ai/dsh-commands": "^0.0.1-rc.5",
148
+ "@deepseek-ai/dsh-llm": "^0.0.1-rc.5",
149
+ "@deepseek-ai/dsh-scope": "^0.0.1-rc.5",
150
+ "@deepseek-ai/dsh-session": "^0.0.1-rc.5",
151
+ "@deepseek-ai/dsh-timeout": "^0.0.1-rc.5",
152
+ "@deepseek-ai/dsh-user-questions": "^0.0.1-rc.5",
153
+ "@deepseek-ai/schemastery": "^3.18.4",
154
+ "@dsh-std/command": "0.1.1-rc.1",
155
+ "@dsh-std/manifest": "0.1.1-rc.3",
156
+ "@dsh-std/presentation": "0.1.1-rc.1",
157
+ "@dsh-std/sdk": "0.1.1-rc.2",
158
+ "@dsh-std/ui": "0.1.1-rc.1"
159
+ }
160
+ }