@agi-fans/oh-my-dsh 0.19.0 → 0.21.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
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Into the Unknown**
8
8
 
9
- omdsh is a focused, keyboard-first DeepSeek coding agent built on the plugin architecture of [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) and inspired by the interaction quality of [oh-my-pi](https://github.com/can1357/oh-my-pi) and the original [Pi](https://github.com/earendil-works/pi) agent harness.
9
+ omdsh is the terminal client for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness): a focused, keyboard-first DeepSeek coding agent built on its plugin architecture, with interaction quality inspired by [oh-my-pi](https://github.com/can1357/oh-my-pi) and the original [Pi](https://github.com/earendil-works/pi) agent harness.
10
10
 
11
11
  [![CI](https://github.com/agi-fans/oh-my-dsh/actions/workflows/ci.yml/badge.svg)](https://github.com/agi-fans/oh-my-dsh/actions/workflows/ci.yml) [![npm version](https://img.shields.io/npm/v/%40agi-fans%2Foh-my-dsh?style=flat-square&logo=npm)](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [![npm downloads](https://img.shields.io/npm/dm/%40agi-fans%2Foh-my-dsh?style=flat-square&logo=npm)](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [![Node.js ^22.19 or >=24](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-339933?style=flat-square&logo=node.js)](https://nodejs.org/) [![MIT License](https://img.shields.io/npm/l/%40agi-fans%2Foh-my-dsh?style=flat-square)](https://github.com/agi-fans/oh-my-dsh/blob/main/LICENSE)
12
12
 
@@ -14,24 +14,26 @@ 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
+ [![omdsh terminal demo — one real DeepSeek account turn at 150×39](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/apps/site/public/omdsh-demo-poster.png)](https://github.com/agi-fans/oh-my-dsh/blob/main/apps/site/public/omdsh-demo.mp4)
18
18
 
19
- Screenshot from v0.5.1. See [Keyboard and keys](https://omdsh.agi.fans/docs/keyboard/) for the current turn presentation and navigation.
19
+ A real Kaku recording at 150×39: one DeepSeek account turn reads a file, fixes it, runs it, and reports the verified result.
20
20
 
21
21
  ## Quick start
22
22
 
23
- Requirements: Node.js 22.19 or later in the 22.x line, or Node.js 24 or newer, plus a DeepSeek API key for live model turns.
23
+ Requirements: Node.js 22.19 or later in the 22.x line, or Node.js 24 or newer, plus a DeepSeek account or API key for live model turns.
24
24
 
25
25
  ```sh
26
26
  npm install --global @agi-fans/oh-my-dsh
27
27
  omdsh
28
28
  ```
29
29
 
30
- Run `/login` once inside omdsh to validate and save your DeepSeek API key, then start a conversation. To try it without a global installation, run `npx @agi-fans/oh-my-dsh`.
30
+ Run `/login` once inside omdsh to sign in with a DeepSeek account or save an API key, then start a conversation. To try it without a global installation, run `npx @agi-fans/oh-my-dsh`.
31
31
 
32
32
  ## Highlights
33
33
 
34
- - **Durable conversations:** search, pin, rename, and resume sessions in `/sessions`; rewind, retry, compact, and export complete transcripts as Markdown or standalone HTML.
34
+ - **The terminal client for DeepSeek Harness:** a native-scrollback TUI with a docked composer, display-cell layout, and a keyboard path through every flow — built on the published plugin runtime, not a fork.
35
+ - **Durable conversations:** search, pin, rename, and resume sessions in `/resume`; rewind, retry, compact, and export complete transcripts as Markdown or standalone HTML.
36
+ - **DeepSeek-native auth:** sign in from `/login` through the browser or store a key; a DeepSeek account grant shared with DSH is reused, `/logout` signs it out, and web search/fetch use the same credential.
35
37
  - **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.
36
38
  - **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.
37
39
  - **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`.
@@ -111,7 +113,7 @@ See the reproducible [TUI performance report](https://omdsh.agi.fans/docs/perfor
111
113
 
112
114
  ## Configuration
113
115
 
114
- Run `/login` to configure a provider. DeepSeek still opens the official key dashboard, validates the key, and prefers the stored credential over an inherited `DEEPSEEK_API_KEY`. When a mounted provider registers a Harness authorization flow, `/login` lists that flow and its methods and the terminal only renders the notices and prompts the flow asks for. The same command can also activate a catalog API-key provider or add a custom provider with its own id, base URL, protocol, and model ids. `/model` then lists every live route. `/logout` removes an omdsh-managed choice and, for DeepSeek, falls back to the environment when available.
116
+ Run `/login` to configure a provider. DeepSeek opens the official key dashboard, validates the key, and stores it in the shared Harness credential store under `DEEPSEEK_API_KEY`; an environment-owned value is left untouched. A DeepSeek account can be signed in from `/login`: the TUI listens on a loopback callback for the browser flow and reuses any grant already established by DSH Web/Desktop. The account route (`deepseek-account`) then appears in `/model` beside the API-key route; sign-out is available from `/logout` or the same account prompt. When a mounted provider registers a Harness authorization flow, `/login` lists that flow and its methods and the terminal only renders the notices and prompts the flow asks for. The same command can also activate a catalog API-key provider or add a custom provider with its own id, base URL, protocol, and model ids. `/logout` removes only file-stored credentials and falls back to the environment when available.
115
117
 
116
118
  Model settings and the rest of the plugin config persist into the active Profile's Cordis patch, `$OMDSH_HOME/profiles/omdsh/cordis.patch.yml`; a `settings.yaml` left by an earlier release is imported once at startup and renamed to `settings.yaml.imported`. Use `/model favorite` and `/model unfavorite` to maintain a small local cycle list, then use `Ctrl+P`/`Alt+P` to move through it and `Ctrl+T` to change reasoning effort. Skills and MCP configuration are documented in [Skills and MCP](https://omdsh.agi.fans/docs/skills-and-mcp/).
117
119
 
package/config/cordis.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  # omdsh product bundle — one insert over an empty Profile root.
2
- # TUI coding agent over the DeepSeek Harness core runtime. No Host, no HTTP, no
3
- # browser layer: local executors, the executor-less agent spine, the DeepSeek
4
- # adapter, and the omdsh TUI seam (provider + interactive runner).
2
+ # TUI coding agent over the DeepSeek Harness core runtime. No public Host or
3
+ # browser layer: one loopback HTTP listener exists only to receive the DeepSeek
4
+ # account OAuth callback. Local executors, the executor-less agent spine, the
5
+ # DeepSeek adapter, and the omdsh TUI seam (provider + interactive runner).
5
6
  #
6
7
  # Model/provider rows read the CLI/environment overrides through the
7
8
  # harness's sanctioned dynamic-config mechanism (!!js under plugin config).
@@ -10,6 +11,17 @@
10
11
  - id: timer
11
12
  name: '@deepseek-ai/cordis-plugin-timer'
12
13
 
14
+ - id: hmr
15
+ name: '@deepseek-ai/dsh-hmr'
16
+ config:
17
+ root: []
18
+
19
+ - id: plugin-manager
20
+ name: '@deepseek-ai/dsh-plugin-manager'
21
+
22
+ - id: plugin-inventory
23
+ name: '@deepseek-ai/dsh-host-plugin-inventory'
24
+
13
25
  - id: llm
14
26
  name: '@deepseek-ai/dsh-llm'
15
27
 
@@ -25,6 +37,14 @@
25
37
  # and omitting models keeps future adapter additions visible.
26
38
  maxTokens: 384000
27
39
 
40
+ # The account route shares the same transport but resolves only the DeepSeek
41
+ # account grant; it never falls back to an API key. Hosts that sign in through
42
+ # the shared credential store (DSH Web/Desktop) expose `deepseek-account` here.
43
+ - id: llm-deepseek-account
44
+ name: '@deepseek-ai/dsh-llm-deepseek-account'
45
+ config:
46
+ maxTokens: 384000
47
+
28
48
  - id: session
29
49
  name: '@deepseek-ai/dsh-session'
30
50
 
@@ -76,7 +96,7 @@
76
96
 
77
97
  # Model-facing session history: five read-only tools that let the agent find
78
98
  # work it did in an earlier session. Without them a model that solved
79
- # something three sessions ago can only be told again, because `/sessions`
99
+ # something three sessions ago can only be told again, because `/resume`
80
100
  # and `/resume` are human affordances it cannot reach. Cross-session reads
81
101
  # are authorized only when the target session's cwd exactly matches the
82
102
  # caller's, so the model cannot read another workspace's history.
@@ -108,6 +128,14 @@
108
128
  config:
109
129
  backend: json
110
130
 
131
+ # Durable reminders. Delivery resolves its Session through the background
132
+ # controller below; a cold Session is resumed without touching the TUI.
133
+ - id: schedule
134
+ name: '@deepseek-ai/dsh-schedule'
135
+ config:
136
+ deliveryHistoryDays: 30
137
+ deliveryHistoryRecords: 200
138
+
111
139
  # Durable projection checkpoints — the piece that lets a cold session
112
140
  # answer its title without reading its log. Without it the `@` session
113
141
  # menu and the recent-session list can only label cold sessions by id.
@@ -136,6 +164,12 @@
136
164
 
137
165
  - id: attachments
138
166
  name: '@deepseek-ai/dsh-attachment-local'
167
+
168
+ - id: tui-command-files
169
+ name: '@agi-fans/dsh-tui/command-files'
170
+
171
+ - id: hook-settings
172
+ name: '@agi-fans/dsh-tui/hook-settings'
139
173
  config:
140
174
  dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
141
175
 
@@ -160,8 +194,26 @@
160
194
  - id: authorization
161
195
  name: '@deepseek-ai/dsh-authorization'
162
196
 
163
- - id: authorization-invariant
164
- name: '@deepseek-ai/dsh-authorization/invariant'
197
+ # Move the retired product credential into the upstream DeepSeek slot before
198
+ # any model or web request reads it. Idempotent; no network.
199
+ - id: credential-migration
200
+ name: '@agi-fans/oh-my-dsh/credential-migration'
201
+
202
+ # Loopback-only callback host for the DeepSeek account browser sign-in. It
203
+ # binds 127.0.0.1 on an OS-assigned port and serves only the exact
204
+ # /oauth/callback route registered while an attempt is running.
205
+ - id: web-server
206
+ name: '@deepseek-ai/dsh-host-webserver'
207
+ config:
208
+ host: 127.0.0.1
209
+ port: 0
210
+
211
+ # DeepSeek account grant over the shared credential store. The browser
212
+ # callback needs a loopback webServer; this TUI host does not mount one yet,
213
+ # so the service reuses a grant established by DSH Web/Desktop and reports
214
+ # ACCOUNT_SIGN_IN_REQUIRED otherwise.
215
+ - id: deepseek-account
216
+ name: '@deepseek-ai/dsh-deepseek-account-platform'
165
217
 
166
218
  # Dormant multi-provider twin: zero extra picker routes until a `llm-pi-ai:`
167
219
  # settings section supplies profiles. /login writes those profiles; /model
@@ -188,14 +240,22 @@
188
240
  config:
189
241
  default: standard
190
242
 
243
+ # Background Session resolution for plugins that deliver without a client,
244
+ # currently Schedule. It exposes only `resolveAgent`; the visible Session is
245
+ # never activated or replaced.
246
+ - id: session-controller
247
+ name: '@agi-fans/oh-my-dsh/session-controller'
248
+
191
249
  - id: commands
192
250
  name: '@deepseek-ai/dsh-commands'
193
251
 
194
- # `/feedback <text>` records one log-only `feedback/record` event: immediate,
195
- # model-invisible, and no report leaves the machine. The Web feedback dialog
196
- # behind the same service stays a host-plane surface omdsh does not mount.
197
- - id: command-feedback
198
- name: '@deepseek-ai/dsh-command-feedback'
252
+ # `/rate` stores one judgment per finalized assistant reply. The service owns
253
+ # the canonical Session events and compare-and-set versions; the TUI only
254
+ # renders the picker and never puts feedback into model context.
255
+ - id: message-feedback
256
+ name: '@deepseek-ai/dsh-message-feedback'
257
+ config:
258
+ maxNoteBytes: 8192
199
259
 
200
260
  - id: user-questions
201
261
  name: '@deepseek-ai/dsh-user-questions'
@@ -205,6 +265,11 @@
205
265
  config:
206
266
  policy: !!js "(process.env.OMDSH_PERMISSION_MODE || 'workspace-write') === 'danger-full-access' ? 'never' : 'ask'"
207
267
 
268
+ - id: approval-rules
269
+ name: '@agi-fans/dsh-tui/approval-rules'
270
+ config:
271
+ stateDir: !!js (process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh/approval-rules'
272
+
208
273
  # Every session starts with one explicit access preset. The environment is a
209
274
  # deployment override; the TUI switches it later through the /permission picker.
210
275
  - id: sandbox
@@ -222,6 +287,12 @@
222
287
  - id: fs-observation-policy
223
288
  name: '@deepseek-ai/dsh-fs-observation-policy'
224
289
 
290
+ - id: file-recovery
291
+ name: '@agi-fans/dsh-tui/file-recovery-local'
292
+ config:
293
+ enabled: false
294
+ stateDir: !!js (process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh/file-recovery'
295
+
225
296
  - id: subprocess
226
297
  name: '@deepseek-ai/dsh-subprocess-local'
227
298
 
@@ -305,21 +376,6 @@
305
376
  - id: jobs
306
377
  name: '@deepseek-ai/dsh-jobs-local'
307
378
 
308
- - id: invariants
309
- name: '@deepseek-ai/dsh-invariants'
310
-
311
- - id: session-invariant
312
- name: '@deepseek-ai/dsh-session/invariant'
313
-
314
- - id: agent-invariant
315
- name: '@deepseek-ai/dsh-agent/invariant'
316
-
317
- - id: scope-invariant
318
- name: '@deepseek-ai/dsh-scope/invariant'
319
-
320
- - id: agent-loop-invariant
321
- name: '@deepseek-ai/dsh-agent-loop/invariant'
322
-
323
379
  - id: shell-env
324
380
  name: '@deepseek-ai/dsh-shell-env'
325
381
  config:
@@ -338,12 +394,23 @@
338
394
  config:
339
395
  maxBytes: 65536
340
396
 
397
+ - id: working-directory
398
+ name: '@deepseek-ai/dsh-working-directory'
399
+
400
+ - id: tool-working-directory
401
+ name: '@deepseek-ai/dsh-tool-working-directory'
402
+
341
403
  - id: tool-skill
342
404
  name: '@deepseek-ai/dsh-tool-skill'
343
405
 
344
406
  - id: tool-jobs
345
407
  name: '@deepseek-ai/dsh-tool-jobs'
346
408
 
409
+ # Reminder management tools bind to the calling Session and disappear in
410
+ # minimal through its allow list; delegated children are refused by the tool.
411
+ - id: tool-schedule
412
+ name: '@deepseek-ai/dsh-tool-schedule'
413
+
347
414
  # Persistent, owner-scoped terminal sessions for interactive stdin and
348
415
  # cross-call state (REPLs, debuggers, a shell to return to). The one-shot
349
416
  # bash/pwsh tools remain the default for bounded commands.
@@ -352,10 +419,15 @@
352
419
 
353
420
  - id: terminal-bash
354
421
  name: '@deepseek-ai/dsh-terminal-bash'
422
+ config:
423
+ shellDialect: !!js "process.platform === 'win32' ? 'pwsh' : 'bash'"
355
424
 
356
425
  - id: tool-terminal
357
426
  name: '@deepseek-ai/dsh-tool-terminal'
358
427
 
428
+ - id: tui-command-terminal
429
+ name: '@agi-fans/dsh-tui/command-terminal'
430
+
359
431
  - id: agent-loop
360
432
  name: '@deepseek-ai/dsh-agent-loop'
361
433
  config:
@@ -363,6 +435,9 @@
363
435
 
364
436
  - id: ptc-runtime
365
437
  name: '@deepseek-ai/dsh-ptc-runtime-node'
438
+ config:
439
+ # Leave time for a default question wait and its recorded sub-call result.
440
+ timeoutMs: 180000
366
441
 
367
442
  - id: cordis-host-runner
368
443
  name: '@deepseek-ai/dsh-cordis-host-runner'
@@ -375,7 +450,8 @@
375
450
  - id: tool-ask-user
376
451
  name: '@deepseek-ai/dsh-tool-ask-user'
377
452
  config:
378
- mode: legacy
453
+ mode: timed
454
+ timeout: 120
379
455
 
380
456
  - id: plan-mode
381
457
  name: '@deepseek-ai/dsh-plan-mode'
@@ -429,6 +505,17 @@
429
505
  # overlay.
430
506
  - id: web
431
507
  name: '@deepseek-ai/dsh-web'
508
+ config:
509
+ # The DeepSeek API providers retrieve directly, so a local fake-IP resolver
510
+ # or an auxiliary Messages turn cannot block search and fetch. The older
511
+ # Messages search and local HTTP fetch stay mounted as selectable fallbacks.
512
+ searchProvider: deepseek-search-api
513
+ fetchProvider: deepseek-fetch-api
514
+
515
+ - id: web-deepseek-api
516
+ name: '@deepseek-ai/dsh-web-deepseek-api'
517
+ config:
518
+ apiKeyEnv: DEEPSEEK_API_KEY
432
519
 
433
520
  - id: web-search-deepseek
434
521
  name: '@deepseek-ai/dsh-web-search-deepseek'
@@ -504,6 +591,23 @@
504
591
  - id: subagent
505
592
  name: '@deepseek-ai/dsh-subagent'
506
593
 
594
+ - id: advisor
595
+ name: '@agi-fans/oh-my-dsh/advisor'
596
+
597
+ - id: tui-command-advisor
598
+ name: '@agi-fans/dsh-tui/command-advisor'
599
+
600
+ - id: btw
601
+ name: '@agi-fans/dsh-tui/btw'
602
+ config:
603
+ stateDir: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh/btw'"
604
+
605
+ - id: tui-command-btw
606
+ name: '@agi-fans/dsh-tui/command-btw'
607
+
608
+ - id: subagent-model-selection-settings
609
+ name: '@deepseek-ai/dsh-tool-subagent/model-selection-settings'
610
+
507
611
  - id: subagent-spawn
508
612
  name: '@deepseek-ai/dsh-subagent-spawn-in-process'
509
613
  config:
@@ -525,10 +629,10 @@
525
629
  # transport: `spawn`/`fork` stay mounted and keep their parent-shared
526
630
  # features, which ACP cannot honour.
527
631
  #
528
- # ACP advertises no start-time capabilities and implements no continuable
529
- # runs, so `providerName: acp` must not be selected by a tool that needs
530
- # `agentOptions`, `persona`, `toolFilter`, a numeric `maxDepth`, or
531
- # `backgroundMode: continuable`.
632
+ # ACP advertises no parent-controlled start-time capabilities or follow-ups.
633
+ # Do not select `providerName: acp` for a tool that needs `agentOptions`,
634
+ # `persona`, `toolFilter`, or a numeric `maxDepth`. Local continuable
635
+ # children are managed by the subagent runtime.
532
636
  - id: subagent-acp
533
637
  name: '@deepseek-ai/dsh-subagent-acp'
534
638
  config:
@@ -543,8 +647,7 @@
543
647
  env:
544
648
  DSH_HOME: !!js (process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/acp-child'
545
649
  OMDSH_HOME: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
546
- OMDSH_DEEPSEEK_API_KEY: !!js process.env.OMDSH_DEEPSEEK_API_KEY || undefined
547
- DEEPSEEK_API_KEY: !!js process.env.DEEPSEEK_API_KEY || process.env.OMDSH_DEEPSEEK_API_KEY || undefined
650
+ DEEPSEEK_API_KEY: !!js process.env.DEEPSEEK_API_KEY || undefined
548
651
 
549
652
  - id: subagent-control
550
653
  name: '@deepseek-ai/dsh-tool-subagent-control'
@@ -557,25 +660,21 @@
557
660
  config:
558
661
  provider: spawn
559
662
  toolName: subagent
560
- backgroundMode: continuable
561
663
 
562
664
  - id: tool-subagent-fork
563
665
  name: '@deepseek-ai/dsh-tool-subagent'
564
666
  config:
565
667
  provider: fork
566
668
  toolName: subagent_fork
567
- backgroundMode: continuable
568
669
 
569
670
  # The isolated delegation tool. It is a second `dsh-tool-subagent` over the
570
671
  # out-of-process backend, so a caller chooses isolation per delegation
571
672
  # instead of trading the parent-shared features away globally.
572
673
  #
573
- # Three settings are forced by ACP's absent capabilities, not preferences:
674
+ # ACP's absent capabilities constrain the isolated tool:
574
675
  # - `maxDepth: provider-managed` — a numeric cap is refused because the
575
676
  # provider cannot enforce recursion depth across a process boundary, and
576
677
  # the child's own composition already bounds it.
577
- # - `backgroundMode: one-shot` — the published ACP provider implements no
578
- # `prepareContinuable`, so a continuable run is refused at mount.
579
678
  # - no `agentOptions`/`persona`/`toolFilter` — all three are refused.
580
679
  # The consequence is user-visible: an isolated child cannot be steered or
581
680
  # followed up after dispatch. Use `subagent` when that matters.
@@ -584,7 +683,6 @@
584
683
  config:
585
684
  provider: acp
586
685
  toolName: subagent_isolated
587
- backgroundMode: one-shot
588
686
  maxDepth: provider-managed
589
687
 
590
688
  # Workflow and Ralph, as the upstream base bundle mounts them.
@@ -599,10 +697,7 @@
599
697
  config:
600
698
  provider: spawn
601
699
 
602
- # `toolName` is renamed because omdsh already owns a `/workflow` slash command
603
- # that switches the Default/Plan workflow. The two live in different
604
- # namespaces (tool vs command) and never collide at runtime, but a bare
605
- # `workflow` entry in `/tools` would read as that command.
700
+ # Keep the explicit execution name stable for existing sessions and tool policies.
606
701
  - id: tool-workflow
607
702
  name: '@deepseek-ai/dsh-tool-workflow'
608
703
  config:
@@ -629,7 +724,7 @@
629
724
  model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
630
725
  # The settings overlay edits the Profile patch for optional features;
631
726
  # `disabled` is a Loader option the settings service cannot write, so
632
- # this row carries the home whose patch the Features section owns.
727
+ # this row carries the home whose patch the Tools feature controls own.
633
728
  dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh'
634
729
 
635
730
  - id: agent-behavior
@@ -641,9 +736,7 @@
641
736
  - id: tui-session-runtime
642
737
  name: '@agi-fans/dsh-tui/session-runtime'
643
738
  config:
644
- # Product state this runtime owns: Session Library rows reused across
645
- # launches (without them a cold process reads every stored log again) and
646
- # the marker that upgrades stored sessions once per session format.
739
+ # Session Library rows reused across launches without rewriting old logs.
647
740
  stateDir: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh'"
648
741
 
649
742
  - id: tui-human-interaction
@@ -652,6 +745,9 @@
652
745
  - id: tui-command-session
653
746
  name: '@agi-fans/dsh-tui/command-session'
654
747
 
748
+ - id: tui-command-worktree
749
+ name: '@agi-fans/dsh-tui/command-worktree'
750
+
655
751
  - id: tui-command-session-configuration
656
752
  name: '@agi-fans/dsh-tui/command-session-configuration'
657
753
 
@@ -679,9 +775,18 @@
679
775
  - id: tui-command-integrations
680
776
  name: '@agi-fans/dsh-tui/command-integrations'
681
777
 
778
+ - id: tui-command-plugins
779
+ name: '@agi-fans/dsh-tui/command-plugins'
780
+
682
781
  - id: tui-command-jobs
683
782
  name: '@agi-fans/dsh-tui/command-jobs'
684
783
 
784
+ - id: tui-command-rate
785
+ name: '@agi-fans/dsh-tui/command-rate'
786
+
787
+ - id: tui-command-schedule
788
+ name: '@agi-fans/dsh-tui/command-schedule'
789
+
685
790
  - id: tui-startup-notices
686
791
  name: '@agi-fans/dsh-tui/startup-notices'
687
792
 
@@ -0,0 +1,20 @@
1
+ # Internal composition for durable side consultations, including after resume.
2
+ - insert:
3
+ - id: preset-btw
4
+ name: '@deepseek-ai/dsh-agent-preset'
5
+ config:
6
+ id: btw
7
+ name: Side consultation
8
+ description: Answer from a fixed conversation snapshot without tools.
9
+ order: 100
10
+ plugins:
11
+ - id: persona
12
+ name: '@deepseek-ai/dsh-persona'
13
+ config:
14
+ prefix: >-
15
+ You are answering a separate side question about the copied conversation. Answer the current question briefly and directly using that context. Do not execute tasks, use tools, or ask follow-up questions. Your answer is independent advice and is not sent to the primary agent.{{omdsh_agent_behavior}}
16
+ complete: true
17
+ includeRuntimeContext: false
18
+
19
+ - id: policy
20
+ name: '@agi-fans/dsh-tui/btw-policy'
@@ -10,11 +10,14 @@
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:
16
19
  prefix: >-
17
- You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}. Prefer programmatic tool calling for multi-step operations when the generated tools SDK is available.
20
+ You are a coding agent powered by the {{model}} model. Prefer programmatic tool calling for multi-step operations when the generated tools SDK is available.
18
21
 
19
22
  # PTC presents the tool registry as a generated SDK over `run_code`, so the
20
23
  # general-purpose `workflow_run` tool would be a second model-authored
@@ -38,3 +41,8 @@
38
41
  name: '@deepseek-ai/dsh-agent-tool-presentation'
39
42
  config:
40
43
  mode: ptc
44
+
45
+ # Upstream Standard/Cordis/PTC presets carry a clock reading at least
46
+ # every ten minutes; the TUI process zone is the fallback display zone.
47
+ - id: time-context
48
+ name: '@deepseek-ai/dsh-time-context'
@@ -7,16 +7,35 @@
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
- You are a coding agent powered by the {{model}} model, running on the DeepSeek Harness. Your working directory is {{cwd}}.
20
+ You are a coding agent powered by the {{model}} model, running on the DeepSeek Harness.
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'
37
+
38
+ # Upstream Standard/Cordis/PTC presets carry a clock reading at least
39
+ # every ten minutes; the TUI process zone is the fallback display zone.
40
+ - id: time-context
41
+ name: '@deepseek-ai/dsh-time-context'
@@ -10,8 +10,16 @@
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:
16
19
  prefix: >-
17
- You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
20
+ You are a coding agent powered by the {{model}} model.
21
+
22
+ # Upstream Standard/Cordis/PTC presets carry a clock reading at least
23
+ # every ten minutes; the TUI process zone is the fallback display zone.
24
+ - id: time-context
25
+ name: '@deepseek-ai/dsh-time-context'
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ /** Preserve native stdio under a pre-established Harness process sandbox. */
2
+ import { spawn } from 'node:child_process';
3
+ const [program, ...args] = process.argv.slice(2);
4
+ if (program === undefined)
5
+ process.exit(1);
6
+ const child = spawn(program, args, { stdio: 'inherit', shell: false });
7
+ child.on('error', () => { process.exitCode = 1; });
8
+ child.on('exit', (code, signal) => {
9
+ if (signal !== null)
10
+ process.kill(process.pid, signal);
11
+ else
12
+ process.exitCode = code ?? 1;
13
+ });
14
+ //# sourceMappingURL=advisor-launcher.js.map
@@ -0,0 +1,34 @@
1
+ /** Context-only native consultations owned by the Harness activation registry. */
2
+ import { type Context, type Volatile } from '@deepseek-ai/cordis';
3
+ import z from '@deepseek-ai/schemastery';
4
+ import type { TuiAdvisor, TuiSubagentActivity } from '@agi-fans/dsh-tui';
5
+ export declare const name = "omdsh-advisor";
6
+ export declare const inject: string[];
7
+ export interface Config {
8
+ allowModelConsultations: Volatile<boolean>;
9
+ }
10
+ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
11
+ allowModelConsultations: z<boolean, boolean, "volatile-defined">;
12
+ }>>, Schemastery.ObjectT<NoInfer<{
13
+ allowModelConsultations: z<boolean, boolean, "volatile-defined">;
14
+ }>>, "plain">;
15
+ /** Extract a compact live inspection step from one native advisor JSON stream line. */
16
+ export declare function parseAdviceActivity(provider: TuiAdvisor, line: string, state?: {
17
+ lastTool?: string | undefined;
18
+ }): TuiSubagentActivity | undefined;
19
+ /** Build a bounded read-only workspace snapshot when the caller did not supply explicit context. */
20
+ export declare function workspaceContext(cwd: string, question?: string, signal?: AbortSignal): Promise<string>;
21
+ /** Reject oversized input instead of silently discarding evidence. */
22
+ export declare function advicePrompt(question: string, context?: string): string;
23
+ /**
24
+ * Native restrictions supplement the outer filesystem sandbox.
25
+ *
26
+ * The outer `ctx.sandbox.confine` already enforces kernel-level read-only access
27
+ * outside the private scratch directory (`confined.enforcement === 'full'`).
28
+ * Codex must not spawn a nested macOS `sandbox-exec` (`sandbox_mode="danger-full-access"`
29
+ * disables its inner sandbox wrapper while the outer OS sandbox still blocks every
30
+ * write outside the scratch root). Claude Code enables only its read-only file
31
+ * inspection tools (`Read,Grep,Glob`) under `plan` permission mode.
32
+ */
33
+ export declare function adviceArgv(provider: TuiAdvisor, argv: readonly string[]): string[];
34
+ export declare function apply(ctx: Context, config: Config): void;