@wowok/agent-mcp 2.7.6 → 2.7.8

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 (243) hide show
  1. package/dist/customer/index.d.ts +3 -4
  2. package/dist/customer/index.js +1 -1
  3. package/dist/customer/info-puzzle.js +1 -1
  4. package/dist/customer/order-monitor.d.ts +0 -9
  5. package/dist/customer/order-monitor.js +1 -1
  6. package/dist/customer/order-strategy.d.ts +0 -19
  7. package/dist/customer/order-strategy.js +1 -1
  8. package/dist/customer/reminder-system.d.ts +0 -5
  9. package/dist/customer/reminder-system.js +1 -1
  10. package/dist/evaluation/game-strategy.js +1 -1
  11. package/dist/evaluation/injection.d.ts +6 -0
  12. package/dist/evaluation/injection.js +1 -0
  13. package/dist/evaluation/node-game.js +1 -1
  14. package/dist/examples/machine-multisig-threshold.json +1 -0
  15. package/dist/harness/recover.js +1 -1
  16. package/dist/harness/types.d.ts +1 -1
  17. package/dist/harness/verify.js +1 -1
  18. package/dist/intent/enrich.js +1 -1
  19. package/dist/intent/matcher.js +1 -1
  20. package/dist/intent/types.d.ts +1 -1
  21. package/dist/intent/types.js +1 -1
  22. package/dist/knowledge/arbitration-ledger.js +1 -1
  23. package/dist/knowledge/contract-invariants.d.ts +53 -0
  24. package/dist/knowledge/contract-invariants.js +1 -0
  25. package/dist/knowledge/deployment-scanner.js +1 -1
  26. package/dist/knowledge/dynamic-pricing.d.ts +0 -2
  27. package/dist/knowledge/dynamic-pricing.js +1 -1
  28. package/dist/knowledge/event-semantics.d.ts +20 -0
  29. package/dist/knowledge/event-semantics.js +1 -0
  30. package/dist/knowledge/examples-scanner-cli.js +1 -1
  31. package/dist/knowledge/examples-scanner.js +1 -1
  32. package/dist/knowledge/glossary.js +1 -1
  33. package/dist/knowledge/guard-submission-prompt.js +1 -1
  34. package/dist/knowledge/immutability.d.ts +11 -0
  35. package/dist/knowledge/immutability.js +1 -0
  36. package/dist/knowledge/index.d.ts +12 -6
  37. package/dist/knowledge/index.js +1 -1
  38. package/dist/knowledge/industry-registry.js +1 -1
  39. package/dist/knowledge/intent-metrics.d.ts +1 -1
  40. package/dist/knowledge/jsonrpc-enum.d.ts +37 -0
  41. package/dist/knowledge/jsonrpc-enum.js +1 -0
  42. package/dist/knowledge/machine-confirm.js +1 -1
  43. package/dist/knowledge/machine-risk.js +1 -1
  44. package/dist/knowledge/machine-topology.d.ts +11 -0
  45. package/dist/knowledge/machine-topology.js +1 -1
  46. package/dist/knowledge/machine-translation.js +1 -1
  47. package/dist/knowledge/market-metrics.d.ts +11 -0
  48. package/dist/knowledge/market-metrics.js +1 -1
  49. package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
  50. package/dist/knowledge/mcp-schema-audit.d.ts +1 -0
  51. package/dist/knowledge/mcp-schema-audit.js +1 -1
  52. package/dist/knowledge/messenger-guard-guidance.d.ts +17 -0
  53. package/dist/knowledge/messenger-guard-guidance.js +1 -0
  54. package/dist/knowledge/operation-dictionary.d.ts +18 -0
  55. package/dist/knowledge/operation-dictionary.js +1 -0
  56. package/dist/knowledge/service-ledger.js +1 -1
  57. package/dist/knowledge/service-risk.js +1 -1
  58. package/dist/knowledge/service-translation.js +1 -1
  59. package/dist/knowledge/supply-chain.d.ts +24 -0
  60. package/dist/knowledge/supply-chain.js +1 -0
  61. package/dist/knowledge/template-registry.js +1 -1
  62. package/dist/knowledge/tools-reference.js +1 -1
  63. package/dist/knowledge/trust-metrics.d.ts +27 -2
  64. package/dist/knowledge/trust-metrics.js +1 -1
  65. package/dist/knowledge/workflow-guidance.d.ts +22 -1
  66. package/dist/knowledge/workflow-guidance.js +1 -1
  67. package/dist/monitor/EventStore.d.ts +78 -0
  68. package/dist/monitor/EventStore.js +1 -0
  69. package/dist/participation/radar-core.d.ts +0 -1
  70. package/dist/participation/radar-core.js +1 -1
  71. package/dist/persona/address-format.d.ts +6 -0
  72. package/dist/persona/address-format.js +1 -0
  73. package/dist/persona/analyzer.js +1 -1
  74. package/dist/persona/index.d.ts +3 -0
  75. package/dist/persona/index.js +1 -1
  76. package/dist/persona/types.d.ts +1 -1
  77. package/dist/persona/types.js +1 -1
  78. package/dist/project/business-puzzle.js +1 -1
  79. package/dist/project/edit-planner.js +1 -1
  80. package/dist/project/evaluation-fix.spec.d.ts +1 -0
  81. package/dist/project/evaluation-fix.spec.js +1 -0
  82. package/dist/project/evaluation.js +1 -1
  83. package/dist/project/graph-builder.js +1 -1
  84. package/dist/project/handlers.d.ts +2 -18
  85. package/dist/project/handlers.js +1 -1
  86. package/dist/project/index.js +1 -1
  87. package/dist/project/machine-nodes.d.ts +23 -0
  88. package/dist/project/machine-nodes.js +1 -1
  89. package/dist/project/machine-panorama.d.ts +41 -0
  90. package/dist/project/machine-panorama.js +1 -0
  91. package/dist/project/object-panorama.d.ts +179 -0
  92. package/dist/project/object-panorama.js +1 -0
  93. package/dist/project/object-type.d.ts +1 -0
  94. package/dist/project/object-type.js +1 -0
  95. package/dist/project/participation-radar.js +1 -1
  96. package/dist/project/semantic-assembler.js +1 -1
  97. package/dist/project/service-panorama.d.ts +180 -0
  98. package/dist/project/service-panorama.js +1 -0
  99. package/dist/project/stage-gate.d.ts +0 -1
  100. package/dist/project/stage-gate.js +1 -1
  101. package/dist/project/task-tracker.d.ts +4 -0
  102. package/dist/project/task-tracker.js +1 -1
  103. package/dist/role/derivation.d.ts +19 -2
  104. package/dist/role/derivation.js +1 -1
  105. package/dist/role/index.d.ts +2 -2
  106. package/dist/role/index.js +1 -1
  107. package/dist/role/model.js +1 -1
  108. package/dist/role/resolution.d.ts +16 -0
  109. package/dist/role/resolution.js +1 -1
  110. package/dist/role/types.d.ts +1 -1
  111. package/dist/role/types.js +1 -1
  112. package/dist/safety/confirm-gate.js +1 -1
  113. package/dist/schema/call/allocation.d.ts +10 -0
  114. package/dist/schema/call/arbitration.d.ts +14 -3
  115. package/dist/schema/call/arbitration.js +1 -1
  116. package/dist/schema/call/base.d.ts +16 -0
  117. package/dist/schema/call/base.js +1 -1
  118. package/dist/schema/call/bridge.d.ts +7 -0
  119. package/dist/schema/call/contact.d.ts +11 -0
  120. package/dist/schema/call/demand.d.ts +11 -0
  121. package/dist/schema/call/guard.d.ts +3 -0
  122. package/dist/schema/call/handler.js +1 -1
  123. package/dist/schema/call/machine.d.ts +12 -0
  124. package/dist/schema/call/machine.js +1 -1
  125. package/dist/schema/call/order.d.ts +11 -0
  126. package/dist/schema/call/payment.d.ts +4 -3
  127. package/dist/schema/call/payment.js +1 -1
  128. package/dist/schema/call/permission.d.ts +11 -0
  129. package/dist/schema/call/personal.d.ts +38 -0
  130. package/dist/schema/call/personal.js +1 -1
  131. package/dist/schema/call/progress.d.ts +11 -0
  132. package/dist/schema/call/proof.d.ts +2 -0
  133. package/dist/schema/call/repository.d.ts +15 -4
  134. package/dist/schema/call/reward.d.ts +17 -12
  135. package/dist/schema/call/reward.js +1 -1
  136. package/dist/schema/call/semantic.d.ts +3 -2
  137. package/dist/schema/call/semantic.js +1 -1
  138. package/dist/schema/call/service.d.ts +17 -0
  139. package/dist/schema/call/service.js +1 -1
  140. package/dist/schema/call/treasury.d.ts +17 -0
  141. package/dist/schema/common/index.d.ts +21 -0
  142. package/dist/schema/common/index.js +1 -1
  143. package/dist/schema/evaluation/index.d.ts +146 -0
  144. package/dist/schema/evaluation/index.js +1 -1
  145. package/dist/schema/index.d.ts +1 -0
  146. package/dist/schema/index.js +1 -1
  147. package/dist/schema/intent-radar/index.d.ts +30 -3
  148. package/dist/schema/intent-radar/index.js +1 -1
  149. package/dist/schema/local/index.d.ts +9 -0
  150. package/dist/schema/local/index.js +1 -1
  151. package/dist/schema/messenger/index.d.ts +54 -0
  152. package/dist/schema/messenger/index.js +1 -1
  153. package/dist/schema/operations.d.ts +932 -9
  154. package/dist/schema/operations.js +1 -1
  155. package/dist/schema/permission/index.d.ts +17 -0
  156. package/dist/schema/permission/index.js +1 -1
  157. package/dist/schema/project/index.d.ts +6 -0
  158. package/dist/schema/project/index.js +1 -1
  159. package/dist/schema/query/index.d.ts +663 -56
  160. package/dist/schema/query/index.js +1 -1
  161. package/dist/schema/schema-version.js +1 -1
  162. package/dist/schema/trust/index.d.ts +17 -0
  163. package/dist/schema/trust/index.js +1 -1
  164. package/dist/schema/watch/index.d.ts +204 -0
  165. package/dist/schema/watch/index.js +1 -0
  166. package/dist/schema/workflow/index.d.ts +301 -0
  167. package/dist/schema/workflow/index.js +1 -1
  168. package/dist/schema-query-impl/index.js +1 -1
  169. package/dist/schemas/account_operation.output.json +5 -2
  170. package/dist/schemas/bridge_operation.output.json +5 -2
  171. package/dist/schemas/bridge_operation.schema.json +25 -9
  172. package/dist/schemas/evaluation_operation.output.json +276 -1
  173. package/dist/schemas/evaluation_operation.schema.json +307 -0
  174. package/dist/schemas/guard2file.schema.json +6 -2
  175. package/dist/schemas/index.json +13 -1
  176. package/dist/schemas/intent_radar.output.json +20 -2
  177. package/dist/schemas/intent_radar.schema.json +10 -1
  178. package/dist/schemas/local_info_operation.output.json +5 -2
  179. package/dist/schemas/local_mark_operation.output.json +5 -2
  180. package/dist/schemas/machineNode2file.schema.json +6 -2
  181. package/dist/schemas/messenger_operation.output.json +105 -2
  182. package/dist/schemas/messenger_operation.schema.json +98 -0
  183. package/dist/schemas/monitor_events.output.json +1360 -0
  184. package/dist/schemas/monitor_events.schema.json +62 -0
  185. package/dist/schemas/onchain_events.output.json +237 -14
  186. package/dist/schemas/onchain_events.schema.json +20 -0
  187. package/dist/schemas/onchain_operations.output.json +10 -5
  188. package/dist/schemas/onchain_operations.schema.json +768 -409
  189. package/dist/schemas/onchain_operations_allocation.schema.json +23 -7
  190. package/dist/schemas/onchain_operations_arbitration.schema.json +34 -9
  191. package/dist/schemas/onchain_operations_contact.schema.json +29 -5
  192. package/dist/schemas/onchain_operations_demand.schema.json +29 -5
  193. package/dist/schemas/onchain_operations_gen_passport.schema.json +6 -2
  194. package/dist/schemas/onchain_operations_gen_proof.schema.json +6 -2
  195. package/dist/schemas/onchain_operations_guard.schema.json +6 -2
  196. package/dist/schemas/onchain_operations_machine.schema.json +34 -10
  197. package/dist/schemas/onchain_operations_order.schema.json +29 -5
  198. package/dist/schemas/onchain_operations_payment.schema.json +13 -10
  199. package/dist/schemas/onchain_operations_permission.schema.json +29 -5
  200. package/dist/schemas/onchain_operations_personal.schema.json +44 -2
  201. package/dist/schemas/onchain_operations_progress.schema.json +29 -5
  202. package/dist/schemas/onchain_operations_proof.schema.json +6 -2
  203. package/dist/schemas/onchain_operations_repository.schema.json +310 -305
  204. package/dist/schemas/onchain_operations_reward.schema.json +46 -10
  205. package/dist/schemas/onchain_operations_service.schema.json +49 -13
  206. package/dist/schemas/onchain_operations_treasury.schema.json +46 -10
  207. package/dist/schemas/onchain_table_data.output.json +3750 -208
  208. package/dist/schemas/onchain_table_data.schema.json +311 -0
  209. package/dist/schemas/permission_operation.output.json +32 -0
  210. package/dist/schemas/project_operation.schema.json +14 -8
  211. package/dist/schemas/query_toolkit.output.json +425 -320
  212. package/dist/schemas/query_toolkit.schema.json +139 -1
  213. package/dist/schemas/trust_score.output.json +38 -0
  214. package/dist/schemas/trust_score.schema.json +32 -0
  215. package/dist/schemas/watch_operation.output.json +827 -0
  216. package/dist/schemas/watch_operation.schema.json +145 -0
  217. package/dist/schemas/workflow_operation.output.json +263 -5
  218. package/dist/schemas/workflow_operation.schema.json +597 -2
  219. package/dist/tools/handlers/config.js +1 -1
  220. package/dist/tools/handlers/evaluation.js +1 -1
  221. package/dist/tools/handlers/intent-radar.js +1 -1
  222. package/dist/tools/handlers/messenger.js +1 -1
  223. package/dist/tools/handlers/monitor.d.ts +2 -0
  224. package/dist/tools/handlers/monitor.js +1 -0
  225. package/dist/tools/handlers/onchain.js +1 -1
  226. package/dist/tools/handlers/permission.js +1 -1
  227. package/dist/tools/handlers/project.js +1 -1
  228. package/dist/tools/handlers/query.js +1 -1
  229. package/dist/tools/handlers/trust.d.ts +14 -0
  230. package/dist/tools/handlers/trust.js +1 -1
  231. package/dist/tools/handlers/watch.d.ts +2 -0
  232. package/dist/tools/handlers/watch.js +1 -0
  233. package/dist/tools/handlers/workflow.js +1 -1
  234. package/dist/tools/index.d.ts +2 -0
  235. package/dist/tools/index.js +1 -1
  236. package/dist/tools/shared.js +1 -1
  237. package/package.json +2 -2
  238. package/dist/customer/post-purchase.d.ts +0 -44
  239. package/dist/customer/post-purchase.js +0 -1
  240. package/dist/project/migration.d.ts +0 -22
  241. package/dist/project/migration.js +0 -1
  242. package/dist/project/rollback-policy.d.ts +0 -45
  243. package/dist/project/rollback-policy.js +0 -1
@@ -1 +1 @@
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};}
1
+ import{LocalProject,LocalMark,query_objects,query_object_last_updated}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}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';import{formatShortAddress}from'../persona/address-format.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\x20WOW\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 q of g){if(q['objectType'])i['add'](q['objectType']);}const j=g['filter'](r=>isOnchainObject(r))['length'];let k=f;const l=g['filter'](r=>isOnchainObject(r)&&r['objectType']?.['toLowerCase']()['includes']('service')),m=(l['find'](r=>r['role']==='core')??l[0x0])?.['objectAddress'];if(m&&m!==f['serviceAddress']){const r=await localProject['updateProject'](f['id'],{'serviceAddress':m});if(r)k=r;}const n=g['some'](s=>isOnchainObject(s)&&s['objectType']?.['toLowerCase']()['includes']('service'));if(k['status']==='draft'&&n){const s=await localProject['updateProject'](k['id'],{'status':'active'});if(s)return{...s,'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 r=0x2;while(await localProject['getProjectByPrefix'](d+'_'+r)){r++;}d=d+'_'+r;}const h=['testnet','mainnet','localnet']['filter'](s=>s!==c)['join']('\x20/\x20');let i=null,j=null;try{const s=await query_objects({'objects':[b],'network':c}),t=s?.['objects']?.[0x0];t&&t['object']&&(i=t['type']??null,j=t&&typeof t==='object'?t['description']??null:null);}catch(u){throw new Error('Failed\x20to\x20query\x20'+c+'\x20for\x20the\x20Service\x20object:\x20'+((u instanceof Error?u['message']:String(u))+'.\x20')+('Check\x20the\x20network\x20connection,\x20or\x20the\x20Service\x20may\x20live\x20on\x20another\x20network\x20('+h+').'));}if(!i)throw new Error('Service\x20object\x20not\x20found\x20on\x20'+c+':\x20the\x20address\x20'+b+'\x20does\x20not\x20exist\x20on\x20this\x20network.\x20'+('Each\x20network\x20has\x20independent\x20data\x20—\x20the\x20Service\x20may\x20exist\x20on\x20'+h+'.\x20')+'Switch\x20the\x20network\x20and\x20try\x20again.');const k=i['toLowerCase'](),l=k['includes']('::service::service')||k==='service'||k['endsWith']('::service');if(!l)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 m=await localProject['createProject']({'prefix':d,'name':f,'description':a['project_description']??j??'Auto-discovered\x20from\x20Service\x20'+b,'industry':a['project_industry'],'perspective':a['project_perspective']??'producer','labels':a['project_labels'],'serviceAddress':b,'network':c}),n=new GraphBuilder({'maxDepth':a['max_depth']??a['depth']??0x3,'enableRegistrar':a['enable_registrar']??!![],'enablePotential':a['enable_potential']??![],'projectId':m['id'],'network':c}),o=await n['buildRelationshipGraph'](b),p=[];for(const w of o['graph']['nodes']){const x=w['address']===b,y=await localProject['addObject'](m['id'],{'objectAddress':w['address'],'objectType':w['objectType']??undefined,'objectName':w['objectName']??undefined,'role':x?'core':'dependency'});p['push'](y);}const q=await localProject['updateProject'](m['id'],{'status':'active'});return{'action':'create_project_from_onchain','project':q??m,'objects':p,'graphEdgeCount':o['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;const j=d['some'](C=>isOnchainObject(C)&&C['objectType']?.['toLowerCase']()['includes']('service'));if(c['status']==='draft'&&j){const C=await localProject['updateProject'](b,{'status':'active'});if(C)h=C;}const k=d['some'](D=>!D['objectName']),l=d['some'](D=>D['role']==='reference');if(k||l){const D=await LocalMark['Instance']()['list'](null),E=new Map();for(const F of D){F['name']&&F['address']&&E['set'](F['address']['toLowerCase'](),F['name']);}for(const G of d){const H={};if(!G['objectName']){const I=E['get'](G['objectAddress']['toLowerCase']());I&&(H['objectName']=I,G['objectName']=I);}if(G['role']==='reference'&&G['objectType']){const J=G['objectType'];if(J['includes']('service::Service'))H['role']='core',G['role']='core';else(J['includes']('permission::Permission')||J['includes']('machine::Machine')||J['includes']('guard::Guard')||J['includes']('reward::Reward')||J['includes']('treasury::Treasury')||J['includes']('allocation::Allocation')||J['includes']('progress::Progress')||J['includes']('arbitration::Arbitration')||J['includes']('demand::Demand')||J['includes']('order::Order')||J['includes']('repository::Repository'))&&(H['role']='dependency',G['role']='dependency');}h['serviceAddress']&&G['objectAddress']===h['serviceAddress']&&G['role']!=='core'&&(H['role']='core',G['role']='core'),Object['keys'](H)['length']>0x0&&await localProject['updateObject'](G['id'],H)['catch'](()=>{});}}let n=null;if(h['serviceAddress']&&h['network'])try{const K=await query_objects({'objects':[h['serviceAddress']],'network':h['network']}),L=K?.['objects']?.[0x0];if(L){const M=L['bPublished']??L['published']??L['b_publish'],N=L['bPaused']??L['paused']??L['b_pause'];n={'published':typeof M==='boolean'?M:null,'paused':typeof N==='boolean'?N:null};}}catch{}const p=new Set(['core','dependency','reference']),q=d['filter'](O=>isDraftObject(O)),s=d['filter'](O=>isOnchainObject(O)),u=d['filter'](O=>O['role']==='core'),w=d['filter'](O=>O['role']==='dependency'),x=d['filter'](O=>O['role']==='reference'),y=d['filter'](O=>!O['role']||!p['has'](O['role']));y['length']>0x0&&console['warn']('[handleGetProjectDetail]\x20'+y['length']+'\x20object(s)\x20have\x20invalid\x20or\x20missing\x20role\x20'+('(expected\x20one\x20of:\x20'+Array['from'](p)['join'](',\x20')+').\x20')+'They\x20are\x20grouped\x20into\x20\x27other\x27\x20for\x20visibility.\x20'+('Object\x20names:\x20'+y['map'](O=>O['objectName']??O['objectAddress'])['slice'](0x0,0x5)['join'](',\x20')+(y['length']>0x5?'...':'')));const z={'core':u,'dependency':w,'reference':x,'other':y,'draft':q,'stats':{'total':d['length'],'onchain_count':s['length'],'draft_count':q['length'],'core_count':u['length'],'dependency_count':w['length'],'reference_count':x['length'],'other_count':y['length'],'by_type':d['reduce']((O,P)=>{const Q=P['objectType']??'unknown',R=Q['includes']('::')?Q['split']('::')[0x0]['toLowerCase']():Q['toLowerCase']();return O[R]=(O[R]??0x0)+0x1,O;},{})}},A=d['map'](O=>({...O,'isDraft':isDraftObject(O)}));let B=null;if(s['length']>0x0&&h['network'])try{const O=s['map'](S=>S['objectAddress'])['filter'](S=>!!S),P=await Promise['allSettled'](O['map'](S=>query_object_last_updated({'object':S,'network':h['network']}))),Q=new Map();for(let S=0x0;S<P['length'];S++){const T=P[S];T['status']==='fulfilled'&&T['value']?.['timestamp_ms']&&Q['set'](O[S]['toLowerCase'](),{'timestamp_ms':T['value']['timestamp_ms'],'digest':T['value']['digest'],'sender':T['value']['sender']});}let R=-0x1;for(const [U,V]of Q){const W=Number(V['timestamp_ms']);W>R&&(R=W,B={'timestamp_ms':V['timestamp_ms'],'digest':V['digest'],'sender':V['sender'],'object':U});}for(const X of A){const Y=X['objectAddress']?Q['get'](X['objectAddress']['toLowerCase']()):undefined;X['onchainUpdatedAt']=Y?.['timestamp_ms']??null;}}catch{}return{'action':'get_project_detail','project':h,'objects':A,'objectCount':d['length'],'onchainCount':s['length'],'draftCount':q['length'],'objectGroups':z,'graphEdgeCount':e['length'],'serviceStatus':n,'onchainLastUpdated':B,'evaluations':f['map'](Z=>({'id':Z['id'],'evalType':Z['evalType'],'score':Z['score'],'summary':Z['summary'],'details':Z['details'],'evaluatedAt':Z['evaluatedAt']})),'versions':g['map'](Z=>({'version':Z['version'],'description':Z['description'],'createdAt':Z['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);if(i&&i['status']==='draft'){const l=await localProject['listObjects'](b),m=l['some'](n=>isOnchainObject(n)&&n['objectType']?.['toLowerCase']()['includes']('service'));m&&await localProject['updateProject'](b,{'status':'active'});}return{'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 formatShortAddress(a);}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)\x20WOW\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']}))};}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;let n=[];try{n=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)));}const {nodes:o,edges:p}=buildMachineGraph(n);return{'action':'get_machine_graph','machineAddress':c,'machineName':j,'nodes':o,'edges':p,'published':l,'paused':m,'mermaid':renderMachineMermaid(o,p),'tree_outline':renderMachineTreeIndented({'nodes':o,'edges':p,'machineName':j,'machineAddress':c,'published':l,'paused':m}),'ascii_art':renderMachineAscii({'nodes':o,'edges':p,'machineName':j,'machineAddress':c,'published':l,'paused':m}),'markmap':renderMachineMarkmap({'nodes':o,'edges':p,'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};}
@@ -1 +1 @@
1
- import{normalizeForProject,extractProjectPrefix,extractAllProjectVersions,TAG_PREFIX}from'./namespace.js';import{ProjectGraph,extractReferences,nodeIdOf}from'./graph.js';import{listProjects,listProjectObjects,listShareableObjects,traceDependencies,traceReferencedBy,prePublishCheck,findCrossProjectReferences}from'./query.js';import{isEnabled as a268a}from'../config/index.js';import{LocalMark,getWowMcpDir}from'@wowok/wowok';import{readFileSync,writeFileSync,existsSync,mkdirSync}from'fs';import{dirname,join}from'path';import*as a268b from'./project-store.js';export*from'./namespace.js';export*from'./graph.js';export*from'./query.js';export*from'./reverse-mapping.js';export*from'./workflow-design-assessment.js';export function isProjectServiceEnabled(){return a268a('project_service');}function scheduleHiddenStep(a,b,c){const d=extractAllProjectVersions(b)['filter'](f=>f['version']!==undefined)['map'](f=>''+TAG_PREFIX['project']+f['prefix']+'_'+f['version']);if(d['length']===0x0||c['length']===0x0)return;const e=async()=>{const f=LocalMark['Instance']();for(const g of c){try{await f['add_tags'](g['target'],d);}catch{}}};typeof setImmediate==='function'?setImmediate(()=>{e()['catch'](()=>{});}):Promise['resolve']()['then'](()=>{e()['catch'](()=>{});});}let GRAPH_INSTANCE=null,GRAPH_HYDRATED=![];function isAutoHydrateEnabled(){const a=process['env']['WOWOK_PROJECT_SERVICE_HYDRATE'];return a==='1'||a==='true';}export function getGraph(){if(!GRAPH_INSTANCE){GRAPH_INSTANCE=new ProjectGraph();if(isAutoHydrateEnabled()&&!GRAPH_HYDRATED){GRAPH_HYDRATED=!![];try{loadGraph();}catch{}}}return GRAPH_INSTANCE;}export function setGraph(a){GRAPH_INSTANCE=a;}const STAGE_CACHE=new Map();function stageCacheKey(a,b){return a+':'+b;}export function getStageCache(a,b){const c=stageCacheKey(a,b),d=STAGE_CACHE['get'](c);if(d)return d;const e=a268b['loadStageState'](a,b);if(e){const f={'stage':e['stage'],'updated_at':e['updated_at']};return STAGE_CACHE['set'](c,f),f;}return undefined;}export function updateStageCache(a,b,c){const d=stageCacheKey(a,b),e=STAGE_CACHE['get'](d),f={'stage':c['stage']??e?.['stage']??0x1,'updated_at':Date['now'](),...e,...c};return STAGE_CACHE['set'](d,f),persistStageState(a,b,f),f;}function persistStageState(a,b,c){try{let d=a268b['loadStageState'](a,b);if(!d){a268b['initProject'](a,b,{'mcpVersion':'project-service-v'+PROJECT_SERVICE_VERSION}),d=a268b['loadStageState'](a,b);if(!d)return;}if(d['archived'])return;d['stage']=c['stage'],d['updated_at']=c['updated_at'],a268b['saveStageState'](a,b,d);}catch{}}export function getProjectStatus(a,b){const c=getStageCache(a,b),d=c?.['stage']??0x1,e={0x1:{'name':'Project\x20Naming','description':'Project\x20namespace\x20established.\x20Ready\x20to\x20analyze\x20business\x20intent.','next':'analyze_intent'},0x2:{'name':'Business\x20Puzzle','description':'Business\x20intent\x20analyzed.\x20Puzzles\x20may\x20need\x20completion\x20before\x20risk\x20assessment.','next':c?.['puzzles']?'aggregate_risks':'analyze_intent'},0x3:{'name':'Risk\x20Calibration','description':'Risks\x20assessed.\x20Fix\x20CRITICAL\x20risks\x20before\x20generating\x20deployment\x20doc.','next':c?.['risk_can_proceed']?'generate_deployment_doc':'aggregate_risks'},0x4:{'name':'Deployment\x20Document','description':'Deployment\x20doc\x20generated.\x20Fix\x20D-errors\x20before\x20substep\x20trace.','next':c?.['doc_error_count']===0x0?'trace_substeps':'generate_deployment_doc'},0x5:{'name':'Substep\x20Trace','description':'Substeps\x20traced.\x20Ready\x20for\x20deployment\x20execution.','next':c?.['trace_can_proceed']?'deploy':'trace_substeps'}},f=e[d];return{'stage':d,'stage_name':f['name'],'stage_description':f['description'],'next_action':f['next'],'can_proceed':d<0x5,'details':c};}export function clearStageCache(a,b){STAGE_CACHE['delete'](stageCacheKey(a,b));}export function normalize(a){if(!isProjectServiceEnabled())return{'data':a['data'],'warnings':[]};return normalizeForProject({'operation_type':a['operation_type'],'data':a['data'],'projectPrefix':a['projectPrefix'],'role':a['role'],'industry':a['industry'],'version':a['version'],'shareable':a['shareable']});}export function observe(a,b,c){if(!isProjectServiceEnabled())return;try{const d=getGraph(),e=b?.['namedNew']??b?.['object'],f=e?.['name'],g=extractAddressFromResult(c),h=nodeIdOf(f,g);if(!h)return;const i=e?.['tags'],j=extractProjectPrefix(i),k=i?.['find'](q=>q['startsWith'](TAG_PREFIX['type'])),l=k?.['slice'](TAG_PREFIX['type']['length']),m=extractAllProjectVersions(i),n=m['map'](q=>q['version']?q['prefix']+'_'+q['version']:q['prefix']),o={'id':h,'project':j,'projects':n['length']>0x0?n:undefined,'type':l,'address':g};d['upsertNode'](o);const p=extractReferences(a,b);for(const q of p){d['addEdge'](h,q['target'],q['kind']);}scheduleHiddenStep(h,i,p);if(a268a('graph_persist'))try{saveGraph();}catch{}}catch{}}function extractAddressFromResult(a){if(!a||typeof a!=='object')return undefined;const b=a?.['object_id']??a?.['objectId']??a?.['effects']?.['created']?.[0x0]?.['reference']?.['objectId']??a?.['objectRef']?.['objectId']??a?.['data']?.['objectId'];if(typeof b==='string'&&b['startsWith']('0x'))return b;const c=a['result']??a['data'];if(c&&typeof c==='object'){const d=c['object_id']??c['objectId']??c['effects']?.['created']?.[0x0]?.['reference']?.['objectId']??c['objectRef']?.['objectId'];if(typeof d==='string'&&d['startsWith']('0x'))return d;}return undefined;}export async function queryProjects(){const a=await listProjects();try{const {LocalProject:b}=await import('@wowok/wowok'),c=await b['Instance']()['listProjects'](),d=c['map'](f=>({'prefix':f['prefix'],'objectCount':0x0,'types':[],'versions':f['currentVersion']?[f['currentVersion']]:[],'objects':[],...f})),e=new Map();for(const f of a)e['set'](f['prefix'],f);for(const g of d){if(!e['has'](g['prefix']))e['set'](g['prefix'],g);}return Array['from'](e['values']());}catch{return a;}}export async function queryProjectObjects(a){return listProjectObjects(a);}export async function queryShareableObjects(){return listShareableObjects();}export function queryDependencies(a){return traceDependencies(getGraph(),a);}export function queryReferencedBy(a){return traceReferencedBy(getGraph(),a);}export function queryPrePublishCheck(a){return prePublishCheck(getGraph(),a);}export function queryCrossProjectReferences(){return findCrossProjectReferences(getGraph());}export function queryGraphStats(){const a=getGraph();return{'nodeCount':a['nodeCount'],'edgeCount':a['edgeCount'],'cycles':a['detectCycles'](),'dangling':a['findDanglingDependencies']()};}function graphFilePath(){return join(getWowMcpDir(),'project-graph.json');}export function saveGraph(){const a=graphFilePath(),b=dirname(a);if(!existsSync(b))mkdirSync(b,{'recursive':!![]});const c=getGraph()['snapshot']();return writeFileSync(a,JSON['stringify'](c,null,0x2),'utf-8'),a;}export function loadGraph(){const a=graphFilePath();if(!existsSync(a))return![];try{const b=readFileSync(a,'utf-8'),c=JSON['parse'](b);if(c&&c['nodes']&&c['edges'])return getGraph()['restore'](c),!![];}catch{}return![];}export function hasPersistedGraph(){return existsSync(graphFilePath());}export const PROJECT_SERVICE_VERSION=0x1;
1
+ import{normalizeForProject,extractProjectPrefix,extractAllProjectVersions,TAG_PREFIX}from'./namespace.js';import{ProjectGraph,extractReferences,nodeIdOf}from'./graph.js';import{listProjects,listProjectObjects,listShareableObjects,traceDependencies,traceReferencedBy,prePublishCheck,findCrossProjectReferences}from'./query.js';import{isEnabled as a278a}from'../config/index.js';import{LocalMark,getWowMcpDir}from'@wowok/wowok';import{readFileSync,writeFileSync,existsSync,mkdirSync}from'fs';import{dirname,join}from'path';import*as a278b from'./project-store.js';export*from'./namespace.js';export*from'./graph.js';export*from'./query.js';export*from'./reverse-mapping.js';export*from'./workflow-design-assessment.js';export function isProjectServiceEnabled(){return a278a('project_service');}function scheduleHiddenStep(a,b,c){const d=extractAllProjectVersions(b)['filter'](f=>f['version']!==undefined)['map'](f=>''+TAG_PREFIX['project']+f['prefix']+'_'+f['version']);if(d['length']===0x0||c['length']===0x0)return;const e=async()=>{const f=LocalMark['Instance']();for(const g of c){try{await f['add_tags'](g['target'],d);}catch{}}};typeof setImmediate==='function'?setImmediate(()=>{e()['catch'](()=>{});}):Promise['resolve']()['then'](()=>{e()['catch'](()=>{});});}let GRAPH_INSTANCE=null,GRAPH_HYDRATED=![];function isAutoHydrateEnabled(){const a=process['env']['WOWOK_PROJECT_SERVICE_HYDRATE'];return a==='1'||a==='true';}export function getGraph(){if(!GRAPH_INSTANCE){GRAPH_INSTANCE=new ProjectGraph();if(isAutoHydrateEnabled()&&!GRAPH_HYDRATED){GRAPH_HYDRATED=!![];try{loadGraph();}catch{}}}return GRAPH_INSTANCE;}export function setGraph(a){GRAPH_INSTANCE=a;}const STAGE_CACHE=new Map();function stageCacheKey(a,b){return a+':'+b;}export function getStageCache(a,b){const c=stageCacheKey(a,b),d=STAGE_CACHE['get'](c);if(d)return d;const e=a278b['loadStageState'](a,b);if(e){const f={'stage':e['stage'],'updated_at':e['updated_at']};return STAGE_CACHE['set'](c,f),f;}return undefined;}export function updateStageCache(a,b,c){const d=stageCacheKey(a,b),e=STAGE_CACHE['get'](d),f={'stage':c['stage']??e?.['stage']??0x1,'updated_at':Date['now'](),...e,...c};return STAGE_CACHE['set'](d,f),persistStageState(a,b,f),f;}function persistStageState(a,b,c){try{let d=a278b['loadStageState'](a,b);if(!d){a278b['initProject'](a,b,{'mcpVersion':'project-service-v'+PROJECT_SERVICE_VERSION}),d=a278b['loadStageState'](a,b);if(!d)return;}if(d['archived'])return;d['stage']=c['stage'],d['updated_at']=c['updated_at'],a278b['saveStageState'](a,b,d);}catch{}}export function getProjectStatus(a,b){const c=getStageCache(a,b),d=c?.['stage']??0x1,e={0x1:{'name':'Project\x20Naming','description':'Project\x20namespace\x20established.\x20Ready\x20to\x20analyze\x20business\x20intent.','next':'analyze_intent'},0x2:{'name':'Business\x20Puzzle','description':'Business\x20intent\x20analyzed.\x20Puzzles\x20may\x20need\x20completion\x20before\x20risk\x20assessment.','next':c?.['puzzles']?'aggregate_risks':'analyze_intent'},0x3:{'name':'Risk\x20Calibration','description':'Risks\x20assessed.\x20Fix\x20CRITICAL\x20risks\x20before\x20generating\x20deployment\x20doc.','next':c?.['risk_can_proceed']?'generate_deployment_doc':'aggregate_risks'},0x4:{'name':'Deployment\x20Document','description':'Deployment\x20doc\x20generated.\x20Fix\x20D-errors\x20before\x20substep\x20trace.','next':c?.['doc_error_count']===0x0?'trace_substeps':'generate_deployment_doc'},0x5:{'name':'Substep\x20Trace','description':'Substeps\x20traced.\x20Ready\x20for\x20deployment\x20execution.','next':c?.['trace_can_proceed']?'deploy':'trace_substeps'}},f=e[d];return{'stage':d,'stage_name':f['name'],'stage_description':f['description'],'next_action':f['next'],'can_proceed':d<0x5,'details':c};}export function clearStageCache(a,b){STAGE_CACHE['delete'](stageCacheKey(a,b));}export function normalize(a){if(!isProjectServiceEnabled())return{'data':a['data'],'warnings':[]};return normalizeForProject({'operation_type':a['operation_type'],'data':a['data'],'projectPrefix':a['projectPrefix'],'role':a['role'],'industry':a['industry'],'version':a['version'],'shareable':a['shareable']});}export function observe(a,b,c){if(!isProjectServiceEnabled())return;try{const d=getGraph(),e=b?.['namedNew']??b?.['object'],f=e?.['name'],g=extractAddressFromResult(c),h=nodeIdOf(f,g);if(!h)return;const i=e?.['tags'],j=extractProjectPrefix(i),k=i?.['find'](q=>q['startsWith'](TAG_PREFIX['type'])),l=k?.['slice'](TAG_PREFIX['type']['length']),m=extractAllProjectVersions(i),n=m['map'](q=>q['version']?q['prefix']+'_'+q['version']:q['prefix']),o={'id':h,'project':j,'projects':n['length']>0x0?n:undefined,'type':l,'address':g};d['upsertNode'](o);const p=extractReferences(a,b);for(const q of p){d['addEdge'](h,q['target'],q['kind']);}scheduleHiddenStep(h,i,p);if(a278a('graph_persist'))try{saveGraph();}catch{}}catch{}}function extractAddressFromResult(a){if(!a||typeof a!=='object')return undefined;const b=a?.['object_id']??a?.['objectId']??a?.['effects']?.['created']?.[0x0]?.['reference']?.['objectId']??a?.['objectRef']?.['objectId']??a?.['data']?.['objectId'];if(typeof b==='string'&&b['startsWith']('0x'))return b;const c=a['result']??a['data'];if(c&&typeof c==='object'){const d=c['object_id']??c['objectId']??c['effects']?.['created']?.[0x0]?.['reference']?.['objectId']??c['objectRef']?.['objectId'];if(typeof d==='string'&&d['startsWith']('0x'))return d;}return undefined;}export async function queryProjects(){const a=await listProjects();try{const {LocalProject:b}=await import('@wowok/wowok'),c=await b['Instance']()['listProjects'](),d=c['map'](f=>({'prefix':f['prefix'],'objectCount':0x0,'types':[],'versions':f['currentVersion']?[f['currentVersion']]:[],'objects':[],...f})),e=new Map();for(const f of a)e['set'](f['prefix'],f);for(const g of d){if(!e['has'](g['prefix']))e['set'](g['prefix'],g);}return Array['from'](e['values']());}catch{return a;}}export async function queryProjectObjects(a){return listProjectObjects(a);}export async function queryShareableObjects(){return listShareableObjects();}export function queryDependencies(a){return traceDependencies(getGraph(),a);}export function queryReferencedBy(a){return traceReferencedBy(getGraph(),a);}export function queryPrePublishCheck(a){return prePublishCheck(getGraph(),a);}export function queryCrossProjectReferences(){return findCrossProjectReferences(getGraph());}export function queryGraphStats(){const a=getGraph();return{'nodeCount':a['nodeCount'],'edgeCount':a['edgeCount'],'cycles':a['detectCycles'](),'dangling':a['findDanglingDependencies']()};}function graphFilePath(){return join(getWowMcpDir(),'project-graph.json');}export function saveGraph(){const a=graphFilePath(),b=dirname(a);if(!existsSync(b))mkdirSync(b,{'recursive':!![]});const c=getGraph()['snapshot']();return writeFileSync(a,JSON['stringify'](c,null,0x2),'utf-8'),a;}export function loadGraph(){const a=graphFilePath();if(!existsSync(a))return![];try{const b=readFileSync(a,'utf-8'),c=JSON['parse'](b);if(c&&c['nodes']&&c['edges'])return getGraph()['restore'](c),!![];}catch{}return![];}export function hasPersistedGraph(){return existsSync(graphFilePath());}export const PROJECT_SERVICE_VERSION=0x1;
@@ -1,2 +1,25 @@
1
1
  import type { ENTRYPOINT, TableItem_MachineNode } from "@wowok/wowok";
2
2
  export declare function fetchMachineNodes(machineAddress: string, network: ENTRYPOINT): Promise<TableItem_MachineNode[]>;
3
+ export interface MachineGraphForward {
4
+ name: string;
5
+ weight: number;
6
+ guard: string | null;
7
+ retained_submission: number[] | null;
8
+ named_operator: string | null;
9
+ permission_index: number | null;
10
+ }
11
+ export interface MachineGraphEdge {
12
+ from: string;
13
+ to: string;
14
+ threshold: number;
15
+ forwards: MachineGraphForward[];
16
+ }
17
+ export interface MachineGraphNode {
18
+ name: string;
19
+ description: string | null;
20
+ }
21
+ export declare function normalizeForwards(raw: unknown): MachineGraphForward[];
22
+ export declare function buildMachineGraph(rawNodes: TableItem_MachineNode[]): {
23
+ nodes: MachineGraphNode[];
24
+ edges: MachineGraphEdge[];
25
+ };
@@ -1 +1 @@
1
- import{query_objects,query_table}from'@wowok/wowok';const BATCH=0x32;export async function fetchMachineNodes(a,b){const c=[];let d=undefined;for(;;){const f=await query_table({'parent':a,'cursor':d??undefined,'network':b});if(!f?.['items']||f['items']['length']===0x0)break;for(const g of f['items']){if(g['object'])c['push'](g['object']);}if(!f['hasNextPage']||!f['nextCursor'])break;d=f['nextCursor'];}const e=[];for(let h=0x0;h<c['length'];h+=BATCH){const j=c['slice'](h,h+BATCH),k=await query_objects({'objects':j,'network':b});for(const l of k?.['objects']??[]){l['type']==='TableItem_MachineNode'&&e['push'](l);}}return e;}
1
+ import{query_objects,query_table}from'@wowok/wowok';const BATCH=0x32;export async function fetchMachineNodes(a,b){const c=[];let d=undefined;for(;;){const f=await query_table({'parent':a,'cursor':d??undefined,'network':b});if(!f?.['items']||f['items']['length']===0x0)break;for(const g of f['items']){if(g['object'])c['push'](g['object']);}if(!f['hasNextPage']||!f['nextCursor'])break;d=f['nextCursor'];}const e=[];for(let h=0x0;h<c['length'];h+=BATCH){const j=c['slice'](h,h+BATCH),k=await query_objects({'objects':j,'network':b});for(const l of k?.['objects']??[]){l['type']==='TableItem_MachineNode'&&e['push'](l);}}return e;}export 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';return{'name':typeof b?.['name']==='string'?b['name']:'','weight':typeof b?.['weight']==='number'?b['weight']:0x0,'guard':d?c['guard']:typeof c==='string'?c:null,'retained_submission':d&&Array['isArray'](c['retained_submission'])?c['retained_submission']:null,'named_operator':typeof b?.['namedOperator']==='string'?b['namedOperator']:null,'permission_index':typeof b?.['permissionIndex']==='number'?b['permissionIndex']:null};});}export function buildMachineGraph(a){const b=new Map(),c=[];for(const d of a){const e=d['name'];if(!e)continue;!b['has'](e)&&b['set'](e,{'name':e,'description':null});const f=Array['isArray'](d['value'])?d['value']:[];for(const g of f){if(!g||typeof g!=='object')continue;const h=typeof g['prev_node']==='string'?g['prev_node']:'';if(!h)continue;c['push']({'from':h,'to':e,'threshold':typeof g['threshold']==='number'?g['threshold']:0x1,'forwards':normalizeForwards(g['forwards'])});}}for(const i of c){!b['has'](i['from'])&&b['set'](i['from'],{'name':i['from'],'description':null}),!b['has'](i['to'])&&b['set'](i['to'],{'name':i['to'],'description':null});}return{'nodes':Array['from'](b['values']()),'edges':c};}
@@ -0,0 +1,41 @@
1
+ import type { z } from "zod";
2
+ import type { ProjectOperationInputSchema } from "../schema/project/index.js";
3
+ import { type MachineGraphNode, type MachineGraphEdge } from "./machine-nodes.js";
4
+ type ProjectInput = z.infer<typeof ProjectOperationInputSchema>;
5
+ export interface MachinePanoramaResult {
6
+ action: "machine_panorama";
7
+ machineAddress: string;
8
+ network: string;
9
+ head: {
10
+ name: string | null;
11
+ tags: string[];
12
+ description: string | null;
13
+ published: boolean | null;
14
+ paused: boolean | null;
15
+ };
16
+ fields: {
17
+ permission: string | null;
18
+ um: string | null;
19
+ node_count: number | null;
20
+ consensus_repositories: string[];
21
+ };
22
+ graph: {
23
+ nodes: MachineGraphNode[];
24
+ edges: MachineGraphEdge[];
25
+ };
26
+ progresses: {
27
+ count: number;
28
+ items: {
29
+ progress: string;
30
+ name: string | null;
31
+ current: string | null;
32
+ task: string | null;
33
+ history_count: number | null;
34
+ current_time: number | null;
35
+ created_at: number | null;
36
+ }[];
37
+ };
38
+ data_gaps: string[];
39
+ }
40
+ export declare function handleMachinePanorama(v: ProjectInput): Promise<MachinePanoramaResult>;
41
+ export {};
@@ -0,0 +1 @@
1
+ import{Config,LocalMark,query_objects,queryTableItem_ObjectLinkerTx,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';export async function handleMachinePanorama(a){const b=a['object_address'];if(!b)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20machine_panorama');let c=a['context_network']??a['project_network']??undefined;const d=[];let f=b;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](b)){const n=await LocalMark['Instance']()['get_address'](b);if(!n)throw new Error('Cannot\x20resolve\x20machine\x20\x27'+b+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Machine\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');f=n;}let g=null;try{if(!c)c=await Config['Instance']()['network_get']();const p=await query_objects({'objects':[f],'network':c});g=p?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const q=await Config['Instance']()['network_get']();if(q&&q!==c){const s=await query_objects({'objects':[f],'network':q,'no_cache':!![]}),t=s?.['objects']?.[0x0]??null;t&&(g=t,c=q);}}}catch(u){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(u instanceof Error?u['message']:String(u))));}if(!g)throw new Error('Machine\x20'+f+'\x20not\x20found\x20on\x20'+c+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');f=g['object']??f;let h=null,j=[];try{const w=await LocalMark['Instance']()['list']({'address':f});w['length']>0x0&&(h=w[0x0]['name']??null,j=(w[0x0]['tags']??[])['map'](x=>String(x)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const x=await fetchMachineNodes(f,c);k=buildMachineGraph(x);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}const l=[];let m=0x0;try{const y=await queryTableItem_ObjectLinkerTx({'address':f,'no_cache':!![],'network':c}),z=(y?.['items']??[])['filter'](D=>objectTypeFromAddress(D['who'])===ObjectType['Progress']);m=z['length'];const A=z['slice'](-0x32)['reverse'](),B=A['map'](D=>D['who']),C=new Map();if(B['length']>0x0)try{const D=await query_objects({'objects':B,'network':c});for(const E of D?.['objects']??[]){if(E?.['object'])C['set'](E['object'],E);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const F of A){const G=typeof F?.['who']==='string'?F['who']:'';if(!G)continue;const H=C['get'](G);l['push']({'progress':G,'name':null,'current':H?.['current']??null,'task':H?.['task']??null,'history_count':typeof H?.['history_count']==='number'?H['history_count']:null,'current_time':typeof H?.['current_time']==='number'?H['current_time']:null,'created_at':typeof F?.['time']==='number'?F['time']:null});}}catch{d['push']('progresses:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'action':'machine_panorama','machineAddress':f,'network':String(c),'head':{'name':h,'tags':j,'description':typeof g['description']==='string'?g['description']:null,'published':typeof g['bPublished']==='boolean'?g['bPublished']:null,'paused':typeof g['bPaused']==='boolean'?g['bPaused']:null},'fields':{'permission':g['permission']??null,'um':g['um']??null,'node_count':typeof g['node_count']==='number'?g['node_count']:null,'consensus_repositories':Array['isArray'](g['consensus_repositories'])?g['consensus_repositories']:[]},'graph':k,'progresses':{'count':m,'items':l},'data_gaps':d};}