@agi-fans/oh-my-dsh 0.16.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 +34 -10
- package/config/cordis.yml +132 -33
- package/config/presets/code.patch.yml +40 -0
- package/config/presets/cordis.patch.yml +22 -0
- package/config/presets/minimal.patch.yml +64 -0
- package/config/presets/standard.patch.yml +17 -0
- package/lib/agent-behavior.d.ts +12 -7
- package/lib/agent-behavior.js +12 -11
- package/lib/boot.d.ts +3 -3
- package/lib/boot.js +31 -8
- package/lib/composition.d.ts +1 -1
- package/lib/composition.js +1 -1
- package/lib/profile.d.ts +5 -11
- package/lib/profile.js +6 -27
- package/package.json +130 -112
- package/config/agent-presets/code/agent.cordis.yml +0 -5
- package/config/agent-presets/code/preset.yml +0 -3
- package/config/agent-presets/cordis/agent.cordis.yml +0 -10
- package/config/agent-presets/cordis/preset.yml +0 -3
- package/config/agent-presets/minimal/agent.cordis.yml +0 -52
- package/config/agent-presets/minimal/preset.yml +0 -3
- package/config/agent-presets/standard/agent.cordis.yml +0 -5
- package/config/agent-presets/standard/preset.yml +0 -3
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
|
[](https://github.com/agi-fans/oh-my-dsh/actions/workflows/ci.yml) [](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [](https://nodejs.org/) [](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
|
-
##
|
|
39
|
+
## Documentation
|
|
40
40
|
|
|
41
|
-
The full documentation is
|
|
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
|
-
|
|
44
|
-
|
|
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
|
-
- [
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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
|
@@ -41,6 +41,19 @@
|
|
|
41
41
|
fallbackMaxBytes: 80
|
|
42
42
|
maxTitleBytes: 120
|
|
43
43
|
|
|
44
|
+
# LLM title provider over the first prompt — the row the harness base ships,
|
|
45
|
+
# so omdsh sessions get a summarized title instead of the deterministic
|
|
46
|
+
# fallback (first words or the cwd basename) that the recent-session list
|
|
47
|
+
# and the web sidebar currently show.
|
|
48
|
+
- id: session-title-llm
|
|
49
|
+
name: '@deepseek-ai/dsh-session-title-first-prompt-llm'
|
|
50
|
+
config:
|
|
51
|
+
targetWords: 5
|
|
52
|
+
targetCjkCharacters: 10
|
|
53
|
+
maxInputBytes: 4096
|
|
54
|
+
maxOutputTokens: 64
|
|
55
|
+
timeoutMs: 60000
|
|
56
|
+
|
|
44
57
|
- id: session-stats
|
|
45
58
|
name: '@deepseek-ai/dsh-session-stats'
|
|
46
59
|
|
|
@@ -50,12 +63,45 @@
|
|
|
50
63
|
- id: session-query
|
|
51
64
|
name: '@deepseek-ai/dsh-session-query-sqlite'
|
|
52
65
|
config:
|
|
53
|
-
|
|
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'"
|
|
54
70
|
openAt: first-search
|
|
55
71
|
|
|
56
72
|
- id: session-reference
|
|
57
73
|
name: '@deepseek-ai/dsh-session-reference'
|
|
58
74
|
|
|
75
|
+
# Durable KV stack plus the workspace registry — the same chain the harness
|
|
76
|
+
# base and web layer mount. The registry groups sessions by canonical cwd
|
|
77
|
+
# into durable workspace records; omdsh attaches each session it creates,
|
|
78
|
+
# so sessions appear grouped in the harness web instead of ungrouped. The
|
|
79
|
+
# storage root follows the session store so both read the same home.
|
|
80
|
+
- id: storage
|
|
81
|
+
name: '@deepseek-ai/dsh-storage'
|
|
82
|
+
|
|
83
|
+
- id: storage-json
|
|
84
|
+
name: '@deepseek-ai/dsh-storage-json'
|
|
85
|
+
config:
|
|
86
|
+
root: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/storages'"
|
|
87
|
+
|
|
88
|
+
- id: storage-domain
|
|
89
|
+
name: '@deepseek-ai/dsh-storage-domain'
|
|
90
|
+
config:
|
|
91
|
+
backend: json
|
|
92
|
+
|
|
93
|
+
# Durable projection checkpoints — the piece that lets a cold session
|
|
94
|
+
# answer its title without reading its log. Without it the `@` session
|
|
95
|
+
# menu and the recent-session list can only label cold sessions by id.
|
|
96
|
+
- id: session-projection-cache
|
|
97
|
+
name: '@deepseek-ai/dsh-session-projection-cache'
|
|
98
|
+
config:
|
|
99
|
+
writeEveryEvents: 200
|
|
100
|
+
writeIntervalMs: 5000
|
|
101
|
+
|
|
102
|
+
- id: workspace
|
|
103
|
+
name: '@deepseek-ai/dsh-workspace'
|
|
104
|
+
|
|
59
105
|
# Workspace @file discovery. The TUI owns mention syntax; this provider
|
|
60
106
|
# ranks path-only candidates and, when `read` is visible, adds the stable
|
|
61
107
|
# file-reference instruction. Selecting a row still inserts a path.
|
|
@@ -67,14 +113,18 @@
|
|
|
67
113
|
config:
|
|
68
114
|
dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
|
|
69
115
|
|
|
70
|
-
# User settings
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
#
|
|
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
|
+
|
|
74
126
|
- id: settings
|
|
75
|
-
name: '@deepseek-ai/dsh-settings
|
|
76
|
-
config:
|
|
77
|
-
dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
|
|
127
|
+
name: '@deepseek-ai/dsh-settings'
|
|
78
128
|
|
|
79
129
|
- id: credentials
|
|
80
130
|
name: '@deepseek-ai/dsh-credentials-local'
|
|
@@ -103,18 +153,24 @@
|
|
|
103
153
|
provider: !!js process.env.OMDSH_PROVIDER || 'deepseek-official'
|
|
104
154
|
model: !!js process.env.OMDSH_MODEL || 'deepseek-flash'
|
|
105
155
|
|
|
106
|
-
|
|
107
|
-
|
|
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'
|
|
108
162
|
config:
|
|
109
163
|
default: standard
|
|
110
|
-
includeShippedRoot: false
|
|
111
|
-
roots:
|
|
112
|
-
- path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
|
|
113
|
-
trust: system
|
|
114
164
|
|
|
115
165
|
- id: commands
|
|
116
166
|
name: '@deepseek-ai/dsh-commands'
|
|
117
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
|
+
|
|
118
174
|
- id: user-questions
|
|
119
175
|
name: '@deepseek-ai/dsh-user-questions'
|
|
120
176
|
|
|
@@ -186,6 +242,14 @@
|
|
|
186
242
|
# tool-skill 注册(两者都以 session 前缀消息注入,注册顺序即渲染顺序)。
|
|
187
243
|
- id: system-prompt
|
|
188
244
|
name: '@deepseek-ai/dsh-system-prompt'
|
|
245
|
+
config:
|
|
246
|
+
# Renders as the `deployment:persona-suffix` section — the last prompt
|
|
247
|
+
# section, right above the tool catalog. The delegation tools differ in
|
|
248
|
+
# transport, and the in-process ones share this session's event loop:
|
|
249
|
+
# without routing guidance the model has no reason to ever pick
|
|
250
|
+
# `subagent_isolated`, so heavy parallel delegation starves rendering.
|
|
251
|
+
personaSuffix: |
|
|
252
|
+
Delegation routing: `subagent` and `subagent_fork` run the child in this process — the child stays steerable through `send_message` and continuable after it settles, but every in-process child shares the interactive session's capacity. `subagent_isolated` runs the child in a separate process: one-shot, no steering, no follow-up, and the host session stays responsive under heavy or parallel delegation. Prefer `subagent_isolated` when dispatching several independent tasks at once or a single heavyweight self-contained task; use `subagent` when steering or continuation matters, and `subagent_fork` when the task builds on this conversation's completed turns.
|
|
189
253
|
|
|
190
254
|
- id: tools
|
|
191
255
|
name: '@deepseek-ai/dsh-tools'
|
|
@@ -271,8 +335,8 @@
|
|
|
271
335
|
config:
|
|
272
336
|
agents: []
|
|
273
337
|
|
|
274
|
-
- id:
|
|
275
|
-
name: '@deepseek-ai/dsh-
|
|
338
|
+
- id: ptc-runtime
|
|
339
|
+
name: '@deepseek-ai/dsh-ptc-runtime-node'
|
|
276
340
|
|
|
277
341
|
- id: cordis-host-runner
|
|
278
342
|
name: '@deepseek-ai/dsh-cordis-host-runner'
|
|
@@ -326,34 +390,52 @@
|
|
|
326
390
|
- id: tool-present
|
|
327
391
|
name: '@deepseek-ai/dsh-tool-present'
|
|
328
392
|
|
|
329
|
-
#
|
|
330
|
-
#
|
|
331
|
-
#
|
|
332
|
-
#
|
|
333
|
-
#
|
|
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.
|
|
334
402
|
- id: web
|
|
335
403
|
name: '@deepseek-ai/dsh-web'
|
|
336
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
|
+
|
|
337
411
|
- id: web-fetch-http
|
|
338
412
|
name: '@deepseek-ai/dsh-web-fetch-http'
|
|
339
413
|
|
|
340
414
|
- id: tool-web
|
|
341
415
|
name: '@deepseek-ai/dsh-tool-web'
|
|
342
416
|
config:
|
|
343
|
-
search:
|
|
417
|
+
search: true
|
|
344
418
|
fetch: true
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
#
|
|
348
|
-
#
|
|
349
|
-
#
|
|
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.
|
|
350
432
|
- id: spill-local
|
|
351
433
|
name: '@deepseek-ai/dsh-spill-local'
|
|
352
434
|
|
|
353
435
|
- id: spill-policy
|
|
354
436
|
name: '@deepseek-ai/dsh-spill-policy'
|
|
355
437
|
config:
|
|
356
|
-
|
|
438
|
+
maxInlineTokens: 50000
|
|
357
439
|
|
|
358
440
|
- id: token-meter
|
|
359
441
|
name: '@deepseek-ai/dsh-token-meter'
|
|
@@ -368,6 +450,12 @@
|
|
|
368
450
|
headChars: 4096
|
|
369
451
|
tailChars: 1024
|
|
370
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
|
+
|
|
371
459
|
- id: compaction
|
|
372
460
|
name: '@deepseek-ai/dsh-compaction-basic'
|
|
373
461
|
|
|
@@ -473,13 +561,13 @@
|
|
|
473
561
|
|
|
474
562
|
# Workflow and Ralph, as the upstream base bundle mounts them.
|
|
475
563
|
#
|
|
476
|
-
# The
|
|
477
|
-
#
|
|
564
|
+
# The PTC engine is the seam provider: `dsh-workflow-ptc` executes
|
|
565
|
+
# model-written orchestration scripts through the session's PTC runtime, which
|
|
478
566
|
# is the same isolation the ACP subagent transport buys for delegation.
|
|
479
567
|
# Mounting `dsh-workflow` as well would double-register `workflowEngine`, so
|
|
480
568
|
# it stays a dependency the engine resolves rather than a composition row.
|
|
481
|
-
- id: workflow-
|
|
482
|
-
name: '@deepseek-ai/dsh-workflow-
|
|
569
|
+
- id: workflow-ptc
|
|
570
|
+
name: '@deepseek-ai/dsh-workflow-ptc'
|
|
483
571
|
config:
|
|
484
572
|
provider: spawn
|
|
485
573
|
|
|
@@ -494,9 +582,15 @@
|
|
|
494
582
|
|
|
495
583
|
# Ralph iterates fresh agents over a build-time-fixed script; it reuses the
|
|
496
584
|
# continuable in-process `spawn` provider, so it depends on that transport
|
|
497
|
-
# 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
|
|
498
591
|
- id: tool-ralph
|
|
499
592
|
name: '@deepseek-ai/dsh-tool-ralph'
|
|
593
|
+
disabled: true
|
|
500
594
|
config:
|
|
501
595
|
subagentProvider: spawn
|
|
502
596
|
maxRounds: 64
|
|
@@ -514,6 +608,11 @@
|
|
|
514
608
|
|
|
515
609
|
- id: tui-session-runtime
|
|
516
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'"
|
|
517
616
|
|
|
518
617
|
- id: tui-human-interaction
|
|
519
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}}.
|
package/lib/agent-behavior.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
|
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;
|
package/lib/agent-behavior.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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: () =>
|
|
68
|
-
update: next =>
|
|
69
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
|
|
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
|
|
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); },
|
package/lib/composition.d.ts
CHANGED
|
@@ -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,
|
|
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.
|
package/lib/composition.js
CHANGED
|
@@ -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,
|
|
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.
|
|
32
|
-
* this function returns
|
|
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
|
|
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 {
|
|
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
|
|
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.
|
|
62
|
-
* this function returns
|
|
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
|
|
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.
|
|
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":
|
|
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,120 +55,132 @@
|
|
|
49
55
|
"access": "public"
|
|
50
56
|
},
|
|
51
57
|
"dependencies": {
|
|
52
|
-
"@deepseek-ai/cordis-plugin-loader": "1.0.
|
|
53
|
-
"@deepseek-ai/cordis-plugin-timer": "1.1.
|
|
54
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
55
|
-
"@deepseek-ai/dsh-agent-default-model": "0.1.
|
|
56
|
-
"@deepseek-ai/dsh-agent-instructions": "0.1.
|
|
57
|
-
"@deepseek-ai/dsh-agent-loop": "0.1.
|
|
58
|
-
"@deepseek-ai/dsh-agent-
|
|
59
|
-
"@deepseek-ai/dsh-
|
|
60
|
-
"@deepseek-ai/dsh-
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-
|
|
64
|
-
"@deepseek-ai/dsh-
|
|
65
|
-
"@deepseek-ai/dsh-
|
|
66
|
-
"@deepseek-ai/dsh-command-
|
|
67
|
-
"@deepseek-ai/dsh-
|
|
68
|
-
"@deepseek-ai/dsh-
|
|
69
|
-
"@deepseek-ai/dsh-
|
|
70
|
-
"@deepseek-ai/dsh-
|
|
71
|
-
"@deepseek-ai/dsh-
|
|
72
|
-
"@deepseek-ai/dsh-
|
|
73
|
-
"@deepseek-ai/dsh-
|
|
74
|
-
"@deepseek-ai/dsh-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
76
|
-
"@deepseek-ai/dsh-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-
|
|
90
|
-
"@deepseek-ai/dsh-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
96
|
-
"@deepseek-ai/dsh-
|
|
97
|
-
"@deepseek-ai/dsh-
|
|
98
|
-
"@deepseek-ai/dsh-
|
|
99
|
-
"@deepseek-ai/dsh-
|
|
100
|
-
"@deepseek-ai/dsh-
|
|
101
|
-
"@deepseek-ai/dsh-
|
|
102
|
-
"@deepseek-ai/dsh-
|
|
103
|
-
"@deepseek-ai/dsh-
|
|
104
|
-
"@deepseek-ai/dsh-
|
|
105
|
-
"@deepseek-ai/dsh-
|
|
106
|
-
"@deepseek-ai/dsh-session
|
|
107
|
-
"@deepseek-ai/dsh-session-
|
|
108
|
-
"@deepseek-ai/dsh-session-
|
|
109
|
-
"@deepseek-ai/dsh-
|
|
110
|
-
"@deepseek-ai/dsh-
|
|
111
|
-
"@deepseek-ai/dsh-
|
|
112
|
-
"@deepseek-ai/dsh-
|
|
113
|
-
"@deepseek-ai/dsh-
|
|
114
|
-
"@deepseek-ai/dsh-
|
|
115
|
-
"@deepseek-ai/dsh-
|
|
116
|
-
"@deepseek-ai/dsh-
|
|
117
|
-
"@deepseek-ai/dsh-
|
|
118
|
-
"@deepseek-ai/dsh-
|
|
119
|
-
"@deepseek-ai/dsh-
|
|
120
|
-
"@deepseek-ai/dsh-
|
|
121
|
-
"@deepseek-ai/dsh-
|
|
122
|
-
"@deepseek-ai/dsh-
|
|
123
|
-
"@deepseek-ai/dsh-
|
|
124
|
-
"@deepseek-ai/dsh-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-
|
|
129
|
-
"@deepseek-ai/dsh-
|
|
130
|
-
"@deepseek-ai/dsh-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-
|
|
133
|
-
"@deepseek-ai/dsh-
|
|
134
|
-
"@deepseek-ai/dsh-
|
|
135
|
-
"@deepseek-ai/dsh-
|
|
136
|
-
"@deepseek-ai/dsh-
|
|
137
|
-
"@deepseek-ai/dsh-
|
|
138
|
-
"@deepseek-ai/dsh-tool-
|
|
139
|
-
"@deepseek-ai/dsh-tool-
|
|
140
|
-
"@deepseek-ai/dsh-tool-
|
|
141
|
-
"@deepseek-ai/dsh-tool-
|
|
142
|
-
"@deepseek-ai/dsh-tool-
|
|
143
|
-
"@deepseek-ai/dsh-tool-
|
|
144
|
-
"@deepseek-ai/dsh-tool-
|
|
145
|
-
"@deepseek-ai/dsh-tool-
|
|
146
|
-
"@deepseek-ai/dsh-tool-
|
|
147
|
-
"@deepseek-ai/dsh-tool-
|
|
148
|
-
"@deepseek-ai/dsh-tool-
|
|
149
|
-
"@deepseek-ai/dsh-tool-
|
|
150
|
-
"@deepseek-ai/dsh-
|
|
151
|
-
"@deepseek-ai/dsh-
|
|
152
|
-
"@deepseek-ai/dsh-
|
|
153
|
-
"@deepseek-ai/dsh-
|
|
154
|
-
"@deepseek-ai/dsh-
|
|
155
|
-
"@deepseek-ai/dsh-
|
|
156
|
-
"@deepseek-ai/dsh-
|
|
157
|
-
"@deepseek-ai/
|
|
158
|
-
"
|
|
159
|
-
"@
|
|
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"
|
|
160
178
|
},
|
|
161
179
|
"peerDependencies": {
|
|
162
|
-
"@deepseek-ai/cordis": "^4.0.
|
|
180
|
+
"@deepseek-ai/cordis": "^4.0.4"
|
|
163
181
|
},
|
|
164
182
|
"devDependencies": {
|
|
165
|
-
"@deepseek-ai/cordis": "4.0.
|
|
183
|
+
"@deepseek-ai/cordis": "4.0.4",
|
|
166
184
|
"@types/node": "^22.10.0",
|
|
167
185
|
"tsx": "^4.19.0",
|
|
168
186
|
"typescript": "^5.6.0",
|
|
@@ -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,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
|