@agi-fans/oh-my-dsh 0.17.0 → 0.19.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
@@ -10,12 +10,14 @@ omdsh is a focused, keyboard-first DeepSeek coding agent built on the plugin arc
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
 
13
- English · [简体中文](https://github.com/agi-fans/oh-my-dsh/blob/main/README.zh-CN.md)
13
+ [Documentation](https://omdsh.agi.fans/) · English · [简体中文](https://github.com/agi-fans/oh-my-dsh/blob/main/README.zh-CN.md)
14
14
 
15
15
  </div>
16
16
 
17
17
  ![oh-my-dsh terminal interface](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/apps/site/public/screenshot.webp)
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.
20
+
19
21
  ## Quick start
20
22
 
21
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.
@@ -32,20 +34,45 @@ Run `/login` once inside omdsh to validate and save your DeepSeek API key, then
32
34
  - **Durable conversations:** search, pin, rename, and resume sessions in `/sessions`; rewind, retry, compact, and export complete transcripts as Markdown or standalone HTML.
33
35
  - **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
36
  - **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.
37
+ - **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`.
38
+ - **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
39
  - **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
40
  - **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
41
 
39
- ## Learn
42
+ ## Documentation
43
+
44
+ The full documentation is published at [omdsh.agi.fans](https://omdsh.agi.fans/), and the Markdown under `apps/site/content/` is its source of truth.
45
+
46
+ **Start here**
47
+
48
+ - [Tutorials](https://omdsh.agi.fans/docs/tutorials/) — complete a first task, give the agent precise context, guide queued work, recover long sessions, customize the environment, and write an installable plugin.
49
+ - [Commands](https://omdsh.agi.fans/docs/commands/) — every slash command with its arguments and aliases.
50
+ - [Keyboard and keys](https://omdsh.agi.fans/docs/keyboard/) — editing, transcript, overlay keys, and `keybindings.json`.
51
+
52
+ **Reference**
40
53
 
41
- The full documentation is also published on the [official site](https://omdsh.agi.fans/).
54
+ - [Sessions and history](https://omdsh.agi.fans/docs/sessions/) — durable logs, the Session Library, and the local data files.
55
+ - [Subagents and delegation](https://omdsh.agi.fans/docs/subagents/) — the three transports, the Agent Hub, steering, and background jobs.
56
+ - [Observability](https://omdsh.agi.fans/docs/observability/) — `/trajectory`, `/context`, `/diff`, `/tools`, and `/mcp`.
57
+ - [Settings](https://omdsh.agi.fans/docs/settings/) — appearance, motion, notifications, and the configurable status line.
58
+ - [Permissions and access](https://omdsh.agi.fans/docs/permissions/) — Access presets, sandbox, and approvals.
59
+ - [Command line](https://omdsh.agi.fans/docs/cli/) — flags, subcommands, and environment variables.
60
+ - [Tools](https://omdsh.agi.fans/docs/tools/) — what the model can use, grouped by capability.
61
+ - [Troubleshooting](https://omdsh.agi.fans/docs/troubleshooting/) — exit, color, scrollback, and boot failures.
42
62
 
43
- - [Tutorials](https://omdsh.agi.fans/docs/tutorials/) — complete a first task, add precise context, guide queued work, recover long sessions, customize the environment, and write an installable plugin.
44
- - [Skills and MCP](https://omdsh.agi.fans/docs/skills-and-mcp/) — extend a project with reusable instructions and external tools.
63
+ **Extend and integrate**
64
+
65
+ - [Skills and MCP](https://omdsh.agi.fans/docs/skills-and-mcp/) — reusable instructions and external tools.
66
+ - [Language servers](https://omdsh.agi.fans/docs/language-servers/) — configure read-only code intelligence.
45
67
  - [User plugins](https://omdsh.agi.fans/docs/plugins/) — install DSH bundles into the omdsh Profile with `omdsh plugin`.
46
- - [Architecture](https://omdsh.agi.fans/docs/architecture/) — understand the plugin boundaries and runtime data flow.
47
- - [Performance](https://omdsh.agi.fans/docs/performance/) — inspect the benchmarks, methodology, and rendering optimizations.
48
- - [Report a bug or request a feature](https://github.com/agi-fans/oh-my-dsh/issues/new/choose) — use a guided form to include the version, environment, reproduction steps, and sanitized context.
68
+ - [Plugin internals](https://omdsh.agi.fans/docs/plugin-internals/) — the `ctx.tui` surface and the contribution layer.
69
+
70
+ **Internals**
71
+
72
+ - [Architecture](https://omdsh.agi.fans/docs/architecture/) — plugin boundaries and runtime data flow.
73
+ - [Performance](https://omdsh.agi.fans/docs/performance/) — benchmarks, methodology, and rendering optimizations.
74
+
75
+ [Report a bug or request a feature](https://github.com/agi-fans/oh-my-dsh/issues/new/choose) with a guided form for the version, environment, reproduction steps, and sanitized context.
49
76
 
50
77
  ## Why oh-my-dsh
51
78
 
@@ -78,7 +105,7 @@ The TUI package is split into a service definition, local terminal Provider, ses
78
105
 
79
106
  ## Performance
80
107
 
81
- 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.
108
+ 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.
82
109
 
83
110
  See the reproducible [TUI performance report](https://omdsh.agi.fans/docs/performance/) or run `pnpm benchmark:tui` locally.
84
111
 
@@ -86,9 +113,9 @@ See the reproducible [TUI performance report](https://omdsh.agi.fans/docs/perfor
86
113
 
87
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.
88
115
 
89
- Model settings can also come from `$DSH_HOME/settings.yaml`. 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/).
116
+ 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/).
90
117
 
91
- After an upgrade, omdsh can show release notes once at startup. Use `/changelog` for recent entries or `/changelog full` for the complete packaged history. A cached daily npm check reports newer versions without installing anything automatically; both behaviors can be customized in `/settings`. Terminal notifications for completed long turns and human prompts are also configured there and remain off by default.
118
+ After an upgrade, omdsh can show release notes once at startup. Use `/changelog` for recent entries or `/changelog full` for the complete packaged history. A cached daily npm check reports newer versions without installing anything automatically; both behaviors can be customized in `/settings`. Terminal notifications for completed long turns and human prompts are also configured there and remain off by default. Every setting, its allowed values, and its default are listed in [Settings](https://omdsh.agi.fans/docs/settings/).
92
119
 
93
120
  Generate shell integration without starting the TUI or making network requests:
94
121
 
package/config/cordis.yml CHANGED
@@ -13,8 +13,13 @@
13
13
  - id: llm
14
14
  name: '@deepseek-ai/dsh-llm'
15
15
 
16
+ # `dsh-llm-deepseek` is the Messages transport library since the 0.2.0
17
+ # corridor; the plugin that owns the `deepseek-official` route now lives in
18
+ # `dsh-llm-deepseek-api-key` (the account-token sibling owns `deepseek-account`).
19
+ # The row id stays `llm-deepseek` because the settings namespace the TUI
20
+ # `/auth` and `/model` commands read is derived from the entry id.
16
21
  - id: llm-deepseek
17
- name: '@deepseek-ai/dsh-llm-deepseek'
22
+ name: '@deepseek-ai/dsh-llm-deepseek-api-key'
18
23
  config:
19
24
  # Current built-ins share this fallback. Exact catalog values still win,
20
25
  # and omitting models keeps future adapter additions visible.
@@ -63,9 +68,25 @@
63
68
  - id: session-query
64
69
  name: '@deepseek-ai/dsh-session-query-sqlite'
65
70
  config:
66
- path: ':memory:'
71
+ # Durable derived index rather than a per-process one: a cold launch then
72
+ # reconciles only new or changed logs instead of re-indexing the whole
73
+ # store, which is what made the first `/resume <query>` cost ~14s.
74
+ path: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/sessions-query.sqlite'"
67
75
  openAt: first-search
68
76
 
77
+ # Model-facing session history: five read-only tools that let the agent find
78
+ # 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`
80
+ # and `/resume` are human affordances it cannot reach. Cross-session reads
81
+ # are authorized only when the target session's cwd exactly matches the
82
+ # caller's, so the model cannot read another workspace's history.
83
+ #
84
+ # The cost is five tool schemas plus fixed guidance on every request. A
85
+ # deployment that would rather not pay it turns the row off in a home
86
+ # overlay with `disabled: true`.
87
+ - id: tool-session-query
88
+ name: '@deepseek-ai/dsh-tool-session-query'
89
+
69
90
  - id: session-reference
70
91
  name: '@deepseek-ai/dsh-session-reference'
71
92
 
@@ -99,6 +120,14 @@
99
120
  - id: workspace
100
121
  name: '@deepseek-ai/dsh-workspace'
101
122
 
123
+ # Per-turn changed-file summary. The plugin diffs git working-tree snapshots
124
+ # taken at turn start and turn end and announces each result with a
125
+ # `workspace/changes` event; the transcript renders the served file list, and
126
+ # a resumed session falls back to the turn-only form because the summaries
127
+ # live on the host only while the Session does.
128
+ - id: workspace-changes
129
+ name: '@deepseek-ai/dsh-workspace-changes'
130
+
102
131
  # Workspace @file discovery. The TUI owns mention syntax; this provider
103
132
  # ranks path-only candidates and, when `read` is visible, adds the stable
104
133
  # file-reference instruction. Selecting a row still inserts a path.
@@ -110,14 +139,18 @@
110
139
  config:
111
140
  dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
112
141
 
113
- # User settings document ($DSH_HOME/settings.yaml) and credential sources
114
- # (inherited env, managed .credentials.yaml, project/user .env) — the same
115
- # rows the harness base mounts, so omdsh honors the user's existing model
116
- # route and API key setup out of the box.
142
+ # User settings and credential sources (inherited env, managed
143
+ # .credentials.yaml, project/user .env) — the same rows the harness base
144
+ # mounts, so omdsh honors the user's existing model route and API key setup
145
+ # out of the box. Settings are live plugin config: forms expose the volatile
146
+ # fields of active entries, and config-editor persists an edit into the
147
+ # profile patch. A settings.yaml left by an earlier release is imported once
148
+ # and renamed to settings.yaml.imported.
149
+ - id: config-editor
150
+ name: '@deepseek-ai/dsh-config-editor'
151
+
117
152
  - id: settings
118
- name: '@deepseek-ai/dsh-settings-file'
119
- config:
120
- dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
153
+ name: '@deepseek-ai/dsh-settings'
121
154
 
122
155
  - id: credentials
123
156
  name: '@deepseek-ai/dsh-credentials-local'
@@ -146,18 +179,24 @@
146
179
  provider: !!js process.env.OMDSH_PROVIDER || 'deepseek-official'
147
180
  model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
148
181
 
149
- - id: agent-presets
150
- name: '@deepseek-ai/dsh-agent-presets'
182
+ # Agent presets: the registry owns the roster and the default, and every
183
+ # preset is an ordinary `@deepseek-ai/dsh-agent-preset` row declaring its
184
+ # child plugins. omdsh ships `standard`, `code`, `minimal`, and `cordis` as
185
+ # insert patches under `config/presets/`, applied after this file.
186
+ - id: agent-preset-registry
187
+ name: '@deepseek-ai/dsh-agent-preset-registry'
151
188
  config:
152
189
  default: standard
153
- includeShippedRoot: false
154
- roots:
155
- - path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
156
- trust: system
157
190
 
158
191
  - id: commands
159
192
  name: '@deepseek-ai/dsh-commands'
160
193
 
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'
199
+
161
200
  - id: user-questions
162
201
  name: '@deepseek-ai/dsh-user-questions'
163
202
 
@@ -322,8 +361,8 @@
322
361
  config:
323
362
  agents: []
324
363
 
325
- - id: code-runtime
326
- name: '@deepseek-ai/dsh-code-runtime-worker-thread'
364
+ - id: ptc-runtime
365
+ name: '@deepseek-ai/dsh-ptc-runtime-node'
327
366
 
328
367
  - id: cordis-host-runner
329
368
  name: '@deepseek-ai/dsh-cordis-host-runner'
@@ -335,6 +374,8 @@
335
374
 
336
375
  - id: tool-ask-user
337
376
  name: '@deepseek-ai/dsh-tool-ask-user'
377
+ config:
378
+ mode: legacy
338
379
 
339
380
  - id: plan-mode
340
381
  name: '@deepseek-ai/dsh-plan-mode'
@@ -377,34 +418,52 @@
377
418
  - id: tool-present
378
419
  name: '@deepseek-ai/dsh-tool-present'
379
420
 
380
- # Anonymous public web fetch, no credential and no search provider: a fetch
381
- # costs nothing and the TUI already renders web sources. Search stays off
382
- # because DeepSeek's native search spends a whole model turn per query; a
383
- # deployment that wants it mounts a provider in its own overlay and flips
384
- # `search` on here.
421
+ # Web tools: the model can fetch public pages for free, and search the web
422
+ # through DeepSeek's hosted search. Search is on by default because the
423
+ # official provider ships with the base and speaks the same Messages protocol
424
+ # as the conversation route, so it needs no extra credential setup: the key
425
+ # resolves through the credentials service at each search. A search is a full
426
+ # auxiliary model request, so its cost is bounded by `maxUses` (and the
427
+ # provider's own settings section tunes model, token cap, and endpoint); a
428
+ # deployment that wants no search disables `tool-web`'s `search` in its own
429
+ # overlay.
385
430
  - id: web
386
431
  name: '@deepseek-ai/dsh-web'
387
432
 
433
+ - id: web-search-deepseek
434
+ name: '@deepseek-ai/dsh-web-search-deepseek'
435
+ config:
436
+ apiKeyEnv: DEEPSEEK_API_KEY
437
+ maxUses: 5
438
+
388
439
  - id: web-fetch-http
389
440
  name: '@deepseek-ai/dsh-web-fetch-http'
390
441
 
391
442
  - id: tool-web
392
443
  name: '@deepseek-ai/dsh-tool-web'
393
444
  config:
394
- search: false
445
+ search: true
395
446
  fetch: true
396
-
397
- # Spills one oversized plain-text tool result to a private file and hands the
398
- # model a bounded preview plus the path. The cap is deliberately far above
399
- # upstream's 50 KB: the session log carries the replacement, so a lower cap
400
- # would shorten what a human can expand in the transcript.
447
+ searchTimeoutMs: 60000
448
+
449
+ # MCP resources: the three shared list/read tools appear only for callers whose
450
+ # scope has a connected MCP server, so a profile with no `mcp.json` pays no
451
+ # catalog cost. Resource text enters the conversation; binary payloads stay
452
+ # programmatic.
453
+ - id: mcp-resources
454
+ name: '@deepseek-ai/dsh-mcp-resources'
455
+
456
+ # Spills one oversized tool result to a private file and hands the model a
457
+ # bounded preview plus the path. The cap is deliberately far above upstream's
458
+ # 12500 estimated tokens: the session log carries the replacement, so a lower
459
+ # cap would shorten what a human can expand in the transcript.
401
460
  - id: spill-local
402
461
  name: '@deepseek-ai/dsh-spill-local'
403
462
 
404
463
  - id: spill-policy
405
464
  name: '@deepseek-ai/dsh-spill-policy'
406
465
  config:
407
- maxInlineBytes: 200000
466
+ maxInlineTokens: 50000
408
467
 
409
468
  - id: token-meter
410
469
  name: '@deepseek-ai/dsh-token-meter'
@@ -419,6 +478,12 @@
419
478
  headChars: 4096
420
479
  tailChars: 1024
421
480
 
481
+ # When an image-capable route rejects a request as over its image budget,
482
+ # replace the oldest images with placeholders on the surface and retry. The
483
+ # route keeps its full history in the session log; only the request degrades.
484
+ - id: image-offload
485
+ name: '@deepseek-ai/dsh-compaction-image-offload'
486
+
422
487
  - id: compaction
423
488
  name: '@deepseek-ai/dsh-compaction-basic'
424
489
 
@@ -524,13 +589,13 @@
524
589
 
525
590
  # Workflow and Ralph, as the upstream base bundle mounts them.
526
591
  #
527
- # The worker-thread engine is the seam provider: `dsh-workflow-worker-thread`
528
- # executes model-written orchestration scripts off the host event loop, which
592
+ # The PTC engine is the seam provider: `dsh-workflow-ptc` executes
593
+ # model-written orchestration scripts through the session's PTC runtime, which
529
594
  # is the same isolation the ACP subagent transport buys for delegation.
530
595
  # Mounting `dsh-workflow` as well would double-register `workflowEngine`, so
531
596
  # it stays a dependency the engine resolves rather than a composition row.
532
- - id: workflow-worker-thread
533
- name: '@deepseek-ai/dsh-workflow-worker-thread'
597
+ - id: workflow-ptc
598
+ name: '@deepseek-ai/dsh-workflow-ptc'
534
599
  config:
535
600
  provider: spawn
536
601
 
@@ -545,9 +610,15 @@
545
610
 
546
611
  # Ralph iterates fresh agents over a build-time-fixed script; it reuses the
547
612
  # continuable in-process `spawn` provider, so it depends on that transport
548
- # staying mounted.
613
+ # staying mounted. Off by default, matching the upstream base bundle: the
614
+ # tool description restricts `ralph` to runs the human explicitly asked for,
615
+ # and completion is a worker self-report rather than an independent
616
+ # evaluation. A home overlay restores it:
617
+ # - id: tool-ralph
618
+ # disabled: false
549
619
  - id: tool-ralph
550
620
  name: '@deepseek-ai/dsh-tool-ralph'
621
+ disabled: true
551
622
  config:
552
623
  subagentProvider: spawn
553
624
  maxRounds: 64
@@ -556,6 +627,10 @@
556
627
  name: '@agi-fans/dsh-tui'
557
628
  config:
558
629
  model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
630
+ # The settings overlay edits the Profile patch for optional features;
631
+ # `disabled` is a Loader option the settings service cannot write, so
632
+ # this row carries the home whose patch the Features section owns.
633
+ dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh'
559
634
 
560
635
  - id: agent-behavior
561
636
  name: '@agi-fans/oh-my-dsh/agent-behavior'
@@ -565,6 +640,11 @@
565
640
 
566
641
  - id: tui-session-runtime
567
642
  name: '@agi-fans/dsh-tui/session-runtime'
643
+ 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.
647
+ stateDir: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh'"
568
648
 
569
649
  - id: tui-human-interaction
570
650
  name: '@agi-fans/dsh-tui/human-interaction'
@@ -0,0 +1,40 @@
1
+ # Agent preset code: one `@deepseek-ai/dsh-agent-preset` declaration.
2
+ # Edits saved by `omdsh plugin` or a profile patch override this row's
3
+ # `config.plugins` by id from the profile patch.
4
+ - insert:
5
+ - id: preset-code
6
+ name: '@deepseek-ai/dsh-agent-preset'
7
+ config:
8
+ id: code
9
+ name: PTC
10
+ description: Standard coding agent optimized for programmatic tool calling through the generated TypeScript SDK.
11
+ order: 2
12
+ plugins:
13
+ - id: persona
14
+ name: '@deepseek-ai/dsh-persona'
15
+ config:
16
+ 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.
18
+
19
+ # PTC presents the tool registry as a generated SDK over `run_code`, so the
20
+ # general-purpose `workflow_run` tool would be a second model-authored
21
+ # orchestration surface beside it. The upstream `ptc` preset disables its own
22
+ # workflow rows for that reason; a preset cannot disable a host row, so the
23
+ # restriction does it here. `ralph` needs no entry: the deployment ships it
24
+ # disabled, and `tools.restrict()` rejects a name that no global tool owns — a
25
+ # home overlay that restores it accepts a second surface in this preset.
26
+ - id: profile
27
+ name: '@agi-fans/dsh-tui/agent-profile'
28
+ config:
29
+ tools:
30
+ deny:
31
+ - workflow_run
32
+
33
+ # PTC for this preset alone; `standard`, `minimal`, and `cordis` inherit the
34
+ # deployment default (`native`) from the host `tools` row. The row fails the
35
+ # mount when no PTC runtime is composed, which is the point: the session does
36
+ # not choose its presentation at runtime any more.
37
+ - id: tool-presentation
38
+ name: '@deepseek-ai/dsh-agent-tool-presentation'
39
+ config:
40
+ mode: ptc
@@ -0,0 +1,22 @@
1
+ # Agent preset cordis: one `@deepseek-ai/dsh-agent-preset` declaration.
2
+ # Edits saved by `omdsh plugin` or a profile patch override this row's
3
+ # `config.plugins` by id from the profile patch.
4
+ - insert:
5
+ - id: preset-cordis
6
+ name: '@deepseek-ai/dsh-agent-preset'
7
+ config:
8
+ id: cordis
9
+ name: Cordis
10
+ description: Standard coding agent with read-only runtime inspection for authoring Harness compositions.
11
+ order: 4
12
+ plugins:
13
+ - id: persona
14
+ name: '@deepseek-ai/dsh-persona'
15
+ config:
16
+ prefix: |-
17
+ You are a coding agent powered by the {{model}} model, running on the DeepSeek Harness. Your working directory is {{cwd}}.
18
+
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.
20
+
21
+ - id: tool-cordis
22
+ name: '@deepseek-ai/dsh-tool-cordis'
@@ -0,0 +1,64 @@
1
+ # Agent preset minimal: one `@deepseek-ai/dsh-agent-preset` declaration.
2
+ # Edits saved by `omdsh plugin` or a profile patch override this row's
3
+ # `config.plugins` by id from the profile patch.
4
+ - insert:
5
+ - id: preset-minimal
6
+ name: '@deepseek-ai/dsh-agent-preset'
7
+ config:
8
+ id: minimal
9
+ name: Minimal
10
+ description: Focused two-tool coding agent with a persistent Bash session and str_replace_editor.
11
+ order: 3
12
+ plugins:
13
+ - id: persona
14
+ name: '@deepseek-ai/dsh-persona'
15
+ config:
16
+ prefix: You are a helpful software engineer assistant.{{omdsh_agent_behavior}}
17
+ complete: true
18
+ includeRuntimeContext: false
19
+
20
+ # `shell` is an omdsh alias for the host's one shell tool (`bash` on POSIX,
21
+ # `pwsh` on Windows), so this two-tool shape holds on every platform without a
22
+ # name that `tools.restrict()` would reject.
23
+ - id: profile
24
+ name: '@agi-fans/dsh-tui/agent-profile'
25
+ config:
26
+ tools:
27
+ allow:
28
+ - shell
29
+ - str_replace_editor
30
+
31
+ - id: persistent-shell
32
+ name: cordis:group
33
+ group: true
34
+ isolate:
35
+ terminals: true
36
+ config:
37
+ - id: terminal
38
+ name: '@deepseek-ai/dsh-terminal'
39
+
40
+ - id: terminal-bash
41
+ name: '@deepseek-ai/dsh-terminal-bash'
42
+ disabled: !!js process.platform === 'win32'
43
+ config:
44
+ timeoutMs: 300000
45
+
46
+ - id: persistent-bash
47
+ name: '@deepseek-ai/dsh-tool-bash-persistent'
48
+ disabled: !!js process.platform === 'win32'
49
+ config:
50
+ timeoutMs: 300000
51
+
52
+ # The PTY backend is shared; the dialect selects PowerShell on Windows.
53
+ - id: terminal-pwsh
54
+ name: '@deepseek-ai/dsh-terminal-bash'
55
+ disabled: !!js process.platform !== 'win32'
56
+ config:
57
+ shellDialect: pwsh
58
+ timeoutMs: 300000
59
+
60
+ - id: persistent-pwsh
61
+ name: '@deepseek-ai/dsh-tool-pwsh-persistent'
62
+ disabled: !!js process.platform !== 'win32'
63
+ config:
64
+ timeoutMs: 300000
@@ -0,0 +1,17 @@
1
+ # Agent preset standard: one `@deepseek-ai/dsh-agent-preset` declaration.
2
+ # Edits saved by `omdsh plugin` or a profile patch override this row's
3
+ # `config.plugins` by id from the profile patch.
4
+ - insert:
5
+ - id: preset-standard
6
+ name: '@deepseek-ai/dsh-agent-preset'
7
+ config:
8
+ id: standard
9
+ name: Standard
10
+ description: Full coding agent with files, shell, search, skills, planning, goals, and delegation.
11
+ order: 1
12
+ plugins:
13
+ - id: persona
14
+ name: '@deepseek-ai/dsh-persona'
15
+ config:
16
+ prefix: >-
17
+ You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
@@ -2,23 +2,28 @@
2
2
  * Product-owned Agent behavior settings projected into the Harness system prompt.
3
3
  * @module @agi-fans/oh-my-dsh/agent-behavior
4
4
  */
5
- import type { Context } from '@deepseek-ai/cordis';
5
+ import type { Context, Volatile } from '@deepseek-ai/cordis';
6
6
  import type { Agent } from '@deepseek-ai/dsh-agent';
7
7
  import type { AssembleContext } from '@deepseek-ai/dsh-system-prompt';
8
8
  import z from '@deepseek-ai/schemastery';
9
- import type { TuiAgentBehaviorSettings } from '@agi-fans/dsh-tui';
10
9
  export declare const name = "omdsh-agent-behavior";
11
10
  export declare const inject: string[];
12
- export declare const AGENT_BEHAVIOR_SETTINGS_NAMESPACE = "omdsh-agent";
11
+ /** Profile entry id whose volatile config carries the language preference. */
12
+ export declare const AGENT_BEHAVIOR_ENTRY = "agent-behavior";
13
13
  export declare const AGENT_BEHAVIOR_SECTION = "omdsh:agent-behavior";
14
14
  export declare const AGENT_BEHAVIOR_ORDER = 30;
15
15
  export declare const AGENT_BEHAVIOR_VARIABLE = "omdsh_agent_behavior";
16
16
  export declare const AGENT_LANGUAGES: readonly ["auto", "zh-CN", "en"];
17
17
  export type AgentLanguage = typeof AGENT_LANGUAGES[number];
18
- export interface AgentBehaviorSettings extends TuiAgentBehaviorSettings {
19
- language: AgentLanguage;
18
+ /** Live language setting; a settings form edit commits into this reference. */
19
+ export interface Config {
20
+ language: Volatile<AgentLanguage>;
20
21
  }
21
- export declare const AgentBehaviorSettingsSchema: z<AgentBehaviorSettings>;
22
+ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
23
+ language: z<"auto" | "zh-CN" | "en", "auto" | "zh-CN" | "en", "volatile-defined">;
24
+ }>>, Schemastery.ObjectT<NoInfer<{
25
+ language: z<"auto" | "zh-CN" | "en", "auto" | "zh-CN" | "en", "volatile-defined">;
26
+ }>>, "plain">;
22
27
  /** Stable model instruction for one accepted language setting. */
23
28
  export declare function agentLanguageFragment(language: AgentLanguage): string;
24
29
  /** Freeze live user settings at a turn boundary while keeping direct assemblies useful. */
@@ -29,4 +34,4 @@ export declare class AgentBehaviorPrompt {
29
34
  fragment(context: AssembleContext, current: AgentLanguage): string;
30
35
  variable(context: AssembleContext, current: AgentLanguage): string;
31
36
  }
32
- export declare function apply(ctx: Context): void;
37
+ export declare function apply(ctx: Context, config: Config): void;
@@ -5,13 +5,14 @@
5
5
  import z from '@deepseek-ai/schemastery';
6
6
  export const name = 'omdsh-agent-behavior';
7
7
  export const inject = ['settings', 'systemPrompt'];
8
- export const AGENT_BEHAVIOR_SETTINGS_NAMESPACE = 'omdsh-agent';
8
+ /** Profile entry id whose volatile config carries the language preference. */
9
+ export const AGENT_BEHAVIOR_ENTRY = 'agent-behavior';
9
10
  export const AGENT_BEHAVIOR_SECTION = 'omdsh:agent-behavior';
10
11
  export const AGENT_BEHAVIOR_ORDER = 30;
11
12
  export const AGENT_BEHAVIOR_VARIABLE = 'omdsh_agent_behavior';
12
13
  export const AGENT_LANGUAGES = ['auto', 'zh-CN', 'en'];
13
- export const AgentBehaviorSettingsSchema = z.object({
14
- language: z.union([...AGENT_LANGUAGES]).default('auto'),
14
+ export const Config = z.object({
15
+ language: z.union([...AGENT_LANGUAGES]).default('auto').volatile(),
15
16
  });
16
17
  const LANGUAGE_FRAGMENTS = {
17
18
  'zh-CN': '主要使用简体中文进行推理和面向用户的沟通,包括回复、提问、计划、待办文字和子 Agent 简报。代码、标识符、命令、Tool 参数、日志、引用、文件内容和惯用技术术语在准确性需要时保留原文或标准写法。项目指令中明确规定语言时,遵循项目指令;若用户明确要求当前任务使用其他语言,以该要求为准。',
@@ -44,11 +45,10 @@ export class AgentBehaviorPrompt {
44
45
  return fragment === '' ? '' : `\n\n${fragment}`;
45
46
  }
46
47
  }
47
- export function apply(ctx) {
48
- const scope = ctx.settings.register(AGENT_BEHAVIOR_SETTINGS_NAMESPACE, AgentBehaviorSettingsSchema, { applies: 'live' });
48
+ export function apply(ctx, config) {
49
49
  const prompt = new AgentBehaviorPrompt();
50
50
  ctx.on('agent/pre-step', async (payload, next) => {
51
- prompt.snapshot(payload.agent, payload.turn, scope.get().language);
51
+ prompt.snapshot(payload.agent, payload.turn, config.language.get());
52
52
  return next();
53
53
  });
54
54
  ctx.on('agent/status', ({ agent, status }) => {
@@ -59,14 +59,15 @@ export function apply(ctx) {
59
59
  ctx.effect(() => ctx.systemPrompt.section({
60
60
  name: AGENT_BEHAVIOR_SECTION,
61
61
  order: AGENT_BEHAVIOR_ORDER,
62
- text: context => prompt.fragment(context, scope.get().language),
62
+ text: context => prompt.fragment(context, config.language.get()),
63
63
  }), 'omdsh Agent behavior prompt section');
64
- ctx.effect(() => ctx.systemPrompt.variable(AGENT_BEHAVIOR_VARIABLE, context => prompt.variable(context, scope.get().language)), 'omdsh Agent behavior prompt variable');
64
+ ctx.effect(() => ctx.systemPrompt.variable(AGENT_BEHAVIOR_VARIABLE, context => prompt.variable(context, config.language.get())), 'omdsh Agent behavior prompt variable');
65
65
  ctx.inject(['tui'], (tuiCtx) => {
66
66
  const binding = {
67
- get: () => scope.get(),
68
- update: next => scope.update({ language: next.language }),
69
- watch: listener => scope.watch(next => { listener(next); }),
67
+ get: () => ({ language: config.language.get() }),
68
+ update: next => tuiCtx.settings.mutate(AGENT_BEHAVIOR_ENTRY, [{ op: 'set', path: ['language'], value: next.language }]),
69
+ // A form edit commits into the reference and reaches this fiber only.
70
+ watch: listener => ctx.on('loader/volatile-update', () => { listener({ language: config.language.get() }); }),
70
71
  };
71
72
  tuiCtx.effect(() => tuiCtx.tui.bindAgentBehaviorSettings?.(binding) ?? (() => { }), 'bind Agent behavior settings to TUI');
72
73
  });
package/lib/boot.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * omdsh tree boot: mounts the omdsh Profile over an empty root, providing
3
- * the command line, the exit request, and the launch-environment snapshot
4
- * before any entry mounts.
2
+ * omdsh tree boot: mounts the omdsh Profile over an empty root, providing the
3
+ * command line, the profile facts, the runtime package resolution, and the
4
+ * launch-environment snapshot before any entry mounts.
5
5
  * @module @agi-fans/oh-my-dsh
6
6
  */
7
7
  import type { Context } from '@deepseek-ai/cordis';
package/lib/boot.js CHANGED
@@ -1,14 +1,14 @@
1
1
  /**
2
- * omdsh tree boot: mounts the omdsh Profile over an empty root, providing
3
- * the command line, the exit request, and the launch-environment snapshot
4
- * before any entry mounts.
2
+ * omdsh tree boot: mounts the omdsh Profile over an empty root, providing the
3
+ * command line, the profile facts, the runtime package resolution, and the
4
+ * launch-environment snapshot before any entry mounts.
5
5
  * @module @agi-fans/oh-my-dsh
6
6
  */
7
- import { boot, healProfilesModuleFallback, installFailLoud } from '@deepseek-ai/dsh-app-boot';
7
+ import { boot, createRuntimeResolution, installFailLoud, PluginPackages, } from '@deepseek-ai/dsh-app-boot';
8
8
  import { provideCmdline } from '@deepseek-ai/dsh-cmdline';
9
9
  import { DSH_LAUNCH_ENVIRONMENT_KEY } from '@deepseek-ai/dsh-launch-environment';
10
10
  import { NAME, prepareLaunchEnvironment } from "./composition.js";
11
- import { composeLaunch, INSTALL_ANCHOR } from "./profile.js";
11
+ import { composeLaunch, INSTALL_ANCHOR, PROFILE_NAME } from "./profile.js";
12
12
  import { omdshHome } from "./config-paths.js";
13
13
  import { createProcessShutdown } from "./process-shutdown.js";
14
14
  export { NAME } from "./composition.js";
@@ -31,14 +31,37 @@ export async function runOmdsh(prompt, resume) {
31
31
  installFailLoud(NAME, process, async () => { await app.current?.fiber.dispose(); });
32
32
  const environment = prepareLaunchEnvironment();
33
33
  const composed = composeLaunch();
34
- await healProfilesModuleFallback({
34
+ const home = omdshHome();
35
+ // The Profile facts every profile-scoped plugin reads: `dsh-settings` and
36
+ // `config-editor` persist edits into `patchPath`, and the composition
37
+ // preflight judges profile rows against the running DSH release. Overlays
38
+ // are the layers above the Profile patch, so a reconciliation re-derives
39
+ // exactly the list `composeLaunch` mounted.
40
+ const profileContext = {
41
+ name: PROFILE_NAME,
42
+ dir: composed.profile.dir,
43
+ patchPath: composed.profile.patchPath,
44
+ installAnchor: INSTALL_ANCHOR,
45
+ startedBundles: composed.profile.layers.map(layer => layer.packageName),
46
+ cwd: process.cwd(),
47
+ home,
48
+ overlays: composed.overlays,
49
+ telemetryDisabledEnv: process.env.DSH_TELEMETRY_DISABLED,
50
+ };
51
+ // One immutable package table for this launch: installation packages first
52
+ // (every `@deepseek-ai/*` and `@agi-fans/dsh-tui` module resolves from the
53
+ // omdsh installation), then the Profile's own `node_modules`, then the
54
+ // Profile's linked roots. No fallback links are created.
55
+ const resolution = await createRuntimeResolution({
35
56
  installAnchor: INSTALL_ANCHOR,
36
57
  profile: composed.profile,
37
- home: omdshHome(),
58
+ home,
38
59
  });
39
- const ctx = await boot(NAME, composed.rootConfig, structuredClone(composed.patches), (hostCtx) => {
60
+ const ctx = await boot(NAME, composed.rootConfig, structuredClone(composed.patches), async (hostCtx) => {
40
61
  app.current = hostCtx;
62
+ hostCtx.provide('profileContext', profileContext);
41
63
  hostCtx.provide(DSH_LAUNCH_ENVIRONMENT_KEY, environment);
64
+ await hostCtx.plugin(PluginPackages, { resolution });
42
65
  provideCmdline(hostCtx, {
43
66
  args: resume === undefined ? prompt : ['--resume', resume],
44
67
  exit: (code) => { void shutdown.shutdown(code); },
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { type ConfigDumpLayer } from '@deepseek-ai/dsh-app-boot';
7
7
  import type { LaunchEnvironmentSnapshot } from '@deepseek-ai/dsh-launch-environment';
8
- export { homePatchPath, INSTALL_ANCHOR, NAME, PRODUCT_BUNDLE, PROFILE_NAME, PROFILE_PATCH_LABEL, SHIPPED_PRESET_ROOT, } from './profile.ts';
8
+ export { homePatchPath, INSTALL_ANCHOR, NAME, PRODUCT_BUNDLE, PROFILE_NAME, PROFILE_PATCH_LABEL, } from './profile.ts';
9
9
  /**
10
10
  * Materialize the same inherited > project `.env` > home `.env` snapshot
11
11
  * that live boot uses, so dump, plugin, and mount see one process environment.
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { loadLayeredEnv, renderConfigDump, } from '@deepseek-ai/dsh-app-boot';
7
7
  import { composeLaunch, NAME } from "./profile.js";
8
- export { homePatchPath, INSTALL_ANCHOR, NAME, PRODUCT_BUNDLE, PROFILE_NAME, PROFILE_PATCH_LABEL, SHIPPED_PRESET_ROOT, } from "./profile.js";
8
+ export { homePatchPath, INSTALL_ANCHOR, NAME, PRODUCT_BUNDLE, PROFILE_NAME, PROFILE_PATCH_LABEL, } from "./profile.js";
9
9
  /**
10
10
  * Materialize the same inherited > project `.env` > home `.env` snapshot
11
11
  * that live boot uses, so dump, plugin, and mount see one process environment.
package/lib/profile.d.ts CHANGED
@@ -15,8 +15,6 @@ export declare const PROFILE_ROOT_FILENAME = "cordis.yml";
15
15
  export declare const PROFILE_PATCH_LABEL = "profiles/omdsh/cordis.patch.yml";
16
16
  /** Absolute path of this installation's package.json (src/ and lib/ both sit one level under apps/omdsh). */
17
17
  export declare const INSTALL_ANCHOR: string;
18
- /** Shipped agent-preset root: beside this app's own config, in both source and built layouts. */
19
- export declare const SHIPPED_PRESET_ROOT: string;
20
18
  /** Absolute path of the machine-local user patch layer. */
21
19
  export declare function homePatchPath(environment?: NodeJS.ProcessEnv): string;
22
20
  /** Keep the product bundle first; user bundles stay after it in their current order. */
@@ -28,8 +26,8 @@ export declare function ensureProductBundleFirst(dir: string): void;
28
26
  export declare function ensureOmdshProfile(home: string): string;
29
27
  /**
30
28
  * Ensure the Profile exists, load its bundles, and rewrite the empty root
31
- * include. Module fallback healing happens asynchronously in runOmdsh after
32
- * this function returns the resolved Profile.
29
+ * include. `runOmdsh` derives the runtime package resolution from the
30
+ * resolved Profile after this function returns.
33
31
  */
34
32
  export declare function prepareProfile(home: string, userLayer?: boolean): Profile;
35
33
  /** One launch's labeled layers and the flattened patch list `boot()` mounts. */
@@ -38,16 +36,12 @@ export interface LaunchComposition {
38
36
  rootConfig: string;
39
37
  layers: ConfigDumpLayer[];
40
38
  patches: PatchOptions[];
39
+ /** Layers above the Profile patch; the Profile facts re-derive them for a reconciliation. */
40
+ overlays: PatchOptions[];
41
41
  }
42
- /**
43
- * Restate the agent-presets row with the shipped roster root. Profile
44
- * `baseUrl` would otherwise resolve `./agent-presets/` inside the Profile
45
- * directory, which does not carry the product presets.
46
- */
47
- export declare function agentPresetsOverlay(layerPatches: readonly PatchOptions[][]): PatchOptions | undefined;
48
42
  /**
49
43
  * Compose the live launch layers in product → user bundles → Profile patch
50
- * → home patch → MCP → LSP → agent-presets overlay order.
44
+ * → home patch → MCP → LSP order.
51
45
  */
52
46
  export declare function composeLaunch(cwd?: string, environment?: NodeJS.ProcessEnv, options?: {
53
47
  userLayer?: boolean;
package/lib/profile.js CHANGED
@@ -9,7 +9,7 @@
9
9
  import { existsSync, writeFileSync } from 'node:fs';
10
10
  import { join } from 'node:path';
11
11
  import { fileURLToPath } from 'node:url';
12
- import { composeEntries, initProfile, loadOptionalPatches, loadProfile, PROFILE_PATCH_FILENAME, readProfileManifest, resolveProfileDir, writeProfileManifest, } from '@deepseek-ai/dsh-app-boot';
12
+ import { initProfile, loadOptionalPatches, loadProfile, PROFILE_PATCH_FILENAME, readProfileManifest, resolveProfileDir, writeProfileManifest, } from '@deepseek-ai/dsh-app-boot';
13
13
  import { omdshHome } from "./config-paths.js";
14
14
  import { loadLspPatches } from "./lsp-config.js";
15
15
  import { loadMcpPatches } from "./mcp-config.js";
@@ -20,13 +20,11 @@ export const PROFILE_ROOT_FILENAME = 'cordis.yml';
20
20
  export const PROFILE_PATCH_LABEL = 'profiles/omdsh/cordis.patch.yml';
21
21
  /** Absolute path of this installation's package.json (src/ and lib/ both sit one level under apps/omdsh). */
22
22
  export const INSTALL_ANCHOR = fileURLToPath(new URL('../package.json', import.meta.url));
23
- /** Shipped agent-preset root: beside this app's own config, in both source and built layouts. */
24
- export const SHIPPED_PRESET_ROOT = fileURLToPath(new URL('../config/agent-presets/', import.meta.url));
25
23
  /** The empty root entry list every Profile tree patches over. */
26
24
  const PROFILE_ROOT_CONFIG = `# omdsh profile root — an empty entry list. The tree is composed as patches:
27
25
  # the @agi-fans/oh-my-dsh product bundle, then each extra name in
28
26
  # package.json's dsh.profile.bundles, then cordis.patch.yml, then the home
29
- # patch and MCP inserts. Edit cordis.patch.yml, not this file.
27
+ # patch, MCP inserts, and LSP inserts. Edit cordis.patch.yml, not this file.
30
28
  []
31
29
  `;
32
30
  /** Absolute path of the machine-local user patch layer. */
@@ -58,8 +56,8 @@ export function ensureOmdshProfile(home) {
58
56
  }
59
57
  /**
60
58
  * Ensure the Profile exists, load its bundles, and rewrite the empty root
61
- * include. Module fallback healing happens asynchronously in runOmdsh after
62
- * this function returns the resolved Profile.
59
+ * include. `runOmdsh` derives the runtime package resolution from the
60
+ * resolved Profile after this function returns.
63
61
  */
64
62
  export function prepareProfile(home, userLayer = true) {
65
63
  ensureOmdshProfile(home);
@@ -67,26 +65,9 @@ export function prepareProfile(home, userLayer = true) {
67
65
  writeFileSync(join(profile.dir, PROFILE_ROOT_FILENAME), PROFILE_ROOT_CONFIG);
68
66
  return profile;
69
67
  }
70
- /**
71
- * Restate the agent-presets row with the shipped roster root. Profile
72
- * `baseUrl` would otherwise resolve `./agent-presets/` inside the Profile
73
- * directory, which does not carry the product presets.
74
- */
75
- export function agentPresetsOverlay(layerPatches) {
76
- const row = composeEntries([...layerPatches]).find(entry => entry.id === 'agent-presets');
77
- if (row === undefined)
78
- return undefined;
79
- return {
80
- id: 'agent-presets',
81
- config: {
82
- ...(row.config ?? {}),
83
- roots: [{ path: SHIPPED_PRESET_ROOT, trust: 'system' }],
84
- },
85
- };
86
- }
87
68
  /**
88
69
  * Compose the live launch layers in product → user bundles → Profile patch
89
- * → home patch → MCP → LSP → agent-presets overlay order.
70
+ * → home patch → MCP → LSP order.
90
71
  */
91
72
  export function composeLaunch(cwd = process.cwd(), environment = process.env, options = {}) {
92
73
  const userLayer = options.userLayer !== false;
@@ -108,14 +89,12 @@ export function composeLaunch(cwd = process.cwd(), environment = process.env, op
108
89
  const lsp = loadLspPatches(cwd, environment);
109
90
  if (lsp.length > 0)
110
91
  layers.push({ label: 'lsp.json', patches: lsp });
111
- const overlay = agentPresetsOverlay(layers.map(layer => layer.patches));
112
- if (overlay !== undefined)
113
- layers.push({ label: 'agent-presets', patches: [overlay] });
114
92
  return {
115
93
  profile,
116
94
  rootConfig: join(profile.dir, PROFILE_ROOT_FILENAME),
117
95
  layers,
118
96
  patches: layers.flatMap(layer => layer.patches),
97
+ overlays: [...mcp, ...lsp],
119
98
  };
120
99
  }
121
100
  //# sourceMappingURL=profile.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.17.0",
4
+ "version": "0.19.0",
5
5
  "homepage": "https://omdsh.agi.fans/",
6
6
  "keywords": [
7
7
  "omdsh",
@@ -41,7 +41,13 @@
41
41
  ],
42
42
  "dsh": {
43
43
  "bundle": {
44
- "patch": "./config/cordis.yml"
44
+ "patch": [
45
+ "./config/cordis.yml",
46
+ "./config/presets/standard.patch.yml",
47
+ "./config/presets/code.patch.yml",
48
+ "./config/presets/minimal.patch.yml",
49
+ "./config/presets/cordis.patch.yml"
50
+ ]
45
51
  }
46
52
  },
47
53
  "license": "MIT",
@@ -49,126 +55,134 @@
49
55
  "access": "public"
50
56
  },
51
57
  "dependencies": {
52
- "@deepseek-ai/cordis-plugin-loader": "1.0.3",
53
- "@deepseek-ai/cordis-plugin-timer": "1.1.4",
54
- "@deepseek-ai/dsh-agent": "0.1.5-rc.2",
55
- "@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.2",
56
- "@deepseek-ai/dsh-agent-instructions": "0.1.5-rc.2",
57
- "@deepseek-ai/dsh-agent-loop": "0.1.5-rc.2",
58
- "@deepseek-ai/dsh-agent-presets": "0.1.5-rc.2",
59
- "@deepseek-ai/dsh-app-boot": "0.1.5-rc.2",
60
- "@deepseek-ai/dsh-attachment-local": "0.1.5-rc.2",
61
- "@deepseek-ai/dsh-authorization": "0.1.5-rc.2",
62
- "@deepseek-ai/dsh-bash-sandbox": "0.1.5-rc.2",
63
- "@deepseek-ai/dsh-cmdline": "0.1.5-rc.2",
64
- "@deepseek-ai/dsh-code-runtime-worker-thread": "0.1.5-rc.2",
65
- "@deepseek-ai/dsh-command-compact": "0.1.5-rc.2",
66
- "@deepseek-ai/dsh-command-goal": "0.1.5-rc.2",
67
- "@deepseek-ai/dsh-commands": "0.1.5-rc.2",
68
- "@deepseek-ai/dsh-compaction-basic": "0.1.5-rc.2",
69
- "@deepseek-ai/dsh-compaction-tool-result-pruner": "0.1.5-rc.2",
70
- "@deepseek-ai/dsh-cordis-host-runner": "0.1.5-rc.2",
71
- "@deepseek-ai/dsh-credentials-local": "0.1.5-rc.2",
72
- "@deepseek-ai/dsh-file-reference": "0.1.5-rc.2",
73
- "@deepseek-ai/dsh-file-reference-local": "0.1.5-rc.2",
74
- "@deepseek-ai/dsh-fs-local": "0.1.5-rc.2",
75
- "@deepseek-ai/dsh-fs-observation-policy": "0.1.5-rc.2",
76
- "@deepseek-ai/dsh-fs-sandbox": "0.1.5-rc.2",
77
- "@deepseek-ai/dsh-goal": "0.1.5-rc.2",
78
- "@deepseek-ai/dsh-goal-round-driver": "0.1.5-rc.2",
79
- "@deepseek-ai/dsh-http-proxy": "0.1.5-rc.2",
80
- "@deepseek-ai/dsh-invariants": "0.1.5-rc.2",
81
- "@deepseek-ai/dsh-jobs-local": "0.1.5-rc.2",
82
- "@deepseek-ai/dsh-launch-environment": "0.1.5-rc.2",
83
- "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
84
- "@deepseek-ai/dsh-llm-deepseek": "0.1.5-rc.2",
85
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.5-rc.2",
86
- "@deepseek-ai/dsh-llm-retry": "0.1.5-rc.2",
87
- "@deepseek-ai/dsh-lsp": "0.1.5-rc.2",
88
- "@deepseek-ai/dsh-lsp-stdio": "0.1.5-rc.2",
89
- "@deepseek-ai/dsh-mcp-client": "0.1.5-rc.2",
90
- "@deepseek-ai/dsh-output-retention": "0.1.5-rc.2",
91
- "@deepseek-ai/dsh-permission-presets": "0.1.5-rc.2",
92
- "@deepseek-ai/dsh-persona": "0.1.5-rc.2",
93
- "@deepseek-ai/dsh-plan-mode": "0.1.5-rc.2",
94
- "@deepseek-ai/dsh-pwsh-local": "0.1.5-rc.2",
95
- "@deepseek-ai/dsh-pwsh-sandbox": "0.1.5-rc.2",
96
- "@deepseek-ai/dsh-repeat-tool-reminder": "0.1.5-rc.2",
97
- "@deepseek-ai/dsh-sandbox-local": "0.1.5-rc.2",
98
- "@deepseek-ai/dsh-sandbox-policy": "0.1.5-rc.2",
99
- "@deepseek-ai/dsh-scope": "0.1.5-rc.2",
100
- "@deepseek-ai/dsh-session": "0.1.5-rc.2",
101
- "@deepseek-ai/dsh-session-checkpoint-policy": "0.1.5-rc.2",
102
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.5-rc.2",
103
- "@deepseek-ai/dsh-session-projection": "0.1.5-rc.2",
104
- "@deepseek-ai/dsh-session-projection-cache": "0.1.5-rc.2",
105
- "@deepseek-ai/dsh-session-query": "0.1.5-rc.2",
106
- "@deepseek-ai/dsh-session-query-sqlite": "0.1.5-rc.2",
107
- "@deepseek-ai/dsh-session-reference": "0.1.5-rc.2",
108
- "@deepseek-ai/dsh-session-stats": "0.1.5-rc.2",
109
- "@deepseek-ai/dsh-session-title": "0.1.5-rc.2",
110
- "@deepseek-ai/dsh-session-title-first-prompt-llm": "0.1.5-rc.2",
111
- "@deepseek-ai/dsh-settings": "0.1.5-rc.2",
112
- "@deepseek-ai/dsh-settings-file": "0.1.5-rc.2",
113
- "@deepseek-ai/dsh-shell-env": "0.1.5-rc.2",
114
- "@deepseek-ai/dsh-skill": "0.1.5-rc.2",
115
- "@deepseek-ai/dsh-skill-filesystem": "0.1.5-rc.2",
116
- "@deepseek-ai/dsh-spill": "0.1.5-rc.2",
117
- "@deepseek-ai/dsh-spill-local": "0.1.5-rc.2",
118
- "@deepseek-ai/dsh-spill-policy": "0.1.5-rc.2",
119
- "@deepseek-ai/dsh-storage": "0.1.5-rc.2",
120
- "@deepseek-ai/dsh-storage-domain": "0.1.5-rc.2",
121
- "@deepseek-ai/dsh-storage-json": "0.1.5-rc.2",
122
- "@deepseek-ai/dsh-subagent": "0.1.5-rc.2",
123
- "@deepseek-ai/dsh-subagent-acp": "0.1.5-rc.2",
124
- "@deepseek-ai/dsh-subagent-fork-in-process": "0.1.5-rc.2",
125
- "@deepseek-ai/dsh-subagent-in-process-driver": "0.1.5-rc.2",
126
- "@deepseek-ai/dsh-subagent-spawn-in-process": "0.1.5-rc.2",
127
- "@deepseek-ai/dsh-subprocess-local": "0.1.5-rc.2",
128
- "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.2",
129
- "@deepseek-ai/dsh-terminal": "0.1.5-rc.2",
130
- "@deepseek-ai/dsh-terminal-bash": "0.1.5-rc.2",
131
- "@deepseek-ai/dsh-timeout": "0.1.5-rc.2",
132
- "@deepseek-ai/dsh-token-meter": "0.1.5-rc.2",
133
- "@deepseek-ai/dsh-tool-ask-user": "0.1.5-rc.2",
134
- "@deepseek-ai/dsh-tool-bash": "0.1.5-rc.2",
135
- "@deepseek-ai/dsh-tool-bash-persistent": "0.1.5-rc.2",
136
- "@deepseek-ai/dsh-tool-call-timeout-policy": "0.1.5-rc.2",
137
- "@deepseek-ai/dsh-tool-cordis": "0.1.5-rc.2",
138
- "@deepseek-ai/dsh-tool-fs": "0.1.5-rc.2",
139
- "@deepseek-ai/dsh-tool-fs-search": "0.1.5-rc.2",
140
- "@deepseek-ai/dsh-tool-goal": "0.1.5-rc.2",
141
- "@deepseek-ai/dsh-tool-jobs": "0.1.5-rc.2",
142
- "@deepseek-ai/dsh-tool-lsp": "0.1.5-rc.2",
143
- "@deepseek-ai/dsh-tool-present": "0.1.5-rc.2",
144
- "@deepseek-ai/dsh-tool-pwsh": "0.1.5-rc.2",
145
- "@deepseek-ai/dsh-tool-pwsh-persistent": "0.1.5-rc.2",
146
- "@deepseek-ai/dsh-tool-ralph": "0.1.5-rc.2",
147
- "@deepseek-ai/dsh-tool-skill": "0.1.5-rc.2",
148
- "@deepseek-ai/dsh-tool-str-replace-editor": "0.1.5-rc.2",
149
- "@deepseek-ai/dsh-tool-subagent": "0.1.5-rc.2",
150
- "@deepseek-ai/dsh-tool-subagent-control": "0.1.5-rc.2",
151
- "@deepseek-ai/dsh-tool-terminal": "0.1.5-rc.2",
152
- "@deepseek-ai/dsh-tool-todo": "0.1.5-rc.2",
153
- "@deepseek-ai/dsh-tool-web": "0.1.5-rc.2",
154
- "@deepseek-ai/dsh-tool-workflow": "0.1.5-rc.2",
155
- "@deepseek-ai/dsh-workspace": "0.1.5-rc.2",
156
- "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
157
- "@deepseek-ai/dsh-user-approval": "0.1.5-rc.2",
158
- "@deepseek-ai/dsh-user-questions": "0.1.5-rc.2",
159
- "@deepseek-ai/dsh-web": "0.1.5-rc.2",
160
- "@deepseek-ai/dsh-web-fetch-http": "0.1.5-rc.2",
161
- "@deepseek-ai/dsh-workflow": "0.1.5-rc.2",
162
- "@deepseek-ai/dsh-workflow-worker-thread": "0.1.5-rc.2",
163
- "@deepseek-ai/schemastery": "3.18.2",
164
- "node-addon-require-builtin": "0.1.4",
165
- "@agi-fans/dsh-tui": "^0.17.0"
58
+ "@deepseek-ai/cordis-plugin-loader": "1.0.5",
59
+ "@deepseek-ai/cordis-plugin-timer": "1.1.6",
60
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
61
+ "@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.2",
62
+ "@deepseek-ai/dsh-agent-instructions": "0.2.0-rc.2",
63
+ "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
64
+ "@deepseek-ai/dsh-agent-preset": "0.2.0-rc.2",
65
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
66
+ "@deepseek-ai/dsh-agent-tool-presentation": "0.2.0-rc.2",
67
+ "@deepseek-ai/dsh-app-boot": "0.2.0-rc.2",
68
+ "@deepseek-ai/dsh-attachment-local": "0.2.0-rc.2",
69
+ "@deepseek-ai/dsh-authorization": "0.2.0-rc.2",
70
+ "@deepseek-ai/dsh-bash-sandbox": "0.2.0-rc.2",
71
+ "@deepseek-ai/dsh-cmdline": "0.2.0-rc.2",
72
+ "@deepseek-ai/dsh-command-compact": "0.2.0-rc.2",
73
+ "@deepseek-ai/dsh-command-feedback": "0.2.0-rc.2",
74
+ "@deepseek-ai/dsh-command-goal": "0.2.0-rc.2",
75
+ "@deepseek-ai/dsh-commands": "0.2.0-rc.2",
76
+ "@deepseek-ai/dsh-compaction-basic": "0.2.0-rc.2",
77
+ "@deepseek-ai/dsh-compaction-image-offload": "0.2.0-rc.2",
78
+ "@deepseek-ai/dsh-compaction-tool-result-pruner": "0.2.0-rc.2",
79
+ "@deepseek-ai/dsh-config-editor": "0.2.0-rc.2",
80
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.0-rc.2",
81
+ "@deepseek-ai/dsh-credentials-local": "0.2.0-rc.2",
82
+ "@deepseek-ai/dsh-file-reference": "0.2.0-rc.2",
83
+ "@deepseek-ai/dsh-file-reference-local": "0.2.0-rc.2",
84
+ "@deepseek-ai/dsh-fs-local": "0.2.0-rc.2",
85
+ "@deepseek-ai/dsh-fs-observation-policy": "0.2.0-rc.2",
86
+ "@deepseek-ai/dsh-fs-sandbox": "0.2.0-rc.2",
87
+ "@deepseek-ai/dsh-goal": "0.2.0-rc.2",
88
+ "@deepseek-ai/dsh-goal-round-driver": "0.2.0-rc.2",
89
+ "@deepseek-ai/dsh-http-proxy": "0.2.0-rc.2",
90
+ "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
91
+ "@deepseek-ai/dsh-jobs-local": "0.2.0-rc.2",
92
+ "@deepseek-ai/dsh-launch-environment": "0.2.0-rc.2",
93
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
94
+ "@deepseek-ai/dsh-llm-deepseek-api-key": "0.2.0-rc.2",
95
+ "@deepseek-ai/dsh-llm-pi-ai": "0.2.0-rc.2",
96
+ "@deepseek-ai/dsh-llm-retry": "0.2.0-rc.2",
97
+ "@deepseek-ai/dsh-lsp": "0.2.0-rc.2",
98
+ "@deepseek-ai/dsh-lsp-stdio": "0.2.0-rc.2",
99
+ "@deepseek-ai/dsh-mcp-client": "0.2.0-rc.2",
100
+ "@deepseek-ai/dsh-mcp-resources": "0.2.0-rc.2",
101
+ "@deepseek-ai/dsh-output-retention": "0.2.0-rc.2",
102
+ "@deepseek-ai/dsh-permission-presets": "0.2.0-rc.2",
103
+ "@deepseek-ai/dsh-persona": "0.2.0-rc.2",
104
+ "@deepseek-ai/dsh-plan-mode": "0.2.0-rc.2",
105
+ "@deepseek-ai/dsh-ptc-runtime-node": "0.2.0-rc.2",
106
+ "@deepseek-ai/dsh-pwsh-local": "0.2.0-rc.2",
107
+ "@deepseek-ai/dsh-pwsh-sandbox": "0.2.0-rc.2",
108
+ "@deepseek-ai/dsh-repeat-tool-reminder": "0.2.0-rc.2",
109
+ "@deepseek-ai/dsh-sandbox-local": "0.2.0-rc.2",
110
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.0-rc.2",
111
+ "@deepseek-ai/dsh-scope": "0.2.0-rc.2",
112
+ "@deepseek-ai/dsh-session": "0.2.0-rc.2",
113
+ "@deepseek-ai/dsh-session-checkpoint-policy": "0.2.0-rc.2",
114
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.0-rc.2",
115
+ "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
116
+ "@deepseek-ai/dsh-session-projection-cache": "0.2.0-rc.2",
117
+ "@deepseek-ai/dsh-session-query": "0.2.0-rc.2",
118
+ "@deepseek-ai/dsh-session-query-sqlite": "0.2.0-rc.2",
119
+ "@deepseek-ai/dsh-session-reference": "0.2.0-rc.2",
120
+ "@deepseek-ai/dsh-session-stats": "0.2.0-rc.2",
121
+ "@deepseek-ai/dsh-session-title": "0.2.0-rc.2",
122
+ "@deepseek-ai/dsh-session-title-first-prompt-llm": "0.2.0-rc.2",
123
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
124
+ "@deepseek-ai/dsh-shell-env": "0.2.0-rc.2",
125
+ "@deepseek-ai/dsh-skill": "0.2.0-rc.2",
126
+ "@deepseek-ai/dsh-skill-filesystem": "0.2.0-rc.2",
127
+ "@deepseek-ai/dsh-spill": "0.2.0-rc.2",
128
+ "@deepseek-ai/dsh-spill-local": "0.2.0-rc.2",
129
+ "@deepseek-ai/dsh-spill-policy": "0.2.0-rc.2",
130
+ "@deepseek-ai/dsh-storage": "0.2.0-rc.2",
131
+ "@deepseek-ai/dsh-storage-domain": "0.2.0-rc.2",
132
+ "@deepseek-ai/dsh-storage-json": "0.2.0-rc.2",
133
+ "@deepseek-ai/dsh-subagent": "0.2.0-rc.2",
134
+ "@deepseek-ai/dsh-subagent-acp": "0.2.0-rc.2",
135
+ "@deepseek-ai/dsh-subagent-fork-in-process": "0.2.0-rc.2",
136
+ "@deepseek-ai/dsh-subagent-in-process-driver": "0.2.0-rc.2",
137
+ "@deepseek-ai/dsh-subagent-spawn-in-process": "0.2.0-rc.2",
138
+ "@deepseek-ai/dsh-subprocess-local": "0.2.0-rc.2",
139
+ "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
140
+ "@deepseek-ai/dsh-terminal": "0.2.0-rc.2",
141
+ "@deepseek-ai/dsh-terminal-bash": "0.2.0-rc.2",
142
+ "@deepseek-ai/dsh-timeout": "0.2.0-rc.2",
143
+ "@deepseek-ai/dsh-token-meter": "0.2.0-rc.2",
144
+ "@deepseek-ai/dsh-tool-ask-user": "0.2.0-rc.2",
145
+ "@deepseek-ai/dsh-tool-bash": "0.2.0-rc.2",
146
+ "@deepseek-ai/dsh-tool-bash-persistent": "0.2.0-rc.2",
147
+ "@deepseek-ai/dsh-tool-call-timeout-policy": "0.2.0-rc.2",
148
+ "@deepseek-ai/dsh-tool-cordis": "0.2.0-rc.2",
149
+ "@deepseek-ai/dsh-tool-fs": "0.2.0-rc.2",
150
+ "@deepseek-ai/dsh-tool-fs-search": "0.2.0-rc.2",
151
+ "@deepseek-ai/dsh-tool-goal": "0.2.0-rc.2",
152
+ "@deepseek-ai/dsh-tool-jobs": "0.2.0-rc.2",
153
+ "@deepseek-ai/dsh-tool-lsp": "0.2.0-rc.2",
154
+ "@deepseek-ai/dsh-tool-present": "0.2.0-rc.2",
155
+ "@deepseek-ai/dsh-tool-pwsh": "0.2.0-rc.2",
156
+ "@deepseek-ai/dsh-tool-pwsh-persistent": "0.2.0-rc.2",
157
+ "@deepseek-ai/dsh-tool-ralph": "0.2.0-rc.2",
158
+ "@deepseek-ai/dsh-tool-skill": "0.2.0-rc.2",
159
+ "@deepseek-ai/dsh-tool-str-replace-editor": "0.2.0-rc.2",
160
+ "@deepseek-ai/dsh-tool-subagent": "0.2.0-rc.2",
161
+ "@deepseek-ai/dsh-tool-subagent-control": "0.2.0-rc.2",
162
+ "@deepseek-ai/dsh-tool-terminal": "0.2.0-rc.2",
163
+ "@deepseek-ai/dsh-tool-session-query": "0.2.0-rc.2",
164
+ "@deepseek-ai/dsh-tool-todo": "0.2.0-rc.2",
165
+ "@deepseek-ai/dsh-tool-web": "0.2.0-rc.2",
166
+ "@deepseek-ai/dsh-tool-workflow": "0.2.0-rc.2",
167
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
168
+ "@deepseek-ai/dsh-user-approval": "0.2.0-rc.2",
169
+ "@deepseek-ai/dsh-user-questions": "0.2.0-rc.2",
170
+ "@deepseek-ai/dsh-web": "0.2.0-rc.2",
171
+ "@deepseek-ai/dsh-web-fetch-http": "0.2.0-rc.2",
172
+ "@deepseek-ai/dsh-web-search-deepseek": "0.2.0-rc.2",
173
+ "@deepseek-ai/dsh-workflow": "0.2.0-rc.2",
174
+ "@deepseek-ai/dsh-workflow-ptc": "0.2.0-rc.2",
175
+ "@deepseek-ai/dsh-workspace": "0.2.0-rc.2",
176
+ "@deepseek-ai/dsh-workspace-changes": "0.2.0-rc.2",
177
+ "@deepseek-ai/schemastery": "3.18.4",
178
+ "node-addon-require-builtin": "^0.1.6",
179
+ "@agi-fans/dsh-tui": "^0.19.0"
166
180
  },
167
181
  "peerDependencies": {
168
- "@deepseek-ai/cordis": "^4.0.2"
182
+ "@deepseek-ai/cordis": "^4.0.4"
169
183
  },
170
184
  "devDependencies": {
171
- "@deepseek-ai/cordis": "4.0.2",
185
+ "@deepseek-ai/cordis": "4.0.4",
172
186
  "@types/node": "^22.10.0",
173
187
  "tsx": "^4.19.0",
174
188
  "typescript": "^5.6.0",
@@ -1,5 +0,0 @@
1
- - id: persona
2
- name: '@deepseek-ai/dsh-persona'
3
- config:
4
- prefix: >-
5
- 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.
@@ -1,3 +0,0 @@
1
- name: PTC
2
- description: Standard coding agent optimized for programmatic tool calling through the generated TypeScript SDK.
3
- order: 2
@@ -1,10 +0,0 @@
1
- - id: persona
2
- name: '@deepseek-ai/dsh-persona'
3
- config:
4
- prefix: |-
5
- You are a coding agent powered by the {{model}} model, running on the DeepSeek Harness. Your working directory is {{cwd}}.
6
-
7
- You can inspect and experiment with the live Cordis runtime. Host composition owns shared registries and backends; an Agent preset owns one session's tools, persona, prompt sections, and isolated services. Treat runtime mutation as shell-level authority and explain the affected composition boundary before changing it.
8
-
9
- - id: tool-cordis
10
- name: '@deepseek-ai/dsh-tool-cordis'
@@ -1,3 +0,0 @@
1
- name: Cordis
2
- description: Standard coding agent with live runtime inspection and plugin experimentation for authoring Harness compositions.
3
- order: 4
@@ -1,52 +0,0 @@
1
- - id: persona
2
- name: '@deepseek-ai/dsh-persona'
3
- config:
4
- prefix: You are a helpful software engineer assistant.{{omdsh_agent_behavior}}
5
- complete: true
6
- includeRuntimeContext: false
7
-
8
- # `shell` is an omdsh alias for the host's one shell tool (`bash` on POSIX,
9
- # `pwsh` on Windows), so this two-tool shape holds on every platform without a
10
- # name that `tools.restrict()` would reject.
11
- - id: profile
12
- name: '@agi-fans/dsh-tui/agent-profile'
13
- config:
14
- tools:
15
- allow:
16
- - shell
17
- - str_replace_editor
18
-
19
- - id: persistent-shell
20
- name: cordis:group
21
- group: true
22
- isolate:
23
- terminals: true
24
- config:
25
- - id: terminal
26
- name: '@deepseek-ai/dsh-terminal'
27
-
28
- - id: terminal-bash
29
- name: '@deepseek-ai/dsh-terminal-bash'
30
- disabled: !!js process.platform === 'win32'
31
- config:
32
- timeoutMs: 300000
33
-
34
- - id: persistent-bash
35
- name: '@deepseek-ai/dsh-tool-bash-persistent'
36
- disabled: !!js process.platform === 'win32'
37
- config:
38
- timeoutMs: 300000
39
-
40
- # The PTY backend is shared; the dialect selects PowerShell on Windows.
41
- - id: terminal-pwsh
42
- name: '@deepseek-ai/dsh-terminal-bash'
43
- disabled: !!js process.platform !== 'win32'
44
- config:
45
- shellDialect: pwsh
46
- timeoutMs: 300000
47
-
48
- - id: persistent-pwsh
49
- name: '@deepseek-ai/dsh-tool-pwsh-persistent'
50
- disabled: !!js process.platform !== 'win32'
51
- config:
52
- timeoutMs: 300000
@@ -1,3 +0,0 @@
1
- name: Minimal
2
- description: Focused two-tool coding agent with a persistent Bash session and str_replace_editor.
3
- order: 3
@@ -1,5 +0,0 @@
1
- - id: persona
2
- name: '@deepseek-ai/dsh-persona'
3
- config:
4
- prefix: >-
5
- You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
@@ -1,3 +0,0 @@
1
- name: Standard
2
- description: Full coding agent with files, shell, search, skills, planning, goals, and delegation.
3
- order: 1