@eddyskywalker/dsh-chatgpt-subscription 0.47.0 → 0.48.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.
@@ -0,0 +1,400 @@
1
+ import z from "@deepseek-ai/schemastery";
2
+ import { Service } from "@deepseek-ai/cordis";
3
+ //#region src/entry-tool-result-pruner.ts
4
+ /**
5
+ * 「工具结果修剪器」的宿主入口 —— 本包自己的 loader 行(fork 版)。
6
+ *
7
+ * DSH 官方的 `@deepseek-ai/dsh-compaction-tool-result-pruner` 只按**字符预算**
8
+ * 修剪历史工具结果:超过 `thresholdChars` 的文本按码点保留头部与尾部、中间换成
9
+ * 固定标记,再以 `surfaceOp: replace` 追加一条新的 `tool/result`,并紧挨着写一条
10
+ * `compaction/prune` 计价事件。这套语义本身与 provider 无关,本文件逐字照搬,
11
+ * 因此行为可以与官方实现一一对照。
12
+ *
13
+ * 与官方实现的两点差别,也正是 "fork" 的全部理由:
14
+ *
15
+ * 1. **provider 感知的跳过**。缓存前缀型 provider(`kimi-code`)上,改写历史工具
16
+ * 结果会把 provider 侧的 content-prefix 缓存从被改写点一直作废到对话末尾:
17
+ * 实测 838k token 的会话里,一次修剪省下约 418k token 的上下文,却要按全价
18
+ * 重建约 414k token 的前缀,比摘要式压缩贵得多。所以对这类 provider 直接跳过,
19
+ * 一次都不改历史。
20
+ * 2. **不 import 任何 harness 的 compaction/session/token-meter 包**。本包的
21
+ * `peerDependencies` 里没有它们(也不该有:装不装它们不该由本包决定),
22
+ * 所以全部按**结构契约**描述:`SessionLike` / `SessionEventLike` /
23
+ * `ToolResultMessageLike` 都是本文件里的局部接口,`deepFreeze` 也是本地实现。
24
+ * 这样从 0.1.2-alpha.5 到 0.2.1-rc.3 的每一代 harness 都能解析这个模块。
25
+ *
26
+ * 与官方实现的一致性以测试锁定:`test/tool-result-pruner.test.ts` 覆盖配置校验、
27
+ * 代理对不劈开、非文本块不计价、以及 `compaction/prune` 与替换事件的先后顺序。
28
+ *
29
+ * @module @eddyskywalker/dsh-chatgpt-subscription/tool-result-pruner
30
+ */
31
+ /** 替换被删除中间段的固定标记。与官方实现逐字一致。 */
32
+ const PRUNE_MARKER = "\n\n[... tool result middle pruned ...]\n\n";
33
+ /** 编码代理工具输出的低摩擦默认值。与官方实现逐字一致。 */
34
+ const DEFAULTS = deepFreeze({
35
+ thresholdChars: 8192,
36
+ headChars: 4096,
37
+ tailChars: 1024
38
+ });
39
+ /**
40
+ * 默认跳过的 provider。
41
+ *
42
+ * `kimi-code` 是缓存前缀型 provider:改写历史工具结果会让 provider 侧的前缀
43
+ * 缓存从改写点失效到对话末尾,重建成本高于修剪省下的输入。这个名单可以通过
44
+ * 配置 `skipProviders` 整体替换(传空数组即恢复"对所有 provider 都修剪")。
45
+ */
46
+ const DEFAULT_SKIP_PROVIDERS = deepFreeze(["kimi-code"]);
47
+ /**
48
+ * 服务名契约。
49
+ *
50
+ * 宿主级守卫要按名字在 `ctx.reflect.store` 与 `agent.ctx.get()` 里找实例,
51
+ * 所以这个名字必须导出一份,不能在两处各写一个字符串字面量。
52
+ */
53
+ const PRUNER_SERVICE_NAME = "toolResultPruner";
54
+ /** 允许出现在配置里的键。 */
55
+ const CONFIG_KEYS = /* @__PURE__ */ new Set([
56
+ "thresholdChars",
57
+ "headChars",
58
+ "tailChars",
59
+ "skipProviders"
60
+ ]);
61
+ /**
62
+ * 本地深冻结。
63
+ *
64
+ * 不 import `deepFreeze` 的 harness 实现(`@deepseek-ai/dsh-util-values` 不在
65
+ * 本包依赖里),但语义保持一致:冻结自身与所有对象型子值,返回同一个引用。
66
+ *
67
+ * @param value - 待冻结的值。
68
+ * @returns 同一个引用,已就地冻结。
69
+ */
70
+ function deepFreeze(value) {
71
+ if (value === null || typeof value !== "object" || Object.isFrozen(value)) return value;
72
+ Object.freeze(value);
73
+ for (const key of Object.getOwnPropertyNames(value)) {
74
+ const child = value[key];
75
+ if (child !== null && typeof child === "object") deepFreeze(child);
76
+ }
77
+ return value;
78
+ }
79
+ /**
80
+ * 按 Unicode 码点计数,不劈开代理对。
81
+ *
82
+ * @param text - 待测量的文本。
83
+ * @returns 码点数。
84
+ */
85
+ function codePointLength(text) {
86
+ return Array.from(text).length;
87
+ }
88
+ /**
89
+ * 校验并解析字符预算。
90
+ *
91
+ * 校验规则与官方实现逐字对齐:未知键报错、`thresholdChars` 必须为正整数、
92
+ * 头尾必须为非负整数、且 `headChars + marker + tailChars` 不得超过阈值。
93
+ *
94
+ * @param config - 原始配置。
95
+ * @returns 已脱离原对象且深冻结的配置。
96
+ */
97
+ function resolveConfig(config = {}) {
98
+ for (const key of Object.keys(config)) if (!CONFIG_KEYS.has(key)) throw new Error(`ToolResultPruneConfig: unknown key "${key}" (allowed: thresholdChars, headChars, tailChars, skipProviders)`);
99
+ const resolved = {
100
+ thresholdChars: config.thresholdChars ?? DEFAULTS.thresholdChars,
101
+ headChars: config.headChars ?? DEFAULTS.headChars,
102
+ tailChars: config.tailChars ?? DEFAULTS.tailChars
103
+ };
104
+ assertPositiveInteger("thresholdChars", resolved.thresholdChars);
105
+ assertNonNegativeInteger("headChars", resolved.headChars);
106
+ assertNonNegativeInteger("tailChars", resolved.tailChars);
107
+ const emittedChars = resolved.headChars + codePointLength(PRUNE_MARKER) + resolved.tailChars;
108
+ if (emittedChars > resolved.thresholdChars) throw new Error(`ToolResultPruneConfig: headChars + marker + tailChars (${emittedChars}) must be at most thresholdChars (${resolved.thresholdChars})`);
109
+ return deepFreeze(structuredClone(resolved));
110
+ }
111
+ /**
112
+ * 把跳过名单解析成一个只读集合。
113
+ *
114
+ * @param skipProviders - 配置里的名单;省略时用 {@link DEFAULT_SKIP_PROVIDERS}。
115
+ * @returns 只读集合(每次调用都是新的实例)。
116
+ */
117
+ function resolveSkipProviders(skipProviders) {
118
+ return new Set(skipProviders ?? DEFAULT_SKIP_PROVIDERS);
119
+ }
120
+ /** 单例化的默认跳过集合,省掉热路径上的重复分配。 */
121
+ let defaultSkipProviderSet;
122
+ /**
123
+ * 默认跳过集合(惰性单例)。
124
+ *
125
+ * @returns `['kimi-code']` 对应的只读集合。
126
+ */
127
+ function defaultSkipProviders() {
128
+ defaultSkipProviderSet ??= new Set(DEFAULT_SKIP_PROVIDERS);
129
+ return defaultSkipProviderSet;
130
+ }
131
+ /**
132
+ * 读会话的 provider id。
133
+ *
134
+ * 先读 `requestHeader().config.provider`(新代的权威来源),读不到再退回扁平
135
+ * 的 `session.provider`(跨代兼容形状)。任何一步抛错都只是"读不到",不影响
136
+ * 修剪本身。
137
+ *
138
+ * @param session - 任意会话对象。
139
+ * @returns provider id,读不到时为 `undefined`。
140
+ */
141
+ function readSessionProvider(session) {
142
+ if (session === null || typeof session !== "object") return void 0;
143
+ const candidate = session;
144
+ if (typeof candidate.requestHeader === "function") try {
145
+ const provider = candidate.requestHeader()?.config?.provider;
146
+ if (typeof provider === "string" && provider.length > 0) return provider;
147
+ } catch {}
148
+ const flat = candidate.provider;
149
+ if (typeof flat === "string" && flat.length > 0) return flat;
150
+ }
151
+ /**
152
+ * 判断这一场会话是否应当整场跳过修剪。
153
+ *
154
+ * 判定只依赖会话本身,不读事件、不写日志:命中时 {@link ToolResultPruner.pruneSession}
155
+ * 会在任何读写之前直接返回空结果。
156
+ *
157
+ * @param session - 任意会话对象。
158
+ * @param skipProviders - 跳过名单;省略时用默认的 `['kimi-code']`。
159
+ * @returns 命中名单时为 `true`。
160
+ */
161
+ function shouldSkipPruningForSession(session, skipProviders = defaultSkipProviders()) {
162
+ const provider = readSessionProvider(session);
163
+ if (provider === void 0) return false;
164
+ return skipProviders.has(provider);
165
+ }
166
+ /**
167
+ * 断言一个正整数配置项。
168
+ *
169
+ * @param name - 配置项名,用于报错文案。
170
+ * @param value - 配置值。
171
+ */
172
+ function assertPositiveInteger(name, value) {
173
+ if (!Number.isInteger(value) || value <= 0) throw new Error(`ToolResultPruneConfig: ${name} (${value}) must be a positive integer`);
174
+ }
175
+ /**
176
+ * 断言一个非负整数配置项。
177
+ *
178
+ * @param name - 配置项名,用于报错文案。
179
+ * @param value - 配置值。
180
+ */
181
+ function assertNonNegativeInteger(name, value) {
182
+ if (!Number.isInteger(value) || value < 0) throw new Error(`ToolResultPruneConfig: ${name} (${value}) must be a non-negative integer`);
183
+ }
184
+ /**
185
+ * 判断一个值是否是普通对象。
186
+ *
187
+ * @param value - 任意值。
188
+ * @returns 是非 null 的对象时为 `true`。
189
+ */
190
+ function isRecord(value) {
191
+ return typeof value === "object" && value !== null;
192
+ }
193
+ /**
194
+ * 从事件负载里取工具结果消息。
195
+ *
196
+ * @param event - 一条 `tool/result` 事件。
197
+ * @returns 消息形状;取不到时为 `undefined`。
198
+ */
199
+ function readEventMessage(event) {
200
+ const data = event.data;
201
+ if (!isRecord(data)) return void 0;
202
+ const message = data["message"];
203
+ if (!isRecord(message)) return void 0;
204
+ return message;
205
+ }
206
+ /**
207
+ * 读一条工具结果的工具调用 id。
208
+ *
209
+ * 优先读事件负载(`event.data.message.source.callId`,与官方实现一致),读不到
210
+ * 再退回已派生消息上的同名字段。
211
+ *
212
+ * @param event - 一条 `tool/result` 事件。
213
+ * @param message - 由该事件派生出的消息。
214
+ * @returns 字符串形式的 callId;读不到时为空字符串。
215
+ */
216
+ function readCallId(event, message) {
217
+ const fromEvent = readEventMessage(event)?.source?.callId;
218
+ const fromMessage = message?.source?.callId;
219
+ const raw = fromEvent ?? fromMessage;
220
+ if (typeof raw === "string") return raw;
221
+ if (raw === void 0 || raw === null) return "";
222
+ return String(raw);
223
+ }
224
+ /**
225
+ * 确定性的、免模型的工具结果修剪服务(provider 感知版)。
226
+ *
227
+ * 与官方实现的差别只在两处:`pruneSession` 先按 provider 判定是否整场跳过,
228
+ * 且 token 计价走结构探测(`ctx.tokenMeter` 缺失时按 0 计),因此这一行在没有
229
+ * token-meter 的宿主上也能工作。
230
+ */
231
+ var ToolResultPruner = class extends Service {
232
+ /**
233
+ * 每个被遮蔽节点都要计价,所以修剪确实需要计价能力。
234
+ *
235
+ * 声明成注入依赖是为了拿到 harness 提供的 meter;实现里仍按结构探测读取,
236
+ * 这样直接 `new` 出来的实例(测试、宿主自建)不会因为缺服务而炸掉。
237
+ */
238
+ static inject = ["tokenMeter"];
239
+ /** loader 侧的配置 schema:与官方实现同样的三个数值项。 */
240
+ static Config = z.object({
241
+ thresholdChars: z.number().step(1).min(1).default(DEFAULTS.thresholdChars),
242
+ headChars: z.number().step(1).min(0).default(DEFAULTS.headChars),
243
+ tailChars: z.number().step(1).min(0).default(DEFAULTS.tailChars)
244
+ });
245
+ /** 解析后不可变的字符预算。 */
246
+ config;
247
+ /** 命中即整场跳过的 provider 集合。 */
248
+ skipProviders;
249
+ /**
250
+ * @param ctx - 宿主上下文(服务自注册为 `toolResultPruner`)。
251
+ * @param config - 原始配置。
252
+ */
253
+ constructor(ctx, config = {}) {
254
+ super(ctx, PRUNER_SERVICE_NAME);
255
+ this.config = resolveConfig(config);
256
+ this.skipProviders = resolveSkipProviders(config.skipProviders);
257
+ }
258
+ /**
259
+ * 只统计文本块的码点数;非文本块不计价。
260
+ *
261
+ * @param blocks - 待测量的工具结果内容。
262
+ * @returns 所有 text 块的码点数合计。
263
+ */
264
+ measureContent(blocks) {
265
+ let chars = 0;
266
+ for (const block of blocks) if (block.type === "text") chars += codePointLength(block.text);
267
+ return chars;
268
+ }
269
+ /**
270
+ * 把超预算的文本中间段换成标记,同时保留富内容块的顺序。
271
+ *
272
+ * 切片按 Unicode 码点而不是 UTF-16 码元,因此保留边界不会劈开代理对;
273
+ * 字素簇仍可能被切开(与官方实现一致)。
274
+ *
275
+ * @param blocks - 原始工具结果内容。
276
+ * @returns 已修剪的内容;文本在预算内时为 `null`。
277
+ */
278
+ pruneContent(blocks) {
279
+ const totalChars = this.measureContent(blocks);
280
+ if (totalChars <= this.config.thresholdChars) return null;
281
+ const removedStart = this.config.headChars;
282
+ const removedEnd = totalChars - this.config.tailChars;
283
+ const pruned = [];
284
+ let consumed = 0;
285
+ let markerInserted = false;
286
+ for (const block of blocks) {
287
+ if (block.type !== "text") {
288
+ pruned.push(block);
289
+ continue;
290
+ }
291
+ const points = Array.from(block.text);
292
+ const blockStart = consumed;
293
+ const blockEnd = blockStart + points.length;
294
+ const headEnd = Math.min(points.length, Math.max(0, removedStart - blockStart));
295
+ const tailStart = Math.min(points.length, Math.max(0, removedEnd - blockStart));
296
+ const marker = blockStart < removedEnd && blockEnd > removedStart && !markerInserted ? PRUNE_MARKER : "";
297
+ if (marker.length > 0) markerInserted = true;
298
+ const text = points.slice(0, headEnd).join("") + marker + points.slice(tailStart).join("");
299
+ if (text.length > 0) pruned.push({
300
+ ...block,
301
+ text
302
+ });
303
+ consumed = blockEnd;
304
+ }
305
+ if (!markerInserted) throw new Error("tool-result prune: failed to locate the removed text span");
306
+ const charsAfter = this.measureContent(pruned);
307
+ if (charsAfter > this.config.thresholdChars || charsAfter >= totalChars) throw new Error("tool-result prune: replacement must be smaller and within threshold");
308
+ return pruned;
309
+ }
310
+ /**
311
+ * 从当前稳定表层快照修剪所有超预算的工具结果。
312
+ *
313
+ * **provider 判定在最前面**:命中跳过名单时直接返回空结果,既不读事件也不
314
+ * 追加事件,所以缓存前缀型 provider 的会话日志一次都不会被动过。
315
+ *
316
+ * 每条替换原样保留除 `content` 之外的全部事件数据,引用被遮蔽的节点让回放
317
+ * 能还原替换输入,并在它之前紧挨着写一条 `compaction/prune` 计价事件,让纯
318
+ * 消费者不需要按节点保存状态就能减掉被遮蔽节点的启发式价格。
319
+ *
320
+ * @param session - 表层会被改写的会话。
321
+ * @returns 已落地的替换与合计省下的码点数。
322
+ */
323
+ pruneSession(session) {
324
+ if (shouldSkipPruningForSession(session, this.skipProviders)) return {
325
+ pruned: [],
326
+ charsRemoved: 0
327
+ };
328
+ const candidates = [];
329
+ for (const seq of [...session.surface?.nodes ?? []]) {
330
+ const event = session.eventAt(seq);
331
+ if (event?.type === "tool/result") candidates.push({
332
+ seq,
333
+ event
334
+ });
335
+ }
336
+ const pruned = [];
337
+ let charsRemoved = 0;
338
+ for (const { seq, event } of candidates) {
339
+ const original = session.deriveEventMessage(event);
340
+ const content = this.pruneContent(original.content ?? []);
341
+ if (content === null) continue;
342
+ const charsBefore = this.measureContent(original.content ?? []);
343
+ const charsAfter = this.measureContent(content);
344
+ const message = Object.freeze({
345
+ ...original,
346
+ content: Object.freeze([...content])
347
+ });
348
+ const data = isRecord(event.data) ? event.data : {};
349
+ session.append("compaction/prune", {
350
+ shadowedRange: {
351
+ start: seq,
352
+ end: seq
353
+ },
354
+ shadowedSeqs: [seq],
355
+ shadowedTokenCount: this.estimateMessageTokens(original)
356
+ });
357
+ const replacement = session.append("tool/result", {
358
+ ...data,
359
+ message
360
+ }, {
361
+ surfaceOp: {
362
+ op: "replace",
363
+ startSeq: seq,
364
+ endSeq: seq
365
+ },
366
+ sourceEventSeqs: [seq]
367
+ });
368
+ pruned.push({
369
+ originalSeq: seq,
370
+ replacementSeq: replacement.seq,
371
+ callId: readCallId(event, original),
372
+ charsBefore,
373
+ charsAfter
374
+ });
375
+ charsRemoved += charsBefore - charsAfter;
376
+ }
377
+ return {
378
+ pruned,
379
+ charsRemoved
380
+ };
381
+ }
382
+ /**
383
+ * 用宿主注入的 token meter 估计一条消息的价格。
384
+ *
385
+ * 按结构探测而不是按注入硬取:token-meter 在部分宿主上不存在,而修剪必须在
386
+ * 那种宿主上照常工作;读不到就按 0 计。
387
+ *
388
+ * @param message - 被遮蔽的消息。
389
+ * @returns 估计的 token 数;不可用时为 0。
390
+ */
391
+ estimateMessageTokens(message) {
392
+ try {
393
+ const estimate = this.ctx.tokenMeter?.estimateMessage?.(message);
394
+ if (typeof estimate === "number" && Number.isFinite(estimate)) return estimate;
395
+ } catch {}
396
+ return 0;
397
+ }
398
+ };
399
+ //#endregion
400
+ export { DEFAULTS, DEFAULT_SKIP_PROVIDERS, PRUNER_SERVICE_NAME, PRUNE_MARKER, ToolResultPruner, ToolResultPruner as default, codePointLength, readSessionProvider, resolveConfig, resolveSkipProviders, shouldSkipPruningForSession };
@@ -71,7 +71,7 @@ export declare const ROUTE_PREFIX: "/api/dsh-chatgpt-subscription";
71
71
  * `test/responses-client.test.ts` asserts the two agree, so a release that
72
72
  * forgets this constant fails the suite instead of shipping quietly.
73
73
  */
74
- export declare const PLUGIN_VERSION: "0.47.0";
74
+ export declare const PLUGIN_VERSION: "0.48.0";
75
75
  export declare const CODEX_CHATGPT_PROVIDER_ID: "codex-chatgpt";
76
76
  export { MINIMAX_CODE_PROVIDER_ID, MINIMAX_CODE_ROUTE_PREFIX } from './shared/minimax-code-contracts.ts';
77
77
  export declare const CODEX_API_BASE: "https://chatgpt.com/backend-api/codex";
@@ -13,9 +13,24 @@
13
13
  * 2. `LEAVE_PLAN_MODE_TOOL` —— `ctx.planMode.set(agent, false)`,语义是
14
14
  * **放弃规划、不交计划**,并且必须说清它不是审批出口。
15
15
  *
16
- * 审批出口是 harness 官方的 `exit_plan_mode`,这一行**不注册**它、不替换它:
17
- * 它由 `@deepseek-ai/dsh-plan-mode` 自己按需逐步准入,重复注册同名工具会让宿主
18
- * 启动失败。
16
+ * 审批出口是 `exit_plan_mode`,这一行**不注册**它、不替换它:在 dispatch preset 里
17
+ * 它由本包 fork 的 plan-mode 服务注册(`src/entry-plan-mode.ts`),在别的 preset 里
18
+ * 由 harness 官方实现注册;重复注册同名工具会让宿主启动失败。
19
+ *
20
+ * ## 与 fork 的协调:**两参调用是刻意的**
21
+ *
22
+ * fork 的 `set(agent, active, options?)` 接受第三个参数 `{ narrate: false }`,用来
23
+ * 压制「用户切换了模式」那句尾部通知;但这一行**不传**它,原因有两条:
24
+ *
25
+ * 1. 那句通知是部署指引唯一的投递口。fork 把 `section` 放在尾部通知里(system 段
26
+ * 保持恒定才有零缓存重建),压掉它就等于压掉整个计划模式指引;
27
+ * 2. 老代/官方实现只认两个参数,多给的那个被静默忽略。两参调用在三种服务上都是
28
+ * 正确行为,不需要按代次分支。
29
+ *
30
+ * 官方实现在「进入那一步」会把动态 `plan:policy` 段与 `exit_plan_mode` 一起塞进
31
+ * 请求,那一步的前缀重建无法避免;fork 把 system 段摘掉、把 `exit_plan_mode` 无条件
32
+ * 注册,于是这一行在 fork 上进入/离开都不再换来一次重建。这一行本身不参与那件事,
33
+ * 只负责「进入」与「放弃」两个模型侧动作。
19
34
  *
20
35
  * ## 静态 `inject` 留空,注册等运行时的 `ctx.inject()`
21
36
  *
@@ -1 +1 @@
1
- {"version":3,"file":"entry-plan-mode-pipeline.d.ts","sourceRoot":"","sources":["../../src/entry-plan-mode-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,oDAAoD;AACpD,eAAO,MAAM,IAAI,gDAAgD,CAAA;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,EAAO,CAAA;AAElC,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AAErD,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD,4CAA4C;AAC5C,eAAO,MAAM,YAAY,qBAAqB,CAAA;AAE9C,iBAAiB;AACjB,MAAM,MAAM,yBAAyB;AACnC,qDAAqD;AACnD,gBAAgB;AAClB,8CAA8C;GAC5C,iBAAiB;AACnB,uCAAuC;GACrC,kBAAkB;AACpB,oCAAoC;GAClC,uBAAuB,CAAA;AAE3B;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;IAExC;;;OAGG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB;CAK7D;AAeD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,OAAO,GAAG,IAAI,CAExE;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CASrD;AAED,6CAA6C;AAC7C,UAAU,SAAS,CAAC,CAAC;IACnB,iBAAiB;IACjB,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;CACrB;AAED,oBAAoB;AACpB,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAEzE,oCAAoC;AACpC,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB;IACjB,gBAAgB,CAAC,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAA;CACxD;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAO7F;AA2ID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,QAIqC,CAAA;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAEgD,CAAA;AAE9E,wCAAwC;AACxC,MAAM,WAAW,wBAAwB;IACvC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB;AAkED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAiCxC;AA0GD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAuBxE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CASxE"}
1
+ {"version":3,"file":"entry-plan-mode-pipeline.d.ts","sourceRoot":"","sources":["../../src/entry-plan-mode-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,oDAAoD;AACpD,eAAO,MAAM,IAAI,gDAAgD,CAAA;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,EAAO,CAAA;AAElC,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AAErD,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD,4CAA4C;AAC5C,eAAO,MAAM,YAAY,qBAAqB,CAAA;AAE9C,iBAAiB;AACjB,MAAM,MAAM,yBAAyB;AACnC,qDAAqD;AACnD,gBAAgB;AAClB,8CAA8C;GAC5C,iBAAiB;AACnB,uCAAuC;GACrC,kBAAkB;AACpB,oCAAoC;GAClC,uBAAuB,CAAA;AAE3B;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;IAExC;;;OAGG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB;CAK7D;AAeD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,OAAO,GAAG,IAAI,CAExE;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CASrD;AAED,6CAA6C;AAC7C,UAAU,SAAS,CAAC,CAAC;IACnB,iBAAiB;IACjB,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;CACrB;AAED,oBAAoB;AACpB,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAEzE,oCAAoC;AACpC,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB;IACjB,gBAAgB,CAAC,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAA;CACxD;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAO7F;AAsJD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,QAIqC,CAAA;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAEgD,CAAA;AAE9E,wCAAwC;AACxC,MAAM,WAAW,wBAAwB;IACvC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB;AAkED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAiCxC;AA8GD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAuBxE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CASxE"}