@bolloon/bolloon-agent 0.4.32 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/agents/chain/explorer.js +52 -0
  2. package/dist/agents/chain/index.js +2 -0
  3. package/dist/agents/chain/onchain-trade.js +15 -1
  4. package/dist/agents/contacts/chain.js +27 -7
  5. package/dist/agents/execution-supervisor.js +493 -35
  6. package/dist/agents/external-events.js +35 -6
  7. package/dist/agents/gateway-group.js +100 -12
  8. package/dist/agents/goal-criteria.js +10 -3
  9. package/dist/agents/goal-flywheel/block-executor.js +346 -0
  10. package/dist/agents/goal-flywheel/continuation-decision.js +592 -0
  11. package/dist/agents/goal-flywheel/goal-change.js +754 -0
  12. package/dist/agents/goal-flywheel/index.js +26 -0
  13. package/dist/agents/goal-flywheel/memory-layers.js +227 -0
  14. package/dist/agents/goal-flywheel/run-closure.js +809 -0
  15. package/dist/agents/goal-flywheel/skill-candidate.js +628 -0
  16. package/dist/agents/goal-flywheel/types.js +329 -0
  17. package/dist/agents/goal-flywheel/wiring/change.js +288 -0
  18. package/dist/agents/goal-flywheel/wiring/closure.js +697 -0
  19. package/dist/agents/goal-flywheel/wiring/continuation.js +432 -0
  20. package/dist/agents/goal-flywheel/wiring/contract.js +270 -0
  21. package/dist/agents/goal-flywheel/wiring/index.js +26 -0
  22. package/dist/agents/goal-flywheel/wiring/monitor.js +254 -0
  23. package/dist/agents/goal-flywheel/wiring/seams.js +592 -0
  24. package/dist/agents/goal-flywheel/work-contract.js +478 -0
  25. package/dist/agents/goal-flywheel/work-monitor.js +488 -0
  26. package/dist/agents/goal-flywheel-wiring.js +1870 -0
  27. package/dist/agents/goal-state-reducer.js +406 -0
  28. package/dist/agents/goal-store.js +35 -1
  29. package/dist/agents/mobile-flywheel-view.js +144 -0
  30. package/dist/agents/mobile-task-actions-verify.js +74 -0
  31. package/dist/agents/mobile-task-actions.js +178 -0
  32. package/dist/agents/mobile-task-views.js +199 -0
  33. package/dist/agents/network-pulse.js +525 -27
  34. package/dist/agents/pi-sdk.js +75 -20
  35. package/dist/agents/run-store.js +18 -5
  36. package/dist/agents/skill-readiness.js +52 -10
  37. package/dist/agents/subagent-manager.js +209 -3
  38. package/dist/agents/task/task-onchain-runner.js +19 -1
  39. package/dist/agents/task/task-runner.js +36 -6
  40. package/dist/agents/task-board.js +702 -0
  41. package/dist/agents/task-group.js +524 -0
  42. package/dist/agents/task-public-text.js +89 -0
  43. package/dist/cli/commands/index.js +3 -0
  44. package/dist/cli/commands/tasks.js +977 -8
  45. package/dist/cli/identity-command.js +177 -0
  46. package/dist/cli/protocol-envelope.js +4 -0
  47. package/dist/cli/setup-wizard.js +71 -0
  48. package/dist/cli/update-commands.js +150 -24
  49. package/dist/cli-entry.js +12 -2
  50. package/dist/electron-build/agents/chain/explorer.js +59 -0
  51. package/dist/electron-build/agents/chain/explorer.js.map +1 -0
  52. package/dist/electron-build/agents/contacts/chain.js +26 -6
  53. package/dist/electron-build/agents/contacts/chain.js.map +1 -1
  54. package/dist/electron-build/agents/execution-supervisor.js +492 -34
  55. package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
  56. package/dist/electron-build/agents/external-events.js +34 -5
  57. package/dist/electron-build/agents/external-events.js.map +1 -1
  58. package/dist/electron-build/agents/goal-criteria.js +10 -3
  59. package/dist/electron-build/agents/goal-criteria.js.map +1 -1
  60. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js +598 -0
  61. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js.map +1 -0
  62. package/dist/electron-build/agents/goal-flywheel/goal-change.js +773 -0
  63. package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -0
  64. package/dist/electron-build/agents/goal-flywheel/memory-layers.js +269 -0
  65. package/dist/electron-build/agents/goal-flywheel/memory-layers.js.map +1 -0
  66. package/dist/electron-build/agents/goal-flywheel/run-closure.js +818 -0
  67. package/dist/electron-build/agents/goal-flywheel/run-closure.js.map +1 -0
  68. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js +642 -0
  69. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js.map +1 -0
  70. package/dist/electron-build/agents/goal-flywheel/types.js +333 -0
  71. package/dist/electron-build/agents/goal-flywheel/types.js.map +1 -0
  72. package/dist/electron-build/agents/goal-flywheel/wiring/change.js +294 -0
  73. package/dist/electron-build/agents/goal-flywheel/wiring/change.js.map +1 -0
  74. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js +742 -0
  75. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js.map +1 -0
  76. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js +444 -0
  77. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js.map +1 -0
  78. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js +279 -0
  79. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js.map +1 -0
  80. package/dist/electron-build/agents/goal-flywheel/wiring/index.js +111 -0
  81. package/dist/electron-build/agents/goal-flywheel/wiring/index.js.map +1 -0
  82. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js +264 -0
  83. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js.map +1 -0
  84. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +612 -0
  85. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -0
  86. package/dist/electron-build/agents/goal-flywheel/work-contract.js +488 -0
  87. package/dist/electron-build/agents/goal-flywheel/work-contract.js.map +1 -0
  88. package/dist/electron-build/agents/goal-flywheel/work-monitor.js +501 -0
  89. package/dist/electron-build/agents/goal-flywheel/work-monitor.js.map +1 -0
  90. package/dist/electron-build/agents/goal-flywheel-wiring.js +1962 -0
  91. package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -0
  92. package/dist/electron-build/agents/goal-state-reducer.js +414 -0
  93. package/dist/electron-build/agents/goal-state-reducer.js.map +1 -0
  94. package/dist/electron-build/agents/goal-store.js +35 -1
  95. package/dist/electron-build/agents/goal-store.js.map +1 -1
  96. package/dist/electron-build/agents/local-signer.js +101 -0
  97. package/dist/electron-build/agents/local-signer.js.map +1 -0
  98. package/dist/electron-build/agents/network-pulse.js +531 -28
  99. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  100. package/dist/electron-build/agents/pi-sdk.js +74 -19
  101. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  102. package/dist/electron-build/agents/run-store.js +20 -5
  103. package/dist/electron-build/agents/run-store.js.map +1 -1
  104. package/dist/electron-build/agents/skill-readiness.js +52 -9
  105. package/dist/electron-build/agents/skill-readiness.js.map +1 -1
  106. package/dist/electron-build/agents/task/task-runner.js +35 -5
  107. package/dist/electron-build/agents/task/task-runner.js.map +1 -1
  108. package/dist/electron-build/agents/task-board.js +761 -0
  109. package/dist/electron-build/agents/task-board.js.map +1 -0
  110. package/dist/electron-build/agents/task-contract.js +382 -0
  111. package/dist/electron-build/agents/task-contract.js.map +1 -0
  112. package/dist/electron-build/orbitdb/cid-database.js +83 -17
  113. package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
  114. package/dist/electron-build/orbitdb/ipfs-node.js +31 -2
  115. package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -1
  116. package/dist/electron-build/utils/dual-source.js +471 -0
  117. package/dist/electron-build/utils/dual-source.js.map +1 -0
  118. package/dist/electron-build/utils/update-manager.js +331 -57
  119. package/dist/electron-build/utils/update-manager.js.map +1 -1
  120. package/dist/electron-build/utils/update-state.js +16 -1
  121. package/dist/electron-build/utils/update-state.js.map +1 -1
  122. package/dist/electron-build/utils/version-info.js +82 -2
  123. package/dist/electron-build/utils/version-info.js.map +1 -1
  124. package/dist/index.js +103 -12
  125. package/dist/ios/chain-explorer.js +617 -0
  126. package/dist/ios/explorer.html +163 -0
  127. package/dist/ios/index.html +96 -0
  128. package/dist/ios/mobile-agent.js +2 -2
  129. package/dist/ios/mobile-contacts.js +329 -0
  130. package/dist/ios/mobile-core.js +1379 -226
  131. package/dist/ios/mobile-privacy.js +185 -0
  132. package/dist/ios/mobile.css +19 -0
  133. package/dist/ios/mobile.html +96 -0
  134. package/dist/ios/mobile.js +706 -7
  135. package/dist/ios/routes-chain-index.js +108 -0
  136. package/dist/ios/routes-contacts.js +420 -0
  137. package/dist/ios/routes-onchain-trade.js +99 -0
  138. package/dist/ios/routes-x402-info.js +1 -0
  139. package/dist/ios/server.js +762 -0
  140. package/dist/ios/task-frame-server.js +211 -0
  141. package/dist/orbitdb/cid-database.js +81 -16
  142. package/dist/orbitdb/ipfs-node.js +31 -2
  143. package/dist/utils/dual-source.js +426 -0
  144. package/dist/utils/update-cli.js +16 -21
  145. package/dist/utils/update-health.js +35 -5
  146. package/dist/utils/update-manager.js +329 -57
  147. package/dist/utils/update-state.js +16 -1
  148. package/dist/utils/version-info.js +75 -1
  149. package/dist/web/mobile-contacts.js +44 -11
  150. package/dist/web/mobile-core.js +1197 -513
  151. package/dist/web/mobile-tasks.js +339 -0
  152. package/dist/web/mobile.css +19 -0
  153. package/dist/web/mobile.html +64 -0
  154. package/dist/web/mobile.js +531 -1
  155. package/dist/web/routes-mobile-tasks.js +353 -0
  156. package/dist/web/server.js +163 -4
  157. package/package.json +3 -1
@@ -0,0 +1,488 @@
1
+ "use strict";
2
+ /**
3
+ * goal-flywheel/work-contract.ts — P2 「子 Agent 工作合同」(独立模块, **未接线**)
4
+ *
5
+ * 解决的问题 (设计 §7 / §14 P2): 现在子 Agent "回一段文本也能算数"。
6
+ * 这一层给出**唯一**的派遣前契约 (`AgentWorkContract`) 与**结构化回报**的核验,
7
+ * 让父能明确回答三件事:
8
+ * ① 这份合同签得合不合法 —— 缺目标 / 缺判据 / deadline 早于 now / 金额没币种 → **拒签** (抛错)
9
+ * ② 这份回报够不够格 —— 缺字段 / 缺判据证据 / 越界 (`ChildProhibition`)
10
+ * ③ 能不能算「完成」 —— 只有: 状态 `completed` + 报告完整 + 逐条判据有证据 + 没越界 + 没超期
11
+ *
12
+ * 边界 (刻意不做, 与设计 §13 一致):
13
+ * - **不做 I/O, 不读真实钟**: 时间一律由 `now` / `deadline` / `reportedAt` 注入;
14
+ * 本文件不 import `fs` / `node:*` / 任何阶段的实现文件, 只 import `./types.js` 的类型与枚举。
15
+ * - **不改现有调用方**: `execution-supervisor.ts` / `goal-store.ts` / `pi-sdk.ts` / watchdog 一律没碰。
16
+ * 派遣时签合同、收到回报时核验 —— 那是接线 (单一所有者) 后续的事。
17
+ * - **不做监控**: "多久没心跳 / 要不要接管" 是 P3 (`work-monitor.ts`) 的事;
18
+ * 本文件只核验报告内容, 不判断时间流逝 (因此 `acceptsAsComplete` 没有 `now` 参数)。
19
+ *
20
+ * 回报协议 (`bolloon-work-report/1`, 即合同里的 `reportSchema`):
21
+ * - 每条 `successCriteria` 都要有**两件**东西:
22
+ * ① 一条证据: `WorkEvidence.kind` 或 `.ref` === `criterion:<判据原文>`
23
+ * ② 一条检查: `WorkCheck.name` === `criterion:<判据原文>` 且 `verdict === 'pass'`
24
+ * - `issueWorkContract` 把这条约定**写进合同的 `requiredEvidence`**, 子不需要猜。
25
+ * - 对自称 `completed` 的报告: 上述任意一条缺失 → 判越界 `mark_unverified_as_complete`
26
+ * (设计 §10 强负例 7: 漂亮但无证据的结果 → 父 Goal **不完成**)。
27
+ * - 非 `completed` 的报告 (`partial` / `blocked` / `failed` / `cancelled`) **允许**判据未满足
28
+ * (被卡住本来就拿不到证据, 硬要证据只会逼出假证据), 但仍然必须带**至少一条**证据
29
+ * (禁"只回一段文本"), 且 `blocked` 必须给结构化 `BlockRecord` (禁写成一句"有问题")。
30
+ *
31
+ * 无法从回报核验的两条禁则 (`mutate_parent_goal_state` / `spawn_unbounded_subtasks`):
32
+ * 回报里**没有对应字段**, 本文件**不假装**能查 —— 见 `NOT_CHECKABLE_FROM_REPORT`,
33
+ * 由监控层 / 接线层拦。
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.WorkContractError = exports.NOT_CHECKABLE_FROM_REPORT = exports.REPORT_CHECKABLE_PROHIBITIONS = exports.DEFAULT_CANCEL_POLICY = exports.DEFAULT_FAILURE_POLICY = exports.MAX_HEARTBEAT_INTERVAL_MS = exports.MIN_HEARTBEAT_INTERVAL_MS = exports.DEFAULT_HEARTBEAT_INTERVAL_MS = exports.CRITERION_REF_PREFIX = exports.WORK_REPORT_SCHEMA = void 0;
37
+ exports.criterionRef = criterionRef;
38
+ exports.stableHash = stableHash;
39
+ exports.issueWorkContract = issueWorkContract;
40
+ exports.validateChildReport = validateChildReport;
41
+ exports.acceptsAsComplete = acceptsAsComplete;
42
+ const types_js_1 = require("./types.js");
43
+ // ============================================================================
44
+ // §0. 常量与默认值 (合同里没有入参的字段, 默认值在这里一份写死)
45
+ // ============================================================================
46
+ /** 回报协议名 (写进合同的 `reportSchema`) */
47
+ exports.WORK_REPORT_SCHEMA = 'bolloon-work-report/1';
48
+ /** 判据引用前缀: `criterion:<判据原文>` —— 证据与检查都按这个名字对齐 */
49
+ exports.CRITERION_REF_PREFIX = 'criterion:';
50
+ /** 心跳默认间隔 (没有预算/期限约束时) */
51
+ exports.DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;
52
+ /** 心跳下限 (再短就是噪音) */
53
+ exports.MIN_HEARTBEAT_INTERVAL_MS = 5_000;
54
+ /** 心跳上限 (再长就等于没有心跳) */
55
+ exports.MAX_HEARTBEAT_INTERVAL_MS = 60_000;
56
+ /** 判据引用名 (证据与检查共用) */
57
+ function criterionRef(criterion) {
58
+ return `${exports.CRITERION_REF_PREFIX}${criterion}`;
59
+ }
60
+ /**
61
+ * 默认失败处置 (设计 §7 职责划分 + §8 处理规则):
62
+ * - 心跳没了: 先 `stall` (标停), **不是**自动接管 —— 接管要先查 lease (P3)
63
+ * - 预算用尽: `stop_and_report` (硬底线, 不许自行扩预算)
64
+ * - 工具被拒: `report` (强调**不自动绕过 Harness**)
65
+ * - 反复失败: `escalate` (升级给父, 不许自己重试到天荒地老)
66
+ */
67
+ exports.DEFAULT_FAILURE_POLICY = Object.freeze({
68
+ onHeartbeatMiss: 'stall',
69
+ onBudgetExhausted: 'stop_and_report',
70
+ onToolDenied: 'report',
71
+ onRepeatedFailure: 'escalate',
72
+ });
73
+ /** 默认取消策略: 宽限收尾 + 保留工件 (取消不该销毁已产出的东西) */
74
+ exports.DEFAULT_CANCEL_POLICY = Object.freeze({
75
+ onParentCancel: 'graceful',
76
+ graceMs: 3_000,
77
+ preserveArtifacts: true,
78
+ onParentGoalClosed: 'finish_current_step',
79
+ });
80
+ /**
81
+ * 能从**回报本身**核验的禁则 (本文件真的实现并测了)。
82
+ * 固定优先级 = `CHILD_PROHIBITIONS` 的声明顺序 (同一份报告只回第一条, 结果可复现)。
83
+ */
84
+ exports.REPORT_CHECKABLE_PROHIBITIONS = [
85
+ 'expand_own_budget',
86
+ 'mark_unverified_as_complete',
87
+ 'rewrite_success_criteria',
88
+ ];
89
+ /**
90
+ * 回报里**没有字段**可供核验的禁则 —— 本文件不假装能查, 由监控层 / 接线层拦。
91
+ * (`AgentWorkReport` 里既没有"父 Goal 状态的镜像", 也没有"派生了几条子任务"的记录。)
92
+ */
93
+ exports.NOT_CHECKABLE_FROM_REPORT = [
94
+ 'mutate_parent_goal_state',
95
+ 'spawn_unbounded_subtasks',
96
+ ];
97
+ // ============================================================================
98
+ // §1. 工具 (纯函数: 无 I/O, 无全局状态, 不读真实钟)
99
+ // ============================================================================
100
+ /** 拒签合同的错误 —— 带上**结构化**原因清单 (不许只给一句人话) */
101
+ class WorkContractError extends Error {
102
+ issues;
103
+ constructor(issues) {
104
+ super(`拒绝签发工作合同: ${issues.join('; ')}`);
105
+ this.name = 'WorkContractError';
106
+ this.issues = issues;
107
+ }
108
+ }
109
+ exports.WorkContractError = WorkContractError;
110
+ function isNonEmptyString(v) {
111
+ return typeof v === 'string' && v.trim().length > 0;
112
+ }
113
+ function isFiniteNumber(v) {
114
+ return typeof v === 'number' && Number.isFinite(v);
115
+ }
116
+ function isPlainObject(v) {
117
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
118
+ }
119
+ /** ISO 时间戳宽松判定: 必须是 `YYYY-MM-DD…` 且 `Date.parse` 认得出 (宽松是为兼容全仓既有写法) */
120
+ function isIsoLike(v) {
121
+ return typeof v === 'string' && /^\d{4}-\d{2}-\d{2}/.test(v) && !Number.isNaN(Date.parse(v));
122
+ }
123
+ function isWorkReportStatus(v) {
124
+ return types_js_1.WORK_REPORT_STATUSES.includes(v);
125
+ }
126
+ /** 去重但保留首次出现顺序 */
127
+ function dedupe(values) {
128
+ const seen = new Set();
129
+ const out = [];
130
+ for (const v of values) {
131
+ if (seen.has(v))
132
+ continue;
133
+ seen.add(v);
134
+ out.push(v);
135
+ }
136
+ return out;
137
+ }
138
+ /** FNV-1a 32 位 (两次不同种子拼成 16 位十六进制) —— 让 workId 可复现, 不引入随机数/时钟依赖 */
139
+ function fnv1a32(input, seed) {
140
+ let h = seed >>> 0;
141
+ for (let i = 0; i < input.length; i++) {
142
+ h ^= input.charCodeAt(i);
143
+ h = Math.imul(h, 0x01000193) >>> 0;
144
+ }
145
+ return h.toString(16).padStart(8, '0');
146
+ }
147
+ /** 稳定哈希 (同一输入 → 同一结果; 不读时钟, 不用随机数) */
148
+ function stableHash(input) {
149
+ return fnv1a32(input, 0x811c9dc5) + fnv1a32(`${input}\u0000#2`, 0x01000193);
150
+ }
151
+ /** 深冻结 (合同是只读的) */
152
+ function deepFreeze(value) {
153
+ if (value !== null && typeof value === 'object') {
154
+ for (const key of Object.keys(value)) {
155
+ deepFreeze(value[key]);
156
+ }
157
+ Object.freeze(value);
158
+ }
159
+ return value;
160
+ }
161
+ /**
162
+ * 拷贝 `inputs` 再冻结 —— **不动调用方的对象** (只冻结我们自己的副本)。
163
+ * `structuredClone` 拿不到的类型 (函数/Promise 等) 退化为浅拷贝, 但绝不抛。
164
+ */
165
+ function cloneInputs(inputs) {
166
+ try {
167
+ return structuredClone(inputs);
168
+ }
169
+ catch {
170
+ return { ...inputs };
171
+ }
172
+ }
173
+ /**
174
+ * 心跳间隔推导 (合同里没有这个入参, 只能推):
175
+ * 取 min(默认 30s, 预算时长/6, 到 deadline 剩余/3), 再夹到 [5s, 60s]。
176
+ * 理由: 心跳至少要能在"预算用尽 / 超期"之前发出几次, 长预算也不许把心跳拉长到没意义。
177
+ */
178
+ function deriveHeartbeatIntervalMs(budget, deadline, now) {
179
+ const candidates = [exports.DEFAULT_HEARTBEAT_INTERVAL_MS];
180
+ if (isFiniteNumber(budget?.maxDurationMs) && budget.maxDurationMs > 0) {
181
+ candidates.push(Math.floor(budget.maxDurationMs / 6));
182
+ }
183
+ if (deadline !== null && isIsoLike(deadline) && isIsoLike(now)) {
184
+ const remaining = Date.parse(deadline) - Date.parse(now);
185
+ if (remaining > 0)
186
+ candidates.push(Math.floor(remaining / 3));
187
+ }
188
+ const raw = Math.min(...candidates);
189
+ return Math.min(Math.max(raw, exports.MIN_HEARTBEAT_INTERVAL_MS), exports.MAX_HEARTBEAT_INTERVAL_MS);
190
+ }
191
+ // ============================================================================
192
+ // §2. 签发合同 (issueWorkContract)
193
+ // ============================================================================
194
+ /**
195
+ * 签发子 Agent 工作合同 (设计 §14 冻结签名)。
196
+ *
197
+ * 合同不合法就**不签** —— 抛 `WorkContractError` (带 `issues` 结构化原因), 不做"差不多就行"的宽容。
198
+ * 返回的对象是**深冻结**的: 子拿到的合同不能被就地改写 (失败/取消策略、判据、预算都不可改)。
199
+ *
200
+ * `workId` 由 (goalId, parentRunId, childAgentId, capability, objective, now) 稳定哈希得出 ——
201
+ * 同输入同 id (可复现、可幂等), 不读时钟也不用随机数。
202
+ */
203
+ function issueWorkContract(input) {
204
+ const issues = [];
205
+ const named = [
206
+ ['goalId', input.goalId],
207
+ ['parentRunId', input.parentRunId],
208
+ ['childAgentId', input.childAgentId],
209
+ ['capability', input.capability],
210
+ ['objective', input.objective],
211
+ ['issuedBy', input.issuedBy],
212
+ ];
213
+ for (const [name, value] of named) {
214
+ if (!isNonEmptyString(value))
215
+ issues.push(`${name} 为空/缺失 (合同必须有明确的 ${name})`);
216
+ }
217
+ if (!isIsoLike(input.now))
218
+ issues.push('now 不是合法 ISO 时间戳');
219
+ if (input.deadline !== null) {
220
+ if (!isIsoLike(input.deadline)) {
221
+ issues.push('deadline 不是合法 ISO 时间戳 (null = 不设期限)');
222
+ }
223
+ else if (isIsoLike(input.now) && Date.parse(input.deadline) < Date.parse(input.now)) {
224
+ issues.push('deadline 早于签发时间 now (还没开始就超期的合同不许签)');
225
+ }
226
+ }
227
+ if (!isPlainObject(input.inputs))
228
+ issues.push('inputs 必须是结构化对象 (Record<string, unknown>)');
229
+ const rawCriteria = Array.isArray(input.successCriteria) ? input.successCriteria : [];
230
+ const criteriaTrimmed = rawCriteria.map((c) => (typeof c === 'string' ? c.trim() : ''));
231
+ if (criteriaTrimmed.some((c) => c.length === 0))
232
+ issues.push('successCriteria 含空条目');
233
+ const successCriteria = dedupe(criteriaTrimmed.filter((c) => c.length > 0));
234
+ if (successCriteria.length === 0) {
235
+ issues.push('successCriteria 为空 (没有成功判据 = 没有"完成"的定义, 这种合同一定会扯皮)');
236
+ }
237
+ const rawTools = Array.isArray(input.allowedTools) ? input.allowedTools : [];
238
+ const toolsTrimmed = rawTools.map((t) => (typeof t === 'string' ? t.trim() : ''));
239
+ if (toolsTrimmed.some((t) => t.length === 0))
240
+ issues.push('allowedTools 含空条目');
241
+ // 空数组是合法的: "无工具授权" (只能基于 inputs 推理) —— 但不许出现空字符串这种脏数据
242
+ const allowedTools = dedupe(toolsTrimmed.filter((t) => t.length > 0));
243
+ const budget = input.budget;
244
+ if (!isPlainObject(budget)) {
245
+ issues.push('budget 缺失 (子不许自行扩预算, 所以父必须把上限写清)');
246
+ }
247
+ else {
248
+ for (const field of ['maxSteps', 'maxDurationMs', 'maxAmount']) {
249
+ const v = budget[field];
250
+ if (v === null || v === undefined)
251
+ continue;
252
+ if (!isFiniteNumber(v) || v <= 0) {
253
+ issues.push(`budget.${field} 必须是 null 或正数 (现在: ${String(v)})`);
254
+ continue;
255
+ }
256
+ if (field === 'maxSteps' && !Number.isInteger(v))
257
+ issues.push('budget.maxSteps 必须是整数');
258
+ }
259
+ if (budget.maxAmount !== null && budget.maxAmount !== undefined && !isNonEmptyString(budget.currency)) {
260
+ issues.push('budget.maxAmount 有值但 budget.currency 为空 (金额没有币种 = 无法核验)');
261
+ }
262
+ }
263
+ if (issues.length > 0)
264
+ throw new WorkContractError(issues);
265
+ const workId = `work-${stableHash([input.goalId, input.parentRunId, input.childAgentId, input.capability, input.objective, input.now].join('\u0000'))}`;
266
+ const contract = {
267
+ workId,
268
+ goalId: input.goalId,
269
+ parentRunId: input.parentRunId,
270
+ childAgentId: input.childAgentId,
271
+ capability: input.capability,
272
+ objective: input.objective,
273
+ inputs: cloneInputs(input.inputs),
274
+ allowedTools,
275
+ budget: {
276
+ maxSteps: budget.maxSteps ?? null,
277
+ maxDurationMs: budget.maxDurationMs ?? null,
278
+ maxAmount: budget.maxAmount ?? null,
279
+ currency: budget.currency ?? null,
280
+ },
281
+ deadline: input.deadline,
282
+ successCriteria,
283
+ reportSchema: exports.WORK_REPORT_SCHEMA,
284
+ heartbeatIntervalMs: deriveHeartbeatIntervalMs(budget, input.deadline, input.now),
285
+ failurePolicy: { ...exports.DEFAULT_FAILURE_POLICY },
286
+ cancelPolicy: { ...exports.DEFAULT_CANCEL_POLICY },
287
+ // 约定写进合同: 每条判据一条证据 (子不需要猜要交什么)
288
+ requiredEvidence: successCriteria.map((c) => criterionRef(c)),
289
+ issuedAt: input.now,
290
+ issuedBy: input.issuedBy,
291
+ };
292
+ return deepFreeze(contract);
293
+ }
294
+ // ============================================================================
295
+ // §3. 核验回报 (validateChildReport)
296
+ // ============================================================================
297
+ /**
298
+ * `BlockRecord` 在回报里必须自带这些事实 (缺一项 = 说不清卡在哪, 设计 §8):
299
+ * 必带键 + 必须非空的键。`note` 也算"说清", 空说明等于没报 (禁"有问题"式回报)。
300
+ */
301
+ const BLOCK_RECORD_KEYS = [
302
+ 'kind',
303
+ 'blockedAt',
304
+ 'lastProgressAt',
305
+ 'owner',
306
+ 'dependency',
307
+ 'suggestedAction',
308
+ 'note',
309
+ ];
310
+ /** 阻塞记录是否说得清 (返回问题清单; 空 = 合格) */
311
+ function blockRecordIssues(block) {
312
+ if (!isPlainObject(block))
313
+ return ['blockReason 不是结构化对象 (不许写成一句"有问题")'];
314
+ const issues = [];
315
+ for (const key of BLOCK_RECORD_KEYS) {
316
+ if (!(key in block))
317
+ issues.push(`blockReason 缺字段 ${key}`);
318
+ }
319
+ for (const key of ['kind', 'blockedAt', 'lastProgressAt', 'owner', 'suggestedAction', 'note']) {
320
+ if (key in block && !isNonEmptyString(block[key]))
321
+ issues.push(`blockReason.${key} 为空`);
322
+ }
323
+ return issues;
324
+ }
325
+ /** 报告里的检查是否满足某条判据 (`criterion:<原文>` 且 verdict='pass') */
326
+ function verdictOfCriterion(report, criterion) {
327
+ const checks = Array.isArray(report?.checks) ? report.checks : [];
328
+ const hit = checks.find((c) => isPlainObject(c) && c.name === criterionRef(criterion));
329
+ if (!hit || !isPlainObject(hit))
330
+ return null;
331
+ const verdict = hit.verdict;
332
+ return types_js_1.CHECK_VERDICTS.includes(verdict) ? verdict : null;
333
+ }
334
+ /** 某条证据是否引用了合同要求的证据名 (kind 或 ref 任一对上 —— 精确匹配, 不许模糊) */
335
+ function citesRequirement(evidence, requirement) {
336
+ if (!isPlainObject(evidence))
337
+ return false;
338
+ const e = evidence;
339
+ return e.kind === requirement || e.ref === requirement;
340
+ }
341
+ /**
342
+ * 核验子 Agent 回报 (设计 §14 冻结签名)。
343
+ *
344
+ * 三个桶都**返回原因**, 不只是 boolean:
345
+ * - `missingFields` —— 字段级不合格: 缺失 / 空 / 格式错 / **与合同不一致**
346
+ * (例如回报里的 `workId` 不是本合同签发的那个)。`evidence` 为空数组、`checks` 为空数组、
347
+ * `status='blocked'` 却没给结构化 `blockReason` 都算这里。
348
+ * - `missingEvidence` —— **自称 `completed`** 时, 合同的 `requiredEvidence` 里查不到对应证据的条目。
349
+ * (非完成状态本来就允许判据未满足 → 这一桶为空, 但"至少一条证据"仍由 `missingFields` 兜着。)
350
+ * - `violation` —— 越界, 取值见 `REPORT_CHECKABLE_PROHIBITIONS`; 多条命中时按
351
+ * `CHILD_PROHIBITIONS` 声明顺序取第一条 (结果可复现)。
352
+ *
353
+ * 本函数**不改**合同与回报 (测试里用深冻结输入钉住这一点)。
354
+ */
355
+ function validateChildReport(contract, report) {
356
+ // 报告可能根本不是它自称的那个形状 (子只回了文本 / 少字段), 所以按 unknown 读
357
+ const r = (report ?? {});
358
+ const missingFields = [];
359
+ if (!isNonEmptyString(r.workId) || r.workId !== contract.workId)
360
+ missingFields.push('workId');
361
+ if (!isNonEmptyString(r.childAgentId) || r.childAgentId !== contract.childAgentId)
362
+ missingFields.push('childAgentId');
363
+ if (!isWorkReportStatus(r.status))
364
+ missingFields.push('status');
365
+ if (!isNonEmptyString(r.summary))
366
+ missingFields.push('summary');
367
+ if (!Array.isArray(r.evidence) || r.evidence.length === 0)
368
+ missingFields.push('evidence');
369
+ if (!Array.isArray(r.artifacts))
370
+ missingFields.push('artifacts');
371
+ if (!Array.isArray(r.checks) || r.checks.length === 0)
372
+ missingFields.push('checks');
373
+ if (!Array.isArray(r.unresolvedItems))
374
+ missingFields.push('unresolvedItems');
375
+ if (!isNonEmptyString(r.nextRecommendation))
376
+ missingFields.push('nextRecommendation');
377
+ if (!isFiniteNumber(r.durationMs) || r.durationMs < 0)
378
+ missingFields.push('durationMs');
379
+ if (!isIsoLike(r.reportedAt))
380
+ missingFields.push('reportedAt');
381
+ // 被阻塞 → 必须有能说清卡在哪的阻塞记录 (null 或结构不全都算不合格)
382
+ if (r.status === 'blocked' && !isPlainObject(r.blockReason)) {
383
+ missingFields.push('blockReason');
384
+ }
385
+ else if (r.blockReason !== null && r.blockReason !== undefined && blockRecordIssues(r.blockReason).length > 0) {
386
+ missingFields.push('blockReason');
387
+ }
388
+ // 判据证据: 只对"自称完成"的报告要求 (非完成状态不许逼出自证)
389
+ const missingEvidence = [];
390
+ if (r.status === 'completed') {
391
+ const evidence = Array.isArray(r.evidence) ? r.evidence : [];
392
+ for (const requirement of contract.requiredEvidence) {
393
+ if (!evidence.some((e) => citesRequirement(e, requirement)))
394
+ missingEvidence.push(requirement);
395
+ }
396
+ }
397
+ const violation = detectViolation(contract, report, missingEvidence);
398
+ const ok = missingFields.length === 0 && missingEvidence.length === 0 && violation === null;
399
+ return { ok, missingFields, missingEvidence, violation };
400
+ }
401
+ /** 越界判定 (纯函数; 固定优先级见 `REPORT_CHECKABLE_PROHIBITIONS`) */
402
+ function detectViolation(contract, report, missingEvidence) {
403
+ const r = (report ?? {});
404
+ // ① 超预算: 报告里唯一能核验的预算是耗时 (maxSteps / maxAmount 回报里没有对应字段 → 不假装能查)
405
+ const maxDurationMs = contract.budget?.maxDurationMs ?? null;
406
+ const budgetOverrun = maxDurationMs !== null && isFiniteNumber(r.durationMs) && r.durationMs > maxDurationMs;
407
+ // ② 把未验证的结果标完成
408
+ const evidenceEmpty = !Array.isArray(r.evidence) || r.evidence.length === 0;
409
+ const unresolvedLeft = Array.isArray(r.unresolvedItems) && r.unresolvedItems.length > 0;
410
+ const criteriaWithoutPass = contract.successCriteria.filter((c) => verdictOfCriterion(report, c) !== 'pass');
411
+ const unverifiedComplete = r.status === 'completed' &&
412
+ (evidenceEmpty || missingEvidence.length > 0 || criteriaWithoutPass.length > 0 || unresolvedLeft);
413
+ // ③ 私改成功判据: 报告里对合同**没有**的判据给了检查 (自己另立了一套判据)
414
+ const checks = Array.isArray(r.checks) ? r.checks : [];
415
+ const forgedCriteria = checks.some((c) => {
416
+ if (!isPlainObject(c))
417
+ return false;
418
+ const name = c.name;
419
+ if (!isNonEmptyString(name) || !name.startsWith(exports.CRITERION_REF_PREFIX))
420
+ return false;
421
+ return !contract.successCriteria.includes(name.slice(exports.CRITERION_REF_PREFIX.length));
422
+ });
423
+ const hit = [];
424
+ if (budgetOverrun)
425
+ hit.push('expand_own_budget');
426
+ if (unverifiedComplete)
427
+ hit.push('mark_unverified_as_complete');
428
+ if (forgedCriteria)
429
+ hit.push('rewrite_success_criteria');
430
+ return types_js_1.CHILD_PROHIBITIONS.find((p) => hit.includes(p)) ?? null;
431
+ }
432
+ // ============================================================================
433
+ // §4. 是否接受为完成 (acceptsAsComplete)
434
+ // ============================================================================
435
+ /**
436
+ * 能不能把这份回报**接受为完成** (设计 §14 冻结签名)。这是父的判定, 不是子的自评。
437
+ *
438
+ * 拒绝原因按固定优先级给第一条 (越早发现越该先说):
439
+ * ① 自报状态不是 `completed`
440
+ * ② 报告不完整 (`missingFields`) —— 证据/检查为空的报告一律不接受
441
+ * ③ 判据缺证据 (`missingEvidence`)
442
+ * ④ 越界 (`violation`, 含 `mark_unverified_as_complete`)
443
+ * ⑤ 超期 (`reportedAt > deadline`) —— 超期是**交付时间**问题, 不是报告质量问题:
444
+ * 此时 `validateChildReport` 仍可能 `ok=true` (报告本身合格), 但要父决定是否重签合同。
445
+ *
446
+ * 通过 = 上面五条全不成立 (判据逐条有证据 + 逐条 `pass` 检查 + 无未解决项)。
447
+ */
448
+ function acceptsAsComplete(contract, report) {
449
+ const r = (report ?? {});
450
+ const validation = validateChildReport(contract, report);
451
+ if (r.status !== 'completed') {
452
+ return {
453
+ accepted: false,
454
+ reason: `子 Agent 自报状态 '${String(r.status)}', 不是 'completed' —— 不算完成 (未完成的工作可以继续等, 但不许当完成记账)`,
455
+ };
456
+ }
457
+ if (validation.missingFields.length > 0) {
458
+ return {
459
+ accepted: false,
460
+ reason: `报告不完整, 缺/不合格字段: ${validation.missingFields.join(', ')} (证据与检查为空的报告一律不接受为完成)`,
461
+ };
462
+ }
463
+ if (validation.missingEvidence.length > 0) {
464
+ return {
465
+ accepted: false,
466
+ reason: `判据缺证据: ${validation.missingEvidence.join(', ')} —— 逐条判据没有证据就不算完成`,
467
+ };
468
+ }
469
+ if (validation.violation !== null) {
470
+ return {
471
+ accepted: false,
472
+ reason: `子 Agent 越界 (${validation.violation}) —— 该回报不能被接受为完成, 需要父/监控层处理`,
473
+ };
474
+ }
475
+ if (contract.deadline !== null && isIsoLike(r.reportedAt) && Date.parse(r.reportedAt) > Date.parse(contract.deadline)) {
476
+ return {
477
+ accepted: false,
478
+ reason: `回报时间 ${String(r.reportedAt)} 超过合同 deadline ${contract.deadline} —— 超期交付由父决定是否重签合同, 这里不判完成`,
479
+ };
480
+ }
481
+ const evidenceCount = Array.isArray(r.evidence) ? r.evidence.length : 0;
482
+ const unresolvedCount = Array.isArray(r.unresolvedItems) ? r.unresolvedItems.length : 0;
483
+ return {
484
+ accepted: true,
485
+ reason: `${contract.successCriteria.length} 条判据逐条有证据且检查 pass, 证据 ${evidenceCount} 条, 未解决项 ${unresolvedCount} 条 (workId ${contract.workId})`,
486
+ };
487
+ }
488
+ //# sourceMappingURL=work-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-contract.js","sourceRoot":"","sources":["../../../../src/agents/goal-flywheel/work-contract.ts"],"names":[],"mappings":"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"}