dsh-input-traffic 0.2.8 → 0.2.9

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.
@@ -1,12 +1,17 @@
1
1
  /**
2
- * Session-freeze store shared by the composer freeze button (the control)
3
- * and the steering dock (the banner/disabled states).
2
+ * Session-scoped freeze store shared by the composer freeze button (the
3
+ * control) and the steering dock (the banner/disabled states).
4
4
  *
5
5
  * The queue is fully decoupled from freezing: freezing only stops the agent
6
6
  * from consuming the queue (the detached entries are preserved here so the
7
7
  * driver finds no pending work and stops). While frozen the entries stay
8
8
  * fully editable — text, order and the planned insertion tier (now/next/
9
9
  * later) can all change; resume re-submits the queue honoring those tiers.
10
+ *
11
+ * State is keyed by session id so freezing one session never leaks into
12
+ * another: each session holds its own `frozen` flag and detached queue, and
13
+ * mutating one session's queue only re-renders that session's consumers
14
+ * (`useSyncExternalStore` bails on unchanged references for the others).
10
15
  */
11
16
  /** Insertion tier planned for one detached queued message. */
12
17
  export type FrozenTier = 'queue' | 'safe_point' | 'force';
@@ -22,20 +27,22 @@ export interface FreezeState {
22
27
  }
23
28
  /** Minimal snapshot store (no runtime dependency, stable identity per mount). */
24
29
  export declare const freezeStore: {
25
- getSnapshot(): FreezeState;
30
+ /** Snapshot for one session; reference-stable until that session changes. */
31
+ getSnapshot(sessionId: string): FreezeState;
26
32
  subscribe(listener: () => void): () => void;
27
- set(next: FreezeState): void;
33
+ /** Replace one session's state; unset sessions fall back to EMPTY. */
34
+ set(sessionId: string, next: FreezeState): void;
28
35
  };
29
- /** Reset for tests. */
36
+ /** Reset all sessions (for tests). */
30
37
  export declare function resetFreezeStore(): void;
31
38
  /** Append one queued message while frozen (new input lands in the detached queue). */
32
- export declare function pushPending(text: string, tier?: FrozenTier): void;
39
+ export declare function pushPending(sessionId: string, text: string, tier?: FrozenTier): void;
33
40
  /** Edit one detached queued message's text in place. */
34
- export declare function updatePendingAt(index: number, text: string): void;
41
+ export declare function updatePendingAt(sessionId: string, index: number, text: string): void;
35
42
  /** Change one detached queued message's planned insertion tier. */
36
- export declare function setTierAt(index: number, tier: FrozenTier): void;
43
+ export declare function setTierAt(sessionId: string, index: number, tier: FrozenTier): void;
37
44
  /** Remove one detached queued message. */
38
- export declare function removePendingAt(index: number): void;
45
+ export declare function removePendingAt(sessionId: string, index: number): void;
39
46
  /** Move one detached queued message to a new position (reorder while frozen). */
40
- export declare function movePending(from: number, to: number): void;
47
+ export declare function movePending(sessionId: string, from: number, to: number): void;
41
48
  //# sourceMappingURL=freeze-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"freeze-store.d.ts","sourceRoot":"","sources":["../../../src/client/freeze-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAA;AAEzD,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,wEAAwE;IACxE,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;CAChC;AAKD,iFAAiF;AACjF,eAAO,MAAM,WAAW;mBACP,WAAW;wBAGN,MAAM,IAAI,GAAG,MAAM,IAAI;cAIjC,WAAW,GAAG,IAAI;CAI7B,CAAA;AAED,uBAAuB;AACvB,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,UAAoB,GAAG,IAAI,CAG1E;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQjE;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAQ/D;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAQ1D"}
1
+ {"version":3,"file":"freeze-store.d.ts","sourceRoot":"","sources":["../../../src/client/freeze-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAA;AAEzD,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,wEAAwE;IACxE,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;CAChC;AAUD,iFAAiF;AACjF,eAAO,MAAM,WAAW;IACtB,6EAA6E;2BACtD,MAAM,GAAG,WAAW;wBAGvB,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C,sEAAsE;mBACvD,MAAM,QAAQ,WAAW,GAAG,IAAI;CAQhD,CAAA;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,UAAoB,GAAG,IAAI,CAG7F;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQpF;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAQlF;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAItE;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAS7E"}
@@ -1,83 +1,99 @@
1
1
  /**
2
- * Session-freeze store shared by the composer freeze button (the control)
3
- * and the steering dock (the banner/disabled states).
2
+ * Session-scoped freeze store shared by the composer freeze button (the
3
+ * control) and the steering dock (the banner/disabled states).
4
4
  *
5
5
  * The queue is fully decoupled from freezing: freezing only stops the agent
6
6
  * from consuming the queue (the detached entries are preserved here so the
7
7
  * driver finds no pending work and stops). While frozen the entries stay
8
8
  * fully editable — text, order and the planned insertion tier (now/next/
9
9
  * later) can all change; resume re-submits the queue honoring those tiers.
10
+ *
11
+ * State is keyed by session id so freezing one session never leaks into
12
+ * another: each session holds its own `frozen` flag and detached queue, and
13
+ * mutating one session's queue only re-renders that session's consumers
14
+ * (`useSyncExternalStore` bails on unchanged references for the others).
10
15
  */
16
+ /** Session id → per-session freeze state. */
17
+ const states = new Map();
11
18
  const listeners = new Set();
12
- let state = { frozen: false, pending: [] };
19
+ /** Stable empty snapshot: `useSyncExternalStore` needs a reference-stable
20
+ * value for unset sessions so unchanged consumers never re-render. */
21
+ const EMPTY = { frozen: false, pending: [] };
13
22
  /** Minimal snapshot store (no runtime dependency, stable identity per mount). */
14
23
  export const freezeStore = {
15
- getSnapshot() {
16
- return state;
24
+ /** Snapshot for one session; reference-stable until that session changes. */
25
+ getSnapshot(sessionId) {
26
+ return states.get(sessionId) ?? EMPTY;
17
27
  },
18
28
  subscribe(listener) {
19
29
  listeners.add(listener);
20
30
  return () => { listeners.delete(listener); };
21
31
  },
22
- set(next) {
23
- state = next;
24
- for (const listener of listeners)
25
- listener();
32
+ /** Replace one session's state; unset sessions fall back to EMPTY. */
33
+ set(sessionId, next) {
34
+ if (next.frozen === false && next.pending.length === 0) {
35
+ states.delete(sessionId);
36
+ }
37
+ else {
38
+ states.set(sessionId, next);
39
+ }
40
+ emit();
26
41
  },
27
42
  };
28
- /** Reset for tests. */
43
+ /** Reset all sessions (for tests). */
29
44
  export function resetFreezeStore() {
30
- state = { frozen: false, pending: [] };
31
- for (const listener of listeners)
32
- listener();
45
+ states.clear();
46
+ emit();
33
47
  }
34
48
  /** Append one queued message while frozen (new input lands in the detached queue). */
35
- export function pushPending(text, tier = 'queue') {
36
- state = { ...state, pending: [...state.pending, { text, tier }] };
37
- emit();
49
+ export function pushPending(sessionId, text, tier = 'queue') {
50
+ const cur = states.get(sessionId) ?? EMPTY;
51
+ freezeStore.set(sessionId, { ...cur, pending: [...cur.pending, { text, tier }] });
38
52
  }
39
53
  /** Edit one detached queued message's text in place. */
40
- export function updatePendingAt(index, text) {
41
- const pending = [...state.pending];
42
- if (index < 0 || index >= pending.length)
54
+ export function updatePendingAt(sessionId, index, text) {
55
+ const pending = states.get(sessionId)?.pending;
56
+ if (pending === undefined)
43
57
  return;
44
58
  const entry = pending[index];
45
59
  if (entry === undefined)
46
60
  return;
47
- pending[index] = { ...entry, text };
48
- state = { ...state, pending };
49
- emit();
61
+ const next = [...pending];
62
+ next[index] = { ...entry, text };
63
+ freezeStore.set(sessionId, { frozen: true, pending: next });
50
64
  }
51
65
  /** Change one detached queued message's planned insertion tier. */
52
- export function setTierAt(index, tier) {
53
- const pending = [...state.pending];
54
- if (index < 0 || index >= pending.length)
66
+ export function setTierAt(sessionId, index, tier) {
67
+ const pending = states.get(sessionId)?.pending;
68
+ if (pending === undefined)
55
69
  return;
56
70
  const entry = pending[index];
57
71
  if (entry === undefined)
58
72
  return;
59
- pending[index] = { ...entry, tier };
60
- state = { ...state, pending };
61
- emit();
73
+ const next = [...pending];
74
+ next[index] = { ...entry, tier };
75
+ freezeStore.set(sessionId, { frozen: true, pending: next });
62
76
  }
63
77
  /** Remove one detached queued message. */
64
- export function removePendingAt(index) {
65
- if (index < 0 || index >= state.pending.length)
78
+ export function removePendingAt(sessionId, index) {
79
+ const pending = states.get(sessionId)?.pending;
80
+ if (pending === undefined)
66
81
  return;
67
- state = { ...state, pending: state.pending.filter((_, i) => i !== index) };
68
- emit();
82
+ freezeStore.set(sessionId, { frozen: true, pending: pending.filter((_, i) => i !== index) });
69
83
  }
70
84
  /** Move one detached queued message to a new position (reorder while frozen). */
71
- export function movePending(from, to) {
85
+ export function movePending(sessionId, from, to) {
72
86
  if (from === to)
73
87
  return;
74
- const pending = [...state.pending];
75
- const [moved] = pending.splice(from, 1);
88
+ const pending = states.get(sessionId)?.pending;
89
+ if (pending === undefined)
90
+ return;
91
+ const next = [...pending];
92
+ const [moved] = next.splice(from, 1);
76
93
  if (moved === undefined)
77
94
  return;
78
- pending.splice(to, 0, moved);
79
- state = { ...state, pending };
80
- emit();
95
+ next.splice(to, 0, moved);
96
+ freezeStore.set(sessionId, { frozen: true, pending: next });
81
97
  }
82
98
  function emit() {
83
99
  for (const listener of listeners)
@@ -1 +1 @@
1
- {"version":3,"file":"freeze-store.js","sourceRoot":"","sources":["../../../src/client/freeze-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"freeze-store.js","sourceRoot":"","sources":["../../../src/client/freeze-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,wCAAwC,CAAA;AAgBtF,6CAA6C;AAC7C,eAAO,MAAM,MAAM,UAAmE,CAAA;AAEtF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA+D9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,wCAAwC,CAAA;AAgCtF,6CAA6C;AAC7C,eAAO,MAAM,MAAM,UAAmE,CAAA;AAEtF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAuE9C"}
@@ -6,6 +6,22 @@ import { HideEnterRow } from "./hide-enter-row.js";
6
6
  const CONVERSATION_SETTINGS_NAMESPACE = 'ui-conversation';
7
7
  /** Busy-Enter field inside that namespace; the plugin pins it to queue. */
8
8
  const BUSY_ENTER_FIELD = 'busyEnter';
9
+ /**
10
+ * Deliver one plain-text message into the session's next step. The exposed
11
+ * conversation `send` verb only queues into the next turn, so resume steers
12
+ * through the session face's steer-mode prompt instead (no harness change).
13
+ * @param ctx - root context (resolves the session face behind the scope).
14
+ * @param actx - agent-scoped context of the owning session.
15
+ * @param text - message text to deliver.
16
+ */
17
+ function steerPrompt(actx, text) {
18
+ // steer-mode prompt 面在本版(main@0.2.8)契约中未声明;resume 落到 conversation.send
19
+ // (排队到下一轮)交付 safe_point 文本,与 feature 分支语义对齐但取当前可用 API。
20
+ const conversation = actx.get('conversation');
21
+ if (conversation === undefined)
22
+ return Promise.reject(new Error('steer resume: conversation service unavailable'));
23
+ return conversation.send(text);
24
+ }
9
25
  /** Services required by the browser half. */
10
26
  export const inject = ['slots', 'locale', 'sessions', 'conversation', 'settingsScope'];
11
27
  /**
@@ -63,8 +79,16 @@ export function apply(ctx) {
63
79
  updateQueue: (itemId, action) => conversation.updateQueue(itemId, action),
64
80
  cancel: () => conversation.cancel(),
65
81
  send: (text) => conversation.send(text),
82
+ // safe_point 恢复经 conversation.send 排队到下一轮(本版契约无 steer prompt 面)。
83
+ sendSteer: (text) => steerPrompt(actx, text),
84
+ sessionId: String(sessionId),
66
85
  setDraft: (text) => { conversation.input.for(actx).actions.setDraft(text); },
67
86
  notify: (level, text) => { conversation.input.for(actx).notify(level, text); },
87
+ // 冻结期间 raise composer block:composer 变 inert(回车/发送按钮全部失效),
88
+ // 输入不会漏进对话;恢复时清除。block 不锁 input.right(恢复按钮仍可点)。
89
+ setComposerBlock: (reason) => {
90
+ conversation.blocks.set(sessionId, reason === undefined ? undefined : { reason });
91
+ },
68
92
  };
69
93
  },
70
94
  }, FreezeButton));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,7 @@ export declare const zh: {
48
48
  'steer.freeze': string;
49
49
  'steer.resume': string;
50
50
  'steer.frozen': string;
51
+ 'steer.frozenInput': string;
51
52
  'steer.frozenBadge': string;
52
53
  'steer.freezeFailed': string;
53
54
  'steer.resumeFailed': string;
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,iDAAiD;AACjD,eAAO,MAAM,EAAE,UAAU,CAAA;AAEzB,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDmB,CAAA;AAElC,2CAA2C;AAC3C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAiD9C,CAAA;AAED,4BAA4B;AAC5B,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,iDAAiD;AACjD,eAAO,MAAM,EAAE,UAAU,CAAA;AAEzB,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDmB,CAAA;AAElC,2CAA2C;AAC3C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAkD9C,CAAA;AAED,4BAA4B;AAC5B,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAA"}
@@ -48,6 +48,7 @@ export const zh = {
48
48
  'steer.freeze': '冻结会话',
49
49
  'steer.resume': '恢复会话',
50
50
  'steer.frozen': '已冻结:当前轮次完成后暂停,排队消息将在恢复后继续',
51
+ 'steer.frozenInput': '已冻结:输入已暂停,恢复后继续',
51
52
  'steer.frozenBadge': '已冻结',
52
53
  'steer.freezeFailed': '冻结失败,请重试。',
53
54
  'steer.resumeFailed': '恢复失败,请重试。',
@@ -99,6 +100,7 @@ export const en = {
99
100
  'steer.freeze': 'Freeze session',
100
101
  'steer.resume': 'Resume session',
101
102
  'steer.frozen': 'Frozen: the current turn finishes, then the queue pauses until resumed',
103
+ 'steer.frozenInput': 'Frozen: input paused, resume to continue',
102
104
  'steer.frozenBadge': 'frozen',
103
105
  'steer.freezeFailed': 'Freeze failed, please retry.',
104
106
  'steer.resumeFailed': 'Resume failed, please retry.',
@@ -1 +1 @@
1
- {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * input-traffic ↔ dsh-session-guard 透传桥(D8 fail-open)。
3
+ *
4
+ * input-traffic **只做冻结增强**(队列冻结/解冻),服务端会话门(暂停/恢复会话)
5
+ * 归 dsh-session-guard 插件。冻结/解冻按钮触发时,尽力调用
6
+ * `sessionGuard.stopNextTurn` / `resume`;**插件未装**(路由 404 / 网络失败 /
7
+ * 返回错误)→ 静默跳过,**绝不报错**,前端冻结仍正常生效。
8
+ *
9
+ * 不吸收任何 auto-continue / 重试逻辑(重试归后端 dsh-session-guard,D9)。
10
+ */
11
+ /** 尽力调用 sessionGuard.stopNextTurn(停掉 session 下一回合)。失败静默。 */
12
+ export declare function sessionGuardStopNextTurn(sessionId: string): Promise<boolean>;
13
+ /** 尽力调用 sessionGuard.resume。失败静默。 */
14
+ export declare function sessionGuardResume(sessionId: string): Promise<boolean>;
15
+ declare global {
16
+ var __DSH_SESSION_GUARD_BRIDGE__: boolean | undefined;
17
+ }
18
+ //# sourceMappingURL=session-guard-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-guard-bridge.d.ts","sourceRoot":"","sources":["../../../src/client/session-guard-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4DAA4D;AAC5D,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAElF;AAED,qCAAqC;AACrC,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAoBD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,4BAA4B,EAAE,OAAO,GAAG,SAAS,CAAA;CACtD"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * input-traffic ↔ dsh-session-guard 透传桥(D8 fail-open)。
3
+ *
4
+ * input-traffic **只做冻结增强**(队列冻结/解冻),服务端会话门(暂停/恢复会话)
5
+ * 归 dsh-session-guard 插件。冻结/解冻按钮触发时,尽力调用
6
+ * `sessionGuard.stopNextTurn` / `resume`;**插件未装**(路由 404 / 网络失败 /
7
+ * 返回错误)→ 静默跳过,**绝不报错**,前端冻结仍正常生效。
8
+ *
9
+ * 不吸收任何 auto-continue / 重试逻辑(重试归后端 dsh-session-guard,D9)。
10
+ */
11
+ /** 尽力调用 sessionGuard.stopNextTurn(停掉 session 下一回合)。失败静默。 */
12
+ export async function sessionGuardStopNextTurn(sessionId) {
13
+ return callGuard(sessionId, 'stopNextTurn');
14
+ }
15
+ /** 尽力调用 sessionGuard.resume。失败静默。 */
16
+ export async function sessionGuardResume(sessionId) {
17
+ return callGuard(sessionId, 'resume');
18
+ }
19
+ async function callGuard(sessionId, action) {
20
+ try {
21
+ const res = await fetch('/session-guard/rpc', {
22
+ method: 'POST',
23
+ headers: { 'content-type': 'application/json' },
24
+ body: JSON.stringify({ sessionId, action }),
25
+ });
26
+ if (!res.ok)
27
+ return false;
28
+ const body = await res.json().catch(() => null);
29
+ return body?.ok === true;
30
+ }
31
+ catch {
32
+ // 路由不存在(session-guard 未装)/ 网络失败 → fail-open。
33
+ return false;
34
+ }
35
+ }
36
+ try {
37
+ globalThis.__DSH_SESSION_GUARD_BRIDGE__ = true;
38
+ }
39
+ catch {
40
+ /* 浏览器环境无 window 时忽略 */
41
+ }
42
+ //# sourceMappingURL=session-guard-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-guard-bridge.js","sourceRoot":"","sources":["../../../src/client/session-guard-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,SAAiB;IAC9D,OAAO,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;AAC7C,CAAC;AAED,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,OAAO,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,MAAc;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAA;QACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC/C,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;QAC7C,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAQD,IAAI,CAAC;IACH,UAAU,CAAC,4BAA4B,GAAG,IAAI,CAAA;AAChD,CAAC;AAAC,MAAM,CAAC;IACP,uBAAuB;AACzB,CAAC"}
@@ -18,9 +18,17 @@ export interface SteerQueueDockInjected {
18
18
  cancel: () => Promise<void>;
19
19
  /** Re-send one plain-text message as a queued follow-up (the revoke path). */
20
20
  send: (text: string) => Promise<void>;
21
+ /** Steer one plain-text message into the session's next step (resume's safe_point tier). */
22
+ sendSteer?: (text: string) => Promise<void>;
21
23
  /** Back-fill the composer draft (the pull-back-to-composer edit path). */
22
24
  setDraft: (text: string) => void;
23
25
  notify: (level: 'info' | 'error', text: string) => void;
26
+ /** Owning session id (for the dsh-session-guard bridge RPC). */
27
+ sessionId?: string;
28
+ /** Raise/clear the composer block for the owning session (freeze keeps the
29
+ * composer inert so Enter cannot leak into the conversation; absent on the
30
+ * dock entry, only the freeze button injects it). */
31
+ setComposerBlock?: (reason: string | undefined) => void;
24
32
  }
25
33
  /** Full props of a dock entry: InputZone owner share + session standard kit + global seat + the locale seat. */
26
34
  export type SteerQueueDockProps = PropsRuntime<'conversation.input.dock'> & SteerQueueDockInjected & PropsLocale<'steer'>;
@@ -55,5 +63,5 @@ export declare function resizeEditor(el: HTMLTextAreaElement): void;
55
63
  * Queue strip with three-tier planning: one item renders directly; multiple
56
64
  * items default to a collapsible count header; an empty queue renders nothing.
57
65
  */
58
- export declare function SteerQueueDock({ useSession, input, updateQueue, cancel, send, setDraft, notify, t }: SteerQueueDockProps): import("react").JSX.Element | null;
66
+ export declare function SteerQueueDock({ sessionId, useSession, input, updateQueue, cancel, send, setDraft, notify, t }: SteerQueueDockProps): import("react").JSX.Element | null;
59
67
  //# sourceMappingURL=steer-queue-dock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"steer-queue-dock.d.ts","sourceRoot":"","sources":["../../../src/client/steer-queue-dock.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAYjF,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAQrB,oEAAoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,kEAAkE;IAClE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,8EAA8E;IAC9E,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACxD;AAED,gHAAgH;AAChH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,yBAAyB,CAAC,GAAG,sBAAsB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAEzH,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;AAEhD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAIpG;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAIvF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,CAG1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,mBAAmB,sCAyvBxH"}
1
+ {"version":3,"file":"steer-queue-dock.d.ts","sourceRoot":"","sources":["../../../src/client/steer-queue-dock.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAYjF,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAQrB,oEAAoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,kEAAkE;IAClE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,8EAA8E;IAC9E,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;0DAEsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;CACxD;AAED,gHAAgH;AAChH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,yBAAyB,CAAC,GAAG,sBAAsB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAEzH,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;AAEhD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAIpG;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAIvF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,CAG1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,mBAAmB,sCA6vBnI"}
@@ -72,7 +72,7 @@ export function resizeEditor(el) {
72
72
  * Queue strip with three-tier planning: one item renders directly; multiple
73
73
  * items default to a collapsible count header; an empty queue renders nothing.
74
74
  */
75
- export function SteerQueueDock({ useSession, input, updateQueue, cancel, send, setDraft, notify, t }) {
75
+ export function SteerQueueDock({ sessionId, useSession, input, updateQueue, cancel, send, setDraft, notify, t }) {
76
76
  const inbox = useSession(s => s.queue);
77
77
  const queue = useMemo(() => inbox.filter(row => row.placement === 'queued'), [inbox]);
78
78
  const steering = useMemo(() => inbox.filter(row => row.placement === 'steering'), [inbox]);
@@ -103,7 +103,8 @@ export function SteerQueueDock({ useSession, input, updateQueue, cancel, send, s
103
103
  // detached queue is rendered here (read-only) so the waiting area stays
104
104
  // visible — freezing only pauses the running behavior, it must not hide
105
105
  // the queued messages.
106
- const { frozen, pending: frozenPending } = useSyncExternalStore(freezeStore.subscribe, freezeStore.getSnapshot);
106
+ const { frozen, pending: frozenPending } = useSyncExternalStore(freezeStore.subscribe, () => freezeStore.getSnapshot(sessionId ?? ''));
107
+ const sid = sessionId ?? '';
107
108
  const listId = useId();
108
109
  // The edit textarea; grown to its content on entry and on every input.
109
110
  const editorRef = useRef(null);
@@ -345,7 +346,7 @@ export function SteerQueueDock({ useSession, input, updateQueue, cancel, send, s
345
346
  setEditing(null);
346
347
  return;
347
348
  }
348
- updatePendingAt(index, text);
349
+ updatePendingAt(sid, index, text);
349
350
  setEditing(null);
350
351
  };
351
352
  /**
@@ -406,7 +407,7 @@ export function SteerQueueDock({ useSession, input, updateQueue, cancel, send, s
406
407
  dragIndex.current = null;
407
408
  setDragOver(null);
408
409
  if (from !== null)
409
- movePending(from, i);
410
+ movePending(sid, from, i);
410
411
  }, onDragEnd: () => {
411
412
  dragIndex.current = null;
412
413
  setDragOver(null);
@@ -421,7 +422,7 @@ export function SteerQueueDock({ useSession, input, updateQueue, cancel, send, s
421
422
  void saveFrozenEdit(i);
422
423
  }
423
424
  } }))
424
- : _jsx("span", { className: css.preview, children: text }), _jsx("div", { className: css.actions, children: editingFrozen ? (_jsxs(_Fragment, { children: [_jsx(Tooltip, { label: t('queue.save'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.save'), disabled: editing === null || editing.text.trim() === '', onClick: () => { void saveFrozenEdit(i); }, children: _jsx(IconCheckOutline16, { size: 14 }) }) }), _jsx(Tooltip, { label: t('queue.cancelEdit'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.cancelEdit'), onClick: () => { setEditing(null); }, children: _jsx(IconCloseOutline16, { size: 14 }) }) })] })) : (_jsxs(_Fragment, { children: [_jsx(Tooltip, { label: t('steer.moveUp'), side: "bottom", delayMs: 500, disabled: i === 0, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('steer.moveUp'), disabled: i === 0, onClick: () => movePending(i, i - 1), children: _jsx(IconChevronUpOutline14, {}) }) }), _jsx(Tooltip, { label: t('steer.moveDown'), side: "bottom", delayMs: 500, disabled: i === frozenPending.length - 1, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('steer.moveDown'), disabled: i === frozenPending.length - 1, onClick: () => movePending(i, i + 1), children: _jsx(IconChevronDownOutline14, {}) }) }), _jsx(Tooltip, { label: t('queue.edit'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.edit'), onClick: () => { setEditing({ id: `frozen:${i}`, text }); }, children: _jsx(IconEditOutline16, { size: 14 }) }) }), _jsx(Tooltip, { label: t('queue.remove'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.remove'), onClick: () => removePendingAt(i), children: _jsx(IconTrashOutline16, { size: 14 }) }) }), _jsxs("span", { className: css.plan, role: "group", "aria-label": t('steer.later.aria'), children: [_jsx(Tooltip, { label: t('steer.now'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierNow}`, "aria-label": t('steer.now'), "aria-pressed": entry.tier === 'force' || undefined, onClick: () => setTierAt(i, 'force'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) }), _jsx(Tooltip, { label: t('steer.next'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierNext}`, "aria-label": t('steer.next'), "aria-pressed": entry.tier === 'safe_point' || undefined, onClick: () => setTierAt(i, 'safe_point'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) }), _jsx(Tooltip, { label: t('steer.later'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierLater}`, "aria-label": t('steer.later'), "aria-pressed": entry.tier === 'queue' || undefined, onClick: () => setTierAt(i, 'queue'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) })] })] })) }), _jsx("span", { className: css.frozenMark, children: t('steer.frozenBadge') })] }, i));
425
+ : _jsx("span", { className: css.preview, children: text }), _jsx("div", { className: css.actions, children: editingFrozen ? (_jsxs(_Fragment, { children: [_jsx(Tooltip, { label: t('queue.save'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.save'), disabled: editing === null || editing.text.trim() === '', onClick: () => { void saveFrozenEdit(i); }, children: _jsx(IconCheckOutline16, { size: 14 }) }) }), _jsx(Tooltip, { label: t('queue.cancelEdit'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.cancelEdit'), onClick: () => { setEditing(null); }, children: _jsx(IconCloseOutline16, { size: 14 }) }) })] })) : (_jsxs(_Fragment, { children: [_jsx(Tooltip, { label: t('steer.moveUp'), side: "bottom", delayMs: 500, disabled: i === 0, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('steer.moveUp'), disabled: i === 0, onClick: () => movePending(sid, i, i - 1), children: _jsx(IconChevronUpOutline14, {}) }) }), _jsx(Tooltip, { label: t('steer.moveDown'), side: "bottom", delayMs: 500, disabled: i === frozenPending.length - 1, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('steer.moveDown'), disabled: i === frozenPending.length - 1, onClick: () => movePending(sid, i, i + 1), children: _jsx(IconChevronDownOutline14, {}) }) }), _jsx(Tooltip, { label: t('queue.edit'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.edit'), onClick: () => { setEditing({ id: `frozen:${i}`, text }); }, children: _jsx(IconEditOutline16, { size: 14 }) }) }), _jsx(Tooltip, { label: t('queue.remove'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: css.action, "aria-label": t('queue.remove'), onClick: () => removePendingAt(sid, i), children: _jsx(IconTrashOutline16, { size: 14 }) }) }), _jsxs("span", { className: css.plan, role: "group", "aria-label": t('steer.later.aria'), children: [_jsx(Tooltip, { label: t('steer.now'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierNow}`, "aria-label": t('steer.now'), "aria-pressed": entry.tier === 'force' || undefined, onClick: () => setTierAt(sid, i, 'force'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) }), _jsx(Tooltip, { label: t('steer.next'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierNext}`, "aria-label": t('steer.next'), "aria-pressed": entry.tier === 'safe_point' || undefined, onClick: () => setTierAt(sid, i, 'safe_point'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) }), _jsx(Tooltip, { label: t('steer.later'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: `${css.tier} ${css.tierLater}`, "aria-label": t('steer.later'), "aria-pressed": entry.tier === 'queue' || undefined, onClick: () => setTierAt(sid, i, 'queue'), children: _jsx("span", { className: css.dot, "aria-hidden": true }) }) })] })] })) }), _jsx("span", { className: css.frozenMark, children: t('steer.frozenBadge') })] }, i));
425
426
  }) })), _jsx("ul", { id: listId, className: css.list, hidden: !listVisible, children: listVisible && queue.map((row, index) => (_jsxs("li", { className: `${css.row} ${dragOver === index ? css.rowDragOver : ''}`, "data-tier": badgeFor('queued') ?? undefined, "data-editing": editing?.id === row.id ? '' : undefined, draggable: queueMutable && !reorderUnsupported && busy === null && !frozen, title: queueMutable && !reorderUnsupported && busy === null && !frozen ? t('steer.dragReorder') : undefined, onDragStart: (event) => {
426
427
  dragIndex.current = index;
427
428
  event.dataTransfer.effectAllowed = 'move';