@bolloon/bolloon-agent 0.4.33 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/agents/contacts/chain.js +27 -7
  2. package/dist/agents/execution-supervisor.js +580 -40
  3. package/dist/agents/external-events.js +35 -6
  4. package/dist/agents/gateway-group.js +100 -12
  5. package/dist/agents/goal-criteria.js +10 -3
  6. package/dist/agents/goal-flywheel/block-executor.js +346 -0
  7. package/dist/agents/goal-flywheel/continuation-decision.js +592 -0
  8. package/dist/agents/goal-flywheel/goal-change.js +754 -0
  9. package/dist/agents/goal-flywheel/index.js +26 -0
  10. package/dist/agents/goal-flywheel/memory-layers.js +227 -0
  11. package/dist/agents/goal-flywheel/run-closure.js +809 -0
  12. package/dist/agents/goal-flywheel/skill-candidate.js +628 -0
  13. package/dist/agents/goal-flywheel/types.js +329 -0
  14. package/dist/agents/goal-flywheel/wiring/change.js +288 -0
  15. package/dist/agents/goal-flywheel/wiring/closure.js +697 -0
  16. package/dist/agents/goal-flywheel/wiring/continuation.js +432 -0
  17. package/dist/agents/goal-flywheel/wiring/contract.js +270 -0
  18. package/dist/agents/goal-flywheel/wiring/index.js +26 -0
  19. package/dist/agents/goal-flywheel/wiring/monitor.js +254 -0
  20. package/dist/agents/goal-flywheel/wiring/seams.js +592 -0
  21. package/dist/agents/goal-flywheel/work-contract.js +478 -0
  22. package/dist/agents/goal-flywheel/work-monitor.js +488 -0
  23. package/dist/agents/goal-flywheel-wiring.js +1870 -0
  24. package/dist/agents/goal-state-reducer.js +406 -0
  25. package/dist/agents/goal-store.js +35 -1
  26. package/dist/agents/mobile-flywheel-view.js +144 -0
  27. package/dist/agents/mobile-task-actions-verify.js +74 -0
  28. package/dist/agents/mobile-task-actions.js +178 -0
  29. package/dist/agents/mobile-task-views.js +199 -0
  30. package/dist/agents/model-policy.js +651 -0
  31. package/dist/agents/network-pulse.js +304 -18
  32. package/dist/agents/pi-sdk-tools.js +84 -33
  33. package/dist/agents/pi-sdk.js +157 -42
  34. package/dist/agents/run-store.js +71 -5
  35. package/dist/agents/skill-readiness.js +52 -10
  36. package/dist/agents/subagent-manager.js +209 -3
  37. package/dist/agents/task/task-runner.js +17 -4
  38. package/dist/agents/task-group.js +8 -51
  39. package/dist/agents/task-public-text.js +89 -0
  40. package/dist/agents/workflow-pivot-loop.js +19 -12
  41. package/dist/cli/clipboard.js +65 -0
  42. package/dist/cli/commands/index.js +1 -0
  43. package/dist/cli/commands/tasks.js +350 -2
  44. package/dist/cli/identity-command.js +177 -0
  45. package/dist/cli/ink-app.js +145 -17
  46. package/dist/cli/log-gate.js +386 -0
  47. package/dist/cli/mention-data.js +2 -0
  48. package/dist/cli/model-selector.js +538 -0
  49. package/dist/cli/reply-hygiene.js +54 -0
  50. package/dist/cli/setup-wizard.js +757 -69
  51. package/dist/cli/startup-notice.js +160 -0
  52. package/dist/cli/stores.js +22 -1
  53. package/dist/cli/theme.js +49 -0
  54. package/dist/cli/tui-select.js +970 -0
  55. package/dist/cli/update-commands.js +150 -24
  56. package/dist/cli-entry.js +137 -20
  57. package/dist/electron-build/agents/contacts/chain.js +26 -6
  58. package/dist/electron-build/agents/contacts/chain.js.map +1 -1
  59. package/dist/electron-build/agents/execution-supervisor.js +578 -38
  60. package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
  61. package/dist/electron-build/agents/external-events.js +34 -5
  62. package/dist/electron-build/agents/external-events.js.map +1 -1
  63. package/dist/electron-build/agents/goal-criteria.js +10 -3
  64. package/dist/electron-build/agents/goal-criteria.js.map +1 -1
  65. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js +598 -0
  66. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js.map +1 -0
  67. package/dist/electron-build/agents/goal-flywheel/goal-change.js +773 -0
  68. package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -0
  69. package/dist/electron-build/agents/goal-flywheel/memory-layers.js +269 -0
  70. package/dist/electron-build/agents/goal-flywheel/memory-layers.js.map +1 -0
  71. package/dist/electron-build/agents/goal-flywheel/run-closure.js +818 -0
  72. package/dist/electron-build/agents/goal-flywheel/run-closure.js.map +1 -0
  73. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js +642 -0
  74. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js.map +1 -0
  75. package/dist/electron-build/agents/goal-flywheel/types.js +333 -0
  76. package/dist/electron-build/agents/goal-flywheel/types.js.map +1 -0
  77. package/dist/electron-build/agents/goal-flywheel/wiring/change.js +294 -0
  78. package/dist/electron-build/agents/goal-flywheel/wiring/change.js.map +1 -0
  79. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js +742 -0
  80. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js.map +1 -0
  81. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js +444 -0
  82. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js.map +1 -0
  83. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js +279 -0
  84. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js.map +1 -0
  85. package/dist/electron-build/agents/goal-flywheel/wiring/index.js +111 -0
  86. package/dist/electron-build/agents/goal-flywheel/wiring/index.js.map +1 -0
  87. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js +264 -0
  88. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js.map +1 -0
  89. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +612 -0
  90. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -0
  91. package/dist/electron-build/agents/goal-flywheel/work-contract.js +488 -0
  92. package/dist/electron-build/agents/goal-flywheel/work-contract.js.map +1 -0
  93. package/dist/electron-build/agents/goal-flywheel/work-monitor.js +501 -0
  94. package/dist/electron-build/agents/goal-flywheel/work-monitor.js.map +1 -0
  95. package/dist/electron-build/agents/goal-flywheel-wiring.js +1962 -0
  96. package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -0
  97. package/dist/electron-build/agents/goal-state-reducer.js +414 -0
  98. package/dist/electron-build/agents/goal-state-reducer.js.map +1 -0
  99. package/dist/electron-build/agents/goal-store.js +35 -1
  100. package/dist/electron-build/agents/goal-store.js.map +1 -1
  101. package/dist/electron-build/agents/model-policy.js +706 -0
  102. package/dist/electron-build/agents/model-policy.js.map +1 -0
  103. package/dist/electron-build/agents/network-pulse.js +307 -19
  104. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  105. package/dist/electron-build/agents/pi-sdk-tools.js +84 -33
  106. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
  107. package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
  108. package/dist/electron-build/agents/pi-sdk.js +156 -41
  109. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  110. package/dist/electron-build/agents/run-store.js +75 -6
  111. package/dist/electron-build/agents/run-store.js.map +1 -1
  112. package/dist/electron-build/agents/skill-readiness.js +52 -9
  113. package/dist/electron-build/agents/skill-readiness.js.map +1 -1
  114. package/dist/electron-build/agents/task/task-runner.js +16 -3
  115. package/dist/electron-build/agents/task/task-runner.js.map +1 -1
  116. package/dist/electron-build/agents/workflow-pivot-loop.js +19 -12
  117. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
  118. package/dist/electron-build/llm/config-store.js +146 -6
  119. package/dist/electron-build/llm/config-store.js.map +1 -1
  120. package/dist/electron-build/llm/connection-probe.js +764 -0
  121. package/dist/electron-build/llm/connection-probe.js.map +1 -0
  122. package/dist/electron-build/llm/custom-provider-store.js +272 -0
  123. package/dist/electron-build/llm/custom-provider-store.js.map +1 -0
  124. package/dist/electron-build/llm/data/provider-catalog-baked.js +23 -0
  125. package/dist/electron-build/llm/data/provider-catalog-baked.js.map +1 -0
  126. package/dist/electron-build/llm/model-catalog.js +778 -0
  127. package/dist/electron-build/llm/model-catalog.js.map +1 -0
  128. package/dist/electron-build/llm/model-discovery.js +1202 -0
  129. package/dist/electron-build/llm/model-discovery.js.map +1 -0
  130. package/dist/electron-build/llm/model-selection.js +1315 -0
  131. package/dist/electron-build/llm/model-selection.js.map +1 -0
  132. package/dist/electron-build/llm/pi-ai.js +70 -11
  133. package/dist/electron-build/llm/pi-ai.js.map +1 -1
  134. package/dist/electron-build/llm/provider-catalog.js +969 -0
  135. package/dist/electron-build/llm/provider-catalog.js.map +1 -0
  136. package/dist/electron-build/llm/provider-registry.js +950 -0
  137. package/dist/electron-build/llm/provider-registry.js.map +1 -0
  138. package/dist/electron-build/llm/tool-name.js +266 -0
  139. package/dist/electron-build/llm/tool-name.js.map +1 -0
  140. package/dist/electron-build/orbitdb/cid-database.js +83 -17
  141. package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
  142. package/dist/electron-build/orbitdb/ipfs-node.js +31 -2
  143. package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -1
  144. package/dist/electron-build/utils/dual-source-facts.js +236 -0
  145. package/dist/electron-build/utils/dual-source-facts.js.map +1 -0
  146. package/dist/electron-build/utils/dual-source.js +347 -0
  147. package/dist/electron-build/utils/dual-source.js.map +1 -0
  148. package/dist/electron-build/utils/update-manager.js +328 -104
  149. package/dist/electron-build/utils/update-manager.js.map +1 -1
  150. package/dist/electron-build/utils/update-state.js +9 -11
  151. package/dist/electron-build/utils/update-state.js.map +1 -1
  152. package/dist/electron-build/utils/version-identity.js +193 -0
  153. package/dist/electron-build/utils/version-identity.js.map +1 -0
  154. package/dist/electron-build/utils/version-info.js +57 -31
  155. package/dist/electron-build/utils/version-info.js.map +1 -1
  156. package/dist/index.js +385 -108
  157. package/dist/ios/bolloon-web.json +10 -0
  158. package/dist/ios/chain-explorer.js +617 -0
  159. package/dist/ios/explorer.html +163 -0
  160. package/dist/ios/index.html +96 -0
  161. package/dist/ios/mobile-agent.js +2 -2
  162. package/dist/ios/mobile-contacts.js +362 -0
  163. package/dist/ios/mobile-core.js +3102 -310
  164. package/dist/ios/mobile-privacy.js +185 -0
  165. package/dist/ios/mobile-tasks.js +339 -0
  166. package/dist/ios/mobile-update.js +1442 -0
  167. package/dist/ios/mobile.css +19 -0
  168. package/dist/ios/mobile.html +96 -0
  169. package/dist/ios/mobile.js +1013 -41
  170. package/dist/ios/routes-chain-index.js +108 -0
  171. package/dist/ios/routes-contacts.js +420 -0
  172. package/dist/ios/routes-llm-config.js +344 -52
  173. package/dist/ios/routes-mobile-tasks.js +353 -0
  174. package/dist/ios/routes-onchain-trade.js +99 -0
  175. package/dist/ios/routes-x402-info.js +1 -0
  176. package/dist/ios/server.js +921 -0
  177. package/dist/ios/sw.js +1 -1
  178. package/dist/ios/task-frame-server.js +211 -0
  179. package/dist/llm/config-store.js +146 -6
  180. package/dist/llm/connection-probe.js +744 -0
  181. package/dist/llm/custom-provider-store.js +224 -0
  182. package/dist/llm/data/provider-catalog-baked.js +19 -0
  183. package/dist/llm/model-catalog.js +717 -0
  184. package/dist/llm/model-discovery.js +1137 -0
  185. package/dist/llm/model-selection.js +1241 -0
  186. package/dist/llm/pi-ai.js +70 -11
  187. package/dist/llm/provider-catalog.js +898 -0
  188. package/dist/llm/provider-registry.js +917 -0
  189. package/dist/llm/tool-name.js +220 -0
  190. package/dist/orbitdb/cid-database.js +81 -16
  191. package/dist/orbitdb/ipfs-node.js +31 -2
  192. package/dist/setup/onboard.js +34 -8
  193. package/dist/utils/dual-source-facts.js +223 -0
  194. package/dist/utils/dual-source.js +297 -0
  195. package/dist/utils/update-cli.js +16 -21
  196. package/dist/utils/update-health.js +35 -5
  197. package/dist/utils/update-manager.js +325 -96
  198. package/dist/utils/update-state.js +13 -10
  199. package/dist/utils/version-identity.js +176 -0
  200. package/dist/utils/version-info.js +27 -22
  201. package/dist/web/bolloon-web.json +10 -0
  202. package/dist/web/mobile-contacts.js +44 -11
  203. package/dist/web/mobile-core.js +2901 -580
  204. package/dist/web/mobile-tasks.js +339 -0
  205. package/dist/web/mobile-update.js +1442 -0
  206. package/dist/web/mobile.css +19 -0
  207. package/dist/web/mobile.html +64 -0
  208. package/dist/web/mobile.js +838 -35
  209. package/dist/web/routes-llm-config.js +344 -52
  210. package/dist/web/routes-mobile-tasks.js +353 -0
  211. package/dist/web/server.js +163 -4
  212. package/dist/web/sw.js +1 -1
  213. package/package.json +3 -1
  214. package/scripts/build-web.ts +36 -0
@@ -0,0 +1,598 @@
1
+ "use strict";
2
+ /**
3
+ * continuation-decision.ts — P0「节奏由进展决定」判定器 (2026-09-25)
4
+ *
5
+ * 归属: `docs/wiki/goal-continuation-flywheel.md` §13「P0 节奏」。本文件**独占**:
6
+ * - 不写入冻结面 (`types.ts` / `index.ts`), 不 import 其它阶段的实现文件;
7
+ * - 不接任何现有调用方 (接线是 P1 单一所有者的事);
8
+ * - 阶段间只通过 `types.ts` 的类型耦合 —— 这里只 `import type`, 运行期零依赖。
9
+ *
10
+ * 三条纪律 (与 §14「共同约定」逐条对应):
11
+ *
12
+ * ① **纯函数 · 无 I/O · 可回放**
13
+ * 时间一律由 `now` 注入 (不读真实钟); 不 import fs / 网络 / crypto; 不调用
14
+ * `Date.now` / `new Date` / `Math.random` / `randomUUID`。`decisionId` 由 (goalId, runId)
15
+ * 派生 —— 同一批事实重放, 得到**逐字节相同**的决策, 不会造出第二条决策。
16
+ *
17
+ * ② **节奏由进展决定, 不由轮次/时长决定**
18
+ * 唯一有资格"继续"的是 `ProgressDelta` 里的**新的可核验证据**或**新满足的判据**。
19
+ * `stepsAdvanced`(步数) / `unresolvedDelta` / "跑了第几轮" / "跑了多久" **都不是进展**:
20
+ * 没有证据就没有继续的资格 (types.ts §1), 宁可交人。
21
+ *
22
+ * ③ **硬底线是安全线, 不是任务节奏**
23
+ * 单 Run 时间上限 · 单 Goal 预算上限 · 无进展熔断阈值只决定"什么时候必须停"。
24
+ * `applyHardLimits` 只能**收紧** (自治决策 → 交人), 永不放开; 非自治决策原样返回。
25
+ *
26
+ * 判定优先级 (先命中先返回, 每条都给出结构化 reason):
27
+ * ⓪ `now` 不可解析 → 交人 (时间不可信, 不做任何自动判断)
28
+ * ① Goal 已是终态 → 幂等 mirror 成 complete / fail
29
+ * ② 判据全满足 → 过完成门才 complete; 判据没被确认 / 完全没有证据 → 交人
30
+ * ③ 三类硬底线 (单 Run 超时 / Goal 预算用尽 / 无进展熔断) → 交人
31
+ * ④ Supervisor 已判失速 (goal.status='stalled') → 交人
32
+ * ⑤ 不可恢复的 Run 失败 (auth / policy_denied / persist_failed / repeat_failure)
33
+ * ⑥ 等外部 / 等时间 / 等子 Agent → wait
34
+ * ⑦ 人主动暂停 → pause
35
+ * ⑧ 目标等人 → ask_human
36
+ * ⑨ 有可核验进展 → continue
37
+ * ⑩ 目标声明了未就绪的必需能力 → delegate (下一步该派给具备该能力的执行者)
38
+ * ⑪ 以上都不成立 (本轮没有新证据) → 交人, 不许自动继续
39
+ */
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.decideContinuation = decideContinuation;
42
+ exports.applyHardLimits = applyHardLimits;
43
+ exports.isRunnable = isRunnable;
44
+ // ─────────────────────────────────────────────────────────────────────────────
45
+ // 内部工具 (全部不导出: 冻结面只认 §14 的三个函数, 其余是实现细节)
46
+ // ─────────────────────────────────────────────────────────────────────────────
47
+ const RISK_ORDER = ['low', 'medium', 'high'];
48
+ /** 提高风险级别 (只能往上, 不许往下) */
49
+ function bumpRisk(r, steps = 1) {
50
+ const i = RISK_ORDER.indexOf(r);
51
+ const base = i < 0 ? 0 : i;
52
+ return RISK_ORDER[Math.min(RISK_ORDER.length - 1, base + steps)];
53
+ }
54
+ function clamp01(n) {
55
+ if (!Number.isFinite(n))
56
+ return 0;
57
+ return Math.min(1, Math.max(0, n));
58
+ }
59
+ /** 时间戳只信 `Date.parse` 能解析的 (解析不了 = 不可信, 不做自动判断) */
60
+ function parseTs(ts) {
61
+ if (typeof ts !== 'string' || ts.trim() === '')
62
+ return Number.NaN;
63
+ return Date.parse(ts);
64
+ }
65
+ /** 正有限数 (时间/预算类安全线) */
66
+ function isPosFinite(n) {
67
+ return typeof n === 'number' && Number.isFinite(n) && n > 0;
68
+ }
69
+ /** 正整数计数 (熔断阈值这种"计数类"安全线; 0/负数/小数 = 未定义) */
70
+ function isCount(n) {
71
+ return typeof n === 'number' && Number.isInteger(n) && n >= 1;
72
+ }
73
+ /** 去空 + 去重, 保序 */
74
+ function uniq(xs) {
75
+ const out = [];
76
+ for (const x of xs ?? []) {
77
+ if (typeof x === 'string' && x.trim() !== '' && !out.includes(x))
78
+ out.push(x);
79
+ }
80
+ return out;
81
+ }
82
+ /**
83
+ * **有可核验进展吗** —— 唯一有资格继续的东西。
84
+ * `stepsAdvanced` / `unresolvedDelta` / 轮次 / 时长**刻意不算**:
85
+ * "禁止用轮次/时长冒充进展" (types.ts §1)。
86
+ */
87
+ function hasVerifiableProgress(p) {
88
+ return p.newEvidence.length > 0 || p.newlyCompletedCriteria.length > 0;
89
+ }
90
+ /** 自治决策 (真的会往下跑): 只有它们存在"被收紧"的空间 */
91
+ const AUTONOMOUS = ['continue', 'delegate'];
92
+ function isAutonomous(k) {
93
+ return AUTONOMOUS.includes(k);
94
+ }
95
+ /**
96
+ * decision → 允许自洽出现的 state (types.ts §1: "决策时的状态 (与 decision 必须自洽)")。
97
+ * `pause` 映射到 `waiting_external`: 语义是"等用户 resume (等一个外部动作唤醒)",
98
+ * 状态枚举里没有 paused, 这是唯一自洽的选择。
99
+ */
100
+ const DECISION_STATES = {
101
+ continue: ['progressing'],
102
+ wait: ['waiting_external', 'waiting_agent'],
103
+ delegate: ['waiting_agent'],
104
+ ask_human: ['needs_decision', 'no_progress', 'blocked'],
105
+ complete: ['completed'],
106
+ fail: ['failed'],
107
+ pause: ['waiting_external'],
108
+ };
109
+ /** 低信心不是"可以忽略", 是"该问人" (types.ts §1) */
110
+ const LOW_CONFIDENCE = 0.5;
111
+ /** Run 还"没跑干净"的状态: 它们存在时不许判完成 (与 goal-store 完成门同一口径) */
112
+ const UNSETTLED_RUN_STATUSES = ['failed', 'interrupted', 'stalled'];
113
+ /**
114
+ * **还在跑**的 Run 状态 (没有给出任何结束结论的那种)。
115
+ * 单 Run 时间上限给这类 Run 计龄时必须用 `now` —— 它们的 `updatedAt` 只是"最后一次心跳",
116
+ * 用它会得出"这个跑了 3 小时的 Run 只跑了 0ms"的假结论 (P5 验收修复的一部分)。
117
+ * 注意 `failed`/`interrupted`/`stalled` 不在这个集合里但由 `UNSETTLED_RUN_STATUSES` 一起覆盖
118
+ * (它们是"已经停了但没收尾"的中间态, 同样按 now 计龄)。
119
+ */
120
+ const RUN_ACTIVE_STATUSES = ['queued', 'running'];
121
+ /** 缺权限类失败: 不重试, 交人 (run-store 的错误分类表) */
122
+ const PERMISSION_FAILURES = ['auth', 'policy_denied'];
123
+ /** 把 Draft 补成一条**字段齐全**的 `ContinuationDecision` (缺字段 = 收尾没做完) */
124
+ function finalize(draft, ctx) {
125
+ const terminal = draft.decision === 'complete' || draft.decision === 'fail';
126
+ // 未解决项变多 (unresolvedDelta > 0) 是风险信号: 只在非终态决策上抬一级
127
+ const riskLevel = !terminal && ctx.progress.unresolvedDelta > 0 ? bumpRisk(draft.riskLevel) : draft.riskLevel;
128
+ return {
129
+ // 派生自 (goalId, runId): 一个 Run 只允许一条决策, 重放不产生第二条
130
+ decisionId: `decision:${ctx.goal.goalId}:${ctx.run.runId}`,
131
+ goalId: ctx.goal.goalId,
132
+ runId: ctx.run.runId,
133
+ decision: draft.decision,
134
+ state: draft.state,
135
+ reason: draft.reason,
136
+ nextAction: draft.nextAction,
137
+ expectedOutcome: draft.expectedOutcome,
138
+ confidence: clamp01(draft.confidence),
139
+ progressDelta: {
140
+ newEvidence: [...ctx.progress.newEvidence],
141
+ newlyCompletedCriteria: [...ctx.progress.newlyCompletedCriteria],
142
+ stepsAdvanced: ctx.progress.stepsAdvanced,
143
+ unresolvedDelta: ctx.progress.unresolvedDelta,
144
+ },
145
+ unresolvedItems: [...ctx.unresolvedItems],
146
+ wakeAt: draft.wakeAt ?? null,
147
+ requiredCapability: draft.requiredCapability ?? null,
148
+ riskLevel,
149
+ stopReason: draft.stopReason ?? null,
150
+ evidenceRefs: [...ctx.evidenceRefs],
151
+ decidedAt: ctx.now,
152
+ };
153
+ }
154
+ // ─────────────────────────────────────────────────────────────────────────────
155
+ // §14 P0-1: decideContinuation
156
+ // ─────────────────────────────────────────────────────────────────────────────
157
+ function decideContinuation(input) {
158
+ const { goal, run, now, progress, noProgressStreak, hardLimits } = input;
159
+ // 合并视图: `progress` = 本轮新增、**尚未落盘**的那部分证据/判据, 与 Goal 上的历史取并集。
160
+ // 刻意**只认 Goal 上的证据 + 本轮新增** (不把 run.evidence 也算进来): 这样完成判定与
161
+ // goal-store 完成门 `evaluateGoalCompletion` 在 progress 为空时**逐例等价** (见测试 ④)。
162
+ const criteriaDone = new Set([...goal.completedCriteria, ...progress.newlyCompletedCriteria]);
163
+ const allCriteriaDone = goal.successCriteria.length > 0 && goal.successCriteria.every((_, i) => criteriaDone.has(i));
164
+ const remaining = goal.successCriteria.filter((_, i) => !criteriaDone.has(i)).length;
165
+ const evidenceRefs = uniq([...(goal.evidence ?? []), ...progress.newEvidence]).slice(-20);
166
+ const unresolvedItems = uniq(goal.unresolvedItems);
167
+ const hasProgress = hasVerifiableProgress(progress);
168
+ const ctx = { goal, run, now, progress, unresolvedItems, evidenceRefs };
169
+ const resumePoint = ((run.checkpoint?.nextAction ?? goal.continuation?.nextAction ?? '') || '').trim();
170
+ const firstUnmet = goal.successCriteria.findIndex((_, i) => !criteriaDone.has(i));
171
+ const objectiveBrief = goal.objective.slice(0, 40);
172
+ const continueNextAction = resumePoint
173
+ || (firstUnmet >= 0
174
+ ? `满足判据 [${firstUnmet}] ${goal.successCriteria[firstUnmet]}`
175
+ : `为「${objectiveBrief}」产出下一条可核验证据`);
176
+ const continueExpected = remaining > 0
177
+ ? `下一轮至少新增 1 条可核验证据, 并推进剩余 ${remaining} 条判据中的至少 1 条`
178
+ : `下一轮清掉未解决项 (${unresolvedItems.length} 项) 中的至少 1 项`;
179
+ // ⓪ 时间不可信 → 交人 (保守方向: 不因一个坏时间戳就开轮)
180
+ const nowMs = parseTs(now);
181
+ if (!Number.isFinite(nowMs)) {
182
+ return finalize({
183
+ decision: 'ask_human',
184
+ state: 'needs_decision',
185
+ reason: `now 不是可解析的时间戳 ("${now}") → 时间不可信, 不做任何自动节奏判断`,
186
+ nextAction: '等人给出可信时间戳 (或修好时钟) 后再决定是否继续',
187
+ expectedOutcome: '一个可解析的 now (ISO-8601)',
188
+ confidence: 0.2,
189
+ riskLevel: 'high',
190
+ }, ctx);
191
+ }
192
+ // ① Goal 已是终态 → 幂等 mirror (同一批事实重放, 结果一致)
193
+ if (goal.status === 'completed') {
194
+ return finalize({
195
+ decision: 'complete',
196
+ state: 'completed',
197
+ reason: `goal.status 已是 completed (${evidenceRefs.length} 条证据, 判据 ${criteriaDone.size}/${goal.successCriteria.length}) → 终态不再起新 Run`,
198
+ nextAction: '不再起新 Run; 需要继续就新建 Goal 或改判据 (改判据必须增版本号)',
199
+ expectedOutcome: '无 (终态: 没有下一步产出)',
200
+ confidence: 1,
201
+ riskLevel: 'low',
202
+ }, ctx);
203
+ }
204
+ if (goal.status === 'failed' || goal.status === 'abandoned') {
205
+ const stopReason = goal.status === 'failed' ? 'objective_unreachable' : 'out_of_scope';
206
+ return finalize({
207
+ decision: 'fail',
208
+ state: 'failed',
209
+ reason: `goal.status 已是 ${goal.status} → 判据不可能再满足 (stopReason=${stopReason})${goal.resolution?.reason ? `, 记录: ${goal.resolution.reason}` : ''}`,
210
+ nextAction: `不再起新 Run; 保留 stopReason=${stopReason} 的事实, 交人决定撤销 / 改判据 / 改计划`,
211
+ expectedOutcome: `无 (终态: stopReason=${stopReason})`,
212
+ confidence: 1,
213
+ riskLevel: 'medium',
214
+ stopReason,
215
+ }, ctx);
216
+ }
217
+ // ② 判据全满足: 过完成门才 complete, 否则问人 (不许"看着像完成"就完成)
218
+ const runUnsettled = UNSETTLED_RUN_STATUSES.includes(String(run.status));
219
+ const criteriaProposedUnconfirmed = goal.criteriaSource === 'agent_proposed' && goal.criteriaConfirmed !== true;
220
+ const criteriaUntrusted = criteriaProposedUnconfirmed || goal.criteriaConfirmed === false;
221
+ if (allCriteriaDone) {
222
+ if (criteriaUntrusted) {
223
+ return finalize({
224
+ decision: 'ask_human',
225
+ state: 'needs_decision',
226
+ reason: `判据 ${criteriaDone.size}/${goal.successCriteria.length} 已全满足, 但判据${criteriaProposedUnconfirmed ? '是 agent 提的候选、未经人确认' : '未被确认'} → 不许判完成, 需人确认判据 (criteriaVersion=${goal.criteriaVersion ?? 1})`,
227
+ nextAction: '等人确认判据 (确认后才会走完成门)',
228
+ expectedOutcome: '人对判据的确认 (criteriaConfirmed=true)',
229
+ confidence: 0.3,
230
+ riskLevel: 'medium',
231
+ }, ctx);
232
+ }
233
+ if (evidenceRefs.length === 0) {
234
+ return finalize({
235
+ decision: 'ask_human',
236
+ state: 'needs_decision',
237
+ reason: `判据 ${criteriaDone.size}/${goal.successCriteria.length} 已全满足, 但**一条证据都没有** → 不许判完成 (漂亮但无证据不算完成)`,
238
+ nextAction: '等人确认要补哪些证据, 或指认哪条已有事实可作证据',
239
+ expectedOutcome: '至少 1 条可核验证据引用 (路径 / 哈希 / 回执 / run 步骤号)',
240
+ confidence: 0.3,
241
+ riskLevel: 'medium',
242
+ }, ctx);
243
+ }
244
+ if (!runUnsettled && unresolvedItems.length === 0) {
245
+ return finalize({
246
+ decision: 'complete',
247
+ state: 'completed',
248
+ reason: `判据 ${criteriaDone.size}/${goal.successCriteria.length} 全满足 + 证据 ${evidenceRefs.length} 条 + 无未解决项 + 最近 Run 状态 ${run.status} (已收干净) → 完成门通过`,
249
+ nextAction: '不再起新 Run (目标已结束); 需要继续就新建 Goal 或改判据 (改判据必须增版本号)',
250
+ expectedOutcome: '无 (终态: 没有下一步产出)',
251
+ confidence: 1,
252
+ riskLevel: 'low',
253
+ }, ctx);
254
+ }
255
+ // 判据全满足但最近 Run 没跑干净 / 还有未解决项 → 不完成, 继续走下面的规则 (该重跑就重跑)
256
+ }
257
+ // ③ 三类硬底线 (安全线, 不是节奏): 命中即"必须停", 一律交人 ——— 不许自动开下一轮
258
+ const breaker = isCount(hardLimits.noProgressCircuitBreaker) ? hardLimits.noProgressCircuitBreaker : 1;
259
+ // ★ 2026-09-25 (P5 首修 + M5 真跑复修): 「本轮跑了多久」= **这一段 Run 自己的时长** ——
260
+ // 只有**真的还在跑** (`queued`/`running`) 才用 now 计龄; 其余状态 (done/failed/aborted/
261
+ // interrupted/stalled/paused/awaiting_external/needs_human) 的 `updatedAt` 就是**状态机写它的
262
+ // 那一刻** (= 这一段的结束时刻), 用它算 = 这条 Run 实际跑了多久。
263
+ // P5 首修只把"已结束/已收干净"的挪到 updatedAt, 把 failed/interrupted/stalled 仍留在 now 一档
264
+ // (当时的顾虑: 它们的 updatedAt 会不会只是"最后一次心跳") —— M5 真跑证明这个顾虑不成立而代价很大:
265
+ // ① Run 失败后等退避 > 30min → 下一轮被"单 Run 时间上限"拦下 (M5-① 反事实 · 无进展熔断那条);
266
+ // ② Run 停在等外部 > 30min → 事件到达后开不了下一轮 (M5-⑤);
267
+ // ③ 失败 + 等 wakeAt > 30min → 定时唤醒被硬底线吃掉 (M5-⑤ wakeAt 段)。
268
+ // 三处都是"**等待**被算成了**超时**": 安全线的语义是"这条 Run 跑了太久", 不是"这条 Run 停了太久"。
269
+ // 安全线本身不放松: 还在跑的 (queued/running) 超长 Run 仍然照拦 (用 now 计龄) —— P5 ⑥ 的阴性对照用例不变。
270
+ // 缺/坏时间戳时退回 now (= 旧行为, 门禁只会更严不会更松)。
271
+ const runUpdatedMs = parseTs(run.updatedAt);
272
+ const runActive = RUN_ACTIVE_STATUSES.includes(String(run.status));
273
+ const runEndMs = runActive || !Number.isFinite(runUpdatedMs) ? nowMs : runUpdatedMs;
274
+ const runElapsedMs = runEndMs - parseTs(run.startedAt);
275
+ if (isPosFinite(hardLimits.maxRunDurationMs) && Number.isFinite(runElapsedMs) && runElapsedMs > hardLimits.maxRunDurationMs) {
276
+ return finalize({
277
+ decision: 'ask_human',
278
+ state: 'needs_decision',
279
+ reason: `本轮已超出单 Run 时间上限 (${runElapsedMs}ms > ${hardLimits.maxRunDurationMs}ms, 从 ${run.startedAt} 到 ${runActive ? now : run.updatedAt}${runActive ? ' (仍在跑)' : ' (已结束)'}) → 硬底线是安全线: 不许自动开下一轮`,
280
+ nextAction: '等人决定: 放宽单 Run 时间上限 / 拆小目标 / 改计划后再开新 Run',
281
+ expectedOutcome: '人对单 Run 时间上限的一个取舍',
282
+ confidence: 0.3,
283
+ riskLevel: 'high',
284
+ }, ctx);
285
+ }
286
+ const maxRuns = goal.budget?.maxRuns;
287
+ if (isCount(maxRuns) && (goal.runs?.length ?? 0) >= maxRuns) {
288
+ return finalize({
289
+ decision: 'ask_human',
290
+ state: 'blocked',
291
+ reason: `单 Goal 预算用尽: 已跑 ${goal.runs?.length ?? 0} 个 Run, 达到 budget.maxRuns=${maxRuns} (硬底线)`,
292
+ nextAction: '等人追加预算 (扩预算不许 Agent 自动批) 或缩小范围',
293
+ expectedOutcome: '人对预算的一个取舍 (追加 / 缩小范围 / 终止)',
294
+ confidence: 0.3,
295
+ riskLevel: 'high',
296
+ }, ctx);
297
+ }
298
+ const deadlineMs = goal.budget?.deadlineMs;
299
+ const goalElapsedMs = nowMs - parseTs(goal.createdAt);
300
+ if (isPosFinite(deadlineMs) && Number.isFinite(goalElapsedMs) && goalElapsedMs > deadlineMs) {
301
+ return finalize({
302
+ decision: 'ask_human',
303
+ state: 'blocked',
304
+ reason: `单 Goal 预算用尽: 已过 ${goalElapsedMs}ms, 超过 budget.deadlineMs=${deadlineMs}ms (硬底线)`,
305
+ nextAction: '等人决定: 延长 deadline / 缩小范围 / 终止目标',
306
+ expectedOutcome: '人对 deadline 的一个取舍',
307
+ confidence: 0.3,
308
+ riskLevel: 'high',
309
+ }, ctx);
310
+ }
311
+ if (!hasProgress && noProgressStreak >= breaker) {
312
+ return finalize({
313
+ decision: 'ask_human',
314
+ state: 'no_progress',
315
+ reason: `连续 ${noProgressStreak} 个 Run 无新证据 / 无新判据, 达到无进展熔断阈值 ${breaker} → 熔断, 不许再自动跑 (第几轮本来就不是继续的依据)`,
316
+ nextAction: '等人决定: 改判据 / 改计划 / 补条件 / 撤销目标, 并说明下一轮该产出什么证据',
317
+ expectedOutcome: '人给出的一个方向性取舍 (不是"再跑一轮看看")',
318
+ confidence: 0.3,
319
+ riskLevel: 'high',
320
+ }, ctx);
321
+ }
322
+ // ④ Supervisor 已判失速 (goal.status='stalled')
323
+ if (goal.status === 'stalled') {
324
+ return finalize({
325
+ decision: 'ask_human',
326
+ state: 'no_progress',
327
+ reason: `goal.status 已是 stalled (Supervisor 已判失速), 本轮新增证据 ${progress.newEvidence.length} 条 / 新判据 ${progress.newlyCompletedCriteria.length} 条`,
328
+ nextAction: '等人决定终止 / 改判据 / 补条件后重开',
329
+ expectedOutcome: '人对失速目标的一个取舍',
330
+ confidence: 0.3,
331
+ riskLevel: 'high',
332
+ }, ctx);
333
+ }
334
+ // ⑤ 不可恢复的 Run 失败 (错误分类表: 这几种不是"这次没跑好")
335
+ const errorClass = run.errorClass;
336
+ if (run.status === 'failed' && errorClass && PERMISSION_FAILURES.includes(String(errorClass))) {
337
+ return finalize({
338
+ decision: 'ask_human',
339
+ state: 'blocked',
340
+ reason: `Run 因 ${errorClass} 失败 (缺权限/被策略拒绝): 不重试也跑不动, 人不补权限则永远停在这里`,
341
+ nextAction: '等人补齐权限 / 解除策略限制后再开新 Run',
342
+ expectedOutcome: '权限到位后重跑同一个子目标',
343
+ confidence: 0.4,
344
+ riskLevel: 'high',
345
+ }, ctx);
346
+ }
347
+ if (run.status === 'failed' && errorClass === 'persist_failed') {
348
+ return finalize({
349
+ decision: 'fail',
350
+ state: 'failed',
351
+ reason: `核心状态写不进盘 (errorClass=persist_failed): 这次运行在事实层面不存在 → 继续也改变不了结果`,
352
+ nextAction: '不再起新 Run; 先修存储/权限问题, 交人决定是否重开目标',
353
+ expectedOutcome: '无 (终态: stopReason=objective_unreachable)',
354
+ confidence: 1,
355
+ riskLevel: 'medium',
356
+ stopReason: 'objective_unreachable',
357
+ }, ctx);
358
+ }
359
+ if (run.status === 'failed' && errorClass === 'repeat_failure') {
360
+ return finalize({
361
+ decision: 'ask_human',
362
+ state: 'needs_decision',
363
+ reason: 'Run 因 repeat_failure 失败 (同一问题反复失败, 已熔断): 再自动重试只是重复消耗',
364
+ nextAction: '等人决定换方法 / 换执行者 / 改判据 / 终止',
365
+ expectedOutcome: '人给出的换法方向 (不是"再试一次")',
366
+ confidence: 0.3,
367
+ riskLevel: 'high',
368
+ }, ctx);
369
+ }
370
+ // ⑥ 等外部 / 等时间 / 等子 Agent → wait (由事件或 wakeAt 唤醒)
371
+ // ★ M5-⑤ (2026-09-25) 修正: "在等" 是 **Goal 自己的事实** (status / wakeReason / external /
372
+ // needsExternal), 不是那条 Run 的历史状态。Run 停在 `awaiting_external` 之后, 外部事件到了
373
+ // (等待事实被清、`externalResult` 落盘) 或者人 `/wake` 了 → Goal 就该继续; 只认 `run.status`
374
+ // 会把**已经满足的等待**永远当成"还在等": 事件到了、Goal 也醒了, 下一轮却仍判 wait →
375
+ // 没人跑 (M5-⑤ 真跑复现的"醒了没人管"). 没有 Goal 事实可依时才退回看 Run (老数据/崩溃留下的半份记录)。
376
+ const waitingOnDelegate = goal.continuation?.external?.expectedSource === 'delegate';
377
+ // 但"等人/已定"的状态优先: needs_human (交人)、paused (等人 resume)、终态 —— 它们各自的规则在后面,
378
+ // 不能被"等外部事实"抢走 (否则"已交人等人确认"会被改成"在等外部", 界面跟着错)。
379
+ const goalStatusBlocksWait = ['needs_human', 'paused', 'completed', 'failed', 'abandoned'].includes(String(goal.status));
380
+ const waitByGoalFacts = !goalStatusBlocksWait && (goal.status === 'awaiting_external'
381
+ || goal.continuation?.wakeReason === 'awaiting_external'
382
+ || !!goal.continuation?.external
383
+ || !!goal.continuation?.needsExternal);
384
+ const waiting = waitByGoalFacts
385
+ || (run.status === 'awaiting_external' && !goal.continuation) // 只有 Run 事实 (缺 Goal 记录) 时才认它
386
+ || goal.status === 'retry_wait'
387
+ || (run.status === 'failed' && errorClass === 'external_no_reply');
388
+ if (waiting) {
389
+ const wakeAt = goal.continuation?.wakeAt ?? null;
390
+ const needsExternal = goal.continuation?.needsExternal ?? null;
391
+ const what = waitingOnDelegate
392
+ ? `等子 Agent 回报 (work 未回, 由它回报后唤醒)`
393
+ : needsExternal
394
+ ? `等外部回应 (${needsExternal})`
395
+ : wakeAt
396
+ ? `等到 ${wakeAt} 再跑`
397
+ : '等外部事件 (没有 wakeAt, 只能由事件唤醒)';
398
+ return finalize({
399
+ decision: 'wait',
400
+ state: waitingOnDelegate ? 'waiting_agent' : 'waiting_external',
401
+ reason: `本轮在等外部: run.status=${run.status} / goal.status=${goal.status}${errorClass ? ` / errorClass=${errorClass}` : ''}; ${what}${wakeAt ? `, wakeAt=${wakeAt}` : ''}`,
402
+ nextAction: `${what}${resumePoint ? `; 唤醒后从 "${resumePoint}" 继续` : ''}`,
403
+ expectedOutcome: '收到对应的外部回应或到点唤醒, 然后开下一轮',
404
+ confidence: 0.7,
405
+ wakeAt,
406
+ riskLevel: 'low',
407
+ }, ctx);
408
+ }
409
+ // ⑦ 人主动暂停 (不是自动决策)
410
+ if (goal.status === 'paused' || run.status === 'paused') {
411
+ return finalize({
412
+ decision: 'pause',
413
+ state: 'waiting_external',
414
+ reason: `人主动暂停 (goal.status=${goal.status} / run.status=${run.status}) → 只有用户 resume 才会继续, 不自动唤醒`,
415
+ nextAction: '等用户 resume (paused 不是自动决策, 也不由本判定器解除)',
416
+ expectedOutcome: '用户 resume 后开下一轮',
417
+ confidence: 1,
418
+ riskLevel: 'low',
419
+ }, ctx);
420
+ }
421
+ // ⑧ 目标等人
422
+ if (goal.status === 'needs_human') {
423
+ return finalize({
424
+ decision: 'ask_human',
425
+ state: 'needs_decision',
426
+ reason: `goal.status=needs_human (等人 approve / 取舍)${goal.continuation?.wakeReason ? `, wakeReason=${goal.continuation.wakeReason}` : ''}${goal.continuation?.needsExternal ? `, 等: ${goal.continuation.needsExternal}` : ''}`,
427
+ nextAction: '等人给出判据 / 预算 / 权限 / 取舍上的决定, 再开下一轮',
428
+ expectedOutcome: `人给出的一个决定 (${goal.continuation?.needsExternal ?? '判据 / 预算 / 权限 / 取舍'})`,
429
+ confidence: 0.3,
430
+ riskLevel: 'medium',
431
+ }, ctx);
432
+ }
433
+ // ⑨ 有可核验进展 → 继续 (唯一有资格"继续"的东西)
434
+ if (hasProgress) {
435
+ const strong = progress.newEvidence.length > 0 && progress.newlyCompletedCriteria.length > 0;
436
+ return finalize({
437
+ decision: 'continue',
438
+ state: 'progressing',
439
+ reason: `本轮有可核验进展: 新增证据 ${progress.newEvidence.length} 条, 新满足判据 [${progress.newlyCompletedCriteria.join(', ')}] (剩余 ${remaining} 条判据, 未解决项 ${unresolvedItems.length} 项) → 直接开下一轮`,
440
+ nextAction: continueNextAction,
441
+ expectedOutcome: continueExpected,
442
+ confidence: strong ? 0.95 : 0.85,
443
+ riskLevel: strong && unresolvedItems.length === 0 ? 'low' : 'medium',
444
+ }, ctx);
445
+ }
446
+ // ⑩ 目标声明了未就绪的必需能力 → delegate (下一步该派给具备该能力的执行者)
447
+ // '?' 前缀 = 可选, 不构成必需能力 (goal-store: "前缀 '?' = 可选")
448
+ const requiredSkills = (goal.requiredSkills ?? []).filter((s) => !s.startsWith('?'));
449
+ const frozenSkills = new Set((goal.skillSnapshot ?? []).map((s) => s.name));
450
+ const missingCapability = requiredSkills.find((s) => !frozenSkills.has(s));
451
+ if (missingCapability) {
452
+ return finalize({
453
+ decision: 'delegate',
454
+ state: 'waiting_agent',
455
+ reason: `本轮没有新证据 (新增证据 0 条 / 新判据 0 条, 未达熔断阈值 ${breaker}), 且目标声明的必需能力「${missingCapability}」不在本节点已冻结的技能快照里 → 继续也改变不了结果, 该派活`,
456
+ nextAction: `签 AgentWorkContract: 把需要「${missingCapability}」的单一子目标派给具备该能力的执行者 (限工具 + 预算上限 + 成功判据 + 必带证据)`,
457
+ expectedOutcome: `带回符合 reportSchema 的结构化回报 (含逐条证据), 覆盖能力「${missingCapability}」`,
458
+ confidence: 0.6,
459
+ requiredCapability: missingCapability,
460
+ riskLevel: 'medium',
461
+ }, ctx);
462
+ }
463
+ // ⑪ 以上都不成立: 本轮没有新证据 → 不许自动继续 (没有证据就没有继续的资格)
464
+ const criteriaHint = allCriteriaDone
465
+ ? `; 判据 ${criteriaDone.size}/${goal.successCriteria.length} 已全满足, 但完成门不放行 (最近 Run 状态 ${run.status}${runUnsettled ? ' (没跑干净)' : ''}, 未解决项 ${unresolvedItems.length} 项) → 也不许自动继续`
466
+ : '';
467
+ return finalize({
468
+ decision: 'ask_human',
469
+ state: 'needs_decision',
470
+ reason: `本轮没有新的可核验证据 / 新满足判据 (stepsAdvanced=${progress.stepsAdvanced} 不算进展), 无进展 ${noProgressStreak} 轮 < 熔断阈值 ${breaker} → 没有"继续"的资格, 需人定夺${criteriaHint}`,
471
+ nextAction: '等人确认是否值得再跑一轮, 并指定下一轮必须产出什么证据',
472
+ expectedOutcome: '人指定的一条可核验证据 (路径 / 哈希 / 回执 / run 步骤号)',
473
+ confidence: 0.3,
474
+ riskLevel: 'medium',
475
+ }, ctx);
476
+ }
477
+ // ─────────────────────────────────────────────────────────────────────────────
478
+ // §14 P0-2: applyHardLimits (只能收紧)
479
+ // ─────────────────────────────────────────────────────────────────────────────
480
+ /**
481
+ * 把三类硬底线套到一条决策上 —— **只能收紧, 永不放开**:
482
+ * - 非自治决策 (`wait` / `ask_human` / `pause` / `complete` / `fail`) 原样返回 (对象同一引用);
483
+ * - 自治决策 (`continue` / `delegate`) 只要命中一条"安全线不可用", 就降级为 `ask_human`,
484
+ * 并且 `riskLevel` 只许往上抬, `wakeAt` / `requiredCapability` 清空 (不再自动跑, 也不派遣)。
485
+ *
486
+ * "安全线不可用" 的判据 (每一条都是"没有它就不该自动继续"):
487
+ * 1. `continue` 自称自治, 但 `progressDelta` 里没有任何新证据 / 新判据
488
+ * (禁止用轮次/时长/步数冒充进展) —— 只对 `continue` 生效: `delegate` 的资格来自
489
+ * "缺能力", 它本来就不需要进展证据;
490
+ * 2. `noProgressCircuitBreaker` 不是 >=1 的整数 (熔断阈值未定义);
491
+ * 3. `maxRunDurationMs` 不是正有限数 (单 Run 时间上限未定义);
492
+ * 4. `maxGoalBudget === null` (未设上限 → **必须由人显式确认**, 见 types.ts §1) 或非法。
493
+ */
494
+ function applyHardLimits(d, limits) {
495
+ if (!isAutonomous(d.decision))
496
+ return d;
497
+ const blockedBy = [];
498
+ if (d.decision === 'continue' && !hasVerifiableProgress(d.progressDelta)) {
499
+ blockedBy.push('决策自称 continue 但 progressDelta 里没有新证据/新判据 (禁止用轮次/时长/步数冒充进展)');
500
+ }
501
+ if (!isCount(limits.noProgressCircuitBreaker)) {
502
+ blockedBy.push(`无进展熔断阈值未定义 (${String(limits.noProgressCircuitBreaker)}: 需要 >=1 的整数)`);
503
+ }
504
+ if (!isPosFinite(limits.maxRunDurationMs)) {
505
+ blockedBy.push(`单 Run 时间上限未定义 (${String(limits.maxRunDurationMs)}: 需要正的有限毫秒数)`);
506
+ }
507
+ if (limits.maxGoalBudget === null) {
508
+ blockedBy.push('未设单 Goal 预算上限 → 必须由人显式确认才能继续');
509
+ }
510
+ else if (!isPosFinite(limits.maxGoalBudget)) {
511
+ blockedBy.push(`单 Goal 预算上限非法 (${String(limits.maxGoalBudget)})`);
512
+ }
513
+ if (blockedBy.length === 0)
514
+ return d;
515
+ return {
516
+ ...d,
517
+ decision: 'ask_human',
518
+ state: 'needs_decision',
519
+ reason: `${d.reason} | 硬底线收紧: ${blockedBy.join('; ')}`,
520
+ nextAction: '等人确认预算上限 / 时间上限 / 熔断阈值, 以及本决策是否值得继续',
521
+ expectedOutcome: '人对硬底线的一个确认 (设上限 / 降范围 / 终止)',
522
+ wakeAt: null,
523
+ requiredCapability: null,
524
+ riskLevel: bumpRisk(d.riskLevel),
525
+ stopReason: null,
526
+ // confidence 不变: 收紧是"资格"问题, 不是"信心"问题; 而 ask_human 本身不因信心放行
527
+ };
528
+ }
529
+ // ─────────────────────────────────────────────────────────────────────────────
530
+ // §14 P0-3: isRunnable
531
+ // ─────────────────────────────────────────────────────────────────────────────
532
+ /**
533
+ * 这条决策"现在能不能直接起下一轮" —— 最后一道路闸, 只回答 yes/no + 结构化 reason。
534
+ *
535
+ * 拒绝的情形 (每一条都对应类型面的一句硬规则):
536
+ * - `now` 不可解析 (时间不可信) · `confidence` 越界 (决策不完整)
537
+ * - `decision` 与 `state` 不自洽 (types.ts §1: 两者必须自洽)
538
+ * - 终态 `complete` / `fail`: 不再起新 Run
539
+ * - `pause` / `ask_human`: 等人, 不自动继续
540
+ * - `delegate` 缺 `requiredCapability` 或缺 `nextAction`: 决策不完整, 不许派遣
541
+ * - `continue` / `delegate` 信心 < 0.5: "低信心不是可以忽略, 是该问人"
542
+ * - `wait`: `wakeAt === null` = 等事件 (不按时间跑); `wakeAt` 已到 = 可以跑; 未到 = 不跑
543
+ */
544
+ function isRunnable(d, now) {
545
+ const no = (reason) => ({ runnable: false, reason });
546
+ const nowMs = parseTs(now);
547
+ if (!Number.isFinite(nowMs))
548
+ return no(`now 不可解析 ("${now}"): 时间不可信 → 不自动继续`);
549
+ if (typeof d.confidence !== 'number' || !Number.isFinite(d.confidence) || d.confidence < 0 || d.confidence > 1) {
550
+ return no(`confidence 越界 (${String(d.confidence)}): 决策不完整 → 不自动继续`);
551
+ }
552
+ const allowed = DECISION_STATES[d.decision];
553
+ if (!allowed)
554
+ return no(`未知 decision (${String(d.decision)}): 不自动继续`);
555
+ if (!allowed.includes(d.state)) {
556
+ return no(`decision=${d.decision} 与 state=${d.state} 不自洽: 不自动继续`);
557
+ }
558
+ switch (d.decision) {
559
+ case 'complete':
560
+ return no('目标已完成: 不再起新 Run');
561
+ case 'fail':
562
+ return no(`目标判为不可达 (stopReason=${d.stopReason ?? '缺失'}): 不再起新 Run`);
563
+ case 'pause':
564
+ return no('人主动暂停: 等用户 resume, 不自动继续');
565
+ case 'ask_human':
566
+ return no(`需要人决定 (state=${d.state}): 不自动继续`);
567
+ case 'delegate': {
568
+ const cap = (d.requiredCapability ?? '').trim();
569
+ if (!cap)
570
+ return no('delegate 缺 requiredCapability: 决策不完整 → 不派遣');
571
+ if (d.confidence < LOW_CONFIDENCE)
572
+ return no(`delegate 信心 ${d.confidence} < ${LOW_CONFIDENCE}: 低信心该问人, 不派遣`);
573
+ if (!d.nextAction.trim())
574
+ return no('delegate 缺 nextAction: 决策不完整 → 不派遣');
575
+ return { runnable: true, reason: `可派遣: 需要能力「${cap}」` };
576
+ }
577
+ case 'continue': {
578
+ if (d.confidence < LOW_CONFIDENCE)
579
+ return no(`continue 信心 ${d.confidence} < ${LOW_CONFIDENCE}: 低信心该问人, 不自动继续`);
580
+ if (!d.nextAction.trim())
581
+ return no('continue 缺 nextAction (下一步做什么): 决策不完整 → 不自动继续');
582
+ return { runnable: true, reason: '有可核验进展: 可直接开下一个 Run' };
583
+ }
584
+ case 'wait': {
585
+ if (d.wakeAt === null)
586
+ return no(`等外部/等子 Agent (state=${d.state}), 没有 wakeAt: 只能由事件唤醒, 不自动继续`);
587
+ const wakeMs = parseTs(d.wakeAt);
588
+ if (!Number.isFinite(wakeMs))
589
+ return no(`wakeAt 不可解析 ("${d.wakeAt}"): 不自动继续`);
590
+ if (wakeMs <= nowMs)
591
+ return { runnable: true, reason: `唤醒时间已到 (wakeAt=${d.wakeAt}): 可以起下一轮` };
592
+ return no(`未到唤醒时间 (wakeAt=${d.wakeAt}, 还差 ${wakeMs - nowMs}ms)`);
593
+ }
594
+ default:
595
+ return no(`未处理的 decision (${String(d.decision)}): 不自动继续`);
596
+ }
597
+ }
598
+ //# sourceMappingURL=continuation-decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuation-decision.js","sourceRoot":"","sources":["../../../../src/agents/goal-flywheel/continuation-decision.ts"],"names":[],"mappings":"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"}