@eddyskywalker/dsh-chatgpt-subscription 0.50.0 → 0.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/lib/client.js +43 -0
  3. package/lib/client.js.map +1 -1
  4. package/lib/{entry-progress-updates-CkGJr_fe.js → entry-progress-updates-BEkdyDZU.js} +152 -8
  5. package/lib/index.js +4853 -1821
  6. package/lib/progress-updates.js +1 -1
  7. package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
  8. package/lib/types/client/progress-updates/locales.d.ts +8 -2
  9. package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
  10. package/lib/types/client/progress-updates/settings-binding.d.ts +9 -1
  11. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
  12. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
  13. package/lib/types/compat.d.ts +1 -1
  14. package/lib/types/host/agent-preset.d.ts.map +1 -1
  15. package/lib/types/host/dispatch-execution-guard.d.ts +151 -0
  16. package/lib/types/host/dispatch-execution-guard.d.ts.map +1 -0
  17. package/lib/types/host/dispatch-ledger/binding.d.ts +118 -0
  18. package/lib/types/host/dispatch-ledger/binding.d.ts.map +1 -0
  19. package/lib/types/host/dispatch-ledger/guard.d.ts +271 -0
  20. package/lib/types/host/dispatch-ledger/guard.d.ts.map +1 -0
  21. package/lib/types/host/dispatch-ledger/header.d.ts +169 -0
  22. package/lib/types/host/dispatch-ledger/header.d.ts.map +1 -0
  23. package/lib/types/host/dispatch-ledger/index.d.ts +56 -0
  24. package/lib/types/host/dispatch-ledger/index.d.ts.map +1 -0
  25. package/lib/types/host/dispatch-ledger/ledger.d.ts +531 -0
  26. package/lib/types/host/dispatch-ledger/ledger.d.ts.map +1 -0
  27. package/lib/types/host/dispatch-ledger/policy.d.ts +99 -0
  28. package/lib/types/host/dispatch-ledger/policy.d.ts.map +1 -0
  29. package/lib/types/host/dispatch-ledger/protocol.d.ts +25 -0
  30. package/lib/types/host/dispatch-ledger/protocol.d.ts.map +1 -0
  31. package/lib/types/host/dispatch-ledger/tool.d.ts +151 -0
  32. package/lib/types/host/dispatch-ledger/tool.d.ts.map +1 -0
  33. package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
  34. package/lib/types/host/kimi-code/mapper.d.ts.map +1 -1
  35. package/lib/types/host/kimi-code/model-catalog.d.ts.map +1 -1
  36. package/lib/types/host/progress-updates/index.d.ts.map +1 -1
  37. package/lib/types/host/progress-updates/prompt.d.ts +86 -21
  38. package/lib/types/host/progress-updates/prompt.d.ts.map +1 -1
  39. package/lib/types/host/ptc-sdk-cache-guard.d.ts +12 -2
  40. package/lib/types/host/ptc-sdk-cache-guard.d.ts.map +1 -1
  41. package/lib/types/host/qoder/adapter.d.ts +13 -2
  42. package/lib/types/host/qoder/adapter.d.ts.map +1 -1
  43. package/lib/types/host/qoder/mapper.d.ts +27 -11
  44. package/lib/types/host/qoder/mapper.d.ts.map +1 -1
  45. package/lib/types/index.d.ts +15 -0
  46. package/lib/types/index.d.ts.map +1 -1
  47. package/package.json +1 -1
  48. package/presets/dispatch/README.md +51 -9
  49. package/presets/dispatch/agent.cordis.yml +68 -122
@@ -0,0 +1,531 @@
1
+ /**
2
+ * 「调度账本」:把**持久会话日志**折成一份可审计的派发账本。
3
+ *
4
+ * ## 它折的是什么
5
+ *
6
+ * 账本不写任何新事件(会话事件类型是封闭词表,加一种新类型会让旧读者拒绝
7
+ * 重建整个会话),它只是**折叠**已经存在的事件:
8
+ *
9
+ * - `tool/call`(原生调用)与 `tool/ptc-dispatch-start` / `tool/ptc-dispatch`
10
+ * (PTC 模式)——一次**派发尝试**;
11
+ * - `tool/result` / `tool/ptc-dispatch`——同一次尝试的**结局**;
12
+ * - `agent/inbox/spliced`——子代理**报告**落到 owner 会话。
13
+ *
14
+ * ## 命名空间永久占用
15
+ *
16
+ * 命名空间 = (brief_id, run_id, idem)。它由**第一次派发尝试**占用,此后
17
+ * **永不可复用**——不管那次运行后来是完成了还是被释放了。`released` 只解禁
18
+ * **brief**(同一个工作项可以开新的一次运行),不解禁命名空间。所以重做一件
19
+ * 事必须换新的 `run_id` 与新的 `idem`。
20
+ *
21
+ * ## attempt 层与聚合
22
+ *
23
+ * 一次尝试的结局可能丢失(崩溃、宿主没写、留存策略),所以状态不是挂在
24
+ * "这次派发"上,而是挂在**一组 attempt**上:
25
+ *
26
+ * - `succeeded` > 0 → booked(子代理真的建起来了)
27
+ * - 否则 `unknown` > 0 → booked 且**未结算**(绝不自动释放)
28
+ * - 否则 `tool_error` > 0 → released(派发本身失败)
29
+ * - 否则全是 `guard_denied` → denied(从未派发出去)
30
+ *
31
+ * **`guard_denied` 永远不参与聚合**。这就是"第二次并行调用被守卫拒掉"不会
32
+ * 把第一次仍在 booked 的运行释放掉的原因。
33
+ *
34
+ * 展示的 attempt 列表最多 {@link MAX_ATTEMPTS_SHOWN} 条,但**聚合计数另存**
35
+ * 在 `attemptTotals` 里——截断展示不会改变状态。
36
+ *
37
+ * ## 保守方向
38
+ *
39
+ * 读不出来的状态一律往"仍被占用"上取:结局丢失 → unknown → 键继续占着,
40
+ * 同命名空间重派被拒。这条规则让**重启**不需要任何特殊处理:重启前后看见的
41
+ * 是同一份日志,判定自然一致。
42
+ *
43
+ * @module dsh-chatgpt-subscription/host/dispatch-ledger/ledger
44
+ */
45
+ import { z } from 'zod';
46
+ import { type SessionLike } from './binding.ts';
47
+ /** 折叠状态的持久化版本。字段结构或折叠语义一变就 +1。 */
48
+ export declare const DISPATCH_LEDGER_STATE_VERSION = 2;
49
+ /** 一个会话里最多保留多少条运行记录。 */
50
+ export declare const MAX_RUNS_PER_SESSION = 256;
51
+ /** 一个会话里最多保留多少个工作项。 */
52
+ export declare const MAX_BRIEFS_PER_SESSION = 64;
53
+ /** 展示用的 attempt 上限(聚合计数不受它影响)。 */
54
+ export declare const MAX_ATTEMPTS_SHOWN = 8;
55
+ /** 一条运行保留的历史状态上限。 */
56
+ export declare const MAX_RELEASED_HISTORY = 4;
57
+ /** 尚未结算的 attempt 上限(同时在飞的派发)。 */
58
+ export declare const MAX_PENDING_ATTEMPTS = 512;
59
+ /** 默认承认的派发工具名。 */
60
+ export declare const DEFAULT_DISPATCH_TOOLS: readonly string[];
61
+ /** 守卫拒绝文案的统一前缀。 */
62
+ export declare const DISPATCH_GUARD_DENIAL_PREFIX = "DISPATCH_LEDGER_V2";
63
+ /** 一次尝试的结局。 */
64
+ export type AttemptOutcome = 'succeeded' | 'tool_error' | 'guard_denied' | 'unknown';
65
+ /** 一条运行的状态。 */
66
+ export type RunState = 'booked' | 'completed' | 'blocked' | 'released' | 'denied';
67
+ /** 运行被释放的原因。 */
68
+ export type RunRelease = 'hand_back' | 'failed' | 'dropped' | 'dispatch_failed';
69
+ /** 一次派发尝试。 */
70
+ export interface LedgerAttempt {
71
+ /** 调用 id:原生是 `tool/call.callId`,PTC 是 `subCallId`。 */
72
+ readonly callId: string;
73
+ /** 命名空间键。 */
74
+ readonly ns: string;
75
+ /** 尝试事件在日志里的序号。 */
76
+ readonly seq: number;
77
+ /** 尝试事件的时刻(Unix 毫秒)。 */
78
+ readonly at: number;
79
+ /** 派发工具名。 */
80
+ readonly tool: string;
81
+ /** 结局。 */
82
+ readonly outcome: AttemptOutcome;
83
+ /** 守卫拒绝码(仅 `guard_denied`)。 */
84
+ readonly denialCode?: string;
85
+ }
86
+ /** 聚合计数:不受展示列表截断影响。 */
87
+ export interface AttemptTotals {
88
+ /** 尝试总数。 */
89
+ total: number;
90
+ /** 成功数。 */
91
+ succeeded: number;
92
+ /** 未结算数。 */
93
+ unknown: number;
94
+ /** 一般失败数。 */
95
+ toolError: number;
96
+ /** 被守卫拒绝数。 */
97
+ guardDenied: number;
98
+ }
99
+ /** 一次运行(= 一个命名空间)的账本记录。 */
100
+ export interface LedgerRun {
101
+ /** 命名空间键。 */
102
+ readonly ns: string;
103
+ /** 工作项 id。 */
104
+ readonly brief_id: string;
105
+ /** 运行 id。 */
106
+ readonly run_id: string;
107
+ /** 幂等键。 */
108
+ readonly idem: string;
109
+ /** 授权快照版本。 */
110
+ readonly mandate_version: number;
111
+ /** 提示词修订号。 */
112
+ readonly prompt_ref: string;
113
+ /** 策略引用。 */
114
+ readonly policy: {
115
+ readonly id: string;
116
+ readonly version: string;
117
+ readonly sha256: string;
118
+ };
119
+ /** 原始任务的引用(不是正文)。 */
120
+ readonly task: readonly string[];
121
+ /** 结构化边界。 */
122
+ readonly boundary: readonly string[];
123
+ /** 允许的后续上下文。 */
124
+ readonly followup: readonly string[];
125
+ /** 正文 sha256:由**插件**按围栏之后的正文算出,模型无法提供或伪造。 */
126
+ readonly body_sha256: string;
127
+ /** 派发工具名。 */
128
+ readonly tool: string;
129
+ /** 第一次尝试的序号。 */
130
+ readonly seq: number;
131
+ /** 第一次尝试的时刻。 */
132
+ readonly at: number;
133
+ /** 运行状态。 */
134
+ readonly state: RunState;
135
+ /** 释放原因。 */
136
+ readonly release?: RunRelease;
137
+ /** 展示用的 attempt 列表。 */
138
+ readonly attempts: readonly LedgerAttempt[];
139
+ /** attempt 聚合计数。 */
140
+ readonly attemptTotals: AttemptTotals;
141
+ /** 占用这个命名空间的第一次尝试的 callId。 */
142
+ readonly createdByCallId: string;
143
+ /** 收到的报告。 */
144
+ readonly report?: {
145
+ readonly status: string;
146
+ readonly seq: number;
147
+ readonly at: number;
148
+ };
149
+ /** 血缘:本次接替的那一次运行的命名空间。 */
150
+ readonly parent_run?: string;
151
+ /** 历史状态。 */
152
+ readonly releasedHistory: readonly {
153
+ readonly state: RunState;
154
+ readonly release?: RunRelease;
155
+ readonly seq: number;
156
+ readonly at: number;
157
+ }[];
158
+ }
159
+ /** 一个工作项的状态。 */
160
+ export interface BriefState {
161
+ /** 工作项 id。 */
162
+ readonly brief_id: string;
163
+ /** occupied(有未了结的运行)/ closed(有已交付的运行)/ free(可开新运行)。 */
164
+ readonly state: 'occupied' | 'closed' | 'free';
165
+ /** 最新一次运行的命名空间。 */
166
+ readonly latestRun?: string;
167
+ /** 最新一次运行的序号(内部排序用)。 */
168
+ readonly latestSeq: number;
169
+ }
170
+ /** 一个子代理与它持有的 Mandate 的绑定。 */
171
+ export interface ChildBinding {
172
+ /** 命名空间键。 */
173
+ readonly ns: string;
174
+ /** 工作项 id。 */
175
+ readonly brief_id: string;
176
+ /** 运行 id。 */
177
+ readonly run_id: string;
178
+ /** 幂等键。 */
179
+ readonly idem: string;
180
+ /** 授权快照版本。 */
181
+ readonly mandate_version: number;
182
+ /** 提示词修订号。 */
183
+ readonly prompt_ref: string;
184
+ /** 绑定的时刻。 */
185
+ readonly at: number;
186
+ }
187
+ /** 账本计数器。 */
188
+ export interface DispatchLedgerCounters {
189
+ /** 没有头部的派发尝试。 */
190
+ unmandated: number;
191
+ /** 头部损坏或角色不匹配。 */
192
+ malformed: number;
193
+ /** 同命名空间的重复尝试。 */
194
+ duplicates: number;
195
+ /** 同工作项被另一个未了结的运行占用。 */
196
+ briefBusy: number;
197
+ /** 策略快照过期(由守卫记账)。 */
198
+ policyStale: number;
199
+ /** 找不到对应运行的报告。 */
200
+ orphanReports: number;
201
+ /** 持有绑定不成立(由守卫记账)。 */
202
+ notHeld: number;
203
+ }
204
+ /** 容量快照:账本还能不能接下**一次新的派发**。 */
205
+ export interface DispatchLedgerCapacity {
206
+ /** 已记录的运行数。 */
207
+ readonly runs: number;
208
+ /** 已记录的工作项数。 */
209
+ readonly briefs: number;
210
+ /** 运行数是否已达上限。 */
211
+ readonly runsFull: boolean;
212
+ /** 工作项数是否已达上限。 */
213
+ readonly briefsFull: boolean;
214
+ /**
215
+ * 一次新的派发是否会被容量挡住。
216
+ *
217
+ * 挡住的两种情况:运行总数已满;或者工作项数已满而这次要**新建**一个工作项
218
+ * (同一个工作项再开一次运行不占新的工作项名额)。
219
+ */
220
+ readonly full: boolean;
221
+ /** 指定工作项的情况(给了工作项 id 时有)。 */
222
+ readonly brief?: {
223
+ /** 工作项 id。 */
224
+ readonly brief_id: string;
225
+ /** 该工作项下的运行数。 */
226
+ readonly runs: number;
227
+ /** 该工作项的状态。 */
228
+ readonly state: BriefState['state'];
229
+ };
230
+ }
231
+ /** 折叠出来的账本状态。 */
232
+ export interface DispatchLedgerState {
233
+ /** 状态版本。 */
234
+ readonly ledger: number;
235
+ /** 运行记录,按命名空间键索引。 */
236
+ readonly runs: Readonly<Record<string, LedgerRun>>;
237
+ /** 工作项状态。 */
238
+ readonly briefs: Readonly<Record<string, BriefState>>;
239
+ /** 子代理绑定。 */
240
+ readonly children: Readonly<Record<string, ChildBinding>>;
241
+ /** 尚未结算的 attempt:callId → 命名空间。 */
242
+ readonly pending: Readonly<Record<string, string>>;
243
+ /** 计数器。 */
244
+ readonly counters: DispatchLedgerCounters;
245
+ }
246
+ /** 折叠读到的一条会话事件。 */
247
+ export interface DispatchLedgerEventLike {
248
+ /** 事件类型。 */
249
+ readonly type?: unknown;
250
+ /** 事件序号。 */
251
+ readonly seq?: unknown;
252
+ /** 事件时刻。 */
253
+ readonly time?: unknown;
254
+ /** 事件载荷。 */
255
+ readonly data?: unknown;
256
+ }
257
+ /** 折叠选项。 */
258
+ export interface DispatchLedgerFoldOptions {
259
+ /** 视为"派发"的工具名。 */
260
+ readonly dispatchTools?: readonly string[];
261
+ }
262
+ /** 折叠状态的 schema(宿主状态)。 */
263
+ export declare const dispatchLedgerStateSchema: z.ZodObject<{
264
+ ledger: z.ZodLiteral<2>;
265
+ runs: z.ZodRecord<z.ZodString, z.ZodObject<{
266
+ ns: z.ZodString;
267
+ brief_id: z.ZodString;
268
+ run_id: z.ZodString;
269
+ idem: z.ZodString;
270
+ mandate_version: z.ZodNumber;
271
+ prompt_ref: z.ZodString;
272
+ policy: z.ZodObject<{
273
+ id: z.ZodString;
274
+ version: z.ZodString;
275
+ sha256: z.ZodString;
276
+ }, z.core.$strict>;
277
+ task: z.ZodArray<z.ZodString>;
278
+ boundary: z.ZodArray<z.ZodString>;
279
+ followup: z.ZodArray<z.ZodString>;
280
+ body_sha256: z.ZodOptional<z.ZodString>;
281
+ tool: z.ZodString;
282
+ seq: z.ZodNumber;
283
+ at: z.ZodNumber;
284
+ state: z.ZodEnum<{
285
+ completed: "completed";
286
+ denied: "denied";
287
+ blocked: "blocked";
288
+ booked: "booked";
289
+ released: "released";
290
+ }>;
291
+ release: z.ZodOptional<z.ZodEnum<{
292
+ failed: "failed";
293
+ hand_back: "hand_back";
294
+ dropped: "dropped";
295
+ dispatch_failed: "dispatch_failed";
296
+ }>>;
297
+ attempts: z.ZodArray<z.ZodObject<{
298
+ callId: z.ZodString;
299
+ ns: z.ZodString;
300
+ seq: z.ZodNumber;
301
+ at: z.ZodNumber;
302
+ tool: z.ZodString;
303
+ outcome: z.ZodEnum<{
304
+ unknown: "unknown";
305
+ succeeded: "succeeded";
306
+ tool_error: "tool_error";
307
+ guard_denied: "guard_denied";
308
+ }>;
309
+ denialCode: z.ZodOptional<z.ZodString>;
310
+ }, z.core.$strict>>;
311
+ attemptTotals: z.ZodObject<{
312
+ total: z.ZodNumber;
313
+ succeeded: z.ZodNumber;
314
+ unknown: z.ZodNumber;
315
+ toolError: z.ZodNumber;
316
+ guardDenied: z.ZodNumber;
317
+ }, z.core.$strict>;
318
+ createdByCallId: z.ZodString;
319
+ report: z.ZodOptional<z.ZodObject<{
320
+ status: z.ZodString;
321
+ seq: z.ZodNumber;
322
+ at: z.ZodNumber;
323
+ }, z.core.$strict>>;
324
+ parent_run: z.ZodOptional<z.ZodString>;
325
+ releasedHistory: z.ZodArray<z.ZodObject<{
326
+ state: z.ZodEnum<{
327
+ completed: "completed";
328
+ denied: "denied";
329
+ blocked: "blocked";
330
+ booked: "booked";
331
+ released: "released";
332
+ }>;
333
+ release: z.ZodOptional<z.ZodEnum<{
334
+ failed: "failed";
335
+ hand_back: "hand_back";
336
+ dropped: "dropped";
337
+ dispatch_failed: "dispatch_failed";
338
+ }>>;
339
+ seq: z.ZodNumber;
340
+ at: z.ZodNumber;
341
+ }, z.core.$strict>>;
342
+ }, z.core.$strict>>;
343
+ briefs: z.ZodRecord<z.ZodString, z.ZodObject<{
344
+ brief_id: z.ZodString;
345
+ state: z.ZodEnum<{
346
+ free: "free";
347
+ occupied: "occupied";
348
+ closed: "closed";
349
+ }>;
350
+ latestRun: z.ZodOptional<z.ZodString>;
351
+ latestSeq: z.ZodNumber;
352
+ }, z.core.$strict>>;
353
+ children: z.ZodRecord<z.ZodString, z.ZodObject<{
354
+ ns: z.ZodString;
355
+ brief_id: z.ZodString;
356
+ run_id: z.ZodString;
357
+ idem: z.ZodString;
358
+ mandate_version: z.ZodNumber;
359
+ prompt_ref: z.ZodString;
360
+ at: z.ZodNumber;
361
+ }, z.core.$strict>>;
362
+ pending: z.ZodRecord<z.ZodString, z.ZodString>;
363
+ counters: z.ZodObject<{
364
+ unmandated: z.ZodNumber;
365
+ malformed: z.ZodNumber;
366
+ duplicates: z.ZodNumber;
367
+ briefBusy: z.ZodNumber;
368
+ policyStale: z.ZodNumber;
369
+ orphanReports: z.ZodNumber;
370
+ notHeld: z.ZodNumber;
371
+ }, z.core.$strict>;
372
+ }, z.core.$strict>;
373
+ /**
374
+ * 造一份空账本。
375
+ * @returns 空状态。
376
+ */
377
+ export declare function initialDispatchLedgerState(): DispatchLedgerState;
378
+ /**
379
+ * 裁剪展示用的 attempt 列表:保留最早的一条与最近的几条。
380
+ *
381
+ * **聚合不看这个列表**(看 `attemptTotals`),所以裁剪不会改变状态。
382
+ * @param attempts - 全部 attempt。
383
+ * @returns 裁剪后的列表。
384
+ */
385
+ export declare function trimAttempts(attempts: readonly LedgerAttempt[]): LedgerAttempt[];
386
+ /**
387
+ * 裁剪历史状态列表。
388
+ * @param history - 全部历史。
389
+ * @returns 最近的几条。
390
+ */
391
+ export declare function trimReleasedHistory(history: readonly {
392
+ state: RunState;
393
+ release?: RunRelease;
394
+ seq: number;
395
+ at: number;
396
+ }[]): {
397
+ state: RunState;
398
+ release?: RunRelease;
399
+ seq: number;
400
+ at: number;
401
+ }[];
402
+ /**
403
+ * 算出一次尝试的结局。
404
+ *
405
+ * 守卫的拒绝文案统一前缀 `DISPATCH_LEDGER_V2:<CODE>`,宿主把它包成
406
+ * `Error: <reason>`(原生走 `tool/result` 的 message.content,PTC 走
407
+ * `tool/ptc-dispatch` 的 content)——所以内容文本是跨代次宿主都可用的判据。
408
+ * @param isError - 结果是否失败。
409
+ * @param content - 结果内容块。
410
+ * @returns 结局与(可选的)拒绝码。
411
+ */
412
+ export declare function classifyToolOutcome(isError: boolean, content: unknown): {
413
+ outcome: AttemptOutcome;
414
+ denialCode?: string;
415
+ };
416
+ /**
417
+ * 从一段结果内容里读出守卫拒绝码。
418
+ * @param content - 结果内容块。
419
+ * @returns 拒绝码;不是守卫拒绝时 undefined。
420
+ */
421
+ export declare function detectGuardDenialCode(content: unknown): string | undefined;
422
+ /**
423
+ * 聚合一次运行的 attempt 计数,得出它的状态。
424
+ *
425
+ * 优先级:succeeded → unknown → tool_error → 全是 guard_denied。
426
+ *
427
+ * 两条额外的单调性规则:
428
+ *
429
+ * 1. **报告是终态**:报告到达之后,后来的 attempt 不再改写状态。
430
+ * 2. **终态不被后来的 attempt 改写**:released / denied / completed / blocked
431
+ * 之后不再回到 booked——否则"第二次被拒的失败"会把第一次的结论改掉。
432
+ * @param run - 当前运行记录。
433
+ * @param totals - attempt 聚合计数。
434
+ * @returns 运行状态。
435
+ */
436
+ export declare function aggregateRunState(run: LedgerRun, totals: AttemptTotals): RunState;
437
+ /**
438
+ * 重建工作项状态。
439
+ * @param runs - 运行记录。
440
+ * @returns 工作项状态。
441
+ */
442
+ export declare function rebuildBriefs(runs: Readonly<Record<string, LedgerRun>>): Record<string, BriefState>;
443
+ /**
444
+ * 容量查询:账本还能不能接下**一次新的派发**。
445
+ *
446
+ * 纯函数,守卫在放行新派发**之前**问它:满了就用 MANDATE_LEDGER_FULL 拒绝。
447
+ * 账本本身**不淘汰**任何历史——淘汰会让旧命名空间重新变得可派,等于绕过防重。
448
+ *
449
+ * @param state - 当前状态。
450
+ * @param briefId - 本次派发要用的工作项 id;给了就一并报出它的情况。
451
+ * @returns 容量快照。
452
+ */
453
+ export declare function dispatchLedgerCapacity(state: DispatchLedgerState, briefId?: string): DispatchLedgerCapacity;
454
+ /**
455
+ * 读一个工作项是否被未了结的运行占用。
456
+ * @param state - 当前状态。
457
+ * @param brief_id - 工作项 id。
458
+ * @param excludeNs - 不计入的命名空间(一般是本次要开的新运行)。
459
+ * @returns 是否被占用。
460
+ */
461
+ export declare function briefIsBusy(state: DispatchLedgerState, brief_id: string, excludeNs?: string): boolean;
462
+ /**
463
+ * 读一个工作项最新一次运行的命名空间。
464
+ * @param state - 当前状态。
465
+ * @param brief_id - 工作项 id。
466
+ * @returns 命名空间;没有时 undefined。
467
+ */
468
+ export declare function latestRunNsOfBrief(state: DispatchLedgerState, brief_id: string): string | undefined;
469
+ /**
470
+ * 读一个工作项的状态。
471
+ * @param state - 当前状态。
472
+ * @param brief_id - 工作项 id。
473
+ * @returns 工作项状态;没有时 undefined。
474
+ */
475
+ export declare function briefStateOf(state: DispatchLedgerState, brief_id: string): BriefState['state'] | undefined;
476
+ /**
477
+ * 判断一个命名空间是否已被**别的**尝试占用。
478
+ *
479
+ * 守卫在执行期用它判"重复":宿主把本次调用先写进日志,所以本次调用自己
480
+ * 也会出现在账本里——必须按 callId 排除自己。
481
+ * @param state - 当前状态。
482
+ * @param ns - 命名空间键。
483
+ * @param callId - 本次调用的 id。
484
+ * @returns 是否已被别的尝试占用。
485
+ */
486
+ export declare function isNamespaceClaimedByAnother(state: DispatchLedgerState, ns: string, callId: string): boolean;
487
+ /**
488
+ * 读一条运行记录。
489
+ * @param state - 当前状态。
490
+ * @param ns - 命名空间键。
491
+ * @returns 运行记录;没有时 undefined。
492
+ */
493
+ export declare function runOf(state: DispatchLedgerState, ns: string): LedgerRun | undefined;
494
+ /**
495
+ * 把一条**已提交**的会话事件折进账本。
496
+ *
497
+ * 纯函数:与本事件无关时返回**同一个引用**(`Object.is` 相等,下游零工作)。
498
+ * @param state - 当前状态。
499
+ * @param event - 已提交的事件。
500
+ * @param options - 折叠选项。
501
+ * @returns 下一份状态。
502
+ */
503
+ export declare function foldDispatchLedger(state: DispatchLedgerState, event: DispatchLedgerEventLike, options?: DispatchLedgerFoldOptions): DispatchLedgerState;
504
+ /**
505
+ * 折叠一整份会话日志。
506
+ * @param events - 有序事件。
507
+ * @param options - 折叠选项。
508
+ * @returns 折叠后的状态。
509
+ */
510
+ export declare function foldDispatchLedgerEvents(events: readonly DispatchLedgerEventLike[], options?: DispatchLedgerFoldOptions): DispatchLedgerState;
511
+ /**
512
+ * 把子代理与它持有的 Mandate 绑定起来。
513
+ *
514
+ * 关联只用**持久事实**,分两条来源:
515
+ *
516
+ * 1. 父会话的 §subagent/catalog§ 给出子会话 id(可续子代理);
517
+ * 2. 调用方给定的**候选会话列表**——one-shot 子代理没有 catalog 条目,只能
518
+ * 这样把候选交给本函数。
519
+ *
520
+ * 两条来源合并后,一律按 §header.parentSession === 父会话 id§ 过滤:**不做
521
+ * 启发式猜测**。读不到子会话日志就**不绑**——宁可让绑定缺席,也不给一个错的
522
+ * id。
523
+ *
524
+ * @param state - 当前状态。
525
+ * @param parent - 父会话。
526
+ * @param resolve - 按 id 解析子会话的读取器。
527
+ * @param candidates - 候选子会话(one-shot 回退)。
528
+ * @returns 新状态;没有新绑定时是同一个引用。
529
+ */
530
+ export declare function bindChildMandates(state: DispatchLedgerState, parent: SessionLike, resolve: (childId: string) => SessionLike | undefined, candidates?: readonly SessionLike[]): DispatchLedgerState;
531
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../../src/host/dispatch-ledger/ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * 「调度账本」的**纯**策略与提示词引用描述符。
3
+ *
4
+ * ## 为什么这里只有纯函数
5
+ *
6
+ * 账本要在两处被用到,而两处的"策略"来源不同:
7
+ *
8
+ * - **守卫**(后续实现)在执行期拿当前会话的路由策略与工具清单,拒绝一份
9
+ * 过期或伪造的授权快照;
10
+ * - **只读工具**(后续实现)把同一份描述符交给模型,让模型照抄。
11
+ *
12
+ * 两边必须算出**逐字相同**的摘要,否则模型抄回去的 sha256 会被自己拒。
13
+ * 所以这里只提供纯函数:输入一份描述符的**内容**,输出它的**规范化 JSON**
14
+ * 与 sha256。没有任何 IO、没有全局状态、没有宿主依赖。
15
+ *
16
+ * ## 规范化 JSON 为什么按键排序
17
+ *
18
+ * 摘要必须只依赖**内容**,不依赖对象的键插入顺序。`JSON.stringify` 按插入
19
+ * 顺序输出,所以这里的对象字面量按**字母序**写字段,数组按内容排序。
20
+ * 这样"同一份策略"在任何进程、任何代次宿主上都得到同一个摘要。
21
+ *
22
+ * @module dsh-chatgpt-subscription/host/dispatch-ledger/policy
23
+ */
24
+ /** 策略描述符的 id:模型抄进头部的 `policy.id`。 */
25
+ export declare const DISPATCH_POLICY_ID = "dsh-dispatch-ledger";
26
+ /** 策略版本。语义变化时 +1,旧描述符随即被判为过期。 */
27
+ export declare const DISPATCH_POLICY_VERSION = 1;
28
+ /** sha256 前缀的最小长度:模型抄 64 位容易出错,12 位足够区分一次策略变更。 */
29
+ export declare const DISPATCH_POLICY_SHA_PREFIX_LENGTH = 12;
30
+ /** 一条被授权的子代理路由。 */
31
+ export interface DispatchPolicyRoute {
32
+ /** 提供方 id。 */
33
+ readonly provider: string;
34
+ /** 模型 id。 */
35
+ readonly model: string;
36
+ }
37
+ /** 策略描述符的输入:工具清单与路由清单。 */
38
+ export interface DispatchPolicyInputs {
39
+ /** 本部署承认的派发工具名。 */
40
+ readonly tools?: readonly string[];
41
+ /** 会话记录的允许路由。 */
42
+ readonly routes?: readonly DispatchPolicyRoute[];
43
+ }
44
+ /** 策略描述符:模型原样抄进头部的那一份。 */
45
+ export interface DispatchPolicyDescriptor {
46
+ /** 策略 id。 */
47
+ readonly id: string;
48
+ /** 策略版本(字符串形态,与头部里的字段类型一致)。 */
49
+ readonly version: string;
50
+ /** 规范化策略 JSON 的 sha256(小写十六进制)。 */
51
+ readonly sha256: string;
52
+ }
53
+ /** 提示词引用的描述符。 */
54
+ export interface DispatchPromptRefDescriptor {
55
+ /** 版本号形态的引用(≤64 字符,可直接抄进头部)。 */
56
+ readonly ref: string;
57
+ /** 被引用提示词的 sha256。 */
58
+ readonly sha256: string;
59
+ }
60
+ /**
61
+ * 算一段文本的 sha256(小写十六进制)。
62
+ * @param text - 原文。
63
+ * @returns 64 位十六进制摘要。
64
+ */
65
+ export declare function sha256Hex(text: string): string;
66
+ /**
67
+ * 算出策略的规范化 JSON。
68
+ *
69
+ * 字段按字母序写出(`id`、`routes`、`tools`、`version`),数组按内容
70
+ * 排序:同一份策略内容在任何机器上都得到逐字相同的字符串。
71
+ * @param inputs - 工具清单与路由清单。
72
+ * @returns 规范化 JSON 文本。
73
+ */
74
+ export declare function canonicalPolicyJson(inputs: DispatchPolicyInputs): string;
75
+ /**
76
+ * 算出一份策略描述符。
77
+ * @param inputs - 工具清单与路由清单。
78
+ * @returns 可直接抄进头部的描述符。
79
+ */
80
+ export declare function dispatchPolicyDescriptor(inputs: DispatchPolicyInputs): DispatchPolicyDescriptor;
81
+ /**
82
+ * 判断两份策略描述符是否指同一份策略。
83
+ *
84
+ * 比较用**前缀**:模型只抄 sha256 的前若干位,前缀相同即视为同一份策略。
85
+ * @param left - 一份描述符。
86
+ * @param right - 另一份描述符。
87
+ * @returns 是否指同一份策略。
88
+ */
89
+ export declare function policyDescriptorsMatch(left: DispatchPolicyDescriptor, right: DispatchPolicyDescriptor): boolean;
90
+ /**
91
+ * 算出一份提示词引用描述符。
92
+ *
93
+ * `ref` 是内容寻址的短版本号(`p-` + 摘要前 16 位,18 字符 ≤64);`sha256`
94
+ * 是完整摘要。账本只存 `ref`,不存提示词正文。
95
+ * @param promptText - 被引用的提示词原文。
96
+ * @returns 提示词引用描述符。
97
+ */
98
+ export declare function promptRefDescriptor(promptText: string): DispatchPromptRefDescriptor;
99
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../src/host/dispatch-ledger/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,wBAAwB,CAAA;AAEvD,iCAAiC;AACjC,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,kDAAkD;AAClD,eAAO,MAAM,iCAAiC,KAAK,CAAA;AAEnD,mBAAmB;AACnB,MAAM,WAAW,mBAAmB;IAClC,cAAc;IACd,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,aAAa;IACb,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,0BAA0B;AAC1B,MAAM,WAAW,oBAAoB;IACnC,mBAAmB;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,iBAAiB;IACjB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;CACjD;AAED,0BAA0B;AAC1B,MAAM,WAAW,wBAAwB;IACvC,aAAa;IACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,iBAAiB;AACjB,MAAM,WAAW,2BAA2B;IAC1C,gCAAgC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,sBAAsB;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAYxE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,oBAAoB,GAAG,wBAAwB,CAM/F;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,wBAAwB,EAC9B,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAUT;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,2BAA2B,CAGnF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Mandate v2 的**完整协议正文**。
3
+ *
4
+ * ## 为什么协议正文住在工具结果里,而不是 preset 里
5
+ *
6
+ * 协议正文有 4KB 上下,而 dispatch preset 的 persona prefix 已经占掉
7
+ * 17401 字符(预算 18500)。把协议塞进 persona 会直接破预算;塞进工具描述
8
+ * 会让工具声明面随会话变化。
9
+ *
10
+ * 所以:**协议正文只出现在 `dispatch_ledger {action:"self"}` 的返回体尾部**,
11
+ * 工具描述保持静态且短(≤240 字符),preset 里只留一行短引导。模型读到的
12
+ * 工具结果尾部就是协议本身。
13
+ *
14
+ * ## 长度上限
15
+ *
16
+ * 协议正文必须 ≤ {@link DISPATCH_MANDATE_PROTOCOL_MAX_CHARS} 字符。这条上限
17
+ * 由测试守住:协议一超预算,模型的一次工具结果就撑破上下文预算。
18
+ *
19
+ * @module dsh-chatgpt-subscription/host/dispatch-ledger/protocol
20
+ */
21
+ /** 协议正文的字符上限。 */
22
+ export declare const DISPATCH_MANDATE_PROTOCOL_MAX_CHARS = 4096;
23
+ /** 完整的 Mandate v2 协议正文。 */
24
+ export declare const DISPATCH_MANDATE_PROTOCOL: string;
25
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../src/host/dispatch-ledger/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iBAAiB;AACjB,eAAO,MAAM,mCAAmC,OAAO,CAAA;AAEvD,2BAA2B;AAC3B,eAAO,MAAM,yBAAyB,EAAE,MAQ3B,CAAA"}