@wowok/agent-mcp 2.7.1 → 2.7.3

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 (597) hide show
  1. package/dist/config/index.js +1 -1
  2. package/dist/config/runtime.js +1 -238
  3. package/dist/customer/account-events.d.ts +32 -0
  4. package/dist/customer/account-events.js +1 -0
  5. package/dist/customer/customer-advice.d.ts +1 -0
  6. package/dist/customer/customer-advice.js +1 -130
  7. package/dist/customer/index.js +1 -11
  8. package/dist/customer/industry-risks.js +1 -438
  9. package/dist/customer/info-puzzle.js +1 -681
  10. package/dist/customer/order-monitor.js +1 -328
  11. package/dist/customer/order-strategy.d.ts +1 -1
  12. package/dist/customer/order-strategy.js +1 -373
  13. package/dist/customer/post-purchase.js +1 -351
  14. package/dist/customer/preorder-compare.js +1 -34
  15. package/dist/customer/reminder-system.d.ts +2 -0
  16. package/dist/customer/reminder-system.js +1 -316
  17. package/dist/customer/risk-assessment.d.ts +1 -0
  18. package/dist/customer/risk-assessment.js +1 -397
  19. package/dist/customer/types.d.ts +2 -0
  20. package/dist/customer/types.js +1 -13
  21. package/dist/customer/user-preferences.js +1 -460
  22. package/dist/evaluation/arbitration-game.d.ts +9 -2
  23. package/dist/evaluation/arbitration-game.js +1 -48
  24. package/dist/evaluation/builtins/arbitration-score.d.ts +41 -0
  25. package/dist/evaluation/builtins/arbitration-score.js +1 -0
  26. package/dist/evaluation/builtins/demand-match.js +1 -153
  27. package/dist/evaluation/builtins/index.d.ts +1 -0
  28. package/dist/evaluation/builtins/index.js +1 -10
  29. package/dist/evaluation/builtins/service-risk.js +1 -55
  30. package/dist/evaluation/capability.js +1 -13
  31. package/dist/evaluation/category-match-rules.d.ts +30 -0
  32. package/dist/evaluation/category-match-rules.js +1 -0
  33. package/dist/evaluation/composer.js +1 -40
  34. package/dist/evaluation/engine.js +1 -175
  35. package/dist/evaluation/extract.js +1 -115
  36. package/dist/evaluation/game-strategy.d.ts +27 -0
  37. package/dist/evaluation/game-strategy.js +1 -0
  38. package/dist/evaluation/gap.js +1 -100
  39. package/dist/evaluation/index.d.ts +2 -0
  40. package/dist/evaluation/index.js +1 -11
  41. package/dist/evaluation/location-match.d.ts +42 -0
  42. package/dist/evaluation/location-match.js +1 -0
  43. package/dist/evaluation/node-game.d.ts +31 -3
  44. package/dist/evaluation/node-game.js +1 -57
  45. package/dist/evaluation/path-reasoning.d.ts +35 -0
  46. package/dist/evaluation/path-reasoning.js +1 -0
  47. package/dist/evaluation/region.d.ts +6 -0
  48. package/dist/evaluation/region.js +1 -36
  49. package/dist/evaluation/types.d.ts +18 -0
  50. package/dist/evaluation/types.js +1 -1
  51. package/dist/evaluation/user-injection.js +1 -27
  52. package/dist/experience/experience-reuse.js +1 -103
  53. package/dist/experience/index.js +1 -5
  54. package/dist/experience/intent-distill.js +1 -83
  55. package/dist/experience/realtime-feedback.js +1 -94
  56. package/dist/experience/types.js +1 -1
  57. package/dist/experience/user-profile.d.ts +1 -1
  58. package/dist/experience/user-profile.js +1 -171
  59. package/dist/extensions/business-modules.js +1 -287
  60. package/dist/extensions/capability-manifest.js +1 -781
  61. package/dist/extensions/constraint-registry.js +1 -198
  62. package/dist/extensions/index.d.ts +6 -0
  63. package/dist/extensions/index.js +1 -6
  64. package/dist/extensions/industry-layers.d.ts +75 -0
  65. package/dist/extensions/industry-layers.js +1 -0
  66. package/dist/extensions/industry-pack.d.ts +105 -0
  67. package/dist/extensions/industry-pack.js +1 -0
  68. package/dist/extensions/metric-registry.js +1 -257
  69. package/dist/extensions/mode-evaluator.d.ts +1 -1
  70. package/dist/extensions/mode-evaluator.js +1 -170
  71. package/dist/extensions/modes.js +1 -499
  72. package/dist/extensions/registry.d.ts +1 -0
  73. package/dist/extensions/registry.js +1 -717
  74. package/dist/extensions/types.js +1 -1
  75. package/dist/graph/base.d.ts +8 -0
  76. package/dist/graph/base.js +1 -0
  77. package/dist/harness/auto-escalation.js +1 -68
  78. package/dist/harness/checkpoint.js +1 -129
  79. package/dist/harness/index.d.ts +1 -0
  80. package/dist/harness/index.js +1 -78
  81. package/dist/harness/plan.d.ts +2 -0
  82. package/dist/harness/plan.js +1 -315
  83. package/dist/harness/recover.d.ts +1 -1
  84. package/dist/harness/recover.js +1 -139
  85. package/dist/harness/types.d.ts +2 -3
  86. package/dist/harness/types.js +1 -1
  87. package/dist/harness/verify.js +1 -237
  88. package/dist/index.js +1 -273
  89. package/dist/intent/enrich.js +1 -67
  90. package/dist/intent/index.js +1 -60
  91. package/dist/intent/matcher.js +1 -81
  92. package/dist/intent/store.js +1 -55
  93. package/dist/intent/types.js +1 -10
  94. package/dist/knowledge/acquisition-flywheel.js +1 -192
  95. package/dist/knowledge/allocation-confirm.js +1 -534
  96. package/dist/knowledge/allocation-context.js +1 -249
  97. package/dist/knowledge/allocation-ledger.js +1 -463
  98. package/dist/knowledge/allocation-puzzle.js +1 -298
  99. package/dist/knowledge/allocation-risk.js +1 -568
  100. package/dist/knowledge/allocation-templates.js +1 -970
  101. package/dist/knowledge/allocation-translation.js +1 -585
  102. package/dist/knowledge/anti-cheat.d.ts +37 -0
  103. package/dist/knowledge/anti-cheat.js +1 -0
  104. package/dist/knowledge/arb-confirm.d.ts +28 -0
  105. package/dist/knowledge/arb-confirm.js +1 -0
  106. package/dist/knowledge/arb-risk.js +1 -210
  107. package/dist/knowledge/arb-translation.d.ts +48 -0
  108. package/dist/knowledge/arb-translation.js +1 -0
  109. package/dist/knowledge/arbitration-confirm.js +1 -559
  110. package/dist/knowledge/arbitration-context.js +1 -505
  111. package/dist/knowledge/arbitration-ledger.js +1 -521
  112. package/dist/knowledge/arbitration-puzzle.js +1 -304
  113. package/dist/knowledge/arbitration-risk.js +1 -423
  114. package/dist/knowledge/arbitration-templates.js +1 -276
  115. package/dist/knowledge/arbitration-translation.js +1 -487
  116. package/dist/knowledge/audit-rules.js +1 -141
  117. package/dist/knowledge/bridge-confirm.d.ts +26 -0
  118. package/dist/knowledge/bridge-confirm.js +1 -0
  119. package/dist/knowledge/bridge-risk.js +1 -263
  120. package/dist/knowledge/bridge-translation.d.ts +37 -0
  121. package/dist/knowledge/bridge-translation.js +1 -0
  122. package/dist/knowledge/contact-confirm.d.ts +27 -0
  123. package/dist/knowledge/contact-confirm.js +1 -0
  124. package/dist/knowledge/contact-risk.js +1 -200
  125. package/dist/knowledge/contact-templates.js +1 -60
  126. package/dist/knowledge/contact-translation.d.ts +39 -0
  127. package/dist/knowledge/contact-translation.js +1 -0
  128. package/dist/knowledge/demand-confirm.js +1 -206
  129. package/dist/knowledge/demand-context.d.ts +17 -0
  130. package/dist/knowledge/demand-context.js +1 -0
  131. package/dist/knowledge/demand-ledger.d.ts +26 -0
  132. package/dist/knowledge/demand-ledger.js +1 -0
  133. package/dist/knowledge/demand-matching.js +1 -132
  134. package/dist/knowledge/demand-puzzle.d.ts +29 -0
  135. package/dist/knowledge/demand-puzzle.js +1 -0
  136. package/dist/knowledge/demand-risk.js +1 -240
  137. package/dist/knowledge/demand-templates.d.ts +12 -0
  138. package/dist/knowledge/demand-templates.js +1 -0
  139. package/dist/knowledge/demand-translation.js +1 -354
  140. package/dist/knowledge/deployment-scanner.js +1 -823
  141. package/dist/knowledge/dynamic-pricing.js +1 -87
  142. package/dist/knowledge/evidence-review.d.ts +12 -0
  143. package/dist/knowledge/evidence-review.js +1 -0
  144. package/dist/knowledge/examples-scanner-cli.js +1 -26
  145. package/dist/knowledge/examples-scanner.js +1 -843
  146. package/dist/knowledge/flywheel-loop.d.ts +0 -1
  147. package/dist/knowledge/flywheel-loop.js +1 -404
  148. package/dist/knowledge/fund-layer.js +1 -973
  149. package/dist/knowledge/glossary.js +1 -211
  150. package/dist/knowledge/guard-confirm.js +1 -406
  151. package/dist/knowledge/guard-context.js +1 -287
  152. package/dist/knowledge/guard-design-patterns.js +1 -360
  153. package/dist/knowledge/guard-ledger.js +1 -260
  154. package/dist/knowledge/guard-lint.js +1 -670
  155. package/dist/knowledge/guard-migration.d.ts +1 -1
  156. package/dist/knowledge/guard-migration.js +1 -228
  157. package/dist/knowledge/guard-puzzle.js +1 -805
  158. package/dist/knowledge/guard-render.js +1 -700
  159. package/dist/knowledge/guard-risk.js +1 -1879
  160. package/dist/knowledge/guard-submission-prompt.js +1 -171
  161. package/dist/knowledge/guard-templates.js +1 -1105
  162. package/dist/knowledge/guard-translation.js +1 -1119
  163. package/dist/knowledge/index.d.ts +71 -3
  164. package/dist/knowledge/index.js +1 -436
  165. package/dist/knowledge/industry-evolution.js +1 -323
  166. package/dist/knowledge/industry-generalizer.js +1 -381
  167. package/dist/knowledge/industry-registry.js +1 -174
  168. package/dist/knowledge/intent-metrics.d.ts +4 -3
  169. package/dist/knowledge/intent-metrics.js +1 -566
  170. package/dist/knowledge/machine-confirm.js +1 -559
  171. package/dist/knowledge/machine-context.js +1 -833
  172. package/dist/knowledge/machine-ledger.js +1 -338
  173. package/dist/knowledge/machine-puzzle.js +1 -494
  174. package/dist/knowledge/machine-render.js +1 -565
  175. package/dist/knowledge/machine-risk.js +1 -669
  176. package/dist/knowledge/machine-templates.js +1 -1597
  177. package/dist/knowledge/machine-topology.js +1 -234
  178. package/dist/knowledge/machine-translation.js +1 -513
  179. package/dist/knowledge/market-metrics.d.ts +12 -0
  180. package/dist/knowledge/market-metrics.js +1 -0
  181. package/dist/knowledge/market-operations.d.ts +46 -0
  182. package/dist/knowledge/market-operations.js +1 -0
  183. package/dist/knowledge/mcp-schema-audit-cli.js +1 -45
  184. package/dist/knowledge/mcp-schema-audit.d.ts +22 -22
  185. package/dist/knowledge/mcp-schema-audit.js +1 -777
  186. package/dist/knowledge/onchain-constants.js +1 -35
  187. package/dist/knowledge/order-confirm.js +1 -573
  188. package/dist/knowledge/order-context.js +1 -390
  189. package/dist/knowledge/order-ledger.js +1 -341
  190. package/dist/knowledge/order-puzzle.js +1 -255
  191. package/dist/knowledge/order-risk.js +1 -653
  192. package/dist/knowledge/order-templates.js +1 -368
  193. package/dist/knowledge/order-translation.js +1 -550
  194. package/dist/knowledge/overrides-loader.js +1 -65
  195. package/dist/knowledge/passport-confirm.js +1 -531
  196. package/dist/knowledge/passport-context.js +1 -306
  197. package/dist/knowledge/passport-ledger.js +1 -282
  198. package/dist/knowledge/passport-puzzle.js +1 -333
  199. package/dist/knowledge/passport-risk.js +1 -450
  200. package/dist/knowledge/passport-templates.js +1 -568
  201. package/dist/knowledge/passport-translation.js +1 -516
  202. package/dist/knowledge/payment-confirm.d.ts +26 -0
  203. package/dist/knowledge/payment-confirm.js +1 -0
  204. package/dist/knowledge/payment-risk.js +1 -249
  205. package/dist/knowledge/payment-translation.d.ts +37 -0
  206. package/dist/knowledge/payment-translation.js +1 -0
  207. package/dist/knowledge/permission-confirm.js +1 -426
  208. package/dist/knowledge/permission-context.js +1 -224
  209. package/dist/knowledge/permission-ledger.d.ts +11 -0
  210. package/dist/knowledge/permission-ledger.js +1 -403
  211. package/dist/knowledge/permission-puzzle.js +1 -173
  212. package/dist/knowledge/permission-risk.js +1 -411
  213. package/dist/knowledge/permission-templates.js +1 -234
  214. package/dist/knowledge/permission-translation.js +1 -350
  215. package/dist/knowledge/personal-confirm.d.ts +29 -0
  216. package/dist/knowledge/personal-confirm.js +1 -0
  217. package/dist/knowledge/personal-risk.js +1 -212
  218. package/dist/knowledge/personal-translation.d.ts +37 -0
  219. package/dist/knowledge/personal-translation.js +1 -0
  220. package/dist/knowledge/process-model.d.ts +1 -11
  221. package/dist/knowledge/process-model.js +1 -160
  222. package/dist/knowledge/progress-confirm.js +1 -456
  223. package/dist/knowledge/progress-context.js +1 -452
  224. package/dist/knowledge/progress-ledger.js +1 -330
  225. package/dist/knowledge/progress-puzzle.js +1 -219
  226. package/dist/knowledge/progress-risk.js +1 -461
  227. package/dist/knowledge/progress-templates.js +1 -228
  228. package/dist/knowledge/progress-translation.js +1 -405
  229. package/dist/knowledge/proof-confirm.js +1 -187
  230. package/dist/knowledge/proof-context.d.ts +17 -0
  231. package/dist/knowledge/proof-context.js +1 -0
  232. package/dist/knowledge/proof-ledger.d.ts +34 -0
  233. package/dist/knowledge/proof-ledger.js +1 -0
  234. package/dist/knowledge/proof-puzzle.d.ts +35 -0
  235. package/dist/knowledge/proof-puzzle.js +1 -0
  236. package/dist/knowledge/proof-risk.js +1 -207
  237. package/dist/knowledge/proof-templates.d.ts +22 -0
  238. package/dist/knowledge/proof-templates.js +1 -0
  239. package/dist/knowledge/proof-translation.js +1 -283
  240. package/dist/knowledge/registrar-confirm.d.ts +26 -0
  241. package/dist/knowledge/registrar-confirm.js +1 -0
  242. package/dist/knowledge/registrar-risk.js +1 -217
  243. package/dist/knowledge/registrar-translation.d.ts +37 -0
  244. package/dist/knowledge/registrar-translation.js +1 -0
  245. package/dist/knowledge/repository-confirm.js +1 -286
  246. package/dist/knowledge/repository-context.d.ts +12 -0
  247. package/dist/knowledge/repository-context.js +1 -0
  248. package/dist/knowledge/repository-ledger.d.ts +25 -0
  249. package/dist/knowledge/repository-ledger.js +1 -0
  250. package/dist/knowledge/repository-puzzle.d.ts +30 -0
  251. package/dist/knowledge/repository-puzzle.js +1 -0
  252. package/dist/knowledge/repository-risk.js +1 -373
  253. package/dist/knowledge/repository-templates.d.ts +14 -0
  254. package/dist/knowledge/repository-templates.js +1 -0
  255. package/dist/knowledge/repository-translation.js +1 -445
  256. package/dist/knowledge/reputation-rules.js +1 -99
  257. package/dist/knowledge/resource-confirm.d.ts +25 -0
  258. package/dist/knowledge/resource-confirm.js +1 -0
  259. package/dist/knowledge/resource-risk.js +1 -157
  260. package/dist/knowledge/resource-translation.d.ts +37 -0
  261. package/dist/knowledge/resource-translation.js +1 -0
  262. package/dist/knowledge/reward-confirm.js +1 -526
  263. package/dist/knowledge/reward-context.d.ts +2 -2
  264. package/dist/knowledge/reward-context.js +1 -504
  265. package/dist/knowledge/reward-ledger.js +1 -502
  266. package/dist/knowledge/reward-puzzle.js +1 -300
  267. package/dist/knowledge/reward-risk.js +1 -627
  268. package/dist/knowledge/reward-templates.js +1 -197
  269. package/dist/knowledge/reward-translation.js +1 -501
  270. package/dist/knowledge/safety-rules.d.ts +1 -0
  271. package/dist/knowledge/safety-rules.js +1 -404
  272. package/dist/knowledge/scenario-modes.js +1 -321
  273. package/dist/knowledge/service-confirm.js +1 -807
  274. package/dist/knowledge/service-context.js +1 -403
  275. package/dist/knowledge/service-ledger.js +1 -609
  276. package/dist/knowledge/service-puzzle.js +1 -236
  277. package/dist/knowledge/service-risk.d.ts +1 -1
  278. package/dist/knowledge/service-risk.js +1 -651
  279. package/dist/knowledge/service-templates.js +1 -456
  280. package/dist/knowledge/service-translation.js +1 -622
  281. package/dist/knowledge/template-registry.js +1 -353
  282. package/dist/knowledge/tool-constraints.js +1 -195
  283. package/dist/knowledge/tools-reference.js +1 -178
  284. package/dist/knowledge/treasury-confirm.js +1 -512
  285. package/dist/knowledge/treasury-context.js +1 -363
  286. package/dist/knowledge/treasury-ledger.js +1 -300
  287. package/dist/knowledge/treasury-puzzle.js +1 -216
  288. package/dist/knowledge/treasury-risk.js +1 -440
  289. package/dist/knowledge/treasury-templates.js +1 -358
  290. package/dist/knowledge/treasury-translation.js +1 -498
  291. package/dist/knowledge/trust-metrics.js +1 -198
  292. package/dist/knowledge/universal-template.d.ts +22 -0
  293. package/dist/knowledge/universal-template.js +1 -0
  294. package/dist/knowledge/util-confirm.d.ts +24 -0
  295. package/dist/knowledge/util-confirm.js +1 -0
  296. package/dist/knowledge/util-risk.js +1 -135
  297. package/dist/knowledge/util-translation.d.ts +38 -0
  298. package/dist/knowledge/util-translation.js +1 -0
  299. package/dist/knowledge/workflow-guidance.d.ts +116 -0
  300. package/dist/knowledge/workflow-guidance.js +1 -0
  301. package/dist/loop-engineering/aggregate.js +1 -132
  302. package/dist/loop-engineering/context-collect.js +1 -83
  303. package/dist/loop-engineering/diagnose.js +1 -273
  304. package/dist/loop-engineering/improve.js +1 -405
  305. package/dist/loop-engineering/index.js +1 -4
  306. package/dist/loop-engineering/pipeline.js +1 -56
  307. package/dist/mode-market/index.js +1 -3
  308. package/dist/mode-market/registry.js +1 -124
  309. package/dist/mode-market/review.js +1 -214
  310. package/dist/mode-market/submission.js +1 -85
  311. package/dist/participation/collaborator-interest.d.ts +23 -0
  312. package/dist/participation/collaborator-interest.js +1 -0
  313. package/dist/participation/customer-interest.d.ts +25 -0
  314. package/dist/participation/customer-interest.js +1 -0
  315. package/dist/participation/employee-kpi.d.ts +25 -0
  316. package/dist/participation/employee-kpi.js +1 -0
  317. package/dist/participation/employee-store.d.ts +16 -0
  318. package/dist/participation/employee-store.js +1 -0
  319. package/dist/participation/index.d.ts +2 -0
  320. package/dist/participation/index.js +1 -0
  321. package/dist/participation/merchant-interest.js +1 -100
  322. package/dist/participation/radar-core.d.ts +13 -3
  323. package/dist/participation/radar-core.js +1 -269
  324. package/dist/participation/supplier-interest.d.ts +25 -0
  325. package/dist/participation/supplier-interest.js +1 -0
  326. package/dist/persona/analyzer.js +1 -66
  327. package/dist/persona/bridge.js +1 -86
  328. package/dist/persona/defaults.js +1 -195
  329. package/dist/persona/experience-bridge.js +1 -23
  330. package/dist/persona/index.d.ts +9 -2
  331. package/dist/persona/index.js +1 -71
  332. package/dist/persona/local-region.d.ts +20 -0
  333. package/dist/persona/local-region.js +1 -0
  334. package/dist/persona/model.js +1 -111
  335. package/dist/persona/overrides.d.ts +10 -0
  336. package/dist/persona/overrides.js +1 -0
  337. package/dist/persona/pack-personae.d.ts +11 -0
  338. package/dist/persona/pack-personae.js +1 -0
  339. package/dist/persona/store.js +1 -62
  340. package/dist/persona/strategy-intent.d.ts +20 -0
  341. package/dist/persona/strategy-intent.js +1 -0
  342. package/dist/persona/types.d.ts +6 -2
  343. package/dist/persona/types.js +1 -5
  344. package/dist/project/business-puzzle.d.ts +1 -1
  345. package/dist/project/business-puzzle.js +1 -383
  346. package/dist/project/context-assembly.js +1 -254
  347. package/dist/project/deployment-bridge.js +1 -120
  348. package/dist/project/deployment-doc.js +1 -1126
  349. package/dist/project/edit-planner.js +1 -1342
  350. package/dist/project/evaluation.d.ts +37 -1
  351. package/dist/project/evaluation.js +1 -2011
  352. package/dist/project/game-theory.js +1 -177
  353. package/dist/project/graph-builder.js +1 -656
  354. package/dist/project/graph.d.ts +3 -6
  355. package/dist/project/graph.js +1 -340
  356. package/dist/project/handlers.d.ts +33 -2
  357. package/dist/project/handlers.js +1 -1784
  358. package/dist/project/index.d.ts +2 -0
  359. package/dist/project/index.js +1 -301
  360. package/dist/project/intent-analyzer.js +1 -149
  361. package/dist/project/machine-nodes.js +1 -36
  362. package/dist/project/merchant-guide.d.ts +19 -0
  363. package/dist/project/merchant-guide.js +1 -264
  364. package/dist/project/migration.js +1 -125
  365. package/dist/project/mode-actions.js +1 -309
  366. package/dist/project/namespace.js +1 -206
  367. package/dist/project/participation-radar.js +1 -428
  368. package/dist/project/pipeline-actions.js +1 -109
  369. package/dist/project/project-store.js +1 -422
  370. package/dist/project/query.js +1 -153
  371. package/dist/project/reverse-mapping.d.ts +34 -0
  372. package/dist/project/reverse-mapping.js +1 -0
  373. package/dist/project/risk-aggregator.js +1 -295
  374. package/dist/project/rollback-policy.js +1 -290
  375. package/dist/project/semantic-assembler.js +1 -345
  376. package/dist/project/semantic-graph.d.ts +3 -5
  377. package/dist/project/semantic-graph.js +1 -292
  378. package/dist/project/stage-gate.js +1 -369
  379. package/dist/project/substep-trace.js +1 -332
  380. package/dist/project/task-tracker.js +1 -78
  381. package/dist/project/workflow-design-assessment.d.ts +24 -0
  382. package/dist/project/workflow-design-assessment.js +1 -0
  383. package/dist/role/derivation.d.ts +18 -0
  384. package/dist/role/derivation.js +1 -0
  385. package/dist/role/index.d.ts +5 -0
  386. package/dist/role/index.js +1 -0
  387. package/dist/role/model.d.ts +8 -0
  388. package/dist/role/model.js +1 -0
  389. package/dist/role/resolution.d.ts +11 -0
  390. package/dist/role/resolution.js +1 -0
  391. package/dist/role/types.d.ts +11 -0
  392. package/dist/role/types.js +1 -0
  393. package/dist/rules.js +1 -52
  394. package/dist/safety/confirm-gate.d.ts +1 -1
  395. package/dist/safety/confirm-gate.js +1 -88
  396. package/dist/safety/index.js +1 -3
  397. package/dist/safety/preview.js +1 -52
  398. package/dist/schema/call/allocation.d.ts +186 -1385
  399. package/dist/schema/call/allocation.js +1 -34
  400. package/dist/schema/call/arbitration.d.ts +272 -1871
  401. package/dist/schema/call/arbitration.js +1 -113
  402. package/dist/schema/call/base.d.ts +1831 -9076
  403. package/dist/schema/call/base.js +1 -370
  404. package/dist/schema/call/bridge.d.ts +911 -3171
  405. package/dist/schema/call/bridge.js +1 -458
  406. package/dist/schema/call/contact.d.ts +135 -931
  407. package/dist/schema/call/contact.js +1 -37
  408. package/dist/schema/call/demand.d.ts +164 -1194
  409. package/dist/schema/call/demand.js +1 -47
  410. package/dist/schema/call/guard.d.ts +298 -1140
  411. package/dist/schema/call/guard.js +1 -161
  412. package/dist/schema/call/handler.js +1 -322
  413. package/dist/schema/call/index.js +1 -20
  414. package/dist/schema/call/machine.d.ts +459 -5403
  415. package/dist/schema/call/machine.js +1 -193
  416. package/dist/schema/call/order.d.ts +137 -844
  417. package/dist/schema/call/order.js +1 -35
  418. package/dist/schema/call/payment.d.ts +74 -561
  419. package/dist/schema/call/payment.js +1 -37
  420. package/dist/schema/call/permission-handler.js +1 -54
  421. package/dist/schema/call/permission.d.ts +335 -2791
  422. package/dist/schema/call/permission.js +1 -105
  423. package/dist/schema/call/personal.d.ts +227 -1814
  424. package/dist/schema/call/personal.js +1 -78
  425. package/dist/schema/call/progress.d.ts +140 -843
  426. package/dist/schema/call/progress.js +1 -47
  427. package/dist/schema/call/proof.d.ts +42 -258
  428. package/dist/schema/call/proof.js +1 -33
  429. package/dist/schema/call/repository.d.ts +324 -2222
  430. package/dist/schema/call/repository.js +1 -77
  431. package/dist/schema/call/reward.d.ts +153 -1183
  432. package/dist/schema/call/reward.js +1 -30
  433. package/dist/schema/call/semantic.js +1 -1679
  434. package/dist/schema/call/service.d.ts +376 -3431
  435. package/dist/schema/call/service.js +1 -184
  436. package/dist/schema/call/treasury.d.ts +252 -2158
  437. package/dist/schema/call/treasury.js +1 -71
  438. package/dist/schema/common/index.d.ts +222 -697
  439. package/dist/schema/common/index.js +1 -407
  440. package/dist/schema/config/index.d.ts +18 -161
  441. package/dist/schema/config/index.js +1 -68
  442. package/dist/schema/employee/index.d.ts +99 -0
  443. package/dist/schema/employee/index.js +1 -0
  444. package/dist/schema/evaluation/index.d.ts +1062 -3748
  445. package/dist/schema/evaluation/index.js +1 -356
  446. package/dist/schema/index.d.ts +3 -0
  447. package/dist/schema/index.js +1 -17
  448. package/dist/schema/industry-pack/index.d.ts +132 -0
  449. package/dist/schema/industry-pack/index.js +1 -0
  450. package/dist/schema/intent-radar/index.d.ts +92 -245
  451. package/dist/schema/intent-radar/index.js +1 -89
  452. package/dist/schema/local/index.d.ts +2045 -18080
  453. package/dist/schema/local/index.js +1 -927
  454. package/dist/schema/local/wip.d.ts +61 -651
  455. package/dist/schema/local/wip.js +1 -187
  456. package/dist/schema/messenger/index.d.ts +949 -5557
  457. package/dist/schema/messenger/index.js +1 -475
  458. package/dist/schema/operations.d.ts +2969 -26518
  459. package/dist/schema/operations.js +1 -520
  460. package/dist/schema/persona/index.d.ts +469 -1820
  461. package/dist/schema/persona/index.js +1 -148
  462. package/dist/schema/project/index.d.ts +1027 -8408
  463. package/dist/schema/project/index.js +1 -2057
  464. package/dist/schema/query/index.d.ts +12041 -75261
  465. package/dist/schema/query/index.js +1 -1646
  466. package/dist/schema/schema-query/index.d.ts +35 -98
  467. package/dist/schema/schema-query/index.js +1 -104
  468. package/dist/schema/schema-version.js +1 -76
  469. package/dist/schema/task-status.d.ts +26 -132
  470. package/dist/schema/task-status.js +1 -36
  471. package/dist/schema/trust/index.d.ts +194 -1290
  472. package/dist/schema/trust/index.js +1 -314
  473. package/dist/schema/utils/guard-parser.js +1 -419
  474. package/dist/schema/utils/guard-query-utils.js +1 -46
  475. package/dist/schema/utils/node-parser.js +1 -369
  476. package/dist/schema/utils/object-type-utils.js +1 -35
  477. package/dist/schema/utils/permission-index-utils.js +1 -7
  478. package/dist/schema/utils/permission-machine-check.js +1 -121
  479. package/dist/schema/utils/skills-recommendation.d.ts +1 -0
  480. package/dist/schema/utils/skills-recommendation.js +1 -77
  481. package/dist/schema/workspace/index.d.ts +69 -0
  482. package/dist/schema/workspace/index.js +1 -0
  483. package/dist/schema-query-impl/index.js +1 -0
  484. package/dist/schemas/account_operation.output.json +3147 -1652
  485. package/dist/schemas/account_operation.schema.json +225 -218
  486. package/dist/schemas/bridge_operation.output.json +1168 -650
  487. package/dist/schemas/bridge_operation.schema.json +736 -504
  488. package/dist/schemas/config_operation.output.json +185 -179
  489. package/dist/schemas/config_operation.schema.json +21 -26
  490. package/dist/schemas/employee_operation.output.json +207 -0
  491. package/dist/schemas/employee_operation.schema.json +176 -0
  492. package/dist/schemas/evaluation_operation.output.json +2329 -557
  493. package/dist/schemas/evaluation_operation.schema.json +2939 -720
  494. package/dist/schemas/guard2file.output.json +58 -64
  495. package/dist/schemas/guard2file.schema.json +79 -81
  496. package/dist/schemas/index.json +29 -11
  497. package/dist/schemas/industry_pack_operation.output.json +594 -0
  498. package/dist/schemas/industry_pack_operation.schema.json +55 -0
  499. package/dist/schemas/intent_radar.output.json +275 -200
  500. package/dist/schemas/intent_radar.schema.json +124 -123
  501. package/dist/schemas/local_info_operation.output.json +1174 -657
  502. package/dist/schemas/local_info_operation.schema.json +119 -125
  503. package/dist/schemas/local_mark_operation.output.json +1239 -689
  504. package/dist/schemas/local_mark_operation.schema.json +91 -96
  505. package/dist/schemas/machineNode2file.output.json +63 -69
  506. package/dist/schemas/machineNode2file.schema.json +79 -81
  507. package/dist/schemas/messenger_operation.output.json +2722 -1528
  508. package/dist/schemas/messenger_operation.schema.json +1482 -1264
  509. package/dist/schemas/onchain_events.output.json +2590 -975
  510. package/dist/schemas/onchain_events.schema.json +117 -99
  511. package/dist/schemas/onchain_operations.output.json +3957 -2309
  512. package/dist/schemas/onchain_operations.schema.json +20799 -9285
  513. package/dist/schemas/onchain_operations_allocation.schema.json +172 -108
  514. package/dist/schemas/onchain_operations_arbitration.schema.json +233 -146
  515. package/dist/schemas/onchain_operations_contact.schema.json +129 -90
  516. package/dist/schemas/onchain_operations_demand.schema.json +170 -112
  517. package/dist/schemas/onchain_operations_gen_passport.schema.json +61 -646
  518. package/dist/schemas/onchain_operations_gen_proof.schema.json +40 -172
  519. package/dist/schemas/onchain_operations_guard.schema.json +3765 -294
  520. package/dist/schemas/onchain_operations_machine.schema.json +537 -164
  521. package/dist/schemas/onchain_operations_order.schema.json +126 -96
  522. package/dist/schemas/onchain_operations_payment.schema.json +82 -67
  523. package/dist/schemas/onchain_operations_permission.schema.json +331 -93
  524. package/dist/schemas/onchain_operations_personal.schema.json +636 -96
  525. package/dist/schemas/onchain_operations_progress.schema.json +125 -92
  526. package/dist/schemas/onchain_operations_proof.schema.json +76 -69
  527. package/dist/schemas/onchain_operations_repository.schema.json +636 -249
  528. package/dist/schemas/onchain_operations_reward.schema.json +218 -108
  529. package/dist/schemas/onchain_operations_service.schema.json +679 -221
  530. package/dist/schemas/onchain_operations_treasury.schema.json +401 -135
  531. package/dist/schemas/onchain_table_data.output.json +6018 -2430
  532. package/dist/schemas/onchain_table_data.schema.json +544 -430
  533. package/dist/schemas/persona_operation.output.json +1568 -265
  534. package/dist/schemas/persona_operation.schema.json +346 -202
  535. package/dist/schemas/project_operation.output.json +6957 -5147
  536. package/dist/schemas/project_operation.schema.json +1050 -1020
  537. package/dist/schemas/query_task_status.output.json +195 -99
  538. package/dist/schemas/query_task_status.schema.json +12 -18
  539. package/dist/schemas/query_toolkit.output.json +18870 -14566
  540. package/dist/schemas/query_toolkit.schema.json +614 -522
  541. package/dist/schemas/schema_query.output.json +127 -129
  542. package/dist/schemas/schema_query.schema.json +64 -69
  543. package/dist/schemas/trust_score.output.json +678 -587
  544. package/dist/schemas/trust_score.schema.json +289 -277
  545. package/dist/schemas/wip_file.output.json +116 -124
  546. package/dist/schemas/wip_file.schema.json +142 -143
  547. package/dist/schemas/workspace_operation.output.json +277 -0
  548. package/dist/schemas/workspace_operation.schema.json +45 -0
  549. package/dist/schemas/wowok_buildin_info.output.json +1693 -723
  550. package/dist/schemas/wowok_buildin_info.schema.json +576 -512
  551. package/dist/telemetry/index.js +1 -112
  552. package/dist/telemetry/redact.js +1 -23
  553. package/dist/telemetry/storage.js +1 -80
  554. package/dist/tools/handlers/bridge.d.ts +8 -1
  555. package/dist/tools/handlers/bridge.js +1 -1
  556. package/dist/tools/handlers/config.js +1 -74
  557. package/dist/tools/handlers/employee.d.ts +2 -0
  558. package/dist/tools/handlers/employee.js +1 -0
  559. package/dist/tools/handlers/evaluation.js +1 -123
  560. package/dist/tools/handlers/file-export.js +1 -90
  561. package/dist/tools/handlers/industry-pack.d.ts +2 -0
  562. package/dist/tools/handlers/industry-pack.js +1 -0
  563. package/dist/tools/handlers/intent-radar.js +1 -76
  564. package/dist/tools/handlers/local.js +1 -53
  565. package/dist/tools/handlers/messenger.js +1 -188
  566. package/dist/tools/handlers/onchain.js +1 -1180
  567. package/dist/tools/handlers/persona.js +1 -89
  568. package/dist/tools/handlers/project.js +1 -211
  569. package/dist/tools/handlers/query.js +1 -434
  570. package/dist/tools/handlers/schema-query.js +1 -176
  571. package/dist/tools/handlers/task-status.js +1 -26
  572. package/dist/tools/handlers/trust.js +1 -380
  573. package/dist/tools/handlers/wip.js +1 -90
  574. package/dist/tools/handlers/workspace.d.ts +2 -0
  575. package/dist/tools/handlers/workspace.js +1 -0
  576. package/dist/tools/index.d.ts +2 -1
  577. package/dist/tools/index.js +1 -1382
  578. package/dist/tools/retry.js +1 -85
  579. package/dist/tools/rules-hook.d.ts +1 -1
  580. package/dist/tools/rules-hook.js +1 -23
  581. package/dist/tools/shared.d.ts +1 -1
  582. package/dist/tools/shared.js +1 -130
  583. package/dist/tools/types.d.ts +2 -1
  584. package/dist/tools/types.js +1 -1
  585. package/dist/tools/upgrade-check.d.ts +19 -0
  586. package/dist/tools/upgrade-check.js +1 -0
  587. package/dist/tools/wip-deploy-assist.js +1 -306
  588. package/dist/tools/wrap.js +1 -500
  589. package/package.json +7 -6
  590. package/dist/knowledge/arbitration-trust.d.ts +0 -24
  591. package/dist/knowledge/arbitration-trust.js +0 -117
  592. package/dist/schema/call/bridge-handler.d.ts +0 -8
  593. package/dist/schema/call/bridge-handler.js +0 -265
  594. package/dist/schema/sync-layer4.d.ts +0 -21
  595. package/dist/schema/sync-layer4.js +0 -286
  596. package/dist/schema-query/index.js +0 -810
  597. /package/dist/{schema-query → schema-query-impl}/index.d.ts +0 -0
@@ -1,1784 +1 @@
1
- import { LocalProject, LocalMark, query_objects, } from "@wowok/wowok";
2
- import { fetchMachineNodes } from "./machine-nodes.js";
3
- import { GraphBuilder } from "./graph-builder.js";
4
- import { SemanticAssembler } from "./semantic-assembler.js";
5
- import { runEvaluation, compareProjects, } from "./evaluation.js";
6
- import { TaskTracker } from "./task-tracker.js";
7
- import { renderGuardMermaid, renderGuardTreeIndented, renderGuardAscii, renderGuardMarkmap, } from "../knowledge/guard-render.js";
8
- import { renderMachineMermaid, renderMachineTreeIndented, renderMachineAscii, renderMachineMarkmap, } from "../knowledge/machine-render.js";
9
- import { inferTraitsFromDescription, findSimilarIndustries, } from "../knowledge/industry-generalizer.js";
10
- import { isObjectOfType } from "../schema/utils/object-type-utils.js";
11
- import { identifyMigrationDecisions } from "../harness/plan.js";
12
- const localProject = LocalProject.Instance();
13
- function requireField(value, name) {
14
- if (value === undefined || value === null) {
15
- throw new Error(`'${name}' is required for this action`);
16
- }
17
- return value;
18
- }
19
- async function resolveProjectId(v) {
20
- if (v.project_id)
21
- return v.project_id;
22
- if (v.project) {
23
- const p = await localProject.getProjectByPrefix(v.project);
24
- if (!p)
25
- throw new Error(`Project not found by prefix: ${v.project}`);
26
- return p.id;
27
- }
28
- throw new Error("Either 'project_id' or 'project' (prefix) is required for this action");
29
- }
30
- async function resolveObjectAddress(v) {
31
- if (v.object_address) {
32
- const addr = v.object_address;
33
- const isHexAddress = /^0x[0-9a-fA-F]{32,64}$/.test(addr);
34
- const isDraftSentinel = addr.startsWith("draft:");
35
- if (!isHexAddress && !isDraftSentinel) {
36
- throw new Error(`Invalid object_address format: '${addr.slice(0, 40)}${addr.length > 40 ? "..." : ""}'. ` +
37
- `Expected a valid Sui address (0x + 32-64 hex chars) or 'draft:<name>' sentinel. ` +
38
- `To reference an object by name, use 'object_name_add' instead of 'object_address'.`);
39
- }
40
- return addr;
41
- }
42
- if (v.object_name_add) {
43
- const mark = await LocalMark.Instance().get(v.object_name_add);
44
- if (mark?.address)
45
- return mark.address;
46
- throw new Error(`LocalMark name not found: ${v.object_name_add}`);
47
- }
48
- throw new Error("Either 'object_address' or 'object_name_add' is required for add_object");
49
- }
50
- function isDraftObject(obj) {
51
- if (obj.objectAddress && obj.objectAddress.startsWith("draft:"))
52
- return true;
53
- const meta = obj.metadata;
54
- return !!(meta && meta.status === "draft");
55
- }
56
- function isOnchainObject(obj) {
57
- if (isDraftObject(obj))
58
- return false;
59
- return !!obj.objectAddress && obj.objectAddress.startsWith("0x");
60
- }
61
- export async function handleListProjects(v) {
62
- const filter = {};
63
- if (v.filter_status)
64
- filter.status = v.filter_status;
65
- if (v.filter_perspective)
66
- filter.perspective = v.filter_perspective;
67
- if (v.filter_network)
68
- filter.network = v.filter_network;
69
- const projects = await localProject.listProjects(Object.keys(filter).length > 0 ? filter : undefined);
70
- const items = await Promise.all(projects.map(async (p) => {
71
- const [objs, evals] = await Promise.all([
72
- localProject.listObjects(p.id),
73
- localProject.listEvaluations(p.id),
74
- ]);
75
- const types = new Set();
76
- for (const o of objs) {
77
- if (o.objectType)
78
- types.add(o.objectType);
79
- }
80
- const onchainCount = objs.filter(o => isOnchainObject(o)).length;
81
- if (p.status === "draft" && objs.length > 0) {
82
- const updated = await localProject.updateProject(p.id, { status: "active" });
83
- if (updated) {
84
- return {
85
- ...updated,
86
- objectCount: onchainCount,
87
- evaluationCount: evals.length,
88
- objectTypes: Array.from(types),
89
- };
90
- }
91
- }
92
- return {
93
- ...p,
94
- objectCount: onchainCount,
95
- evaluationCount: evals.length,
96
- objectTypes: Array.from(types),
97
- };
98
- }));
99
- return {
100
- action: "list_projects",
101
- items,
102
- total: items.length,
103
- };
104
- }
105
- export async function handleCreateProject(v) {
106
- const name = requireField(v.project_name, "project_name");
107
- let prefix = v.project;
108
- if (!prefix) {
109
- prefix = name
110
- .toLowerCase()
111
- .trim()
112
- .replace(/[^a-z0-9]+/g, "_")
113
- .replace(/^_+|_+$/g, "")
114
- .substring(0, 60);
115
- if (!prefix) {
116
- prefix = `proj_${Date.now().toString(36)}`;
117
- }
118
- }
119
- const existing = await localProject.getProjectByPrefix(prefix);
120
- if (existing) {
121
- if (v.project) {
122
- throw new Error(`Project prefix '${prefix}' already exists (project: '${existing.name}', id: '${existing.id}'). ` +
123
- `Use a different prefix or update the existing project.`);
124
- }
125
- let suffix = 2;
126
- while (await localProject.getProjectByPrefix(`${prefix}_${suffix}`)) {
127
- suffix++;
128
- }
129
- prefix = `${prefix}_${suffix}`;
130
- }
131
- const create = {
132
- prefix,
133
- name,
134
- description: v.project_description,
135
- industry: v.project_industry,
136
- perspective: v.project_perspective ?? "producer",
137
- labels: v.project_labels,
138
- serviceAddress: v.service_address,
139
- network: v.project_network ?? "testnet",
140
- };
141
- const project = await localProject.createProject(create);
142
- if (v.service_address) {
143
- try {
144
- await localProject.addObject(project.id, {
145
- objectAddress: v.service_address,
146
- objectType: "Service",
147
- objectName: v.service_address.startsWith("0x")
148
- ? undefined
149
- : v.service_address,
150
- role: "core",
151
- metadata: {
152
- auto_added_from_service_address: true,
153
- added_at: new Date().toISOString(),
154
- },
155
- });
156
- }
157
- catch (err) {
158
- console.warn(`[create_project] Failed to auto-add Service '${v.service_address}': ${err.message}. ` +
159
- `Use add_object action to manually add it.`);
160
- }
161
- }
162
- const industry = v.project_industry;
163
- const skipTemplates = v.skip_templates === true;
164
- if (industry && industry !== "general" && !skipTemplates) {
165
- try {
166
- const { IndustryModeRegistry } = await import("../extensions/index.js");
167
- const registry = IndustryModeRegistry.Instance();
168
- const context = {
169
- prefix,
170
- version: project.currentVersion ?? "v1",
171
- network: (project.network ?? "testnet"),
172
- business_intent: v.project_description ?? name,
173
- industry,
174
- };
175
- const blueprint = await registry.applyTemplate(industry, context.business_intent, context);
176
- const intentInference = inferTraitsFromDescription(context.business_intent);
177
- const industryMatches = findSimilarIndustries(intentInference.traits, 3);
178
- const intentInferenceSummary = {
179
- traits: intentInference.traits,
180
- confidence: intentInference.confidence,
181
- matched_keywords: intentInference.matched_keywords,
182
- top_matches: industryMatches.map((m) => ({
183
- industry: m.industry,
184
- similarity: m.similarity,
185
- })),
186
- };
187
- const topMatch = industryMatches[0];
188
- const industryMismatchHint = topMatch &&
189
- !industryMatches.some((m) => m.industry === industry) &&
190
- intentInference.confidence >= 0.3 &&
191
- topMatch.similarity >= 0.6
192
- ? `Intent inference suggests industry '${topMatch.industry}' ` +
193
- `(similarity ${(topMatch.similarity * 100).toFixed(0)}%) may fit the description ` +
194
- `better than the chosen '${industry}'. Call action='recommend_industry' for the full ` +
195
- `recommendation chain, or ignore this hint if '${industry}' was chosen intentionally.`
196
- : undefined;
197
- const draftObjects = [];
198
- for (const obj of blueprint.objects) {
199
- const projectObj = await localProject.addObject(project.id, {
200
- objectAddress: `draft:${obj.name}`,
201
- objectType: obj.object_type,
202
- objectName: obj.name,
203
- role: obj.object_type === "service" ? "core" : "dependency",
204
- metadata: {
205
- status: "draft",
206
- config: obj.config,
207
- publish_required: obj.publish_required,
208
- description: obj.description,
209
- entry_id: obj.entry_id,
210
- },
211
- });
212
- draftObjects.push(projectObj);
213
- }
214
- const graphEdges = blueprint.edges.map((e) => ({
215
- projectId: project.id,
216
- sourceObject: e.from,
217
- targetObject: e.to,
218
- edgeSource: "internal",
219
- relationshipType: mapEdgeKindToRelationshipType(e.edge_kind),
220
- fieldName: e.field_path,
221
- depth: 0,
222
- verified: false,
223
- weight: 1.0,
224
- metadata: {
225
- blueprint: true,
226
- required_at_publish: e.required_at_publish,
227
- },
228
- }));
229
- await localProject.saveGraphEdges(project.id, graphEdges);
230
- try {
231
- await localProject.saveDocument(project.id, context.network, JSON.stringify({
232
- applied_template: blueprint.applied_template,
233
- industry_source: blueprint.industry_source,
234
- steps: blueprint.steps,
235
- scenarios: blueprint.scenarios ?? [],
236
- validation: blueprint.validation,
237
- intent_inference: intentInferenceSummary,
238
- generated_at: new Date().toISOString(),
239
- }, null, 2), "blueprint");
240
- }
241
- catch (docErr) {
242
- console.warn(`[create_project] Failed to persist blueprint document: ${docErr.message}`);
243
- }
244
- return {
245
- action: "create_project",
246
- project,
247
- blueprint: {
248
- objects_count: draftObjects.length,
249
- edges_count: graphEdges.length,
250
- industry_source: blueprint.industry_source,
251
- applied_template: blueprint.applied_template,
252
- steps_count: blueprint.steps.length,
253
- scenarios_count: blueprint.scenarios?.length ?? 0,
254
- key_risk: registry.getMode(industry)?.key_risk,
255
- intent_inference: intentInferenceSummary,
256
- ...(industryMismatchHint ? { industry_mismatch_hint: industryMismatchHint } : {}),
257
- },
258
- recommended_creation_order: getRecommendedCreationOrder(industry),
259
- };
260
- }
261
- catch (err) {
262
- return {
263
- action: "create_project",
264
- project,
265
- blueprint_warning: `Industry template application failed: ${err.message}. Project created without blueprint — use add_object to manually add objects.`,
266
- recommended_creation_order: getRecommendedCreationOrder(industry),
267
- };
268
- }
269
- }
270
- if (skipTemplates) {
271
- return {
272
- action: "create_project",
273
- project,
274
- blueprint_skipped: true,
275
- hint: "skip_templates=true — no industry blueprint objects were created. Use add_object to manually add objects to this project.",
276
- recommended_creation_order: getRecommendedCreationOrder(industry),
277
- };
278
- }
279
- if (!industry) {
280
- const intentText = (v.project_description ?? name).trim();
281
- if (intentText) {
282
- try {
283
- const { handleRecommendIndustry } = await import("./mode-actions.js");
284
- const rec = handleRecommendIndustry({ intent: intentText });
285
- if (rec.recommendations.length > 0) {
286
- return {
287
- action: "create_project",
288
- project,
289
- recommended_creation_order: getRecommendedCreationOrder(industry),
290
- recommended_industries: rec.recommendations,
291
- hint: "No industry specified. Based on your description, top match is '" +
292
- rec.recommendations[0].industry + "'. To get a ready-made blueprint " +
293
- "(~10 draft objects + graph edges), recreate with project_industry set — " +
294
- "or continue from scratch with add_object.",
295
- };
296
- }
297
- }
298
- catch {
299
- }
300
- }
301
- }
302
- return {
303
- action: "create_project",
304
- project,
305
- recommended_creation_order: getRecommendedCreationOrder(industry),
306
- };
307
- }
308
- function getRecommendedCreationOrder(industry) {
309
- const industryNote = industry && industry !== "general"
310
- ? ` (industry="${industry}" — see IndustryMode.build_notes for overrides)`
311
- : "";
312
- return [
313
- { step: 1, object: "Account", reason: "Base identity for on-chain operations; owns all subsequent objects and receives settlement.", required: true },
314
- { step: 2, object: "Permission", reason: "Centralized access control; referenced by ALL objects (Service, Machine, Guard, Contact, Arbitration).", required: true },
315
- { step: 3, object: "Service (draft)", reason: "Create the skeleton FIRST (unpublished) so Guards can reference it by LocalMark NAME — breaks the Guard↔Service circular dependency.", required: true },
316
- { step: 4, object: "Machine (unpublished)", reason: `Business workflow nodes/forwards. Requires Permission.${industryNote}`, required: true },
317
- { step: 5, object: "Guard x N", reason: "Acceptance logic referencing machine node names + service name via LocalMark. Bind to Machine forwards before publish.", required: true },
318
- { step: 6, object: "Machine publish", reason: "Freeze workflow topology (nodes/pairs/forwards immutable). Export machineNode2file first for backup.", required: true },
319
- { step: 7, object: "Sales (WIP)", reason: "Products with wip URL (must be a public endpoint) + wip_hash. Recommend generating WIP from web/doc material via AI sub-task.", required: true },
320
- { step: 8, object: "Treasury (optional)", reason: "Fund pool for organizations; referenced by order_allocators as an Entity recipient. Skip for personal merchants.", required: false },
321
- { step: 9, object: "order_allocators", reason: "Fund distribution (Amount/Rate/Surplus). Personal merchant → Permission owner; organization → Treasury.", required: true },
322
- { step: 10, object: "Contact", reason: "Customer-service channel (Service.um → Contact → ims[]); enable local account as messenger + anti-spam.", required: true },
323
- { step: 11, object: "Arbitration (optional)", reason: "Third-party dispute resolution (REUSE an existing Arbitration). MUST NOT reuse Service's Permission — E_ARBITRATION_PERMISSION_CONFLICT. Requires compensation_fund if configured.", required: false },
324
- { step: 12, object: "Service publish", reason: "Add machine + order_allocators + buy_guard + sales + arbitrations, then publish:true. machine/order_allocators/arbitrations immutable after publish.", required: true },
325
- ];
326
- }
327
- function mapEdgeKindToRelationshipType(edgeKind) {
328
- switch (edgeKind) {
329
- case "machine":
330
- case "compensation_fund":
331
- case "parent":
332
- return "bind";
333
- case "order_allocators":
334
- return "create";
335
- case "arbitrations":
336
- case "rewards":
337
- return "trigger";
338
- case "buy_guard":
339
- case "permission":
340
- case "guard":
341
- return "validate";
342
- case "service":
343
- case "progress":
344
- return "consume";
345
- default:
346
- return "bind";
347
- }
348
- }
349
- export async function handleCreateProjectFromOnchain(v) {
350
- const serviceAddress = requireField(v.service_address, "service_address");
351
- const network = (v.project_network ?? "testnet");
352
- let prefix = v.project ?? `svc_${serviceAddress.slice(2, 8)}`;
353
- const name = v.project_name ?? `Consumer Project ${serviceAddress.slice(2, 8)}`;
354
- const existing = await localProject.getProjectByPrefix(prefix);
355
- if (existing) {
356
- if (v.project) {
357
- throw new Error(`Project prefix '${prefix}' already exists (project: '${existing.name}', id: '${existing.id}'). ` +
358
- `Use a different prefix.`);
359
- }
360
- let suffix = 2;
361
- while (await localProject.getProjectByPrefix(`${prefix}_${suffix}`)) {
362
- suffix++;
363
- }
364
- prefix = `${prefix}_${suffix}`;
365
- }
366
- const otherNetwork = network === "testnet" ? "mainnet" : "testnet";
367
- let rootType = null;
368
- try {
369
- const rootQuery = await query_objects({
370
- objects: [serviceAddress],
371
- network,
372
- });
373
- const rootObj = rootQuery?.objects?.[0];
374
- if (rootObj && rootObj.object) {
375
- rootType = rootObj.type ?? null;
376
- }
377
- }
378
- catch (e) {
379
- throw new Error(`Failed to query ${network} for the Service object: ` +
380
- `${e instanceof Error ? e.message : String(e)}. ` +
381
- `Check the network connection or try the ${otherNetwork} network.`);
382
- }
383
- if (!rootType) {
384
- throw new Error(`Service object not found on ${network}: the address ${serviceAddress} does not exist on this network. ` +
385
- `Switch to the ${otherNetwork} network and try again.`);
386
- }
387
- const normalizedType = rootType.toLowerCase();
388
- const isService = normalizedType.includes("::service::service") ||
389
- normalizedType === "service" ||
390
- normalizedType.endsWith("::service");
391
- if (!isService) {
392
- throw new Error(`Object ${serviceAddress} is not a Service (its on-chain type is "${rootType}"). ` +
393
- `Only on-chain Service objects can be imported as a project root.`);
394
- }
395
- const project = await localProject.createProject({
396
- prefix,
397
- name,
398
- description: v.project_description ?? `Auto-discovered from Service ${serviceAddress}`,
399
- industry: v.project_industry,
400
- perspective: "consumer",
401
- labels: v.project_labels,
402
- serviceAddress,
403
- network: network,
404
- });
405
- const builder = new GraphBuilder({
406
- maxDepth: v.max_depth ?? v.depth ?? 3,
407
- enableRegistrar: v.enable_registrar ?? true,
408
- enablePotential: v.enable_potential ?? false,
409
- projectId: project.id,
410
- network: network,
411
- });
412
- const graphResult = await builder.buildRelationshipGraph(serviceAddress);
413
- const objects = [];
414
- for (const node of graphResult.graph.nodes) {
415
- const isCore = node.address === serviceAddress;
416
- const obj = await localProject.addObject(project.id, {
417
- objectAddress: node.address,
418
- objectType: node.objectType ?? undefined,
419
- objectName: node.objectName ?? undefined,
420
- role: (isCore ? "core" : "dependency"),
421
- });
422
- objects.push(obj);
423
- }
424
- const updatedProject = await localProject.updateProject(project.id, { status: "active" });
425
- return {
426
- action: "create_project_from_onchain",
427
- project: updatedProject ?? project,
428
- objects,
429
- graphEdgeCount: graphResult.graph.edges.length,
430
- };
431
- }
432
- export async function handleUpdateProject(v) {
433
- const id = await resolveProjectId(v);
434
- const update = {
435
- name: v.project_name,
436
- description: v.project_description,
437
- industry: v.project_industry,
438
- perspective: v.project_perspective,
439
- status: v.project_status,
440
- labels: v.project_labels,
441
- serviceAddress: v.service_address,
442
- };
443
- const project = await localProject.updateProject(id, update);
444
- return { action: "update_project", project };
445
- }
446
- export async function handleGetProjectDetail(v) {
447
- const id = await resolveProjectId(v);
448
- const project = await localProject.getProject(id);
449
- if (!project)
450
- throw new Error(`Project not found: ${id}`);
451
- const objects = await localProject.listObjects(id);
452
- const edges = await localProject.getGraph(id);
453
- const evaluations = await localProject.listEvaluations(id);
454
- const versions = await localProject.listVersions(id);
455
- let effectiveProject = project;
456
- if (project.status === "draft" && objects.length > 0) {
457
- const updated = await localProject.updateProject(id, { status: "active" });
458
- if (updated)
459
- effectiveProject = updated;
460
- }
461
- const needsNameFix = objects.some(o => !o.objectName);
462
- const needsRoleFix = objects.some(o => o.role === "reference");
463
- if (needsNameFix || needsRoleFix) {
464
- const allMarks = await LocalMark.Instance().list(null);
465
- const addressToName = new Map();
466
- for (const m of allMarks) {
467
- if (m.name && m.address) {
468
- addressToName.set(m.address.toLowerCase(), m.name);
469
- }
470
- }
471
- for (const obj of objects) {
472
- const updates = {};
473
- if (!obj.objectName) {
474
- const name = addressToName.get(obj.objectAddress.toLowerCase());
475
- if (name) {
476
- updates.objectName = name;
477
- obj.objectName = name;
478
- }
479
- }
480
- if (obj.role === "reference" && obj.objectType) {
481
- const t = obj.objectType;
482
- if (t.includes("service::Service")) {
483
- updates.role = "core";
484
- obj.role = "core";
485
- }
486
- else if (t.includes("permission::Permission") ||
487
- t.includes("machine::Machine") ||
488
- t.includes("guard::Guard") ||
489
- t.includes("reward::Reward") ||
490
- t.includes("treasury::Treasury") ||
491
- t.includes("allocation::Allocation") ||
492
- t.includes("progress::Progress") ||
493
- t.includes("arbitration::Arbitration") ||
494
- t.includes("demand::Demand") ||
495
- t.includes("order::Order") ||
496
- t.includes("repository::Repository")) {
497
- updates.role = "dependency";
498
- obj.role = "dependency";
499
- }
500
- }
501
- if (effectiveProject.serviceAddress &&
502
- obj.objectAddress === effectiveProject.serviceAddress &&
503
- obj.role !== "core") {
504
- updates.role = "core";
505
- obj.role = "core";
506
- }
507
- if (Object.keys(updates).length > 0) {
508
- await localProject.updateObject(obj.id, updates).catch(() => { });
509
- }
510
- }
511
- }
512
- let serviceStatus = null;
513
- if (effectiveProject.serviceAddress && effectiveProject.network) {
514
- try {
515
- const svcQuery = await query_objects({
516
- objects: [effectiveProject.serviceAddress],
517
- network: effectiveProject.network,
518
- });
519
- const svcData = svcQuery?.objects?.[0];
520
- if (svcData) {
521
- const pub = svcData.bPublished ?? svcData.published ?? svcData.b_publish;
522
- const pau = svcData.bPaused ?? svcData.paused ?? svcData.b_pause;
523
- serviceStatus = {
524
- published: typeof pub === "boolean" ? pub : null,
525
- paused: typeof pau === "boolean" ? pau : null,
526
- };
527
- }
528
- }
529
- catch {
530
- }
531
- }
532
- const VALID_ROLES = new Set(["core", "dependency", "reference"]);
533
- const draftObjs = objects.filter(o => isDraftObject(o));
534
- const onchainObjs = objects.filter(o => isOnchainObject(o));
535
- const core = objects.filter(o => o.role === "core");
536
- const dependency = objects.filter(o => o.role === "dependency");
537
- const reference = objects.filter(o => o.role === "reference");
538
- const other = objects.filter(o => !o.role || !VALID_ROLES.has(o.role));
539
- if (other.length > 0) {
540
- console.warn(`[handleGetProjectDetail] ${other.length} object(s) have invalid or missing role ` +
541
- `(expected one of: ${Array.from(VALID_ROLES).join(", ")}). ` +
542
- `They are grouped into 'other' for visibility. ` +
543
- `Object names: ${other.map(o => o.objectName ?? o.objectAddress).slice(0, 5).join(", ")}${other.length > 5 ? "..." : ""}`);
544
- }
545
- const objectGroups = {
546
- core,
547
- dependency,
548
- reference,
549
- other,
550
- draft: draftObjs,
551
- stats: {
552
- total: objects.length,
553
- onchain_count: onchainObjs.length,
554
- draft_count: draftObjs.length,
555
- core_count: core.length,
556
- dependency_count: dependency.length,
557
- reference_count: reference.length,
558
- other_count: other.length,
559
- by_type: objects.reduce((acc, o) => {
560
- const t = o.objectType ?? "unknown";
561
- const prefix = t.includes("::") ? t.split("::")[0].toLowerCase() : t.toLowerCase();
562
- acc[prefix] = (acc[prefix] ?? 0) + 1;
563
- return acc;
564
- }, {}),
565
- },
566
- };
567
- const objectsWithDraftFlag = objects.map(o => ({
568
- ...o,
569
- isDraft: isDraftObject(o),
570
- }));
571
- return {
572
- action: "get_project_detail",
573
- project: effectiveProject,
574
- objects: objectsWithDraftFlag,
575
- objectCount: objects.length,
576
- onchainCount: onchainObjs.length,
577
- draftCount: draftObjs.length,
578
- objectGroups,
579
- graphEdgeCount: edges.length,
580
- serviceStatus,
581
- evaluations: evaluations.map(e => ({
582
- id: e.id,
583
- evalType: e.evalType,
584
- score: e.score,
585
- summary: e.summary,
586
- details: e.details,
587
- evaluatedAt: e.evaluatedAt,
588
- })),
589
- versions: versions.map(v => ({
590
- version: v.version,
591
- description: v.description,
592
- createdAt: v.createdAt,
593
- })),
594
- };
595
- }
596
- const SHORT_TO_FULL_TYPE = {
597
- "Service": "0x2::service::Service",
598
- "Machine": "0x2::machine::Machine",
599
- "Guard": "0x2::guard::Guard",
600
- "Permission": "0x2::permission::Permission",
601
- "Reward": "0x2::reward::Reward",
602
- "Arbitration": "0x2::arbitration::Arbitration",
603
- "Progress": "0x2::progress::Progress",
604
- "Treasury": "0x2::treasury::Treasury",
605
- "Demand": "0x2::demand::Demand",
606
- "Repository": "0x2::repository::Repository",
607
- "Contact": "0x2::contact::Contact",
608
- "Order": "0x2::order::Order",
609
- "Allocation": "0x2::allocation::Allocation",
610
- "Personal": "0x2::personal::Personal",
611
- "Payment": "0x2::payment::Payment",
612
- "Proof": "0x2::proof::Proof",
613
- };
614
- export async function handleAddObject(v) {
615
- const projectId = await resolveProjectId(v);
616
- const objectAddress = await resolveObjectAddress(v);
617
- const rawType = v.object_type_add;
618
- const objectType = rawType
619
- ? (rawType.includes("::") ? rawType : (SHORT_TO_FULL_TYPE[rawType] ?? rawType))
620
- : undefined;
621
- let objectName = v.object_name_add;
622
- let role = v.object_role;
623
- if (!objectName) {
624
- const marks = await LocalMark.Instance().list({ address: objectAddress });
625
- if (marks.length > 0 && marks[0].name) {
626
- objectName = marks[0].name;
627
- }
628
- }
629
- if (!role) {
630
- const objType = objectType ?? "";
631
- if (objType.includes("service::Service")) {
632
- role = "core";
633
- }
634
- else if (objType.includes("::") && (objType.includes("permission::") ||
635
- objType.includes("machine::") ||
636
- objType.includes("guard::") ||
637
- objType.includes("reward::") ||
638
- objType.includes("treasury::") ||
639
- objType.includes("allocation::") ||
640
- objType.includes("progress::") ||
641
- objType.includes("arbitration::") ||
642
- objType.includes("demand::") ||
643
- objType.includes("order::") ||
644
- objType.includes("repository::"))) {
645
- role = "dependency";
646
- }
647
- else {
648
- role = "reference";
649
- }
650
- }
651
- const obj = await localProject.addObject(projectId, {
652
- objectAddress,
653
- objectType,
654
- objectName,
655
- role,
656
- tags: v.object_tags_add,
657
- });
658
- const project = await localProject.getProject(projectId);
659
- if (project && project.status === "draft") {
660
- await localProject.updateProject(projectId, { status: "active" });
661
- }
662
- return { action: "add_object", object: obj };
663
- }
664
- export async function handleRemoveObject(v) {
665
- const objectId = requireField(v.object_id_remove, "object_id_remove");
666
- await localProject.removeObject(objectId);
667
- return { action: "remove_object", removed: true };
668
- }
669
- export async function handleUpdateObject(v) {
670
- const objectId = requireField(v.object_id_update, "object_id_update");
671
- const updates = {};
672
- if (v.object_name_update !== undefined)
673
- updates.objectName = v.object_name_update;
674
- if (v.object_type_update !== undefined)
675
- updates.objectType = v.object_type_update;
676
- if (v.object_role_update !== undefined)
677
- updates.role = v.object_role_update;
678
- if (v.object_tags_update !== undefined)
679
- updates.tags = v.object_tags_update;
680
- const obj = await localProject.updateObject(objectId, updates);
681
- return { action: "update_object", object: obj };
682
- }
683
- export async function handleCreateVersion(v) {
684
- const projectId = await resolveProjectId(v);
685
- const version = requireField(v.version, "version");
686
- const project = await localProject.getProject(projectId);
687
- if (!project)
688
- throw new Error(`Project not found: ${projectId}`);
689
- const created = await localProject.createVersion(projectId, version, v.version_description);
690
- return {
691
- action: "create_version",
692
- version: {
693
- version: created.version,
694
- description: created.description,
695
- createdAt: created.createdAt,
696
- },
697
- };
698
- }
699
- export async function handleBuildGraph(v) {
700
- const projectId = await resolveProjectId(v);
701
- const project = await localProject.getProject(projectId);
702
- if (!project)
703
- throw new Error(`Project not found: ${projectId}`);
704
- if (v.async_mode === true) {
705
- const taskId = TaskTracker.create("build_graph", projectId);
706
- (async () => {
707
- try {
708
- TaskTracker.update(taskId, 10, "Resolving root address");
709
- const result = await buildGraphSync(projectId, project, v);
710
- TaskTracker.complete(taskId, result);
711
- }
712
- catch (err) {
713
- TaskTracker.fail(taskId, err.message ?? String(err));
714
- }
715
- })();
716
- return {
717
- action: "build_graph",
718
- async_mode: true,
719
- task_id: taskId,
720
- hint: "Graph is building in the background. Call query_task_status with task_id to check progress and retrieve the result.",
721
- };
722
- }
723
- return buildGraphSync(projectId, project, v);
724
- }
725
- async function buildGraphSync(projectId, project, v) {
726
- let rootAddress = project.serviceAddress;
727
- if (!rootAddress) {
728
- const objects = await localProject.listObjects(projectId);
729
- if (objects.length === 0) {
730
- throw new Error("Cannot build graph: project has no objects and no service_address");
731
- }
732
- const coreObj = objects.find(o => o.role === "core")
733
- ?? objects.find(o => o.objectType?.includes("service::Service") || o.objectType === "Service");
734
- rootAddress = (coreObj ?? objects[0]).objectAddress;
735
- }
736
- const builder = new GraphBuilder({
737
- maxDepth: v.max_depth ?? v.depth ?? 3,
738
- enableRegistrar: v.enable_registrar ?? true,
739
- enablePotential: v.enable_potential ?? false,
740
- projectId,
741
- network: project.network ?? undefined,
742
- });
743
- const result = await builder.buildRelationshipGraph(rootAddress);
744
- const edgesBySource = {};
745
- for (const edge of result.graph.edges) {
746
- const src = edge.edgeSource ?? "unknown";
747
- edgesBySource[src] = (edgesBySource[src] ?? 0) + 1;
748
- }
749
- const topEdges = result.graph.edges
750
- .slice()
751
- .sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0))
752
- .slice(0, 5)
753
- .map(e => ({
754
- source: e.sourceObject,
755
- target: e.targetObject,
756
- fieldName: e.fieldName,
757
- relationshipType: e.relationshipType,
758
- weight: e.weight,
759
- verified: e.verified,
760
- }));
761
- const visualization = topEdges.map(e => ` ${shortLabel(e.source)} --${e.fieldName ?? e.relationshipType ?? ""}--> ${shortLabel(e.target)}`).join("\n");
762
- return {
763
- action: "build_graph",
764
- nodeCount: result.graph.nodes.length,
765
- edgeCount: result.graph.edges.length,
766
- edgesBySource,
767
- reputationCount: result.reputation.size,
768
- builtAt: result.graph.builtAt,
769
- topEdges,
770
- visualization: visualization || " (no edges to display)",
771
- hint: `Showing top ${topEdges.length} critical edges. Call project_operation with action='get_graph' to list all ${result.graph.edges.length} edges.`,
772
- binding_verification: await verifyServiceBindings(project.serviceAddress, project.network),
773
- };
774
- }
775
- async function verifyServiceBindings(serviceAddress, network) {
776
- if (!serviceAddress)
777
- return null;
778
- try {
779
- const response = await query_objects({
780
- objects: [serviceAddress],
781
- network: network,
782
- });
783
- const svc = response?.objects?.[0];
784
- if (!svc)
785
- return null;
786
- const allocCount = svc.order_allocators?.allocators?.length ?? 0;
787
- const arbCount = Array.isArray(svc.arbitrations) ? svc.arbitrations.length : 0;
788
- const bindings = {
789
- "Service.machine": {
790
- expected: "Machine",
791
- actual: svc.machine ?? null,
792
- verified: !!svc.machine,
793
- },
794
- "Service.permission": {
795
- expected: "Permission",
796
- actual: svc.permission ?? null,
797
- verified: !!svc.permission,
798
- },
799
- "Service.buy_guard": {
800
- expected: "Guard",
801
- actual: svc.buy_guard ?? null,
802
- verified: !!svc.buy_guard,
803
- },
804
- "Service.order_allocators": {
805
- expected: "Guard[]",
806
- actual: null,
807
- count: allocCount,
808
- verified: allocCount > 0,
809
- },
810
- "Service.arbitrations": {
811
- expected: "Arbitration[]",
812
- actual: null,
813
- count: arbCount,
814
- verified: arbCount > 0,
815
- },
816
- "Service.um": {
817
- expected: "Contact",
818
- actual: svc.um ?? null,
819
- verified: !!svc.um,
820
- },
821
- };
822
- const all_verified = Object.values(bindings).every((b) => b.verified);
823
- return { service: serviceAddress, bindings, all_verified };
824
- }
825
- catch {
826
- return null;
827
- }
828
- }
829
- function synthesizeOnchainFallbackEdges(serviceAddress, bindings) {
830
- const edges = [];
831
- const now = Date.now();
832
- const fieldMap = [
833
- { key: "Service.machine", fieldName: "machine", relationshipType: "machine" },
834
- { key: "Service.permission", fieldName: "permission", relationshipType: "permission" },
835
- { key: "Service.buy_guard", fieldName: "buy_guard", relationshipType: "guard" },
836
- { key: "Service.um", fieldName: "um", relationshipType: "um" },
837
- { key: "Service.order_allocators", fieldName: "order_allocators", relationshipType: "guard" },
838
- { key: "Service.arbitrations", fieldName: "arbitrations", relationshipType: "arbitration" },
839
- ];
840
- for (const fm of fieldMap) {
841
- const b = bindings.bindings[fm.key];
842
- if (!b || !b.verified)
843
- continue;
844
- const target = b.actual ?? `${serviceAddress}#${fm.fieldName}#synthetic`;
845
- edges.push({
846
- id: `onchain-fallback-${fm.fieldName}-${now}`,
847
- projectId: null,
848
- sourceObject: serviceAddress,
849
- targetObject: target,
850
- edgeSource: "internal",
851
- relationshipType: fm.relationshipType,
852
- fieldName: fm.fieldName,
853
- depth: 1,
854
- verified: true,
855
- weight: 1,
856
- direction: "outbound",
857
- metadata: { onchain_fallback: true },
858
- cachedAt: now,
859
- });
860
- }
861
- return edges;
862
- }
863
- function shortLabel(addrOrName) {
864
- if (!addrOrName)
865
- return "(empty)";
866
- if (!addrOrName.startsWith("0x")) {
867
- return addrOrName.length <= 24 ? addrOrName : addrOrName.slice(0, 21) + "...";
868
- }
869
- return addrOrName.length <= 12 ? addrOrName : addrOrName.slice(0, 10) + "..";
870
- }
871
- export async function handleGetGraph(v) {
872
- const projectId = await resolveProjectId(v);
873
- const edges = await localProject.getGraph(projectId);
874
- return {
875
- action: "get_graph",
876
- edges: edges.map(e => ({
877
- sourceObject: e.sourceObject,
878
- targetObject: e.targetObject,
879
- edgeSource: e.edgeSource,
880
- relationshipType: e.relationshipType,
881
- fieldName: e.fieldName,
882
- depth: e.depth,
883
- verified: e.verified,
884
- weight: e.weight,
885
- direction: e.direction,
886
- })),
887
- };
888
- }
889
- export async function handleEvaluateProject(v) {
890
- const projectId = await resolveProjectId(v);
891
- const project = await localProject.getProject(projectId);
892
- if (!project)
893
- throw new Error(`Project not found: ${projectId}`);
894
- if (v.async_mode === true) {
895
- const taskId = TaskTracker.create("evaluate_project", projectId);
896
- (async () => {
897
- try {
898
- TaskTracker.update(taskId, 10, "Refreshing objects and gathering inputs");
899
- const result = await evaluateProjectSync(projectId, project, v);
900
- TaskTracker.complete(taskId, result);
901
- }
902
- catch (err) {
903
- TaskTracker.fail(taskId, err.message ?? String(err));
904
- }
905
- })();
906
- return {
907
- action: "evaluate_project",
908
- async_mode: true,
909
- task_id: taskId,
910
- hint: "Evaluation is running in the background. Call query_task_status with task_id to check progress and retrieve the result.",
911
- };
912
- }
913
- return evaluateProjectSync(projectId, project, v);
914
- }
915
- async function evaluateProjectSync(projectId, project, v) {
916
- const evalType = requireField(v.evaluation_type, "evaluation_type");
917
- let refreshWarning;
918
- if (v.refresh_before_eval !== false) {
919
- const refreshResult = await refreshProjectObjects(projectId, project.network);
920
- if (refreshResult.failedCount > 0) {
921
- refreshWarning = `Refresh completed with ${refreshResult.failedCount} failed object(s) ` +
922
- `out of ${refreshResult.refreshedCount + refreshResult.failedCount} total. ` +
923
- `Evaluation may use stale data for failed objects.`;
924
- }
925
- }
926
- const objects = await localProject.listObjects(projectId);
927
- let edges = await localProject.getGraph(projectId);
928
- let graphFallbackWarning;
929
- if (edges.length === 0 && project.serviceAddress) {
930
- const bindings = await verifyServiceBindings(project.serviceAddress, project.network);
931
- if (bindings && Object.values(bindings.bindings).some(b => b.verified)) {
932
- edges = synthesizeOnchainFallbackEdges(project.serviceAddress, bindings);
933
- const verifiedCount = Object.values(bindings.bindings).filter(b => b.verified).length;
934
- graphFallbackWarning = `Graph is empty; fell back to on-chain direct query (${verifiedCount}/${Object.keys(bindings.bindings).length} Service bindings verified). Call build_graph to construct the full relationship graph.`;
935
- }
936
- }
937
- const addresses = objects.map(o => o.objectAddress);
938
- const cacheEntries = await localProject.getCachedObjects(addresses);
939
- const objectCache = new Map();
940
- for (const [addr, entry] of cacheEntries)
941
- objectCache.set(addr, entry);
942
- let llmPrompt;
943
- if (evalType === "worth_buying" || evalType === "value") {
944
- const assembler = new SemanticAssembler();
945
- const reputation = new Map();
946
- for (const edge of edges) {
947
- if (edge.edgeSource === "registrar" && edge.relationshipType === "affiliation") {
948
- }
949
- }
950
- const context = await assembler.assemble(project, objects, edges, reputation);
951
- const promptResult = assembler.buildEvaluationPrompt(evalType, context);
952
- llmPrompt = promptResult.prompt;
953
- }
954
- const evalInput = {
955
- project,
956
- objects,
957
- edges: edges,
958
- objectCache: objectCache,
959
- reputation: undefined,
960
- };
961
- const result = runEvaluation(evalInput, evalType, llmPrompt);
962
- let evaluationId = "";
963
- if (!result.needsLlm) {
964
- const evalInput2 = {
965
- projectId,
966
- evalType,
967
- score: result.score,
968
- summary: result.summary,
969
- details: {
970
- criterionScores: result.criterionScores,
971
- findings: result.findings,
972
- strengths: result.strengths,
973
- },
974
- };
975
- const saved = await localProject.saveEvaluation(evalInput2);
976
- evaluationId = saved.id;
977
- }
978
- return {
979
- action: "evaluate_project",
980
- evaluationType: result.evaluationType,
981
- score: result.score,
982
- summary: result.summary,
983
- criterionScores: result.criterionScores,
984
- findings: result.findings,
985
- strengths: result.strengths,
986
- needsLlm: result.needsLlm,
987
- llmPrompt: result.llmPrompt,
988
- evaluationId,
989
- refreshWarning,
990
- graphFallbackWarning,
991
- };
992
- }
993
- export async function handleSaveEvaluation(v) {
994
- const projectId = await resolveProjectId(v);
995
- const evalType = requireField(v.evaluation_type, "evaluation_type");
996
- const score = requireField(v.eval_score, "eval_score");
997
- const summary = v.eval_summary ?? "";
998
- const details = v.eval_details ?? {};
999
- const saved = await localProject.saveEvaluation({
1000
- projectId,
1001
- evalType,
1002
- score,
1003
- summary,
1004
- details,
1005
- });
1006
- return {
1007
- action: "save_evaluation",
1008
- evaluation: {
1009
- id: saved.id,
1010
- evalType: saved.evalType,
1011
- score: saved.score,
1012
- summary: saved.summary,
1013
- evaluatedAt: saved.evaluatedAt,
1014
- },
1015
- };
1016
- }
1017
- export async function handleCompareProjects(v) {
1018
- const projectIds = requireField(v.compare_project_ids, "compare_project_ids");
1019
- const evalType = (v.evaluation_type ?? "worth_buying");
1020
- const entries = [];
1021
- for (const pid of projectIds) {
1022
- const project = await localProject.getProject(pid);
1023
- if (!project)
1024
- continue;
1025
- const evals = await localProject.listEvaluations(pid, { evalType });
1026
- const latest = evals[0];
1027
- entries.push({
1028
- projectId: pid,
1029
- projectName: project.name,
1030
- score: latest?.score ?? null,
1031
- summary: latest?.summary ?? null,
1032
- evaluatedAt: latest?.evaluatedAt ?? null,
1033
- });
1034
- }
1035
- const comparison = compareProjects(entries, evalType);
1036
- return {
1037
- action: "compare_projects",
1038
- evaluationType: comparison.evaluationType,
1039
- ranking: comparison.ranking,
1040
- bestProjectId: comparison.bestProjectId,
1041
- };
1042
- }
1043
- async function refreshProjectObjects(projectId, network) {
1044
- const objects = await localProject.listObjects(projectId);
1045
- const addresses = objects.map(o => o.objectAddress);
1046
- if (addresses.length === 0)
1047
- return { refreshedCount: 0, failedCount: 0 };
1048
- let refreshedCount = 0;
1049
- let failedCount = 0;
1050
- const BATCH_SIZE = 50;
1051
- for (let i = 0; i < addresses.length; i += BATCH_SIZE) {
1052
- const batch = addresses.slice(i, i + BATCH_SIZE);
1053
- try {
1054
- const response = await query_objects({
1055
- objects: batch,
1056
- no_cache: true,
1057
- network,
1058
- });
1059
- for (const obj of response?.objects ?? []) {
1060
- if (obj?.object) {
1061
- await localProject.cacheObject(obj.object, obj.type ?? null, JSON.stringify(obj), network);
1062
- refreshedCount++;
1063
- }
1064
- }
1065
- }
1066
- catch {
1067
- failedCount += batch.length;
1068
- }
1069
- }
1070
- return { refreshedCount, failedCount };
1071
- }
1072
- export async function handleRefreshObjects(v) {
1073
- const projectId = await resolveProjectId(v);
1074
- const project = await localProject.getProject(projectId);
1075
- if (!project)
1076
- throw new Error(`Project not found: ${projectId}`);
1077
- const network = project.network;
1078
- const { refreshedCount, failedCount } = await refreshProjectObjects(projectId, network);
1079
- return {
1080
- action: "refresh_objects",
1081
- refreshedCount,
1082
- failedCount,
1083
- refreshedAt: Date.now(),
1084
- };
1085
- }
1086
- export async function handleDeleteProject(v) {
1087
- const id = await resolveProjectId(v);
1088
- await localProject.deleteProject(id);
1089
- return { action: "delete_project", deleted: true };
1090
- }
1091
- export async function handleCloneProjectToNetwork(v) {
1092
- const sourceProjectId = await resolveProjectId(v);
1093
- const sourceProject = await localProject.getProject(sourceProjectId);
1094
- if (!sourceProject) {
1095
- throw new Error(`Source project not found: ${sourceProjectId}`);
1096
- }
1097
- const targetNetwork = requireField(v.target_network, "target_network");
1098
- if (!["testnet", "mainnet"].includes(targetNetwork)) {
1099
- throw new Error("target_network must be 'testnet' or 'mainnet'");
1100
- }
1101
- const actionName = (v.action === "migrate_network" ? "migrate_network" : "clone_project_to_network");
1102
- const newPrefix = `${sourceProject.prefix}_${targetNetwork}`;
1103
- const existing = await localProject.getProjectByPrefix(newPrefix);
1104
- if (existing) {
1105
- throw new Error(`Target project prefix '${newPrefix}' already exists (project: '${existing.name}', id: '${existing.id}'). ` +
1106
- `Use update_project on the existing target or delete it first.`);
1107
- }
1108
- const newProject = await localProject.createProject({
1109
- prefix: newPrefix,
1110
- name: `${sourceProject.name} (${targetNetwork})`,
1111
- description: sourceProject.description ?? undefined,
1112
- industry: sourceProject.industry ?? undefined,
1113
- perspective: sourceProject.perspective ?? "producer",
1114
- labels: sourceProject.labels ?? undefined,
1115
- network: targetNetwork,
1116
- });
1117
- const sourceObjects = await localProject.listObjects(sourceProjectId);
1118
- let clonedCount = 0;
1119
- for (const obj of sourceObjects) {
1120
- await localProject.addObject(newProject.id, {
1121
- objectAddress: `draft:${obj.objectName ?? "unnamed"}`,
1122
- objectType: obj.objectType !== null ? obj.objectType : undefined,
1123
- objectName: obj.objectName !== null ? obj.objectName : undefined,
1124
- role: obj.role ?? "dependency",
1125
- metadata: {
1126
- status: "draft",
1127
- cloned_from: sourceProjectId,
1128
- cloned_at: Date.now(),
1129
- },
1130
- });
1131
- clonedCount++;
1132
- }
1133
- return {
1134
- action: actionName,
1135
- new_project_id: newProject.id,
1136
- new_prefix: newPrefix,
1137
- target_network: targetNetwork,
1138
- cloned_objects_count: clonedCount,
1139
- message: `Project '${sourceProject.prefix}' cloned to ${targetNetwork} as '${newPrefix}'. ${clonedCount} object(s) copied as drafts — object addresses are empty pending on-chain deployment.`,
1140
- next_steps: `Execute the same onchain_operations sequence with env.network='${targetNetwork}' to deploy objects. Then call update_project to set service_address, and build_graph to construct the new project's relationship graph.`,
1141
- };
1142
- }
1143
- export async function handleMigrateToMainnet(v) {
1144
- const sourceProjectId = await resolveProjectId(v);
1145
- const sourceProject = await localProject.getProject(sourceProjectId);
1146
- if (!sourceProject) {
1147
- throw new Error(`Source project not found: ${sourceProjectId}`);
1148
- }
1149
- if (sourceProject.network === "mainnet") {
1150
- throw new Error(`Source project '${sourceProject.prefix}' is already on mainnet. ` +
1151
- `migrate_to_mainnet is for testnet→mainnet migration only. ` +
1152
- `To clone to testnet, use clone_project_to_network with target_network='testnet'.`);
1153
- }
1154
- const cloneInput = { ...v, target_network: "mainnet" };
1155
- const cloneResult = await handleCloneProjectToNetwork(cloneInput);
1156
- const sourceObjects = await localProject.listObjects(sourceProjectId);
1157
- const deploymentPlan = sourceObjects
1158
- .filter(obj => obj.objectType !== null)
1159
- .map((obj, idx) => ({
1160
- order: idx + 1,
1161
- object_type: obj.objectType,
1162
- object_name: obj.objectName ?? "<unnamed>",
1163
- operation_type: mapObjectTypeToOperationType(obj.objectType),
1164
- localmark_name: obj.objectName ?? `<unnamed_${idx + 1}>`,
1165
- note: `Deploy on mainnet with env.network='mainnet'. Use the SAME LocalMark name '${obj.objectName ?? "<unnamed>"}' — it will resolve to a DIFFERENT mainnet address. The testnet address is NOT reused.`,
1166
- }));
1167
- return {
1168
- action: "migrate_to_mainnet",
1169
- migration_status: "step_1_complete_steps_2_5_pending_user_action",
1170
- source_project: {
1171
- prefix: sourceProject.prefix,
1172
- network: sourceProject.network,
1173
- preserved: true,
1174
- },
1175
- target_project: {
1176
- prefix: cloneResult.new_prefix,
1177
- project_id: cloneResult.new_project_id,
1178
- network: "mainnet",
1179
- cloned_objects_count: cloneResult.cloned_objects_count,
1180
- },
1181
- key_principle: "testnet and mainnet are DIFFERENT projects. Same LocalMark names may exist in both networks, " +
1182
- "but they correspond to DIFFERENT on-chain addresses. The testnet project is preserved unchanged. " +
1183
- "LocalMark names are NETWORK-SCOPED: a name resolves to a testnet address when env.network=testnet, " +
1184
- "and to a mainnet address when env.network=mainnet. Register the SAME name TWICE (once per network).",
1185
- payment_token_decision: identifyMigrationDecisions({
1186
- from_network: "testnet",
1187
- to_network: "mainnet",
1188
- current_payment_token: "WOW",
1189
- })[0],
1190
- migration_plan: [
1191
- {
1192
- step: 1,
1193
- status: "completed",
1194
- action: "clone_project_to_network",
1195
- description: "Clone source project metadata to mainnet project",
1196
- result: `Created mainnet project '${cloneResult.new_prefix}' with ${cloneResult.cloned_objects_count} draft object(s).`,
1197
- },
1198
- {
1199
- step: 2,
1200
- status: "pending_user_action",
1201
- action: "onchain_operations",
1202
- description: "Re-deploy all objects on mainnet. Set env.network='mainnet' and env.project='" +
1203
- cloneResult.new_prefix + "'. Use the SAME LocalMark names — they will resolve to " +
1204
- "DIFFERENT mainnet addresses. Mainnet accounts need real (non-test) SUI for gas.",
1205
- deployment_plan: deploymentPlan,
1206
- critical_note: "Re-deploy in dependency order: Permission → Machine → Contact → Guard(s) → Service. " +
1207
- "For the Service↔Guard circular dependency, use the 3-step pattern " +
1208
- "(Service without order_allocators → Guards → Service with order_allocators + publish). " +
1209
- "BEFORE deploying, decide the payment token (see payment_token_decision above): if switching " +
1210
- "from WOW to a stablecoin (e.g. USDT), set the Service / Treasury / Allocation type_parameter " +
1211
- "to the stablecoin's WOW type tag (query 'mainnet bridge tokens' via wowok_buildin_info).",
1212
- },
1213
- {
1214
- step: 3,
1215
- status: "pending_user_action",
1216
- action: "local_mark_operation",
1217
- description: "Re-register LocalMark names on mainnet. Each name from step 2 must be registered " +
1218
- "with its NEW mainnet address. The testnet LocalMark entries are NOT migrated " +
1219
- "automatically — mainnet has its own name registry.",
1220
- names_to_register: sourceObjects
1221
- .filter(obj => obj.objectName !== null)
1222
- .map(obj => obj.objectName),
1223
- },
1224
- {
1225
- step: 4,
1226
- status: "pending_user_action",
1227
- action: "update_project",
1228
- description: "Set service_address on the mainnet project to the mainnet Service address " +
1229
- "(from step 2). Use project='" + cloneResult.new_prefix + "' and the mainnet " +
1230
- "Service LocalMark name or 0x address.",
1231
- },
1232
- {
1233
- step: 5,
1234
- status: "pending_user_action",
1235
- action: "build_graph",
1236
- description: "Rebuild the relationship graph on the mainnet project. Use project='" +
1237
- cloneResult.new_prefix + "'. This constructs edges from the newly-deployed " +
1238
- "mainnet object bindings (machine, order_allocators, guards, etc.).",
1239
- },
1240
- ],
1241
- summary: "Migration step 1 (clone) complete. Steps 2-5 require user action: deploy objects on mainnet, " +
1242
- "re-register LocalMark names, set service_address, and rebuild the graph. The testnet project " +
1243
- "is preserved unchanged — you can run both in parallel until ready to deprecate the testnet version.",
1244
- };
1245
- }
1246
- function mapObjectTypeToOperationType(objectType) {
1247
- const map = {
1248
- service: "service",
1249
- machine: "machine",
1250
- guard: "guard",
1251
- permission: "permission",
1252
- progress: "progress",
1253
- arb: "arbitration",
1254
- arbitration: "arbitration",
1255
- contact: "contact",
1256
- treasury: "treasury",
1257
- reward: "reward",
1258
- allocation: "allocation",
1259
- repository: "repository",
1260
- demand: "demand",
1261
- order: "order",
1262
- personal: "personal",
1263
- payment: "payment",
1264
- proof: "proof",
1265
- };
1266
- return map[objectType.toLowerCase()] ?? objectType.toLowerCase();
1267
- }
1268
- export async function handleGetObjectDiff(v) {
1269
- const address = requireField(v.diff_address, "diff_address");
1270
- const fromTime = requireField(v.diff_from_time, "diff_from_time");
1271
- const toTime = requireField(v.diff_to_time, "diff_to_time");
1272
- const diff = await localProject.getObjectDiff(address, fromTime, toTime);
1273
- return {
1274
- action: "get_object_diff",
1275
- address: diff.address,
1276
- fromTime: diff.fromTime,
1277
- toTime: diff.toTime,
1278
- changedFields: diff.changedFields.map(f => ({
1279
- fieldPath: f.fieldPath,
1280
- oldValue: f.oldValue,
1281
- newValue: f.newValue,
1282
- changeType: f.changeType,
1283
- })),
1284
- };
1285
- }
1286
- function normalizeForwards(raw) {
1287
- if (!Array.isArray(raw))
1288
- return [];
1289
- return raw.map((f) => {
1290
- const guardObj = f?.guard;
1291
- const isGuardObj = guardObj && typeof guardObj === "object" && typeof guardObj.guard === "string";
1292
- const guardAddress = isGuardObj
1293
- ? guardObj.guard
1294
- : typeof guardObj === "string" ? guardObj : null;
1295
- const retainedSubmission = isGuardObj && Array.isArray(guardObj.retained_submission)
1296
- ? guardObj.retained_submission
1297
- : null;
1298
- return {
1299
- name: typeof f?.name === "string" ? f.name : "",
1300
- weight: typeof f?.weight === "number" ? f.weight : 0,
1301
- guard: guardAddress,
1302
- retained_submission: retainedSubmission,
1303
- named_operator: typeof f?.namedOperator === "string" ? f.namedOperator : null,
1304
- permission_index: typeof f?.permissionIndex === "number" ? f.permissionIndex : null,
1305
- };
1306
- });
1307
- }
1308
- export async function handleGetMachineGraph(v) {
1309
- const projectId = await resolveProjectId(v);
1310
- const machineAddress = await resolveObjectAddress(v);
1311
- const project = await localProject.getProject(projectId);
1312
- if (!project)
1313
- throw new Error(`Project not found (id: ${projectId})`);
1314
- const objects = await localProject.listObjects(projectId);
1315
- const machineObj = objects.find(o => o.objectAddress === machineAddress);
1316
- if (!machineObj) {
1317
- throw new Error(`Object ${machineAddress} is not part of project '${project.prefix}'. ` +
1318
- `Add it via add_object first.`);
1319
- }
1320
- const network = (project.network ?? "testnet");
1321
- let machineData = null;
1322
- try {
1323
- const queryResult = await query_objects({
1324
- objects: [machineAddress],
1325
- network,
1326
- });
1327
- machineData = queryResult?.objects?.[0] ?? null;
1328
- }
1329
- catch (e) {
1330
- throw new Error(`Failed to query Machine on ${network}: ${e instanceof Error ? e.message : String(e)}`);
1331
- }
1332
- if (!machineData) {
1333
- throw new Error(`Machine ${machineAddress} not found on ${network}. ` +
1334
- `It may not exist on this network — try switching networks.`);
1335
- }
1336
- let machineName = null;
1337
- const marks = await LocalMark.Instance().list({ address: machineAddress });
1338
- if (marks.length > 0 && marks[0].name) {
1339
- machineName = marks[0].name;
1340
- }
1341
- const published = typeof machineData.bPublished === "boolean" ? machineData.bPublished : null;
1342
- const paused = typeof machineData.bPaused === "boolean" ? machineData.bPaused : null;
1343
- const nodeMap = new Map();
1344
- const edgeList = [];
1345
- let rawNodes = [];
1346
- try {
1347
- rawNodes = await fetchMachineNodes(machineAddress, network);
1348
- }
1349
- catch (e) {
1350
- throw new Error(`Failed to query Machine nodes on ${network}: ${e instanceof Error ? e.message : String(e)}`);
1351
- }
1352
- for (const nodeObj of rawNodes) {
1353
- const nodeName = nodeObj.name;
1354
- if (!nodeName)
1355
- continue;
1356
- if (!nodeMap.has(nodeName)) {
1357
- nodeMap.set(nodeName, { name: nodeName, description: null });
1358
- }
1359
- const pairs = Array.isArray(nodeObj.value) ? nodeObj.value : [];
1360
- for (const pair of pairs) {
1361
- if (!pair || typeof pair !== "object")
1362
- continue;
1363
- const from = typeof pair.prev_node === "string" ? pair.prev_node : "";
1364
- if (!from)
1365
- continue;
1366
- const to = nodeName;
1367
- const threshold = typeof pair.threshold === "number" ? pair.threshold : 1;
1368
- const forwards = normalizeForwards(pair.forwards);
1369
- edgeList.push({ from, to, threshold, forwards });
1370
- }
1371
- }
1372
- for (const edge of edgeList) {
1373
- if (!nodeMap.has(edge.from)) {
1374
- nodeMap.set(edge.from, { name: edge.from, description: null });
1375
- }
1376
- if (!nodeMap.has(edge.to)) {
1377
- nodeMap.set(edge.to, { name: edge.to, description: null });
1378
- }
1379
- }
1380
- return {
1381
- action: "get_machine_graph",
1382
- machineAddress,
1383
- machineName,
1384
- nodes: Array.from(nodeMap.values()),
1385
- edges: edgeList,
1386
- published,
1387
- paused,
1388
- mermaid: renderMachineMermaid(Array.from(nodeMap.values()), edgeList),
1389
- tree_outline: renderMachineTreeIndented({
1390
- nodes: Array.from(nodeMap.values()),
1391
- edges: edgeList,
1392
- machineName,
1393
- machineAddress,
1394
- published,
1395
- paused,
1396
- }),
1397
- ascii_art: renderMachineAscii({
1398
- nodes: Array.from(nodeMap.values()),
1399
- edges: edgeList,
1400
- machineName,
1401
- machineAddress,
1402
- published,
1403
- paused,
1404
- }),
1405
- markmap: renderMachineMarkmap({
1406
- nodes: Array.from(nodeMap.values()),
1407
- edges: edgeList,
1408
- machineName,
1409
- machineAddress,
1410
- published,
1411
- paused,
1412
- }),
1413
- };
1414
- }
1415
- export async function handleGetGuardGraph(v) {
1416
- const projectId = await resolveProjectId(v);
1417
- const guardAddress = await resolveObjectAddress(v);
1418
- const project = await localProject.getProject(projectId);
1419
- if (!project)
1420
- throw new Error(`Project not found (id: ${projectId})`);
1421
- const objects = await localProject.listObjects(projectId);
1422
- const guardObj = objects.find(o => o.objectAddress === guardAddress);
1423
- if (!guardObj) {
1424
- throw new Error(`Object ${guardAddress} is not part of project '${project.prefix}'. ` +
1425
- `Add it via add_object first.`);
1426
- }
1427
- const network = (project.network ?? "testnet");
1428
- let guardData = null;
1429
- try {
1430
- const queryResult = await query_objects({
1431
- objects: [guardAddress],
1432
- network,
1433
- });
1434
- guardData = queryResult?.objects?.[0] ?? null;
1435
- }
1436
- catch (e) {
1437
- throw new Error(`Failed to query Guard on ${network}: ${e instanceof Error ? e.message : String(e)}`);
1438
- }
1439
- if (!guardData) {
1440
- throw new Error(`Guard ${guardAddress} not found on ${network}. ` +
1441
- `It may not exist on this network — try switching networks.`);
1442
- }
1443
- let guardName = null;
1444
- try {
1445
- const mark = await LocalMark.Instance().get(guardAddress);
1446
- guardName = mark?.name ?? null;
1447
- }
1448
- catch {
1449
- }
1450
- const root = guardData.root ?? guardData.data?.root ?? null;
1451
- const table = guardData.table ?? guardData.data?.table ?? [];
1452
- const rely = guardData.rely ?? guardData.data?.rely ?? null;
1453
- const immutable = guardData.immutable ?? guardData.data?.immutable ?? null;
1454
- if (!root) {
1455
- throw new Error(`Guard ${guardAddress} has no root node. The Guard may be empty or corrupted. ` +
1456
- `Use query_toolkit to inspect the raw object data.`);
1457
- }
1458
- const mermaidStr = renderGuardMermaid(root);
1459
- const tableForRender = Array.isArray(table) ? table.map((t) => ({
1460
- identifier: t.identifier,
1461
- name: t.name,
1462
- value_type: t.value_type,
1463
- b_submission: t.b_submission,
1464
- value: t.value,
1465
- })) : [];
1466
- const guardRenderInput = {
1467
- root: root,
1468
- table: tableForRender,
1469
- guardName,
1470
- guardAddress,
1471
- rely: rely ?? null,
1472
- };
1473
- const treeOutline = renderGuardTreeIndented(guardRenderInput);
1474
- const asciiArt = renderGuardAscii(guardRenderInput);
1475
- const markmap = renderGuardMarkmap(guardRenderInput);
1476
- return {
1477
- action: "get_guard_graph",
1478
- guardAddress,
1479
- guardName,
1480
- root,
1481
- table: Array.isArray(table) ? table : [],
1482
- rely: rely ?? null,
1483
- immutable: immutable ?? null,
1484
- mermaid: mermaidStr,
1485
- tree_outline: treeOutline,
1486
- ascii_art: asciiArt,
1487
- markmap: markmap,
1488
- };
1489
- }
1490
- export async function handlePreEvaluateCheck(v) {
1491
- const projectId = await resolveProjectId(v);
1492
- const project = await localProject.getProject(projectId);
1493
- if (!project)
1494
- throw new Error(`Project not found: ${projectId}`);
1495
- const missing = [];
1496
- const warnings = [];
1497
- const objects = await localProject.listObjects(projectId);
1498
- if (objects.length === 0) {
1499
- missing.push({
1500
- id: "PE-01",
1501
- description: "Project has no objects (project_objects table is empty).",
1502
- impact: "Evaluator will return a neutral score with no findings. " +
1503
- "Call add_object or create_project_from_onchain first.",
1504
- });
1505
- return {
1506
- action: "pre_evaluate_check",
1507
- ready: false,
1508
- missing,
1509
- warnings,
1510
- summary: "Project is empty — add objects before evaluating.",
1511
- };
1512
- }
1513
- const edges = await localProject.getGraph(projectId);
1514
- if (edges.length === 0) {
1515
- warnings.push({
1516
- id: "PE-02",
1517
- description: "Project has no graph edges (graph_edges table is empty).",
1518
- impact: "Evaluator's binding-based checks (machine, permission, " +
1519
- "buy_guard, order_allocators) will return 0. Call build_graph " +
1520
- "before evaluate_project to populate edges.",
1521
- });
1522
- }
1523
- const addresses = objects.map(o => o.objectAddress);
1524
- const cacheEntries = await localProject.getCachedObjects(addresses);
1525
- const uncached = [];
1526
- let staleCount = 0;
1527
- const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
1528
- const now = Date.now();
1529
- for (const o of objects) {
1530
- const entry = cacheEntries.get(o.objectAddress);
1531
- if (!entry) {
1532
- uncached.push(o.objectAddress);
1533
- }
1534
- else {
1535
- const fetchedAt = entry?.fetchedAt;
1536
- if (typeof fetchedAt === "number" && (now - fetchedAt) > STALE_THRESHOLD_MS) {
1537
- staleCount++;
1538
- }
1539
- }
1540
- }
1541
- if (uncached.length > 0) {
1542
- warnings.push({
1543
- id: "PE-03",
1544
- description: `${uncached.length}/${objects.length} project objects have no cached on-chain data.`,
1545
- impact: "Evaluator will see empty object data for these objects. " +
1546
- "Call refresh_objects before evaluate_project to fetch fresh data.",
1547
- });
1548
- }
1549
- if (staleCount > 0) {
1550
- warnings.push({
1551
- id: "PE-04",
1552
- description: `${staleCount}/${objects.length} project objects have cache older than 24 hours.`,
1553
- impact: "Evaluator results may be based on stale state. " +
1554
- "Call refresh_objects to fetch fresh data.",
1555
- });
1556
- }
1557
- const knownAddresses = new Set(objects.map(o => o.objectAddress));
1558
- const knownNames = new Set(objects.map(o => o.objectName).filter(Boolean));
1559
- const danglingEdges = edges.filter((e) => !knownAddresses.has(e.sourceObject) && !knownNames.has(e.sourceObject)
1560
- && !knownAddresses.has(e.targetObject) && !knownNames.has(e.targetObject));
1561
- if (danglingEdges.length > 0) {
1562
- warnings.push({
1563
- id: "PE-05",
1564
- description: `${danglingEdges.length} graph edges reference objects not in project_objects.`,
1565
- impact: "Evaluator's binding index may include stale/dangling entries. " +
1566
- "Call build_graph again to refresh edges, or remove orphan objects.",
1567
- });
1568
- }
1569
- if (project.perspective === "producer") {
1570
- const hasService = objects.some(o => isObjectOfType(o.objectType, "service"));
1571
- if (!hasService) {
1572
- missing.push({
1573
- id: "PE-06",
1574
- description: "Producer project has no Service-type object.",
1575
- impact: "Evaluator's service-centric checks (publish state, " +
1576
- "machine binding, order_allocators, etc.) will all return 0. " +
1577
- "Add a Service object or import one via create_project_from_onchain.",
1578
- });
1579
- }
1580
- }
1581
- const draftCount = objects.filter((o) => {
1582
- const meta = (o.metadata ?? {});
1583
- return meta.status === "draft" || o.objectAddress.startsWith("draft:");
1584
- }).length;
1585
- if (draftCount === objects.length && objects.length > 0) {
1586
- warnings.push({
1587
- id: "PE-07",
1588
- description: `All ${objects.length} objects are draft (not yet on-chain).`,
1589
- impact: "Evaluator will assess the blueprint as if it were on-chain. " +
1590
- "Real on-chain state may differ once deployed.",
1591
- });
1592
- }
1593
- const ready = missing.length === 0;
1594
- const summary = ready
1595
- ? (warnings.length === 0
1596
- ? `Ready to evaluate. ${objects.length} objects, ${edges.length} edges.`
1597
- : `Ready to evaluate with ${warnings.length} warning(s). ${objects.length} objects, ${edges.length} edges.`)
1598
- : `Not ready: ${missing.length} blocking issue(s) found.`;
1599
- return {
1600
- action: "pre_evaluate_check",
1601
- ready,
1602
- missing,
1603
- warnings,
1604
- summary,
1605
- counts: {
1606
- objects: objects.length,
1607
- edges: edges.length,
1608
- uncached: uncached.length,
1609
- stale: staleCount,
1610
- dangling_edges: danglingEdges.length,
1611
- drafts: draftCount,
1612
- },
1613
- };
1614
- }
1615
- export async function handleVerifyDeployment(v) {
1616
- const projectId = await resolveProjectId(v);
1617
- const project = await localProject.getProject(projectId);
1618
- if (!project)
1619
- throw new Error(`Project not found: ${projectId}`);
1620
- const objects = await localProject.listObjects(projectId);
1621
- if (objects.length === 0) {
1622
- return {
1623
- action: "verify_deployment",
1624
- verifiedCount: 0,
1625
- matched: 0,
1626
- mismatched: 0,
1627
- missing: 0,
1628
- unreachable: 0,
1629
- results: [],
1630
- summary: "Project has no objects to verify.",
1631
- };
1632
- }
1633
- const network = (project.network ?? "testnet");
1634
- const deployedObjects = objects.filter((o) => !o.objectAddress.startsWith("draft:") && o.objectAddress.startsWith("0x"));
1635
- if (deployedObjects.length === 0) {
1636
- return {
1637
- action: "verify_deployment",
1638
- verifiedCount: 0,
1639
- matched: 0,
1640
- mismatched: 0,
1641
- missing: 0,
1642
- unreachable: 0,
1643
- results: [],
1644
- summary: `All ${objects.length} objects are draft or non-address — nothing to verify on-chain.`,
1645
- };
1646
- }
1647
- const batchSize = Math.min(deployedObjects.length, 50);
1648
- const addressesToQuery = deployedObjects.slice(0, batchSize).map(o => o.objectAddress);
1649
- let chainResult;
1650
- try {
1651
- chainResult = await query_objects({
1652
- objects: addressesToQuery,
1653
- network,
1654
- });
1655
- }
1656
- catch (e) {
1657
- return {
1658
- action: "verify_deployment",
1659
- verifiedCount: 0,
1660
- matched: 0,
1661
- mismatched: 0,
1662
- missing: 0,
1663
- unreachable: deployedObjects.length,
1664
- results: deployedObjects.map(o => ({
1665
- objectAddress: o.objectAddress,
1666
- objectName: o.objectName,
1667
- objectType: o.objectType,
1668
- status: "unreachable",
1669
- error: e instanceof Error ? e.message : String(e),
1670
- })),
1671
- summary: `Failed to query on-chain state: ${e instanceof Error ? e.message : String(e)}`,
1672
- };
1673
- }
1674
- const chainObjects = chainResult?.objects ?? [];
1675
- const chainByAddress = new Map();
1676
- for (const co of chainObjects) {
1677
- if (co && typeof co === "object") {
1678
- const coRecord = co;
1679
- const addr = coRecord.object ?? coRecord.objectId ?? coRecord.object_id;
1680
- if (typeof addr === "string") {
1681
- chainByAddress.set(addr, co);
1682
- }
1683
- }
1684
- }
1685
- const results = [];
1686
- let matched = 0, mismatched = 0, missing = 0;
1687
- for (const obj of deployedObjects.slice(0, batchSize)) {
1688
- const chainObj = chainByAddress.get(obj.objectAddress);
1689
- if (!chainObj) {
1690
- missing++;
1691
- results.push({
1692
- objectAddress: obj.objectAddress,
1693
- objectName: obj.objectName,
1694
- objectType: obj.objectType,
1695
- status: "missing",
1696
- });
1697
- continue;
1698
- }
1699
- const chainData = chainObj;
1700
- const sqliteData = (await localProject.getCachedObjects([obj.objectAddress])).get(obj.objectAddress);
1701
- const sqliteFields = sqliteData?.data ?? {};
1702
- const differences = [];
1703
- let bindings;
1704
- if (isObjectOfType(obj.objectType, "service")) {
1705
- const fieldsToCompare = ["machine", "permission", "buy_guard", "arbitrations", "rewards", "repositories"];
1706
- for (const f of fieldsToCompare) {
1707
- const sqliteVal = sqliteFields[f];
1708
- const chainVal = chainData[f];
1709
- const norm = (v) => (v === null || v === undefined || v === "") ? null : v;
1710
- if (JSON.stringify(norm(sqliteVal)) !== JSON.stringify(norm(chainVal))) {
1711
- differences.push({ field: f, sqlite: sqliteVal, onchain: chainVal });
1712
- }
1713
- }
1714
- bindings = {
1715
- machine: !!chainData.machine,
1716
- permission: !!chainData.permission,
1717
- buy_guard: !!chainData.buy_guard,
1718
- order_allocators: !!chainData.order_allocators,
1719
- };
1720
- if (sqliteFields.bPublished !== undefined && chainData.bPublished !== undefined
1721
- && sqliteFields.bPublished !== chainData.bPublished) {
1722
- differences.push({
1723
- field: "bPublished",
1724
- sqlite: sqliteFields.bPublished,
1725
- onchain: chainData.bPublished,
1726
- });
1727
- }
1728
- }
1729
- else if (isObjectOfType(obj.objectType, "machine")) {
1730
- if (sqliteFields.bPublished !== undefined && chainData.bPublished !== undefined
1731
- && sqliteFields.bPublished !== chainData.bPublished) {
1732
- differences.push({
1733
- field: "bPublished",
1734
- sqlite: sqliteFields.bPublished,
1735
- onchain: chainData.bPublished,
1736
- });
1737
- }
1738
- const sqliteNodeCount = sqliteFields.node_count;
1739
- const chainNodeCount = chainData.node_count;
1740
- if (sqliteNodeCount !== undefined && chainNodeCount !== undefined
1741
- && sqliteNodeCount !== chainNodeCount) {
1742
- differences.push({
1743
- field: "node_count",
1744
- sqlite: sqliteNodeCount,
1745
- onchain: chainNodeCount,
1746
- });
1747
- }
1748
- }
1749
- if (differences.length > 0) {
1750
- mismatched++;
1751
- results.push({
1752
- objectAddress: obj.objectAddress,
1753
- objectName: obj.objectName,
1754
- objectType: obj.objectType,
1755
- status: "mismatched",
1756
- differences,
1757
- bindings,
1758
- });
1759
- }
1760
- else {
1761
- matched++;
1762
- results.push({
1763
- objectAddress: obj.objectAddress,
1764
- objectName: obj.objectName,
1765
- objectType: obj.objectType,
1766
- status: "matched",
1767
- bindings,
1768
- });
1769
- }
1770
- }
1771
- const summary = matched === deployedObjects.length
1772
- ? `All ${matched} deployed objects verified.`
1773
- : `${matched} matched, ${mismatched} mismatched, ${missing} missing.`;
1774
- return {
1775
- action: "verify_deployment",
1776
- verifiedCount: results.length,
1777
- matched,
1778
- mismatched,
1779
- missing,
1780
- unreachable: 0,
1781
- results,
1782
- summary,
1783
- };
1784
- }
1
+ import{LocalProject,LocalMark,query_objects,query_object_last_updated}from'@wowok/wowok';import{fetchMachineNodes}from'./machine-nodes.js';import{GraphBuilder}from'./graph-builder.js';import{SemanticAssembler}from'./semantic-assembler.js';import{runEvaluation,compareProjects}from'./evaluation.js';import{TaskTracker}from'./task-tracker.js';import{renderGuardMermaid,renderGuardTreeIndented,renderGuardAscii,renderGuardMarkmap}from'../knowledge/guard-render.js';import{renderMachineMermaid,renderMachineTreeIndented,renderMachineAscii,renderMachineMarkmap}from'../knowledge/machine-render.js';import{inferTraitsFromDescription,findSimilarIndustries}from'../knowledge/industry-generalizer.js';import{isObjectOfType}from'../schema/utils/object-type-utils.js';import{identifyMigrationDecisions}from'../harness/plan.js';const localProject=LocalProject['Instance']();function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}async function resolveProjectId(a){if(a['project_id'])return a['project_id'];if(a['project']){const b=await localProject['getProjectByPrefix'](a['project']);if(!b)throw new Error('Project\x20not\x20found\x20by\x20prefix:\x20'+a['project']);return b['id'];}throw new Error('Either\x20\x27project_id\x27\x20or\x20\x27project\x27\x20(prefix)\x20is\x20required\x20for\x20this\x20action');}async function resolveObjectAddress(a){if(a['object_address']){const b=a['object_address'],c=/^0x[0-9a-fA-F]{32,64}$/['test'](b),d=b['startsWith']('draft:');if(!c&&!d)throw new Error('Invalid\x20object_address\x20format:\x20\x27'+b['slice'](0x0,0x28)+(b['length']>0x28?'...':'')+'\x27.\x20'+'Expected\x20a\x20valid\x20Sui\x20address\x20(0x\x20+\x2032-64\x20hex\x20chars)\x20or\x20\x27draft:<name>\x27\x20sentinel.\x20'+'To\x20reference\x20an\x20object\x20by\x20name,\x20use\x20\x27object_name_add\x27\x20instead\x20of\x20\x27object_address\x27.');return b;}if(a['object_name_add']){const e=await LocalMark['Instance']()['get'](a['object_name_add']);if(e?.['address'])return e['address'];throw new Error('LocalMark\x20name\x20not\x20found:\x20'+a['object_name_add']);}throw new Error('Either\x20\x27object_address\x27\x20or\x20\x27object_name_add\x27\x20is\x20required\x20for\x20add_object');}function isDraftObject(a){if(a['objectAddress']&&a['objectAddress']['startsWith']('draft:'))return!![];const b=a['metadata'];return!!(b&&b['status']==='draft');}function isOnchainObject(a){if(isDraftObject(a))return![];return!!a['objectAddress']&&a['objectAddress']['startsWith']('0x');}export async function handleListProjects(a){const b={};if(a['filter_status'])b['status']=a['filter_status'];if(a['filter_perspective'])b['perspective']=a['filter_perspective'];if(a['filter_network'])b['network']=a['filter_network'];const c=await localProject['listProjects'](Object['keys'](b)['length']>0x0?b:undefined),d=await Promise['all'](c['map'](async f=>{const [g,h]=await Promise['all']([localProject['listObjects'](f['id']),localProject['listEvaluations'](f['id'])]),i=new Set();for(const n of g){if(n['objectType'])i['add'](n['objectType']);}const j=g['filter'](q=>isOnchainObject(q))['length'];let k=f;const l=g['filter'](q=>isOnchainObject(q)&&q['objectType']?.['toLowerCase']()['includes']('service')),m=(l['find'](q=>q['role']==='core')??l[0x0])?.['objectAddress'];if(m&&m!==f['serviceAddress']){const q=await localProject['updateProject'](f['id'],{'serviceAddress':m});if(q)k=q;}if(k['status']==='draft'&&g['length']>0x0){const r=await localProject['updateProject'](k['id'],{'status':'active'});if(r)return{...r,'objectCount':j,'evaluationCount':h['length'],'objectTypes':Array['from'](i)};}return{...k,'objectCount':j,'evaluationCount':h['length'],'objectTypes':Array['from'](i)};})),e=await Promise['all'](d['map'](async f=>{if(!f['serviceAddress']||!f['network'])return f;try{const g=await query_object_last_updated({'object':f['serviceAddress'],'network':f['network']});if(g?.['timestamp_ms'])return{...f,'onchainLastUpdated':{'timestamp_ms':g['timestamp_ms'],'digest':g['digest'],'sender':g['sender'],'object':g['object']}};}catch{}return f;}));return{'action':'list_projects','items':e,'total':e['length']};}export async function handleCreateProject(a){const b=requireField(a['project_name'],'project_name');let c=a['project'];!c&&(c=b['toLowerCase']()['trim']()['replace'](/[^a-z0-9]+/g,'_')['replace'](/^_+|_+$/g,'')['substring'](0x0,0x3c),!c&&(c='proj_'+Date['now']()['toString'](0x24)));const d=await localProject['getProjectByPrefix'](c);if(d){if(a['project'])throw new Error('Project\x20prefix\x20\x27'+c+'\x27\x20already\x20exists\x20(project:\x20\x27'+d['name']+'\x27,\x20id:\x20\x27'+d['id']+'\x27).\x20'+'Use\x20a\x20different\x20prefix\x20or\x20update\x20the\x20existing\x20project.');let i=0x2;while(await localProject['getProjectByPrefix'](c+'_'+i)){i++;}c=c+'_'+i;}const e={'prefix':c,'name':b,'description':a['project_description'],'industry':a['project_industry'],'perspective':a['project_perspective']??'producer','labels':a['project_labels'],'serviceAddress':a['service_address'],'network':a['project_network']??'testnet'},f=await localProject['createProject'](e);if(a['service_address'])try{await localProject['addObject'](f['id'],{'objectAddress':a['service_address'],'objectType':'Service','objectName':a['service_address']['startsWith']('0x')?undefined:a['service_address'],'role':'core','metadata':{'auto_added_from_service_address':!![],'added_at':new Date()['toISOString']()}});}catch(j){console['warn']('[create_project]\x20Failed\x20to\x20auto-add\x20Service\x20\x27'+a['service_address']+'\x27:\x20'+j['message']+'.\x20'+'Use\x20add_object\x20action\x20to\x20manually\x20add\x20it.');}const g=a['project_industry'],h=a['skip_templates']===!![];if(g&&g!=='general'&&!h)try{const {IndustryModeRegistry:k}=await import('../extensions/index.js'),l=k['Instance'](),m={'prefix':c,'version':f['currentVersion']??'v1','network':f['network']??'testnet','business_intent':a['project_description']??b,'industry':g},n=await l['applyTemplate'](g,m['business_intent'],m),o=inferTraitsFromDescription(m['business_intent']),p=findSimilarIndustries(o['traits'],0x3),q={'traits':o['traits'],'confidence':o['confidence'],'matched_keywords':o['matched_keywords'],'top_matches':p['map'](w=>({'industry':w['industry'],'similarity':w['similarity']}))},r=p[0x0],s=r&&!p['some'](w=>w['industry']===g)&&o['confidence']>=0.3&&r['similarity']>=0.6?'Intent\x20inference\x20suggests\x20industry\x20\x27'+r['industry']+'\x27\x20'+('(similarity\x20'+(r['similarity']*0x64)['toFixed'](0x0)+'%)\x20may\x20fit\x20the\x20description\x20')+('better\x20than\x20the\x20chosen\x20\x27'+g+'\x27.\x20Call\x20action=\x27recommend_industry\x27\x20for\x20the\x20full\x20')+('recommendation\x20chain,\x20or\x20ignore\x20this\x20hint\x20if\x20\x27'+g+'\x27\x20was\x20chosen\x20intentionally.'):undefined,t=[];for(const w of n['objects']){const x=await localProject['addObject'](f['id'],{'objectAddress':'draft:'+w['name'],'objectType':w['object_type'],'objectName':w['name'],'role':w['object_type']==='service'?'core':'dependency','metadata':{'status':'draft','config':w['config'],'publish_required':w['publish_required'],'description':w['description'],'entry_id':w['entry_id']}});t['push'](x);}const u=n['edges']['map'](y=>({'projectId':f['id'],'sourceObject':y['from'],'targetObject':y['to'],'edgeSource':'internal','relationshipType':mapEdgeKindToRelationshipType(y['edge_kind']),'fieldName':y['field_path'],'depth':0x0,'verified':![],'weight':0x1,'metadata':{'blueprint':!![],'required_at_publish':y['required_at_publish']}}));await localProject['saveGraphEdges'](f['id'],u);try{await localProject['saveDocument'](f['id'],m['network'],JSON['stringify']({'applied_template':n['applied_template'],'industry_source':n['industry_source'],'steps':n['steps'],'scenarios':n['scenarios']??[],'validation':n['validation'],'intent_inference':q,'generated_at':new Date()['toISOString']()},null,0x2),'blueprint');}catch(y){console['warn']('[create_project]\x20Failed\x20to\x20persist\x20blueprint\x20document:\x20'+y['message']);}return{'action':'create_project','project':f,'blueprint':{'objects_count':t['length'],'edges_count':u['length'],'industry_source':n['industry_source'],'applied_template':n['applied_template'],'steps_count':n['steps']['length'],'scenarios_count':n['scenarios']?.['length']??0x0,'key_risk':l['getMode'](g)?.['key_risk'],'intent_inference':q,...s?{'industry_mismatch_hint':s}:{}},'recommended_creation_order':getRecommendedCreationOrder(g)};}catch(z){return{'action':'create_project','project':f,'blueprint_warning':'Industry\x20template\x20application\x20failed:\x20'+z['message']+'.\x20Project\x20created\x20without\x20blueprint\x20—\x20use\x20add_object\x20to\x20manually\x20add\x20objects.','recommended_creation_order':getRecommendedCreationOrder(g)};}if(h)return{'action':'create_project','project':f,'blueprint_skipped':!![],'hint':'skip_templates=true\x20—\x20no\x20industry\x20blueprint\x20objects\x20were\x20created.\x20Use\x20add_object\x20to\x20manually\x20add\x20objects\x20to\x20this\x20project.','recommended_creation_order':getRecommendedCreationOrder(g)};if(!g){const A=(a['project_description']??b)['trim']();if(A)try{const {handleRecommendIndustry:B}=await import('./mode-actions.js'),C=B({'intent':A});if(C['recommendations']['length']>0x0)return{'action':'create_project','project':f,'recommended_creation_order':getRecommendedCreationOrder(g),'recommended_industries':C['recommendations'],'hint':'No\x20industry\x20specified.\x20Based\x20on\x20your\x20description,\x20top\x20match\x20is\x20\x27'+C['recommendations'][0x0]['industry']+'\x27.\x20To\x20get\x20a\x20ready-made\x20blueprint\x20'+'(~10\x20draft\x20objects\x20+\x20graph\x20edges),\x20recreate\x20with\x20project_industry\x20set\x20—\x20'+'or\x20continue\x20from\x20scratch\x20with\x20add_object.'};}catch{}}return{'action':'create_project','project':f,'recommended_creation_order':getRecommendedCreationOrder(g)};}function getRecommendedCreationOrder(a){const b=a&&a!=='general'?'\x20(industry=\x22'+a+'\x22\x20—\x20see\x20IndustryMode.build_notes\x20for\x20overrides)':'';return[{'step':0x1,'object':'Account','reason':'Base\x20identity\x20for\x20on-chain\x20operations;\x20owns\x20all\x20subsequent\x20objects\x20and\x20receives\x20settlement.','required':!![]},{'step':0x2,'object':'Permission','reason':'Centralized\x20access\x20control;\x20referenced\x20by\x20ALL\x20objects\x20(Service,\x20Machine,\x20Guard,\x20Contact,\x20Arbitration).','required':!![]},{'step':0x3,'object':'Service\x20(draft)','reason':'Create\x20the\x20skeleton\x20FIRST\x20(unpublished)\x20so\x20Guards\x20can\x20reference\x20it\x20by\x20LocalMark\x20NAME\x20—\x20breaks\x20the\x20Guard↔Service\x20circular\x20dependency.','required':!![]},{'step':0x4,'object':'Machine\x20(unpublished)','reason':'Business\x20workflow\x20nodes/forwards.\x20Requires\x20Permission.'+b,'required':!![]},{'step':0x5,'object':'Guard\x20x\x20N','reason':'Acceptance\x20logic\x20referencing\x20machine\x20node\x20names\x20+\x20service\x20name\x20via\x20LocalMark.\x20Bind\x20to\x20Machine\x20forwards\x20before\x20publish.','required':!![]},{'step':0x6,'object':'Machine\x20publish','reason':'Freeze\x20workflow\x20topology\x20(nodes/pairs/forwards\x20immutable).\x20Export\x20machineNode2file\x20first\x20for\x20backup.','required':!![]},{'step':0x7,'object':'Sales\x20(WIP)','reason':'Products\x20with\x20wip\x20URL\x20(must\x20be\x20a\x20public\x20endpoint)\x20+\x20wip_hash.\x20Recommend\x20generating\x20WIP\x20from\x20web/doc\x20material\x20via\x20AI\x20sub-task.','required':!![]},{'step':0x8,'object':'Treasury\x20(optional)','reason':'Fund\x20pool\x20for\x20organizations;\x20referenced\x20by\x20order_allocators\x20as\x20an\x20Entity\x20recipient.\x20Skip\x20for\x20personal\x20merchants.','required':![]},{'step':0x9,'object':'order_allocators','reason':'Fund\x20distribution\x20(Amount/Rate/Surplus).\x20Personal\x20merchant\x20→\x20Permission\x20owner;\x20organization\x20→\x20Treasury.','required':!![]},{'step':0xa,'object':'Contact','reason':'Customer-service\x20channel\x20(Service.um\x20→\x20Contact\x20→\x20ims[]);\x20enable\x20local\x20account\x20as\x20messenger\x20+\x20anti-spam.','required':!![]},{'step':0xb,'object':'Arbitration\x20(optional)','reason':'Third-party\x20dispute\x20resolution\x20(REUSE\x20an\x20existing\x20Arbitration).\x20MUST\x20NOT\x20reuse\x20Service\x27s\x20Permission\x20—\x20E_ARBITRATION_PERMISSION_CONFLICT.\x20Requires\x20compensation_fund\x20if\x20configured.','required':![]},{'step':0xc,'object':'Service\x20publish','reason':'Add\x20machine\x20+\x20order_allocators\x20+\x20buy_guard\x20+\x20sales\x20+\x20arbitrations,\x20then\x20publish:true.\x20machine/order_allocators/arbitrations\x20immutable\x20after\x20publish.','required':!![]}];}function mapEdgeKindToRelationshipType(a){switch(a){case'machine':case'compensation_fund':case'parent':return'bind';case'order_allocators':return'create';case'arbitrations':case'rewards':return'trigger';case'buy_guard':case'permission':case'guard':return'validate';case'service':case'progress':return'consume';default:return'bind';}}export async function handleCreateProjectFromOnchain(a){const b=requireField(a['service_address'],'service_address'),c=a['project_network']??'testnet';let d=a['project']??'svc_'+b['slice'](0x2,0x8);const f=a['project_name']??'Consumer\x20Project\x20'+b['slice'](0x2,0x8),g=await localProject['getProjectByPrefix'](d);if(g){if(a['project'])throw new Error('Project\x20prefix\x20\x27'+d+'\x27\x20already\x20exists\x20(project:\x20\x27'+g['name']+'\x27,\x20id:\x20\x27'+g['id']+'\x27).\x20'+'Use\x20a\x20different\x20prefix.');let q=0x2;while(await localProject['getProjectByPrefix'](d+'_'+q)){q++;}d=d+'_'+q;}const h=c==='testnet'?'mainnet':'testnet';let i=null;try{const r=await query_objects({'objects':[b],'network':c}),s=r?.['objects']?.[0x0];s&&s['object']&&(i=s['type']??null);}catch(t){throw new Error('Failed\x20to\x20query\x20'+c+'\x20for\x20the\x20Service\x20object:\x20'+((t instanceof Error?t['message']:String(t))+'.\x20')+('Check\x20the\x20network\x20connection\x20or\x20try\x20the\x20'+h+'\x20network.'));}if(!i)throw new Error('Service\x20object\x20not\x20found\x20on\x20'+c+':\x20the\x20address\x20'+b+'\x20does\x20not\x20exist\x20on\x20this\x20network.\x20'+('Switch\x20to\x20the\x20'+h+'\x20network\x20and\x20try\x20again.'));const j=i['toLowerCase'](),k=j['includes']('::service::service')||j==='service'||j['endsWith']('::service');if(!k)throw new Error('Object\x20'+b+'\x20is\x20not\x20a\x20Service\x20(its\x20on-chain\x20type\x20is\x20\x22'+i+'\x22).\x20'+'Only\x20on-chain\x20Service\x20objects\x20can\x20be\x20imported\x20as\x20a\x20project\x20root.');const l=await localProject['createProject']({'prefix':d,'name':f,'description':a['project_description']??'Auto-discovered\x20from\x20Service\x20'+b,'industry':a['project_industry'],'perspective':'consumer','labels':a['project_labels'],'serviceAddress':b,'network':c}),m=new GraphBuilder({'maxDepth':a['max_depth']??a['depth']??0x3,'enableRegistrar':a['enable_registrar']??!![],'enablePotential':a['enable_potential']??![],'projectId':l['id'],'network':c}),n=await m['buildRelationshipGraph'](b),o=[];for(const u of n['graph']['nodes']){const w=u['address']===b,x=await localProject['addObject'](l['id'],{'objectAddress':u['address'],'objectType':u['objectType']??undefined,'objectName':u['objectName']??undefined,'role':w?'core':'dependency'});o['push'](x);}const p=await localProject['updateProject'](l['id'],{'status':'active'});return{'action':'create_project_from_onchain','project':p??l,'objects':o,'graphEdgeCount':n['graph']['edges']['length']};}export async function handleUpdateProject(a){const b=await resolveProjectId(a),c={'name':a['project_name'],'description':a['project_description'],'industry':a['project_industry'],'perspective':a['project_perspective'],'status':a['project_status'],'labels':a['project_labels'],'serviceAddress':a['service_address']},d=await localProject['updateProject'](b,c);return{'action':'update_project','project':d};}export async function handleGetProjectDetail(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);const d=await localProject['listObjects'](b),e=await localProject['getGraph'](b),f=await localProject['listEvaluations'](b),g=await localProject['listVersions'](b);let h=c;if(c['status']==='draft'&&d['length']>0x0){const B=await localProject['updateProject'](b,{'status':'active'});if(B)h=B;}const j=d['some'](C=>!C['objectName']),k=d['some'](C=>C['role']==='reference');if(j||k){const C=await LocalMark['Instance']()['list'](null),D=new Map();for(const E of C){E['name']&&E['address']&&D['set'](E['address']['toLowerCase'](),E['name']);}for(const F of d){const G={};if(!F['objectName']){const H=D['get'](F['objectAddress']['toLowerCase']());H&&(G['objectName']=H,F['objectName']=H);}if(F['role']==='reference'&&F['objectType']){const I=F['objectType'];if(I['includes']('service::Service'))G['role']='core',F['role']='core';else(I['includes']('permission::Permission')||I['includes']('machine::Machine')||I['includes']('guard::Guard')||I['includes']('reward::Reward')||I['includes']('treasury::Treasury')||I['includes']('allocation::Allocation')||I['includes']('progress::Progress')||I['includes']('arbitration::Arbitration')||I['includes']('demand::Demand')||I['includes']('order::Order')||I['includes']('repository::Repository'))&&(G['role']='dependency',F['role']='dependency');}h['serviceAddress']&&F['objectAddress']===h['serviceAddress']&&F['role']!=='core'&&(G['role']='core',F['role']='core'),Object['keys'](G)['length']>0x0&&await localProject['updateObject'](F['id'],G)['catch'](()=>{});}}let l=null;if(h['serviceAddress']&&h['network'])try{const J=await query_objects({'objects':[h['serviceAddress']],'network':h['network']}),K=J?.['objects']?.[0x0];if(K){const L=K['bPublished']??K['published']??K['b_publish'],M=K['bPaused']??K['paused']??K['b_pause'];l={'published':typeof L==='boolean'?L:null,'paused':typeof M==='boolean'?M:null};}}catch{}const n=new Set(['core','dependency','reference']),p=d['filter'](N=>isDraftObject(N)),q=d['filter'](N=>isOnchainObject(N)),s=d['filter'](N=>N['role']==='core'),u=d['filter'](N=>N['role']==='dependency'),w=d['filter'](N=>N['role']==='reference'),x=d['filter'](N=>!N['role']||!n['has'](N['role']));x['length']>0x0&&console['warn']('[handleGetProjectDetail]\x20'+x['length']+'\x20object(s)\x20have\x20invalid\x20or\x20missing\x20role\x20'+('(expected\x20one\x20of:\x20'+Array['from'](n)['join'](',\x20')+').\x20')+'They\x20are\x20grouped\x20into\x20\x27other\x27\x20for\x20visibility.\x20'+('Object\x20names:\x20'+x['map'](N=>N['objectName']??N['objectAddress'])['slice'](0x0,0x5)['join'](',\x20')+(x['length']>0x5?'...':'')));const y={'core':s,'dependency':u,'reference':w,'other':x,'draft':p,'stats':{'total':d['length'],'onchain_count':q['length'],'draft_count':p['length'],'core_count':s['length'],'dependency_count':u['length'],'reference_count':w['length'],'other_count':x['length'],'by_type':d['reduce']((N,O)=>{const P=O['objectType']??'unknown',Q=P['includes']('::')?P['split']('::')[0x0]['toLowerCase']():P['toLowerCase']();return N[Q]=(N[Q]??0x0)+0x1,N;},{})}},z=d['map'](N=>({...N,'isDraft':isDraftObject(N)}));let A=null;if(q['length']>0x0&&h['network'])try{const N=q['map'](R=>R['objectAddress'])['filter'](R=>!!R),O=await Promise['allSettled'](N['map'](R=>query_object_last_updated({'object':R,'network':h['network']}))),P=new Map();for(let R=0x0;R<O['length'];R++){const S=O[R];S['status']==='fulfilled'&&S['value']?.['timestamp_ms']&&P['set'](N[R]['toLowerCase'](),{'timestamp_ms':S['value']['timestamp_ms'],'digest':S['value']['digest'],'sender':S['value']['sender']});}let Q=-0x1;for(const [T,U]of P){const V=Number(U['timestamp_ms']);V>Q&&(Q=V,A={'timestamp_ms':U['timestamp_ms'],'digest':U['digest'],'sender':U['sender'],'object':T});}for(const W of z){const X=W['objectAddress']?P['get'](W['objectAddress']['toLowerCase']()):undefined;W['onchainUpdatedAt']=X?.['timestamp_ms']??null;}}catch{}return{'action':'get_project_detail','project':h,'objects':z,'objectCount':d['length'],'onchainCount':q['length'],'draftCount':p['length'],'objectGroups':y,'graphEdgeCount':e['length'],'serviceStatus':l,'onchainLastUpdated':A,'evaluations':f['map'](Y=>({'id':Y['id'],'evalType':Y['evalType'],'score':Y['score'],'summary':Y['summary'],'details':Y['details'],'evaluatedAt':Y['evaluatedAt']})),'versions':g['map'](Y=>({'version':Y['version'],'description':Y['description'],'createdAt':Y['createdAt']}))};}const SHORT_TO_FULL_TYPE={'Service':'0x2::service::Service','Machine':'0x2::machine::Machine','Guard':'0x2::guard::Guard','Permission':'0x2::permission::Permission','Reward':'0x2::reward::Reward','Arbitration':'0x2::arbitration::Arbitration','Progress':'0x2::progress::Progress','Treasury':'0x2::treasury::Treasury','Demand':'0x2::demand::Demand','Repository':'0x2::repository::Repository','Contact':'0x2::contact::Contact','Order':'0x2::order::Order','Allocation':'0x2::allocation::Allocation','Personal':'0x2::personal::Personal','Payment':'0x2::payment::Payment','Proof':'0x2::proof::Proof'};export async function handleAddObject(a){const b=await resolveProjectId(a),c=await resolveObjectAddress(a),d=a['object_type_add'],e=d?d['includes']('::')?d:SHORT_TO_FULL_TYPE[d]??d:undefined;let f=a['object_name_add'],g=a['object_role'];if(!f){const j=await LocalMark['Instance']()['list']({'address':c});j['length']>0x0&&j[0x0]['name']&&(f=j[0x0]['name']);}if(!g){const k=e??'';if(k['includes']('service::Service'))g='core';else k['includes']('::')&&(k['includes']('permission::')||k['includes']('machine::')||k['includes']('guard::')||k['includes']('reward::')||k['includes']('treasury::')||k['includes']('allocation::')||k['includes']('progress::')||k['includes']('arbitration::')||k['includes']('demand::')||k['includes']('order::')||k['includes']('repository::'))?g='dependency':g='reference';}const h=await localProject['addObject'](b,{'objectAddress':c,'objectType':e,'objectName':f,'role':g,'tags':a['object_tags_add']}),i=await localProject['getProject'](b);return i&&i['status']==='draft'&&await localProject['updateProject'](b,{'status':'active'}),{'action':'add_object','object':h};}export async function handleRemoveObject(a){const b=requireField(a['object_id_remove'],'object_id_remove');return await localProject['removeObject'](b),{'action':'remove_object','removed':!![]};}export async function handleUpdateObject(a){const b=requireField(a['object_id_update'],'object_id_update'),c={};if(a['object_name_update']!==undefined)c['objectName']=a['object_name_update'];if(a['object_type_update']!==undefined)c['objectType']=a['object_type_update'];if(a['object_role_update']!==undefined)c['role']=a['object_role_update'];if(a['object_tags_update']!==undefined)c['tags']=a['object_tags_update'];const d=await localProject['updateObject'](b,c);return{'action':'update_object','object':d};}export async function handleCreateVersion(a){const b=await resolveProjectId(a),c=requireField(a['version'],'version'),d=await localProject['getProject'](b);if(!d)throw new Error('Project\x20not\x20found:\x20'+b);const e=await localProject['createVersion'](b,c,a['version_description']);return{'action':'create_version','version':{'version':e['version'],'description':e['description'],'createdAt':e['createdAt']}};}export async function handleBuildGraph(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);if(a['async_mode']===!![]){const d=TaskTracker['create']('build_graph',b);return((async()=>{try{TaskTracker['update'](d,0xa,'Resolving\x20root\x20address');const e=await buildGraphSync(b,c,a);TaskTracker['complete'](d,e);}catch(f){TaskTracker['fail'](d,f['message']??String(f));}})()),{'action':'build_graph','async_mode':!![],'task_id':d,'hint':'Graph\x20is\x20building\x20in\x20the\x20background.\x20Call\x20query_task_status\x20with\x20task_id\x20to\x20check\x20progress\x20and\x20retrieve\x20the\x20result.'};}return buildGraphSync(b,c,a);}async function buildGraphSync(a,b,c){let d=b['serviceAddress'];if(!d){const j=await localProject['listObjects'](a);if(j['length']===0x0)throw new Error('Cannot\x20build\x20graph:\x20project\x20has\x20no\x20objects\x20and\x20no\x20service_address');const k=j['find'](l=>l['role']==='core')??j['find'](l=>l['objectType']?.['includes']('service::Service')||l['objectType']==='Service');d=(k??j[0x0])['objectAddress'];}const e=new GraphBuilder({'maxDepth':c['max_depth']??c['depth']??0x3,'enableRegistrar':c['enable_registrar']??!![],'enablePotential':c['enable_potential']??![],'projectId':a,'network':b['network']??undefined}),f=await e['buildRelationshipGraph'](d),g={};for(const l of f['graph']['edges']){const m=l['edgeSource']??'unknown';g[m]=(g[m]??0x0)+0x1;}const h=f['graph']['edges']['slice']()['sort']((n,o)=>(o['weight']??0x0)-(n['weight']??0x0))['slice'](0x0,0x5)['map'](n=>({'source':n['sourceObject'],'target':n['targetObject'],'fieldName':n['fieldName'],'relationshipType':n['relationshipType'],'weight':n['weight'],'verified':n['verified']})),i=h['map'](n=>'\x20\x20'+shortLabel(n['source'])+'\x20--'+(n['fieldName']??n['relationshipType']??'')+'-->\x20'+shortLabel(n['target']))['join']('\x0a');return{'action':'build_graph','nodeCount':f['graph']['nodes']['length'],'edgeCount':f['graph']['edges']['length'],'edgesBySource':g,'reputationCount':f['reputation']['size'],'builtAt':f['graph']['builtAt'],'topEdges':h,'visualization':i||'\x20\x20(no\x20edges\x20to\x20display)','hint':'Showing\x20top\x20'+h['length']+'\x20critical\x20edges.\x20Call\x20project_operation\x20with\x20action=\x27get_graph\x27\x20to\x20list\x20all\x20'+f['graph']['edges']['length']+'\x20edges.','binding_verification':await verifyServiceBindings(b['serviceAddress'],b['network'])};}async function verifyServiceBindings(a,b){if(!a)return null;try{const c=await query_objects({'objects':[a],'network':b}),d=c?.['objects']?.[0x0];if(!d)return null;const e=d['order_allocators']?.['allocators']?.['length']??0x0,f=Array['isArray'](d['arbitrations'])?d['arbitrations']['length']:0x0,g={'Service.machine':{'expected':'Machine','actual':d['machine']??null,'verified':!!d['machine']},'Service.permission':{'expected':'Permission','actual':d['permission']??null,'verified':!!d['permission']},'Service.buy_guard':{'expected':'Guard','actual':d['buy_guard']??null,'verified':!!d['buy_guard']},'Service.order_allocators':{'expected':'Guard[]','actual':null,'count':e,'verified':e>0x0},'Service.arbitrations':{'expected':'Arbitration[]','actual':null,'count':f,'verified':f>0x0},'Service.um':{'expected':'Contact','actual':d['um']??null,'verified':!!d['um']}},h=Object['values'](g)['every'](i=>i['verified']);return{'service':a,'bindings':g,'all_verified':h};}catch{return null;}}function synthesizeOnchainFallbackEdges(a,c){const d=[],e=Date['now'](),f=[{'key':'Service.machine','fieldName':'machine','relationshipType':'machine'},{'key':'Service.permission','fieldName':'permission','relationshipType':'permission'},{'key':'Service.buy_guard','fieldName':'buy_guard','relationshipType':'guard'},{'key':'Service.um','fieldName':'um','relationshipType':'um'},{'key':'Service.order_allocators','fieldName':'order_allocators','relationshipType':'guard'},{'key':'Service.arbitrations','fieldName':'arbitrations','relationshipType':'arbitration'}];for(const g of f){const h=c['bindings'][g['key']];if(!h||!h['verified'])continue;const i=h['actual']??a+'#'+g['fieldName']+'#synthetic';d['push']({'id':'onchain-fallback-'+g['fieldName']+'-'+e,'projectId':null,'sourceObject':a,'targetObject':i,'edgeSource':'internal','relationshipType':g['relationshipType'],'fieldName':g['fieldName'],'depth':0x1,'verified':!![],'weight':0x1,'direction':'outbound','metadata':{'onchain_fallback':!![]},'cachedAt':e});}return d;}function shortLabel(a){if(!a)return'(empty)';if(!a['startsWith']('0x'))return a['length']<=0x18?a:a['slice'](0x0,0x15)+'...';return a['length']<=0xc?a:a['slice'](0x0,0xa)+'..';}export async function handleGetGraph(a){const b=await resolveProjectId(a),c=await localProject['getGraph'](b);return{'action':'get_graph','edges':c['map'](d=>({'sourceObject':d['sourceObject'],'targetObject':d['targetObject'],'edgeSource':d['edgeSource'],'relationshipType':d['relationshipType'],'fieldName':d['fieldName'],'depth':d['depth'],'verified':d['verified'],'weight':d['weight'],'direction':d['direction']}))};}export async function handleEvaluateProject(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);if(a['async_mode']===!![]){const d=TaskTracker['create']('evaluate_project',b);return((async()=>{try{TaskTracker['update'](d,0xa,'Refreshing\x20objects\x20and\x20gathering\x20inputs');const e=await evaluateProjectSync(b,c,a);TaskTracker['complete'](d,e);}catch(f){TaskTracker['fail'](d,f['message']??String(f));}})()),{'action':'evaluate_project','async_mode':!![],'task_id':d,'hint':'Evaluation\x20is\x20running\x20in\x20the\x20background.\x20Call\x20query_task_status\x20with\x20task_id\x20to\x20check\x20progress\x20and\x20retrieve\x20the\x20result.'};}return evaluateProjectSync(b,c,a);}async function evaluateProjectSync(a,b,c){const d=requireField(c['evaluation_type'],'evaluation_type');let e;if(c['refresh_before_eval']!==![]){const p=await refreshProjectObjects(a,b['network']);p['failedCount']>0x0&&(e='Refresh\x20completed\x20with\x20'+p['failedCount']+'\x20failed\x20object(s)\x20'+('out\x20of\x20'+(p['refreshedCount']+p['failedCount'])+'\x20total.\x20')+'Evaluation\x20may\x20use\x20stale\x20data\x20for\x20failed\x20objects.');}const f=await localProject['listObjects'](a);let g=await localProject['getGraph'](a),h;if(g['length']===0x0&&b['serviceAddress']){const q=await verifyServiceBindings(b['serviceAddress'],b['network']);if(q&&Object['values'](q['bindings'])['some'](r=>r['verified'])){g=synthesizeOnchainFallbackEdges(b['serviceAddress'],q);const r=Object['values'](q['bindings'])['filter'](s=>s['verified'])['length'];h='Graph\x20is\x20empty;\x20fell\x20back\x20to\x20on-chain\x20direct\x20query\x20('+r+'/'+Object['keys'](q['bindings'])['length']+'\x20Service\x20bindings\x20verified).\x20Call\x20build_graph\x20to\x20construct\x20the\x20full\x20relationship\x20graph.';}}const i=f['map'](s=>s['objectAddress']),j=await localProject['getCachedObjects'](i),k=new Map();for(const [s,t]of j)k['set'](s,t);let l;if(d==='worth_buying'||d==='value'){const u=new SemanticAssembler(),w=new Map();for(const z of g){if(z['edgeSource']==='registrar'&&z['relationshipType']==='affiliation'){}}const x=await u['assemble'](b,f,g,w),y=u['buildEvaluationPrompt'](d,x);l=y['prompt'];}const m={'project':b,'objects':f,'edges':g,'objectCache':k,'reputation':undefined},n=await runEvaluation(m,d,l);let o='';if(!n['needsLlm']){const A={'projectId':a,'evalType':d,'score':n['score'],'summary':n['summary'],'details':{'criterionScores':n['criterionScores'],'findings':n['findings'],'strengths':n['strengths']}},B=await localProject['saveEvaluation'](A);o=B['id'];}return{'action':'evaluate_project','evaluationType':n['evaluationType'],'score':n['score'],'summary':n['summary'],'criterionScores':n['criterionScores'],'findings':n['findings'],'strengths':n['strengths'],'needsLlm':n['needsLlm'],'llmPrompt':n['llmPrompt'],'evaluationId':o,'refreshWarning':e,'graphFallbackWarning':h};}export async function handleSaveEvaluation(a){const b=await resolveProjectId(a),c=requireField(a['evaluation_type'],'evaluation_type'),d=requireField(a['eval_score'],'eval_score'),e=a['eval_summary']??'',f=a['eval_details']??{},g=await localProject['saveEvaluation']({'projectId':b,'evalType':c,'score':d,'summary':e,'details':f});return{'action':'save_evaluation','evaluation':{'id':g['id'],'evalType':g['evalType'],'score':g['score'],'summary':g['summary'],'evaluatedAt':g['evaluatedAt']}};}export async function handleCompareProjects(a){const b=requireField(a['compare_project_ids'],'compare_project_ids'),c=a['evaluation_type']??'worth_buying',d=[];for(const f of b){const g=await localProject['getProject'](f);if(!g)continue;const h=await localProject['listEvaluations'](f,{'evalType':c}),i=h[0x0];d['push']({'projectId':f,'projectName':g['name'],'score':i?.['score']??null,'summary':i?.['summary']??null,'evaluatedAt':i?.['evaluatedAt']??null});}const e=compareProjects(d,c);return{'action':'compare_projects','evaluationType':e['evaluationType'],'ranking':e['ranking'],'bestProjectId':e['bestProjectId']};}async function refreshProjectObjects(a,b){const c=await localProject['listObjects'](a),d=c['map'](h=>h['objectAddress']);if(d['length']===0x0)return{'refreshedCount':0x0,'failedCount':0x0};let e=0x0,f=0x0;const g=0x32;for(let h=0x0;h<d['length'];h+=g){const j=d['slice'](h,h+g);try{const k=await query_objects({'objects':j,'no_cache':!![],'network':b});for(const l of k?.['objects']??[]){l?.['object']&&(await localProject['cacheObject'](l['object'],l['type']??null,JSON['stringify'](l),b),e++);}}catch{f+=j['length'];}}return{'refreshedCount':e,'failedCount':f};}export async function handleRefreshObjects(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);const d=c['network'],{refreshedCount:e,failedCount:f}=await refreshProjectObjects(b,d);return{'action':'refresh_objects','refreshedCount':e,'failedCount':f,'refreshedAt':Date['now']()};}export async function handleDeleteProject(a){const b=await resolveProjectId(a);return await localProject['deleteProject'](b),{'action':'delete_project','deleted':!![]};}export async function handleCloneProjectToNetwork(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Source\x20project\x20not\x20found:\x20'+b);const d=requireField(a['target_network'],'target_network');if(!['testnet','mainnet']['includes'](d))throw new Error('target_network\x20must\x20be\x20\x27testnet\x27\x20or\x20\x27mainnet\x27');const e=a['action']==='migrate_network'?'migrate_network':'clone_project_to_network',f=c['prefix']+'_'+d,g=await localProject['getProjectByPrefix'](f);if(g)throw new Error('Target\x20project\x20prefix\x20\x27'+f+'\x27\x20already\x20exists\x20(project:\x20\x27'+g['name']+'\x27,\x20id:\x20\x27'+g['id']+'\x27).\x20'+'Use\x20update_project\x20on\x20the\x20existing\x20target\x20or\x20delete\x20it\x20first.');const h=await localProject['createProject']({'prefix':f,'name':c['name']+'\x20('+d+')','description':c['description']??undefined,'industry':c['industry']??undefined,'perspective':c['perspective']??'producer','labels':c['labels']??undefined,'network':d}),i=await localProject['listObjects'](b);let j=0x0;for(const k of i){await localProject['addObject'](h['id'],{'objectAddress':'draft:'+(k['objectName']??'unnamed'),'objectType':k['objectType']!==null?k['objectType']:undefined,'objectName':k['objectName']!==null?k['objectName']:undefined,'role':k['role']??'dependency','metadata':{'status':'draft','cloned_from':b,'cloned_at':Date['now']()}}),j++;}return{'action':e,'new_project_id':h['id'],'new_prefix':f,'target_network':d,'cloned_objects_count':j,'message':'Project\x20\x27'+c['prefix']+'\x27\x20cloned\x20to\x20'+d+'\x20as\x20\x27'+f+'\x27.\x20'+j+'\x20object(s)\x20copied\x20as\x20drafts\x20—\x20object\x20addresses\x20are\x20empty\x20pending\x20on-chain\x20deployment.','next_steps':'Execute\x20the\x20same\x20onchain_operations\x20sequence\x20with\x20env.network=\x27'+d+'\x27\x20to\x20deploy\x20objects.\x20Then\x20call\x20update_project\x20to\x20set\x20service_address,\x20and\x20build_graph\x20to\x20construct\x20the\x20new\x20project\x27s\x20relationship\x20graph.'};}export async function handleMigrateToMainnet(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Source\x20project\x20not\x20found:\x20'+b);if(c['network']==='mainnet')throw new Error('Source\x20project\x20\x27'+c['prefix']+'\x27\x20is\x20already\x20on\x20mainnet.\x20'+'migrate_to_mainnet\x20is\x20for\x20testnet→mainnet\x20migration\x20only.\x20'+'To\x20clone\x20to\x20testnet,\x20use\x20clone_project_to_network\x20with\x20target_network=\x27testnet\x27.');const d={...a,'target_network':'mainnet'},e=await handleCloneProjectToNetwork(d),f=await localProject['listObjects'](b),g=f['filter'](h=>h['objectType']!==null)['map']((h,i)=>({'order':i+0x1,'object_type':h['objectType'],'object_name':h['objectName']??'<unnamed>','operation_type':mapObjectTypeToOperationType(h['objectType']),'localmark_name':h['objectName']??'<unnamed_'+(i+0x1)+'>','note':'Deploy\x20on\x20mainnet\x20with\x20env.network=\x27mainnet\x27.\x20Use\x20the\x20SAME\x20LocalMark\x20name\x20\x27'+(h['objectName']??'<unnamed>')+'\x27\x20—\x20it\x20will\x20resolve\x20to\x20a\x20DIFFERENT\x20mainnet\x20address.\x20The\x20testnet\x20address\x20is\x20NOT\x20reused.'}));return{'action':'migrate_to_mainnet','migration_status':'step_1_complete_steps_2_5_pending_user_action','source_project':{'prefix':c['prefix'],'network':c['network'],'preserved':!![]},'target_project':{'prefix':e['new_prefix'],'project_id':e['new_project_id'],'network':'mainnet','cloned_objects_count':e['cloned_objects_count']},'key_principle':'testnet\x20and\x20mainnet\x20are\x20DIFFERENT\x20projects.\x20Same\x20LocalMark\x20names\x20may\x20exist\x20in\x20both\x20networks,\x20'+'but\x20they\x20correspond\x20to\x20DIFFERENT\x20on-chain\x20addresses.\x20The\x20testnet\x20project\x20is\x20preserved\x20unchanged.\x20'+'LocalMark\x20names\x20are\x20NETWORK-SCOPED:\x20a\x20name\x20resolves\x20to\x20a\x20testnet\x20address\x20when\x20env.network=testnet,\x20'+'and\x20to\x20a\x20mainnet\x20address\x20when\x20env.network=mainnet.\x20Register\x20the\x20SAME\x20name\x20TWICE\x20(once\x20per\x20network).','payment_token_decision':identifyMigrationDecisions({'from_network':'testnet','to_network':'mainnet','current_payment_token':'WOW'})[0x0],'migration_plan':[{'step':0x1,'status':'completed','action':'clone_project_to_network','description':'Clone\x20source\x20project\x20metadata\x20to\x20mainnet\x20project','result':'Created\x20mainnet\x20project\x20\x27'+e['new_prefix']+'\x27\x20with\x20'+e['cloned_objects_count']+'\x20draft\x20object(s).'},{'step':0x2,'status':'pending_user_action','action':'onchain_operations','description':'Re-deploy\x20all\x20objects\x20on\x20mainnet.\x20Set\x20env.network=\x27mainnet\x27\x20and\x20env.project=\x27'+e['new_prefix']+'\x27.\x20Use\x20the\x20SAME\x20LocalMark\x20names\x20—\x20they\x20will\x20resolve\x20to\x20'+'DIFFERENT\x20mainnet\x20addresses.\x20Mainnet\x20accounts\x20need\x20real\x20(non-test)\x20SUI\x20for\x20gas.','deployment_plan':g,'critical_note':'Re-deploy\x20in\x20dependency\x20order:\x20Permission\x20→\x20Machine\x20→\x20Contact\x20→\x20Guard(s)\x20→\x20Service.\x20'+'For\x20the\x20Service↔Guard\x20circular\x20dependency,\x20use\x20the\x203-step\x20pattern\x20'+'(Service\x20without\x20order_allocators\x20→\x20Guards\x20→\x20Service\x20with\x20order_allocators\x20+\x20publish).\x20'+'BEFORE\x20deploying,\x20decide\x20the\x20payment\x20token\x20(see\x20payment_token_decision\x20above):\x20if\x20switching\x20'+'from\x20WOW\x20to\x20a\x20stablecoin\x20(e.g.\x20USDT),\x20set\x20the\x20Service\x20/\x20Treasury\x20/\x20Allocation\x20type_parameter\x20'+'to\x20the\x20stablecoin\x27s\x20WOW\x20type\x20tag\x20(query\x20\x27mainnet\x20bridge\x20tokens\x27\x20via\x20wowok_buildin_info).'},{'step':0x3,'status':'pending_user_action','action':'local_mark_operation','description':'Re-register\x20LocalMark\x20names\x20on\x20mainnet.\x20Each\x20name\x20from\x20step\x202\x20must\x20be\x20registered\x20'+'with\x20its\x20NEW\x20mainnet\x20address.\x20The\x20testnet\x20LocalMark\x20entries\x20are\x20NOT\x20migrated\x20'+'automatically\x20—\x20mainnet\x20has\x20its\x20own\x20name\x20registry.','names_to_register':f['filter'](h=>h['objectName']!==null)['map'](h=>h['objectName'])},{'step':0x4,'status':'pending_user_action','action':'update_project','description':'Set\x20service_address\x20on\x20the\x20mainnet\x20project\x20to\x20the\x20mainnet\x20Service\x20address\x20'+'(from\x20step\x202).\x20Use\x20project=\x27'+e['new_prefix']+'\x27\x20and\x20the\x20mainnet\x20'+'Service\x20LocalMark\x20name\x20or\x200x\x20address.'},{'step':0x5,'status':'pending_user_action','action':'build_graph','description':'Rebuild\x20the\x20relationship\x20graph\x20on\x20the\x20mainnet\x20project.\x20Use\x20project=\x27'+e['new_prefix']+'\x27.\x20This\x20constructs\x20edges\x20from\x20the\x20newly-deployed\x20'+'mainnet\x20object\x20bindings\x20(machine,\x20order_allocators,\x20guards,\x20etc.).'}],'summary':'Migration\x20step\x201\x20(clone)\x20complete.\x20Steps\x202-5\x20require\x20user\x20action:\x20deploy\x20objects\x20on\x20mainnet,\x20'+'re-register\x20LocalMark\x20names,\x20set\x20service_address,\x20and\x20rebuild\x20the\x20graph.\x20The\x20testnet\x20project\x20'+'is\x20preserved\x20unchanged\x20—\x20you\x20can\x20run\x20both\x20in\x20parallel\x20until\x20ready\x20to\x20deprecate\x20the\x20testnet\x20version.'};}function mapObjectTypeToOperationType(a){const b={'service':'service','machine':'machine','guard':'guard','permission':'permission','progress':'progress','arb':'arbitration','arbitration':'arbitration','contact':'contact','treasury':'treasury','reward':'reward','allocation':'allocation','repository':'repository','demand':'demand','order':'order','personal':'personal','payment':'payment','proof':'proof'};return b[a['toLowerCase']()]??a['toLowerCase']();}export async function handleGetObjectDiff(a){const b=requireField(a['diff_address'],'diff_address'),c=requireField(a['diff_from_time'],'diff_from_time'),d=requireField(a['diff_to_time'],'diff_to_time'),e=await localProject['getObjectDiff'](b,c,d);return{'action':'get_object_diff','address':e['address'],'fromTime':e['fromTime'],'toTime':e['toTime'],'changedFields':e['changedFields']['map'](g=>({'fieldPath':g['fieldPath'],'oldValue':g['oldValue'],'newValue':g['newValue'],'changeType':g['changeType']}))};}function normalizeForwards(a){if(!Array['isArray'](a))return[];return a['map'](b=>{const c=b?.['guard'],d=c&&typeof c==='object'&&typeof c['guard']==='string',e=d?c['guard']:typeof c==='string'?c:null,g=d&&Array['isArray'](c['retained_submission'])?c['retained_submission']:null;return{'name':typeof b?.['name']==='string'?b['name']:'','weight':typeof b?.['weight']==='number'?b['weight']:0x0,'guard':e,'retained_submission':g,'named_operator':typeof b?.['namedOperator']==='string'?b['namedOperator']:null,'permission_index':typeof b?.['permissionIndex']==='number'?b['permissionIndex']:null};});}export async function handleGetMachineGraph(a){const b=await resolveProjectId(a),c=await resolveObjectAddress(a),d=await localProject['getProject'](b);if(!d)throw new Error('Project\x20not\x20found\x20(id:\x20'+b+')');const f=await localProject['listObjects'](b),g=f['find'](q=>q['objectAddress']===c);if(!g)throw new Error('Object\x20'+c+'\x20is\x20not\x20part\x20of\x20project\x20\x27'+d['prefix']+'\x27.\x20'+'Add\x20it\x20via\x20add_object\x20first.');const h=d['network']??'testnet';let i=null;try{const q=await query_objects({'objects':[c],'network':h});i=q?.['objects']?.[0x0]??null;}catch(r){throw new Error('Failed\x20to\x20query\x20Machine\x20on\x20'+h+':\x20'+(r instanceof Error?r['message']:String(r)));}if(!i)throw new Error('Machine\x20'+c+'\x20not\x20found\x20on\x20'+h+'.\x20'+'It\x20may\x20not\x20exist\x20on\x20this\x20network\x20—\x20try\x20switching\x20networks.');let j=null;const k=await LocalMark['Instance']()['list']({'address':c});k['length']>0x0&&k[0x0]['name']&&(j=k[0x0]['name']);const l=typeof i['bPublished']==='boolean'?i['bPublished']:null,m=typeof i['bPaused']==='boolean'?i['bPaused']:null,n=new Map(),o=[];let p=[];try{p=await fetchMachineNodes(c,h);}catch(s){throw new Error('Failed\x20to\x20query\x20Machine\x20nodes\x20on\x20'+h+':\x20'+(s instanceof Error?s['message']:String(s)));}for(const t of p){const u=t['name'];if(!u)continue;!n['has'](u)&&n['set'](u,{'name':u,'description':null});const w=Array['isArray'](t['value'])?t['value']:[];for(const x of w){if(!x||typeof x!=='object')continue;const y=typeof x['prev_node']==='string'?x['prev_node']:'';if(!y)continue;const z=u,A=typeof x['threshold']==='number'?x['threshold']:0x1,B=normalizeForwards(x['forwards']);o['push']({'from':y,'to':z,'threshold':A,'forwards':B});}}for(const C of o){!n['has'](C['from'])&&n['set'](C['from'],{'name':C['from'],'description':null}),!n['has'](C['to'])&&n['set'](C['to'],{'name':C['to'],'description':null});}return{'action':'get_machine_graph','machineAddress':c,'machineName':j,'nodes':Array['from'](n['values']()),'edges':o,'published':l,'paused':m,'mermaid':renderMachineMermaid(Array['from'](n['values']()),o),'tree_outline':renderMachineTreeIndented({'nodes':Array['from'](n['values']()),'edges':o,'machineName':j,'machineAddress':c,'published':l,'paused':m}),'ascii_art':renderMachineAscii({'nodes':Array['from'](n['values']()),'edges':o,'machineName':j,'machineAddress':c,'published':l,'paused':m}),'markmap':renderMachineMarkmap({'nodes':Array['from'](n['values']()),'edges':o,'machineName':j,'machineAddress':c,'published':l,'paused':m})};}export async function handleGetGuardGraph(a){const b=await resolveProjectId(a),c=await resolveObjectAddress(a),d=await localProject['getProject'](b);if(!d)throw new Error('Project\x20not\x20found\x20(id:\x20'+b+')');const f=await localProject['listObjects'](b),g=f['find'](u=>u['objectAddress']===c);if(!g)throw new Error('Object\x20'+c+'\x20is\x20not\x20part\x20of\x20project\x20\x27'+d['prefix']+'\x27.\x20'+'Add\x20it\x20via\x20add_object\x20first.');const h=d['network']??'testnet';let i=null;try{const u=await query_objects({'objects':[c],'network':h});i=u?.['objects']?.[0x0]??null;}catch(w){throw new Error('Failed\x20to\x20query\x20Guard\x20on\x20'+h+':\x20'+(w instanceof Error?w['message']:String(w)));}if(!i)throw new Error('Guard\x20'+c+'\x20not\x20found\x20on\x20'+h+'.\x20'+'It\x20may\x20not\x20exist\x20on\x20this\x20network\x20—\x20try\x20switching\x20networks.');let j=null;try{const x=await LocalMark['Instance']()['get'](c);j=x?.['name']??null;}catch{}const k=i['root']??i['data']?.['root']??null,l=i['table']??i['data']?.['table']??[],m=i['rely']??i['data']?.['rely']??null,n=i['immutable']??i['data']?.['immutable']??null;if(!k)throw new Error('Guard\x20'+c+'\x20has\x20no\x20root\x20node.\x20The\x20Guard\x20may\x20be\x20empty\x20or\x20corrupted.\x20'+'Use\x20query_toolkit\x20to\x20inspect\x20the\x20raw\x20object\x20data.');const o=renderGuardMermaid(k),p=Array['isArray'](l)?l['map'](y=>({'identifier':y['identifier'],'name':y['name'],'value_type':y['value_type'],'b_submission':y['b_submission'],'value':y['value']})):[],q={'root':k,'table':p,'guardName':j,'guardAddress':c,'rely':m??null},r=renderGuardTreeIndented(q),s=renderGuardAscii(q),t=renderGuardMarkmap(q);return{'action':'get_guard_graph','guardAddress':c,'guardName':j,'root':k,'table':Array['isArray'](l)?l:[],'rely':m??null,'immutable':n??null,'mermaid':o,'tree_outline':r,'ascii_art':s,'markmap':t};}export async function handlePreEvaluateCheck(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);const d=[],e=[],f=await localProject['listObjects'](b);if(f['length']===0x0)return d['push']({'id':'PE-01','description':'Project\x20has\x20no\x20objects\x20(project_objects\x20table\x20is\x20empty).','impact':'Evaluator\x20will\x20return\x20a\x20neutral\x20score\x20with\x20no\x20findings.\x20'+'Call\x20add_object\x20or\x20create_project_from_onchain\x20first.'}),{'action':'pre_evaluate_check','ready':![],'missing':d,'warnings':e,'summary':'Project\x20is\x20empty\x20—\x20add\x20objects\x20before\x20evaluating.'};const g=await localProject['getGraph'](b);g['length']===0x0&&e['push']({'id':'PE-02','description':'Project\x20has\x20no\x20graph\x20edges\x20(graph_edges\x20table\x20is\x20empty).','impact':'Evaluator\x27s\x20binding-based\x20checks\x20(machine,\x20permission,\x20'+'buy_guard,\x20order_allocators)\x20will\x20return\x200.\x20Call\x20build_graph\x20'+'before\x20evaluate_project\x20to\x20populate\x20edges.'});const h=f['map'](u=>u['objectAddress']),i=await localProject['getCachedObjects'](h),j=[];let k=0x0;const l=0x18*0x3c*0x3c*0x3e8,m=Date['now']();for(const u of f){const w=i['get'](u['objectAddress']);if(!w)j['push'](u['objectAddress']);else{const x=w?.['fetchedAt'];typeof x==='number'&&m-x>l&&k++;}}j['length']>0x0&&e['push']({'id':'PE-03','description':j['length']+'/'+f['length']+'\x20project\x20objects\x20have\x20no\x20cached\x20on-chain\x20data.','impact':'Evaluator\x20will\x20see\x20empty\x20object\x20data\x20for\x20these\x20objects.\x20'+'Call\x20refresh_objects\x20before\x20evaluate_project\x20to\x20fetch\x20fresh\x20data.'});k>0x0&&e['push']({'id':'PE-04','description':k+'/'+f['length']+'\x20project\x20objects\x20have\x20cache\x20older\x20than\x2024\x20hours.','impact':'Evaluator\x20results\x20may\x20be\x20based\x20on\x20stale\x20state.\x20'+'Call\x20refresh_objects\x20to\x20fetch\x20fresh\x20data.'});const n=new Set(f['map'](y=>y['objectAddress'])),p=new Set(f['map'](y=>y['objectName'])['filter'](Boolean)),q=g['filter'](y=>!n['has'](y['sourceObject'])&&!p['has'](y['sourceObject'])&&!n['has'](y['targetObject'])&&!p['has'](y['targetObject']));q['length']>0x0&&e['push']({'id':'PE-05','description':q['length']+'\x20graph\x20edges\x20reference\x20objects\x20not\x20in\x20project_objects.','impact':'Evaluator\x27s\x20binding\x20index\x20may\x20include\x20stale/dangling\x20entries.\x20'+'Call\x20build_graph\x20again\x20to\x20refresh\x20edges,\x20or\x20remove\x20orphan\x20objects.'});if(c['perspective']==='producer'){const y=f['some'](z=>isObjectOfType(z['objectType'],'service'));!y&&d['push']({'id':'PE-06','description':'Producer\x20project\x20has\x20no\x20Service-type\x20object.','impact':'Evaluator\x27s\x20service-centric\x20checks\x20(publish\x20state,\x20'+'machine\x20binding,\x20order_allocators,\x20etc.)\x20will\x20all\x20return\x200.\x20'+'Add\x20a\x20Service\x20object\x20or\x20import\x20one\x20via\x20create_project_from_onchain.'});}const r=f['filter'](z=>{const A=z['metadata']??{};return A['status']==='draft'||z['objectAddress']['startsWith']('draft:');})['length'];r===f['length']&&f['length']>0x0&&e['push']({'id':'PE-07','description':'All\x20'+f['length']+'\x20objects\x20are\x20draft\x20(not\x20yet\x20on-chain).','impact':'Evaluator\x20will\x20assess\x20the\x20blueprint\x20as\x20if\x20it\x20were\x20on-chain.\x20'+'Real\x20on-chain\x20state\x20may\x20differ\x20once\x20deployed.'});const s=d['length']===0x0,t=s?e['length']===0x0?'Ready\x20to\x20evaluate.\x20'+f['length']+'\x20objects,\x20'+g['length']+'\x20edges.':'Ready\x20to\x20evaluate\x20with\x20'+e['length']+'\x20warning(s).\x20'+f['length']+'\x20objects,\x20'+g['length']+'\x20edges.':'Not\x20ready:\x20'+d['length']+'\x20blocking\x20issue(s)\x20found.';return{'action':'pre_evaluate_check','ready':s,'missing':d,'warnings':e,'summary':t,'counts':{'objects':f['length'],'edges':g['length'],'uncached':j['length'],'stale':k,'dangling_edges':q['length'],'drafts':r}};}export async function handleVerifyDeployment(a){const b=await resolveProjectId(a),c=await localProject['getProject'](b);if(!c)throw new Error('Project\x20not\x20found:\x20'+b);const d=await localProject['listObjects'](b);if(d['length']===0x0)return{'action':'verify_deployment','verifiedCount':0x0,'matched':0x0,'mismatched':0x0,'missing':0x0,'unreachable':0x0,'results':[],'summary':'Project\x20has\x20no\x20objects\x20to\x20verify.'};const g=c['network']??'testnet',h=d['filter'](s=>!s['objectAddress']['startsWith']('draft:')&&s['objectAddress']['startsWith']('0x'));if(h['length']===0x0)return{'action':'verify_deployment','verifiedCount':0x0,'matched':0x0,'mismatched':0x0,'missing':0x0,'unreachable':0x0,'results':[],'summary':'All\x20'+d['length']+'\x20objects\x20are\x20draft\x20or\x20non-address\x20—\x20nothing\x20to\x20verify\x20on-chain.'};const i=Math['min'](h['length'],0x32),j=h['slice'](0x0,i)['map'](s=>s['objectAddress']);let k;try{k=await query_objects({'objects':j,'network':g});}catch(s){return{'action':'verify_deployment','verifiedCount':0x0,'matched':0x0,'mismatched':0x0,'missing':0x0,'unreachable':h['length'],'results':h['map'](t=>({'objectAddress':t['objectAddress'],'objectName':t['objectName'],'objectType':t['objectType'],'status':'unreachable','error':s instanceof Error?s['message']:String(s)})),'summary':'Failed\x20to\x20query\x20on-chain\x20state:\x20'+(s instanceof Error?s['message']:String(s))};}const l=k?.['objects']??[],m=new Map();for(const t of l){if(t&&typeof t==='object'){const u=t,w=u['object']??u['objectId']??u['object_id'];typeof w==='string'&&m['set'](w,t);}}const n=[];let o=0x0,p=0x0,q=0x0;for(const x of h['slice'](0x0,i)){const y=m['get'](x['objectAddress']);if(!y){q++,n['push']({'objectAddress':x['objectAddress'],'objectName':x['objectName'],'objectType':x['objectType'],'status':'missing'});continue;}const z=y,A=(await localProject['getCachedObjects']([x['objectAddress']]))['get'](x['objectAddress']),B=A?.['data']??{},C=[];let D;if(isObjectOfType(x['objectType'],'service')){const E=['machine','permission','buy_guard','arbitrations','rewards','repositories'];for(const F of E){const G=B[F],H=z[F],I=J=>J===null||J===undefined||J===''?null:J;JSON['stringify'](I(G))!==JSON['stringify'](I(H))&&C['push']({'field':F,'sqlite':G,'onchain':H});}D={'machine':!!z['machine'],'permission':!!z['permission'],'buy_guard':!!z['buy_guard'],'order_allocators':!!z['order_allocators']},B['bPublished']!==undefined&&z['bPublished']!==undefined&&B['bPublished']!==z['bPublished']&&C['push']({'field':'bPublished','sqlite':B['bPublished'],'onchain':z['bPublished']});}else{if(isObjectOfType(x['objectType'],'machine')){B['bPublished']!==undefined&&z['bPublished']!==undefined&&B['bPublished']!==z['bPublished']&&C['push']({'field':'bPublished','sqlite':B['bPublished'],'onchain':z['bPublished']});const J=B['node_count'],K=z['node_count'];J!==undefined&&K!==undefined&&J!==K&&C['push']({'field':'node_count','sqlite':J,'onchain':K});}}C['length']>0x0?(p++,n['push']({'objectAddress':x['objectAddress'],'objectName':x['objectName'],'objectType':x['objectType'],'status':'mismatched','differences':C,'bindings':D})):(o++,n['push']({'objectAddress':x['objectAddress'],'objectName':x['objectName'],'objectType':x['objectType'],'status':'matched','bindings':D}));}const r=o===h['length']?'All\x20'+o+'\x20deployed\x20objects\x20verified.':o+'\x20matched,\x20'+p+'\x20mismatched,\x20'+q+'\x20missing.';return{'action':'verify_deployment','verifiedCount':n['length'],'matched':o,'mismatched':p,'missing':q,'unreachable':0x0,'results':n,'summary':r};}