@wowok/agent-mcp 3.0.4 → 3.0.5
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/evaluation/path-reasoning.d.ts +4 -2
- package/dist/evaluation/path-reasoning.js +1 -1
- package/dist/extensions/constraint-registry.d.ts +2 -2
- package/dist/extensions/constraint-registry.js +1 -1
- package/dist/extensions/custom-registry-file.d.ts +22 -0
- package/dist/extensions/custom-registry-file.js +1 -0
- package/dist/extensions/index.d.ts +2 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-pack.d.ts +7 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/metric-registry.d.ts +2 -2
- package/dist/extensions/metric-registry.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/extensions/registry.d.ts +2 -2
- package/dist/extensions/registry.js +1 -1
- package/dist/extensions/types.d.ts +4 -0
- package/dist/goal/GoalEngine.d.ts +13 -1
- package/dist/goal/GoalEngine.js +1 -1
- package/dist/goal/next-steps.d.ts +12 -0
- package/dist/goal/next-steps.js +1 -0
- package/dist/goal/pursue.d.ts +18 -0
- package/dist/goal/pursue.js +1 -0
- package/dist/goal/types.d.ts +72 -0
- package/dist/goal/types.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +44 -0
- package/dist/graph/onchain/analyze.js +1 -0
- package/dist/graph/onchain/analyze.spec.d.ts +1 -0
- package/dist/graph/onchain/analyze.spec.js +1 -0
- package/dist/graph/onchain/anti-cheat.d.ts +39 -0
- package/dist/graph/onchain/anti-cheat.js +1 -0
- package/dist/graph/onchain/anti-cheat.spec.d.ts +1 -0
- package/dist/graph/onchain/anti-cheat.spec.js +1 -0
- package/dist/graph/onchain/dataplane.d.ts +44 -0
- package/dist/graph/onchain/dataplane.js +1 -0
- package/dist/graph/onchain/edge-schema.d.ts +60 -0
- package/dist/graph/onchain/edge-schema.js +1 -0
- package/dist/graph/onchain/expand.d.ts +4 -0
- package/dist/graph/onchain/expand.js +1 -0
- package/dist/graph/onchain/extract.d.ts +21 -0
- package/dist/graph/onchain/extract.js +1 -0
- package/dist/graph/onchain/index.d.ts +17 -0
- package/dist/graph/onchain/index.js +1 -0
- package/dist/graph/onchain/interest.d.ts +10 -0
- package/dist/graph/onchain/interest.js +1 -0
- package/dist/graph/onchain/interest.spec.d.ts +1 -0
- package/dist/graph/onchain/interest.spec.js +1 -0
- package/dist/graph/onchain/onchain.spec.d.ts +1 -0
- package/dist/graph/onchain/onchain.spec.js +1 -0
- package/dist/graph/onchain/order-status.d.ts +53 -0
- package/dist/graph/onchain/order-status.js +1 -0
- package/dist/graph/onchain/project-relationship.d.ts +3 -0
- package/dist/graph/onchain/project-relationship.js +1 -0
- package/dist/graph/onchain/sdk-batch.d.ts +117 -0
- package/dist/graph/onchain/sdk-batch.js +1 -0
- package/dist/graph/onchain/sdk-dataplane.d.ts +40 -0
- package/dist/graph/onchain/sdk-dataplane.js +1 -0
- package/dist/graph/onchain/strategy.d.ts +54 -0
- package/dist/graph/onchain/strategy.js +1 -0
- package/dist/graph/onchain/strategy.spec.d.ts +1 -0
- package/dist/graph/onchain/strategy.spec.js +1 -0
- package/dist/graph/onchain/types.d.ts +238 -0
- package/dist/graph/onchain/types.js +1 -0
- package/dist/graph/onchain/viewport.d.ts +5 -0
- package/dist/graph/onchain/viewport.js +1 -0
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/enrich.js +1 -1
- package/dist/keeper/detectors.d.ts +1 -1
- package/dist/keeper/detectors.js +1 -1
- package/dist/knowledge/account-marks.js +1 -1
- package/dist/knowledge/anti-cheat.d.ts +2 -37
- package/dist/knowledge/anti-cheat.js +1 -1
- package/dist/knowledge/contract-invariants.js +1 -1
- package/dist/knowledge/getting-started.d.ts +37 -0
- package/dist/knowledge/getting-started.js +1 -0
- package/dist/knowledge/goal-completion.js +1 -1
- package/dist/knowledge/guard-render.d.ts +1 -0
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-submission-brief.d.ts +83 -0
- package/dist/knowledge/guard-submission-brief.js +1 -0
- package/dist/knowledge/guard-submission-prompt.d.ts +13 -0
- package/dist/knowledge/guard-submission-prompt.js +1 -1
- package/dist/knowledge/index.d.ts +6 -4
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.d.ts +91 -0
- package/dist/knowledge/industry-strategy.js +1 -0
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/market-metrics.d.ts +14 -3
- package/dist/knowledge/market-metrics.js +1 -1
- package/dist/knowledge/migration-preflight.js +1 -1
- package/dist/knowledge/operation-dictionary.d.ts +1 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-topology.d.ts +6 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-risk-node.d.ts +3 -0
- package/dist/knowledge/service-risk-node.js +1 -0
- package/dist/knowledge/service-risk.d.ts +2 -0
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/service-templates.d.ts +2 -0
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +17 -0
- package/dist/knowledge/strategy-manuals.js +1 -0
- package/dist/knowledge/supply-chain.d.ts +3 -1
- package/dist/knowledge/supply-chain.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +3 -118
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/ScopeResolver.js +1 -1
- package/dist/participation/radar-core.d.ts +15 -15
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/analyzer.d.ts +2 -1
- package/dist/persona/bridge.d.ts +5 -1
- package/dist/persona/bridge.js +1 -1
- package/dist/persona/defaults.js +1 -1
- package/dist/persona/distill-goal.d.ts +7 -1
- package/dist/persona/distill-goal.js +1 -1
- package/dist/persona/index.d.ts +13 -3
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.d.ts +12 -2
- package/dist/persona/model.js +1 -1
- package/dist/persona/overrides.d.ts +1 -0
- package/dist/persona/overrides.js +1 -1
- package/dist/persona/topology-focus.d.ts +29 -0
- package/dist/persona/topology-focus.js +1 -0
- package/dist/persona/types.d.ts +81 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/context-assembly.js +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.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.d.ts +1 -0
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-query.d.ts +14 -0
- package/dist/playbooks/service-build/topology-query.js +1 -0
- package/dist/role/index.d.ts +1 -0
- package/dist/role/index.js +1 -1
- package/dist/role/profiles.d.ts +26 -0
- package/dist/role/profiles.js +1 -0
- package/dist/safety/confirm-gate.d.ts +4 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/call/allocation.d.ts +6 -6
- package/dist/schema/call/bridge.d.ts +1 -1
- package/dist/schema/call/guard.d.ts +20 -20
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +4 -4
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/employee/index.d.ts +7 -7
- package/dist/schema/evaluation/index.d.ts +22 -9
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +37 -1
- package/dist/schema/goal/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +7 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/local/index.d.ts +8 -4
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +318 -64
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +146 -11
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +15743 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +869 -2
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +163 -41
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-query/index.d.ts +16 -0
- package/dist/schema/schema-query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/strategy-review/index.d.ts +137 -0
- package/dist/schema/strategy-review/index.js +1 -0
- package/dist/schema/trust/index.d.ts +6 -6
- package/dist/schema/workflow/index.d.ts +2 -2
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +8 -4
- package/dist/schemas/account_operation.schema.json +6 -2
- package/dist/schemas/evaluation_operation.output.json +24 -0
- package/dist/schemas/goal_operation.schema.json +124 -0
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/industry_pack_operation.output.json +39 -0
- package/dist/schemas/local_mark_operation.schema.json +2 -2
- package/dist/schemas/messenger_operation.output.json +670 -200
- package/dist/schemas/messenger_operation.schema.json +66 -239
- package/dist/schemas/onchain_operations.schema.json +3 -3
- package/dist/schemas/onchain_operations_repository.schema.json +3 -3
- package/dist/schemas/onchain_table_data.output.json +184 -0
- package/dist/schemas/onchain_table_data.schema.json +43 -43
- package/dist/schemas/persona_operation.output.json +37778 -262
- package/dist/schemas/persona_operation.schema.json +5960 -1
- package/dist/schemas/query_toolkit.output.json +1580 -2
- package/dist/schemas/query_toolkit.schema.json +194 -32
- package/dist/schemas/schema_query.schema.json +25 -1
- package/dist/schemas/strategy_review_operation.output.json +532 -0
- package/dist/schemas/strategy_review_operation.schema.json +66 -0
- package/dist/schemas/wowok_buildin_info.output.json +188 -6
- package/dist/schemas/wowok_buildin_info.schema.json +14 -0
- package/dist/strategy/collectors.d.ts +66 -0
- package/dist/strategy/collectors.js +1 -0
- package/dist/strategy/collectors.spec.d.ts +1 -0
- package/dist/strategy/collectors.spec.js +1 -0
- package/dist/strategy/index.d.ts +5 -0
- package/dist/strategy/index.js +1 -0
- package/dist/strategy/metrics.d.ts +20 -0
- package/dist/strategy/metrics.js +1 -0
- package/dist/strategy/review.d.ts +48 -0
- package/dist/strategy/review.js +1 -0
- package/dist/strategy/scorecard.d.ts +32 -0
- package/dist/strategy/scorecard.js +1 -0
- package/dist/strategy/store.d.ts +26 -0
- package/dist/strategy/store.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/goal.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.js +1 -1
- package/dist/tools/handlers/persona.js +1 -1
- package/dist/tools/handlers/query.d.ts +6 -0
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/strategy-review.d.ts +2 -0
- package/dist/tools/handlers/strategy-review.js +1 -0
- package/dist/tools/handlers/watch.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/local.js +1 -1
- package/dist/tools/registry/messenger.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/shared.d.ts +2 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{COMMERCIAL_ROLES}from'../../role/types.js';import{resolveInterests,ROLE_INTERESTS}from'../../evaluation/game-strategy.js';import{evaluateNodeGame}from'../../evaluation/node-game.js';import{evaluateArbGame}from'../../evaluation/arbitration-game.js';import{consequenceOf,recommendedCallForExecutionPath}from'../../participation/radar-core.js';import{buildViewport}from'./viewport.js';import{buildControlIndex,pathConfidence,runAnalyzers}from'./analyze.js';import{orderCompletionInGraph}from'./expand.js';const VIEWER_OF={'customer':'buyer','prospect':'buyer','demander':'demander','merchant':'merchant','collaborator':'collaborator','supplier':'supplier','arbitrator':'arbitrator','neutral':'neutral','system':'system'},COMMERCIAL_ROLE_SET=new Set(COMMERCIAL_ROLES);export function toCommercialRole(a){if(a==='buyer')return'customer';return COMMERCIAL_ROLE_SET['has'](a)?a:'neutral';}export function viewerRoleOf(a){return VIEWER_OF[a];}function root(a){const b=a?.['raw'],c=b?.['data']??b;return c&&typeof c==='object'?c:undefined;}function str(a){return typeof a==='string'&&a!=='0x0'?a:undefined;}function objNode(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return c&&a['visibleNodes']['has'](c['id'])&&c['kind']==='object'&&c['raw']?c:undefined;}function visible(a,b){return a['visibleEdges']['filter'](c=>c['schema']===b);}function outEdges(a,b,c){const d=b['toLowerCase']();return a['visibleEdges']['filter'](f=>f['schema']===c&&f['from']===d);}function incEdges(a,b,c){const d=b['toLowerCase']();return a['visibleEdges']['filter'](f=>f['schema']===c&&f['to']===d);}function wfMachineOf(a){const b=a['indexOf']('::node::');return b>=0x0?a['slice'](0x0,b):'';}function wfNodeName(a){const b=a['indexOf']('::node::');return b>=0x0?a['slice'](b+'::node::'['length']):a;}function heldPermissionIndices(a,c){const d=new Map();for(const f of outEdges(a,c,'eoa.permission')){const g=new Set();d['set'](f['to'],g);for(const h of outEdges(a,f['to'],'permission.entity')){for(const i of Array['isArray'](h['payload']?.['permIndices'])?h['payload']['permIndices']:[]){const j=Number(i);if(Number['isInteger'](j))g['add'](j);}}}return d;}const MAX_STAKES=0x10;function orderStake(a,b,c,e){const f=objNode(a,b),g=root(f)??{},h=orderCompletionInGraph(a['graph'],b);return{'object':b['toLowerCase'](),'object_type':f?.['objectType']??'Order','positions':c,...str(g['amount'])?{'amount':String(g['amount'])}:{},...f?.['coinType']?{'coin_type':f['coinType']}:{},...h['status']!=='unknown'||f?{'state':h['status']}:{},'evidence':e};}function arbState(a,b){return str(root(objNode(a,b))?.['status']);}function collectStakes(a,b,c,d){const f=new Map(),g=(j,k,l,m)=>{const n=j['toLowerCase'](),o=f['get'](n);if(o){if(!o['positions']['includes'](k))o['positions']['push'](k);for(const p of l)if(!o['evidence']['includes'](p))o['evidence']['push'](p);return;}if(f['size']>=MAX_STAKES)return;f['set'](n,m([k],l));},h=new Set();for(const j of outEdges(a,b,'eoa.order'))h['add'](j['to']);for(const k of incEdges(a,b,'order.builder'))h['add'](k['from']);for(const l of h){g(l,'buyer',['eoa.order','order.builder'],(m,n)=>orderStake(a,l,m,n));}const i=new Set(d['keys']());for(const m of outEdges(a,b,'eoa.permission'))i['add'](m['to']);for(const [n,o]of c['objectsByEoa']){if(n!==b)continue;for(const p of o){const q=a['graph']['nodes']['get'](p);q?.['objectType']==='Demand'?g(p,'demand_owner',['eoa.permission','demand.permission'],(r,s)=>{const t=outEdges(a,p,'demand.presenter')['length'];return{'object':p['toLowerCase'](),'object_type':'Demand','positions':r,'state':t+'\x20presenter(s)','evidence':s};}):g(p,'controller',['eoa.permission','permission.core_binding'],(r,s)=>({'object':p['toLowerCase'](),'object_type':q?.['objectType']??'object','positions':r,'evidence':s}));}}for(const r of visible(a,'demand.permission')){if(!i['has'](r['to']))continue;g(r['from'],'demand_owner',['demand.permission'],(s,t)=>{const u=outEdges(a,r['from'],'demand.presenter')['length'];return{'object':r['from']['toLowerCase'](),'object_type':'Demand','positions':s,'state':u+'\x20presenter(s)','evidence':t};});}for(const [s,t]of c['objectsByEoa']){if(s!==b)continue;for(const u of t){if(a['graph']['nodes']['get'](u)?.['objectType']!=='Service')continue;for(const w of outEdges(a,u,'service.order')){g(w['to'],'seller',['service.order'],(x,y)=>orderStake(a,w['to'],x,y));}}}for(const x of incEdges(a,b,'demand.presenter')){g(x['from'],'presenter',['demand.presenter'],(y,z)=>({'object':x['from']['toLowerCase'](),'object_type':a['graph']['nodes']['get'](x['from'])?.['objectType']??'Demand','positions':y,'evidence':z}));}for(const y of incEdges(a,b,'arb.voter')){g(y['from'],'voter',['arb.voter'],(z,A)=>{const B=arbState(a,y['from']);return{'object':y['from']['toLowerCase'](),'object_type':'Arb','positions':z,...B?{'state':B}:{},'evidence':A};});}for(const [z,A]of c['objectsByEoa']){if(z!==b)continue;for(const B of A){if(a['graph']['nodes']['get'](B)?.['objectType']!=='Arbitration')continue;for(const C of incEdges(a,B,'arb.arbitration_service')){g(C['from'],'arbitration_owner',['arb.arbitration_service'],(D,E)=>{const F=arbState(a,C['from']);return{'object':C['from']['toLowerCase'](),'object_type':'Arb','positions':D,...F?{'state':F}:{},'evidence':E};});}}}for(const [D,E]of f){if(a['graph']['nodes']['get'](D)?.['objectType']!=='Order')continue;if(outEdges(a,D,'order.dispute')['length']>0x0&&!E['positions']['includes']('disputant')){E['positions']['push']('disputant');if(!E['evidence']['includes']('order.dispute'))E['evidence']['push']('order.dispute');}}return[...f['values']()];}const MAX_ACTION_GROUPS=0x8;function forwardsAt(a,b,c){const d=b['toLowerCase']()+'::node::',f=[];for(const g of a['visibleEdges']){if(g['schema']!=='wf.transition'||!g['from']['startsWith'](d))continue;if(wfNodeName(g['from'])!==c)continue;f['push']({'edge':g,'name':String(g['payload']?.['forward']??g['payload']?.['prevNode']+'→'+g['payload']?.['node']),'toNode':String(g['payload']?.['node']??wfNodeName(g['to'])),'permissionIndex':typeof g['payload']?.['permissionIndex']==='number'?g['payload']['permissionIndex']:null,'namedOperator':typeof g['payload']?.['namedOperator']==='string'?g['payload']['namedOperator']:null,'guard':str(g['payload']?.['guard']),'weight':typeof g['payload']?.['weight']==='number'?g['payload']['weight']:undefined,'threshold':typeof g['payload']?.['threshold']==='number'?g['payload']['threshold']:undefined});}return f;}function executionPathOf(a,b,c){if(a['permissionIndex']!=null)return c['has'](a['permissionIndex'])?'permission':'not_available';if(a['namedOperator']==='')return b?'order_holder':'not_available';return'not_available';}function allocationSummaryOf(a,b,c,e){const f=outEdges(a,b,'order.allocation')[0x0]?.['to'];if(!f)return undefined;const g=root(objNode(a,f)),h=Array['isArray'](g?.['allocators'])?g['allocators']:[];if(h['length']===0x0)return undefined;let i=0x0,j=0x0,k=0x0,l=0x0;const m=o=>{if(typeof o==='string')return o['startsWith']('0x')||o['startsWith']('00')?o['toLowerCase']():undefined;if(o&&typeof o==='object'){const p=o;if('Entity'in p)return typeof p['Entity']==='string'?p['Entity']['toLowerCase']():undefined;}return undefined;},n=o=>(o&&typeof o==='object'&&'GuardIdentifier'in o)===!![];for(const o of h){const p=o??{};for(const q of Array['isArray'](p['sharing'])?p['sharing']:[]){const r=q??{};i++;const t=m(r['who']);if(t===c['toLowerCase']())k++;else{if(e&&t===e['toLowerCase']())l++;else{if(r['who']==='Signer')l++;else{if(n(r['who']))j++;}}}}}if(i===0x0)return undefined;return{'recipient_slots':i,'guard_gated_slots':j,'direct_to_me_slots':k,'to_payer_slots':l};}function actionGroupFor(a,b,c,e,g,h,i){const j=objNode(a,g),k=root(j)??{},l=str(k['progress']),m=str(k['machine'])??wfMachineOf(l??''),n=l?root(objNode(a,l)):undefined,o=str(n?.['current'])??'';if(!m||!o||!l)return undefined;const p=forwardsAt(a,m,o);if(p['length']===0x0)return undefined;const q=outEdges(a,g,'order.service')[0x0]?.['to'],r=q?root(objNode(a,q)):undefined,s=outEdges(a,g,'order.builder')[0x0]?.['to'],t=[],u=[],w=new Map(),x=[];for(const A of p){const B=executionPathOf(A,h,i);if(B==='not_available'){const D=A['permissionIndex']!=null?'requires\x20permission\x20index\x20'+A['permissionIndex']+'\x20(not\x20held\x20by\x20the\x20observer\x20in\x20this\x20view)':A['namedOperator']!=null&&A['namedOperator']!==''?'named\x20operator\x20\x27'+A['namedOperator']+'\x27\x20resolves\x20off-chain\x20(LocalMark)\x20—\x20not\x20decidable\x20from\x20graph\x20evidence':'unbound\x20forward\x20—\x20only\x20a\x20guard\x20or\x20the\x20payer\x27s\x20transaction\x20can\x20advance\x20it';u['push']({'forward':A['name'],'reason':D});const E=A['permissionIndex']!=null?'permission\x20index\x20'+A['permissionIndex']:A['namedOperator']!=null&&A['namedOperator']!==''?'named\x20operator\x20\x27'+A['namedOperator']+'\x27':'guard/payer-direct\x20only',F=w['get'](E)??[];F['push'](A['name']),w['set'](E,F);continue;}const C=recommendedCallForExecutionPath(B,A['guard']!=null);t['push']({'name':A['name'],'to_node':A['toNode'],'execution_path':B,...A['guard']?{'guard':A['guard']}:{},'consequence':consequenceOf(A['toNode'],undefined),...A['weight']!==undefined?{'weight':A['weight']}:{}});if(C)x['push']({'forward':A['name'],'call':C});}const y=Math['max'](0x1,...p['map'](G=>G['threshold']??0x1)),z=evaluateNodeGame({'current_node':o,'perspective':c,...e?.['risk_appetite']?{'appetite':e['risk_appetite']}:{},...y>0x1?{'threshold':y}:{},'allocation':allocationSummaryOf(a,g,b,s),...e?.['requirements']?{'requirements':e['requirements']}:{},...str(k['amount'])?{'order_amount':String(k['amount'])}:{},...r&&str(r['compensation_fund'])?{'compensation_fund':String(r['compensation_fund'])}:{},'operable':t,'waiting_on':[...w['entries']()]['map'](([G,H])=>({'role':G,'forwards':H}))});return{'order':g['toLowerCase'](),'machine':m['toLowerCase'](),'current_node':o,'advice':z,'recommended_calls':x,'blocked_forwards':u};}function collectActions(a,c,d,e,f,g){const h=new Set();for(const j of g['values']())for(const k of j)h['add'](k);const i=[];for(const l of f){if(i['length']>=MAX_ACTION_GROUPS)break;if(a['graph']['nodes']['get'](l['object'])?.['objectType']!=='Order')continue;const m=l['positions']['includes']('buyer'),n=actionGroupFor(a,c,d,e,l['object'],m,h);n&&(n['advice']['actions']['length']>0x0||n['blocked_forwards']['length']>0x0)&&i['push'](n);}return i;}function arbPerspectiveOf(a,b,c){if(c['positions']['includes']('voter')||c['positions']['includes']('arbitration_owner'))return'arbitrator';if(c['positions']['includes']('buyer')||c['positions']['includes']('disputant'))return'customer';if(c['positions']['includes']('seller'))return'merchant';return undefined;}function collectArbActions(a,b,c,d){const e=[];for(const f of d){if(a['graph']['nodes']['get'](f['object'])?.['objectType']!=='Arb')continue;const g=arbPerspectiveOf(a,b,f),h=arbState(a,f['object']);if(!g||!h)continue;e['push'](evaluateArbGame(h,g,{...c?.['risk_appetite']?{'risk_appetite':c['risk_appetite']}:{},...c?.['requirements']?{'requirements':c['requirements']}:{}}));}return e;}const SEVERITY_RANK={'info':0x0,'low':0x1,'medium':0x2,'high':0x3},MAX_COUNTERPARTIES=0x8;function collectCounterparties(a,b,c,d,e,f){const g=resolveInterests(c,d),h=[],i=(j,k,l)=>{if(h['length']>=MAX_COUNTERPARTIES)return;const m=ROLE_INTERESTS[k],n=[...g['prefer']['filter'](r=>m['avoid']['includes'](r)),...g['avoid']['filter'](r=>m['prefer']['includes'](r))],o=g['prefer']['filter'](r=>m['prefer']['includes'](r)),p=n['length']>0x0?'conflict':o['length']>0x0?'aligned':'neutral',q=p==='conflict'?'结构性利益冲突:你偏好\x20'+(g['prefer']['filter'](r=>m['avoid']['includes'](r))['join']('、')||'(无)')+',而\x20'+k+'\x20将其视为风险;对方追求\x20'+(m['prefer']['join']('、')||'(无)')+'。':p==='aligned'?'利益一致:双方都偏好\x20'+o['join']('、')+'。':'无直接利益交叠('+k+'\x20偏好\x20'+(m['prefer']['join']('、')||'无')+'、回避\x20'+(m['avoid']['join']('、')||'无')+')。';h['push']({'object':j['toLowerCase'](),'counter_role':k,'who':l,'their_prefer':m['prefer'],'their_avoid':m['avoid'],'alignment':p,'noteZh':q});};for(const j of e){if(a['graph']['nodes']['get'](j['object'])?.['objectType']!=='Order')continue;const k=outEdges(a,j['object'],'order.service')[0x0]?.['to'],l=k?[...f['controllers']['get'](k['toLowerCase']())??[]]:[];i(j['object'],'merchant',l);const m=outEdges(a,j['object'],'order.builder')[0x0]?.['to'];if(m&&m!==b['toLowerCase']())i(j['object'],'customer',[m]);if(outEdges(a,j['object'],'order.dispute')['length']>0x0)i(j['object'],'arbitrator',[]);}return h;}const MAX_RISK_REMINDERS=0xa;function collectRiskReminders(a,b){try{return runAnalyzers(a,{'kinds':['risk']})['filter'](c=>c['roles']['includes'](b)||c['roles']['includes']('neutral'))['sort']((c,d)=>SEVERITY_RANK[d['severity']]-SEVERITY_RANK[c['severity']])['slice'](0x0,MAX_RISK_REMINDERS);}catch{return[];}}export function buildRoleInterest(a,b,c,d){const e=b['toLowerCase'](),f=VIEWER_OF[c],g=buildViewport(a,e,f),h=buildControlIndex(g),i=heldPermissionIndices(g,e),j=collectStakes(g,e,h,i),k=collectActions(g,e,c,d,j,i),l=collectArbActions(g,e,d,j),m=collectCounterparties(g,e,c,d,j,h),n=collectRiskReminders(g,f),o=k['find'](y=>y['advice']['actions']['length']>0x0)?.['advice']['actions'][0x0],p=m['find'](y=>y['alignment']==='conflict'),q='以\x20'+c+'\x20身份观察\x20'+e+':'+(j['length']+'\x20项在途利益('+j['map'](y=>y['object_type']+':'+y['positions']['join']('/'))['slice'](0x0,0x4)['join']('、')+(j['length']>0x4?'\x20等':'')+');')+(o?'当前可执行的最优操作为订单\x20'+(k['find'](y=>y['advice']['actions'][0x0]===o)?.['order']??'')+'\x20的\x20\x27'+o['forward']+'\x27('+o['payoff_note']+');':k['length']>0x0?'存在在途订单但无可由本视角执行的操作(等待他方或链下解析);':'当前无可操作的在途订单;')+(l['length']>0x0?l['length']+'\x20个仲裁案件的行动建议;':'')+(p?'最大结构性对手张力:'+p['counter_role']+'('+p['noteZh']+')':'无明显对手张力')+(n['length']>0x0?';'+n['length']+'\x20条角色相关风险提醒。':'。'),r={'role':c,'observer':e,...d&&(d['risk_appetite']||d['requirements']?.['length'])?{'drive':d}:{},'stakes':j,'actions':k,'arb_actions':l,'counterparties':m,'risk_finding_ids':n['map'](y=>y['id']),'summaryZh':q},s=g['visibleEdges']['filter'](y=>['eoa.order','service.order','demand.presenter','arb.voter','order.dispute']['includes'](y['schema'])),{confidence:t,window:u}=pathConfidence(g,s),w=n['length']>0x0&&SEVERITY_RANK[n[0x0]['severity']]>=SEVERITY_RANK['medium']?n[0x0]['severity']:'info',x={'id':'IR:'+c+':'+e,'kind':'game','severity':w,'titleZh':'角色利益视图('+c+'):'+j['length']+'\x20项在途利益'+(o?',最优操作\x20\x27'+o['forward']+'\x27':''),'path':[e,...j['map'](y=>y['object'])],'confidence':t,...u?{'window':u}:{},'roles':[f],'detailZh':q,'suggestionZh':o?'按\x20advice\x20排序执行(\x27'+o['forward']+'\x27\x20需'+(o['guard']?'先通过\x20Guard\x20护照校验、':'')+'经\x20recommended_calls\x20给出的工具路由);对手张力与风险提醒见\x20payload。':'无可执行操作时:关注\x20blocked_forwards\x20的等待条件与对手张力变化,或切换\x20role/context_account\x20重新投影。','interest':r};return{'finding':x,'view':r};}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,expect,it}from'vitest';import{buildRoleInterest,toCommercialRole,viewerRoleOf}from'./interest.js';function mkNode(a,b,c){return{'id':a['toLowerCase'](),'kind':b?'object':'eoa',...b?{'objectType':b}:{},...c?{'raw':{'object':a,'data':c}}:{},'state':'fetched','origins':[{'depth':0x0}],'depth':0x0};}function mkEdge(a,b,c,d,e,f='complete'){return{'id':a+'|'+c['toLowerCase']()+'→'+d['toLowerCase'](),'schema':a,'family':b,'from':c['toLowerCase'](),'to':d['toLowerCase'](),'retention':f,'evidence':'spec','observedAt':0x0,...e?{'payload':e}:{}};}function mkGraph(a,b){const c=new Map(),d=new Map(),f=(g,h,i)=>{const j=g['get'](h)??[];j['push'](i),g['set'](h,j);};for(const g of b){f(c,g['from'],g),f(d,g['to'],g);}return{'network':'testnet','seed':'spec','builtAt':0x0,'nodes':new Map(a['map'](h=>[h['id'],h])),'edges':b,'out':c,'inc':d,'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}const CUSTOMER='00customer',MERCHANT='00merchant',ARB_EOA='00arb',DEMANDER='00demander',SUPPLIER='00supplier',SERVICE='0xservice',MACHINE='0xmachine',PROGRESS='0xprogress',ORDER='0xorder1',ALLOC='0xalloc',PERM_M='0xpermm',PERM_A='0xperma',PERM_D='0xpermd',ARB_SVC='0xarbsvc',ARB_CASE='0xarbcase',DEMAND='0xdemand';function machineEdges(a=MACHINE){const b=a['toLowerCase']();return[mkEdge('machine.node','W',b,b+'::node::shipping'),mkEdge('machine.node','W',b,b+'::node::done'),mkEdge('machine.node','W',b,b+'::node::refunded'),mkEdge('machine.node','W',b,b+'::node::pack'),mkEdge('wf.transition','W',b+'::node::shipping',b+'::node::done',{'node':'done','prevNode':'shipping','forward':'confirm','namedOperator':''}),mkEdge('wf.transition','W',b+'::node::shipping',b+'::node::refunded',{'node':'refunded','prevNode':'shipping','forward':'cancel','namedOperator':''}),mkEdge('wf.transition','W',b+'::node::shipping',b+'::node::pack',{'node':'pack','prevNode':'shipping','forward':'op','permissionIndex':0x7,'threshold':0x2,'weight':0x1})];}function orderGraphNodes(){return[mkNode(CUSTOMER),mkNode(MERCHANT),mkNode(SERVICE,'Service',{'compensation_fund':'500','bPublished':!![]}),mkNode(MACHINE,'Machine'),mkNode(PROGRESS,'Progress',{'current':'shipping','machine':MACHINE}),mkNode(ORDER,'Order',{'amount':'1000','builder':CUSTOMER,'service':SERVICE,'machine':MACHINE,'progress':PROGRESS}),mkNode(ALLOC,'Allocation',{'allocators':[{'guard':'0x0','sharing':[{'who':{'Entity':MERCHANT},'sharing':'10000','mode':0x1},{'who':'Signer','sharing':'0','mode':0x0},{'who':{'GuardIdentifier':0x1},'sharing':'0','mode':0x0}]}]}),mkNode(PERM_M,'Permission')];}function orderGraphEdges(){return[...machineEdges(),mkEdge('eoa.order','R',CUSTOMER,ORDER,undefined,'bounded_window'),mkEdge('order.builder','F',ORDER,CUSTOMER),mkEdge('order.service','F',ORDER,SERVICE),mkEdge('order.machine','F',ORDER,MACHINE),mkEdge('order.progress','F',ORDER,PROGRESS),mkEdge('order.allocation','F',ORDER,ALLOC),mkEdge('eoa.permission','R',MERCHANT,PERM_M,{'roleBits':0x1}),mkEdge('permission.core_binding','F',PERM_M,SERVICE),mkEdge('service.order','R',SERVICE,'0xorder2',undefined,'bounded_window'),mkEdge('order.builder','F','0xorder2','00someoneelse')];}describe('role\x20coordinate\x20mapping\x20(single\x20system)',()=>{it('maps\x20the\x20viewport\x20alias\x20and\x20persona\x20roles\x20onto\x20CommercialRole',()=>{expect(toCommercialRole('buyer'))['toBe']('customer'),expect(toCommercialRole('customer'))['toBe']('customer'),expect(toCommercialRole('demander'))['toBe']('demander'),expect(toCommercialRole('merchant'))['toBe']('merchant'),expect(toCommercialRole('arbitrator'))['toBe']('arbitrator'),expect(toCommercialRole('who-knows'))['toBe']('neutral');}),it('maps\x20every\x20CommercialRole\x20onto\x20a\x20viewer\x20role',()=>{expect(viewerRoleOf('customer'))['toBe']('buyer'),expect(viewerRoleOf('demander'))['toBe']('demander'),expect(viewerRoleOf('neutral'))['toBe']('neutral');});}),describe('buildRoleInterest\x20—\x20customer',()=>{const a=mkGraph(orderGraphNodes(),orderGraphEdges());it('projects\x20buyer\x20stakes\x20with\x20amount\x20and\x20completion\x20state',()=>{const {view:b}=buildRoleInterest(a,CUSTOMER,'customer'),c=b['stakes']['find'](d=>d['object']===ORDER);expect(c)['toBeDefined'](),expect(c['positions'])['toContain']('buyer'),expect(c['amount'])['toBe']('1000'),expect(c['state'])['toBe']('in_progress'),expect(b['stakes']['some'](d=>d['object']==='0xorder2'))['toBe'](![]);}),it('ranks\x20operable\x20forwards\x20via\x20node-game\x20(order_holder\x20path)',()=>{const {view:b}=buildRoleInterest(a,CUSTOMER,'customer');expect(b['actions'])['toHaveLength'](0x1);const c=b['actions'][0x0];expect(c['order'])['toBe'](ORDER),expect(c['current_node'])['toBe']('shipping');const d=c['advice']['actions']['map'](e=>e['forward']);expect(d)['toContain']('confirm'),expect(d)['toContain']('cancel'),expect(c['advice']['actions'][0x0]['forward'])['toBe']('cancel'),expect(c['advice']['actions'][0x0]['execution_path'])['toBe']('order_holder'),expect(c['blocked_forwards']['map'](e=>e['forward']))['toContain']('op'),expect(c['recommended_calls']['length'])['toBeGreaterThan'](0x0),expect(c['recommended_calls'][0x0]['call']['tool'])['toBe']('onchain_operations');}),it('derives\x20merchant\x20counterparty\x20tension\x20from\x20ROLE_INTERESTS\x20(conflict)',()=>{const {view:b}=buildRoleInterest(a,CUSTOMER,'customer'),c=b['counterparties']['find'](d=>d['counter_role']==='merchant');expect(c)['toBeDefined'](),expect(c['alignment'])['toBe']('conflict'),expect(c['their_prefer'])['toContain']('fund_released_to_merchant');}),it('emits\x20one\x20IR\x20finding\x20carrying\x20the\x20structured\x20payload',()=>{const {finding:b,view:c}=buildRoleInterest(a,CUSTOMER,'customer');expect(b['id'])['toBe']('IR:customer:'+CUSTOMER),expect(b['kind'])['toBe']('game'),expect(b['interest'])['toBe'](c),expect(b['path'][0x0])['toBe'](CUSTOMER),expect(b['confidence'])['toBe']('windowed');}),it('re-anchors\x20scoring\x20with\x20a\x20conservative\x20persona\x20drive',()=>{const b=buildRoleInterest(a,CUSTOMER,'customer')['view'],c=buildRoleInterest(a,CUSTOMER,'customer',{'risk_appetite':'conservative'})['view'],d=b['actions'][0x0]['advice']['actions']['find'](f=>f['forward']==='confirm'),e=c['actions'][0x0]['advice']['actions']['find'](f=>f['forward']==='confirm');expect(e['risk_score'])['toBeGreaterThan'](d['risk_score']),expect(e['favorability'])['toBeLessThan'](d['favorability']);});}),describe('buildRoleInterest\x20—\x20merchant',()=>{const a=[...orderGraphNodes(),mkNode('0xorder2','Order',{'amount':'2000','builder':'00someoneelse','service':SERVICE,'machine':MACHINE,'progress':PROGRESS}),mkNode('00someoneelse')],b=[...orderGraphEdges()['filter'](d=>!(d['schema']==='order.builder'&&d['from']==='0xorder2')),mkEdge('order.builder','F','0xorder2','00someoneelse'),mkEdge('service.order','R',SERVICE,ORDER,undefined,'bounded_window'),mkEdge('permission.entity','W',PERM_M,MERCHANT,{'permIndices':[0x7]})],c=mkGraph(a,b);it('projects\x20controller\x20+\x20seller\x20stakes',()=>{const {view:d}=buildRoleInterest(c,MERCHANT,'merchant'),e=d['stakes']['find'](g=>g['object']===SERVICE);expect(e?.['positions'])['toContain']('controller');const f=d['stakes']['find'](g=>g['object']===ORDER);expect(f?.['positions'])['toContain']('seller');}),it('executes\x20permission-gated\x20forwards\x20only\x20(OrderHolder\x20forwards\x20stay\x20blocked)',()=>{const {view:d}=buildRoleInterest(c,MERCHANT,'merchant'),e=d['actions']['find'](h=>h['order']===ORDER);expect(e)['toBeDefined']();const f=e['advice']['actions']['find'](g=>g['forward']==='op');expect(f)['toBeDefined'](),expect(f['execution_path'])['toBe']('permission'),expect(e['recommended_calls']['find'](g=>g['forward']==='op')['call']['tool'])['toBe']('workflow_operation'),expect(e['blocked_forwards']['map'](g=>g['forward'])['sort']())['toEqual'](['cancel','confirm']),expect(e['advice']['actions'])['toHaveLength'](0x1),expect(e['advice']['actions'][0x0]['forward'])['toBe']('op'),expect(e['advice']['actions'][0x0]['is_optimal'])['toBe'](!![]);}),it('projects\x20the\x20allocation\x20waterfall\x20(direct_to_me\x20slots)',()=>{const {view:d}=buildRoleInterest(c,MERCHANT,'merchant'),e=d['actions']['find'](h=>h['order']===ORDER),f=e['advice']['cooperation'];expect(f)['toBeDefined'](),expect(f['needed_from_others'])['toBeGreaterThan'](0x0);}),it('surfaces\x20role-relevant\x20R/AC\x20risk\x20reminders\x20(R2\x20exposure\x20fires\x20for\x20the\x20merchant\x20view)',()=>{const {view:d,finding:e}=buildRoleInterest(c,MERCHANT,'merchant');expect(d['risk_finding_ids']['some'](f=>f['startsWith']('R2:')))['toBe'](!![]),expect(e['severity'])['toBe']('high');});}),describe('buildRoleInterest\x20—\x20demander',()=>{const a=[mkNode(DEMANDER),mkNode(SUPPLIER),mkNode(PERM_D,'Permission'),mkNode(DEMAND,'Demand',{'description':'car\x20wash\x20in\x20london'})],b=[mkEdge('eoa.permission','R',DEMANDER,PERM_D,{'roleBits':0x1}),mkEdge('demand.permission','F',DEMAND,PERM_D),mkEdge('demand.presenter','R',DEMAND,SUPPLIER),mkEdge('demand.permission','F','0xdemand2','0xpermother')],c=mkGraph(a,b);it('anchors\x20own\x20demands\x20through\x20the\x20permission\x20(demand_owner\x20stake,\x20presenter\x20count)',()=>{const {view:d}=buildRoleInterest(c,DEMANDER,'demander'),e=d['stakes']['find'](f=>f['object']===DEMAND);expect(e)['toBeDefined'](),expect(e['positions'])['toContain']('demand_owner'),expect(e['state'])['toBe']('1\x20presenter(s)'),expect(d['stakes']['some'](f=>f['object']==='0xdemand2'))['toBe'](![]);});}),describe('buildRoleInterest\x20—\x20arbitrator',()=>{const a=[mkNode(ARB_EOA),mkNode(PERM_A,'Permission'),mkNode(ARB_SVC,'Arbitration',{'voting_guard':[]}),mkNode(ARB_CASE,'Arb',{'status':'Voting','order':ORDER}),...orderGraphNodes()],b=[mkEdge('eoa.permission','R',ARB_EOA,PERM_A,{'roleBits':0x1}),mkEdge('permission.core_binding','F',PERM_A,ARB_SVC),mkEdge('arb.arbitration_service','F',ARB_CASE,ARB_SVC),mkEdge('arb.voter','S',ARB_CASE,ARB_EOA,{'weight':0x1}),...orderGraphEdges()],c=mkGraph(a,b);it('collects\x20voter\x20stakes\x20and\x20arbitration-game\x20advice\x20(Voting\x20→\x20vote\x20is\x20optimal)',()=>{const {view:d}=buildRoleInterest(c,ARB_EOA,'arbitrator'),e=d['stakes']['find'](f=>f['object']===ARB_CASE);expect(e?.['positions'])['toContain']('voter'),expect(e?.['positions'])['toContain']('arbitration_owner'),expect(e?.['state'])['toBe']('Voting'),expect(d['arb_actions'])['toHaveLength'](0x1),expect(d['arb_actions'][0x0]['perspective'])['toBe']('arbitrator'),expect(d['arb_actions'][0x0]['actions'][0x0]['action'])['toBe']('vote'),expect(d['arb_actions'][0x0]['actions'][0x0]['is_optimal'])['toBe'](!![]);});}),describe('buildRoleInterest\x20—\x20prospect\x20(no\x20on-chain\x20stake)',()=>{it('returns\x20an\x20honest\x20empty\x20view\x20instead\x20of\x20guessing',()=>{const a=mkGraph(orderGraphNodes(),orderGraphEdges()),{view:b,finding:c}=buildRoleInterest(a,'00stranger','prospect');expect(b['stakes'])['toHaveLength'](0x0),expect(b['actions'])['toHaveLength'](0x0),expect(c['interest'])['toBe'](b),expect(c['kind'])['toBe']('game');});});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology,orderCompletionInGraph}from'./expand.js';import{extractObjectEdges,extractReverseRefs,extractTableRefs}from'./extract.js';import{annotateNodeName,deriveOrderCompletion,terminalNamesOfEdges,terminalNamesOfRows,workflowSubgraphFromRows,workflowSubgraphFromEdges}from'./order-status.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMAS}from'./edge-schema.js';import{FIELD_MUTABILITY_RULES,fieldMutabilityOf,isActionForbidden}from'../../knowledge/contract-invariants.js';import{buildViewport}from'./viewport.js';function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),otherBuyer=eoa(0x2),merchant=eoa(0x3),collaborator=eoa(0x4),voter1=eoa(0x5),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),o2=obj(0x6,0x16),o3=obj(0x6,0x17),o4=obj(0x6,0x18),pr1=obj(0x7,0x1f),pr2=obj(0x7,0x20),pay=obj(0x8,0x29),perm=obj(0x0,0x33),g1=obj(0xa,0x3d),g2=obj(0xa,0x3e),gShip=obj(0xa,0x3f),gOther=obj(0xa,0x45),alloc=obj(0xd,0x47),arbsvc=obj(0x3,0x51),arb=obj(0x2,0x52);function raw(a,b,c,d){return{'object':a,'type':b,'data':c,...d?{'type_raw':d}:{}};}const OBJECTS=[raw(svc,'Service',{'permission':perm,'machine':mac,'arbitrations':[arbsvc],'order_allocators':{'allocators':[{'guard':g1}]}},'0x2::service::Service<'+T_USDT+'>'),raw(o1,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'allocation':alloc,'dispute':[arb]}),raw(o2,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr2,'allocation':alloc,'dispute':[]}),raw(o3,'Order',{'builder':buyer,'agent':[],'service':svc,'dispute':[]}),raw(o4,'Order',{'builder':otherBuyer,'agent':[],'service':svc,'machine':mac,'progress':undefined,'dispute':[]}),raw(mac,'Machine',{'permission':perm,'consensus_repositories':[]}),raw(pr1,'Progress',{'machine':mac,'task':o1,'current':'done'}),raw(pr2,'Progress',{'machine':mac,'task':o2,'current':'shipping'}),raw(alloc,'Allocation',{'allocators':{'threshold':0x1,'allocators':[{'guard':g1,'mode':0x0}]}},'0x2::allocation::Allocation<'+T_USDT+'>'),raw(perm,'Permission',{'admin':[merchant]}),raw(g1,'Guard',{'relies':[g2]}),raw(g2,'Guard',{'relies':[]}),raw(gShip,'Guard',{'relies':[]}),raw(arbsvc,'Arbitration',{'permission':perm,'voting_guard':[{'guard':g1}]}),raw(arb,'Arb',{'order':o1,'arbitration':arbsvc,'voted':[{'voter':voter1,'weight':0x3}]}),raw(pay,'Payment',{'record':[{'recipient':merchant,'amount':'99900'}],'from_object':alloc,'info':{'for_object':o1,'for_guard':g1}},'0x2::payment::Payment<'+T_USDT+'>')];let TABLE_SEQ=0x0;function nodeTableItem(a,b,c){TABLE_SEQ++;const d='0x9'+TABLE_SEQ['toString'](0x10)['padStart'](0x3f,'0');return{'key':a,'objectId':d,'object':raw(d,'TableItem_MachineNode',{'name':b,'value':c})};}function permTableItem(a,b){const c='0x9'+a['slice'](0x2,0x1e)['padEnd'](0x3f,'0')['slice'](0x0,0x3f);return{'key':a,'objectId':c,'object':raw(c,'TableItem_PermissionPerm',{'address':a,'perm':b})};}function makePlane(){const a=[nodeTableItem('start','start',[]),nodeTableItem('shipping','shipping',[{'prev_node':'start','threshold':0x0,'forwards':[{'name':'f_ship','weight':0x1,'guard':gShip}]}]),nodeTableItem('done','done',[{'prev_node':'shipping','threshold':0x0,'forwards':[{'name':'f_done','weight':0x1}]}])],b=new Map(OBJECTS['map'](e=>[e['object']['toLowerCase'](),e])),c=new Map();c['set']('0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1},{'role':0x2,'order':o2,'time':0x2},{'role':0x1,'order':o3,'time':0x3}]}]])),c['set']('0xaaad',new Map([[merchant,{'items':[{'role':0x1,'permission':perm,'time':0x1}]}]])),c['set']('0xaae',new Map([[perm,{'items':[{'who':svc,'time':0x1}]}]])),c['set']('0xaaf',new Map([[svc,{'items':[{'who':o1,'time':0x1},{'who':o2,'time':0x2},{'who':o4,'time':0x3},{'who':gOther,'time':0x4}]}]]));const d=new Map([[mac['toLowerCase'](),a],[perm['toLowerCase'](),[permTableItem(collaborator,[0x1,0x2])]]]);return new FakeDataPlane({'objects':b,'keyedFields':c,'tables':d});}const FULL_EDGES={'tableEdges':['machine.node','permission.entity']};async function buildBuyerGraph(a){const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES,...a?{'budget':a}:{}});return{'graph':c,'plane':b};}describe('extract\x20—\x20field\x20edges',()=>{it('reads\x20scalar,\x20vector,\x20struct\x20and\x20deep\x20nested\x20refs\x20defensively',()=>{const a=extractObjectEdges('Service',OBJECTS[0x0]),b=new Map(a['map'](c=>[c['schemaId'],c['refs']['map'](d=>d['to'])]));expect(b['get']('service.permission'))['toEqual']([perm]),expect(b['get']('service.machine'))['toEqual']([mac]),expect(b['get']('service.arbitration'))['toEqual']([arbsvc]),expect(b['get']('service.order_allocator_guard'))['toEqual']([g1]);}),it('parses\x20coin\x20type\x20T\x20and\x20money\x20payloads\x20on\x20Payment',()=>{const a=extractObjectEdges('Payment',OBJECTS['find'](d=>d['object']===pay)),b=new Map(a['map'](d=>[d['schemaId'],d])),c=b['get']('payment.recipient')['refs'][0x0];expect(c['to'])['toBe'](merchant),expect(c['payload']?.['amount'])['toBe']('99900'),expect(c['payload']?.['coinType'])['toBe'](T_USDT),expect(b['get']('payment.from_object')['refs'][0x0]['to'])['toBe'](alloc),expect(b['get']('payment.for_guard')['refs'][0x0]['to'])['toBe'](g1);}),it('reverse\x20field\x20shapes:\x20items[]\x20and\x20votes[]\x20with\x20role/vote\x20payloads',()=>{expect(extractReverseRefs('0xaa8',{'items':[{'role':0x3,'order':o1}]})[0x0]['payload']?.['roleBits'])['toBe'](0x3);const a=extractReverseRefs('0xaaa',{'votes':[{'who':voter1,'like':!![],'favor':!![]}]});expect(a[0x0]['payload']?.['voteBits'])['toBe'](0x2|0x8);}),it('machine\x20table\x20rows\x20produce\x20node\x20+\x20transition\x20+\x20guard\x20edges',()=>{const a=makePlane()['state']['tables']['get'](mac['toLowerCase']()),b=extractTableRefs('machine.node',mac,a),c=new Map(b['map'](e=>[e['schemaId'],e['refs']]));expect(c['get']('machine.node')?.['length'])['toBe'](0x3);const d=c['get']('wf.transition');expect(d['map'](e=>[e['from']['includes']('start'),e['to']['includes']('shipping')]))['toContainEqual']([!![],!![]]),expect(c['get']('wf.forward_guard')?.[0x0]['to'])['toBe'](gShip);});}),describe('order-status\x20—\x20structural\x20authority',()=>{it('terminal\x20=\x20names\x20never\x20appearing\x20as\x20prev_node',()=>{const a=terminalNamesOfEdges([{'node':'shipping','prev_node':'start'},{'node':'done','prev_node':'shipping'}]);expect([...a])['toEqual'](['done']),expect([...terminalNamesOfRows([{'name':'a','value':[]},{'name':'b','value':[{'prev_node':'a'}]}])])['toEqual'](['b']);}),it('four\x20completion\x20states',()=>{const a=new Set(['done']);expect(deriveOrderCompletion({'machine':null})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':null})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'shipping','terminalNames':a})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':a})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':null})['status'])['toBe']('unknown');}),it('name\x20vocabulary\x20is\x20annotation\x20only',()=>{expect(annotateNodeName('order_refunded'))['toBe']('refund'),expect(annotateNodeName('dispute_node'))['toBe']('exception'),expect(annotateNodeName('shipping'))['toBeNull']();}),it('workflowSubgraphFromRows\x20flattens\x20pairs/forwards\x20and\x20keeps\x20structural\x20terminals',()=>{const a=workflowSubgraphFromRows([{'name':'shipped','value':[{'prev_node':'paid','threshold':0x2,'forwards':[{'name':'ship','guard':{'guard':'0xg','retained_submission':[]},'weight':0x1},{'name':'airdrop','namedOperator':'op','permissionIndex':0x3}]}]},{'name':'done','value':[{'prev_node':'shipped','forwards':[{'name':'confirm'}]}]}],'0xm');expect(a['machine'])['toBe']('0xm'),expect(a['transitions']['map'](b=>b['prevNode']+'>'+b['forward']+'>'+b['node']))['toEqual'](['paid>ship>shipped','paid>airdrop>shipped','shipped>confirm>done']),expect(a['transitions'][0x0]['guard'])['toBe']('0xg'),expect(a['transitions'][0x0]['threshold'])['toBe'](0x2),expect(a['transitions'][0x1]['namedOperator'])['toBe']('op'),expect(a['transitions'][0x1]['permissionIndex'])['toBe'](0x3),expect([...a['terminalNames']])['toEqual'](['done']);}),it('workflowSubgraphFromEdges\x20reads\x20wf.transition\x20payloads\x20and\x20filters\x20by\x20machine',()=>{const a=[{'schema':'wf.transition','from':'0xm1::node::paid','to':'0xm1::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}},{'schema':'wf.transition','from':'0xm2::node::paid','to':'0xm2::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm'}},{'schema':'machine.node','from':'0xm1','to':'0xm1::node::paid'}],b=workflowSubgraphFromEdges(a);expect(b['transitions'])['toHaveLength'](0x2);const c=workflowSubgraphFromEdges(a,'0xm1');expect(c['transitions'])['toHaveLength'](0x1),expect(c['transitions'][0x0])['toMatchObject']({'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}),expect([...c['terminalNames']])['toEqual'](['done']);});}),describe('expandTopology\x20—\x20wave\x20BFS\x20over\x20DataPlane',()=>{it('connects\x20F/R/W/S/M\x20edges\x20with\x20dedupe\x20and\x20no\x20per-id\x20fan-out',async()=>{const {graph:a,plane:b}=await buildBuyerGraph(),c=new Set(a['edges']['map'](f=>f['schema']));for(const e of['eoa.order','order.service','order.progress','order.allocation','service.permission','service.machine','service.order_allocator_guard','service.arbitration','machine.permission','progress.machine','machine.node','wf.transition','wf.forward_guard','guard.relies','arb.order','arb.voter','allocation.guard']){expect(c['has'](e),'missing\x20edge\x20'+e)['toBe'](!![]);}const d=a['edges']['filter'](f=>f['schema']==='service.order')['map'](f=>f['to']);expect(new Set(d))['toEqual'](new Set([o1,o2,o4])),expect(a['nodes']['get'](svc)?.['objectType'])['toBe']('Service'),expect(a['edges']['length'])['toBe'](new Set(a['edges']['map'](f=>f['id']))['size']),expect(b['batches']['objects'])['toBeLessThanOrEqual'](0x6),expect(a['gaps'])['toEqual']([]);}),it('resolves\x20completion\x20from\x20the\x20graph;\x20unknown\x20when\x20machine\x20table\x20not\x20expanded',async()=>{const {graph:a}=await buildBuyerGraph();expect(orderCompletionInGraph(a,o1)['status'])['toBe']('completed'),expect(orderCompletionInGraph(a,o2)['status'])['toBe']('in_progress'),expect(orderCompletionInGraph(a,o3)['status'])['toBe']('completed');const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(orderCompletionInGraph(c,o1)['status'])['toBe']('unknown');}),it('caps\x20per-kind\x20fanout\x20and\x20records\x20truncation;\x20window\x20edges\x20flagged',async()=>{const {graph:a}=await buildBuyerGraph({'perKindCaps':{'eoa.order':0x1}});expect(a['edges']['filter'](b=>b['schema']==='eoa.order'))['toHaveLength'](0x1),expect(a['truncations']['some'](b=>b['schema']==='eoa.order'))['toBe'](!![]),expect(a['edges']['find'](b=>b['schema']==='eoa.order')?.['truncated'])['toBe'](!![]);}),it('fail-soft:\x20missing\x20objects\x20become\x20gaps,\x20build\x20still\x20succeeds',async()=>{const a=makePlane();a['state']['objects']['delete'](mac['toLowerCase']());const b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES});expect(b['nodes']['get'](mac)?.['state'])['toBe']('error'),expect(b['gaps'])['toContain'](mac),expect(b['edges']['some'](c=>c['schema']==='order.service'))['toBe'](!![]);}),it('enforces\x20maxDepth',async()=>{const {graph:a}=await buildBuyerGraph({'maxDepth':0x1});expect(a['nodes']['has'](o1))['toBe'](!![]),expect(a['nodes']['has'](svc))['toBe'](![]),expect(a['budgetExhausted']['depth'])['toBe'](!![]);});}),describe('DataPlane\x20batching',()=>{it('chunks\x20at\x2050\x20and\x20counts\x20logical\x20RPC\x20batches',async()=>{const a=new FakeDataPlane({});await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),expect(a['dedupHits'])['toBe'](0x65);});}),describe('viewport',()=>{it('buyer\x20never\x20sees\x20other\x20customers\x20through\x20service.order',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'buyer');expect(b['visibleNodes']['has'](o1))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](![]);}),it('merchant\x20sees\x20shop\x20orders\x20and\x20their\x20parties',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,merchant,'merchant');expect(b['visibleNodes']['has'](perm))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](!![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](!![]),expect(b['visibleNodes']['has'](collaborator))['toBe'](!![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](!![]);}),it('neutral\x20role\x20sees\x20the\x20full\x20canon\x20graph',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']);});}),describe('edge\x20schema\x20registry',()=>{it('covers\x20the\x20core\x20commercial\x20object\x20types',()=>{for(const a of['Service','Order','Machine','Progress','Payment','Allocation','Arbitration','Arb','Permission','Guard','Demand','Reward','Contact','Treasury']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}});}),describe('EdgeSchema.contract\x20—\x20field\x20mutability\x20ground\x20truth',()=>{const a=['service.machine','service.buy_guard','service.arbitration','service.reward','service.repository','progress.machine','progress.task','machine.consensus_repository','machine.node','allocation.guard'];it('marks\x20exactly\x20the\x20address-field\x20edges\x20with\x20mutability\x20metadata',()=>{const b=EDGE_SCHEMAS['filter'](c=>c['contract'])['map'](c=>c['id'])['sort']();expect(b)['toEqual']([...a]['sort']());}),it('carries\x20the\x20publish-freeze\x20distinction\x20(machine\x20frozen,\x20buy_guard\x20mutable)',()=>{const b=EDGE_SCHEMAS['find'](d=>d['id']==='service.machine')['contract'];expect(b['frozenWhen'])['toBe']('after\x20publish'),expect(b['forbiddenActions'])['toContain']('set'),expect(b['unfreeze'])['toBeNull']();const c=EDGE_SCHEMAS['find'](d=>d['id']==='service.buy_guard')['contract'];expect(c['frozenWhen'])['toBeNull'](),expect(c['allowedActions'])['toContain']('set');}),it('derives\x20the\x20knowledge\x20field-rule\x20table\x20without\x20duplicating\x20facts',()=>{expect(fieldMutabilityOf('Service','machine')?.['frozen_when'])['toBe']('after\x20publish'),expect(fieldMutabilityOf('Machine','nodes')?.['forbidden_actions'])['toContain']('update'),expect(fieldMutabilityOf('Allocation','allocators')?.['frozen_when'])['toBe']('after\x20create\x20(share)'),expect(EDGE_SCHEMAS['find'](c=>c['id']==='allocation.guard')['contract']['field'])['toBe']('allocators');const b=FIELD_MUTABILITY_RULES['map'](c=>c['object_type']+'.'+c['field']);expect(new Set(b)['size'])['toBe'](b['length']),expect(FIELD_MUTABILITY_RULES)['toHaveLength'](0x14),expect(isActionForbidden('Service','machine','set',!![]))['toBe'](!![]),expect(isActionForbidden('Service','machine','set',![]))['toBe'](![]),expect(isActionForbidden('Service','buy_guard','set',!![]))['toBe'](![]);});});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface StructPair {
|
|
2
|
+
node: string;
|
|
3
|
+
prev_node: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function terminalNamesOfEdges(edges: StructPair[]): Set<string>;
|
|
6
|
+
export declare function terminalNamesOfRows(rows: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
value?: Array<{
|
|
9
|
+
prev_node?: string | null;
|
|
10
|
+
}>;
|
|
11
|
+
}>): Set<string>;
|
|
12
|
+
export type OrderCompletion = "completed" | "in_progress" | "unknown";
|
|
13
|
+
export interface CompletionInput {
|
|
14
|
+
machine?: string | null;
|
|
15
|
+
progress?: string | null;
|
|
16
|
+
currentNode?: string | null;
|
|
17
|
+
terminalNames?: Set<string> | null;
|
|
18
|
+
}
|
|
19
|
+
export interface CompletionResult {
|
|
20
|
+
status: OrderCompletion;
|
|
21
|
+
terminal?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function deriveOrderCompletion(input: CompletionInput, onUnknown?: () => void): CompletionResult;
|
|
24
|
+
export type TerminalFlavor = "completion" | "refund" | "exception";
|
|
25
|
+
export declare function annotateNodeName(name: string): TerminalFlavor | null;
|
|
26
|
+
export declare function annotateTerminals(terminalNames: Set<string>): Map<string, TerminalFlavor>;
|
|
27
|
+
export interface WfTransitionView {
|
|
28
|
+
node: string;
|
|
29
|
+
prevNode: string;
|
|
30
|
+
forward?: string;
|
|
31
|
+
threshold?: number;
|
|
32
|
+
guard?: string | null;
|
|
33
|
+
weight?: number | null;
|
|
34
|
+
namedOperator?: string | null;
|
|
35
|
+
permissionIndex?: number | null;
|
|
36
|
+
}
|
|
37
|
+
export interface WorkflowSubgraph {
|
|
38
|
+
machine?: string;
|
|
39
|
+
transitions: WfTransitionView[];
|
|
40
|
+
terminalNames: Set<string>;
|
|
41
|
+
}
|
|
42
|
+
export declare function workflowSubgraphFromEdges(edges: Array<{
|
|
43
|
+
schema?: string;
|
|
44
|
+
from?: string;
|
|
45
|
+
to?: string;
|
|
46
|
+
payload?: Record<string, unknown> | null;
|
|
47
|
+
}>, machine?: string): WorkflowSubgraph;
|
|
48
|
+
export interface MachineRowLike {
|
|
49
|
+
name: string;
|
|
50
|
+
value?: Array<Record<string, unknown> | null> | null;
|
|
51
|
+
pairs?: Array<Record<string, unknown> | null> | null;
|
|
52
|
+
}
|
|
53
|
+
export declare function workflowSubgraphFromRows(rows: MachineRowLike[], machine?: string): WorkflowSubgraph;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function terminalNamesOfEdges(a){const b=new Set(),c=new Set();for(const d of a){if(!d?.['node'])continue;b['add'](d['node']);if(d['prev_node'])c['add'](d['prev_node']);}return new Set([...b]['filter'](f=>!c['has'](f)));}export function terminalNamesOfRows(a){const b=new Set(a['map'](d=>d['name'])),c=new Set();for(const d of a)for(const e of d['value']??[])if(e['prev_node'])c['add'](e['prev_node']);return new Set([...b]['filter'](f=>!c['has'](f)));}export function deriveOrderCompletion(a,b){if(!a['machine'])return{'status':'completed'};if(!a['progress']||!a['currentNode'])return{'status':'in_progress'};if(!a['terminalNames'])return b?.(),{'status':'unknown'};if(a['terminalNames']['has'](a['currentNode']))return{'status':'completed','terminal':a['currentNode']};return{'status':'in_progress'};}const COMPLETION_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved|active)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;export function annotateNodeName(a){if(COMPLETION_RE['test'](a))return'completion';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return null;}export function annotateTerminals(a){const b=new Map();for(const c of a){const d=annotateNodeName(c);if(d)b['set'](c,d);}return b;}function subgraphOf(a,b){return{'machine':b,'transitions':a,'terminalNames':terminalNamesOfEdges(a['map'](c=>({'node':c['node'],'prev_node':c['prevNode']})))};}function flattenGuard(a){if(a&&typeof a==='object'&&typeof a['guard']==='string')return a['guard'];return typeof a==='string'?a:null;}export function workflowSubgraphFromEdges(a,b){const c=b?b['toLowerCase']()+'::node::':undefined,d=[];for(const f of a){if(f['schema']!=='wf.transition')continue;if(c&&!f['from']?.['startsWith'](c)&&!f['to']?.['startsWith'](c))continue;const g=f['payload']??{};if(typeof g['node']!=='string'||typeof g['prevNode']!=='string')continue;d['push']({'node':g['node'],'prevNode':g['prevNode'],'forward':typeof g['forward']==='string'?g['forward']:undefined,'threshold':typeof g['threshold']==='number'?g['threshold']:undefined,'guard':flattenGuard(g['guard']),'weight':typeof g['weight']==='number'?g['weight']:null,'namedOperator':g['namedOperator']!=null?String(g['namedOperator']):null,'permissionIndex':typeof g['permissionIndex']==='number'?g['permissionIndex']:null});}return subgraphOf(d,b);}export function workflowSubgraphFromRows(a,b){const c=[];for(const d of a){const e=typeof d?.['name']==='string'?d['name']:'';if(!e)continue;for(const g of d['value']??d['pairs']??[]){const h=g??{},i=typeof h['prev_node']==='string'?h['prev_node']:'',j=typeof h['threshold']==='number'?h['threshold']:undefined,k=Array['isArray'](h['forwards'])&&h['forwards']['length']>0x0?h['forwards']:[undefined];for(const l of k){const m=l??{},n=m['name'];c['push']({'node':e,'prevNode':i,'forward':typeof n==='string'&&n?n:undefined,'threshold':j,'guard':flattenGuard(m['guard']),'weight':typeof m['weight']==='number'?m['weight']:null,'namedOperator':typeof m['namedOperator']==='string'?m['namedOperator']:typeof m['named_operator']==='string'?m['named_operator']:null,'permissionIndex':typeof m['permissionIndex']==='number'?m['permissionIndex']:typeof m['permission_index']==='number'?m['permission_index']:null});}}}return subgraphOf(c,b);}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{rootOf}from'./extract.js';const MAX_MANAGED_TOTAL=0x3c,MAX_ORDERS=0x28,MAX_DEMANDS=0x14,MAX_ALLOCATIONS=0x28,MAX_CONTACTS=0x14,MAX_MACHINES=0xa,MAX_ARB_SERVICES=0xf;function fld(a,b){if(!a?.['raw'])return undefined;const c=rootOf(a['raw']);return c[b];}function addrList(a,b){const c=fld(a,b);return(Array['isArray'](c)?c:[])['filter'](d=>typeof d==='string');}function outEdges(a,b,c){return(a['out']['get'](b['toLowerCase']())??[])['filter'](d=>d['schema']===c);}function rawOf(a,b){return b?a['nodes']['get'](b['toLowerCase']()):undefined;}function managedTargets(a,b){const c=new Set();for(const d of[...outEdges(a,b,'permission.core_binding'),...outEdges(a,b,'permission.tx_binding')]){c['add'](d['to']);}return[...c]['map'](f=>a['nodes']['get'](f))['filter'](f=>!!f&&f['kind']==='object');}function mapMode(a){if(a===0x1||a==='Rate')return'Rate';if(a===0x2||a==='Surplus')return'Surplus';return'Amount';}export function projectRelationshipFacts(b,c){const f=c['toLowerCase'](),g=outEdges(b,f,'eoa.permission'),h=[],i=new Map();for(const C of g){const D=b['nodes']['get'](C['to']);if(!D)continue;const E=outEdges(b,D['id'],'permission.entity')['map'](H=>({'address':H['to'],'perm_indices':H['payload']?.['permIndices']??[]})),F=managedTargets(b,D['id']),G=F['filter'](H=>!!H['objectType'])['map'](H=>({'object_type':H['objectType'],'address':H['id']}));for(const H of G){if(i['size']>=MAX_MANAGED_TOTAL)break;i['set'](H['address']['toLowerCase'](),H);}h['push']({'address':D['id'],'owner':fld(D,'owner')??'','admins':addrList(D,'admin'),'entities':E,'anchor_role_bits':C['payload']?.['roleBits'],'managed_objects':G});}const j=I=>[...i['values']()]['filter'](J=>J['object_type']===I)['map'](J=>J['address']),k=j('Service'),l=j('Machine')['slice'](0x0,MAX_MACHINES),n=j('Demand')['slice'](0x0,MAX_DEMANDS),p=j('Contact')['slice'](0x0,MAX_CONTACTS),q=j('Arbitration'),r=new Map();for(const I of outEdges(b,f,'eoa.order'))r['set'](I['to'],'buyer');for(const J of k){for(const K of outEdges(b,J,'service.order'))r['set'](K['to'],'merchant');}const t=[],u={};for(const L of[...r['keys']()]['slice'](0x0,MAX_ORDERS)){const M=rawOf(b,L);if(!M||M['objectType']!=='Order')continue;const N=fld(M,'service')??'';t['push']({'address':M['id'],'owner':fld(M,'owner')??fld(M,'builder')??'','agents':addrList(M,'agent'),'service':N,'amount':fld(M,'amount'),'allocation':fld(M,'allocation'),'dispute_arbitrations':addrList(M,'dispute'),'claimed_by':fld(M,'claimed_by')??null});if(N){const O=rawOf(b,N),P=outEdges(b,N,'service.permission')[0x0]?.['to'],Q=rawOf(b,P),R=fld(Q,'owner');if(R)u[O?.['id']??N['toLowerCase']()]=R;}}const v=n['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'demand.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=outEdges(b,S,'demand.presenter')['map'](Y=>({'address':Y['to'],'service':typeof Y['payload']?.['service']==='string'?Y['payload']['service']:undefined,'acceptance_score':typeof Y['payload']?.['score']==='number'?Y['payload']['score']:undefined})),X=(fld(T,'guards')??[])['map'](Y=>typeof Y==='string'?Y:Y?.['guard'])['filter'](Y=>typeof Y==='string');return{'address':T['id'],'owner':V,'presenters':W,'rewards':addrList(T,'rewards'),'guards':X};}),w=[...new Set(t['map'](S=>S['allocation'])['filter'](S=>!!S))]['slice'](0x0,MAX_ALLOCATIONS),x=w['map'](S=>{const T=rawOf(b,S),U=fld(T,'allocators')??rootOf(T['raw']),V=Array['isArray'](U)?U:Array['isArray'](U?.['allocators'])?U['allocators']:[],W=V['flatMap'](X=>(Array['isArray'](X?.['sharing'])?X['sharing']:[])['map'](Y=>({'who':Y?.['who']??Y,'mode':mapMode(Y?.['mode']),'sharing':Y?.['sharing']!=null?String(Y['sharing']):undefined,'guard':typeof X?.['guard']==='string'?X['guard']:undefined})));return{'address':T['id'],'owner':fld(T,'owner'),'sharing':W};}),y=p['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'contact.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=(fld(T,'ims')??[])['map'](X=>typeof X==='string'?X:X?.['at'])['filter'](X=>typeof X==='string');return{'address':T['id'],'ims':W,'owner':V};}),z=l['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'machine.permission')[0x0]?.['to'],V=S['toLowerCase']()+'::node::',W=b['edges']['filter'](X=>X['schema']==='wf.transition'&&X['from']['startsWith'](V))['map'](X=>({'node':X['payload']?.['prevNode']??'','next_node':X['payload']?.['node']??'','forward_name':X['payload']?.['forward']??'','named_operator':X['payload']?.['namedOperator']??null,'permission_index':X['payload']?.['permissionIndex']??null,'guard':X['payload']?.['guard']??null}));return{'address':T['id'],'permission_address':U,'forwards':W};}),A=new Map();for(const S of t){const T=r['get'](S['address']['toLowerCase']())??'buyer';for(const U of S['dispute_arbitrations']??[])A['set'](U['toLowerCase'](),T);}const B=[];for(const [V,W]of A){const X=rawOf(b,V);if(!X)continue;const Y=(fld(X,'voted')??[])['map'](Z=>({'address':typeof Z?.['voter']==='string'?Z['voter']:'','weight':typeof Z?.['weight']==='number'?Z['weight']:undefined}))['filter'](Z=>Z['address']['length']>0x0);B['push']({'address':X['id'],'object_kind':'case','voters':Y,'order':fld(X,'order'),'arbitration':fld(X,'arbitration'),'anchor_side':W,'bound_services':[]});}for(const Z of q['slice'](0x0,MAX_ARB_SERVICES)){if(A['has'](Z['toLowerCase']()))continue;B['push']({'address':Z,'object_kind':'service','voters':[],'bound_services':[]});}return{'anchor':f,'permissions':h,'machines':z,'orders':t,'demands':v,'allocations':x,'contacts':y,'arbitrations':B,'service_owners':u};}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export interface ParsedForward {
|
|
2
|
+
name: string;
|
|
3
|
+
weight: number;
|
|
4
|
+
namedOperator?: string | null;
|
|
5
|
+
permissionIndex?: number | null;
|
|
6
|
+
guard?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ParsedPair {
|
|
9
|
+
prev_node: string;
|
|
10
|
+
threshold: number;
|
|
11
|
+
forwards: ParsedForward[];
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedMachineNode {
|
|
14
|
+
name: string;
|
|
15
|
+
pairs: ParsedPair[];
|
|
16
|
+
}
|
|
17
|
+
export declare const QUERY_OBJECTS_BATCH = 50;
|
|
18
|
+
export declare function batchQueryObjectsByIds(ids: string[], network?: string, noCache?: boolean): Promise<any[]>;
|
|
19
|
+
export interface TableFieldEntry {
|
|
20
|
+
key: string;
|
|
21
|
+
objectId: string;
|
|
22
|
+
}
|
|
23
|
+
export interface BatchTableItem extends TableFieldEntry {
|
|
24
|
+
object?: any;
|
|
25
|
+
}
|
|
26
|
+
export interface BatchTableResult {
|
|
27
|
+
items: BatchTableItem[];
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface FetchTableEntriesResult {
|
|
31
|
+
entries: TableFieldEntry[];
|
|
32
|
+
truncated: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function fetchTableEntries(parent: string, opts?: {
|
|
35
|
+
network?: string;
|
|
36
|
+
noCache?: boolean;
|
|
37
|
+
limit?: number;
|
|
38
|
+
maxItems?: number;
|
|
39
|
+
}): Promise<FetchTableEntriesResult>;
|
|
40
|
+
export declare function fetchAllFieldObjectIds(parent: string, network?: string, noCache?: boolean): Promise<string[]>;
|
|
41
|
+
export declare function batchQueryTableItems(parent: string, opts?: {
|
|
42
|
+
network?: string;
|
|
43
|
+
noCache?: boolean;
|
|
44
|
+
limit?: number;
|
|
45
|
+
maxItems?: number;
|
|
46
|
+
}): Promise<BatchTableResult>;
|
|
47
|
+
export declare function fetchMachineNodes(machine: string, network?: string, noCache?: boolean): Promise<ParsedMachineNode[]>;
|
|
48
|
+
export declare function batchReadAddressKeyedFields(parent: string, addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, any>>;
|
|
49
|
+
export declare function batchReadU64KeyedFields(parent: string, indices: Array<number | string | bigint>, network?: string, noCache?: boolean): Promise<Map<string, any>>;
|
|
50
|
+
export declare const ENTITY_REGISTRAR_OBJECT_ID = "0x0000000000000000000000000000000000000000000000000000000000000aab";
|
|
51
|
+
export declare const ENTITY_LINKER_OBJECT_ID = "0x0000000000000000000000000000000000000000000000000000000000000aaa";
|
|
52
|
+
export declare function batchFetchEntityRegistrar(addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, any>>;
|
|
53
|
+
export declare function batchFetchEntityLinker(addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, any>>;
|
|
54
|
+
export declare const ENTITY_PERMISSION_OBJECT_ID = "0xaad";
|
|
55
|
+
export declare const ENTITY_PERMISSION_ROLES: {
|
|
56
|
+
readonly OWNER: 1;
|
|
57
|
+
readonly ADMIN: 2;
|
|
58
|
+
readonly ENTITY: 4;
|
|
59
|
+
};
|
|
60
|
+
export interface EntityPermissionItem {
|
|
61
|
+
role: number;
|
|
62
|
+
permission: string;
|
|
63
|
+
time: number;
|
|
64
|
+
}
|
|
65
|
+
export interface EntityPermissionContext {
|
|
66
|
+
items: EntityPermissionItem[];
|
|
67
|
+
byPermission: Map<string, number>;
|
|
68
|
+
}
|
|
69
|
+
export declare function fetchEntityPermission(entityAddr: string, network?: string, noCache?: boolean): Promise<EntityPermissionContext | undefined>;
|
|
70
|
+
export declare const ENTITY_CONTACT_OBJECT_ID = "0xaa9";
|
|
71
|
+
export interface EntityContactItem {
|
|
72
|
+
contact: string;
|
|
73
|
+
time: number;
|
|
74
|
+
}
|
|
75
|
+
export interface EntityContactContext {
|
|
76
|
+
items: EntityContactItem[];
|
|
77
|
+
byContact: Map<string, number>;
|
|
78
|
+
}
|
|
79
|
+
export declare function fetchEntityContact(entityAddr: string, network?: string, noCache?: boolean): Promise<EntityContactContext | undefined>;
|
|
80
|
+
export declare const ENTITY_ORDER_OBJECT_ID = "0xaa8";
|
|
81
|
+
export declare const ENTITY_ORDER_ROLES: {
|
|
82
|
+
readonly OWNER: 1;
|
|
83
|
+
readonly AGENT: 2;
|
|
84
|
+
};
|
|
85
|
+
export interface EntityOrderItem {
|
|
86
|
+
role: number;
|
|
87
|
+
order: string;
|
|
88
|
+
time: number;
|
|
89
|
+
}
|
|
90
|
+
export interface EntityOrderContext {
|
|
91
|
+
items: EntityOrderItem[];
|
|
92
|
+
byOrder: Map<string, number>;
|
|
93
|
+
}
|
|
94
|
+
export declare function fetchOrdersOfUser(entityAddr: string, network?: string, noCache?: boolean): Promise<any[] | undefined>;
|
|
95
|
+
export declare const OBJECT_LINKER_CORE_OBJECT_ID = "0xaae";
|
|
96
|
+
export declare const OBJECT_LINKER_TX_OBJECT_ID = "0xaaf";
|
|
97
|
+
export interface ObjectLinkerItem {
|
|
98
|
+
who: string;
|
|
99
|
+
time: number;
|
|
100
|
+
}
|
|
101
|
+
export interface ObjectLinkerContext {
|
|
102
|
+
items: ObjectLinkerItem[];
|
|
103
|
+
byWho: Map<string, number>;
|
|
104
|
+
}
|
|
105
|
+
export declare function fetchObjectLinkerCore(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
|
|
106
|
+
export declare function fetchObjectLinkerTx(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
|
|
107
|
+
export declare function fetchServiceOrders(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
|
|
108
|
+
export interface PermissionContext {
|
|
109
|
+
admin: Set<string>;
|
|
110
|
+
table: Map<string, Set<number>>;
|
|
111
|
+
}
|
|
112
|
+
export interface OrderContext {
|
|
113
|
+
builder: string;
|
|
114
|
+
agent: Set<string>;
|
|
115
|
+
}
|
|
116
|
+
export declare function fetchPermissionContext(permAddr: string, network?: string, noCache?: boolean): Promise<PermissionContext | undefined>;
|
|
117
|
+
export declare function fetchOrderContext(orderAddr: string, network?: string, noCache?: boolean): Promise<OrderContext | undefined>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ObjectType,objectTypeFromAddress,queryOrdersByUser}from'@wowok/wowok';import{MAX_OBJECTS_PER_QUERY}from'./dataplane.js';import{SdkDataPlane}from'./sdk-dataplane.js';export const QUERY_OBJECTS_BATCH=MAX_OBJECTS_PER_QUERY;const planes=new Map();function batchPlane(a,b){const c=(a??'')+'|'+(b?0x1:0x0);let d=planes['get'](c);return!d&&(d=new SdkDataPlane(a??undefined,{'noCache':b}),planes['set'](c,d)),d;}function singletonToken(a){const b=String(a)['toLowerCase']();if(b['length']<=0x5)return b;return'0x'+b['slice'](-0x3);}export async function batchQueryObjectsByIds(a,b,c){const d=await batchPlane(b,c)['getObjects'](a);return[...d['values']()];}export async function fetchTableEntries(a,b){const {items:c,truncated:d}=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit'],'fetchValues':![]});return{'entries':c['map'](f=>({'key':f['key'],'objectId':f['objectId']})),'truncated':d};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryTableItems(a,b){const c=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit']});return{'items':c['items'],'truncated':c['truncated']};}export async function fetchMachineNodes(a,b,c){const d=await batchQueryObjectsByIds([a],b,c),e=d[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](singletonToken(a),e);}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchPlane(c,d)['getKeyedFields'](singletonToken(a),e,{'keyType':'u64'});}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_PERMISSION_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=Number(j?.['role']??0x0),l=String(j?.['permission']??'')['toLowerCase'](),m=Number(j?.['time']??0x0);l&&(g['push']({'role':k,'permission':l,'time':m}),h['set'](l,(h['get'](l)??0x0)|k));}return{'items':g,'byPermission':h};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_CONTACT_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=String(j?.['contact']??'')['toLowerCase'](),l=Number(j?.['time']??0x0);k&&(g['push']({'contact':k,'time':l}),h['set'](k,(h['get'](k)??l)||l));}return{'items':g,'byContact':h};}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=await batchReadAddressKeyedFields(a,[b],c,e),g=f['get'](String(b)['toLowerCase']()),h=[],i=new Map(),j=Array['isArray'](g?.['items'])?g['items']:[];for(const k of j){const l=String(k?.['who']??'')['toLowerCase'](),m=Number(k?.['time']??0x0);l&&(h['push']({'who':l,'time':m}),i['set'](l,m));}return{'items':h,'byWho':i};}catch{return undefined;}}export function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](f=>objectTypeFromAddress(f['who'])===ObjectType['Order']);return{'items':e,'byWho':new Map(e['map'](f=>[f['who'],f['time']]))};}export async function fetchPermissionContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'],m=l?.['data']??l;m?.['address']!=null&&Array['isArray'](m['perm'])&&i['set'](String(m['address'])['toLowerCase'](),new Set(m['perm']['map'](n=>Number(n))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0];if(f?.['type']!=='Order'&&f?.['data']?.['type']!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g['builder']??g['owner']??''),'agent':new Set((g['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ENTRYPOINT } from "@wowok/wowok";
|
|
2
|
+
import type { DataPlane, EventCursor, EventPage, RawObject, SingletonId, TableItem } from "./types.js";
|
|
3
|
+
export interface SdkPlaneStats {
|
|
4
|
+
batches: number;
|
|
5
|
+
byChannel: {
|
|
6
|
+
objects: number;
|
|
7
|
+
keyedFields: number;
|
|
8
|
+
tables: number;
|
|
9
|
+
events: number;
|
|
10
|
+
};
|
|
11
|
+
dedupHits: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class SdkDataPlane implements DataPlane {
|
|
14
|
+
private readonly network;
|
|
15
|
+
private readonly opts?;
|
|
16
|
+
private readonly objectCache;
|
|
17
|
+
private readonly keyedCache;
|
|
18
|
+
readonly stats: SdkPlaneStats;
|
|
19
|
+
constructor(network: ENTRYPOINT, opts?: {
|
|
20
|
+
concurrency?: number;
|
|
21
|
+
noCache?: boolean;
|
|
22
|
+
} | undefined);
|
|
23
|
+
getObjects(ids: string[]): Promise<Map<string, RawObject>>;
|
|
24
|
+
getKeyedFields(parent: SingletonId, keys: string[], opts?: {
|
|
25
|
+
keyType?: "address" | "u64";
|
|
26
|
+
}): Promise<Map<string, RawObject>>;
|
|
27
|
+
getTable(parent: string, opts?: {
|
|
28
|
+
maxItems?: number;
|
|
29
|
+
pageLimit?: number;
|
|
30
|
+
fetchValues?: boolean;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
items: TableItem[];
|
|
33
|
+
truncated: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
getEvents(type: string, opts?: {
|
|
36
|
+
cursor?: EventCursor | null;
|
|
37
|
+
maxPages?: number;
|
|
38
|
+
limit?: number;
|
|
39
|
+
}): Promise<EventPage>;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{bcs,deriveDynamicFieldID,query_events,query_objects,query_table}from'@wowok/wowok';import{chunk50,mapPool}from'./dataplane.js';const PARENT_ALIAS={'0xaa8':'0xaa8','0xaa9':'0xaa9','0xaaad':'0xaad','0xaae':'0xaae','0xaaf':'0xaaf','0xaaa':'0xaaa','0xaab':'0xaab'};export class SdkDataPlane{['network'];['opts'];['objectCache']=new Map();['keyedCache']=new Map();['stats']={'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};constructor(a,b){this['network']=a,this['opts']=b;}async['getObjects'](a){const b=[...new Set(a['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))],c=new Map(),d=[];for(const f of b){const g=this['objectCache']['get'](f);g?(this['stats']['dedupHits']++,c['set'](f,g)):d['push'](f);}if(d['length']===0x0)return c;const e=chunk50(d);return await mapPool(e,this['opts']?.['concurrency']??0x4,async h=>{this['stats']['batches']++,this['stats']['byChannel']['objects']++;try{const i=await query_objects({'objects':h,'no_cache':this['opts']?.['noCache'],'network':this['network']});for(const j of i?.['objects']??[]){const k=String(j?.['object']??'')['toLowerCase']();if(!k)continue;this['objectCache']['set'](k,j),c['set'](k,j);}}catch{}}),c;}async['getKeyedFields'](a,b,c){const d=c?.['keyType']??'address',e=PARENT_ALIAS[a],f=a+':'+d,g=this['keyedCache']['get'](f),h=new Map(),i=[];for(const n of b){const o=String(n)['toLowerCase'](),p=g?.['get'](o);if(p){this['stats']['dedupHits']++,h['set'](o,p);continue;}const q=d==='u64'?bcs['u64']()['serialize'](Number(o))['toBytes']():bcs['Address']['serialize'](o)['toBytes'](),r=deriveDynamicFieldID(e,d,q)['toLowerCase']();i['push']({'key':o,'fieldId':r});}if(i['length']===0x0)return h;const j=new Map();for(const s of i)j['set'](s['fieldId'],s['key']);const k=chunk50(i)['length'],l=await this['getObjects']([...j['keys']()]);this['stats']['byChannel']['objects']=Math['max'](0x0,this['stats']['byChannel']['objects']-k),this['stats']['byChannel']['keyedFields']+=k;const m=g??new Map();for(const [t,u]of j){const v=l['get'](t);if(!v)continue;const x=v['data']??v,y=x;m['set'](u,y),h['set'](u,y);}return this['keyedCache']['set'](f,m),h;}async['getTable'](a,b){const c=[];let d=![],f;for(;;){this['stats']['batches']++,this['stats']['byChannel']['tables']++;let g;try{g=await query_table({'parent':a,'cursor':f??undefined,'limit':b?.['pageLimit'],'no_cache':this['opts']?.['noCache'],'network':this['network']});}catch{break;}for(const h of g?.['items']??[]){const i=String(h?.['object']??'')['toLowerCase']();if(i['startsWith']('0x'))c['push']({'key':String(h?.['key']?.['value']??''),'objectId':i});}if(b?.['maxItems']!=null&&c['length']>=b['maxItems']){c['length']=b['maxItems'],d=g?.['hasNextPage']===!![];break;}if(g?.['hasNextPage']!==!![]||!g['nextCursor'])break;f=String(g['nextCursor']);}if(b?.['fetchValues']!==![]&&c['length']>0x0){const j=await this['getObjects'](c['map'](k=>k['objectId']));for(const k of c)k['object']=j['get'](k['objectId']);}return{'items':c,'truncated':d};}async['getEvents'](a,b){const c=[];let d=b?.['cursor']??null;const e=b?.['maxPages']??0x1,f=b?.['limit']??0x32;let g=![];for(let h=0x0;h<e;h++){this['stats']['batches']++,this['stats']['byChannel']['events']++;let i;try{i=await query_events({'type':a,'cursor':d,'limit':f,'order':'descending','no_cache':this['opts']?.['noCache'],'network':this['network']});}catch{g=!![];break;}const j=i?.['data']??[];c['push'](...j);if(i?.['hasNextPage']!==!![]||!i['nextCursor']){d=i?.['nextCursor']??null;break;}d=i['nextCursor'];if(h+0x1===e)g=!![];}return{'events':c,'cursor':d,'truncated':g};}}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { EdgeFamily, ExpandBudget, EdgeWhitelist } from "./types.js";
|
|
2
|
+
export type TopologyIntent = "full_map" | "order_health" | "fund_flow" | "workflow" | "counterparty" | "reputation" | "permission" | "supply_chain" | "arbitration" | "demand_match";
|
|
3
|
+
export declare const TOPOLOGY_INTENTS: readonly TopologyIntent[];
|
|
4
|
+
export declare function isTopologyIntent(v: unknown): v is TopologyIntent;
|
|
5
|
+
export interface StrategyFragment {
|
|
6
|
+
families?: EdgeFamily[];
|
|
7
|
+
schemas?: string[];
|
|
8
|
+
tableEdges?: string[];
|
|
9
|
+
familyDepths?: Partial<Record<EdgeFamily, number>>;
|
|
10
|
+
maxDepth?: number;
|
|
11
|
+
maxNodes?: number;
|
|
12
|
+
maxFanout?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface IntentPreset extends StrategyFragment {
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const INTENT_PRESETS: Record<TopologyIntent, IntentPreset>;
|
|
18
|
+
export interface ExpansionStrategy {
|
|
19
|
+
intents: TopologyIntent[];
|
|
20
|
+
edges: EdgeWhitelist;
|
|
21
|
+
budget: Partial<ExpandBudget>;
|
|
22
|
+
trace: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface ExplicitExpansionParams {
|
|
25
|
+
families?: EdgeFamily[];
|
|
26
|
+
schemas?: string[];
|
|
27
|
+
deny?: string[];
|
|
28
|
+
tableEdges?: string[];
|
|
29
|
+
budget?: Partial<ExpandBudget>;
|
|
30
|
+
}
|
|
31
|
+
export interface StrategyResolutionInput {
|
|
32
|
+
intents?: TopologyIntent[];
|
|
33
|
+
personaPref?: StrategyFragment & {
|
|
34
|
+
intents?: TopologyIntent[];
|
|
35
|
+
};
|
|
36
|
+
roleDefault?: {
|
|
37
|
+
intents?: TopologyIntent[];
|
|
38
|
+
} & StrategyFragment;
|
|
39
|
+
industryTemplate?: StrategyFragment & {
|
|
40
|
+
label?: string;
|
|
41
|
+
};
|
|
42
|
+
explicitEdges?: ExplicitExpansionParams;
|
|
43
|
+
}
|
|
44
|
+
export declare function resolveExpansionStrategy(input: StrategyResolutionInput): ExpansionStrategy;
|
|
45
|
+
export interface TopologyFocusPref {
|
|
46
|
+
intents?: TopologyIntent[];
|
|
47
|
+
families?: EdgeFamily[];
|
|
48
|
+
table_edges?: string[];
|
|
49
|
+
family_depths?: Partial<Record<EdgeFamily, number>>;
|
|
50
|
+
max_depth?: number;
|
|
51
|
+
max_nodes?: number;
|
|
52
|
+
max_fanout?: number;
|
|
53
|
+
}
|
|
54
|
+
export declare function normalizeTopologyFocusPref(v: unknown): TopologyFocusPref | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const TOPOLOGY_INTENTS=['full_map','order_health','fund_flow','workflow','counterparty','reputation','permission','supply_chain','arbitration','demand_match'];export function isTopologyIntent(a){return typeof a==='string'&&TOPOLOGY_INTENTS['includes'](a);}export const INTENT_PRESETS={'full_map':{'description':'complete\x20structural\x20map\x20—\x20all\x20families\x20at\x20kernel\x20default\x20depths','tableEdges':['machine.node','permission.entity','demand.presenter']},'order_health':{'description':'order\x20lifecycle:\x20orders,\x20fulfillment\x20progress,\x20disputes,\x20completion','schemas':['order.builder','order.agent','order.service','order.machine','order.progress','order.allocation','order.discount','order.dispute','order.claimed_by','progress.machine','progress.task','progress.named_operator','service.order','eoa.order','service.machine','service.permission','arb.order','arb.arbitration_service'],'tableEdges':['machine.node'],'familyDepths':{'W':0x3,'M':0x2}},'fund_flow':{'description':'money\x20flow:\x20payment\x20legs,\x20allocation\x20waterfall,\x20guard-gated\x20splits','schemas':['payment.recipient','payment.from_object','payment.for_object','payment.for_guard','order.allocation','order.service','order.machine','order.progress','allocation.guard','service.order_allocator_guard','service.permission','treasury.permission','treasury.external_guard'],'familyDepths':{'M':0x4}},'workflow':{'description':'Machine\x20workflow\x20graphs:\x20nodes,\x20transitions,\x20guards,\x20progress\x20runtime','schemas':['service.machine','order.machine','order.progress','order.service','progress.machine','progress.task','progress.named_operator','machine.permission','machine.consensus_repository','wf.transition','wf.forward_guard'],'tableEdges':['machine.node'],'familyDepths':{'W':0x5}},'counterparty':{'description':'who\x20is\x20on\x20the\x20other\x20side:\x20buyers,\x20sellers,\x20agents,\x20operators','schemas':['order.builder','order.agent','order.service','order.machine','service.order','eoa.order','service.permission','service.um','machine.permission','progress.named_operator','contact.permission'],'tableEdges':['permission.entity'],'familyDepths':{'S':0x1}},'reputation':{'description':'social\x20proof:\x20registrar\x20votes,\x20arbitration\x20voting\x20record,\x20contacts','schemas':['target.vote','arb.voter','arb.order','arb.arbitration_service','eoa.contact','contact.permission','arbitration.voting_guard'],'familyDepths':{'S':0x3}},'permission':{'description':'governance:\x20permission\x20groups,\x20bindings,\x20entity\x20tables,\x20admins','schemas':['permission.admin','permission.core_binding','permission.tx_binding','eoa.permission','eoa.contact','contact.permission','service.permission','machine.permission','demand.permission','reward.permission','repository.permission','treasury.permission','arbitration.permission','progress.named_operator'],'tableEdges':['permission.entity'],'familyDepths':{'R':0x4}},'supply_chain':{'description':'multi-leg\x20settlement:\x20allocation\x20templates,\x20forward\x20guards,\x20sub-orders','schemas':['order.allocation','order.machine','order.progress','order.service','allocation.guard','service.order_allocator_guard','service.machine','wf.forward_guard','wf.transition','progress.task','machine.consensus_repository'],'tableEdges':['machine.node'],'familyDepths':{'W':0x4,'M':0x3}},'arbitration':{'description':'disputes:\x20cases,\x20arbitration\x20services,\x20voters,\x20guards','schemas':['order.dispute','order.claimed_by','order.service','arb.order','arb.arbitration_service','arb.voter','arbitration.permission','arbitration.voting_guard','arbitration.usage_guard','service.arbitration','service.permission'],'familyDepths':{'S':0x2}},'demand_match':{'description':'demand\x20matching:\x20presenters,\x20guards,\x20reward\x20pools,\x20permissions','schemas':['demand.permission','demand.guard','demand.reward','demand.um','reward.permission','reward.guard','reward.um','eoa.order','order.service','order.builder'],'tableEdges':['demand.presenter'],'familyDepths':{'R':0x3}}};const KERNEL_DEFAULT_TABLE_EDGES=['machine.node'];function unionDedup(...a){const b=[];for(const c of a){for(const d of c??[])if(!b['includes'](d))b['push'](d);}return b;}export function resolveExpansionStrategy(a){const b=[],c=a['intents']?.['length']?a['intents']:a['personaPref']?.['intents']?.['length']?a['personaPref']['intents']:a['roleDefault']?.['intents']??[];if(a['intents']?.['length'])b['push']('intent\x20(explicit):\x20'+a['intents']['join'](',\x20'));else{if(a['personaPref']?.['intents']?.['length'])b['push']('intent\x20(persona):\x20'+a['personaPref']['intents']['join'](',\x20'));else a['roleDefault']?.['intents']?.['length']&&b['push']('intent\x20(role\x20default):\x20'+a['roleDefault']['intents']['join'](',\x20'));}const d=[];a['industryTemplate']&&d['push']({'label':'industry\x20template'+(a['industryTemplate']['label']?'\x20('+a['industryTemplate']['label']+')':''),'frag':a['industryTemplate']});if(c['length']>0x0){const p={},q=[],r=[],u=[];let v,w,x,y;for(const z of c){const A=INTENT_PRESETS[z];if(!A)continue;for(const B of A['families']??[])if(!q['includes'](B))q['push'](B);for(const C of A['schemas']??[])if(!r['includes'](C))r['push'](C);for(const D of A['tableEdges']??[])if(!u['includes'](D))u['push'](D);if(A['familyDepths'])v={...v??{},...A['familyDepths']};if(A['maxDepth']!==undefined)w=A['maxDepth'];if(A['maxNodes']!==undefined)x=A['maxNodes'];if(A['maxFanout']!==undefined)y=A['maxFanout'];}if(q['length']>0x0)p['families']=q;if(r['length']>0x0)p['schemas']=r;if(u['length']>0x0)p['tableEdges']=u;if(v)p['familyDepths']=v;if(w!==undefined)p['maxDepth']=w;if(x!==undefined)p['maxNodes']=x;if(y!==undefined)p['maxFanout']=y;d['push']({'label':'intent\x20presets\x20('+c['join'](',\x20')+')','frag':p});}a['personaPref']&&d['push']({'label':'persona\x20preference','frag':a['personaPref']});let e,g,h,i,j,k,l;for(const {label:E,frag:F}of d){const G=[];F['families']&&(e=F['families'],G['push']('families='+F['families']['join']('/')));F['schemas']&&(g=F['schemas'],G['push'](F['schemas']['length']+'\x20schema(s)'));F['tableEdges']?.['length']&&(l=unionDedup(l,F['tableEdges']),G['push']('tables\x20+['+F['tableEdges']['join'](',')+']'));F['familyDepths']&&(h={...h??{},...F['familyDepths']},G['push'](Object['entries'](F['familyDepths'])['map'](([H,I])=>H+'≤'+I)['join']('\x20')));F['maxDepth']!==undefined&&(i=F['maxDepth'],G['push']('depth='+F['maxDepth']));F['maxNodes']!==undefined&&(j=F['maxNodes'],G['push']('nodes='+F['maxNodes']));F['maxFanout']!==undefined&&(k=F['maxFanout'],G['push']('fanout='+F['maxFanout']));if(G['length']>0x0)b['push'](E+':\x20'+G['join'](';\x20'));}const m=a['explicitEdges'];m?.['families']&&(e=m['families'],b['push']('explicit:\x20families='+m['families']['join']('/')));m?.['schemas']&&(g=m['schemas'],b['push']('explicit:\x20'+m['schemas']['length']+'\x20schema(s)'));m?.['tableEdges']&&(l=m['tableEdges'],b['push']('explicit:\x20tables='+m['tableEdges']['join'](',')));if(m?.['deny'])b['push']('explicit:\x20deny='+m['deny']['join'](','));if(m?.['budget']){if(m['budget']['maxDepth']!==undefined)i=m['budget']['maxDepth'];if(m['budget']['maxNodes']!==undefined)j=m['budget']['maxNodes'];if(m['budget']['maxFanoutPerNode']!==undefined)k=m['budget']['maxFanoutPerNode'];if(m['budget']['maxRpcs']!==undefined)b['push']('explicit:\x20rpcs='+m['budget']['maxRpcs']);b['push']('explicit:\x20budget\x20overrides\x20applied');}const n=l?.['length']?l:KERNEL_DEFAULT_TABLE_EDGES;if(!l?.['length'])b['push']('kernel\x20default:\x20tables=['+KERNEL_DEFAULT_TABLE_EDGES['join'](',')+']\x20(all\x20families,\x20depth\x204)');const o=c['length']>0x0?c:['full_map'];return{'intents':o,'edges':{...e?{'families':e}:{},...g?{'schemas':g}:{},...m?.['deny']?{'deny':m['deny']}:{},'tableEdges':n,...h?{'familyDepths':h}:{}},'budget':{...i!==undefined?{'maxDepth':i}:{},...j!==undefined?{'maxNodes':j}:{},...k!==undefined?{'maxFanoutPerNode':k}:{},...m?.['budget']?.['maxRpcs']!==undefined?{'maxRpcs':m['budget']['maxRpcs']}:{}},'trace':b};}export function normalizeTopologyFocusPref(a){if(typeof a!=='object'||a===null)return undefined;const b=a,c={};if(Array['isArray'](b['intents'])){const e=b['intents']['filter'](isTopologyIntent);if(e['length']>0x0)c['intents']=e;}if(Array['isArray'](b['families'])){const g=b['families']['filter'](h=>typeof h==='string'&&['F','R','M','W','S']['includes'](h));if(g['length']>0x0)c['families']=g;}if(Array['isArray'](b['table_edges'])){const h=b['table_edges']['filter'](i=>typeof i==='string');if(h['length']>0x0)c['table_edges']=h;}if(typeof b['family_depths']==='object'&&b['family_depths']!==null){const i={};for(const [j,k]of Object['entries'](b['family_depths'])){['F','R','M','W','S']['includes'](j)&&typeof k==='number'&&k>=0x0&&k<=0x8&&(i[j]=Math['floor'](k));}if(Object['keys'](i)['length']>0x0)c['family_depths']=i;}if(typeof b['max_depth']==='number'&&b['max_depth']>=0x0&&b['max_depth']<=0x8)c['max_depth']=Math['floor'](b['max_depth']);if(typeof b['max_nodes']==='number'&&b['max_nodes']>=0x1&&b['max_nodes']<=0xbb8)c['max_nodes']=Math['floor'](b['max_nodes']);if(typeof b['max_fanout']==='number'&&b['max_fanout']>=0x1&&b['max_fanout']<=0x1450)c['max_fanout']=Math['floor'](b['max_fanout']);return Object['keys'](c)['length']>0x0?c:undefined;}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{INTENT_PRESETS,TOPOLOGY_INTENTS,isTopologyIntent,normalizeTopologyFocusPref,resolveExpansionStrategy}from'./strategy.js';import{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS}from'../../persona/topology-focus.js';import{PERSONA_ROLES}from'../../persona/types.js';describe('strategy\x20—\x20registries',()=>{it('every\x20intent\x20has\x20a\x20preset\x20and\x20vice\x20versa',()=>{for(const a of TOPOLOGY_INTENTS){expect(INTENT_PRESETS[a])['toBeDefined'](),expect(INTENT_PRESETS[a]['description']['length'])['toBeGreaterThan'](0x0);}expect(Object['keys'](INTENT_PRESETS)['sort']())['toEqual']([...TOPOLOGY_INTENTS]['sort']());}),it('preset\x20schema\x20ids\x20reference\x20real\x20edge\x20schemas',()=>{for(const a of Object['values'](INTENT_PRESETS)){for(const b of a['schemas']??[]){expect(EDGE_SCHEMA_BY_ID['has'](b),'unknown\x20schema\x20id\x20'+b)['toBe'](!![]);}for(const c of a['tableEdges']??[]){const d=EDGE_SCHEMA_BY_ID['get'](c);expect(d,'table\x20edge\x20'+c+'\x20must\x20be\x20a\x20real\x20schema')['toBeDefined'](),expect(d['read']['kind'])['toBe']('table');}}}),it('role\x20defaults\x20cover\x20every\x20persona\x20role\x20with\x20valid\x20intents',()=>{for(const a of PERSONA_ROLES){const b=ROLE_TOPOLOGY_DEFAULTS[a];expect(b,'role\x20'+a)['toBeDefined'](),expect(b['intents']['length'])['toBeGreaterThan'](0x0);for(const c of b['intents'])expect(isTopologyIntent(c))['toBe'](!![]);expect(b['rationale']['length'])['toBeGreaterThan'](0x0);}}),it('industry\x20templates\x20cover\x20the\x20six\x20built-in\x20industries',()=>{for(const a of['freelance','rental','education','travel','subscription','retail']){expect(INDUSTRY_TOPOLOGY_DEFAULTS[a],a)['toBeDefined']();}});}),describe('strategy\x20—\x20resolveExpansionStrategy\x20layering',()=>{it('no\x20inputs\x20→\x20kernel\x20default\x20posture\x20(full_map,\x20machine.node,\x20no\x20narrowing)',()=>{const a=resolveExpansionStrategy({});expect(a['intents'])['toEqual'](['full_map']),expect(a['edges']['tableEdges'])['toEqual'](['machine.node']),expect(a['edges']['families'])['toBeUndefined'](),expect(a['edges']['schemas'])['toBeUndefined'](),expect(a['edges']['familyDepths'])['toBeUndefined'](),expect(a['budget']['maxDepth'])['toBeUndefined'](),expect(a['trace']['some'](b=>b['startsWith']('kernel\x20default')))['toBe'](!![]);}),it('industry\x20template\x20shapes\x20family\x20depths\x20without\x20cutting\x20families',()=>{const a=resolveExpansionStrategy({'industryTemplate':INDUSTRY_TOPOLOGY_DEFAULTS['rental']});expect(a['edges']['familyDepths'])['toEqual']({'M':0x4,'W':0x2}),expect(a['edges']['families'])['toBeUndefined'](),expect(a['intents'])['toEqual'](['full_map']),expect(a['trace']['some'](b=>b['startsWith']('industry\x20template')))['toBe'](!![]);}),it('role\x20default\x20intents\x20select\x20the\x20preset\x20layer',()=>{const a=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['prospect']});expect(a['intents'])['toEqual'](['counterparty','reputation','fund_flow']),expect(a['edges']['schemas'])['toContain']('order.builder'),expect(a['edges']['schemas'])['toContain']('target.vote'),expect(a['edges']['schemas'])['toContain']('payment.recipient'),expect(a['edges']['familyDepths'])['toMatchObject']({'M':0x4,'S':0x3}),expect(a['trace']['some'](b=>b['startsWith']('intent\x20(role\x20default)')))['toBe'](!![]);}),it('explicit\x20intent\x20beats\x20persona\x20intents\x20beats\x20role\x20default\x20intents',()=>{const a=resolveExpansionStrategy({'intents':['workflow'],'personaPref':{'intents':['reputation']},'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer']});expect(a['intents'])['toEqual'](['workflow']),expect(a['edges']['tableEdges'])['toContain']('machine.node'),expect(a['trace'][0x0])['toBe']('intent\x20(explicit):\x20workflow');}),it('persona\x20preference\x20overrides\x20preset\x20fragments\x20(identity-specific)',()=>{const a=normalizeTopologyFocusPref({'intents':['order_health'],'table_edges':['machine.node','permission.entity'],'family_depths':{'M':0x3},'max_depth':0x6}),b=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer'],'personaPref':{'intents':a['intents'],'tableEdges':a['table_edges'],'familyDepths':a['family_depths'],'maxDepth':a['max_depth']}});expect(b['intents'])['toEqual'](['order_health']),expect(b['edges']['tableEdges'])['toEqual'](['machine.node','permission.entity']),expect(b['edges']['familyDepths'])['toMatchObject']({'M':0x3}),expect(b['budget']['maxDepth'])['toBe'](0x6),expect(b['trace']['some'](c=>c['startsWith']('persona\x20preference')))['toBe'](!![]);}),it('explicit\x20table_edges\x20REPLACES\x20the\x20accumulated\x20union;\x20explicit\x20budget\x20wins',()=>{const a=resolveExpansionStrategy({'intents':['permission'],'personaPref':{'tableEdges':['permission.entity']},'explicitEdges':{'tableEdges':['demand.presenter'],'budget':{'maxDepth':0x2,'maxNodes':0x64,'maxRpcs':0x1e}}});expect(a['edges']['tableEdges'])['toEqual'](['demand.presenter']),expect(a['budget'])['toEqual']({'maxDepth':0x2,'maxNodes':0x64,'maxFanoutPerNode':undefined,'maxRpcs':0x1e});}),it('table\x20edges\x20accumulate\x20(union)\x20across\x20industry\x20+\x20presets\x20+\x20persona',()=>{const a=resolveExpansionStrategy({'industryTemplate':{'label':'t','tableEdges':['permission.entity']},'intents':['demand_match'],'personaPref':{'tableEdges':['machine.node']}});expect(a['edges']['tableEdges'])['toEqual'](['permission.entity','demand.presenter','machine.node']);}),it('deny\x20only\x20ever\x20comes\x20from\x20explicit\x20params',()=>{const a=resolveExpansionStrategy({'personaPref':{'families':['M']},'explicitEdges':{'deny':['target.vote']}});expect(a['edges']['deny'])['toEqual'](['target.vote']);});}),describe('strategy\x20—\x20normalizeTopologyFocusPref',()=>{it('keeps\x20valid\x20fields,\x20drops\x20invalid\x20ones',()=>{const a=normalizeTopologyFocusPref({'intents':['fund_flow','bogus_intent'],'families':['M','X'],'table_edges':['machine.node',0x2a],'family_depths':{'M':0x3,'Z':0x9},'max_depth':0x5,'max_nodes':0x270f,'max_fanout':-0x1});expect(a)['toEqual']({'intents':['fund_flow'],'families':['M'],'table_edges':['machine.node'],'family_depths':{'M':0x3},'max_depth':0x5});}),it('returns\x20undefined\x20for\x20empty/invalid\x20input',()=>{expect(normalizeTopologyFocusPref(null))['toBeUndefined'](),expect(normalizeTopologyFocusPref('x'))['toBeUndefined'](),expect(normalizeTopologyFocusPref({}))['toBeUndefined'](),expect(normalizeTopologyFocusPref({'intents':'not-an-array'}))['toBeUndefined']();});});function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),merchant=eoa(0x3),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),pr1=obj(0x7,0x1f),pay=obj(0x8,0x29),perm=obj(0x0,0x33);function depthPlane(){const a=new Map([[o1['toLowerCase'](),{'object':o1,'type':'Order','data':{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'dispute':[]}}],[svc['toLowerCase'](),{'object':svc,'type':'Service','data':{'permission':perm,'machine':mac},'type_raw':'0x2::service::Service<'+T_USDT+'>'}],[mac['toLowerCase'](),{'object':mac,'type':'Machine','data':{'permission':perm}}],[pr1['toLowerCase'](),{'object':pr1,'type':'Progress','data':{'machine':mac,'task':o1,'current':'done'}}],[pay['toLowerCase'](),{'object':pay,'type':'Payment','data':{'record':[{'recipient':merchant,'amount':'100'}],'info':{}},'type_raw':'0x2::payment::Payment<'+T_USDT+'>'}],[perm['toLowerCase'](),{'object':perm,'type':'Permission','data':{'admin':[merchant]}}]]),b=new Map([['0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1}]}]])]]),c=new Map([]);return new FakeDataPlane({'objects':a,'keyedFields':b,'tables':c});}describe('strategy\x20—\x20Gate\x20familyDepths\x20in\x20expandTopology',()=>{it('F\x20cap\x201\x20from\x20an\x20EOA\x20seed\x20blocks\x20every\x20field\x20edge\x20(orders\x20reached,\x20service\x20not)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x1}}});expect(a['nodes']['has'](o1['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](![]),expect(a['edges']['some'](b=>b['family']==='F'))['toBe'](![]);}),it('F\x20cap\x202\x20allows\x20one\x20hop\x20of\x20field\x20edges\x20then\x20stops',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x2}}});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['edges']['some'](b=>b['schema']==='service.permission'))['toBe'](![]);}),it('W\x20cap\x200\x20keeps\x20the\x20workflow\x20family\x20closed\x20even\x20with\x20machine.node\x20whitelisted',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'tableEdges':['machine.node'],'familyDepths':{'W':0x0}}});expect(a['edges']['some'](b=>b['family']==='W'))['toBe'](![]);}),it('unset\x20families\x20fall\x20back\x20to\x20the\x20global\x20maxDepth\x20(no\x20regression)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](perm['toLowerCase']()))['toBe'](!![]);});});
|