@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.
- package/README.md +37 -34
- package/dist/index.d.ts +2768 -106
- package/dist/index.js +483 -101
- 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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
271
|
+
{ type: "ollama", label: "Ollama", apiKeyEnv: null, interactive: true },
|
|
277
272
|
{
|
|
278
273
|
type: "openai-compatible",
|
|
279
|
-
label: "OpenAI Compatible
|
|
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
|
-
|
|
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
|
-
|
|
491
|
-
|
|
492
|
-
const
|
|
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
|
|
496
|
-
if (!
|
|
497
|
-
|
|
498
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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 };
|