dsh-input-traffic 0.2.7 → 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.
Files changed (36) hide show
  1. package/README.en.md +47 -6
  2. package/README.md +60 -9
  3. package/lib/client.js +158 -104
  4. package/lib/client.js.map +1 -1
  5. package/lib/types/client/auto-continue-core.d.ts +103 -0
  6. package/lib/types/client/auto-continue-core.d.ts.map +1 -0
  7. package/lib/types/client/auto-continue-core.js +131 -0
  8. package/lib/types/client/auto-continue-core.js.map +1 -0
  9. package/lib/types/client/auto-continue-store.d.ts +41 -0
  10. package/lib/types/client/auto-continue-store.d.ts.map +1 -0
  11. package/lib/types/client/auto-continue-store.js +93 -0
  12. package/lib/types/client/auto-continue-store.js.map +1 -0
  13. package/lib/types/client/freeze-button.d.ts +1 -1
  14. package/lib/types/client/freeze-button.d.ts.map +1 -1
  15. package/lib/types/client/freeze-button.js +30 -6
  16. package/lib/types/client/freeze-button.js.map +1 -1
  17. package/lib/types/client/freeze-store.d.ts +17 -10
  18. package/lib/types/client/freeze-store.d.ts.map +1 -1
  19. package/lib/types/client/freeze-store.js +54 -38
  20. package/lib/types/client/freeze-store.js.map +1 -1
  21. package/lib/types/client/index.d.ts.map +1 -1
  22. package/lib/types/client/index.js +15 -12
  23. package/lib/types/client/index.js.map +1 -1
  24. package/lib/types/client/locales.d.ts +1 -0
  25. package/lib/types/client/locales.d.ts.map +1 -1
  26. package/lib/types/client/locales.js +2 -0
  27. package/lib/types/client/locales.js.map +1 -1
  28. package/lib/types/client/session-guard-bridge.d.ts +18 -0
  29. package/lib/types/client/session-guard-bridge.d.ts.map +1 -0
  30. package/lib/types/client/session-guard-bridge.js +42 -0
  31. package/lib/types/client/session-guard-bridge.js.map +1 -0
  32. package/lib/types/client/steer-queue-dock.d.ts +9 -3
  33. package/lib/types/client/steer-queue-dock.d.ts.map +1 -1
  34. package/lib/types/client/steer-queue-dock.js +6 -5
  35. package/lib/types/client/steer-queue-dock.js.map +1 -1
  36. package/package.json +104 -104
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Auto-continue core — 平台无关的纯逻辑, 吸收自 dsh-auto-continue
3
+ * (https://github.com/HsiangNianian/dsh-auto-continue, MIT, v0.8.1 的
4
+ * src/shared/core.ts), 按 input-traffic 的纯 client 定位裁剪:
5
+ *
6
+ * - 只吸收「错误分类 / 自适应退避 / 幂等护栏 / 模板填充」这些无宿主依赖的纯函数;
7
+ * - 不吸收宿主引擎(host firehose / agent.followup / SSE 桥)——那会破坏本插件
8
+ * 「纯浏览器侧、不改官方源码」的定位, 且与「冻结会话省钱」方向相反(见 README 兼容性);
9
+ * - 全部函数无任何 @deepseek-ai/* 值导入, 通过 client bundle purity gate。
10
+ *
11
+ * 应用场景: dock 的「续跑」——检测到会话停下但排队消息未处理完(疑似中断)时,
12
+ * 分类失败、按退避节奏重发, 永久性错误则停止并提示人工介入。
13
+ */
14
+ /**
15
+ * 错误分类: 该失败是否值得重试续跑。
16
+ * 永久性失败(认证/余额/模型不存在/上下文超限等)重试也不会成功, 应停止并提示用户;
17
+ * 其余(网络、超时、5xx、429 等)视为临时性失败, 允许自动重发。
18
+ */
19
+ export function isTransientFailure(failure) {
20
+ const haystack = `${failure.code ?? ''} ${failure.message}`.toLowerCase();
21
+ const status = failure.status;
22
+ if (status !== undefined && (status === 401 || status === 403))
23
+ return false;
24
+ const permanent = /auth|unauthor|forbidden|credential|api[_-]?key|permission/i.test(haystack) ||
25
+ /insufficient.*(balance|quota)|billing|payment|quota.*exceeded.*(?!retry)/i.test(haystack) ||
26
+ /model[^a-z]*not[^a-z]*found|unknown[_-]?model|not.*support.*model/i.test(haystack) ||
27
+ /context.*(length|limit|overflow|exceed)|token.*limit|max.*context/i.test(haystack) ||
28
+ /invalid[_-]?request|bad[_-]?request/i.test(haystack);
29
+ return !permanent;
30
+ }
31
+ /**
32
+ * 消息文本分类: 仅明确属于网络/传输类的临时错误才值得重试。
33
+ * 其余(序列化失败、配置/宿主内部错误等)视为永久性——重试无益。
34
+ */
35
+ export function isTransientAgentError(message) {
36
+ return /network|timeout|timed ?out|econn|etimedout|socket|5\d\d|\b429\b|upstream|temporar/i.test(message);
37
+ }
38
+ /** 自适应退避: 同一会话连续失败时的有效重试间隔。 */
39
+ export function effectiveCooldown(consecutive, base, factor, max) {
40
+ // consecutive = 已连续自动重发的次数; 第 1 次后开始按 factor 递增
41
+ const multiplier = Math.pow(factor, consecutive);
42
+ return Math.min(Math.max(base, base * multiplier), Math.max(base, max));
43
+ }
44
+ /** 把毫秒格式化为人类可读的经过时长(如 65s → 1m5s)。 */
45
+ export function formatElapsed(ms) {
46
+ if (ms === undefined || !Number.isFinite(ms) || ms < 0)
47
+ return '';
48
+ if (ms < 1000)
49
+ return `${Math.round(ms)}ms`;
50
+ const s = Math.round(ms / 1000);
51
+ if (s < 60)
52
+ return `${s}s`;
53
+ return `${Math.floor(s / 60)}m${s % 60 > 0 ? `${s % 60}s` : ''}`;
54
+ }
55
+ /** 用失败事实填充续跑模板占位符({code}/{message}/{status}/{tool}/{errorCount}/{elapsed}/{result})。 */
56
+ export function fillTemplate(template, ctx) {
57
+ return template
58
+ .replace(/\{code\}/g, ctx.facts?.code ?? '')
59
+ .replace(/\{message\}/g, ctx.facts?.message ?? '')
60
+ .replace(/\{status\}/g, ctx.facts?.status !== undefined ? String(ctx.facts.status) : '')
61
+ .replace(/\{tool\}/g, ctx.tool ?? '')
62
+ .replace(/\{errorCount\}/g, ctx.errorCount !== undefined ? String(ctx.errorCount) : '')
63
+ .replace(/\{elapsed\}/g, formatElapsed(ctx.elapsedMs))
64
+ .replace(/\{result\}/g, ctx.result ?? '');
65
+ }
66
+ /** 工具结果摘要的最大长度(护栏模板 {result} 用)。 */
67
+ const TOOL_RESULT_CAP = 160;
68
+ /** 从任意内容块里递归收集文本(结果为模型可见的工具输出)。 */
69
+ function extractText(blocks, cap) {
70
+ let out = '';
71
+ const walk = (value) => {
72
+ if (out.length >= cap)
73
+ return;
74
+ if (Array.isArray(value)) {
75
+ for (const item of value)
76
+ walk(item);
77
+ return;
78
+ }
79
+ if (typeof value !== 'object' || value === null)
80
+ return;
81
+ const record = value;
82
+ if (record['type'] === 'text' && typeof record['text'] === 'string') {
83
+ out += record['text'];
84
+ return;
85
+ }
86
+ for (const child of Object.values(record))
87
+ walk(child);
88
+ };
89
+ walk(blocks);
90
+ return out.slice(0, cap);
91
+ }
92
+ /** 从 tool/result 事件载荷提取成功与否与文本摘要(幂等护栏: 续跑时提示别重复执行)。 */
93
+ export function toolResultFacts(data) {
94
+ const failed = data.error !== undefined || data.message?.content?.[0]?.isError === true;
95
+ return { ok: !failed, excerpt: extractText(data.message?.content?.[0]?.content, TOOL_RESULT_CAP) };
96
+ }
97
+ /** 内置默认值(与 dock 的 localStorage 持久化键一致)。 */
98
+ export const DEFAULT_CONFIG = {
99
+ continueText: '继续',
100
+ graceMs: 3000,
101
+ cooldownMs: 20000,
102
+ maxConsecutive: 3,
103
+ backoffFactor: 2,
104
+ backoffMaxMs: 300000,
105
+ autoResume: false,
106
+ paused: false,
107
+ };
108
+ function numberOr(value, fallback) {
109
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback;
110
+ }
111
+ function booleanOr(value, fallback) {
112
+ return typeof value === 'boolean' ? value : fallback;
113
+ }
114
+ /** 把(可能不完整的)配置解析为完整配置(合法数字/布尔校验 + 兜底默认)。 */
115
+ export function resolveConfig(section) {
116
+ const value = section ?? {};
117
+ const text = typeof value.continueText === 'string' && value.continueText.trim() !== ''
118
+ ? value.continueText
119
+ : DEFAULT_CONFIG.continueText;
120
+ return {
121
+ continueText: text,
122
+ graceMs: numberOr(value.graceMs, DEFAULT_CONFIG.graceMs),
123
+ cooldownMs: numberOr(value.cooldownMs, DEFAULT_CONFIG.cooldownMs),
124
+ maxConsecutive: Math.max(1, numberOr(value.maxConsecutive, DEFAULT_CONFIG.maxConsecutive)),
125
+ backoffFactor: Math.max(1, numberOr(value.backoffFactor, DEFAULT_CONFIG.backoffFactor)),
126
+ backoffMaxMs: numberOr(value.backoffMaxMs, DEFAULT_CONFIG.backoffMaxMs),
127
+ autoResume: booleanOr(value.autoResume, DEFAULT_CONFIG.autoResume),
128
+ paused: booleanOr(value.paused, DEFAULT_CONFIG.paused),
129
+ };
130
+ }
131
+ //# sourceMappingURL=auto-continue-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-continue-core.js","sourceRoot":"","sources":["../../../src/client/auto-continue-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAA;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IAC5E,MAAM,SAAS,GACb,4DAA4D,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3E,2EAA2E,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1F,oEAAoE,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnF,oEAAoE,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnF,sCAAsC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvD,OAAO,CAAC,SAAS,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,oFAAoF,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC3G,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,IAAY,EACZ,MAAc,EACd,GAAW;IAEX,gDAAgD;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;AACzE,CAAC;AAgBD,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,EAAsB;IAClD,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IACjE,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAA;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAA;IAC1B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAClE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,GAAoB;IACjE,OAAO,QAAQ;SACZ,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;SAC3C,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;SACjD,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SACpC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SACrD,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED,oCAAoC;AACpC,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,mCAAmC;AACnC,SAAS,WAAW,CAAC,MAAe,EAAE,GAAW;IAC/C,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE;QACpC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;YAAE,OAAM;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YACpC,OAAM;QACR,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAM;QACvD,MAAM,MAAM,GAAG,KAAgC,CAAA;QAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;YACpE,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC,CAAA;IACD,IAAI,CAAC,MAAM,CAAC,CAAA;IACZ,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC1B,CAAC;AAUD,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,IAG/B;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACvF,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,CAAA;AACpG,CAAC;AA6BD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,YAAY,EAAE,IAAI;IAClB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;IACjB,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,KAAK;CACd,CAAA;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAgB;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC7F,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,QAAiB;IAClD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;AACtD,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,OAAyC;IACrE,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,CAAA;IAC3B,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;QACxE,CAAC,CAAC,KAAK,CAAC,YAAY;QACpB,CAAC,CAAC,cAAc,CAAC,YAAY,CAAA;IACjC,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;QACxD,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC;QACjE,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;QAC1F,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;QACvF,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,YAAY,CAAC;QACvE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC;QAClE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;KACvD,CAAA;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Auto-continue store — 中断检测与续跑配置的共享状态。
3
+ *
4
+ * 与 freeze-store 同构(无运行时依赖、稳定 identity per mount、可测试):
5
+ * - interrupted: 检测到「会话停下但排队消息未处理完」(疑似非人为中断)时置位,
6
+ * dock 据此显示续跑提示条;
7
+ * - 续跑配置持久化到 localStorage(键 `dsh-input-traffic:auto-continue`),
8
+ * 自动续跑默认关闭(纯 client 拿不到 turn/end reason, 无法与用户主动停止
9
+ * 区分, 故默认只提示、不擅自续跑)。
10
+ */
11
+ import { type AutoContinueConfig, type AutoContinueSettings } from './auto-continue-core.ts';
12
+ /** localStorage 持久化键(续跑配置)。 */
13
+ export declare const CONFIG_KEY = "dsh-input-traffic:auto-continue";
14
+ export interface AutoContinueState {
15
+ /** 是否检测到疑似中断(提示条可见性)。 */
16
+ interrupted: boolean;
17
+ /** 连续自动续跑次数(按配置上限封顶)。 */
18
+ consecutive: number;
19
+ /** 上次续跑尝试时间戳(退避节流用)。 */
20
+ lastAttemptAt: number;
21
+ }
22
+ /** 最小快照 store(与 freeze-store 同构)。 */
23
+ export declare const autoContinueStore: {
24
+ getSnapshot(): AutoContinueState;
25
+ subscribe(listener: () => void): () => void;
26
+ };
27
+ /** 当前解析后的续跑配置。 */
28
+ export declare function readAutoContinueConfig(): AutoContinueConfig;
29
+ /** 持久化续跑配置(部分覆盖, 缺失回落默认)。 */
30
+ export declare function setAutoContinueConfig(patch: AutoContinueSettings): void;
31
+ /** 标记检测到疑似中断(dock 显示提示条)。 */
32
+ export declare function markInterrupted(): void;
33
+ /** 清除中断标志(用户手动续跑 / 队列清空 / 会话重新运行)。 */
34
+ export declare function clearInterrupted(): void;
35
+ /** 记录一次续跑尝试(推进连续计数与退避节流)。 */
36
+ export declare function noteRetry(consecutive: number): void;
37
+ /** 重置续跑状态(成功回合 / 用户介入后)。 */
38
+ export declare function resetAutoContinue(): void;
39
+ /** 测试重置。 */
40
+ export declare function resetAutoContinueStore(): void;
41
+ //# sourceMappingURL=auto-continue-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-continue-store.d.ts","sourceRoot":"","sources":["../../../src/client/auto-continue-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAiB,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE3G,+BAA+B;AAC/B,eAAO,MAAM,UAAU,oCAAoC,CAAA;AAE3D,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAA;CACtB;AAsBD,qCAAqC;AACrC,eAAO,MAAM,iBAAiB;mBACb,iBAAiB;wBAGZ,MAAM,IAAI,GAAG,MAAM,IAAI;CAI5C,CAAA;AAED,kBAAkB;AAClB,wBAAgB,sBAAsB,IAAI,kBAAkB,CAE3D;AAED,6BAA6B;AAC7B,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAUvE;AAED,6BAA6B;AAC7B,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGnD;AAED,4BAA4B;AAC5B,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED,YAAY;AACZ,wBAAgB,sBAAsB,IAAI,IAAI,CAS7C"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Auto-continue store — 中断检测与续跑配置的共享状态。
3
+ *
4
+ * 与 freeze-store 同构(无运行时依赖、稳定 identity per mount、可测试):
5
+ * - interrupted: 检测到「会话停下但排队消息未处理完」(疑似非人为中断)时置位,
6
+ * dock 据此显示续跑提示条;
7
+ * - 续跑配置持久化到 localStorage(键 `dsh-input-traffic:auto-continue`),
8
+ * 自动续跑默认关闭(纯 client 拿不到 turn/end reason, 无法与用户主动停止
9
+ * 区分, 故默认只提示、不擅自续跑)。
10
+ */
11
+ import { resolveConfig } from "./auto-continue-core.js";
12
+ /** localStorage 持久化键(续跑配置)。 */
13
+ export const CONFIG_KEY = 'dsh-input-traffic:auto-continue';
14
+ const listeners = new Set();
15
+ let state = { interrupted: false, consecutive: 0, lastAttemptAt: 0 };
16
+ let config = readConfig();
17
+ /** 读取(可能不完整的)localStorage 配置并解析为完整配置。 */
18
+ function readConfig() {
19
+ let raw;
20
+ try {
21
+ const stored = localStorage.getItem(CONFIG_KEY);
22
+ if (stored !== null)
23
+ raw = JSON.parse(stored);
24
+ }
25
+ catch {
26
+ /* storage 不可用或损坏: 回落默认 */
27
+ }
28
+ return resolveConfig(raw);
29
+ }
30
+ function emit() {
31
+ for (const listener of listeners)
32
+ listener();
33
+ }
34
+ /** 最小快照 store(与 freeze-store 同构)。 */
35
+ export const autoContinueStore = {
36
+ getSnapshot() {
37
+ return state;
38
+ },
39
+ subscribe(listener) {
40
+ listeners.add(listener);
41
+ return () => { listeners.delete(listener); };
42
+ },
43
+ };
44
+ /** 当前解析后的续跑配置。 */
45
+ export function readAutoContinueConfig() {
46
+ return config;
47
+ }
48
+ /** 持久化续跑配置(部分覆盖, 缺失回落默认)。 */
49
+ export function setAutoContinueConfig(patch) {
50
+ config = resolveConfig({ ...config, ...patch });
51
+ try {
52
+ localStorage.setItem(CONFIG_KEY, JSON.stringify(config));
53
+ }
54
+ catch {
55
+ /* storage 不可用: 仅内存生效 */
56
+ }
57
+ // 强制快照引用变化: useSyncExternalStore 依赖引用对比决定是否重渲染。
58
+ state = { ...state };
59
+ emit();
60
+ }
61
+ /** 标记检测到疑似中断(dock 显示提示条)。 */
62
+ export function markInterrupted() {
63
+ state = { ...state, interrupted: true };
64
+ emit();
65
+ }
66
+ /** 清除中断标志(用户手动续跑 / 队列清空 / 会话重新运行)。 */
67
+ export function clearInterrupted() {
68
+ state = { ...state, interrupted: false };
69
+ emit();
70
+ }
71
+ /** 记录一次续跑尝试(推进连续计数与退避节流)。 */
72
+ export function noteRetry(consecutive) {
73
+ state = { ...state, consecutive, lastAttemptAt: Date.now() };
74
+ emit();
75
+ }
76
+ /** 重置续跑状态(成功回合 / 用户介入后)。 */
77
+ export function resetAutoContinue() {
78
+ state = { interrupted: false, consecutive: 0, lastAttemptAt: 0 };
79
+ emit();
80
+ }
81
+ /** 测试重置。 */
82
+ export function resetAutoContinueStore() {
83
+ state = { interrupted: false, consecutive: 0, lastAttemptAt: 0 };
84
+ try {
85
+ localStorage.removeItem(CONFIG_KEY);
86
+ }
87
+ catch {
88
+ /* storage 不可用 */
89
+ }
90
+ config = readConfig();
91
+ emit();
92
+ }
93
+ //# sourceMappingURL=auto-continue-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-continue-store.js","sourceRoot":"","sources":["../../../src/client/auto-continue-store.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,5 @@ export type FreezeButtonProps = PropsRuntime<'conversation.input.right'> & Steer
6
6
  * Freeze/resume toggle for the peak-hour scenario.
7
7
  * @param props - slot props; the session snapshot drives the detach list.
8
8
  */
9
- export declare function FreezeButton({ session, updateQueue, cancel, send, sendSteer, notify, t }: FreezeButtonProps): import("react").JSX.Element;
9
+ export declare function FreezeButton({ session, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }: FreezeButtonProps): import("react").JSX.Element;
10
10
  //# sourceMappingURL=freeze-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"freeze-button.d.ts","sourceRoot":"","sources":["../../../src/client/freeze-button.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAIjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAGpE,oGAAoG;AACpG,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,0BAA0B,CAAC,GAAG,sBAAsB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAExH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,iBAAiB,+BAsD3G"}
1
+ {"version":3,"file":"freeze-button.d.ts","sourceRoot":"","sources":["../../../src/client/freeze-button.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAIjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAIpE,oGAAoG;AACpG,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,0BAA0B,CAAC,GAAG,sBAAsB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAExH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,iBAAiB,+BAoExI"}
@@ -8,16 +8,26 @@ import { jsx as _jsx } from "react/jsx-runtime";
8
8
  * the shared store), so the driver finds no pending work and stops after the
9
9
  * current turn. Resume re-submits the preserved texts, waking the driver and
10
10
  * continuing the queue.
11
+ *
12
+ * dsh-session-guard 协作(D8 fail-open):
13
+ * - 冻结 = 前端摘队列(本插件)+ composer block(阻止新输入漏进对话) + 尽力调服务端
14
+ * sessionGuard.stopNextTurn(停掉 session 下一回合;session-guard 未装时静默跳过)。
15
+ * - 解冻 = 清 composer block + **先** await sessionGuard.resume(让被打断回合的自然
16
+ * 下一步先发生),**再**重投队列(later 级条目因此排在自然 next turn 之后,不再插队)。
17
+ * - 本插件只做冻结增强,不承担重试/暂停决策(归后端,D9)。
11
18
  */
12
19
  import { useSyncExternalStore } from 'react';
13
20
  import { freezeStore } from "./freeze-store.js";
21
+ import { sessionGuardResume, sessionGuardStopNextTurn } from "./session-guard-bridge.js";
14
22
  import css from './freeze-button.module.css';
15
23
  /**
16
24
  * Freeze/resume toggle for the peak-hour scenario.
17
25
  * @param props - slot props; the session snapshot drives the detach list.
18
26
  */
19
- export function FreezeButton({ session, updateQueue, cancel, send, sendSteer, notify, t }) {
20
- const { frozen } = useSyncExternalStore(freezeStore.subscribe, freezeStore.getSnapshot);
27
+ export function FreezeButton({ session, updateQueue, cancel, send, sendSteer, sessionId, setComposerBlock, notify, t }) {
28
+ // The freeze store is keyed by session: read the owning session's snapshot.
29
+ const sid = sessionId ?? '';
30
+ const { frozen } = useSyncExternalStore(freezeStore.subscribe, () => freezeStore.getSnapshot(sid));
21
31
  const freeze = async () => {
22
32
  // Detach every pending input row — queued (next-turn) and already-steered
23
33
  // (next-step) alike — so nothing stays in the live queue while frozen.
@@ -29,12 +39,26 @@ export function FreezeButton({ session, updateQueue, cancel, send, sendSteer, no
29
39
  // Detach every pending row: the running turn finishes naturally, then the
30
40
  // driver finds no pending work and stops.
31
41
  await Promise.all(rows.map(row => updateQueue(row.id, { kind: 'remove' }).catch(() => undefined)));
32
- freezeStore.set({ frozen: true, pending });
42
+ freezeStore.set(sid, { frozen: true, pending });
43
+ // Raise the composer block: while frozen the composer is inert, so plain
44
+ // Enter can never leak a new message into the conversation (busyEnter
45
+ // only gates busy sessions; an idle/paused session would send directly).
46
+ setComposerBlock?.(t('steer.frozenInput'));
47
+ // 服务端:停掉 session 下一回合(fail-open,session-guard 未装则静默)。
48
+ if (sessionId !== undefined)
49
+ void sessionGuardStopNextTurn(sessionId);
33
50
  };
34
51
  const resume = async () => {
35
- const pending = freezeStore.getSnapshot().pending;
36
- freezeStore.set({ frozen: false, pending: [] });
52
+ const pending = freezeStore.getSnapshot(sid).pending;
53
+ freezeStore.set(sid, { frozen: false, pending: [] });
54
+ setComposerBlock?.(undefined);
37
55
  try {
56
+ // 先恢复服务端会话:被打断回合的自然下一步(deferredTools 续跑)先发生。
57
+ // 之后再重投队列 —— later 级条目经 send 进入 next-turn,排在自然 next turn
58
+ // 之后;safe_point/force 仍按各自语义插队。顺序倒置会让 later 抢在自然
59
+ // next turn 前被消费(idle 态 send 立即唤醒新回合)。
60
+ if (sessionId !== undefined)
61
+ await sessionGuardResume(sessionId);
38
62
  // Re-submit the preserved queue in FIFO order honoring each entry's
39
63
  // planned insertion tier: force (red) interrupts the current run first,
40
64
  // safe_point (yellow) steers into the next step, queue (green) flows
@@ -42,7 +66,7 @@ export function FreezeButton({ session, updateQueue, cancel, send, sendSteer, no
42
66
  for (const entry of pending) {
43
67
  if (entry.tier === 'force')
44
68
  await cancel();
45
- if (entry.tier === 'safe_point')
69
+ if (entry.tier === 'safe_point' && sendSteer !== undefined)
46
70
  await sendSteer(entry.text);
47
71
  else
48
72
  await send(entry.text);
@@ -1 +1 @@
1
- {"version":3,"file":"freeze-button.js","sourceRoot":"","sources":["../../../src/client/freeze-button.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"freeze-button.js","sourceRoot":"","sources":["../../../src/client/freeze-button.tsx"],"names":[],"mappings":"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"}
@@ -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;AAmCtF,6CAA6C;AAC7C,eAAO,MAAM,MAAM,UAAmE,CAAA;AAEtF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAiE9C"}
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"}