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.
Files changed (55) hide show
  1. package/lib/binding.d.ts +2 -0
  2. package/lib/binding.d.ts.map +1 -1
  3. package/lib/binding.js +1 -1
  4. package/lib/binding.js.map +1 -1
  5. package/lib/commands.d.ts +10 -1
  6. package/lib/commands.d.ts.map +1 -1
  7. package/lib/commands.js +18 -6
  8. package/lib/commands.js.map +1 -1
  9. package/lib/dedup.d.ts +31 -0
  10. package/lib/dedup.d.ts.map +1 -0
  11. package/lib/dedup.js +52 -0
  12. package/lib/dedup.js.map +1 -0
  13. package/lib/i18n.d.ts +17 -1
  14. package/lib/i18n.d.ts.map +1 -1
  15. package/lib/i18n.js +34 -2
  16. package/lib/i18n.js.map +1 -1
  17. package/lib/index.d.ts +17 -4
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +9 -2
  20. package/lib/index.js.map +1 -1
  21. package/lib/menu-controller.d.ts +71 -0
  22. package/lib/menu-controller.d.ts.map +1 -0
  23. package/lib/menu-controller.js +284 -0
  24. package/lib/menu-controller.js.map +1 -0
  25. package/lib/menus.d.ts +62 -0
  26. package/lib/menus.d.ts.map +1 -0
  27. package/lib/menus.js +99 -0
  28. package/lib/menus.js.map +1 -0
  29. package/lib/mirror-lock.d.ts +51 -0
  30. package/lib/mirror-lock.d.ts.map +1 -0
  31. package/lib/mirror-lock.js +56 -0
  32. package/lib/mirror-lock.js.map +1 -0
  33. package/lib/retry.d.ts +35 -0
  34. package/lib/retry.d.ts.map +1 -0
  35. package/lib/retry.js +41 -0
  36. package/lib/retry.js.map +1 -0
  37. package/lib/runner.d.ts +93 -95
  38. package/lib/runner.d.ts.map +1 -1
  39. package/lib/runner.js +259 -714
  40. package/lib/runner.js.map +1 -1
  41. package/lib/scheduler.d.ts +46 -0
  42. package/lib/scheduler.d.ts.map +1 -0
  43. package/lib/scheduler.js +162 -0
  44. package/lib/scheduler.js.map +1 -0
  45. package/lib/service.d.ts +27 -0
  46. package/lib/service.d.ts.map +1 -1
  47. package/lib/service.js +106 -3
  48. package/lib/service.js.map +1 -1
  49. package/lib/stream.d.ts +62 -2
  50. package/lib/stream.d.ts.map +1 -1
  51. package/lib/stream.js +270 -0
  52. package/lib/stream.js.map +1 -1
  53. package/lib/types.d.ts +19 -0
  54. package/lib/types.d.ts.map +1 -1
  55. 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
@@ -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 type { ChannelAdapter, InboundMessage, TurnOutcome } from "./types.js";
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 (default: `important`). */
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
- /** Per-turn streaming assembly state mutated by {@link applyStreamChunk}. */
51
- export interface StreamState {
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
- private readonly channel;
103
- private readonly chatKey;
59
+ readonly channel: string;
60
+ readonly chatKey: string;
104
61
  private readonly chatType;
105
- private readonly adapter;
106
- private readonly bindings;
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
- private workDir;
114
- private language;
115
- private notifyLevel;
116
- private progressTimeoutMs;
117
- private t;
118
- constructor(ctx: Context, config: ResolvedConnectConfig, channel: string, chatKey: string, chatType: "p2p" | "group", adapter: ChannelAdapter, bindings: BindingStore, adapters?: Map<string, ChannelAdapter> | undefined);
119
- private menuTitle;
120
- private rootMenuSections;
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
- private confirmAction;
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
- private collectWorkdirSessions;
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
- private defaultSelection;
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
- private newChat;
226
+ newChat(msg: InboundMessage): Promise<void>;
231
227
  private clearChat;
232
- private switchTo;
233
- private listWorkspaces;
234
- private openMenu;
235
- private menuItems;
236
- private showStatus;
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
- private showTasks;
240
- private showSettings;
241
- private modelMenuItems;
242
- private listModelChoices;
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
- private setLanguage;
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
- private setNotifyLevel;
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
- private setProgressTimeout;
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
- private showPlugins;
256
+ showPlugins(target: OutboundTarget): Promise<void>;
263
257
  private createWorkspace;
264
- private compact;
265
- private showHistory;
266
- private showGoals;
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
- private showSchedule;
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 to Markdown or PDF.
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
- /** Release session lock. */
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 if lock has timed out. */
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;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
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;AACnH,OAAO,EAA+C,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE1G,OAAO,KAAK,EAAE,cAAc,EAAgB,cAAc,EAAE,cAAc,EAAwC,MAAM,YAAY,CAAC;AACrI,OAAO,EAYL,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAA4E,KAAK,MAAM,EAAiB,MAAM,YAAY,CAAC;AAClI,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAkC,MAAM,cAAc,CAAC;AACjF,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AASnE,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gHAAgH;IAChH,6FAA6F;IAC7F,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4JAA4J;IAC5J,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,qBAAqB,CAejF;AAgGD,qBAAa,WAAY,YAAW,QAAQ;IAcxC,QAAQ,CAAC,GAAG,EAAE,OAAO;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,QAAQ,CAAC,OAAO,EAAE,cAAc;IAChC,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IA5B7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,CAAC,EAAE,QAAQ,CAAC;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;gBAG3B,GAAG,EAAE,OAAO,EACJ,MAAM,EAAE,qBAAqB,EACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACP,QAAQ,EAAE,KAAK,GAAG,OAAO,EACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,YAAY,EACd,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,YAAA;IACvD;;;;OAIG;IACc,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,aAAA;IACxD,4EAA4E;IAC3D,SAAS,CAAC,EAAE,aAAa,YAAA;IAY5C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjC,gBAAgB,IAAI,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;IAIhG,OAAO,CAAC,WAAW;IAInB,6EAA6E;IAC7E,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAsBlC,qEAAqE;IACrE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAyD3D;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,MAAM;IAQd,oFAAoF;IACpF,OAAO,CAAC,UAAU;IAMlB,mFAAmF;YACrE,gBAAgB;IAmB9B,wDAAwD;IACxD,OAAO,CAAC,WAAW;IAanB,mFAAmF;IAC7E,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAgBvF,KAAK;YAcL,OAAO;YAkEP,WAAW;IAgEzB;;;;OAIG;YACW,iBAAiB;IAa/B;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAmB/E;;;OAGG;YACW,mBAAmB;IAejC,kFAAkF;YACpE,cAAc;IAwB5B,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,gBAAgB,IAAI,cAAc;IAKlC;;;;;;;;;;;;;;OAcG;YACW,YAAY;IAuB1B,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IAEtD,OAAO,CAAC,UAAU;YAYJ,UAAU;IAsGxB;;;;;OAKG;YACW,gBAAgB;IA8C9B,4FAA4F;YAC9E,WAAW;IAoBzB,0GAA0G;YAC5F,UAAU;YAoBV,WAAW;YAmBX,cAAc;YAgEd,mBAAmB;YAgBnB,eAAe;IA4C7B,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,YAAY;YAKN,WAAW;IASzB,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAM;IAEnD;;;OAGG;YACW,aAAa;YAoBb,aAAa;YA2Jb,YAAY;IAa1B;;;;OAIG;YACW,YAAY;IAiB1B;;;OAGG;YACW,YAAY;IAiC1B;;;OAGG;YACW,UAAU;IAuCxB;;;OAGG;YACW,eAAe;IAgB7B,OAAO,CAAC,aAAa;IAmBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA8BrB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBnC,SAAS;IAoBjB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlE,cAAc,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAa7C,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDvD,0EAA0E;IAC1E,OAAO,CAAC,eAAe;IAcjB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7E,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAalF,+EAA+E;IACzE,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7F;;;OAGG;IACG,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpG,gFAAgF;YAClE,gBAAgB;IAa9B;;;OAGG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhG,2EAA2E;YAC7D,kBAAkB;IAgB1B,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB1C,eAAe;IA6BvB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC9C,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCjE,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCtD,OAAO,CAAC,cAAc;IAIhB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAkC3C,iBAAiB;IAgB/B;;;;OAIG;YACW,YAAY;IAiE1B;;OAEG;YACW,YAAY;IAuB1B;;;OAGG;YACW,eAAe;IAyB7B;;;OAGG;YACW,YAAY;IAsB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAiBnB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAoBpB;;;OAGG;YACW,qBAAqB;IA4CnC;;;;;OAKG;YACW,WAAW;IAUzB,6EAA6E;IAC7E,OAAO,CAAC,0BAA0B;IAOlC,2CAA2C;IAC3C,OAAO,CAAC,kBAAkB;CAe3B"}