@wowok/agent-mcp 3.3.5 → 3.3.7
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/chain-semantics/eval-order.d.ts +17 -0
- package/dist/chain-semantics/eval-order.js +1 -0
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/index.d.ts +1 -0
- package/dist/chain-semantics/index.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +2 -1
- package/dist/composition/compile.js +1 -1
- package/dist/composition/materialize.js +1 -1
- package/dist/data/api/api.spec.d.ts +1 -0
- package/dist/data/api/api.spec.js +1 -0
- package/dist/data/api/cli.d.ts +1 -0
- package/dist/data/api/cli.js +1 -0
- package/dist/data/api/head.d.ts +16 -0
- package/dist/data/api/head.js +1 -0
- package/dist/data/api/head.spec.d.ts +1 -0
- package/dist/data/api/head.spec.js +1 -0
- package/dist/data/api/index.d.ts +2 -0
- package/dist/data/api/index.js +1 -0
- package/dist/data/api/match.d.ts +69 -0
- package/dist/data/api/match.js +1 -0
- package/dist/data/api/match.spec.d.ts +1 -0
- package/dist/data/api/match.spec.js +1 -0
- package/dist/data/api/server.d.ts +12 -0
- package/dist/data/api/server.js +1 -0
- package/dist/data/projection/cli.d.ts +1 -0
- package/dist/data/projection/cli.js +1 -0
- package/dist/data/projection/edges.d.ts +8 -0
- package/dist/data/projection/edges.js +1 -0
- package/dist/data/projection/edges.spec.d.ts +1 -0
- package/dist/data/projection/edges.spec.js +1 -0
- package/dist/data/projection/facets.d.ts +18 -0
- package/dist/data/projection/facets.js +1 -0
- package/dist/data/projection/facets.spec.d.ts +1 -0
- package/dist/data/projection/facets.spec.js +1 -0
- package/dist/data/projection/facts.d.ts +40 -0
- package/dist/data/projection/facts.js +1 -0
- package/dist/data/projection/index.d.ts +6 -0
- package/dist/data/projection/index.js +1 -0
- package/dist/data/projection/project.d.ts +10 -0
- package/dist/data/projection/project.js +1 -0
- package/dist/data/projection/projection.spec.d.ts +1 -0
- package/dist/data/projection/projection.spec.js +1 -0
- package/dist/data/projection/schema.d.ts +1 -0
- package/dist/data/projection/schema.js +1 -0
- package/dist/data/projection/store.d.ts +49 -0
- package/dist/data/projection/store.js +1 -0
- package/dist/data/projection/types.d.ts +137 -0
- package/dist/data/projection/types.js +1 -0
- package/dist/data/sync/cdc.d.ts +34 -0
- package/dist/data/sync/cdc.js +1 -0
- package/dist/data/sync/cdc.spec.d.ts +1 -0
- package/dist/data/sync/cdc.spec.js +1 -0
- package/dist/data/sync/graphql-source.d.ts +16 -0
- package/dist/data/sync/graphql-source.js +1 -0
- package/dist/data/sync/index.d.ts +5 -0
- package/dist/data/sync/index.js +1 -0
- package/dist/data/sync/reconciler.d.ts +14 -0
- package/dist/data/sync/reconciler.js +1 -0
- package/dist/data/sync/reconciler.spec.d.ts +1 -0
- package/dist/data/sync/reconciler.spec.js +1 -0
- package/dist/data/sync/schema.d.ts +1 -0
- package/dist/data/sync/schema.js +1 -0
- package/dist/data/sync/store.d.ts +19 -0
- package/dist/data/sync/store.js +1 -0
- package/dist/data/sync/sync.spec.d.ts +1 -0
- package/dist/data/sync/sync.spec.js +1 -0
- package/dist/data/sync/synchronizer.d.ts +10 -0
- package/dist/data/sync/synchronizer.js +1 -0
- package/dist/data/sync/types.d.ts +162 -0
- package/dist/data/sync/types.js +1 -0
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/capability.d.ts +1 -0
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/extract.d.ts +7 -1
- package/dist/evaluation/extract.js +1 -1
- package/dist/evaluation/match-policy.d.ts +142 -0
- package/dist/evaluation/match-policy.js +1 -0
- package/dist/evaluation/match-policy.spec.d.ts +1 -0
- package/dist/evaluation/match-policy.spec.js +1 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/harness/recover.js +1 -1
- package/dist/intent/types.d.ts +1 -1
- package/dist/intent/types.js +1 -1
- package/dist/keeper/detectors.d.ts +3 -0
- package/dist/keeper/detectors.js +1 -1
- package/dist/keeper/keeper.spec.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/plan.json +113 -3
- package/dist/knowledge/builtin-templates.d.ts +6 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-generalizer.d.ts +4 -0
- package/dist/knowledge/industry-generalizer.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/jsonrpc-enum.d.ts +26 -10
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/projection.d.ts +54 -0
- package/dist/knowledge/projection.js +1 -0
- package/dist/knowledge/projection.spec.d.ts +1 -0
- package/dist/knowledge/projection.spec.js +1 -0
- package/dist/knowledge/recipient-constraint.d.ts +1 -1
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/semantic-ir.d.ts +113 -0
- package/dist/knowledge/semantic-ir.js +1 -0
- package/dist/knowledge/service-ledger.d.ts +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +34 -0
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-prose.d.ts +50 -0
- package/dist/knowledge/template-prose.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +1 -1
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/normalize.d.ts +1 -1
- package/dist/monitor/normalize.js +1 -1
- package/dist/monitor/types.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +4 -0
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.d.ts +2 -1
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/mode-actions.d.ts +7 -0
- package/dist/playbooks/service-build/mode-actions.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +22 -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.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/playbooks/service-build/service-quote.spec.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/role/profiles.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +64 -10
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +8 -0
- package/dist/schema/call/bridge.d.ts +2 -0
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/proof.js +1 -1
- package/dist/schema/call/reward.d.ts +10 -0
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +341 -0
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +2 -0
- package/dist/schema/goal/planning.d.ts +3 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +62 -0
- package/dist/schema/industry-pack/modes.d.ts +62 -0
- package/dist/schema/industry-pack/modes.js +1 -1
- package/dist/schema/intent-radar/index.d.ts +3 -0
- package/dist/schema/intent-radar/index.js +1 -1
- package/dist/schema/local/index.d.ts +20 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/operations.d.ts +5 -0
- package/dist/schema/query/bi.d.ts +4 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +145 -47
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +2 -0
- package/dist/schemas/benchmark_migration_operation.output.json +42 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +208 -5
- package/dist/schemas/bridge_operation.output.json +2 -0
- package/dist/schemas/evaluation_operation.output.json +624 -2
- package/dist/schemas/evaluation_operation.schema.json +598 -4
- package/dist/schemas/goal_operation.schema.json +18 -10
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +86 -2
- package/dist/schemas/industry_pack_operation.schema.json +199 -0
- package/dist/schemas/intent_radar.output.json +2 -0
- package/dist/schemas/intent_radar.schema.json +1 -0
- package/dist/schemas/local_cache_operation.output.json +2 -0
- package/dist/schemas/local_history_operation.output.json +2 -0
- package/dist/schemas/local_info_operation.output.json +2 -0
- package/dist/schemas/local_mark_operation.output.json +2 -0
- package/dist/schemas/onchain_events.output.json +281 -11
- package/dist/schemas/onchain_events.schema.json +5 -1
- package/dist/schemas/onchain_operations.output.json +2 -0
- package/dist/schemas/onchain_operations.schema.json +914 -314
- package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
- package/dist/schemas/onchain_operations_arbitration.schema.json +1 -1
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +660 -94
- package/dist/schemas/onchain_operations_reward.schema.json +35 -1
- package/dist/schemas/onchain_operations_service.schema.json +4 -4
- package/dist/schemas/query_toolkit.output.json +333 -0
- package/dist/tools/handlers/benchmark-migration.d.ts +5 -2
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/evaluation.spec.js +1 -1
- package/dist/tools/handlers/intent-radar.js +1 -1
- package/dist/tools/handlers/messenger.d.ts +1 -0
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +2 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/wip.js +1 -1
- 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/query.js +1 -1
- package/dist/tools/wip-verify-ledger.d.ts +14 -0
- package/dist/tools/wip-verify-ledger.js +1 -0
- package/dist/tools/wrap.d.ts +4 -0
- package/dist/tools/wrap.js +1 -1
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as a351a}from'../../tools/handlers/name-resolution.js';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{computeFundListingWall}from'../../graph/onchain/facts.js';import{projectExploration}from'../../graph/onchain/exploration.js';import{buildMachineGraph}from'./machine-nodes.js';import{formatMoneyAnnotation}from'./facet-money.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let h=d??await Config['Instance']()['network_get']();const j=[];let k=await a351a(c,'service'),l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h});if(!l?.['service']&&d){const ac=await Config['Instance']()['network_get']();ac&&ac!==h&&(h=ac,l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h}));}const m=l['service'];k=m['object']??k;const q=new Set(),w=ad=>{if(ad)q['add'](ad);};w(k),w(m['machine']),w(m['permission']),w(m['um']);for(const ad of m['arbitrations']??[])w(ad);for(const ae of m['rewards']??[])w(ae);for(const af of m['repositories']??[])w(af);const x=l['permission'];if(x){const ag=Array['isArray'](x['admin'])?x['admin']:[];ag[0x0]&&w(typeof ag[0x0]==='string'?ag[0x0]:ag[0x0]?.['account']);if(x['builder'])w(x['builder']);}const y=await markOfMany([...q]),z=y['get'](k)??{'name':null,'tags':[],'updated_at_ms':null},A=z['name'],B=ah=>ah?y['get'](ah)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let C=null;const D=l['machine'],E=l['machine_nodes']??[];if(D||E['length']>0x0){const {nodes:ah,edges:ai}=buildMachineGraph(E);C={'address':D?.['object']??m['machine']??'','name':B(D?.['object']??m['machine'])['name'],'description':D?.['description']??null,'published':typeof D?.['bPublished']==='boolean'?D['bPublished']:null,'paused':typeof D?.['bPaused']==='boolean'?D['bPaused']:null,'node_count':typeof D?.['node_count']==='number'?D['node_count']:null,'consensus_repositories':Array['isArray'](D?.['consensus_repositories'])?D['consensus_repositories']:[],'nodes':ah,'edges':ai};}let F=null;try{const aj=await query_object_last_updated({'object':k,'network':h});aj?.['timestamp_ms']&&(F={'timestamp_ms':aj['timestamp_ms'],'digest':aj['digest']??null,'sender':aj['sender']??null});}catch{j['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let G=null;try{G=await resolveSupplyChainGraph(k,h);}catch{j['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let H=null,I=[];const J=m?.['type_raw']??m?.['type']??'',K=J['match'](/<(.+)>$/),L=K?K[0x1]:null,M=(ak,al)=>{const am=[];return ak?am['push']('Pricing\x20&\x20settlement\x20coin:\x20'+ak+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):am['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),am['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](al)?am['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):am['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),am['join']('\x20');},N=ak=>formatMoneyAnnotation(ak,L,h),O=0x3,P=0x32;let Q=null;try{const ak=await fetchServiceOrders(k,h,!![]),al=Array['isArray'](ak?.['items'])?ak['items']:[],am=al['slice'](-P),an=al['slice'](-O),ao=am['map'](aM=>typeof aM?.['who']==='string'?aM['who']:'')['filter'](aM=>aM!==''),ap=an['map'](aM=>typeof aM?.['who']==='string'?aM['who']:'')['filter'](aM=>aM!==''),aq=new Map();try{if(ao['length']>0x0){const aM=await batchQueryObjectsByIds(ao,h,!![]);for(const aN of aM){aN&&aN['type']===ObjectType['Order']&&aq['set'](aN['object'],aN);}}}catch{j['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const ar=new Map();try{const aO=new Set();for(const aP of aq['values']()){if(aP?.['allocation'])aO['add'](aP['allocation']);}if(aO['size']>0x0){const aQ=await batchQueryObjectsByIds(Array['from'](aO),h,!![]);for(const aR of aQ){if(!aR?.['object'])continue;if(aR['type']===ObjectType['Allocation']){const aS=Number(aR?.['balance']??0x0);ar['set'](aR['object'],Number['isFinite'](aS)&&aS===0x0?'allocated':'pending');}}}}catch{j['push']('recent_orders:\x20allocation\x20details\x20unavailable\x20(non-blocking)');}const as=new Map(),at=new Map();try{const aT=new Set();for(const aU of ap){const aV=aq['get'](aU);if(aV?.['progress'])aT['add'](aV['progress']);}if(aT['size']>0x0){const aW=await batchQueryObjectsByIds(Array['from'](aT),h,!![]);for(const aX of aW){if(!aX?.['object'])continue;if(aX['type']===ObjectType['Progress']){const aY=aX?.['current'];as['set'](aX['object'],typeof aY==='string'&&aY!==''?aY:null),at['set'](aX['object'],Number(aX?.['current_time'])||null);}}}}catch{j['push']('recent_orders:\x20progress\x20details\x20unavailable\x20(non-blocking)');}I=Array['from'](aq['values']())['map'](aZ=>({'id':aZ['object'],'created_at_ms':Number(aZ['time'])||undefined,'claimed_by':aZ['claimed_by']??null,'current_node':aZ['progress']?as['get'](aZ['progress'])??null:null}));const au=new Map();try{const aZ=ap,b0=await Promise['allSettled'](aZ['map'](b1=>query_object_last_updated({'object':b1,'network':h})));for(let b1=0x0;b1<aZ['length'];b1++){const b2=b0[b1];au['set'](aZ[b1],b2['status']==='fulfilled'&&b2['value']?.['timestamp_ms']?Number(b2['value']['timestamp_ms'])||null:null);}}catch{j['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const av=await Promise['all'](an['map'](async b3=>{const b4=typeof b3?.['who']==='string'?b3['who']:'',b5=aq['get'](b4),b6=b5?.['amount']!==null&&b5?.['amount']!==undefined?String(b5['amount']):'',b7=await N(b6);return{'order':b4,'time':typeof b3?.['time']==='number'?b3['time']:0x0,'updated_ms':au['get'](b4)??null,'amount':b6,'amount_display':b7['display'],'amount_tip':b7['tip'],'progress':b5?.['progress']??null,'allocation':b5?.['allocation']??null,'disputes':Array['isArray'](b5?.['dispute'])?b5['dispute']:[],'agent':Array['isArray'](b5?.['agent'])?b5['agent']:[],'owner':ownerAddr(b5?.['builder']??b5?.['owner']),'claimed_by':b5?.['claimed_by']??null,'required_info':b5?.['required_info']??null,'progress_next':b5?.['progress']?as['get'](b5['progress'])??null:null,'progress_since':b5?.['progress']?at['get'](b5['progress'])??null:null,'allocation_state':b5?.['allocation']?ar['get'](b5['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](b5?.['items'])?b5['items']:[])['map'](async b8=>({'name':String(b8?.['name']??''),'price_display':(await N(b8?.['price']!==null&&b8?.['price']!==undefined?String(b8['price']):null))['display'],'quantity':String(b8?.['quantity']??'0'),'wip_hash':String(b8?.['wip_hash']??'')})))};})),aw=av['filter'](b3=>b3['order']!==''),ax=ao['map'](b3=>aq['get'](b3))['filter'](b3=>!!b3);let ay=0x0n,az=0x0,aA=0x0,aB=0x0,aC=0x0,aD=0x0,aE=null,aF=null;for(const b3 of ax){const b4=b3?.['amount']!==null&&b3?.['amount']!==undefined?String(b3['amount']):'';/^\d+$/['test'](b4)&&(ay+=BigInt(b4),az++);if(Array['isArray'](b3?.['dispute'])&&b3['dispute']['length']>0x0)aA++;const b5=b3?.['allocation']?ar['get'](b3['allocation'])??'pending':'none';if(b5==='pending')aB++;else{if(b5==='allocated')aC++;else aD++;}}for(const b6 of am){if(typeof b6?.['time']==='number'){if(aE===null||b6['time']<aE)aE=b6['time'];if(aF===null||b6['time']>aF)aF=b6['time'];}}const aG=az>0x0?ay['toString']():null,aH=aG!==null?await N(aG):null,aI=al['length'],aJ=ak?.['ring_saturated']??ringWindowSaturated(aI),aK=aw['length'],aL='Analyze\x20ALL\x20orders\x20of\x20Service\x20'+k+'\x20('+h+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20orders\x20live\x20in\x20the\x20Service\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+aI+(aJ?',\x20saturated':'')+').\x20')+'For\x20each\x20order\x20call\x20object_panorama\x20with\x20the\x20order\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20order:\x20'+'order\x20address\x20chip\x20(first\x20column)\x20|\x20created\x20+\x20last-updated\x20(local\x20dates)\x20|\x20amount\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20fund\x20state\x20(none\x20/\x20pending\x20/\x20allocated)\x20|\x20current\x20machine\x20node\x20|\x20disputes\x20(each\x20dispute\x20case\x20as\x20its\x20own\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20—\x20an\x20order\x27s\x20progress,\x20allocation\x20and\x20arb\x20cases\x20are\x20its\x20children\x20and\x20are\x20never\x20split\x20into\x20a\x20separate\x20flat\x20list)\x20|\x20buyer\x20address\x20chip.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(amount\x20distribution,\x20stuck\x20or\x20paused\x20orders,\x20dispute\x20rate).\x20Orders\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Service\x20itself.';Q={'count':aI,'window_saturated':aJ,'preview_truncated':aI>aK,'stats':{'scope_count':ax['length'],'scoped':ax['length']<aI,'amount_sum_raw':aG,'amount_sum_display':aH?.['display']??null,'amount_sum_tip':aH?.['tip']??null,'amount_known_count':az,'disputed_order_count':aA,'allocation_pending_count':aB,'allocation_allocated_count':aC,'allocation_none_count':aD,'first_created_ms':aE,'last_created_ms':aF},...aI>aK?{'drilldown':{'total_count':aI,'analyzed_count':aK,'stats_scope_count':ax['length'],'prompt':aL},'order_addresses':ax['map'](b7=>b7['object'])}:{},'items':aw};}catch{j['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}try{const b7=[m,l['machine'],l['buy_guard'],...l['allocator_guards']??[]]['filter'](Boolean);H=generateBusinessReport({'objects':b7,'machine_nodes':E['map'](b8=>({'name':b8['name']})),'machine_edges':C?.['edges']?C['edges']['map'](b8=>({'from':b8['from'],'to':b8['to']})):undefined,'orders':I['length']>0x0?I:undefined,'now_ms':Date['now']()});}catch{j['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const R=[];try{const b8=await query_affiliations({'address':k,'no_cache':!![],'network':h}),b9=new Set(),ba=new Map();for(const bc of b8?.['entries']??[]){const bd=typeof bc?.['who']==='string'?bc['who']:'';if(!bd||b9['has'](bd))continue;b9['add'](bd);const be=objectTypeFromAddress(bd);if(!be)continue;if(be===ObjectType['Order'])continue;const bf=String(be);let bg=ba['get'](bf);!bg&&(bg=[],ba['set'](bf,bg)),bg['push']({'address':bd,'type_label':bf,'name':B(bd)['name'],'time':typeof bc?.['time']==='number'?bc['time']:null,'via':typeof bc?.['table']==='string'?bc['table']:null});}const bb=['Progress','Allocation','Payment','Guard'];for(const bh of bb){const bi=ba['get'](bh);bi&&bi['length']>0x0&&(R['push']({'type_label':bh,'items':bi}),ba['delete'](bh));}for(const [bj,bk]of ba){if(bk['length']>0x0)R['push']({'type_label':bj,'items':bk});}}catch{j['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const S=new Set(),T=bl=>{typeof bl==='string'&&/^0x[0-9a-fA-F]{40,64}$/['test'](bl)&&S['add'](bl['toLowerCase']());};T(m['buy_guard']);for(const bl of E){for(const bm of bl?.['pairs']??[]){for(const bn of bm?.['forwards']??[])T(bn?.['guard']);}}for(const bo of m['order_allocators']?.['allocators']??[])T(bo?.['guard']);for(const bp of l['allocator_guards']??[])T(bp?.['object']);for(const bq of Object['values'](l['referenced']??{})){const br=bq;if(!br||typeof br!=='object')continue;if(br['type']===ObjectType['Reward']){for(const bs of br['guards']??[])T(bs?.['guard']);}if(br['type']===ObjectType['Treasury']){for(const bt of br['external_withdraw_guard']??[])T(bt?.['guard']);for(const bu of br['external_deposit_guard']??[])T(bu?.['guard']);}(br['type']===ObjectType['Arbitration']||br['type']===ObjectType['Arb'])&&T(br['voting_guard']);}const U=R['find'](bv=>bv['type_label']===String(ObjectType['Guard']));if(U){U['items']=U['items']['filter'](bv=>!S['has'](bv['address']['toLowerCase']()));if(U['items']['length']===0x0)R['splice'](R['indexOf'](U),0x1);else{const bv=U['items'];try{const bw=await batchQueryObjectsByIds(bv['map'](by=>by['address']),h,!![]),bx=new Map();for(const by of bw){if(by?.['object'])bx['set'](String(by['object'])['toLowerCase'](),by);}for(const bz of bv){const bA=bx['get'](bz['address']['toLowerCase']());if(!bA){bz['explanation']=null;continue;}const bB=Array['isArray'](bA['table'])?bA['table']:[],bC=[];let bD=0x0;for(const bF of bB){if(bF?.['b_submission']===!![]){bD++;continue;}bF?.['value_type']==='Address'&&typeof bF?.['value']==='string'&&bF['value']['startsWith']('0x')&&bC['push'](bF['value']);}const bE=bC['some'](bG=>bG['toLowerCase']()===k['toLowerCase']());bz['explanation']={'description':typeof bA['description']==='string'?bA['description']:null,'table_refs':bC,'references_this_service':bE,'submission_slots':bD,'note':bE?'One-off\x20verification\x20guard:\x20NOT\x20mounted\x20on\x20any\x20host\x20field;\x20its\x20table\x20carries\x20this\x20Service\x20as\x20an\x20on-chain\x20constant\x20(the\x20affiliation\x20is\x20written\x20at\x20creation).\x20It\x20acts\x20only\x20when\x20submitted\x20inside\x20a\x20passport\x20at\x20runtime.':'Guard\x20surfaced\x20by\x20the\x20affiliation\x20window\x20only;\x20not\x20mounted\x20on\x20any\x20host\x20field\x20reachable\x20from\x20this\x20panorama.\x20It\x20acts\x20only\x20when\x20referenced\x20at\x20runtime\x20(passport\x20submission\x20or\x20a\x20host\x20outside\x20this\x20view).'};}}catch{j['push']('related:\x20unbound-guard\x20explanation\x20unavailable\x20(non-blocking)');}}}const V=new Map();for(const bG of l['allocator_guards']??[]){const bH=bG;if(bH?.['object'])V['set'](String(bH['object'])['toLowerCase'](),bH);}const W=[];for(const bI of Array['isArray'](m['sales'])?m['sales']:[]){const bJ=balanceStr(bI?.['price']),bK=await N(bJ);W['push']({'name':typeof bI?.['name']==='string'?bI['name']:'','price':bJ,'price_display':bK['display'],'price_tip':bK['tip'],'stock':balanceStr(bI?.['stock']),'suspension':bI?.['suspension']===!![],'wip':typeof bI?.['wip']==='string'?bI['wip']:'','wip_hash':typeof bI?.['wip_hash']==='string'?bI['wip_hash']:''});}const X=bL=>bL===0x0?'amount':bL===0x2?'surplus':'rate',Y=bL=>{const bM=bL?.['who'];if(bM&&typeof bM==='object'&&'Entity'in bM){const bN=bM['Entity'],bO=typeof bN==='string'?bN:typeof bN?.['name_or_address']==='string'?bN['name_or_address']:null;return{'who':bO?'Entity\x20'+bO:'Entity','entity':bO&&/^0x[0-9a-fA-F]{6,64}$/['test'](bO)?bO:null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};}if(bM&&typeof bM==='object'&&'GuardIdentifier'in bM)return{'who':'Guard\x20identifier\x20#'+bM['GuardIdentifier'],'entity':null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};return{'who':'Signer','entity':null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};},Z=m['order_allocators']?{'description':m['order_allocators']['description']??'','threshold':balanceStr(m['order_allocators']['threshold']),'allocators':(m['order_allocators']['allocators']??[])['map'](bL=>({'guard':bL['guard'],'sharing_count':Array['isArray'](bL['sharing'])?bL['sharing']['length']:0x0,'sharing':(Array['isArray'](bL['sharing'])?bL['sharing']:[])['map'](Y),'max':balanceStr(bL['max']??null),'guard_summary':summarizeGuard(V['get'](String(bL['guard']??'')['toLowerCase']()))}))}:null,a0=[];{const bL=new Map();for(const bM of m['order_allocators']?.['allocators']??[]){for(const bN of Array['isArray'](bM['sharing'])?bM['sharing']:[]){const bO=Y(bN);if(bO['entity']){const bP=bO['entity']['toLowerCase'](),bQ=bL['get'](bP)??{'raw':bO['entity'],'guards':[]};bQ['guards']['push'](bM['guard']??''),bL['set'](bP,bQ);}}}if(bL['size']>0x0)try{const bR=await batchQueryObjectsByIds([...bL['keys']()],h,!![]),bS=new Map();for(const bT of bR){if(bT?.['object'])bS['set'](String(bT['object'])['toLowerCase'](),bT);}for(const [bU,bV]of bL){const bW=bS['get'](bU),bX='order_allocators\x20sharing\x20of\x20allocator\x20guard\x20'+bV['guards'][0x0];if(bW&&bW['permission']!==undefined){const bY=balanceStr(bW['balance']),bZ=await N(bY);a0['push']({'address':String(bW['object']),'kind':'treasury','description':typeof bW['description']==='string'?bW['description']:null,'permission':typeof bW['permission']==='string'?bW['permission']:null,'balance':bY,'balance_display':bZ['display'],'balance_tip':bZ['tip'],'external_deposit_guard_count':Array['isArray'](bW['external_deposit_guard'])?bW['external_deposit_guard']['length']:null,'external_withdraw_guard_count':Array['isArray'](bW['external_withdraw_guard'])?bW['external_withdraw_guard']['length']:null,'via':bX});}else a0['push']({'address':bV['raw'],'kind':'account','description':null,'permission':null,'balance':null,'balance_display':null,'balance_tip':null,'external_deposit_guard_count':null,'external_withdraw_guard_count':null,'via':bX});}}catch{j['push']('income_recipients:\x20Sharing\x20entity\x20read\x20failed\x20(non-blocking)');}}const a1=summarizePermission(l['permission'],B(m['permission'])),a2=a1?.['owner']??F?.['sender']??null,a3=a2?await markOf(a2):null,a4=await N(balanceStr(m['compensation_fund'])),a5=balanceStr(m['compensation_fund']),a6=/^\d+$/['test'](a5?.['trim']()??'')?BigInt(a5['trim']()):null,a7=a6===null?null:(a6/0x3n)['toString'](),a8=a7===null?null:await N(a7),a9=a6===null?null:a6===0x0n?'No\x20compensation\x20fund:\x20this\x20Service\x20carries\x20NO\x20payout\x20protection\x20—\x20a\x20won\x20arbitration\x20award\x20cannot\x20be\x20paid\x20(the\x20claim\x20aborts,\x20code\x2027).\x20Running\x20without\x20a\x20fund\x20is\x20a\x20legitimate\x20merchant\x20choice,\x20but\x20it\x20is\x20one\x20a\x20buyer\x20should\x20see\x20before\x20ordering.':'Orders\x20at\x20or\x20under\x20this\x20cap\x20are\x20fully\x20protected\x20(award\x20ceiling\x203x\x20order).\x20Above\x20the\x20cap\x20there\x20is\x20NO\x20partial\x20payout\x20—\x20settlement\x20is\x20all-or-nothing\x20and\x20the\x20claim\x20aborts\x20(code\x2027)\x20until\x20the\x20fund\x20covers\x20the\x20award;\x20the\x20order\x20itself\x20is\x20unaffected.';let aa=null;if(a6!==null&&a6>0x0n){const c0=W['filter'](c4=>!c4['suspension']&&/^\d+$/['test'](c4['price']?.['trim']()??''))['map'](c4=>({'name':c4['name'],'price':BigInt(c4['price']['trim']())})),c1=computeFundListingWall(a6,c0),c2=await Promise['all'](c1['blocked']['map'](async c4=>({'name':c4['name'],'price':c4['price']['toString'](),'price_display':(await N(c4['price']['toString']()))['display']}))),c3=c2['length']===0x0?null:'The\x20fund\x20currently\x20backs\x20orders\x20up\x20to\x20'+(a8?.['display']??a7)+'.\x20'+((c2['length']===0x1?'1\x20listing\x20is':c2['length']+'\x20listings\x20are')+'\x20priced\x20above\x20that\x20and\x20cannot\x20be\x20checked\x20out\x20—\x20the\x20buy\x20gate\x20refuses\x20the\x20order\x20(no\x20money\x20moves)\x20because\x20the\x20fund\x20cannot\x20back\x20its\x20maximum\x20award.\x20')+'The\x20highest-priced\x20listing\x20is\x20blocked\x20first;\x20top\x20the\x20fund\x20above\x203x\x20a\x20listing\x27s\x20price\x20(service.compensation_fund_add)\x20or\x20cut\x20the\x20price\x20to\x20restore\x20it.\x20'+'This\x20recomputes\x20on\x20every\x20read:\x20after\x20every\x20award\x20that\x20spends\x20the\x20fund,\x20re-check\x20your\x20top\x20listing.';aa={'blocked':c2,'note':c3};}const ab=projectExploration([],{'truncations':[],'budgetExhausted':{},'dataGaps':j});return{'action':'service_panorama','network':h,'service':{'address':k,'name':A,'description':m['description']??'','location':m['location']??'','published':m['bPublished']===!![],'paused':m['bPaused']===!![],'paused_time':typeof m['paused_time']==='number'?m['paused_time']:typeof m['paused_time']==='string'&&/^\d+$/['test'](m['paused_time'])?Number(m['paused_time']):null,'setting_lock_duration':balanceStr(m['setting_lock_duration']),'customer_required':Array['isArray'](m['customer_required'])?m['customer_required']:[],'compensation_fund':balanceStr(m['compensation_fund']),'compensation_fund_display':a4['display'],'compensation_fund_tip':a4['tip'],'compensation_fund_cover_cap':a7,'compensation_fund_cover_cap_display':a8?.['display']??null,'compensation_fund_cover_cap_note':a9,'compensation_fund_listing_wall':aa,'sales':W,'machine':m['machine']??null,'buy_guard':m['buy_guard']??null,'permission':m['permission']??'','um':m['um']??null,'arbitrations':Array['isArray'](m['arbitrations'])?m['arbitrations']:[],'rewards':Array['isArray'](m['rewards'])?m['rewards']:[],'repositories':Array['isArray'](m['repositories'])?m['repositories']:[],'order_allocators':Z,'income_recipients':a0,'payment_token':{'coin_type':L,'guidance':M(L,h)},'onchain_last_updated':F,'tags':z['tags']??[],'owner':a2,'owner_name':a3?.['name']??null},'machine_graph':C,'buy_guard':summarizeGuard(l['buy_guard']),'permission':a1,'related':{'groups':R},'supply_chain':G,'business_report':H,'recent_orders':Q,'data_gaps':j,...ab['open_questions']['length']>0x0?{'exploration':ab}:{}};}
|
|
1
|
+
import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as a389a}from'../../tools/handlers/name-resolution.js';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{computeFundListingWall}from'../../graph/onchain/facts.js';import{projectExploration}from'../../graph/onchain/exploration.js';import{buildMachineGraph}from'./machine-nodes.js';import{formatMoneyAnnotation}from'./facet-money.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let h=d??await Config['Instance']()['network_get']();const j=[];let k=await a389a(c,'service'),l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h});if(!l?.['service']&&d){const ac=await Config['Instance']()['network_get']();ac&&ac!==h&&(h=ac,l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h}));}const m=l['service'];k=m['object']??k;const q=new Set(),w=ad=>{if(ad)q['add'](ad);};w(k),w(m['machine']),w(m['permission']),w(m['um']);for(const ad of m['arbitrations']??[])w(ad);for(const ae of m['rewards']??[])w(ae);for(const af of m['repositories']??[])w(af);const x=l['permission'];if(x){const ag=Array['isArray'](x['admin'])?x['admin']:[];ag[0x0]&&w(typeof ag[0x0]==='string'?ag[0x0]:ag[0x0]?.['account']);if(x['builder'])w(x['builder']);}const y=await markOfMany([...q]),z=y['get'](k)??{'name':null,'tags':[],'updated_at_ms':null},A=z['name'],B=ah=>ah?y['get'](ah)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let C=null;const D=l['machine'],E=l['machine_nodes']??[];if(D||E['length']>0x0){const {nodes:ah,edges:ai}=buildMachineGraph(E);C={'address':D?.['object']??m['machine']??'','name':B(D?.['object']??m['machine'])['name'],'description':D?.['description']??null,'published':typeof D?.['bPublished']==='boolean'?D['bPublished']:null,'paused':typeof D?.['bPaused']==='boolean'?D['bPaused']:null,'node_count':typeof D?.['node_count']==='number'?D['node_count']:null,'consensus_repositories':Array['isArray'](D?.['consensus_repositories'])?D['consensus_repositories']:[],'nodes':ah,'edges':ai};}let F=null;try{const aj=await query_object_last_updated({'object':k,'network':h});aj?.['timestamp_ms']&&(F={'timestamp_ms':aj['timestamp_ms'],'digest':aj['digest']??null,'sender':aj['sender']??null});}catch{j['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let G=null;try{G=await resolveSupplyChainGraph(k,h);}catch{j['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let H=null,I=[];const J=m?.['type_raw']??m?.['type']??'',K=J['match'](/<(.+)>$/),L=K?K[0x1]:null,M=(ak,al)=>{const am=[];return ak?am['push']('Pricing\x20&\x20settlement\x20coin:\x20'+ak+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):am['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),am['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](al)?am['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):am['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),am['join']('\x20');},N=ak=>formatMoneyAnnotation(ak,L,h),O=0x3,P=0x32;let Q=null;try{const ak=await fetchServiceOrders(k,h,!![]),al=Array['isArray'](ak?.['items'])?ak['items']:[],am=al['slice'](-P),an=al['slice'](-O),ao=am['map'](aM=>typeof aM?.['who']==='string'?aM['who']:'')['filter'](aM=>aM!==''),ap=an['map'](aM=>typeof aM?.['who']==='string'?aM['who']:'')['filter'](aM=>aM!==''),aq=new Map();try{if(ao['length']>0x0){const aM=await batchQueryObjectsByIds(ao,h,!![]);for(const aN of aM){aN&&aN['type']===ObjectType['Order']&&aq['set'](aN['object'],aN);}}}catch{j['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const ar=new Map();try{const aO=new Set();for(const aP of aq['values']()){if(aP?.['allocation'])aO['add'](aP['allocation']);}if(aO['size']>0x0){const aQ=await batchQueryObjectsByIds(Array['from'](aO),h,!![]);for(const aR of aQ){if(!aR?.['object'])continue;if(aR['type']===ObjectType['Allocation']){const aS=Number(aR?.['balance']??0x0);ar['set'](aR['object'],Number['isFinite'](aS)&&aS===0x0?'allocated':'pending');}}}}catch{j['push']('recent_orders:\x20allocation\x20details\x20unavailable\x20(non-blocking)');}const as=new Map(),at=new Map();try{const aT=new Set();for(const aU of ap){const aV=aq['get'](aU);if(aV?.['progress'])aT['add'](aV['progress']);}if(aT['size']>0x0){const aW=await batchQueryObjectsByIds(Array['from'](aT),h,!![]);for(const aX of aW){if(!aX?.['object'])continue;if(aX['type']===ObjectType['Progress']){const aY=aX?.['current'];as['set'](aX['object'],typeof aY==='string'&&aY!==''?aY:null),at['set'](aX['object'],Number(aX?.['current_time'])||null);}}}}catch{j['push']('recent_orders:\x20progress\x20details\x20unavailable\x20(non-blocking)');}I=Array['from'](aq['values']())['map'](aZ=>({'id':aZ['object'],'created_at_ms':Number(aZ['time'])||undefined,'claimed_by':aZ['claimed_by']??null,'current_node':aZ['progress']?as['get'](aZ['progress'])??null:null}));const au=new Map();try{const aZ=ap,b0=await Promise['allSettled'](aZ['map'](b1=>query_object_last_updated({'object':b1,'network':h})));for(let b1=0x0;b1<aZ['length'];b1++){const b2=b0[b1];au['set'](aZ[b1],b2['status']==='fulfilled'&&b2['value']?.['timestamp_ms']?Number(b2['value']['timestamp_ms'])||null:null);}}catch{j['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const av=await Promise['all'](an['map'](async b3=>{const b4=typeof b3?.['who']==='string'?b3['who']:'',b5=aq['get'](b4),b6=b5?.['amount']!==null&&b5?.['amount']!==undefined?String(b5['amount']):'',b7=await N(b6);return{'order':b4,'time':typeof b3?.['time']==='number'?b3['time']:0x0,'updated_ms':au['get'](b4)??null,'amount':b6,'amount_display':b7['display'],'amount_tip':b7['tip'],'progress':b5?.['progress']??null,'allocation':b5?.['allocation']??null,'disputes':Array['isArray'](b5?.['dispute'])?b5['dispute']:[],'agent':Array['isArray'](b5?.['agent'])?b5['agent']:[],'owner':ownerAddr(b5?.['builder']??b5?.['owner']),'claimed_by':b5?.['claimed_by']??null,'required_info':b5?.['required_info']??null,'progress_next':b5?.['progress']?as['get'](b5['progress'])??null:null,'progress_since':b5?.['progress']?at['get'](b5['progress'])??null:null,'allocation_state':b5?.['allocation']?ar['get'](b5['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](b5?.['items'])?b5['items']:[])['map'](async b8=>({'name':String(b8?.['name']??''),'price_display':(await N(b8?.['price']!==null&&b8?.['price']!==undefined?String(b8['price']):null))['display'],'quantity':String(b8?.['quantity']??'0'),'wip_hash':String(b8?.['wip_hash']??'')})))};})),aw=av['filter'](b3=>b3['order']!==''),ax=ao['map'](b3=>aq['get'](b3))['filter'](b3=>!!b3);let ay=0x0n,az=0x0,aA=0x0,aB=0x0,aC=0x0,aD=0x0,aE=null,aF=null;for(const b3 of ax){const b4=b3?.['amount']!==null&&b3?.['amount']!==undefined?String(b3['amount']):'';/^\d+$/['test'](b4)&&(ay+=BigInt(b4),az++);if(Array['isArray'](b3?.['dispute'])&&b3['dispute']['length']>0x0)aA++;const b5=b3?.['allocation']?ar['get'](b3['allocation'])??'pending':'none';if(b5==='pending')aB++;else{if(b5==='allocated')aC++;else aD++;}}for(const b6 of am){if(typeof b6?.['time']==='number'){if(aE===null||b6['time']<aE)aE=b6['time'];if(aF===null||b6['time']>aF)aF=b6['time'];}}const aG=az>0x0?ay['toString']():null,aH=aG!==null?await N(aG):null,aI=al['length'],aJ=ak?.['ring_saturated']??ringWindowSaturated(aI),aK=aw['length'],aL='Analyze\x20ALL\x20orders\x20of\x20Service\x20'+k+'\x20('+h+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20orders\x20live\x20in\x20the\x20Service\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+aI+(aJ?',\x20saturated':'')+').\x20')+'For\x20each\x20order\x20call\x20object_panorama\x20with\x20the\x20order\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20order:\x20'+'order\x20address\x20chip\x20(first\x20column)\x20|\x20created\x20+\x20last-updated\x20(local\x20dates)\x20|\x20amount\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20fund\x20state\x20(none\x20/\x20pending\x20/\x20allocated)\x20|\x20current\x20machine\x20node\x20|\x20disputes\x20(each\x20dispute\x20case\x20as\x20its\x20own\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20—\x20an\x20order\x27s\x20progress,\x20allocation\x20and\x20arb\x20cases\x20are\x20its\x20children\x20and\x20are\x20never\x20split\x20into\x20a\x20separate\x20flat\x20list)\x20|\x20buyer\x20address\x20chip.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(amount\x20distribution,\x20stuck\x20or\x20paused\x20orders,\x20dispute\x20rate).\x20Orders\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Service\x20itself.';Q={'count':aI,'window_saturated':aJ,'preview_truncated':aI>aK,'stats':{'scope_count':ax['length'],'scoped':ax['length']<aI,'amount_sum_raw':aG,'amount_sum_display':aH?.['display']??null,'amount_sum_tip':aH?.['tip']??null,'amount_known_count':az,'disputed_order_count':aA,'allocation_pending_count':aB,'allocation_allocated_count':aC,'allocation_none_count':aD,'first_created_ms':aE,'last_created_ms':aF},...aI>aK?{'drilldown':{'total_count':aI,'analyzed_count':aK,'stats_scope_count':ax['length'],'prompt':aL},'order_addresses':ax['map'](b7=>b7['object'])}:{},'items':aw};}catch{j['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}try{const b7=[m,l['machine'],l['buy_guard'],...l['allocator_guards']??[]]['filter'](Boolean);H=generateBusinessReport({'objects':b7,'machine_nodes':E['map'](b8=>({'name':b8['name']})),'machine_edges':C?.['edges']?C['edges']['map'](b8=>({'from':b8['from'],'to':b8['to']})):undefined,'orders':I['length']>0x0?I:undefined,'now_ms':Date['now']()});}catch{j['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const R=[];try{const b8=await query_affiliations({'address':k,'no_cache':!![],'network':h}),b9=new Set(),ba=new Map();for(const bc of b8?.['entries']??[]){const bd=typeof bc?.['who']==='string'?bc['who']:'';if(!bd||b9['has'](bd))continue;b9['add'](bd);const be=objectTypeFromAddress(bd);if(!be)continue;if(be===ObjectType['Order'])continue;const bf=String(be);let bg=ba['get'](bf);!bg&&(bg=[],ba['set'](bf,bg)),bg['push']({'address':bd,'type_label':bf,'name':B(bd)['name'],'time':typeof bc?.['time']==='number'?bc['time']:null,'via':typeof bc?.['table']==='string'?bc['table']:null});}const bb=['Progress','Allocation','Payment','Guard'];for(const bh of bb){const bi=ba['get'](bh);bi&&bi['length']>0x0&&(R['push']({'type_label':bh,'items':bi}),ba['delete'](bh));}for(const [bj,bk]of ba){if(bk['length']>0x0)R['push']({'type_label':bj,'items':bk});}}catch{j['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const S=new Set(),T=bl=>{typeof bl==='string'&&/^0x[0-9a-fA-F]{40,64}$/['test'](bl)&&S['add'](bl['toLowerCase']());};T(m['buy_guard']);for(const bl of E){for(const bm of bl?.['pairs']??[]){for(const bn of bm?.['forwards']??[])T(bn?.['guard']);}}for(const bo of m['order_allocators']?.['allocators']??[])T(bo?.['guard']);for(const bp of l['allocator_guards']??[])T(bp?.['object']);for(const bq of Object['values'](l['referenced']??{})){const br=bq;if(!br||typeof br!=='object')continue;if(br['type']===ObjectType['Reward']){for(const bs of br['guards']??[])T(bs?.['guard']);}if(br['type']===ObjectType['Treasury']){for(const bt of br['external_withdraw_guard']??[])T(bt?.['guard']);for(const bu of br['external_deposit_guard']??[])T(bu?.['guard']);}(br['type']===ObjectType['Arbitration']||br['type']===ObjectType['Arb'])&&T(br['voting_guard']);}const U=R['find'](bv=>bv['type_label']===String(ObjectType['Guard']));if(U){U['items']=U['items']['filter'](bv=>!S['has'](bv['address']['toLowerCase']()));if(U['items']['length']===0x0)R['splice'](R['indexOf'](U),0x1);else{const bv=U['items'];try{const bw=await batchQueryObjectsByIds(bv['map'](by=>by['address']),h,!![]),bx=new Map();for(const by of bw){if(by?.['object'])bx['set'](String(by['object'])['toLowerCase'](),by);}for(const bz of bv){const bA=bx['get'](bz['address']['toLowerCase']());if(!bA){bz['explanation']=null;continue;}const bB=Array['isArray'](bA['table'])?bA['table']:[],bC=[];let bD=0x0;for(const bF of bB){if(bF?.['b_submission']===!![]){bD++;continue;}bF?.['value_type']==='Address'&&typeof bF?.['value']==='string'&&bF['value']['startsWith']('0x')&&bC['push'](bF['value']);}const bE=bC['some'](bG=>bG['toLowerCase']()===k['toLowerCase']());bz['explanation']={'description':typeof bA['description']==='string'?bA['description']:null,'table_refs':bC,'references_this_service':bE,'submission_slots':bD,'note':bE?'One-off\x20verification\x20guard:\x20NOT\x20mounted\x20on\x20any\x20host\x20field;\x20its\x20table\x20carries\x20this\x20Service\x20as\x20an\x20on-chain\x20constant\x20(the\x20affiliation\x20is\x20written\x20at\x20creation).\x20It\x20acts\x20only\x20when\x20submitted\x20inside\x20a\x20passport\x20at\x20runtime.':'Guard\x20surfaced\x20by\x20the\x20affiliation\x20window\x20only;\x20not\x20mounted\x20on\x20any\x20host\x20field\x20reachable\x20from\x20this\x20panorama.\x20It\x20acts\x20only\x20when\x20referenced\x20at\x20runtime\x20(passport\x20submission\x20or\x20a\x20host\x20outside\x20this\x20view).'};}}catch{j['push']('related:\x20unbound-guard\x20explanation\x20unavailable\x20(non-blocking)');}}}const V=new Map();for(const bG of l['allocator_guards']??[]){const bH=bG;if(bH?.['object'])V['set'](String(bH['object'])['toLowerCase'](),bH);}const W=[];for(const bI of Array['isArray'](m['sales'])?m['sales']:[]){const bJ=balanceStr(bI?.['price']),bK=await N(bJ);W['push']({'name':typeof bI?.['name']==='string'?bI['name']:'','price':bJ,'price_display':bK['display'],'price_tip':bK['tip'],'stock':balanceStr(bI?.['stock']),'suspension':bI?.['suspension']===!![],'wip':typeof bI?.['wip']==='string'?bI['wip']:'','wip_hash':typeof bI?.['wip_hash']==='string'?bI['wip_hash']:''});}const X=bL=>bL===0x0?'amount':bL===0x2?'surplus':'rate',Y=bL=>{const bM=bL?.['who'];if(bM&&typeof bM==='object'&&'Entity'in bM){const bN=bM['Entity'],bO=typeof bN==='string'?bN:typeof bN?.['name_or_address']==='string'?bN['name_or_address']:null;return{'who':bO?'Entity\x20'+bO:'Entity','entity':bO&&/^0x[0-9a-fA-F]{6,64}$/['test'](bO)?bO:null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};}if(bM&&typeof bM==='object'&&'GuardIdentifier'in bM)return{'who':'Guard\x20identifier\x20#'+bM['GuardIdentifier'],'entity':null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};return{'who':'Signer','entity':null,'mode':X(bL?.['mode']),'value':balanceStr(bL?.['sharing'])};},Z=m['order_allocators']?{'description':m['order_allocators']['description']??'','threshold':balanceStr(m['order_allocators']['threshold']),'allocators':(m['order_allocators']['allocators']??[])['map'](bL=>({'guard':bL['guard'],'sharing_count':Array['isArray'](bL['sharing'])?bL['sharing']['length']:0x0,'sharing':(Array['isArray'](bL['sharing'])?bL['sharing']:[])['map'](Y),'max':balanceStr(bL['max']??null),'guard_summary':summarizeGuard(V['get'](String(bL['guard']??'')['toLowerCase']()))}))}:null,a0=[];{const bL=new Map();for(const bM of m['order_allocators']?.['allocators']??[]){for(const bN of Array['isArray'](bM['sharing'])?bM['sharing']:[]){const bO=Y(bN);if(bO['entity']){const bP=bO['entity']['toLowerCase'](),bQ=bL['get'](bP)??{'raw':bO['entity'],'guards':[]};bQ['guards']['push'](bM['guard']??''),bL['set'](bP,bQ);}}}if(bL['size']>0x0)try{const bR=await batchQueryObjectsByIds([...bL['keys']()],h,!![]),bS=new Map();for(const bT of bR){if(bT?.['object'])bS['set'](String(bT['object'])['toLowerCase'](),bT);}for(const [bU,bV]of bL){const bW=bS['get'](bU),bX='order_allocators\x20sharing\x20of\x20allocator\x20guard\x20'+bV['guards'][0x0];if(bW&&bW['permission']!==undefined){const bY=balanceStr(bW['balance']),bZ=await N(bY);a0['push']({'address':String(bW['object']),'kind':'treasury','description':typeof bW['description']==='string'?bW['description']:null,'permission':typeof bW['permission']==='string'?bW['permission']:null,'balance':bY,'balance_display':bZ['display'],'balance_tip':bZ['tip'],'external_deposit_guard_count':Array['isArray'](bW['external_deposit_guard'])?bW['external_deposit_guard']['length']:null,'external_withdraw_guard_count':Array['isArray'](bW['external_withdraw_guard'])?bW['external_withdraw_guard']['length']:null,'via':bX});}else a0['push']({'address':bV['raw'],'kind':'account','description':null,'permission':null,'balance':null,'balance_display':null,'balance_tip':null,'external_deposit_guard_count':null,'external_withdraw_guard_count':null,'via':bX});}}catch{j['push']('income_recipients:\x20Sharing\x20entity\x20read\x20failed\x20(non-blocking)');}}const a1=summarizePermission(l['permission'],B(m['permission'])),a2=a1?.['owner']??F?.['sender']??null,a3=a2?await markOf(a2):null,a4=await N(balanceStr(m['compensation_fund'])),a5=balanceStr(m['compensation_fund']),a6=/^\d+$/['test'](a5?.['trim']()??'')?BigInt(a5['trim']()):null,a7=a6===null?null:(a6/0x3n)['toString'](),a8=a7===null?null:await N(a7),a9=a6===null?null:a6===0x0n?'No\x20compensation\x20fund:\x20this\x20Service\x20carries\x20NO\x20payout\x20protection\x20—\x20a\x20won\x20arbitration\x20award\x20cannot\x20be\x20paid\x20(the\x20claim\x20aborts,\x20code\x2027).\x20Running\x20without\x20a\x20fund\x20is\x20a\x20legitimate\x20merchant\x20choice,\x20but\x20it\x20is\x20one\x20a\x20buyer\x20should\x20see\x20before\x20ordering.':'Orders\x20at\x20or\x20under\x20this\x20cap\x20are\x20fully\x20protected\x20(award\x20ceiling\x203x\x20order).\x20Above\x20the\x20cap\x20there\x20is\x20NO\x20partial\x20payout\x20—\x20settlement\x20is\x20all-or-nothing\x20and\x20the\x20claim\x20aborts\x20(code\x2027)\x20until\x20the\x20fund\x20covers\x20the\x20award;\x20the\x20order\x20itself\x20is\x20unaffected.';let aa=null;if(a6!==null&&a6>0x0n){const c0=W['filter'](c4=>!c4['suspension']&&/^\d+$/['test'](c4['price']?.['trim']()??''))['map'](c4=>({'name':c4['name'],'price':BigInt(c4['price']['trim']())})),c1=computeFundListingWall(a6,c0),c2=await Promise['all'](c1['blocked']['map'](async c4=>({'name':c4['name'],'price':c4['price']['toString'](),'price_display':(await N(c4['price']['toString']()))['display']}))),c3=c2['length']===0x0?null:'The\x20fund\x20currently\x20backs\x20orders\x20up\x20to\x20'+(a8?.['display']??a7)+'.\x20'+((c2['length']===0x1?'1\x20listing\x20is':c2['length']+'\x20listings\x20are')+'\x20priced\x20above\x20that\x20and\x20cannot\x20be\x20checked\x20out\x20—\x20the\x20buy\x20gate\x20refuses\x20the\x20order\x20(no\x20money\x20moves)\x20because\x20the\x20fund\x20cannot\x20back\x20its\x20maximum\x20award.\x20')+'The\x20highest-priced\x20listing\x20is\x20blocked\x20first;\x20top\x20the\x20fund\x20above\x203x\x20a\x20listing\x27s\x20price\x20(service.compensation_fund_add)\x20or\x20cut\x20the\x20price\x20to\x20restore\x20it.\x20'+'This\x20recomputes\x20on\x20every\x20read:\x20after\x20every\x20award\x20that\x20spends\x20the\x20fund,\x20re-check\x20your\x20top\x20listing.';aa={'blocked':c2,'note':c3};}const ab=projectExploration([],{'truncations':[],'budgetExhausted':{},'dataGaps':j});return{'action':'service_panorama','network':h,'service':{'address':k,'name':A,'description':m['description']??'','location':m['location']??'','published':m['bPublished']===!![],'paused':m['bPaused']===!![],'paused_time':typeof m['paused_time']==='number'?m['paused_time']:typeof m['paused_time']==='string'&&/^\d+$/['test'](m['paused_time'])?Number(m['paused_time']):null,'setting_lock_duration':balanceStr(m['setting_lock_duration']),'customer_required':Array['isArray'](m['customer_required'])?m['customer_required']:[],'compensation_fund':balanceStr(m['compensation_fund']),'compensation_fund_display':a4['display'],'compensation_fund_tip':a4['tip'],'compensation_fund_cover_cap':a7,'compensation_fund_cover_cap_display':a8?.['display']??null,'compensation_fund_cover_cap_note':a9,'compensation_fund_listing_wall':aa,'sales':W,'machine':m['machine']??null,'buy_guard':m['buy_guard']??null,'permission':m['permission']??'','um':m['um']??null,'arbitrations':Array['isArray'](m['arbitrations'])?m['arbitrations']:[],'rewards':Array['isArray'](m['rewards'])?m['rewards']:[],'repositories':Array['isArray'](m['repositories'])?m['repositories']:[],'order_allocators':Z,'income_recipients':a0,'payment_token':{'coin_type':L,'guidance':M(L,h)},'onchain_last_updated':F,'tags':z['tags']??[],'owner':a2,'owner_name':a3?.['name']??null},'machine_graph':C,'buy_guard':summarizeGuard(l['buy_guard']),'permission':a1,'related':{'groups':R},'supply_chain':G,'business_report':H,'recent_orders':Q,'data_gaps':j,...ab['open_questions']['length']>0x0?{'exploration':ab}:{}};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_objects,query_serviceContext}from'@wowok/wowok';import{resolveAddress as a352a}from'../../tools/handlers/name-resolution.js';import{formatMoneyAnnotation}from'./facet-money.js';const balanceStr=a=>a===null||a===undefined?'0':typeof a==='bigint'?a['toString']():String(a);async function displayOf(a,b,c){try{return(await formatMoneyAnnotation(a,b,c))['display'];}catch{return a;}}function describeRecipient(a){if(typeof a==='string')return a;if(a&&typeof a==='object'){const b=a;if('GuardIdentifier'in b)return'submission\x20slot\x20'+String(b['GuardIdentifier']);if('Entity'in b){const c=b['Entity'],d=c&&typeof c==='object'?c['name_or_address']:c;return d===''?'Entity(\x22\x22)\x20—\x20MCP\x20default\x20local\x20account':'Entity:'+String(d);}return JSON['stringify'](a);}return'unknown';}export async function handleServiceQuote(a){const b=a['context_network']??undefined??await Config['Instance']()['network_get'](),d=await a352a(a['service_address'],'service_address'),f=await query_serviceContext({'service':d,'network':b}),h=f['service'];if(!h)throw new Error('Service\x20\x27'+a['service_address']+'\x27\x20not\x20found\x20on\x20network\x20'+b+'.');const i=h?.['type_raw']??h?.['type']??'',j=i['match'](/<(.+)>$/),k=j?j[0x1]:null,l=Array['isArray'](h['sales'])?h['sales']:[],m=new Map();for(const L of l){if(!L||typeof L['name']!=='string')continue;m['set'](L['name'],{'price':balanceStr(L['price']?.['balance']??L['price']??0x0),'suspended':L['suspension']===!![]});}const n=a['items']??[...m['keys']()]['map'](M=>({'name':M,'quantity':0x1})),p=n['filter'](M=>!m['has'](M['name']));if(p['length']>0x0)throw new Error('Sale(s)\x20not\x20found\x20on\x20this\x20Service:\x20'+p['map'](M=>'\x27'+M['name']+'\x27')['join'](',\x20')+'.\x20'+('Available\x20sales:\x20'+([...m['keys']()]['map'](M=>'\x27'+M+'\x27')['join'](',\x20')||'<none>')+'.'));if(n['length']===0x0)throw new Error('This\x20Service\x20has\x20NO\x20configured\x20sales\x20—\x20nothing\x20to\x20quote.');const q=[];let t=0x0n;for(const M of n){const N=m['get'](M['name']),O=BigInt(N['price']||'0'),P=O*BigInt(M['quantity']);t+=P,q['push']({'name':M['name'],'quantity':M['quantity'],'unit_price':N['price'],'unit_price_display':await displayOf(N['price'],k,b),'line_total':P['toString'](),'suspended':N['suspended']});}let u=t,w=null;if(typeof a['discount']==='string'&&a['discount']['trim']()!==''){const Q=await a352a(a['discount'],'discount');let R=null;try{const a2=await query_objects({'objects':[Q],'network':b});R=a2?.['objects']?.[0x0]??null;}catch{R=null;}if(!R)throw new Error('E_DISCOUNT_NOT_FOUND:\x20coupon\x20\x27'+Q+'\x27\x20not\x20found\x20—\x20it\x20was\x20already\x20burned\x20on\x20a\x20'+'previous\x20buy\x20(a\x20burned\x20coupon\x20is\x20destroyed\x20on\x20chain\x20and\x20cannot\x20be\x20quoted\x20again)\x20'+'or\x20the\x20address\x20is\x20wrong.\x20Re-quote\x20without\x20the\x20coupon.');const S=String(R['service']??'');if(S['toLowerCase']()!==d['toLowerCase']())throw new Error('E_SERVICE_DISCOUNT_NOT_MATCH:\x20coupon\x20\x27'+Q+'\x27\x20is\x20bound\x20to\x20service\x20'+((S||'<unparseable>')+',\x20not\x20to\x20'+d+'.\x20A\x20buy\x20with\x20this\x20coupon\x20aborts.'));const T=a3=>{const a4=balanceStr(a3)['trim']();return/^\d+$/['test'](a4)?BigInt(a4):0x0n;},U=BigInt(Date['now']()),V=T(R['time_start']),W=T(R['time_end']);if(U<V||U>W)throw new Error('E_DISCOUNT_TIME_INVALID:\x20coupon\x20\x27'+Q+'\x27\x20is\x20valid\x20'+(V+'–'+W+'\x20(ms\x20epoch),\x20now\x20is\x20'+U+'.\x20A\x20buy\x20with\x20this\x20coupon\x20aborts.'));const X=Number(R['discount_type'])===0x0,Y=T(R['off']),Z=R['benchmark']===null||R['benchmark']===undefined?null:T(R['benchmark']),a0=Z===null?!![]:t>=Z;let a1=![];a0&&(a1=!![],u=X?t-t*Y/0x2710n:t>Y?t-Y:0x0n),w={'coupon':Q,'name':typeof R['name']==='string'?R['name']:null,'type':X?'rates':'minus','off':Y['toString'](),'benchmark':Z===null?null:Z['toString'](),'benchmark_met':a0,'applied':a1,'list_total':t['toString'](),'final_total':u['toString'](),'final_total_display':await displayOf(u['toString'](),k,b),'note':a1?u===0x0n?'DEAD\x20BASKET\x20(F-BS-75):\x20the\x20coupon\x20covers\x20the\x20entire\x20basket,\x20but\x20the\x20chain\x20REFUSES\x20zero-total\x20'+'buys\x20—\x20the\x20client\x20gate\x20(order_new_zero_total_dead_order)\x20and\x20the\x20on-chain\x20zero-total\x20gate\x20'+'(abort\x2042)\x20both\x20reject\x20this\x20buy;\x20NOTHING\x20is\x20purchasable\x20at\x20total\x200,\x20free\x20product\x20or\x20not.\x20'+'Lower\x20the\x20coupon\x20value\x20so\x20the\x20final\x20total\x20stays\x20>=\x201\x20smallest\x20unit\x20(or\x20price\x20a\x20deliberate\x20'+'free\x20tier\x20at\x201\x20smallest\x20unit).\x20allow_zero_total\x20on\x20the\x20coupon\x20is\x20disclosure-only\x20and\x20does\x20'+'NOT\x20unlock\x20this\x20buy\x20(F-BS-74).':'Discounted\x20total\x20shown\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20final_total.':'⚠\x20Benchmark\x20NOT\x20met\x20(list\x20total\x20'+t+'\x20<\x20'+Z+'):\x20the\x20chain\x20REJECTS\x20this\x20buy\x20when\x20the\x20coupon\x20is\x20attached\x20(error\x2038\x20—\x20full\x20rollback,\x20nothing\x20paid,\x20coupon\x20preserved).\x20Raise\x20the\x20basket\x20to\x20>=\x20'+Z+',\x20or\x20order\x20without\x20the\x20coupon\x20and\x20keep\x20it.'};}const x=balanceStr(h['compensation_fund']??0x0),y=/^\d+$/['test'](x['trim']())?BigInt(x['trim']()):0x0n,z=0x3n*u,A=y/0x3n,B=await displayOf(A['toString'](),k,b),C={'fund_balance':y['toString'](),'fund_balance_display':await displayOf(y['toString'](),k,b),'max_coverable_order':A['toString'](),'max_coverable_order_display':B,'required_for_this_basket':z['toString'](),'required_display':await displayOf(z['toString'](),k,b),'covered':y>=z,'note':y===0x0n?'This\x20Service\x20runs\x20WITHOUT\x20a\x20compensation\x20fund\x20—\x20a\x20legitimate\x20merchant\x20choice,\x20never\x20blocked\x20at\x20buy.\x20An\x20arbitration\x20award\x20beyond\x20the\x20pool\x20aborts\x20the\x20buyer\x27s\x20payout\x20(code\x2027,\x20claim\x20NOT\x20consumed)\x20and\x20waits\x20on\x20the\x20merchant\x20wallet.':y>=z?'The\x20fund\x20covers\x203x\x20this\x20basket\x27s\x20amount\x20—\x20a\x20single\x20ruling\x20at\x20the\x20maximum\x20award\x20multiple\x20is\x20payable\x20from\x20the\x20pool.\x20Storefront\x20ceiling:\x20no\x20order\x20above\x20'+B+'\x20(fund/3)\x20can\x20be\x20created\x20—\x20quote\x20a\x20bigger\x20basket\x20against\x20the\x20ceiling,\x20not\x20just\x20this\x20one.':'BELOW\x20the\x20per-order\x20payout\x20requirement:\x20order\x20creation\x20will\x20be\x20BLOCKED\x20(compensation_fund_below_order_ceiling\x20—\x20no\x20money\x20moves)\x20until\x20the\x20merchant\x20tops\x20up\x20via\x20service.compensation_fund_add\x20to\x20>=\x203x\x20this\x20basket.\x20Standing\x20ceiling:\x20orders\x20above\x20'+B+'\x20(fund/3)\x20are\x20refused\x20at\x20buy,\x20so\x20this\x20basket\x20is\x20only\x20the\x20latest\x20casualty\x20—\x20every\x20bigger\x20SKU\x20is\x20unbuyable\x20too.'},D=await displayOf(u['toString'](),k,b),E=h['order_allocators'],F=Array['isArray'](E?.['allocators'])?E['allocators']:[],G=F['length']>0x0?F[0x0]:undefined,H=G?{'allocator_index':0x0,'note':'Sharing\x20rows\x20of\x20the\x20FIRST\x20order_allocator\x20(index\x200\x20—\x20NOT\x20necessarily\x20the\x20normal\x20'+'payout\x20path:\x20services\x20that\x20ship\x20refund-first\x20rails\x20put\x20the\x20refund\x20track\x20at\x20index\x200,\x20'+'klk15\x20C-06).\x20Guards\x20select\x20per-case\x20allocators\x20(refund\x20/\x20damage\x20/\x20late-cancel),\x20so\x20'+'the\x20LIVE\x20split\x20depends\x20on\x20which\x20guard\x20passes\x20—\x20identify\x20the\x20settlement\x20allocator\x20'+'via\x20service_panorama\x20before\x20ordering.','sharing':(Array['isArray'](G['sharing'])?G['sharing']:[])['map'](a3=>({'recipient':describeRecipient(a3?.['who']),'mode':typeof a3?.['mode']==='string'?a3['mode']:null,'value':balanceStr(a3?.['sharing']?.['balance']??a3?.['sharing']??0x0)}))}:null,I=Array['isArray'](h['rewards'])?h['rewards']['filter'](a3=>typeof a3==='string'&&a3!==''):[];let J=null;if(I['length']>0x0){const a3=[],a4=[];let a5=[];try{const a6=await query_objects({'objects':I,'network':b});a5=Array['isArray'](a6?.['objects'])?a6['objects']:[];}catch(a7){a3['push']('Reward\x20lookup\x20failed\x20('+(a7 instanceof Error?a7['message']:String(a7))+')\x20—\x20reward\x20terms\x20NOT\x20verified;\x20do\x20not\x20rely\x20on\x20them.');}for(const a8 of I){const a9=a5['find'](am=>typeof am?.['object']==='string'&&am['object']['toLowerCase']()===a8['toLowerCase']());if(!a9){a3['push']('Reward\x20\x27'+a8+'\x27\x20could\x20not\x20be\x20read\x20—\x20its\x20terms\x20are\x20unknown;\x20do\x20not\x20rely\x20on\x20it.');continue;}const aa=balanceStr(a9['balance']??0x0),ab=/^\d+$/['test'](aa)?BigInt(aa):0x0n,ac=[];let ad=0x0n,ae=![];for(const am of Array['isArray'](a9['guards'])?a9['guards']:[]){const an=am?.['amount'],ao=an!=null&&(an['type']===0x1||an['type']==='Fixed'),ap=am?.['expiration_time'],aq=ap==null?null:Number(ap),ar=aq!=null&&Number['isFinite'](aq)?aq:null;if(ao){const as=balanceStr(an['value']??0x0),at=/^\d+$/['test'](as)?BigInt(as):0x0n;if(at>ad)ad=at;ac['push']({'guard':String(am?.['guard']??''),'amount_type':'fixed','amount':as,'amount_display':await displayOf(as,k,b),'expiration_time':ar,'expiration_display':ar!=null?new Date(ar)['toISOString']():null,'expired':ar!=null?Date['now']()>ar:null,'min_rating':null});}else ae=!![],ac['push']({'guard':String(am?.['guard']??''),'amount_type':'guard_submission','amount':'submission\x20identifier\x20'+String(an?.['value']??'?'),'amount_display':null,'expiration_time':ar,'expiration_display':ar!=null?new Date(ar)['toISOString']():null,'expired':ar!=null?Date['now']()>ar:null,'min_rating':null});}const af=Array['from'](new Set(ac['map'](au=>au['guard'])['filter'](au=>au!==''))),ag=new Map();if(af['length']>0x0)try{const au=await query_objects({'objects':af,'network':b});for(const av of Array['isArray'](au?.['objects'])?au['objects']:[]){if(typeof av?.['object']==='string')ag['set'](av['object']['toLowerCase'](),av);}}catch{a3['push']('Claim\x20guard\x20lookup\x20failed\x20—\x20rating\x20conditions\x20on\x20'+af['length']+'\x20claim\x20guard(s)\x20NOT\x20verified;\x20do\x20not\x20promise\x20the\x20incentive.');}const ah=(aw,ax=0x0)=>{if(!aw||typeof aw!=='object'||ax>0x4)return null;if(aw['root']&&Array['isArray'](aw['table']))return aw;for(const ay of Object['values'](aw)){if(ay&&typeof ay==='object'){const az=ah(ay,ax+0x1);if(az)return az;}}return null;},ai=(aw,ax)=>{const ay=aw['table']['find'](aA=>aA?.['identifier']===ax&&aA?.['b_submission']===![]);if(!ay)return null;const az=typeof ay['value']==='number'?ay['value']:Number(String(ay['value']??''));return Number['isFinite'](az)?az:null;},aj=(aw,ax,ay=0x0)=>{if(!aw||typeof aw!=='object'||ay>0x18)return null;const az=typeof aw['type']==='string'?aw['type']:'';if(az==='logic_as_u256_greater_or_equal'||az==='logic_as_u256_greater'||az==='logic_as_u256_equal'){const aA=Array['isArray'](aw['nodes'])?aw['nodes']:[],aB=aA[0x0];if(aA['length']>=0x2&&JSON['stringify'](aB??{})['includes']('repository.data')){const aC=aA[aA['length']-0x1],aD=aC?.['type']==='identifier'?ai(ax,Number(aC['identifier'])):typeof aC?.['value']==='number'?aC['value']:null;if(aD!=null){const aE=az==='logic_as_u256_greater_or_equal'?'>=':az==='logic_as_u256_greater'?'>':'==';return aE+'\x20'+aD;}}}for(const aF of Object['values'](aw)){if(Array['isArray'](aF))for(const aG of aF){const aH=aj(aG,ax,ay+0x1);if(aH)return aH;}else{if(aF&&typeof aF==='object'){const aI=aj(aF,ax,ay+0x1);if(aI)return aI;}}}return null;};for(const aw of ac){aw['min_rating']=null;const ax=ag['get'](aw['guard']['toLowerCase']());if(!ax)continue;let ay;try{ay=JSON['stringify'](ax,(aB,aC)=>aC instanceof Uint8Array?Buffer['from'](aC)['toString']('base64'):aC);}catch{continue;}if(!ay['includes']('\x22rating\x22'))continue;const az=ah(ax),aA=az?aj(az['root'],az):null;if(aA)aw['min_rating']=aA;else{const aB=ay['toLowerCase']();if(aB['includes']('\x22like\x22'))aw['min_rating']='like';else{if(aB['includes']('\x22dislike\x22'))aw['min_rating']='dislike';else aw['min_rating']='unknown';}}}const ak=ab===0x0n?'Pool\x20is\x20EMPTY\x20—\x20any\x20claim\x20aborts\x20on-chain\x20on\x20the\x20reward\x20module\x27s\x20E_INSUFFICIENT_BALANCE\x20(not\x20the\x20allocation\x20module\x27s\x20same-named\x20constant);\x20do\x20not\x20budget\x20on\x20this\x20reward.':ae||ad===0x0n?null:'Pool\x20covers\x20~'+(ab/ad)['toString']()+'\x20further\x20claim(s)\x20at\x20the\x20largest\x20configured\x20per-claim\x20amount.',al=ac['filter'](aC=>aC['min_rating']==='unknown')['length'];al>0x0&&a3['push'](al+'\x20claim(s)\x20gate\x20on\x20a\x20rating\x20condition\x20whose\x20polarity\x20could\x20not\x20be\x20parsed\x20'+'(min_rating=unknown)\x20—\x20read\x20the\x20claim\x20guard\x20before\x20promising\x20this\x20incentive\x20to\x20the\x20buyer'),a4['push']({'reward':a8,'description':typeof a9['description']==='string'?a9['description']:null,'pool_balance':ab['toString'](),'pool_balance_display':await displayOf(ab['toString'](),k,b),'record_count':Number['isFinite'](Number(a9['record_count']))?Number(a9['record_count']):0x0,'claims':ac,'coverage':ak});}J={'note':'Pre-order\x20reward\x20terms\x20for\x20every\x20Reward\x20hung\x20on\x20this\x20Service\x20(bound\x20at\x20build\x20time):\x20pool\x20balance,\x20'+'per-claim\x20amount\x20and\x20claim\x20windows.\x20A\x20claim\x20aborts\x20after\x20its\x20window\x20(E_GUARD_EXPIRED)\x20or\x20'+'against\x20an\x20empty\x20pool\x20(E_INSUFFICIENT_BALANCE)\x20—\x20never\x20budget\x20on\x20an\x20expired\x20or\x20empty\x20'+'reward.\x20Claiming\x20requires\x20passing\x20the\x20claim\x20guard\x27s\x20conditions.','rewards':a4,'data_gaps':a3};}let K=null;try{const aC=await LocalMark['Instance']()['list']({'address':d});K=aC?.[0x0]?.['name']??null;}catch{K=null;}return{'action':'service_quote','network':String(b),'service':{'address':d,'name':K},'payment_token':{'coin_type':k,'display_note':k?'Prices\x20and\x20the\x20order\x20total\x20are\x20denominated\x20in\x20this\x20token\x27s\x20smallest\x20units;\x20displays\x20convert\x20with\x20the\x20token\x27s\x20on-chain\x20precision.':'Payment\x20token\x20could\x20not\x20be\x20parsed\x20from\x20the\x20Service\x20type\x20—\x20raw\x20smallest\x20units\x20only,\x20precision\x20NOT\x20guessed.'},'items':q,'total_pay':{'balance':u['toString'](),'display':D,'note':u===0x0n?'DEAD\x20BASKET\x20(F-BS-75):\x20this\x20quote\x20totals\x20ZERO\x20—\x20the\x20chain\x20REFUSES\x20zero-total\x20buys\x20(client\x20'+'order_new_zero_total_dead_order,\x20on-chain\x20abort\x2042),\x20so\x20this\x20basket\x20cannot\x20be\x20purchased\x20at\x20'+'all.\x20Either\x20the\x20basket\x20contains\x20a\x20zero-priced\x20SKU\x20(permanently\x20unbuyable\x20—\x20F-BS-76;\x20the\x20'+'merchant\x20must\x20reprice\x20it\x20to\x20>=\x201\x20smallest\x20unit)\x20or\x20a\x20coupon\x20zeroes\x20it\x20(lower\x20the\x20coupon\x20'+'value).\x20Do\x20NOT\x20attempt\x20the\x20buy.':w?.['applied']?'Discounted\x20total\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20this\x20exactly\x20(the\x20on-chain\x20buy\x20aborts\x20on\x20any\x20drift;\x20the\x20coupon\x20is\x20consumed\x20at\x20buy).':'order_new.buy.total_pay.balance\x20must\x20equal\x20this\x20exactly\x20when\x20passed\x20explicitly\x20—\x20the\x20on-chain\x20buy\x20aborts\x20on\x20any\x20drift.\x20WITHOUT\x20a\x20discount\x20you\x20may\x20also\x20omit\x20total_pay\x20entirely:\x20the\x20buy\x20auto-derives\x20this\x20exact\x20total\x20(M-K17).'},'discount':w,'allocation_preview':H,'compensation_fund_coverage':C,'reward_terms':J};}
|
|
1
|
+
import{Config,LocalMark,query_objects,query_serviceContext}from'@wowok/wowok';import{resolveAddress as a390a}from'../../tools/handlers/name-resolution.js';import{formatMoneyAnnotation}from'./facet-money.js';const balanceStr=a=>a===null||a===undefined?'0':typeof a==='bigint'?a['toString']():String(a);async function displayOf(a,b,c){try{return(await formatMoneyAnnotation(a,b,c))['display'];}catch{return a;}}function describeRecipient(a){if(typeof a==='string')return a;if(a&&typeof a==='object'){const b=a;if('GuardIdentifier'in b)return'submission\x20slot\x20'+String(b['GuardIdentifier']);if('Entity'in b){const c=b['Entity'],d=c&&typeof c==='object'?c['name_or_address']:c;return d===''?'Entity(\x22\x22)\x20—\x20MCP\x20default\x20local\x20account':'Entity:'+String(d);}return JSON['stringify'](a);}return'unknown';}export async function handleServiceQuote(a){const b=a['context_network']??undefined??await Config['Instance']()['network_get'](),d=await a390a(a['service_address'],'service_address'),f=await query_serviceContext({'service':d,'network':b}),h=f['service'];if(!h)throw new Error('Service\x20\x27'+a['service_address']+'\x27\x20not\x20found\x20on\x20network\x20'+b+'.');const i=h?.['type_raw']??h?.['type']??'',j=i['match'](/<(.+)>$/),k=j?j[0x1]:null,l=Array['isArray'](h['sales'])?h['sales']:[],m=new Map();for(const M of l){if(!M||typeof M['name']!=='string')continue;m['set'](M['name'],{'price':balanceStr(M['price']?.['balance']??M['price']??0x0),'suspended':M['suspension']===!![]});}const n=a['items']??[...m['keys']()]['map'](N=>({'name':N,'quantity':0x1})),p=n['filter'](N=>!m['has'](N['name']));if(p['length']>0x0)throw new Error('Sale(s)\x20not\x20found\x20on\x20this\x20Service:\x20'+p['map'](N=>'\x27'+N['name']+'\x27')['join'](',\x20')+'.\x20'+('Available\x20sales:\x20'+([...m['keys']()]['map'](N=>'\x27'+N+'\x27')['join'](',\x20')||'<none>')+'.'));if(n['length']===0x0)throw new Error('This\x20Service\x20has\x20NO\x20configured\x20sales\x20—\x20nothing\x20to\x20quote.');const q=[];let t=0x0n;for(const N of n){const O=m['get'](N['name']),P=BigInt(O['price']||'0'),Q=P*BigInt(N['quantity']);t+=Q,q['push']({'name':N['name'],'quantity':N['quantity'],'unit_price':O['price'],'unit_price_display':await displayOf(O['price'],k,b),'line_total':Q['toString'](),'suspended':O['suspended']});}let u=t,w=null;if(typeof a['discount']==='string'&&a['discount']['trim']()!==''){const R=await a390a(a['discount'],'discount');let S=null;try{const a3=await query_objects({'objects':[R],'network':b});S=a3?.['objects']?.[0x0]??null;}catch{S=null;}if(!S)throw new Error('E_DISCOUNT_NOT_FOUND:\x20coupon\x20\x27'+R+'\x27\x20not\x20found\x20—\x20it\x20was\x20already\x20burned\x20on\x20a\x20'+'previous\x20buy\x20(a\x20burned\x20coupon\x20is\x20destroyed\x20on\x20chain\x20and\x20cannot\x20be\x20quoted\x20again)\x20'+'or\x20the\x20address\x20is\x20wrong.\x20Re-quote\x20without\x20the\x20coupon.');const T=String(S['service']??'');if(T['toLowerCase']()!==d['toLowerCase']())throw new Error('E_SERVICE_DISCOUNT_NOT_MATCH:\x20coupon\x20\x27'+R+'\x27\x20is\x20bound\x20to\x20service\x20'+((T||'<unparseable>')+',\x20not\x20to\x20'+d+'.\x20A\x20buy\x20with\x20this\x20coupon\x20aborts.'));const U=a4=>{const a5=balanceStr(a4)['trim']();return/^\d+$/['test'](a5)?BigInt(a5):0x0n;},V=BigInt(Date['now']()),W=U(S['time_start']),X=U(S['time_end']);if(V<W||V>X)throw new Error('E_DISCOUNT_TIME_INVALID:\x20coupon\x20\x27'+R+'\x27\x20is\x20valid\x20'+(W+'–'+X+'\x20(ms\x20epoch),\x20now\x20is\x20'+V+'.\x20A\x20buy\x20with\x20this\x20coupon\x20aborts.'));const Y=Number(S['discount_type'])===0x0,Z=U(S['off']),a0=S['benchmark']===null||S['benchmark']===undefined?null:U(S['benchmark']),a1=a0===null?!![]:t>=a0;let a2=![];a1&&(a2=!![],u=Y?t-t*Z/0x2710n:t>Z?t-Z:0x0n),w={'coupon':R,'name':typeof S['name']==='string'?S['name']:null,'type':Y?'rates':'minus','off':Z['toString'](),'benchmark':a0===null?null:a0['toString'](),'benchmark_met':a1,'applied':a2,'list_total':t['toString'](),'final_total':u['toString'](),'final_total_display':await displayOf(u['toString'](),k,b),'note':a2?u===0x0n?'DEAD\x20BASKET\x20(F-BS-75):\x20the\x20coupon\x20covers\x20the\x20entire\x20basket,\x20but\x20the\x20chain\x20REFUSES\x20zero-total\x20'+'buys\x20—\x20the\x20client\x20gate\x20(order_new_zero_total_dead_order)\x20and\x20the\x20on-chain\x20zero-total\x20gate\x20'+'(abort\x2042)\x20both\x20reject\x20this\x20buy;\x20NOTHING\x20is\x20purchasable\x20at\x20total\x200,\x20free\x20product\x20or\x20not.\x20'+'Lower\x20the\x20coupon\x20value\x20so\x20the\x20final\x20total\x20stays\x20>=\x201\x20smallest\x20unit\x20(or\x20price\x20a\x20deliberate\x20'+'free\x20tier\x20at\x201\x20smallest\x20unit).\x20allow_zero_total\x20on\x20the\x20coupon\x20is\x20disclosure-only\x20and\x20does\x20'+'NOT\x20unlock\x20this\x20buy\x20(F-BS-74).':'Discounted\x20total\x20shown\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20final_total.\x20'+'BURN-ON-USE\x20(F-ETS-03):\x20attaching\x20this\x20coupon\x20to\x20a\x20buy\x20DESTROYS\x20it\x20on\x20chain\x20—\x20the\x20coupon\x20'+'object\x20is\x20gone\x20once\x20the\x20order\x20is\x20created\x20(a\x20later\x20quote\x20hits\x20E_DISCOUNT_NOT_FOUND).\x20'+'CANCELLATION\x20REFUNDS\x20THE\x20DISCOUNTED\x20AMOUNT\x20ONLY:\x20refund\x20rails\x20pay\x20the\x20order\x27s\x20escrowed\x20'+'amount\x20(this\x20final_total),\x20so\x20a\x20cancelled\x20order\x20does\x20NOT\x20restore\x20the\x20coupon\x27s\x20face\x20value\x20—\x20'+'the\x20difference\x20is\x20forfeited\x20even\x20on\x20a\x20no-fault\x20cancel.\x20Disclose\x20this\x20to\x20the\x20buyer\x20before\x20checkout.':'⚠\x20Benchmark\x20NOT\x20met\x20(list\x20total\x20'+t+'\x20<\x20'+a0+'):\x20the\x20chain\x20REJECTS\x20this\x20buy\x20when\x20the\x20coupon\x20is\x20attached\x20(error\x2038\x20—\x20full\x20rollback,\x20nothing\x20paid,\x20coupon\x20preserved).\x20Raise\x20the\x20basket\x20to\x20>=\x20'+a0+',\x20or\x20order\x20without\x20the\x20coupon\x20and\x20keep\x20it.'};}const x=balanceStr(h['compensation_fund']??0x0),y=/^\d+$/['test'](x['trim']())?BigInt(x['trim']()):0x0n,z=0x3n*u,A=z>y?z-y:0x0n,B=y/0x3n,C=await displayOf(B['toString'](),k,b),D={'fund_balance':y['toString'](),'fund_balance_display':await displayOf(y['toString'](),k,b),'max_coverable_order':B['toString'](),'max_coverable_order_display':C,'required_for_this_basket':z['toString'](),'required_display':await displayOf(z['toString'](),k,b),'shortfall':A['toString'](),'shortfall_display':await displayOf(A['toString'](),k,b),'covered':y>=z,'note':y===0x0n?'This\x20Service\x20runs\x20WITHOUT\x20a\x20compensation\x20fund\x20—\x20a\x20legitimate\x20merchant\x20choice,\x20never\x20blocked\x20at\x20buy.\x20An\x20arbitration\x20award\x20beyond\x20the\x20pool\x20aborts\x20the\x20buyer\x27s\x20payout\x20(code\x2027,\x20claim\x20NOT\x20consumed)\x20and\x20waits\x20on\x20the\x20merchant\x20wallet.':y>=z?'The\x20fund\x20covers\x203x\x20this\x20basket\x27s\x20amount\x20—\x20a\x20single\x20ruling\x20at\x20the\x20maximum\x20award\x20multiple\x20is\x20payable\x20from\x20the\x20pool.\x20Storefront\x20ceiling:\x20no\x20order\x20above\x20'+C+'\x20(fund/3)\x20can\x20be\x20created\x20—\x20quote\x20a\x20bigger\x20basket\x20against\x20the\x20ceiling,\x20not\x20just\x20this\x20one.':'BELOW\x20the\x20per-order\x20payout\x20requirement:\x20order\x20creation\x20will\x20be\x20BLOCKED\x20(compensation_fund_below_order_ceiling\x20—\x20no\x20money\x20moves)\x20until\x20the\x20merchant\x20tops\x20up\x20via\x20service.compensation_fund_add\x20by\x20'+await displayOf(A['toString'](),k,b)+'\x20(to\x20>=\x203x\x20this\x20basket).\x20Standing\x20ceiling:\x20orders\x20above\x20'+C+'\x20(fund/3)\x20are\x20refused\x20at\x20buy,\x20so\x20this\x20basket\x20is\x20only\x20the\x20latest\x20casualty\x20—\x20every\x20bigger\x20SKU\x20is\x20unbuyable\x20too.'},E=await displayOf(u['toString'](),k,b),F=h['order_allocators'],G=Array['isArray'](F?.['allocators'])?F['allocators']:[],H=G['length']>0x0?G[0x0]:undefined,I=H?{'allocator_index':0x0,'note':'Sharing\x20rows\x20of\x20the\x20FIRST\x20order_allocator\x20(index\x200\x20—\x20NOT\x20necessarily\x20the\x20normal\x20'+'payout\x20path:\x20services\x20that\x20ship\x20refund-first\x20rails\x20put\x20the\x20refund\x20track\x20at\x20index\x200,\x20'+'klk15\x20C-06).\x20Guards\x20select\x20per-case\x20allocators\x20(refund\x20/\x20damage\x20/\x20late-cancel),\x20so\x20'+'the\x20LIVE\x20split\x20depends\x20on\x20which\x20guard\x20passes\x20—\x20identify\x20the\x20settlement\x20allocator\x20'+'via\x20service_panorama\x20before\x20ordering.','sharing':(Array['isArray'](H['sharing'])?H['sharing']:[])['map'](a4=>({'recipient':describeRecipient(a4?.['who']),'mode':typeof a4?.['mode']==='string'?a4['mode']:null,'value':balanceStr(a4?.['sharing']?.['balance']??a4?.['sharing']??0x0)}))}:null,J=Array['isArray'](h['rewards'])?h['rewards']['filter'](a4=>typeof a4==='string'&&a4!==''):[];let K=null;if(J['length']>0x0){const a4=[],a5=[];let a6=[];try{const a7=await query_objects({'objects':J,'network':b});a6=Array['isArray'](a7?.['objects'])?a7['objects']:[];}catch(a8){a4['push']('Reward\x20lookup\x20failed\x20('+(a8 instanceof Error?a8['message']:String(a8))+')\x20—\x20reward\x20terms\x20NOT\x20verified;\x20do\x20not\x20rely\x20on\x20them.');}for(const a9 of J){const aa=a6['find'](an=>typeof an?.['object']==='string'&&an['object']['toLowerCase']()===a9['toLowerCase']());if(!aa){a4['push']('Reward\x20\x27'+a9+'\x27\x20could\x20not\x20be\x20read\x20—\x20its\x20terms\x20are\x20unknown;\x20do\x20not\x20rely\x20on\x20it.');continue;}const ab=balanceStr(aa['balance']??0x0),ac=/^\d+$/['test'](ab)?BigInt(ab):0x0n,ad=[];let ae=0x0n,af=![];for(const an of Array['isArray'](aa['guards'])?aa['guards']:[]){const ao=an?.['amount'],ap=ao!=null&&(ao['type']===0x1||ao['type']==='Fixed'),aq=an?.['expiration_time'],ar=aq==null?null:Number(aq),as=ar!=null&&Number['isFinite'](ar)?ar:null;if(ap){const at=balanceStr(ao['value']??0x0),au=/^\d+$/['test'](at)?BigInt(at):0x0n;if(au>ae)ae=au;ad['push']({'guard':String(an?.['guard']??''),'amount_type':'fixed','amount':at,'amount_display':await displayOf(at,k,b),'expiration_time':as,'expiration_display':as!=null?new Date(as)['toISOString']():null,'expired':as!=null?Date['now']()>as:null,'min_rating':null});}else af=!![],ad['push']({'guard':String(an?.['guard']??''),'amount_type':'guard_submission','amount':'submission\x20identifier\x20'+String(ao?.['value']??'?'),'amount_display':null,'expiration_time':as,'expiration_display':as!=null?new Date(as)['toISOString']():null,'expired':as!=null?Date['now']()>as:null,'min_rating':null});}const ag=Array['from'](new Set(ad['map'](av=>av['guard'])['filter'](av=>av!==''))),ah=new Map();if(ag['length']>0x0)try{const av=await query_objects({'objects':ag,'network':b});for(const aw of Array['isArray'](av?.['objects'])?av['objects']:[]){if(typeof aw?.['object']==='string')ah['set'](aw['object']['toLowerCase'](),aw);}}catch{a4['push']('Claim\x20guard\x20lookup\x20failed\x20—\x20rating\x20conditions\x20on\x20'+ag['length']+'\x20claim\x20guard(s)\x20NOT\x20verified;\x20do\x20not\x20promise\x20the\x20incentive.');}const ai=(ax,ay=0x0)=>{if(!ax||typeof ax!=='object'||ay>0x4)return null;if(ax['root']&&Array['isArray'](ax['table']))return ax;for(const az of Object['values'](ax)){if(az&&typeof az==='object'){const aA=ai(az,ay+0x1);if(aA)return aA;}}return null;},aj=(ax,ay)=>{const az=ax['table']['find'](aB=>aB?.['identifier']===ay&&aB?.['b_submission']===![]);if(!az)return null;const aA=typeof az['value']==='number'?az['value']:Number(String(az['value']??''));return Number['isFinite'](aA)?aA:null;},ak=(ax,ay,az=0x0)=>{if(!ax||typeof ax!=='object'||az>0x18)return null;const aA=typeof ax['type']==='string'?ax['type']:'';if(aA==='logic_as_u256_greater_or_equal'||aA==='logic_as_u256_greater'||aA==='logic_as_u256_equal'){const aB=Array['isArray'](ax['nodes'])?ax['nodes']:[],aC=aB[0x0];if(aB['length']>=0x2&&JSON['stringify'](aC??{})['includes']('repository.data')){const aD=aB[aB['length']-0x1],aE=aD?.['type']==='identifier'?aj(ay,Number(aD['identifier'])):typeof aD?.['value']==='number'?aD['value']:null;if(aE!=null){const aF=aA==='logic_as_u256_greater_or_equal'?'>=':aA==='logic_as_u256_greater'?'>':'==';return aF+'\x20'+aE;}}}for(const aG of Object['values'](ax)){if(Array['isArray'](aG))for(const aH of aG){const aI=ak(aH,ay,az+0x1);if(aI)return aI;}else{if(aG&&typeof aG==='object'){const aJ=ak(aG,ay,az+0x1);if(aJ)return aJ;}}}return null;};for(const ax of ad){ax['min_rating']=null;const ay=ah['get'](ax['guard']['toLowerCase']());if(!ay)continue;let az;try{az=JSON['stringify'](ay,(aD,aE)=>aE instanceof Uint8Array?Buffer['from'](aE)['toString']('base64'):aE);}catch{continue;}const aA=az['includes']('\x22rating\x22')||az['includes']('114,97,116,105,110,103')||az['toLowerCase']()['includes']('726174696e67')||az['includes']('cmF0aW5n');if(!aA)continue;const aB=ai(ay),aC=aB?ak(aB['root'],aB):null;if(aC)ax['min_rating']=aC;else{const aD=az['toLowerCase']();if(aD['includes']('\x22like\x22'))ax['min_rating']='like';else{if(aD['includes']('\x22dislike\x22'))ax['min_rating']='dislike';else ax['min_rating']='unknown';}}}const al=ac===0x0n?'Pool\x20is\x20EMPTY\x20—\x20any\x20claim\x20aborts\x20on-chain\x20on\x20the\x20reward\x20module\x27s\x20E_INSUFFICIENT_BALANCE\x20(not\x20the\x20allocation\x20module\x27s\x20same-named\x20constant);\x20do\x20not\x20budget\x20on\x20this\x20reward.':af||ae===0x0n?null:'Pool\x20covers\x20~'+(ac/ae)['toString']()+'\x20further\x20claim(s)\x20at\x20the\x20largest\x20configured\x20per-claim\x20amount.',am=ad['filter'](aE=>aE['min_rating']==='unknown')['length'];am>0x0&&a4['push'](am+'\x20claim(s)\x20gate\x20on\x20a\x20rating\x20condition\x20whose\x20polarity\x20could\x20not\x20be\x20parsed\x20'+'(min_rating=unknown)\x20—\x20read\x20the\x20claim\x20guard\x20before\x20promising\x20this\x20incentive\x20to\x20the\x20buyer'),a5['push']({'reward':a9,'description':typeof aa['description']==='string'?aa['description']:null,'pool_balance':ac['toString'](),'pool_balance_display':await displayOf(ac['toString'](),k,b),'record_count':Number['isFinite'](Number(aa['record_count']))?Number(aa['record_count']):0x0,'claims':ad,'coverage':al});}K={'note':'Pre-order\x20reward\x20terms\x20for\x20every\x20Reward\x20hung\x20on\x20this\x20Service\x20(bound\x20at\x20build\x20time):\x20pool\x20balance,\x20'+'per-claim\x20amount\x20and\x20claim\x20windows.\x20A\x20claim\x20aborts\x20after\x20its\x20window\x20(E_GUARD_EXPIRED)\x20or\x20'+'against\x20an\x20empty\x20pool\x20(E_INSUFFICIENT_BALANCE)\x20—\x20never\x20budget\x20on\x20an\x20expired\x20or\x20empty\x20'+'reward.\x20Claiming\x20requires\x20passing\x20the\x20claim\x20guard\x27s\x20conditions.','rewards':a5,'data_gaps':a4};}let L=null;try{const aE=await LocalMark['Instance']()['list']({'address':d});L=aE?.[0x0]?.['name']??null;}catch{L=null;}return{'action':'service_quote','network':String(b),'service':{'address':d,'name':L},'payment_token':{'coin_type':k,'display_note':k?'Prices\x20and\x20the\x20order\x20total\x20are\x20denominated\x20in\x20this\x20token\x27s\x20smallest\x20units;\x20displays\x20convert\x20with\x20the\x20token\x27s\x20on-chain\x20precision.':'Payment\x20token\x20could\x20not\x20be\x20parsed\x20from\x20the\x20Service\x20type\x20—\x20raw\x20smallest\x20units\x20only,\x20precision\x20NOT\x20guessed.'},'items':q,'total_pay':{'balance':u['toString'](),'display':E,'note':u===0x0n?'DEAD\x20BASKET\x20(F-BS-75):\x20this\x20quote\x20totals\x20ZERO\x20—\x20the\x20chain\x20REFUSES\x20zero-total\x20buys\x20(client\x20'+'order_new_zero_total_dead_order,\x20on-chain\x20abort\x2042),\x20so\x20this\x20basket\x20cannot\x20be\x20purchased\x20at\x20'+'all.\x20Either\x20the\x20basket\x20contains\x20a\x20zero-priced\x20SKU\x20(permanently\x20unbuyable\x20—\x20F-BS-76;\x20the\x20'+'merchant\x20must\x20reprice\x20it\x20to\x20>=\x201\x20smallest\x20unit)\x20or\x20a\x20coupon\x20zeroes\x20it\x20(lower\x20the\x20coupon\x20'+'value).\x20Do\x20NOT\x20attempt\x20the\x20buy.':w?.['applied']?'Discounted\x20total\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20this\x20exactly\x20(the\x20on-chain\x20buy\x20aborts\x20on\x20any\x20drift;\x20the\x20coupon\x20is\x20consumed\x20at\x20buy).':'order_new.buy.total_pay.balance\x20must\x20equal\x20this\x20exactly\x20when\x20passed\x20explicitly\x20—\x20the\x20on-chain\x20buy\x20aborts\x20on\x20any\x20drift.\x20WITHOUT\x20a\x20discount\x20you\x20may\x20also\x20omit\x20total_pay\x20entirely:\x20the\x20buy\x20auto-derives\x20this\x20exact\x20total\x20(M-K17).'},'discount':w,'allocation_preview':I,'compensation_fund_coverage':D,'reward_terms':K};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,it,expect,vi,beforeEach}from'vitest';const {sdkMocks}=vi['hoisted'](()=>({'sdkMocks':{'network_get':vi['fn'](),'localMarkList':vi['fn'](),'query_objects':vi['fn'](),'query_serviceContext':vi['fn'](),'resolveAddress':vi['fn']()}}));vi['mock']('@wowok/wowok',async a=>{const b=await a();return{...b,'Config':{'Instance':()=>({'network_get':sdkMocks['network_get']})},'LocalMark':{'Instance':()=>({'list':sdkMocks['localMarkList']})},'query_objects':sdkMocks['query_objects'],'query_serviceContext':sdkMocks['query_serviceContext']};}),vi['mock']('../../tools/handlers/name-resolution.js',()=>({'resolveAddress':sdkMocks['resolveAddress']})),vi['mock']('./facet-money.js',()=>({'formatMoneyAnnotation':async a=>({'display':a})}));import{handleServiceQuote}from'./service-quote.js';const SVC='0x'+'1'['repeat'](0x40),COUPON='0x'+'2'['repeat'](0x40),OTHER_SVC='0x'+'3'['repeat'](0x40),FLEXIBLE='Flexible\x20—\x20canal\x20view\x20double',LIST_TOTAL=0x35a4e900n;function makeCoupon(a={}){const b=Date['now']();return{'object':COUPON,'name':'bk3t-promo15','discount_type':0x0,'off':0x5dc,'benchmark':null,'time_start':b-0x5265c00,'time_end':b+0x5265c00,'service':SVC,'transferable':![],...a};}function quoteInput(a={}){return{'query_type':'service_quote','service_address':'bk3t-canal-stay','items':[{'name':FLEXIBLE,'quantity':0x1}],'context_network':'mainnet',...a};}beforeEach(()=>{vi['clearAllMocks'](),sdkMocks['network_get']['mockResolvedValue']('mainnet'),sdkMocks['localMarkList']['mockResolvedValue']([{'name':'bk3t-canal-stay'}]),sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}]}}),sdkMocks['resolveAddress']['mockImplementation'](async a=>{if(a==='bk3t-canal-stay')return SVC;if(a==='bk3t-promo15'||a===COUPON)return COUPON;throw new Error('unresolvable:\x20'+a);}),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon()]});}),describe('service_quote\x20discount\x20pricing\x20(F-10)',()=>{it('no\x20discount\x20requested\x20→\x20undiscounted\x20total,\x20discount\x20block\x20null\x20(pre-fix\x20behavior\x20preserved)',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['discount'])['toBeNull'](),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('RATES\x20coupon\x20applies\x20with\x20integer\x20floor\x20division\x20—\x20reproduces\x20the\x20live\x20order\x20C\x20number',async()=>{const a=await handleServiceQuote(quoteInput({'discount':'bk3t-promo15'}));expect(a['discount'])['not']['toBeNull'](),expect(a['discount']['type'])['toBe']('rates'),expect(a['discount']['applied'])['toBe'](!![]),expect(a['discount']['list_total'])['toBe']('900000000'),expect(a['discount']['final_total'])['toBe']('765000000'),expect(a['total_pay']['balance'])['toBe']('765000000'),expect(a['total_pay']['note'])['toContain']('Discounted\x20total');}),it('MINUS\x20coupon\x20subtracts\x20a\x20fixed\x20amount\x20and\x20clamps\x20at\x20zero',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x5f5e100})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['type'])['toBe']('minus'),expect(a['discount']['final_total'])['toBe']('800000000'),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x77359400})]});const b=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(b['discount']['final_total'])['toBe']('0'),expect(b['discount']['note'])['toContain']('DEAD\x20BASKET'),expect(b['discount']['note'])['toContain']('REFUSES\x20zero-total'),expect(b['discount']['note'])['toContain']('allow_zero_total'),expect(b['discount']['note'])['toContain']('NOT\x20unlock\x20this\x20buy'),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x5f5e100})]});const c=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(c['discount']['note'])['toBe']('Discounted\x20total\x20shown\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20final_total.');}),it('unmet\x20benchmark\x20→\x20applied:false\x20+\x20attach\x20warning,\x20total\x20stays\x20at\x20list\x20price\x20(NOT\x20thrown)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'benchmark':(LIST_TOTAL+0x1n)['toString']()})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['applied'])['toBe'](![]),expect(a['discount']['benchmark_met'])['toBe'](![]),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']()),expect(a['discount']['note'])['toContain']('REJECTS'),expect(a['discount']['note'])['toContain']('coupon\x20preserved');}),it('benchmark\x20exactly\x20met\x20→\x20applies\x20(chain\x20uses\x20>=)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'benchmark':LIST_TOTAL['toString']()})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['applied'])['toBe'](!![]),expect(a['discount']['final_total'])['toBe']('765000000');}),it('benchmark\x20None\x20always\x20applies\x20(corrected\x20old\x20docs\x20claim)',async()=>{const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['benchmark'])['toBeNull'](),expect(a['discount']['applied'])['toBe'](!![]);}),it('coupon\x20bound\x20to\x20another\x20service\x20→\x20rejected\x20like\x20the\x20chain\x20abort\x20(E_SERVICE_DISCOUNT_NOT_MATCH)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'service':OTHER_SVC})]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/E_SERVICE_DISCOUNT_NOT_MATCH/);}),it('coupon\x20outside\x20its\x20time\x20window\x20→\x20rejected\x20like\x20the\x20chain\x20abort\x20(E_DISCOUNT_TIME_INVALID)',async()=>{const a=Date['now']();sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'time_start':a+0x3e8,'time_end':a+0x186a0})]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/E_DISCOUNT_TIME_INVALID/);}),it('unknown\x20coupon\x20object\x20→\x20clear\x20rejection,\x20never\x20a\x20silent\x20full-price\x20quote',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/not found/);});});const REWARD='0x'+'4'['repeat'](0x40),CLAIM_GUARD='0x'+'5'['repeat'](0x40);function makeReward(a={}){return{'object':REWARD,'description':'5-star\x20review\x20reward','balance':'500000000','record_count':0x3,'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'},'expiration_time':Date['now']()+0x5265c00}],...a};}function svcWithRewards(...a){sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}],'rewards':a}});}describe('service_quote\x20reward\x20terms\x20(review\x20component\x20b2-5)',()=>{it('no\x20rewards\x20on\x20the\x20Service\x20→\x20reward_terms\x20null',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['toBeNull']();}),it('fixed\x20amount\x20+\x20live\x20window\x20→\x20terms\x20with\x20coverage\x20estimate,\x20expired:false,\x20no\x20gaps',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward()]});const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['not']['toBeNull']();const b=a['reward_terms']['rewards'][0x0];expect(b['reward'])['toBe'](REWARD),expect(b['description'])['toBe']('5-star\x20review\x20reward'),expect(b['pool_balance'])['toBe']('500000000'),expect(b['record_count'])['toBe'](0x3),expect(b['claims'][0x0]['guard'])['toBe'](CLAIM_GUARD),expect(b['claims'][0x0]['amount_type'])['toBe']('fixed'),expect(b['claims'][0x0]['amount'])['toBe']('100000000'),expect(b['claims'][0x0]['expired'])['toBe'](![]),expect(b['coverage'])['toMatch'](/~5 further claim/),expect(a['reward_terms']['data_gaps'])['toEqual']([]),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('empty\x20pool\x20→\x20EMPTY\x20coverage\x20warning;\x20expired\x20window\x20→\x20expired:true',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'balance':'0','guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'},'expiration_time':Date['now']()-0x3e8}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0];expect(b['claims'][0x0]['expired'])['toBe'](!![]),expect(b['coverage'])['toContain']('EMPTY'),expect(b['coverage'])['toContain']('E_INSUFFICIENT_BALANCE');}),it('guard_submission\x20amount\x20→\x20coverage\x20null\x20(guard-decided),\x20amount\x20carries\x20the\x20submission\x20identifier',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x0,'value':0x7}}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0];expect(b['claims'][0x0]['amount_type'])['toBe']('guard_submission'),expect(b['claims'][0x0]['amount'])['toContain']('7'),expect(b['claims'][0x0]['amount_display'])['toBeNull'](),expect(b['coverage'])['toBeNull']();}),it('no\x20window\x20set\x20→\x20expiration\x20null\x20and\x20expired\x20null\x20(claimable\x20until\x20guard\x20removal)',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'}}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0]['claims'][0x0];expect(b['expiration_time'])['toBeNull'](),expect(b['expiration_display'])['toBeNull'](),expect(b['expired'])['toBeNull']();}),it('unreadable\x20reward\x20object\x20→\x20data_gaps\x20note,\x20quote\x20still\x20succeeds\x20(fail-soft)',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[]});const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['not']['toBeNull'](),expect(a['reward_terms']['rewards'])['toEqual']([]),expect(a['reward_terms']['data_gaps'][0x0])['toContain'](REWARD),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('reward\x20lookup\x20throws\x20→\x20whole\x20lookup\x20degrades\x20to\x20one\x20gap\x20note,\x20never\x20thrown',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockRejectedValue'](new Error('rpc\x20down'));const a=await handleServiceQuote(quoteInput());expect(a['reward_terms']['rewards'])['toEqual']([]),expect(a['reward_terms']['data_gaps'][0x0])['toContain']('rpc\x20down'),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());});});function svcWithFund(a){sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}],'compensation_fund':a}});}describe('service_quote\x20compensation_fund_coverage\x20(b6-11)',()=>{it('no\x20fund\x20→\x20covered:false\x20with\x20the\x20no-protection\x20disclosure\x20(never\x20blocked)',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage'])['not']['toBeNull'](),expect(a['compensation_fund_coverage']['fund_balance'])['toBe']('0'),expect(a['compensation_fund_coverage']['required_for_this_basket'])['toBe']('2700000000'),expect(a['compensation_fund_coverage']['covered'])['toBe'](![]),expect(a['compensation_fund_coverage']['note'])['toContain']('WITHOUT\x20a\x20compensation\x20fund'),expect(a['compensation_fund_coverage']['note'])['toContain']('never\x20blocked');}),it('fund\x20at/over\x203x\x20the\x20basket\x20→\x20covered:true',async()=>{svcWithFund('2700000000');const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['covered'])['toBe'](!![]),expect(a['compensation_fund_coverage']['note'])['toContain']('payable\x20from\x20the\x20pool');}),it('fund\x20short\x20→\x20covered:false\x20and\x20the\x20note\x20names\x20the\x20buy-time\x20block\x20+\x20error\x20code',async()=>{svcWithFund('100000000');const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['covered'])['toBe'](![]),expect(a['compensation_fund_coverage']['note'])['toContain']('BLOCKED'),expect(a['compensation_fund_coverage']['note'])['toContain']('compensation_fund_below_order_ceiling'),expect(a['compensation_fund_coverage']['note'])['toContain']('compensation_fund_add');}),it('F-OF2-06:\x20max_coverable_order\x20names\x20the\x20storefront\x20price\x20cap\x20(fund/3)\x20in\x20every\x20fund\x20state',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['max_coverable_order'])['toBe']('0'),svcWithFund('2700000000');const b=await handleServiceQuote(quoteInput());expect(b['compensation_fund_coverage']['max_coverable_order'])['toBe']('900000000'),expect(b['compensation_fund_coverage']['note'])['toContain']('ceiling'),svcWithFund('1000000000');const c=await handleServiceQuote(quoteInput());expect(c['compensation_fund_coverage']['max_coverable_order'])['toBe']('333333333'),expect(c['compensation_fund_coverage']['note'])['toContain']('orders\x20above');}),it('required\x20base\x20is\x20the\x20DISCOUNTED\x20total\x20(what\x20the\x20order\x20actually\x20pays)',async()=>{svcWithFund('2295000000');const a=await handleServiceQuote(quoteInput({'discount':'bk3t-promo15'}));expect(a['total_pay']['balance'])['toBe']('765000000'),expect(a['compensation_fund_coverage']['required_for_this_basket'])['toBe']('2295000000'),expect(a['compensation_fund_coverage']['covered'])['toBe'](!![]);});});
|
|
1
|
+
import{describe,it,expect,vi,beforeEach}from'vitest';const {sdkMocks}=vi['hoisted'](()=>({'sdkMocks':{'network_get':vi['fn'](),'localMarkList':vi['fn'](),'query_objects':vi['fn'](),'query_serviceContext':vi['fn'](),'resolveAddress':vi['fn']()}}));vi['mock']('@wowok/wowok',async a=>{const b=await a();return{...b,'Config':{'Instance':()=>({'network_get':sdkMocks['network_get']})},'LocalMark':{'Instance':()=>({'list':sdkMocks['localMarkList']})},'query_objects':sdkMocks['query_objects'],'query_serviceContext':sdkMocks['query_serviceContext']};}),vi['mock']('../../tools/handlers/name-resolution.js',()=>({'resolveAddress':sdkMocks['resolveAddress']})),vi['mock']('./facet-money.js',()=>({'formatMoneyAnnotation':async a=>({'display':a})}));import{handleServiceQuote}from'./service-quote.js';const SVC='0x'+'1'['repeat'](0x40),COUPON='0x'+'2'['repeat'](0x40),OTHER_SVC='0x'+'3'['repeat'](0x40),FLEXIBLE='Flexible\x20—\x20canal\x20view\x20double',LIST_TOTAL=0x35a4e900n;function makeCoupon(a={}){const b=Date['now']();return{'object':COUPON,'name':'bk3t-promo15','discount_type':0x0,'off':0x5dc,'benchmark':null,'time_start':b-0x5265c00,'time_end':b+0x5265c00,'service':SVC,'transferable':![],...a};}function quoteInput(a={}){return{'query_type':'service_quote','service_address':'bk3t-canal-stay','items':[{'name':FLEXIBLE,'quantity':0x1}],'context_network':'mainnet',...a};}beforeEach(()=>{vi['clearAllMocks'](),sdkMocks['network_get']['mockResolvedValue']('mainnet'),sdkMocks['localMarkList']['mockResolvedValue']([{'name':'bk3t-canal-stay'}]),sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}]}}),sdkMocks['resolveAddress']['mockImplementation'](async a=>{if(a==='bk3t-canal-stay')return SVC;if(a==='bk3t-promo15'||a===COUPON)return COUPON;throw new Error('unresolvable:\x20'+a);}),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon()]});}),describe('service_quote\x20discount\x20pricing\x20(F-10)',()=>{it('no\x20discount\x20requested\x20→\x20undiscounted\x20total,\x20discount\x20block\x20null\x20(pre-fix\x20behavior\x20preserved)',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['discount'])['toBeNull'](),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('RATES\x20coupon\x20applies\x20with\x20integer\x20floor\x20division\x20—\x20reproduces\x20the\x20live\x20order\x20C\x20number',async()=>{const a=await handleServiceQuote(quoteInput({'discount':'bk3t-promo15'}));expect(a['discount'])['not']['toBeNull'](),expect(a['discount']['type'])['toBe']('rates'),expect(a['discount']['applied'])['toBe'](!![]),expect(a['discount']['list_total'])['toBe']('900000000'),expect(a['discount']['final_total'])['toBe']('765000000'),expect(a['total_pay']['balance'])['toBe']('765000000'),expect(a['total_pay']['note'])['toContain']('Discounted\x20total');}),it('MINUS\x20coupon\x20subtracts\x20a\x20fixed\x20amount\x20and\x20clamps\x20at\x20zero',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x5f5e100})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['type'])['toBe']('minus'),expect(a['discount']['final_total'])['toBe']('800000000'),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x77359400})]});const b=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(b['discount']['final_total'])['toBe']('0'),expect(b['discount']['note'])['toContain']('DEAD\x20BASKET'),expect(b['discount']['note'])['toContain']('REFUSES\x20zero-total'),expect(b['discount']['note'])['toContain']('allow_zero_total'),expect(b['discount']['note'])['toContain']('NOT\x20unlock\x20this\x20buy'),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'discount_type':0x1,'off':0x5f5e100})]});const c=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(c['discount']['note'])['toContain']('Discounted\x20total\x20shown\x20—\x20order_new.buy.total_pay.balance\x20must\x20equal\x20final_total.'),expect(c['discount']['note'])['toContain']('BURN-ON-USE'),expect(c['discount']['note'])['toContain']('CANCELLATION\x20REFUNDS\x20THE\x20DISCOUNTED\x20AMOUNT\x20ONLY');}),it('unmet\x20benchmark\x20→\x20applied:false\x20+\x20attach\x20warning,\x20total\x20stays\x20at\x20list\x20price\x20(NOT\x20thrown)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'benchmark':(LIST_TOTAL+0x1n)['toString']()})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['applied'])['toBe'](![]),expect(a['discount']['benchmark_met'])['toBe'](![]),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']()),expect(a['discount']['note'])['toContain']('REJECTS'),expect(a['discount']['note'])['toContain']('coupon\x20preserved');}),it('benchmark\x20exactly\x20met\x20→\x20applies\x20(chain\x20uses\x20>=)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'benchmark':LIST_TOTAL['toString']()})]});const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['applied'])['toBe'](!![]),expect(a['discount']['final_total'])['toBe']('765000000');}),it('benchmark\x20None\x20always\x20applies\x20(corrected\x20old\x20docs\x20claim)',async()=>{const a=await handleServiceQuote(quoteInput({'discount':COUPON}));expect(a['discount']['benchmark'])['toBeNull'](),expect(a['discount']['applied'])['toBe'](!![]);}),it('coupon\x20bound\x20to\x20another\x20service\x20→\x20rejected\x20like\x20the\x20chain\x20abort\x20(E_SERVICE_DISCOUNT_NOT_MATCH)',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'service':OTHER_SVC})]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/E_SERVICE_DISCOUNT_NOT_MATCH/);}),it('coupon\x20outside\x20its\x20time\x20window\x20→\x20rejected\x20like\x20the\x20chain\x20abort\x20(E_DISCOUNT_TIME_INVALID)',async()=>{const a=Date['now']();sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeCoupon({'time_start':a+0x3e8,'time_end':a+0x186a0})]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/E_DISCOUNT_TIME_INVALID/);}),it('unknown\x20coupon\x20object\x20→\x20clear\x20rejection,\x20never\x20a\x20silent\x20full-price\x20quote',async()=>{sdkMocks['query_objects']['mockResolvedValue']({'objects':[]}),await expect(handleServiceQuote(quoteInput({'discount':COUPON})))['rejects']['toThrow'](/not found/);});});const REWARD='0x'+'4'['repeat'](0x40),CLAIM_GUARD='0x'+'5'['repeat'](0x40);function makeReward(a={}){return{'object':REWARD,'description':'5-star\x20review\x20reward','balance':'500000000','record_count':0x3,'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'},'expiration_time':Date['now']()+0x5265c00}],...a};}function svcWithRewards(...a){sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}],'rewards':a}});}describe('service_quote\x20reward\x20terms\x20(review\x20component\x20b2-5)',()=>{it('no\x20rewards\x20on\x20the\x20Service\x20→\x20reward_terms\x20null',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['toBeNull']();}),it('fixed\x20amount\x20+\x20live\x20window\x20→\x20terms\x20with\x20coverage\x20estimate,\x20expired:false,\x20no\x20gaps',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward()]});const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['not']['toBeNull']();const b=a['reward_terms']['rewards'][0x0];expect(b['reward'])['toBe'](REWARD),expect(b['description'])['toBe']('5-star\x20review\x20reward'),expect(b['pool_balance'])['toBe']('500000000'),expect(b['record_count'])['toBe'](0x3),expect(b['claims'][0x0]['guard'])['toBe'](CLAIM_GUARD),expect(b['claims'][0x0]['amount_type'])['toBe']('fixed'),expect(b['claims'][0x0]['amount'])['toBe']('100000000'),expect(b['claims'][0x0]['expired'])['toBe'](![]),expect(b['coverage'])['toMatch'](/~5 further claim/),expect(a['reward_terms']['data_gaps'])['toEqual']([]),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('empty\x20pool\x20→\x20EMPTY\x20coverage\x20warning;\x20expired\x20window\x20→\x20expired:true',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'balance':'0','guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'},'expiration_time':Date['now']()-0x3e8}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0];expect(b['claims'][0x0]['expired'])['toBe'](!![]),expect(b['coverage'])['toContain']('EMPTY'),expect(b['coverage'])['toContain']('E_INSUFFICIENT_BALANCE');}),it('guard_submission\x20amount\x20→\x20coverage\x20null\x20(guard-decided),\x20amount\x20carries\x20the\x20submission\x20identifier',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x0,'value':0x7}}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0];expect(b['claims'][0x0]['amount_type'])['toBe']('guard_submission'),expect(b['claims'][0x0]['amount'])['toContain']('7'),expect(b['claims'][0x0]['amount_display'])['toBeNull'](),expect(b['coverage'])['toBeNull']();}),it('no\x20window\x20set\x20→\x20expiration\x20null\x20and\x20expired\x20null\x20(claimable\x20until\x20guard\x20removal)',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[makeReward({'guards':[{'guard':CLAIM_GUARD,'amount':{'type':0x1,'value':'100000000'}}]})]});const a=await handleServiceQuote(quoteInput()),b=a['reward_terms']['rewards'][0x0]['claims'][0x0];expect(b['expiration_time'])['toBeNull'](),expect(b['expiration_display'])['toBeNull'](),expect(b['expired'])['toBeNull']();}),it('unreadable\x20reward\x20object\x20→\x20data_gaps\x20note,\x20quote\x20still\x20succeeds\x20(fail-soft)',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockResolvedValue']({'objects':[]});const a=await handleServiceQuote(quoteInput());expect(a['reward_terms'])['not']['toBeNull'](),expect(a['reward_terms']['rewards'])['toEqual']([]),expect(a['reward_terms']['data_gaps'][0x0])['toContain'](REWARD),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());}),it('reward\x20lookup\x20throws\x20→\x20whole\x20lookup\x20degrades\x20to\x20one\x20gap\x20note,\x20never\x20thrown',async()=>{svcWithRewards(REWARD),sdkMocks['query_objects']['mockRejectedValue'](new Error('rpc\x20down'));const a=await handleServiceQuote(quoteInput());expect(a['reward_terms']['rewards'])['toEqual']([]),expect(a['reward_terms']['data_gaps'][0x0])['toContain']('rpc\x20down'),expect(a['total_pay']['balance'])['toBe'](LIST_TOTAL['toString']());});});function svcWithFund(a){sdkMocks['query_serviceContext']['mockResolvedValue']({'service':{'type_raw':'Service<0x2::wow::WOW>','sales':[{'name':FLEXIBLE,'price':{'balance':LIST_TOTAL['toString']()},'suspension':![]}],'compensation_fund':a}});}describe('service_quote\x20compensation_fund_coverage\x20(b6-11)',()=>{it('no\x20fund\x20→\x20covered:false\x20with\x20the\x20no-protection\x20disclosure\x20(never\x20blocked)',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage'])['not']['toBeNull'](),expect(a['compensation_fund_coverage']['fund_balance'])['toBe']('0'),expect(a['compensation_fund_coverage']['required_for_this_basket'])['toBe']('2700000000'),expect(a['compensation_fund_coverage']['covered'])['toBe'](![]),expect(a['compensation_fund_coverage']['note'])['toContain']('WITHOUT\x20a\x20compensation\x20fund'),expect(a['compensation_fund_coverage']['note'])['toContain']('never\x20blocked');}),it('fund\x20at/over\x203x\x20the\x20basket\x20→\x20covered:true',async()=>{svcWithFund('2700000000');const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['covered'])['toBe'](!![]),expect(a['compensation_fund_coverage']['note'])['toContain']('payable\x20from\x20the\x20pool');}),it('fund\x20short\x20→\x20covered:false\x20and\x20the\x20note\x20names\x20the\x20buy-time\x20block\x20+\x20error\x20code',async()=>{svcWithFund('100000000');const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['covered'])['toBe'](![]),expect(a['compensation_fund_coverage']['note'])['toContain']('BLOCKED'),expect(a['compensation_fund_coverage']['note'])['toContain']('compensation_fund_below_order_ceiling'),expect(a['compensation_fund_coverage']['note'])['toContain']('compensation_fund_add');}),it('shortfall\x20states\x20the\x20exact\x20top-up\x20(required\x20-\x20fund;\x20etsy-gf\x20R1:\x20no\x20reader\x20subtraction)',async()=>{svcWithFund('1000000000');const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['shortfall'])['toBe']('1700000000'),expect(a['compensation_fund_coverage']['note'])['toContain']('by'),svcWithFund('2700000000');const b=await handleServiceQuote(quoteInput());expect(b['compensation_fund_coverage']['shortfall'])['toBe']('0'),svcWithFund('0');const c=await handleServiceQuote(quoteInput());expect(c['compensation_fund_coverage']['shortfall'])['toBe']('2700000000');}),it('F-OF2-06:\x20max_coverable_order\x20names\x20the\x20storefront\x20price\x20cap\x20(fund/3)\x20in\x20every\x20fund\x20state',async()=>{const a=await handleServiceQuote(quoteInput());expect(a['compensation_fund_coverage']['max_coverable_order'])['toBe']('0'),svcWithFund('2700000000');const b=await handleServiceQuote(quoteInput());expect(b['compensation_fund_coverage']['max_coverable_order'])['toBe']('900000000'),expect(b['compensation_fund_coverage']['note'])['toContain']('ceiling'),svcWithFund('1000000000');const c=await handleServiceQuote(quoteInput());expect(c['compensation_fund_coverage']['max_coverable_order'])['toBe']('333333333'),expect(c['compensation_fund_coverage']['note'])['toContain']('orders\x20above');}),it('required\x20base\x20is\x20the\x20DISCOUNTED\x20total\x20(what\x20the\x20order\x20actually\x20pays)',async()=>{svcWithFund('2295000000');const a=await handleServiceQuote(quoteInput({'discount':'bk3t-promo15'}));expect(a['total_pay']['balance'])['toBe']('765000000'),expect(a['compensation_fund_coverage']['required_for_this_basket'])['toBe']('2295000000'),expect(a['compensation_fund_coverage']['covered'])['toBe'](!![]);});});
|
package/dist/review/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as
|
|
1
|
+
import{objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{resolveAddress as a403a}from'../tools/handlers/name-resolution.js';import{handleObjectPanorama}from'../playbooks/service-build/object-panorama.js';import{handleServicePanorama}from'../playbooks/service-build/service-panorama.js';import{handleMachinePanorama}from'../playbooks/service-build/machine-panorama.js';import{assembleOrderReview}from'./order.js';import{assembleServiceReview}from'./service.js';import{assembleMachineReview}from'./machine.js';import{assembleArbReview}from'./arb.js';import{assembleDemandReview}from'./demand.js';import{assembleRepositoryReview}from'./repository.js';import{assembleProgressReview}from'./progress.js';export const REVIEW_PACK_TYPES=['Order','Service','Arb','Demand','Repository','Progress','Machine'];export async function handleReviewPack(a){const b=a['object_address'];if(!b)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20review_pack');const c=await a403a(b,'object_address'),d=objectTypeFromAddress(c);if(d===ObjectType['Order']){const g=await handleObjectPanorama(a);if(g['object_type']!=='Order')throw new Error('review_pack:\x20expected\x20an\x20Order,\x20resolved\x20to\x20'+g['object_type']);return assembleOrderReview(g);}if(d===ObjectType['Service']){const h=await handleServicePanorama({...a,'service_address':c});return assembleServiceReview(h);}if(d===ObjectType['Machine']){const i=await handleMachinePanorama({...a,'object_address':c});if(i['machineAddress']?.['toLowerCase']()!==c['toLowerCase']())throw new Error('review_pack:\x20expected\x20a\x20Machine,\x20resolved\x20to\x20'+i['machineAddress']);return assembleMachineReview(i);}const e={[ObjectType['Arb']]:assembleArbReview,[ObjectType['Demand']]:assembleDemandReview,[ObjectType['Repository']]:assembleRepositoryReview,[ObjectType['Progress']]:assembleProgressReview},f=d?e[d]:undefined;if(f){const j=await handleObjectPanorama(a);if(j['object_type']!==d)throw new Error('review_pack:\x20expected\x20a\x20'+d+',\x20resolved\x20to\x20'+j['object_type']);return f(j);}throw new Error('review_pack:\x20unsupported\x20object\x20type\x20\x27'+(d??'unknown')+'\x27\x20—\x20supported:\x20'+REVIEW_PACK_TYPES['join'](',\x20')+'.\x20Other\x20types\x20keep\x20object_panorama\x20/\x20machine_panorama\x20/\x20service_panorama.');}
|
package/dist/role/profiles.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const ROLE_MOVE_MECHANISMS=['Service','Machine','Guard','Allocator','Progress','Order','Arbitration','Demand','DemandPresenter','Reward','Treasury','Passport','WTS','WIP','CompensationFund','Repository'];export const ROLE_PERSONALITIES={'merchant':{'role':'merchant','archetype':'The\x20Trust-First\x20Shopkeeper\x20—\x20wins\x20repeat\x20volume\x20by\x20making\x20trust\x20verifiable\x20on-chain','motivations':['durable\x20gross\x20margin\x20above\x20hard\x20cost/fund\x20floors','repeat\x20order\x20volume\x20and\x20referral-driven\x20acquisition','a\x20differentiated\x20trust\x20moat\x20(arbitration\x20+\x20compensation\x20fund\x20+\x20WIP\x20evidence)','low\x20dispute\x20and\x20compensation-payout\x20rates'],'communication':'proactive\x20and\x20specific:\x20quote\x20prices\x20with\x20escrow/split\x20terms,\x20state\x20guard\x20evidence\x20up\x20front,\x20answer\x20fast\x20on\x20pre-sales\x20questions,\x20never\x20vague-promise','value_levers':[{'move':'Publish\x20services\x20with\x20a\x20WIP-verified\x20product,\x20bound\x20Arbitration\x20and\x20a\x20funded\x20CompensationFund\x20so\x20trust\x20is\x20inspectable\x20before\x20purchase','via':'onchain_operations','when':'new\x20service\x20or\x20trust\x20score\x20below\x20category\x20median'},{'move':'Design\x20the\x20Machine\x20around\x20verifiable\x20business\x20states\x20and\x20attach\x20buy/evidence\x20Guards\x20instead\x20of\x20relying\x20on\x20chat\x20assurances','via':'machineNode2file'},{'move':'Encode\x20pricing\x20and\x20delivery\x20money\x20flow\x20explicitly\x20with\x20Allocator\x20splits/milestones,\x20never\x20informal\x20off-chain\x20promises','via':'onchain_operations'},{'move':'Run\x20Reward-based\x20acquisition\x20and\x20targeted\x20discounts\x20only\x20against\x20tracked\x20funnel\x20metrics,\x20not\x20blanket\x20price\x20cuts','via':'onchain_operations','when':'posture\x20is\x20volume\x20or\x20a\x20campaign\x20window\x20is\x20open'},{'move':'Scan\x20competitor\x20supply\x20(price,\x20trust,\x20rewards,\x20fund\x20coverage)\x20before\x20changing\x20price\x20or\x20offering','via':'evaluation_operation'},{'move':'Adopt\x20and\x20tune\x20the\x20industry\x20playbook\x20(mode/flywheel/risk\x20constraints)\x20for\x20the\x20shop\x27s\x20industry','via':'industry_pack_operation'}],'game_moves':[{'move':'Lead\x20negotiation\x20with\x20verifiable\x20trust\x20assets\x20(arb\x20rulings,\x20WIP,\x20fund\x20balance);\x20compete\x20on\x20proof\x20before\x20price','via':'evaluation_operation'},{'move':'Concede\x20small\x20discounts\x20late\x20in\x20negotiation\x20in\x20exchange\x20for\x20review/referral\x20commitments,\x20never\x20before\x20intent\x20is\x20proven','via':'Reward'},{'move':'Advance\x20orders\x20only\x20against\x20the\x20guard\x20evidence\x20the\x20machine\x20requires;\x20keep\x20the\x20workflow\x20moving\x20to\x20avoid\x20stall\x20blame','via':'workflow_operation'},{'move':'Settle\x20a\x20genuine\x20fault\x20fast\x20via\x20the\x20machine/allocator\x20refund\x20path\x20rather\x20than\x20escalating;\x20reserve\x20arbitration\x20for\x20disputed\x20fault','via':'Arbitration'},{'move':'Never\x20price\x20below\x20hard\x20cost\x20floor\x20or\x20leave\x20the\x20compensation\x20fund\x20under-covered\x20to\x20chase\x20volume','taboo':!![]},{'move':'Keep\x20the\x20fund\x20at\x20or\x20above\x203x\x20your\x20TYPICAL\x20single\x20order\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(an\x20order\x20the\x20fund\x20cannot\x20cover\x203x\x20of\x20is\x20refused\x20at\x20creation),\x20and\x20a\x20ruling\x20above\x20the\x20fund\x20still\x20aborts\x2027\x20leaving\x20the\x20buyer\x20a\x20win\x20they\x20cannot\x20convert','taboo':!![]},{'move':'Never\x20drop\x20a\x20venue\x20from\x20the\x20arbitration\x20allowlist\x20while\x20an\x20award\x20it\x20already\x20ruled\x20on\x20is\x20still\x20awaiting\x20payout\x20—\x20the\x20claim\x20then\x20aborts\x2039\x20and\x20the\x20buyer\x27s\x20money\x20is\x20stranded','taboo':!![]},{'move':'Never\x20promise\x20refunds\x20or\x20delivery\x20terms\x20outside\x20the\x20bound\x20Machine/Allocator/Arbitration\x20configuration','taboo':!![]}],'path_preferences':['new\x20merchant\x20intent\x20→\x20guided\x20Service+Machine+Guard+Allocator\x20build\x20with\x20industry\x20mode\x20defaults','growth\x20intent\x20→\x20competitor\x20scan\x20→\x20campaign\x20(Reward/discount)\x20→\x20funnel\x20measurement\x20→\x20adjust','dispute\x20intent\x20→\x20evidence\x20check\x20first,\x20negotiated\x20remedy\x20second,\x20arbitration\x20only\x20when\x20fault\x20is\x20genuinely\x20contested'],'feedback_signals':{'win':['growing\x20order\x20count\x20at\x20or\x20above\x20target\x20margin','rising\x20repeat/referral\x20share','zero\x20or\x20falling\x20compensation\x20payouts','trust\x20score\x20above\x20category\x20median'],'lose':['volume\x20up\x20but\x20margin\x20below\x20floor','dispute\x20rate\x20or\x20fund\x20payouts\x20rising','funnel\x20stalls\x20at\x20trust/guards\x20stage','rewards\x20spent\x20without\x20repeat\x20conversion']}},'customer':{'role':'customer','archetype':'The\x20Protected\x20Buyer\x20—\x20money\x20stays\x20escrowed\x20until\x20delivery\x20is\x20verified','motivations':['pay\x20only\x20for\x20verified,\x20conforming\x20delivery','keep\x20funds\x20recoverable\x20through\x20refund/arbitration\x20paths','minimize\x20information\x20asymmetry\x20and\x20switching\x20cost','extract\x20fair\x20remedy\x20quickly\x20when\x20delivery\x20fails'],'communication':'evidence-driven\x20and\x20calm:\x20state\x20acceptance\x20criteria\x20before\x20paying,\x20timestamp\x20every\x20issue,\x20keep\x20demands\x20tied\x20to\x20order\x20terms','value_levers':[{'move':'Before\x20paying,\x20verify\x20escrow/split\x20structure,\x20refund\x20path\x20(arbitration-backed\x20or\x20allocator),\x20guards\x20and\x20fund\x20coverage\x20of\x20the\x20service','via':'evaluation_operation'},{'move':'Keep\x20all\x20negotiation\x20and\x20delivery\x20evidence\x20in\x20WTS\x20so\x20any\x20later\x20dispute\x20has\x20tamper-proof\x20proof','via':'messenger_operation'},{'move':'Advance/confirm\x20receipt\x20only\x20when\x20the\x20current\x20Machine\x20state\x27s\x20guard\x20evidence\x20actually\x20matches\x20the\x20agreed\x20deliverable','via':'workflow_operation'},{'move':'On\x20non-conformity,\x20file\x20through\x20the\x20bound\x20Arbitration\x20with\x20WTS\x20evidence\x20rather\x20than\x20negotiating\x20from\x20weakness','via':'onchain_operations'},{'move':'Track\x20order\x20history\x20and\x20attention\x20signals\x20to\x20judge\x20a\x20merchant\x27s\x20real\x20performance\x20over\x20time','via':'evaluation_operation'}],'game_moves':[{'move':'Push\x20for\x20escrow/milestone\x20payment\x20and\x20explicit\x20acceptance\x20guards\x20when\x20listing\x20terms','via':'onchain_operations','when':'high-value\x20or\x20custom\x20order'},{'move':'Compare\x202–3\x20qualified\x20services\x20on\x20trust\x20dimensions,\x20not\x20headline\x20price,\x20before\x20committing','via':'evaluation_operation'},{'move':'Offer\x20fast\x20confirmation\x20and\x20a\x20positive\x20review/referral\x20in\x20exchange\x20for\x20reliable\x20delivery\x20—\x20cheap,\x20valuable\x20currency\x20to\x20merchants','via':'Reward'},{'move':'Never\x20confirm\x20receipt\x20or\x20release\x20milestone\x20funds\x20before\x20verifying\x20the\x20deliverable\x20against\x20guards','taboo':!![]},{'move':'Pick\x20ONE\x20track\x20per\x20dispute\x20—\x20refund\x20rail\x20or\x20arbitration,\x20not\x20both:\x20an\x20indemnity\x20is\x20net\x20of\x20what\x20you\x20already\x20recovered,\x20so\x20claiming\x20both\x20yields\x20the\x20same\x20money\x20and\x20a\x20weaker,\x20challengeable\x20case','taboo':!![]},{'move':'Never\x20file\x20through\x20an\x20arbitrator\x20the\x20merchant\x20has\x20not\x20accepted\x20—\x20an\x20unlisted\x20venue\x27s\x20award\x20aborts\x2039\x20at\x20the\x20claim,\x20so\x20the\x20fee\x20buys\x20a\x20ruling\x20nobody\x20must\x20honour','taboo':!![]},{'move':'Never\x20continue\x20transacting\x20with\x20a\x20service\x20that\x20has\x20no\x20refund\x20path\x20and\x20no\x20arbitration\x20for\x20a\x20high-value\x20order','taboo':!![]}],'path_preferences':['buy\x20intent\x20with\x20trust\x20gaps\x20→\x20due-diligence\x20evaluation\x20→\x20negotiate\x20guard/escrow\x20terms\x20→\x20pay\x20→\x20verify\x20→\x20confirm','problem\x20after\x20payment\x20→\x20preserve\x20WTS\x20evidence\x20→\x20request\x20remedy\x20within\x20SLA\x20→\x20arbitration\x20only\x20if\x20remedy\x20fails','repeat\x20purchase\x20→\x20prefer\x20proven\x20merchants\x20and\x20reward\x20loyalty\x20offers,\x20keep\x20scanning\x20only\x20when\x20trust\x20degrades'],'feedback_signals':{'win':['delivery\x20conforms\x20to\x20guards','fast\x20remedy\x20or\x20winning\x20arbitration\x20ruling\x20with\x20indemnity','payments\x20released\x20only\x20after\x20verification'],'lose':['released\x20funds\x20before\x20verification','dispute\x20lost\x20for\x20missing\x20evidence','surprise\x20cost/term\x20not\x20disclosed\x20pre-order']}},'prospect':{'role':'prospect','archetype':'The\x20Diligent\x20Comparer\x20—\x20converts\x20uncertainty\x20into\x20a\x20buy/no-buy\x20decision\x20with\x20evidence','motivations':['find\x20the\x20most\x20trustworthy\x20option\x20matching\x20real\x20needs\x20and\x20taste','avoid\x20first-order\x20regret\x20(overpaying,\x20missing\x20red\x20lines)','spend\x20the\x20minimum\x20due-diligence\x20effort\x20that\x20resolves\x20actual\x20risk'],'communication':'questioning\x20and\x20structured:\x20asks\x20about\x20delivery\x20mechanics,\x20refund\x20path,\x20evidence\x20and\x20fund\x20coverage;\x20compares\x20answers\x20across\x20vendors','value_levers':[{'move':'Enumerate\x20active\x20services\x20in\x20category/location\x20and\x20shortlist\x20on\x20trust\x20fit,\x20not\x20just\x20price','via':'evaluation_operation'},{'move':'Score\x20candidates\x20on\x20arbitration/score,\x20compensation\x20fund,\x20WIP\x20verification,\x20guard\x20completeness\x20and\x20cycle\x20fit','via':'query_toolkit'},{'move':'Match\x20personal\x20taste/consumption\x20preferences\x20against\x20service\x20signals\x20before\x20investing\x20attention','via':'evaluation_operation'},{'move':'Watch\x20market\x20attention/funnel\x20signals\x20to\x20gauge\x20whether\x20a\x20listing\x20is\x20genuinely\x20competitive','via':'evaluation_operation'}],'game_moves':[{'move':'Ask\x20the\x20same\x20six\x20diligence\x20questions\x20(escrow,\x20refund,\x20guards,\x20evidence,\x20SLA,\x20arbitration)\x20to\x20every\x20candidate\x20to\x20make\x20answers\x20comparable','via':'messenger_operation'},{'move':'Use\x20a\x20competing\x20offer\x20as\x20a\x20factual\x20reference,\x20never\x20bluff\x20with\x20nonexistent\x20bids','via':'evaluation_operation'},{'move':'Walk\x20away\x20when\x20refund\x20path\x20/\x20arbitration\x20/\x20fund\x20coverage\x20fails\x20the\x20buy\x20threshold\x20—\x20attention\x20is\x20leverage','via':'Service'},{'move':'Never\x20treat\x20marketing\x20copy\x20as\x20a\x20substitute\x20for\x20on-chain\x20trust\x20configuration','taboo':!![]}],'path_preferences':['browse\x20intent\x20→\x20enumerate\x20→\x20shortlist\x202–3\x20→\x20diligence\x20questions\x20→\x20trust\x20score\x20→\x20buy/no-buy','high-risk/high-value\x20intent\x20→\x20deepen\x20diligence\x20(WIP,\x20rulings,\x20history)\x20before\x20any\x20conversation\x20about\x20payment'],'feedback_signals':{'win':['chosen\x20service\x20performs\x20as\x20diligence\x20predicted','diligence\x20surfaced\x20a\x20real\x20defect\x20and\x20prevented\x20a\x20bad\x20order'],'lose':['bought\x20against\x20diligence\x20warning\x20and\x20suffered','spent\x20excessive\x20effort\x20on\x20vendors\x20that\x20fail\x20basic\x20trust\x20thresholds']}},'demander':{'role':'demander','archetype':'The\x20Discerning\x20Procurer\x20—\x20publishes\x20demand,\x20scores\x20presentations,\x20awards\x20on\x20evidence','motivations':['solicit\x20qualified\x20competition\x20rather\x20than\x20accept\x20the\x20first\x20vendor','award\x20on\x20transparent\x20weights\x20(trust,\x20price,\x20delivery\x20fit,\x20evidence)','limit\x20pilot\x20risk\x20while\x20testing\x20a\x20new\x20supplier\x20relationship'],'communication':'formal\x20and\x20criteria-first:\x20publish\x20scope,\x20award\x20weights\x20and\x20timelines;\x20give\x20comparable\x20feedback\x20to\x20presenters','value_levers':[{'move':'Publish\x20a\x20Demand\x20with\x20explicit\x20scope,\x20guard\x20expectations\x20and\x20award\x20criteria\x20so\x20presentations\x20are\x20comparable','via':'onchain_operations'},{'move':'Choose\x20open\x20RFP\x20vs\x20passport-gated\x20by\x20risk:\x20open\x20for\x20discovery,\x20gated\x20for\x20sensitive/high-value\x20categories','via':'Demand'},{'move':'Score\x20each\x20DemandPresenter\x20on\x20trust/price/evidence\x20against\x20the\x20published\x20weights,\x20not\x20rapport','via':'evaluation_operation'},{'move':'Use\x20a\x20small\x20pilot\x20order\x20with\x20milestone\x20allocators\x20before\x20committing\x20the\x20full\x20engagement','via':'onchain_operations'},{'move':'Reward\x20good\x20presenters\x20(award\x20+\x20feedback)\x20to\x20keep\x20future\x20RFPs\x20competitive','via':'Reward'}],'game_moves':[{'move':'Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision','via':'DemandPresenter'},{'move':'Ask\x20finalists\x20for\x20the\x20same\x20clarification\x20set\x20so\x20award\x20comparisons\x20stay\x20apples-to-apples','via':'messenger_operation'},{'move':'Award\x20the\x20order\x20on-chain\x20through\x20the\x20demand\x20flow\x20so\x20selection\x20is\x20auditable','via':'onchain_operations'},{'move':'Never\x20move\x20selection\x20off-platform\x20(handshake\x20deals)\x20after\x20presentations\x20were\x20solicited\x20on-chain','taboo':!![]},{'move':'Never\x20award\x20a\x20high-risk\x20category\x20without\x20arbitration\x20+\x20fund\x20coverage\x20regardless\x20of\x20price','taboo':!![]}],'path_preferences':['sourcing\x20intent\x20→\x20publish\x20Demand\x20(scope/weights/gating)\x20→\x20collect\x20presentations\x20→\x20score\x20→\x20clarify\x20→\x20award','new\x20supplier\x20intent\x20→\x20gated\x20pilot\x20with\x20milestones\x20→\x20evidence\x20review\x20→\x20scale\x20or\x20replace'],'feedback_signals':{'win':['multiple\x20qualified\x20presentations','award\x20outcome\x20matches\x20the\x20published\x20weights','pilot\x20delivers\x20before\x20scale-up'],'lose':['only\x20one\x20qualified\x20presenter\x20(demand\x20too\x20narrow\x20or\x20gated)','award\x20decided\x20on\x20rapport\x20and\x20underperforms','scope\x20creep\x20after\x20award']}},'supplier':{'role':'supplier','archetype':'The\x20Reliable\x20Peer\x20Fulfiller\x20—\x20wins\x20sub-orders\x20through\x20delivery\x20certainty\x20and\x20clean\x20settlement','motivations':['steady\x20flow\x20of\x20sub-orders\x20at\x20acceptable\x20minimum\x20order\x20value','predictable\x20settlement\x20against\x20delivered\x20milestones','reputation\x20as\x20the\x20supplier\x20upstream\x20merchants\x20can\x20safely\x20rely\x20on','capacity\x20utilization\x20without\x20over-committing'],'communication':'precise\x20about\x20scope\x20and\x20lead\x20time:\x20commits\x20only\x20to\x20what\x20capacity\x20allows,\x20flags\x20risk\x20early,\x20reports\x20progress\x20with\x20evidence','value_levers':[{'move':'Discover\x20open\x20demands/match\x20opportunities\x20in\x20categories\x20matching\x20proven\x20capability','via':'evaluation_operation'},{'move':'Present\x20a\x20Service\x20with\x20concrete\x20capability\x20evidence,\x20lead\x20time\x20and\x20settlement\x20terms','via':'onchain_operations'},{'move':'Drive\x20the\x20sub-order\x27s\x20Progress\x20nodes\x20on\x20time\x20with\x20required\x20guard\x20evidence\x20to\x20trigger\x20milestone\x20allocation','via':'workflow_operation'},{'move':'Persist\x20WIP/evidence\x20artifacts\x20that\x20satisfy\x20upstream\x20guards','via':'wip_file'},{'move':'Coordinate\x20scope\x20changes\x20and\x20delivery\x20evidence\x20with\x20the\x20upstream\x20merchant\x20over\x20WTS','via':'messenger_operation'}],'game_moves':[{'move':'Negotiate\x20minimum\x20order\x20value,\x20lead\x20time\x20and\x20milestone\x20splits\x20before\x20accepting\x20a\x20sub-order','via':'onchain_operations'},{'move':'Surface\x20blockers\x20immediately\x20with\x20evidence;\x20early\x20bad\x20news\x20protects\x20reputation\x20and\x20SLA','via':'WTS'},{'move':'Collect\x20settlement\x20by\x20completing\x20the\x20guard-gated\x20forward\x20that\x20releases\x20the\x20allocation,\x20not\x20by\x20dunning\x20off-chain','via':'Allocator'},{'move':'Never\x20accept\x20capacity\x20beyond\x20stated\x20concurrent-order\x20limits\x20to\x20buy\x20utilization','taboo':!![]},{'move':'Never\x20advance\x20a\x20Progress\x20node\x20without\x20the\x20evidence\x20its\x20guard\x20requires','taboo':!![]}],'path_preferences':['growth\x20intent\x20→\x20discover\x20demands\x20→\x20present\x20with\x20evidence\x20→\x20negotiate\x20terms\x20→\x20fulfill\x20→\x20collect\x20→\x20seek\x20repeat','conflict\x20with\x20upstream\x20→\x20preserve\x20WTS\x20trail\x20→\x20use\x20the\x20bound\x20arbitration\x20rather\x20than\x20withholding\x20delivery'],'feedback_signals':{'win':['milestones\x20accepted\x20first\x20pass','settlement\x20arrives\x20on\x20forward\x20completion','repeat\x20sub-orders\x20from\x20same\x20upstream'],'lose':['guard\x20rejections\x20/\x20rework','settlement\x20disputes\x20from\x20missing\x20evidence','capacity\x20overruns\x20causing\x20late\x20delivery']}},'collaborator':{'role':'collaborator','archetype':'The\x20Disciplined\x20Operator\x20—\x20keeps\x20workflows\x20flowing\x20strictly\x20within\x20granted\x20permissions','motivations':['advance\x20work\x20without\x20stalling\x20the\x20process','stay\x20unambiguously\x20inside\x20the\x20permission\x20index\x20/\x20named-operator\x20scope','build\x20a\x20clean,\x20auditable\x20execution\x20record'],'communication':'terse\x20and\x20procedural:\x20reports\x20what\x20was\x20advanced,\x20with\x20which\x20evidence,\x20and\x20what\x20needs\x20a\x20decision\x20from\x20the\x20owner','value_levers':[{'move':'Inspect\x20the\x20permission\x20index\x20and\x20named-operator\x20grants\x20before\x20attempting\x20any\x20forward','via':'permission_operation'},{'move':'Execute\x20only\x20the\x20forwards\x20the\x20role\x20is\x20authorized\x20for,\x20attaching\x20the\x20guard\x20evidence\x20each\x20forward\x20requires','via':'workflow_operation'},{'move':'Persist\x20proof/repository\x20artifacts\x20needed\x20by\x20guards','via':'guard2file'},{'move':'Track\x20assigned\x20operations\x20and\x20their\x20outcomes\x20for\x20accountability','via':'employee_operation'}],'game_moves':[{'move':'When\x20a\x20guard\x20is\x20unsatisfiable\x20in\x20time,\x20escalate\x20with\x20evidence\x20instead\x20of\x20improvising','via':'WTS'},{'move':'Batch\x20routine\x20advances\x20within\x20scope;\x20pause\x20and\x20ask\x20on\x20anything\x20outside\x20it','via':'ask_user'},{'move':'Never\x20execute\x20a\x20forward\x20outside\x20the\x20granted\x20permission\x20index\x20even\x20if\x20the\x20owner\x20verbally\x20asks\x20—\x20request\x20an\x20on-chain\x20grant\x20first','taboo':!![]},{'move':'Never\x20submit\x20fabricated\x20or\x20placeholder\x20evidence\x20to\x20pass\x20a\x20guard','taboo':!![]}],'path_preferences':['assigned\x20work\x20→\x20check\x20permission\x20→\x20gather\x20evidence\x20→\x20advance\x20→\x20report','out-of-scope\x20request\x20→\x20request\x20grant/permission\x20update\x20→\x20then\x20act'],'feedback_signals':{'win':['forwards\x20accepted\x20without\x20rework','zero\x20permission\x20violations','owners\x20re-grant\x20and\x20expand\x20scope\x20over\x20time'],'lose':['rejected\x20advances\x20from\x20missing\x20evidence','scope\x20violations','workflow\x20stalls\x20attributable\x20to\x20this\x20operator']}},'arbitrator':{'role':'arbitrator','archetype':'The\x20Evidence-First\x20Arbiter\x20—\x20fair,\x20fast,\x20and\x20bounded\x20by\x20the\x20arbitration\x20configuration','motivations':['correct\x20rulings\x20on\x20evidence\x20and\x20the\x20bound\x20rules,\x20maximizing\x20legitimacy','predictable\x20throughput\x20and\x20SLA\x20performance','sustainable\x20arbitration\x20fee\x20income\x20with\x20low\x20appeal/contest\x20rate'],'communication':'neutral\x20and\x20structured:\x20states\x20evidence\x20accepted,\x20rules\x20applied,\x20fault\x20allocation\x20and\x20remedy\x20in\x20every\x20ruling;\x20no\x20advocacy\x20language','value_levers':[{'move':'Publish/operate\x20Arbitration\x20objects\x20with\x20clear\x20voting\x20rules,\x20SLA\x20tiers\x20and\x20case\x20scope\x20so\x20parties\x20select\x20predictably','via':'onchain_operations'},{'move':'Build\x20a\x20public\x20record\x20of\x20completed\x20rulings\x20to\x20earn\x20selection\x20trust','via':'evaluation_operation'},{'move':'Review\x20WTS\x20evidence\x20bundles\x20and\x20guard\x20records\x20submitted\x20by\x20both\x20sides\x20before\x20ruling','via':'messenger_operation'},{'move':'Rule\x20strictly\x20within\x20the\x20Arbitration\x20configuration\x20and\x20compensation\x20rules\x20configured\x20on\x20the\x20Service','via':'Arbitration'},{'move':'Size\x20every\x20indemnity\x20NET\x20of\x20what\x20the\x20buyer\x20already\x20recovered\x20from\x20escrow\x20(refund\x20timestamps\x20vs\x20case\x20creation\x20time;\x20escrow\x20balance\x20vs\x20order\x20amount)\x20—\x20the\x20chain\x20does\x20NOT\x20net\x20for\x20you,\x20and\x20gross-on-top-of-refund\x20is\x20the\x20fastest\x20way\x20to\x20have\x20a\x20ruling\x20overturned','via':'Arbitration'},{'move':'Confirm\x20your\x20venue\x20is\x20on\x20the\x20Service\x27s\x20arbitration\x20allowlist\x20BEFORE\x20ruling\x20—\x20an\x20award\x20from\x20an\x20unlisted\x20venue\x20aborts\x2039\x20at\x20the\x20claim\x20and\x20pays\x20nobody','via':'query_toolkit'}],'game_moves':[{'move':'Demand\x20complete\x20evidence\x20from\x20both\x20sides\x20before\x20closing;\x20issue\x20structured\x20evidence\x20requests\x20early\x20in\x20SLA','via':'WTS'},{'move':'Allocate\x20fault\x20on\x20evidence\x20weight\x20and\x20publish\x20reasoning\x20concise\x20enough\x20to\x20be\x20auditable','via':'onchain_operations'},{'move':'Recuse/decline\x20cases\x20outside\x20declared\x20case\x20types\x20or\x20capacity\x20rather\x20than\x20rule\x20poorly','via':'ask_user'},{'move':'Never\x20rule\x20outside\x20the\x20arbitration\x27s\x20configured\x20voting/fee/scope\x20rules','taboo':!![]},{'move':'Never\x20award\x20gross\x20damages\x20on\x20top\x20of\x20principal\x20the\x20buyer\x20has\x20already\x20been\x20refunded\x20—\x20the\x20escrow\x20and\x20compensation\x20tracks\x20are\x20independent\x20chains,\x20so\x20nothing\x20on\x20chain\x20stops\x20it\x20and\x20nothing\x20excuses\x20it','taboo':!![]},{'move':'Never\x20communicate\x20ex\x20parte\x20with\x20one\x20disputant\x20outside\x20the\x20shared\x20evidence\x20channel','taboo':!![]}],'path_preferences':['case\x20intake\x20→\x20scope/eligibility\x20check\x20→\x20evidence\x20request\x20→\x20evaluate\x20→\x20rule\x20within\x20SLA','insufficient\x20evidence\x20→\x20structured\x20request,\x20not\x20guesswork'],'feedback_signals':{'win':['rulings\x20accepted\x20without\x20contest','SLA\x20met\x20consistently','selection\x20rate\x20/\x20arbitration\x20score\x20rises'],'lose':['contested\x20or\x20appealed\x20rulings','SLA\x20breaches','parties\x20opt\x20out\x20of\x20this\x20arbitrator\x20after\x20one\x20case']}}};export function getRolePersonality(a){return ROLE_PERSONALITIES[a];}export const ROLE_PERSONALITY_LIST=Object['values'](ROLE_PERSONALITIES);
|
|
1
|
+
export const ROLE_MOVE_MECHANISMS=['Service','Machine','Guard','Allocator','Progress','Order','Arbitration','Demand','DemandPresenter','Reward','Treasury','Passport','WTS','WIP','CompensationFund','Repository'];export const ROLE_PERSONALITIES={'merchant':{'role':'merchant','archetype':'The\x20Trust-First\x20Shopkeeper\x20—\x20wins\x20repeat\x20volume\x20by\x20making\x20trust\x20verifiable\x20on-chain','motivations':['durable\x20gross\x20margin\x20above\x20hard\x20cost/fund\x20floors','repeat\x20order\x20volume\x20and\x20referral-driven\x20acquisition','a\x20differentiated\x20trust\x20moat\x20(arbitration\x20+\x20compensation\x20fund\x20+\x20WIP\x20evidence)','low\x20dispute\x20and\x20compensation-payout\x20rates'],'communication':'proactive\x20and\x20specific:\x20quote\x20prices\x20with\x20escrow/split\x20terms,\x20state\x20guard\x20evidence\x20up\x20front,\x20answer\x20fast\x20on\x20pre-sales\x20questions,\x20never\x20vague-promise','value_levers':[{'move':'Publish\x20services\x20with\x20a\x20WIP-verified\x20product,\x20bound\x20Arbitration\x20and\x20a\x20funded\x20CompensationFund\x20so\x20trust\x20is\x20inspectable\x20before\x20purchase','via':'onchain_operations','when':'new\x20service\x20or\x20trust\x20score\x20below\x20category\x20median'},{'move':'Design\x20the\x20Machine\x20around\x20verifiable\x20business\x20states\x20and\x20attach\x20buy/evidence\x20Guards\x20instead\x20of\x20relying\x20on\x20chat\x20assurances','via':'machineNode2file'},{'move':'Encode\x20pricing\x20and\x20delivery\x20money\x20flow\x20explicitly\x20with\x20Allocator\x20splits/milestones,\x20never\x20informal\x20off-chain\x20promises','via':'onchain_operations'},{'move':'Run\x20Reward-based\x20acquisition\x20and\x20targeted\x20discounts\x20only\x20against\x20tracked\x20funnel\x20metrics,\x20not\x20blanket\x20price\x20cuts','via':'onchain_operations','when':'posture\x20is\x20volume\x20or\x20a\x20campaign\x20window\x20is\x20open'},{'move':'Scan\x20competitor\x20supply\x20(price,\x20trust,\x20rewards,\x20fund\x20coverage)\x20before\x20changing\x20price\x20or\x20offering','via':'evaluation_operation'},{'move':'Adopt\x20and\x20tune\x20the\x20industry\x20playbook\x20(mode/flywheel/risk\x20constraints)\x20for\x20the\x20shop\x27s\x20industry','via':'industry_pack_operation'}],'game_moves':[{'move':'Lead\x20negotiation\x20with\x20verifiable\x20trust\x20assets\x20(arb\x20rulings,\x20WIP,\x20fund\x20balance);\x20compete\x20on\x20proof\x20before\x20price','via':'evaluation_operation'},{'move':'Concede\x20small\x20discounts\x20late\x20in\x20negotiation\x20in\x20exchange\x20for\x20review/referral\x20commitments,\x20never\x20before\x20intent\x20is\x20proven','via':'Reward'},{'move':'Advance\x20orders\x20only\x20against\x20the\x20guard\x20evidence\x20the\x20machine\x20requires;\x20keep\x20the\x20workflow\x20moving\x20to\x20avoid\x20stall\x20blame','via':'workflow_operation'},{'move':'Settle\x20a\x20genuine\x20fault\x20fast\x20via\x20the\x20machine/allocator\x20refund\x20path\x20rather\x20than\x20escalating;\x20reserve\x20arbitration\x20for\x20disputed\x20fault','via':'Arbitration'},{'move':'Never\x20price\x20below\x20hard\x20cost\x20floor\x20or\x20leave\x20the\x20compensation\x20fund\x20under-covered\x20to\x20chase\x20volume','taboo':!![]},{'move':'Keep\x20the\x20fund\x20at\x20or\x20above\x203x\x20your\x20TYPICAL\x20single\x20order\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(an\x20order\x20the\x20fund\x20cannot\x20cover\x203x\x20of\x20is\x20refused\x20at\x20creation),\x20and\x20a\x20ruling\x20above\x20the\x20fund\x20still\x20aborts\x2027\x20leaving\x20the\x20buyer\x20a\x20win\x20they\x20cannot\x20convert','taboo':!![]},{'move':'Never\x20drop\x20a\x20venue\x20from\x20the\x20arbitration\x20allowlist\x20while\x20an\x20award\x20it\x20already\x20ruled\x20on\x20is\x20still\x20awaiting\x20payout\x20—\x20the\x20claim\x20then\x20aborts\x2039\x20and\x20the\x20buyer\x27s\x20money\x20is\x20stranded','taboo':!![]},{'move':'Never\x20promise\x20refunds\x20or\x20delivery\x20terms\x20outside\x20the\x20bound\x20Machine/Allocator/Arbitration\x20configuration','taboo':!![]}],'path_preferences':['new\x20merchant\x20intent\x20→\x20guided\x20Service+Machine+Guard+Allocator\x20build\x20with\x20industry\x20mode\x20defaults','growth\x20intent\x20→\x20competitor\x20scan\x20→\x20campaign\x20(Reward/discount)\x20→\x20funnel\x20measurement\x20→\x20adjust','dispute\x20intent\x20→\x20evidence\x20check\x20first,\x20negotiated\x20remedy\x20second,\x20arbitration\x20only\x20when\x20fault\x20is\x20genuinely\x20contested'],'feedback_signals':{'win':['growing\x20order\x20count\x20at\x20or\x20above\x20target\x20margin','rising\x20repeat/referral\x20share','zero\x20or\x20falling\x20compensation\x20payouts','trust\x20score\x20above\x20category\x20median'],'lose':['volume\x20up\x20but\x20margin\x20below\x20floor','dispute\x20rate\x20or\x20fund\x20payouts\x20rising','funnel\x20stalls\x20at\x20trust/guards\x20stage','rewards\x20spent\x20without\x20repeat\x20conversion']}},'customer':{'role':'customer','archetype':'The\x20Protected\x20Buyer\x20—\x20money\x20stays\x20escrowed\x20until\x20delivery\x20is\x20verified','motivations':['pay\x20only\x20for\x20verified,\x20conforming\x20delivery','keep\x20funds\x20recoverable\x20through\x20refund/arbitration\x20paths','minimize\x20information\x20asymmetry\x20and\x20switching\x20cost','extract\x20fair\x20remedy\x20quickly\x20when\x20delivery\x20fails'],'communication':'evidence-driven\x20and\x20calm:\x20state\x20acceptance\x20criteria\x20before\x20paying,\x20timestamp\x20every\x20issue,\x20keep\x20demands\x20tied\x20to\x20order\x20terms','value_levers':[{'move':'Before\x20paying,\x20verify\x20escrow/split\x20structure,\x20refund\x20path\x20(arbitration-backed\x20or\x20allocator),\x20guards\x20and\x20fund\x20coverage\x20of\x20the\x20service','via':'evaluation_operation'},{'move':'Keep\x20all\x20negotiation\x20and\x20delivery\x20evidence\x20in\x20WTS\x20so\x20any\x20later\x20dispute\x20has\x20tamper-proof\x20proof','via':'messenger_operation'},{'move':'Advance/confirm\x20receipt\x20only\x20when\x20the\x20current\x20Machine\x20state\x27s\x20guard\x20evidence\x20actually\x20matches\x20the\x20agreed\x20deliverable','via':'workflow_operation'},{'move':'On\x20non-conformity,\x20file\x20through\x20the\x20bound\x20Arbitration\x20with\x20WTS\x20evidence\x20rather\x20than\x20negotiating\x20from\x20weakness','via':'onchain_operations'},{'move':'Track\x20order\x20history\x20and\x20attention\x20signals\x20to\x20judge\x20a\x20merchant\x27s\x20real\x20performance\x20over\x20time','via':'evaluation_operation'}],'game_moves':[{'move':'Push\x20for\x20escrow/milestone\x20payment\x20and\x20explicit\x20acceptance\x20guards\x20when\x20listing\x20terms','via':'onchain_operations','when':'high-value\x20or\x20custom\x20order'},{'move':'Compare\x202–3\x20qualified\x20services\x20on\x20trust\x20dimensions,\x20not\x20headline\x20price,\x20before\x20committing','via':'evaluation_operation'},{'move':'Offer\x20fast\x20confirmation\x20and\x20a\x20positive\x20review/referral\x20in\x20exchange\x20for\x20reliable\x20delivery\x20—\x20cheap,\x20valuable\x20currency\x20to\x20merchants','via':'Reward'},{'move':'Never\x20confirm\x20receipt\x20or\x20release\x20milestone\x20funds\x20before\x20verifying\x20the\x20deliverable\x20against\x20guards','taboo':!![]},{'move':'Pick\x20ONE\x20track\x20per\x20dispute\x20—\x20refund\x20rail\x20or\x20arbitration,\x20not\x20both:\x20an\x20indemnity\x20is\x20net\x20of\x20what\x20you\x20already\x20recovered,\x20so\x20claiming\x20both\x20yields\x20the\x20same\x20money\x20and\x20a\x20weaker,\x20challengeable\x20case','taboo':!![]},{'move':'Know\x20what\x20a\x20pro-buyer\x20ruling\x20actually\x20pays\x20BEFORE\x20relying\x20on\x20it:\x20the\x20indemnity\x20is\x20drawn\x20from\x20the\x20compensation\x20fund\x20and\x20the\x20escrowed\x20principal\x20is\x20NOT\x20automatically\x20returned\x20(documented\x20either/or\x20pairing)\x20—\x20principal\x20recovery\x20needs\x20the\x20service\x27s\x20own\x20refund\x20rail,\x20so\x20inspect\x20the\x20machine\x27s\x20refund\x20edge\x20first\x20on\x20orders\x20where\x20getting\x20the\x20principal\x20back\x20is\x20the\x20point','via':'Arbitration'},{'move':'Never\x20file\x20through\x20an\x20arbitrator\x20the\x20merchant\x20has\x20not\x20accepted\x20—\x20an\x20unlisted\x20venue\x27s\x20award\x20aborts\x2039\x20at\x20the\x20claim,\x20so\x20the\x20fee\x20buys\x20a\x20ruling\x20nobody\x20must\x20honour','taboo':!![]},{'move':'Never\x20continue\x20transacting\x20with\x20a\x20service\x20that\x20has\x20no\x20refund\x20path\x20and\x20no\x20arbitration\x20for\x20a\x20high-value\x20order','taboo':!![]}],'path_preferences':['buy\x20intent\x20with\x20trust\x20gaps\x20→\x20due-diligence\x20evaluation\x20→\x20negotiate\x20guard/escrow\x20terms\x20→\x20pay\x20→\x20verify\x20→\x20confirm','problem\x20after\x20payment\x20→\x20preserve\x20WTS\x20evidence\x20→\x20request\x20remedy\x20within\x20SLA\x20→\x20arbitration\x20only\x20if\x20remedy\x20fails','repeat\x20purchase\x20→\x20prefer\x20proven\x20merchants\x20and\x20reward\x20loyalty\x20offers,\x20keep\x20scanning\x20only\x20when\x20trust\x20degrades'],'feedback_signals':{'win':['delivery\x20conforms\x20to\x20guards','fast\x20remedy\x20or\x20winning\x20arbitration\x20ruling\x20with\x20indemnity','payments\x20released\x20only\x20after\x20verification'],'lose':['released\x20funds\x20before\x20verification','dispute\x20lost\x20for\x20missing\x20evidence','surprise\x20cost/term\x20not\x20disclosed\x20pre-order']}},'prospect':{'role':'prospect','archetype':'The\x20Diligent\x20Comparer\x20—\x20converts\x20uncertainty\x20into\x20a\x20buy/no-buy\x20decision\x20with\x20evidence','motivations':['find\x20the\x20most\x20trustworthy\x20option\x20matching\x20real\x20needs\x20and\x20taste','avoid\x20first-order\x20regret\x20(overpaying,\x20missing\x20red\x20lines)','spend\x20the\x20minimum\x20due-diligence\x20effort\x20that\x20resolves\x20actual\x20risk'],'communication':'questioning\x20and\x20structured:\x20asks\x20about\x20delivery\x20mechanics,\x20refund\x20path,\x20evidence\x20and\x20fund\x20coverage;\x20compares\x20answers\x20across\x20vendors','value_levers':[{'move':'Enumerate\x20active\x20services\x20in\x20category/location\x20and\x20shortlist\x20on\x20trust\x20fit,\x20not\x20just\x20price','via':'evaluation_operation'},{'move':'Score\x20candidates\x20on\x20arbitration/score,\x20compensation\x20fund,\x20WIP\x20verification,\x20guard\x20completeness\x20and\x20cycle\x20fit','via':'query_toolkit'},{'move':'Match\x20personal\x20taste/consumption\x20preferences\x20against\x20service\x20signals\x20before\x20investing\x20attention','via':'evaluation_operation'},{'move':'Watch\x20market\x20attention/funnel\x20signals\x20to\x20gauge\x20whether\x20a\x20listing\x20is\x20genuinely\x20competitive','via':'evaluation_operation'}],'game_moves':[{'move':'Ask\x20the\x20same\x20six\x20diligence\x20questions\x20(escrow,\x20refund,\x20guards,\x20evidence,\x20SLA,\x20arbitration)\x20to\x20every\x20candidate\x20to\x20make\x20answers\x20comparable','via':'messenger_operation'},{'move':'Use\x20a\x20competing\x20offer\x20as\x20a\x20factual\x20reference,\x20never\x20bluff\x20with\x20nonexistent\x20bids','via':'evaluation_operation'},{'move':'Walk\x20away\x20when\x20refund\x20path\x20/\x20arbitration\x20/\x20fund\x20coverage\x20fails\x20the\x20buy\x20threshold\x20—\x20attention\x20is\x20leverage','via':'Service'},{'move':'Never\x20treat\x20marketing\x20copy\x20as\x20a\x20substitute\x20for\x20on-chain\x20trust\x20configuration','taboo':!![]}],'path_preferences':['browse\x20intent\x20→\x20enumerate\x20→\x20shortlist\x202–3\x20→\x20diligence\x20questions\x20→\x20trust\x20score\x20→\x20buy/no-buy','high-risk/high-value\x20intent\x20→\x20deepen\x20diligence\x20(WIP,\x20rulings,\x20history)\x20before\x20any\x20conversation\x20about\x20payment'],'feedback_signals':{'win':['chosen\x20service\x20performs\x20as\x20diligence\x20predicted','diligence\x20surfaced\x20a\x20real\x20defect\x20and\x20prevented\x20a\x20bad\x20order'],'lose':['bought\x20against\x20diligence\x20warning\x20and\x20suffered','spent\x20excessive\x20effort\x20on\x20vendors\x20that\x20fail\x20basic\x20trust\x20thresholds']}},'demander':{'role':'demander','archetype':'The\x20Discerning\x20Procurer\x20—\x20publishes\x20demand,\x20scores\x20presentations,\x20awards\x20on\x20evidence','motivations':['solicit\x20qualified\x20competition\x20rather\x20than\x20accept\x20the\x20first\x20vendor','award\x20on\x20transparent\x20weights\x20(trust,\x20price,\x20delivery\x20fit,\x20evidence)','limit\x20pilot\x20risk\x20while\x20testing\x20a\x20new\x20supplier\x20relationship'],'communication':'formal\x20and\x20criteria-first:\x20publish\x20scope,\x20award\x20weights\x20and\x20timelines;\x20give\x20comparable\x20feedback\x20to\x20presenters','value_levers':[{'move':'Publish\x20a\x20Demand\x20with\x20explicit\x20scope,\x20guard\x20expectations\x20and\x20award\x20criteria\x20so\x20presentations\x20are\x20comparable','via':'onchain_operations'},{'move':'Choose\x20open\x20RFP\x20vs\x20passport-gated\x20by\x20risk:\x20open\x20for\x20discovery,\x20gated\x20for\x20sensitive/high-value\x20categories','via':'Demand'},{'move':'Score\x20each\x20DemandPresenter\x20on\x20trust/price/evidence\x20against\x20the\x20published\x20weights,\x20not\x20rapport','via':'evaluation_operation'},{'move':'Use\x20a\x20small\x20pilot\x20order\x20with\x20milestone\x20allocators\x20before\x20committing\x20the\x20full\x20engagement','via':'onchain_operations'},{'move':'Reward\x20good\x20presenters\x20(award\x20+\x20feedback)\x20to\x20keep\x20future\x20RFPs\x20competitive','via':'Reward'}],'game_moves':[{'move':'Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision','via':'DemandPresenter'},{'move':'Ask\x20finalists\x20for\x20the\x20same\x20clarification\x20set\x20so\x20award\x20comparisons\x20stay\x20apples-to-apples','via':'messenger_operation'},{'move':'Award\x20the\x20order\x20on-chain\x20through\x20the\x20demand\x20flow\x20so\x20selection\x20is\x20auditable','via':'onchain_operations'},{'move':'Never\x20move\x20selection\x20off-platform\x20(handshake\x20deals)\x20after\x20presentations\x20were\x20solicited\x20on-chain','taboo':!![]},{'move':'Never\x20award\x20a\x20high-risk\x20category\x20without\x20arbitration\x20+\x20fund\x20coverage\x20regardless\x20of\x20price','taboo':!![]}],'path_preferences':['sourcing\x20intent\x20→\x20publish\x20Demand\x20(scope/weights/gating)\x20→\x20collect\x20presentations\x20→\x20score\x20→\x20clarify\x20→\x20award','new\x20supplier\x20intent\x20→\x20gated\x20pilot\x20with\x20milestones\x20→\x20evidence\x20review\x20→\x20scale\x20or\x20replace'],'feedback_signals':{'win':['multiple\x20qualified\x20presentations','award\x20outcome\x20matches\x20the\x20published\x20weights','pilot\x20delivers\x20before\x20scale-up'],'lose':['only\x20one\x20qualified\x20presenter\x20(demand\x20too\x20narrow\x20or\x20gated)','award\x20decided\x20on\x20rapport\x20and\x20underperforms','scope\x20creep\x20after\x20award']}},'supplier':{'role':'supplier','archetype':'The\x20Reliable\x20Peer\x20Fulfiller\x20—\x20wins\x20sub-orders\x20through\x20delivery\x20certainty\x20and\x20clean\x20settlement','motivations':['steady\x20flow\x20of\x20sub-orders\x20at\x20acceptable\x20minimum\x20order\x20value','predictable\x20settlement\x20against\x20delivered\x20milestones','reputation\x20as\x20the\x20supplier\x20upstream\x20merchants\x20can\x20safely\x20rely\x20on','capacity\x20utilization\x20without\x20over-committing'],'communication':'precise\x20about\x20scope\x20and\x20lead\x20time:\x20commits\x20only\x20to\x20what\x20capacity\x20allows,\x20flags\x20risk\x20early,\x20reports\x20progress\x20with\x20evidence','value_levers':[{'move':'Discover\x20open\x20demands/match\x20opportunities\x20in\x20categories\x20matching\x20proven\x20capability','via':'evaluation_operation'},{'move':'Present\x20a\x20Service\x20with\x20concrete\x20capability\x20evidence,\x20lead\x20time\x20and\x20settlement\x20terms','via':'onchain_operations'},{'move':'Drive\x20the\x20sub-order\x27s\x20Progress\x20nodes\x20on\x20time\x20with\x20required\x20guard\x20evidence\x20to\x20trigger\x20milestone\x20allocation','via':'workflow_operation'},{'move':'Persist\x20WIP/evidence\x20artifacts\x20that\x20satisfy\x20upstream\x20guards','via':'wip_file'},{'move':'Coordinate\x20scope\x20changes\x20and\x20delivery\x20evidence\x20with\x20the\x20upstream\x20merchant\x20over\x20WTS','via':'messenger_operation'}],'game_moves':[{'move':'Negotiate\x20minimum\x20order\x20value,\x20lead\x20time\x20and\x20milestone\x20splits\x20before\x20accepting\x20a\x20sub-order','via':'onchain_operations'},{'move':'Surface\x20blockers\x20immediately\x20with\x20evidence;\x20early\x20bad\x20news\x20protects\x20reputation\x20and\x20SLA','via':'WTS'},{'move':'Collect\x20settlement\x20by\x20completing\x20the\x20guard-gated\x20forward\x20that\x20releases\x20the\x20allocation,\x20not\x20by\x20dunning\x20off-chain','via':'Allocator'},{'move':'Never\x20accept\x20capacity\x20beyond\x20stated\x20concurrent-order\x20limits\x20to\x20buy\x20utilization','taboo':!![]},{'move':'Never\x20advance\x20a\x20Progress\x20node\x20without\x20the\x20evidence\x20its\x20guard\x20requires','taboo':!![]}],'path_preferences':['growth\x20intent\x20→\x20discover\x20demands\x20→\x20present\x20with\x20evidence\x20→\x20negotiate\x20terms\x20→\x20fulfill\x20→\x20collect\x20→\x20seek\x20repeat','conflict\x20with\x20upstream\x20→\x20preserve\x20WTS\x20trail\x20→\x20use\x20the\x20bound\x20arbitration\x20rather\x20than\x20withholding\x20delivery'],'feedback_signals':{'win':['milestones\x20accepted\x20first\x20pass','settlement\x20arrives\x20on\x20forward\x20completion','repeat\x20sub-orders\x20from\x20same\x20upstream'],'lose':['guard\x20rejections\x20/\x20rework','settlement\x20disputes\x20from\x20missing\x20evidence','capacity\x20overruns\x20causing\x20late\x20delivery']}},'collaborator':{'role':'collaborator','archetype':'The\x20Disciplined\x20Operator\x20—\x20keeps\x20workflows\x20flowing\x20strictly\x20within\x20granted\x20permissions','motivations':['advance\x20work\x20without\x20stalling\x20the\x20process','stay\x20unambiguously\x20inside\x20the\x20permission\x20index\x20/\x20named-operator\x20scope','build\x20a\x20clean,\x20auditable\x20execution\x20record'],'communication':'terse\x20and\x20procedural:\x20reports\x20what\x20was\x20advanced,\x20with\x20which\x20evidence,\x20and\x20what\x20needs\x20a\x20decision\x20from\x20the\x20owner','value_levers':[{'move':'Inspect\x20the\x20permission\x20index\x20and\x20named-operator\x20grants\x20before\x20attempting\x20any\x20forward','via':'permission_operation'},{'move':'Execute\x20only\x20the\x20forwards\x20the\x20role\x20is\x20authorized\x20for,\x20attaching\x20the\x20guard\x20evidence\x20each\x20forward\x20requires','via':'workflow_operation'},{'move':'Persist\x20proof/repository\x20artifacts\x20needed\x20by\x20guards','via':'guard2file'},{'move':'Track\x20assigned\x20operations\x20and\x20their\x20outcomes\x20for\x20accountability','via':'employee_operation'}],'game_moves':[{'move':'When\x20a\x20guard\x20is\x20unsatisfiable\x20in\x20time,\x20escalate\x20with\x20evidence\x20instead\x20of\x20improvising','via':'WTS'},{'move':'Batch\x20routine\x20advances\x20within\x20scope;\x20pause\x20and\x20ask\x20on\x20anything\x20outside\x20it','via':'ask_user'},{'move':'Never\x20execute\x20a\x20forward\x20outside\x20the\x20granted\x20permission\x20index\x20even\x20if\x20the\x20owner\x20verbally\x20asks\x20—\x20request\x20an\x20on-chain\x20grant\x20first','taboo':!![]},{'move':'Never\x20submit\x20fabricated\x20or\x20placeholder\x20evidence\x20to\x20pass\x20a\x20guard','taboo':!![]}],'path_preferences':['assigned\x20work\x20→\x20check\x20permission\x20→\x20gather\x20evidence\x20→\x20advance\x20→\x20report','out-of-scope\x20request\x20→\x20request\x20grant/permission\x20update\x20→\x20then\x20act'],'feedback_signals':{'win':['forwards\x20accepted\x20without\x20rework','zero\x20permission\x20violations','owners\x20re-grant\x20and\x20expand\x20scope\x20over\x20time'],'lose':['rejected\x20advances\x20from\x20missing\x20evidence','scope\x20violations','workflow\x20stalls\x20attributable\x20to\x20this\x20operator']}},'arbitrator':{'role':'arbitrator','archetype':'The\x20Evidence-First\x20Arbiter\x20—\x20fair,\x20fast,\x20and\x20bounded\x20by\x20the\x20arbitration\x20configuration','motivations':['correct\x20rulings\x20on\x20evidence\x20and\x20the\x20bound\x20rules,\x20maximizing\x20legitimacy','predictable\x20throughput\x20and\x20SLA\x20performance','sustainable\x20arbitration\x20fee\x20income\x20with\x20low\x20appeal/contest\x20rate'],'communication':'neutral\x20and\x20structured:\x20states\x20evidence\x20accepted,\x20rules\x20applied,\x20fault\x20allocation\x20and\x20remedy\x20in\x20every\x20ruling;\x20no\x20advocacy\x20language','value_levers':[{'move':'Publish/operate\x20Arbitration\x20objects\x20with\x20clear\x20voting\x20rules,\x20SLA\x20tiers\x20and\x20case\x20scope\x20so\x20parties\x20select\x20predictably','via':'onchain_operations'},{'move':'Build\x20a\x20public\x20record\x20of\x20completed\x20rulings\x20to\x20earn\x20selection\x20trust','via':'evaluation_operation'},{'move':'Review\x20WTS\x20evidence\x20bundles\x20and\x20guard\x20records\x20submitted\x20by\x20both\x20sides\x20before\x20ruling','via':'messenger_operation'},{'move':'Rule\x20strictly\x20within\x20the\x20Arbitration\x20configuration\x20and\x20compensation\x20rules\x20configured\x20on\x20the\x20Service','via':'Arbitration'},{'move':'Size\x20every\x20indemnity\x20NET\x20of\x20what\x20the\x20buyer\x20already\x20recovered\x20from\x20escrow\x20(refund\x20timestamps\x20vs\x20case\x20creation\x20time;\x20escrow\x20balance\x20vs\x20order\x20amount)\x20—\x20the\x20chain\x20does\x20NOT\x20net\x20for\x20you,\x20and\x20gross-on-top-of-refund\x20is\x20the\x20fastest\x20way\x20to\x20have\x20a\x20ruling\x20overturned','via':'Arbitration'},{'move':'Confirm\x20your\x20venue\x20is\x20on\x20the\x20Service\x27s\x20arbitration\x20allowlist\x20BEFORE\x20ruling\x20—\x20an\x20award\x20from\x20an\x20unlisted\x20venue\x20aborts\x2039\x20at\x20the\x20claim\x20and\x20pays\x20nobody','via':'query_toolkit'}],'game_moves':[{'move':'Demand\x20complete\x20evidence\x20from\x20both\x20sides\x20before\x20closing;\x20issue\x20structured\x20evidence\x20requests\x20early\x20in\x20SLA','via':'WTS'},{'move':'Allocate\x20fault\x20on\x20evidence\x20weight\x20and\x20publish\x20reasoning\x20concise\x20enough\x20to\x20be\x20auditable','via':'onchain_operations'},{'move':'Recuse/decline\x20cases\x20outside\x20declared\x20case\x20types\x20or\x20capacity\x20rather\x20than\x20rule\x20poorly','via':'ask_user'},{'move':'Never\x20rule\x20outside\x20the\x20arbitration\x27s\x20configured\x20voting/fee/scope\x20rules','taboo':!![]},{'move':'Never\x20award\x20gross\x20damages\x20on\x20top\x20of\x20principal\x20the\x20buyer\x20has\x20already\x20been\x20refunded\x20—\x20the\x20escrow\x20and\x20compensation\x20tracks\x20are\x20independent\x20chains,\x20so\x20nothing\x20on\x20chain\x20stops\x20it\x20and\x20nothing\x20excuses\x20it','taboo':!![]},{'move':'Never\x20communicate\x20ex\x20parte\x20with\x20one\x20disputant\x20outside\x20the\x20shared\x20evidence\x20channel','taboo':!![]}],'path_preferences':['case\x20intake\x20→\x20scope/eligibility\x20check\x20→\x20evidence\x20request\x20→\x20evaluate\x20→\x20rule\x20within\x20SLA','insufficient\x20evidence\x20→\x20structured\x20request,\x20not\x20guesswork'],'feedback_signals':{'win':['rulings\x20accepted\x20without\x20contest','SLA\x20met\x20consistently','selection\x20rate\x20/\x20arbitration\x20score\x20rises'],'lose':['contested\x20or\x20appealed\x20rulings','SLA\x20breaches','parties\x20opt\x20out\x20of\x20this\x20arbitrator\x20after\x20one\x20case']}}};export function getRolePersonality(a){return ROLE_PERSONALITIES[a];}export const ROLE_PERSONALITY_LIST=Object['values'](ROLE_PERSONALITIES);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CONFIRMATION_RULES,resolveOverrideId}from'../knowledge/safety-rules.js';import{isEnabled as
|
|
1
|
+
import{CONFIRMATION_RULES,resolveOverrideId}from'../knowledge/safety-rules.js';import{isEnabled as a419a}from'../config/index.js';import{isPlanPreapproved}from'../goal/plan-approval.js';export function isConfirmGateEnabled(){return a419a('confirm_gate');}const internalErrorCounts={};function logInternalError(a,b){const c=a;internalErrorCounts[c]=(internalErrorCounts[c]??0x0)+0x1;const d=internalErrorCounts[c];console['warn']('[ConfirmGate]\x20internal_error\x20context=\x22'+a+'\x22\x20count='+d+'\x20error='+(b instanceof Error?b['message']:String(b)));}export function getFailMode(a){switch(a){case'irreversible':case'publish':case'amount':return'closed';case'standard':case'none':default:return'open';}}function buildInternalErrorResult(a,b,c){const d=b instanceof Error?b['message']:b!==undefined?String(b):undefined;return{'pass':![],'level':'irreversible','preview':{'level':'irreversible','operation':a,'irreversible':!![],'warnings':[...c?['ConfirmGate\x20rule\x20\x27'+c+'\x27\x20matched\x20but\x20its\x20preview\x20could\x20not\x20be\x20generated.']:['An\x20error\x20occurred\x20while\x20matching\x20confirmation\x20rules.'],...d!==undefined?['Reason:\x20'+d]:[],'The\x20operation\x20was\x20NOT\x20executed.\x20Review\x20the\x20parameters\x20for\x20malformed\x20values\x20(e.g.\x20decimal\x20amounts\x20instead\x20of\x20smallest-unit\x20integers)\x20before\x20confirming.']},'rule_id':'internal_error'};}function emitGuardQuietNotice(a,b,c,d,f){try{const g=f['preview'](a,b,c),h=['[ConfirmGate]\x20guard\x20CREATE\x20proceeded\x20WITHOUT\x20interactive\x20confirmation\x20(confirm_mode:\x20'+d+').','\x20\x20Object:\x20'+String(g['object']??'(unnamed)')+'\x20\x20Network:\x20'+String(g['network']??'?'),...(g['warnings']??[])['map'](i=>'\x20\x20-\x20'+i),'\x20\x20Immutable\x20after\x20creation\x20—\x20changes\x20require\x20a\x20NEW\x20guard\x20+\x20rebind.\x20Verify\x20with\x20analyze_guard_semantics\x20after\x20creation.'];console['warn'](h['join']('\x0a'));}catch(i){console['warn']('[ConfirmGate]\x20guard\x20CREATE\x20proceeded\x20in\x20'+d+'\x20mode\x20(manifest\x20unavailable:\x20'+(i instanceof Error?i['message']:String(i))+')');}}export function confirmGate(a,b,c,d,f,g){if(!isConfirmGateEnabled())return{'pass':!![]};if(c?.['confirmed']===!![])return{'pass':!![]};if(c?.['dry_run']===!![])return{'pass':!![]};let h,i=null;try{h=CONFIRMATION_RULES['find'](n=>{try{return n['when'](a,b,c);}catch(o){logInternalError('rule_when:'+n['id'],o);if(getFailMode(n['level'])==='closed')throw o;return![];}});}catch(n){i=n;}if(i)return logInternalError('rule_search',i),buildInternalErrorResult(a,i);if(!h)return{'pass':!![]};if(getFailMode(h['level'])==='open'&&isPlanPreapproved(c))return{'pass':!![]};const j=resolveOverrideId(h['id'],a),k=j?f?.[j]:undefined;if(k==='auto')return{'pass':!![]};const l=c?.['confirm_mode']==='quiet'||c?.['confirm_mode']==='streamlined'?c['confirm_mode']:'full';if(l!=='full'&&k!=='block'&&getFailMode(h['level'])==='open')return{'pass':!![]};if(h['id']==='guard_create_immutable'&&l!=='full'&&k!=='block')return emitGuardQuietNotice(a,b,c,l,h),{'pass':!![]};if(k!=='block'&&g?.['intent_bypass']!==![]&&h['bypass_on_explicit_intent']&&d&&d['length']>0x0){const o=d['map'](q=>q['toLowerCase']()),p=h['bypass_on_explicit_intent']['some'](q=>o['some'](r=>r['includes'](q['toLowerCase']())));if(p)return{'pass':!![]};}let m;try{m=h['preview'](a,b,c);}catch(q){logInternalError('rule_preview:'+h['id'],q);if(getFailMode(h['level'])==='closed')return buildInternalErrorResult(a,q,h['id']);return{'pass':!![]};}return{'pass':![],'level':h['level'],'preview':m,'rule_id':h['id']};}export function isExplicitlyConfirmed(a){return a?.['confirmed']===!![];}
|