@wowok/agent-mcp 2.7.8 → 3.0.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 (393) hide show
  1. package/README.md +2 -2
  2. package/dist/config/runtime.d.ts +1 -1
  3. package/dist/config/runtime.js +1 -1
  4. package/dist/examples/rental-ziroom-machine-create.json +1 -2
  5. package/dist/examples/rental-ziroom-permission-create.json +1 -2
  6. package/dist/examples/rental-ziroom-service-create.json +1 -2
  7. package/dist/experience/experience-reuse.js +1 -1
  8. package/dist/experience/index.d.ts +2 -1
  9. package/dist/experience/index.js +1 -1
  10. package/dist/experience/persistence-config.d.ts +6 -0
  11. package/dist/experience/persistence-config.js +1 -0
  12. package/dist/experience/persistence.d.ts +21 -0
  13. package/dist/experience/persistence.js +1 -0
  14. package/dist/experience/realtime-feedback.js +1 -1
  15. package/dist/experience/user-profile.js +1 -1
  16. package/dist/extensions/business-modules.d.ts +1 -1
  17. package/dist/extensions/capability-manifest.d.ts +2 -83
  18. package/dist/extensions/capability-manifest.js +1 -1
  19. package/dist/extensions/constraint-registry.d.ts +6 -4
  20. package/dist/extensions/constraint-registry.js +1 -1
  21. package/dist/extensions/index.d.ts +4 -5
  22. package/dist/extensions/index.js +1 -1
  23. package/dist/extensions/industry-pack.js +1 -1
  24. package/dist/extensions/metric-registry.d.ts +6 -4
  25. package/dist/extensions/metric-registry.js +1 -1
  26. package/dist/extensions/mode-evaluator.d.ts +2 -3
  27. package/dist/extensions/mode-evaluator.js +1 -1
  28. package/dist/extensions/registry.d.ts +3 -25
  29. package/dist/extensions/registry.js +1 -1
  30. package/dist/extensions/types.d.ts +1 -69
  31. package/dist/goal/GoalClassifier.d.ts +17 -0
  32. package/dist/goal/GoalClassifier.js +1 -0
  33. package/dist/goal/GoalEngine.d.ts +155 -0
  34. package/dist/goal/GoalEngine.js +1 -0
  35. package/dist/goal/GoalStore.d.ts +27 -0
  36. package/dist/goal/GoalStore.js +1 -0
  37. package/dist/goal/plan-approval.d.ts +5 -0
  38. package/dist/goal/plan-approval.js +1 -0
  39. package/dist/goal/types.d.ts +80 -0
  40. package/dist/goal/types.js +1 -0
  41. package/dist/harness/index.d.ts +2 -7
  42. package/dist/harness/index.js +1 -1
  43. package/dist/harness/plan.d.ts +1 -1
  44. package/dist/harness/types.d.ts +0 -35
  45. package/dist/index.js +1 -1
  46. package/dist/knowledge/account-marks.d.ts +36 -0
  47. package/dist/knowledge/account-marks.js +1 -0
  48. package/dist/knowledge/audit-rules.d.ts +3 -1
  49. package/dist/knowledge/audit-rules.js +1 -1
  50. package/dist/knowledge/examples-scanner-cli.js +1 -1
  51. package/dist/knowledge/examples-scanner.js +1 -1
  52. package/dist/knowledge/fund-layer.d.ts +13 -9
  53. package/dist/knowledge/fund-layer.js +1 -1
  54. package/dist/knowledge/goal-completion.d.ts +19 -0
  55. package/dist/knowledge/goal-completion.js +1 -0
  56. package/dist/knowledge/guard-bindings.d.ts +21 -0
  57. package/dist/knowledge/guard-bindings.js +1 -0
  58. package/dist/knowledge/guard-translation.js +1 -1
  59. package/dist/knowledge/index.d.ts +6 -3
  60. package/dist/knowledge/index.js +1 -1
  61. package/dist/knowledge/industry-registry.js +1 -1
  62. package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
  63. package/dist/knowledge/mcp-schema-audit.js +1 -1
  64. package/dist/knowledge/operation-dictionary.js +1 -1
  65. package/dist/knowledge/passport-confirm.js +1 -1
  66. package/dist/knowledge/passport-puzzle.js +1 -1
  67. package/dist/knowledge/passport-translation.js +1 -1
  68. package/dist/knowledge/proof-risk.js +1 -1
  69. package/dist/knowledge/reward-risk.d.ts +1 -1
  70. package/dist/knowledge/reward-risk.js +1 -1
  71. package/dist/knowledge/safety-rules.d.ts +2 -1
  72. package/dist/knowledge/safety-rules.js +1 -1
  73. package/dist/knowledge/scenario-topology.d.ts +43 -0
  74. package/dist/knowledge/scenario-topology.js +1 -0
  75. package/dist/knowledge/service-translation.js +1 -1
  76. package/dist/knowledge/supply-chain.js +1 -1
  77. package/dist/knowledge/template-registry.js +1 -1
  78. package/dist/knowledge/tools-reference.js +1 -1
  79. package/dist/knowledge/workflow-guidance.d.ts +36 -0
  80. package/dist/knowledge/workflow-guidance.js +1 -1
  81. package/dist/knowledge/workspace-lists.d.ts +57 -0
  82. package/dist/knowledge/workspace-lists.js +1 -0
  83. package/dist/loop-engineering/context-collect.d.ts +1 -1
  84. package/dist/monitor/EventRouter.d.ts +10 -0
  85. package/dist/monitor/EventRouter.js +1 -0
  86. package/dist/monitor/EventStore.d.ts +32 -12
  87. package/dist/monitor/EventStore.js +1 -1
  88. package/dist/monitor/MonitorLoop.d.ts +81 -0
  89. package/dist/monitor/MonitorLoop.js +1 -0
  90. package/dist/monitor/ProblemBridge.d.ts +32 -0
  91. package/dist/monitor/ProblemBridge.js +1 -0
  92. package/dist/monitor/ScopeResolver.d.ts +59 -0
  93. package/dist/monitor/ScopeResolver.js +1 -0
  94. package/dist/monitor/SubscriptionStore.d.ts +13 -0
  95. package/dist/monitor/SubscriptionStore.js +1 -0
  96. package/dist/monitor/SuggestionBridge.d.ts +38 -0
  97. package/dist/monitor/SuggestionBridge.js +1 -0
  98. package/dist/monitor/normalize.d.ts +8 -0
  99. package/dist/monitor/normalize.js +1 -0
  100. package/dist/monitor/types.d.ts +89 -0
  101. package/dist/monitor/types.js +1 -0
  102. package/dist/participation/arbitrator-interest.d.ts +20 -0
  103. package/dist/participation/arbitrator-interest.js +1 -0
  104. package/dist/participation/demander-interest.d.ts +23 -0
  105. package/dist/participation/demander-interest.js +1 -0
  106. package/dist/persona/address-format.d.ts +1 -1
  107. package/dist/persona/address-format.js +1 -1
  108. package/dist/persona/distill-goal.d.ts +20 -0
  109. package/dist/persona/distill-goal.js +1 -0
  110. package/dist/persona/index.d.ts +2 -0
  111. package/dist/persona/index.js +1 -1
  112. package/dist/persona/model.js +1 -1
  113. package/dist/playbooks/service-build/business-puzzle.js +1 -0
  114. package/dist/{project → playbooks/service-build}/context-assembly.d.ts +9 -4
  115. package/dist/playbooks/service-build/context-assembly.js +1 -0
  116. package/dist/{project → playbooks/service-build}/game-theory.d.ts +1 -1
  117. package/dist/playbooks/service-build/index.d.ts +14 -0
  118. package/dist/playbooks/service-build/index.js +1 -0
  119. package/dist/{project → playbooks/service-build}/intent-analyzer.d.ts +1 -1
  120. package/dist/playbooks/service-build/intent-analyzer.js +1 -0
  121. package/dist/playbooks/service-build/machine-nodes.js +1 -0
  122. package/dist/{project → playbooks/service-build}/machine-panorama.d.ts +5 -3
  123. package/dist/playbooks/service-build/machine-panorama.js +1 -0
  124. package/dist/{project → playbooks/service-build}/merchant-guide.d.ts +21 -1
  125. package/dist/playbooks/service-build/merchant-guide.js +1 -0
  126. package/dist/{project → playbooks/service-build}/mode-actions.d.ts +32 -8
  127. package/dist/playbooks/service-build/mode-actions.js +1 -0
  128. package/dist/playbooks/service-build/namespace.d.ts +2 -0
  129. package/dist/playbooks/service-build/namespace.js +1 -0
  130. package/dist/{project → playbooks/service-build}/object-panorama.d.ts +2 -3
  131. package/dist/playbooks/service-build/object-panorama.js +1 -0
  132. package/dist/{project → playbooks/service-build}/participation-radar.d.ts +4 -5
  133. package/dist/playbooks/service-build/participation-radar.js +1 -0
  134. package/dist/{project → playbooks/service-build}/pipeline-actions.d.ts +9 -9
  135. package/dist/playbooks/service-build/pipeline-actions.js +1 -0
  136. package/dist/playbooks/service-build/process.d.ts +6 -0
  137. package/dist/playbooks/service-build/process.js +1 -0
  138. package/dist/playbooks/service-build/relationship-profile.d.ts +2 -0
  139. package/dist/playbooks/service-build/relationship-profile.js +1 -0
  140. package/dist/playbooks/service-build/risk-aggregator.js +1 -0
  141. package/dist/{project → playbooks/service-build}/semantic-graph.d.ts +7 -3
  142. package/dist/playbooks/service-build/semantic-graph.js +1 -0
  143. package/dist/{project → playbooks/service-build}/service-panorama.d.ts +3 -19
  144. package/dist/playbooks/service-build/service-panorama.js +1 -0
  145. package/dist/relationship/derivation.d.ts +88 -0
  146. package/dist/relationship/derivation.js +1 -0
  147. package/dist/relationship/incentive.d.ts +38 -0
  148. package/dist/relationship/incentive.js +1 -0
  149. package/dist/relationship/index.d.ts +4 -0
  150. package/dist/relationship/index.js +1 -0
  151. package/dist/relationship/registry.d.ts +13 -0
  152. package/dist/relationship/registry.js +1 -0
  153. package/dist/relationship/types.d.ts +45 -0
  154. package/dist/relationship/types.js +1 -0
  155. package/dist/review/arb.d.ts +6 -0
  156. package/dist/review/arb.js +1 -0
  157. package/dist/review/demand.d.ts +3 -0
  158. package/dist/review/demand.js +1 -0
  159. package/dist/review/index.d.ts +3 -0
  160. package/dist/review/index.js +1 -0
  161. package/dist/review/machine.d.ts +3 -0
  162. package/dist/review/machine.js +1 -0
  163. package/dist/review/order.d.ts +9 -0
  164. package/dist/review/order.js +1 -0
  165. package/dist/review/progress.d.ts +3 -0
  166. package/dist/review/progress.js +1 -0
  167. package/dist/review/repository.d.ts +3 -0
  168. package/dist/review/repository.js +1 -0
  169. package/dist/review/service.d.ts +5 -0
  170. package/dist/review/service.js +1 -0
  171. package/dist/review/types.d.ts +156 -0
  172. package/dist/review/types.js +1 -0
  173. package/dist/rules.d.ts +2 -2
  174. package/dist/rules.js +1 -1
  175. package/dist/safety/confirm-gate.js +1 -1
  176. package/dist/safety/index.d.ts +1 -1
  177. package/dist/safety/index.js +1 -1
  178. package/dist/safety/preview.d.ts +1 -0
  179. package/dist/safety/preview.js +1 -1
  180. package/dist/schema/call/allocation.d.ts +1 -1
  181. package/dist/schema/call/arbitration.d.ts +1 -1
  182. package/dist/schema/call/base.d.ts +1 -1
  183. package/dist/schema/call/base.js +1 -1
  184. package/dist/schema/call/bridge.d.ts +29 -7
  185. package/dist/schema/call/bridge.js +1 -1
  186. package/dist/schema/call/contact.d.ts +1 -1
  187. package/dist/schema/call/contact.js +1 -1
  188. package/dist/schema/call/demand.d.ts +1 -1
  189. package/dist/schema/call/demand.js +1 -1
  190. package/dist/schema/call/guard.d.ts +3 -3
  191. package/dist/schema/call/handler.d.ts +0 -3
  192. package/dist/schema/call/handler.js +1 -1
  193. package/dist/schema/call/machine.d.ts +2 -2
  194. package/dist/schema/call/order.d.ts +1 -1
  195. package/dist/schema/call/payment.d.ts +1 -1
  196. package/dist/schema/call/permission.d.ts +1 -1
  197. package/dist/schema/call/personal.d.ts +1 -1
  198. package/dist/schema/call/progress.d.ts +1 -1
  199. package/dist/schema/call/proof.d.ts +2 -2
  200. package/dist/schema/call/repository.d.ts +1 -1
  201. package/dist/schema/call/repository.js +1 -1
  202. package/dist/schema/call/reward.d.ts +1 -1
  203. package/dist/schema/call/semantic.js +1 -1
  204. package/dist/schema/call/service.d.ts +1 -1
  205. package/dist/schema/call/service.js +1 -1
  206. package/dist/schema/call/treasury.d.ts +1 -1
  207. package/dist/schema/common/index.js +1 -1
  208. package/dist/schema/goal/index.d.ts +343 -0
  209. package/dist/schema/goal/index.js +1 -0
  210. package/dist/schema/goal/planning.d.ts +465 -0
  211. package/dist/schema/goal/planning.js +1 -0
  212. package/dist/schema/index.d.ts +1 -2
  213. package/dist/schema/index.js +1 -1
  214. package/dist/schema/industry-pack/index.d.ts +323 -1
  215. package/dist/schema/industry-pack/index.js +1 -1
  216. package/dist/schema/industry-pack/modes.d.ts +326 -0
  217. package/dist/schema/industry-pack/modes.js +1 -0
  218. package/dist/schema/intent-radar/index.d.ts +19 -19
  219. package/dist/schema/local/index.d.ts +11 -0
  220. package/dist/schema/local/index.js +1 -1
  221. package/dist/schema/operations.d.ts +258 -19
  222. package/dist/schema/operations.js +1 -1
  223. package/dist/schema/permission/index.d.ts +1 -0
  224. package/dist/schema/permission/index.js +1 -1
  225. package/dist/schema/persona/index.d.ts +40 -0
  226. package/dist/schema/persona/index.js +1 -1
  227. package/dist/schema/query/bi.d.ts +912 -0
  228. package/dist/schema/query/bi.js +1 -0
  229. package/dist/schema/query/index.d.ts +663 -2
  230. package/dist/schema/query/index.js +1 -1
  231. package/dist/schema/schema-version.js +1 -1
  232. package/dist/schema/utils/skills-recommendation.d.ts +0 -1
  233. package/dist/schema/utils/skills-recommendation.js +1 -1
  234. package/dist/schema-query-impl/index.js +1 -1
  235. package/dist/schemas/account_operation.output.json +32 -3
  236. package/dist/schemas/account_operation.schema.json +8 -4
  237. package/dist/schemas/bridge_operation.output.json +26 -3
  238. package/dist/schemas/bridge_operation.schema.json +85 -13
  239. package/dist/schemas/config_operation.output.json +1 -1
  240. package/dist/schemas/config_operation.schema.json +1 -1
  241. package/dist/schemas/goal_operation.schema.json +1092 -0
  242. package/dist/schemas/guard2file.schema.json +3 -3
  243. package/dist/schemas/index.json +12 -13
  244. package/dist/schemas/industry_pack_operation.output.json +1073 -0
  245. package/dist/schemas/industry_pack_operation.schema.json +236 -2
  246. package/dist/schemas/local_info_operation.output.json +2 -2
  247. package/dist/schemas/local_mark_operation.output.json +2 -2
  248. package/dist/schemas/machineNode2file.schema.json +3 -3
  249. package/dist/schemas/messenger_operation.output.json +2 -2
  250. package/dist/schemas/monitor_events.output.json +78 -3
  251. package/dist/schemas/monitor_events.schema.json +24 -1
  252. package/dist/schemas/monitor_subscription.output.json +1462 -0
  253. package/dist/schemas/monitor_subscription.schema.json +327 -0
  254. package/dist/schemas/onchain_events.output.json +5 -5
  255. package/dist/schemas/onchain_operations.output.json +2 -2
  256. package/dist/schemas/onchain_operations.schema.json +100 -100
  257. package/dist/schemas/onchain_operations_allocation.schema.json +7 -7
  258. package/dist/schemas/onchain_operations_arbitration.schema.json +6 -6
  259. package/dist/schemas/onchain_operations_contact.schema.json +6 -6
  260. package/dist/schemas/onchain_operations_demand.schema.json +6 -6
  261. package/dist/schemas/onchain_operations_gen_passport.schema.json +3 -3
  262. package/dist/schemas/onchain_operations_gen_proof.schema.json +3 -3
  263. package/dist/schemas/onchain_operations_guard.schema.json +3 -3
  264. package/dist/schemas/onchain_operations_machine.schema.json +5 -5
  265. package/dist/schemas/onchain_operations_order.schema.json +5 -5
  266. package/dist/schemas/onchain_operations_payment.schema.json +4 -4
  267. package/dist/schemas/onchain_operations_permission.schema.json +5 -5
  268. package/dist/schemas/onchain_operations_personal.schema.json +3 -3
  269. package/dist/schemas/onchain_operations_progress.schema.json +5 -5
  270. package/dist/schemas/onchain_operations_proof.schema.json +3 -3
  271. package/dist/schemas/onchain_operations_repository.schema.json +7 -7
  272. package/dist/schemas/onchain_operations_reward.schema.json +9 -9
  273. package/dist/schemas/onchain_operations_service.schema.json +11 -11
  274. package/dist/schemas/onchain_operations_treasury.schema.json +9 -9
  275. package/dist/schemas/onchain_table_data.output.json +399 -2
  276. package/dist/schemas/onchain_table_data.schema.json +22 -22
  277. package/dist/schemas/permission_operation.schema.json +6 -2
  278. package/dist/schemas/persona_operation.output.json +145 -0
  279. package/dist/schemas/persona_operation.schema.json +28 -2
  280. package/dist/schemas/query_toolkit.output.json +1514 -22
  281. package/dist/schemas/query_toolkit.schema.json +465 -11
  282. package/dist/schemas/workflow_operation.schema.json +4 -4
  283. package/dist/task/ProcessStore.d.ts +98 -0
  284. package/dist/task/ProcessStore.js +1 -0
  285. package/dist/task/playbook.d.ts +11 -0
  286. package/dist/task/playbook.js +1 -0
  287. package/dist/task/stage-gate.d.ts +22 -0
  288. package/dist/task/stage-gate.js +1 -0
  289. package/dist/{project → task}/substep-trace.d.ts +6 -45
  290. package/dist/task/types.d.ts +144 -0
  291. package/dist/task/types.js +1 -0
  292. package/dist/tools/handlers/config.js +1 -1
  293. package/dist/tools/handlers/evaluation.js +1 -1
  294. package/dist/tools/handlers/goal.d.ts +4 -0
  295. package/dist/tools/handlers/goal.js +1 -0
  296. package/dist/tools/handlers/industry-pack.js +1 -1
  297. package/dist/tools/handlers/local.d.ts +4 -3
  298. package/dist/tools/handlers/local.js +1 -1
  299. package/dist/tools/handlers/monitor.d.ts +24 -0
  300. package/dist/tools/handlers/monitor.js +1 -1
  301. package/dist/tools/handlers/network.d.ts +1 -0
  302. package/dist/tools/handlers/network.js +1 -0
  303. package/dist/tools/handlers/onchain.js +1 -1
  304. package/dist/tools/handlers/permission.js +1 -1
  305. package/dist/tools/handlers/persona.js +1 -1
  306. package/dist/tools/handlers/query.js +1 -1
  307. package/dist/tools/handlers/watch.js +1 -1
  308. package/dist/tools/handlers/workflow.js +1 -1
  309. package/dist/tools/index.d.ts +2 -0
  310. package/dist/tools/index.js +1 -1
  311. package/dist/tools/rules-hook.d.ts +1 -0
  312. package/dist/tools/rules-hook.js +1 -1
  313. package/dist/tools/shared.js +1 -1
  314. package/dist/tools/wrap.js +1 -1
  315. package/package.json +5 -4
  316. package/dist/harness/checkpoint.d.ts +0 -8
  317. package/dist/harness/checkpoint.js +0 -1
  318. package/dist/knowledge/deployment-scanner.d.ts +0 -66
  319. package/dist/knowledge/deployment-scanner.js +0 -1
  320. package/dist/mode-market/index.d.ts +0 -3
  321. package/dist/mode-market/index.js +0 -1
  322. package/dist/mode-market/registry.d.ts +0 -53
  323. package/dist/mode-market/registry.js +0 -1
  324. package/dist/mode-market/review.d.ts +0 -27
  325. package/dist/mode-market/review.js +0 -1
  326. package/dist/mode-market/submission.d.ts +0 -25
  327. package/dist/mode-market/submission.js +0 -1
  328. package/dist/project/business-puzzle.js +0 -1
  329. package/dist/project/context-assembly.js +0 -1
  330. package/dist/project/deployment-bridge.d.ts +0 -5
  331. package/dist/project/deployment-bridge.js +0 -1
  332. package/dist/project/deployment-doc.d.ts +0 -190
  333. package/dist/project/deployment-doc.js +0 -1
  334. package/dist/project/edit-planner.d.ts +0 -123
  335. package/dist/project/edit-planner.js +0 -1
  336. package/dist/project/evaluation-fix.spec.d.ts +0 -1
  337. package/dist/project/evaluation-fix.spec.js +0 -1
  338. package/dist/project/evaluation.d.ts +0 -127
  339. package/dist/project/evaluation.js +0 -1
  340. package/dist/project/graph-builder.d.ts +0 -51
  341. package/dist/project/graph-builder.js +0 -1
  342. package/dist/project/graph.d.ts +0 -70
  343. package/dist/project/graph.js +0 -1
  344. package/dist/project/handlers.d.ts +0 -524
  345. package/dist/project/handlers.js +0 -1
  346. package/dist/project/index.d.ts +0 -91
  347. package/dist/project/index.js +0 -1
  348. package/dist/project/intent-analyzer.js +0 -1
  349. package/dist/project/machine-nodes.js +0 -1
  350. package/dist/project/machine-panorama.js +0 -1
  351. package/dist/project/merchant-guide.js +0 -1
  352. package/dist/project/mode-actions.js +0 -1
  353. package/dist/project/namespace.d.ts +0 -72
  354. package/dist/project/namespace.js +0 -1
  355. package/dist/project/object-panorama.js +0 -1
  356. package/dist/project/participation-radar.js +0 -1
  357. package/dist/project/pipeline-actions.js +0 -1
  358. package/dist/project/project-store.d.ts +0 -110
  359. package/dist/project/project-store.js +0 -1
  360. package/dist/project/query.d.ts +0 -43
  361. package/dist/project/query.js +0 -1
  362. package/dist/project/risk-aggregator.js +0 -1
  363. package/dist/project/semantic-assembler.d.ts +0 -93
  364. package/dist/project/semantic-assembler.js +0 -1
  365. package/dist/project/semantic-graph.js +0 -1
  366. package/dist/project/service-panorama.js +0 -1
  367. package/dist/project/stage-gate.d.ts +0 -52
  368. package/dist/project/stage-gate.js +0 -1
  369. package/dist/project/task-tracker.d.ts +0 -30
  370. package/dist/project/task-tracker.js +0 -1
  371. package/dist/schema/project/index.d.ts +0 -2021
  372. package/dist/schema/project/index.js +0 -1
  373. package/dist/schema/task-status.d.ts +0 -62
  374. package/dist/schema/task-status.js +0 -1
  375. package/dist/schemas/project_operation.output.json +0 -7877
  376. package/dist/schemas/project_operation.schema.json +0 -1139
  377. package/dist/schemas/query_task_status.output.json +0 -211
  378. package/dist/schemas/query_task_status.schema.json +0 -18
  379. package/dist/tools/handlers/project.d.ts +0 -2
  380. package/dist/tools/handlers/project.js +0 -1
  381. package/dist/tools/handlers/task-status.d.ts +0 -2
  382. package/dist/tools/handlers/task-status.js +0 -1
  383. /package/dist/{project → playbooks/service-build}/business-puzzle.d.ts +0 -0
  384. /package/dist/{project → playbooks/service-build}/game-theory.js +0 -0
  385. /package/dist/{project → playbooks/service-build}/machine-nodes.d.ts +0 -0
  386. /package/dist/{project → playbooks/service-build}/object-type.d.ts +0 -0
  387. /package/dist/{project → playbooks/service-build}/object-type.js +0 -0
  388. /package/dist/{project → playbooks/service-build}/reverse-mapping.d.ts +0 -0
  389. /package/dist/{project → playbooks/service-build}/reverse-mapping.js +0 -0
  390. /package/dist/{project → playbooks/service-build}/risk-aggregator.d.ts +0 -0
  391. /package/dist/{project → playbooks/service-build}/workflow-design-assessment.d.ts +0 -0
  392. /package/dist/{project → playbooks/service-build}/workflow-design-assessment.js +0 -0
  393. /package/dist/{project → task}/substep-trace.js +0 -0
@@ -1 +1 @@
1
- import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID,queryOrdersByUser}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export const QUERY_OBJECTS_BATCH=0x32;export async function fetchAllFieldObjectIds(a,b,c){const d=[];let e=undefined;for(;;){const f=await query_table({'parent':a,'cursor':e??undefined,'no_cache':c,'network':b});if(!f?.['items']||f['items']['length']===0x0)break;for(const g of f['items']){const h=g?.['object'];if(typeof h==='string')d['push'](h);}if(!f['hasNextPage']||!f['nextCursor'])break;e=f['nextCursor'];}return d;}export async function batchQueryObjectsByIds(a,b,c){const d=[];for(let e=0x0;e<a['length'];e+=QUERY_OBJECTS_BATCH){const f=a['slice'](e,e+QUERY_OBJECTS_BATCH),g=await query_objects({'objects':f,'no_cache':c,'network':b});d['push'](...g?.['objects']??[]);}return d;}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const g=await fetchAllFieldObjectIds(f,b,c);if(g['length']===0x0)return[];const h=await batchQueryObjectsByIds(g,b,c);return(h??[])['filter'](i=>i?.['type']==='TableItem_MachineNode')['map'](i=>{const j=i?.['data']??i,k=typeof j?.['name']==='string'?j['name']:'',l=Array['isArray'](j?.['value'])?j['value']:Array['isArray'](j?.['pairs'])?j['pairs']:[];if(!k)return null;return{'name':k,'pairs':l['map'](m=>({'prev_node':String(m?.['prev_node']??''),'threshold':Number(m?.['threshold']??0x0),'forwards':Array['isArray'](m?.['forwards'])?m['forwards']['map'](n=>{const q=typeof n?.['guard']==='object'&&n?.['guard']!==null?n['guard']['guard']??undefined:typeof n?.['guard']==='string'?n['guard']:undefined;return{'name':String(n?.['name']??''),'weight':Number(n?.['weight']??0x0),'namedOperator':n?.['namedOperator']!==undefined&&n?.['namedOperator']!==null?String(n['namedOperator']):undefined,'permissionIndex':n?.['permissionIndex']!==undefined&&n?.['permissionIndex']!==null?Number(n['permissionIndex']):undefined,'guard':q};}):[]}))};})['filter'](i=>i!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'orderHolderAddresses':a['orderHolderAddresses'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](v=>v?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],![]);let k,l;try{const v=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),w=v?.['objects']?.[0x0],x=w?.['data']??w,y=x?.['permission'];if(y){const z=await query_objects({'objects':[y],'no_cache':a['noCache'],'network':a['network']}),A=z?.['objects']?.[0x0];k=(A?.['data']??A)?.['description']??undefined,l=await fetchPermissionContext(y,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](B=>({'name':String(B?.['name']??''),'operators':(B?.['operators']??[])['map'](C=>String(C))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));const o=n?Array['from'](new Set([n['builder'],...n['agent']])['values']()):i;let p;try{p=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{p=undefined;}const q=await makeNameResolver([a['accountName'],...o]),r={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':p,'orderHolderAddresses':o,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':q},s=buildWorkflowGuidance(r);let t;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(t=buildWorkflowReceipt({...r,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const u=[t?renderReceiptText(t):undefined,s['options']['length']?renderGuidanceText(s):undefined]['filter'](B=>!!B)['join']('\x0a\x0a');return{'guidance':s,'receipt':t,'text':u};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_PERMISSION_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=Number(m?.['role']??0x0),o=String(m?.['permission']??'')['toLowerCase'](),p=Number(m?.['time']??0x0);o&&(j['push']({'role':n,'permission':o,'time':p}),k['set'](o,(k['get'](o)??0x0)|n));}return{'items':j,'byPermission':k};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=bcs['Address']['serialize'](b)['toBytes'](),g=deriveDynamicFieldID(a,'address',f),h=await query_objects({'objects':[g],'no_cache':e,'network':c}),i=h?.['objects']?.[0x0],j=i?.['data']??i,k=[],l=new Map(),m=Array['isArray'](j?.['items'])?j['items']:[];for(const n of m){const o=String(n?.['who']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(k['push']({'who':o,'time':p}),l['set'](o,p));}return{'items':k,'byWho':l};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),j=await fetchAllFieldObjectIds(a,b,c);if(j['length']>0x0){const k=await batchQueryObjectsByIds(j,b,c);for(const l of k??[]){const m=l?.['data']??l,n=m?.['address'],p=m?.['perm'];n!=null&&Array['isArray'](p)&&i['set'](String(n)['toLowerCase'](),new Set(p['map'](q=>Number(q))));}}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??f?.['data']?.['type'])!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g?.['builder']??g?.['owner']??''),'agent':new Set((g?.['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}
1
+ import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID,queryOrdersByUser,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export const QUERY_OBJECTS_BATCH=0x32;export async function fetchTableEntries(a,b){const c=[],d=b?.['maxItems'];let e=![],f=undefined;for(;;){const g=await query_table({'parent':a,'cursor':f??undefined,'limit':b?.['limit'],'no_cache':b?.['noCache'],'network':b?.['network']});for(const i of g?.['items']??[]){if(d!==undefined&&c['length']>=d)break;const j=String(i?.['object']??'');if(!j['startsWith']('0x'))continue;c['push']({'key':String(i?.['key']?.['value']??''),'objectId':j});}const h=g?.['hasNextPage']===!![]&&!!g?.['nextCursor'];if(d!==undefined&&c['length']>=d){e=h;break;}if(!h)break;f=String(g['nextCursor']);}return{'entries':c,'truncated':e};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryObjectsByIds(a,b,c){const d=[];for(let e=0x0;e<a['length'];e+=QUERY_OBJECTS_BATCH){const f=a['slice'](e,e+QUERY_OBJECTS_BATCH),g=await query_objects({'objects':f,'no_cache':c,'network':b});d['push'](...g?.['objects']??[]);}return d;}export async function batchQueryTableItems(a,b){const {entries:c,truncated:d}=await fetchTableEntries(a,b),e=c['length']>0x0?await batchQueryObjectsByIds(c['map'](h=>h['objectId']),b?.['network'],b?.['noCache']):[],f=new Map();for(const h of e){const i=String(h?.['object']??'')['toLowerCase']();if(i)f['set'](i,h);}const g=c['map'](j=>({...j,'object':f['get'](j['objectId']['toLowerCase']())}));return{'items':g,'truncated':d};}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](v=>v?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],![]);let k,l;try{const v=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),w=v?.['objects']?.[0x0],x=w?.['data']??w,y=x?.['permission'];if(y){const z=await query_objects({'objects':[y],'no_cache':a['noCache'],'network':a['network']}),A=z?.['objects']?.[0x0];k=(A?.['data']??A)?.['description']??undefined,l=await fetchPermissionContext(y,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](B=>({'name':String(B?.['name']??''),'operators':(B?.['operators']??[])['map'](C=>String(C))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));const o=n?Array['from'](new Set([n['builder'],...n['agent']])['values']()):i;let p;try{p=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{p=undefined;}const q=await makeNameResolver([a['accountName'],...o]),r={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':p,'orderHolderAddresses':o,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':q},s=buildWorkflowGuidance(r);let t;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(t=buildWorkflowReceipt({...r,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const u=[t?renderReceiptText(t):undefined,s['options']['length']&&!t?.['next_guidance']?.['options']['length']?renderGuidanceText(s):undefined]['filter'](B=>!!B)['join']('\x0a\x0a');return{'guidance':s,'receipt':t,'text':u};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';async function batchReadDerivedFields(a,b,c,d){const e=new Map();if(b['length']===0x0)return e;const f=new Map();for(const h of b){const i=deriveDynamicFieldID(a,h['typeTag'],h['keyBytes'])['toLowerCase']();f['set'](i,h['joinKey']);}const g=await batchQueryObjectsByIds([...f['keys']()],c,d);for(const j of g){const l=String(j?.['object']??'')['toLowerCase'](),m=f['get'](l);if(!m)continue;e['set'](m,j?.['data']??j);}return e;}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchReadDerivedFields(a,e['map'](f=>({'typeTag':'address','keyBytes':bcs['Address']['serialize'](f)['toBytes'](),'joinKey':f})),c,d);}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchReadDerivedFields(a,e['map'](f=>({'typeTag':'u64','keyBytes':bcs['u64']()['serialize'](Number(f))['toBytes'](),'joinKey':f})),c,d);}export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_PERMISSION_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=Number(j?.['role']??0x0),l=String(j?.['permission']??'')['toLowerCase'](),m=Number(j?.['time']??0x0);l&&(g['push']({'role':k,'permission':l,'time':m}),h['set'](l,(h['get'](l)??0x0)|k));}return{'items':g,'byPermission':h};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_CONTACT_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=String(j?.['contact']??'')['toLowerCase'](),l=Number(j?.['time']??0x0);k&&(g['push']({'contact':k,'time':l}),h['set'](k,(h['get'](k)??l)||l));}return{'items':g,'byContact':h};}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=await batchReadAddressKeyedFields(a,[b],c,e),g=f['get'](String(b)['toLowerCase']()),h=[],i=new Map(),j=Array['isArray'](g?.['items'])?g['items']:[];for(const k of j){const l=String(k?.['who']??'')['toLowerCase'](),m=Number(k?.['time']??0x0);l&&(h['push']({'who':l,'time':m}),i['set'](l,m));}return{'items':h,'byWho':i};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](f=>objectTypeFromAddress(f['who'])===ObjectType['Order']);return{'items':e,'byWho':new Map(e['map'](f=>[f['who'],f['time']]))};}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'];if(!l)continue;const m=l?.['data']??l,n=m?.['address'],p=m?.['perm'];n!=null&&Array['isArray'](p)&&i['set'](String(n)['toLowerCase'](),new Set(p['map'](q=>Number(q))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??f?.['data']?.['type'])!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g?.['builder']??g?.['owner']??''),'agent':new Set((g?.['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}
@@ -0,0 +1,57 @@
1
+ export interface WorkspaceListItem {
2
+ object: string;
3
+ object_type: string | null;
4
+ name?: string;
5
+ time?: number;
6
+ description?: string;
7
+ tags?: string[];
8
+ location?: string;
9
+ members_total?: number;
10
+ members_mine?: number;
11
+ related_objects?: number;
12
+ records_total?: number;
13
+ policies_total?: number;
14
+ rewards_total?: number;
15
+ token?: string;
16
+ balance_total?: string;
17
+ type_raw?: string;
18
+ guards_total?: number;
19
+ claimers?: number;
20
+ inflow?: string;
21
+ outflow?: string;
22
+ status?: "LIVE" | "PAUSED" | "UNPUBLISHED";
23
+ nodes?: number;
24
+ edges?: number;
25
+ progresses?: number;
26
+ rep?: {
27
+ like: number;
28
+ dislike: number;
29
+ favor: number;
30
+ votes?: {
31
+ who: string | null;
32
+ like: boolean;
33
+ dislike: boolean;
34
+ favor: boolean;
35
+ }[];
36
+ };
37
+ }
38
+ export interface WorkspaceListsResult {
39
+ action: "workspace_lists";
40
+ network?: string;
41
+ updated_at_ms: number;
42
+ cached: boolean;
43
+ treasuries: WorkspaceListItem[];
44
+ repositories: WorkspaceListItem[];
45
+ contacts: WorkspaceListItem[];
46
+ machines: WorkspaceListItem[];
47
+ rewards: WorkspaceListItem[];
48
+ others: WorkspaceListItem[];
49
+ counts: Record<string, number>;
50
+ note?: string;
51
+ }
52
+ export declare function buildWorkspaceLists(opts: {
53
+ network?: string;
54
+ no_cache?: boolean;
55
+ account?: string;
56
+ light?: boolean;
57
+ }): Promise<WorkspaceListsResult>;
@@ -0,0 +1 @@
1
+ import{objectTypeFromAddress,query_affiliations,query_local_mark_list,query_table}from'@wowok/wowok';import{ObjectType}from'@wowok/wowok';import{batchFetchEntityLinker,batchFetchEntityRegistrar,batchQueryObjectsByIds,fetchEntityPermission,fetchEntityContact,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts,resolveLocalNamesFor}from'./workflow-guidance.js';import{fetchMachineNodes}from'../playbooks/service-build/machine-nodes.js';const AGG_TTL_MS=0x1d4c0,AGG_CACHE_MAX=0x8,aggCache=new Map(),aggInflight=new Map(),CLASSIFIED_TYPES=new Set([ObjectType['Permission'],ObjectType['Service'],ObjectType['Machine'],ObjectType['Treasury'],ObjectType['Repository'],ObjectType['Reward'],ObjectType['Demand'],ObjectType['Arbitration'],ObjectType['Arb'],ObjectType['Contact'],ObjectType['Order'],ObjectType['Progress']]);function sortItems(a){return a['sort']((c,d)=>(d['time']??0x0)-(c['time']??0x0)||c['object']['localeCompare'](d['object']));}export async function buildWorkspaceLists(a){const b=a['network'],c=a['account']?.['trim']()['toLowerCase']()||undefined,d=a['no_cache']===!![],e=(b??'')+'|'+(c??'');if(!d){const g=aggCache['get'](e);if(g&&Date['now']()-g['at']<AGG_TTL_MS)return{...g['value'],'cached':!![]};const h=aggInflight['get'](e);if(h)return h;}const f=((async()=>{const i=c?[{'address':c,'name':undefined}]:await listLocalAccounts(),j={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':[],'repositories':[],'contacts':[],'machines':[],'rewards':[],'others':[],'counts':{'treasuries':0x0,'repositories':0x0,'contacts':0x0,'machines':0x0,'rewards':0x0,'others':0x0},'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};if(i['length']===0x0)return aggCache['set'](e,{'at':Date['now'](),'value':j}),j;const [k,l,n]=await Promise['all']([Promise['all'](i['map'](Q=>fetchEntityPermission(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchEntityContact(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchObjectLinkerTx(Q['address'],b,d)))]),p=[],q=new Set();for(const Q of k){for(const R of Q?.['items']??[]){!q['has'](R['permission'])&&(q['add'](R['permission']),p['push'](R['permission']));}}const s=await Promise['all'](p['map'](S=>fetchObjectLinkerCore(S,b,d))),u={'treasuries':new Map(),'repositories':new Map(),'contacts':new Map(),'machines':new Map(),'rewards':new Map()},v=(S,T,U)=>{const V=T['toLowerCase'](),W=S['get'](V);if(W===undefined||(U??0x0)>W)S['set'](V,U??0x0);};s['forEach'](S=>{for(const T of S?.['items']??[]){const U=objectTypeFromAddress(T['who']);if(U===ObjectType['Treasury'])v(u['treasuries'],T['who'],T['time']);else{if(U===ObjectType['Repository'])v(u['repositories'],T['who'],T['time']);else{if(U===ObjectType['Machine'])v(u['machines'],T['who'],T['time']);else{if(U===ObjectType['Reward'])v(u['rewards'],T['who'],T['time']);else{if(U===ObjectType['Contact'])v(u['contacts'],T['who'],T['time']);}}}}}});for(const S of l){for(const T of S?.['items']??[])v(u['contacts'],T['contact'],T['time']);}const w=new Map();for(const U of n){for(const V of U?.['items']??[]){const W=objectTypeFromAddress(V['who']);if(W&&CLASSIFIED_TYPES['has'](W))continue;v(w,V['who'],V['time']);}}const x=[...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()],y=X=>X['startsWith']('0x00'),z=[],A=[];for(const X of x){if(y(X))A['push'](X);else z['push'](X);}const B=await resolveLocalNamesFor(x);if(a['light']){const Y=a0=>sortItems([...a0['entries']()]['map'](([a1,a2])=>({'object':a1,'object_type':objectTypeFromAddress(a1)??null,'name':B['byAddress']['get'](a1),'time':a2||undefined}))),Z={'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']};return{'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':Y(u['treasuries']),'repositories':Y(u['repositories']),'contacts':Y(u['contacts']),'machines':Y(u['machines']),'rewards':Y(u['rewards']),'others':Y(w),'counts':Z,'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};}const C=new Map(),D=new Map(),E=new Map(),F=new Map(),G=new Map(),H=new Map(),I=new Map();try{const [a0,a1,a2,a3]=await Promise['all']([z['length']>0x0?batchQueryObjectsByIds(z,b,d)['then'](a9=>({'objects':a9})):Promise['resolve']({'objects':[]}),batchFetchEntityRegistrar(A,b,d),query_local_mark_list(undefined),listLocalAccounts()]),a4=new Set((a3??[])['map'](a9=>String(a9?.['address']??'')['toLowerCase']())),a5=new Set((a0?.['objects']??[])['map'](a9=>String(a9?.['object']??a9?.['address']??'')['toLowerCase']())['filter'](Boolean));for(const [a9,aa]of a1){a5['add'](a9);const ab=aa?.['description']??aa?.['info']?.['description'];if(typeof ab==='string'&&ab['trim']())C['set'](a9,ab['trim']());}if(a5['size']>0x0){const ac=ad=>{for(const ae of[...ad['keys']()])if(!a5['has'](ae))ad['delete'](ae);};ac(u['treasuries']),ac(u['repositories']),ac(u['contacts']),ac(u['machines']),ac(u['rewards']),ac(w);}const a6=new Set([...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()]);try{const ad=await batchFetchEntityLinker([...a6],b,d);for(const [ae,af]of ad){const ag=Array['isArray'](af?.['votes'])?af['votes']:[];if(ag['length']===0x0)continue;I['set'](ae,{'like':ag['filter'](ah=>ah&&ah['like'])['length'],'dislike':ag['filter'](ah=>ah&&ah['dislike'])['length'],'favor':ag['filter'](ah=>ah&&ah['favor'])['length'],'votes':ag['map'](ah=>({'who':ah?.['who']??null,'like':!!ah?.['like'],'dislike':!!ah?.['dislike'],'favor':!!ah?.['favor']}))});}}catch{}for(const ah of a0?.['objects']??[]){const ai=String(ah?.['object']??ah?.['address']??'')['toLowerCase'](),aj=ah?.['description']??ah?.['data']?.['description'];ai&&typeof aj==='string'&&aj['trim']()&&C['set'](ai,aj['trim']());if(ai&&u['contacts']['has'](ai)){const ak=Array['isArray'](ah?.['ims'])?ah['ims']:[],al=typeof ah?.['location']==='string'?ah['location']['trim']():'';E['set'](ai,{...al?{'location':al}:{},'members_total':ak['length'],'members_mine':ak['filter'](am=>a4['has'](String(am?.['at']??'')['toLowerCase']()))['length']});}if(ai&&u['rewards']['has'](ai)){const am=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),an=Array['isArray'](ah?.['guards'])?ah['guards']:[],ao=Number(ah?.['record_count']);H['set'](ai,{...am?{'token':am[0x1]['split']('::')['pop']()}:{},'guards_total':an['length'],...Number['isFinite'](ao)?{'claimers':ao}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{}});}if(ai&&u['treasuries']['has'](ai)){const ap=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),aq=ar=>ar===null||ar===undefined||ar===''?undefined:String(ar);H['set'](ai,{...ap?{'token':ap[0x1]['split']('::')['pop']()}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{},...ah?.['inflow']!=null?{'inflow':aq(ah['inflow'])}:{},...ah?.['outflow']!=null?{'outflow':aq(ah['outflow'])}:{}});}if(ai&&u['repositories']['has'](ai)){const ar=Number(ah?.['data_count']),as=Array['isArray'](ah?.['policies'])?ah['policies']:[],at=Array['isArray'](ah?.['rewards'])?ah['rewards']:[];F['set'](ai,{...Number['isFinite'](ar)?{'records_total':ar}:{},'policies_total':as['length'],'rewards_total':at['length']});}ai&&u['machines']['has'](ai)&&(ah?.['bPublished']!=null||ah?.['bPaused']!=null||ah?.['node_count']!=null)&&G['set'](ai,{'status':ah['bPublished']===!![]?ah['bPaused']===!![]?'PAUSED':'LIVE':'UNPUBLISHED',...Number['isFinite'](Number(ah?.['node_count']))?{'nodes':Number(ah['node_count'])}:{}});}for(const au of a2??[]){const av=String(au?.['address']??'')['toLowerCase']();av&&Array['isArray'](au?.['tags'])&&au['tags']['length']>0x0&&D['set'](av,au['tags']['map'](String));}await Promise['all']([...E['keys'](),...F['keys'](),...[...H['keys']()]['filter'](aw=>u['treasuries']['has'](aw)||u['rewards']['has'](aw))]['map'](async aw=>{try{const ax=await query_affiliations({'address':aw,'no_cache':d,'network':b}),ay=new Set();let az=0x0;for(const aB of ax?.['entries']??[]){const aC=String(aB?.['who']??'')['toLowerCase']();if(!aC||aC==='0x0')continue;if(objectTypeFromAddress(aC)===undefined)continue;const aD=(aB?.['table']??'')+':'+aC;if(ay['has'](aD))continue;ay['add'](aD),az++;}const aA=E['get'](aw)??F['get'](aw)??(u['treasuries']['has'](aw)||u['rewards']['has'](aw)?H['get'](aw):undefined);if(aA)aA['related_objects']=az;}catch{}})),await Promise['all']([...u['machines']['keys']()]['map'](async aw=>{try{const [ax,ay]=await Promise['all']([fetchMachineNodes(aw,b)['catch'](()=>undefined),fetchObjectLinkerTx(aw,b,d)]);if(!G['has'](aw))G['set'](aw,{});const az=G['get'](aw);if(ax){az['nodes']=ax['length'];let aA=0x0;for(const aB of ax){for(const aC of Array['isArray'](aB?.['value'])?aB['value']:[]){if(aC&&typeof aC==='object'&&aC['prev_node'])aA++;}}az['edges']=aA;}if(ay){const aD=new Set();let aE=0x0,aF=0x0;for(const aG of ay['items']??[]){const aH=String(aG?.['who']??'')['toLowerCase']();if(!aH||aH==='0x0'||aD['has'](aH))continue;aD['add'](aH);if(objectTypeFromAddress(aH)===undefined)continue;aE++;if(objectTypeFromAddress(aH)===ObjectType['Progress'])aF++;}az['related_objects']=aE,az['progresses']=aF;}}catch{}}));const a7=0x12c,a8=0xc8;await Promise['all']([...F['keys']()]['map'](async aw=>{try{let ax=undefined,ay=0x0;for(;;){const aA=await query_table({'parent':aw,'cursor':ax,'limit':a8,'no_cache':d,'network':b});ay+=Array['isArray'](aA?.['items'])?aA['items']['length']:0x0;if(!aA?.['hasNextPage']||!aA?.['nextCursor']||ay>=a7)break;ax=String(aA['nextCursor']);}const az=F['get'](aw);if(az)az['records_total']=Math['min'](ay,a7);}catch(aB){if(/query\.parent/i['test'](String(aB?.['message']??aB))){const aC=F['get'](aw);if(aC)aC['records_total']=0x0;}}}));}catch{}const J=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax)}))),K=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...E['get'](ax)??{}}))),L=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),M=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),N=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...F['get'](ax)??{}}))),O=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...G['get'](ax)??{}}))),P={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':M(u['treasuries']),'repositories':N(u['repositories']),'contacts':K(u['contacts']),'machines':O(u['machines']),'rewards':L(u['rewards']),'others':J(w),'counts':{'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']}};for(const aw of[P['treasuries'],P['repositories'],P['contacts'],P['machines'],P['rewards'],P['others']]){for(const ax of aw){const ay=I['get'](ax['object']);if(ay)ax['rep']=ay;}}aggCache['set'](e,{'at':Date['now'](),'value':P});if(aggCache['size']>AGG_CACHE_MAX){const az=aggCache['keys']()['next']()['value'];if(az!==undefined)aggCache['delete'](az);}return P;})());if(!d)aggInflight['set'](e,f);try{return await f;}finally{if(!d)aggInflight['delete'](e);}}
@@ -1,4 +1,4 @@
1
- import type { AssembleContextResult } from "../project/context-assembly.js";
1
+ import type { AssembleContextResult } from "../playbooks/service-build/context-assembly.js";
2
2
  export interface ContextCollectionResult {
3
3
  signature_recorded: boolean;
4
4
  proposal_created: boolean;
@@ -0,0 +1,10 @@
1
+ import { type MonitorEventStore } from "./EventStore.js";
2
+ import { type EventFilter, type RelevanceAnnotation, type ScopeSnapshot, type SubscriptionConfig } from "./types.js";
3
+ export declare function evaluateFilter(filter: EventFilter, event: unknown): boolean;
4
+ export declare function annotateEvent(event: Record<string, any>, snapshot: ScopeSnapshot, config: SubscriptionConfig): RelevanceAnnotation;
5
+ export declare function annotateBatch(events: Record<string, any>[], snapshot: ScopeSnapshot, config: SubscriptionConfig): RelevanceAnnotation[];
6
+ export declare function shouldDeliver(annotation: RelevanceAnnotation, config: SubscriptionConfig): boolean;
7
+ export declare function backfillAnnotations(network: string, store: MonitorEventStore, snapshot: ScopeSnapshot, windowDays: number, config?: SubscriptionConfig): Promise<{
8
+ rescanned: number;
9
+ updated: number;
10
+ }>;
@@ -0,0 +1 @@
1
+ import{monitorEventId}from'./EventStore.js';import{EVENT_ADDRESS_FIELDS}from'./normalize.js';import{defaultSubscriptionConfig,normalizeAddr}from'./types.js';function resolveFieldValues(a,b){let c=[a];for(const d of b['split']('.')){const e=d['endsWith']('[]'),f=e?d['slice'](0x0,-0x2):d;if(!f)return[];const g=[];for(const h of c){if(h===null||h===undefined||typeof h!=='object')continue;const i=h[f];if(e){if(Array['isArray'](i))g['push'](...i);}else g['push'](i);}c=g;}return c;}function bothIntegers(c,d){return/^-?\d+$/['test'](c)&&/^-?\d+$/['test'](d);}function applyOp(c,d,e){if(c===null||c===undefined)return![];switch(d){case'eq':return String(c)===String(e);case'neq':return String(c)!==String(e);case'contains':if(typeof c==='string')return c['includes'](String(e));if(Array['isArray'](c))return c['some'](f=>String(f)===String(e));return![];case'gte':case'lte':{const f=String(c),g=String(e);let h;if(bothIntegers(f,g)){const i=BigInt(f),j=BigInt(g);h=i<j?-0x1:i>j?0x1:0x0;}else{const k=Number(f),l=Number(g);if(Number['isNaN'](k)||Number['isNaN'](l))return![];h=k<l?-0x1:k>l?0x1:0x0;}return d==='gte'?h>=0x0:h<=0x0;}case'in':return Array['isArray'](e)&&e['some'](m=>String(m)===String(c));default:return![];}}export function evaluateFilter(a,b){if(!a||typeof a['field']!=='string'||!a['field'])return![];const c=resolveFieldValues(b,a['field']);return c['some'](d=>applyOp(d,a['op'],a['value']));}function eventAddresses(a){const b=[];for(const c of EVENT_ADDRESS_FIELDS){const d=a?.[c];if(typeof d==='string'&&d)b['push'](d);else{if(Array['isArray'](d)){for(const e of d)if(typeof e==='string'&&e)b['push'](e);}}}if(typeof a?.['sender']==='string'&&a['sender'])b['push'](a['sender']);return b;}export function annotateEvent(a,b,c){const d=String(a?.['type']??''),e=[],f=new Set();for(const h of eventAddresses(a)){const i=b['index']?.[normalizeAddr(h)];if(!i)continue;for(const j of i){const k=j['rule']+':'+normalizeAddr(j['object']);if(f['has'](k))continue;f['add'](k),e['push'](j);}}const g=[];for(const l of c['filters']??[]){if(!l?.['enabled'])continue;if(l['event']&&l['event']!==d)continue;try{if(evaluateFilter(l,a))g['push'](l['id']);}catch{}}return{'event_id':monitorEventId(a?.['id']),'event_type':d,'rules':e,'focus_hit':e['some'](m=>m['rule']==='focus'),'matched_filters':g,'scope_version':b['version'],'annotated_at':Date['now']()};}export function annotateBatch(a,b,c){const d=[];for(const e of a??[]){if(!monitorEventId(e?.['id']))continue;d['push'](annotateEvent(e,b,c));}return d;}export function shouldDeliver(a,b){const c=a['rules']['length']>0x0||a['focus_hit']||a['matched_filters']['length']>0x0;if(!c)return![];return b['events']?.[a['event_type']]===!![]||a['focus_hit'];}export async function backfillAnnotations(a,b,c,d,e=defaultSubscriptionConfig()){const f=Date['now']()-Math['max'](0x0,d)*0x5265c00;let g=0x0,h=0x0,i=0x0;const j=0xc8;for(;;){const k=await b['list'](a,{'since':f,'offset':i,'limit':j});if(k['events']['length']===0x0)break;const l=await b['getAnnotations'](a,k['events']['map'](o=>o['id'])),m=[],n=[];for(const o of k['events']){g++;const p=l['get'](o['id']);if(p&&p['scope_version']>=c['version'])continue;const q=o['event'];if(!q||typeof q!=='object')continue;const r=annotateEvent(q,c,e);if(!r['event_id'])continue;const s=r['rules']['length']>0x0||r['focus_hit']||r['matched_filters']['length']>0x0;if(s)m['push'](r),h++;else p&&(n['push'](o['id']),h++);}await b['saveAnnotations'](a,m);if(n['length']>0x0)await b['deleteAnnotations'](a,n);i+=k['events']['length'];if(i>=k['total'])break;}return{'rescanned':g,'updated':h};}
@@ -1,6 +1,7 @@
1
1
  import { SQLiteStorage } from "@wowok/wowok/w/local";
2
- export declare const MONITOR_EVENT_MODULES: readonly ["order", "arb", "demand", "progress", "treasury", "reward"];
3
- export type MonitorEventModule = (typeof MONITOR_EVENT_MODULES)[number];
2
+ import { type MonitorEventModule, type RelevanceAnnotation } from "./types.js";
3
+ export { MONITOR_EVENT_MODULES } from "./types.js";
4
+ export type { MonitorEventModule } from "./types.js";
4
5
  export interface MonitorEventRecord {
5
6
  module: MonitorEventModule;
6
7
  type: string;
@@ -10,6 +11,24 @@ export interface MonitorEventRecord {
10
11
  export interface MonitorEventWithSeen extends MonitorEventRecord {
11
12
  id: string;
12
13
  seen: boolean;
14
+ relevance?: RelevanceAnnotation;
15
+ }
16
+ export interface MonitorListOptions {
17
+ module?: MonitorEventModule;
18
+ eventType?: string;
19
+ since?: number;
20
+ until?: number;
21
+ offset?: number;
22
+ limit?: number;
23
+ relevantOnly?: boolean;
24
+ withReason?: boolean;
25
+ }
26
+ export interface MonitorListResult {
27
+ events: MonitorEventWithSeen[];
28
+ total: number;
29
+ moduleCounts: Record<string, number>;
30
+ unreadByModule: Record<string, number>;
31
+ totalUnread: number;
13
32
  }
14
33
  interface CursorRow {
15
34
  cursors: Record<string, {
@@ -41,6 +60,8 @@ export declare class MonitorEventStore {
41
60
  private unreadKey;
42
61
  private cursorKey;
43
62
  private metaKey;
63
+ private relKey;
64
+ private relIdxKey;
44
65
  private getJson;
45
66
  private putJson;
46
67
  ensureMigrated(network: string, legacy?: LegacyMonitorState | null, legacyCursors?: Record<string, {
@@ -50,16 +71,16 @@ export declare class MonitorEventStore {
50
71
  insert(network: string, module: MonitorEventModule, events: any[]): Promise<number>;
51
72
  private unreadSets;
52
73
  private pool;
53
- list(network: string, opts?: {
54
- module?: MonitorEventModule;
55
- offset?: number;
56
- limit?: number;
57
- }): Promise<{
58
- events: MonitorEventWithSeen[];
74
+ list(network: string, opts?: MonitorListOptions): Promise<MonitorListResult>;
75
+ saveAnnotations(network: string, annotations: RelevanceAnnotation[]): Promise<void>;
76
+ getAnnotations(network: string, ids: string[]): Promise<Map<string, RelevanceAnnotation>>;
77
+ deleteAnnotations(network: string, ids: string[]): Promise<void>;
78
+ listRelevantIds(network: string, offset?: number, limit?: number): Promise<{
79
+ entries: {
80
+ id: string;
81
+ t: number;
82
+ }[];
59
83
  total: number;
60
- moduleCounts: Record<string, number>;
61
- unreadByModule: Record<string, number>;
62
- totalUnread: number;
63
84
  }>;
64
85
  unreadCount(network: string, module?: MonitorEventModule): Promise<number>;
65
86
  markRead(network: string, ids: string[]): Promise<{
@@ -75,4 +96,3 @@ export declare class MonitorEventStore {
75
96
  }>, lastPollAt: number): Promise<void>;
76
97
  }
77
98
  export declare const monitorEventStore: MonitorEventStore;
78
- export {};
@@ -1 +1 @@
1
- import{SQLiteStorage}from'@wowok/wowok/w/local';export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward'];const KEY_PREFIX='mon_ev:v3:',IDX_PREFIX='mon_idx:v3:',UNREAD_PREFIX='mon_unread:v3:',CURSOR_PREFIX='mon_cur:v3:',META_PREFIX='mon_meta:v3:';function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}export function monitorEventId(a){if(!a||!a['txDigest']||a['eventSeq']===undefined||a['eventSeq']===null)return'';return a['eventSeq']+':'+a['txDigest'];}export class MonitorEventStore{['storage'];['locks']=new Map();constructor(a){this['storage']=a??new SQLiteStorage();}['withLock'](a,b){const c=netKey(a),d=this['locks']['get'](c)??Promise['resolve'](),e=d['then'](b,b);return this['locks']['set'](c,e['catch'](()=>undefined)),e;}['evKey'](a,b){return''+KEY_PREFIX+netKey(a)+':'+b;}['idxKey'](a,b){return''+IDX_PREFIX+netKey(a)+':'+b;}['unreadKey'](a,b){return''+UNREAD_PREFIX+netKey(a)+':'+b;}['cursorKey'](a){return''+CURSOR_PREFIX+netKey(a);}['metaKey'](a){return''+META_PREFIX+netKey(a);}async['getJson'](a){const b=await this['storage']['get'](a);if(!b)return undefined;try{return JSON['parse'](b);}catch{return undefined;}}async['putJson'](a,b){await this['storage']['put'](a,JSON['stringify'](b));}async['ensureMigrated'](a,b,c,d){await this['withLock'](a,async()=>{const e=await this['getJson'](this['metaKey'](a));if(e?.['migrated'])return;if(b?.['modules']&&typeof b['modules']==='object'){const f=new Set(Array['isArray'](b['seenIds'])?b['seenIds']:[]);for(const g of Object['keys'](b['modules'])){if(!MONITOR_EVENT_MODULES['includes'](g))continue;const h=Array['isArray'](b['modules'][g])?b['modules'][g]:[],j=[],k=[],l=[];for(const m of h){const n=monitorEventId(m?.['id']);if(!n)continue;const o=Number(m?.['time']??0x0)||0x0;l['push']({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':g,'type':m?.['type']??'','time':o,'event':m})}),j['push']({'id':n,'t':o});if(!f['has'](n))k['push'](n);}j['sort']((q,r)=>r['t']-q['t']),await this['storage']['putMany'](l),await this['putJson'](this['idxKey'](a,g),{'entries':j}),await this['putJson'](this['unreadKey'](a,g),{'ids':k});}}c&&Object['keys'](c)['length']>0x0&&await this['putJson'](this['cursorKey'](a),{'cursors':c,'lastPollAt':d??0x0}),await this['putJson'](this['metaKey'](a),{'migrated':!![]});});}async['insert'](a,b,c){const d=c['filter'](e=>monitorEventId(e?.['id'])!=='');if(d['length']===0x0)return 0x0;return this['withLock'](a,async()=>{const e=d['map'](n=>monitorEventId(n['id'])),f=await this['storage']['getMany'](e['map'](n=>this['evKey'](a,n))),g=[];d['forEach']((n,o)=>{if(f[o]===undefined||f[o]===null)g['push']({'id':e[o],'ev':n});});if(g['length']===0x0)return 0x0;await this['storage']['putMany'](g['map'](({id:n,ev:o})=>({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':b,'type':o?.['type']??'','time':Number(o?.['time']??0x0)||0x0,'event':o})})));const h=await this['getJson'](this['idxKey'](a,b))??{'entries':[]},j=new Set(h['entries']['map'](n=>n['id'])),k=[];for(const {id:n,ev:o}of g){if(j['has'](n))continue;j['add'](n),k['push']({'id':n,'t':Number(o?.['time']??0x0)||0x0});}k['sort']((q,r)=>r['t']-q['t']),h['entries']=[...k,...h['entries']],await this['putJson'](this['idxKey'](a,b),h);const l=await this['getJson'](this['unreadKey'](a,b))??{'ids':[]},m=new Set(l['ids']);for(const {id:q}of g)m['add'](q);return await this['putJson'](this['unreadKey'](a,b),{'ids':[...m]}),g['length'];});}async['unreadSets'](a){const b=new Map();for(const c of MONITOR_EVENT_MODULES){const d=await this['getJson'](this['unreadKey'](a,c));b['set'](c,new Set(d?.['ids']??[]));}return b;}async['pool'](a,b){if(b){const f=await this['getJson'](this['idxKey'](a,b));return f?.['entries']??[];}const c=[];for(const g of MONITOR_EVENT_MODULES){const h=await this['getJson'](this['idxKey'](a,g));if(h?.['entries']?.['length'])c['push'](h['entries']);}const d=[],e=c['map'](j=>({'p':j,'i':0x0}));for(;;){let j=-0x1;for(let l=0x0;l<e['length'];l++){const {p:n,i:o}=e[l];if(o<n['length']&&(j<0x0||n[o]['t']>e[j]['p'][e[j]['i']]['t']))j=l;}if(j<0x0)break;d['push'](e[j]['p'][e[j]['i']]),e[j]['i']++;}return d;}async['list'](a,b={}){const c=netKey(a),d=await this['pool'](a,b['module']),e={};for(const r of MONITOR_EVENT_MODULES){const s=await this['getJson'](this['idxKey'](a,r));e[r]=s?.['entries']?.['length']??0x0;}const f=await this['unreadSets'](a),g={};let h=0x0;for(const t of MONITOR_EVENT_MODULES){const u=f['get'](t)?.['size']??0x0;g[t]=u,h+=u;}const j=Math['max'](0x0,Number(b['offset'])||0x0),k=Math['max'](0x1,Number(b['limit'])||0x32),l=d['slice'](j,j+k),o=await this['storage']['getMany'](l['map'](v=>this['evKey'](a,v['id']))),q=[];return l['forEach']((v,w)=>{let x;try{x=o[w]?JSON['parse'](o[w]):undefined;}catch{x=undefined;}if(!x||!MONITOR_EVENT_MODULES['includes'](x['module']))return;q['push']({'id':v['id'],'module':x['module'],'type':x['type']??'','time':x['time']??v['t'],'event':x['event']??null,'seen':!(f['get'](x['module'])?.['has'](v['id'])??![])});}),{'events':q,'total':d['length'],'moduleCounts':e,'unreadByModule':g,'totalUnread':h};}async['unreadCount'](a,b){const c=await this['unreadSets'](a);if(b)return c['get'](b)?.['size']??0x0;let d=0x0;for(const e of MONITOR_EVENT_MODULES)d+=c['get'](e)?.['size']??0x0;return d;}async['markRead'](a,b){const c=(b??[])['filter'](d=>typeof d==='string'&&d['length']>0x0);if(c['length']===0x0)return{'marked':0x0};return this['withLock'](a,async()=>{const d=await this['storage']['getMany'](c['map'](g=>this['evKey'](a,g))),e=new Map();let f=0x0;c['forEach']((g,h)=>{if(!d[h])return;let j;try{j=JSON['parse'](d[h]);}catch{return;}if(!j?.['module']||!MONITOR_EVENT_MODULES['includes'](j['module']))return;if(!e['has'](j['module']))e['set'](j['module'],new Set());e['get'](j['module'])['add'](g);});for(const [g,h]of e){const j=await this['getJson'](this['unreadKey'](a,g))??{'ids':[]},k=j['ids']['length'],l=j['ids']['filter'](m=>!h['has'](m));f+=k-l['length'],l['length']!==k&&await this['putJson'](this['unreadKey'](a,g),{'ids':l});}return{'marked':f};});}async['markAllRead'](a,b){return this['withLock'](a,async()=>{const c=b?[b]:[...MONITOR_EVENT_MODULES];let d=0x0;for(const e of c){const f=await this['getJson'](this['unreadKey'](a,e))??{'ids':[]};d+=f['ids']['length'],f['ids']['length']>0x0&&await this['putJson'](this['unreadKey'](a,e),{'ids':[]});}return{'marked':d};});}async['getCursors'](a){const b=await this['getJson'](this['cursorKey'](a));return b??{'cursors':{},'lastPollAt':0x0};}async['saveCursors'](a,b,c){await this['putJson'](this['cursorKey'](a),{'cursors':b,'lastPollAt':c});}}export const monitorEventStore=new MonitorEventStore();
1
+ import{SQLiteStorage}from'@wowok/wowok/w/local';import{MONITOR_EVENT_MODULES}from'./types.js';export{MONITOR_EVENT_MODULES}from'./types.js';const KEY_PREFIX='mon_ev:v3:',IDX_PREFIX='mon_idx:v3:',UNREAD_PREFIX='mon_unread:v3:',CURSOR_PREFIX='mon_cur:v3:',META_PREFIX='mon_meta:v3:',REL_PREFIX='mon_rel:v4:',REL_IDX_PREFIX='mon_rel_idx:v4:';function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}export function monitorEventId(a){if(!a||!a['txDigest']||a['eventSeq']===undefined||a['eventSeq']===null)return'';return a['eventSeq']+':'+a['txDigest'];}export class MonitorEventStore{['storage'];['locks']=new Map();constructor(a){this['storage']=a??new SQLiteStorage();}['withLock'](a,b){const c=netKey(a),d=this['locks']['get'](c)??Promise['resolve'](),e=d['then'](b,b);return this['locks']['set'](c,e['catch'](()=>undefined)),e;}['evKey'](a,b){return''+KEY_PREFIX+netKey(a)+':'+b;}['idxKey'](a,b){return''+IDX_PREFIX+netKey(a)+':'+b;}['unreadKey'](a,b){return''+UNREAD_PREFIX+netKey(a)+':'+b;}['cursorKey'](a){return''+CURSOR_PREFIX+netKey(a);}['metaKey'](a){return''+META_PREFIX+netKey(a);}['relKey'](a,b){return''+REL_PREFIX+netKey(a)+':'+b;}['relIdxKey'](a){return''+REL_IDX_PREFIX+netKey(a);}async['getJson'](a){const b=await this['storage']['get'](a);if(!b)return undefined;try{return JSON['parse'](b);}catch{return undefined;}}async['putJson'](a,b){await this['storage']['put'](a,JSON['stringify'](b));}async['ensureMigrated'](a,b,c,d){await this['withLock'](a,async()=>{const e=await this['getJson'](this['metaKey'](a));if(e?.['migrated'])return;if(b?.['modules']&&typeof b['modules']==='object'){const f=new Set(Array['isArray'](b['seenIds'])?b['seenIds']:[]);for(const g of Object['keys'](b['modules'])){if(!MONITOR_EVENT_MODULES['includes'](g))continue;const h=Array['isArray'](b['modules'][g])?b['modules'][g]:[],j=[],k=[],l=[];for(const m of h){const n=monitorEventId(m?.['id']);if(!n)continue;const o=Number(m?.['time']??0x0)||0x0;l['push']({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':g,'type':m?.['type']??'','time':o,'event':m})}),j['push']({'id':n,'t':o});if(!f['has'](n))k['push'](n);}j['sort']((q,r)=>r['t']-q['t']),await this['storage']['putMany'](l),await this['putJson'](this['idxKey'](a,g),{'entries':j}),await this['putJson'](this['unreadKey'](a,g),{'ids':k});}}c&&Object['keys'](c)['length']>0x0&&await this['putJson'](this['cursorKey'](a),{'cursors':c,'lastPollAt':d??0x0}),await this['putJson'](this['metaKey'](a),{'migrated':!![]});});}async['insert'](a,b,c){const d=c['filter'](e=>monitorEventId(e?.['id'])!=='');if(d['length']===0x0)return 0x0;return this['withLock'](a,async()=>{const e=d['map'](n=>monitorEventId(n['id'])),f=await this['storage']['getMany'](e['map'](n=>this['evKey'](a,n))),g=[];d['forEach']((n,o)=>{if(f[o]===undefined||f[o]===null)g['push']({'id':e[o],'ev':n});});if(g['length']===0x0)return 0x0;await this['storage']['putMany'](g['map'](({id:n,ev:o})=>({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':b,'type':o?.['type']??'','time':Number(o?.['time']??0x0)||0x0,'event':o})})));const h=await this['getJson'](this['idxKey'](a,b))??{'entries':[]},j=new Set(h['entries']['map'](n=>n['id'])),k=[];for(const {id:n,ev:o}of g){if(j['has'](n))continue;j['add'](n),k['push']({'id':n,'t':Number(o?.['time']??0x0)||0x0});}k['sort']((q,r)=>r['t']-q['t']),h['entries']=[...k,...h['entries']],await this['putJson'](this['idxKey'](a,b),h);const l=await this['getJson'](this['unreadKey'](a,b))??{'ids':[]},m=new Set(l['ids']);for(const {id:q}of g)m['add'](q);return await this['putJson'](this['unreadKey'](a,b),{'ids':[...m]}),g['length'];});}async['unreadSets'](a){const b=new Map();for(const c of MONITOR_EVENT_MODULES){const d=await this['getJson'](this['unreadKey'](a,c));b['set'](c,new Set(d?.['ids']??[]));}return b;}async['pool'](a,b){if(b){const f=await this['getJson'](this['idxKey'](a,b));return f?.['entries']??[];}const c=[];for(const g of MONITOR_EVENT_MODULES){const h=await this['getJson'](this['idxKey'](a,g));if(h?.['entries']?.['length'])c['push'](h['entries']);}const d=[],e=c['map'](j=>({'p':j,'i':0x0}));for(;;){let j=-0x1;for(let l=0x0;l<e['length'];l++){const {p:n,i:o}=e[l];if(o<n['length']&&(j<0x0||n[o]['t']>e[j]['p'][e[j]['i']]['t']))j=l;}if(j<0x0)break;d['push'](e[j]['p'][e[j]['i']]),e[j]['i']++;}return d;}async['list'](a,b={}){let c;if(b['relevantOnly']){const x=await this['getJson'](this['relIdxKey'](a));c=x?.['entries']??[];}else c=await this['pool'](a,b['module']);const d=Number(b['since']);if(Number['isFinite'](d)&&d>0x0)c=c['filter'](y=>y['t']>=d);const e=Number(b['until']);if(Number['isFinite'](e)&&e>0x0)c=c['filter'](y=>y['t']<=e);const f=b['relevantOnly']?b['module']:undefined;let g;if(b['eventType']||f){g=new Map();const y=await this['storage']['getMany'](c['map'](A=>this['evKey'](a,A['id']))),z=[];c['forEach']((A,B)=>{let C;try{C=y[B]?JSON['parse'](y[B]):undefined;}catch{C=undefined;}if(!C)return;if(f&&C['module']!==f)return;if(b['eventType']&&C['type']!==b['eventType'])return;z['push'](A),g['set'](A['id'],C);}),c=z;}const h={};for(const A of MONITOR_EVENT_MODULES){const B=await this['getJson'](this['idxKey'](a,A));h[A]=B?.['entries']?.['length']??0x0;}const j=await this['unreadSets'](a),k={};let l=0x0;for(const C of MONITOR_EVENT_MODULES){const D=j['get'](C)?.['size']??0x0;k[C]=D,l+=D;}const o=c['length'],q=Math['max'](0x0,Number(b['offset'])||0x0),r=Math['max'](0x1,Number(b['limit'])||0x32),s=c['slice'](q,q+r),t=s['filter'](E=>!g?.['has'](E['id'])),u=t['length']?await this['storage']['getMany'](t['map'](E=>this['evKey'](a,E['id']))):[],v=new Map();t['forEach']((E,F)=>{try{const G=u[F]?JSON['parse'](u[F]):undefined;if(G)v['set'](E['id'],G);}catch{}});const w=[];for(const E of s){const F=g?.['get'](E['id'])??v['get'](E['id']);if(!F||!MONITOR_EVENT_MODULES['includes'](F['module']))continue;w['push']({'id':E['id'],'module':F['module'],'type':F['type']??'','time':F['time']??E['t'],'event':F['event']??null,'seen':!(j['get'](F['module'])?.['has'](E['id'])??![])});}if(b['withReason']&&w['length']>0x0){const G=await this['getAnnotations'](a,w['map'](H=>H['id']));for(const H of w){const I=G['get'](H['id']);if(I)H['relevance']=I;}}return{'events':w,'total':o,'moduleCounts':h,'unreadByModule':k,'totalUnread':l};}async['saveAnnotations'](a,b){const c=(b??[])['filter'](d=>d&&typeof d['event_id']==='string'&&d['event_id']);if(c['length']===0x0)return;return this['withLock'](a,async()=>{const d=await this['storage']['getMany'](c['map'](k=>this['evKey'](a,k['event_id']))),f=new Map();c['forEach']((k,l)=>{let m=Number(k['annotated_at'])||0x0;try{const n=d[l]?JSON['parse'](d[l]):undefined;if(n&&Number['isFinite'](Number(n['time'])))m=Number(n['time']);}catch{}f['set'](k['event_id'],m);}),await this['storage']['putMany'](c['map'](k=>({'key':this['relKey'](a,k['event_id']),'value':JSON['stringify'](k)})));const g=await this['getJson'](this['relIdxKey'](a))??{'entries':[]},h=new Map();for(const k of g['entries'])h['set'](k['id'],k);for(const l of c)h['set'](l['event_id'],{'id':l['event_id'],'t':f['get'](l['event_id'])??0x0});const j=[...h['values']()]['sort']((m,n)=>n['t']-m['t']);await this['putJson'](this['relIdxKey'](a),{'entries':j});});}async['getAnnotations'](a,b){const c=new Map(),d=(b??[])['filter'](f=>typeof f==='string'&&f['length']>0x0);if(d['length']===0x0)return c;const e=await this['storage']['getMany'](d['map'](f=>this['relKey'](a,f)));return d['forEach']((f,g)=>{try{const h=e[g]?JSON['parse'](e[g]):undefined;if(h&&typeof h['event_id']==='string')c['set'](f,h);}catch{}}),c;}async['deleteAnnotations'](a,b){const c=(b??[])['filter'](d=>typeof d==='string'&&d['length']>0x0);if(c['length']===0x0)return;return this['withLock'](a,async()=>{for(const e of c)await this['storage']['del'](this['relKey'](a,e));const d=await this['getJson'](this['relIdxKey'](a));if(d?.['entries']?.['length']){const f=new Set(c);await this['putJson'](this['relIdxKey'](a),{'entries':d['entries']['filter'](g=>!f['has'](g['id']))});}});}async['listRelevantIds'](a,b,c){const d=await this['getJson'](this['relIdxKey'](a)),e=d?.['entries']??[],f=Math['max'](0x0,Number(b)||0x0),g=Math['max'](0x1,Number(c)||0x32);return{'entries':e['slice'](f,f+g),'total':e['length']};}async['unreadCount'](a,b){const c=await this['unreadSets'](a);if(b)return c['get'](b)?.['size']??0x0;let d=0x0;for(const e of MONITOR_EVENT_MODULES)d+=c['get'](e)?.['size']??0x0;return d;}async['markRead'](a,b){const c=(b??[])['filter'](d=>typeof d==='string'&&d['length']>0x0);if(c['length']===0x0)return{'marked':0x0};return this['withLock'](a,async()=>{const d=await this['storage']['getMany'](c['map'](g=>this['evKey'](a,g))),e=new Map();let f=0x0;c['forEach']((g,h)=>{if(!d[h])return;let j;try{j=JSON['parse'](d[h]);}catch{return;}if(!j?.['module']||!MONITOR_EVENT_MODULES['includes'](j['module']))return;if(!e['has'](j['module']))e['set'](j['module'],new Set());e['get'](j['module'])['add'](g);});for(const [g,h]of e){const j=await this['getJson'](this['unreadKey'](a,g))??{'ids':[]},k=j['ids']['length'],l=j['ids']['filter'](m=>!h['has'](m));f+=k-l['length'],l['length']!==k&&await this['putJson'](this['unreadKey'](a,g),{'ids':l});}return{'marked':f};});}async['markAllRead'](a,b){return this['withLock'](a,async()=>{const c=b?[b]:[...MONITOR_EVENT_MODULES];let d=0x0;for(const e of c){const f=await this['getJson'](this['unreadKey'](a,e))??{'ids':[]};d+=f['ids']['length'],f['ids']['length']>0x0&&await this['putJson'](this['unreadKey'](a,e),{'ids':[]});}return{'marked':d};});}async['getCursors'](a){const b=await this['getJson'](this['cursorKey'](a));return b??{'cursors':{},'lastPollAt':0x0};}async['saveCursors'](a,b,c){await this['putJson'](this['cursorKey'](a),{'cursors':b,'lastPollAt':c});}}export const monitorEventStore=new MonitorEventStore();
@@ -0,0 +1,81 @@
1
+ import { SQLiteStorage } from "@wowok/wowok/w/local";
2
+ import { MonitorEventStore } from "./EventStore.js";
3
+ import { SubscriptionStore } from "./SubscriptionStore.js";
4
+ import { type ResolveScopeResult } from "./ScopeResolver.js";
5
+ import { annotateBatch } from "./EventRouter.js";
6
+ import { type ProblemBridgeInput } from "./ProblemBridge.js";
7
+ import { type SuggestionBridgeInput } from "./SuggestionBridge.js";
8
+ import { type ScopeSnapshot, type SubscriptionConfig } from "./types.js";
9
+ export interface MonitorLoopStatus {
10
+ running: boolean;
11
+ lease_holder: string | null;
12
+ last_tick_at: number;
13
+ last_new_count: number;
14
+ scope_version: number;
15
+ backoff_ms: number;
16
+ }
17
+ export interface MonitorTickSummary {
18
+ captured: number;
19
+ annotated: number;
20
+ duration_ms: number;
21
+ }
22
+ export interface MonitorLoopQuery {
23
+ type: string;
24
+ cursor: {
25
+ eventSeq: string;
26
+ txDigest: string;
27
+ } | null;
28
+ limit: number;
29
+ order: "ascending" | "descending";
30
+ network?: string;
31
+ }
32
+ export interface MonitorLoopQueryResult {
33
+ data?: any[];
34
+ hasNextPage?: boolean;
35
+ nextCursor?: {
36
+ eventSeq: string;
37
+ txDigest: string;
38
+ } | null;
39
+ }
40
+ export interface MonitorLoopDeps {
41
+ store: MonitorEventStore;
42
+ configStore: Pick<SubscriptionStore, "getConfig">;
43
+ storage: Pick<SQLiteStorage, "get" | "put" | "del">;
44
+ resolveScope(network: string, config: SubscriptionConfig): Promise<ResolveScopeResult>;
45
+ loadScope(network: string): Promise<ScopeSnapshot | undefined>;
46
+ router: {
47
+ annotateBatch: typeof annotateBatch;
48
+ backfillAnnotations: (network: string, store: MonitorEventStore, snapshot: ScopeSnapshot, windowDays: number, config: SubscriptionConfig) => Promise<{
49
+ rescanned: number;
50
+ updated: number;
51
+ }>;
52
+ };
53
+ queryEvents(query: MonitorLoopQuery): Promise<MonitorLoopQueryResult | undefined>;
54
+ defaultNetwork(): Promise<string>;
55
+ now(): number;
56
+ pid: number;
57
+ bootId: string;
58
+ logger(message: string): void;
59
+ openProblems?(input: ProblemBridgeInput): Promise<number>;
60
+ openSuggestions?(input: SuggestionBridgeInput): Promise<number>;
61
+ setTimer(cb: () => void, ms: number): unknown;
62
+ clearTimer(handle: unknown): void;
63
+ }
64
+ export declare class MonitorLoop {
65
+ private deps;
66
+ private runtimes;
67
+ constructor(deps?: Partial<MonitorLoopDeps>);
68
+ start(networks?: string[]): Promise<string[]>;
69
+ stop(network?: string): Promise<void>;
70
+ status(network?: string): MonitorLoopStatus & {
71
+ last_tick?: MonitorTickSummary;
72
+ };
73
+ kick(network: string): void;
74
+ invalidateScope(network: string): void;
75
+ tick(network: string): Promise<MonitorTickSummary | undefined>;
76
+ private schedule;
77
+ private acquireLease;
78
+ private getScope;
79
+ private capture;
80
+ }
81
+ export declare const monitorLoop: MonitorLoop;
@@ -0,0 +1 @@
1
+ import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:t,changed:u}=await this['deps']['resolveScope'](a,f);c['scope']=t;if(u){const v=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),w=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],t,v,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+t['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+w['rescanned']+',\x20updated\x20'+w['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(x){const y=String(x?.['message']??x);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+y),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
@@ -0,0 +1,32 @@
1
+ import type { GoalRecord } from "../goal/types.js";
2
+ import type { ProblemRecord } from "../task/types.js";
3
+ import type { RelevanceAnnotation, ScopeSnapshot } from "./types.js";
4
+ export interface AnomalyClassification {
5
+ severity: ProblemRecord["severity"];
6
+ title: string;
7
+ detail: string;
8
+ object: string;
9
+ }
10
+ export declare function classifyAnomaly(ev: any): AnomalyClassification | null;
11
+ export interface ProblemBridgeDeps {
12
+ getGoal(network: string, id: string): Promise<GoalRecord | undefined>;
13
+ addProblem(dir: string, input: {
14
+ stage?: string;
15
+ object?: string;
16
+ severity: ProblemRecord["severity"];
17
+ title: string;
18
+ detail?: string;
19
+ origin?: ProblemRecord["origin"];
20
+ }): ProblemRecord;
21
+ listProblems(dir: string, filter?: {
22
+ status?: ProblemRecord["status"];
23
+ }): ProblemRecord[];
24
+ logger(message: string): void;
25
+ }
26
+ export interface ProblemBridgeInput {
27
+ network: string;
28
+ events: any[];
29
+ annotations: RelevanceAnnotation[];
30
+ scope: ScopeSnapshot;
31
+ }
32
+ export declare function bridgeMonitorProblems(input: ProblemBridgeInput, deps: ProblemBridgeDeps): Promise<number>;
@@ -0,0 +1 @@
1
+ import{monitorEventId}from'./EventStore.js';const ARB_STATUS_PRINCIPAL_CONFIRMING=0x0,ARB_STATUS_VOTING=0x2,ARB_STATUS_OBJECTIONABLE=0x4;export function classifyAnomaly(a){if(!a||typeof a!=='object')return null;if(a['type']==='ArbEvent'){const b=Number(a['status']),c=typeof a['order']==='string'?a['order']:null,d=typeof a['arb']==='string'?a['arb']:null,e=c??d;if(!e)return null;if(b===ARB_STATUS_PRINCIPAL_CONFIRMING)return{'severity':'high','title':'Arbitration\x20opened\x20on\x20a\x20monitored\x20order','detail':'Dispute\x20opened\x20(ArbEvent\x20Principal_confirming)\x20on\x20'+e+(a['arbitration']?'\x20—\x20arbitration\x20'+a['arbitration']:'')+'.\x20Parties\x20should\x20prepare\x20evidence;\x20see\x20the\x20order\x27s\x20Arb\x20object.','object':e};if(b===ARB_STATUS_OBJECTIONABLE)return{'severity':'high','title':'Arbitration\x20verdict\x20marked\x20objectionable','detail':'An\x20arbitrated\x20verdict\x20on\x20'+e+'\x20was\x20contested\x20(ArbEvent\x20Objectionable)'+'.\x20Re-read\x20the\x20Arb\x20object\x20—\x20the\x20case\x20re-enters\x20resolution.','object':e};if(b===ARB_STATUS_VOTING)return{'severity':'medium','title':'Arbitration\x20voting\x20started','detail':'Voting\x20opened\x20on\x20the\x20arbitration\x20covering\x20'+e+'.\x20Voters/parties\x20should\x20act\x20(vote,\x20submit\x20evidence)\x20before\x20it\x20closes.','object':e};return null;}return null;}const EVENT_OBJECT_FIELDS=['order','arb','arbitration','object','service','demand','progress','machine'];export async function bridgeMonitorProblems(b,c){const {network:d,events:g,annotations:h,scope:i}=b;try{const j=new Set(h['map'](n=>n['event_id'])),k=new Map();for(const n of h){k['set'](n['event_id'],n['rules']['map'](o=>o['object']));}const l=new Map();for(const o of i['focus']??[]){if(o['goal_id']&&o['object'])l['set'](o['object'],o['goal_id']);}if(l['size']===0x0)return 0x0;const m=[];for(const p of g){const q=monitorEventId(p?.['id']);if(!q||!j['has'](q))continue;const r=classifyAnomaly(p);if(!r)continue;const s=[...k['get'](q)??[],...EVENT_OBJECT_FIELDS['map'](x=>p[x])['filter'](x=>typeof x==='string'&&x['length']>0x0)];let t;for(const x of s){const y=l['get'](x);if(y){t=y;break;}}if(!t)continue;const u=await c['getGoal'](d,t),v=u?.['process']?.['dir'];if(!u||!v)continue;const w=c['listProblems'](v)['some'](z=>z['origin']?.['source']==='monitor'&&z['origin']?.['event_id']===q);if(w)continue;c['addProblem'](v,{'object':r['object'],'severity':r['severity'],'title':r['title'],'detail':r['detail'],'origin':{'source':'monitor','network':d,'event_id':q,'event_type':String(p['type']??'unknown')}}),m['push'](q);}return m['length']>0x0&&c['logger']('problem\x20bridge:\x20opened\x20'+m['length']+'\x20problem(s)\x20on\x20'+d+'\x20from\x20monitor\x20anomalies'),m['length'];}catch(z){return c['logger']('problem\x20bridge:\x20skipped\x20('+String(z?.['message']??z)+')'),0x0;}}