@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 @@
1
+ {"version":3,"file":"model-policy.js","sourceRoot":"","sources":["../../../src/agents/model-policy.ts"],"names":[],"mappings":"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"}
@@ -63,7 +63,8 @@ var __importStar = (this && this.__importStar) || (function () {
63
63
  };
64
64
  })();
65
65
  Object.defineProperty(exports, "__esModule", { value: true });
66
- exports.PUBLIC_HEX_KEYS = exports.FORBIDDEN_PUBLIC_KEYS = exports.OPEN_TASK_KEYS = exports.CHAIN_LABELS = exports.PUBLIC_MAINNET_CHAIN_ID = exports.PUBLIC_TESTNET_CHAIN_ID = exports.PULSE_EVENT_ACTIVITY = exports.CHAIN_EVENT_ACTIVITY = exports.CONFIRMED_ACTIVITY_LIMIT = exports.MAX_OPEN_TASKS = exports.MAX_AGENT_SITES = exports.pulseDir = exports.NETWORK_EVENT_TYPES = exports.PULSE_LIMITS = void 0;
66
+ exports.PUBLIC_HEX_KEYS = exports.FORBIDDEN_PUBLIC_KEYS = exports.OPEN_TASK_KEYS = exports.TOTALS_FIELD_KEYS = exports.CHAIN_LABELS = exports.PUBLIC_MAINNET_CHAIN_ID = exports.PUBLIC_TESTNET_CHAIN_ID = exports.PULSE_EVENT_ACTIVITY = exports.CHAIN_EVENT_ACTIVITY = exports.CONFIRMED_ACTIVITY_LIMIT = exports.MAX_OPEN_TASKS = exports.MAX_AGENT_SITES = exports.pulseDir = exports.NETWORK_EVENT_TYPES = exports.PULSE_LIMITS = void 0;
67
+ exports.tallySignatureAudit = tallySignatureAudit;
67
68
  exports.nodeDigest = nodeDigest;
68
69
  exports.capabilityGroup = capabilityGroup;
69
70
  exports.bucketOf = bucketOf;
@@ -86,6 +87,7 @@ exports.isPublicChainId = isPublicChainId;
86
87
  exports.summarizeActivityRows = summarizeActivityRows;
87
88
  exports.buildChainIdScope = buildChainIdScope;
88
89
  exports.snapshotConsistencyIssues = snapshotConsistencyIssues;
90
+ exports.totalsScopeIssues = totalsScopeIssues;
89
91
  exports.openTasksIssues = openTasksIssues;
90
92
  exports.computeSnapshot = computeSnapshot;
91
93
  exports.getNetworkPulse = getNetworkPulse;
@@ -172,7 +174,34 @@ function writeEvents(list, h) {
172
174
  /* 统计失败绝不影响主路径 */
173
175
  }
174
176
  }
175
- // ── 匿名化 ──────────────────────────────────────────────────────────────────
177
+ function tallySignatureAudit(h, opts = {}) {
178
+ const now = opts.now ?? Date.now();
179
+ const windowMs = opts.windowMs ?? exports.PULSE_LIMITS.windowMs;
180
+ const file = path.join(home(h), '.bolloon', 'wallet-signatures.jsonl');
181
+ if (!fs.existsSync(file))
182
+ return { available: false, count: 0, window_ms: windowMs };
183
+ let count = 0;
184
+ try {
185
+ for (const line of fs.readFileSync(file, 'utf8').split('\n')) {
186
+ if (!line.trim())
187
+ continue;
188
+ let row = null;
189
+ try {
190
+ row = JSON.parse(line);
191
+ }
192
+ catch {
193
+ continue;
194
+ } // 坏行跳过, 不让一行坏数据毁掉整个计数
195
+ const at = Number(row?.at);
196
+ if (Number.isFinite(at) && at >= now - windowMs)
197
+ count += 1;
198
+ }
199
+ }
200
+ catch {
201
+ return { available: false, count: 0, window_ms: windowMs };
202
+ }
203
+ return { available: true, count, window_ms: windowMs };
204
+ }
176
205
  /** 节点摘要: sha256(值) 前 16 位。不可逆, 不暴露原值。 */
177
206
  function nodeDigest(value) {
178
207
  return crypto.createHash('sha256').update(`bolloon-pulse|${String(value)}`).digest('hex').slice(0, 16);
@@ -797,6 +826,8 @@ function buildChainIdScope(rows) {
797
826
  * (页面不许出现「0 个任务」与「N 行任务」并存而**不解释**)
798
827
  * ⑥ 0x 长 hex 越界 (2026-09-23): 只许出现在 tx_hash/contract/explorer_* 四个白名单键下 ——
799
828
  * EOA 地址跑到别的键 (或白名单键形状不对) 就拒绝导出
829
+ * ⑧ ★ **同一概念不许并排两个数** (2026-09-24, 见 `totalsScopeIssues`): 顶部计数与表格行数/
830
+ * 同源计数矛盾, 或者某个数没有来源却不标「未接入」→ 拒绝导出 (这道门在 UI 侧还有一份镜像)
800
831
  */
801
832
  function snapshotConsistencyIssues(snap) {
802
833
  const issues = [];
@@ -825,8 +856,137 @@ function snapshotConsistencyIssues(snap) {
825
856
  }
826
857
  issues.push(...auditPublicHexLeaks(snap)); // ⑥ 0x 长 hex 越界 → 拒绝导出 (不静默放行)
827
858
  issues.push(...openTasksIssues(snap)); // ⑦ 待接单任务的字段白名单与「只含未认领」不变式
859
+ issues.push(...totalsScopeIssues(snap)); // ⑧ ★ 同一概念不得并排两个数 (顶部 vs 表格)
828
860
  return issues;
829
861
  }
862
+ /** 顶部逐字段口径的键 (与 `TotalsFieldKey` 逐字一致; 少一个 = 那个数没有来源说明) */
863
+ exports.TOTALS_FIELD_KEYS = [
864
+ 'nodes', 'agents', 'active_agents', 'seen_last_24h',
865
+ 'tasks', 'tasks_completed', 'tasks_verified', 'tasks_settled', 'signatures',
866
+ ];
867
+ const TOTALS_FIELD_SOURCES = ['pulse-events', 'chain-index', 'signature-audit', 'none'];
868
+ const TOTALS_FIELD_WINDOWS = ['window-24h', 'full', 'unknown'];
869
+ /** 「未接入」类措辞 (无源时必须出现, 否则等于没说清为什么没有数) */
870
+ const UNAVAILABLE_WORDS = /未接入|not connected|无可用源|no available source/;
871
+ /**
872
+ * ★ 新不变量门 (2026-09-24 leo:「数量怎么对不上」): **同一概念不许并排两个数**。
873
+ *
874
+ * 检查的是「页面会把它们放在同一屏里」的那几个数 —— 它们的口径必须各自挂得住:
875
+ * ① 逐字段口径 `totals_scope.fields` 九个键必须齐 (source/window/short/label 双语都在) ——
876
+ * 缺了就只能靠 notes 辩解, 而那正是当初「顶部 0 个任务 vs 表格 25 行」能上线的路径;
877
+ * ② 值 `null` ⇔ 口径标 `none` + 明说「未接入」; **有源却不给数** 或 **无源却拿 0 冒充** 都算矛盾;
878
+ * ③ 同一概念对账 (表里有 5 个任务而顶部写 0 任务 → 判红):
879
+ * · 链上索引可用时, 顶部 tasks/tasks_completed/tasks_settled **必须逐字等于** activity_totals
880
+ * 的同名字段 (同源即恒等, 任何解释都救不了);
881
+ * · 表格行数/同源计数非零而顶部为 0 或缺值 → 必须有口径说明 (note 里写清) 才放行;
882
+ * · 顶部说有 N 个任务而表格一行都没有 (反向矛盾) → 同样判红。
883
+ * `status === 'unavailable'` 的整份快照不发布任何计数 (页面整块显示「快照读不到」), 故只查形状。
884
+ */
885
+ function totalsScopeIssues(snap) {
886
+ const out = [];
887
+ const t = snap?.totals || {};
888
+ const ts = snap?.totals_scope;
889
+ const at = snap?.activity_totals || {};
890
+ const rows = Array.isArray(snap?.confirmed_activity) ? snap.confirmed_activity : [];
891
+ const unavailableSnap = String(snap?.status || '') === 'unavailable';
892
+ if (!ts || typeof ts !== 'object')
893
+ return ['totals_scope 缺失 (顶部计数的口径必须随快照一起给)'];
894
+ if (!ts.fields || typeof ts.fields !== 'object') {
895
+ return ['totals_scope.fields 缺失 (顶部每个数都要能就地说明来自哪 —— 不许只靠 notes 辩解)'];
896
+ }
897
+ // ① 形状: 九个键齐 + 每个键的 source/window/short/label 都合法
898
+ for (const k of exports.TOTALS_FIELD_KEYS) {
899
+ const f = ts.fields[k];
900
+ if (!f || typeof f !== 'object') {
901
+ out.push(`totals_scope.fields.${k} 缺失`);
902
+ continue;
903
+ }
904
+ if (!TOTALS_FIELD_SOURCES.includes(f.source))
905
+ out.push(`totals_scope.fields.${k}.source=${JSON.stringify(f.source)} 不在白名单`);
906
+ if (!TOTALS_FIELD_WINDOWS.includes(f.window))
907
+ out.push(`totals_scope.fields.${k}.window=${JSON.stringify(f.window)} 不在白名单`);
908
+ if (!f.label?.zh || !f.label?.en)
909
+ out.push(`totals_scope.fields.${k}.label 必须双语都给`);
910
+ if (!f.short?.zh || !f.short?.en)
911
+ out.push(`totals_scope.fields.${k}.short 必须双语都给 (页面要就地贴在数字旁)`);
912
+ }
913
+ if (out.length)
914
+ return out; // 形状都不对就不往下算数
915
+ if (!unavailableSnap) {
916
+ // ② 值 ⇔ 口径 (null = 未接入; 有源必须有数; 无源不许给 0)
917
+ for (const k of exports.TOTALS_FIELD_KEYS) {
918
+ const f = ts.fields[k];
919
+ const v = t[k];
920
+ const isNull = v === null || v === undefined;
921
+ if (isNull) {
922
+ if (f.source !== 'none') {
923
+ out.push(`totals.${k} 没有值 (未接入) 却标了源 ${f.source} —— 有源就必须给真值, 没源就标 none`);
924
+ }
925
+ if (!UNAVAILABLE_WORDS.test(`${f.short?.zh}${f.short?.en}${f.label?.zh}${f.label?.en}`)) {
926
+ out.push(`totals.${k} 没有值却没有一句「未接入」说明 (读者会把空白读成 0)`);
927
+ }
928
+ }
929
+ else {
930
+ if (typeof v !== 'number' || !Number.isFinite(v) || v < 0) {
931
+ out.push(`totals.${k}=${JSON.stringify(v)} 不是非负有限数`);
932
+ }
933
+ else if (f.source === 'none') {
934
+ out.push(`totals.${k}=${v} 却标「无源」 —— 不许拿裸 0 冒充「没有接入」(那会被读成"没发生过")`);
935
+ }
936
+ }
937
+ }
938
+ // ③ 同一概念对账 (顶部计数 vs 表格行数/同源计数)
939
+ const notes = Array.isArray(snap.notes) ? snap.notes.join(' ') : '';
940
+ const pairs = [
941
+ ['tasks', t.tasks, at.tasks],
942
+ ['tasks_completed', t.tasks_completed, at.tasks_completed],
943
+ ['tasks_settled', t.tasks_settled, at.tasks_settled],
944
+ ];
945
+ const tableRows = Number(at.rows) || rows.length;
946
+ const sameSourceChain = String(at.source) === 'chain-index';
947
+ // ⑨ 声明与能力不符: 某字段自称「链上索引」口径, 而这一份快照的链上索引根本不可用 ——
948
+ // 那就是替一个不存在的源背书 (页面会写「链上索引·全量」, 而索引这一份没读出来)。
949
+ // 注: 本块必须放在 pairs / sameSourceChain 之后 (先声明后使用, 否则 TDZ 崩)。
950
+ if (!sameSourceChain) {
951
+ for (const [k] of pairs) {
952
+ const f = ts.fields[k];
953
+ if (f.source === 'chain-index') {
954
+ out.push(`totals_scope.fields.${k}.source='chain-index' 而这一份快照的链上索引不可用 ` +
955
+ `(activity_totals.source=${JSON.stringify(at.source)}) —— 声明与能力不符`);
956
+ }
957
+ }
958
+ }
959
+ for (const [k, top, src] of pairs) {
960
+ const n = Number(src) || 0;
961
+ const topN = (top === null || top === undefined) ? null : Number(top);
962
+ const topScope = ts.fields[k];
963
+ if (sameSourceChain && topScope.source === 'chain-index') {
964
+ // 同源: 必须逐字相等, 不需要任何"解释"
965
+ if (topN !== n) {
966
+ out.push(`同一概念两个数: 顶部 totals.${k}=${topN === null ? '未接入' : topN} ≠ 链上索引同源计数 activity_totals.${k}=${n}` +
967
+ ` (表格 ${tableRows} 行) —— 同源即恒等, 页面并排出现两个数就是矛盾`);
968
+ }
969
+ continue;
970
+ }
971
+ if (n > 0 && (topN === null || topN === 0)) {
972
+ const explained = notes.includes('口径') && notes.includes(String(tableRows)) && notes.includes('脉冲事件');
973
+ if (!explained) {
974
+ out.push(`顶部 totals.${k}=${topN === null ? '未接入' : 0} 与表格里的 ${n} 个同类 (${tableRows} 行) 矛盾, 且没有任何口径说明`);
975
+ }
976
+ }
977
+ if (topN !== null && n === 0 && tableRows === 0 && topN > 0) {
978
+ out.push(`顶部 totals.${k}=${topN} 而表格一行都没有 (${tableRows} 行) —— 反向矛盾: 数不出行却报了数`);
979
+ }
980
+ }
981
+ }
982
+ // ④ 明说"数字不一样"时必须有解释 (老规矩保留; 不许只靠一句 label)
983
+ if (ts.differs_from_activity === true) {
984
+ const notes = Array.isArray(snap.notes) ? snap.notes.join(' ') : '';
985
+ if (!notes.includes('口径'))
986
+ out.push('totals_scope.differs_from_activity=true 但 notes 里没有任何口径说明');
987
+ }
988
+ return out;
989
+ }
830
990
  /** open_tasks 行的字段白名单 (与 `OpenTaskRow` 逐字一致; 多一个键 = 可能把正文/身份带出去了) */
831
991
  exports.OPEN_TASK_KEYS = ['capability', 'budget', 'currency', 'network', 'deadline', 'claimed', 'announcementId'];
832
992
  /**
@@ -867,26 +1027,85 @@ function openTasksIssues(snap) {
867
1027
  });
868
1028
  return out;
869
1029
  }
1030
+ // ── 顶部计数的逐字段口径 (2026-09-24) ────────────────────────────────────────
1031
+ // 页面把 8~9 个数字并排放在**一行**里, 一行一个总口径是解释不了它们的 —— 每个数必须自带来源。
1032
+ const WINDOW_HOURS = Math.round(exports.PULSE_LIMITS.windowMs / 3600000);
1033
+ /** 「本节点 N h 脉冲事件」口径 (节点/智能体类计数, 以及链上索引不可用时的降级口径) */
1034
+ function pulseField(what) {
1035
+ return {
1036
+ source: 'pulse-events',
1037
+ window: 'window-24h',
1038
+ short: { zh: `${WINDOW_HOURS}h 脉冲`, en: `${WINDOW_HOURS}h pulse` },
1039
+ label: {
1040
+ zh: `本节点 ${WINDOW_HOURS}h 观察窗口内收到的脉冲事件 · ${what.zh}`,
1041
+ en: `pulse events received by this node within the ${WINDOW_HOURS}h window · ${what.en}`,
1042
+ },
1043
+ };
1044
+ }
1045
+ /** 「链上索引 · 全量」口径 (与下方活动表**同源**: 同源即恒等, 页面不许并排两个数) */
1046
+ function chainField(what) {
1047
+ return {
1048
+ source: 'chain-index',
1049
+ window: 'full',
1050
+ short: { zh: '链上索引·全量', en: 'chain index · whole' },
1051
+ label: {
1052
+ zh: `链上索引全量 (与下方活动表同源) · ${what.zh}`,
1053
+ en: `chain index, whole (same source as the activity table below) · ${what.en}`,
1054
+ },
1055
+ };
1056
+ }
1057
+ /** 「本机签名审计账」口径 (真源: `<home>/.bolloon/wallet-signatures.jsonl` 窗口内条数) */
1058
+ function signatureAuditField() {
1059
+ return {
1060
+ source: 'signature-audit',
1061
+ window: 'window-24h',
1062
+ short: { zh: `${WINDOW_HOURS}h 签名审计`, en: `${WINDOW_HOURS}h signature audit` },
1063
+ label: {
1064
+ zh: `本机签名审计账 (wallet-signatures.jsonl) ${WINDOW_HOURS}h 内条数 —— 只数条数, 不含签名内容`,
1065
+ en: `rows in this node's signature audit log (wallet-signatures.jsonl) within ${WINDOW_HOURS}h — count only, no content`,
1066
+ },
1067
+ };
1068
+ }
1069
+ /** 「没有可用源」= 未接入 (值必须是 null; 页面必须写「未接入」, 不许拿 0 冒充「没发生过」) */
1070
+ function noneField(why) {
1071
+ return {
1072
+ source: 'none',
1073
+ window: 'unknown',
1074
+ short: { zh: '未接入', en: 'not connected' },
1075
+ label: { zh: `没有可用源 → 报「未接入」而不是 0 · ${why.zh}`, en: `no available source → reported as "not connected", not 0 · ${why.en}` },
1076
+ unavailable: true,
1077
+ };
1078
+ }
870
1079
  function computeSnapshot(events, opts) {
871
1080
  const now = opts.now;
872
1081
  const fresh_until = now + exports.PULSE_LIMITS.snapshotTtlMs;
873
1082
  if (opts.unavailable) {
874
1083
  const emptyRows = [];
875
1084
  const gates = normalizeActivityGates(chain_config_js_1.DEFAULT_CONFIRMATIONS);
1085
+ // 观察层不可用 = **没有数** (不是 0): 计数一律 null/0 占位由页面整块隐藏, 口径逐字段标「未接入」。
1086
+ const downField = noneField({ zh: '观察层不可用', en: 'observation layer unavailable' });
876
1087
  return {
877
1088
  status: 'unavailable',
878
1089
  generated_at: now,
879
1090
  fresh_until,
880
1091
  scope: 'observed',
881
1092
  scope_label: { zh: '当前节点观察到', en: 'Observed by this node' },
882
- totals: { nodes: 0, agents: 0, active_agents: 0, seen_last_24h: 0, tasks: 0, tasks_completed: 0, tasks_verified: 0, signatures: 0 },
1093
+ totals: {
1094
+ nodes: 0, agents: 0, active_agents: 0, seen_last_24h: 0,
1095
+ tasks: null, tasks_completed: null, tasks_verified: null, signatures: null, tasks_settled: null,
1096
+ },
883
1097
  totals_scope: {
884
1098
  source: 'pulse-events', window_ms: exports.PULSE_LIMITS.windowMs,
885
1099
  label: {
886
- zh: `只统计本节点 ${exports.PULSE_LIMITS.windowMs / 3600000}h 观察窗口内收到的脉冲事件 (本节点自己上报的)`,
887
- en: `Only pulse events received by this node within the ${exports.PULSE_LIMITS.windowMs / 3600000}h observation window (reported by this node itself)`,
1100
+ zh: `本节点 ${WINDOW_HOURS}h 观察窗口的脉冲事件层不可用 → 没有数 (不是 0)`,
1101
+ en: `This node's ${WINDOW_HOURS}h pulse layer is unavailable → no counts (not zero)`,
888
1102
  },
889
1103
  differs_from_activity: false,
1104
+ fields: {
1105
+ nodes: downField, agents: downField, active_agents: downField, seen_last_24h: downField,
1106
+ tasks: downField, tasks_completed: downField, tasks_verified: downField,
1107
+ tasks_settled: downField, signatures: downField,
1108
+ },
890
1109
  },
891
1110
  capabilities: [],
892
1111
  recent_activity: [],
@@ -928,10 +1147,13 @@ function computeSnapshot(events, opts) {
928
1147
  capabilities.push({ key: 'other', count: otherCount.size });
929
1148
  capabilities.sort((a, b) => b.count - a.count || (a.key < b.key ? -1 : 1));
930
1149
  }
931
- // 经济计数: 按**不同任务**去重 (同一任务重复事件不虚增), 且只给聚合数不给内容
1150
+ // 经济计数 (**脉冲口径**) —— 注意: 顶部「任务/已完成/已结算」的**权威源是链上索引**
1151
+ // (见下面 chainAuthoritative 那一段), 脉冲口径只在索引不可用时才顶上去。
1152
+ // 按**不同任务**去重 (同一任务重复事件不虚增), 且只给聚合数不给内容
932
1153
  const tasks = new Set();
933
1154
  const tasksCompleted = new Set();
934
1155
  const tasksVerified = new Set();
1156
+ const tasksSettledPulse = new Set();
935
1157
  for (const e of window) {
936
1158
  const t = e.taskProof;
937
1159
  if (!t)
@@ -940,6 +1162,8 @@ function computeSnapshot(events, opts) {
940
1162
  tasks.add(t);
941
1163
  if (e.type === 'task_completed' || e.type === 'trade_settled')
942
1164
  tasksCompleted.add(t);
1165
+ if (e.type === 'trade_settled')
1166
+ tasksSettledPulse.add(t);
943
1167
  if (e.type === 'trade_verified')
944
1168
  tasksVerified.add(t);
945
1169
  }
@@ -964,15 +1188,62 @@ function computeSnapshot(events, opts) {
964
1188
  // 同源计数 + 链归属: **输入就是上表那批行**, 所以不可能与行数/链 id 打架
965
1189
  const activity_totals = summarizeActivityRows(activity.rows, { source: activity.source, gates: activity.gates });
966
1190
  const chain_id_scope = buildChainIdScope(activity.rows);
1191
+ // ★ 2026-09-24 (leo: 「数量怎么对不上, 尤其是后面的任务和钱包」):
1192
+ // 顶部任务类计数的**权威源改成链上索引** —— 它与下面那张表**同源**, 同源即恒等,
1193
+ // 从根上消灭「顶部 0 个任务 / 表格 15 行任务」这种并排矛盾 (不再靠 notes 辩解)。
1194
+ // 链上索引不可用 (降级 pulse-events) 时才退回旧的脉冲口径, 并在 fields 里如实标出降级。
1195
+ const chainAuthoritative = activity.source === 'chain-index';
1196
+ const totalsTasks = chainAuthoritative ? activity_totals.tasks : tasks.size;
1197
+ const totalsCompleted = chainAuthoritative ? activity_totals.tasks_completed : tasksCompleted.size;
1198
+ const totalsSettled = chainAuthoritative ? activity_totals.tasks_settled : tasksSettledPulse.size;
1199
+ // 「验真」在链上索引里**没有**对应事件 → 链上口径下这个数没有源 (null + 未接入), 不拿结算数冒充已验证
1200
+ const totalsVerified = chainAuthoritative ? null : tasksVerified.size;
1201
+ // 钱包签名: 真源 = 本机签名审计账 (窗口内条数, 只计数); 没有审计账 → 退回脉冲事件上报数;
1202
+ // 两个都没有 → null (未接入)。**绝不**在没有源的时候报 0 (那是「没发生过」, 是另一句话)。
1203
+ const sigTally = opts.signatureAudit ?? null;
1204
+ const auditWired = !!sigTally && sigTally.available === true;
1205
+ const totalsSignatures = auditWired
1206
+ ? Number(sigTally.count)
1207
+ : (signatureKeys.size > 0 ? signatureKeys.size : null);
1208
+ const fields = {
1209
+ nodes: pulseField({ zh: '不同节点数', en: 'distinct nodes' }),
1210
+ agents: pulseField({ zh: '不同 Agent 数', en: 'distinct agents' }),
1211
+ active_agents: pulseField({ zh: '活跃 Agent 数', en: 'active agents' }),
1212
+ seen_last_24h: pulseField({ zh: '24h 内出现过的不同 Agent', en: 'distinct agents seen within 24h' }),
1213
+ tasks: chainAuthoritative
1214
+ ? chainField({ zh: '有链上活动的不同任务', en: 'distinct tasks with on-chain activity' })
1215
+ : pulseField({ zh: '观察到发起的任务', en: 'tasks observed as created' }),
1216
+ tasks_completed: chainAuthoritative
1217
+ ? chainField({ zh: '交付完成 (ProofSubmittedV2) 的不同任务', en: 'distinct tasks with ProofSubmittedV2' })
1218
+ : pulseField({ zh: '交付完成的任务', en: 'tasks observed as completed' }),
1219
+ tasks_settled: chainAuthoritative
1220
+ ? chainField({ zh: '托管结算 (Released/Refunded/Expired/Disputed) 的不同任务', en: 'distinct tasks with an on-chain escrow settlement' })
1221
+ : pulseField({ zh: '链上口径结算的任务', en: 'tasks with on-chain settlement' }),
1222
+ tasks_verified: chainAuthoritative
1223
+ ? noneField({ zh: '链上索引没有「验真」事件', en: 'the chain index has no verification event' })
1224
+ : pulseField({ zh: '真验真 (trade_verified) 的任务', en: 'tasks truly verified (trade_verified)' }),
1225
+ signatures: auditWired
1226
+ ? signatureAuditField()
1227
+ : (signatureKeys.size > 0
1228
+ ? pulseField({ zh: '上报过的钱包签名 (按来源+时刻去重)', en: 'reported wallet signatures (deduped by source+time)' })
1229
+ : noneField({ zh: '本节点既没有签名审计账, 也没有签名脉冲事件', en: 'this node has neither a signature audit log nor signature pulse events' })),
1230
+ };
967
1231
  const totals_scope = {
968
- source: 'pulse-events',
1232
+ source: chainAuthoritative ? 'mixed' : 'pulse-events',
969
1233
  window_ms: exports.PULSE_LIMITS.windowMs,
970
1234
  label: {
971
- zh: `只统计本节点 ${exports.PULSE_LIMITS.windowMs / 3600000}h 观察窗口内收到的脉冲事件 (本节点自己上报的)`,
972
- en: `Only pulse events received by this node within the ${exports.PULSE_LIMITS.windowMs / 3600000}h observation window (reported by this node itself)`,
1235
+ zh: chainAuthoritative
1236
+ ? `节点/智能体 = 本节点 ${WINDOW_HOURS}h 脉冲事件; 任务/已完成/已结算 = 链上索引全量 (与下表同源); 钱包签名 = 本机签名审计`
1237
+ : `只统计本节点 ${WINDOW_HOURS}h 观察窗口内收到的脉冲事件 (本节点自己上报的)`,
1238
+ en: chainAuthoritative
1239
+ ? `nodes/agents = this node's ${WINDOW_HOURS}h pulse events; tasks/completed/settled = chain index, whole (same source as the table below); wallet signatures = this node's signature audit log`
1240
+ : `Only pulse events received by this node within the ${WINDOW_HOURS}h observation window (reported by this node itself)`,
973
1241
  },
974
1242
  differs_from_activity: activity_totals.rows > 0 &&
975
- (tasks.size !== activity_totals.tasks || tasksCompleted.size !== activity_totals.tasks_completed),
1243
+ (totalsTasks !== activity_totals.tasks ||
1244
+ totalsCompleted !== activity_totals.tasks_completed ||
1245
+ totalsSettled !== activity_totals.tasks_settled),
1246
+ fields,
976
1247
  };
977
1248
  if (activity.source === 'chain-index') {
978
1249
  notes.push(`confirmed_activity 来自链上索引 (chain-index): ${activity_totals.rows} 行 · ${activity_totals.tasks} 个不同任务 · ` +
@@ -985,10 +1256,21 @@ function computeSnapshot(events, opts) {
985
1256
  }
986
1257
  // 两套计数口径不同时**必须**解释 —— 页面不许出现「0 个任务」与「N 行任务」并存而不解释
987
1258
  if (totals_scope.differs_from_activity) {
988
- notes.push(`口径不同, 不是数据丢失: totals.tasks/tasks_completed/tasks_verified/signatures 只数本节点 ` +
989
- `${exports.PULSE_LIMITS.windowMs / 3600000}h 窗口内的脉冲事件 (本快照 tasks=${tasks.size} · tasks_completed=${tasksCompleted.size} · ` +
990
- `tasks_verified=${tasksVerified.size} · signatures=${signatureKeys.size}); 上表 ${activity_totals.rows} 行来自链上索引 ` +
991
- `(全量, 不是 ${exports.PULSE_LIMITS.windowMs / 3600000}h 窗口) —— 同源计数见 activity_totals`);
1259
+ notes.push(`口径不同, 不是数据丢失: 链上索引不可用 → 顶部任务类计数**降级为脉冲口径** (本快照 tasks=${tasks.size} · ` +
1260
+ `tasks_completed=${tasksCompleted.size} · tasks_verified=${tasksVerified.size} · tasks_settled=${tasksSettledPulse.size} · ` +
1261
+ `signatures=${signatureKeys.size}); 上表 ${activity_totals.rows} 行来自脉冲事件 (同源计数见 activity_totals, ` +
1262
+ `不是链上索引全量) —— 每个数的来源见 totals_scope.fields`);
1263
+ }
1264
+ if (chainAuthoritative) {
1265
+ notes.push(`顶部「任务/已完成/已结算」= 链上索引的**同源计数** (= activity_totals, 与下表同源, 同源即恒等): ` +
1266
+ `tasks=${totalsTasks} · tasks_completed=${totalsCompleted} · tasks_settled=${totalsSettled}; ` +
1267
+ `「节点/智能体」= 本节点 ${WINDOW_HOURS}h 脉冲事件; 「已验证」在链上索引里没有对应事件 → ` +
1268
+ `该口径无对应事件源, 不下发该字段 (不是 0); 「钱包签名」= ${auditWired
1269
+ ? `本机签名审计账 ${totalsSignatures} 条 (${WINDOW_HOURS}h 窗口, 只计数)`
1270
+ : (totalsSignatures === null
1271
+ ? '无可用源 (本节点既没有签名审计账, 也没有签名脉冲事件), 不下发该字段'
1272
+ : `脉冲事件上报 ${totalsSignatures} 条`)} — ` +
1273
+ `每个数的来源见 totals_scope.fields`);
992
1274
  }
993
1275
  if (activity_totals.rows > 0)
994
1276
  notes.push(chain_id_scope.note.zh);
@@ -1005,10 +1287,12 @@ function computeSnapshot(events, opts) {
1005
1287
  agents: agents.size,
1006
1288
  active_agents: active.size,
1007
1289
  seen_last_24h: agents.size, // 24h 窗口内的不同 Agent
1008
- tasks: tasks.size, // 观察到发起的任务数 (聚合, 无内容)
1009
- tasks_completed: tasksCompleted.size,
1010
- tasks_verified: tasksVerified.size,
1011
- signatures: signatureKeys.size, // 真实签名次数 (只计数)
1290
+ // ★ 任务类计数 = 链上索引同源值 (与下表恒等); 索引不可用才退回脉冲口径 (见 fields.tasks)
1291
+ tasks: totalsTasks,
1292
+ tasks_completed: totalsCompleted,
1293
+ tasks_verified: totalsVerified, // 链上口径下 = null (未接入), 不冒充 0
1294
+ signatures: totalsSignatures, // 真源 = 本机签名审计账; 无源 = null (未接入)
1295
+ tasks_settled: totalsSettled, // 新增字段一律排最后 (老 8 个字段顺序逐字不变)
1012
1296
  },
1013
1297
  totals_scope,
1014
1298
  capabilities,
@@ -1035,6 +1319,7 @@ async function getNetworkPulse(opts = {}) {
1035
1319
  const shapeOk = Array.isArray(cached?.confirmed_activity)
1036
1320
  && typeof cached?.confirmed_activity_source === 'string'
1037
1321
  && !!cached?.totals_scope
1322
+ && !!cached?.totals_scope?.fields // 老缓存没有逐字段口径 → 过期形状, 重算
1038
1323
  && !!cached?.activity_totals
1039
1324
  && !!cached?.chain_id_scope
1040
1325
  && Array.isArray(cached?.open_tasks); // 老缓存没有待接单任务 → 过期形状, 重算
@@ -1052,8 +1337,11 @@ async function getNetworkPulse(opts = {}) {
1052
1337
  }
1053
1338
  // 活动行优先取 P5 链上索引 (真链上事实); 索引不可用 → 退回脉冲事件, 并在快照里标出来源
1054
1339
  const confirmedActivity = await resolveConfirmedActivity({ home: opts.home, events, now });
1340
+ // 钱包签名的**真源**: 本机签名审计账 (窗口内条数)。没有账 → 注入 available:false → 快照标「未接入」
1341
+ // (不拿 0 冒充「没发生过」: 本机明明签过而脉冲事件丢了的那次真事故就是这么来的)
1342
+ const signatureAudit = tallySignatureAudit(opts.home, { now, windowMs: exports.PULSE_LIMITS.windowMs });
1055
1343
  // 待接单任务: 只读本机公告板目录 (未认领且未过期), 投影成白名单 7 字段 —— 与脉冲事件层无关
1056
- const snap = computeSnapshot(events, { now, confirmedActivity, openTasks: readOpenTasks(opts.home, now) });
1344
+ const snap = computeSnapshot(events, { now, confirmedActivity, openTasks: readOpenTasks(opts.home, now), signatureAudit });
1057
1345
  try {
1058
1346
  fs.mkdirSync((0, exports.pulseDir)(opts.home), { recursive: true });
1059
1347
  fs.writeFileSync(snapshotFile(opts.home), JSON.stringify(snap), 'utf8');