@wowok/agent-mcp 3.2.1 → 3.2.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.
- package/dist/communication/wts-attestation.d.ts +34 -0
- package/dist/communication/wts-attestation.js +1 -0
- package/dist/config/judgment.d.ts +25 -0
- package/dist/config/rule-engine.d.ts +10 -0
- package/dist/config/rule-engine.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +2 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/allocation.json +31 -1
- package/dist/knowledge/builtin-templates.d.ts +3 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/entity-recipient-guard.d.ts +21 -0
- package/dist/knowledge/entity-recipient-guard.js +1 -0
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-topology.d.ts +34 -0
- package/dist/knowledge/machine-topology.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +1 -0
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +21 -0
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tool-constraints.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/index.d.ts +1 -0
- package/dist/playbooks/service-build/intent-analyzer.d.ts +1 -0
- package/dist/playbooks/service-build/intent-analyzer.js +1 -1
- package/dist/playbooks/service-build/machine-nodes.d.ts +1 -1
- package/dist/playbooks/service-build/machine-nodes.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +27 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -0
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/semantic-graph.d.ts +1 -0
- package/dist/playbooks/service-build/semantic-graph.js +1 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/call/machine.d.ts +1 -0
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +7 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +24 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +20 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +2 -0
- package/dist/schema/persona/index.d.ts +110 -0
- package/dist/schema/query/bi.d.ts +2 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/node-parser.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +109 -0
- package/dist/schemas/industry_pack_operation.schema.json +3 -1
- package/dist/schemas/messenger_operation.output.json +42 -4
- package/dist/schemas/onchain_operations.schema.json +5 -5
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_service.schema.json +3 -3
- package/dist/schemas/onchain_table_data.output.json +5 -1
- package/dist/schemas/persona_operation.output.json +266 -0
- package/dist/schemas/persona_operation.schema.json +42 -0
- package/dist/schemas/query_toolkit.output.json +1 -1
- package/dist/schemas/query_toolkit.schema.json +5 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +17 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/package.json +4 -3
|
@@ -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,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/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'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\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\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'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\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'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,f){let g;if(!e)g=a==='exception'?0x2d:0x32;else b?g=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:g=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)g+=0x14;if(d)g-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(g=Math['min'](g,0x28)),Math['max'](0x0,Math['min'](0x64,g));}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const j of a['nodes']){for(const k of j['pairs']){if(k['prev_node']!==a['current'])continue;for(const l of k['forwards']){if(!l['name'])continue;const m=resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),n=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let p=![];a['callerAddress']&&(p=accountCanExecuteForward(l,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const q=classifyNode(j['name']),r=!!a['caller'],{gains:s,risks:t}=gainsRisksFor(q,n,r),u=consistencyFor(q,n,p,!!l['guard'],r,c);b['push']({'next_node':j['name'],'forward':l['name'],'weight':l['weight'],'operator':m,'guard':l['guard'],'business_meaning':businessMeaning(j['name'],q),'gains':s,'risks':t,'consistency':u,'recommended':![]});}}}if(b['length']===0x0){const v=a['escrow'],w=v?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+v['allocation']+'\x20still\x20holds\x20'+v['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20Funds\x20are\x20NOT\x20auto-released:\x20'+(v['refund_terminal']?'this\x20is\x20a\x20refund/cancel\x20terminal,\x20so\x20the\x20escrow\x20returns\x20to\x20the\x20BUYER\x20—\x20the\x20order\x20owner\x20must\x20trigger\x20the\x20release\x20themselves\x20(a\x20Signer-type\x20recipient\x20pays\x20whoever\x20signs;\x20if\x20the\x20operator\x20triggers\x20it,\x20the\x20operator\x20receives\x20it).\x20':'this\x20is\x20a\x20completion\x20terminal,\x20so\x20the\x20payout\x20goes\x20to\x20the\x20provider\x20side.\x20')+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+v['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(v['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+v['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'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.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':w};}b['sort']((x,y)=>y['consistency']-x['consistency']);const d=b[0x0];b[0x0]={...d,'recommended':!![]};const e=[];for(const x of b){x!==d&&x['consistency']>0x0&&x['forward']!==d['forward']&&e['push']('Choosing\x20\x22'+x['forward']+'\x20→\x20'+x['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+d['forward']+'\x20→\x20'+d['next_node']+'\x22');}c&&b['some'](y=>classifyNode(y['next_node'])==='refund')&&e['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');const g=[],h=b['filter'](y=>y['operator']['kind']==='order_holder'&&y['forward']!==d['forward']&&d['forward']!==y['forward']),i=b['filter'](y=>y['operator']['account_name']&&y['operator']['account_name']!==a['caller']);return i['length']>0x0&&!b['some'](y=>y['recommended']&&y['operator']['account_name']===a['caller'])&&g['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+i[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':d['forward']+'\x20→\x20'+d['next_node'],'rationale':'Highest\x20consistency\x20('+d['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(d['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(d['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(d['operator']['role_name']??d['operator']['kind'])+(d['operator']['account_name']?'\x20('+d['operator']['account_name']+')':'')+'.'+(d['guard']?'\x20Guard\x20to\x20satisfy:\x20'+d['guard']+'.':''),'caveat':e['length']?e['join']('.\x20'):undefined},'note':g['length']?g['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(a['simulated'])c['simulated']=!![];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'],'escrow':a['escrow'],'just_advanced':b&&classifyNode(a['targetNode'])!=='refund'});if(d['options']['length']>0x0)c['next_guidance']=d;else{if(d['note'])c['note']=c['note']?c['note']+'\x20'+d['note']:d['note'];}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'));a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');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 function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}async function fetchTerminalEscrow(a,b,c,d){if(!a)return undefined;try{const e=(await batchQueryObjectsByIds([a],b,c??!![]))[0x0],f=e?.['data']??e,g=typeof f?.['allocation']==='string'?f['allocation']:undefined;if(!g)return undefined;const h=(await batchQueryObjectsByIds([g],b,c??!![]))[0x0],i=h?.['data']??h,j=typeof i?.['balance']==='bigint'?i['balance']:BigInt(i?.['balance']??0x0);if(j<=0x0n)return undefined;const k=Array['isArray'](i?.['payment'])?i['payment']:[];if(k['length']>0x0)return undefined;const l=(Array['isArray'](i?.['allocators']?.['allocators'])?i['allocators']['allocators']:[])['map'](m=>String(m?.['guard']??''))['filter'](m=>m);return{'allocation':g,'balance':j['toString'](),'guards':l,'refund_terminal':REFUND_FLAVOR_RE['test'](d)};}catch{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 z=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&z<0x2;z++){await new Promise(B=>setTimeout(B,0x258));const A=await c();if(A)d=A;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](B=>B?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const B=await batchQueryObjectsByIds([k],a['network'],a['noCache']),C=B[0x0],D=C?.['data']??C,E=D?.['permission'];if(E){const F=await batchQueryObjectsByIds([E],a['network'],a['noCache']),G=F[0x0];o=(G?.['data']??G)?.['description']??undefined,p=await fetchPermissionContext(E,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](H=>({'name':String(H?.['name']??''),'operators':(H?.['operators']??[])['map'](I=>String(I))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]),v={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let w=buildWorkflowGuidance(v);if(w['options']['length']===0x0){const H=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);H&&(v['escrow']=H,w=buildWorkflowGuidance(v));}let x;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(x=buildWorkflowReceipt({...v,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j}));const y=[x?renderReceiptText(x):undefined,w['options']['length']&&!x?.['next_guidance']?.['options']['length']?renderGuidanceText(w):undefined]['filter'](I=>!!I)['join']('\x0a\x0a');return{'guidance':w,'receipt':x,'text':y};}catch{return undefined;}}export async function resolveHoldableEdges(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=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}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,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/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'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\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\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'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\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'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,f){let g;if(!e)g=a==='exception'?0x2d:0x32;else b?g=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:g=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)g+=0x14;if(d)g-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(g=Math['min'](g,0x28)),Math['max'](0x0,Math['min'](0x64,g));}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const m of a['nodes']){for(const n of m['pairs']){if(n['prev_node']!==a['current'])continue;for(const p of n['forwards']){if(!p['name'])continue;const q=resolveOperator(p,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),r=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let s=![];a['callerAddress']&&(s=accountCanExecuteForward(p,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const t=classifyNode(m['name']),u=!!a['caller'],{gains:v,risks:w}=gainsRisksFor(t,r,u),x=consistencyFor(t,r,s,!!p['guard'],u,c);b['push']({'next_node':m['name'],'forward':p['name'],'weight':p['weight'],'operator':q,'guard':p['guard'],'business_meaning':businessMeaning(m['name'],t),'gains':v,'risks':w,'consistency':x,'recommended':![]});}}}if(b['length']===0x0){const y=a['escrow'],z=y?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+y['allocation']+'\x20still\x20holds\x20'+y['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20Funds\x20are\x20NOT\x20auto-released:\x20'+(y['refund_terminal']?'this\x20is\x20a\x20refund/cancel\x20terminal,\x20so\x20the\x20escrow\x20returns\x20to\x20the\x20BUYER\x20—\x20the\x20order\x20owner\x20must\x20trigger\x20the\x20release\x20themselves\x20(a\x20Signer-type\x20recipient\x20pays\x20whoever\x20signs;\x20if\x20the\x20operator\x20triggers\x20it,\x20the\x20operator\x20receives\x20it).\x20':'this\x20is\x20a\x20completion\x20terminal,\x20so\x20the\x20payout\x20goes\x20to\x20the\x20provider\x20side.\x20')+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+y['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(y['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+y['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'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.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':z};}const d=new Map();for(const A of b){const B=d['get'](A['forward']);if(B)B['add'](A['next_node']);else d['set'](A['forward'],new Set([A['next_node']]));}const e=[];for(const [C,D]of d){if(D['size']<0x2)continue;const E=[...D]['sort'](),F=E['some'](I=>classifyNode(I)==='refund'),G=E['some'](I=>classifyNode(I)!=='refund'),H=F&&G;e['push'](H?'CRITICAL\x20'+C:C);for(let I=0x0;I<b['length'];I++){if(b[I]['forward']!==C)continue;b[I]={...b[I],'ambiguous':{'destinations':E,'fund_conflict':H}};}}e['sort'](),b['sort']((J,K)=>K['consistency']-J['consistency']);const g=e['length']>0x0;let h;if(!g){const J=b['findIndex'](K=>!K['ambiguous']);J>=0x0&&(h={...b[J],'recommended':!![]},b[J]=h);}const j=[];for(const K of b){h&&K!==h&&K['consistency']>0x0&&K['forward']!==h['forward']&&j['push']('Choosing\x20\x22'+K['forward']+'\x20→\x20'+K['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+h['forward']+'\x20→\x20'+h['next_node']+'\x22');}c&&b['some'](L=>classifyNode(L['next_node'])==='refund')&&j['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');for(const L of b){if(!L['ambiguous'])continue;j['push']('\x22'+L['forward']+'\x22\x20is\x20AMBIGUOUS\x20from\x20\x22'+a['current']+'\x22\x20—\x20it\x20legally\x20reaches\x20'+L['ambiguous']['destinations']['join']('\x20/\x20')+'\x20'+(L['ambiguous']['fund_conflict']?'(fund\x20direction\x20DIFFERS\x20between\x20them);\x20the\x20destination\x20you\x20pass\x20in\x20next_node_name\x20decides,\x20so\x20state\x20the\x20intended\x20node\x20explicitly\x20instead\x20of\x20trusting\x20the\x20forward\x20name':';\x20state\x20the\x20intended\x20node\x20explicitly'));}const k=[],l=b['filter'](M=>M['operator']['account_name']&&M['operator']['account_name']!==a['caller']);return h&&l['length']>0x0&&!b['some'](M=>M['recommended']&&M['operator']['account_name']===a['caller'])&&k['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+l[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),e['length']>0x0&&k['push']('Machine\x20topology\x20defect\x20(P0-6):\x20forward\x20name(s)\x20'+[...new Set(e['map'](M=>M['replace'](/^CRITICAL /,'')))]['join'](',\x20')+'\x20'+'resolve\x20to\x20more\x20than\x20one\x20destination\x20from\x20this\x20node.\x20The\x20contract\x20accepts\x20any\x20of\x20them\x20(progress.move:540\x20takes\x20next_node\x20as\x20a\x20caller\x20argument;\x20'+'machine.move:182\x20only\x20forbids\x20duplicate\x20prev_node\x20WITHIN\x20one\x20node),\x20so\x20the\x20workflow\x20outcome\x20is\x20decided\x20by\x20the\x20CALLER,\x20not\x20by\x20the\x20published\x20Machine.\x20'+'Nothing\x20is\x20auto-recommended\x20for\x20these\x20forwards\x20—\x20fix\x20the\x20graph\x20by\x20giving\x20each\x20destination\x20its\x20own\x20forward\x20name.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':h?{'best':h['forward']+'\x20→\x20'+h['next_node'],'rationale':'Highest\x20consistency\x20('+h['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(h['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(h['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(h['operator']['role_name']??h['operator']['kind'])+(h['operator']['account_name']?'\x20('+h['operator']['account_name']+')':'')+'.'+(h['guard']?'\x20Guard\x20to\x20satisfy:\x20'+h['guard']+'.':''),'caveat':j['length']?j['join']('.\x20'):undefined}:{'best':undefined,'rationale':e['length']?'No\x20action\x20recommended:\x20every\x20reachable\x20forward\x20from\x20\x22'+a['current']+'\x22\x20is\x20ambiguous\x20(resolves\x20to\x20multiple\x20destinations).\x20Choose\x20the\x20destination\x20node\x20deliberately\x20—\x20do\x20not\x20let\x20the\x20forward\x20name\x20decide\x20it.':undefined,'caveat':j['length']?j['join']('.\x20'):undefined},'note':k['length']?k['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(a['simulated'])c['simulated']=!![];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'],'escrow':a['escrow'],'just_advanced':b&&classifyNode(a['targetNode'])!=='refund'});if(d['options']['length']>0x0)c['next_guidance']=d;else{if(d['note'])c['note']=c['note']?c['note']+'\x20'+d['note']:d['note'];}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']);c['ambiguous']&&d['push']('AMBIGUOUS:\x20this\x20forward\x20name\x20also\x20reaches\x20'+c['ambiguous']['destinations']['filter'](e=>e!==c['next_node'])['join'](',\x20')+(c['ambiguous']['fund_conflict']?'\x20(fund\x20direction\x20differs\x20—\x20next_node_name\x20decides)':''));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'));a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');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 function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}async function fetchTerminalEscrow(a,b,c,d){if(!a)return undefined;try{const e=(await batchQueryObjectsByIds([a],b,c??!![]))[0x0],f=e?.['data']??e,g=typeof f?.['allocation']==='string'?f['allocation']:undefined;if(!g)return undefined;const h=(await batchQueryObjectsByIds([g],b,c??!![]))[0x0],i=h?.['data']??h,j=typeof i?.['balance']==='bigint'?i['balance']:BigInt(i?.['balance']??0x0);if(j<=0x0n)return undefined;const k=Array['isArray'](i?.['payment'])?i['payment']:[];if(k['length']>0x0)return undefined;const l=(Array['isArray'](i?.['allocators']?.['allocators'])?i['allocators']['allocators']:[])['map'](m=>String(m?.['guard']??''))['filter'](m=>m);return{'allocation':g,'balance':j['toString'](),'guards':l,'refund_terminal':REFUND_FLAVOR_RE['test'](d)};}catch{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 z=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&z<0x2;z++){await new Promise(B=>setTimeout(B,0x258));const A=await c();if(A)d=A;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](B=>B?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const B=await batchQueryObjectsByIds([k],a['network'],a['noCache']),C=B[0x0],D=C?.['data']??C,E=D?.['permission'];if(E){const F=await batchQueryObjectsByIds([E],a['network'],a['noCache']),G=F[0x0];o=(G?.['data']??G)?.['description']??undefined,p=await fetchPermissionContext(E,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](H=>({'name':String(H?.['name']??''),'operators':(H?.['operators']??[])['map'](I=>String(I))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]),v={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let w=buildWorkflowGuidance(v);if(w['options']['length']===0x0){const H=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);H&&(v['escrow']=H,w=buildWorkflowGuidance(v));}let x;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(x=buildWorkflowReceipt({...v,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j}));const y=[x?renderReceiptText(x):undefined,w['options']['length']&&!x?.['next_guidance']?.['options']['length']?renderGuidanceText(w):undefined]['filter'](I=>!!I)['join']('\x0a\x0a');return{'guidance':w,'receipt':x,'text':y};}catch{return undefined;}}export async function resolveHoldableEdges(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=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}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 a258a,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)=>a258a(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 a260a,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)=>a260a(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
|
-
import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as
|
|
1
|
+
import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a297a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a297b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a297c,checkPuzzleCompleteness as a297d}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(a297c,{'primary_goal':c}),'check':c=>b(c,a297d)},'guard':{'init':c=>a(a297a,{'primary_goal':c}),'check':c=>b(c,a297b)}};}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.';}
|
|
@@ -4,6 +4,7 @@ export interface StageCacheEntry {
|
|
|
4
4
|
puzzles?: Record<string, unknown>;
|
|
5
5
|
risk_status?: string;
|
|
6
6
|
risk_can_proceed?: boolean;
|
|
7
|
+
risk_evidence_scope?: "puzzle_snapshots_only" | "object_grounded";
|
|
7
8
|
trace_coherent?: boolean;
|
|
8
9
|
trace_can_proceed?: boolean;
|
|
9
10
|
business_intent?: string;
|
|
@@ -65,6 +65,7 @@ export interface IntentAnalysisResult {
|
|
|
65
65
|
recommendedModules: string[];
|
|
66
66
|
warnings: string[];
|
|
67
67
|
}
|
|
68
|
+
export declare function inferArbitration(description: string): TrustIntent["arbitration"];
|
|
68
69
|
export declare function analyzeIntent(description: string, options?: {
|
|
69
70
|
preferredIndustry?: string;
|
|
70
71
|
currency?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{findSimilarIndustries,inferTraitsFromDescription}from'../../knowledge/industry-generalizer.js';const INTENT_KEYWORDS={'sell_service':['design','develop','consult','freelance','service','build','create','write','translate'],'sell_product':['sell','product','item','goods','merchandise','store','shop'],'sell_subscription':['subscribe','subscription','membership','monthly','recurring','creator','patron'],'rent_asset':['rent','rental','lease','borrow','car','house','apartment','equipment'],'crowdfund':['crowdfund','fund','raise','campaign','donation','backer'],'escrow':['escrow','hold','mediate','intermediary','safe','secure\x20transaction']};function classifyIntentType(a){const b=a['toLowerCase']();let c='sell_service',d=0x0;for(const [e,f]of Object['entries'](INTENT_KEYWORDS)){const g=f['filter'](h=>b['includes'](h))['length'];g>d&&(d=g,c=e);}return c;}function inferPaymentModel(a){const b=a['toLowerCase']();if(b['includes']('milestone')||b['includes']('phase')||b['includes']('stage'))return'milestone';if(b['includes']('subscription')||b['includes']('monthly')||b['includes']('recurring'))return'subscription';if(b['includes']('per\x20use')||b['includes']('hourly')||b['includes']('per\x20session'))return'per_use';if(b['includes']('escrow')||b['includes']('hold'))return'escrow';return'upfront';}function inferRefundPolicy(a){const b=a['toLowerCase']();if(b['includes']('no\x20refund')||b['includes']('non-refundable'))return'no_refund';if(b['includes']('milestone')&&b['includes']('refund'))return'milestone_prorated';if(b['includes']('full\x20refund'))return'full';return'partial';}function inferArbitration(a){const b=a['toLowerCase']();if(b['includes']('no\x20arbitration')||b['includes']('no\x20dispute'))return'none';if(b['includes']('third\x20party')||b['includes']('independent'))return'third_party';if(b['includes']('mutual'))return'mutual_pick';return'merchant_pick';}export async function analyzeIntent(a,b){const c=[],d=classifyIntentType(a),e=inferTraitsFromDescription(a),f=findSimilarIndustries(e['traits'],0x3),g=f['map'](n=>n['industry']),h=b?.['preferredIndustry']??g[0x0]??'general',i=g['includes'](h)?0.85:0.5,j=e['traits'],k={'intent':d,'industry':h,'description':a,'roles':{'merchant':{'name':'merchant','description':'Service\x20provider\x20or\x20seller','obligations':['Deliver\x20as\x20described','Maintain\x20compensation_fund\x20if\x20required','Accept\x20arbitration\x20verdicts'],'rights':['Receive\x20payment\x20upon\x20verified\x20delivery','Set\x20service\x20terms\x20before\x20publish']},'customer':{'name':'customer','description':'Buyer\x20or\x20service\x20recipient','obligations':['Pay\x20according\x20to\x20agreed\x20schedule','Provide\x20acceptance/rejection\x20within\x20timeout'],'rights':['Receive\x20deliverables\x20as\x20described','Request\x20refund\x20if\x20delivery\x20fails','Initiate\x20arbitration\x20for\x20disputes']}},'deliverables':[{'name':'main_deliverable','type':inferDeliverableType(a),'acceptanceCriteria':'To\x20be\x20defined\x20by\x20merchant\x20during\x20configuration','proofOfDelivery':'wip_hash'}],'payment':{'model':inferPaymentModel(a),'currency':b?.['currency']??'WOW','triggers':[{'event':inferPaymentModel(a)==='milestone'?'milestone\x20completion':'service\x20confirmation','guardDescription':'Guard\x20verifies\x20deliverable\x20meets\x20acceptance\x20criteria'}],'allocation':[{'recipient':'merchant','percentage':0x64},{'recipient':'platform','percentage':0x0}]},'trust':{'refundPolicy':inferRefundPolicy(a),'arbitration':inferArbitration(a),'escrow':!![],'transparency':'full'}};k['payment']['model']==='milestone'&&!a['toLowerCase']()['includes']('milestone')&&c['push']('Payment\x20model\x20inferred\x20as\x20\x27milestone\x27\x20but\x20not\x20explicitly\x20mentioned.\x20Please\x20verify.');k['trust']['arbitration']==='none'&&c['push']('No\x20arbitration\x20configured.\x20This\x20increases\x20risk\x20for\x20both\x20parties.\x20Consider\x20adding\x20independent_arbitration\x20module.');k['payment']['allocation']&&k['payment']['allocation']['some'](n=>n['recipient']==='platform'&&n['percentage']>0x0)&&c['push']('Platform\x20fee\x20>\x200\x20detected.\x20WOW\x20philosophy\x20recommends\x200%\x20platform\x20fee\x20for\x20peer-to-peer\x20transactions.');const l=a['toLowerCase']();/(refund|cancel|dispute)/['test'](l)&&k['payment']['model']==='milestone'&&c['push']('T1\x20B-1:\x20\x27refund/dispute\x27\x20must\x20be\x20modeled\x20via\x20the\x20Allocation\x20waterfall\x20(order_allocators)\x20+\x20'+'the\x20bound\x20Arbitration\x20—\x20NOT\x20a\x20Machine\x20\x27refunded\x27/\x27disputed\x27\x20node\x20(R-M1-11).');/(variable amount|dynamic amount|actual loss|assessed loss)/['test'](l)&&c['push']('T1\x20B-2:\x20a\x20variable/conditional\x20payout\x20amount\x20cannot\x20be\x20expressed\x20in\x20Allocation\x20—\x20amounts\x20are\x20'+'pre-configured.\x20Use\x20fixed\x20tiers\x20guarded\x20by\x20distinct\x20Guards,\x20or\x20an\x20Amount\x20with\x20a\x20max\x20cap.');/(auto|automatic|automatically|after \d+ (day|hour|week)|within \d+ (day|hour|week))/['test'](l)&&c['push']('T1\x20B-3:\x20\x27auto\x20/\x20after\x20N\x20days\x27\x20has\x20no\x20on-chain\x20cron\x20—\x20it\x20requires\x20a\x20time_guard\x20PLUS\x20an\x20off-chain\x20'+'keeper\x20to\x20submit.\x20Configuring\x20a\x20time_guard\x20without\x20a\x20keeper\x20means\x20nothing\x20ever\x20fires.');let m=[];try{const {recommendModules:n}=await import('../../extensions/business-modules.js'),o=n(h,a,{'maxModules':0x5});m=o['map'](p=>p['id']);}catch{m=['milestone_escrow','independent_arbitration','wip_provenance'];}return{'intent':k,'inferredIndustry':h,'industryConfidence':i,'similarIndustries':g,'inferredTraits':j,'recommendedModules':m,'warnings':c};}function inferDeliverableType(a){const b=a['toLowerCase']();if(b['includes']('design')||b['includes']('code')||b['includes']('write')||b['includes']('digital'))return'digital';if(b['includes']('class')||b['includes']('lesson')||b['includes']('session'))return'service_session';if(b['includes']('rent')||b['includes']('access'))return'access_right';return'physical';}
|
|
1
|
+
import{findSimilarIndustries,inferTraitsFromDescription}from'../../knowledge/industry-generalizer.js';const INTENT_KEYWORDS={'sell_service':['design','develop','consult','freelance','service','build','create','write','translate'],'sell_product':['sell','product','item','goods','merchandise','store','shop'],'sell_subscription':['subscribe','subscription','membership','monthly','recurring','creator','patron'],'rent_asset':['rent','rental','lease','borrow','car','house','apartment','equipment'],'crowdfund':['crowdfund','fund','raise','campaign','donation','backer'],'escrow':['escrow','hold','mediate','intermediary','safe','secure\x20transaction']};function classifyIntentType(a){const b=a['toLowerCase']();let c='sell_service',d=0x0;for(const [e,f]of Object['entries'](INTENT_KEYWORDS)){const g=f['filter'](h=>b['includes'](h))['length'];g>d&&(d=g,c=e);}return c;}function inferPaymentModel(a){const b=a['toLowerCase']();if(b['includes']('milestone')||b['includes']('phase')||b['includes']('stage'))return'milestone';if(b['includes']('subscription')||b['includes']('monthly')||b['includes']('recurring'))return'subscription';if(b['includes']('per\x20use')||b['includes']('hourly')||b['includes']('per\x20session'))return'per_use';if(b['includes']('escrow')||b['includes']('hold'))return'escrow';return'upfront';}function inferRefundPolicy(a){const b=a['toLowerCase']();if(b['includes']('no\x20refund')||b['includes']('non-refundable'))return'no_refund';if(b['includes']('milestone')&&b['includes']('refund'))return'milestone_prorated';if(b['includes']('full\x20refund'))return'full';return'partial';}export function inferArbitration(a){const b=a['toLowerCase']();if(b['includes']('no\x20arbitration')||b['includes']('no\x20dispute'))return'none';if(b['includes']('third\x20party')||b['includes']('independent'))return'third_party';if(b['includes']('mutual'))return'mutual_pick';return'merchant_pick';}export async function analyzeIntent(a,b){const c=[],d=classifyIntentType(a),e=inferTraitsFromDescription(a),f=findSimilarIndustries(e['traits'],0x3),g=f['map'](n=>n['industry']),h=b?.['preferredIndustry']??g[0x0]??'general',i=g['includes'](h)?0.85:0.5,j=e['traits'],k={'intent':d,'industry':h,'description':a,'roles':{'merchant':{'name':'merchant','description':'Service\x20provider\x20or\x20seller','obligations':['Deliver\x20as\x20described','Maintain\x20compensation_fund\x20if\x20required','Accept\x20arbitration\x20verdicts'],'rights':['Receive\x20payment\x20upon\x20verified\x20delivery','Set\x20service\x20terms\x20before\x20publish']},'customer':{'name':'customer','description':'Buyer\x20or\x20service\x20recipient','obligations':['Pay\x20according\x20to\x20agreed\x20schedule','Provide\x20acceptance/rejection\x20within\x20timeout'],'rights':['Receive\x20deliverables\x20as\x20described','Request\x20refund\x20if\x20delivery\x20fails','Initiate\x20arbitration\x20for\x20disputes']}},'deliverables':[{'name':'main_deliverable','type':inferDeliverableType(a),'acceptanceCriteria':'To\x20be\x20defined\x20by\x20merchant\x20during\x20configuration','proofOfDelivery':'wip_hash'}],'payment':{'model':inferPaymentModel(a),'currency':b?.['currency']??'WOW','triggers':[{'event':inferPaymentModel(a)==='milestone'?'milestone\x20completion':'service\x20confirmation','guardDescription':'Guard\x20verifies\x20deliverable\x20meets\x20acceptance\x20criteria'}],'allocation':[{'recipient':'merchant','percentage':0x64},{'recipient':'platform','percentage':0x0}]},'trust':{'refundPolicy':inferRefundPolicy(a),'arbitration':inferArbitration(a),'escrow':!![],'transparency':'full'}};k['payment']['model']==='milestone'&&!a['toLowerCase']()['includes']('milestone')&&c['push']('Payment\x20model\x20inferred\x20as\x20\x27milestone\x27\x20but\x20not\x20explicitly\x20mentioned.\x20Please\x20verify.');k['trust']['arbitration']==='none'&&c['push']('No\x20arbitration\x20configured.\x20This\x20increases\x20risk\x20for\x20both\x20parties.\x20Consider\x20adding\x20independent_arbitration\x20module.');k['payment']['allocation']&&k['payment']['allocation']['some'](n=>n['recipient']==='platform'&&n['percentage']>0x0)&&c['push']('Platform\x20fee\x20>\x200\x20detected.\x20WOW\x20philosophy\x20recommends\x200%\x20platform\x20fee\x20for\x20peer-to-peer\x20transactions.');const l=a['toLowerCase']();/(refund|cancel|dispute)/['test'](l)&&k['payment']['model']==='milestone'&&c['push']('T1\x20B-1:\x20\x27refund/dispute\x27\x20must\x20be\x20modeled\x20via\x20the\x20Allocation\x20waterfall\x20(order_allocators)\x20+\x20'+'the\x20bound\x20Arbitration\x20—\x20NOT\x20a\x20Machine\x20\x27refunded\x27/\x27disputed\x27\x20node\x20(R-M1-11).');/(variable amount|dynamic amount|actual loss|assessed loss)/['test'](l)&&c['push']('T1\x20B-2:\x20a\x20variable/conditional\x20payout\x20amount\x20cannot\x20be\x20expressed\x20in\x20Allocation\x20—\x20amounts\x20are\x20'+'pre-configured.\x20Use\x20fixed\x20tiers\x20guarded\x20by\x20distinct\x20Guards,\x20or\x20an\x20Amount\x20with\x20a\x20max\x20cap.');/(auto|automatic|automatically|after \d+ (day|hour|week)|within \d+ (day|hour|week))/['test'](l)&&c['push']('T1\x20B-3:\x20\x27auto\x20/\x20after\x20N\x20days\x27\x20has\x20no\x20on-chain\x20cron\x20—\x20it\x20requires\x20a\x20time_guard\x20PLUS\x20an\x20off-chain\x20'+'keeper\x20to\x20submit.\x20Configuring\x20a\x20time_guard\x20without\x20a\x20keeper\x20means\x20nothing\x20ever\x20fires.');let m=[];try{const {recommendModules:n}=await import('../../extensions/business-modules.js'),o=n(h,a,{'maxModules':0x5});m=o['map'](p=>p['id']);}catch{m=['milestone_escrow','independent_arbitration','wip_provenance'];}return{'intent':k,'inferredIndustry':h,'industryConfidence':i,'similarIndustries':g,'inferredTraits':j,'recommendedModules':m,'warnings':c};}function inferDeliverableType(a){const b=a['toLowerCase']();if(b['includes']('design')||b['includes']('code')||b['includes']('write')||b['includes']('digital'))return'digital';if(b['includes']('class')||b['includes']('lesson')||b['includes']('session'))return'service_session';if(b['includes']('rent')||b['includes']('access'))return'access_right';return'physical';}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ENTRYPOINT, TableItem_MachineNode } from "@wowok/wowok";
|
|
2
|
-
export declare function fetchMachineNodes(machineAddress: string, network: ENTRYPOINT): Promise<TableItem_MachineNode[]>;
|
|
2
|
+
export declare function fetchMachineNodes(machineAddress: string, network: ENTRYPOINT, noCache?: boolean): Promise<TableItem_MachineNode[]>;
|
|
3
3
|
export interface MachineGraphForward {
|
|
4
4
|
name: string;
|
|
5
5
|
weight: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{batchQueryTableItems}from'../../graph/onchain/sdk-batch.js';export async function fetchMachineNodes(a,b){const {items:
|
|
1
|
+
import{batchQueryTableItems}from'../../graph/onchain/sdk-batch.js';export async function fetchMachineNodes(a,b,c){const {items:d}=await batchQueryTableItems(a,{'network':b,'noCache':c}),e=[];for(const f of d){f['object']?.['type']==='TableItem_MachineNode'&&e['push'](f['object']);}return e;}export const MACHINE_START_NODE='';export function normalizeForwards(a){if(!Array['isArray'](a))return[];return a['map'](b=>{const c=b?.['guard'],d=c&&typeof c==='object'&&typeof c['guard']==='string';return{'name':typeof b?.['name']==='string'?b['name']:'','weight':typeof b?.['weight']==='number'?b['weight']:0x0,'guard':d?c['guard']:typeof c==='string'?c:null,'retained_submission':d&&Array['isArray'](c['retained_submission'])?c['retained_submission']:null,'named_operator':typeof b?.['namedOperator']==='string'?b['namedOperator']:null,'permission_index':typeof b?.['permissionIndex']==='number'?b['permissionIndex']:null};});}export function buildMachineGraph(a){const b=new Map(),c=[];let d=![];for(const f of a){const g=f['name'];if(!g)continue;!b['has'](g)&&b['set'](g,{'name':g,'description':null});const h=Array['isArray'](f['value'])?f['value']:[];for(const i of h){if(!i||typeof i!=='object')continue;const j=typeof i['prev_node']==='string'?i['prev_node']:MACHINE_START_NODE;if(j===MACHINE_START_NODE)d=!![];c['push']({'from':j,'to':g,'threshold':typeof i['threshold']==='number'?i['threshold']:0x1,'forwards':normalizeForwards(i['forwards'])});}}const e=[];d&&e['push']({'name':MACHINE_START_NODE,'description':'Initial\x20node\x20—\x20the\x20workflow\x20entry\x20point.\x20Orders\x20start\x20here.','is_start':!![]});for(const k of c){k['from']!==MACHINE_START_NODE&&!b['has'](k['from'])&&b['set'](k['from'],{'name':k['from'],'description':null}),!b['has'](k['to'])&&b['set'](k['to'],{'name':k['to'],'description':null});}return e['push'](...b['values']()),{'nodes':e,'edges':c};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as
|
|
1
|
+
import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as a305a}from'../../tools/handlers/name-resolution.js';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';import{batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';export async function handleMachinePanorama(a){const b=a['object_address'];if(!b)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20machine_panorama');let c=a['context_network']??undefined;const d=[];let f=await a305a(b,'machine'),g=null;try{if(!c)c=await Config['Instance']()['network_get']();const x=await query_objects({'objects':[f],'network':c});g=x?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const y=await Config['Instance']()['network_get']();if(y&&y!==c){const z=await query_objects({'objects':[f],'network':y,'no_cache':!![]}),A=z?.['objects']?.[0x0]??null;A&&(g=A,c=y);}}}catch(B){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(B instanceof Error?B['message']:String(B))));}if(!g)throw new Error('Machine\x20'+f+'\x20not\x20found\x20on\x20'+c+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');f=g['object']??f;let h=null,j=[];try{const C=await LocalMark['Instance']()['list']({'address':f});C['length']>0x0&&(h=C[0x0]['name']??null,j=(C[0x0]['tags']??[])['map'](D=>String(D)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const D=await fetchMachineNodes(f,c,!![]);k=buildMachineGraph(D);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}if(typeof g['permission']==='string'&&g['permission'])try{const E=await query_objects({'objects':[g['permission']],'network':c}),F=E?.['objects']?.[0x0]??null,G=Array['isArray'](F?.['perm_remark'])?F['perm_remark']:Array['isArray'](F?.['remark'])?F['remark']:[],H=G['map'](I=>({'index':typeof I?.['index']==='number'?I['index']:parseInt(I?.['index'],0xa),'remark':typeof I?.['remark']==='string'?I['remark']:''}))['filter'](I=>Number['isFinite'](I['index']));k['permission']={'address':g['permission'],'remarks':H};}catch{d['push']('graph:\x20permission\x20read\x20failed\x20(non-blocking)');}const l=[];let m=0x0,n=null,p=null,q=0x0,s=![],u=[];try{const I=await fetchObjectLinkerTx(f,c,!![]),J=I?.['items']??[];s=ringWindowSaturated(J['length']);const K=new Map();for(const R of J){const S=typeof R?.['who']==='string'?R['who']['toLowerCase']():'';if(!S||S==='0x0')continue;if(!objectTypeFromAddress(S))continue;const T=typeof R?.['time']==='number'?R['time']:null,U=K['get'](S);K['set'](S,U==null?T:T==null?U:Math['max'](U,T));}q=K['size'];const L=new Map();for(const [V,W]of K){const X=String(objectTypeFromAddress(V)),Y=L['get'](X)??[];Y['push']({'address':V,'time':W}),L['set'](X,Y);}for(const Z of L['values']()){Z['sort']((a0,a1)=>(a1['time']??0x0)-(a0['time']??0x0));}const M=['Progress','Allocation','Payment','Guard'];u=[];for(const a0 of M){const a1=L['get'](a0);a1&&a1['length']>0x0&&(u['push']({'label':a0,'items':a1}),L['delete'](a0));}for(const [a2,a3]of L){if(a3['length']>0x0)u['push']({'label':a2,'items':a3});}const N=J['filter'](a4=>objectTypeFromAddress(a4['who'])===ObjectType['Progress']);m=N['length'];for(const a4 of N){if(typeof a4?.['time']==='number'){if(n===null||a4['time']<n)n=a4['time'];if(p===null||a4['time']>p)p=a4['time'];}}const O=N['slice'](-0x3)['reverse'](),P=O['map'](a5=>a5['who']),Q=new Map();if(P['length']>0x0)try{const a5=await batchQueryObjectsByIds(P,c,!![]);for(const a6 of a5){if(a6?.['object'])Q['set'](a6['object'],a6);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const a7 of O){const a8=typeof a7?.['who']==='string'?a7['who']:'';if(!a8)continue;const a9=Q['get'](a8);l['push']({'progress':a8,'name':null,'current':a9?.['current']??null,'task':a9?.['task']??null,'history_count':typeof a9?.['history_count']==='number'?a9['history_count']:null,'current_time':typeof a9?.['current_time']==='number'?a9['current_time']:null,'created_at':typeof a7?.['time']==='number'?a7['time']:null});}}catch{d['push']('progresses:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const w='Analyze\x20ALL\x20workflow\x20progresses\x20of\x20Machine\x20'+f+'\x20('+c+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20progresses\x20live\x20in\x20the\x20machine\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+m+(s?',\x20saturated':'')+').\x20')+'For\x20each\x20progress\x20call\x20object_panorama\x20with\x20the\x20progress\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20progress:\x20'+'progress\x20address\x20chip\x20(first\x20column)\x20|\x20current\x20node\x20|\x20task\x20|\x20history\x20events\x20|\x20last\x20activity\x20(local\x20date)\x20|\x20registered\x20(local\x20date).\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(stuck\x20nodes,\x20age\x20of\x20active\x20progresses,\x20throughput).\x20Progresses\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Machine\x20graph\x20itself.';return{'action':'machine_panorama','machineAddress':f,'network':String(c),'head':{'name':h,'tags':j,'description':typeof g['description']==='string'?g['description']:null,'published':typeof g['bPublished']==='boolean'?g['bPublished']:null,'paused':typeof g['bPaused']==='boolean'?g['bPaused']:null},'fields':{'permission':g['permission']??null,'um':g['um']??null,'node_count':k['nodes']['length']>0x0?k['nodes']['length']:typeof g['node_count']==='number'?g['node_count']+0x1:null,'onchain_table_node_count':typeof g['node_count']==='number'?g['node_count']:k['nodes']['length']>0x0?k['nodes']['length']-0x1:null,'consensus_repositories':Array['isArray'](g['consensus_repositories'])?g['consensus_repositories']:[]},'graph':k,'progresses':{'count':m,'window_saturated':s,'preview_truncated':m>l['length'],'stats':{'first_created_ms':n,'last_created_ms':p},...m>l['length']?{'drilldown':{'total_count':m,'analyzed_count':l['length'],'prompt':w}}:{},'items':l},'related':{'count':q,'window_saturated':s,'groups':u},'data_gaps':d};}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ObjectPanoramaInput } from "../../schema/query/bi.js";
|
|
2
|
+
import { type AnchorCrossCheck } from "../../communication/wts-attestation.js";
|
|
2
3
|
type ProjectInput = ObjectPanoramaInput;
|
|
3
4
|
interface PanoRelatedList {
|
|
4
5
|
key: string | null;
|
|
@@ -213,7 +214,32 @@ export interface RepositoryPanoramaResult extends PanoBase {
|
|
|
213
214
|
}[];
|
|
214
215
|
};
|
|
215
216
|
}
|
|
216
|
-
export
|
|
217
|
+
export interface ProofPanoramaResult extends PanoBase {
|
|
218
|
+
object_type: "Proof";
|
|
219
|
+
fields: {
|
|
220
|
+
description: string | null;
|
|
221
|
+
anchored_root: string | null;
|
|
222
|
+
item_count: number | null;
|
|
223
|
+
proof_type: number | null;
|
|
224
|
+
proof_type_label: string;
|
|
225
|
+
about: string | null;
|
|
226
|
+
signer: string | null;
|
|
227
|
+
time_ms: number | null;
|
|
228
|
+
time_iso: string | null;
|
|
229
|
+
};
|
|
230
|
+
server_pubkey: {
|
|
231
|
+
present: boolean;
|
|
232
|
+
length: number | null;
|
|
233
|
+
fingerprint: string | null;
|
|
234
|
+
};
|
|
235
|
+
server_signature: {
|
|
236
|
+
present: boolean;
|
|
237
|
+
length: number | null;
|
|
238
|
+
fingerprint: string | null;
|
|
239
|
+
};
|
|
240
|
+
wts_anchor_check?: AnchorCrossCheck;
|
|
241
|
+
}
|
|
242
|
+
export type ObjectPanoramaResult = ProgressPanoramaResult | DemandPanoramaResult | OrderPanoramaResult | ArbPanoramaResult | ArbitrationPanoramaResult | RepositoryPanoramaResult | ProofPanoramaResult;
|
|
217
243
|
export declare function coinOfTypeRaw(typeRaw: unknown): string | null;
|
|
218
244
|
export declare function handleObjectPanorama(v: ProjectInput): Promise<ObjectPanoramaResult>;
|
|
219
245
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as a308a}from'../../tools/handlers/name-resolution.js';import{batchReadAddressKeyedFields,batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{formatMoneyAnnotation}from'./facet-money.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[];export function coinOfTypeRaw(a){if(typeof a!=='string'||!a)return null;const b=a['match'](/<(.+)>$/),c=b?.[0x1]?.['trim']();return c&&c['includes']('::')?c:null;}const RELATED_PREVIEW_CAP=0x32;async function buildRelatedList(a,b,c,d,e){const f={'key':a,'items':[],'count':0x0,'window_saturated':![],'preview_truncated':![]};if(!a)return f;try{const g=await fetchObjectLinkerTx(a,c,!![]),h=g?.['items']??[];f['window_saturated']=ringWindowSaturated(h['length']);const j=[];for(const k of h){const l=typeof k?.['who']==='string'?k['who']:'';if(!l||l['toLowerCase']()===b['toLowerCase']())continue;let m;try{m=objectTypeFromAddress(l);}catch{}if(!m)continue;j['push']({'address':l,'object_type':m,'time':typeof k?.['time']==='number'?k['time']:null});}f['count']=j['length'],f['items']=j['slice'](-RELATED_PREVIEW_CAP)['reverse'](),f['preview_truncated']=j['length']>f['items']['length'];}catch{d['push']('related:\x20ObjectLinkerTx('+e+')\x20lookup\x20failed');}return f;}const ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){const c=await a308a(a,'object_address');let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const g=await query_objects({'objects':[c],'network':d});f=g?.['objects']?.[0x0]??null;if(!f&&b){const h=await Config['Instance']()['network_get']();if(h&&h!==d){const i=await query_objects({'objects':[c],'network':h,'no_cache':!![]}),j=i?.['objects']?.[0x0]??null;j&&(f=j,d=h);}}}catch(k){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(k instanceof Error?k['message']:String(k)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0,f=![];try{const g=await fetchObjectLinkerTx(a,b,!![]),h=Array['isArray'](g?.['items'])?g['items']:[];f=ringWindowSaturated(h['length']);const i=h['map'](l=>({'service':String(l?.['who']??''),'time':typeof l?.['time']==='number'?l['time']:null}))['filter'](l=>objectTypeFromAddress(l['service'])===ObjectType['Service']);e=i['length'];const j=i['slice'](-0x32)['reverse'](),k=await batchReadAddressKeyedFields(a,j['map'](l=>l['service']),b,!![]);for(const l of j){const m=k['get'](l['service']['toLowerCase']());d['push']({'service':l['service'],'recommend':str(m?.['recommend']),'acceptance_score':num(m?.['acceptance_score']),'feedback':str(m?.['feedback']),'feedback_time':num(m?.['feedback_time']),'update_time':num(m?.['update_time'])??l['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'window_saturated':f,'preview_truncated':e>d['length'],'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:e,obj:f}=await resolveObject(c,b['context_network']),g=String(f['object']),h=[],j=await resolveHead(g,f,h),k=String(f['type']??'');if(k==='Progress'){const l=arr(f['session'])[0x0],m=l?{'next_node':str(l['next_node']),'weights':num(l['weights']),'threshold':num(l['threshold']),'forwards':arr(l['forwards'])['map'](q=>{const r=q;return{'forward':str(r['forward'])??'','who':str(r['who']),'accomplished':r['accomplished']===!![],'msg':str(r['msg']),'time':num(r['time'])};})}:null,n=await buildRelatedList(typeof f['machine']==='string'?f['machine']:null,g,e,h,'machine');return{'action':'object_panorama','object':g,'object_type':'Progress','network':e,'head':j,'fields':{'machine':str(f['machine']),'current':str(f['current']),'task':str(f['task']),'history_count':num(f['history_count']),'current_time':num(f['current_time'])},'context_repositories':arr(f['context_repositories'])['map'](q=>String(q)),'operators':arr(f['namedOperator'])['map'](q=>{const r=q;return{'name':str(r['name'])??'','operators':arr(r['operators'])['map'](t=>String(t))};}),'session':m,'related':n,'data_gaps':h};}if(k==='Demand')return{'action':'object_panorama','object':g,'object_type':'Demand','network':e,'head':j,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'presenters_count':num(f['presenters_count'])},'rewards':arr(f['rewards'])['map'](q=>String(q)),'guards':arr(f['guards'])['map'](q=>({'guard':str(q['guard'])??''})),'presenters':await buildPresenters(g,e,h),'data_gaps':h};if(k==='Order'){let q=null;try{const F=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});q=F?.['timestamp_ms']?Number(F['timestamp_ms'])||null:null;}catch{}let r='none',t=null,u=null;const w=str(f['allocation']),x=str(f['progress']),y=str(f['service']),z=[w,x,y]['filter'](G=>!!G);let A=null;if(z['length']>0x0)try{const G=await query_objects({'objects':z,'network':e}),H=G?.['objects']??[];if(w){r='pending';const I=H['find'](K=>K?.['object']===w),J=Number(I?.['balance']??NaN);if(Number['isFinite'](J)&&J===0x0)r='allocated';}if(x){const K=H['find'](L=>L?.['object']===x);t=str(K?.['current']),u=num(K?.['current_time']);}if(y){const L=H['find'](M=>M?.['object']===y);A=coinOfTypeRaw(L?.['type_raw']??L?.['type']);}}catch{}const B=await buildRelatedList(g,g,e,h,'order'),C=str(f['amount']),D=await formatMoneyAnnotation(C,A,e),E=await Promise['all'](arr(f['items'])['map'](async M=>{const N=M,O=str(N['price']),P=await formatMoneyAnnotation(O,A,e);return{'name':str(N['name']),'price':O,'price_display':P['display'],'price_tip':P['tip'],'quantity':str(N['quantity']),'wip_hash':str(N['wip_hash'])};}));return{'action':'object_panorama','object':g,'object_type':'Order','network':e,'head':j,'coin_type':A,'fields':{'service':y,'machine':str(f['machine']),'progress':x,'allocation':w,'discount':str(f['discount']),'amount':C,'amount_display':D['display'],'amount_tip':D['tip'],'owner':ownerAddr(f['builder']??f['owner']),'claimed_by':str(f['claimed_by']),'required_info':str(f['required_info']),'time':num(f['time'])},'updated_ms':q,'related':B,'allocation_state':r,'progress_next':t,'progress_since':u,'items':E,'disputes':arr(f['dispute'])['map'](M=>String(M)),'agents':arr(f['agent'])['map'](M=>String(M)),'data_gaps':h};}if(k==='Arb'){const M=f['indemnity'];let N=null;try{const W=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});N=W?.['timestamp_ms']?Number(W['timestamp_ms'])||null:null;}catch{}const O=str(f['order']);let P=null;if(O)try{const X=await query_objects({'objects':[O],'network':e}),Y=X?.['objects']?.[0x0];P=str(Y?.['service']);}catch{}const Q=await buildRelatedList(g,g,e,h,'arb'),R=coinOfTypeRaw(f['type_raw']),S=str(f['fee']),T=await formatMoneyAnnotation(S,R,e),U=M?str(M['amount']):null,V=await formatMoneyAnnotation(U,R,e);return{'action':'object_panorama','object':g,'object_type':'Arb','network':e,'head':j,'coin_type':R,'fields':{'arbitration':str(f['arbitration']),'order':str(f['order']),'service':P,'fee':S,'fee_display':T['display'],'fee_tip':T['tip'],'feedback':str(f['feedback']),'indemnity':M?{'amount':U,'amount_display':V['display'],'amount_tip':V['tip'],'time':num(M['time'])}:null,'voting_deadline':num(f['voting_deadline']),'objection':str(f['objection']),'status':ARB_STATUS_NAMES[num(f['status'])??-0x1]??str(f['status']),'compensation_time':num(f['compensation_time']),'time':num(f['time']),'type_raw':str(f['type_raw'])},'voted':arr(f['voted'])['map'](Z=>{const a0=Z;return{'voter':str(a0['voter'])??'','agrees':arr(a0['agrees'])['map'](a1=>Number(a1)),'weight':num(a0['weight'])??0x0,'time':num(a0['time'])??0x0};}),'proposition':arr(f['proposition'])['map'](Z=>{const a0=Z;return{'name':str(a0['name'])??'','votes':num(a0['votes'])??0x0};}),'related':Q,'updated_ms':N,'data_gaps':h};}if(k==='Arbitration'){const Z=coinOfTypeRaw(f['type_raw']??f['type']),a0=str(f['fee']),a1=await formatMoneyAnnotation(a0,Z,e),a2=str(f['balance']),a3=await formatMoneyAnnotation(a2,Z,e),a4=a7=>{if(a7&&typeof a7==='object'){const a8=a7;if(a8['GuardIdentifier']!==undefined)return'guard\x20identifier\x20#'+String(a8['GuardIdentifier']);if(a8['FixedValue']!==undefined)return'fixed\x20weight\x20'+String(a8['FixedValue']);}return typeof a7==='number'||typeof a7==='string'?String(a7):null;},a5=arr(f['voting_guard'])['map'](a7=>{const a8=a7;return{'guard':str(a8['guard'])??'','vote_weight':a4(a8['vote_weight'])};}),a6={'count':0x0,'window_saturated':![],'preview_truncated':![],'stats':{'first_created_ms':null,'last_created_ms':null},'items':[]};try{const a7=await fetchObjectLinkerTx(g,e,!![]),a8=a7?.['items']??[];a6['window_saturated']=ringWindowSaturated(a8['length']);const a9=a8['filter'](ac=>objectTypeFromAddress(typeof ac?.['who']==='string'?ac['who']:'')===ObjectType['Arb']);a6['count']=a9['length'];for(const ac of a9){if(typeof ac?.['time']==='number'){if(a6['stats']['first_created_ms']===null||ac['time']<a6['stats']['first_created_ms'])a6['stats']['first_created_ms']=ac['time'];if(a6['stats']['last_created_ms']===null||ac['time']>a6['stats']['last_created_ms'])a6['stats']['last_created_ms']=ac['time'];}}const aa=a9['slice'](-0x3)['reverse'](),ab=new Map();if(aa['length']>0x0)try{const ad=await batchQueryObjectsByIds(aa['map'](ae=>String(ae['who'])),e,!![]);for(const ae of ad){if(ae?.['object'])ab['set'](ae['object'],ae);}}catch{h['push']('cases:\x20detail\x20fetch\x20failed\x20(non-blocking)');}for(const af of aa){const ag=typeof af?.['who']==='string'?af['who']:'';if(!ag)continue;const ah=ab['get'](ag);a6['items']['push']({'arb':ag,'order':ah?str(ah['order']):null,'status':ah?ARB_STATUS_NAMES[num(ah['status'])??-0x1]??str(ah['status']):null,'time':typeof af?.['time']==='number'?af['time']:null});}a6['preview_truncated']=a6['count']>a6['items']['length'],a6['preview_truncated']&&(a6['drilldown']={'total_count':a6['count'],'analyzed_count':a6['items']['length'],'prompt':'Analyze\x20ALL\x20dispute\x20cases\x20of\x20Arbitration\x20'+g+'\x20('+e+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20cases\x20live\x20in\x20the\x20arbitration\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+a6['count']+(a6['window_saturated']?',\x20saturated':'')+').\x20')+'For\x20each\x20case\x20call\x20object_panorama\x20with\x20the\x20Arb\x20case\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20case:\x20'+'case\x20address\x20chip\x20(first\x20column)\x20|\x20disputed\x20order\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20(the\x20order\x20is\x20the\x20case\x27s\x20child\x20plane)\x20|\x20status\x20|\x20created\x20(local\x20date)\x20|\x20indemnity\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20arbitrator\x20feedback.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(outcomes,\x20indemnity\x20distribution,\x20case\x20age).\x20Cases\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Arbitration\x20itself.'});}catch{h['push']('cases:\x20affiliation-window\x20lookup\x20failed\x20(non-blocking)');}return{'action':'object_panorama','object':g,'object_type':'Arbitration','network':e,'head':j,'coin_type':Z,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'fee':a0,'fee_display':a1['display'],'fee_tip':a1['tip'],'balance':a2,'balance_display':a3['display'],'balance_tip':a3['tip'],'paused':typeof f['bPaused']==='boolean'?f['bPaused']:null,'usage_guard':str(f['usage_guard'])},'voting_guards':a5,'cases':a6,'data_gaps':h};}if(k==='Repository')return{'action':'object_panorama','object':g,'object_type':'Repository','network':e,'head':j,'fields':{'um':str(f['um']),'permission':str(f['permission']),'data_count':num(f['data_count'])},'policies':arr(f['policies'])['map'](ai=>{const aj=ai;return{'name':str(aj['name'])??'','description':str(aj['description']),'id_from':str(aj['id_from']),'value_type':str(aj['value_type']),'write_guards':arr(aj['write_guard'])['length'],'quote_guard':str(aj['quote_guard'])};}),'rewards':arr(f['rewards'])['map'](ai=>String(ai)),'data_entries':await buildRepositoryData(g,e,h),'data_gaps':h};throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(k||'unknown')+'\x27\x20for\x20'+g+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Arb\x20/\x20Arbitration\x20/\x20Repository.');}
|
|
1
|
+
import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{createHash}from'node:crypto';import{checkWtsProofAnchor,readWtsDocument}from'../../communication/wts-attestation.js';import{resolveAddress as a310a}from'../../tools/handlers/name-resolution.js';import{batchReadAddressKeyedFields,batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{formatMoneyAnnotation}from'./facet-money.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[];export function coinOfTypeRaw(a){if(typeof a!=='string'||!a)return null;const b=a['match'](/<(.+)>$/),c=b?.[0x1]?.['trim']();return c&&c['includes']('::')?c:null;}const RELATED_PREVIEW_CAP=0x32;async function buildRelatedList(a,b,c,d,e){const f={'key':a,'items':[],'count':0x0,'window_saturated':![],'preview_truncated':![]};if(!a)return f;try{const g=await fetchObjectLinkerTx(a,c,!![]),h=g?.['items']??[];f['window_saturated']=ringWindowSaturated(h['length']);const j=[];for(const k of h){const l=typeof k?.['who']==='string'?k['who']:'';if(!l||l['toLowerCase']()===b['toLowerCase']())continue;let m;try{m=objectTypeFromAddress(l);}catch{}if(!m)continue;j['push']({'address':l,'object_type':m,'time':typeof k?.['time']==='number'?k['time']:null});}f['count']=j['length'],f['items']=j['slice'](-RELATED_PREVIEW_CAP)['reverse'](),f['preview_truncated']=j['length']>f['items']['length'];}catch{d['push']('related:\x20ObjectLinkerTx('+e+')\x20lookup\x20failed');}return f;}const ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){const c=await a310a(a,'object_address');let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const g=await query_objects({'objects':[c],'network':d});f=g?.['objects']?.[0x0]??null;if(!f&&b){const h=await Config['Instance']()['network_get']();if(h&&h!==d){const i=await query_objects({'objects':[c],'network':h,'no_cache':!![]}),j=i?.['objects']?.[0x0]??null;j&&(f=j,d=h);}}}catch(k){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(k instanceof Error?k['message']:String(k)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0,f=![];try{const g=await fetchObjectLinkerTx(a,b,!![]),h=Array['isArray'](g?.['items'])?g['items']:[];f=ringWindowSaturated(h['length']);const i=h['map'](l=>({'service':String(l?.['who']??''),'time':typeof l?.['time']==='number'?l['time']:null}))['filter'](l=>objectTypeFromAddress(l['service'])===ObjectType['Service']);e=i['length'];const j=i['slice'](-0x32)['reverse'](),k=await batchReadAddressKeyedFields(a,j['map'](l=>l['service']),b,!![]);for(const l of j){const m=k['get'](l['service']['toLowerCase']());d['push']({'service':l['service'],'recommend':str(m?.['recommend']),'acceptance_score':num(m?.['acceptance_score']),'feedback':str(m?.['feedback']),'feedback_time':num(m?.['feedback_time']),'update_time':num(m?.['update_time'])??l['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'window_saturated':f,'preview_truncated':e>d['length'],'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:e,obj:f}=await resolveObject(c,b['context_network']),g=String(f['object']),h=[],j=await resolveHead(g,f,h),k=String(f['type']??'');if(k==='Progress'){const l=arr(f['session'])[0x0],m=l?{'next_node':str(l['next_node']),'weights':num(l['weights']),'threshold':num(l['threshold']),'forwards':arr(l['forwards'])['map'](q=>{const r=q;return{'forward':str(r['forward'])??'','who':str(r['who']),'accomplished':r['accomplished']===!![],'msg':str(r['msg']),'time':num(r['time'])};})}:null,n=await buildRelatedList(typeof f['machine']==='string'?f['machine']:null,g,e,h,'machine');return{'action':'object_panorama','object':g,'object_type':'Progress','network':e,'head':j,'fields':{'machine':str(f['machine']),'current':str(f['current']),'task':str(f['task']),'history_count':num(f['history_count']),'current_time':num(f['current_time'])},'context_repositories':arr(f['context_repositories'])['map'](q=>String(q)),'operators':arr(f['namedOperator'])['map'](q=>{const r=q;return{'name':str(r['name'])??'','operators':arr(r['operators'])['map'](t=>String(t))};}),'session':m,'related':n,'data_gaps':h};}if(k==='Demand')return{'action':'object_panorama','object':g,'object_type':'Demand','network':e,'head':j,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'presenters_count':num(f['presenters_count'])},'rewards':arr(f['rewards'])['map'](q=>String(q)),'guards':arr(f['guards'])['map'](q=>({'guard':str(q['guard'])??''})),'presenters':await buildPresenters(g,e,h),'data_gaps':h};if(k==='Order'){let q=null;try{const F=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});q=F?.['timestamp_ms']?Number(F['timestamp_ms'])||null:null;}catch{}let r='none',t=null,u=null;const w=str(f['allocation']),x=str(f['progress']),y=str(f['service']),z=[w,x,y]['filter'](G=>!!G);let A=null;if(z['length']>0x0)try{const G=await query_objects({'objects':z,'network':e}),H=G?.['objects']??[];if(w){r='pending';const I=H['find'](K=>K?.['object']===w),J=Number(I?.['balance']??NaN);if(Number['isFinite'](J)&&J===0x0)r='allocated';}if(x){const K=H['find'](L=>L?.['object']===x);t=str(K?.['current']),u=num(K?.['current_time']);}if(y){const L=H['find'](M=>M?.['object']===y);A=coinOfTypeRaw(L?.['type_raw']??L?.['type']);}}catch{}const B=await buildRelatedList(g,g,e,h,'order'),C=str(f['amount']),D=await formatMoneyAnnotation(C,A,e),E=await Promise['all'](arr(f['items'])['map'](async M=>{const N=M,O=str(N['price']),P=await formatMoneyAnnotation(O,A,e);return{'name':str(N['name']),'price':O,'price_display':P['display'],'price_tip':P['tip'],'quantity':str(N['quantity']),'wip_hash':str(N['wip_hash'])};}));return{'action':'object_panorama','object':g,'object_type':'Order','network':e,'head':j,'coin_type':A,'fields':{'service':y,'machine':str(f['machine']),'progress':x,'allocation':w,'discount':str(f['discount']),'amount':C,'amount_display':D['display'],'amount_tip':D['tip'],'owner':ownerAddr(f['builder']??f['owner']),'claimed_by':str(f['claimed_by']),'required_info':str(f['required_info']),'time':num(f['time'])},'updated_ms':q,'related':B,'allocation_state':r,'progress_next':t,'progress_since':u,'items':E,'disputes':arr(f['dispute'])['map'](M=>String(M)),'agents':arr(f['agent'])['map'](M=>String(M)),'data_gaps':h};}if(k==='Arb'){const M=f['indemnity'];let N=null;try{const W=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});N=W?.['timestamp_ms']?Number(W['timestamp_ms'])||null:null;}catch{}const O=str(f['order']);let P=null;if(O)try{const X=await query_objects({'objects':[O],'network':e}),Y=X?.['objects']?.[0x0];P=str(Y?.['service']);}catch{}const Q=await buildRelatedList(g,g,e,h,'arb'),R=coinOfTypeRaw(f['type_raw']),S=str(f['fee']),T=await formatMoneyAnnotation(S,R,e),U=M?str(M['amount']):null,V=await formatMoneyAnnotation(U,R,e);return{'action':'object_panorama','object':g,'object_type':'Arb','network':e,'head':j,'coin_type':R,'fields':{'arbitration':str(f['arbitration']),'order':str(f['order']),'service':P,'fee':S,'fee_display':T['display'],'fee_tip':T['tip'],'feedback':str(f['feedback']),'indemnity':M?{'amount':U,'amount_display':V['display'],'amount_tip':V['tip'],'time':num(M['time'])}:null,'voting_deadline':num(f['voting_deadline']),'objection':str(f['objection']),'status':ARB_STATUS_NAMES[num(f['status'])??-0x1]??str(f['status']),'compensation_time':num(f['compensation_time']),'time':num(f['time']),'type_raw':str(f['type_raw'])},'voted':arr(f['voted'])['map'](Z=>{const a0=Z;return{'voter':str(a0['voter'])??'','agrees':arr(a0['agrees'])['map'](a1=>Number(a1)),'weight':num(a0['weight'])??0x0,'time':num(a0['time'])??0x0};}),'proposition':arr(f['proposition'])['map'](Z=>{const a0=Z;return{'name':str(a0['name'])??'','votes':num(a0['votes'])??0x0};}),'related':Q,'updated_ms':N,'data_gaps':h};}if(k==='Arbitration'){const Z=coinOfTypeRaw(f['type_raw']??f['type']),a0=str(f['fee']),a1=await formatMoneyAnnotation(a0,Z,e),a2=str(f['balance']),a3=await formatMoneyAnnotation(a2,Z,e),a4=a7=>{if(a7&&typeof a7==='object'){const a8=a7;if(a8['GuardIdentifier']!==undefined)return'guard\x20identifier\x20#'+String(a8['GuardIdentifier']);if(a8['FixedValue']!==undefined)return'fixed\x20weight\x20'+String(a8['FixedValue']);}return typeof a7==='number'||typeof a7==='string'?String(a7):null;},a5=arr(f['voting_guard'])['map'](a7=>{const a8=a7;return{'guard':str(a8['guard'])??'','vote_weight':a4(a8['vote_weight'])};}),a6={'count':0x0,'window_saturated':![],'preview_truncated':![],'stats':{'first_created_ms':null,'last_created_ms':null},'items':[]};try{const a7=await fetchObjectLinkerTx(g,e,!![]),a8=a7?.['items']??[];a6['window_saturated']=ringWindowSaturated(a8['length']);const a9=a8['filter'](ac=>objectTypeFromAddress(typeof ac?.['who']==='string'?ac['who']:'')===ObjectType['Arb']);a6['count']=a9['length'];for(const ac of a9){if(typeof ac?.['time']==='number'){if(a6['stats']['first_created_ms']===null||ac['time']<a6['stats']['first_created_ms'])a6['stats']['first_created_ms']=ac['time'];if(a6['stats']['last_created_ms']===null||ac['time']>a6['stats']['last_created_ms'])a6['stats']['last_created_ms']=ac['time'];}}const aa=a9['slice'](-0x3)['reverse'](),ab=new Map();if(aa['length']>0x0)try{const ad=await batchQueryObjectsByIds(aa['map'](ae=>String(ae['who'])),e,!![]);for(const ae of ad){if(ae?.['object'])ab['set'](ae['object'],ae);}}catch{h['push']('cases:\x20detail\x20fetch\x20failed\x20(non-blocking)');}for(const af of aa){const ag=typeof af?.['who']==='string'?af['who']:'';if(!ag)continue;const ah=ab['get'](ag);a6['items']['push']({'arb':ag,'order':ah?str(ah['order']):null,'status':ah?ARB_STATUS_NAMES[num(ah['status'])??-0x1]??str(ah['status']):null,'time':typeof af?.['time']==='number'?af['time']:null});}a6['preview_truncated']=a6['count']>a6['items']['length'],a6['preview_truncated']&&(a6['drilldown']={'total_count':a6['count'],'analyzed_count':a6['items']['length'],'prompt':'Analyze\x20ALL\x20dispute\x20cases\x20of\x20Arbitration\x20'+g+'\x20('+e+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20cases\x20live\x20in\x20the\x20arbitration\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+a6['count']+(a6['window_saturated']?',\x20saturated':'')+').\x20')+'For\x20each\x20case\x20call\x20object_panorama\x20with\x20the\x20Arb\x20case\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20case:\x20'+'case\x20address\x20chip\x20(first\x20column)\x20|\x20disputed\x20order\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20(the\x20order\x20is\x20the\x20case\x27s\x20child\x20plane)\x20|\x20status\x20|\x20created\x20(local\x20date)\x20|\x20indemnity\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20arbitrator\x20feedback.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(outcomes,\x20indemnity\x20distribution,\x20case\x20age).\x20Cases\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Arbitration\x20itself.'});}catch{h['push']('cases:\x20affiliation-window\x20lookup\x20failed\x20(non-blocking)');}return{'action':'object_panorama','object':g,'object_type':'Arbitration','network':e,'head':j,'coin_type':Z,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'fee':a0,'fee_display':a1['display'],'fee_tip':a1['tip'],'balance':a2,'balance_display':a3['display'],'balance_tip':a3['tip'],'paused':typeof f['bPaused']==='boolean'?f['bPaused']:null,'usage_guard':str(f['usage_guard'])},'voting_guards':a5,'cases':a6,'data_gaps':h};}if(k==='Repository')return{'action':'object_panorama','object':g,'object_type':'Repository','network':e,'head':j,'fields':{'um':str(f['um']),'permission':str(f['permission']),'data_count':num(f['data_count'])},'policies':arr(f['policies'])['map'](ai=>{const aj=ai;return{'name':str(aj['name'])??'','description':str(aj['description']),'id_from':str(aj['id_from']),'value_type':str(aj['value_type']),'write_guards':arr(aj['write_guard'])['length'],'quote_guard':str(aj['quote_guard'])};}),'rewards':arr(f['rewards'])['map'](ai=>String(ai)),'data_entries':await buildRepositoryData(g,e,h),'data_gaps':h};if(k==='Proof'){const ai=aq=>typeof aq==='string'&&aq?createHash('sha256')['update'](aq)['digest']('hex')['slice'](0x0,0x10):null,aj=str(f['server_pubkey']),ak=str(f['server_signature']),al=num(f['time']),am=num(f['proof_type']),an=str(f['proof']),ao={'action':'object_panorama','object':g,'object_type':'Proof','network':e,'head':j,'fields':{'description':str(f['description']),'anchored_root':an,'item_count':num(f['item_count']),'proof_type':am,'proof_type_label':am===0x1?'1\x20=\x20WTS\x20message\x20proof\x20(WOWOK_WTS_PROOF_TYPE,\x20proof.move:11)\x20—\x20convention,\x20not\x20chain-validated':(am??'unset')+'\x20—\x20unvalidated\x20by\x20the\x20contract\x20(proof.move\x20checks\x20lengths,\x20not\x20type)','about':ownerAddr(f['about']),'signer':ownerAddr(f['signer'])??str(f['signer']),'time_ms':al,'time_iso':al!==null?new Date(al)['toISOString']():null},'server_pubkey':{'present':!!aj,'length':aj?aj['length']:null,'fingerprint':ai(f['server_pubkey'])},'server_signature':{'present':!!ak,'length':ak?ak['length']:null,'fingerprint':ai(f['server_signature'])},'data_gaps':[...h,'server_pubkey\x20/\x20server_signature\x20are\x20shown\x20as\x20sha256\x20fingerprints\x20+\x20length\x20only\x20(a\x20signature\x20is\x20up\x20to\x2040,480\x20bytes)\x20—\x20pass\x20wts_file_path\x20to\x20have\x20this\x20Proof\x20compared\x20against\x20the\x20packet\x20instead\x20of\x20copying\x20the\x20material\x20out']},ap=b['wts_file_path'];if(ap){const aq=await readWtsDocument(ap);aq===undefined?ao['wts_anchor_check']={'root_matched':![],'matched_leaf_indices':[],'key_matched':![],'anchored_before_packet':null,'verdict':'wts_file_path\x20\x22'+ap+'\x22\x20could\x20not\x20be\x20read\x20as\x20a\x20local\x20JSON\x20WTS\x20packet\x20—\x20no\x20cross-check\x20performed.'}:ao['wts_anchor_check']=checkWtsProofAnchor(aq,{'proof':an,'server_pubkey':aj,'time':al,'signer':ao['fields']['signer'],'address':g});}return ao;}throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(k||'unknown')+'\x27\x20for\x20'+g+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Arb\x20/\x20Arbitration\x20/\x20Repository\x20/\x20Proof.');}
|