dsh-connect 0.6.7 → 0.7.1
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/lib/binding.d.ts +2 -0
- package/lib/binding.d.ts.map +1 -1
- package/lib/binding.js +1 -1
- package/lib/binding.js.map +1 -1
- package/lib/commands.d.ts +10 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +18 -6
- package/lib/commands.js.map +1 -1
- package/lib/dedup.d.ts +31 -0
- package/lib/dedup.d.ts.map +1 -0
- package/lib/dedup.js +52 -0
- package/lib/dedup.js.map +1 -0
- package/lib/i18n.d.ts +17 -1
- package/lib/i18n.d.ts.map +1 -1
- package/lib/i18n.js +34 -2
- package/lib/i18n.js.map +1 -1
- package/lib/index.d.ts +17 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -2
- package/lib/index.js.map +1 -1
- package/lib/menu-controller.d.ts +71 -0
- package/lib/menu-controller.d.ts.map +1 -0
- package/lib/menu-controller.js +284 -0
- package/lib/menu-controller.js.map +1 -0
- package/lib/menus.d.ts +62 -0
- package/lib/menus.d.ts.map +1 -0
- package/lib/menus.js +99 -0
- package/lib/menus.js.map +1 -0
- package/lib/mirror-lock.d.ts +51 -0
- package/lib/mirror-lock.d.ts.map +1 -0
- package/lib/mirror-lock.js +56 -0
- package/lib/mirror-lock.js.map +1 -0
- package/lib/retry.d.ts +35 -0
- package/lib/retry.d.ts.map +1 -0
- package/lib/retry.js +41 -0
- package/lib/retry.js.map +1 -0
- package/lib/runner.d.ts +93 -95
- package/lib/runner.d.ts.map +1 -1
- package/lib/runner.js +259 -714
- package/lib/runner.js.map +1 -1
- package/lib/scheduler.d.ts +46 -0
- package/lib/scheduler.d.ts.map +1 -0
- package/lib/scheduler.js +162 -0
- package/lib/scheduler.js.map +1 -0
- package/lib/service.d.ts +27 -0
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +106 -3
- package/lib/service.js.map +1 -1
- package/lib/stream.d.ts +62 -2
- package/lib/stream.d.ts.map +1 -1
- package/lib/stream.js +270 -0
- package/lib/stream.js.map +1 -1
- package/lib/types.d.ts +19 -0
- package/lib/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure lock-state machine for the Feishu ↔ Web mirror mutual exclusion.
|
|
3
|
+
*
|
|
4
|
+
* A mirrored chat has two writers: the Feishu runner (chat side) and the Web
|
|
5
|
+
* GUI (which reads/writes the shared DSH session directly). The `lockOwner`
|
|
6
|
+
* field on a binding records which channel currently owns write access so the
|
|
7
|
+
* two sides do not drive the same session concurrently. This module contains
|
|
8
|
+
* every transition as a pure function over a `LockState`-shaped object — no
|
|
9
|
+
* I/O, no adapter calls — so the state machine is unit-testable in isolation.
|
|
10
|
+
* @module dsh-connect/mirror-lock
|
|
11
|
+
*/
|
|
12
|
+
/** Default lock timeout (5 minutes) when a binding has no explicit timeout. */
|
|
13
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
14
|
+
/** True when a lock exists and its acquisition timestamp is older than its timeout. */
|
|
15
|
+
export function isLockTimedOut(state, now = Date.now()) {
|
|
16
|
+
if (state.lockOwner === undefined || state.lockAcquiredAt === undefined)
|
|
17
|
+
return false;
|
|
18
|
+
const timeoutMs = state.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
19
|
+
return now - state.lockAcquiredAt > timeoutMs;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether `channel` may write to the session. A timed-out lock counts as
|
|
23
|
+
* free (the caller normally releases it and notifies the user).
|
|
24
|
+
*/
|
|
25
|
+
export function canWrite(state, channel, now = Date.now()) {
|
|
26
|
+
if (state.lockOwner === undefined)
|
|
27
|
+
return true;
|
|
28
|
+
if (isLockTimedOut(state, now))
|
|
29
|
+
return true;
|
|
30
|
+
return state.lockOwner === channel;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Acquire (or renew) the lock for `channel`. Returns the next state when the
|
|
34
|
+
* lock is free, timed out, or already owned by `channel`; `undefined` when a
|
|
35
|
+
* different channel currently holds a live lock. Generic over the full state
|
|
36
|
+
* object so callers keep their complete binding type.
|
|
37
|
+
*/
|
|
38
|
+
export function acquire(state, channel, now = Date.now()) {
|
|
39
|
+
if (state.lockOwner !== undefined && !isLockTimedOut(state, now) && state.lockOwner !== channel) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
...state,
|
|
44
|
+
lockOwner: channel,
|
|
45
|
+
lockAcquiredAt: now,
|
|
46
|
+
lockTimeoutMs: state.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Release the lock, preserving every other field (including the parked queue —
|
|
51
|
+
* the caller drains `queuedMessages` before or after releasing).
|
|
52
|
+
*/
|
|
53
|
+
export function release(state) {
|
|
54
|
+
return { ...state, lockOwner: undefined, lockAcquiredAt: undefined };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mirror-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-lock.js","sourceRoot":"","sources":["../src/mirror-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAsBrD,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/D,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,IAAI,uBAAuB,CAAC;IACjE,OAAO,GAAG,GAAG,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAgB,EAAE,OAAyB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACpF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAsB,KAAQ,EAAE,OAAyB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAChG,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,SAAS,EAAE,OAAO;QAClB,cAAc,EAAE,GAAG;QACnB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,uBAAuB;KAC9D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAsB,KAAQ;IACnD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACvE,CAAC"}
|
package/lib/retry.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded outbound retry for channel deliveries.
|
|
3
|
+
*
|
|
4
|
+
* The core wraps every registered adapter's delivery methods (sendText /
|
|
5
|
+
* sendCard / promptChoice / closeMenu) so a transient channel failure —
|
|
6
|
+
* network blip, 429, 5xx — retries a few times with jittered exponential
|
|
7
|
+
* backoff instead of silently dropping a user-visible message. streamText is
|
|
8
|
+
* deliberately NOT retried: a partially-streamed reply cannot be resumed, and
|
|
9
|
+
* restarting it would duplicate the streaming card.
|
|
10
|
+
* @module dsh-connect/retry
|
|
11
|
+
*/
|
|
12
|
+
import type { ChannelAdapter } from "./types.js";
|
|
13
|
+
export interface RetryOptions {
|
|
14
|
+
/** Total attempts including the first call (default 3). */
|
|
15
|
+
attempts?: number;
|
|
16
|
+
/** Base delay between attempts in ms (default 250). */
|
|
17
|
+
baseDelayMs?: number;
|
|
18
|
+
/** Cap for a single delay in ms (default 2000). */
|
|
19
|
+
maxDelayMs?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Decide whether an error is worth retrying. Defaults to retrying every
|
|
22
|
+
* error — bounded attempts keep permanent failures cheap (a few extra
|
|
23
|
+
* channel calls), while transient ones actually recover.
|
|
24
|
+
*/
|
|
25
|
+
isTransient?: (error: unknown) => boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Run `fn` with bounded, jittered exponential backoff on failure. */
|
|
28
|
+
export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Wrap an adapter so its delivery methods retry transient failures.
|
|
31
|
+
* Non-delivery faces (start/stop/onInbound) and streamText pass through
|
|
32
|
+
* untouched.
|
|
33
|
+
*/
|
|
34
|
+
export declare function withOutboundRetry(adapter: ChannelAdapter, options?: RetryOptions): ChannelAdapter;
|
|
35
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED,sEAAsE;AACtE,wBAAsB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAkB3F;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CAYrG"}
|
package/lib/retry.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Run `fn` with bounded, jittered exponential backoff on failure. */
|
|
2
|
+
export async function retry(fn, options = {}) {
|
|
3
|
+
const attempts = Math.max(1, options.attempts ?? 3);
|
|
4
|
+
const baseDelayMs = Math.max(0, options.baseDelayMs ?? 250);
|
|
5
|
+
const maxDelayMs = Math.max(1, options.maxDelayMs ?? 2000);
|
|
6
|
+
const isTransient = options.isTransient ?? (() => true);
|
|
7
|
+
let lastError;
|
|
8
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
9
|
+
try {
|
|
10
|
+
return await fn();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
lastError = error;
|
|
14
|
+
if (attempt >= attempts || !isTransient(error))
|
|
15
|
+
throw error;
|
|
16
|
+
const backoff = Math.min(maxDelayMs, baseDelayMs * 2 ** (attempt - 1));
|
|
17
|
+
const jitter = backoff * 0.25 * Math.random();
|
|
18
|
+
await new Promise((resolve) => setTimeout(resolve, Math.round(backoff + jitter)));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
throw lastError;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wrap an adapter so its delivery methods retry transient failures.
|
|
25
|
+
* Non-delivery faces (start/stop/onInbound) and streamText pass through
|
|
26
|
+
* untouched.
|
|
27
|
+
*/
|
|
28
|
+
export function withOutboundRetry(adapter, options = {}) {
|
|
29
|
+
return {
|
|
30
|
+
id: adapter.id,
|
|
31
|
+
start: () => adapter.start(),
|
|
32
|
+
stop: () => adapter.stop(),
|
|
33
|
+
onInbound: (handler) => adapter.onInbound(handler),
|
|
34
|
+
sendText: (target, text) => retry(() => adapter.sendText(target, text), options),
|
|
35
|
+
sendCard: (target, card) => retry(() => adapter.sendCard(target, card), options),
|
|
36
|
+
promptChoice: (target, prompt, updateMessageId) => retry(() => adapter.promptChoice(target, prompt, updateMessageId), options),
|
|
37
|
+
closeMenu: (messageId, summary) => retry(() => adapter.closeMenu(messageId, summary), options),
|
|
38
|
+
streamText: (target, chunks) => adapter.streamText(target, chunks),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=retry.js.map
|
package/lib/retry.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AA4BA,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAI,EAAoB,EAAE,UAAwB,EAAE;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,OAAO,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAuB,EAAE,UAAwB,EAAE;IACnF,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QAClD,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAChF,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAChF,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAC9H,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAC9F,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;KACnE,CAAC;AACJ,CAAC"}
|
package/lib/runner.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { Context } from "@deepseek-ai/cordis";
|
|
2
2
|
import { type Session, type SessionEvent } from "@deepseek-ai/dsh-session";
|
|
3
|
-
import
|
|
3
|
+
import { type ModelSelection } from "@deepseek-ai/dsh-agent";
|
|
4
|
+
import type { ChannelAdapter, InboundMessage, OutboundTarget } from "./types.js";
|
|
5
|
+
import { type NotifyLevel } from "./stream.js";
|
|
6
|
+
import { type MenuId } from "./menus.js";
|
|
7
|
+
import { type MenuHost } from "./menu-controller.js";
|
|
4
8
|
import type { BindingStore } from "./binding.js";
|
|
5
|
-
import { type Language } from "./i18n.js";
|
|
9
|
+
import { type Language, type Messages } from "./i18n.js";
|
|
10
|
+
import { type ReminderStore } from "./scheduler.js";
|
|
6
11
|
export interface ConnectConfig {
|
|
7
12
|
/** Agent preset id composed into each session; `undefined` = roster default. */
|
|
8
13
|
agentPreset?: string;
|
|
@@ -24,7 +29,8 @@ export interface ConnectConfig {
|
|
|
24
29
|
autoMirror?: boolean;
|
|
25
30
|
/** Liveness heartbeat interval ms for the streaming card; 0 disables it (default: 60000). */
|
|
26
31
|
streamHeartbeatMs?: number;
|
|
27
|
-
/** Default notification level for streaming replies (
|
|
32
|
+
/** Default notification level for streaming replies. Default 'result' (final answer only) keeps cards short. */
|
|
33
|
+
/** Streaming reply detail. Default 'result' (final answer only) to keep chat cards short. */
|
|
28
34
|
notifyLevel?: NotifyLevel;
|
|
29
35
|
/** Proactive progress-notice interval ms: when a turn goes silent for this long, a standalone status card is sent (default: 300000 = 5 min; 0 disables). */
|
|
30
36
|
progressTimeoutMs?: number;
|
|
@@ -47,77 +53,49 @@ export interface ResolvedConnectConfig {
|
|
|
47
53
|
progressTimeoutMs: number;
|
|
48
54
|
}
|
|
49
55
|
export declare function resolveConnectConfig(config: ConnectConfig): ResolvedConnectConfig;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
chunks: {
|
|
53
|
-
push(text: string): void;
|
|
54
|
-
};
|
|
55
|
-
lastText: string;
|
|
56
|
-
reasoning: boolean;
|
|
57
|
-
hintPushed: boolean;
|
|
58
|
-
lastIndex: number | undefined;
|
|
59
|
-
pushedAny: boolean;
|
|
60
|
-
lastPushAt: number;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* How much of the agent's live progress the streaming card shows.
|
|
64
|
-
* - `full` — everything: reasoning text, tool calls, heartbeats, answer.
|
|
65
|
-
* - `important` — key milestones only: thinking hint, tool calls, heartbeats, answer (no reasoning text).
|
|
66
|
-
* - `result` — only the final answer.
|
|
67
|
-
*/
|
|
68
|
-
export type NotifyLevel = "full" | "important" | "result";
|
|
69
|
-
/** One assistant chunk event of interest to the streaming bridge. */
|
|
70
|
-
export interface StreamChunkLike {
|
|
71
|
-
type: string;
|
|
72
|
-
index?: number;
|
|
73
|
-
text?: string;
|
|
74
|
-
block?: {
|
|
75
|
-
type?: string;
|
|
76
|
-
text?: string;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
export declare function applyStreamChunk(state: StreamState, thinkingHint: string, chunk: StreamChunkLike, level?: NotifyLevel): void;
|
|
80
|
-
/**
|
|
81
|
-
* Push a localized tool-call status line into the streaming queue so long
|
|
82
|
-
* tool-execution stretches stay visibly alive (the Web GUI shows tool calls;
|
|
83
|
-
* the chat card should too). Ends the reasoning phase and drops the block
|
|
84
|
-
* index so the next content block gets its own separator instead of stacking
|
|
85
|
-
* one on top of the tool line's own blank lines.
|
|
86
|
-
* @param state - the turn's mutable assembly state.
|
|
87
|
-
* @param label - the localized status line, e.g. "🔧 调用工具 `pwsh` — …".
|
|
88
|
-
*/
|
|
89
|
-
export declare function applyToolCall(state: StreamState, label: string): void;
|
|
90
|
-
/** Pull a short human summary out of a tool call's `arguments` JSON (whitespace folded to one line). */
|
|
91
|
-
export declare function toolCallSummary(argumentsJson: unknown): string | undefined;
|
|
92
|
-
/** Pull the first question's text out of an `ask_user_question` arguments JSON (whitespace folded to one line). */
|
|
93
|
-
export declare function questionTextOf(argumentsJson: unknown): string;
|
|
94
|
-
export declare function summarizeTurn(events: readonly SessionEvent[], firstSeq: number): TurnOutcome;
|
|
95
|
-
/** Error category used to pick actionable advice for the user. */
|
|
96
|
-
export type ErrorCategory = "permission" | "network" | "model" | "generic";
|
|
97
|
-
/** Classify an error message into an advice bucket (keyword-based, best-effort). */
|
|
98
|
-
export declare function classifyError(detail: string): ErrorCategory;
|
|
99
|
-
export declare class AgentRunner {
|
|
100
|
-
private readonly ctx;
|
|
56
|
+
export declare class AgentRunner implements MenuHost {
|
|
57
|
+
readonly ctx: Context;
|
|
101
58
|
private readonly config;
|
|
102
|
-
|
|
103
|
-
|
|
59
|
+
readonly channel: string;
|
|
60
|
+
readonly chatKey: string;
|
|
104
61
|
private readonly chatType;
|
|
105
|
-
|
|
106
|
-
|
|
62
|
+
readonly adapter: ChannelAdapter;
|
|
63
|
+
readonly bindings: BindingStore;
|
|
107
64
|
private readonly adapters?;
|
|
65
|
+
/**
|
|
66
|
+
* Route a replayed queued message back into the runner of its own channel
|
|
67
|
+
* (wired by ConnectService). Without it, replayed messages would run in
|
|
68
|
+
* whichever runner happened to release the lock.
|
|
69
|
+
*/
|
|
70
|
+
private readonly requeue?;
|
|
71
|
+
/** Persistent chat-level reminders (`/remind`), wired by ConnectService. */
|
|
72
|
+
private readonly reminders?;
|
|
108
73
|
private readonly queue;
|
|
109
74
|
private running;
|
|
110
75
|
private agent?;
|
|
111
76
|
private handle?;
|
|
112
77
|
private turn?;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
78
|
+
workDir: string;
|
|
79
|
+
language: Language;
|
|
80
|
+
notifyLevel: NotifyLevel;
|
|
81
|
+
progressTimeoutMs: number;
|
|
82
|
+
t: Messages;
|
|
83
|
+
private readonly menu;
|
|
84
|
+
constructor(ctx: Context, config: ResolvedConnectConfig, channel: string, chatKey: string, chatType: "p2p" | "group", adapter: ChannelAdapter, bindings: BindingStore, adapters?: Map<string, ChannelAdapter> | undefined,
|
|
85
|
+
/**
|
|
86
|
+
* Route a replayed queued message back into the runner of its own channel
|
|
87
|
+
* (wired by ConnectService). Without it, replayed messages would run in
|
|
88
|
+
* whichever runner happened to release the lock.
|
|
89
|
+
*/
|
|
90
|
+
requeue?: ((msg: InboundMessage) => void) | undefined,
|
|
91
|
+
/** Persistent chat-level reminders (`/remind`), wired by ConnectService. */
|
|
92
|
+
reminders?: ReminderStore | undefined);
|
|
93
|
+
menuTitle(menuId: MenuId): string;
|
|
94
|
+
rootMenuSections(): readonly {
|
|
95
|
+
title: string;
|
|
96
|
+
ids: readonly string[];
|
|
97
|
+
columnsPerRow?: number;
|
|
98
|
+
}[];
|
|
121
99
|
private reasonLabel;
|
|
122
100
|
/** Prefer the user's first DSH workspace over the process cwd as default. */
|
|
123
101
|
private resolveDefaultWorkDir;
|
|
@@ -138,7 +116,7 @@ export declare class AgentRunner {
|
|
|
138
116
|
/** Pick the localized advice text for a failed turn. */
|
|
139
117
|
private errorAdvice;
|
|
140
118
|
/** Present a destructive-action confirmation; true only when the user confirms. */
|
|
141
|
-
|
|
119
|
+
confirmAction(target: OutboundTarget, promptText: string, messageId?: string): Promise<boolean>;
|
|
142
120
|
private drain;
|
|
143
121
|
private runTurn;
|
|
144
122
|
private ensureAgent;
|
|
@@ -155,7 +133,10 @@ export declare class AgentRunner {
|
|
|
155
133
|
* sessions). Titles come from the binding record when known, otherwise from
|
|
156
134
|
* the host's session title service. Sorted newest first.
|
|
157
135
|
*/
|
|
158
|
-
|
|
136
|
+
collectWorkdirSessions(): Promise<{
|
|
137
|
+
sessionId: string;
|
|
138
|
+
title: string;
|
|
139
|
+
}[]>;
|
|
159
140
|
/**
|
|
160
141
|
* Session ids the DSH workspace registry attaches to a work directory.
|
|
161
142
|
* Best-effort: without a workspace registry this returns `[]`.
|
|
@@ -165,7 +146,7 @@ export declare class AgentRunner {
|
|
|
165
146
|
private sessionTitleOf;
|
|
166
147
|
private get agents();
|
|
167
148
|
private get sessions();
|
|
168
|
-
|
|
149
|
+
defaultSelection(): ModelSelection;
|
|
169
150
|
/**
|
|
170
151
|
* Compose the preset-only agent setup.
|
|
171
152
|
*
|
|
@@ -220,6 +201,21 @@ export declare class AgentRunner {
|
|
|
220
201
|
* steers the in-flight task), and an idle driver starts a new turn with it.
|
|
221
202
|
*/
|
|
222
203
|
private handleAppend;
|
|
204
|
+
/**
|
|
205
|
+
* `/remind <time> <text>` — persist a chat-level reminder that fires
|
|
206
|
+
* without waking the agent (see src/scheduler.ts).
|
|
207
|
+
*/
|
|
208
|
+
private handleRemind;
|
|
209
|
+
/**
|
|
210
|
+
* `/send <path>` — deliver a file from the workspace through the channel's
|
|
211
|
+
* `sendFile` capability; falls back to sending the path as text.
|
|
212
|
+
*/
|
|
213
|
+
private handleSend;
|
|
214
|
+
/**
|
|
215
|
+
* `/broadcast <text>` — admins push a message to every bound chat.
|
|
216
|
+
* Admin gating lives in the connect service (allowUsers).
|
|
217
|
+
*/
|
|
218
|
+
private handleBroadcast;
|
|
223
219
|
private recordSession;
|
|
224
220
|
/**
|
|
225
221
|
* Automatically create a Web mirror for the session.
|
|
@@ -227,45 +223,43 @@ export declare class AgentRunner {
|
|
|
227
223
|
* without requiring manual `/mirror` command.
|
|
228
224
|
*/
|
|
229
225
|
private autoCreateWebMirror;
|
|
230
|
-
|
|
226
|
+
newChat(msg: InboundMessage): Promise<void>;
|
|
231
227
|
private clearChat;
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
228
|
+
switchTo(sessionId: string, ownerKey: string): Promise<void>;
|
|
229
|
+
listWorkspaces(): {
|
|
230
|
+
path: string;
|
|
231
|
+
title: string;
|
|
232
|
+
}[];
|
|
233
|
+
showStatus(target: OutboundTarget): Promise<void>;
|
|
237
234
|
/** Extract the most recent turn's completion info from session events. */
|
|
238
235
|
private getLastTurnInfo;
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
private setModel;
|
|
244
|
-
private reasoningMenuItems;
|
|
245
|
-
private setReasoning;
|
|
236
|
+
showTasks(target: OutboundTarget): Promise<void>;
|
|
237
|
+
showSettings(target: OutboundTarget): Promise<void>;
|
|
238
|
+
setModel(provider: string, model: string, msg: InboundMessage): Promise<void>;
|
|
239
|
+
setReasoning(effort: string | undefined, msg: InboundMessage): Promise<void>;
|
|
246
240
|
/** Switch the user-facing language for this chat, persisted in its binding. */
|
|
247
|
-
|
|
241
|
+
setLanguage(lang: Language, target: OutboundTarget, msg: InboundMessage): Promise<void>;
|
|
248
242
|
/**
|
|
249
243
|
* Switch the notification level for this chat (persisted in its binding and
|
|
250
244
|
* effective immediately for the next streaming reply).
|
|
251
245
|
*/
|
|
252
|
-
|
|
246
|
+
setNotifyLevel(level: NotifyLevel, target: OutboundTarget, msg: InboundMessage): Promise<void>;
|
|
253
247
|
/** Show the three-level notification picker (used by the `/notify` command). */
|
|
254
248
|
private openNotifyPicker;
|
|
255
249
|
/**
|
|
256
250
|
* Switch the proactive progress-notice interval for this chat (persisted in
|
|
257
251
|
* its binding and effective for the next turn; 0 disables the watchdog).
|
|
258
252
|
*/
|
|
259
|
-
|
|
253
|
+
setProgressTimeout(ms: number, target: OutboundTarget, msg: InboundMessage): Promise<void>;
|
|
260
254
|
/** Show the progress-interval picker (used by the `/progress` command). */
|
|
261
255
|
private openProgressPicker;
|
|
262
|
-
|
|
256
|
+
showPlugins(target: OutboundTarget): Promise<void>;
|
|
263
257
|
private createWorkspace;
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
258
|
+
compact(target: OutboundTarget): Promise<void>;
|
|
259
|
+
showHistory(target: OutboundTarget, limit: number): Promise<void>;
|
|
260
|
+
showGoals(target: OutboundTarget): Promise<void>;
|
|
267
261
|
private goalPhaseLabel;
|
|
268
|
-
|
|
262
|
+
showSchedule(target: OutboundTarget): Promise<void>;
|
|
269
263
|
private showAllWorkspaces;
|
|
270
264
|
/**
|
|
271
265
|
* Create or show Web mirror session for this chat.
|
|
@@ -283,7 +277,8 @@ export declare class AgentRunner {
|
|
|
283
277
|
*/
|
|
284
278
|
private handleRenewLock;
|
|
285
279
|
/**
|
|
286
|
-
* Export conversation history
|
|
280
|
+
* Export conversation history as Markdown (a future PDF pipeline can be
|
|
281
|
+
* added here; `/export pdf` currently falls back to Markdown).
|
|
287
282
|
*/
|
|
288
283
|
private handleExport;
|
|
289
284
|
/**
|
|
@@ -310,11 +305,14 @@ export declare class AgentRunner {
|
|
|
310
305
|
* Re-enqueues them into the runner's message queue for actual execution.
|
|
311
306
|
*/
|
|
312
307
|
private processQueuedMessages;
|
|
313
|
-
/**
|
|
308
|
+
/**
|
|
309
|
+
* Release session lock. Awaits the queued-message drain, then clears the
|
|
310
|
+
* lock from a FRESH read: the drain's queue-clearing put must not be
|
|
311
|
+
* overwritten by a stale binding object (which would resurrect the queue
|
|
312
|
+
* and cause duplicate processing on the next release).
|
|
313
|
+
*/
|
|
314
314
|
private releaseLock;
|
|
315
|
-
/** Check
|
|
316
|
-
private isLockTimedOut;
|
|
317
|
-
/** Check and release timed-out locks. */
|
|
315
|
+
/** Check and release timed-out locks (delegates to the pure lock module). */
|
|
318
316
|
private checkAndReleaseTimeoutLock;
|
|
319
317
|
/** Release a timed-out lock and notify. */
|
|
320
318
|
private releaseTimeoutLock;
|
package/lib/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|