@bolloon/bolloon-agent 0.6.1 → 0.6.3

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 (78) hide show
  1. package/README.md +128 -111
  2. package/dist/agents/gateway-group.js +231 -6
  3. package/dist/agents/group-autopilot.js +256 -0
  4. package/dist/agents/pi-sdk-tools.js +302 -0
  5. package/dist/agents/pi-sdk.js +89 -140
  6. package/dist/agents/task-group.js +21 -4
  7. package/dist/cli/log-gate.js +68 -4
  8. package/dist/cli/mention-data.js +1 -1
  9. package/dist/cli/model-selector.js +84 -104
  10. package/dist/cli/setup-wizard.js +2 -10
  11. package/dist/cli/tui-select.js +99 -10
  12. package/dist/cli-entry.js +1 -9
  13. package/dist/electron-build/agents/gateway-group.js +814 -0
  14. package/dist/electron-build/agents/gateway-group.js.map +1 -0
  15. package/dist/electron-build/agents/group-autopilot.js +302 -0
  16. package/dist/electron-build/agents/group-autopilot.js.map +1 -0
  17. package/dist/electron-build/agents/pi-sdk-tools.js +302 -0
  18. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
  19. package/dist/electron-build/agents/pi-sdk.js +88 -139
  20. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  21. package/dist/electron-build/agents/task-group.js +601 -0
  22. package/dist/electron-build/agents/task-group.js.map +1 -0
  23. package/dist/electron-build/agents/task-public-text.js +97 -0
  24. package/dist/electron-build/agents/task-public-text.js.map +1 -0
  25. package/dist/electron-build/efficode/compress.js +86 -0
  26. package/dist/electron-build/efficode/compress.js.map +1 -0
  27. package/dist/electron-build/efficode/crc32.js +44 -0
  28. package/dist/electron-build/efficode/crc32.js.map +1 -0
  29. package/dist/electron-build/efficode/did.js +74 -0
  30. package/dist/electron-build/efficode/did.js.map +1 -0
  31. package/dist/electron-build/efficode/lz77.js +175 -0
  32. package/dist/electron-build/efficode/lz77.js.map +1 -0
  33. package/dist/electron-build/efficode/negotiate.js +233 -0
  34. package/dist/electron-build/efficode/negotiate.js.map +1 -0
  35. package/dist/electron-build/efficode/ops.js +96 -0
  36. package/dist/electron-build/efficode/ops.js.map +1 -0
  37. package/dist/electron-build/efficode/packet.js +279 -0
  38. package/dist/electron-build/efficode/packet.js.map +1 -0
  39. package/dist/electron-build/efficode/types.js +50 -0
  40. package/dist/electron-build/efficode/types.js.map +1 -0
  41. package/dist/electron-build/kernel/code-write-gate.js +55 -0
  42. package/dist/electron-build/kernel/code-write-gate.js.map +1 -0
  43. package/dist/electron-build/kernel/run-lifecycle.js +23 -0
  44. package/dist/electron-build/kernel/run-lifecycle.js.map +1 -1
  45. package/dist/electron-build/kernel/run-resume.js +62 -0
  46. package/dist/electron-build/kernel/run-resume.js.map +1 -0
  47. package/dist/electron-build/kernel/session-lifecycle.js +223 -0
  48. package/dist/electron-build/kernel/session-lifecycle.js.map +1 -0
  49. package/dist/electron-build/kernel/turn-selfcheck.js +65 -0
  50. package/dist/electron-build/kernel/turn-selfcheck.js.map +1 -0
  51. package/dist/electron-build/llm/config-store.js +2 -2
  52. package/dist/electron-build/llm/config-store.js.map +1 -1
  53. package/dist/electron-build/llm/model-selection.js +16 -2
  54. package/dist/electron-build/llm/model-selection.js.map +1 -1
  55. package/dist/electron-build/llm/pi-ai.js +2 -2
  56. package/dist/electron-build/llm/pi-ai.js.map +1 -1
  57. package/dist/electron-build/orbitdb/cid-database.js +98 -19
  58. package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
  59. package/dist/electron-build/orbitdb/group-access.js +399 -0
  60. package/dist/electron-build/orbitdb/group-access.js.map +1 -0
  61. package/dist/index.js +143 -10
  62. package/dist/ios/bolloon-web.json +3 -3
  63. package/dist/ios/sw.js +1 -1
  64. package/dist/kernel/code-write-gate.js +47 -0
  65. package/dist/kernel/gate-scan.js +5 -1
  66. package/dist/kernel/plan-harness.js +3 -2
  67. package/dist/kernel/roster.js +6 -6
  68. package/dist/kernel/run-lifecycle.js +21 -0
  69. package/dist/kernel/run-resume.js +58 -0
  70. package/dist/kernel/session-lifecycle.js +210 -0
  71. package/dist/kernel/turn-selfcheck.js +60 -0
  72. package/dist/llm/config-store.js +2 -2
  73. package/dist/llm/model-selection.js +16 -2
  74. package/dist/llm/pi-ai.js +2 -2
  75. package/dist/orbitdb/cid-database.js +95 -19
  76. package/dist/web/bolloon-web.json +3 -3
  77. package/dist/web/sw.js +1 -1
  78. package/package.json +1 -1
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * efficode/types - Efficode 参考实现的公共类型
4
+ *
5
+ * 设计口径 (照 leo 给的规范, 不自行发明新协议):
6
+ * - 符号化指令集 + 前缀表达式: @DID: 身份 · #DATA: 数据 · #REQ: 请求 · !ACK/!SEND/!END 控制
7
+ * - 两种模式: 文本模式 (调试/低带宽, 可 Base64) 与 二进制模式 (默认, 高密度)
8
+ * - 自解压数据块: 数据块自带轻量解码规则 (压缩算法 id + 原始长度), 接收方按规则直接展开
9
+ * - 包结构: [Header 2B] | [DID 验证段 32B] | [指令段 动态] | [数据块 动态] | [CRC32 4B]
10
+ *
11
+ * 诚实标注 (都写进 docs/wiki/efficode.md, 不在这里当已验证结论):
12
+ * - 本文件是**参考实现**: 能真编真解、逐字节回环、畸形包报错;
13
+ * - 语音/声波模式 (ggwave 类) **未实现** —— 只留 `mode` 枚举里的保留位, 编码时显式拒绝;
14
+ * - 链上签名验证 / ECC 临时会话密钥 **规范中** —— 本实现只做 DID 摘要段, 不做签名;
15
+ * - 压缩率/信息密度这类宣传数字一律按**实测**写, 见 scripts/verify-efficode.ts 的真测输出。
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.EfficodeError = exports.MIN_PACKET_BYTES = exports.CRC_BYTES = exports.DID_SEGMENT_BYTES = exports.EFFICODE_VERSION = exports.COMPRESSION_BY_ID = exports.COMPRESSION_IDS = void 0;
19
+ exports.COMPRESSION_IDS = {
20
+ none: 0,
21
+ lz77: 1,
22
+ deflate: 2,
23
+ };
24
+ exports.COMPRESSION_BY_ID = {
25
+ 0: 'none',
26
+ 1: 'lz77',
27
+ 2: 'deflate',
28
+ };
29
+ /** 包版本 (Header 高 4 位) */
30
+ exports.EFFICODE_VERSION = 1;
31
+ /** DID 段固定长度 (字节) —— 照规范: 32B */
32
+ exports.DID_SEGMENT_BYTES = 32;
33
+ /** CRC32 尾段固定长度 (字节) */
34
+ exports.CRC_BYTES = 4;
35
+ /** 最短合法包 = Header 2 + 无 DID 段 + 指令段最少 (varint 长度 1 + 一条控制指令 2) + 无数据块 + CRC 4 = 9B
36
+ * (DID 段 32B 是**可选**省略的, 所以不放进来; 带 DID 的包应 ≥ 41B, 由 flags 驱动逐段校验而不是靠这个下限) */
37
+ exports.MIN_PACKET_BYTES = 2 + 1 + 2 + exports.CRC_BYTES;
38
+ class EfficodeError extends Error {
39
+ code;
40
+ /** 出错位置 (字节偏移); 拿不到时为 -1 */
41
+ offset;
42
+ constructor(code, message, offset = -1) {
43
+ super(`${code}: ${message}${offset >= 0 ? ` (offset=${offset})` : ''}`);
44
+ this.name = 'EfficodeError';
45
+ this.code = code;
46
+ this.offset = offset;
47
+ }
48
+ }
49
+ exports.EfficodeError = EfficodeError;
50
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/efficode/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAWU,QAAA,eAAe,GAAoC;IAC9D,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;CACX,CAAC;AAEW,QAAA,iBAAiB,GAAoC;IAChE,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,SAAS;CACb,CAAC;AAEF,yBAAyB;AACZ,QAAA,gBAAgB,GAAG,CAAC,CAAC;AAElC,iCAAiC;AACpB,QAAA,iBAAiB,GAAG,EAAE,CAAC;AAEpC,wBAAwB;AACX,QAAA,SAAS,GAAG,CAAC,CAAC;AAE3B;8EAC8E;AACjE,QAAA,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAA,SAAS,CAAC;AAkBtD,mBAA2B,SAAQ,KAAK;IAC7B,IAAI,CAAoB;IACjC,4BAA4B;IACnB,MAAM,CAAS;IACxB,YAAY,IAAuB,EAAE,OAAe,EAAE,MAAM,GAAG,CAAC,CAAC;QAC/D,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * 代码写改的"类型门" (2026-10-01, 回应「tsc 抓错这个功能 bolloon 有吗」)。
4
+ *
5
+ * 查到的事实: bolloon **早就**有类型检查, 而且有三层 —— pre-commit 的 `tsc-check`(lefthook) ·
6
+ * `build:main = tsc && …` · 以及**给智能体的工具** `tsc_check`(pi-sdk-tools.ts:1450, 60s timeout)。
7
+ * 但**循环里没有"编辑后自动检查"** ✗ ⇒ `tsc_check` 是个"模型想得起来才会调"的工具 ✓
8
+ * ⇒ 和 #4(写操作读回)同一个病: **规矩写了, 没人执行** ✓。
9
+ * 这条把它变成机制: 本回合**改过 .ts/.tsx** ⇒ 回合收尾**自动**跑一次类型检查(一轮只跑一次, 不管改了 1 个还是 8 个文件 ✓),
10
+ * 结果以一行状态进对话流 —— "类型过没过"不再依赖模型自觉 ✓。
11
+ * 纪律: 每个回合最多一次(tsc 是秒级开销, 但也不该每改一个文件就跑) · 只对 TS 源码生效 · 失败绝不影响回合结果 ✓。
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.CODE_WRITE_TOOLS = void 0;
15
+ exports.isTypeScriptFile = isTypeScriptFile;
16
+ exports.codeWriteTarget = codeWriteTarget;
17
+ exports.decideTypecheck = decideTypecheck;
18
+ exports.formatTypecheckResult = formatTypecheckResult;
19
+ /** 写/改类工具里, 会"产出源码"的那些 */
20
+ exports.CODE_WRITE_TOOLS = new Set(['write_file', 'edit_file', 'patch', 'move_file', 'copy_file']);
21
+ function isTypeScriptFile(p) {
22
+ return /\.(ts|tsx|mts|cts)$/i.test(String(p || '').trim());
23
+ }
24
+ /**
25
+ * 这次写操作是否**产生了/改动了 TS 源码** ⇒ 返回那个路径(否则 null)。
26
+ * 只看路径, 不看内容(便宜且够用 ✓)。
27
+ */
28
+ function codeWriteTarget(toolName, args) {
29
+ if (!exports.CODE_WRITE_TOOLS.has(String(toolName)))
30
+ return null;
31
+ const rel = String(args?.path ?? args?.to ?? args?.file ?? '').trim();
32
+ if (!rel)
33
+ return null;
34
+ return isTypeScriptFile(rel) ? rel : null;
35
+ }
36
+ /**
37
+ * 回合收尾要不要跑类型检查: 改过 TS 且本回合还没跑过 ⇒ 跑。
38
+ * 抽成纯函数是为了**可测**: "一轮只跑一次"这条最容易写错(写成每个文件跑一次就把时间烧光 ✓)。
39
+ */
40
+ function decideTypecheck(touched, ranThisTurn) {
41
+ return !ranThisTurn && touched.length > 0;
42
+ }
43
+ /** 类型检查结果 ⇒ **一行**状态 (给对话流看; 错误多时只给前几条 + 总数) */
44
+ function formatTypecheckResult(ok, output, maxLines = 6) {
45
+ const body = String(output || '').split('\n').map((l) => l.trim()).filter(Boolean);
46
+ if (ok)
47
+ return '✅ 类型检查通过 (tsc --noEmit, 本回合改过 TS 后自动跑)';
48
+ const errs = body.filter((l) => /error TS\d+/.test(l));
49
+ const head = (errs.length ? errs : body).slice(0, maxLines);
50
+ const more = (errs.length || body.length) - head.length;
51
+ return `❌ 类型检查没过: ${errs.length || '?'} 个错误\n` + head.map((l) => ` ${l.slice(0, 160)}`).join('\n')
52
+ + (more > 0 ? `\n …还有 ${more} 条` : '')
53
+ + '\n ⇒ **先修类型再继续**(别在同一轮里叠加更多改动)';
54
+ }
55
+ //# sourceMappingURL=code-write-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-write-gate.js","sourceRoot":"","sources":["../../../src/kernel/code-write-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;AAEH,0BAA0B;AACb,QAAA,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAE7H,0BAAiC,CAAS;IACxC,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,yBAAgC,QAAgB,EAAE,IAAS;IACzD,IAAI,CAAC,QAAA,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,yBAAgC,OAAiB,EAAE,WAAoB;IACrE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,gDAAgD;AAChD,+BAAsC,EAAW,EAAE,MAAc,EAAE,QAAQ,GAAG,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnF,IAAI,EAAE;QAAE,OAAO,wCAAwC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,OAAO,aAAa,IAAI,CAAC,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;UAChG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;UACtC,kCAAkC,CAAC;AACzC,CAAC"}
@@ -15,6 +15,8 @@
15
15
  */
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.RUN_LIFECYCLE_NEEDS_RUN_ID = exports.RUN_LIFECYCLE_OPS = void 0;
18
+ exports.decideResumeReinstall = decideResumeReinstall;
19
+ exports.pickRunIdForResume = pickRunIdForResume;
18
20
  exports.runLifecycleAudit = runLifecycleAudit;
19
21
  exports.resetRunLifecycleAudit = resetRunLifecycleAudit;
20
22
  exports.submitRunLifecycle = submitRunLifecycle;
@@ -32,6 +34,27 @@ exports.RUN_LIFECYCLE_NEEDS_RUN_ID = {
32
34
  'finish-run': true,
33
35
  'save-checkpoint': true,
34
36
  };
37
+ /** 写原语 (由调用方注入; 内核只认形状) —— 对应 run-store 的 startRun/recordStep/finishRun/saveCheckpoint */
38
+ // ── K10 余项: 恢复相关的**纯规则** (从 pi-sdk 方法体里搬出来, 可单独判) ──────────
39
+ /**
40
+ * 恢复一次运行前, **要不要按 Run 快照重装运行时**。
41
+ * 规则: 一致 (`drifted=false` 且 `verified=true`) ⇒ **不重装** (运行时本来就是对的, 重装是白跑一趟);
42
+ * 漂了 (`drifted`) 或**核对不了** (`verified!==true`) ⇒ 装 (带着漂移继续跑会把漂移固化成历史)。
43
+ * 没有核对结论 (`undefined`) ⇒ 不装 (核对失败不阻塞恢复, 与迁移前一致)。
44
+ */
45
+ function decideResumeReinstall(drift) {
46
+ if (!drift)
47
+ return false;
48
+ return drift.drifted === true || drift.verified !== true;
49
+ }
50
+ /**
51
+ * "上一次运行"的取值规则: **显式记录的 lastRunId 优先**, 没有才回落当前活跃运行。
52
+ * 为什么是规则: Supervisor / 控制面要在运行结束后问"刚才跑的是哪条 run",
53
+ * 而重启一轮时活跃运行已经被清空 —— 二者优先级搞反会让上层拿旧 run 做决策。
54
+ */
55
+ function pickRunIdForResume(lastRunId, activeRunId) {
56
+ return String(lastRunId || activeRunId || '');
57
+ }
35
58
  /**
36
59
  * 端口**不抛异常但明确拒绝** (`{ ok: false, reason }`) 的归一化 —— 与 `control.ts` 同口径。
37
60
  * 为什么必须有: store 类原语用返回值表达拒绝 (例如状态迁移不合法), 只看"有没有抛"会把**被拒当成成功**。
@@ -1 +1 @@
1
- {"version":3,"file":"run-lifecycle.js","sourceRoot":"","sources":["../../../src/kernel/run-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-lifecycle.js","sourceRoot":"","sources":["../../../src/kernel/run-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * run-resume.ts — K10 余项: **从 checkpoint 恢复一次运行的编排与政策** (从 pi-sdk 的方法体搬进内核)
4
+ *
5
+ * 搬走的是**序列与政策** (不是 I/O):
6
+ * ① 恢复前**反查模型配置**: Run 记录里的 `modelConfig` 快照不能只写不核 —— "快照记 A, 现在盘上生效 B"
7
+ * 这种漂移若被静默继续, 长任务的历史执行链就说不清了;
8
+ * ② 漂移的**上报口径**: 漂了 ⇒ warn (说清哪几个字段) · 一致 ⇒ info 一句明确结论 · **核对失败不阻塞恢复**;
9
+ * ③ **按 Run 快照装配运行时的判据** (`decideResumeReinstall`, 见 `run-lifecycle.ts`):
10
+ * 只在"漂了"或"核对不了"时装 —— 一致时运行时本来就是对的, 重装是白跑一趟; **装配失败也不阻塞恢复**;
11
+ * ④ 准备失败 ⇒ 直接把 `plan` 交回 (不驱动);恢复态的**单次语义**: 驱动前后由端口负责设置/清除 (finally 保证清)。
12
+ *
13
+ * I/O 全部端口注入 (核对 / 准备 / 装配 / 落态 / 驱动 / 清态 / 日志)。本模块不 import 任何 agent 侧模块。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.resumeRunViaKernel = resumeRunViaKernel;
17
+ const run_lifecycle_js_1 = require("./run-lifecycle.js");
18
+ /**
19
+ * 恢复一次运行 —— **唯一入口**。语义与迁移前逐条一致 (见文件头 ①②③④); **本函数只在驱动阶段可能抛**
20
+ * (与迁移前一致: `prompt` 抛错会冒出去, 但恢复态**一定**被清), 其余每一步失败都**不阻塞恢复**。
21
+ */
22
+ async function resumeRunViaKernel(runId, ports) {
23
+ let modelDrift;
24
+ let modelApplied;
25
+ try {
26
+ modelDrift = (await ports.detectDrift(runId)) || undefined;
27
+ if (modelDrift?.drifted) {
28
+ ports.log?.('warn', `恢复时模型配置已偏离 Run 快照: ${String(modelDrift.message ?? '')}`);
29
+ }
30
+ else if (modelDrift) {
31
+ ports.log?.('info', `恢复前核对: ${String(modelDrift.message ?? '')}`);
32
+ }
33
+ }
34
+ catch {
35
+ /* 核对本身失败不阻塞恢复 (与迁移前一致) */
36
+ }
37
+ const prep = await ports.prepareResume(runId);
38
+ if (!prep?.ok || !prep.plan) {
39
+ return { ok: false, reason: prep?.reason, ...(modelDrift ? { modelDrift } : {}) };
40
+ }
41
+ if (modelDrift && (0, run_lifecycle_js_1.decideResumeReinstall)(modelDrift)) {
42
+ try {
43
+ modelApplied = await ports.applySnapshot(modelDrift.snapshot);
44
+ ports.log?.('info', `已按 Run 快照装配运行时: ${String(modelApplied?.provider ?? '')}/${String(modelApplied?.model ?? '')}` +
45
+ ` (configHash ${String(modelApplied?.configHash ?? '').slice(0, 12)})`);
46
+ }
47
+ catch (e) {
48
+ // 装配失败不阻塞恢复 (如实说; 调用方可以从返回值里看出没装成)
49
+ ports.log?.('warn', `按 Run 快照装配运行时失败, 保持当前运行时: ${String(e?.message || e).slice(0, 160)}`);
50
+ modelApplied = undefined;
51
+ }
52
+ }
53
+ ports.applyPlan(prep.plan);
54
+ try {
55
+ const reply = await ports.continueRun(prep.plan);
56
+ return { ok: true, reply, ...(modelDrift ? { modelDrift } : {}), ...(modelApplied ? { modelApplied } : {}) };
57
+ }
58
+ finally {
59
+ ports.clearPlan();
60
+ }
61
+ }
62
+ //# sourceMappingURL=run-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-resume.js","sourceRoot":"","sources":["../../../src/kernel/run-resume.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,yDAA2D;AAuC3D;;;GAGG;AACI,KAAK,6BAA6B,KAAa,EAAE,KAAkB;IACxE,IAAI,UAAmC,CAAC;IACxC,IAAI,YAA2C,CAAC;IAEhD,IAAI,CAAC;QACH,UAAU,GAAG,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC;QAC3D,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,sBAAsB,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,UAAU,IAAI,IAAA,wCAAqB,EAAC,UAAU,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC9D,KAAK,CAAC,GAAG,EAAE,CACT,MAAM,EACN,mBAAmB,MAAM,CAAC,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;gBAC5F,gBAAgB,MAAM,CAAC,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CACzE,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mCAAmC;YACnC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,6BAA6B,MAAM,CAAE,CAAW,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/G,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ /**
3
+ * session-lifecycle.ts — K10 余项: **会话生命周期端口** (把 pi-sdk 的运行/通道接线继续薄化)
4
+ *
5
+ * 搬走的是**规则**, 不是 I/O:
6
+ * · `save-session` : 消息 → 落盘形态的映射 (role/content/toolCall/toolResult/toolCallId/timestamp/source) + key 校验
7
+ * · `peek-history` : 读回后的**过滤/水合规则** (合法 role · 剔污染消息 · **保留"只有 tool call 没有正文"的合法消息**)
8
+ * · `resume-session` : 同上 + 把水合结果**应用**回历史 (应用由端口做), 返回新增条数
9
+ * · `seed-run` : 新一次运行的上下文种子 —— runId 来自**内核的活跃运行** (单一来源), extra 覆盖它 (**合并顺序是规则**)
10
+ *
11
+ * I/O (store 读写 · actor 快照 · 上下文工厂) 全部**端口注入** ⇒ 换存储 / 换 actor 实现只改注入点一处。
12
+ *
13
+ * 形状照抄 `run-lifecycle.ts` / `transport.ts` / `control.ts` (同一个仓库里只该有一种端口写法):
14
+ * 端口注入 · **未注入即拒** (不静默降级) · 一律**返回结果对象不抛** · 端口用 `{ok:false}` 表达拒绝要被归一化 · 审计流水可读。
15
+ *
16
+ * 哪些**留在** pi-sdk: 谁在什么时候调 (入口/时机) + 端口实现 (真 store / 真 actor)。本文件不 import 任何 agent 侧模块。
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.SESSION_ROLES = exports.SESSION_NEEDS_KEY = exports.SESSION_OPS = void 0;
20
+ exports.sessionLifecycleAudit = sessionLifecycleAudit;
21
+ exports.resetSessionLifecycleAudit = resetSessionLifecycleAudit;
22
+ exports.isValidSessionKey = isValidSessionKey;
23
+ exports.toPersistedMessages = toPersistedMessages;
24
+ exports.filterSessionMessages = filterSessionMessages;
25
+ exports.hydrateSessionMessages = hydrateSessionMessages;
26
+ exports.composeRunSeed = composeRunSeed;
27
+ exports.submitSessionOp = submitSessionOp;
28
+ exports.assertSessionOk = assertSessionOk;
29
+ exports.SESSION_OPS = ['save-session', 'peek-history', 'resume-session', 'seed-run'];
30
+ /** 哪些操作必须有会话 key (seed-run 例外: 它要的是**活跃运行**, 不是会话 key) */
31
+ exports.SESSION_NEEDS_KEY = {
32
+ 'save-session': true,
33
+ 'peek-history': true,
34
+ 'resume-session': true,
35
+ 'seed-run': false,
36
+ };
37
+ /** 端口**不抛异常但明确拒绝** (`{ ok: false, reason }`) 的归一化 —— 与 `control.ts` / `run-lifecycle.ts` 同口径 */
38
+ function portRefusal(res) {
39
+ if (res && typeof res === 'object' && 'ok' in res) {
40
+ const r = res;
41
+ if (r.ok === false)
42
+ return `端口拒绝: ${String(r.reason ?? '(未给原因)')}`;
43
+ }
44
+ return null;
45
+ }
46
+ const audit = [];
47
+ const AUDIT_MAX = 200;
48
+ /** 审计流水 (最近 N 条; 测试与运维可读) */
49
+ function sessionLifecycleAudit() {
50
+ return audit;
51
+ }
52
+ function resetSessionLifecycleAudit() {
53
+ audit.length = 0;
54
+ }
55
+ function record(op, origin, target, ok, detail) {
56
+ audit.push({ at: Date.now(), op, origin, target, ok, detail });
57
+ if (audit.length > AUDIT_MAX)
58
+ audit.splice(0, audit.length - AUDIT_MAX);
59
+ }
60
+ // ── 纯规则 (可单独判: 不碰 I/O) ──────────────────────────────────────────────
61
+ /** 会话 key 必须是非空字符串 —— 空 key 会让写入落到一个"共享黑洞"里, 必须当场拒 */
62
+ function isValidSessionKey(key) {
63
+ return typeof key === 'string' && key.trim().length > 0;
64
+ }
65
+ /** 合法角色 (拒绝旧 schema `{type:'user'}` 那种没有 role 字段的) */
66
+ exports.SESSION_ROLES = new Set(['user', 'assistant', 'tool', 'system']);
67
+ /**
68
+ * 落盘映射: 实时消息 → 持久形态。
69
+ * `timestamp` 取**写盘那一刻** (不是消息里的旧值) —— 迁移前就是这个口径, 明确保留。
70
+ * `source` 标记写入方 (默认 'pi-session')。
71
+ */
72
+ function toPersistedMessages(source, sourceTag = 'pi-session', now = Date.now) {
73
+ const ts = now();
74
+ return (source ?? []).map((raw) => {
75
+ const m = (raw ?? {});
76
+ return {
77
+ role: m.role,
78
+ content: m.content,
79
+ toolCall: m.toolCall,
80
+ toolResult: m.toolResult,
81
+ toolCallId: m.toolCallId,
82
+ timestamp: ts,
83
+ source: sourceTag,
84
+ };
85
+ });
86
+ }
87
+ /**
88
+ * 读回水合 + 过滤规则 (逐字搬自 pi-sdk, 只去掉 instance 依赖)。
89
+ * 三条"必须保留"的坑都在这:
90
+ * ① `content === ''` 但带 toolCall 的 assistant 消息**合法** (LLM 只输出工具调用没有正文) ⇒ 不许按"空内容"丢掉;
91
+ * ② 「[AI 服务调用失败]」/「[错误:」开头的污染消息要剔;
92
+ * ③ tool role 但没有 toolResult 的占位消息要剔。
93
+ */
94
+ function filterSessionMessages(loaded) {
95
+ if (!loaded)
96
+ return [];
97
+ const hydrated = [];
98
+ for (const m of loaded) {
99
+ if (!m || !exports.SESSION_ROLES.has(String(m.role)))
100
+ continue;
101
+ if (typeof m.content === 'string' && m.content.startsWith('[AI 服务调用失败]'))
102
+ continue;
103
+ if (typeof m.content === 'string' && m.content.startsWith('[错误:'))
104
+ continue;
105
+ if (!m.content && !m.toolCall && !m.toolResult)
106
+ continue;
107
+ if (m.role === 'tool' && !m.toolResult)
108
+ continue;
109
+ hydrated.push({
110
+ role: m.role,
111
+ content: m.content ?? '',
112
+ toolCall: m.toolCall,
113
+ toolResult: m.toolResult,
114
+ toolCallId: m.toolCallId,
115
+ });
116
+ }
117
+ return hydrated;
118
+ }
119
+ /**
120
+ * 过滤 + 截断 (取**最近** maxMessages 条) —— 给"自己不做截断"的调用方用。
121
+ * actor 的 `hydrateHistory(spec)` 管道自带截断 ⇒ 那边只该用 `filterSessionMessages` (别截两次)。
122
+ */
123
+ function hydrateSessionMessages(loaded, maxMessages = 30) {
124
+ const filtered = filterSessionMessages(loaded);
125
+ const max = Number.isFinite(maxMessages) && maxMessages > 0 ? Math.floor(maxMessages) : 0;
126
+ return max > 0 ? filtered.slice(-max) : [];
127
+ }
128
+ /**
129
+ * 运行种子 = 活跃运行的 runId 打底 + `extra` 覆盖它 (**合并顺序是规则, 所以它归内核**)。
130
+ * 与 `seed-run` 分支共用这一条规则; 同步调用点 (pi-sdk 的 `seedRunContext` 是同步签名) 直接调它, 不必为了合并一次规则绕异步端口。
131
+ */
132
+ function composeRunSeed(activeRunId, extra = {}) {
133
+ return { runId: activeRunId, ...extra };
134
+ }
135
+ // ── 派发 (唯一入口) ───────────────────────────────────────────────────────────
136
+ const missing = (what) => `端口未注入: ${what} (拒绝静默降级)`;
137
+ /**
138
+ * 会话生命周期的**唯一系统调用门**。
139
+ * 未注入端口 / 缺 key ⇒ `{ ok:false }` (不抛); 端口抛错 ⇒ 也归一化成 `{ ok:false, detail }` (调用方按自己的响亮口径处理)。
140
+ */
141
+ async function submitSessionOp(request, ports) {
142
+ const op = request?.op;
143
+ const origin = String(request?.origin ?? '').trim() || 'unknown';
144
+ const target = String(request?.key ?? '').trim() || '-';
145
+ const fail = (detail) => {
146
+ record(op, origin, target, false, detail);
147
+ return { ok: false, op, via: 'kernel-session-lifecycle', detail };
148
+ };
149
+ if (!exports.SESSION_OPS.includes(op))
150
+ return fail(`未知会话操作: ${String(op)}`);
151
+ if (!origin || origin === 'unknown')
152
+ return fail('缺少 origin (审计要求, 不许匿名)');
153
+ if (exports.SESSION_NEEDS_KEY[op] && !isValidSessionKey(request.key))
154
+ return fail(`缺少合法会话 key (op=${op})`);
155
+ try {
156
+ if (op === 'save-session') {
157
+ const key = request.key;
158
+ if (!ports.saveMessages)
159
+ return fail(missing('saveMessages'));
160
+ if (!ports.historySnapshot)
161
+ return fail(missing('historySnapshot'));
162
+ const source = (await ports.historySnapshot()) ?? [];
163
+ const persisted = toPersistedMessages(source);
164
+ const res = await ports.saveMessages(key, persisted);
165
+ const refusal = portRefusal(res);
166
+ if (refusal)
167
+ return fail(refusal);
168
+ record(op, origin, target, true);
169
+ return { ok: true, op, via: 'kernel-session-lifecycle', port: 'saveMessages', result: { count: persisted.length } };
170
+ }
171
+ if (op === 'peek-history') {
172
+ const key = request.key;
173
+ if (!ports.loadMessages)
174
+ return fail(missing('loadMessages'));
175
+ const loaded = await ports.loadMessages(key);
176
+ const hydrated = hydrateSessionMessages(loaded, request.maxMessages ?? 30);
177
+ record(op, origin, target, true);
178
+ return { ok: true, op, via: 'kernel-session-lifecycle', port: 'loadMessages', result: hydrated };
179
+ }
180
+ if (op === 'resume-session') {
181
+ const key = request.key;
182
+ if (!ports.loadMessages)
183
+ return fail(missing('loadMessages'));
184
+ if (!ports.applyHistory)
185
+ return fail(missing('applyHistory'));
186
+ const loaded = await ports.loadMessages(key);
187
+ const hydrated = hydrateSessionMessages(loaded, request.maxMessages ?? 30);
188
+ const applied = (await ports.applyHistory(hydrated)) ?? 0;
189
+ const refusal = portRefusal(applied);
190
+ if (refusal)
191
+ return fail(refusal);
192
+ record(op, origin, target, true, `应用 ${hydrated.length} 条`);
193
+ return { ok: true, op, via: 'kernel-session-lifecycle', port: 'applyHistory', result: Number(applied) || 0 };
194
+ }
195
+ // seed-run
196
+ if (!ports.activeRunId)
197
+ return fail(missing('activeRunId'));
198
+ if (!ports.newRunContext)
199
+ return fail(missing('newRunContext'));
200
+ const activeRun = ports.activeRunId();
201
+ const extra = (request.extra ?? {});
202
+ // 合并顺序是规则: 先放活跃运行得到的 runId, 再让 extra 覆盖 (调用方显式传的优先)
203
+ const seed = composeRunSeed(activeRun, extra);
204
+ const ctx = ports.newRunContext(seed.runId, extra);
205
+ const refusal = portRefusal(ctx);
206
+ if (refusal)
207
+ return fail(refusal);
208
+ record(op, origin, target, true, `runId=${String(seed.runId ?? '(无)')}`);
209
+ return { ok: true, op, via: 'kernel-session-lifecycle', port: 'newRunContext', result: ctx };
210
+ }
211
+ catch (err) {
212
+ return fail(`端口抛错: ${String(err?.message ?? err).slice(0, 200)}`);
213
+ }
214
+ }
215
+ /**
216
+ * 需要**响亮失败**的调用方 (写不进 = 事实层面没发生) 在派发后调它。
217
+ * 与 `assertLifecycleOk` 同口径: 把 `{ok:false}` 变成抛, 而不是让调用方忘掉检查。
218
+ */
219
+ function assertSessionOk(out) {
220
+ if (!out.ok)
221
+ throw new Error(`[kernel-session-lifecycle] ${out.op} 失败: ${out.detail ?? '(无原因)'}`);
222
+ }
223
+ //# sourceMappingURL=session-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../../src/kernel/session-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * turn-selfcheck.ts — K10 余项: **回合收尾自检的编排与政策** (从 pi-sdk 的方法体搬进内核)
4
+ *
5
+ * 搬走的是**政策** (不是 I/O):
6
+ * ① 该不该跑 —— 由纯规则 `decideTypecheck` 决定 (改过 TS 且本回合没跑过), 规则本体在 `code-write-gate.ts`;
7
+ * ② **系统自检也过门** —— 它不是模型发起的工具调用 (args 恒空, 是本回合改过 TS 后的收尾自检),
8
+ * 但**更不能例外**: 例外一旦靠"没人知道它绕过"活着, 门就不再是唯一的执行咽喉;
9
+ * ③ **fail-closed**: 门被拒 **或门本身抛错** ⇒ **不执行**, 且要**可见地报出来** (拒绝不许静默);
10
+ * ④ 执行抛错 ⇒ 报一行"没能跑起来" (附"改动已落盘, 记得自己跑一次"), **绝不让自检失败影响回合结果**。
11
+ *
12
+ * 为什么归内核: 这三条都是**政策**, 不是某个入口的私事 —— 换入口 (CLI/Web/cron) 时不许各写一份。
13
+ * I/O 全部端口注入: 取工具 · 问门 · 上报 (emit)。本模块不 import 任何 agent 侧模块。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.TURN_SELFCHECK_TOOL = void 0;
17
+ exports.runTurnEndSelfCheck = runTurnEndSelfCheck;
18
+ const code_write_gate_js_1 = require("./code-write-gate.js");
19
+ /** 自检用的工具名 (与工具注册表里的名字一致) */
20
+ exports.TURN_SELFCHECK_TOOL = 'tsc_check';
21
+ /**
22
+ * 回合收尾自检 —— **唯一入口**。语义与迁移前逐条一致:
23
+ * 不需要跑 ⇒ `{decided:false}`; 工具缺失 ⇒ 安静地不做 (迁移前也是静默);
24
+ * 门拒/门抛 ⇒ 不执行 + **上屏一行"被拒, 未执行: 原因"**; 执行成功 ⇒ 上屏一行结果;
25
+ * 执行抛错 ⇒ 上屏一行"没能跑起来"。**本函数从不抛**。
26
+ */
27
+ async function runTurnEndSelfCheck(spec, ports) {
28
+ if (!(0, code_write_gate_js_1.decideTypecheck)([...spec.touched], spec.ranThisTurn)) {
29
+ return { ran: false, decided: false, line: '' };
30
+ }
31
+ const toolName = spec.toolName ?? exports.TURN_SELFCHECK_TOOL;
32
+ const tool = ports.getTool(toolName);
33
+ if (!tool?.execute) {
34
+ return { ran: false, decided: true, line: '', reason: `工具缺失: ${toolName}` };
35
+ }
36
+ try {
37
+ let allowed = true;
38
+ let why = '';
39
+ try {
40
+ const d = await ports.askGate({ tool: toolName, args: {} });
41
+ allowed = d?.allow === true;
42
+ why = String(d?.reason || d?.rejectedBy || d?.source || '');
43
+ }
44
+ catch (gateErr) {
45
+ allowed = false;
46
+ why = `harness-error: ${String(gateErr?.message || gateErr)}`;
47
+ }
48
+ if (!allowed) {
49
+ const line = `🔎 类型检查被门拒绝, 未执行: ${why.slice(0, 120)}`;
50
+ ports.emit({ type: 'status', content: line, tool: 'system' });
51
+ return { ran: false, decided: true, rejected: true, line, reason: why };
52
+ }
53
+ const r = (await tool.execute({}));
54
+ const passed = r?.success !== false && !/error TS\d+/.test(String(r?.output || ''));
55
+ const line = `🔎 ${(0, code_write_gate_js_1.formatTypecheckResult)(passed, String(r?.output || ''))}`;
56
+ ports.emit({ type: 'status', content: line, tool: 'system' });
57
+ return { ran: true, decided: true, passed, line };
58
+ }
59
+ catch (e) {
60
+ const line = `🔎 类型检查没能跑起来: ${String(e?.message || e).slice(0, 100)} (改动已落盘, 记得自己跑一次)`;
61
+ ports.emit({ type: 'status', content: line, tool: 'system' });
62
+ return { ran: false, decided: true, line, reason: String(e?.message || e).slice(0, 120) };
63
+ }
64
+ }
65
+ //# sourceMappingURL=turn-selfcheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-selfcheck.js","sourceRoot":"","sources":["../../../src/kernel/turn-selfcheck.ts"],"names":[],"mappings":"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"}
@@ -198,8 +198,8 @@ exports.PROVIDER_INFO = {
198
198
  // 2026-07-17: V3 系列 (deepseek-chat / deepseek-reasoner) 官方已下线, 改 V4
199
199
  deepseek: { name: 'DeepSeek', description: '深度求索大模型 (V4)', requiresApiKey: true, models: ['deepseek-v4-flash', 'deepseek-v4-pro'] },
200
200
  kimi: { name: 'Kimi (月之暗面)', description: 'Moonshot Kimi K 系列模型', requiresApiKey: true, models: ['kimi-k3', 'kimi-k2-0905', 'moonshot-v1-128k', 'moonshot-v1-32k'] },
201
- glm: { name: 'GLM (智谱)', description: '智谱 GLM 系列模型', requiresApiKey: true, models: ['glm-5.2', 'glm-4.6', 'glm-4.5', 'glm-4-flash', 'glm-4'] },
202
- qwen: { name: 'Qwen (通义千问)', description: '阿里云通义千问系列', requiresApiKey: true, models: ['qwen3-max', 'qwen-max', 'qwen-plus', 'qwen-turbo'] },
201
+ glm: { name: 'GLM (智谱)', description: '智谱 GLM 系列模型', requiresApiKey: true, models: ['glm-5.3-flash', 'glm-5.3', 'glm-5.2', 'glm-5', 'glm-4.6', 'glm-4.5', 'glm-4.7', 'glm-4-flash', 'glm-4'] },
202
+ qwen: { name: 'Qwen (通义千问)', description: '阿里云通义千问系列', requiresApiKey: true, models: ['qwen3.8-max', 'qwen3-max', 'qwen-max', 'qwen-plus', 'qwen-turbo'] },
203
203
  mimo: { name: 'MiMo (小米)', description: '小米 MiMo V2 系列 (openai 兼容)', requiresApiKey: true, models: ['mimo-v2.5-pro', 'mimo-v2-pro', 'mimo-v2-omni', 'mimo-v2-flash', 'mimo-v2.5-pro-ultraspeed'] },
204
204
  grok: { name: 'Grok (xAI)', description: 'xAI Grok 系列模型 (openai 兼容)', requiresApiKey: true, models: ['grok-4.5', 'grok-4', 'grok-4-fast'] },
205
205
  local: { name: '本地模型', description: '本地部署的模型服务', requiresApiKey: false }