@agi-fans/oh-my-dsh 0.17.0 → 0.18.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,7 +10,7 @@ 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
 
@@ -36,16 +36,40 @@ Run `/login` once inside omdsh to validate and save your DeepSeek API key, then
36
36
  - **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
37
  - **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
38
 
39
- ## Learn
39
+ ## Documentation
40
40
 
41
- The full documentation is also published on the [official site](https://omdsh.agi.fans/).
41
+ 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.
42
42
 
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.
43
+ **Start here**
44
+
45
+ - [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.
46
+ - [Commands](https://omdsh.agi.fans/docs/commands/) — every slash command with its arguments and aliases.
47
+ - [Keyboard and keys](https://omdsh.agi.fans/docs/keyboard/) — editing, transcript, overlay keys, and `keybindings.json`.
48
+
49
+ **Reference**
50
+
51
+ - [Sessions and history](https://omdsh.agi.fans/docs/sessions/) — durable logs, the Session Library, and the local data files.
52
+ - [Subagents and delegation](https://omdsh.agi.fans/docs/subagents/) — the three transports, the Agent Hub, steering, and background jobs.
53
+ - [Observability](https://omdsh.agi.fans/docs/observability/) — `/trajectory`, `/context`, `/diff`, `/tools`, and `/mcp`.
54
+ - [Settings](https://omdsh.agi.fans/docs/settings/) — appearance, motion, notifications, and the configurable status line.
55
+ - [Permissions and access](https://omdsh.agi.fans/docs/permissions/) — Access presets, sandbox, and approvals.
56
+ - [Command line](https://omdsh.agi.fans/docs/cli/) — flags, subcommands, and environment variables.
57
+ - [Tools](https://omdsh.agi.fans/docs/tools/) — what the model can use, grouped by capability.
58
+ - [Troubleshooting](https://omdsh.agi.fans/docs/troubleshooting/) — exit, color, scrollback, and boot failures.
59
+
60
+ **Extend and integrate**
61
+
62
+ - [Skills and MCP](https://omdsh.agi.fans/docs/skills-and-mcp/) — reusable instructions and external tools.
63
+ - [Language servers](https://omdsh.agi.fans/docs/language-servers/) — configure read-only code intelligence.
45
64
  - [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.
65
+ - [Plugin internals](https://omdsh.agi.fans/docs/plugin-internals/) — the `ctx.tui` surface and the contribution layer.
66
+
67
+ **Internals**
68
+
69
+ - [Architecture](https://omdsh.agi.fans/docs/architecture/) — plugin boundaries and runtime data flow.
70
+ - [Performance](https://omdsh.agi.fans/docs/performance/) — benchmarks, methodology, and rendering optimizations.
71
+
72
+ [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
73
 
50
74
  ## Why oh-my-dsh
51
75
 
@@ -86,9 +110,9 @@ See the reproducible [TUI performance report](https://omdsh.agi.fans/docs/perfor
86
110
 
87
111
  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
112
 
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/).
113
+ 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
114
 
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.
115
+ 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
116
 
93
117
  Generate shell integration without starting the TUI or making network requests:
94
118
 
package/config/cordis.yml CHANGED
@@ -63,7 +63,10 @@
63
63
  - id: session-query
64
64
  name: '@deepseek-ai/dsh-session-query-sqlite'
65
65
  config:
66
- path: ':memory:'
66
+ # Durable derived index rather than a per-process one: a cold launch then
67
+ # reconciles only new or changed logs instead of re-indexing the whole
68
+ # store, which is what made the first `/resume <query>` cost ~14s.
69
+ path: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/sessions-query.sqlite'"
67
70
  openAt: first-search
68
71
 
69
72
  - id: session-reference
@@ -110,14 +113,18 @@
110
113
  config:
111
114
  dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
112
115
 
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.
116
+ # User settings and credential sources (inherited env, managed
117
+ # .credentials.yaml, project/user .env) — the same rows the harness base
118
+ # mounts, so omdsh honors the user's existing model route and API key setup
119
+ # out of the box. Settings are live plugin config: forms expose the volatile
120
+ # fields of active entries, and config-editor persists an edit into the
121
+ # profile patch. A settings.yaml left by an earlier release is imported once
122
+ # and renamed to settings.yaml.imported.
123
+ - id: config-editor
124
+ name: '@deepseek-ai/dsh-config-editor'
125
+
117
126
  - id: settings
118
- name: '@deepseek-ai/dsh-settings-file'
119
- config:
120
- dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
127
+ name: '@deepseek-ai/dsh-settings'
121
128
 
122
129
  - id: credentials
123
130
  name: '@deepseek-ai/dsh-credentials-local'
@@ -146,18 +153,24 @@
146
153
  provider: !!js process.env.OMDSH_PROVIDER || 'deepseek-official'
147
154
  model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
148
155
 
149
- - id: agent-presets
150
- name: '@deepseek-ai/dsh-agent-presets'
156
+ # Agent presets: the registry owns the roster and the default, and every
157
+ # preset is an ordinary `@deepseek-ai/dsh-agent-preset` row declaring its
158
+ # child plugins. omdsh ships `standard`, `code`, `minimal`, and `cordis` as
159
+ # insert patches under `config/presets/`, applied after this file.
160
+ - id: agent-preset-registry
161
+ name: '@deepseek-ai/dsh-agent-preset-registry'
151
162
  config:
152
163
  default: standard
153
- includeShippedRoot: false
154
- roots:
155
- - path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
156
- trust: system
157
164
 
158
165
  - id: commands
159
166
  name: '@deepseek-ai/dsh-commands'
160
167
 
168
+ # `/feedback <text>` records one log-only `feedback/record` event: immediate,
169
+ # model-invisible, and no report leaves the machine. The Web feedback dialog
170
+ # behind the same service stays a host-plane surface omdsh does not mount.
171
+ - id: command-feedback
172
+ name: '@deepseek-ai/dsh-command-feedback'
173
+
161
174
  - id: user-questions
162
175
  name: '@deepseek-ai/dsh-user-questions'
163
176
 
@@ -322,8 +335,8 @@
322
335
  config:
323
336
  agents: []
324
337
 
325
- - id: code-runtime
326
- name: '@deepseek-ai/dsh-code-runtime-worker-thread'
338
+ - id: ptc-runtime
339
+ name: '@deepseek-ai/dsh-ptc-runtime-node'
327
340
 
328
341
  - id: cordis-host-runner
329
342
  name: '@deepseek-ai/dsh-cordis-host-runner'
@@ -377,34 +390,52 @@
377
390
  - id: tool-present
378
391
  name: '@deepseek-ai/dsh-tool-present'
379
392
 
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.
393
+ # Web tools: the model can fetch public pages for free, and search the web
394
+ # through DeepSeek's hosted search. Search is on by default because the
395
+ # official provider ships with the base and speaks the same Messages protocol
396
+ # as the conversation route, so it needs no extra credential setup: the key
397
+ # resolves through the credentials service at each search. A search is a full
398
+ # auxiliary model request, so its cost is bounded by `maxUses` (and the
399
+ # provider's own settings section tunes model, token cap, and endpoint); a
400
+ # deployment that wants no search disables `tool-web`'s `search` in its own
401
+ # overlay.
385
402
  - id: web
386
403
  name: '@deepseek-ai/dsh-web'
387
404
 
405
+ - id: web-search-deepseek
406
+ name: '@deepseek-ai/dsh-web-search-deepseek'
407
+ config:
408
+ apiKeyEnv: DEEPSEEK_API_KEY
409
+ maxUses: 5
410
+
388
411
  - id: web-fetch-http
389
412
  name: '@deepseek-ai/dsh-web-fetch-http'
390
413
 
391
414
  - id: tool-web
392
415
  name: '@deepseek-ai/dsh-tool-web'
393
416
  config:
394
- search: false
417
+ search: true
395
418
  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.
419
+ searchTimeoutMs: 60000
420
+
421
+ # MCP resources: the three shared list/read tools appear only for callers whose
422
+ # scope has a connected MCP server, so a profile with no `mcp.json` pays no
423
+ # catalog cost. Resource text enters the conversation; binary payloads stay
424
+ # programmatic.
425
+ - id: mcp-resources
426
+ name: '@deepseek-ai/dsh-mcp-resources'
427
+
428
+ # Spills one oversized tool result to a private file and hands the model a
429
+ # bounded preview plus the path. The cap is deliberately far above upstream's
430
+ # 12500 estimated tokens: the session log carries the replacement, so a lower
431
+ # cap would shorten what a human can expand in the transcript.
401
432
  - id: spill-local
402
433
  name: '@deepseek-ai/dsh-spill-local'
403
434
 
404
435
  - id: spill-policy
405
436
  name: '@deepseek-ai/dsh-spill-policy'
406
437
  config:
407
- maxInlineBytes: 200000
438
+ maxInlineTokens: 50000
408
439
 
409
440
  - id: token-meter
410
441
  name: '@deepseek-ai/dsh-token-meter'
@@ -419,6 +450,12 @@
419
450
  headChars: 4096
420
451
  tailChars: 1024
421
452
 
453
+ # When an image-capable route rejects a request as over its image budget,
454
+ # replace the oldest images with placeholders on the surface and retry. The
455
+ # route keeps its full history in the session log; only the request degrades.
456
+ - id: image-offload
457
+ name: '@deepseek-ai/dsh-compaction-image-offload'
458
+
422
459
  - id: compaction
423
460
  name: '@deepseek-ai/dsh-compaction-basic'
424
461
 
@@ -524,13 +561,13 @@
524
561
 
525
562
  # Workflow and Ralph, as the upstream base bundle mounts them.
526
563
  #
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
564
+ # The PTC engine is the seam provider: `dsh-workflow-ptc` executes
565
+ # model-written orchestration scripts through the session's PTC runtime, which
529
566
  # is the same isolation the ACP subagent transport buys for delegation.
530
567
  # Mounting `dsh-workflow` as well would double-register `workflowEngine`, so
531
568
  # 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'
569
+ - id: workflow-ptc
570
+ name: '@deepseek-ai/dsh-workflow-ptc'
534
571
  config:
535
572
  provider: spawn
536
573
 
@@ -545,9 +582,15 @@
545
582
 
546
583
  # Ralph iterates fresh agents over a build-time-fixed script; it reuses the
547
584
  # continuable in-process `spawn` provider, so it depends on that transport
548
- # staying mounted.
585
+ # staying mounted. Off by default, matching the upstream base bundle: the
586
+ # tool description restricts `ralph` to runs the human explicitly asked for,
587
+ # and completion is a worker self-report rather than an independent
588
+ # evaluation. A home overlay restores it:
589
+ # - id: tool-ralph
590
+ # disabled: false
549
591
  - id: tool-ralph
550
592
  name: '@deepseek-ai/dsh-tool-ralph'
593
+ disabled: true
551
594
  config:
552
595
  subagentProvider: spawn
553
596
  maxRounds: 64
@@ -565,6 +608,11 @@
565
608
 
566
609
  - id: tui-session-runtime
567
610
  name: '@agi-fans/dsh-tui/session-runtime'
611
+ config:
612
+ # Product state this runtime owns: Session Library rows reused across
613
+ # launches (without them a cold process reads every stored log again) and
614
+ # the marker that upgrades stored sessions once per session format.
615
+ stateDir: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/omdsh'"
568
616
 
569
617
  - id: tui-human-interaction
570
618
  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.18.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,132 @@
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.1.7-rc.1",
61
+ "@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
62
+ "@deepseek-ai/dsh-agent-instructions": "0.1.7-rc.1",
63
+ "@deepseek-ai/dsh-agent-loop": "0.1.7-rc.1",
64
+ "@deepseek-ai/dsh-agent-preset": "0.1.7-rc.1",
65
+ "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
66
+ "@deepseek-ai/dsh-agent-tool-presentation": "0.1.7-rc.1",
67
+ "@deepseek-ai/dsh-app-boot": "0.1.7-rc.1",
68
+ "@deepseek-ai/dsh-attachment-local": "0.1.7-rc.1",
69
+ "@deepseek-ai/dsh-authorization": "0.1.7-rc.1",
70
+ "@deepseek-ai/dsh-bash-sandbox": "0.1.7-rc.1",
71
+ "@deepseek-ai/dsh-cmdline": "0.1.7-rc.1",
72
+ "@deepseek-ai/dsh-command-compact": "0.1.7-rc.1",
73
+ "@deepseek-ai/dsh-command-feedback": "0.1.7-rc.1",
74
+ "@deepseek-ai/dsh-command-goal": "0.1.7-rc.1",
75
+ "@deepseek-ai/dsh-commands": "0.1.7-rc.1",
76
+ "@deepseek-ai/dsh-compaction-basic": "0.1.7-rc.1",
77
+ "@deepseek-ai/dsh-compaction-image-offload": "0.1.7-rc.1",
78
+ "@deepseek-ai/dsh-compaction-tool-result-pruner": "0.1.7-rc.1",
79
+ "@deepseek-ai/dsh-config-editor": "0.1.7-rc.1",
80
+ "@deepseek-ai/dsh-cordis-host-runner": "0.1.7-rc.1",
81
+ "@deepseek-ai/dsh-credentials-local": "0.1.7-rc.1",
82
+ "@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
83
+ "@deepseek-ai/dsh-file-reference-local": "0.1.7-rc.1",
84
+ "@deepseek-ai/dsh-fs-local": "0.1.7-rc.1",
85
+ "@deepseek-ai/dsh-fs-observation-policy": "0.1.7-rc.1",
86
+ "@deepseek-ai/dsh-fs-sandbox": "0.1.7-rc.1",
87
+ "@deepseek-ai/dsh-goal": "0.1.7-rc.1",
88
+ "@deepseek-ai/dsh-goal-round-driver": "0.1.7-rc.1",
89
+ "@deepseek-ai/dsh-http-proxy": "0.1.7-rc.1",
90
+ "@deepseek-ai/dsh-invariants": "0.1.7-rc.1",
91
+ "@deepseek-ai/dsh-jobs-local": "0.1.7-rc.1",
92
+ "@deepseek-ai/dsh-launch-environment": "0.1.7-rc.1",
93
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
94
+ "@deepseek-ai/dsh-llm-deepseek": "0.1.7-rc.1",
95
+ "@deepseek-ai/dsh-llm-pi-ai": "0.1.7-rc.1",
96
+ "@deepseek-ai/dsh-llm-retry": "0.1.7-rc.1",
97
+ "@deepseek-ai/dsh-lsp": "0.1.7-rc.1",
98
+ "@deepseek-ai/dsh-lsp-stdio": "0.1.7-rc.1",
99
+ "@deepseek-ai/dsh-mcp-client": "0.1.7-rc.1",
100
+ "@deepseek-ai/dsh-mcp-resources": "0.1.7-rc.1",
101
+ "@deepseek-ai/dsh-output-retention": "0.1.7-rc.1",
102
+ "@deepseek-ai/dsh-permission-presets": "0.1.7-rc.1",
103
+ "@deepseek-ai/dsh-persona": "0.1.7-rc.1",
104
+ "@deepseek-ai/dsh-plan-mode": "0.1.7-rc.1",
105
+ "@deepseek-ai/dsh-ptc-runtime-node": "0.1.7-rc.1",
106
+ "@deepseek-ai/dsh-pwsh-local": "0.1.7-rc.1",
107
+ "@deepseek-ai/dsh-pwsh-sandbox": "0.1.7-rc.1",
108
+ "@deepseek-ai/dsh-repeat-tool-reminder": "0.1.7-rc.1",
109
+ "@deepseek-ai/dsh-sandbox-local": "0.1.7-rc.1",
110
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.7-rc.1",
111
+ "@deepseek-ai/dsh-scope": "0.1.7-rc.1",
112
+ "@deepseek-ai/dsh-session": "0.1.7-rc.1",
113
+ "@deepseek-ai/dsh-session-checkpoint-policy": "0.1.7-rc.1",
114
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.7-rc.1",
115
+ "@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
116
+ "@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
117
+ "@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
118
+ "@deepseek-ai/dsh-session-query-sqlite": "0.1.7-rc.1",
119
+ "@deepseek-ai/dsh-session-reference": "0.1.7-rc.1",
120
+ "@deepseek-ai/dsh-session-stats": "0.1.7-rc.1",
121
+ "@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
122
+ "@deepseek-ai/dsh-session-title-first-prompt-llm": "0.1.7-rc.1",
123
+ "@deepseek-ai/dsh-settings": "0.1.7-rc.1",
124
+ "@deepseek-ai/dsh-shell-env": "0.1.7-rc.1",
125
+ "@deepseek-ai/dsh-skill": "0.1.7-rc.1",
126
+ "@deepseek-ai/dsh-skill-filesystem": "0.1.7-rc.1",
127
+ "@deepseek-ai/dsh-spill": "0.1.7-rc.1",
128
+ "@deepseek-ai/dsh-spill-local": "0.1.7-rc.1",
129
+ "@deepseek-ai/dsh-spill-policy": "0.1.7-rc.1",
130
+ "@deepseek-ai/dsh-storage": "0.1.7-rc.1",
131
+ "@deepseek-ai/dsh-storage-domain": "0.1.7-rc.1",
132
+ "@deepseek-ai/dsh-storage-json": "0.1.7-rc.1",
133
+ "@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
134
+ "@deepseek-ai/dsh-subagent-acp": "0.1.7-rc.1",
135
+ "@deepseek-ai/dsh-subagent-fork-in-process": "0.1.7-rc.1",
136
+ "@deepseek-ai/dsh-subagent-in-process-driver": "0.1.7-rc.1",
137
+ "@deepseek-ai/dsh-subagent-spawn-in-process": "0.1.7-rc.1",
138
+ "@deepseek-ai/dsh-subprocess-local": "0.1.7-rc.1",
139
+ "@deepseek-ai/dsh-system-prompt": "0.1.7-rc.1",
140
+ "@deepseek-ai/dsh-terminal": "0.1.7-rc.1",
141
+ "@deepseek-ai/dsh-terminal-bash": "0.1.7-rc.1",
142
+ "@deepseek-ai/dsh-timeout": "0.1.7-rc.1",
143
+ "@deepseek-ai/dsh-token-meter": "0.1.7-rc.1",
144
+ "@deepseek-ai/dsh-tool-ask-user": "0.1.7-rc.1",
145
+ "@deepseek-ai/dsh-tool-bash": "0.1.7-rc.1",
146
+ "@deepseek-ai/dsh-tool-bash-persistent": "0.1.7-rc.1",
147
+ "@deepseek-ai/dsh-tool-call-timeout-policy": "0.1.7-rc.1",
148
+ "@deepseek-ai/dsh-tool-cordis": "0.1.7-rc.1",
149
+ "@deepseek-ai/dsh-tool-fs": "0.1.7-rc.1",
150
+ "@deepseek-ai/dsh-tool-fs-search": "0.1.7-rc.1",
151
+ "@deepseek-ai/dsh-tool-goal": "0.1.7-rc.1",
152
+ "@deepseek-ai/dsh-tool-jobs": "0.1.7-rc.1",
153
+ "@deepseek-ai/dsh-tool-lsp": "0.1.7-rc.1",
154
+ "@deepseek-ai/dsh-tool-present": "0.1.7-rc.1",
155
+ "@deepseek-ai/dsh-tool-pwsh": "0.1.7-rc.1",
156
+ "@deepseek-ai/dsh-tool-pwsh-persistent": "0.1.7-rc.1",
157
+ "@deepseek-ai/dsh-tool-ralph": "0.1.7-rc.1",
158
+ "@deepseek-ai/dsh-tool-skill": "0.1.7-rc.1",
159
+ "@deepseek-ai/dsh-tool-str-replace-editor": "0.1.7-rc.1",
160
+ "@deepseek-ai/dsh-tool-subagent": "0.1.7-rc.1",
161
+ "@deepseek-ai/dsh-tool-subagent-control": "0.1.7-rc.1",
162
+ "@deepseek-ai/dsh-tool-terminal": "0.1.7-rc.1",
163
+ "@deepseek-ai/dsh-tool-todo": "0.1.7-rc.1",
164
+ "@deepseek-ai/dsh-tool-web": "0.1.7-rc.1",
165
+ "@deepseek-ai/dsh-tool-workflow": "0.1.7-rc.1",
166
+ "@deepseek-ai/dsh-tools": "0.1.7-rc.1",
167
+ "@deepseek-ai/dsh-user-approval": "0.1.7-rc.1",
168
+ "@deepseek-ai/dsh-user-questions": "0.1.7-rc.1",
169
+ "@deepseek-ai/dsh-web": "0.1.7-rc.1",
170
+ "@deepseek-ai/dsh-web-fetch-http": "0.1.7-rc.1",
171
+ "@deepseek-ai/dsh-web-search-deepseek": "0.1.7-rc.1",
172
+ "@deepseek-ai/dsh-workflow": "0.1.7-rc.1",
173
+ "@deepseek-ai/dsh-workflow-ptc": "0.1.7-rc.1",
174
+ "@deepseek-ai/dsh-workspace": "0.1.7-rc.1",
175
+ "@deepseek-ai/schemastery": "3.18.4",
176
+ "node-addon-require-builtin": "^0.1.6",
177
+ "@agi-fans/dsh-tui": "^0.18.0"
166
178
  },
167
179
  "peerDependencies": {
168
- "@deepseek-ai/cordis": "^4.0.2"
180
+ "@deepseek-ai/cordis": "^4.0.4"
169
181
  },
170
182
  "devDependencies": {
171
- "@deepseek-ai/cordis": "4.0.2",
183
+ "@deepseek-ai/cordis": "4.0.4",
172
184
  "@types/node": "^22.10.0",
173
185
  "tsx": "^4.19.0",
174
186
  "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