dsh-daruma 0.1.6 → 0.1.7
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 +33 -1
- package/lib/config.d.ts +10 -1
- package/lib/config.js +13 -2
- package/lib/config.js.map +1 -1
- package/lib/failover-log.js +5 -8
- package/lib/failover-log.js.map +1 -1
- package/lib/host-mount.d.ts +38 -0
- package/lib/host-mount.js +38 -0
- package/lib/host-mount.js.map +1 -0
- package/lib/index.js +39 -6
- package/lib/index.js.map +1 -1
- package/lib/mapping.d.ts +57 -3
- package/lib/mapping.js +54 -3
- package/lib/mapping.js.map +1 -1
- package/lib/rpc.js +16 -3
- package/lib/rpc.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,9 +16,23 @@ daruma. daruma then:
|
|
|
16
16
|
arms the next routable channel (the user-chosen backup first, then the
|
|
17
17
|
configured chain) and returns `{ kind: 'retry' }`;
|
|
18
18
|
3. on the retry turn, the `agent/request` waterfall swaps the request config
|
|
19
|
-
onto the armed channel
|
|
19
|
+
onto the armed channel — dropping the caller's `reasoningEffort` when that
|
|
20
|
+
target does not advertise the level (see below);
|
|
20
21
|
4. appends one JSON line per decision to the audit log (see below).
|
|
21
22
|
|
|
23
|
+
**A failover target has to accept the request.** DSH validates an explicit
|
|
24
|
+
`reasoningEffort` against the **target's** own capability and refuses the
|
|
25
|
+
request before any provider I/O; that refusal is raised outside
|
|
26
|
+
`agent/request-error`, so a swapped request carrying an effort the target
|
|
27
|
+
cannot take kills the turn without ever reaching the provider — the failover
|
|
28
|
+
channel never dispatches, and the channel that is actually broken keeps looking
|
|
29
|
+
healthy. daruma therefore reads the target's model metadata on every swap: a
|
|
30
|
+
supported effort is kept, an unsupported (or unresolvable) one is dropped so
|
|
31
|
+
the target can use its own default, and the drop is logged —
|
|
32
|
+
`dsh-daruma: mt::glm-5.3 does not accept reasoning effort "high" …`. Every
|
|
33
|
+
other field (`maxTokens`, temperature, stop sequences) is passed through
|
|
34
|
+
untouched.
|
|
35
|
+
|
|
22
36
|
**Self-healing:** the host exposes no request-success event, so success is
|
|
23
37
|
inferred — an agent whose previous model request never tripped
|
|
24
38
|
`agent/request-error` earns its channel a success record at the next
|
|
@@ -115,3 +129,21 @@ custom event surface is logged and degraded without interrupting failover.
|
|
|
115
129
|
`src/host-capabilities.ts` records optional host surfaces (RPC and conversation
|
|
116
130
|
event registry) so client integrations can remain capability-driven as DSH
|
|
117
131
|
releases evolve.
|
|
132
|
+
|
|
133
|
+
The web transport is bound **late, from an injection callback**
|
|
134
|
+
(`src/host-mount.ts`): the host's `dsh-client-connection` provides its
|
|
135
|
+
`connection` service synchronously through `0.1.0-rc.x`, but awaits browser-auth
|
|
136
|
+
setup first on `0.1.5-rc.1`/`0.1.5-rc.2`, so the service may not exist yet when
|
|
137
|
+
this plugin's `apply` runs. Reading it with a synchronous `ctx.get('connection')`
|
|
138
|
+
skipped the `/dsh-daruma` RPC channel — and with it the status dock and backup
|
|
139
|
+
picker — on those hosts, so the mount waits for the service and records the
|
|
140
|
+
capability snapshot at that point. Hosts without a web transport (headless)
|
|
141
|
+
simply never fire the callback.
|
|
142
|
+
|
|
143
|
+
> Known host limitation: on `0.1.5-rc.1`/`0.1.5-rc.2` the channel still cannot
|
|
144
|
+
> register — those hosts dropped `webServer` from the connection plugin's own
|
|
145
|
+
> inject list while `rpc.handle()` registers its route through the service
|
|
146
|
+
> context, so every caller gets `cannot get property "webServer" without
|
|
147
|
+
> inject`. daruma logs that failure loudly and keeps failover working; the
|
|
148
|
+
> panel needs the host fix. See
|
|
149
|
+
> `docs/aegis/evidence/2026-09-11-latest-harness-compat.md`.
|
package/lib/config.d.ts
CHANGED
|
@@ -18,6 +18,15 @@ export interface ResolvedConfig extends RecoveryPolicyConfig {
|
|
|
18
18
|
readonly stateFile: string;
|
|
19
19
|
readonly logFile: string;
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the harness home the way the host does (`dsh-home-paths`): an
|
|
23
|
+
* explicit `stateFile` wins, then `$DSH_HOME`, then `~/.dsh`. Honoring
|
|
24
|
+
* `DSH_HOME` keeps test and sandbox profiles isolated on every platform
|
|
25
|
+
* instead of writing into the user's real `~/.dsh`.
|
|
26
|
+
*
|
|
27
|
+
* @param env - environment mapping to read `$DSH_HOME` from.
|
|
28
|
+
* @returns the absolute default state-file path.
|
|
29
|
+
*/
|
|
30
|
+
export declare function defaultStateFile(env?: NodeJS.ProcessEnv): string;
|
|
22
31
|
export declare function defaultLogFile(stateFile: string): string;
|
|
23
32
|
export declare function resolveConfig(raw?: PluginConfig): ResolvedConfig;
|
package/lib/config.js
CHANGED
|
@@ -5,8 +5,19 @@ import { homedir } from 'node:os';
|
|
|
5
5
|
import { dirname, join } from 'node:path';
|
|
6
6
|
import { modelId } from 'daruma-core';
|
|
7
7
|
import { channelIdOf } from "./mapping.js";
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the harness home the way the host does (`dsh-home-paths`): an
|
|
10
|
+
* explicit `stateFile` wins, then `$DSH_HOME`, then `~/.dsh`. Honoring
|
|
11
|
+
* `DSH_HOME` keeps test and sandbox profiles isolated on every platform
|
|
12
|
+
* instead of writing into the user's real `~/.dsh`.
|
|
13
|
+
*
|
|
14
|
+
* @param env - environment mapping to read `$DSH_HOME` from.
|
|
15
|
+
* @returns the absolute default state-file path.
|
|
16
|
+
*/
|
|
17
|
+
export function defaultStateFile(env = process.env) {
|
|
18
|
+
const configured = env.DSH_HOME?.trim();
|
|
19
|
+
const home = configured !== undefined && configured !== '' ? configured : join(homedir(), '.dsh');
|
|
20
|
+
return join(home, 'daruma', 'channel-health.json');
|
|
10
21
|
}
|
|
11
22
|
export function defaultLogFile(stateFile) {
|
|
12
23
|
return join(dirname(stateFile), 'failover-log.jsonl');
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAA2C,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAqB1C,MAAM,UAAU,gBAAgB
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/failover-log.js
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* swallowed; the worst case is a missing or truncated line, never a lost
|
|
12
12
|
* failover.
|
|
13
13
|
*/
|
|
14
|
-
import { appendFileSync, renameSync, statSync } from 'node:fs';
|
|
15
|
-
import {
|
|
14
|
+
import { appendFileSync, mkdirSync, renameSync, statSync } from 'node:fs';
|
|
15
|
+
import { dirname } from 'node:path';
|
|
16
16
|
/** Rotate when the log exceeds this size (kept to one `.1` generation). */
|
|
17
17
|
export const FAILOVER_LOG_ROTATE_BYTES = 2 * 1024 * 1024;
|
|
18
18
|
export class JsonlFailoverLogStore {
|
|
@@ -24,7 +24,7 @@ export class JsonlFailoverLogStore {
|
|
|
24
24
|
append(record) {
|
|
25
25
|
try {
|
|
26
26
|
this.rotateIfNeeded();
|
|
27
|
-
mkdirSync(
|
|
27
|
+
mkdirSync(dirname(this.file), { recursive: true });
|
|
28
28
|
appendFileSync(this.file, `${JSON.stringify(record)}\n`, 'utf8');
|
|
29
29
|
}
|
|
30
30
|
catch {
|
|
@@ -38,12 +38,9 @@ export class JsonlFailoverLogStore {
|
|
|
38
38
|
renameSync(this.file, `${this.file}.1`);
|
|
39
39
|
}
|
|
40
40
|
catch {
|
|
41
|
-
// Missing file, or
|
|
41
|
+
// Missing file, or a platform that refuses the replacement rename:
|
|
42
|
+
// keep appending (no rotation).
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
function dirnameOf(file) {
|
|
46
|
-
const index = Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\'));
|
|
47
|
-
return index <= 0 ? '.' : file.slice(0, index);
|
|
48
|
-
}
|
|
49
46
|
//# sourceMappingURL=failover-log.js.map
|
package/lib/failover-log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover-log.js","sourceRoot":"","sources":["../src/failover-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"failover-log.js","sourceRoot":"","sources":["../src/failover-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAmDxD,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,sEAAsE;IACtE,MAAM,CAAC,MAAyB;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,cAAc,EAAE,CAAA;YACrB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAClD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,yBAAyB;gBAAE,OAAM;YAChE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,gCAAgC;QAClC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Late-bound host surfaces.
|
|
3
|
+
*
|
|
4
|
+
* The web transport (`connection`, owned by the host's `dsh-client-connection`
|
|
5
|
+
* plugin) is not guaranteed to exist when this plugin's `apply` runs. Through
|
|
6
|
+
* `0.1.0-rc.x` the host provides the service synchronously during its own
|
|
7
|
+
* apply; on `0.1.5-rc.1`/`0.1.5-rc.2` it awaits browser-auth setup first and
|
|
8
|
+
* only then provides it. A synchronous `ctx.get('connection')` therefore
|
|
9
|
+
* reports "absent" on the newer hosts, which used to disable the status panel
|
|
10
|
+
* and the backup picker silently.
|
|
11
|
+
*
|
|
12
|
+
* Mounting from an injection callback works for both shapes: it runs as soon as
|
|
13
|
+
* the service appears — including immediately on hosts that provide it eagerly
|
|
14
|
+
* — and never runs where no web transport is composed (headless).
|
|
15
|
+
*
|
|
16
|
+
* Injecting `webServer` as well does NOT help on `0.1.5-rc.1`/`rc.2`: those
|
|
17
|
+
* versions dropped `webServer` from the connection plugin's own inject list
|
|
18
|
+
* while `rpc.handle()` still registers its route through the service context,
|
|
19
|
+
* so every caller gets `cannot get property "webServer" without inject`. That
|
|
20
|
+
* is an upstream regression in the host package, not a caller-side mistake —
|
|
21
|
+
* verified by probe, see `docs/aegis/evidence/2026-09-11-latest-harness-compat.md`.
|
|
22
|
+
*/
|
|
23
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
24
|
+
/** Host service carrying the browser transport. */
|
|
25
|
+
export declare const WEB_TRANSPORT_SERVICE = "connection";
|
|
26
|
+
/** Structural host shape used by {@link mountWithWebTransport}. */
|
|
27
|
+
export interface HostMountHost {
|
|
28
|
+
readonly logger: {
|
|
29
|
+
info(message: string): void;
|
|
30
|
+
};
|
|
31
|
+
inject(services: readonly string[], callback: (injected: Context) => void): unknown;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run `mount` once the host provides the web transport, and record the host
|
|
35
|
+
* capability snapshot observed at that moment (never from a pre-injection
|
|
36
|
+
* read, which would misreport an eagerly-late host as unsupported).
|
|
37
|
+
*/
|
|
38
|
+
export declare function mountWithWebTransport(ctx: HostMountHost, mount: (transportCtx: Context) => void): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Late-bound host surfaces.
|
|
3
|
+
*
|
|
4
|
+
* The web transport (`connection`, owned by the host's `dsh-client-connection`
|
|
5
|
+
* plugin) is not guaranteed to exist when this plugin's `apply` runs. Through
|
|
6
|
+
* `0.1.0-rc.x` the host provides the service synchronously during its own
|
|
7
|
+
* apply; on `0.1.5-rc.1`/`0.1.5-rc.2` it awaits browser-auth setup first and
|
|
8
|
+
* only then provides it. A synchronous `ctx.get('connection')` therefore
|
|
9
|
+
* reports "absent" on the newer hosts, which used to disable the status panel
|
|
10
|
+
* and the backup picker silently.
|
|
11
|
+
*
|
|
12
|
+
* Mounting from an injection callback works for both shapes: it runs as soon as
|
|
13
|
+
* the service appears — including immediately on hosts that provide it eagerly
|
|
14
|
+
* — and never runs where no web transport is composed (headless).
|
|
15
|
+
*
|
|
16
|
+
* Injecting `webServer` as well does NOT help on `0.1.5-rc.1`/`rc.2`: those
|
|
17
|
+
* versions dropped `webServer` from the connection plugin's own inject list
|
|
18
|
+
* while `rpc.handle()` still registers its route through the service context,
|
|
19
|
+
* so every caller gets `cannot get property "webServer" without inject`. That
|
|
20
|
+
* is an upstream regression in the host package, not a caller-side mistake —
|
|
21
|
+
* verified by probe, see `docs/aegis/evidence/2026-09-11-latest-harness-compat.md`.
|
|
22
|
+
*/
|
|
23
|
+
import { detectHostCapabilities } from "./host-capabilities.js";
|
|
24
|
+
/** Host service carrying the browser transport. */
|
|
25
|
+
export const WEB_TRANSPORT_SERVICE = 'connection';
|
|
26
|
+
/**
|
|
27
|
+
* Run `mount` once the host provides the web transport, and record the host
|
|
28
|
+
* capability snapshot observed at that moment (never from a pre-injection
|
|
29
|
+
* read, which would misreport an eagerly-late host as unsupported).
|
|
30
|
+
*/
|
|
31
|
+
export function mountWithWebTransport(ctx, mount) {
|
|
32
|
+
ctx.inject([WEB_TRANSPORT_SERVICE], (transportCtx) => {
|
|
33
|
+
const capabilities = detectHostCapabilities(transportCtx);
|
|
34
|
+
ctx.logger.info(`dsh-daruma: host capabilities ${JSON.stringify(capabilities)}`);
|
|
35
|
+
mount(transportCtx);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=host-mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-mount.js","sourceRoot":"","sources":["../src/host-mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,sBAAsB,EAAyB,MAAM,wBAAwB,CAAA;AAEtF,mDAAmD;AACnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAA;AAQjD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAkB,EAClB,KAAsC;IAEtC,GAAG,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE;QACnD,MAAM,YAAY,GAAqB,sBAAsB,CAAC,YAAY,CAAC,CAAA;QAC3E,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAChF,KAAK,CAAC,YAAY,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* discovery, backup selection) for the web client UI, and appends a durable
|
|
17
17
|
* `daruma/failover` session event on every channel switch.
|
|
18
18
|
*/
|
|
19
|
-
import { channelIdOf, channelIdOfConfig,
|
|
19
|
+
import { channelIdOf, channelIdOfConfig, toFailoverConfig, toFailureSignal } from "./mapping.js";
|
|
20
20
|
import { resolveConfig } from "./config.js";
|
|
21
21
|
import { RecoveryEngine } from "./engine.js";
|
|
22
22
|
import { JsonFileChannelHealthStore } from "./store.js";
|
|
@@ -26,9 +26,32 @@ import { mountStatus } from "./status.js";
|
|
|
26
26
|
import { mountRpc } from "./rpc.js";
|
|
27
27
|
import { modelId } from 'daruma-core';
|
|
28
28
|
import { createEventSink } from "./event-sink.js";
|
|
29
|
-
import {
|
|
29
|
+
import { mountWithWebTransport } from "./host-mount.js";
|
|
30
30
|
export const name = 'dsh-daruma';
|
|
31
31
|
export const inject = ['agents', 'settings', 'llm'];
|
|
32
|
+
/**
|
|
33
|
+
* Record what the failover target did with the caller's reasoning effort.
|
|
34
|
+
*
|
|
35
|
+
* A dropped effort is a real change to the request (the target runs at its own
|
|
36
|
+
* default level instead of the user's), so it has to be visible in the server
|
|
37
|
+
* log rather than folded silently into the channel-switch line. `none-requested`
|
|
38
|
+
* and `kept` are the ordinary cases and stay quiet.
|
|
39
|
+
*/
|
|
40
|
+
function logEffortDisposition(ctx, target, effort) {
|
|
41
|
+
switch (effort.kind) {
|
|
42
|
+
case 'none-requested':
|
|
43
|
+
case 'kept':
|
|
44
|
+
return;
|
|
45
|
+
case 'dropped-unsupported':
|
|
46
|
+
ctx.logger.warn(`dsh-daruma: ${target.id} does not accept reasoning effort "${effort.effort}" `
|
|
47
|
+
+ `(advertised: ${effort.accepted.length > 0 ? effort.accepted.join(', ') : 'none'}); `
|
|
48
|
+
+ 'dropping it for the failover request so it can dispatch');
|
|
49
|
+
return;
|
|
50
|
+
case 'dropped-unverifiable':
|
|
51
|
+
ctx.logger.warn(`dsh-daruma: could not resolve reasoning efforts for ${target.id}; `
|
|
52
|
+
+ `dropping "${effort.effort}" so the failover request can dispatch`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
32
55
|
export function apply(ctx, rawConfig = {}) {
|
|
33
56
|
const config = resolveConfig(rawConfig);
|
|
34
57
|
const store = new JsonFileChannelHealthStore(config.stateFile);
|
|
@@ -36,8 +59,6 @@ export function apply(ctx, rawConfig = {}) {
|
|
|
36
59
|
const failoverLog = new JsonlFailoverLogStore(config.logFile);
|
|
37
60
|
const status = mountStatus(ctx);
|
|
38
61
|
const eventSink = createEventSink(ctx.logger);
|
|
39
|
-
const capabilities = detectHostCapabilities(ctx);
|
|
40
|
-
ctx.logger.info(`dsh-daruma: host capabilities ${JSON.stringify(capabilities)}`);
|
|
41
62
|
// Boot record: one line per plugin start, so audits can align restart
|
|
42
63
|
// boundaries with the failover/give-up lines that follow.
|
|
43
64
|
failoverLog.append({
|
|
@@ -71,9 +92,10 @@ export function apply(ctx, rawConfig = {}) {
|
|
|
71
92
|
const armed = pending.get(payload.agent.id);
|
|
72
93
|
if (armed) {
|
|
73
94
|
pending.delete(payload.agent.id);
|
|
74
|
-
const swapped =
|
|
95
|
+
const { config: swapped, effort } = await toFailoverConfig(current, armed, ctx.llm);
|
|
75
96
|
currentChannel.set(payload.agent.id, channelIdOfConfig(swapped));
|
|
76
97
|
ctx.logger.warn(`dsh-daruma: switching ${current.provider}/${current.model} -> ${swapped.provider}/${swapped.model}`);
|
|
98
|
+
logEffortDisposition(ctx, armed, effort);
|
|
77
99
|
return swapped;
|
|
78
100
|
}
|
|
79
101
|
currentChannel.set(payload.agent.id, channelIdOfConfig(current));
|
|
@@ -185,6 +207,17 @@ export function apply(ctx, rawConfig = {}) {
|
|
|
185
207
|
failedSinceRequest.delete(agent.id);
|
|
186
208
|
engine.clearScope(agent.id);
|
|
187
209
|
});
|
|
188
|
-
|
|
210
|
+
// The web transport arrives when the host provides it — on some host
|
|
211
|
+
// generations only after an async setup step — so the RPC channel mounts
|
|
212
|
+
// from an injection callback instead of a synchronous service read.
|
|
213
|
+
mountWithWebTransport(ctx, (transportCtx) => {
|
|
214
|
+
mountRpc(transportCtx, {
|
|
215
|
+
engine,
|
|
216
|
+
currentChannel,
|
|
217
|
+
status,
|
|
218
|
+
getLlm: () => ctx.llm,
|
|
219
|
+
getSettings: () => ctx.settings,
|
|
220
|
+
});
|
|
221
|
+
});
|
|
189
222
|
}
|
|
190
223
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/mapping.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* taxonomy mirrors them. Anything unknown is downgraded to `UNKNOWN`
|
|
6
6
|
* (treated as retryable).
|
|
7
7
|
*/
|
|
8
|
-
import type { LlmCallConfig, LlmFailure } from '@deepseek-ai/dsh-llm';
|
|
8
|
+
import type { LlmCallConfig, LlmFailure, LlmResolvedModelInfo } from '@deepseek-ai/dsh-llm';
|
|
9
9
|
import { type Channel, type ChannelId, type FailureCode, type FailureSignal } from 'daruma-core';
|
|
10
10
|
export declare function toFailureCode(code: string): FailureCode;
|
|
11
11
|
/** Stable channel identity from a provider+model pair. */
|
|
@@ -13,5 +13,59 @@ export declare function channelIdOf(provider: string, model: string): ChannelId;
|
|
|
13
13
|
/** Channel identity of a resolved request config. */
|
|
14
14
|
export declare function channelIdOfConfig(config: LlmCallConfig): ChannelId;
|
|
15
15
|
export declare function toFailureSignal(failure: LlmFailure, channel: ChannelId, occurredAtMs: number): FailureSignal;
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The one read daruma makes of the LLM runtime before it swaps channels: the
|
|
18
|
+
* target's own model metadata. Structural, so a test can answer it without a
|
|
19
|
+
* runtime.
|
|
20
|
+
*/
|
|
21
|
+
export interface ReasoningCapabilityLookup {
|
|
22
|
+
resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* What became of the caller's reasoning effort when a request moved to a
|
|
26
|
+
* failover target.
|
|
27
|
+
*
|
|
28
|
+
* DSH validates an explicit `reasoningEffort` against the **target's** own
|
|
29
|
+
* capability and refuses the request before any provider I/O
|
|
30
|
+
* (`UNSUPPORTED_REASONING_EFFORT`, raised from `LlmRuntime.prepareCall`). That
|
|
31
|
+
* refusal happens during the loop's request assembly, outside
|
|
32
|
+
* `agent/request-error`, so no plugin gets to recover from it: the turn dies
|
|
33
|
+
* and the failover channel never dispatches. Carrying the caller's level across
|
|
34
|
+
* the swap therefore breaks the failover exactly where it was meant to help,
|
|
35
|
+
* so an effort the target cannot take is dropped instead — the target then
|
|
36
|
+
* applies its own configured default.
|
|
37
|
+
*/
|
|
38
|
+
export type EffortDisposition = {
|
|
39
|
+
readonly kind: 'none-requested';
|
|
40
|
+
} | {
|
|
41
|
+
readonly kind: 'kept';
|
|
42
|
+
readonly effort: string;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'dropped-unsupported';
|
|
45
|
+
readonly effort: string;
|
|
46
|
+
readonly accepted: readonly string[];
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: 'dropped-unverifiable';
|
|
49
|
+
readonly effort: string;
|
|
50
|
+
};
|
|
51
|
+
export interface FailoverConfig {
|
|
52
|
+
/** The config to dispatch on the failover target. */
|
|
53
|
+
readonly config: LlmCallConfig;
|
|
54
|
+
/** What happened to the caller's effort, for the server log. */
|
|
55
|
+
readonly effort: EffortDisposition;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Route a request config onto a failover target in a shape that target accepts.
|
|
59
|
+
*
|
|
60
|
+
* Everything except the reasoning effort is copied verbatim: `maxTokens`,
|
|
61
|
+
* temperature and stop sequences are request-header state the caller owns, and
|
|
62
|
+
* a failover must not silently re-shape the task. The effort is the one field
|
|
63
|
+
* the *target* owns, so an unusable one is dropped rather than passed on.
|
|
64
|
+
*
|
|
65
|
+
* @param config - the caller's request config, as it stood on the failed channel.
|
|
66
|
+
* @param target - the channel recovery chose.
|
|
67
|
+
* @param lookup - model-metadata source (`LlmRuntime`); `undefined` when the
|
|
68
|
+
* runtime is unavailable, which fails closed onto "drop the effort".
|
|
69
|
+
* @returns the routed config plus what happened to the effort, for logging.
|
|
70
|
+
*/
|
|
71
|
+
export declare function toFailoverConfig(config: LlmCallConfig, target: Channel, lookup?: ReasoningCapabilityLookup): Promise<FailoverConfig>;
|
package/lib/mapping.js
CHANGED
|
@@ -36,8 +36,59 @@ export function toFailureSignal(failure, channel, occurredAtMs) {
|
|
|
36
36
|
message: failure.message,
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Read the reasoning efforts `target` advertises.
|
|
41
|
+
*
|
|
42
|
+
* An adapter that reports no reasoning metadata (or no adapter at all) is
|
|
43
|
+
* indistinguishable here from a failed lookup — both mean "no effort this
|
|
44
|
+
* target is known to accept".
|
|
45
|
+
*/
|
|
46
|
+
async function readEfforts(lookup, target) {
|
|
47
|
+
if (lookup === undefined)
|
|
48
|
+
return { kind: 'unreadable' };
|
|
49
|
+
try {
|
|
50
|
+
const info = await lookup.resolveModelInfo(target.provider, target.model);
|
|
51
|
+
return { kind: 'read', efforts: (info.reasoning?.efforts ?? []).map((effort) => effort.id) };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { kind: 'unreadable' };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Copy a config without its reasoning-effort field (the value is never kept). */
|
|
58
|
+
function withoutEffort(config) {
|
|
59
|
+
const next = { ...config };
|
|
60
|
+
delete next.reasoningEffort;
|
|
61
|
+
return next;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Route a request config onto a failover target in a shape that target accepts.
|
|
65
|
+
*
|
|
66
|
+
* Everything except the reasoning effort is copied verbatim: `maxTokens`,
|
|
67
|
+
* temperature and stop sequences are request-header state the caller owns, and
|
|
68
|
+
* a failover must not silently re-shape the task. The effort is the one field
|
|
69
|
+
* the *target* owns, so an unusable one is dropped rather than passed on.
|
|
70
|
+
*
|
|
71
|
+
* @param config - the caller's request config, as it stood on the failed channel.
|
|
72
|
+
* @param target - the channel recovery chose.
|
|
73
|
+
* @param lookup - model-metadata source (`LlmRuntime`); `undefined` when the
|
|
74
|
+
* runtime is unavailable, which fails closed onto "drop the effort".
|
|
75
|
+
* @returns the routed config plus what happened to the effort, for logging.
|
|
76
|
+
*/
|
|
77
|
+
export async function toFailoverConfig(config, target, lookup) {
|
|
78
|
+
const routed = { ...config, provider: target.provider, model: target.model };
|
|
79
|
+
const requested = config.reasoningEffort;
|
|
80
|
+
if (requested === undefined)
|
|
81
|
+
return { config: routed, effort: { kind: 'none-requested' } };
|
|
82
|
+
const advertised = await readEfforts(lookup, target);
|
|
83
|
+
if (advertised.kind === 'unreadable') {
|
|
84
|
+
return { config: withoutEffort(routed), effort: { kind: 'dropped-unverifiable', effort: requested } };
|
|
85
|
+
}
|
|
86
|
+
if (advertised.efforts.includes(requested)) {
|
|
87
|
+
return { config: routed, effort: { kind: 'kept', effort: requested } };
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
config: withoutEffort(routed),
|
|
91
|
+
effort: { kind: 'dropped-unsupported', effort: requested, accepted: advertised.efforts },
|
|
92
|
+
};
|
|
42
93
|
}
|
|
43
94
|
//# sourceMappingURL=mapping.js.map
|
package/lib/mapping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,SAAS,GAKV,MAAM,aAAa,CAAA;AAEpB,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IACvD,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,OAAO;IACP,yBAAyB;IACzB,oBAAoB;CACrB,CAAC,CAAA;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAgB,CAAA;AAC1E,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAa;IACzD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAmB,EACnB,OAAkB,EAClB,YAAoB;IAEpB,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;QACP,YAAY;QACZ,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
package/lib/rpc.js
CHANGED
|
@@ -65,8 +65,11 @@ async function listCandidates(llm, provider, settings) {
|
|
|
65
65
|
}
|
|
66
66
|
export function mountRpc(ctx, deps) {
|
|
67
67
|
const connection = ctx.get('connection');
|
|
68
|
+
// Callers mount from an injection callback (src/host-mount.ts), so the
|
|
69
|
+
// service is present here; the guard only covers a composition that dropped
|
|
70
|
+
// the transport between injection and mount.
|
|
68
71
|
if (connection === undefined)
|
|
69
|
-
return;
|
|
72
|
+
return;
|
|
70
73
|
const dispatch = async (endpoint, payload, _signal) => {
|
|
71
74
|
try {
|
|
72
75
|
switch (endpoint) {
|
|
@@ -118,7 +121,17 @@ export function mountRpc(ctx, deps) {
|
|
|
118
121
|
};
|
|
119
122
|
}
|
|
120
123
|
};
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
try {
|
|
125
|
+
const dispose = connection.rpc.handle('/dsh-daruma', dispatch, { authority: 'loopback' });
|
|
126
|
+
ctx.effect(() => dispose, 'dsh-daruma: /dsh-daruma rpc channel');
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// Known host regression: 0.1.5-rc.1/rc.2 dropped `webServer` from the
|
|
130
|
+
// connection plugin's own inject list while `rpc.handle()` still registers
|
|
131
|
+
// its route through the service context, so the call throws for every
|
|
132
|
+
// caller. Fail loudly instead of leaving the panel silently empty.
|
|
133
|
+
ctx.logger.warn(`dsh-daruma: /dsh-daruma rpc channel could not be registered (${messageOf(error)}); `
|
|
134
|
+
+ 'the status dock and backup picker stay disabled on this host generation');
|
|
135
|
+
}
|
|
123
136
|
}
|
|
124
137
|
//# sourceMappingURL=rpc.js.map
|
package/lib/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-daruma",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Daruma resilience plugin for DeepSeek Harness — detects model-request failures and fails over to another channel to keep long tasks alive.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|