@wowok/agent-mcp 3.1.0 → 3.1.2

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 (95) hide show
  1. package/dist/evaluation/arbitration-game.js +1 -1
  2. package/dist/evaluation/location-match.js +1 -1
  3. package/dist/goal/GoalClassifier.js +1 -1
  4. package/dist/graph/onchain/analyze.d.ts +3 -3
  5. package/dist/graph/onchain/analyze.js +1 -1
  6. package/dist/graph/onchain/analyze.spec.js +1 -1
  7. package/dist/graph/onchain/edge-schema.d.ts +1 -1
  8. package/dist/graph/onchain/edge-schema.js +1 -1
  9. package/dist/graph/onchain/interest.js +1 -1
  10. package/dist/graph/onchain/sdk-dataplane.js +1 -1
  11. package/dist/graph/onchain/types.d.ts +5 -5
  12. package/dist/harness/verify.js +1 -1
  13. package/dist/knowledge/allocation-ledger.d.ts +2 -0
  14. package/dist/knowledge/allocation-ledger.js +1 -1
  15. package/dist/knowledge/allocation-puzzle.js +1 -1
  16. package/dist/knowledge/allocation-risk.d.ts +2 -1
  17. package/dist/knowledge/allocation-risk.js +1 -1
  18. package/dist/knowledge/guard-design-patterns.js +1 -1
  19. package/dist/knowledge/guard-field-cognition.d.ts +48 -0
  20. package/dist/knowledge/guard-field-cognition.js +1 -0
  21. package/dist/knowledge/index.d.ts +1 -0
  22. package/dist/knowledge/index.js +1 -1
  23. package/dist/knowledge/industry-registry.js +1 -1
  24. package/dist/knowledge/industry-strategy.js +1 -1
  25. package/dist/knowledge/jsonrpc-enum.js +1 -1
  26. package/dist/knowledge/recipient-constraint.d.ts +6 -1
  27. package/dist/knowledge/recipient-constraint.js +1 -1
  28. package/dist/knowledge/service-allocator-audit-node.d.ts +3 -0
  29. package/dist/knowledge/service-allocator-audit-node.js +1 -0
  30. package/dist/knowledge/service-risk-node.js +1 -1
  31. package/dist/knowledge/template-registry.js +1 -1
  32. package/dist/knowledge/workflow-guidance.d.ts +2 -0
  33. package/dist/knowledge/workflow-guidance.js +1 -1
  34. package/dist/monitor/MonitorLoop.js +1 -1
  35. package/dist/persona/strategy-intent.js +1 -1
  36. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  37. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  38. package/dist/playbooks/service-build/object-panorama.js +1 -1
  39. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  40. package/dist/playbooks/service-build/topology-query.js +1 -1
  41. package/dist/safety/confirm-gate.js +1 -1
  42. package/dist/safety/preview.js +1 -1
  43. package/dist/schema/call/base.js +1 -1
  44. package/dist/schema/call/handler.js +1 -1
  45. package/dist/schema/call/semantic.js +1 -1
  46. package/dist/schema/common/index.js +1 -1
  47. package/dist/schema/evaluation/index.js +1 -1
  48. package/dist/schema/local/index.js +1 -1
  49. package/dist/schema/operations.d.ts +2 -0
  50. package/dist/schema/query/bi.d.ts +16 -14
  51. package/dist/schema/query/bi.js +1 -1
  52. package/dist/schema/query/index.js +1 -1
  53. package/dist/schema/schema-version.js +1 -1
  54. package/dist/schema-query-impl/index.js +1 -1
  55. package/dist/schemas/account_operation.output.json +9 -9
  56. package/dist/schemas/account_operation.schema.json +3 -3
  57. package/dist/schemas/bridge_operation.output.json +9 -9
  58. package/dist/schemas/evaluation_operation.output.json +6 -6
  59. package/dist/schemas/evaluation_operation.schema.json +5 -5
  60. package/dist/schemas/index.json +1 -1
  61. package/dist/schemas/keeper_operation.output.json +9 -9
  62. package/dist/schemas/local_history_operation.output.json +9 -9
  63. package/dist/schemas/local_info_operation.output.json +9 -9
  64. package/dist/schemas/local_mark_operation.output.json +9 -9
  65. package/dist/schemas/messenger_operation.output.json +9 -9
  66. package/dist/schemas/monitor_events.output.json +9 -9
  67. package/dist/schemas/monitor_subscription.output.json +9 -9
  68. package/dist/schemas/onchain_events.output.json +10 -10
  69. package/dist/schemas/onchain_operations.output.json +9 -9
  70. package/dist/schemas/onchain_operations.schema.json +46 -46
  71. package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
  72. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  73. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  74. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  75. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  76. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  77. package/dist/schemas/onchain_operations_payment.schema.json +2 -2
  78. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  79. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  80. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  81. package/dist/schemas/onchain_operations_reward.schema.json +6 -6
  82. package/dist/schemas/onchain_operations_service.schema.json +8 -8
  83. package/dist/schemas/onchain_operations_treasury.schema.json +8 -8
  84. package/dist/schemas/onchain_table_data.output.json +17 -13
  85. package/dist/schemas/query_toolkit.output.json +47 -47
  86. package/dist/schemas/query_toolkit.schema.json +6 -2
  87. package/dist/strategy/collectors.js +1 -1
  88. package/dist/task/playbook.js +1 -1
  89. package/dist/tools/handlers/config.js +1 -1
  90. package/dist/tools/handlers/evaluation.spec.js +1 -1
  91. package/dist/tools/handlers/onchain.js +1 -1
  92. package/dist/tools/registry/monitor.js +1 -1
  93. package/dist/tools/shared.js +1 -1
  94. package/dist/tools/wrap.js +1 -1
  95. package/package.json +2 -2
@@ -1 +1 @@
1
- import{ValueType}from'@wowok/wowok';import{getGuardQueryByIdOrName}from'../schema/utils/guard-query-utils.js';function asNode(a){if(typeof a!=='object'||a===null)return null;const b=a['type'];return typeof b==='string'?a:null;}function queryMeta(a){if(typeof a!=='number'&&typeof a!=='string')return null;const b=getGuardQueryByIdOrName(a);return b?{'id':b['id'],'name':b['name']}:null;}function childNodes(a){const b=[];if(Array['isArray'](a['nodes']))a['nodes']['forEach'](d=>{const e=asNode(d);if(e)b['push'](e);});if(asNode(a['node']))b['push'](asNode(a['node']));return[a['nodeLeft'],a['nodeRight']]['forEach'](d=>{const e=asNode(d);if(e)b['push'](e);}),b;}export function classifyRecipient(a){if(typeof a!=='object'||a===null)return null;const b=a;if(typeof b['Entity']==='string')return{'kind':'entity','address':b['Entity']};const c=b['Entity'];if(c&&typeof c==='object'&&typeof c['name_or_address']==='string')return{'kind':'entity','address':c['name_or_address']};if(b['Signer']==='signer'||b['Signer']===!![])return{'kind':'signer'};if(typeof b['GuardIdentifier']==='number')return{'kind':'submission','identifier':b['GuardIdentifier']};return null;}function leafInfo(a,b){if(a['type']==='context'&&typeof a['context']==='string'){if(a['context']==='Signer')return{'kind':'signer'};if(a['context']==='Clock')return{'kind':'clock'};}if(a['type']==='query'){const c=queryMeta(a['query']),d=a['object'];if(c&&d&&typeof d['identifier']==='number')return{'kind':'query','query_name':c['name'],'query_id':c['id'],'object_identifier':d['identifier'],'convert_witness':d['convert_witness']};}if(a['type']==='identifier'){const e=typeof a['identifier']==='number'?a['identifier']:-0x1,f=b['find'](g=>g['identifier']===e);if(f){const g=typeof f['value']==='string'?f['value']:undefined;if(f['value_type']===ValueType['Address'])return{'kind':'static_address','value':g};if(f['value_type']===ValueType['String'])return{'kind':'static_string','value':g};}}return{'kind':'other'};}function comparisonLeaves(a,b){if(a['type']==='logic_equal'){const c=childNodes(a)['map'](d=>flattenLeaf(d,b));return c;}return[];}function flattenLeaf(a,b){if(a['type']==='logic_not'){const d=childNodes(a)[0x0];return d?flattenLeaf(d,b):{'kind':'other'};}return leafInfo(a,b);}function isOrderProgressWitness(a){if(a===0x64)return!![];return typeof a==='string'&&a['toLowerCase']()['includes']('orderprogress');}function describe(a){switch(a){case'service_binding':return'Submitted\x20object\x20must\x20belong\x20to\x20the\x20expected\x20service';case'progress_node_state':return'Submitted\x20order\x20must\x20be\x20at\x20a\x20qualifying\x20workflow\x20node';case'signer_is_submitted_object_owner':return'Caller\x20must\x20be\x20the\x20owner\x20of\x20the\x20submitted\x20object';case'signer_authorized_entity':return'Caller\x20must\x20equal\x20a\x20fixed\x20authorized\x20address';case'signer_permission_member':return'Caller\x20must\x20satisfy\x20a\x20Permission\x20membership\x20rule';case'time_lock':return'Current\x20time\x20must\x20satisfy\x20the\x20time-lock';case'repository_crosscheck':return'Repository\x20data\x20must\x20satisfy\x20the\x20cross-check';default:return'Other\x20guard\x20constraint';}}function extractConstraints(a,b){const c=[],d=new Set(),e=h=>{const i=h['code']+':'+(h['slot']??'-');!d['has'](i)&&(d['add'](i),c['push'](h));},f=(h,i)=>({'path':h,'queries':i}),g=(h,i)=>{const j=comparisonLeaves(h,b);if(j['length']>=0x2){const k=j['find'](r=>r['kind']==='signer'),l=j['find'](r=>r['kind']==='query'&&r['query_name']==='order.owner'),m=j['find'](r=>r['kind']==='query'&&r['query_name']==='order.service'),n=j['find'](r=>r['kind']==='query'&&r['query_name']==='progress.current'),o=j['find'](r=>r['kind']==='static_address'),p=j['find'](r=>r['kind']==='static_string');k&&l&&e({'code':'signer_is_submitted_object_owner','slot':l['object_identifier'],'description':describe('signer_is_submitted_object_owner'),'caller_constraint':!![],'evidence':f(i,['Signer','order.owner'])});k&&o&&e({'code':'signer_authorized_entity','description':describe('signer_authorized_entity'),'caller_constraint':!![],'evidence':f(i,['Signer'])});m&&o&&e({'code':'service_binding','slot':m['object_identifier'],'description':describe('service_binding'),'caller_constraint':![],'evidence':f(i,['order.service'])});if(n&&p){const r=n['object_identifier'];isOrderProgressWitness(n['convert_witness'])&&e({'code':'progress_node_state','slot':r,'description':describe('progress_node_state'),'caller_constraint':![],'evidence':f(i,['progress.current'])});}}if(h['type']['startsWith']('logic_as_u256')||h['type']==='calc_number_add'){const s=[h,...childNodes(h)]['map'](t=>flattenLeaf(t,b));if(s['some'](t=>t['kind']==='clock')&&s['some'](t=>t['kind']==='query'&&(t['query_name']==='progress.current_time'||t['query_name']==='progress.session.forward.time'))){const t=s['find'](u=>u['kind']==='query');e({'code':'time_lock','slot':t['object_identifier'],'description':describe('time_lock'),'caller_constraint':![],'evidence':f(i,['Clock',t['query_name']])});}}if(h['type']==='query'){const u=queryMeta(h['query']);if(u&&u['name']['startsWith']('repository.')){const v=h['object'];e({'code':'repository_crosscheck','slot':v?.['identifier'],'description':describe('repository_crosscheck'),'caller_constraint':![],'evidence':f(i,[u['name']])});}}childNodes(h)['forEach']((w,x)=>g(w,i+'/'+x));};return g(a,'/root'),c;}function findSessionQueries(a){const b=[],c=(d,e)=>{if(d['type']==='query'){const f=queryMeta(d['query']);if(f&&(f['id']===0x4f6||f['id']===0x4f7))b['push'](e);}childNodes(d)['forEach']((g,h)=>c(g,e+'/'+h));};return c(a,'/root'),b;}function collectSlotUsages(a){const b=[],c=(d,e)=>{if(d['type']==='query'){const f=queryMeta(d['query']),g=d['object'];f&&g&&typeof g['identifier']==='number'&&b['push']({'slot':g['identifier'],'path':e,'query_id':f['id'],'query_name':f['name'],...g['convert_witness']!==undefined?{'convert_witness':g['convert_witness']}:{}});}childNodes(d)['forEach']((h,j)=>c(h,e+'/'+j));};return c(a,'/root'),b;}function deriveReceiptRight(a,b){const c=b['find'](e=>e['code']==='progress_node_state'&&e['slot']===a),d=b['find'](e=>e['code']==='signer_is_submitted_object_owner'&&e['slot']===a);if(c||d)return{'object_type':'order','receive_entry':'order::owner_receive','guarantee':'Delivered\x20funds\x20are\x20owned\x20by\x20the\x20submitted\x20Order;\x20only\x20its\x20current\x20owner\x20can\x20'+'extract\x20them\x20(&mut\x20Order\x20input),\x20and\x20coins\x20transfer\x20to\x20that\x20owner.'};return undefined;}function deriveBeneficialOwner(a,b){switch(a['kind']){case'entity':return'Fixed\x20entity\x20'+a['address'];case'signer':return'Transaction\x20caller\x20(Signer)\x20—\x20direct\x20wallet';case'submission':return b?'Owner\x20of\x20the\x20submitted\x20object\x20at\x20table['+a['identifier']+']\x20(object\x20receipt\x20=\x20owner\x20receipt)':'Address\x20submitted\x20at\x20table['+a['identifier']+']\x20(caller-provided)';}}function buildSlotModels(a,b,c,d){const e=[...new Set(c['map'](f=>f['spec'])['filter'](f=>f['kind']==='submission')['map'](f=>f['identifier']))];return e['map'](f=>{const g=a['find'](p=>p['identifier']===f),h=g?normalizeValueType(g['value_type']):undefined,i=h===ValueType['Address'],j=b['filter'](p=>p['slot']===f),k=c['filter'](p=>p['spec']['kind']==='submission'&&p['spec']['identifier']===f)['map'](p=>p['mode']??'Unknown'),l=d['filter'](p=>p['slot']===undefined||p['slot']===f),m=deriveReceiptRight(f,d),n=l['some'](p=>p['code']==='service_binding'||p['code']==='repository_crosscheck'||p['code']==='signer_permission_member'),o=[];if(h!==undefined&&!i)o['push']('RC-FIND-07');if(!n)o['push']('RC-FIND-02');if(m?.['object_type']==='order')o['push']('RC-FIND-03');return{'identifier':f,'externally_submitted':g?.['b_submission']??!![],...h!==undefined?{'declared_value_type':h}:{},'is_address':i,'usages':j,'recipient_modes':k,'constraints':l,...m?{'receipt':m}:{},'beneficial_owner':deriveBeneficialOwner({'kind':'submission','identifier':f},m),'assessment':{'address_typed':i,'scope_bound':n,'object_receipt':m?.['object_type']==='order'},'findings':o};});}function buildSlotFinding(a,b,c){const d=a['identifier'];switch(b){case'RC-FIND-07':return{'code':b,'severity':'MEDIUM','title':'Submission\x20slot\x20'+d+'\x20is\x20not\x20address-typed','explanation':'GuardIdentifier\x20recipients\x20require\x20an\x20address-typed\x20table\x20entry\x20'+'(enforced\x20by\x20allocator_add\x20/\x20ERECIPIENT_IDENTIFIER_NOT_ADDRESS).','evidence_paths':c,'mitigation':'Set\x20the\x20slot\x20value_type\x20to\x20Address,\x20or\x20use\x20an\x20Entity\x20recipient.','unavoidable':![]};case'RC-FIND-02':return{'code':b,'severity':'HIGH','title':'Submission\x20slot\x20'+d+'\x20has\x20no\x20scope\x20binding','explanation':'Nothing\x20constrains\x20which\x20submitted\x20objects/addresses\x20qualify:\x20no\x20'+'service\x20binding,\x20repository\x20cross-check\x20or\x20permission\x20membership.\x20A\x20caller\x20'+'can\x20submit\x20arbitrary\x20qualifying-by-other-conditions\x20inputs.','evidence_paths':c,'mitigation':'Add\x20a\x20constraint\x20binding\x20the\x20slot\x20(e.g.\x20order.service\x20==\x20host\x20service).','unavoidable':![]};case'RC-FIND-03':return{'code':b,'severity':'MEDIUM','title':'Cross-allocation\x20settlement\x20residual','explanation':'The\x20submitted\x20order\x20is\x20not\x20bound\x20to\x20the\x20Allocation\x20being\x20settled\x20'+'(alloc\x20is\x20permissionless\x20and\x20allocation\x20context\x20is\x20not\x20a\x20Guard\x20input).\x20A\x20'+'caller\x20owning\x20ANY\x20qualifying\x20order\x20can\x20settle\x20OTHER\x20allocations;\x20funds\x20land\x20'+'at\x20the\x20submitted\x20order\x20and\x20are\x20receivable\x20by\x20its\x20owner.\x20Destination\x20is\x20safe\x20'+'(an\x20order\x20owner),\x20allocation\x20choice\x20is\x20the\x20residual.','evidence_paths':c,'mitigation':'Accept\x20with\x20monitoring,\x20or\x20use\x20a\x20fixed\x20Entity\x20recipient\x20when\x20the\x20destination\x20is\x20known\x20ahead\x20of\x20time.','unavoidable':!![]};default:return{'code':b,'severity':'LOW','title':'Slot\x20'+d+'\x20finding\x20'+b,'explanation':'','evidence_paths':c,'mitigation':'','unavoidable':![]};}}function buildFindings(a,b){const c=[];let d=![],e=![];for(const f of b){const g=f['recipients']['flatMap'](h=>h['constraints'])['filter'](h=>h['caller_constraint']);if(g['length']>0x0)d=!![];if(f['slots']['some'](h=>h['assessment']['scope_bound']))e=!![];for(const h of f['recipients']){const i=h['constraints']['map'](j=>j['evidence']['path']);h['spec']['kind']==='signer'&&g['length']===0x0&&c['push']({'code':'RC-FIND-01','severity':'CRITICAL','title':'Signer\x20recipient\x20without\x20caller\x20constraint\x20—\x20fund\x20theft','explanation':'Funds\x20are\x20delivered\x20directly\x20to\x20the\x20transaction\x20caller,\x20but\x20the\x20Guard\x20'+'does\x20not\x20bind\x20the\x20Signer\x20to\x20an\x20authorized\x20identity.\x20Anyone\x20who\x20satisfies\x20the\x20'+'other\x20conditions\x20steals\x20the\x20funds.','evidence_paths':i,'mitigation':'Bind\x20the\x20Signer\x20(signer==order.owner\x20or\x20signer==fixed\x20address),\x20or\x20change\x20'+'the\x20recipient\x20to\x20an\x20Entity\x20/\x20submitted\x20object\x20slot.','unavoidable':![]});}for(const j of f['slots']){const k=j['constraints']['map'](l=>l['evidence']['path']);for(const l of j['findings']){c['push'](buildSlotFinding(j,l,k));}}}a['trigger_source']==='standalone'&&!d&&c['push']({'code':'RC-FIND-04','severity':'HIGH','title':'Standalone\x20allocation\x20without\x20issuer\x20identity\x20constraint','explanation':'Standalone\x20allocations\x20have\x20no\x20Service/Arbitration\x20access-control\x20layer.\x20'+'Without\x20a\x20Signer/permission\x20binding\x20in\x20the\x20Guard,\x20anyone\x20can\x20trigger\x20distribution.','evidence_paths':[],'mitigation':'Bind\x20the\x20issuer\x20(Signer==owner/admin)\x20or\x20move\x20the\x20allocation\x20into\x20a\x20Service.','unavoidable':![]});c['push']({'code':'RC-FIND-06','severity':'LOW','title':'Permissionless\x20alloc\x20—\x20forced\x20settlement\x20timing','explanation':'Once\x20the\x20Guard\x27s\x20conditions\x20are\x20satisfiable,\x20anyone\x20can\x20trigger\x20settlement\x20of\x20an\x20'+'order\x27s\x20allocation.\x20With\x20Entity/object\x20recipients\x20this\x20affects\x20timing\x20only,\x20not\x20destination.','evidence_paths':[],'mitigation':'Monitor\x20settlements;\x20constrain\x20time-sensitivity\x20via\x20Guard\x20conditions.','unavoidable':!![]});for(const [m,n]of Object['entries'](a['guards']??{})){const o=asNode(n['root']);if(!o)continue;for(const q of findSessionQueries(o)){c['push']({'code':'RC-FIND-05','severity':'MEDIUM','title':'Guard\x20'+m+'\x20uses\x20session-only\x20query\x20at\x20'+q,'explanation':'Queries\x201270/1271\x20read\x20the\x20active\x20session;\x20after\x20the\x20session\x20migrates\x20to\x20'+'history\x20the\x20query\x20aborts\x20(W_FIELD_NOT_FOUND)\x20and\x20the\x20Guard\x20permanently\x20fails.','evidence_paths':[q],'mitigation':'Use\x20progress.current_time\x20(1272)\x20or\x20history\x20queries\x20(1274-1279).','unavoidable':![]});}}if(!e&&a['trigger_source']==='service_order_allocators'){}return c;}function buildPayoff(a,b){const c=a['recipients']['some'](h=>h['constraints']['some'](i=>i['caller_constraint'])),d=c?'Caller\x20must\x20satisfy\x20the\x20Guard\x27s\x20Signer/identity\x20binding':b==='standalone'?'Any\x20caller\x20(no\x20identity\x20binding)':'Any\x20caller\x20who\x20satisfies\x20the\x20Guard\x27s\x20object/state\x20conditions',e=a['recipients']['map'](h=>h['beneficial_owner'])['join'](';\x20')||'(none)',f={},g=a['recipients']['some'](h=>h['spec']['kind']==='signer'&&!c);return f['caller']=g?'gains':c?'conditional':'neutral',f['provider']=a['recipients']['some'](h=>h['spec']['kind']==='entity')?'gains':'conditional',f['customer']=a['recipients']['some'](h=>h['receipt']?.['object_type']==='order')?'conditional':'neutral',f['system']='neutral',{'caller_eligibility':d,'beneficial_recipient':e,'positions':f};}export const RECIPIENT_CONSTRAINT_VERSION='1.1.0';export function analyzeRecipientConstraints(a){const b=a['allocators']['map'](g=>{const h=a['guards']?.[g['guard']],i=asNode(h?.['root']),j=h?.['table']??[],k=i?extractConstraints(i,j):[],l=i?collectSlotUsages(i):[],m=g['sharing']['map'](p=>{const q=classifyRecipient(p['who']);if(!q)return{'spec':{'kind':'entity','address':'(unclassifiable)'},'constraints':k,'beneficial_owner':'Unclassifiable\x20recipient\x20—\x20check\x20allocator\x20config'};const r=q['kind']==='submission'?q['identifier']:undefined,t=r!==undefined?j['find'](v=>v['identifier']===r):undefined,u=r!==undefined?deriveReceiptRight(r,k):undefined;return{'spec':q,'slot_value_type':t?normalizeValueType(t['value_type']):undefined,'constraints':r!==undefined?k['filter'](v=>v['slot']===undefined||v['slot']===r):k,'receipt':u,'beneficial_owner':deriveBeneficialOwner(q,u)};}),n=buildSlotModels(j,l,g['sharing']['map'](p=>({'spec':classifyRecipient(p['who'])??{'kind':'entity','address':'(unclassifiable)'},'mode':p['mode']})),k),o={'guard':g['guard'],'recipients':m,'slots':n,'payoff':{'caller_eligibility':'','beneficial_recipient':'','positions':{}}};return o['payoff']=buildPayoff(o,a['trigger_source']),o;}),c=buildFindings(a,b),d=c['some'](g=>g['severity']==='CRITICAL')?'CRITICAL':c['some'](g=>g['severity']==='HIGH')?'HIGH':c['some'](g=>g['severity']==='MEDIUM')?'MEDIUM':'LOW',e=!c['some'](g=>g['code']==='RC-FIND-01'),f=[{'code':'RC-FIND-03','title':'Cross-allocation\x20settlement','detail':'Submitted\x20order\x20is\x20not\x20bound\x20to\x20the\x20settled\x20allocation;\x20destination\x20stays\x20at\x20an\x20order\x20owner.'},{'code':'RC-FIND-06','title':'Forced\x20settlement\x20timing','detail':'alloc\x20is\x20permissionless;\x20settlement\x20can\x20be\x20triggered\x20by\x20anyone\x20once\x20conditions\x20hold.'},{'code':'RC-RES-01','title':'Published\x20immutability','detail':'order_allocators,\x20Machine\x20and\x20Guards\x20are\x20immutable\x20after\x20publish.'},{'code':'RC-RES-03','title':'Off-chain\x20arbitration\x20backstop','detail':'No\x20on-chain\x20clawback;\x20post-incident\x20recovery\x20relies\x20on\x20arbitration.'}];return{'version':RECIPIENT_CONSTRAINT_VERSION,'scope':{'trigger_source':a['trigger_source'],'host_service':a['host_service'],'allocation':a['allocation']},'allocators':b,'findings':c,'unavoidable':f,'safe_destination':e,'overall':d,'summary':'Analyzed\x20'+b['length']+'\x20allocator(s):\x20'+c['filter'](g=>!g['unavoidable'])['length']+'\x20actionable,\x20'+(c['filter'](g=>g['unavoidable'])['length']+'\x20structural\x20finding(s).\x20Safe\x20destination:\x20'+e+'.')};}export function derivePayoffFromSharing(a,b,c){const d=asNode(c?.['root']),e=c?.['table']??[],f=d?extractConstraints(d,e):[],g=a['map'](i=>{const j=classifyRecipient(i['who'])??{'kind':'entity','address':'(unclassifiable)'},k=j['kind']==='submission'?j['identifier']:undefined,l=k!==undefined?e['find'](n=>n['identifier']===k):undefined,m=k!==undefined?deriveReceiptRight(k,f):undefined;return{'spec':j,'slot_value_type':l?normalizeValueType(l['value_type']):undefined,'constraints':k!==undefined?f['filter'](n=>n['slot']===undefined||n['slot']===k):f,'receipt':m,'beneficial_owner':deriveBeneficialOwner(j,m)};}),h={'guard':'','recipients':g,'slots':[],'payoff':{'caller_eligibility':'','beneficial_recipient':'','positions':{}}};return buildPayoff(h,b);}function normalizeValueType(a){if(typeof a==='number')return a;const b={'bool':ValueType['Bool'],'address':ValueType['Address'],'string':ValueType['String'],'u64':ValueType['U64'],'u256':ValueType['U256']};return b[a['toLowerCase']()];}export function isUnboundSignerTheft(a){return a['recipient_is_signer']&&!a['caller_identity_constrained'];}export function canonicalDoctrine(a){switch(a){case'RC-FIND-01':return{'severity':'CRITICAL','title':'Signer\x20recipient\x20without\x20caller\x20constraint\x20—\x20fund\x20theft','mitigation':'Bind\x20the\x20Signer\x20(signer==order.owner\x20or\x20signer==fixed\x20address),\x20or\x20change\x20'+'the\x20recipient\x20to\x20an\x20Entity\x20/\x20submitted\x20object\x20slot.'};case'RC-FIND-03':return{'severity':'MEDIUM','title':'Cross-allocation\x20settlement\x20residual','mitigation':'Accept\x20with\x20monitoring,\x20or\x20use\x20a\x20fixed\x20Entity\x20recipient\x20when\x20the\x20destination\x20is\x20known\x20ahead\x20of\x20time.'};case'RC-FIND-06':return{'severity':'LOW','title':'Permissionless\x20alloc\x20—\x20forced\x20settlement\x20timing','mitigation':'Monitor\x20settlements;\x20constrain\x20time-sensitivity\x20via\x20Guard\x20conditions.'};}}export const RECIPIENT_DESIGN_OPTIONS=[{'id':'entity','move_recipient':'Recipient::Entity(address)','semantics':'Funds\x20flow\x20to\x20a\x20fixed\x20address\x20(a\x20constrained\x20user\x20account\x20/\x20treasury).\x20'+'Destination\x20never\x20depends\x20on\x20the\x20caller.','required_constraints':['The\x20address\x20is\x20chosen\x20at\x20design\x20time\x20and\x20recorded\x20in\x20the\x20allocator\x20table.']},{'id':'submitted_object','move_recipient':'Recipient::GuardIdentifier(u8)','semantics':'Funds\x20flow\x20to\x20the\x20object\x20submitted\x20under\x20protocol\x20context\x20(e.g.\x20the\x20order\x20being\x20settled).\x20'+'Receivable\x20only\x20by\x20that\x20object\x27s\x20owner\x20—\x20object\x20receipt\x20=\x20owner\x20receipt.','required_constraints':['The\x20Guard\x20binds\x20the\x20submission\x27s\x20scope\x20(which\x20query/object\x20type\x20the\x20slot\x20carries).','The\x20slot\x27s\x20table\x20value\x20type\x20is\x20address\x20(enforced\x20by\x20allocator_add).'],'finding_if_unmet':'RC-FIND-02\x20/\x20RC-FIND-07'},{'id':'signer','move_recipient':'Recipient::Signer','semantics':'Funds\x20flow\x20to\x20the\x20caller\x20who\x20executes\x20the\x20permissionless\x20alloc.\x20'+'Safe\x20only\x20when\x20the\x20Guard\x20proves\x20exactly\x20who\x20the\x20caller\x20may\x20be.','required_constraints':['The\x20Guard\x20constrains\x20the\x20Signer\x20identity\x20(signer\x20==\x20a\x20fixed\x20address\x20or\x20a\x20derived\x20legitimate\x20owner).'],'finding_if_unmet':'RC-FIND-01'},{'id':'constrained_submission','move_recipient':'Recipient::GuardIdentifier(u8)','semantics':'Funds\x20flow\x20to\x20an\x20object\x20address\x20supplied\x20by\x20the\x20signer,\x20but\x20the\x20Guard\x20constrains\x20'+'both\x20the\x20submission\x20scope\x20and\x20the\x20signer\x27s\x20relation\x20to\x20it\x20(e.g.\x20the\x20signer\x20owns\x20the\x20submitted\x20order).','required_constraints':['The\x20Guard\x20binds\x20the\x20submission\x27s\x20scope\x20(object/query\x20type).','The\x20Guard\x20binds\x20the\x20signer\x20to\x20the\x20submitted\x20object.','The\x20slot\x27s\x20table\x20value\x20type\x20is\x20address\x20(enforced\x20by\x20allocator_add).'],'finding_if_unmet':'RC-FIND-01\x20/\x20RC-FIND-02\x20/\x20RC-FIND-07'}];export function recipientDesignGuidance(){return RECIPIENT_DESIGN_OPTIONS;}export const OBJECT_DRIVEABILITY=[{'object_type':'order','receive_entries':['order::owner_receive','order::owner_receive_object'],'anyone_drivable':!![],'funds_settle_to':'order.owner','rationale':'Order\x20is\x20a\x20shared\x20object\x20and\x20extraction\x20has\x20no\x20signer\x20gate;\x20'+'Receiving\x20is\x20restricted\x20to\x20objects\x20actually\x20delivered\x20to\x20that\x20order,\x20and\x20coins\x20settle\x20to\x20its\x20owner.'},{'object_type':'permission','receive_entries':['permission::owner_receive','permission::owner_receive_object'],'anyone_drivable':!![],'funds_settle_to':'permission.owner','rationale':'Permission\x20is\x20the\x20final\x20authority;\x20anyone\x20can\x20drive\x20extraction\x20of\x20funds\x20sent\x20to\x20its\x20address,\x20but\x20the\x20destination\x20is\x20its\x20owner.'},{'object_type':'service','receive_entries':['service::owner_receive','service::owner_receive_object'],'anyone_drivable':![],'permission_index':0x13f,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20319);\x20members\x20drive,\x20value\x20settles\x20to\x20the\x20organization\x20owner.'},{'object_type':'treasury','receive_entries':['treasury::owner_receive','treasury::owner_receive_object'],'anyone_drivable':![],'permission_index':0x101,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20257).'},{'object_type':'arbitration','receive_entries':['arbitration::owner_receive','arbitration::owner_receive_object'],'anyone_drivable':![],'permission_index':0x16f,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20367).'},{'object_type':'machine','receive_entries':['machine::owner_receive','machine::owner_receive_object'],'anyone_drivable':![],'permission_index':0xcf,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20207).'},{'object_type':'progress','receive_entries':['progress::owner_receive','progress::owner_receive_object'],'anyone_drivable':![],'permission_index':0xe1,'funds_settle_to':'machine\x27s\x20permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20225),\x20scoped\x20to\x20the\x20Machine\x20permission.'},{'object_type':'demand','receive_entries':['demand::owner_receive','demand::owner_receive_object'],'anyone_drivable':![],'permission_index':0x197,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20407).'},{'object_type':'contact','receive_entries':['contact::owner_receive','contact::owner_receive_object'],'anyone_drivable':![],'permission_index':0x1c6,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20454).'}];export function driveabilityOf(a){return OBJECT_DRIVEABILITY['find'](b=>b['object_type']===a);}
1
+ import{ValueType}from'@wowok/wowok';import{getGuardQueryByIdOrName}from'../schema/utils/guard-query-utils.js';function asNode(a){if(typeof a!=='object'||a===null)return null;const b=a['type'];return typeof b==='string'?a:null;}function queryMeta(a){if(typeof a!=='number'&&typeof a!=='string')return null;const b=getGuardQueryByIdOrName(a);return b?{'id':b['id'],'name':b['name']}:null;}function childNodes(a){const b=[];if(Array['isArray'](a['nodes']))a['nodes']['forEach'](d=>{const e=asNode(d);if(e)b['push'](e);});if(asNode(a['node']))b['push'](asNode(a['node']));return[a['nodeLeft'],a['nodeRight']]['forEach'](d=>{const e=asNode(d);if(e)b['push'](e);}),b;}export function classifyRecipient(a){if(typeof a!=='object'||a===null)return null;const b=a;if(typeof b['Entity']==='string')return{'kind':'entity','address':b['Entity']};const c=b['Entity'];if(c&&typeof c==='object'&&typeof c['name_or_address']==='string')return{'kind':'entity','address':c['name_or_address']};if(b['Signer']==='signer'||b['Signer']===!![])return{'kind':'signer'};if(typeof b['GuardIdentifier']==='number')return{'kind':'submission','identifier':b['GuardIdentifier']};return null;}function leafInfo(a,b){if(a['type']==='context'&&typeof a['context']==='string'){if(a['context']==='Signer')return{'kind':'signer'};if(a['context']==='Clock')return{'kind':'clock'};}if(a['type']==='query'){const c=queryMeta(a['query']),d=a['object'];if(c&&d&&typeof d['identifier']==='number')return{'kind':'query','query_name':c['name'],'query_id':c['id'],'object_identifier':d['identifier'],'convert_witness':d['convert_witness']};}if(a['type']==='identifier'){const e=typeof a['identifier']==='number'?a['identifier']:-0x1,f=b['find'](g=>g['identifier']===e);if(f){const g=typeof f['value']==='string'?f['value']:undefined;if(f['value_type']===ValueType['Address'])return{'kind':'static_address','value':g};if(f['value_type']===ValueType['String'])return{'kind':'static_string','value':g};}}return{'kind':'other'};}function comparisonLeaves(a,b){if(a['type']==='logic_equal'){const c=childNodes(a)['map'](d=>flattenLeaf(d,b));return c;}return[];}function flattenLeaf(a,b){if(a['type']==='logic_not'){const d=childNodes(a)[0x0];return d?flattenLeaf(d,b):{'kind':'other'};}return leafInfo(a,b);}function isOrderProgressWitness(a){if(a===0x64)return!![];return typeof a==='string'&&a['toLowerCase']()['includes']('orderprogress');}function describe(a){switch(a){case'service_binding':return'Submitted\x20object\x20must\x20belong\x20to\x20the\x20expected\x20service';case'progress_node_state':return'Submitted\x20order\x20must\x20be\x20at\x20a\x20qualifying\x20workflow\x20node';case'signer_is_submitted_object_owner':return'Caller\x20must\x20be\x20the\x20owner\x20of\x20the\x20submitted\x20object';case'signer_authorized_entity':return'Caller\x20must\x20equal\x20a\x20fixed\x20authorized\x20address';case'signer_permission_member':return'Caller\x20must\x20satisfy\x20a\x20Permission\x20membership\x20rule';case'time_lock':return'Current\x20time\x20must\x20satisfy\x20the\x20time-lock';case'repository_crosscheck':return'Repository\x20data\x20must\x20satisfy\x20the\x20cross-check';default:return'Other\x20guard\x20constraint';}}function extractConstraints(a,b){const c=[],d=new Set(),e=h=>{const i=h['code']+':'+(h['slot']??'-');!d['has'](i)&&(d['add'](i),c['push'](h));},f=(h,i)=>({'path':h,'queries':i}),g=(h,i)=>{const j=comparisonLeaves(h,b);if(j['length']>=0x2){const k=j['find'](r=>r['kind']==='signer'),l=j['find'](r=>r['kind']==='query'&&r['query_name']==='order.owner'),m=j['find'](r=>r['kind']==='query'&&r['query_name']==='order.service'),n=j['find'](r=>r['kind']==='query'&&r['query_name']==='progress.current'),o=j['find'](r=>r['kind']==='static_address'),p=j['find'](r=>r['kind']==='static_string');k&&l&&e({'code':'signer_is_submitted_object_owner','slot':l['object_identifier'],'description':describe('signer_is_submitted_object_owner'),'caller_constraint':!![],'evidence':f(i,['Signer','order.owner'])});k&&o&&e({'code':'signer_authorized_entity','description':describe('signer_authorized_entity'),'caller_constraint':!![],'evidence':f(i,['Signer'])});m&&o&&e({'code':'service_binding','slot':m['object_identifier'],'description':describe('service_binding'),'caller_constraint':![],'evidence':f(i,['order.service'])});if(n&&p){const r=n['object_identifier'];isOrderProgressWitness(n['convert_witness'])&&e({'code':'progress_node_state','slot':r,'description':describe('progress_node_state'),'caller_constraint':![],'evidence':f(i,['progress.current'])});}}if(h['type']['startsWith']('logic_as_u256')||h['type']==='calc_number_add'){const s=[h,...childNodes(h)]['map'](t=>flattenLeaf(t,b));if(s['some'](t=>t['kind']==='clock')&&s['some'](t=>t['kind']==='query'&&(t['query_name']==='progress.current_time'||t['query_name']==='progress.session.forward.time'))){const t=s['find'](u=>u['kind']==='query');e({'code':'time_lock','slot':t['object_identifier'],'description':describe('time_lock'),'caller_constraint':![],'evidence':f(i,['Clock',t['query_name']])});}}if(h['type']==='query'){const u=queryMeta(h['query']);if(u&&u['name']['startsWith']('repository.')){const v=h['object'];e({'code':'repository_crosscheck','slot':v?.['identifier'],'description':describe('repository_crosscheck'),'caller_constraint':![],'evidence':f(i,[u['name']])});}}childNodes(h)['forEach']((w,x)=>g(w,i+'/'+x));};return g(a,'/root'),c;}function findSessionQueries(a){const b=[],c=(d,e)=>{if(d['type']==='query'){const f=queryMeta(d['query']);if(f&&(f['id']===0x4f6||f['id']===0x4f7))b['push'](e);}childNodes(d)['forEach']((g,h)=>c(g,e+'/'+h));};return c(a,'/root'),b;}function collectSlotUsages(a){const b=[],c=(d,e)=>{if(d['type']==='query'){const f=queryMeta(d['query']),g=d['object'];f&&g&&typeof g['identifier']==='number'&&b['push']({'slot':g['identifier'],'path':e,'query_id':f['id'],'query_name':f['name'],...g['convert_witness']!==undefined?{'convert_witness':g['convert_witness']}:{}});}childNodes(d)['forEach']((h,j)=>c(h,e+'/'+j));};return c(a,'/root'),b;}function deriveReceiptRight(a,b){const c=b['find'](e=>e['code']==='progress_node_state'&&e['slot']===a),d=b['find'](e=>e['code']==='signer_is_submitted_object_owner'&&e['slot']===a);if(c||d)return{'object_type':'order','receive_entry':'order::owner_receive','guarantee':'Delivered\x20funds\x20are\x20owned\x20by\x20the\x20submitted\x20Order;\x20only\x20its\x20current\x20owner\x20can\x20'+'extract\x20them\x20(&mut\x20Order\x20input),\x20and\x20coins\x20transfer\x20to\x20that\x20owner.'};return undefined;}function deriveBeneficialOwner(a,b){switch(a['kind']){case'entity':return'Fixed\x20entity\x20'+a['address'];case'signer':return'Transaction\x20caller\x20(Signer)\x20—\x20direct\x20wallet';case'submission':return b?'Owner\x20of\x20the\x20submitted\x20object\x20at\x20table['+a['identifier']+']\x20(object\x20receipt\x20=\x20owner\x20receipt)':'Address\x20submitted\x20at\x20table['+a['identifier']+']\x20(caller-provided)';}}function buildSlotModels(a,b,c,d){const e=[...new Set(c['map'](f=>f['spec'])['filter'](f=>f['kind']==='submission')['map'](f=>f['identifier']))];return e['map'](f=>{const g=a['find'](p=>p['identifier']===f),h=g?normalizeValueType(g['value_type']):undefined,i=h===ValueType['Address'],j=b['filter'](p=>p['slot']===f),k=c['filter'](p=>p['spec']['kind']==='submission'&&p['spec']['identifier']===f)['map'](p=>p['mode']??'Unknown'),l=d['filter'](p=>p['slot']===undefined||p['slot']===f),m=deriveReceiptRight(f,d),n=l['some'](p=>p['code']==='service_binding'||p['code']==='repository_crosscheck'||p['code']==='signer_permission_member'),o=[];if(h!==undefined&&!i)o['push']('RC-FIND-07');if(!n)o['push']('RC-FIND-02');if(m?.['object_type']==='order')o['push']('RC-FIND-03');return{'identifier':f,'externally_submitted':g?.['b_submission']??!![],...h!==undefined?{'declared_value_type':h}:{},'is_address':i,'usages':j,'recipient_modes':k,'constraints':l,...m?{'receipt':m}:{},'beneficial_owner':deriveBeneficialOwner({'kind':'submission','identifier':f},m),'assessment':{'address_typed':i,'scope_bound':n,'object_receipt':m?.['object_type']==='order'},'findings':o};});}function buildSlotFinding(a,b,c){const d=a['identifier'];switch(b){case'RC-FIND-07':return{'code':b,'severity':'MEDIUM','title':'Submission\x20slot\x20'+d+'\x20is\x20not\x20address-typed','explanation':'GuardIdentifier\x20recipients\x20require\x20an\x20address-typed\x20table\x20entry\x20'+'(enforced\x20by\x20allocator_add\x20/\x20ERECIPIENT_IDENTIFIER_NOT_ADDRESS).','evidence_paths':c,'mitigation':'Set\x20the\x20slot\x20value_type\x20to\x20Address,\x20or\x20use\x20an\x20Entity\x20recipient.','unavoidable':![]};case'RC-FIND-02':return{'code':b,'severity':'HIGH','title':'Submission\x20slot\x20'+d+'\x20has\x20no\x20scope\x20binding','explanation':'Nothing\x20constrains\x20which\x20submitted\x20objects/addresses\x20qualify:\x20no\x20'+'service\x20binding,\x20repository\x20cross-check\x20or\x20permission\x20membership.\x20A\x20caller\x20'+'can\x20submit\x20arbitrary\x20qualifying-by-other-conditions\x20inputs.','evidence_paths':c,'mitigation':'Add\x20a\x20constraint\x20binding\x20the\x20slot\x20(e.g.\x20order.service\x20==\x20host\x20service).','unavoidable':![]};case'RC-FIND-03':return{'code':b,'severity':'MEDIUM','title':'Cross-allocation\x20settlement\x20residual','explanation':'The\x20submitted\x20order\x20is\x20not\x20bound\x20to\x20the\x20Allocation\x20being\x20settled\x20'+'(alloc\x20is\x20permissionless\x20and\x20allocation\x20context\x20is\x20not\x20a\x20Guard\x20input).\x20A\x20'+'caller\x20owning\x20ANY\x20qualifying\x20order\x20can\x20settle\x20OTHER\x20allocations;\x20funds\x20land\x20'+'at\x20the\x20submitted\x20order\x20and\x20are\x20receivable\x20by\x20its\x20owner.\x20Destination\x20is\x20safe\x20'+'(an\x20order\x20owner),\x20allocation\x20choice\x20is\x20the\x20residual.','evidence_paths':c,'mitigation':'Pick\x20ONE\x20resolution\x20and\x20record\x20it\x20in\x20the\x20service\x20description:\x20'+'(1)\x20competition\x20semantics\x20—\x20declare\x20that\x20any\x20qualifying\x20order\x20may\x20settle\x20'+'this\x20allocation\x20and\x20cap\x20the\x20exposure\x20(sharing\x20threshold\x20/\x20max\x20amount);\x20'+'(2)\x20Entity\x20routing\x20—\x20use\x20a\x20fixed\x20Entity\x20(treasury)\x20recipient,\x20the\x20only\x20'+'exclusive\x20choice\x20on\x20the\x20automatic\x20order_allocators\x20route\x20(trust\x20shifts\x20to\x20'+'the\x20entity\x20operator);\x20'+'(3)\x20per-order\x20pinned\x20Guards\x20—\x20abandon\x20automatic\x20order_allocators\x20and\x20attach\x20'+'a\x20per-order\x20Guard\x20pinning\x20the\x20order\x20id\x20(order.owner\x20==\x20constant),\x20the\x20'+'trustless\x20exclusive\x20route.','unavoidable':!![],'resolution_required':!![]};default:return{'code':b,'severity':'LOW','title':'Slot\x20'+d+'\x20finding\x20'+b,'explanation':'','evidence_paths':c,'mitigation':'','unavoidable':![]};}}function buildFindings(a,b){const c=[];let d=![],e=![];for(const f of b){const g=f['recipients']['flatMap'](h=>h['constraints'])['filter'](h=>h['caller_constraint']);if(g['length']>0x0)d=!![];if(f['slots']['some'](h=>h['assessment']['scope_bound']))e=!![];for(const h of f['recipients']){const i=h['constraints']['map'](j=>j['evidence']['path']);h['spec']['kind']==='signer'&&g['length']===0x0&&c['push']({'code':'RC-FIND-01','severity':'CRITICAL','title':'Signer\x20recipient\x20without\x20caller\x20constraint\x20—\x20fund\x20theft','explanation':'Funds\x20are\x20delivered\x20directly\x20to\x20the\x20transaction\x20caller,\x20but\x20the\x20Guard\x20'+'does\x20not\x20bind\x20the\x20Signer\x20to\x20an\x20authorized\x20identity.\x20Anyone\x20who\x20satisfies\x20the\x20'+'other\x20conditions\x20steals\x20the\x20funds.','evidence_paths':i,'mitigation':'Bind\x20the\x20Signer\x20(signer==order.owner\x20or\x20signer==fixed\x20address),\x20or\x20change\x20'+'the\x20recipient\x20to\x20an\x20Entity\x20/\x20submitted\x20object\x20slot.','unavoidable':![]});}for(const j of f['slots']){const k=j['constraints']['map'](l=>l['evidence']['path']);for(const l of j['findings']){c['push'](buildSlotFinding(j,l,k));}}}a['trigger_source']==='standalone'&&!d&&c['push']({'code':'RC-FIND-04','severity':'HIGH','title':'Standalone\x20allocation\x20without\x20issuer\x20identity\x20constraint','explanation':'Standalone\x20allocations\x20have\x20no\x20Service/Arbitration\x20access-control\x20layer.\x20'+'Without\x20a\x20Signer/permission\x20binding\x20in\x20the\x20Guard,\x20anyone\x20can\x20trigger\x20distribution.','evidence_paths':[],'mitigation':'Bind\x20the\x20issuer\x20(Signer==owner/admin)\x20or\x20move\x20the\x20allocation\x20into\x20a\x20Service.','unavoidable':![]});c['push']({'code':'RC-FIND-06','severity':'LOW','title':'Permissionless\x20alloc\x20—\x20forced\x20settlement\x20timing','explanation':'Once\x20the\x20Guard\x27s\x20conditions\x20are\x20satisfiable,\x20anyone\x20can\x20trigger\x20settlement\x20of\x20an\x20'+'order\x27s\x20allocation.\x20With\x20Entity/object\x20recipients\x20this\x20affects\x20timing\x20only,\x20not\x20destination.','evidence_paths':[],'mitigation':'Monitor\x20settlements;\x20constrain\x20time-sensitivity\x20via\x20Guard\x20conditions.','unavoidable':!![]});for(const [m,n]of Object['entries'](a['guards']??{})){const o=asNode(n['root']);if(!o)continue;for(const q of findSessionQueries(o)){c['push']({'code':'RC-FIND-05','severity':'MEDIUM','title':'Guard\x20'+m+'\x20uses\x20session-only\x20query\x20at\x20'+q,'explanation':'Queries\x201270/1271\x20read\x20the\x20active\x20session;\x20after\x20the\x20session\x20migrates\x20to\x20'+'history\x20the\x20query\x20aborts\x20(W_FIELD_NOT_FOUND)\x20and\x20the\x20Guard\x20permanently\x20fails.','evidence_paths':[q],'mitigation':'Use\x20progress.current_time\x20(1272)\x20or\x20history\x20queries\x20(1274-1279).','unavoidable':![]});}}for(const [s,t]of Object['entries'](a['guards']??{})){const u=(t['relies']??[])['filter'](v=>typeof v==='string'&&v);if(u['length']===0x0)continue;c['push']({'code':'RC-FIND-08','severity':'LOW','title':'Guard\x20'+s+'\x20relies\x20on\x20'+u['length']+'\x20sub-guard(s)\x20—\x20not\x20credited\x20by\x20this\x20audit','explanation':'Guard\x20composition\x20(relies,\x20one\x20level,\x20≤4,\x20'+((t['relies_logic_and']===![]?'OR':'AND')+'-logic)\x20may\x20carry\x20the\x20scope/signer\x20')+'constraints\x20in\x20the\x20relied\x20sub-guards.\x20This\x20audit\x20evaluates\x20only\x20the\x20guard\x27s\x20own\x20root:\x20'+'sub-guard\x20constraints\x20are\x20NOT\x20credited,\x20so\x20scope-binding\x20gaps\x20(RC-FIND-02)\x20may\x20be\x20'+'over-reported\x20and\x20sub-guard-only\x20conditions\x20stay\x20unverified.','evidence_paths':u,'mitigation':'Resolve\x20the\x20relied\x20sub-guards\x20and\x20verify\x20their\x20constraints\x20manually,\x20or\x20re-run\x20'+'with\x20the\x20sub-guard\x20defs\x20included\x20(read-side\x20resolvers\x20attach\x20them\x20automatically).','unavoidable':![]});}if(!e&&a['trigger_source']==='service_order_allocators'){}return c;}function buildPayoff(a,b){const c=a['recipients']['some'](h=>h['constraints']['some'](i=>i['caller_constraint'])),d=c?'Caller\x20must\x20satisfy\x20the\x20Guard\x27s\x20Signer/identity\x20binding':b==='standalone'?'Any\x20caller\x20(no\x20identity\x20binding)':'Any\x20caller\x20who\x20satisfies\x20the\x20Guard\x27s\x20object/state\x20conditions',e=a['recipients']['map'](h=>h['beneficial_owner'])['join'](';\x20')||'(none)',f={},g=a['recipients']['some'](h=>h['spec']['kind']==='signer'&&!c);return f['caller']=g?'gains':c?'conditional':'neutral',f['provider']=a['recipients']['some'](h=>h['spec']['kind']==='entity')?'gains':'conditional',f['customer']=a['recipients']['some'](h=>h['receipt']?.['object_type']==='order')?'conditional':'neutral',f['system']='neutral',{'caller_eligibility':d,'beneficial_recipient':e,'positions':f};}export const RECIPIENT_CONSTRAINT_VERSION='1.2.0';export function analyzeRecipientConstraints(a){const b=a['allocators']['map'](h=>{const i=a['guards']?.[h['guard']],j=asNode(i?.['root']),k=i?.['table']??[],l=j?extractConstraints(j,k):[],m=j?collectSlotUsages(j):[],n=h['sharing']['map'](q=>{const r=classifyRecipient(q['who']);if(!r)return{'spec':{'kind':'entity','address':'(unclassifiable)'},'constraints':l,'beneficial_owner':'Unclassifiable\x20recipient\x20—\x20check\x20allocator\x20config'};const t=r['kind']==='submission'?r['identifier']:undefined,u=t!==undefined?k['find'](w=>w['identifier']===t):undefined,v=t!==undefined?deriveReceiptRight(t,l):undefined;return{'spec':r,'slot_value_type':u?normalizeValueType(u['value_type']):undefined,'constraints':t!==undefined?l['filter'](w=>w['slot']===undefined||w['slot']===t):l,'receipt':v,'beneficial_owner':deriveBeneficialOwner(r,v)};}),o=buildSlotModels(k,m,h['sharing']['map'](q=>({'spec':classifyRecipient(q['who'])??{'kind':'entity','address':'(unclassifiable)'},'mode':q['mode']})),l),p={'guard':h['guard'],'recipients':n,'slots':o,'payoff':{'caller_eligibility':'','beneficial_recipient':'','positions':{}}};return p['payoff']=buildPayoff(p,a['trigger_source']),p;}),c=buildFindings(a,b),d=c['some'](h=>h['severity']==='CRITICAL')?'CRITICAL':c['some'](h=>h['severity']==='HIGH')?'HIGH':c['some'](h=>h['severity']==='MEDIUM')?'MEDIUM':'LOW',e=!c['some'](h=>h['code']==='RC-FIND-01'),f=c['some'](h=>h['resolution_required']),g=[{'code':'RC-FIND-03','title':'Cross-allocation\x20settlement','detail':'Submitted\x20order\x20is\x20not\x20bound\x20to\x20the\x20settled\x20allocation;\x20destination\x20stays\x20at\x20an\x20order\x20owner.'},{'code':'RC-FIND-06','title':'Forced\x20settlement\x20timing','detail':'alloc\x20is\x20permissionless;\x20settlement\x20can\x20be\x20triggered\x20by\x20anyone\x20once\x20conditions\x20hold.'},{'code':'RC-RES-01','title':'Published\x20immutability','detail':'order_allocators,\x20Machine\x20and\x20Guards\x20are\x20immutable\x20after\x20publish.'},{'code':'RC-RES-03','title':'Off-chain\x20arbitration\x20backstop','detail':'No\x20on-chain\x20clawback;\x20post-incident\x20recovery\x20relies\x20on\x20arbitration.'}];return{'version':RECIPIENT_CONSTRAINT_VERSION,'scope':{'trigger_source':a['trigger_source'],'host_service':a['host_service'],'allocation':a['allocation']},'allocators':b,'findings':c,'unavoidable':g,'safe_destination':e,'resolution_required':f,'overall':d,'summary':'Analyzed\x20'+b['length']+'\x20allocator(s):\x20'+c['filter'](h=>!h['unavoidable'])['length']+'\x20actionable,\x20'+(c['filter'](h=>h['unavoidable'])['length']+'\x20structural\x20finding(s).\x20Safe\x20destination:\x20'+e+'.')+(''+(f?'\x20Resolution\x20REQUIRED:\x20at\x20least\x20one\x20residual\x20demands\x20an\x20explicit\x20design\x20decision\x20before\x20publish.':''))};}export function derivePayoffFromSharing(a,b,c){const d=asNode(c?.['root']),e=c?.['table']??[],f=d?extractConstraints(d,e):[],g=a['map'](i=>{const j=classifyRecipient(i['who'])??{'kind':'entity','address':'(unclassifiable)'},k=j['kind']==='submission'?j['identifier']:undefined,l=k!==undefined?e['find'](n=>n['identifier']===k):undefined,m=k!==undefined?deriveReceiptRight(k,f):undefined;return{'spec':j,'slot_value_type':l?normalizeValueType(l['value_type']):undefined,'constraints':k!==undefined?f['filter'](n=>n['slot']===undefined||n['slot']===k):f,'receipt':m,'beneficial_owner':deriveBeneficialOwner(j,m)};}),h={'guard':'','recipients':g,'slots':[],'payoff':{'caller_eligibility':'','beneficial_recipient':'','positions':{}}};return buildPayoff(h,b);}function normalizeValueType(a){if(typeof a==='number')return a;const b={'bool':ValueType['Bool'],'address':ValueType['Address'],'string':ValueType['String'],'u64':ValueType['U64'],'u256':ValueType['U256']};return b[a['toLowerCase']()];}export function isUnboundSignerTheft(a){return a['recipient_is_signer']&&!a['caller_identity_constrained'];}export function canonicalDoctrine(a){switch(a){case'RC-FIND-01':return{'severity':'CRITICAL','title':'Signer\x20recipient\x20without\x20caller\x20constraint\x20—\x20fund\x20theft','mitigation':'Bind\x20the\x20Signer\x20(signer==order.owner\x20or\x20signer==fixed\x20address),\x20or\x20change\x20'+'the\x20recipient\x20to\x20an\x20Entity\x20/\x20submitted\x20object\x20slot.'};case'RC-FIND-03':return{'severity':'MEDIUM','title':'Cross-allocation\x20settlement\x20residual','mitigation':'Pick\x20ONE\x20resolution\x20and\x20record\x20it\x20in\x20the\x20service\x20description:\x20'+'(1)\x20competition\x20semantics\x20with\x20capped\x20exposure\x20(threshold\x20/\x20max\x20amount);\x20'+'(2)\x20Entity\x20routing\x20(treasury)\x20—\x20the\x20only\x20exclusive\x20choice\x20on\x20the\x20automatic\x20'+'order_allocators\x20route;\x20'+'(3)\x20per-order\x20pinned\x20Guards\x20(order.owner\x20==\x20constant)\x20—\x20the\x20trustless\x20'+'exclusive\x20route.','resolution_required':!![]};case'RC-FIND-06':return{'severity':'LOW','title':'Permissionless\x20alloc\x20—\x20forced\x20settlement\x20timing','mitigation':'Monitor\x20settlements;\x20constrain\x20time-sensitivity\x20via\x20Guard\x20conditions.'};}}export const RECIPIENT_DESIGN_OPTIONS=[{'id':'entity','move_recipient':'Recipient::Entity(address)','semantics':'Funds\x20flow\x20to\x20a\x20fixed\x20address\x20(a\x20constrained\x20user\x20account\x20/\x20treasury).\x20'+'Destination\x20never\x20depends\x20on\x20the\x20caller.','required_constraints':['The\x20address\x20is\x20chosen\x20at\x20design\x20time\x20and\x20recorded\x20in\x20the\x20allocator\x20table.']},{'id':'submitted_object','move_recipient':'Recipient::GuardIdentifier(u8)','semantics':'Funds\x20flow\x20to\x20the\x20object\x20submitted\x20under\x20protocol\x20context\x20(e.g.\x20the\x20order\x20being\x20settled).\x20'+'Receivable\x20only\x20by\x20that\x20object\x27s\x20owner\x20—\x20object\x20receipt\x20=\x20owner\x20receipt.','required_constraints':['The\x20Guard\x20binds\x20the\x20submission\x27s\x20scope\x20(which\x20query/object\x20type\x20the\x20slot\x20carries).','The\x20slot\x27s\x20table\x20value\x20type\x20is\x20address\x20(enforced\x20by\x20allocator_add).'],'finding_if_unmet':'RC-FIND-02\x20/\x20RC-FIND-07'},{'id':'signer','move_recipient':'Recipient::Signer','semantics':'Funds\x20flow\x20to\x20the\x20caller\x20who\x20executes\x20the\x20permissionless\x20alloc.\x20'+'Safe\x20only\x20when\x20the\x20Guard\x20proves\x20exactly\x20who\x20the\x20caller\x20may\x20be.','required_constraints':['The\x20Guard\x20constrains\x20the\x20Signer\x20identity\x20(signer\x20==\x20a\x20fixed\x20address\x20or\x20a\x20derived\x20legitimate\x20owner).'],'finding_if_unmet':'RC-FIND-01'},{'id':'constrained_submission','move_recipient':'Recipient::GuardIdentifier(u8)','semantics':'Funds\x20flow\x20to\x20an\x20object\x20address\x20supplied\x20by\x20the\x20signer,\x20but\x20the\x20Guard\x20constrains\x20'+'both\x20the\x20submission\x20scope\x20and\x20the\x20signer\x27s\x20relation\x20to\x20it\x20(e.g.\x20the\x20signer\x20owns\x20the\x20submitted\x20order).','required_constraints':['The\x20Guard\x20binds\x20the\x20submission\x27s\x20scope\x20(object/query\x20type).','The\x20Guard\x20binds\x20the\x20signer\x20to\x20the\x20submitted\x20object.','The\x20slot\x27s\x20table\x20value\x20type\x20is\x20address\x20(enforced\x20by\x20allocator_add).'],'finding_if_unmet':'RC-FIND-01\x20/\x20RC-FIND-02\x20/\x20RC-FIND-07'}];export function recipientDesignGuidance(){return RECIPIENT_DESIGN_OPTIONS;}export const OBJECT_DRIVEABILITY=[{'object_type':'order','receive_entries':['order::owner_receive','order::owner_receive_object'],'anyone_drivable':!![],'funds_settle_to':'order.owner','rationale':'Order\x20is\x20a\x20shared\x20object\x20and\x20extraction\x20has\x20no\x20signer\x20gate;\x20'+'Receiving\x20is\x20restricted\x20to\x20objects\x20actually\x20delivered\x20to\x20that\x20order,\x20and\x20coins\x20settle\x20to\x20its\x20owner.'},{'object_type':'permission','receive_entries':['permission::owner_receive','permission::owner_receive_object'],'anyone_drivable':!![],'funds_settle_to':'permission.owner','rationale':'Permission\x20is\x20the\x20final\x20authority;\x20anyone\x20can\x20drive\x20extraction\x20of\x20funds\x20sent\x20to\x20its\x20address,\x20but\x20the\x20destination\x20is\x20its\x20owner.'},{'object_type':'service','receive_entries':['service::owner_receive','service::owner_receive_object'],'anyone_drivable':![],'permission_index':0x13f,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20319);\x20members\x20drive,\x20value\x20settles\x20to\x20the\x20organization\x20owner.'},{'object_type':'treasury','receive_entries':['treasury::owner_receive','treasury::owner_receive_object'],'anyone_drivable':![],'permission_index':0x101,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20257).'},{'object_type':'arbitration','receive_entries':['arbitration::owner_receive','arbitration::owner_receive_object'],'anyone_drivable':![],'permission_index':0x16f,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20367).'},{'object_type':'machine','receive_entries':['machine::owner_receive','machine::owner_receive_object'],'anyone_drivable':![],'permission_index':0xcf,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20207).'},{'object_type':'progress','receive_entries':['progress::owner_receive','progress::owner_receive_object'],'anyone_drivable':![],'permission_index':0xe1,'funds_settle_to':'machine\x27s\x20permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20225),\x20scoped\x20to\x20the\x20Machine\x20permission.'},{'object_type':'demand','receive_entries':['demand::owner_receive','demand::owner_receive_object'],'anyone_drivable':![],'permission_index':0x197,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20407).'},{'object_type':'contact','receive_entries':['contact::owner_receive','contact::owner_receive_object'],'anyone_drivable':![],'permission_index':0x1c6,'funds_settle_to':'permission.owner','rationale':'Business\x20permission\x20gate\x20(index\x20454).'}];export function driveabilityOf(a){return OBJECT_DRIVEABILITY['find'](b=>b['object_type']===a);}
@@ -0,0 +1,3 @@
1
+ import { type NodeAnalyzer } from "../graph/onchain/index.js";
2
+ export declare const SERVICE_ALLOCATOR_AUDIT_NODE_ANALYZER_ID = "ALC1";
3
+ export declare const serviceAllocatorAuditNodeAnalyzer: NodeAnalyzer;
@@ -0,0 +1 @@
1
+ import{adaptNodeAnalyzer}from'../graph/onchain/index.js';import{analyzeRecipientConstraints}from'./recipient-constraint.js';export const SERVICE_ALLOCATOR_AUDIT_NODE_ANALYZER_ID='ALC1';const ROLES_FUND_RISK=['neutral','system','merchant','buyer'];function severityOf(a){if(a['severity']==='CRITICAL'||a['severity']==='HIGH')return'high';if(a['severity']==='MEDIUM')return a['resolution_required']?'high':'medium';return'low';}const COPY={'RC-FIND-01':{'title':'Fund\x20theft\x20risk:\x20Signer\x20recipient\x20without\x20caller\x20identity\x20constraint','detail':(a,b)=>'The\x20order\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20delivers\x20funds\x20directly\x20to\x20the\x20transaction\x20caller\x20'+'(Recipient::Signer)\x20but\x20binds\x20the\x20Signer\x20to\x20no\x20authorized\x20identity\x20—\x20anyone\x20satisfying\x20the\x20'+('remaining\x20conditions\x20can\x20take\x20the\x20funds\x20(rule\x20'+b['code']+',\x20evidence\x20paths\x20')+((b['evidence_paths']['join'](',\x20')||'(root)')+').'),'suggestion':'Fix\x20immediately:\x20bind\x20the\x20Signer\x20to\x20a\x20fixed\x20address\x20or\x20a\x20derived\x20identity\x20such\x20as\x20'+'order.owner,\x20or\x20switch\x20to\x20an\x20Entity\x20/\x20submitted\x20object\x20slot;\x20do\x20NOT\x20pay\x20this\x20service\x20before\x20the\x20fix.'},'RC-FIND-02':{'title':'Insufficient\x20allocation\x20condition:\x20submission\x20slot\x20has\x20no\x20scope\x20binding','detail':(a,b)=>'The\x20order\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20leaves\x20its\x20submission\x20slot\x20without\x20any\x20scope\x20'+'constraint\x20(no\x20order.service\x20binding,\x20no\x20repository\x20cross-check,\x20no\x20permission\x20membership):\x20'+('a\x20caller\x20can\x20submit\x20arbitrary\x20qualifying\x20objects/addresses\x20to\x20claim\x20the\x20funds\x20(rule\x20'+b['code']+',\x20')+('evidence\x20paths\x20'+(b['evidence_paths']['join'](',\x20')||'(root)')+').'),'suggestion':'Require\x20the\x20merchant\x20to\x20add\x20order.service\x20==\x20this\x20service\x20(query\x201563)\x20before\x20ordering;\x20'+'an\x20unbound\x20recipient\x20slot\x20can\x20be\x20claimed\x20by\x20others.'},'RC-FIND-03':{'title':'Cross-order\x20settlement\x20residual\x20(explicit\x20resolution\x20required)','detail':(a,b)=>'When\x20the\x20order\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20pays\x20the\x20submitted\x20order\x20object,\x20that\x20order\x20'+'is\x20not\x20bound\x20to\x20the\x20Allocation\x20being\x20settled\x20(alloc\x20is\x20permissionless\x20and\x20allocation\x20context\x20is\x20'+'not\x20a\x20Guard\x20input):\x20a\x20caller\x20owning\x20ANY\x20qualifying\x20order\x20can\x20settle\x20OTHER\x20allocations.\x20Funds\x20'+'still\x20land\x20at\x20the\x20submitted\x20order\x20and\x20only\x20its\x20owner\x20can\x20withdraw\x20—\x20destination\x20is\x20safe,\x20the\x20'+('pool\x20CHOICE\x20is\x20the\x20residual\x20(rule\x20'+b['code']+',\x20evidence\x20paths\x20'+(b['evidence_paths']['join'](',\x20')||'(root)')+').'),'suggestion':'Require\x20the\x20merchant\x20to\x20pick\x20ONE\x20resolution\x20and\x20record\x20it\x20in\x20the\x20service\x20description:\x20'+'(1)\x20declare\x20competition\x20semantics\x20and\x20cap\x20exposure\x20via\x20threshold/max;\x20(2)\x20switch\x20to\x20a\x20fixed\x20'+'Entity\x20(treasury)\x20recipient\x20—\x20the\x20only\x20exclusive\x20choice\x20on\x20the\x20automatic\x20order_allocators\x20route;\x20'+'(3)\x20drop\x20automatic\x20allocation\x20and\x20pin\x20a\x20per-order\x20Guard\x20(order.owner\x20==\x20constant)\x20for\x20trustless\x20'+'exclusivity.'},'RC-FIND-04':{'title':'Standalone\x20allocation\x20without\x20issuer\x20identity\x20constraint','detail':(a,b)=>'The\x20allocator\x20Guard\x20associated\x20with\x20service\x20'+a+'\x20is\x20in\x20standalone\x20form\x20(no\x20Service/arbitration\x20'+('access-control\x20layer)\x20and\x20binds\x20no\x20Signer\x20identity:\x20anyone\x20can\x20trigger\x20distribution\x20(rule\x20'+b['code']+').'),'suggestion':'Bind\x20the\x20issuer\x20(Signer\x20==\x20owner/admin)\x20or\x20move\x20the\x20allocation\x20into\x20a\x20Service\x20access-control\x20layer.'},'RC-FIND-05':{'title':'Guard\x20uses\x20session-only\x20queries\x20—\x20fails\x20permanently\x20after\x20session\x20migration','detail':(a,b)=>'The\x20order\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20uses\x20session\x20queries\x20(1270/1271)\x20at\x20'+((b['evidence_paths']['join'](',\x20')||'(root)')+':\x20after\x20the\x20session\x20migrates\x20to\x20history\x20the\x20query\x20aborts\x20')+('(W_FIELD_NOT_FOUND)\x20and\x20the\x20Guard\x20fails\x20permanently\x20—\x20allocation\x20can\x20never\x20trigger\x20(rule\x20'+b['code']+').'),'suggestion':'Require\x20the\x20merchant\x20to\x20switch\x20to\x20progress.current_time\x20(1272)\x20or\x20history\x20queries\x20(1274-1279);\x20'+'session\x20queries\x20deadlock\x20the\x20allocation.'},'RC-FIND-07':{'title':'Submission\x20slot\x20is\x20not\x20address-typed','detail':(a,b)=>'The\x20GuardIdentifier\x20recipient\x20slot\x20of\x20the\x20order\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20is\x20not\x20Address-typed:\x20'+'allocator_add\x20rejects\x20it\x20(ERECIPIENT_IDENTIFIER_NOT_ADDRESS)\x20and\x20the\x20allocation\x20config\x20is\x20invalid\x20'+('(rule\x20'+b['code']+',\x20evidence\x20paths\x20'+(b['evidence_paths']['join'](',\x20')||'(root)')+').'),'suggestion':'Change\x20the\x20slot\x20value_type\x20to\x20Address,\x20or\x20switch\x20to\x20an\x20Entity\x20recipient.'},'RC-FIND-06':{'title':'Permissionless\x20alloc\x20—\x20settlement\x20timing\x20can\x20be\x20front-run','detail':(a,b)=>'Once\x20the\x20Guard\x20conditions\x20of\x20service\x20'+a+'\x27s\x20allocation\x20hold,\x20anyone\x20can\x20trigger\x20settlement\x20'+'(alloc\x20is\x20permissionless).\x20For\x20Entity/object\x20recipients\x20this\x20affects\x20timing\x20only,\x20not\x20destination\x20'+('(rule\x20'+b['code']+').'),'suggestion':'Watch\x20settlement\x20events;\x20constrain\x20time-sensitive\x20allocations\x20via\x20Guard\x20time\x20conditions.'},'RC-FIND-08':{'title':'Guard\x20relies\x20on\x20sub-guards\x20—\x20their\x20constraints\x20are\x20NOT\x20credited\x20by\x20this\x20audit','detail':(a,b)=>'The\x20allocator\x20Guard\x20of\x20service\x20'+a+'\x20composes\x20'+b['evidence_paths']['length']+'\x20sub-guard(s)\x20via\x20relies\x20'+'(one\x20level,\x20<=4):\x20scope/signer\x20constraints\x20may\x20live\x20in\x20the\x20sub-guards.\x20This\x20audit\x20evaluates\x20only\x20'+'the\x20guard\x27s\x20own\x20expression\x20tree\x20—\x20sub-guard\x20constraints\x20are\x20NOT\x20credited,\x20so\x20scope-binding\x20gaps\x20'+('(RC-FIND-02)\x20may\x20be\x20over-reported\x20and\x20sub-guard-only\x20conditions\x20stay\x20unverified\x20(rule\x20'+b['code']+').'),'suggestion':'Read\x20the\x20relied\x20sub-guards\x27\x20table\x20and\x20root\x20directly\x20on-chain\x20and\x20verify\x20their\x20constraints\x20'+'manually,\x20or\x20re-run\x20with\x20an\x20audit\x20tool\x20that\x20resolves\x20them\x20automatically.'}};function copyFor(a,b){const d=COPY[a['code']];if(d)return{'title':d['title'],'detail':d['detail'](b,a),'suggestion':d['suggestion']};return{'title':'Allocator\x20audit\x20finding\x20'+a['code'],'detail':'Order\x20allocator\x20Guard\x20of\x20service\x20'+b+':\x20'+a['title']+'.\x20'+a['explanation'],'suggestion':a['mitigation']};}function guardDefFromNode(a){const b=a?.['raw'],c=b?.['data']??b;if(!c)return undefined;return{...Array['isArray'](c['table'])?{'table':c['table']}:{},'root':c['root'],...Array['isArray'](c['relies'])?{'relies':c['relies']['filter'](e=>typeof e==='string')}:{},...typeof c['relies_logic_and']==='boolean'?{'relies_logic_and':c['relies_logic_and']}:{}};}export const serviceAllocatorAuditNodeAnalyzer=adaptNodeAnalyzer({'id':SERVICE_ALLOCATOR_AUDIT_NODE_ANALYZER_ID,'kind':'risk','objectType':'Service','inspect'(b,h){const i=b['raw'],j=i?.['data']??i;if(!j)return[];const k=j['order_allocators'],l=Array['isArray'](k?.['allocators'])?k['allocators']:undefined;if(!Array['isArray'](l)||l['length']===0x0)return[];const m=h['visibleEdges']['filter'](w=>w['from']===b['id']&&w['schema']==='service.order_allocator_guard'),n={},o=[];for(const w of m){const x=h['graph']['nodes']['get'](w['to']),y=guardDefFromNode(x);if(y&&typeof y['root']==='object'&&y['root']!==null){n[w['to']]=y;for(const z of y['relies']??[]){const A=z['toLowerCase']();if(n[A])continue;const B=guardDefFromNode(h['graph']['nodes']['get'](A));B&&typeof B['root']==='object'&&B['root']!==null?n[A]=B:o['push'](A+'\x20(guard.relies)');}}else o['push'](w['to']);}const p=[];o['length']>0x0&&p['push']({'severity':'info','title':'Allocator\x20Guard\x20evidence\x20gap:\x20expression\x20tree\x20not\x20fetched\x20—\x20fund-destination\x20audit\x20incomplete','detail':'The\x20allocation\x20template\x20of\x20service\x20'+b['id']+'\x20references\x20'+o['length']+'\x20guard(s)\x20'+('whose\x20table/root\x20were\x20not\x20fetched\x20with\x20the\x20topology\x20('+o['join'](',\x20')+'):\x20fund\x20ownership\x20')+'and\x20condition\x20sufficiency\x20cannot\x20be\x20assessed.','suggestion':'Read\x20these\x20guards\x27\x20table\x20and\x20root\x20directly\x20by\x20address\x20on-chain\x20and\x20re-audit;\x20'+'an\x20evidence\x20gap\x20is\x20not\x20a\x20pass.','roles':[...ROLES_FUND_RISK]});const q=l['map'](C=>C??{})['filter'](C=>typeof C['guard']==='string'&&C['guard'])['map'](C=>({'guard':C['guard']['toLowerCase'](),'sharing':(Array['isArray'](C['sharing'])?C['sharing']:[])['map'](D=>{const E=D??{};return{'who':E['who'],'sharing':E['sharing'],'mode':E['mode']};})}));if(q['length']===0x0)return p;const s=analyzeRecipientConstraints({'trigger_source':'service_order_allocators','host_service':b['id'],'allocators':q,'guards':n});for(const C of s['findings']){const D=copyFor(C,b['id']);p['push']({'severity':severityOf(C),'title':D['title'],'detail':D['detail'],'suggestion':D['suggestion'],'roles':[...ROLES_FUND_RISK]});}const t=new Set();for(const E of s['allocators']){for(const F of E['recipients'])t['add'](F['beneficial_owner']);}const u=!s['safe_destination']?'high':s['resolution_required']?'medium':'info';return p['push']({'severity':u,'title':'Fund\x20destination\x20and\x20condition\x20integrity:\x20'+(''+(s['safe_destination']?'destination\x20safe':'stealable\x20destination\x20exists'))+(''+(s['resolution_required']?'\x20(residual\x20requires\x20explicit\x20decision)':'')),'detail':'Service\x20'+b['id']+'\x20allocation\x20template:\x20'+q['length']+'\x20allocator(s)\x20/\x20'+(Object['keys'](n)['length']+'\x20resolved\x20guard(s).\x20Fund\x20destinations\x20=\x20')+(([...t]['join'](';\x20')||'(no\x20recipients)')+'.\x20')+((s['safe_destination']?'No\x20recipient\x20can\x20be\x20redirected\x20to\x20an\x20arbitrary\x20attacker-controlled\x20address\x20(order\x20escrow\x20'+'is\x20enforced\x20by\x20Sui\x20ownership:\x20only\x20the\x20order\x20owner\x20can\x20extract\x20via\x20owner_receive).':'WARNING:\x20an\x20unbound\x20Signer\x20direct-pay\x20path\x20exists\x20—\x20do\x20not\x20pay\x20before\x20the\x20fix.')+'\x20')+(''+s['summary']),'suggestion':s['resolution_required']?'Before\x20ordering,\x20require\x20the\x20merchant\x20to\x20pick\x20one\x20resolution\x20for\x20the\x20residual\x20(competition\x20'+'declaration\x20+\x20capped\x20exposure\x20/\x20Entity\x20treasury\x20routing\x20/\x20per-order\x20pinned\x20Guards)\x20and\x20confirm\x20'+'it\x20is\x20written\x20in\x20the\x20service\x20description.':s['safe_destination']?'Destination\x20is\x20safe;\x20verify\x20condition\x20sufficiency\x20per\x20the\x20RC\x20audit\x20suggestions\x20before\x20ordering.':'A\x20fund\x20theft\x20path\x20exists:\x20do\x20not\x20pay\x20this\x20service\x20and\x20require\x20the\x20merchant\x20to\x20fix\x20the\x20Guard.','roles':[...ROLES_FUND_RISK]}),p;}});
@@ -1 +1 @@
1
- import{adaptNodeAnalyzer}from'../graph/onchain/index.js';import{assessServiceStateRisks}from'./service-risk.js';export const SERVICE_RISK_NODE_ANALYZER_ID='SR1';const STAKEHOLDER_ROLE={'owner':'merchant','provider':'merchant','customer':'buyer','arbitrator':'arbitrator','system':'system'},COPY={'R-S-4-05':{'titleZh':()=>'履约状态:Service\x20已暂停(bPaused=true),暂停期间无法下新单','detailZh':a=>'店铺\x20'+a+'\x20当前\x20bPaused=true:商家主动暂停营业,新订单在恢复前无法提交(规则\x20R-S-4-05,证据\x20bPaused=true)。','suggestionZh':'通过\x20Messenger\x20向商家确认恢复营业时间;暂停期间不要打款下单。'},'R-S-4-06':{'titleZh':()=>'履约状态:Service\x20未发布(草稿态),市场不可见且\x20order_new\x20必失败','detailZh':a=>'店铺\x20'+a+'\x20当前\x20bPublished=false:对象仍是草稿,市场不可见,任何下单都会失败(规则\x20R-S-4-06,证据\x20bPublished=false)。','suggestionZh':'等待商家正式发布(发布不可逆,配置届时锁定)后再下单;草稿链接不构成在售承诺。'},'R-S-5-05':{'titleZh':()=>'赔付路径缺失:compensation_fund\x20有余额但未绑定任何\x20Arbitration','detailZh':(a,b)=>'店铺\x20'+a+'\x20的\x20compensation_fund\x20有余额但\x20arbitrations\x20为空:赔付须经争议→仲裁裁决→arb_withdraw\x20才能领取,'+('没有仲裁绑定意味着这笔钱没有可执行的领取路径(规则\x20R-S-5-05,证据\x20'+(b['evidence']??'')+')。'),'suggestionZh':'要求商家先绑定至少一个与店铺\x20Permission\x20不同组的\x20Arbitration\x20再下单;无争议路径的赔付承诺不可执行。'}};export const serviceRiskNodeAnalyzer=adaptNodeAnalyzer({'id':SERVICE_RISK_NODE_ANALYZER_ID,'kind':'risk','objectType':'Service','inspect'(a){const b=a['raw'],c=b?.['data']??b;if(!c)return[];const e={};if(typeof c['bPaused']==='boolean')e['current_bPaused']=c['bPaused'];if(typeof c['bPublished']==='boolean')e['current_bPublished']=c['bPublished'];if(c['compensation_fund']!=null)e['current_compensation_fund_balance']=String(c['compensation_fund']);if(Array['isArray'](c['arbitrations']))e['current_arbitrations_count']=c['arbitrations']['length'];return assessServiceStateRisks(e)['map'](f=>{const g=COPY[f['id']];return{'severity':f['level']==='CRITICAL'||f['level']==='HIGH'?'high':f['level']==='MEDIUM'?'medium':'low','titleZh':g['titleZh'](a['id'],f),'detailZh':g['detailZh'](a['id'],f),'suggestionZh':g['suggestionZh'],'roles':[...new Set(f['affected_stakeholders']['map'](h=>STAKEHOLDER_ROLE[h]))]};});}});
1
+ import{adaptNodeAnalyzer}from'../graph/onchain/index.js';import{assessServiceStateRisks}from'./service-risk.js';export const SERVICE_RISK_NODE_ANALYZER_ID='SR1';const STAKEHOLDER_ROLE={'owner':'merchant','provider':'merchant','customer':'buyer','arbitrator':'arbitrator','system':'system'},COPY={'R-S-4-05':{'title':()=>'Fulfillment\x20state:\x20Service\x20is\x20paused\x20(bPaused=true);\x20no\x20new\x20orders\x20can\x20be\x20placed\x20while\x20paused','detail':a=>'Shop\x20'+a+'\x20currently\x20has\x20bPaused=true:\x20the\x20merchant\x20paused\x20operations\x20voluntarily;\x20new\x20orders\x20cannot\x20be\x20submitted\x20until\x20it\x20resumes\x20(rule\x20R-S-4-05,\x20evidence\x20bPaused=true).','suggestion':'Ask\x20the\x20merchant\x20via\x20Messenger\x20when\x20operations\x20resume;\x20do\x20not\x20pay\x20for\x20orders\x20while\x20paused.'},'R-S-4-06':{'title':()=>'Fulfillment\x20state:\x20Service\x20is\x20unpublished\x20(draft),\x20invisible\x20to\x20the\x20market\x20and\x20order_new\x20will\x20fail','detail':a=>'Shop\x20'+a+'\x20currently\x20has\x20bPublished=false:\x20the\x20object\x20is\x20still\x20a\x20draft,\x20invisible\x20to\x20the\x20market,\x20and\x20any\x20order\x20attempt\x20fails\x20(rule\x20R-S-4-06,\x20evidence\x20bPublished=false).','suggestion':'Wait\x20for\x20the\x20merchant\x27s\x20official\x20publish\x20(publishing\x20is\x20irreversible\x20and\x20locks\x20the\x20config)\x20before\x20ordering;\x20a\x20draft\x20link\x20is\x20not\x20an\x20on-sale\x20promise.'},'R-S-5-05':{'title':()=>'Missing\x20payout\x20path:\x20compensation_fund\x20has\x20a\x20balance\x20but\x20no\x20Arbitration\x20is\x20bound','detail':(a,b)=>'Shop\x20'+a+'\x20has\x20compensation_fund\x20balance\x20but\x20empty\x20arbitrations:\x20payouts\x20require\x20dispute\x20->\x20ruling\x20->\x20arb_withdraw\x20to\x20claim,\x20'+('and\x20without\x20an\x20arbitration\x20binding\x20this\x20money\x20has\x20no\x20executable\x20claim\x20path\x20(rule\x20R-S-5-05,\x20evidence\x20'+(b['evidence']??'')+').'),'suggestion':'Require\x20the\x20merchant\x20to\x20bind\x20at\x20least\x20one\x20Arbitration\x20in\x20a\x20different\x20group\x20than\x20the\x20shop\x20Permission\x20before\x20ordering;\x20payout\x20promises\x20without\x20a\x20dispute\x20path\x20are\x20unenforceable.'}};export const serviceRiskNodeAnalyzer=adaptNodeAnalyzer({'id':SERVICE_RISK_NODE_ANALYZER_ID,'kind':'risk','objectType':'Service','inspect'(a){const b=a['raw'],c=b?.['data']??b;if(!c)return[];const e={};if(typeof c['bPaused']==='boolean')e['current_bPaused']=c['bPaused'];if(typeof c['bPublished']==='boolean')e['current_bPublished']=c['bPublished'];if(c['compensation_fund']!=null)e['current_compensation_fund_balance']=String(c['compensation_fund']);if(Array['isArray'](c['arbitrations']))e['current_arbitrations_count']=c['arbitrations']['length'];return assessServiceStateRisks(e)['map'](f=>{const g=COPY[f['id']];return{'severity':f['level']==='CRITICAL'||f['level']==='HIGH'?'high':f['level']==='MEDIUM'?'medium':'low','title':g['title'](a['id'],f),'detail':g['detail'](a['id'],f),'suggestion':g['suggestion'],'roles':[...new Set(f['affected_stakeholders']['map'](h=>STAKEHOLDER_ROLE[h]))]};});}});
@@ -1 +1 @@
1
- import{GUARD_TEMPLATES,fillGuardTemplate}from'./guard-templates.js';import{MACHINE_TEMPLATES,fillTemplate as a193a}from'./machine-templates.js';import{SERVICE_TEMPLATES,fillServiceTemplate}from'./service-templates.js';import{ORDER_TEMPLATES,fillTemplate as a193b}from'./order-templates.js';import{PROGRESS_TEMPLATES,fillProgressTemplate}from'./progress-templates.js';import{ARBITRATION_TEMPLATES,fillTemplate as a193c}from'./arbitration-templates.js';import{TREASURY_TEMPLATES,fillTemplate as a193d}from'./treasury-templates.js';import{PERMISSION_TEMPLATES,fillTemplate as a193e}from'./permission-templates.js';import{PASSPORT_TEMPLATES,fillTemplate as a193f}from'./passport-templates.js';import{ALLOCATION_TEMPLATES,fillTemplate as a193g}from'./allocation-templates.js';import{CONTACT_TEMPLATES,fillTemplate as a193h}from'./contact-templates.js';import{REWARD_TEMPLATES}from'./reward-templates.js';export const TEMPLATE_REGISTRY_VERSION=0x1;export const TEMPLATE_OBJECT_TYPES=['guard','machine','service','order','progress','arbitration','treasury','permission','passport','allocation','reward','contact'];function normalizeParam(a){return{'name':a['name'],'type':a['type'],'description':a['description']??'','required':a['required'],...a['default']!==undefined?{'default':a['default']}:{},...a['constraint']!==undefined?{'constraint':a['constraint']}:{}};}function guardMeta(a){return{'id':a['id'],'object_type':'guard','name':a['name'],'description':a['description'],'scenes':[a['scene_id']],'industries':a['applicable_industries'],'instantiable':!![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}function machineMeta(a){return{'id':a['id'],'object_type':'machine','name':a['name'],'description':a['description'],'scenes':[a['scene_id']],'industries':a['applicable_industries'],'instantiable':!![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}function bodyMeta(a,b,c,d){return{'id':a['id'],'object_type':b,'name':a['name'],'description':a['description'],'scenes':c,'industries':d,'instantiable':!![],'parameters':a['params']['map'](e=>normalizeParam(e))};}function rewardMeta(a){return{'id':a['type'],'object_type':'reward','name':a['name'],'description':a['description'],'scenes':[],'industries':[],'instantiable':![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}let REGISTRY=null,ID_COLLISIONS=[];function buildRegistry(){const a=new Map(),b=[],c=d=>{if(a['has'](d['meta']['id'])){b['push'](d['meta']['id']);return;}a['set'](d['meta']['id'],d);};for(const d of GUARD_TEMPLATES){c({'meta':guardMeta(d),'raw':d,'notes':d['creation_notes']});}for(const e of MACHINE_TEMPLATES){c({'meta':machineMeta(e),'raw':e,'notes':e['creation_notes']});}for(const f of SERVICE_TEMPLATES){c({'meta':bodyMeta(f,'service',f['applicable_scenes'],f['industry_tags']),'raw':f,'notes':f['notes']});}for(const g of ORDER_TEMPLATES){c({'meta':bodyMeta(g,'order',g['applicable_scenes'],g['industry_tags']),'raw':g,'notes':g['notes']});}for(const h of PROGRESS_TEMPLATES){c({'meta':bodyMeta(h,'progress',h['applicable_scenes'],h['industry_tags']),'raw':h,'notes':h['notes']});}for(const i of ARBITRATION_TEMPLATES){c({'meta':bodyMeta(i,'arbitration',i['applicable_scenes'],i['industry_tags']),'raw':i,'notes':i['notes']});}for(const j of TREASURY_TEMPLATES){c({'meta':bodyMeta(j,'treasury',j['applicable_scenes'],j['industry_tags']),'raw':j,'notes':j['notes']});}for(const k of PERMISSION_TEMPLATES){c({'meta':bodyMeta(k,'permission',k['applicable_scenes'],k['industry_tags']),'raw':k,'notes':k['notes']});}for(const l of PASSPORT_TEMPLATES){c({'meta':bodyMeta(l,'passport',l['applicable_scenarios'],l['industry_tags']),'raw':l,'notes':l['notes']});}for(const m of ALLOCATION_TEMPLATES){c({'meta':bodyMeta(m,'allocation',m['applicable_scenes'],m['industry_tags']),'raw':m,'notes':m['notes']});}for(const n of REWARD_TEMPLATES){c({'meta':rewardMeta(n),'raw':n,'guidance':{'guardCondition':n['guardCondition'],'amountRange':n['amountRange'],'allocationStrategy':n['allocationStrategy'],'example':n['example'],'relevantGuardOps':n['relevantGuardOps']}});}for(const o of CONTACT_TEMPLATES){c({'meta':bodyMeta(o,'contact',o['applicable_scenes'],o['industry_tags']),'raw':o,'notes':o['notes']});}return ID_COLLISIONS=b,a;}function registry(){return!REGISTRY&&(REGISTRY=buildRegistry()),REGISTRY;}export function getTemplateIdCollisions(){return registry(),ID_COLLISIONS;}export function getTemplateCounts(){const a=Object['fromEntries'](TEMPLATE_OBJECT_TYPES['map'](b=>[b,0x0]));for(const b of registry()['values']()){a[b['meta']['object_type']]+=0x1;}return a;}export function listTemplates(a){const b=[...registry()['values']()]['map'](c=>c['meta']);return a?b['filter'](c=>c['object_type']===a):b;}export function getTemplateDetail(a){const b=registry()['get'](a);if(!b)return null;return{...b['meta'],'raw':b['raw'],...b['notes']?{'notes':b['notes']}:{},...b['guidance']?{'guidance':b['guidance']}:{}};}export function findTemplateObjectType(a){return registry()['get'](a)?.['meta']['object_type']??null;}export function instantiateTemplate(a,b){const c=registry()['get'](a);if(!c)return{'ok':![],'object_type':null,'template_id':a,'error':'Template\x20not\x20found:\x20'+a+'.\x20Use\x20get_templates\x20without\x20\x27template\x27\x20to\x20list\x20all\x20template\x20ids.'};const d=c['meta']['object_type'];if(!c['meta']['instantiable'])return{'ok':![],'object_type':d,'template_id':a,'error':'Reward\x20templates\x20are\x20guidance-only\x20(prose\x20guard\x20conditions)\x20and\x20cannot\x20be\x20'+'instantiated\x20into\x20executable\x20JSON.\x20Use\x20the\x20guidance\x20payload\x20to\x20design\x20the\x20'+'Reward\x20+\x20Guard\x20manually.','guidance':c['guidance']};switch(d){case'guard':{const e=fillGuardTemplate(a,b);if(!e['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':e['error'],...e['missing']?{'missing_params':e['missing']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':{'table':e['table'],'root':e['root']},...c['notes']?{'notes':c['notes']}:{}};}case'machine':{const f=a193a(a,b);if(!f['success'])return{'ok':![],'object_type':d,'template_id':a,'error':f['validation_errors']?.['join'](';\x20')??'Machine\x20template\x20fill\x20failed',...f['missing_params']?{'missing_params':f['missing_params']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':{'nodes':f['filled_nodes'],'pairs':f['filled_pairs']},...c['notes']?{'notes':c['notes']}:{}};}case'service':{const g=fillServiceTemplate(a,b);if(!g['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':g['error']??'Service\x20template\x20fill\x20failed',...g['missing_required']?{'missing_params':g['missing_required']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':g['body'],...c['notes']?{'notes':c['notes']}:{}};}case'order':case'arbitration':case'treasury':case'permission':case'passport':case'allocation':case'progress':case'contact':{const h=fillBodyTemplate(d,a,b);if(!h['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':h['error']};return{'ok':!![],'object_type':d,'template_id':a,'body':h['body'],...c['notes']?{'notes':c['notes']}:{}};}default:return{'ok':![],'object_type':d,'template_id':a,'error':'Instantiation\x20not\x20supported\x20for\x20object_type\x20\x27'+d+'\x27'};}}function fillBodyTemplate(a,b,c){switch(a){case'order':return a193b(b,c);case'arbitration':return a193c(b,c);case'treasury':return a193d(b,c);case'permission':return a193e(b,c);case'passport':return a193f(b,c);case'allocation':return a193g(b,c);case'progress':return fillProgressTemplate(b,c);case'contact':return a193h(b,c);default:return{'ok':![],'error':'No\x20body-template\x20fill\x20for\x20\x27'+a+'\x27'};}}
1
+ import{GUARD_TEMPLATES,fillGuardTemplate}from'./guard-templates.js';import{MACHINE_TEMPLATES,fillTemplate as a195a}from'./machine-templates.js';import{SERVICE_TEMPLATES,fillServiceTemplate}from'./service-templates.js';import{ORDER_TEMPLATES,fillTemplate as a195b}from'./order-templates.js';import{PROGRESS_TEMPLATES,fillProgressTemplate}from'./progress-templates.js';import{ARBITRATION_TEMPLATES,fillTemplate as a195c}from'./arbitration-templates.js';import{TREASURY_TEMPLATES,fillTemplate as a195d}from'./treasury-templates.js';import{PERMISSION_TEMPLATES,fillTemplate as a195e}from'./permission-templates.js';import{PASSPORT_TEMPLATES,fillTemplate as a195f}from'./passport-templates.js';import{ALLOCATION_TEMPLATES,fillTemplate as a195g}from'./allocation-templates.js';import{CONTACT_TEMPLATES,fillTemplate as a195h}from'./contact-templates.js';import{REWARD_TEMPLATES}from'./reward-templates.js';export const TEMPLATE_REGISTRY_VERSION=0x1;export const TEMPLATE_OBJECT_TYPES=['guard','machine','service','order','progress','arbitration','treasury','permission','passport','allocation','reward','contact'];function normalizeParam(a){return{'name':a['name'],'type':a['type'],'description':a['description']??'','required':a['required'],...a['default']!==undefined?{'default':a['default']}:{},...a['constraint']!==undefined?{'constraint':a['constraint']}:{}};}function guardMeta(a){return{'id':a['id'],'object_type':'guard','name':a['name'],'description':a['description'],'scenes':[a['scene_id']],'industries':a['applicable_industries'],'instantiable':!![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}function machineMeta(a){return{'id':a['id'],'object_type':'machine','name':a['name'],'description':a['description'],'scenes':[a['scene_id']],'industries':a['applicable_industries'],'instantiable':!![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}function bodyMeta(a,b,c,d){return{'id':a['id'],'object_type':b,'name':a['name'],'description':a['description'],'scenes':c,'industries':d,'instantiable':!![],'parameters':a['params']['map'](e=>normalizeParam(e))};}function rewardMeta(a){return{'id':a['type'],'object_type':'reward','name':a['name'],'description':a['description'],'scenes':[],'industries':[],'instantiable':![],'parameters':a['parameters']['map'](b=>normalizeParam(b))};}let REGISTRY=null,ID_COLLISIONS=[];function buildRegistry(){const a=new Map(),b=[],c=d=>{if(a['has'](d['meta']['id'])){b['push'](d['meta']['id']);return;}a['set'](d['meta']['id'],d);};for(const d of GUARD_TEMPLATES){c({'meta':guardMeta(d),'raw':d,'notes':d['creation_notes']});}for(const e of MACHINE_TEMPLATES){c({'meta':machineMeta(e),'raw':e,'notes':e['creation_notes']});}for(const f of SERVICE_TEMPLATES){c({'meta':bodyMeta(f,'service',f['applicable_scenes'],f['industry_tags']),'raw':f,'notes':f['notes']});}for(const g of ORDER_TEMPLATES){c({'meta':bodyMeta(g,'order',g['applicable_scenes'],g['industry_tags']),'raw':g,'notes':g['notes']});}for(const h of PROGRESS_TEMPLATES){c({'meta':bodyMeta(h,'progress',h['applicable_scenes'],h['industry_tags']),'raw':h,'notes':h['notes']});}for(const i of ARBITRATION_TEMPLATES){c({'meta':bodyMeta(i,'arbitration',i['applicable_scenes'],i['industry_tags']),'raw':i,'notes':i['notes']});}for(const j of TREASURY_TEMPLATES){c({'meta':bodyMeta(j,'treasury',j['applicable_scenes'],j['industry_tags']),'raw':j,'notes':j['notes']});}for(const k of PERMISSION_TEMPLATES){c({'meta':bodyMeta(k,'permission',k['applicable_scenes'],k['industry_tags']),'raw':k,'notes':k['notes']});}for(const l of PASSPORT_TEMPLATES){c({'meta':bodyMeta(l,'passport',l['applicable_scenarios'],l['industry_tags']),'raw':l,'notes':l['notes']});}for(const m of ALLOCATION_TEMPLATES){c({'meta':bodyMeta(m,'allocation',m['applicable_scenes'],m['industry_tags']),'raw':m,'notes':m['notes']});}for(const n of REWARD_TEMPLATES){c({'meta':rewardMeta(n),'raw':n,'guidance':{'guardCondition':n['guardCondition'],'amountRange':n['amountRange'],'allocationStrategy':n['allocationStrategy'],'example':n['example'],'relevantGuardOps':n['relevantGuardOps']}});}for(const o of CONTACT_TEMPLATES){c({'meta':bodyMeta(o,'contact',o['applicable_scenes'],o['industry_tags']),'raw':o,'notes':o['notes']});}return ID_COLLISIONS=b,a;}function registry(){return!REGISTRY&&(REGISTRY=buildRegistry()),REGISTRY;}export function getTemplateIdCollisions(){return registry(),ID_COLLISIONS;}export function getTemplateCounts(){const a=Object['fromEntries'](TEMPLATE_OBJECT_TYPES['map'](b=>[b,0x0]));for(const b of registry()['values']()){a[b['meta']['object_type']]+=0x1;}return a;}export function listTemplates(a){const b=[...registry()['values']()]['map'](c=>c['meta']);return a?b['filter'](c=>c['object_type']===a):b;}export function getTemplateDetail(a){const b=registry()['get'](a);if(!b)return null;return{...b['meta'],'raw':b['raw'],...b['notes']?{'notes':b['notes']}:{},...b['guidance']?{'guidance':b['guidance']}:{}};}export function findTemplateObjectType(a){return registry()['get'](a)?.['meta']['object_type']??null;}export function instantiateTemplate(a,b){const c=registry()['get'](a);if(!c)return{'ok':![],'object_type':null,'template_id':a,'error':'Template\x20not\x20found:\x20'+a+'.\x20Use\x20get_templates\x20without\x20\x27template\x27\x20to\x20list\x20all\x20template\x20ids.'};const d=c['meta']['object_type'];if(!c['meta']['instantiable'])return{'ok':![],'object_type':d,'template_id':a,'error':'Reward\x20templates\x20are\x20guidance-only\x20(prose\x20guard\x20conditions)\x20and\x20cannot\x20be\x20'+'instantiated\x20into\x20executable\x20JSON.\x20Use\x20the\x20guidance\x20payload\x20to\x20design\x20the\x20'+'Reward\x20+\x20Guard\x20manually.','guidance':c['guidance']};switch(d){case'guard':{const e=fillGuardTemplate(a,b);if(!e['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':e['error'],...e['missing']?{'missing_params':e['missing']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':{'table':e['table'],'root':e['root']},...c['notes']?{'notes':c['notes']}:{}};}case'machine':{const f=a195a(a,b);if(!f['success'])return{'ok':![],'object_type':d,'template_id':a,'error':f['validation_errors']?.['join'](';\x20')??'Machine\x20template\x20fill\x20failed',...f['missing_params']?{'missing_params':f['missing_params']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':{'nodes':f['filled_nodes'],'pairs':f['filled_pairs']},...c['notes']?{'notes':c['notes']}:{}};}case'service':{const g=fillServiceTemplate(a,b);if(!g['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':g['error']??'Service\x20template\x20fill\x20failed',...g['missing_required']?{'missing_params':g['missing_required']}:{}};return{'ok':!![],'object_type':d,'template_id':a,'body':g['body'],...c['notes']?{'notes':c['notes']}:{}};}case'order':case'arbitration':case'treasury':case'permission':case'passport':case'allocation':case'progress':case'contact':{const h=fillBodyTemplate(d,a,b);if(!h['ok'])return{'ok':![],'object_type':d,'template_id':a,'error':h['error']};return{'ok':!![],'object_type':d,'template_id':a,'body':h['body'],...c['notes']?{'notes':c['notes']}:{}};}default:return{'ok':![],'object_type':d,'template_id':a,'error':'Instantiation\x20not\x20supported\x20for\x20object_type\x20\x27'+d+'\x27'};}}function fillBodyTemplate(a,b,c){switch(a){case'order':return a195b(b,c);case'arbitration':return a195c(b,c);case'treasury':return a195d(b,c);case'permission':return a195e(b,c);case'passport':return a195f(b,c);case'allocation':return a195g(b,c);case'progress':return fillProgressTemplate(b,c);case'contact':return a195h(b,c);default:return{'ok':![],'error':'No\x20body-template\x20fill\x20for\x20\x27'+a+'\x27'};}}
@@ -96,7 +96,9 @@ export interface EnrichOptions {
96
96
  op?: string;
97
97
  };
98
98
  noCache?: boolean;
99
+ txResult?: unknown;
99
100
  }
101
+ export declare function extractObjectVersionFromTx(txResult: unknown, objectAddr: string): string | undefined;
100
102
  export interface EnrichResult {
101
103
  guidance?: GuidanceResult;
102
104
  receipt?: ReceiptResult;
@@ -1 +1 @@
1
- import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){const e=recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const g=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(g):shortAddr(g),'recommended_call':e};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':e};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':e};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0],d=c?.['data']??c;if((c?.['type']??d?.['type'])!=='Progress')return undefined;const e=d['current']??'',f=d['machine'],g=Array['isArray'](d['session'])?d['session']:[],h=(Array['isArray'](d['namedOperator'])?d['namedOperator']['find'](u=>u?.['name']==='')?.['operators']:undefined)??[];if(!f)return undefined;const i=await fetchMachineNodes(f,a['network'],![]);let j,k;try{const u=await batchQueryObjectsByIds([f],a['network'],a['noCache']),v=u[0x0],w=v?.['data']??v,x=w?.['permission'];if(x){const y=await batchQueryObjectsByIds([x],a['network'],a['noCache']),z=y[0x0];j=(z?.['data']??z)?.['description']??undefined,k=await fetchPermissionContext(x,a['network'],a['noCache']);}}catch{}const l=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](A=>({'name':String(A?.['name']??''),'operators':(A?.['operators']??[])['map'](B=>String(B))}));let m;d['task']&&(m=await fetchOrderContext(d['task'],a['network'],a['noCache']));const n=m?Array['from'](new Set([m['builder'],...m['agent']])['values']()):h;let o;try{o=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{o=undefined;}const p=await makeNameResolver([a['accountName'],...n]),q={'current':e,'nodes':i,'caller':a['accountName'],'callerAddress':o,'orderHolderAddresses':n,'progressNamedOperator':l,'permissionContext':k,'orderContext':m,'permissionDescription':j,'nameResolver':p},r=buildWorkflowGuidance(q);let s;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(s=buildWorkflowReceipt({...q,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':g}));const t=[s?renderReceiptText(s):undefined,r['options']['length']&&!s?.['next_guidance']?.['options']['length']?renderGuidanceText(r):undefined]['filter'](A=>!!A)['join']('\x0a\x0a');return{'guidance':r,'receipt':s,'text':t};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
1
+ import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){const e=recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const g=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(g):shortAddr(g),'recommended_call':e};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':e};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':e};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export function extractObjectVersionFromTx(a,b){if(!a||typeof a!=='object')return undefined;const d=a,e=d['effects']?.['objectChanges']??d['objectChanges'];if(!Array['isArray'](e))return undefined;const f=b['toLowerCase']();for(const g of e){if(typeof g?.['object']!=='string'||String(g['object'])['toLowerCase']()!==f)continue;if(g['version']!==undefined&&g['version']!==null)return String(g['version']);}return undefined;}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=async()=>(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0];let d=await c();const e=extractObjectVersionFromTx(a['txResult'],b);for(let w=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&w<0x2;w++){await new Promise(y=>setTimeout(y,0x258));const x=await c();if(x)d=x;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;const g=f['current']??'',h=f['machine'],i=Array['isArray'](f['session'])?f['session']:[],j=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](y=>y?.['name']==='')?.['operators']:undefined)??[];if(!h)return undefined;const k=await fetchMachineNodes(h,a['network'],![]);let l,m;try{const y=await batchQueryObjectsByIds([h],a['network'],a['noCache']),z=y[0x0],A=z?.['data']??z,B=A?.['permission'];if(B){const C=await batchQueryObjectsByIds([B],a['network'],a['noCache']),D=C[0x0];l=(D?.['data']??D)?.['description']??undefined,m=await fetchPermissionContext(B,a['network'],a['noCache']);}}catch{}const n=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](E=>({'name':String(E?.['name']??''),'operators':(E?.['operators']??[])['map'](F=>String(F))}));let o;f['task']&&(o=await fetchOrderContext(f['task'],a['network'],a['noCache']));const p=o?Array['from'](new Set([o['builder'],...o['agent']])['values']()):j;let q;try{q=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{q=undefined;}const r=await makeNameResolver([a['accountName'],...p]),s={'current':g,'nodes':k,'caller':a['accountName'],'callerAddress':q,'orderHolderAddresses':p,'progressNamedOperator':n,'permissionContext':m,'orderContext':o,'permissionDescription':l,'nameResolver':r},t=buildWorkflowGuidance(s);let u;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(u=buildWorkflowReceipt({...s,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':i}));const v=[u?renderReceiptText(u):undefined,t['options']['length']&&!u?.['next_guidance']?.['options']['length']?renderGuidanceText(t):undefined]['filter'](E=>!!E)['join']('\x0a\x0a');return{'guidance':t,'receipt':u,'text':v};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
@@ -1 +1 @@
1
- import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a207a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a207a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
1
+ import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a209a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a209a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
@@ -1 +1 @@
1
- export const STRATEGY_LEVER_MAP={'sales_priority':['discount','reward'],'profit_priority':['discount','machine_design'],'buyer_screening':['buy_guard'],'gross_margin_control':['discount','machine_design']};const LEVER_ACTION={'discount':'issue/limit\x20Service.discount\x20coupons\x20(DISCOUNT_TYPE_RATES/MINUS)\x20to\x20steer\x20SKU\x20volume\x20vs\x20margin','reward':'bind\x20a\x20Reward\x20to\x20Service.rewards\x20and\x20gate\x20it\x20by\x20a\x20Guard\x20to\x20incentivize\x20the\x20target\x20segment','buy_guard':'set\x20Service.buy_guard\x20(post-publish\x20mutable)\x20to\x20qualify/restrict\x20eligible\x20buyers','machine_design':'adjust\x20Machine\x20topology/guards\x20(design-time)\x20to\x20enforce\x20the\x20target\x20acceptance\x20flow'};export function resolveObjective(a){if(!a)return null;const b=a['toLowerCase']();if(/(margin|profit|毛利率|利润)/['test'](b))return'gross_margin_control';if(/(volume|sales|销量|sell more|销量优先)/['test'](b))return'sales_priority';if(/(screen|qualify|filter|筛选|筛选购买人|eligible buyer)/['test'](b))return'buyer_screening';if(/(profit first|利润优先|margin first)/['test'](b))return'profit_priority';return null;}export function buildStrategyIntent(a,b,c){return{'objective':a,'metrics':c??[],'levers':STRATEGY_LEVER_MAP[a]??[],'target':b??''};}export function suggestLevers(a){return a['levers']['map'](b=>({'lever':b,'objective':a['objective'],'action':LEVER_ACTION[b],'target':a['target']}));}export function resolveStrategyIntents(a,b){if(a!=='merchant')return[];const c=[];for(const d of b??[]){const e=resolveObjective(d);if(e)c['push'](buildStrategyIntent(e,d));}return c;}
1
+ export const STRATEGY_LEVER_MAP={'sales_priority':['discount','reward'],'profit_priority':['discount','machine_design'],'buyer_screening':['buy_guard'],'gross_margin_control':['discount','machine_design']};const LEVER_ACTION={'discount':'issue/limit\x20Service.discount\x20coupons\x20(DISCOUNT_TYPE_RATES/MINUS)\x20to\x20steer\x20SKU\x20volume\x20vs\x20margin','reward':'bind\x20a\x20Reward\x20to\x20Service.rewards\x20and\x20gate\x20it\x20by\x20a\x20Guard\x20to\x20incentivize\x20the\x20target\x20segment','buy_guard':'set\x20Service.buy_guard\x20(post-publish\x20mutable)\x20to\x20qualify/restrict\x20eligible\x20buyers','machine_design':'adjust\x20Machine\x20topology/guards\x20(design-time)\x20to\x20enforce\x20the\x20target\x20acceptance\x20flow'};export function resolveObjective(a){if(!a)return null;const b=a['toLowerCase']();if(/(margin|profit)/['test'](b))return'gross_margin_control';if(/(volume|sales|sell more)/['test'](b))return'sales_priority';if(/(screen|qualify|filter|eligible buyer)/['test'](b))return'buyer_screening';if(/(profit first|margin first)/['test'](b))return'profit_priority';return null;}export function buildStrategyIntent(a,b,c){return{'objective':a,'metrics':c??[],'levers':STRATEGY_LEVER_MAP[a]??[],'target':b??''};}export function suggestLevers(a){return a['levers']['map'](b=>({'lever':b,'objective':a['objective'],'action':LEVER_ACTION[b],'target':a['target']}));}export function resolveStrategyIntents(a,b){if(a!=='merchant')return[];const c=[];for(const d of b??[]){const e=resolveObjective(d);if(e)c['push'](buildStrategyIntent(e,d));}return c;}
@@ -1 +1 @@
1
- import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a241a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a241b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a241c,checkPuzzleCompleteness as a241d}from'../../knowledge/permission-puzzle.js';const KEYWORD_TABLE=[{'category':'Product/Service','keywords_zh':['product','selling','sell','sales','store','open\x20shop'],'keywords_en':['sell','product','sale','shop','store'],'objects':['service','order','progress'],'required_level':'R','scene_id':'retail'},{'category':'Subscription','keywords_zh':['subscription','cycle','renewal'],'keywords_en':['subscribe','recurring','subscription'],'objects':['service','machine','reward'],'required_level':'C','scene_id':'subscription'},{'category':'Rental','keywords_zh':['rent','lease','return'],'keywords_en':['rent','lease','return'],'objects':['service','machine','arb'],'required_level':'C','scene_id':'rental_return'},{'category':'Trust','keywords_zh':['deposit','pledge','verify','trust'],'keywords_en':['deposit','trust','verify'],'objects':['guard','permission','treasury'],'required_level':'R','scene_id':'trust_deposit'},{'category':'Funds','keywords_zh':['split','collect','share\x20profit','income','incentive'],'keywords_en':['split','revenue','reward'],'objects':['allocation','treasury','reward'],'required_level':'R','scene_id':'revenue_split'},{'category':'Workflow','keywords_zh':['node','stage','process','workflow'],'keywords_en':['workflow','stage','node'],'objects':['machine','progress'],'required_level':'R','scene_id':'workflow'},{'category':'Dispute','keywords_zh':['arbitration','refund','conflict','rights\x20protection'],'keywords_en':['arbitration','refund','dispute'],'objects':['arb','proof'],'required_level':'C','scene_id':'arbitration_dispute'},{'category':'Contact','keywords_zh':['customer\x20service','contact','communication'],'keywords_en':['contact','support','im'],'objects':['contact'],'required_level':'C','scene_id':'contact_im'},{'category':'Data','keywords_zh':['evidence','record','data'],'keywords_en':['evidence','record','data'],'objects':['repository','proof'],'required_level':'C','scene_id':'evidence_record'},{'category':'User\x20Profile','keywords_zh':['personal\x20info','preference','privacy'],'keywords_en':['personal','profile','privacy'],'objects':['personal','contact'],'required_level':'OPTIONAL','scene_id':'user_profile'},{'category':'Demand\x20Submission','keywords_zh':['demand','publish','inquiry'],'keywords_en':['demand','request','inquiry'],'objects':['demand'],'required_level':'OPTIONAL','scene_id':'demand_inquiry'}],INDUSTRY_KEYWORDS=[{'industry':'freelance','words':['freelance','outsourcing','freelance','gig']},{'industry':'rental','words':['rental','lease','rental','rent']},{'industry':'education','words':['education','course','training','education','course']},{'industry':'travel','words':['travel','tour','itinerary','travel','trip']},{'industry':'subscription','words':['subscription','cycle','subscription','recurring']}];function buildPuzzleDispatch(){const a=(c,d)=>{try{return c(d);}catch{return undefined;}},b=(c,d)=>{if(!c)return{'missing':[],'complete':![],'next_step':'init\x20failed'};try{return d(c);}catch{return{'missing':[],'complete':![],'next_step':'check\x20failed'};}};return{'service':{'init':c=>a(initServicePuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkServicePuzzleCompleteness)},'machine':{'init':c=>a(initMachinePuzzleFromIntent,c),'check':c=>b(c,checkMachinePuzzleCompleteness)},'allocation':{'init':c=>a(initAllocationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkAllocationPuzzleCompleteness)},'treasury':{'init':c=>a(initTreasuryPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkTreasuryPuzzleCompleteness)},'arb':{'init':c=>a(initArbitrationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkArbitrationPuzzleCompleteness)},'reward':{'init':c=>a(initRewardPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkRewardPuzzleCompleteness)},'progress':{'init':c=>a(initProgressPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkProgressPuzzleCompleteness)},'order':{'init':c=>a(initOrderPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkOrderPuzzleCompleteness)},'permission':{'init':c=>a(a241c,{'primary_goal':c}),'check':c=>b(c,a241d)},'guard':{'init':c=>a(a241a,{'primary_goal':c}),'check':c=>b(c,a241b)}};}export function extractKeywords(a){if(!a||typeof a!=='string')return[];const b=[];for(const c of KEYWORD_TABLE){const d=[...c['keywords_zh'],...c['keywords_en']];for(const e of d){try{const f=new RegExp(escapeRegex(e),'gi'),g=(a['match'](f)||[])['length'];g>0x0&&b['push']({'keyword':e,'category':c['category'],'matched_objects':[...c['objects']],'required_level':c['required_level'],'match_count':g});}catch{}}}return b['sort']((h,i)=>i['match_count']-h['match_count']),b;}function escapeRegex(a){return a['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function resolveIndustry(a,b){const c=((a??'')+'\x20'+(b??''))['toLowerCase']();for(const d of INDUSTRY_KEYWORDS){for(const e of d['words']){if(c['includes'](e['toLowerCase']()))return d['industry'];}}return'general';}export function identifyObjects(a,b){if(b['length']===0x0)return{'primary':'service','secondary':['permission','machine','progress'],'scenes':[{'object':'service','scene_id':'general'}]};const c=b['find'](i=>i['required_level']==='R'),d=(c??b[0x0])['matched_objects'][0x0],e=new Set([d]),f=[];for(const i of b){for(const j of i['matched_objects']){!e['has'](j)&&(e['add'](j),f['push'](j));}}const g=[],h=new Set();for(const k of KEYWORD_TABLE){const l=b['find'](n=>n['category']===k['category']);if(!l)continue;if(h['has'](k['scene_id']))continue;h['add'](k['scene_id']),g['push']({'object':k['objects'][0x0],'scene_id':k['scene_id']});}return{'primary':d,'secondary':f,'scenes':g};}export function analyzeBusinessIntent(a){const b=[];if(!a||!a['user_intent']||typeof a['user_intent']!=='string')return{'intent_parsed':{'primary_object':'service','secondary_objects':[],'detected_scenes':[],'industry':'general','keyword_matches':[]},'puzzles':{},'overall_completeness':'empty','next_step':'Please\x20provide\x20a\x20non-empty\x20business\x20intent.','recommended_creation_order':[],'warnings':['input.user_intent\x20is\x20empty']};const c=a['user_intent'],e=extractKeywords(c),f=resolveIndustry(c,a['industry']),{primary:g,secondary:h,scenes:i}=identifyObjects(c,e);let j=[g,...h];if(a['target_objects']&&a['target_objects']['length']>0x0){const p=a['target_objects']['filter'](q=>['service','machine','guard','permission','reward','arb','progress','treasury','demand','repository','contact','order','allocation','personal','payment','proof']['includes'](q));if(p['length']>0x0)j=p;}const k=buildPuzzleDispatch(),l={};for(const q of j){const r=k[q];if(!r){b['push']('No\x20puzzle\x20module\x20for\x20\x27'+q+'\x27\x20—\x20skipped\x20(L3\x20object)');continue;}const s=r['init'](c),t=s?r['check'](s):undefined,u=extractMissingDimensions(t);l[q]={'puzzle':s,'completeness':t,'missing_dimensions':u},!s&&b['push']('Puzzle\x20init\x20failed\x20for\x20\x27'+q+'\x27');}const m=aggregatePuzzleCompleteness(l),n=suggestNextPuzzleStep({'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':'','recommended_creation_order':[],'warnings':b}),o=['permission','progress','machine','guard','allocation','service'];return{'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':n,'recommended_creation_order':o,'warnings':b};}function extractMissingDimensions(a){if(!a||typeof a!=='object')return[];const b=a,d=b['missing'];if(Array['isArray'](d))return d['map'](f=>String(f));const e=b['missing_details'];if(Array['isArray'](e))return e['map'](f=>String(f?.['dimension']??f));return[];}export function aggregatePuzzleCompleteness(a){const b=Object['values'](a??{});if(b['length']===0x0)return'empty';const c=b['filter'](f=>!f['puzzle'])['length'];if(c===b['length'])return'empty';const d=b['reduce']((f,g)=>f+(g['missing_dimensions']?.['length']??0x0),0x0);if(d===0x0)return'complete';return'partial';}export function suggestNextPuzzleStep(a){if(!a)return'No\x20result\x20to\x20suggest\x20from.';if(a['overall_completeness']==='complete')return'All\x20puzzle\x20dimensions\x20are\x20complete\x20—\x20ready\x20for\x20risk\x20calibration\x20(stage\x203).';if(a['overall_completeness']==='empty')return'No\x20puzzle\x20has\x20been\x20initialized.\x20Provide\x20more\x20concrete\x20business\x20intent\x20so\x20the\x20primary\x20object\x20can\x20be\x20identified.';const b=['permission','treasury','allocation','guard','machine','service','order','progress','arb','reward','proof','repository','demand','contact','personal','payment'],d=a['puzzles']??{},e=b['filter'](f=>d[f]);for(const f of e){const g=d[f];if(!g)continue;const h=g['missing_dimensions']??[];if(h['length']===0x0)continue;const i=g['completeness'],j=i&&typeof i==='object'?i['next_step']:undefined;if(typeof j==='string'&&j['trim']())return'['+f+']\x20'+j;return'['+f+']\x20Complete\x20dimension'+(h['length']>0x1?'s':'')+'\x20'+h['join'](',\x20')+'\x20to\x20advance\x20the\x20puzzle.';}return'Continue\x20dialog\x20to\x20fill\x20remaining\x20pending\x20fields.';}
1
+ import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a243a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a243b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a243c,checkPuzzleCompleteness as a243d}from'../../knowledge/permission-puzzle.js';const KEYWORD_TABLE=[{'category':'Product/Service','keywords_zh':['product','selling','sell','sales','store','open\x20shop'],'keywords_en':['sell','product','sale','shop','store'],'objects':['service','order','progress'],'required_level':'R','scene_id':'retail'},{'category':'Subscription','keywords_zh':['subscription','cycle','renewal'],'keywords_en':['subscribe','recurring','subscription'],'objects':['service','machine','reward'],'required_level':'C','scene_id':'subscription'},{'category':'Rental','keywords_zh':['rent','lease','return'],'keywords_en':['rent','lease','return'],'objects':['service','machine','arb'],'required_level':'C','scene_id':'rental_return'},{'category':'Trust','keywords_zh':['deposit','pledge','verify','trust'],'keywords_en':['deposit','trust','verify'],'objects':['guard','permission','treasury'],'required_level':'R','scene_id':'trust_deposit'},{'category':'Funds','keywords_zh':['split','collect','share\x20profit','income','incentive'],'keywords_en':['split','revenue','reward'],'objects':['allocation','treasury','reward'],'required_level':'R','scene_id':'revenue_split'},{'category':'Workflow','keywords_zh':['node','stage','process','workflow'],'keywords_en':['workflow','stage','node'],'objects':['machine','progress'],'required_level':'R','scene_id':'workflow'},{'category':'Dispute','keywords_zh':['arbitration','refund','conflict','rights\x20protection'],'keywords_en':['arbitration','refund','dispute'],'objects':['arb','proof'],'required_level':'C','scene_id':'arbitration_dispute'},{'category':'Contact','keywords_zh':['customer\x20service','contact','communication'],'keywords_en':['contact','support','im'],'objects':['contact'],'required_level':'C','scene_id':'contact_im'},{'category':'Data','keywords_zh':['evidence','record','data'],'keywords_en':['evidence','record','data'],'objects':['repository','proof'],'required_level':'C','scene_id':'evidence_record'},{'category':'User\x20Profile','keywords_zh':['personal\x20info','preference','privacy'],'keywords_en':['personal','profile','privacy'],'objects':['personal','contact'],'required_level':'OPTIONAL','scene_id':'user_profile'},{'category':'Demand\x20Submission','keywords_zh':['demand','publish','inquiry'],'keywords_en':['demand','request','inquiry'],'objects':['demand'],'required_level':'OPTIONAL','scene_id':'demand_inquiry'}],INDUSTRY_KEYWORDS=[{'industry':'freelance','words':['freelance','outsourcing','freelance','gig']},{'industry':'rental','words':['rental','lease','rental','rent']},{'industry':'education','words':['education','course','training','education','course']},{'industry':'travel','words':['travel','tour','itinerary','travel','trip']},{'industry':'subscription','words':['subscription','cycle','subscription','recurring']}];function buildPuzzleDispatch(){const a=(c,d)=>{try{return c(d);}catch{return undefined;}},b=(c,d)=>{if(!c)return{'missing':[],'complete':![],'next_step':'init\x20failed'};try{return d(c);}catch{return{'missing':[],'complete':![],'next_step':'check\x20failed'};}};return{'service':{'init':c=>a(initServicePuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkServicePuzzleCompleteness)},'machine':{'init':c=>a(initMachinePuzzleFromIntent,c),'check':c=>b(c,checkMachinePuzzleCompleteness)},'allocation':{'init':c=>a(initAllocationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkAllocationPuzzleCompleteness)},'treasury':{'init':c=>a(initTreasuryPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkTreasuryPuzzleCompleteness)},'arb':{'init':c=>a(initArbitrationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkArbitrationPuzzleCompleteness)},'reward':{'init':c=>a(initRewardPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkRewardPuzzleCompleteness)},'progress':{'init':c=>a(initProgressPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkProgressPuzzleCompleteness)},'order':{'init':c=>a(initOrderPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkOrderPuzzleCompleteness)},'permission':{'init':c=>a(a243c,{'primary_goal':c}),'check':c=>b(c,a243d)},'guard':{'init':c=>a(a243a,{'primary_goal':c}),'check':c=>b(c,a243b)}};}export function extractKeywords(a){if(!a||typeof a!=='string')return[];const b=[];for(const c of KEYWORD_TABLE){const d=[...c['keywords_zh'],...c['keywords_en']];for(const e of d){try{const f=new RegExp(escapeRegex(e),'gi'),g=(a['match'](f)||[])['length'];g>0x0&&b['push']({'keyword':e,'category':c['category'],'matched_objects':[...c['objects']],'required_level':c['required_level'],'match_count':g});}catch{}}}return b['sort']((h,i)=>i['match_count']-h['match_count']),b;}function escapeRegex(a){return a['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function resolveIndustry(a,b){const c=((a??'')+'\x20'+(b??''))['toLowerCase']();for(const d of INDUSTRY_KEYWORDS){for(const e of d['words']){if(c['includes'](e['toLowerCase']()))return d['industry'];}}return'general';}export function identifyObjects(a,b){if(b['length']===0x0)return{'primary':'service','secondary':['permission','machine','progress'],'scenes':[{'object':'service','scene_id':'general'}]};const c=b['find'](i=>i['required_level']==='R'),d=(c??b[0x0])['matched_objects'][0x0],e=new Set([d]),f=[];for(const i of b){for(const j of i['matched_objects']){!e['has'](j)&&(e['add'](j),f['push'](j));}}const g=[],h=new Set();for(const k of KEYWORD_TABLE){const l=b['find'](n=>n['category']===k['category']);if(!l)continue;if(h['has'](k['scene_id']))continue;h['add'](k['scene_id']),g['push']({'object':k['objects'][0x0],'scene_id':k['scene_id']});}return{'primary':d,'secondary':f,'scenes':g};}export function analyzeBusinessIntent(a){const b=[];if(!a||!a['user_intent']||typeof a['user_intent']!=='string')return{'intent_parsed':{'primary_object':'service','secondary_objects':[],'detected_scenes':[],'industry':'general','keyword_matches':[]},'puzzles':{},'overall_completeness':'empty','next_step':'Please\x20provide\x20a\x20non-empty\x20business\x20intent.','recommended_creation_order':[],'warnings':['input.user_intent\x20is\x20empty']};const c=a['user_intent'],e=extractKeywords(c),f=resolveIndustry(c,a['industry']),{primary:g,secondary:h,scenes:i}=identifyObjects(c,e);let j=[g,...h];if(a['target_objects']&&a['target_objects']['length']>0x0){const p=a['target_objects']['filter'](q=>['service','machine','guard','permission','reward','arb','progress','treasury','demand','repository','contact','order','allocation','personal','payment','proof']['includes'](q));if(p['length']>0x0)j=p;}const k=buildPuzzleDispatch(),l={};for(const q of j){const r=k[q];if(!r){b['push']('No\x20puzzle\x20module\x20for\x20\x27'+q+'\x27\x20—\x20skipped\x20(L3\x20object)');continue;}const s=r['init'](c),t=s?r['check'](s):undefined,u=extractMissingDimensions(t);l[q]={'puzzle':s,'completeness':t,'missing_dimensions':u},!s&&b['push']('Puzzle\x20init\x20failed\x20for\x20\x27'+q+'\x27');}const m=aggregatePuzzleCompleteness(l),n=suggestNextPuzzleStep({'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':'','recommended_creation_order':[],'warnings':b}),o=['permission','progress','machine','guard','allocation','service'];return{'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':n,'recommended_creation_order':o,'warnings':b};}function extractMissingDimensions(a){if(!a||typeof a!=='object')return[];const b=a,d=b['missing'];if(Array['isArray'](d))return d['map'](f=>String(f));const e=b['missing_details'];if(Array['isArray'](e))return e['map'](f=>String(f?.['dimension']??f));return[];}export function aggregatePuzzleCompleteness(a){const b=Object['values'](a??{});if(b['length']===0x0)return'empty';const c=b['filter'](f=>!f['puzzle'])['length'];if(c===b['length'])return'empty';const d=b['reduce']((f,g)=>f+(g['missing_dimensions']?.['length']??0x0),0x0);if(d===0x0)return'complete';return'partial';}export function suggestNextPuzzleStep(a){if(!a)return'No\x20result\x20to\x20suggest\x20from.';if(a['overall_completeness']==='complete')return'All\x20puzzle\x20dimensions\x20are\x20complete\x20—\x20ready\x20for\x20risk\x20calibration\x20(stage\x203).';if(a['overall_completeness']==='empty')return'No\x20puzzle\x20has\x20been\x20initialized.\x20Provide\x20more\x20concrete\x20business\x20intent\x20so\x20the\x20primary\x20object\x20can\x20be\x20identified.';const b=['permission','treasury','allocation','guard','machine','service','order','progress','arb','reward','proof','repository','demand','contact','personal','payment'],d=a['puzzles']??{},e=b['filter'](f=>d[f]);for(const f of e){const g=d[f];if(!g)continue;const h=g['missing_dimensions']??[];if(h['length']===0x0)continue;const i=g['completeness'],j=i&&typeof i==='object'?i['next_step']:undefined;if(typeof j==='string'&&j['trim']())return'['+f+']\x20'+j;return'['+f+']\x20Complete\x20dimension'+(h['length']>0x1?'s':'')+'\x20'+h['join'](',\x20')+'\x20to\x20advance\x20the\x20puzzle.';}return'Continue\x20dialog\x20to\x20fill\x20remaining\x20pending\x20fields.';}