@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,264 @@
1
+ "use strict";
2
+ /**
3
+ * wiring/monitor.ts — 接缝 ④「有谁卡住了, 该谁动手?」 (**M3 独占**)
4
+ *
5
+ * 归属: `seams.ts` 的 `SEAM_ROSTER` 里 `id: 'monitor'`, `stage: 'M3'`。
6
+ * M3 只准改本文件 + `wiring/contract.ts` + 声明的 `wiringPoints` (`goal-flywheel/work-monitor.ts`)。
7
+ *
8
+ * ## 这条接缝钉住的冻结规则
9
+ *
10
+ * **规则 ④ 的"子 Agent 被阻塞"那一类终止路径必须经过收尾漏斗**。
11
+ * Watchdog 只看进程存活; 这条接缝看的是"任务卡住了没有"。它只做三件事:
12
+ * ① **统一巡检** (`sweepAll` / `sweep`): 一次把**所有**待回报 Goal 的阻塞查清楚 (有界, 不静默);
13
+ * ② **按计划处理** (`handle`): 处置动作交给宿主执行 —— 接缝自己**永不自动绕过 Harness**;
14
+ * ③ **用户可见态** (`visibleState` / `createVisibleStateProbe`): 只暴露冻结层的闭集, 内部词不外泄。
15
+ *
16
+ * 阻塞升级到人 → Goal 的状态变更**不在这里直接写**, 而是交给 Goal reducer
17
+ * (规则 ②), 由接线层在 `handle` 之后调用。本文件因此没有任何 Goal 写入面。
18
+ *
19
+ * ## M3 的两处深化 (为什么不是"又一个透传壳")
20
+ *
21
+ * 1. **统一监控**: 真实 tick 里"逐个 Goal 巡检"是散在各处的循环 (`execution-supervisor.ts` 那段
22
+ * `listGoalsWithPendingWork` → `collectWorkBlocks` → `applyBlockHandling`)。`sweepAll` 把这条循环
23
+ * 收成**一次调用**: 有界扫描 + 每个 Goal 一份结论 + **失败必须留痕** (`errors[]`),
24
+ * 不许"某个 Goal 巡检抛错 → 这一轮当它不存在"。
25
+ * 2. **用户只看到闭集**: `createVisibleStateProbe` 以前是**裸透传** (`return deps.visible(input)`),
26
+ * 端口给什么就往外说什么 —— 于是"用户视野只有这几类"只是端口自觉。现在它**逐值校验闭集**
27
+ * (`USER_VISIBLE_STATES`), 闭集外的值 / 端口抛错一律**拒绝**并说清原因, 而不是把内部词
28
+ * 顺手暴露给用户。
29
+ *
30
+ * ### 五类还是六类 (如实说明, 不改冻结层)
31
+ *
32
+ * 设计稿 §8 写的是"用户可见只暴露**五类**": 正在执行 / 等待外部回复 / 子 Agent 被阻塞 /
33
+ * 暂时没有进展 / 需要你决定。冻结层 (`types.ts`) 在 2026-09-25 接线时**追加了第 6 类** `ended`
34
+ * (理由: 前五类里没有"已结束", 已结束的目标只能借用 `executing` 或 `needs_your_decision`,
35
+ * 那正是 P3/P4 要防的假象)。改冻结层要单独一个提交 + 更新类型计数门, **不归 M3**。
36
+ * 所以本接缝按**冻结闭集** (五类 + `ended`) 钉住: 断言"返回值只能是闭集里的值"是硬的,
37
+ * 断言"闭集有几个值"留给冻结层 (`goal-flywheel-types.test.ts` 的计数门)。
38
+ */
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.INTERNAL_VISIBLE_WORDS = exports.USER_FACING_STATES = exports.MONITOR_SWEEP_MAX_LIMIT = exports.MONITOR_SWEEP_DEFAULT_LIMIT = exports.MONITOR_SEAM_ID = void 0;
41
+ exports.isUserVisibleState = isUserVisibleState;
42
+ exports.scanInternalLeak = scanInternalLeak;
43
+ exports.userFacingState = userFacingState;
44
+ exports.createMonitorSeam = createMonitorSeam;
45
+ exports.createVisibleStateProbe = createVisibleStateProbe;
46
+ exports.describeVisibleState = describeVisibleState;
47
+ const types_js_1 = require("../types.js");
48
+ // 自己那个阶段的实现模块 (P3, 纯函数): "用户该看到哪一类"的判定只有一份
49
+ const work_monitor_js_1 = require("../work-monitor.js");
50
+ const seams_js_1 = require("./seams.js");
51
+ exports.MONITOR_SEAM_ID = 'monitor';
52
+ /** 统一巡检的默认/上限 (有界: 不许在 tick 里无界扫盘) */
53
+ exports.MONITOR_SWEEP_DEFAULT_LIMIT = 20;
54
+ exports.MONITOR_SWEEP_MAX_LIMIT = 200;
55
+ function errText(e) {
56
+ return String(e?.message || e).slice(0, 300);
57
+ }
58
+ // ============================================================================
59
+ // §1. 用户可见面: 闭集校验 + 内部词扫描 (纯函数, 可被门/变异验证复用)
60
+ // ============================================================================
61
+ /**
62
+ * 一个 continuation 决策是否长得像 `ContinuationDecision` (只做形状检查, 不猜内容)。
63
+ * 用它把 `decision?: unknown` 安全地喂给真 P3 判定: 不像就传 null (宁可少一层精化, 不许瞎 cast)。
64
+ */
65
+ function isDecisionLike(x) {
66
+ if (!x || typeof x !== 'object')
67
+ return false;
68
+ const d = x;
69
+ return typeof d.decision === 'string' || typeof d.state === 'string';
70
+ }
71
+ /** 用户可见态的**闭集** (冻结层唯一事实来源; 本文件不另立一份) */
72
+ exports.USER_FACING_STATES = types_js_1.USER_VISIBLE_STATES;
73
+ function isUserVisibleState(x) {
74
+ return typeof x === 'string' && exports.USER_FACING_STATES.includes(x);
75
+ }
76
+ /**
77
+ * **不该出现在用户视野里**的内部词 (设计 §8 的名单 + 同义写法)。
78
+ *
79
+ * 为什么连 `retry_count` / `leaseOwner` 这种代码标识也扫: 界面拼字符串时最常干的事就是
80
+ * 把内部字段名顺手带出去 (`lease owner=worker-3`), 只扫中文词会漏掉这一类。
81
+ */
82
+ exports.INTERNAL_VISIBLE_WORDS = [
83
+ 'lease',
84
+ 'leaseOwner',
85
+ 'lease_until',
86
+ 'reducer',
87
+ 'internal status',
88
+ 'retry counter',
89
+ 'retryCounter',
90
+ 'retry_count',
91
+ 'worker owner',
92
+ 'workerOwner',
93
+ 'attempts',
94
+ '抢租约',
95
+ '租约',
96
+ '内部状态',
97
+ '重试计数',
98
+ ];
99
+ /** 扫出文本里出现的内部词 (空数组 = 干净)。大小写不敏感; 只报词, 不改文本。 */
100
+ function scanInternalLeak(text) {
101
+ const s = String(text ?? '');
102
+ if (!s)
103
+ return [];
104
+ const lower = s.toLowerCase();
105
+ const hits = [];
106
+ for (const w of exports.INTERNAL_VISIBLE_WORDS) {
107
+ if (lower.includes(w.toLowerCase()))
108
+ hits.push(w);
109
+ }
110
+ return hits;
111
+ }
112
+ /** 闭集里的一个状态 → 用户看到的**全部**内容 (只有这三样, 没有内部字段) */
113
+ function userFacingState(state) {
114
+ if (!isUserVisibleState(state)) {
115
+ return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', `拒绝: 用户可见态 ${JSON.stringify(state) ?? String(state)} 不在冻结闭集里 `
116
+ + `(${exports.USER_FACING_STATES.join(' / ')}) —— 用户可见态是 continuation 的投影, 不许第三方编一个状态出来`);
117
+ }
118
+ const labels = types_js_1.USER_VISIBLE_STATE_LABELS[state];
119
+ return { state, zh: labels.zh, en: labels.en };
120
+ }
121
+ // ============================================================================
122
+ // §2. 接缝本体
123
+ // ============================================================================
124
+ function createMonitorSeam(deps) {
125
+ // 可见面来源: 宿主注入的 `visible` 优先; 否则用**真 P3** 的判定 (注入的 continuation 是它的输入)。
126
+ // 两条路都不通 ⇒ 探针会如实拒绝 (不编一个"正在执行")。
127
+ const visiblePort = deps.visible ?? (deps.continuationOf
128
+ ? async (input) => {
129
+ const raw = await deps.continuationOf(input.goalId);
130
+ // 盘上的 continuation 允许缺字段 (goal-store 的 `pendingReports?` 是 optional; `setContinuation`
131
+ // 又是部分覆盖) —— 归一化只有**一份**实现 (`work-monitor.normalizeContinuationRecord`),
132
+ // 判定层(`toUserVisibleState`)自己也调它; 这里用同一个函数是为了让"接缝这一路也没传半份记录"可读。
133
+ const continuation = (0, work_monitor_js_1.normalizeContinuationRecord)(raw);
134
+ const decision = isDecisionLike(input.decision) ? input.decision : null;
135
+ return (0, work_monitor_js_1.toUserVisibleState)(continuation, input.blocks ?? [], decision);
136
+ }
137
+ : undefined);
138
+ const visibleOrRefuse = createVisibleStateProbe({ visible: visiblePort });
139
+ return {
140
+ id: exports.MONITOR_SEAM_ID,
141
+ stage: 'M3',
142
+ async sweep(input) {
143
+ if (!input.goalId) {
144
+ return (0, seams_js_1.refuse)('all_terminal_paths_pass_close_run', '拒绝: 阻塞巡检没有 goalId → 拿到的是"谁都不卡"的假结论');
145
+ }
146
+ return deps.collect({ goalId: input.goalId, now: input.now, runnerAvailable: input.runnerAvailable });
147
+ },
148
+ async handle(input) {
149
+ if (!input.blocks?.length)
150
+ return { actions: [], escalated: [], takeovers: [], requests: [] };
151
+ return deps.handle({ goalId: input.goalId, blocks: input.blocks, now: input.now });
152
+ },
153
+ pendingGoals(limit) {
154
+ return deps.goalsWithPendingWork(limit);
155
+ },
156
+ /**
157
+ * 统一监控 (M3): 一次调用 = 所有待回报 Goal 的阻塞结论。
158
+ *
159
+ * 纪律:
160
+ * · **子 Agent 不许巡检别人的阻塞**: `caller='child_agent'` → 拒 (规则 ⑤, 一条都不查);
161
+ * · **有界**: `limit` 夹在 [1, 200] (默认 20) —— tick 里扫盘不许无界;
162
+ * · **不静默**: 单个 Goal 巡检/处置抛错 → 该 Goal 的 `error` 与顶层 `errors[]` 都留痕,
163
+ * 而不是"这一轮它不存在"。全失败时 `silentRisk=true` 并要求交人;
164
+ * · 没有阻塞的 Goal **也占一格** (它有待回报工作 → 用户看到的是"等待外部回复", 不是"没人管")。
165
+ */
166
+ async sweepAll(input) {
167
+ if (input.caller === 'child_agent') {
168
+ return (0, seams_js_1.refuse)('child_cannot_mutate_goal', '拒绝: 子 Agent 不许巡检/处置其它执行者的阻塞 —— 巡检与处置是父/调度器的责任面');
169
+ }
170
+ const limit = Math.min(Math.max(Math.floor(input.limit ?? exports.MONITOR_SWEEP_DEFAULT_LIMIT) || 1, 1), exports.MONITOR_SWEEP_MAX_LIMIT);
171
+ const view = {
172
+ goals: [], blockCount: 0, escalated: [], takeovers: [], requests: [],
173
+ visibleCounts: {}, errors: [], silentRisk: false,
174
+ };
175
+ let pending = [];
176
+ try {
177
+ const raw = await deps.goalsWithPendingWork(limit);
178
+ pending = Array.isArray(raw) ? raw.filter((g) => !!g?.goalId).slice(0, limit) : [];
179
+ if (!Array.isArray(raw))
180
+ view.errors.push('待回报 Goal 清单不是数组 (宿主 bug) —— 无法巡检, 不许当成"没有阻塞"');
181
+ }
182
+ catch (e) {
183
+ view.errors.push(`取待回报 Goal 清单失败: ${errText(e)}`);
184
+ view.silentRisk = true;
185
+ return view; // 拿不到事实就如实报 (不是"巡检过了, 没问题")
186
+ }
187
+ for (const g of pending) {
188
+ const cell = { goalId: g.goalId, blocks: [], handling: null, visibleState: null, error: null };
189
+ try {
190
+ const blocks = await deps.collect({ goalId: g.goalId, now: input.now, runnerAvailable: input.runnerAvailable });
191
+ cell.blocks = Array.isArray(blocks) ? blocks : [];
192
+ if (cell.blocks.length > 0) {
193
+ cell.handling = await deps.handle({ goalId: g.goalId, blocks: cell.blocks, now: input.now });
194
+ view.escalated.push(...(cell.handling?.escalated ?? []));
195
+ view.takeovers.push(...(cell.handling?.takeovers ?? []));
196
+ view.requests.push(...(cell.handling?.requests ?? []));
197
+ }
198
+ const vis = await visibleOrRefuse({ goalId: g.goalId, blocks: cell.blocks, now: input.now });
199
+ if (vis && typeof vis === 'object' && vis.ok === false) {
200
+ // 可见面拒绝 → 这一格如实留痕 (不是静默给个"正在执行")
201
+ cell.error = vis.reason;
202
+ view.errors.push(`goal=${g.goalId} 可见态: ${vis.reason}`);
203
+ }
204
+ else if (vis) {
205
+ cell.visibleState = vis;
206
+ view.visibleCounts[cell.visibleState] = (view.visibleCounts[cell.visibleState] ?? 0) + 1;
207
+ }
208
+ view.blockCount += cell.blocks.length;
209
+ }
210
+ catch (e) {
211
+ cell.error = errText(e);
212
+ view.errors.push(`goal=${g.goalId} 巡检失败: ${cell.error}`);
213
+ }
214
+ view.goals.push(cell);
215
+ }
216
+ const inspected = view.goals.filter((c) => c.error === null).length;
217
+ if (pending.length > 0 && inspected === 0) {
218
+ view.silentRisk = true;
219
+ view.escalated.push(...pending.map((g) => `巡检未完成: ${g.goalId}`));
220
+ }
221
+ return view;
222
+ },
223
+ async visibleState(input) {
224
+ return visibleOrRefuse({ goalId: input.goalId, blocks: input.blocks, decision: input.decision, now: input.now });
225
+ },
226
+ };
227
+ }
228
+ /**
229
+ * 用户可见态探针: 只回答"用户该看到哪一类", 且**只**能是冻结闭集里的值。
230
+ *
231
+ * 硬化的三件事 (旧版是 `return deps.visible(input)` 的裸透传):
232
+ * ① **闭集校验**: 端口给出闭集外的值 (或 undefined / null / 对象) → 拒绝 + 说清收到了什么 ——
233
+ * 用户视野的假象比"什么都不显示"更贵;
234
+ * ② **端口抛错不吞**: 原文进拒绝理由 (不静默降级成 `executing`);
235
+ * ③ **缺端口 = 拒**: 没有可见面来源就不编一个状态 (旧版会直接 `TypeError`)。
236
+ *
237
+ * 返回值用冻结类型 + `userFacingState` 的文案; 调用方拿到的就是用户看到的东西。
238
+ */
239
+ function createVisibleStateProbe(deps) {
240
+ return async (input) => {
241
+ if (typeof deps.visible !== 'function') {
242
+ return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', '拒绝: 没有注入用户可见面 (拿不到权威 continuation 的投影) —— 不许编一个状态给用户');
243
+ }
244
+ let raw;
245
+ try {
246
+ raw = await deps.visible(input);
247
+ }
248
+ catch (e) {
249
+ return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', `拒绝: 用户可见面抛错 (${errText(e)}) —— 不静默降级成"正在执行"`);
250
+ }
251
+ const view = userFacingState(raw);
252
+ if (view.ok === false)
253
+ return view;
254
+ return view.state;
255
+ };
256
+ }
257
+ /**
258
+ * 给界面用的**唯一**文案出口: 状态 → `{state, zh, en}` (闭集外的值直接拒绝)。
259
+ * 界面不许自己拼状态名, 也不许把内部字段带出去 (见 `scanInternalLeak`)。
260
+ */
261
+ function describeVisibleState(state) {
262
+ return userFacingState(state);
263
+ }
264
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../../../src/agents/goal-flywheel/wiring/monitor.ts"],"names":[],"mappings":"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"}