@eddyskywalker/dsh-chatgpt-subscription 0.26.1 → 0.27.0

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 (83) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +57 -0
  3. package/lib/client.js +2176 -116
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +2112 -93
  6. package/lib/types/client/index.d.ts +2 -0
  7. package/lib/types/client/index.d.ts.map +1 -1
  8. package/lib/types/client/progress-updates/contracts.d.ts +125 -0
  9. package/lib/types/client/progress-updates/contracts.d.ts.map +1 -0
  10. package/lib/types/client/progress-updates/guide-artwork.d.ts +28 -0
  11. package/lib/types/client/progress-updates/guide-artwork.d.ts.map +1 -0
  12. package/lib/types/client/progress-updates/host-source.d.ts +128 -0
  13. package/lib/types/client/progress-updates/host-source.d.ts.map +1 -0
  14. package/lib/types/client/progress-updates/index.d.ts +91 -0
  15. package/lib/types/client/progress-updates/index.d.ts.map +1 -0
  16. package/lib/types/client/progress-updates/locales.d.ts +127 -0
  17. package/lib/types/client/progress-updates/locales.d.ts.map +1 -0
  18. package/lib/types/client/progress-updates/markdown-lite.d.ts +60 -0
  19. package/lib/types/client/progress-updates/markdown-lite.d.ts.map +1 -0
  20. package/lib/types/client/progress-updates/progress-row.d.ts +87 -0
  21. package/lib/types/client/progress-updates/progress-row.d.ts.map +1 -0
  22. package/lib/types/client/progress-updates/settings-binding.d.ts +71 -0
  23. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -0
  24. package/lib/types/client/progress-updates/settings-section.d.ts +57 -0
  25. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -0
  26. package/lib/types/client/progress-updates/styles.d.ts +34 -0
  27. package/lib/types/client/progress-updates/styles.d.ts.map +1 -0
  28. package/lib/types/client/progress-updates/tool-name.d.ts +14 -0
  29. package/lib/types/client/progress-updates/tool-name.d.ts.map +1 -0
  30. package/lib/types/client/progress-updates/updates-panel.d.ts +113 -0
  31. package/lib/types/client/progress-updates/updates-panel.d.ts.map +1 -0
  32. package/lib/types/client/step-code/locales.d.ts +2 -2
  33. package/lib/types/client/workbuddy/WorkBuddySection.d.ts.map +1 -1
  34. package/lib/types/client/workbuddy/locales.d.ts +108 -0
  35. package/lib/types/client/workbuddy/locales.d.ts.map +1 -1
  36. package/lib/types/client/workbuddy/styles.d.ts.map +1 -1
  37. package/lib/types/client/workbuddy/useWorkBuddySection.d.ts +9 -1
  38. package/lib/types/client/workbuddy/useWorkBuddySection.d.ts.map +1 -1
  39. package/lib/types/host/progress-updates/index.d.ts +90 -0
  40. package/lib/types/host/progress-updates/index.d.ts.map +1 -0
  41. package/lib/types/host/progress-updates/nudge.d.ts +91 -0
  42. package/lib/types/host/progress-updates/nudge.d.ts.map +1 -0
  43. package/lib/types/host/progress-updates/prompt.d.ts +34 -0
  44. package/lib/types/host/progress-updates/prompt.d.ts.map +1 -0
  45. package/lib/types/host/progress-updates/routes.d.ts +39 -0
  46. package/lib/types/host/progress-updates/routes.d.ts.map +1 -0
  47. package/lib/types/host/progress-updates/store.d.ts +74 -0
  48. package/lib/types/host/progress-updates/store.d.ts.map +1 -0
  49. package/lib/types/host/progress-updates/tool.d.ts +42 -0
  50. package/lib/types/host/progress-updates/tool.d.ts.map +1 -0
  51. package/lib/types/host/reasoning-collapse-guard/index.d.ts +5 -0
  52. package/lib/types/host/reasoning-collapse-guard/index.d.ts.map +1 -1
  53. package/lib/types/host/web-provider-reconciler.d.ts +34 -0
  54. package/lib/types/host/web-provider-reconciler.d.ts.map +1 -0
  55. package/lib/types/host/workbuddy/account-pool.d.ts +32 -1
  56. package/lib/types/host/workbuddy/account-pool.d.ts.map +1 -1
  57. package/lib/types/host/workbuddy/adapter.d.ts +32 -0
  58. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
  59. package/lib/types/host/workbuddy/atrest.d.ts +98 -0
  60. package/lib/types/host/workbuddy/atrest.d.ts.map +1 -0
  61. package/lib/types/host/workbuddy/checkin.d.ts +16 -0
  62. package/lib/types/host/workbuddy/checkin.d.ts.map +1 -1
  63. package/lib/types/host/workbuddy/client.d.ts +9 -0
  64. package/lib/types/host/workbuddy/client.d.ts.map +1 -1
  65. package/lib/types/host/workbuddy/dsml.d.ts +55 -0
  66. package/lib/types/host/workbuddy/dsml.d.ts.map +1 -0
  67. package/lib/types/host/workbuddy/guardrails.d.ts +111 -0
  68. package/lib/types/host/workbuddy/guardrails.d.ts.map +1 -0
  69. package/lib/types/host/workbuddy/mapper.d.ts +11 -0
  70. package/lib/types/host/workbuddy/mapper.d.ts.map +1 -1
  71. package/lib/types/host/workbuddy/model-catalog.d.ts +8 -1
  72. package/lib/types/host/workbuddy/model-catalog.d.ts.map +1 -1
  73. package/lib/types/host/workbuddy/outbound-identity.d.ts +66 -0
  74. package/lib/types/host/workbuddy/outbound-identity.d.ts.map +1 -0
  75. package/lib/types/host/workbuddy/routes.d.ts +8 -1
  76. package/lib/types/host/workbuddy/routes.d.ts.map +1 -1
  77. package/lib/types/host/workbuddy/token-store.d.ts +93 -0
  78. package/lib/types/host/workbuddy/token-store.d.ts.map +1 -1
  79. package/lib/types/index.d.ts +63 -5
  80. package/lib/types/index.d.ts.map +1 -1
  81. package/lib/types/shared/workbuddy-contracts.d.ts +54 -2
  82. package/lib/types/shared/workbuddy-contracts.d.ts.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/locales.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,kBAAkB,CAAA;AAE3C,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFL,CAAA;AAEV,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFL,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/locales.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,kBAAkB,CAAA;AAE3C,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGL,CAAA;AAEV,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGL,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,iCAAiC,CAAA;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAO7C"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,iCAAiC,CAAA;AAEtD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAsB7C"}
@@ -1,5 +1,5 @@
1
1
  import type { AccountRotationStrategy } from '../../shared/account-pool-contracts.ts';
2
- import type { WorkBuddyAccount, WorkBuddyAccountQuota, WorkBuddyAccountSummaryDto, WorkBuddyCheckinSettings, WorkBuddyModelOption, WorkBuddyReasoningEffort, WorkBuddyWebStatus } from '../../shared/workbuddy-contracts.ts';
2
+ import type { WorkBuddyAccount, WorkBuddyAccountQuota, WorkBuddyAccountSummaryDto, WorkBuddyCheckinSettings, WorkBuddyGuardrailsDto, WorkBuddyModelOption, WorkBuddyOutboundSetting, WorkBuddyReasoningEffort, WorkBuddyWebStatus } from '../../shared/workbuddy-contracts.ts';
3
3
  import { type AccountPoolLabels } from '../common/account-pool-labels.ts';
4
4
  /** The seats the settings hub hands the card; both optional, so a bare render works. */
5
5
  export interface WorkBuddySectionProps {
@@ -134,6 +134,14 @@ export interface WorkBuddySectionView {
134
134
  resetAllContextWindows(): Promise<void>;
135
135
  /** Edit one capacity draft mid-typing; the editor never parses it. */
136
136
  updateContextDraft(modelId: string, draft: string): void;
137
+ /** Switch which client identity chat requests present. */
138
+ updateOutboundIdentity(setting: WorkBuddyOutboundSetting): Promise<void>;
139
+ /** Arm, change or clear the local quota guardrails. */
140
+ updateGuardrails(guardrails: Partial<WorkBuddyGuardrailsDto>): Promise<void>;
141
+ /** Store the desktop client's at-rest key so sealed credentials can be read. */
142
+ saveAtRestKey(key: string): Promise<void>;
143
+ /** Forget that key; sealed accounts become unreadable again. */
144
+ clearAtRestKey(): Promise<void>;
137
145
  };
138
146
  }
139
147
  export declare function useWorkBuddySection({ onModelChange, loadModelDirectory }: WorkBuddySectionProps): WorkBuddySectionView;
@@ -1 +1 @@
1
- {"version":3,"file":"useWorkBuddySection.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/useWorkBuddySection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useWorkBuddySection.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/useWorkBuddySection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * 「进展更新」宿主半边在本插件里的挂载点。
3
+ *
4
+ * 复刻 Kimi Code 的「进展更新」特性:agent 在多步任务中通过一个**不结束回合**的
5
+ * 工具主动向用户汇报进展。本文件挂四样东西:
6
+ *
7
+ * 1. `progress_update` 工具(tools 服务);
8
+ * 2. 系统提示词引导(systemPrompt 服务,文本用函数形式,开关关闭时返回空串,
9
+ * 因此设置改动立刻生效、无需重启会话);
10
+ * 3. `tools/post-execute` 上的 8 轮催促:连续带工具调用却没有进展更新时,给模型
11
+ * 追加一条提醒(additionalContexts);
12
+ * 4. `GET /api/dsh-progress-updates/updates` 只读路由 —— 浏览器半边唯一的取数通道。
13
+ *
14
+ * **可选服务一律走 `ctx.get()`**:Cordis 里没写进 `inject` 的服务名不能直接当
15
+ * 属性读,否则 apply 当场抛 `cannot get property "..." without inject`,整个插件
16
+ * 降级。`sessions`、`sessionProjections`、`systemPrompt`、`webServer` 在本插件
17
+ * 的 inject 里都没有(前者随 harness 是否装 agent-loop 而定,后者的能力由本模块
18
+ * 自己探测),所以它们必须是**调用时**的可选读取,缺了就退化成更弱的实现,而不是
19
+ * 让插件挂不上。
20
+ *
21
+ * @module dsh-chatgpt-subscription/host/progress-updates
22
+ */
23
+ /** 一次挂载读到的有效设置(由主入口每次重新解析活引用后交进来)。 */
24
+ export interface ProgressUpdatesSettings {
25
+ /** 总开关。 */
26
+ enabled: boolean;
27
+ /** 催促阈值:连续多少轮带工具调用却没有进展更新就提醒一次。 */
28
+ nudgeThreshold: number;
29
+ }
30
+ /**
31
+ * 设置字段在运行时可能是活引用(volatile)或普通值(手工构造的上下文、测试)。
32
+ *
33
+ * loader 把声明为 `volatile()` 的字段解析成一个 `{ get() }` 活引用,设置保存时
34
+ * 就地写新值并广播 `loader/volatile-update`,**不**重挂插件行;所以这里必须能
35
+ * 跟着引用读到当前值,而不是拿到一份快照。
36
+ */
37
+ interface ConfigRef<T> {
38
+ /** 读取当前已提交的值。 */
39
+ get(): T | undefined;
40
+ }
41
+ /** 一个配置字段:活引用或普通值。 */
42
+ export type ProgressUpdatesConfigField<T> = ConfigRef<T> | T | undefined;
43
+ /** 主入口交给本模块的配置形状(只取本模块认识的两个字段)。 */
44
+ export interface ProgressUpdatesConfigFields {
45
+ /** 总开关字段。 */
46
+ progressUpdates?: ProgressUpdatesConfigField<boolean>;
47
+ /** 催促阈值得字段。 */
48
+ progressUpdatesNudgeThreshold?: ProgressUpdatesConfigField<number>;
49
+ }
50
+ /**
51
+ * 读取一个配置字段,沿着 volatile 活引用取当前值。
52
+ * @param field - 字段本身。
53
+ * @returns 当前值,或字段缺失时的 undefined。
54
+ */
55
+ export declare function readProgressConfigField<T>(field: ProgressUpdatesConfigField<T>): T | undefined;
56
+ /**
57
+ * 解析一次读取的有效设置:每次调用都重读活引用,因此设置保存后立刻生效。
58
+ * @param config - 主入口收到的插件配置(活引用或普通值)。
59
+ * @returns 生效的开关与催促阈值。
60
+ */
61
+ export declare function resolveProgressUpdatesSettings(config?: ProgressUpdatesConfigFields): ProgressUpdatesSettings;
62
+ /** 挂载选项。 */
63
+ export interface ProgressUpdatesOptions {
64
+ /**
65
+ * 读取当前设置。
66
+ *
67
+ * 必须是**函数**:loader 会把 volatile 字段替换成活引用,设置保存时就地写新值
68
+ * 而不重挂插件行,所以每次用到设置都要重读一次;apply 时求值一次就存下来的
69
+ * 写法会让开关在会话中途失效。
70
+ */
71
+ settings: () => ProgressUpdatesSettings;
72
+ }
73
+ /** 本模块读得到的宿主上下文(Cordis Context 结构上满足;测试可用假对象)。 */
74
+ export interface ProgressUpdatesContext {
75
+ /** Cordis 的副作用登记:回调返回的 disposer 会随插件卸载执行。 */
76
+ effect?<T>(execute: () => T, label?: string): unknown;
77
+ /** Cordis 的事件总线。 */
78
+ on?(event: string, listener: (...args: never[]) => unknown): () => void;
79
+ /** 服务查找:**调用时**读可选服务,不触发 inject 断言。 */
80
+ get?(name: string): unknown;
81
+ }
82
+ /**
83
+ * 挂载「进展更新」的宿主半边。
84
+ * @param ctx - 宿主插件上下文。
85
+ * @param options - 挂载选项(设置读取器)。
86
+ * @returns 卸载函数;重复挂载时返回一个空操作。
87
+ */
88
+ export declare function installProgressUpdates(ctx: ProgressUpdatesContext, options: ProgressUpdatesOptions): () => void;
89
+ export {};
90
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwBH,sCAAsC;AACtC,MAAM,WAAW,uBAAuB;IACtC,WAAW;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;GAMG;AACH,UAAU,SAAS,CAAC,CAAC;IACnB,iBAAiB;IACjB,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;CACrB;AAED,sBAAsB;AACtB,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAExE,mCAAmC;AACnC,MAAM,WAAW,2BAA2B;IAC1C,aAAa;IACb,eAAe,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAA;IACrD,eAAe;IACf,6BAA6B,CAAC,EAAE,0BAA0B,CAAC,MAAM,CAAC,CAAA;CACnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAM9F;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,2BAA2B,GAAG,uBAAuB,CAU5G;AAED,YAAY;AACZ,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,uBAAuB,CAAA;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,oBAAoB;IACpB,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,MAAM,IAAI,CAAA;IACvE,uCAAuC;IACvC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B;AAwED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAiK/G"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * 8 轮催促:在 `tools/post-execute` 上计数,连续且带工具调用、期间没有
3
+ * progress_update 的轮次达到阈值时,给模型追加一条提醒。
4
+ *
5
+ * 两个刻意的设计:
6
+ *
7
+ * 1. **计数按会话维度**,不按 subagent 各自计数。这是有意修正 Kimi 的实现瑕疵:
8
+ * 主 agent 和它派出的 subagent 各自记一份,谁都没到阈值,于是用户长时间收不到
9
+ * 任何进展。这里把子会话归并到最近的顶层祖先,整棵委派树共用一个计数器。
10
+ * 2. **按「步」而不是按「条工具结果」计数**。`tools/post-execute` 是每条工具结果
11
+ * 各触发一次的:一次并行发三个工具、或一次 run_code 里嵌 N 个子调用,都只是
12
+ * 同一个模型步,却会触发 N 次。用会话的 turnBoundary 投影里的 lastStepStartSeq
13
+ * 去重,才是真正的「轮次」。
14
+ *
15
+ * @module dsh-chatgpt-subscription/host/progress-updates/nudge
16
+ */
17
+ import type { UserMessage } from '@deepseek-ai/dsh-llm';
18
+ /** 注入到模型上下文里的催促正文。 */
19
+ export declare const NUDGE_TEXT: string;
20
+ /** 催促上下文在消息来源上的 kind(供客户端与日志区分这类注入)。 */
21
+ export declare const NUDGE_SOURCE_KIND = "progress-updates-nudge";
22
+ declare module '@deepseek-ai/dsh-llm' {
23
+ interface MessageSourceMap {
24
+ /** 进展更新模块的催促提醒。 */
25
+ 'progress-updates-nudge': {
26
+ kind: 'progress-updates-nudge';
27
+ } & {
28
+ form?: 'notice';
29
+ summary?: string;
30
+ };
31
+ }
32
+ }
33
+ /**
34
+ * 造一条催促上下文。
35
+ * @param sequence - 本会话第几次催促,写进 notice 摘要便于日志辨认。
36
+ * @returns 可直接放进 `additionalContexts` 的用户角色消息。
37
+ */
38
+ export declare function createNudgeContext(sequence: number): UserMessage;
39
+ /**
40
+ * 事件里读得到的会话标识与血缘。
41
+ */
42
+ export interface NudgeAgent {
43
+ /** 调用方 agent 的会话 id。 */
44
+ readonly id?: unknown;
45
+ /** 调用方会话记录(用于读 lineage)。 */
46
+ readonly session?: NudgeSessionLike;
47
+ }
48
+ /** 一条会话记录里本模块会读的部分(结构化类型,不绑定具体 SDK 版本)。 */
49
+ export interface NudgeSessionLike {
50
+ readonly header?: {
51
+ readonly id?: unknown;
52
+ readonly origin?: unknown;
53
+ readonly parentSession?: unknown;
54
+ };
55
+ }
56
+ /** 会话查找表:够把子会话回溯到顶层祖先即可。 */
57
+ export interface NudgeSessionLookup {
58
+ get(id: string): {
59
+ readonly header?: {
60
+ readonly origin?: unknown;
61
+ readonly parentSession?: unknown;
62
+ };
63
+ } | undefined;
64
+ }
65
+ /**
66
+ * 找出一次工具调用所属的**计数会话**:子会话归并到最近的顶层祖先,整棵委派
67
+ * 树共用一个计数器。
68
+ * @param agent - 事件里的调用方 agent。
69
+ * @param sessions - 会话查找表,缺省时退化为只认调用方自己的会话。
70
+ * @returns 计数用的会话 id,无法判定时返回 undefined。
71
+ */
72
+ export declare function counterSessionIdOf(agent: NudgeAgent | undefined, sessions?: NudgeSessionLookup): string | undefined;
73
+ /**
74
+ * 会话投影服务里本模块会读的那一个方法:agent-loop 注册的 `turnBoundary`。
75
+ */
76
+ export interface TurnBoundaryLookup {
77
+ stateOf(session: unknown, key: 'turnBoundary'): {
78
+ readonly lastStepStartSeq?: number | null;
79
+ } | undefined;
80
+ }
81
+ /**
82
+ * 读一次工具调用所属的「步」标识,用于把同一个模型步里的多条工具结果合并成一轮。
83
+ *
84
+ * 拿不到 turnBoundary(没有 agent-loop,或宿主不是真实会话)时返回 undefined,
85
+ * 调用方退化为按工具结果计数——宁可多计,也不要漏掉催促。
86
+ * @param agent - 事件里的调用方 agent。
87
+ * @param projections - 会话投影服务,可选。
88
+ * @returns 该步的唯一键,或 undefined。
89
+ */
90
+ export declare function stepKeyOf(agent: NudgeAgent | undefined, projections?: TurnBoundaryLookup): string | undefined;
91
+ //# sourceMappingURL=nudge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIvD,sBAAsB;AACtB,eAAO,MAAM,UAAU,QAOZ,CAAA;AAEX,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,2BAA2B,CAAA;AAEzD,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,gBAAgB;QACxB,mBAAmB;QACnB,wBAAwB,EAAE;YAAE,IAAI,EAAE,wBAAwB,CAAA;SAAE,GAAG;YAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACrG;CACF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAShE;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAA;IACrB,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CACpC;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAA;QACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KACjC,CAAA;CACF;AAED,4BAA4B;AAC5B,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,GAAG,SAAS,CAAA;CACnH;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,MAAM,GAAG,SAAS,CAkBpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GACzC;QAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAC7C,SAAS,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAY7G"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 系统提示词引导:让模型知道「多步任务里要主动汇报进展」这件事该怎么用。
3
+ *
4
+ * 文本用函数形式提供(而不是静态字符串):开关关闭时返回空串,装配期就地
5
+ * 抹掉引导,不需要重启会话、也不需要重挂插件行。
6
+ *
7
+ * @module dsh-chatgpt-subscription/host/progress-updates/prompt
8
+ */
9
+ /**
10
+ * 本模块提示词分节的名称,全局唯一(重复注册会抛错)。
11
+ *
12
+ * 保留原插件的 `plugin:progress-updates` 拼写:会话里已有的分节名不能因为搬家
13
+ * 而变成第二个分节。
14
+ */
15
+ export declare const PROGRESS_SECTION_NAME = "plugin:progress-updates";
16
+ /**
17
+ * 引导词在提示词里的排序位。插件族占用的区间在部署人设之后、SDK 的
18
+ * PLAN_POLICY(500) 之前;这里取 220,紧跟 ssh(150) 与 task-board(200) 之后,
19
+ * 不与它们并列。
20
+ */
21
+ export declare const PROGRESS_SECTION_ORDER = 220;
22
+ /**
23
+ * 引导词正文。写法对齐 Kimi 的「进展更新」:先说清多步任务早期的思路,再报
24
+ * 有意义的结论、阶段判断、长等待与阻塞;每条给一行标题,细节放正文;不重复
25
+ * 没有变化的状态。
26
+ */
27
+ export declare const PROGRESS_GUIDANCE: string;
28
+ /**
29
+ * 生成提示词分节的文本提供者。
30
+ * @param isEnabled - 读取当前开关状态的函数(每次装配重新求值)。
31
+ * @returns 开关打开时返回引导词,关闭时返回空串。
32
+ */
33
+ export declare function progressSectionText(isEnabled: () => boolean): () => string;
34
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,4BAA4B,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAmBlB,CAAA;AAEZ;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,OAAO,GAAG,MAAM,MAAM,CAE1E"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 宿主对浏览器暴露的只读 HTTP 路由。
3
+ *
4
+ * 这是**唯一**能把进展送到浏览器的通道:浏览器半边是另一个运行时(独立 bundle,
5
+ * 跑在用户浏览器里),拿不到宿主进程的任何对象或 globalThis 状态,因此只能走
6
+ * 同源 HTTP。
7
+ *
8
+ * 路径固定在 `/api/dsh-progress-updates/updates`:客户端半边的取数常量就是从
9
+ * 这个形状写死的,搬家时不能顺手改名,否则面板读到的是 404。
10
+ *
11
+ * @module dsh-chatgpt-subscription/host/progress-updates/routes
12
+ */
13
+ import type { WebRoute } from '@deepseek-ai/dsh-host-webserver';
14
+ import type { ProgressUpdate } from './store.ts';
15
+ /** 本路由族的前缀。 */
16
+ export declare const PROGRESS_API_PREFIX = "/api/dsh-progress-updates";
17
+ /** 进展读取路由的完整路径。 */
18
+ export declare const PROGRESS_UPDATES_PATH: string;
19
+ /**
20
+ * 一条会话进展的读取面:路由只读它,不关心它怎么被写。
21
+ */
22
+ export interface ProgressUpdatesReader {
23
+ /**
24
+ * 读取一个会话当前的进展列表。
25
+ * @param sessionId - 会话 id;调用方可用空串表示"当前/默认"。
26
+ * @returns 该会话的进展(按时间顺序,最多 MAX_UPDATES 条)。
27
+ */
28
+ updatesOf(sessionId: string): readonly ProgressUpdate[];
29
+ }
30
+ /**
31
+ * 进展读取路由:`GET /api/dsh-progress-updates/updates?session=<id>`。
32
+ *
33
+ * 返回 `{ updates: ProgressUpdate[] }`。响应带 no-store:这个列表随 agent 干活
34
+ * 实时变化,缓存住就等于展示过期进展。
35
+ * @param reader - 进展读取面。
36
+ * @returns 可注册的 route。
37
+ */
38
+ export declare function makeProgressUpdatesRoute(reader: ProgressUpdatesReader): WebRoute;
39
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAe;AACf,eAAO,MAAM,mBAAmB,8BAA8B,CAAA;AAE9D,mBAAmB;AACnB,eAAO,MAAM,qBAAqB,QAAmC,CAAA;AAuErE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAAA;CACxD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,QAAQ,CAahF"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 进展更新的会话维度状态 —— 纯逻辑。
3
+ *
4
+ * 这里刻意不 import 任何 `node:` 内置模块,也不 import 任何 `@deepseek-ai` 运行时
5
+ * 服务:同一份实现既要在宿主进程里维护推进节奏(轮次计数、催促次数),也可能被
6
+ * 浏览器半边复用做渲染推导,任何一端专属的依赖都会让另一端无法装载。
7
+ *
8
+ * @module dsh-chatgpt-subscription/host/progress-updates/store
9
+ */
10
+ /** 环形缓冲上限:最多保留的进展条数。 */
11
+ export declare const MAX_UPDATES = 50;
12
+ /** 催促阈值:连续这么多轮带工具调用却没有进展更新时,注入一条提醒。 */
13
+ export declare const NUDGE_THRESHOLD = 8;
14
+ /** 一条已展示的进展。 */
15
+ export interface ProgressUpdate {
16
+ /** 稳定标识,同一会话内唯一(进程内自增 + 时间戳,无外部依赖)。 */
17
+ id: string;
18
+ /** 单行标题,约 60 字以内,用户语言,纯文本,无 Markdown,无结尾句号。 */
19
+ title?: string;
20
+ /** 详情正文,约 1000 字以内,轻 Markdown:一段正文 + 少量 bullet。 */
21
+ message: string;
22
+ /** 产生时刻,Unix 毫秒时间戳。 */
23
+ at: number;
24
+ /** 来源标签(计数会话 id),供浏览器侧分组显示。 */
25
+ source?: string;
26
+ }
27
+ /** 一个会话维度的进展更新状态。 */
28
+ export interface ProgressUpdateState {
29
+ /** 进展环形缓冲,按产生顺序排列,最多 {@link MAX_UPDATES} 条。 */
30
+ updates: ProgressUpdate[];
31
+ /** 自上次进展更新以来连续带工具调用的轮次数。 */
32
+ roundsSinceUpdate: number;
33
+ /** 本会话已经发出的催促次数。 */
34
+ nudges: number;
35
+ }
36
+ /**
37
+ * 判断是否该催促。达到阈值即触发,注入之后调用方把计数清零。
38
+ * @param rounds - 自上次进展更新以来的连续轮次数。
39
+ * @returns 是否达到 {@link NUDGE_THRESHOLD}。
40
+ */
41
+ export declare function shouldNudge(rounds: number): boolean;
42
+ /**
43
+ * 把进展列表截断到环形缓冲上限,保留最新的一批。
44
+ * @param list - 任意长度的进展列表(不会被就地修改)。
45
+ * @returns 截断后的新数组。
46
+ */
47
+ export declare function capUpdates(list: readonly ProgressUpdate[]): ProgressUpdate[];
48
+ /**
49
+ * 生成一条进展的稳定 id。
50
+ * @param at - 产生时刻(Unix 毫秒)。
51
+ * @returns 形如 `pu-<时间戳>-<序号>` 的字符串。
52
+ */
53
+ export declare function nextUpdateId(at: number): string;
54
+ /** 会话维度状态容器:宿主持有它推进计数,路由只读它渲染。 */
55
+ export interface ProgressUpdateStore {
56
+ /** 读取当前状态(快照语义,返回的是引用,调用方不要就地改)。 */
57
+ state(): ProgressUpdateState;
58
+ /** 追加一条进展;超出 {@link MAX_UPDATES} 时丢弃最旧的。 */
59
+ push(update: ProgressUpdate): ProgressUpdateState;
60
+ /** 记一轮「带工具调用」的轮次,返回新的轮次数。 */
61
+ bumpRound(): number;
62
+ /** 记录一次进展更新:轮次计数归零。 */
63
+ markUpdated(): ProgressUpdateState;
64
+ /** 记录一次催促:催促次数 +1,轮次计数归零。 */
65
+ markNudged(): ProgressUpdateState;
66
+ /** 清空进展(会话结束时用)。 */
67
+ reset(): ProgressUpdateState;
68
+ }
69
+ /**
70
+ * 创建一个空的进展更新 store。
71
+ * @returns 新的会话维度 store。
72
+ */
73
+ export declare function createProgressUpdateStore(): ProgressUpdateStore;
74
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAwB;AACxB,eAAO,MAAM,WAAW,KAAK,CAAA;AAE7B,uCAAuC;AACvC,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAqB;AACrB,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,4BAA4B;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,EAAE,CAE5E;AAKD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,kCAAkC;AAClC,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,KAAK,IAAI,mBAAmB,CAAA;IAC5B,4CAA4C;IAC5C,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,CAAA;IACjD,6BAA6B;IAC7B,SAAS,IAAI,MAAM,CAAA;IACnB,uBAAuB;IACvB,WAAW,IAAI,mBAAmB,CAAA;IAClC,6BAA6B;IAC7B,UAAU,IAAI,mBAAmB,CAAA;IACjC,oBAAoB;IACpB,KAAK,IAAI,mBAAmB,CAAA;CAC7B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CA0B/D"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 模型可见的 progress_update 工具。
3
+ *
4
+ * 这是一个**不结束回合**的工具:它只把一条进展推给用户界面,随后模型继续
5
+ * 干活。开关关闭时工具照常注册(否则工具清单会在会话中途变化),但 execute
6
+ * 直接返回 `displayed:false` 而不是抛错——一条被关掉的汇报不该变成一次失败
7
+ * 的工具调用。
8
+ *
9
+ * @module dsh-chatgpt-subscription/host/progress-updates/tool
10
+ */
11
+ import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
12
+ import { type ProgressUpdate } from './store.ts';
13
+ /** 注册的工具名。冻结契约的一部分,不要改动。 */
14
+ export declare const NOTIFY_USER_TOOL = "progress_update";
15
+ /** 工具关闭时返回给模型的文本(canonical 输出的 render,而不是抛错)。 */
16
+ export declare const DISABLED_OUTPUT_TEXT = "Progress updates are disabled; the update was not displayed.";
17
+ /** 工具描述的最终全文。 */
18
+ export declare const PROGRESS_UPDATE_DESCRIPTION: string;
19
+ /** 一条进展被接受之后,宿主侧要把新状态往回推(路由与面板据此渲染)。 */
20
+ export interface ProgressUpdateSink {
21
+ /** 追加一条进展;返回它是否被真正展示。 */
22
+ push(update: ProgressUpdate): boolean;
23
+ }
24
+ /** 工具执行结果:canonical JSON,冻结契约的一部分。 */
25
+ export interface ProgressUpdateResult {
26
+ /** 这条进展是否真的展示给了用户。 */
27
+ displayed: boolean;
28
+ }
29
+ /**
30
+ * 构造 progress_update 工具。
31
+ * @param deps - 依赖:当前开关与进展接收端。
32
+ * @returns 可注册的工具定义。
33
+ */
34
+ export declare function createProgressUpdateTool(deps: {
35
+ /** 读取当前开关状态(每次调用重新求值)。 */
36
+ isEnabled: () => boolean;
37
+ /** 进展接收端;未接线时返回 undefined,此时报告不会展示。 */
38
+ sink?: () => ProgressUpdateSink | undefined;
39
+ /** 当前会话标识,写进进展的 source 字段。 */
40
+ sourceOf?: (exec: unknown) => string | undefined;
41
+ }): ToolDefinition;
42
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAE9D,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,iEAAiE,CAAA;AAElG,iBAAiB;AACjB,eAAO,MAAM,2BAA2B,QAW7B,CAAA;AAEX,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAA;CACtC;AAED,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,0BAA0B;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAA;IAC3C,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAA;CACjD,GAAG,cAAc,CAgDjB"}
@@ -55,6 +55,11 @@
55
55
  * already existed when the guard installed was never reported at all. Both
56
56
  * cases cut the runaway and then resumed nothing, which reads to the user as a
57
57
  * conversation that simply stops mid-answer.
58
+ *
59
+ * Status: **switched off in this line by default**. Everything here still
60
+ * works and is still tested; what changed is the wiring in `src/index.ts`,
61
+ * whose `reasoningCollapseGuard` config now defaults to `false` instead of
62
+ * `{}`. A deployment that wants the break back opts in with an object.
58
63
  */
59
64
  /**
60
65
  * The subset of `llm/stream` options this guard reads.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/reasoning-collapse-guard/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/reasoning-collapse-guard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Periodic reconciliation of the `web` entry against this plugin's selection.
3
+ *
4
+ * Selecting a backend writes the loader entry's config, and nothing in the
5
+ * loader promises that write survives every later composition of that entry.
6
+ * When it does not, the entry keeps DSH's own providers while the switcher's
7
+ * last verdict still reads `applied`, so no preference change, proxy detection,
8
+ * or injection ever fires again — the tool stays on the built-in provider for
9
+ * the rest of the process. On a machine whose proxy answers DNS with a fake-ip
10
+ * range that provider refuses every fetch before the proxy is consulted.
11
+ *
12
+ * A dry re-check costs one loader scan, and `select()` returns without
13
+ * restarting anything when the entry already holds what the selection wants;
14
+ * a timer is therefore the one reconciliation trigger that does not depend on
15
+ * an event this plugin does not own.
16
+ *
17
+ * @module dsh-chatgpt-subscription/web-provider-reconciler
18
+ */
19
+ /** How often the running `web` configuration is compared with the selection. */
20
+ export declare const WEB_PROVIDER_RECONCILE_INTERVAL_MS = 30000;
21
+ export interface WebProviderReconcilerOptions {
22
+ /** Re-reads the current selection and re-applies it when the entry drifted. */
23
+ reconcile: () => void;
24
+ /** Override for tests; defaults to {@link WEB_PROVIDER_RECONCILE_INTERVAL_MS}. */
25
+ intervalMs?: number;
26
+ }
27
+ /**
28
+ * Start reconciling the web provider selection on a timer.
29
+ *
30
+ * @param options - the reconcile callback and an optional interval.
31
+ * @returns the disposer that stops the timer.
32
+ */
33
+ export declare function startWebProviderReconciler(options: WebProviderReconcilerOptions): () => void;
34
+ //# sourceMappingURL=web-provider-reconciler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-provider-reconciler.d.ts","sourceRoot":"","sources":["../../../src/host/web-provider-reconciler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,gFAAgF;AAChF,eAAO,MAAM,kCAAkC,QAAS,CAAA;AAExD,MAAM,WAAW,4BAA4B;IAC3C,+EAA+E;IAC/E,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,IAAI,CAgB5F"}
@@ -85,6 +85,17 @@ export declare class WorkBuddyAccountPool extends AccountPoolCore<WorkBuddyCrede
85
85
  * decision goes through, so the mapping is never stale when it is consulted.
86
86
  */
87
87
  private readonly legacyIds;
88
+ /**
89
+ * Per-model parks, in memory only: account id → model → the instant it lifts.
90
+ *
91
+ * The subscription meters an account × MODEL over a 24h window (429 `code
92
+ * 6004` names when it lifts), so cooling the whole ACCOUNT for one exhausted
93
+ * model throws away every other model that account can still serve. Process
94
+ * local on purpose, like the sibling gateway's model cooldowns: the window is
95
+ * short, and a restart re-measures it with the first request rather than
96
+ * trusting a stale timestamp.
97
+ */
98
+ private readonly modelCooldowns;
88
99
  constructor(options?: WorkBuddyAccountPoolOptions);
89
100
  /**
90
101
  * Load the pool, refreshing the legacy-key index on the way.
@@ -145,10 +156,30 @@ export declare class WorkBuddyAccountPool extends AccountPoolCore<WorkBuddyCrede
145
156
  * refreshes its own token, so the copy the pool adopted can be older than what
146
157
  * is on disk.
147
158
  */
148
- getEffectiveCredential(excludeIds?: ReadonlySet<string>, fetchFn?: typeof fetch): Promise<{
159
+ getEffectiveCredential(excludeIds?: ReadonlySet<string>, fetchFn?: typeof fetch, model?: string): Promise<{
149
160
  account: WorkBuddyPoolAccount;
150
161
  credentials: WorkBuddyCredentials;
151
162
  }>;
163
+ /**
164
+ * Park ONE model on one account; every other model keeps serving.
165
+ *
166
+ * Returns the instant the park lifts, or undefined for a non-positive
167
+ * duration (which clears any existing park rather than extending it).
168
+ */
169
+ markModelCooldown(accountId: string, model: string, durationMs: number): number | undefined;
170
+ /** When this account's park on this model lifts, or undefined when it may serve. */
171
+ modelCooldownUntil(accountId: string, model: string, now?: number): number | undefined;
172
+ /** Accounts currently parked on one model, with lifted entries pruned on the way. */
173
+ private parkedAccountIds;
174
+ /**
175
+ * Whether another account besides `triedAccountIds` can serve THIS model.
176
+ *
177
+ * The plain {@link hasAnotherAvailableAccount} answers for any model, so a
178
+ * rotation loop that consulted it would keep trying while every remaining
179
+ * account is parked on the model it is asking for — turning one exhausted
180
+ * window into a burst of refused requests.
181
+ */
182
+ hasAnotherAvailableAccountFor(triedAccountIds: ReadonlySet<string>, model: string): Promise<boolean>;
152
183
  /**
153
184
  * Whether an account may serve a request.
154
185
  *
@@ -1 +1 @@
1
- {"version":3,"file":"account-pool.d.ts","sourceRoot":"","sources":["../../../../src/host/workbuddy/account-pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account-pool.d.ts","sourceRoot":"","sources":["../../../../src/host/workbuddy/account-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EACL,eAAe,EAGf,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EACL,mBAAmB,EAInB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAA;AAKzB,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAE1B,eAAe,EAChB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAEjF,oFAAoF;AACpF,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC;IAClF,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AASD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CA8FrF;AAkED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,mBAAmB,GAAG,SAAS,CAsBnG;AAgBD,MAAM,WAAW,2BAA2B;IAC1C,iFAAiF;IACjF,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM;QAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAA;CAC5F;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,eAAe,CACvD,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,CAC3B;IACC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0C;IAC5E;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyC;gBAE5D,OAAO,GAAE,2BAAgC;IAgFrD;;;;;;;OAOG;cACsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAWhF,kFAAkF;IAClF,OAAO,CAAC,kBAAkB;IAK1B;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAmClE;;;;;;;;;;;;;;;;OAgBG;YACW,qBAAqB;IA4BnC,8EAA8E;IAC/D,YAAY,IAAI,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAOpE;;;;;;;OAOG;IACY,mBAAmB,CAChC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,OAAO,GAAE,OAAO,KAAa,EAC7B,YAAY,UAAQ,GACnB,OAAO,CAAC;QAAE,OAAO,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,oBAAoB,CAAA;KAAE,CAAC;IAQhF;;;;;;OAMG;IACG,sBAAsB,CAC1B,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,OAAO,GAAE,OAAO,KAAa,EAC7B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,oBAAoB,CAAA;KAAE,CAAC;IAgChF;;;;;OAKG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAY3F,oFAAoF;IACpF,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,SAAS;IAK1F,qFAAqF;IACrF,OAAO,CAAC,gBAAgB;IAWxB;;;;;;;OAOG;IACG,6BAA6B,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1G;;;;;OAKG;cACgB,UAAU,CAC3B,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,OAAO;IAUV,OAAO,CAAC,SAAS;IAIjB;;;;;;;;;OASG;IACY,UAAU,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI3G;;;;;;OAMG;cACgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAMxG"}