super-dsh 0.1.3-d → 0.1.3-g
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.
|
@@ -122,6 +122,8 @@ let SingleAgyPresetRoster = (() => {
|
|
|
122
122
|
},
|
|
123
123
|
],
|
|
124
124
|
authorable: this.authorable,
|
|
125
|
+
// 0.1.6 AgentPresetRoster: unnamed new sessions may pick a mode (our preset table).
|
|
126
|
+
modeSelectionEnabled: true,
|
|
125
127
|
};
|
|
126
128
|
}
|
|
127
129
|
async remoteRead(agentPreset) {
|
package/agent-agy/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { realpathSync, statSync } from "node:fs";
|
|
20
20
|
import { join } from "node:path";
|
|
21
21
|
import { Service } from "@deepseek-ai/cordis";
|
|
22
|
-
import {
|
|
22
|
+
import { installModelSelection } from "@deepseek-ai/dsh-agent";
|
|
23
23
|
import { SessionLogOffset, SessionPreparation, interruptedTurnClosers, } from "@deepseek-ai/dsh-session";
|
|
24
24
|
import { AgyBridgeClient } from "./agy-client.js";
|
|
25
25
|
import { AgyCliClient } from "./agy-cli-client.js";
|
|
@@ -464,8 +464,9 @@ async function setupAndPublish(loopCtx, ownerCtx, id, agentOptions, setup, sessi
|
|
|
464
464
|
agent.ctx.sessions.announce(session);
|
|
465
465
|
}
|
|
466
466
|
detachAgent = loopCtx.agents.enter(agent, parentAgent);
|
|
467
|
-
|
|
468
|
-
|
|
467
|
+
// 0.1.6: announce(agent, source) is required, async, and emits agent/created
|
|
468
|
+
// itself — the manual agent/session-start emission is gone upstream.
|
|
469
|
+
await loopCtx.agents.announce(agent, source);
|
|
469
470
|
let disposed = false;
|
|
470
471
|
let unfollowOwner;
|
|
471
472
|
const dispose = async () => {
|
|
@@ -54,6 +54,9 @@
|
|
|
54
54
|
* every push is queued in order and there is no separate follow-up channel.
|
|
55
55
|
* `steer` differs by pushing with `priority: "now"`.
|
|
56
56
|
*/
|
|
57
|
+
import { existsSync } from "node:fs";
|
|
58
|
+
import { homedir } from "node:os";
|
|
59
|
+
import { join } from "node:path";
|
|
57
60
|
import { query as officialQuery } from "@anthropic-ai/claude-agent-sdk";
|
|
58
61
|
import { InputQueue } from "./input-queue.js";
|
|
59
62
|
import { projectClaudeEvent } from "./claude-events.js";
|
|
@@ -65,7 +68,21 @@ const defaultFactory = (o) => officialQuery({
|
|
|
65
68
|
prompt: o.prompt,
|
|
66
69
|
options: o.options,
|
|
67
70
|
});
|
|
68
|
-
const defaultExecutableResolver = () => process.env.CLAUDE_EXECUTABLE ??
|
|
71
|
+
const defaultExecutableResolver = () => process.env.CLAUDE_EXECUTABLE ?? resolveClaudeExecutable();
|
|
72
|
+
/** PATH first, then the common native-installer locations (a service unit
|
|
73
|
+
* PATH may not include ~/.local/bin — dev3 2026-09-22: "native binary not
|
|
74
|
+
* found at claude" mid-session). */
|
|
75
|
+
function resolveClaudeExecutable() {
|
|
76
|
+
for (const dir of (process.env.PATH ?? "").split(":").filter(Boolean)) {
|
|
77
|
+
if (existsSync(join(dir, "claude")))
|
|
78
|
+
return DEFAULT_CLAUDE_EXECUTABLE;
|
|
79
|
+
}
|
|
80
|
+
for (const candidate of [join(homedir(), ".local/bin/claude"), "/usr/local/bin/claude"]) {
|
|
81
|
+
if (existsSync(candidate))
|
|
82
|
+
return candidate;
|
|
83
|
+
}
|
|
84
|
+
return DEFAULT_CLAUDE_EXECUTABLE;
|
|
85
|
+
}
|
|
69
86
|
let factory = defaultFactory;
|
|
70
87
|
let executableResolver = defaultExecutableResolver;
|
|
71
88
|
let refcount = 0;
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* or null when the adapter sibling does not exist next to the hub (a foreign
|
|
33
33
|
* composition this module does not own — keep the caller's env/fallback path).
|
|
34
34
|
*/
|
|
35
|
-
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
36
36
|
import { dirname, join } from 'node:path';
|
|
37
37
|
import { fileURLToPath } from 'node:url';
|
|
38
38
|
import { createRequire } from 'node:module';
|
|
@@ -105,6 +105,46 @@ export function provisionWorldProfile(opts) {
|
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* A source-checkout (pnpm workspace) splits the @deepseek-ai closure across
|
|
110
|
+
* the workspace packages' OWN node_modules (apps/cli links only its direct
|
|
111
|
+
* deps; bundle/web-app carries the UI closure, bundle/base the runtimes).
|
|
112
|
+
* When the anchor sits inside a pnpm workspace, every package-level scope is
|
|
113
|
+
* a union source. Packaged installs have no pnpm-workspace.yaml and return
|
|
114
|
+
* nothing — their single install tree is already complete (dev3 evidence).
|
|
115
|
+
*/
|
|
116
|
+
function workspaceHarnessScopes(anchorDir) {
|
|
117
|
+
let root = anchorDir;
|
|
118
|
+
while (root !== undefined && !existsSync(join(root, 'pnpm-workspace.yaml'))) {
|
|
119
|
+
const parent = dirname(root);
|
|
120
|
+
root = parent === root ? undefined : parent;
|
|
121
|
+
}
|
|
122
|
+
if (root === undefined)
|
|
123
|
+
return [];
|
|
124
|
+
const scopes = [];
|
|
125
|
+
const collect = (base, depth) => {
|
|
126
|
+
if (!existsSync(base))
|
|
127
|
+
return;
|
|
128
|
+
const scope = join(base, 'node_modules', HARNESS_SCOPE);
|
|
129
|
+
if (existsSync(scope))
|
|
130
|
+
scopes.push(scope);
|
|
131
|
+
if (depth === 0)
|
|
132
|
+
return;
|
|
133
|
+
for (const entry of readdirSync(base)) {
|
|
134
|
+
if (entry === 'node_modules' || entry.startsWith('.'))
|
|
135
|
+
continue;
|
|
136
|
+
// Bare files under group dirs (packages/AGENTS.md — the docs/06 §2.1
|
|
137
|
+
// phantom-package trap) must not abort the whole enumeration.
|
|
138
|
+
if (!statSync(join(base, entry), { throwIfNoEntry: false })?.isDirectory())
|
|
139
|
+
continue;
|
|
140
|
+
collect(join(base, entry), depth - 1);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
collect(join(root, 'packages'), 2);
|
|
144
|
+
collect(join(root, 'vendor'), 1);
|
|
145
|
+
collect(join(root, 'apps'), 1);
|
|
146
|
+
return scopes;
|
|
147
|
+
}
|
|
108
148
|
function provisionWorldProfileUnchecked(opts) {
|
|
109
149
|
// Single-pack topology: this module lives at `<line>/agent-hub/dist/`, and
|
|
110
150
|
// every adapter is a SIBLING directory (`<line>/agent-<key>`) — the same
|
|
@@ -162,6 +202,7 @@ function provisionWorldProfileUnchecked(opts) {
|
|
|
162
202
|
const scopeSources = [
|
|
163
203
|
join(resolveDshHome(), 'profiles', 'node_modules', HARNESS_SCOPE),
|
|
164
204
|
join(dirname(ANCHOR), 'node_modules', HARNESS_SCOPE),
|
|
205
|
+
...workspaceHarnessScopes(dirname(ANCHOR)),
|
|
165
206
|
];
|
|
166
207
|
const scopeDst = join(linkRoot, HARNESS_SCOPE);
|
|
167
208
|
rmSync(scopeDst, { recursive: true, force: true });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "super-dsh",
|
|
3
|
-
"version": "0.1.3-
|
|
3
|
+
"version": "0.1.3-g",
|
|
4
4
|
"description": "Agent Worlds for the DeepSeek Harness (DSH) — one dsh plugin that mounts the agent hub (runtime selector, roster, per-runtime worlds) and joins local foreign-agent runtimes (OMP, Codex, Claude, Pi, Hermes, Antigravity) into the DSH Web UI. Each runtime keeps its native home and session store; the hub only bridges.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -75,19 +75,19 @@
|
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
77
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
78
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
79
|
-
"@deepseek-ai/dsh-agent-presets": "0.1.
|
|
78
|
+
"@deepseek-ai/dsh-agent": "0.1.6-alpha.2",
|
|
79
|
+
"@deepseek-ai/dsh-agent-presets": "0.1.6-alpha.2",
|
|
80
80
|
"@deepseek-ai/dsh-api-gateway": "*",
|
|
81
|
-
"@deepseek-ai/dsh-commands": "0.1.
|
|
82
|
-
"@deepseek-ai/dsh-home-paths": "0.1.
|
|
81
|
+
"@deepseek-ai/dsh-commands": "0.1.6-alpha.2",
|
|
82
|
+
"@deepseek-ai/dsh-home-paths": "0.1.6-alpha.2",
|
|
83
83
|
"@deepseek-ai/dsh-host-webserver": "*",
|
|
84
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
85
|
-
"@deepseek-ai/dsh-scope": "0.1.
|
|
86
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
87
|
-
"@deepseek-ai/dsh-session-persistence": "0.1.
|
|
88
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.
|
|
89
|
-
"@deepseek-ai/dsh-user-approval": "0.1.
|
|
90
|
-
"@deepseek-ai/dsh-user-questions": "0.1.
|
|
84
|
+
"@deepseek-ai/dsh-llm": "0.1.6-alpha.2",
|
|
85
|
+
"@deepseek-ai/dsh-scope": "0.1.6-alpha.2",
|
|
86
|
+
"@deepseek-ai/dsh-session": "0.1.6-alpha.2",
|
|
87
|
+
"@deepseek-ai/dsh-session-persistence": "0.1.6-alpha.2",
|
|
88
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.6-alpha.2",
|
|
89
|
+
"@deepseek-ai/dsh-user-approval": "0.1.6-alpha.2",
|
|
90
|
+
"@deepseek-ai/dsh-user-questions": "0.1.6-alpha.2"
|
|
91
91
|
},
|
|
92
92
|
"peerDependenciesMeta": {
|
|
93
93
|
"@deepseek-ai/cordis": {
|