@epoch-agent/protocol 0.1.0 → 0.2.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 (4) hide show
  1. package/README.md +37 -34
  2. package/dist/index.d.ts +2768 -106
  3. package/dist/index.js +483 -101
  4. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -5,7 +5,6 @@ var ToolExposure = /* @__PURE__ */ ((ToolExposure2) => {
5
5
  ToolExposure2["Hidden"] = "hidden";
6
6
  return ToolExposure2;
7
7
  })(ToolExposure || {});
8
-
9
8
  // src/diagnostics.ts
10
9
  function hasFailure(list) {
11
10
  return list.some((d) => d.status === "failed");
@@ -19,30 +18,18 @@ var DiagnosticSink = class {
19
18
  const render = typeof detail === "string" ? () => detail : detail;
20
19
  this.list.push({ module, status, detail: render, ...code ? { code } : {} });
21
20
  }
22
- /** 正常。`detail` 缺省是 `OK`(与改造前的字符串一致) */
23
21
  ok(module, detail = "OK") {
24
22
  this.add(module, "ok", detail);
25
23
  }
26
- /** 能用,但用户该知道(降级、回退到默认值、缺可选依赖) */
27
24
  warn(module, detail, code) {
28
25
  this.add(module, "warn", detail, code);
29
26
  }
30
- /** 起不来。**注意这会让 `epoch doctor` 退非 0** */
31
27
  failed(module, detail, code) {
32
28
  this.add(module, "failed", detail, code);
33
29
  }
34
- /** 没配所以没起。既不是成功也不是失败 —— 伪装成任何一种都是在骗人 */
35
30
  skipped(module, detail) {
36
31
  this.add(module, "skipped", detail);
37
32
  }
38
- /**
39
- * 结构化的那一份(宿主用)。
40
- *
41
- * @param lang 用哪个语言渲染 `detail`。**不给 = 进程语言**,也就是这一轮之前的
42
- * 全部行为(CLI / `epoch doctor` / 没带 `?lang=` 的请求走的都是这条)。
43
- * ⚠️ **只换 `detail`** —— `module` / `code` / `status` 是契约,
44
- * 跟着语言变等于让宿主的去重和分支按语言分叉(见文件头)
45
- */
46
33
  toList(lang) {
47
34
  return this.list.map((d) => ({
48
35
  module: d.module,
@@ -51,7 +38,6 @@ var DiagnosticSink = class {
51
38
  ...d.code ? { code: d.code } : {}
52
39
  }));
53
40
  }
54
- /** 字符串那一份(CLI / TUI 用)。**派生**,不是另一份状态 */
55
41
  toStrings() {
56
42
  return this.toList().map(diagnosticToLine);
57
43
  }
@@ -59,14 +45,12 @@ var DiagnosticSink = class {
59
45
  return this.list.length;
60
46
  }
61
47
  };
62
-
63
48
  // src/agent-role.ts
64
49
  var DEFAULT_AGENT_ROLE = "general";
65
50
  var AGENT_ROLE_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
66
51
  function isValidAgentRoleName(name) {
67
52
  return AGENT_ROLE_NAME_PATTERN.test(name);
68
53
  }
69
-
70
54
  // src/commands.ts
71
55
  var RESERVED_COMMAND_NAMES = [
72
56
  "help",
@@ -88,9 +72,6 @@ var RESERVED_COMMAND_NAMES = [
88
72
  "exit",
89
73
  "quit",
90
74
  "q",
91
- // 方案 25 PR-4 补的九条。**登记的是全集,不是「这次注册了的」** ——
92
- // 一条命令因为宿主缺能力而没注册,不代表自定义命令就可以占它的名字:
93
- // 那样升个版、或者换个宿主,同一个文件就突然撞名了
94
75
  "cost",
95
76
  "export",
96
77
  "skills",
@@ -104,29 +85,20 @@ var RESERVED_COMMAND_NAMES = [
104
85
  "resume",
105
86
  "permissions",
106
87
  "perms",
107
- // 方案 27 PR-3。它和 `/clear` 属于同一类「逃生通道」:被一个坏掉的自定义命令
108
- // 顶掉之后,用户失去的是**把工作区退回去**的那条路 —— 而他会在最需要它的
109
- // 那一刻才发现
110
88
  "rewind",
111
- // 方案 32。同样是逃生通道,而且是这一条名单里唯一**能自我修复**的那个:
112
- // 一个插件把界面搞砸之后,`/plugin` 是用户不重启就能停用它的唯一入口 ——
113
- // 让插件自己占掉这个名字等于把灭火器锁在着火的屋里
114
89
  "plugin",
115
90
  "plugins",
116
- // 方案 52。它**不是**逃生通道,登记的理由是另一条(也是这份名单更常见的那条):
117
- // 目标是一段会话里唯一「模型改不了、只有人能改」的东西,而一个自定义命令
118
- // 顶掉 `/goal` 之后,用户失去的正是那个入口 —— 于是完成判据就只剩模型自己
119
- // 说了算,而这恰好是方案 52 §3.1 花一整节禁掉的事。
120
- "goal"
91
+ "goal",
92
+ "keybindings",
93
+ "keys",
94
+ "terminal-setup"
121
95
  ];
122
96
  var COMMAND_NAME_PATTERN = /^[a-z0-9_]+(?:[-:][a-z0-9_]+)*$/;
123
97
  function isValidCommandName(name) {
124
98
  return COMMAND_NAME_PATTERN.test(name);
125
99
  }
126
-
127
100
  // src/keybindings.ts
128
101
  var KEY_ACTIONS = [
129
- // ── global:App 那一层的 useInput ────────────────────────────────
130
102
  "interrupt",
131
103
  "rewind",
132
104
  "clear-screen",
@@ -134,7 +106,6 @@ var KEY_ACTIONS = [
134
106
  "transcript-search",
135
107
  "exit",
136
108
  "exit-if-empty",
137
- // ── input:输入框(没有补全面板时)───────────────────────────────
138
109
  "submit",
139
110
  "newline",
140
111
  "history-prev",
@@ -149,7 +120,6 @@ var KEY_ACTIONS = [
149
120
  "delete-char-left",
150
121
  "delete-char-right",
151
122
  "paste-image",
152
- // ── dialog:补全面板开着时 ───────────────────────────────────────
153
123
  "complete",
154
124
  "complete-prev",
155
125
  "complete-next"
@@ -184,6 +154,7 @@ var ACTION_CONTEXTS = {
184
154
  "complete-prev": ["dialog"],
185
155
  "complete-next": ["dialog"]
186
156
  };
157
+ var SEQUENCE_CONTEXTS = ["global", "input"];
187
158
  var RESERVED_CHORDS = ["ctrl+c", "ctrl+d"];
188
159
  var KEY_NAMES = {
189
160
  esc: "escape",
@@ -245,10 +216,34 @@ function parseChord(text) {
245
216
  }
246
217
  return chord;
247
218
  }
219
+ function sequenceId(sequence) {
220
+ return sequence.map(chordId).join(" ");
221
+ }
222
+ function parseSequence(text) {
223
+ const parts = text.trim().split(/\s+/);
224
+ const first = parts[0];
225
+ if (first === void 0 || first.length === 0) return void 0;
226
+ const head = parseChord(first);
227
+ if (!head) return void 0;
228
+ const rest = [];
229
+ for (const part of parts.slice(1)) {
230
+ const chord = parseChord(part);
231
+ if (!chord) return void 0;
232
+ rest.push(chord);
233
+ }
234
+ return [head, ...rest];
235
+ }
248
236
  function isKeyAction(value) {
249
237
  return KEY_ACTIONS.includes(value);
250
238
  }
251
-
239
+ function perAction(make) {
240
+ const out = {};
241
+ for (const action of KEY_ACTIONS) out[action] = make(action);
242
+ return out;
243
+ }
244
+ function tableOf(bindings) {
245
+ return perAction((action) => bindings[action].map((b) => b.keys));
246
+ }
252
247
  // src/config.ts
253
248
  var SHELL_KINDS = ["cmd", "powershell", "pwsh"];
254
249
  var PROVIDER_INFOS = [
@@ -273,10 +268,10 @@ var PROVIDER_INFOS = [
273
268
  { type: "xai", label: "xAI / Grok", apiKeyEnv: "XAI_API_KEY", interactive: true },
274
269
  { type: "perplexity", label: "Perplexity", apiKeyEnv: "PERPLEXITY_API_KEY", interactive: true },
275
270
  { type: "togetherai", label: "Together AI", apiKeyEnv: "TOGETHER_API_KEY", interactive: true },
276
- { type: "ollama", label: "Ollama (\u672C\u5730)", apiKeyEnv: null, interactive: true },
271
+ { type: "ollama", label: "Ollama", apiKeyEnv: null, interactive: true },
277
272
  {
278
273
  type: "openai-compatible",
279
- label: "OpenAI Compatible (\u901A\u7528\u9002\u914D)",
274
+ label: "OpenAI Compatible",
280
275
  apiKeyEnv: "OPENAI_API_KEY",
281
276
  interactive: true
282
277
  },
@@ -310,7 +305,6 @@ var SEARCH_API_KEY_ENV = {
310
305
  brave: "BRAVE_SEARCH_API_KEY",
311
306
  searxng: null
312
307
  };
313
-
314
308
  // src/model-ref.ts
315
309
  function parseModelRef(raw) {
316
310
  const value = raw.trim();
@@ -323,7 +317,6 @@ function parseModelRef(raw) {
323
317
  }
324
318
  return { model: value };
325
319
  }
326
-
327
320
  // src/telemetry.ts
328
321
  var GEN_AI = {
329
322
  OPERATION_NAME: "gen_ai.operation.name",
@@ -342,16 +335,7 @@ var METRIC = {
342
335
  TOOL_APPROVAL: "epoch.tool.approval.count",
343
336
  LLM_CALL_LATENCY: "epoch.llm.call.latency",
344
337
  PROVIDER_FALLBACK: "epoch.provider.fallback.count",
345
- /**
346
- * 换模型的次数(方案 26 #13)。属性 `origin` 分辨谁换的
347
- * (`user-switch` / `command-frontmatter` / `fallback`)。
348
- *
349
- * 和 {@link METRIC.MODEL_FALLBACK} 分成两个名字而不是靠一个属性区分,
350
- * 是因为看板上「用户主动换了几次」和「引擎被迫降了几次」是两条完全不同的
351
- * 曲线:前者高说明默认模型选得不好,后者高说明 provider 在抖。
352
- */
353
338
  MODEL_SWITCH: "epoch.model.switch.count",
354
- /** 同一 provider 内模型级降级的次数(方案 26 #10/#11),属性带 from/to */
355
339
  MODEL_FALLBACK: "epoch.model.fallback.count",
356
340
  CONTEXT_COMPACTION: "epoch.context.compaction.count",
357
341
  STARTUP_DURATION: "epoch.startup.duration"
@@ -371,7 +355,6 @@ var NOOP_TELEMETRY = {
371
355
  histogram: () => {
372
356
  }
373
357
  };
374
-
375
358
  // src/permission.ts
376
359
  var PERMISSION_LEVELS = [
377
360
  "default",
@@ -411,19 +394,11 @@ function isApprovalOutcome(value) {
411
394
  function normalizeApproval(reply) {
412
395
  return typeof reply === "string" ? { outcome: reply } : reply;
413
396
  }
414
-
415
397
  // src/plan.ts
416
398
  var PLAN_OUTCOMES = ["plan-execute", "plan-readonly", "plan-revise"];
417
399
  function isPlanOutcome(value) {
418
400
  return PLAN_OUTCOMES.includes(value);
419
401
  }
420
- var PLAN_OUTCOME_LABELS = {
421
- "plan-execute": "\u6279\u51C6\u5E76\u6267\u884C",
422
- "plan-readonly": "\u6279\u51C6\uFF0C\u4F46\u4FDD\u6301\u53EA\u8BFB",
423
- "plan-revise": "\u8BA9\u6211\u6539\u4E00\u4E0B",
424
- deny: "\u62D2\u7EDD"
425
- };
426
-
427
402
  // src/schedule.ts
428
403
  var SCHEDULE_INTERVAL_MINUTES = [
429
404
  5,
@@ -449,7 +424,101 @@ var SCHEDULE_RUN_STATUSES = [
449
424
  "skipped-window",
450
425
  "missed"
451
426
  ];
452
-
427
+ // src/schedule-templates.ts
428
+ var REPORTS = "file_write(./reports/**)";
429
+ var SCHEDULE_TEMPLATES = [
430
+ {
431
+ id: "repo-sweep",
432
+ trigger: { kind: "cron", cycle: "daily", at: "09:00" },
433
+ permission: "default",
434
+ allowOperations: ["file_read"],
435
+ allowRules: [
436
+ "terminal(git status:*)",
437
+ "terminal(git branch:*)",
438
+ "terminal(git log:*)",
439
+ REPORTS
440
+ ]
441
+ },
442
+ {
443
+ id: "todo-digest",
444
+ trigger: { kind: "cron", cycle: "daily", at: "08:30" },
445
+ permission: "plan",
446
+ allowTools: ["todo"],
447
+ allowOperations: ["file_read"],
448
+ allowRules: [REPORTS]
449
+ },
450
+ {
451
+ id: "weekly-digest",
452
+ trigger: { kind: "cron", cycle: "weekly", at: "18:00", weekdays: [5] },
453
+ permission: "default",
454
+ allowOperations: ["file_read"],
455
+ allowRules: ["terminal(gh pr list:*)", "terminal(gh issue list:*)", "mcp__github__*", REPORTS]
456
+ },
457
+ {
458
+ id: "dep-checkup",
459
+ trigger: { kind: "cron", cycle: "weekly", at: "10:00", weekdays: [1] },
460
+ permission: "default",
461
+ allowOperations: ["file_read"],
462
+ allowRules: ["terminal(pnpm outdated:*)", "terminal(pnpm audit:*)", REPORTS]
463
+ },
464
+ {
465
+ id: "stale-docs",
466
+ trigger: { kind: "cron", cycle: "monthly", at: "07:30", days: [1] },
467
+ permission: "plan",
468
+ allowOperations: ["file_read"],
469
+ allowRules: [REPORTS]
470
+ },
471
+ {
472
+ id: "test-flake",
473
+ trigger: { kind: "cron", cycle: "weekly", at: "20:00", weekdays: [3] },
474
+ permission: "default",
475
+ allowOperations: ["file_read"],
476
+ allowRules: ["terminal(pnpm test:*)", "terminal(pnpm vitest:*)", REPORTS],
477
+ timeoutMs: 40 * 6e4
478
+ }
479
+ ];
480
+ // src/schedule-pending.ts
481
+ function unfixedRules(allowRules, approvals) {
482
+ const seen = new Set(allowRules);
483
+ const out = [];
484
+ for (const item of approvals) {
485
+ if (item.suggestedRule === void 0 || seen.has(item.suggestedRule)) continue;
486
+ seen.add(item.suggestedRule);
487
+ out.push(item.suggestedRule);
488
+ }
489
+ return out;
490
+ }
491
+ function unfixedApprovals(allowRules, approvals) {
492
+ const rules = new Set(unfixedRules(allowRules, approvals));
493
+ const out = [];
494
+ for (const item of approvals) {
495
+ if (item.suggestedRule === void 0 || !rules.has(item.suggestedRule)) continue;
496
+ rules.delete(item.suggestedRule);
497
+ out.push({ ...item, suggestedRule: item.suggestedRule });
498
+ }
499
+ return out;
500
+ }
501
+ function collectPendingApprovals(defs, runs) {
502
+ const byId = new Map(defs.map((def) => [def.id, def]));
503
+ const items = [];
504
+ const taken = /* @__PURE__ */ new Set();
505
+ for (const run of runs) {
506
+ if (taken.has(run.scheduleId)) continue;
507
+ const def = byId.get(run.scheduleId);
508
+ if (!def) continue;
509
+ const approvals = unfixedApprovals(def.allowRules, run.pendingApprovals);
510
+ if (approvals.length === 0) continue;
511
+ taken.add(run.scheduleId);
512
+ items.push({
513
+ scheduleId: def.id,
514
+ scheduleName: def.name,
515
+ runId: run.id,
516
+ at: run.startedAt,
517
+ approvals
518
+ });
519
+ }
520
+ return items.sort((a, b) => a.at - b.at || (a.scheduleId < b.scheduleId ? -1 : 1));
521
+ }
453
522
  // src/question.ts
454
523
  var MAX_QUESTIONS = 4;
455
524
  var MIN_OPTIONS = 2;
@@ -461,8 +530,14 @@ function isQuestionAnswerMap(value) {
461
530
  (v) => typeof v === "string" || Array.isArray(v) && v.every((x) => typeof x === "string")
462
531
  );
463
532
  }
464
-
465
533
  // src/message.ts
534
+ var SESSION_REFERENCE_ERROR_CODES = Object.freeze([
535
+ "invalid-reference",
536
+ "self-reference",
537
+ "too-many",
538
+ "not-authorized",
539
+ "budget-exceeded"
540
+ ]);
466
541
  var OMIT_LABEL = {
467
542
  binary: "\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0C\u672A\u9644\u5185\u5BB9",
468
543
  denied: "\u6743\u9650\u672A\u653E\u884C\uFF0C\u672A\u9644\u5185\u5BB9",
@@ -475,31 +550,178 @@ function filePartSummary(part) {
475
550
  const truncated = part.truncatedTo === void 0 ? "" : `\uFF0C\u5DF2\u622A\u65AD\u5230 ${part.truncatedTo} \u5B57\u8282`;
476
551
  return `[\u6587\u4EF6 ${part.path}${truncated}]`;
477
552
  }
553
+ function sessionPartSummary(part) {
554
+ const name = part.title ?? part.sessionId ?? part.ref;
555
+ const head = `[referenced session "${name}"`;
556
+ if (part.omitted) return `${head} \u2014 not attached: ${part.omitted}]`;
557
+ const counted = part.messageCount === void 0 ? "" : ` \u2014 ${part.messageCount} active message(s)${part.totalMessages === void 0 ? "" : ` of ${part.totalMessages} total`}`;
558
+ const truncated = part.truncatedTo === void 0 ? "" : `, truncated to ${part.truncatedTo} bytes`;
559
+ return `${head}${counted}${truncated}]`;
560
+ }
478
561
  function contentToText(content) {
479
562
  if (typeof content === "string") return content;
480
563
  return content.map((p) => {
481
564
  if (p.type === "text") return p.text;
482
565
  if (p.type === "file") return filePartSummary(p);
483
- return `[\u56FE\u7247 ${p.mediaType ?? "\u672A\u77E5\u7C7B\u578B"}]`;
566
+ if (p.type === "session") return sessionPartSummary(p);
567
+ if (p.type === "image") return `[\u56FE\u7247 ${p.mediaType ?? "\u672A\u77E5\u7C7B\u578B"}]`;
568
+ return assertNeverPart(p);
484
569
  }).join("\n");
485
570
  }
571
+ var TURN_DIGEST_MAX_TOOLS = 8;
572
+ function turnDigest(results) {
573
+ if (results.length === 0) return "";
574
+ const counts = /* @__PURE__ */ new Map();
575
+ for (const r of results) counts.set(r.toolName, (counts.get(r.toolName) ?? 0) + 1);
576
+ const named = [...counts.entries()].slice(0, TURN_DIGEST_MAX_TOOLS);
577
+ const parts = named.map(([name, n]) => n > 1 ? `${name}\xD7${n}` : name);
578
+ const rest = counts.size - named.length;
579
+ if (rest > 0) parts.push(`\u7B49 ${rest} \u79CD`);
580
+ return `[\u672C\u8F6E\u8C03\u7528\u8FC7\u7684\u5DE5\u5177\uFF1A${parts.join(" \xB7 ")}]`;
581
+ }
582
+ function assistantTurnText(text, results) {
583
+ const digest = turnDigest(results);
584
+ if (!digest) return text;
585
+ return text ? `${text}
486
586
 
587
+ ${digest}` : digest;
588
+ }
589
+ function assertNeverPart(part) {
590
+ throw new Error(`unhandled content part: ${JSON.stringify(part)}`);
591
+ }
487
592
  // src/mentions.ts
488
593
  var CJK_PUNCT = "\uFF0C\u3002\uFF1B\uFF1A\uFF01\uFF1F\u3001\uFF09\u3011\u300B\u300D\u300F\uFF08\u3010\u300A\u300C\u300E";
489
594
  var MENTION_RE = new RegExp(String.raw`(^|\s)@([^\s${CJK_PUNCT}]+)`, "gu");
490
- function extractMentions(text) {
491
- const out = [];
492
- const seen = /* @__PURE__ */ new Set();
595
+ var SESSION_MENTION_PREFIX = ":";
596
+ function extractAllMentions(text) {
597
+ const files = [];
598
+ const sessions = [];
599
+ const seenFiles = /* @__PURE__ */ new Set();
600
+ const seenSessions = /* @__PURE__ */ new Set();
493
601
  for (const match of text.matchAll(MENTION_RE)) {
494
602
  const raw = (match[2] ?? "").split("\\").join("/");
495
- const path = raw.replace(/[,.;:!?)\]}]+$/u, "");
496
- if (!path || seen.has(path)) continue;
497
- seen.add(path);
498
- out.push(path);
603
+ const body = raw.replace(/[,.;:!?)\]}]+$/u, "");
604
+ if (!body) continue;
605
+ if (body.startsWith(SESSION_MENTION_PREFIX)) {
606
+ const ref = body.slice(SESSION_MENTION_PREFIX.length);
607
+ if (!ref || seenSessions.has(ref)) continue;
608
+ seenSessions.add(ref);
609
+ sessions.push(ref);
610
+ continue;
611
+ }
612
+ if (seenFiles.has(body)) continue;
613
+ seenFiles.add(body);
614
+ files.push(body);
499
615
  }
500
- return out;
616
+ return { files, sessions };
617
+ }
618
+ function extractMentions(text) {
619
+ return extractAllMentions(text).files;
620
+ }
621
+ function extractSessionMentions(text) {
622
+ return extractAllMentions(text).sessions;
623
+ }
624
+ function isMentionableFilePath(path) {
625
+ if (!path) return false;
626
+ const { files } = extractAllMentions(`@${path}`);
627
+ return files.length === 1 && files[0] === path;
628
+ }
629
+ var MAX_ATTACH_BYTES = 100 * 1024;
630
+ var MAX_ATTACH_FILES = 20;
631
+ var MAX_ATTACH_TOTAL_BYTES = 200 * 1024;
632
+ var MAX_SESSION_ATTACH_BYTES = 50 * 1024;
633
+ var MAX_SESSION_REFS = 2;
634
+ function attachSessionSurface(ref, surface, usedBytes) {
635
+ const head = {
636
+ type: "session",
637
+ ref,
638
+ sessionId: surface.sessionId,
639
+ title: surface.title,
640
+ ...surface.cwd ? { cwd: surface.cwd } : {},
641
+ messageCount: surface.messages.length,
642
+ totalMessages: surface.totalMessages
643
+ };
644
+ const surfaced = surface.messages.length;
645
+ const remaining = MAX_ATTACH_TOTAL_BYTES - usedBytes;
646
+ if (remaining <= 0) {
647
+ return {
648
+ part: { ...head, omitted: "budget-exceeded" },
649
+ kind: "budget-exceeded",
650
+ kept: 0,
651
+ surfaced,
652
+ budget: 0,
653
+ bytes: 0
654
+ };
655
+ }
656
+ if (surfaced === 0) {
657
+ return { part: { ...head, text: "" }, kind: "empty", kept: 0, surfaced, budget: 0, bytes: 0 };
658
+ }
659
+ const budget = Math.min(MAX_SESSION_ATTACH_BYTES, remaining);
660
+ const packed = packSessionSurface(surface.messages, budget);
661
+ const bytes = utf8ByteLength(packed.text);
662
+ if (packed.dropped === 0) {
663
+ return {
664
+ part: { ...head, text: packed.text },
665
+ kind: "full",
666
+ kept: surfaced,
667
+ surfaced,
668
+ budget,
669
+ bytes
670
+ };
671
+ }
672
+ return {
673
+ part: { ...head, text: packed.text, truncatedTo: bytes },
674
+ kind: "truncated",
675
+ kept: surfaced - packed.dropped,
676
+ surfaced,
677
+ budget,
678
+ bytes
679
+ };
680
+ }
681
+ function utf8ByteLength(text) {
682
+ return new TextEncoder().encode(text).length;
683
+ }
684
+ function renderSurfaceMessage(message) {
685
+ const label = message.toolName ? `${message.role}:${message.toolName}` : message.role;
686
+ return `[${label}] ${message.content}`;
687
+ }
688
+ function packSessionSurface(messages, budget) {
689
+ const blocks = messages.map(renderSurfaceMessage);
690
+ const sizes = blocks.map((b) => utf8ByteLength(b) + 1);
691
+ const total = sizes.reduce((a, b) => a + b, 0);
692
+ if (total <= budget) return { text: blocks.join("\n"), dropped: 0 };
693
+ const headBudget = Math.floor(budget / 2);
694
+ let used = 0;
695
+ let headCount = 0;
696
+ for (const size of sizes) {
697
+ if (used + size > headBudget) break;
698
+ used += size;
699
+ headCount++;
700
+ }
701
+ let tailCount = 0;
702
+ for (let i = sizes.length - 1; i >= headCount; i--) {
703
+ const size = sizes[i] ?? 0;
704
+ if (used + size > budget) break;
705
+ used += size;
706
+ tailCount++;
707
+ }
708
+ const dropped = blocks.length - headCount - tailCount;
709
+ if (headCount === 0 && tailCount === 0) {
710
+ const only = blocks[blocks.length - 1] ?? "";
711
+ return {
712
+ text: new TextDecoder().decode(new TextEncoder().encode(only).slice(0, budget)),
713
+ dropped: blocks.length - 1
714
+ };
715
+ }
716
+ return {
717
+ text: [
718
+ ...blocks.slice(0, headCount),
719
+ `\u2026 ${dropped} message(s) omitted here (over the ${Math.round(budget / 1024)}KB reference budget; use session_search for the full record) \u2026`,
720
+ ...blocks.slice(blocks.length - tailCount)
721
+ ].join("\n"),
722
+ dropped
723
+ };
501
724
  }
502
-
503
725
  // src/system-note.ts
504
726
  var SYSTEM_NOTE_PREFIX = "[\u7CFB\u7EDF] ";
505
727
  function systemNote(body) {
@@ -509,7 +731,6 @@ function stripSystemNote(text) {
509
731
  if (!text.startsWith(SYSTEM_NOTE_PREFIX)) return void 0;
510
732
  return text.slice(SYSTEM_NOTE_PREFIX.length);
511
733
  }
512
-
513
734
  // src/usage.ts
514
735
  function promptTokens(usage) {
515
736
  return usage.inputTokens + (usage.cacheHitTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
@@ -523,7 +744,6 @@ function isContextNearlyFull(prompt, contextLength, threshold) {
523
744
  function totalUsageTokens(usage) {
524
745
  return usage.totalTokens ?? promptTokens(usage) + usage.outputTokens;
525
746
  }
526
-
527
747
  // src/wire.ts
528
748
  var HUB_EVENT_TYPES = /* @__PURE__ */ new Set([
529
749
  "connected",
@@ -539,7 +759,6 @@ function isWireHubEvent(event) {
539
759
  var WIRE_AUTH_COOKIE = "epoch_web_token";
540
760
  var WIRE_AUTH_TOKEN_PARAM = "token";
541
761
  var WIRE_AUTH_COOKIE_ATTRS = "HttpOnly; SameSite=Strict; Path=/";
542
-
543
762
  // src/headless-wire.ts
544
763
  var HEADLESS_PROTOCOL_VERSION = 1;
545
764
  var HEADLESS_OUTPUT_FORMATS = ["text", "json", "stream-json"];
@@ -564,7 +783,6 @@ var HEADLESS_INPUT_EVENT_TYPES = /* @__PURE__ */ new Set([
564
783
  "abort",
565
784
  "close"
566
785
  ]);
567
-
568
786
  // src/wire-rest.ts
569
787
  function wireFields() {
570
788
  return (spec) => Object.keys(spec);
@@ -601,7 +819,6 @@ var WIRE_ABOUT_FIELDS = wireFields()({
601
819
  platform: true,
602
820
  homeDir: true,
603
821
  dbPath: true
604
- // ⚠️ `profile` 是可选键,故意不在这张表上(同 `WIRE_CONFIG_FIELDS` 那条 ⚠️)
605
822
  });
606
823
  var WIRE_CONFIG_FIELDS = wireFields()({
607
824
  sessionId: true,
@@ -616,10 +833,6 @@ var WIRE_CONFIG_FIELDS = wireFields()({
616
833
  diagnostics: true,
617
834
  about: true,
618
835
  lanExposed: true
619
- // ⚠️ `maxCostUsd` 和 `brand` **故意不在这张表上**,它们是可选键 ——
620
- // 写进来编译不过(见 `wireFields` 那条 ⚠️)。这份清单是 `conformsToWire()`
621
- // 的运行时判据,可选键一旦进来,「宿主没配所以没这个键」就会被判成不合契约,
622
- // 而那恰恰是这两个字段的**正常形态**
623
836
  });
624
837
  var WIRE_SESSION_SUMMARY_FIELDS = wireFields()({
625
838
  id: true,
@@ -671,14 +884,16 @@ var WIRE_MESSAGE_LIST_FIELDS = wireFields()({
671
884
  });
672
885
  var WIRE_SEND_MESSAGE_FIELDS = wireFields()({
673
886
  message: true
674
- // `role` 是可选的,所以**不在**清单里 —— 同下面 `command` 那条。
675
- // 绝大多数消息不挑专家,写进来等于让正常路径判成不合契约
887
+ });
888
+ var WIRE_SESSION_REFERENCE_FIELDS = wireFields()({
889
+ ref: true
890
+ });
891
+ var WIRE_FILE_REFERENCE_FIELDS = wireFields()({
892
+ path: true
676
893
  });
677
894
  var WIRE_SEND_MESSAGE_RESPONSE_FIELDS = wireFields()({
678
895
  accepted: true,
679
896
  queued: true
680
- // `command` 是可选的,所以**不在**清单里 —— 见 `wireFields` 的那条警告。
681
- // 绝大多数消息不是命令,把它写进来等于让正常路径判成不合契约
682
897
  });
683
898
  var WIRE_ABORT_FIELDS = wireFields()({
684
899
  aborted: true
@@ -835,21 +1050,31 @@ var WIRE_CREATE_WORKSPACE_FIELDS = wireFields()({
835
1050
  var WIRE_CREATE_WORKSPACE_RESPONSE_FIELDS = wireFields()({
836
1051
  entry: true
837
1052
  });
838
-
1053
+ var WIRE_CONTEXT_FIELDS = wireFields()({
1054
+ breakdown: true
1055
+ });
1056
+ var WIRE_COMPACT_FIELDS = wireFields()({
1057
+ ran: true,
1058
+ before: true,
1059
+ after: true
1060
+ });
839
1061
  // src/wire-capability.ts
840
1062
  var WIRE_AGENT_ROLE_FIELDS = wireFields()({
841
1063
  name: true,
842
1064
  description: true,
843
1065
  source: true,
844
1066
  tools: true,
1067
+ skills: true,
845
1068
  maxTurns: true,
846
- toolsCut: true
1069
+ toolsCut: true,
1070
+ skillsCut: true
847
1071
  });
848
1072
  var WIRE_SKILL_FIELDS = wireFields()({
849
1073
  name: true,
850
1074
  category: true,
851
1075
  description: true,
852
1076
  tokens: true,
1077
+ residency: true,
853
1078
  scope: true,
854
1079
  type: true
855
1080
  });
@@ -910,7 +1135,6 @@ var WIRE_SKILL_IMPORT_FIELDS = wireFields()({
910
1135
  detail: true,
911
1136
  reason: true
912
1137
  });
913
-
914
1138
  // src/wire-agent-role.ts
915
1139
  var WIRE_ROLE_ADD_FIELDS = wireFields()({
916
1140
  name: true,
@@ -920,7 +1144,36 @@ var WIRE_ROLE_ADD_RESPONSE_FIELDS = wireFields()({
920
1144
  role: true,
921
1145
  path: true
922
1146
  });
923
-
1147
+ // src/wire-plugin.ts
1148
+ var WIRE_PLUGINS_FIELDS = wireFields()({
1149
+ installed: true,
1150
+ hits: true,
1151
+ pendingRestart: true
1152
+ });
1153
+ var WIRE_PLUGIN_PREVIEW_FIELDS = wireFields()({ ref: true });
1154
+ var WIRE_PLUGIN_INSTALL_FIELDS = wireFields()({
1155
+ ref: true,
1156
+ token: true
1157
+ });
1158
+ var WIRE_PLUGIN_NAME_FIELDS = wireFields()({ name: true });
1159
+ var WIRE_PLUGIN_UPDATE_FIELDS = wireFields()({
1160
+ name: true,
1161
+ token: true
1162
+ });
1163
+ var WIRE_PLUGIN_PREVIEW_RESPONSE_FIELDS = wireFields()({
1164
+ ok: true,
1165
+ preview: true,
1166
+ token: true,
1167
+ reason: true,
1168
+ detail: true
1169
+ });
1170
+ var WIRE_PLUGIN_ACTION_FIELDS = wireFields()({
1171
+ ok: true,
1172
+ entry: true,
1173
+ pendingRestart: true,
1174
+ detail: true,
1175
+ reason: true
1176
+ });
924
1177
  // src/wire-mcp-config.ts
925
1178
  var WIRE_MCP_CONFIG_ISSUE_FIELDS = wireFields()({
926
1179
  path: true,
@@ -955,7 +1208,6 @@ var WIRE_MCP_APPLY_RESPONSE_FIELDS = wireFields()({
955
1208
  issues: true,
956
1209
  changes: true
957
1210
  });
958
-
959
1211
  // src/wire-security.ts
960
1212
  var WIRE_SANDBOX_STATUS_FIELDS = wireFields()({
961
1213
  level: true,
@@ -987,7 +1239,8 @@ var WIRE_PERMISSION_STATUS_FIELDS = wireFields()({
987
1239
  configuredLayer: true,
988
1240
  rules: true,
989
1241
  shadows: true,
990
- managed: true
1242
+ managed: true,
1243
+ cached: true
991
1244
  });
992
1245
  var WIRE_SECURITY_WORKSPACE_FIELDS = wireFields()({
993
1246
  root: true,
@@ -1036,7 +1289,22 @@ var WIRE_SECURITY_FIELDS = wireFields()({
1036
1289
  policy: true,
1037
1290
  audit: true
1038
1291
  });
1039
-
1292
+ // src/wire-approval-cache.ts
1293
+ var WIRE_CACHED_APPROVAL_FIELDS = wireFields()({
1294
+ id: true,
1295
+ toolName: true,
1296
+ target: true,
1297
+ scope: true,
1298
+ decision: true,
1299
+ at: true
1300
+ });
1301
+ var WIRE_APPROVAL_CACHE_REVOKE_REQUEST_FIELDS = wireFields()({
1302
+ id: true
1303
+ });
1304
+ var WIRE_APPROVAL_CACHE_REVOKE_RESPONSE_FIELDS = wireFields()({
1305
+ revoked: true,
1306
+ cached: true
1307
+ });
1040
1308
  // src/wire-permission.ts
1041
1309
  var WIRE_BLOCKED_LEVEL_FIELDS = wireFields()({
1042
1310
  level: true,
@@ -1056,7 +1324,6 @@ var WIRE_PERMISSION_SET_RESPONSE_FIELDS = wireFields()({
1056
1324
  changed: true,
1057
1325
  state: true
1058
1326
  });
1059
-
1060
1327
  // src/wire-settings.ts
1061
1328
  var WIRE_SETTING_WRITE_LAYERS = ["user", "projectLocal"];
1062
1329
  function isWireSettingWriteLayer(value) {
@@ -1092,7 +1359,6 @@ var WIRE_SETTINGS_WRITE_FIELDS = wireFields()({
1092
1359
  value: true,
1093
1360
  apply: true
1094
1361
  });
1095
-
1096
1362
  // src/wire-model.ts
1097
1363
  var WIRE_MODEL_SELECTION_FIELDS = wireFields()({
1098
1364
  provider: true,
@@ -1106,7 +1372,6 @@ var WIRE_MODEL_FIELDS = wireFields()({
1106
1372
  var WIRE_MODEL_SET_FIELDS = wireFields()({
1107
1373
  model: true
1108
1374
  });
1109
-
1110
1375
  // src/wire-provider.ts
1111
1376
  var WIRE_PROVIDER_OPTION_FIELDS = wireFields()({
1112
1377
  type: true,
@@ -1126,14 +1391,11 @@ var WIRE_MODEL_SUGGESTIONS_FIELDS = wireFields()({
1126
1391
  var WIRE_PROVIDER_MODELS_FIELDS = wireFields()({
1127
1392
  suggestions: true
1128
1393
  });
1129
-
1130
1394
  // src/wire-tools.ts
1131
1395
  var WIRE_TOOL_GATE_FIELDS = wireFields()({
1132
1396
  verdict: true,
1133
1397
  by: true,
1134
1398
  conditional: true
1135
- // ⚠️ `rule` / `layer` 是可选键,**故意不在这张表上**(同 `WIRE_CONFIG_FIELDS`
1136
- // 那条 ⚠️):没命中规则、或者反查不到层,正是它们的正常形态
1137
1399
  });
1138
1400
  var WIRE_TOOL_ROW_FIELDS = wireFields()({
1139
1401
  name: true,
@@ -1141,13 +1403,11 @@ var WIRE_TOOL_ROW_FIELDS = wireFields()({
1141
1403
  source: true,
1142
1404
  type: true,
1143
1405
  calls: true
1144
- // ⚠️ `gate` 是可选键,理由同上面那条
1145
1406
  });
1146
1407
  var WIRE_TOOLS_FIELDS = wireFields()({
1147
1408
  tools: true,
1148
1409
  level: true
1149
1410
  });
1150
-
1151
1411
  // src/wire-artifacts.ts
1152
1412
  var WIRE_FILE_CHANGE_FIELDS = wireFields()({
1153
1413
  path: true,
@@ -1159,7 +1419,6 @@ var WIRE_ARTIFACTS_FIELDS = wireFields()({
1159
1419
  changes: true,
1160
1420
  root: true
1161
1421
  });
1162
-
1163
1422
  // src/wire-schedule.ts
1164
1423
  var WIRE_SCHEDULE_ISSUE_CODES = [
1165
1424
  "name-empty",
@@ -1238,11 +1497,101 @@ var WIRE_SCHEDULE_RECORDING_FIELDS = wireFields()({
1238
1497
  missing: true,
1239
1498
  truncated: true
1240
1499
  });
1241
-
1500
+ var WIRE_SCHEDULE_PENDING_FIELDS = wireFields()({
1501
+ items: true
1502
+ });
1503
+ // src/wire-goal.ts
1504
+ var WIRE_GOAL_PHASES = [
1505
+ "active",
1506
+ "paused",
1507
+ "blocked",
1508
+ "complete"
1509
+ ];
1510
+ function isWireGoalPhase(value) {
1511
+ return WIRE_GOAL_PHASES.includes(value);
1512
+ }
1513
+ var WIRE_GOAL_BLOCK_FIELDS = wireFields()({
1514
+ code: true,
1515
+ message: true
1516
+ });
1517
+ var WIRE_GOAL_FIELDS = wireFields()({
1518
+ objective: true,
1519
+ phase: true,
1520
+ maxRounds: true,
1521
+ roundsUsed: true,
1522
+ createdAt: true,
1523
+ updatedAt: true
1524
+ });
1525
+ var WIRE_GOAL_LIMITS_FIELDS = wireFields()({
1526
+ defaultMaxRounds: true,
1527
+ maxRounds: true,
1528
+ maxObjectiveChars: true,
1529
+ maxReasonChars: true
1530
+ });
1531
+ var WIRE_GOAL_RESPONSE_FIELDS = wireFields()({
1532
+ goal: true,
1533
+ limits: true
1534
+ });
1535
+ var WIRE_GOAL_CREATE_FIELDS = wireFields()({
1536
+ objective: true
1537
+ });
1538
+ var WIRE_GOAL_ACTIONS = [
1539
+ "edit",
1540
+ "budget",
1541
+ "pause",
1542
+ "resume",
1543
+ "complete"
1544
+ ];
1545
+ var WIRE_GOAL_REFUSALS = [
1546
+ "busy",
1547
+ "no-goal",
1548
+ "empty-objective",
1549
+ "objective-too-long",
1550
+ "bad-budget",
1551
+ "bad-block-code",
1552
+ "empty-block-message",
1553
+ "empty-evidence",
1554
+ "wrong-phase",
1555
+ "unavailable"
1556
+ ];
1557
+ var WIRE_GOAL_WRITE_FIELDS = wireFields()({
1558
+ ok: true,
1559
+ goal: true
1560
+ });
1561
+ var WIRE_GOAL_CLEAR_FIELDS = wireFields()({
1562
+ ok: true,
1563
+ cleared: true
1564
+ });
1565
+ var WIRE_BLOCKED_GOAL_FIELDS = wireFields()({
1566
+ sessionId: true,
1567
+ sessionTitle: true,
1568
+ goal: true
1569
+ });
1570
+ var WIRE_BLOCKED_GOALS_FIELDS = wireFields()({
1571
+ items: true
1572
+ });
1573
+ // src/wire-mention.ts
1574
+ var WIRE_SESSION_CANDIDATE_FIELDS = wireFields()({
1575
+ sessionId: true,
1576
+ title: true,
1577
+ updatedAt: true,
1578
+ messageCount: true,
1579
+ sameWorkspace: true
1580
+ });
1581
+ var WIRE_SESSION_CANDIDATES_FIELDS = wireFields()({
1582
+ candidates: true
1583
+ });
1584
+ var WIRE_FILE_CANDIDATE_FIELDS = wireFields()({
1585
+ path: true
1586
+ });
1587
+ var WIRE_FILE_CANDIDATES_FIELDS = wireFields()({
1588
+ candidates: true,
1589
+ unmentionable: true,
1590
+ truncated: true
1591
+ });
1242
1592
  // src/secret.ts
1243
1593
  var SECRET_SERVICE = "epoch-agent";
1244
1594
  var MCP_DATA_KEY_NAME = "mcp-auth-data-key";
1245
-
1246
1595
  // src/i18n.ts
1247
1596
  var LANGS = ["zh", "en"];
1248
1597
  var DEFAULT_LANG = "zh";
@@ -1250,5 +1599,38 @@ function isLang(value) {
1250
1599
  return LANGS.includes(value);
1251
1600
  }
1252
1601
  var WIRE_LANG_PARAM = "lang";
1602
+ var PLACEHOLDER = /\{(\w+)\}/g;
1603
+ function placeholdersOf(text) {
1604
+ const found = [];
1605
+ for (const match of text.matchAll(PLACEHOLDER)) {
1606
+ const name = match[1];
1607
+ if (name && !found.includes(name)) found.push(name);
1608
+ }
1609
+ return found;
1610
+ }
1611
+ function flattenCatalog(value, prefix = "", out = {}) {
1612
+ if (!value || typeof value !== "object" || Array.isArray(value)) return out;
1613
+ for (const [key, child] of Object.entries(value)) {
1614
+ const path = prefix ? `${prefix}.${key}` : key;
1615
+ if (typeof child === "string") out[path] = child;
1616
+ else flattenCatalog(child, path, out);
1617
+ }
1618
+ return out;
1619
+ }
1620
+ function makeTranslate(catalogs) {
1621
+ const catalogOf = (lang) => catalogs[lang] ?? {};
1622
+ return (lang, key, vars) => {
1623
+ const text = catalogOf(lang)[key] ?? catalogOf(DEFAULT_LANG)[key] ?? key;
1624
+ if (!vars) return text;
1625
+ return text.replace(PLACEHOLDER, (whole, name) => {
1626
+ const value = vars[name];
1627
+ return value === void 0 ? whole : String(value);
1628
+ });
1629
+ };
1630
+ }
1631
+ function translatorFor(catalogs, lang) {
1632
+ const translate = makeTranslate(catalogs);
1633
+ return (key, vars) => translate(lang, key, vars);
1634
+ }
1253
1635
 
1254
- export { ACTION_CONTEXTS, AGENT_ROLE_NAME_PATTERN, API_KEY_ENV_VARS, APPROVAL_OUTCOMES, COMMAND_NAME_PATTERN, DEFAULT_AGENT_ROLE, DEFAULT_LANG, DiagnosticSink, GEN_AI, HEADLESS_INPUT_EVENT_TYPES, HEADLESS_INPUT_FORMATS, HEADLESS_OUTPUT_FORMATS, HEADLESS_PROTOCOL_VERSION, KEY_ACTIONS, LANGS, MAX_HEADER_CHARS, MAX_OPTIONS, MAX_QUESTIONS, MCP_DATA_KEY_NAME, METRIC, MIN_OPTIONS, NOOP_TELEMETRY, OPERATION_TYPES, PERMISSION_LEVELS, PLAN_OUTCOMES, PLAN_OUTCOME_LABELS, PROVIDER_INFOS, PROVIDER_TYPES, RESERVED_CHORDS, RESERVED_COMMAND_NAMES, SCHEDULE_INTERVAL_MINUTES, SCHEDULE_RUN_STATUSES, SEARCH_API_KEY_ENV, SEARCH_PROVIDER_TYPES, SECRET_SERVICE, SHELL_KINDS, SIMULTANEOUS_CONTEXTS, SYSTEM_NOTE_PREFIX, ToolExposure, WIRE_ABORT_FIELDS, WIRE_ABOUT_FIELDS, WIRE_AGENT_ROLE_FIELDS, WIRE_APPROVAL_LIST_FIELDS, WIRE_APPROVAL_ROW_FIELDS, WIRE_ARTIFACTS_FIELDS, WIRE_AUDIT_LOG_FIELDS, WIRE_AUDIT_ROW_FIELDS, WIRE_AUTH_COOKIE, WIRE_AUTH_COOKIE_ATTRS, WIRE_AUTH_TOKEN_PARAM, WIRE_BACKGROUND_TASK_FIELDS, WIRE_BLOCKED_LEVEL_FIELDS, WIRE_BUILTIN_CONNECTOR_FIELDS, WIRE_CAPABILITIES_FIELDS, WIRE_CAPABILITY_PROJECT_FIELDS, WIRE_CHECKPOINT_LIST_FIELDS, WIRE_CHECKPOINT_SUMMARY_FIELDS, WIRE_COMMANDS_FIELDS, WIRE_COMMAND_EXPANSION_FIELDS, WIRE_COMPRESSION_LINE_FIELDS, WIRE_CONFIG_FIELDS, WIRE_CREATE_SESSION_FIELDS, WIRE_CREATE_WORKSPACE_FIELDS, WIRE_CREATE_WORKSPACE_RESPONSE_FIELDS, WIRE_CUSTOM_COMMAND_FIELDS, WIRE_DELETE_SESSION_FIELDS, WIRE_DIFF_FILE_FIELDS, WIRE_ERROR_FIELDS, WIRE_FILE_CHANGE_FIELDS, WIRE_HEALTH_FIELDS, WIRE_KNOWN_WORKSPACE_FIELDS, WIRE_LANG_PARAM, WIRE_MANAGED_LOCK_FIELDS, WIRE_MCP_ADD_FIELDS, WIRE_MCP_ADD_RESPONSE_FIELDS, WIRE_MCP_APPLY_ENTRY_FIELDS, WIRE_MCP_APPLY_RESPONSE_FIELDS, WIRE_MCP_CONFIG_APPLY_FIELDS, WIRE_MCP_CONFIG_FIELDS, WIRE_MCP_CONFIG_ISSUE_FIELDS, WIRE_MCP_CONFIG_SAVE_FIELDS, WIRE_MCP_CONFIG_SAVE_RESPONSE_FIELDS, WIRE_MCP_CONNECTOR_FIELDS, WIRE_MCP_RECONNECT_FIELDS, WIRE_MESSAGE_LIST_FIELDS, WIRE_MODEL_FIELDS, WIRE_MODEL_SELECTION_FIELDS, WIRE_MODEL_SET_FIELDS, WIRE_MODEL_SUGGESTIONS_FIELDS, WIRE_PATCH_SESSION_FIELDS, WIRE_PATCH_SESSION_RESPONSE_FIELDS, WIRE_PERMISSION_RULE_FIELDS, WIRE_PERMISSION_SET_REQUEST_FIELDS, WIRE_PERMISSION_SET_RESPONSE_FIELDS, WIRE_PERMISSION_SHADOW_FIELDS, WIRE_PERMISSION_STATE_FIELDS, WIRE_PERMISSION_STATUS_FIELDS, WIRE_PLAN_ACTIONS, WIRE_PLAN_FIELDS, WIRE_PLAN_MODE_REQUEST_FIELDS, WIRE_PLAN_MODE_RESPONSE_FIELDS, WIRE_PLAN_MODE_STATE_FIELDS, WIRE_POLICY_DIR_FIELDS, WIRE_POLICY_STATUS_FIELDS, WIRE_PROVIDERS_FIELDS, WIRE_PROVIDER_MODELS_FIELDS, WIRE_PROVIDER_OPTION_FIELDS, WIRE_QUESTION_LIST_FIELDS, WIRE_QUESTION_ROW_FIELDS, WIRE_RESPOND_APPROVAL_FIELDS, WIRE_RESPOND_APPROVAL_RESPONSE_FIELDS, WIRE_RESPOND_QUESTION_FIELDS, WIRE_RESPOND_QUESTION_RESPONSE_FIELDS, WIRE_REWIND_FILE_PLAN_FIELDS, WIRE_REWIND_OUTCOME_FIELDS, WIRE_REWIND_PREVIEW_FIELDS, WIRE_REWIND_REQUEST_FIELDS, WIRE_REWIND_RESPONSE_FIELDS, WIRE_REWIND_SCOPES, WIRE_ROLE_ADD_FIELDS, WIRE_ROLE_ADD_RESPONSE_FIELDS, WIRE_SANDBOX_STATUS_FIELDS, WIRE_SCHEDULE_CAPABILITY_FIELDS, WIRE_SCHEDULE_CREATE_FIELDS, WIRE_SCHEDULE_DEFAULTS_FIELDS, WIRE_SCHEDULE_DELETE_FIELDS, WIRE_SCHEDULE_FIELDS, WIRE_SCHEDULE_FIX_FIELDS, WIRE_SCHEDULE_FIX_REQUEST_FIELDS, WIRE_SCHEDULE_ISSUE_CODES, WIRE_SCHEDULE_LIST_FIELDS, WIRE_SCHEDULE_RECORDING_FIELDS, WIRE_SCHEDULE_ROW_FIELDS, WIRE_SCHEDULE_RUNS_FIELDS, WIRE_SCHEDULE_RUN_FIELDS, WIRE_SCHEDULE_SAVE_FIELDS, WIRE_SECURITY_FIELDS, WIRE_SECURITY_WORKSPACE_FIELDS, WIRE_SEND_MESSAGE_FIELDS, WIRE_SEND_MESSAGE_RESPONSE_FIELDS, WIRE_SESSION_FINISH_FIELDS, WIRE_SESSION_LIST_FIELDS, WIRE_SESSION_RESPONSE_FIELDS, WIRE_SESSION_SUMMARY_FIELDS, WIRE_SESSION_WORKSPACE_FIELDS, WIRE_SESSION_WORKSPACE_RESPONSE_FIELDS, WIRE_SETTINGS_FIELDS, WIRE_SETTINGS_WRITE_FIELDS, WIRE_SETTINGS_WRITE_REQUEST_FIELDS, WIRE_SETTING_ROW_FIELDS, WIRE_SETTING_STEP_FIELDS, WIRE_SETTING_WRITE_FIELDS, WIRE_SETTING_WRITE_LAYERS, WIRE_SKILL_BODY_FIELDS, WIRE_SKILL_FIELDS, WIRE_SKILL_IMPORT_FIELDS, WIRE_SKILL_IMPORT_PREVIEW_FIELDS, WIRE_TASKS_FIELDS, WIRE_TOOLS_FIELDS, WIRE_TOOL_GATE_FIELDS, WIRE_TOOL_ROW_FIELDS, WIRE_WORKSPACE_DIFF_FIELDS, WIRE_WORKSPACE_DIRS_FIELDS, WIRE_WORKSPACE_DIR_ENTRY_FIELDS, WIRE_WORKSPACE_REF_FIELDS, apiKeyEnvVar, chordId, compressionThresholdTokens, conformsToWire, contentToText, diagnosticToLine, extractMentions, filePartSummary, getProviderInfo, hasFailure, isApprovalOutcome, isContextNearlyFull, isHeadlessInputFormat, isHeadlessLifecycleEvent, isHeadlessOutputFormat, isKeyAction, isLang, isOperationType, isPermissionLevel, isPlanOutcome, isProviderType, isQuestionAnswerMap, isSearchProviderType, isValidAgentRoleName, isValidCommandName, isWireHubEvent, isWirePlanAction, isWireRewindScope, isWireSettingWriteLayer, normalizeApproval, parseChord, parseModelRef, promptTokens, stripSystemNote, systemNote, totalUsageTokens, wireFields };
1636
+ export { ACTION_CONTEXTS, AGENT_ROLE_NAME_PATTERN, API_KEY_ENV_VARS, APPROVAL_OUTCOMES, COMMAND_NAME_PATTERN, DEFAULT_AGENT_ROLE, DEFAULT_LANG, DiagnosticSink, GEN_AI, HEADLESS_INPUT_EVENT_TYPES, HEADLESS_INPUT_FORMATS, HEADLESS_OUTPUT_FORMATS, HEADLESS_PROTOCOL_VERSION, KEY_ACTIONS, LANGS, MAX_ATTACH_BYTES, MAX_ATTACH_FILES, MAX_ATTACH_TOTAL_BYTES, MAX_HEADER_CHARS, MAX_OPTIONS, MAX_QUESTIONS, MAX_SESSION_ATTACH_BYTES, MAX_SESSION_REFS, MCP_DATA_KEY_NAME, METRIC, MIN_OPTIONS, NOOP_TELEMETRY, OPERATION_TYPES, PERMISSION_LEVELS, PLAN_OUTCOMES, PROVIDER_INFOS, PROVIDER_TYPES, RESERVED_CHORDS, RESERVED_COMMAND_NAMES, SCHEDULE_INTERVAL_MINUTES, SCHEDULE_RUN_STATUSES, SCHEDULE_TEMPLATES, SEARCH_API_KEY_ENV, SEARCH_PROVIDER_TYPES, SECRET_SERVICE, SEQUENCE_CONTEXTS, SESSION_MENTION_PREFIX, SESSION_REFERENCE_ERROR_CODES, SHELL_KINDS, SIMULTANEOUS_CONTEXTS, SYSTEM_NOTE_PREFIX, ToolExposure, WIRE_ABORT_FIELDS, WIRE_ABOUT_FIELDS, WIRE_AGENT_ROLE_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_REQUEST_FIELDS, WIRE_APPROVAL_CACHE_REVOKE_RESPONSE_FIELDS, WIRE_APPROVAL_LIST_FIELDS, WIRE_APPROVAL_ROW_FIELDS, WIRE_ARTIFACTS_FIELDS, WIRE_AUDIT_LOG_FIELDS, WIRE_AUDIT_ROW_FIELDS, WIRE_AUTH_COOKIE, WIRE_AUTH_COOKIE_ATTRS, WIRE_AUTH_TOKEN_PARAM, WIRE_BACKGROUND_TASK_FIELDS, WIRE_BLOCKED_GOALS_FIELDS, WIRE_BLOCKED_GOAL_FIELDS, WIRE_BLOCKED_LEVEL_FIELDS, WIRE_BUILTIN_CONNECTOR_FIELDS, WIRE_CACHED_APPROVAL_FIELDS, WIRE_CAPABILITIES_FIELDS, WIRE_CAPABILITY_PROJECT_FIELDS, WIRE_CHECKPOINT_LIST_FIELDS, WIRE_CHECKPOINT_SUMMARY_FIELDS, WIRE_COMMANDS_FIELDS, WIRE_COMMAND_EXPANSION_FIELDS, WIRE_COMPACT_FIELDS, WIRE_COMPRESSION_LINE_FIELDS, WIRE_CONFIG_FIELDS, WIRE_CONTEXT_FIELDS, WIRE_CREATE_SESSION_FIELDS, WIRE_CREATE_WORKSPACE_FIELDS, WIRE_CREATE_WORKSPACE_RESPONSE_FIELDS, WIRE_CUSTOM_COMMAND_FIELDS, WIRE_DELETE_SESSION_FIELDS, WIRE_DIFF_FILE_FIELDS, WIRE_ERROR_FIELDS, WIRE_FILE_CANDIDATES_FIELDS, WIRE_FILE_CANDIDATE_FIELDS, WIRE_FILE_CHANGE_FIELDS, WIRE_FILE_REFERENCE_FIELDS, WIRE_GOAL_ACTIONS, WIRE_GOAL_BLOCK_FIELDS, WIRE_GOAL_CLEAR_FIELDS, WIRE_GOAL_CREATE_FIELDS, WIRE_GOAL_FIELDS, WIRE_GOAL_LIMITS_FIELDS, WIRE_GOAL_PHASES, WIRE_GOAL_REFUSALS, WIRE_GOAL_RESPONSE_FIELDS, WIRE_GOAL_WRITE_FIELDS, WIRE_HEALTH_FIELDS, WIRE_KNOWN_WORKSPACE_FIELDS, WIRE_LANG_PARAM, WIRE_MANAGED_LOCK_FIELDS, WIRE_MCP_ADD_FIELDS, WIRE_MCP_ADD_RESPONSE_FIELDS, WIRE_MCP_APPLY_ENTRY_FIELDS, WIRE_MCP_APPLY_RESPONSE_FIELDS, WIRE_MCP_CONFIG_APPLY_FIELDS, WIRE_MCP_CONFIG_FIELDS, WIRE_MCP_CONFIG_ISSUE_FIELDS, WIRE_MCP_CONFIG_SAVE_FIELDS, WIRE_MCP_CONFIG_SAVE_RESPONSE_FIELDS, WIRE_MCP_CONNECTOR_FIELDS, WIRE_MCP_RECONNECT_FIELDS, WIRE_MESSAGE_LIST_FIELDS, WIRE_MODEL_FIELDS, WIRE_MODEL_SELECTION_FIELDS, WIRE_MODEL_SET_FIELDS, WIRE_MODEL_SUGGESTIONS_FIELDS, WIRE_PATCH_SESSION_FIELDS, WIRE_PATCH_SESSION_RESPONSE_FIELDS, WIRE_PERMISSION_RULE_FIELDS, WIRE_PERMISSION_SET_REQUEST_FIELDS, WIRE_PERMISSION_SET_RESPONSE_FIELDS, WIRE_PERMISSION_SHADOW_FIELDS, WIRE_PERMISSION_STATE_FIELDS, WIRE_PERMISSION_STATUS_FIELDS, WIRE_PLAN_ACTIONS, WIRE_PLAN_FIELDS, WIRE_PLAN_MODE_REQUEST_FIELDS, WIRE_PLAN_MODE_RESPONSE_FIELDS, WIRE_PLAN_MODE_STATE_FIELDS, WIRE_PLUGINS_FIELDS, WIRE_PLUGIN_ACTION_FIELDS, WIRE_PLUGIN_INSTALL_FIELDS, WIRE_PLUGIN_NAME_FIELDS, WIRE_PLUGIN_PREVIEW_FIELDS, WIRE_PLUGIN_PREVIEW_RESPONSE_FIELDS, WIRE_PLUGIN_UPDATE_FIELDS, WIRE_POLICY_DIR_FIELDS, WIRE_POLICY_STATUS_FIELDS, WIRE_PROVIDERS_FIELDS, WIRE_PROVIDER_MODELS_FIELDS, WIRE_PROVIDER_OPTION_FIELDS, WIRE_QUESTION_LIST_FIELDS, WIRE_QUESTION_ROW_FIELDS, WIRE_RESPOND_APPROVAL_FIELDS, WIRE_RESPOND_APPROVAL_RESPONSE_FIELDS, WIRE_RESPOND_QUESTION_FIELDS, WIRE_RESPOND_QUESTION_RESPONSE_FIELDS, WIRE_REWIND_FILE_PLAN_FIELDS, WIRE_REWIND_OUTCOME_FIELDS, WIRE_REWIND_PREVIEW_FIELDS, WIRE_REWIND_REQUEST_FIELDS, WIRE_REWIND_RESPONSE_FIELDS, WIRE_REWIND_SCOPES, WIRE_ROLE_ADD_FIELDS, WIRE_ROLE_ADD_RESPONSE_FIELDS, WIRE_SANDBOX_STATUS_FIELDS, WIRE_SCHEDULE_CAPABILITY_FIELDS, WIRE_SCHEDULE_CREATE_FIELDS, WIRE_SCHEDULE_DEFAULTS_FIELDS, WIRE_SCHEDULE_DELETE_FIELDS, WIRE_SCHEDULE_FIELDS, WIRE_SCHEDULE_FIX_FIELDS, WIRE_SCHEDULE_FIX_REQUEST_FIELDS, WIRE_SCHEDULE_ISSUE_CODES, WIRE_SCHEDULE_LIST_FIELDS, WIRE_SCHEDULE_PENDING_FIELDS, WIRE_SCHEDULE_RECORDING_FIELDS, WIRE_SCHEDULE_ROW_FIELDS, WIRE_SCHEDULE_RUNS_FIELDS, WIRE_SCHEDULE_RUN_FIELDS, WIRE_SCHEDULE_SAVE_FIELDS, WIRE_SECURITY_FIELDS, WIRE_SECURITY_WORKSPACE_FIELDS, WIRE_SEND_MESSAGE_FIELDS, WIRE_SEND_MESSAGE_RESPONSE_FIELDS, WIRE_SESSION_CANDIDATES_FIELDS, WIRE_SESSION_CANDIDATE_FIELDS, WIRE_SESSION_FINISH_FIELDS, WIRE_SESSION_LIST_FIELDS, WIRE_SESSION_REFERENCE_FIELDS, WIRE_SESSION_RESPONSE_FIELDS, WIRE_SESSION_SUMMARY_FIELDS, WIRE_SESSION_WORKSPACE_FIELDS, WIRE_SESSION_WORKSPACE_RESPONSE_FIELDS, WIRE_SETTINGS_FIELDS, WIRE_SETTINGS_WRITE_FIELDS, WIRE_SETTINGS_WRITE_REQUEST_FIELDS, WIRE_SETTING_ROW_FIELDS, WIRE_SETTING_STEP_FIELDS, WIRE_SETTING_WRITE_FIELDS, WIRE_SETTING_WRITE_LAYERS, WIRE_SKILL_BODY_FIELDS, WIRE_SKILL_FIELDS, WIRE_SKILL_IMPORT_FIELDS, WIRE_SKILL_IMPORT_PREVIEW_FIELDS, WIRE_TASKS_FIELDS, WIRE_TOOLS_FIELDS, WIRE_TOOL_GATE_FIELDS, WIRE_TOOL_ROW_FIELDS, WIRE_WORKSPACE_DIFF_FIELDS, WIRE_WORKSPACE_DIRS_FIELDS, WIRE_WORKSPACE_DIR_ENTRY_FIELDS, WIRE_WORKSPACE_REF_FIELDS, apiKeyEnvVar, assertNeverPart, assistantTurnText, attachSessionSurface, chordId, collectPendingApprovals, compressionThresholdTokens, conformsToWire, contentToText, diagnosticToLine, extractAllMentions, extractMentions, extractSessionMentions, filePartSummary, flattenCatalog, getProviderInfo, hasFailure, isApprovalOutcome, isContextNearlyFull, isHeadlessInputFormat, isHeadlessLifecycleEvent, isHeadlessOutputFormat, isKeyAction, isLang, isMentionableFilePath, isOperationType, isPermissionLevel, isPlanOutcome, isProviderType, isQuestionAnswerMap, isSearchProviderType, isValidAgentRoleName, isValidCommandName, isWireGoalPhase, isWireHubEvent, isWirePlanAction, isWireRewindScope, isWireSettingWriteLayer, makeTranslate, normalizeApproval, packSessionSurface, parseChord, parseModelRef, parseSequence, perAction, placeholdersOf, promptTokens, sequenceId, sessionPartSummary, stripSystemNote, systemNote, tableOf, totalUsageTokens, translatorFor, turnDigest, unfixedRules, utf8ByteLength, wireFields };