@agi-fans/oh-my-dsh 0.13.0 → 0.14.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/config/cordis.yml CHANGED
@@ -106,6 +106,7 @@
106
106
  name: '@deepseek-ai/dsh-agent-presets'
107
107
  config:
108
108
  default: standard
109
+ includeShippedRoot: false
109
110
  roots:
110
111
  - path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
111
112
  trust: system
@@ -164,19 +165,78 @@
164
165
  name: Full access
165
166
  description: Full filesystem access without approval prompts.
166
167
 
167
- - id: spine
168
- name: '@deepseek-ai/dsh-agent-spine-demo'
168
+ # — spine 展开块(替代已删除的 @deepseek-ai/dsh-agent-spine-demo)—
169
+ # 顺序遵循上游 spine apply() 的挂载顺序;agent-instructions 必须先于
170
+ # tool-skill 注册(两者都以 session 前缀消息注入,注册顺序即渲染顺序)。
171
+ - id: system-prompt
172
+ name: '@deepseek-ai/dsh-system-prompt'
173
+
174
+ - id: tools
175
+ name: '@deepseek-ai/dsh-tools'
176
+ config:
177
+ mode: native
178
+
179
+ - id: skill
180
+ name: '@deepseek-ai/dsh-skill'
181
+
182
+ - id: skill-filesystem
183
+ name: '@deepseek-ai/dsh-skill-filesystem'
184
+ config:
185
+ dshHome: !!js process.env.OMDSH_HOME || undefined
186
+
187
+ - id: llm-retry
188
+ name: '@deepseek-ai/dsh-llm-retry'
189
+
190
+ - id: goal
191
+ name: '@deepseek-ai/dsh-goal'
192
+
193
+ - id: tool-goal
194
+ name: '@deepseek-ai/dsh-tool-goal'
195
+
196
+ - id: goal-round-driver
197
+ name: '@deepseek-ai/dsh-goal-round-driver'
198
+
199
+ - id: jobs
200
+ name: '@deepseek-ai/dsh-jobs-local'
201
+
202
+ - id: invariants
203
+ name: '@deepseek-ai/dsh-invariants'
204
+
205
+ - id: session-invariant
206
+ name: '@deepseek-ai/dsh-session/invariant'
207
+
208
+ - id: agent-invariant
209
+ name: '@deepseek-ai/dsh-agent/invariant'
210
+
211
+ - id: scope-invariant
212
+ name: '@deepseek-ai/dsh-scope/invariant'
213
+
214
+ - id: agent-loop-invariant
215
+ name: '@deepseek-ai/dsh-agent-loop/invariant'
216
+
217
+ - id: shell-env
218
+ name: '@deepseek-ai/dsh-shell-env'
169
219
  config:
170
- workspaceContext:
171
- maxBytes: 65536
172
220
  dshHome: !!js process.env.OMDSH_HOME || undefined
173
- skills:
174
- enabled: true
175
- goals:
176
- domain: {}
177
- tool: {}
178
- tools:
179
- mode: native
221
+
222
+ - id: tool-bash
223
+ name: '@deepseek-ai/dsh-tool-bash'
224
+
225
+ - id: agent-instructions
226
+ name: '@deepseek-ai/dsh-agent-instructions'
227
+ config:
228
+ maxBytes: 65536
229
+
230
+ - id: tool-skill
231
+ name: '@deepseek-ai/dsh-tool-skill'
232
+
233
+ - id: tool-jobs
234
+ name: '@deepseek-ai/dsh-tool-jobs'
235
+
236
+ - id: agent-loop
237
+ name: '@deepseek-ai/dsh-agent-loop'
238
+ config:
239
+ agents: []
180
240
 
181
241
  - id: code-runtime
182
242
  name: '@deepseek-ai/dsh-code-runtime-worker-thread'
@@ -2,7 +2,6 @@
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 { settingsNamespace } from '@deepseek-ai/dsh-settings';
6
5
  import z from '@deepseek-ai/schemastery';
7
6
  export const name = 'omdsh-agent-behavior';
8
7
  export const inject = ['settings', 'systemPrompt'];
@@ -46,7 +45,7 @@ export class AgentBehaviorPrompt {
46
45
  }
47
46
  }
48
47
  export function apply(ctx) {
49
- const scope = ctx.settings.register(settingsNamespace(AGENT_BEHAVIOR_SETTINGS_NAMESPACE), AgentBehaviorSettingsSchema, { applies: 'live' });
48
+ const scope = ctx.settings.register(AGENT_BEHAVIOR_SETTINGS_NAMESPACE, AgentBehaviorSettingsSchema, { applies: 'live' });
50
49
  const prompt = new AgentBehaviorPrompt();
51
50
  ctx.on('agent/pre-step', async (payload, next) => {
52
51
  prompt.snapshot(payload.agent, payload.turn, scope.get().language);
package/lib/boot.js CHANGED
@@ -4,11 +4,12 @@
4
4
  * before any entry mounts.
5
5
  * @module @agi-fans/oh-my-dsh
6
6
  */
7
- import { boot, installFailLoud } from '@deepseek-ai/dsh-app-boot';
7
+ import { boot, healProfilesModuleFallback, installFailLoud } 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 } from "./profile.js";
11
+ import { composeLaunch, INSTALL_ANCHOR } from "./profile.js";
12
+ import { omdshHome } from "./mcp-config.js";
12
13
  import { createProcessShutdown } from "./process-shutdown.js";
13
14
  export { NAME } from "./composition.js";
14
15
  /**
@@ -32,6 +33,11 @@ export async function runOmdsh(prompt, resume) {
32
33
  installFailLoud(NAME, process, async () => { await app.current?.fiber.dispose(); });
33
34
  const environment = prepareLaunchEnvironment();
34
35
  const composed = composeLaunch();
36
+ await healProfilesModuleFallback({
37
+ installAnchor: INSTALL_ANCHOR,
38
+ profile: composed.profile,
39
+ home: omdshHome(),
40
+ });
35
41
  const ctx = await boot(NAME, composed.rootConfig, structuredClone(composed.patches), (hostCtx) => {
36
42
  app.current = hostCtx;
37
43
  hostCtx.provide(DSH_LAUNCH_ENVIRONMENT_KEY, environment);
package/lib/profile.d.ts CHANGED
@@ -27,8 +27,9 @@ export declare function ensureProductBundleFirst(dir: string): void;
27
27
  */
28
28
  export declare function ensureOmdshProfile(home: string): string;
29
29
  /**
30
- * Heal the shared module fallback, ensure the Profile exists, load its
31
- * bundles, and rewrite the empty root include.
30
+ * 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.
32
33
  */
33
34
  export declare function prepareProfile(home: string, userLayer?: boolean): Profile;
34
35
  /** One launch's labeled layers and the flattened patch list `boot()` mounts. */
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, healProfilesModuleFallback, initProfile, loadOptionalPatches, loadProfile, PROFILE_PATCH_FILENAME, readProfileManifest, resolveProfileDir, writeProfileManifest, } from '@deepseek-ai/dsh-app-boot';
12
+ import { composeEntries, initProfile, loadOptionalPatches, loadProfile, PROFILE_PATCH_FILENAME, readProfileManifest, resolveProfileDir, writeProfileManifest, } from '@deepseek-ai/dsh-app-boot';
13
13
  import { loadMcpPatches, omdshHome } from "./mcp-config.js";
14
14
  export const NAME = 'omdsh';
15
15
  export const PROFILE_NAME = 'omdsh';
@@ -55,11 +55,11 @@ export function ensureOmdshProfile(home) {
55
55
  return dir;
56
56
  }
57
57
  /**
58
- * Heal the shared module fallback, ensure the Profile exists, load its
59
- * bundles, and rewrite the empty root include.
58
+ * Ensure the Profile exists, load its bundles, and rewrite the empty root
59
+ * include. Module fallback healing happens asynchronously in runOmdsh after
60
+ * this function returns the resolved Profile.
60
61
  */
61
62
  export function prepareProfile(home, userLayer = true) {
62
- healProfilesModuleFallback(INSTALL_ANCHOR, home);
63
63
  ensureOmdshProfile(home);
64
64
  const profile = loadProfile(NAME, PROFILE_NAME, INSTALL_ANCHOR, home, { userLayer });
65
65
  writeFileSync(join(profile.dir, PROFILE_ROOT_FILENAME), PROFILE_ROOT_CONFIG);
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.13.0",
4
+ "version": "0.14.0",
5
5
  "homepage": "https://omdsh.agi.fans/",
6
6
  "keywords": [
7
7
  "omdsh",
@@ -49,80 +49,95 @@
49
49
  "access": "public"
50
50
  },
51
51
  "dependencies": {
52
- "@deepseek-ai/cordis-plugin-loader": "1.0.2",
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.2-rc.1",
55
+ "@deepseek-ai/dsh-agent-default-model": "0.1.2-rc.1",
56
+ "@deepseek-ai/dsh-agent-instructions": "0.1.2-rc.1",
57
+ "@deepseek-ai/dsh-agent-loop": "0.1.2-rc.1",
58
+ "@deepseek-ai/dsh-agent-presets": "0.1.2-rc.1",
59
+ "@deepseek-ai/dsh-app-boot": "0.1.2-rc.1",
60
+ "@deepseek-ai/dsh-attachment-local": "0.1.2-rc.1",
61
+ "@deepseek-ai/dsh-authorization": "0.1.2-rc.1",
62
+ "@deepseek-ai/dsh-bash-sandbox": "0.1.2-rc.1",
63
+ "@deepseek-ai/dsh-cmdline": "0.1.2-rc.1",
64
+ "@deepseek-ai/dsh-code-runtime-worker-thread": "0.1.2-rc.1",
65
+ "@deepseek-ai/dsh-command-compact": "0.1.2-rc.1",
66
+ "@deepseek-ai/dsh-command-goal": "0.1.2-rc.1",
67
+ "@deepseek-ai/dsh-commands": "0.1.2-rc.1",
68
+ "@deepseek-ai/dsh-compaction-basic": "0.1.2-rc.1",
69
+ "@deepseek-ai/dsh-cordis-host-runner": "0.1.2-rc.1",
70
+ "@deepseek-ai/dsh-credentials-local": "0.1.2-rc.1",
71
+ "@deepseek-ai/dsh-file-reference": "0.1.2-rc.1",
72
+ "@deepseek-ai/dsh-file-reference-local": "0.1.2-rc.1",
73
+ "@deepseek-ai/dsh-fs-local": "0.1.2-rc.1",
74
+ "@deepseek-ai/dsh-fs-observation-policy": "0.1.2-rc.1",
75
+ "@deepseek-ai/dsh-goal": "0.1.2-rc.1",
76
+ "@deepseek-ai/dsh-goal-round-driver": "0.1.2-rc.1",
77
+ "@deepseek-ai/dsh-invariants": "0.1.2-rc.1",
78
+ "@deepseek-ai/dsh-jobs-local": "0.1.2-rc.1",
79
+ "@deepseek-ai/dsh-launch-environment": "0.1.2-rc.1",
80
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
81
+ "@deepseek-ai/dsh-llm-deepseek": "0.1.2-rc.1",
82
+ "@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1",
83
+ "@deepseek-ai/dsh-llm-retry": "0.1.2-rc.1",
84
+ "@deepseek-ai/dsh-mcp-client": "0.1.2-rc.1",
85
+ "@deepseek-ai/dsh-permission-presets": "0.1.2-rc.1",
86
+ "@deepseek-ai/dsh-persona": "0.1.2-rc.1",
87
+ "@deepseek-ai/dsh-plan-mode": "0.1.2-rc.1",
88
+ "@deepseek-ai/dsh-sandbox-local": "0.1.2-rc.1",
89
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.2-rc.1",
90
+ "@deepseek-ai/dsh-scope": "0.1.2-rc.1",
91
+ "@deepseek-ai/dsh-session": "0.1.2-rc.1",
92
+ "@deepseek-ai/dsh-session-checkpoint-policy": "0.1.2-rc.1",
93
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.2-rc.1",
94
+ "@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
95
+ "@deepseek-ai/dsh-session-query": "0.1.2-rc.1",
96
+ "@deepseek-ai/dsh-session-query-sqlite": "0.1.2-rc.1",
97
+ "@deepseek-ai/dsh-session-reference": "0.1.2-rc.1",
98
+ "@deepseek-ai/dsh-session-stats": "0.1.2-rc.1",
99
+ "@deepseek-ai/dsh-session-title": "0.1.2-rc.1",
100
+ "@deepseek-ai/dsh-settings": "0.1.2-rc.1",
101
+ "@deepseek-ai/dsh-settings-file": "0.1.2-rc.1",
102
+ "@deepseek-ai/dsh-shell-env": "0.1.2-rc.1",
103
+ "@deepseek-ai/dsh-skill": "0.1.2-rc.1",
104
+ "@deepseek-ai/dsh-skill-filesystem": "0.1.2-rc.1",
105
+ "@deepseek-ai/dsh-subagent": "0.1.2-rc.1",
106
+ "@deepseek-ai/dsh-subagent-spawn-in-process": "0.1.2-rc.1",
107
+ "@deepseek-ai/dsh-subprocess-local": "0.1.2-rc.1",
108
+ "@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
109
+ "@deepseek-ai/dsh-terminal": "0.1.2-rc.1",
110
+ "@deepseek-ai/dsh-terminal-bash": "0.1.2-rc.1",
111
+ "@deepseek-ai/dsh-token-meter": "0.1.2-rc.1",
112
+ "@deepseek-ai/dsh-tool-ask-user": "0.1.2-rc.1",
113
+ "@deepseek-ai/dsh-tool-bash": "0.1.2-rc.1",
114
+ "@deepseek-ai/dsh-tool-bash-persistent": "0.1.2-rc.1",
115
+ "@deepseek-ai/dsh-tool-cordis": "0.1.2-rc.1",
116
+ "@deepseek-ai/dsh-tool-fs": "0.1.2-rc.1",
117
+ "@deepseek-ai/dsh-tool-fs-search": "0.1.2-rc.1",
118
+ "@deepseek-ai/dsh-tool-goal": "0.1.2-rc.1",
119
+ "@deepseek-ai/dsh-tool-jobs": "0.1.2-rc.1",
120
+ "@deepseek-ai/dsh-tool-skill": "0.1.2-rc.1",
121
+ "@deepseek-ai/dsh-tool-str-replace-editor": "0.1.2-rc.1",
122
+ "@deepseek-ai/dsh-tool-subagent": "0.1.2-rc.1",
123
+ "@deepseek-ai/dsh-tool-subagent-control": "0.1.2-rc.1",
124
+ "@deepseek-ai/dsh-tool-todo": "0.1.2-rc.1",
125
+ "@deepseek-ai/dsh-tools": "0.1.2-rc.1",
126
+ "@deepseek-ai/dsh-user-approval": "0.1.2-rc.1",
127
+ "@deepseek-ai/dsh-user-questions": "0.1.2-rc.1",
128
+ "@deepseek-ai/schemastery": "3.18.2",
53
129
  "node-addon-require-builtin": "0.1.4",
54
- "@deepseek-ai/cordis-plugin-timer": "1.1.3",
55
- "@deepseek-ai/dsh-agent": "0.1.1-rc.2",
56
- "@deepseek-ai/dsh-agent-default-model": "0.1.1-rc.2",
57
- "@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
58
- "@deepseek-ai/dsh-agent-spine-demo": "0.1.1-rc.2",
59
- "@deepseek-ai/dsh-attachment-local": "0.1.1-rc.2",
60
- "@deepseek-ai/dsh-command-compact": "0.1.1-rc.2",
61
- "@deepseek-ai/dsh-command-goal": "0.1.1-rc.2",
62
- "@deepseek-ai/dsh-commands": "0.1.1-rc.2",
63
- "@deepseek-ai/dsh-compaction-basic": "0.1.1-rc.2",
64
- "@deepseek-ai/dsh-code-runtime-worker-thread": "0.1.1-rc.2",
65
- "@deepseek-ai/dsh-cordis-host-runner": "0.1.1-rc.2",
66
- "@deepseek-ai/dsh-app-boot": "0.1.1-rc.2",
67
- "@deepseek-ai/dsh-bash-sandbox": "0.1.1-rc.2",
68
- "@deepseek-ai/dsh-cmdline": "0.1.1-rc.2",
69
- "@deepseek-ai/dsh-file-reference": "0.1.1-rc.2",
70
- "@deepseek-ai/dsh-file-reference-local": "0.1.1-rc.2",
71
- "@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
72
- "@deepseek-ai/dsh-fs-observation-policy": "0.1.1-rc.2",
73
- "@deepseek-ai/dsh-launch-environment": "0.1.1-rc.2",
74
- "@deepseek-ai/dsh-llm": "0.1.1-rc.2",
75
- "@deepseek-ai/dsh-llm-deepseek": "0.1.1-rc.2",
76
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.1-rc.2",
77
- "@deepseek-ai/dsh-mcp-client": "0.1.1-rc.2",
78
- "@deepseek-ai/dsh-permission-presets": "0.1.1-rc.2",
79
- "@deepseek-ai/dsh-persona": "0.1.1-rc.2",
80
- "@deepseek-ai/dsh-plan-mode": "0.1.1-rc.2",
81
- "@deepseek-ai/dsh-sandbox-local": "0.1.1-rc.2",
82
- "@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
83
- "@deepseek-ai/dsh-session": "0.1.1-rc.2",
84
- "@deepseek-ai/dsh-session-checkpoint-policy": "0.1.1-rc.2",
85
- "@deepseek-ai/dsh-session-persistence-jsonl": "0.1.1-rc.2",
86
- "@deepseek-ai/dsh-session-projection": "0.1.1-rc.2",
87
- "@deepseek-ai/dsh-session-query": "0.1.1-rc.2",
88
- "@deepseek-ai/dsh-session-query-sqlite": "0.1.1-rc.2",
89
- "@deepseek-ai/dsh-session-reference": "0.1.1-rc.2",
90
- "@deepseek-ai/dsh-session-stats": "0.1.1-rc.2",
91
- "@deepseek-ai/dsh-session-title": "0.1.1-rc.2",
92
- "@deepseek-ai/dsh-subagent": "0.1.1-rc.2",
93
- "@deepseek-ai/dsh-subagent-spawn-in-process": "0.1.1-rc.2",
94
- "@deepseek-ai/dsh-terminal": "0.1.1-rc.2",
95
- "@deepseek-ai/dsh-terminal-bash": "0.1.1-rc.2",
96
- "@deepseek-ai/dsh-token-meter": "0.1.1-rc.2",
97
- "@deepseek-ai/dsh-tool-ask-user": "0.1.1-rc.2",
98
- "@deepseek-ai/dsh-tool-bash-persistent": "0.1.1-rc.2",
99
- "@deepseek-ai/dsh-tool-cordis": "0.1.1-rc.2",
100
- "@deepseek-ai/dsh-tool-fs": "0.1.1-rc.2",
101
- "@deepseek-ai/dsh-tool-fs-search": "0.1.1-rc.2",
102
- "@deepseek-ai/dsh-tool-str-replace-editor": "0.1.1-rc.2",
103
- "@deepseek-ai/dsh-tool-subagent": "0.1.1-rc.2",
104
- "@deepseek-ai/dsh-tool-subagent-control": "0.1.1-rc.2",
105
- "@deepseek-ai/dsh-tool-todo": "0.1.1-rc.2",
106
- "@deepseek-ai/dsh-user-approval": "0.1.1-rc.2",
107
- "@deepseek-ai/dsh-user-questions": "0.1.1-rc.2",
108
- "@deepseek-ai/dsh-subprocess-local": "0.1.1-rc.2",
109
- "@deepseek-ai/dsh-settings-file": "0.1.1-rc.2",
110
- "@deepseek-ai/dsh-settings": "0.1.1-rc.2",
111
- "@deepseek-ai/dsh-system-prompt": "0.1.1-rc.2",
112
- "@deepseek-ai/schemastery": "3.18.1",
113
- "@deepseek-ai/dsh-credentials-local": "0.1.1-rc.2",
114
- "@deepseek-ai/dsh-authorization": "0.1.1-rc.2",
115
- "@agi-fans/dsh-tui": "^0.13.0"
130
+ "@agi-fans/dsh-tui": "^0.14.0"
116
131
  },
117
132
  "peerDependencies": {
118
- "@deepseek-ai/cordis": "^4.0.1"
133
+ "@deepseek-ai/cordis": "^4.0.2"
119
134
  },
120
135
  "devDependencies": {
121
- "@deepseek-ai/cordis": "4.0.1",
122
- "typescript": "^5.6.0",
136
+ "@deepseek-ai/cordis": "4.0.2",
137
+ "@types/node": "^22.10.0",
123
138
  "tsx": "^4.19.0",
124
- "vitest": "^2.1.0",
125
- "@types/node": "^22.10.0"
139
+ "typescript": "^5.6.0",
140
+ "vitest": "^2.1.0"
126
141
  },
127
142
  "scripts": {
128
143
  "clean": "node -e \"const fs=require('node:fs');fs.rmSync('lib',{recursive:true,force:true});fs.rmSync('tsconfig.tsbuildinfo',{force:true})\"",