@agi-fans/oh-my-dsh 0.18.0 → 0.20.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 CHANGED
@@ -14,7 +14,7 @@ omdsh is a focused, keyboard-first DeepSeek coding agent built on the plugin arc
14
14
 
15
15
  </div>
16
16
 
17
- ![oh-my-dsh terminal interface](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/apps/site/public/screenshot.webp)
17
+ [![Hello Oh My DSH — v0.19.0 terminal recording](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/apps/site/public/screenshot.webp)](https://github.com/agi-fans/oh-my-dsh/blob/main/apps/site/public/hello-oh-my-dsh.mp4)
18
18
 
19
19
  ## Quick start
20
20
 
@@ -32,7 +32,8 @@ Run `/login` once inside omdsh to validate and save your DeepSeek API key, then
32
32
  - **Durable conversations:** search, pin, rename, and resume sessions in `/sessions`; rewind, retry, compact, and export complete transcripts as Markdown or standalone HTML.
33
33
  - **Three real session controls:** choose a Harness Agent preset (Standard, PTC, Minimal, or Cordis), Workflow (Default or Plan), and Access (Read only, Workspace write, or Full access). Each Agent preset owns its tool exposure; PTC uses the generated TypeScript SDK automatically.
34
34
  - **Rich terminal input:** mention project files and other sessions with `@`, paste clipboard images, reuse persistent prompt history, edit multiline prompts externally, and retrieve queued follow-ups.
35
- - **Readable tool activity:** follow streaming calls and live subagent progress, press Down on an empty composer then Enter (or use Alt+A directly) to select a child in the keyboard-driven Agent Hub, steer a continuable child from its transcript, inspect distinct Input and Output sections, expand long results, and keep domain-specific presentation owned by tool plugins.
35
+ - **Readable turns:** follow thinking, replies, and tool previews while the agent works. Completed work folds to a duration summary and the full final answer; `Ctrl+O` restores the process view. Scroll through either view, keep the current prompt pinned, and jump back to the latest message with `End`.
36
+ - **Inspectable work:** press `Alt+O` for full tool inputs and results in the current turn, use `/trajectory` for event details, see the files changed by each turn, and let the model search its earlier sessions in the same workspace. Open the Agent Hub with `Alt+A` to follow child agents and steer continuable tasks.
36
37
  - **Live operational context:** see Agent, Workflow, Access, model, reasoning effort, workspace, Git state, context pressure, tokens, TTFT, throughput, cache, timings, turns, and steps without leaving the composer; use `/context` for an inline projection-backed breakdown that remains in the transcript.
37
38
  - **Responsive by design:** retain settled transcript layout, coalesce scroll updates, emit row-level terminal diffs, and preserve correct display-cell alignment for CJK text and emoji.
38
39
 
@@ -102,7 +103,7 @@ The TUI package is split into a service definition, local terminal Provider, ses
102
103
 
103
104
  ## Performance
104
105
 
105
- Performance is part of the TUI architecture: durable sessions replay in linear time, Harness Projections avoid repeated history scans, settled transcript blocks retain formatted layout, and the terminal writer emits row-level diffs. On the documented Apple M5 Pro environment, restoring 10,000 conversation turns takes a median 2.62 ms, 10,000 tool calls take 22.71 ms, and rendering cached frames over a 5,000-turn surface averages 0.35 ms per frame.
106
+ Performance is part of the TUI architecture: durable sessions replay in linear time, Harness Projections avoid repeated history scans, settled transcript blocks retain formatted layout, and the terminal writer emits row-level diffs. The documented Apple M5 Pro measurements from August 2026 recorded a median 2.62 ms for restoring 10,000 conversation turns, 22.71 ms for 10,000 tool calls, and 0.35 ms per cached frame over a 5,000-turn surface. These are historical measurements, not a benchmark of the latest version.
106
107
 
107
108
  See the reproducible [TUI performance report](https://omdsh.agi.fans/docs/performance/) or run `pnpm benchmark:tui` locally.
108
109
 
package/config/cordis.yml CHANGED
@@ -10,11 +10,27 @@
10
10
  - id: timer
11
11
  name: '@deepseek-ai/cordis-plugin-timer'
12
12
 
13
+ - id: hmr
14
+ name: '@deepseek-ai/dsh-hmr'
15
+ config:
16
+ root: []
17
+
18
+ - id: plugin-manager
19
+ name: '@deepseek-ai/dsh-plugin-manager'
20
+
21
+ - id: plugin-inventory
22
+ name: '@deepseek-ai/dsh-host-plugin-inventory'
23
+
13
24
  - id: llm
14
25
  name: '@deepseek-ai/dsh-llm'
15
26
 
27
+ # `dsh-llm-deepseek` is the Messages transport library since the 0.2.0
28
+ # corridor; the plugin that owns the `deepseek-official` route now lives in
29
+ # `dsh-llm-deepseek-api-key` (the account-token sibling owns `deepseek-account`).
30
+ # The row id stays `llm-deepseek` because the settings namespace the TUI
31
+ # `/auth` and `/model` commands read is derived from the entry id.
16
32
  - id: llm-deepseek
17
- name: '@deepseek-ai/dsh-llm-deepseek'
33
+ name: '@deepseek-ai/dsh-llm-deepseek-api-key'
18
34
  config:
19
35
  # Current built-ins share this fallback. Exact catalog values still win,
20
36
  # and omitting models keeps future adapter additions visible.
@@ -69,6 +85,19 @@
69
85
  path: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/sessions-query.sqlite'"
70
86
  openAt: first-search
71
87
 
88
+ # Model-facing session history: five read-only tools that let the agent find
89
+ # work it did in an earlier session. Without them a model that solved
90
+ # something three sessions ago can only be told again, because `/sessions`
91
+ # and `/resume` are human affordances it cannot reach. Cross-session reads
92
+ # are authorized only when the target session's cwd exactly matches the
93
+ # caller's, so the model cannot read another workspace's history.
94
+ #
95
+ # The cost is five tool schemas plus fixed guidance on every request. A
96
+ # deployment that would rather not pay it turns the row off in a home
97
+ # overlay with `disabled: true`.
98
+ - id: tool-session-query
99
+ name: '@deepseek-ai/dsh-tool-session-query'
100
+
72
101
  - id: session-reference
73
102
  name: '@deepseek-ai/dsh-session-reference'
74
103
 
@@ -102,6 +131,14 @@
102
131
  - id: workspace
103
132
  name: '@deepseek-ai/dsh-workspace'
104
133
 
134
+ # Per-turn changed-file summary. The plugin diffs git working-tree snapshots
135
+ # taken at turn start and turn end and announces each result with a
136
+ # `workspace/changes` event; the transcript renders the served file list, and
137
+ # a resumed session falls back to the turn-only form because the summaries
138
+ # live on the host only while the Session does.
139
+ - id: workspace-changes
140
+ name: '@deepseek-ai/dsh-workspace-changes'
141
+
105
142
  # Workspace @file discovery. The TUI owns mention syntax; this provider
106
143
  # ranks path-only candidates and, when `read` is visible, adds the stable
107
144
  # file-reference instruction. Selecting a row still inserts a path.
@@ -110,6 +147,12 @@
110
147
 
111
148
  - id: attachments
112
149
  name: '@deepseek-ai/dsh-attachment-local'
150
+
151
+ - id: tui-command-files
152
+ name: '@agi-fans/dsh-tui/command-files'
153
+
154
+ - id: hook-settings
155
+ name: '@agi-fans/dsh-tui/hook-settings'
113
156
  config:
114
157
  dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
115
158
 
@@ -134,9 +177,6 @@
134
177
  - id: authorization
135
178
  name: '@deepseek-ai/dsh-authorization'
136
179
 
137
- - id: authorization-invariant
138
- name: '@deepseek-ai/dsh-authorization/invariant'
139
-
140
180
  # Dormant multi-provider twin: zero extra picker routes until a `llm-pi-ai:`
141
181
  # settings section supplies profiles. /login writes those profiles; /model
142
182
  # lists whatever routes become live. Keep llm-deepseek as the official
@@ -279,21 +319,6 @@
279
319
  - id: jobs
280
320
  name: '@deepseek-ai/dsh-jobs-local'
281
321
 
282
- - id: invariants
283
- name: '@deepseek-ai/dsh-invariants'
284
-
285
- - id: session-invariant
286
- name: '@deepseek-ai/dsh-session/invariant'
287
-
288
- - id: agent-invariant
289
- name: '@deepseek-ai/dsh-agent/invariant'
290
-
291
- - id: scope-invariant
292
- name: '@deepseek-ai/dsh-scope/invariant'
293
-
294
- - id: agent-loop-invariant
295
- name: '@deepseek-ai/dsh-agent-loop/invariant'
296
-
297
322
  - id: shell-env
298
323
  name: '@deepseek-ai/dsh-shell-env'
299
324
  config:
@@ -326,10 +351,15 @@
326
351
 
327
352
  - id: terminal-bash
328
353
  name: '@deepseek-ai/dsh-terminal-bash'
354
+ config:
355
+ shellDialect: !!js "process.platform === 'win32' ? 'pwsh' : 'bash'"
329
356
 
330
357
  - id: tool-terminal
331
358
  name: '@deepseek-ai/dsh-tool-terminal'
332
359
 
360
+ - id: tui-command-terminal
361
+ name: '@agi-fans/dsh-tui/command-terminal'
362
+
333
363
  - id: agent-loop
334
364
  name: '@deepseek-ai/dsh-agent-loop'
335
365
  config:
@@ -337,6 +367,9 @@
337
367
 
338
368
  - id: ptc-runtime
339
369
  name: '@deepseek-ai/dsh-ptc-runtime-node'
370
+ config:
371
+ # Leave time for a default question wait and its recorded sub-call result.
372
+ timeoutMs: 180000
340
373
 
341
374
  - id: cordis-host-runner
342
375
  name: '@deepseek-ai/dsh-cordis-host-runner'
@@ -348,6 +381,9 @@
348
381
 
349
382
  - id: tool-ask-user
350
383
  name: '@deepseek-ai/dsh-tool-ask-user'
384
+ config:
385
+ mode: timed
386
+ timeout: 120
351
387
 
352
388
  - id: plan-mode
353
389
  name: '@deepseek-ai/dsh-plan-mode'
@@ -476,6 +512,9 @@
476
512
  - id: subagent
477
513
  name: '@deepseek-ai/dsh-subagent'
478
514
 
515
+ - id: subagent-model-selection-settings
516
+ name: '@deepseek-ai/dsh-tool-subagent/model-selection-settings'
517
+
479
518
  - id: subagent-spawn
480
519
  name: '@deepseek-ai/dsh-subagent-spawn-in-process'
481
520
  config:
@@ -599,6 +638,10 @@
599
638
  name: '@agi-fans/dsh-tui'
600
639
  config:
601
640
  model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
641
+ # The settings overlay edits the Profile patch for optional features;
642
+ # `disabled` is a Loader option the settings service cannot write, so
643
+ # this row carries the home whose patch the Features section owns.
644
+ dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh'
602
645
 
603
646
  - id: agent-behavior
604
647
  name: '@agi-fans/oh-my-dsh/agent-behavior'
@@ -647,6 +690,9 @@
647
690
  - id: tui-command-integrations
648
691
  name: '@agi-fans/dsh-tui/command-integrations'
649
692
 
693
+ - id: tui-command-plugins
694
+ name: '@agi-fans/dsh-tui/command-plugins'
695
+
650
696
  - id: tui-command-jobs
651
697
  name: '@agi-fans/dsh-tui/command-jobs'
652
698
 
@@ -10,6 +10,9 @@
10
10
  description: Standard coding agent optimized for programmatic tool calling through the generated TypeScript SDK.
11
11
  order: 2
12
12
  plugins:
13
+ - id: subagent-model-selection
14
+ name: '@agi-fans/dsh-tui/subagent-model-selection'
15
+
13
16
  - id: persona
14
17
  name: '@deepseek-ai/dsh-persona'
15
18
  config:
@@ -7,16 +7,30 @@
7
7
  config:
8
8
  id: cordis
9
9
  name: Cordis
10
- description: Standard coding agent with read-only runtime inspection for authoring Harness compositions.
10
+ description: Coding agent with runtime inspection, development skills, and plugin management for Harness compositions.
11
11
  order: 4
12
12
  plugins:
13
+ - id: subagent-model-selection
14
+ name: '@agi-fans/dsh-tui/subagent-model-selection'
15
+
13
16
  - id: persona
14
17
  name: '@deepseek-ai/dsh-persona'
15
18
  config:
16
19
  prefix: |-
17
20
  You are a coding agent powered by the {{model}} model, running on the DeepSeek Harness. Your working directory is {{cwd}}.
18
21
 
19
- You can inspect the live Cordis runtime while authoring compositions and plugins. Host composition owns shared registries and backends; an Agent preset owns one session's tools, persona, prompt sections, and isolated services. Use cordis_inspect_list to discover providers, then cordis_inspect_query to read exact Service, Event, and Tool APIs. These tools are read-only; changing the runtime means editing composition files, not calling a tool.
22
+ You can inspect the live Cordis runtime while authoring compositions and plugins. Host composition owns shared registries and backends; an Agent preset owns one session's tools, persona, prompt sections, and isolated services. Use cordis_inspect_list to discover providers, then cordis_inspect_query to read exact Service, Event, and Tool APIs. Use the development skills for composition and plugin authoring. The plugin_manager tool manages this profile; it requires full host access or explicit approval, and dependency scripts require separate approval.
20
23
 
21
24
  - id: tool-cordis
22
25
  name: '@deepseek-ai/dsh-tool-cordis'
26
+
27
+ - id: cordis-skills
28
+ name: '@deepseek-ai/dsh-skill-filesystem'
29
+ config:
30
+ providerName: cordis-authoring
31
+ includeDefaultRoots: false
32
+ customSkillDirs:
33
+ - !!js process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('@deepseek-ai/dsh-agent-preset/package.json')), 'skills')
34
+
35
+ - id: tool-plugin-manager
36
+ name: '@deepseek-ai/dsh-plugin-manager/tools'
@@ -10,6 +10,9 @@
10
10
  description: Full coding agent with files, shell, search, skills, planning, goals, and delegation.
11
11
  order: 1
12
12
  plugins:
13
+ - id: subagent-model-selection
14
+ name: '@agi-fans/dsh-tui/subagent-model-selection'
15
+
13
16
  - id: persona
14
17
  name: '@deepseek-ai/dsh-persona'
15
18
  config:
package/lib/bin.js CHANGED
@@ -29,7 +29,7 @@ else if (invocation.plugin) {
29
29
  const { runPlugin } = await import("./plugin.js");
30
30
  try {
31
31
  prepareLaunchEnvironment();
32
- process.exitCode = runPlugin(invocation.pluginArgs);
32
+ process.exitCode = await runPlugin(invocation.pluginArgs);
33
33
  }
34
34
  catch (error) {
35
35
  process.stderr.write(dumpErrorMessage(error) + '\n');
package/lib/boot.js CHANGED
@@ -48,15 +48,18 @@ export async function runOmdsh(prompt, resume) {
48
48
  overlays: composed.overlays,
49
49
  telemetryDisabledEnv: process.env.DSH_TELEMETRY_DISABLED,
50
50
  };
51
- // One immutable package table for this launch: installation packages first
51
+ // Initial package table: installation packages first
52
52
  // (every `@deepseek-ai/*` and `@agi-fans/dsh-tui` module resolves from the
53
53
  // omdsh installation), then the Profile's own `node_modules`, then the
54
- // Profile's linked roots. No fallback links are created.
54
+ // Profile's linked roots. Runtime plugin operations publish later tables;
55
+ // already retained compositions keep their revisions. No fallback links are created.
55
56
  const resolution = await createRuntimeResolution({
56
57
  installAnchor: INSTALL_ANCHOR,
57
58
  profile: composed.profile,
58
59
  home,
59
60
  });
61
+ let ready = false;
62
+ const readyListeners = new Set();
60
63
  const ctx = await boot(NAME, composed.rootConfig, structuredClone(composed.patches), async (hostCtx) => {
61
64
  app.current = hostCtx;
62
65
  hostCtx.provide('profileContext', profileContext);
@@ -65,9 +68,24 @@ export async function runOmdsh(prompt, resume) {
65
68
  provideCmdline(hostCtx, {
66
69
  args: resume === undefined ? prompt : ['--resume', resume],
67
70
  exit: (code) => { void shutdown.shutdown(code); },
71
+ ready: { onReady(listener) {
72
+ if (ready) {
73
+ listener();
74
+ return () => { };
75
+ }
76
+ readyListeners.add(listener);
77
+ return () => { readyListeners.delete(listener); };
78
+ } },
68
79
  });
69
80
  });
70
81
  app.current = ctx;
82
+ // FiberState is a published const enum, absent from native ESM exports.
83
+ if (ctx.fiber.state === 2 && ctx.get('loader') !== undefined) {
84
+ ready = true;
85
+ for (const listener of readyListeners)
86
+ listener();
87
+ }
88
+ readyListeners.clear();
71
89
  return { ctx, shutdown };
72
90
  }
73
91
  //# sourceMappingURL=boot.js.map
package/lib/plugin.d.ts CHANGED
@@ -61,4 +61,4 @@ export declare function anchorPathSpec(argument: string, cwd: string): string;
61
61
  * Run one `omdsh plugin` invocation: init if needed, forward to pnpm, check
62
62
  * peers, reconcile.
63
63
  */
64
- export declare function runPlugin(args: readonly string[], options?: PluginRunOptions): number;
64
+ export declare function runPlugin(args: readonly string[], options?: PluginRunOptions): Promise<number>;
package/lib/plugin.js CHANGED
@@ -10,7 +10,8 @@
10
10
  */
11
11
  import { spawnSync } from 'node:child_process';
12
12
  import { createRequire } from 'node:module';
13
- import { existsSync, readFileSync } from 'node:fs';
13
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
14
+ import { withFileLock } from '@deepseek-ai/dsh-atomic-write';
14
15
  import { dirname, join, resolve } from 'node:path';
15
16
  import { readProfileManifest, resolveBundleDir, resolveProfileDir, writeProfileManifest, } from '@deepseek-ai/dsh-app-boot';
16
17
  import { omdshHome } from "./config-paths.js";
@@ -26,8 +27,9 @@ Usage:
26
27
  The Profile lives at $OMDSH_HOME/profiles/omdsh (else $DSH_HOME, else ~/.dsh).
27
28
  Filesystem specs such as ./examples/hello are relative to the invoking
28
29
  directory. A missing ./path walks parent directories for the same relative
29
- path and fails if nothing exists. pnpm must be on PATH. Restart omdsh after
30
- a successful add or remove.
30
+ path and fails if nothing exists. pnpm must be on PATH. Restart after CLI
31
+ package operations. Use /plugins to apply changes in the running profile with
32
+ cancellation and explicit application results.
31
33
  `.trim();
32
34
  function writeLine(write, text) {
33
35
  write(text.endsWith('\n') ? text : text + '\n');
@@ -366,7 +368,7 @@ function spawnPnpm(args, dir) {
366
368
  * Run one `omdsh plugin` invocation: init if needed, forward to pnpm, check
367
369
  * peers, reconcile.
368
370
  */
369
- export function runPlugin(args, options = {}) {
371
+ export async function runPlugin(args, options = {}) {
370
372
  const write = options.write ?? ((text) => { process.stderr.write(text); });
371
373
  if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
372
374
  writeLine(write, PLUGIN_USAGE);
@@ -387,50 +389,53 @@ export function runPlugin(args, options = {}) {
387
389
  }
388
390
  const home = omdshHome(environment);
389
391
  const dir = resolveProfileDir(PROFILE_NAME, home);
390
- const created = !existsSync(join(dir, 'package.json'));
391
- ensureOmdshProfile(home);
392
- if (created)
393
- writeLine(write, `${NAME}: initialized profile ${PROFILE_NAME} at ${dir}`);
394
- const before = readProfileManifest(NAME, dir);
395
- const forwarded = resolved.map(item => item.argument);
396
- const runPnpm = options.runPnpm ?? spawnPnpm;
397
- const result = runPnpm(forwarded, dir);
398
- if (result.error !== undefined) {
399
- if (result.error.code === 'ENOENT') {
400
- writeLine(write, `${NAME}: pnpm not found on PATH — install pnpm to manage profile plugins`);
401
- return 127;
402
- }
403
- throw result.error;
404
- }
405
- const exitCode = result.status ?? 1;
406
- if (exitCode !== 0) {
407
- writeLine(write, `${NAME}: pnpm failed in profile directory ${dir}`);
408
- if (args.some(argument => /^git\+|^github:|\.git(?:#|$)/u.test(argument))) {
409
- writeLine(write, `${NAME}: git-hosted plugins build on install via their prepare script, which pnpm blocks until allowed — `
410
- + `add the exact key pnpm printed above under allowBuilds in ${join(dir, 'pnpm-workspace.yaml')}, then re-run`);
392
+ mkdirSync(dir, { recursive: true });
393
+ return withFileLock(join(dir, 'package.json'), async () => {
394
+ const created = !existsSync(join(dir, 'package.json'));
395
+ ensureOmdshProfile(home);
396
+ if (created)
397
+ writeLine(write, `${NAME}: initialized profile ${PROFILE_NAME} at ${dir}`);
398
+ const before = readProfileManifest(NAME, dir);
399
+ const forwarded = resolved.map(item => item.argument);
400
+ const runPnpm = options.runPnpm ?? spawnPnpm;
401
+ const result = runPnpm(forwarded, dir);
402
+ if (result.error !== undefined) {
403
+ if (result.error.code === 'ENOENT') {
404
+ writeLine(write, `${NAME}: pnpm not found on PATH — install pnpm to manage profile plugins`);
405
+ return 127;
406
+ }
407
+ throw result.error;
411
408
  }
412
- return exitCode;
413
- }
414
- const incompatible = incompatiblePeerMessage(dir);
415
- if (incompatible !== undefined) {
416
- writeLine(write, incompatible);
417
- const verb = firstVerb(args);
418
- const added = Object.keys(readProfileManifest(NAME, dir).dependencies ?? {})
419
- .filter(name => !(before.dependencies ?? {})[name]);
420
- if (verb === 'add' && added.length > 0) {
421
- const rollback = runPnpm(['remove', ...added], dir);
422
- if ((rollback.status ?? 1) !== 0) {
423
- writeLine(write, `${NAME}: failed to roll back incompatible packages: ${added.join(', ')}`);
409
+ const exitCode = result.status ?? 1;
410
+ if (exitCode !== 0) {
411
+ writeLine(write, `${NAME}: pnpm failed in profile directory ${dir}`);
412
+ if (args.some(argument => /^git\+|^github:|\.git(?:#|$)/u.test(argument))) {
413
+ writeLine(write, `${NAME}: git-hosted plugins build on install via their prepare script, which pnpm blocks until allowed — `
414
+ + `add the exact key pnpm printed above under allowBuilds in ${join(dir, 'pnpm-workspace.yaml')}, then re-run`);
424
415
  }
425
- else {
426
- writeLine(write, `${NAME}: removed incompatible packages: ${added.join(', ')}`);
416
+ return exitCode;
417
+ }
418
+ const incompatible = incompatiblePeerMessage(dir);
419
+ if (incompatible !== undefined) {
420
+ writeLine(write, incompatible);
421
+ const verb = firstVerb(args);
422
+ const added = Object.keys(readProfileManifest(NAME, dir).dependencies ?? {})
423
+ .filter(name => !(before.dependencies ?? {})[name]);
424
+ if (verb === 'add' && added.length > 0) {
425
+ const rollback = runPnpm(['remove', ...added], dir);
426
+ if ((rollback.status ?? 1) !== 0) {
427
+ writeLine(write, `${NAME}: failed to roll back incompatible packages: ${added.join(', ')}`);
428
+ }
429
+ else {
430
+ writeLine(write, `${NAME}: removed incompatible packages: ${added.join(', ')}`);
431
+ }
427
432
  }
433
+ return 1;
428
434
  }
429
- return 1;
430
- }
431
- for (const warning of bundlelessWarnings(before, dir))
432
- writeLine(write, warning);
433
- reconcilePlugins(before, dir);
434
- return 0;
435
+ for (const warning of bundlelessWarnings(before, dir))
436
+ writeLine(write, warning);
437
+ reconcilePlugins(before, dir);
438
+ return 0;
439
+ }, { waitMs: 120_000 });
435
440
  }
436
441
  //# sourceMappingURL=plugin.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agi-fans/oh-my-dsh",
3
3
  "description": "omdsh: a keyboard-first DeepSeek TUI coding agent on the DeepSeek Harness runtime",
4
- "version": "0.18.0",
4
+ "version": "0.20.0",
5
5
  "homepage": "https://omdsh.agi.fans/",
6
6
  "keywords": [
7
7
  "omdsh",
@@ -55,132 +55,137 @@
55
55
  "access": "public"
56
56
  },
57
57
  "dependencies": {
58
- "@deepseek-ai/cordis-plugin-loader": "1.0.5",
59
- "@deepseek-ai/cordis-plugin-timer": "1.1.6",
60
- "@deepseek-ai/dsh-agent": "0.1.7-rc.1",
61
- "@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
62
- "@deepseek-ai/dsh-agent-instructions": "0.1.7-rc.1",
63
- "@deepseek-ai/dsh-agent-loop": "0.1.7-rc.1",
64
- "@deepseek-ai/dsh-agent-preset": "0.1.7-rc.1",
65
- "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
66
- "@deepseek-ai/dsh-agent-tool-presentation": "0.1.7-rc.1",
67
- "@deepseek-ai/dsh-app-boot": "0.1.7-rc.1",
68
- "@deepseek-ai/dsh-attachment-local": "0.1.7-rc.1",
69
- "@deepseek-ai/dsh-authorization": "0.1.7-rc.1",
70
- "@deepseek-ai/dsh-bash-sandbox": "0.1.7-rc.1",
71
- "@deepseek-ai/dsh-cmdline": "0.1.7-rc.1",
72
- "@deepseek-ai/dsh-command-compact": "0.1.7-rc.1",
73
- "@deepseek-ai/dsh-command-feedback": "0.1.7-rc.1",
74
- "@deepseek-ai/dsh-command-goal": "0.1.7-rc.1",
75
- "@deepseek-ai/dsh-commands": "0.1.7-rc.1",
76
- "@deepseek-ai/dsh-compaction-basic": "0.1.7-rc.1",
77
- "@deepseek-ai/dsh-compaction-image-offload": "0.1.7-rc.1",
78
- "@deepseek-ai/dsh-compaction-tool-result-pruner": "0.1.7-rc.1",
79
- "@deepseek-ai/dsh-config-editor": "0.1.7-rc.1",
80
- "@deepseek-ai/dsh-cordis-host-runner": "0.1.7-rc.1",
81
- "@deepseek-ai/dsh-credentials-local": "0.1.7-rc.1",
82
- "@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
83
- "@deepseek-ai/dsh-file-reference-local": "0.1.7-rc.1",
84
- "@deepseek-ai/dsh-fs-local": "0.1.7-rc.1",
85
- "@deepseek-ai/dsh-fs-observation-policy": "0.1.7-rc.1",
86
- "@deepseek-ai/dsh-fs-sandbox": "0.1.7-rc.1",
87
- "@deepseek-ai/dsh-goal": "0.1.7-rc.1",
88
- "@deepseek-ai/dsh-goal-round-driver": "0.1.7-rc.1",
89
- "@deepseek-ai/dsh-http-proxy": "0.1.7-rc.1",
90
- "@deepseek-ai/dsh-invariants": "0.1.7-rc.1",
91
- "@deepseek-ai/dsh-jobs-local": "0.1.7-rc.1",
92
- "@deepseek-ai/dsh-launch-environment": "0.1.7-rc.1",
93
- "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
94
- "@deepseek-ai/dsh-llm-deepseek": "0.1.7-rc.1",
95
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.7-rc.1",
96
- "@deepseek-ai/dsh-llm-retry": "0.1.7-rc.1",
97
- "@deepseek-ai/dsh-lsp": "0.1.7-rc.1",
98
- "@deepseek-ai/dsh-lsp-stdio": "0.1.7-rc.1",
99
- "@deepseek-ai/dsh-mcp-client": "0.1.7-rc.1",
100
- "@deepseek-ai/dsh-mcp-resources": "0.1.7-rc.1",
101
- "@deepseek-ai/dsh-output-retention": "0.1.7-rc.1",
102
- "@deepseek-ai/dsh-permission-presets": "0.1.7-rc.1",
103
- "@deepseek-ai/dsh-persona": "0.1.7-rc.1",
104
- "@deepseek-ai/dsh-plan-mode": "0.1.7-rc.1",
105
- "@deepseek-ai/dsh-ptc-runtime-node": "0.1.7-rc.1",
106
- "@deepseek-ai/dsh-pwsh-local": "0.1.7-rc.1",
107
- "@deepseek-ai/dsh-pwsh-sandbox": "0.1.7-rc.1",
108
- "@deepseek-ai/dsh-repeat-tool-reminder": "0.1.7-rc.1",
109
- "@deepseek-ai/dsh-sandbox-local": "0.1.7-rc.1",
110
- "@deepseek-ai/dsh-sandbox-policy": "0.1.7-rc.1",
111
- "@deepseek-ai/dsh-scope": "0.1.7-rc.1",
112
- "@deepseek-ai/dsh-session": "0.1.7-rc.1",
113
- "@deepseek-ai/dsh-session-checkpoint-policy": "0.1.7-rc.1",
114
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.7-rc.1",
115
- "@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
116
- "@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
117
- "@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
118
- "@deepseek-ai/dsh-session-query-sqlite": "0.1.7-rc.1",
119
- "@deepseek-ai/dsh-session-reference": "0.1.7-rc.1",
120
- "@deepseek-ai/dsh-session-stats": "0.1.7-rc.1",
121
- "@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
122
- "@deepseek-ai/dsh-session-title-first-prompt-llm": "0.1.7-rc.1",
123
- "@deepseek-ai/dsh-settings": "0.1.7-rc.1",
124
- "@deepseek-ai/dsh-shell-env": "0.1.7-rc.1",
125
- "@deepseek-ai/dsh-skill": "0.1.7-rc.1",
126
- "@deepseek-ai/dsh-skill-filesystem": "0.1.7-rc.1",
127
- "@deepseek-ai/dsh-spill": "0.1.7-rc.1",
128
- "@deepseek-ai/dsh-spill-local": "0.1.7-rc.1",
129
- "@deepseek-ai/dsh-spill-policy": "0.1.7-rc.1",
130
- "@deepseek-ai/dsh-storage": "0.1.7-rc.1",
131
- "@deepseek-ai/dsh-storage-domain": "0.1.7-rc.1",
132
- "@deepseek-ai/dsh-storage-json": "0.1.7-rc.1",
133
- "@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
134
- "@deepseek-ai/dsh-subagent-acp": "0.1.7-rc.1",
135
- "@deepseek-ai/dsh-subagent-fork-in-process": "0.1.7-rc.1",
136
- "@deepseek-ai/dsh-subagent-in-process-driver": "0.1.7-rc.1",
137
- "@deepseek-ai/dsh-subagent-spawn-in-process": "0.1.7-rc.1",
138
- "@deepseek-ai/dsh-subprocess-local": "0.1.7-rc.1",
139
- "@deepseek-ai/dsh-system-prompt": "0.1.7-rc.1",
140
- "@deepseek-ai/dsh-terminal": "0.1.7-rc.1",
141
- "@deepseek-ai/dsh-terminal-bash": "0.1.7-rc.1",
142
- "@deepseek-ai/dsh-timeout": "0.1.7-rc.1",
143
- "@deepseek-ai/dsh-token-meter": "0.1.7-rc.1",
144
- "@deepseek-ai/dsh-tool-ask-user": "0.1.7-rc.1",
145
- "@deepseek-ai/dsh-tool-bash": "0.1.7-rc.1",
146
- "@deepseek-ai/dsh-tool-bash-persistent": "0.1.7-rc.1",
147
- "@deepseek-ai/dsh-tool-call-timeout-policy": "0.1.7-rc.1",
148
- "@deepseek-ai/dsh-tool-cordis": "0.1.7-rc.1",
149
- "@deepseek-ai/dsh-tool-fs": "0.1.7-rc.1",
150
- "@deepseek-ai/dsh-tool-fs-search": "0.1.7-rc.1",
151
- "@deepseek-ai/dsh-tool-goal": "0.1.7-rc.1",
152
- "@deepseek-ai/dsh-tool-jobs": "0.1.7-rc.1",
153
- "@deepseek-ai/dsh-tool-lsp": "0.1.7-rc.1",
154
- "@deepseek-ai/dsh-tool-present": "0.1.7-rc.1",
155
- "@deepseek-ai/dsh-tool-pwsh": "0.1.7-rc.1",
156
- "@deepseek-ai/dsh-tool-pwsh-persistent": "0.1.7-rc.1",
157
- "@deepseek-ai/dsh-tool-ralph": "0.1.7-rc.1",
158
- "@deepseek-ai/dsh-tool-skill": "0.1.7-rc.1",
159
- "@deepseek-ai/dsh-tool-str-replace-editor": "0.1.7-rc.1",
160
- "@deepseek-ai/dsh-tool-subagent": "0.1.7-rc.1",
161
- "@deepseek-ai/dsh-tool-subagent-control": "0.1.7-rc.1",
162
- "@deepseek-ai/dsh-tool-terminal": "0.1.7-rc.1",
163
- "@deepseek-ai/dsh-tool-todo": "0.1.7-rc.1",
164
- "@deepseek-ai/dsh-tool-web": "0.1.7-rc.1",
165
- "@deepseek-ai/dsh-tool-workflow": "0.1.7-rc.1",
166
- "@deepseek-ai/dsh-tools": "0.1.7-rc.1",
167
- "@deepseek-ai/dsh-user-approval": "0.1.7-rc.1",
168
- "@deepseek-ai/dsh-user-questions": "0.1.7-rc.1",
169
- "@deepseek-ai/dsh-web": "0.1.7-rc.1",
170
- "@deepseek-ai/dsh-web-fetch-http": "0.1.7-rc.1",
171
- "@deepseek-ai/dsh-web-search-deepseek": "0.1.7-rc.1",
172
- "@deepseek-ai/dsh-workflow": "0.1.7-rc.1",
173
- "@deepseek-ai/dsh-workflow-ptc": "0.1.7-rc.1",
174
- "@deepseek-ai/dsh-workspace": "0.1.7-rc.1",
175
- "@deepseek-ai/schemastery": "3.18.4",
58
+ "@deepseek-ai/cordis-plugin-loader": "1.0.6-alpha.1",
59
+ "@deepseek-ai/cordis-plugin-timer": "1.1.7-alpha.1",
60
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
61
+ "@deepseek-ai/dsh-agent-default-model": "0.2.1-alpha.1",
62
+ "@deepseek-ai/dsh-agent-instructions": "0.2.1-alpha.1",
63
+ "@deepseek-ai/dsh-agent-loop": "0.2.1-alpha.1",
64
+ "@deepseek-ai/dsh-agent-preset": "0.2.1-alpha.1",
65
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.1",
66
+ "@deepseek-ai/dsh-agent-tool-presentation": "0.2.1-alpha.1",
67
+ "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.1",
68
+ "@deepseek-ai/dsh-atomic-write": "0.2.1-alpha.1",
69
+ "@deepseek-ai/dsh-attachment-local": "0.2.1-alpha.1",
70
+ "@deepseek-ai/dsh-authorization": "0.2.1-alpha.1",
71
+ "@deepseek-ai/dsh-bash-sandbox": "0.2.1-alpha.1",
72
+ "@deepseek-ai/dsh-cmdline": "0.2.1-alpha.1",
73
+ "@deepseek-ai/dsh-command-compact": "0.2.1-alpha.1",
74
+ "@deepseek-ai/dsh-command-feedback": "0.2.1-alpha.1",
75
+ "@deepseek-ai/dsh-command-goal": "0.2.1-alpha.1",
76
+ "@deepseek-ai/dsh-commands": "0.2.1-alpha.1",
77
+ "@deepseek-ai/dsh-compaction-basic": "0.2.1-alpha.1",
78
+ "@deepseek-ai/dsh-compaction-image-offload": "0.2.1-alpha.1",
79
+ "@deepseek-ai/dsh-compaction-tool-result-pruner": "0.2.1-alpha.1",
80
+ "@deepseek-ai/dsh-config-editor": "0.2.1-alpha.1",
81
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.1",
82
+ "@deepseek-ai/dsh-credentials-local": "0.2.1-alpha.1",
83
+ "@deepseek-ai/dsh-file-reference": "0.2.1-alpha.1",
84
+ "@deepseek-ai/dsh-file-reference-local": "0.2.1-alpha.1",
85
+ "@deepseek-ai/dsh-fs-local": "0.2.1-alpha.1",
86
+ "@deepseek-ai/dsh-fs-observation-policy": "0.2.1-alpha.1",
87
+ "@deepseek-ai/dsh-fs-sandbox": "0.2.1-alpha.1",
88
+ "@deepseek-ai/dsh-goal": "0.2.1-alpha.1",
89
+ "@deepseek-ai/dsh-goal-round-driver": "0.2.1-alpha.1",
90
+ "@deepseek-ai/dsh-hmr": "0.2.1-alpha.1",
91
+ "@deepseek-ai/dsh-host-plugin-inventory": "0.2.1-alpha.1",
92
+ "@deepseek-ai/dsh-http-proxy": "0.2.1-alpha.1",
93
+ "@deepseek-ai/dsh-jobs-local": "0.2.1-alpha.1",
94
+ "@deepseek-ai/dsh-launch-environment": "0.2.1-alpha.1",
95
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.1",
96
+ "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.1-alpha.1",
97
+ "@deepseek-ai/dsh-llm-pi-ai": "0.2.1-alpha.1",
98
+ "@deepseek-ai/dsh-llm-retry": "0.2.1-alpha.1",
99
+ "@deepseek-ai/dsh-lsp": "0.2.1-alpha.1",
100
+ "@deepseek-ai/dsh-lsp-stdio": "0.2.1-alpha.1",
101
+ "@deepseek-ai/dsh-mcp-client": "0.2.1-alpha.1",
102
+ "@deepseek-ai/dsh-mcp-resources": "0.2.1-alpha.1",
103
+ "@deepseek-ai/dsh-output-retention": "0.2.1-alpha.1",
104
+ "@deepseek-ai/dsh-permission-presets": "0.2.1-alpha.1",
105
+ "@deepseek-ai/dsh-persona": "0.2.1-alpha.1",
106
+ "@deepseek-ai/dsh-plan-mode": "0.2.1-alpha.1",
107
+ "@deepseek-ai/dsh-plugin-manager": "0.2.1-alpha.1",
108
+ "@deepseek-ai/dsh-ptc-runtime-node": "0.2.1-alpha.1",
109
+ "@deepseek-ai/dsh-pwsh-local": "0.2.1-alpha.1",
110
+ "@deepseek-ai/dsh-pwsh-sandbox": "0.2.1-alpha.1",
111
+ "@deepseek-ai/dsh-repeat-tool-reminder": "0.2.1-alpha.1",
112
+ "@deepseek-ai/dsh-sandbox-local": "0.2.1-alpha.1",
113
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.1",
114
+ "@deepseek-ai/dsh-scope": "0.2.1-alpha.1",
115
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.1",
116
+ "@deepseek-ai/dsh-session-checkpoint-policy": "0.2.1-alpha.1",
117
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.1",
118
+ "@deepseek-ai/dsh-session-projection": "0.2.1-alpha.1",
119
+ "@deepseek-ai/dsh-session-projection-cache": "0.2.1-alpha.1",
120
+ "@deepseek-ai/dsh-session-query": "0.2.1-alpha.1",
121
+ "@deepseek-ai/dsh-session-query-sqlite": "0.2.1-alpha.1",
122
+ "@deepseek-ai/dsh-session-reference": "0.2.1-alpha.1",
123
+ "@deepseek-ai/dsh-session-stats": "0.2.1-alpha.1",
124
+ "@deepseek-ai/dsh-session-title": "0.2.1-alpha.1",
125
+ "@deepseek-ai/dsh-session-title-first-prompt-llm": "0.2.1-alpha.1",
126
+ "@deepseek-ai/dsh-settings": "0.2.1-alpha.1",
127
+ "@deepseek-ai/dsh-shell-env": "0.2.1-alpha.1",
128
+ "@deepseek-ai/dsh-skill": "0.2.1-alpha.1",
129
+ "@deepseek-ai/dsh-skill-filesystem": "0.2.1-alpha.1",
130
+ "@deepseek-ai/dsh-spill": "0.2.1-alpha.1",
131
+ "@deepseek-ai/dsh-spill-local": "0.2.1-alpha.1",
132
+ "@deepseek-ai/dsh-spill-policy": "0.2.1-alpha.1",
133
+ "@deepseek-ai/dsh-storage": "0.2.1-alpha.1",
134
+ "@deepseek-ai/dsh-storage-domain": "0.2.1-alpha.1",
135
+ "@deepseek-ai/dsh-storage-json": "0.2.1-alpha.1",
136
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.1",
137
+ "@deepseek-ai/dsh-subagent-acp": "0.2.1-alpha.1",
138
+ "@deepseek-ai/dsh-subagent-fork-in-process": "0.2.1-alpha.1",
139
+ "@deepseek-ai/dsh-subagent-in-process-driver": "0.2.1-alpha.1",
140
+ "@deepseek-ai/dsh-subagent-spawn-in-process": "0.2.1-alpha.1",
141
+ "@deepseek-ai/dsh-subprocess-local": "0.2.1-alpha.1",
142
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.1",
143
+ "@deepseek-ai/dsh-terminal": "0.2.1-alpha.1",
144
+ "@deepseek-ai/dsh-terminal-bash": "0.2.1-alpha.1",
145
+ "@deepseek-ai/dsh-timeout": "0.2.1-alpha.1",
146
+ "@deepseek-ai/dsh-token-meter": "0.2.1-alpha.1",
147
+ "@deepseek-ai/dsh-tool-ask-user": "0.2.1-alpha.1",
148
+ "@deepseek-ai/dsh-tool-bash": "0.2.1-alpha.1",
149
+ "@deepseek-ai/dsh-tool-bash-persistent": "0.2.1-alpha.1",
150
+ "@deepseek-ai/dsh-tool-call-timeout-policy": "0.2.1-alpha.1",
151
+ "@deepseek-ai/dsh-tool-cordis": "0.2.1-alpha.1",
152
+ "@deepseek-ai/dsh-tool-fs": "0.2.1-alpha.1",
153
+ "@deepseek-ai/dsh-tool-fs-search": "0.2.1-alpha.1",
154
+ "@deepseek-ai/dsh-tool-goal": "0.2.1-alpha.1",
155
+ "@deepseek-ai/dsh-tool-jobs": "0.2.1-alpha.1",
156
+ "@deepseek-ai/dsh-tool-lsp": "0.2.1-alpha.1",
157
+ "@deepseek-ai/dsh-tool-present": "0.2.1-alpha.1",
158
+ "@deepseek-ai/dsh-tool-pwsh": "0.2.1-alpha.1",
159
+ "@deepseek-ai/dsh-tool-pwsh-persistent": "0.2.1-alpha.1",
160
+ "@deepseek-ai/dsh-tool-ralph": "0.2.1-alpha.1",
161
+ "@deepseek-ai/dsh-tool-session-query": "0.2.1-alpha.1",
162
+ "@deepseek-ai/dsh-tool-skill": "0.2.1-alpha.1",
163
+ "@deepseek-ai/dsh-tool-str-replace-editor": "0.2.1-alpha.1",
164
+ "@deepseek-ai/dsh-tool-subagent": "0.2.1-alpha.1",
165
+ "@deepseek-ai/dsh-tool-subagent-control": "0.2.1-alpha.1",
166
+ "@deepseek-ai/dsh-tool-terminal": "0.2.1-alpha.1",
167
+ "@deepseek-ai/dsh-tool-todo": "0.2.1-alpha.1",
168
+ "@deepseek-ai/dsh-tool-web": "0.2.1-alpha.1",
169
+ "@deepseek-ai/dsh-tool-workflow": "0.2.1-alpha.1",
170
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.1",
171
+ "@deepseek-ai/dsh-user-approval": "0.2.1-alpha.1",
172
+ "@deepseek-ai/dsh-user-questions": "0.2.1-alpha.1",
173
+ "@deepseek-ai/dsh-web": "0.2.1-alpha.1",
174
+ "@deepseek-ai/dsh-web-fetch-http": "0.2.1-alpha.1",
175
+ "@deepseek-ai/dsh-web-search-deepseek": "0.2.1-alpha.1",
176
+ "@deepseek-ai/dsh-workflow": "0.2.1-alpha.1",
177
+ "@deepseek-ai/dsh-workflow-ptc": "0.2.1-alpha.1",
178
+ "@deepseek-ai/dsh-workspace": "0.2.1-alpha.1",
179
+ "@deepseek-ai/dsh-workspace-changes": "0.2.1-alpha.1",
180
+ "@deepseek-ai/schemastery": "3.18.5-alpha.1",
176
181
  "node-addon-require-builtin": "^0.1.6",
177
- "@agi-fans/dsh-tui": "^0.18.0"
182
+ "@agi-fans/dsh-tui": "^0.20.0"
178
183
  },
179
184
  "peerDependencies": {
180
- "@deepseek-ai/cordis": "^4.0.4"
185
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1"
181
186
  },
182
187
  "devDependencies": {
183
- "@deepseek-ai/cordis": "4.0.4",
188
+ "@deepseek-ai/cordis": "4.0.5-alpha.1",
184
189
  "@types/node": "^22.10.0",
185
190
  "tsx": "^4.19.0",
186
191
  "typescript": "^5.6.0",