@wowok/agent-mcp 3.2.4 → 3.2.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/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/communication/wts-attestation.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/blueprint-view.d.ts +64 -0
- package/dist/composition/blueprint-view.js +1 -0
- package/dist/composition/compile.d.ts +3 -2
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +17 -0
- package/dist/composition/inflight.js +1 -0
- package/dist/config/config-audit.spec.js +1 -1
- package/dist/customer/account-events.js +1 -1
- package/dist/customer/order-monitor.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/constraint-registry.d.ts +6 -1
- package/dist/extensions/constraint-registry.js +1 -1
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-pack.d.ts +6 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/mode-evaluator.d.ts +3 -2
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/extensions/registry.d.ts +1 -2
- package/dist/extensions/registry.js +1 -1
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/anti-cheat.d.ts +32 -2
- package/dist/graph/onchain/anti-cheat.js +1 -1
- package/dist/graph/onchain/anti-cheat.spec.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/graph/onchain/extract.js +1 -1
- package/dist/graph/onchain/facts.js +1 -1
- package/dist/graph/onchain/graph-policy.spec.js +1 -1
- package/dist/graph/onchain/index.d.ts +2 -2
- package/dist/graph/onchain/index.js +1 -1
- package/dist/graph/onchain/project-relationship.js +1 -1
- package/dist/graph/onchain/table-ledger.spec.js +1 -1
- package/dist/graph/onchain/types.d.ts +3 -0
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/knowledge/arbitration-venue-order.d.ts +25 -0
- package/dist/knowledge/arbitration-venue-order.js +1 -0
- package/dist/knowledge/audit-rules.d.ts +12 -0
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
- package/dist/knowledge/baselines/rules/allocation.json +5 -5
- package/dist/knowledge/baselines/rules/arb.json +1 -1
- package/dist/knowledge/baselines/rules/graph.json +81 -0
- package/dist/knowledge/baselines/rules/guard.json +9 -9
- package/dist/knowledge/baselines/rules/machine.json +5 -5
- package/dist/knowledge/baselines/rules/order.json +1 -1
- package/dist/knowledge/baselines/rules/plan.json +80 -2
- package/dist/knowledge/builtin-templates.d.ts +18 -2
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/discount-threshold.js +1 -1
- package/dist/knowledge/entity-recipient-guard.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-lint.d.ts +1 -0
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-node-gates.d.ts +4 -0
- package/dist/knowledge/guard-node-gates.js +1 -0
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-submission-prompt.d.ts +1 -0
- package/dist/knowledge/guard-submission-prompt.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +2 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +2 -2
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-generalizer.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-topology.d.ts +6 -0
- package/dist/knowledge/machine-topology.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/reputation-rules.d.ts +3 -9
- package/dist/knowledge/reputation-rules.js +1 -1
- package/dist/knowledge/safety-rules.d.ts +10 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +2 -4
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/settlement-semantics.d.ts +1 -0
- package/dist/knowledge/settlement-semantics.js +1 -0
- package/dist/knowledge/template-loader.d.ts +29 -2
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +14 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/template-validation.d.ts +2 -0
- package/dist/knowledge/template-validation.js +1 -0
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +1 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/allocation-advice.js +1 -1
- package/dist/participation/customer-interest.js +1 -1
- package/dist/participation/radar-core.d.ts +6 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/game-theory.d.ts +2 -2
- package/dist/playbooks/service-build/game-theory.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +79 -13
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.d.ts +7 -0
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/mode-actions.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.d.ts +1 -0
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -0
- package/dist/playbooks/service-build/reverse-mapping.d.ts +24 -0
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.d.ts +1 -1
- package/dist/playbooks/service-build/risk-aggregator.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/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/derivation.d.ts +1 -0
- package/dist/review/index.js +1 -1
- package/dist/runtime/instance-registry.d.ts +8 -0
- package/dist/runtime/instance-registry.js +1 -0
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +14 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +109 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +14 -0
- package/dist/schema/call/contact.js +1 -1
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/guard.d.ts +7 -0
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +7 -0
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/payment.js +1 -1
- package/dist/schema/call/permission-handler.js +1 -1
- package/dist/schema/call/progress.d.ts +46 -0
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +22 -8
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +11 -0
- package/dist/schema/goal/planning.d.ts +32 -1
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +40 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/keeper/index.d.ts +13 -0
- package/dist/schema/local/index.d.ts +75 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +17 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +46 -2
- package/dist/schema/operations.js +1 -1
- package/dist/schema/query/bi.d.ts +64 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +94 -0
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.d.ts +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/permission-machine-check.js +1 -1
- package/dist/schema/workspace/index.d.ts +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +45 -0
- package/dist/schemas/benchmark_migration_operation.output.json +24 -4
- package/dist/schemas/benchmark_migration_operation.schema.json +70 -0
- package/dist/schemas/bridge_operation.output.json +45 -0
- package/dist/schemas/goal_operation.schema.json +79 -1
- package/dist/schemas/guard2file.output.json +6 -1
- package/dist/schemas/guard2file.schema.json +9 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +91 -0
- package/dist/schemas/industry_pack_operation.schema.json +19 -1
- package/dist/schemas/keeper_operation.output.json +44 -0
- package/dist/schemas/local_cache_operation.output.json +45 -0
- package/dist/schemas/local_history_operation.output.json +45 -0
- package/dist/schemas/local_info_operation.output.json +45 -0
- package/dist/schemas/local_mark_operation.output.json +45 -0
- package/dist/schemas/machineNode2file.output.json +6 -1
- package/dist/schemas/machineNode2file.schema.json +9 -0
- package/dist/schemas/messenger_operation.output.json +52 -0
- package/dist/schemas/monitor_events.output.json +44 -0
- package/dist/schemas/monitor_subscription.output.json +44 -0
- package/dist/schemas/onchain_events.output.json +44 -0
- package/dist/schemas/onchain_operations.output.json +133 -0
- package/dist/schemas/onchain_operations.schema.json +110 -18
- package/dist/schemas/onchain_operations_arbitration.schema.json +2 -1
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_guard.schema.json +2 -2
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_payment.schema.json +1 -1
- package/dist/schemas/onchain_operations_progress.schema.json +57 -0
- package/dist/schemas/onchain_operations_service.schema.json +44 -10
- package/dist/schemas/onchain_table_data.output.json +81 -13
- package/dist/schemas/onchain_table_data.schema.json +21 -21
- package/dist/schemas/query_toolkit.output.json +218 -9
- package/dist/schemas/query_toolkit.schema.json +50 -26
- package/dist/schemas/wowok_buildin_info.output.json +80 -1
- package/dist/schemas/wowok_buildin_info.schema.json +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +3 -13
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/file-export.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.d.ts +22 -0
- package/dist/tools/handlers/review-chain.js +1 -0
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/config.js +1 -1
- package/dist/tools/registry/evaluation.js +1 -1
- package/dist/tools/registry/files.js +1 -1
- package/dist/tools/registry/identity.js +1 -1
- package/dist/tools/registry/local.js +1 -1
- package/dist/tools/registry/messenger.js +1 -1
- package/dist/tools/registry/monitor.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/runtime-health.d.ts +10 -0
- package/dist/tools/runtime-health.js +1 -0
- package/dist/tools/upgrade-check.d.ts +10 -1
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wip-deploy-assist.js +1 -1
- package/dist/tools/wrap.d.ts +3 -0
- package/dist/tools/wrap.js +1 -1
- package/package.json +2 -2
- package/dist/playbooks/service-build/semantic-graph.d.ts +0 -99
- package/dist/playbooks/service-build/semantic-graph.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,expect,it}from'vitest';import{assessAntiCheat,detectFakeOrders,detectShellMerchant}from'./index.js';function order(a){return{'amount':'0','status':'completed','allocation':null,...a};}describe('anti-cheat\x20pure\x20engine\x20—\x20detectFakeOrders',()=>{it('flags\x20self-buy-sell\x20with\x20order\x20refs\x20and\x20code',()=>{const a=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'a'})]);expect(a)['toHaveLength'](0x1),expect(a[0x0]['code'])['toBe']('self_buy'),expect(a[0x0]['severity'])['toBe']('high'),expect(a[0x0]['refs'])['toEqual'](['o1']);}),it('flags\x20reciprocal\x20buyer/seller\x20loops\x20only\x20with\x20two\x20or\x20more\x20matching\x20orders',()=>{const a=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'b'})]);expect(a['find'](d=>d['code']==='reciprocal_loop'))['toBeUndefined']();const b=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'b','amount':'100','allocation':'al1'}),order({'id':'o2','buyer':'b','seller':'a','amount':'100','allocation':'al2'})]),c=b['find'](d=>d['code']==='reciprocal_loop');expect(c?.['refs'])['toEqual'](['o1','o2']);}),it('treats\x20completed\x20positive-amount\x20orders\x20without\x20Allocation\x20as\x20unclosed,\x20but\x20exempts\x20zero-amount\x20orders',()=>{const a=detectFakeOrders([order({'id':'paid-noalloc','buyer':'a','seller':'b','amount':'100','status':'completed'}),order({'id':'free-noalloc','buyer':'a','seller':'b','amount':'0','status':'completed'}),order({'id':'open-noalloc','buyer':'a','seller':'b','amount':'100','status':'in_progress'})]),b=a['find'](c=>c['code']==='no_allocation');expect(b?.['refs'])['toEqual'](['paid-noalloc']);});}),describe('anti-cheat\x20pure\x20engine\x20—\x20detectShellMerchant',()=>{const a={'object':'s1','arbitrations':[],'compensation_fund':'0','machine':null,'bPublished':!![]};it('stays\x20silent\x20for\x20unpublished\x20services',()=>{expect(detectShellMerchant({...a,'bPublished':![]}))['toEqual']([]);}),it('emits\x20the\x20three\x20shell\x20codes\x20with\x20contract-aligned\x20severities',()=>{const b=detectShellMerchant({...a,'compensation_fund':'9'});expect(b['map'](d=>d['code'])['sort']())['toEqual'](['shell_no_arbitration','shell_funded_no_arbitration','shell_no_machine']['sort']()),expect(b['find'](d=>d['code']==='shell_funded_no_arbitration')?.['severity'])['toBe']('high');const c=detectShellMerchant({...a,'machine':'m1','compensation_fund':'0'});expect(c['find'](d=>d['code']==='shell_no_arbitration')?.['severity'])['toBe']('low');});}),describe('anti-cheat\x20pure\x20engine\x20—\x20assessAntiCheat',()=>{it('composes\x20order/review/service\x20signals\x20plus\x20the\x20static\x20reputation\x20note',()=>{const a=assessAntiCheat({'service':{'object':'s1','arbitrations':[],'compensation_fund':'0','machine':null,'bPublished':!![]},'orders':[order({'id':'o1','buyer':'a','seller':'a'})],'reviews':[]});expect(a['map'](b=>b['code']))['toContain']('self_buy'),expect(a['map'](b=>b['code']))['toContain']('reputation_bound');});});
|
|
1
|
+
import{describe,expect,it}from'vitest';import{assessAntiCheat,detectFakeOrders,detectShellMerchant,detectNewAccountBurst,detectVoteReciprocity,detectTargetFlood,summarizeVoterCredibility}from'./index.js';function order(a){return{'amount':'0','status':'completed','allocation':null,...a};}describe('anti-cheat\x20pure\x20engine\x20—\x20detectFakeOrders',()=>{it('flags\x20self-buy-sell\x20with\x20order\x20refs\x20and\x20code',()=>{const a=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'a'})]);expect(a)['toHaveLength'](0x1),expect(a[0x0]['code'])['toBe']('self_buy'),expect(a[0x0]['severity'])['toBe']('high'),expect(a[0x0]['refs'])['toEqual'](['o1']);}),it('flags\x20reciprocal\x20buyer/seller\x20loops\x20only\x20with\x20two\x20or\x20more\x20matching\x20orders',()=>{const a=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'b'})]);expect(a['find'](d=>d['code']==='reciprocal_loop'))['toBeUndefined']();const b=detectFakeOrders([order({'id':'o1','buyer':'a','seller':'b','amount':'100','allocation':'al1'}),order({'id':'o2','buyer':'b','seller':'a','amount':'100','allocation':'al2'})]),c=b['find'](d=>d['code']==='reciprocal_loop');expect(c?.['refs'])['toEqual'](['o1','o2']);}),it('treats\x20completed\x20positive-amount\x20orders\x20without\x20Allocation\x20as\x20unclosed,\x20but\x20exempts\x20zero-amount\x20orders',()=>{const a=detectFakeOrders([order({'id':'paid-noalloc','buyer':'a','seller':'b','amount':'100','status':'completed'}),order({'id':'free-noalloc','buyer':'a','seller':'b','amount':'0','status':'completed'}),order({'id':'open-noalloc','buyer':'a','seller':'b','amount':'100','status':'in_progress'})]),b=a['find'](c=>c['code']==='no_allocation');expect(b?.['refs'])['toEqual'](['paid-noalloc']);});}),describe('anti-cheat\x20pure\x20engine\x20—\x20detectShellMerchant',()=>{const a={'object':'s1','arbitrations':[],'compensation_fund':'0','machine':null,'bPublished':!![]};it('stays\x20silent\x20for\x20unpublished\x20services',()=>{expect(detectShellMerchant({...a,'bPublished':![]}))['toEqual']([]);}),it('emits\x20the\x20three\x20shell\x20codes\x20with\x20contract-aligned\x20severities',()=>{const b=detectShellMerchant({...a,'compensation_fund':'9'});expect(b['map'](d=>d['code'])['sort']())['toEqual'](['shell_no_arbitration','shell_funded_no_arbitration','shell_no_machine']['sort']()),expect(b['find'](d=>d['code']==='shell_funded_no_arbitration')?.['severity'])['toBe']('high');const c=detectShellMerchant({...a,'machine':'m1','compensation_fund':'0'});expect(c['find'](d=>d['code']==='shell_no_arbitration')?.['severity'])['toBe']('low');});}),describe('anti-cheat\x20pure\x20engine\x20—\x20assessAntiCheat',()=>{it('composes\x20order/review/service\x20signals\x20plus\x20the\x20static\x20reputation\x20note',()=>{const a=assessAntiCheat({'service':{'object':'s1','arbitrations':[],'compensation_fund':'0','machine':null,'bPublished':!![]},'orders':[order({'id':'o1','buyer':'a','seller':'a'})],'reviews':[]});expect(a['map'](b=>b['code']))['toContain']('self_buy'),expect(a['map'](b=>b['code']))['toContain']('reputation_bound');});});const NOW=0x1a3185c5000;function vote(a,b,c=!![]){return{'voter':a,'target':b,'like':c,'dislike':!c&&![],'favor':![]};}function profile(a){return{'ordersOwned':0x0,'ordersAgented':0x0,'objectsFootprint':0x0,...a};}describe('anti-cheat\x20pure\x20engine\x20—\x20voter-side\x20(V-PROF)',()=>{it('AC5\x20flags\x20fresh\x20accounts\x20voting\x20in\x20a\x20burst,\x20not\x20one-vote\x20onboarding',()=>{const a=NOW-0x5*0x5265c00,b=[profile({'address':'n1','registeredAt':a}),profile({'address':'n2','registeredAt':a}),profile({'address':'old','registeredAt':NOW-0x190*0x5265c00})],c=[vote('n1','t1'),vote('n1','t2'),vote('n1','t3'),vote('n2','t1'),vote('old','t1')],d=detectNewAccountBurst(c,b,NOW);expect(d)['toHaveLength'](0x1),expect(d[0x0]['code'])['toBe']('new_account_burst'),expect(d[0x0]['severity'])['toBe']('medium'),expect(d[0x0]['refs'])['toEqual'](['n1']),expect(detectNewAccountBurst([vote('old','t1'),vote('old','t2'),vote('old','t3')],b,NOW))['toEqual']([]);}),it('AC6\x20flags\x20mutual\x20vote\x20pairs\x20once\x20per\x20pair\x20(direction-normalized)',()=>{const a=detectVoteReciprocity([vote('a','b'),vote('b','a'),vote('a','c')]);expect(a)['toHaveLength'](0x1),expect(a[0x0]['code'])['toBe']('vote_reciprocity'),expect(a[0x0]['refs'])['toEqual'](['a','b']),expect(detectVoteReciprocity([vote('a','b'),vote('a','c'),vote('b','c')]))['toEqual']([]);}),it('AC7\x20flags\x20a\x20target\x20flooded\x20by\x20low-credibility\x20voters;\x20unexpanded\x20profiles\x20prove\x20nothing',()=>{const a=NOW-0x2*0x5265c00,b=[profile({'address':'f1','registeredAt':a}),profile({'address':'f2','registeredAt':a}),profile({'address':'z1'}),profile({'address':'busy','ordersOwned':0x4,'objectsFootprint':0x9})],c=[vote('f1','victim'),vote('f2','victim'),vote('z1','victim'),vote('f2','victim'),vote('busy','victim'),vote('busy','victim2')],d=detectTargetFlood(c,b,NOW);expect(d)['toHaveLength'](0x1),expect(d[0x0]['code'])['toBe']('single_target_flood'),expect(d[0x0]['severity'])['toBe']('high'),expect(d[0x0]['refs']?.[0x0])['toBe']('victim');const e=detectTargetFlood([vote('u1','t'),vote('u2','t'),vote('u3','t'),vote('u4','t')],[],NOW);expect(e)['toEqual']([]);}),it('summarizeVoterCredibility\x20projects\x20the\x20per-voter\x20facets',()=>{const c=summarizeVoterCredibility([vote('a','t'),vote('a','t2'),vote('b','t',![])],[profile({'address':'a','registeredAt':NOW-0xa*0x5265c00,'ordersOwned':0x2,'objectsFootprint':0x5})],NOW);expect(c)['toHaveLength'](0x2);const d=c['find'](f=>f['address']==='a');expect(d['accountAgeDays'])['toBe'](0xa),expect(d['ordersCount'])['toBe'](0x2),expect(d['votesCast'])['toBe'](0x2),expect(d['likeRatio'])['toBe'](0x1);const e=c['find'](f=>f['address']==='b');expect(e['accountAgeDays'])['toBeNull'](),expect(e['likeRatio'])['toBe'](0x0);});});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractEventRefs,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType,REVERSE_GROUP_WILDCARD}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{LINKER_RING_LIMIT as a96a}from'./sdk-batch.js';import{wowAddressKind}from'@wowok/wowok';function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function isEoa(a){return wowAddressKind(a)==='user';}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){if(a['read']['kind']!=='table')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['tableEdges']?.['includes'](a['id']);}['allowsEvent'](a,b){if(a['read']['kind']!=='event')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['eventEdges']?.['includes'](a['id']);}['effectiveMaxHops'](a){const b=a['maxHops'],c=this['wl']['schemaHops']?.[a['id']];if(b===undefined)return c;if(c===undefined)return b;return Math['min'](b,c);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set(),m=new Map(),n=new Set();let o=new Set([d]);for(let p=0x0;p<=e['maxDepth'];p++){if(o['size']===0x0)break;if(h['exhausted']['nodes'])break;const q=Date['now'](),r=new Map(),t=(D,E)=>{const F=r['get'](D);if(F)return F;const G=new Map();r['set'](D,G);const H=h['graph']['nodes']['get'](D);if(H&&H['origins']['length']>0x0&&!E['has'](D)){E['add'](D);for(const I of H['origins']){if(!I['via']||!I['from']||E['has'](I['from']))continue;const J=t(I['from'],E);for(const [L,M]of J){if(M<(G['get'](L)??Infinity))G['set'](L,M);}const K=(J['get'](I['via'])??0x0)+0x1;if(K<(G['get'](I['via'])??Infinity))G['set'](I['via'],K);}E['delete'](D);}return G;},u=[...o]['filter'](D=>{const E=h['graph']['nodes']['get'](D);return E['kind']==='object'&&(E['state']==='seed'||E['state']==='stub')&&!i['has'](D);}),v=new Set();if(u['length']>0x0){const D=await a['getObjects'](u);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const E of u){const F=h['graph']['nodes']['get'](E),G=lookupMapLower(D,E);i['add'](E);if(!G){F['state']='error',F['error']='not_found_or_failed',h['graph']['gaps']['push'](E);continue;}F['state']='fetched',F['raw']=G,F['objectType']=String(G['type']??F['objectType']??inferObjectType(E)??''),F['coinType']=extractCoinType(G['type_raw']),v['add'](E);}}const w=[];for(const H of v){const I=h['graph']['nodes']['get'](H);if(!I['objectType']||!I['raw'])continue;for(const J of extractObjectEdges(I['objectType'],I['raw'])){const K=EDGE_SCHEMA_BY_ID['get'](J['schemaId']);if(!K||!f['allows'](K,p))continue;w['push']({'schema':K,'sourceId':H,'refs':J['refs'],'observed':J['refs']['length']});}}const x=[...v]['filter'](L=>{const M=h['graph']['nodes']['get'](L);return EDGE_SCHEMAS['some'](N=>N['source']===M['objectType']&&N['read']['kind']==='table');});for(const L of x){const M=h['graph']['nodes']['get'](L),N=EDGE_SCHEMAS['filter'](P=>P['source']===M['objectType']&&P['read']['kind']==='table'&&f['allowsTable'](P,p)),O=new Map();for(const P of N){const Q=P['read']['rowType'],R=O['get'](Q)??[];R['push'](P),O['set'](Q,R);}for(const [S,T]of O){const U=L+'|'+S;if(l['has'](U))continue;l['add'](U);const V=Math['max'](...T['map'](a0=>e['perKindCaps'][a0['id']]??e['maxFanoutPerNode']));let W,X=![];try{const a0=await a['getTable'](L,{'maxItems':V});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];W=a0['items'],X=a0['truncated'];}catch{h['graph']['gaps']['push'](L+'#'+S);continue;}const Y=new Set(T['map'](a1=>a1['id'])),Z=extractTableRefs(S,L,W)['filter'](a1=>{const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);return a2['read']['kind']==='derived'||Y['has'](a1['schemaId']);});for(const a1 of Z){const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);let a3=a1['refs'];a2['family']==='M'&&M['coinType']&&(a3=a3['map'](a4=>({...a4,'payload':{'coinType':M['coinType'],...a4['payload']}}))),w['push']({'schema':a2,'sourceId':L,'refs':a3,'observed':a3['length']});}X&&h['markTruncation']({'nodeId':L,'schema':T[0x0]['id'],'observed':W['length'],'limit':V,'reason':'table_page'});}}const y=[...o]['filter'](a4=>{const a5=h['graph']['nodes']['get'](a4);return a5['kind']!=='wfnode'&&(a5['kind']==='eoa'||a5['state']==='fetched');}),z=new Map(),A=new Map();for(const a4 of y){const a5=h['graph']['nodes']['get'](a4);for(const a6 of EDGE_SCHEMAS){if(a6['read']['kind']!=='reverse'||!f['allows'](a6,p))continue;if(!sourceMatches(a6['source'],a5))continue;const a7=a6['read']['parent'],a8=a4+'|'+a7;if(j['has'](a8))continue;if(!z['has'](a7))z['set'](a7,[]);z['get'](a7)['push'](a4);const a9=a4+'|'+a7+'|schema',aa=A['get'](a9)??[];aa['push'](a6),A['set'](a9,aa);}}for(const [ab,ac]of z){for(const ae of ac)j['add'](ae+'|'+ab);let ad=new Map();try{ad=await a['getKeyedFields'](ab,ac);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+ab);continue;}for(const af of ac){const ag=A['get'](af+'|'+ab+'|schema')??[],ah=lookupMapLower(ad,af);if(!ah)continue;const ai=extractReverseRefs(ab,ah['data']??ah);for(const aj of ag){const ak=aj['read'];for(const al of ai){if(al['schemaId']!==REVERSE_GROUP_WILDCARD&&al['schemaId']!==aj['id'])continue;let am=al['refs']['map'](an=>an['to']?an:{...an,'to':af});ak['kind']==='reverse'&&ak['filterType']&&(am=am['filter'](an=>inferObjectType(an['to'])===ak['filterType']));if(am['length']===0x0)continue;w['push']({'schema':aj,'sourceId':af,'refs':am,'observed':am['length']});}}}}for(const an of EDGE_SCHEMAS){const ao=an['read'];if(ao['kind']!=='event'||!f['allowsEvent'](an,p))continue;const ap=[...o]['filter'](ar=>{if(n['has'](ar+'|'+an['id']))return![];return sourceMatches(an['source'],h['graph']['nodes']['get'](ar));});if(ap['length']===0x0)continue;let aq=m['get'](ao['eventType']);if(!aq){aq={'events':[],'truncated':![],'failed':![]};try{const ar=await a['getEvents'](ao['eventType'],{'maxPages':e['maxEventPages']});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];aq['events']=ar['events'],aq['truncated']=ar['truncated'],ar['truncated']&&ar['events']['length']===0x0&&(aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']));}catch{aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']);}m['set'](ao['eventType'],aq);}if(aq['failed']){for(const as of ap)n['add'](as+'|'+an['id']);continue;}if(aq['truncated']){h['exhausted']['eventPages']=!![];for(const at of ap){h['markTruncation']({'nodeId':at,'schema':an['id'],'observed':aq['events']['length'],'limit':e['maxEventPages'],'reason':'event_pages'});}}for(const au of ap){n['add'](au+'|'+an['id']);const av=extractEventRefs(ao,au,aq['events']);if(av['length']===0x0)continue;w['push']({'schema':an,'sourceId':au,'refs':av,'observed':av['length'],'truncated':aq['truncated']});}}const B=new Set(),C=new Map();for(const aw of w){const ax=e['perKindCaps'][aw['schema']['id']]??e['maxFanoutPerNode'],ay=C['get'](aw['sourceId'])??0x0,az=Math['max'](0x0,e['maxFanoutPerNode']-ay),aA=Math['min'](ax,az),aB=aw['refs']['slice'](0x0,aA);aw['refs']['length']>aA&&h['markTruncation']({'nodeId':aw['sourceId'],'schema':aw['schema']['id'],'observed':aw['refs']['length'],'limit':a96a,'reason':'fanout'});const aC=new Map();for(const aD of aB){const aE=aD['from']??aw['sourceId'],aF=isWfNodeId(aD['to'])?p:p+0x1,aG=h['graph']['nodes']['has'](aD['to']),aH=f['effectiveMaxHops'](aw['schema']);if(aH!==undefined){const aJ=(t(aE,new Set())['get'](aw['schema']['id'])??0x0)+0x1;if(aJ>aH&&!aG){aC['set'](aE,(aC['get'](aE)??0x0)+0x1);continue;}}if(aF>e['maxDepth']&&!aG){h['exhausted']['depth']=!![];continue;}const aI=h['addNode'](aD['to'],Math['min'](aF,e['maxDepth']),{'schema':aw['schema']['id'],'from':aE});if(!aI)break;h['addEdge'](aw['schema'],aE,aD,q,aw['truncated']===!![]||aw['refs']['length']>aA),C['set'](aw['sourceId'],ay+0x1);if(!isWfNodeId(aD['to'])&&aF<=e['maxDepth'])B['add'](aD['to']);}for(const [aK,aL]of aC){h['markTruncation']({'nodeId':aK,'schema':aw['schema']['id'],'observed':aL,'limit':f['effectiveMaxHops'](aw['schema'])??0x0,'reason':'schema_hops'});}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}o=B;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
|
|
1
|
+
import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractEventRefs,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType,REVERSE_GROUP_WILDCARD}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{LINKER_RING_LIMIT as a98a}from'./sdk-batch.js';import{wowAddressKind}from'@wowok/wowok';function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function isEoa(a){return wowAddressKind(a)==='user';}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){if(a['read']['kind']!=='table')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['tableEdges']?.['includes'](a['id']);}['allowsEvent'](a,b){if(a['read']['kind']!=='event')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['eventEdges']?.['includes'](a['id']);}['effectiveMaxHops'](a){const b=a['maxHops'],c=this['wl']['schemaHops']?.[a['id']];if(b===undefined)return c;if(c===undefined)return b;return Math['min'](b,c);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set(),m=new Map(),n=new Set();let o=new Set([d]);for(let p=0x0;p<=e['maxDepth'];p++){if(o['size']===0x0)break;if(h['exhausted']['nodes'])break;const q=Date['now'](),r=new Map(),t=(D,E)=>{const F=r['get'](D);if(F)return F;const G=new Map();r['set'](D,G);const H=h['graph']['nodes']['get'](D);if(H&&H['origins']['length']>0x0&&!E['has'](D)){E['add'](D);for(const I of H['origins']){if(!I['via']||!I['from']||E['has'](I['from']))continue;const J=t(I['from'],E);for(const [L,M]of J){if(M<(G['get'](L)??Infinity))G['set'](L,M);}const K=(J['get'](I['via'])??0x0)+0x1;if(K<(G['get'](I['via'])??Infinity))G['set'](I['via'],K);}E['delete'](D);}return G;},u=[...o]['filter'](D=>{const E=h['graph']['nodes']['get'](D);return E['kind']==='object'&&(E['state']==='seed'||E['state']==='stub')&&!i['has'](D);}),v=new Set();if(u['length']>0x0){const D=await a['getObjects'](u);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const E of u){const F=h['graph']['nodes']['get'](E),G=lookupMapLower(D,E);i['add'](E);if(!G){F['state']='error',F['error']='not_found_or_failed',h['graph']['gaps']['push'](E);continue;}F['state']='fetched',F['raw']=G,F['objectType']=String(G['type']??F['objectType']??inferObjectType(E)??''),F['coinType']=extractCoinType(G['type_raw']),v['add'](E);}}const w=[];for(const H of v){const I=h['graph']['nodes']['get'](H);if(!I['objectType']||!I['raw'])continue;for(const J of extractObjectEdges(I['objectType'],I['raw'])){const K=EDGE_SCHEMA_BY_ID['get'](J['schemaId']);if(!K||!f['allows'](K,p))continue;w['push']({'schema':K,'sourceId':H,'refs':J['refs'],'observed':J['refs']['length']});}}const x=[...v]['filter'](L=>{const M=h['graph']['nodes']['get'](L);return EDGE_SCHEMAS['some'](N=>N['source']===M['objectType']&&N['read']['kind']==='table');});for(const L of x){const M=h['graph']['nodes']['get'](L),N=EDGE_SCHEMAS['filter'](P=>P['source']===M['objectType']&&P['read']['kind']==='table'&&f['allowsTable'](P,p)),O=new Map();for(const P of N){const Q=P['read']['rowType'],R=O['get'](Q)??[];R['push'](P),O['set'](Q,R);}for(const [S,T]of O){const U=L+'|'+S;if(l['has'](U))continue;l['add'](U);const V=Math['max'](...T['map'](a0=>e['perKindCaps'][a0['id']]??e['maxFanoutPerNode']));let W,X=![];try{const a0=await a['getTable'](L,{'maxItems':V});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];W=a0['items'],X=a0['truncated'];}catch{h['graph']['gaps']['push'](L+'#'+S);continue;}const Y=new Set(T['map'](a1=>a1['id'])),Z=extractTableRefs(S,L,W)['filter'](a1=>{const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);return a2['read']['kind']==='derived'||Y['has'](a1['schemaId']);});for(const a1 of Z){const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);let a3=a1['refs'];a2['family']==='M'&&M['coinType']&&(a3=a3['map'](a4=>({...a4,'payload':{'coinType':M['coinType'],...a4['payload']}}))),w['push']({'schema':a2,'sourceId':L,'refs':a3,'observed':a3['length']});}X&&h['markTruncation']({'nodeId':L,'schema':T[0x0]['id'],'observed':W['length'],'limit':V,'reason':'table_page'});}}const y=[...o]['filter'](a4=>{const a5=h['graph']['nodes']['get'](a4);return a5['kind']!=='wfnode'&&(a5['kind']==='eoa'||a5['state']==='fetched');}),z=new Map(),A=new Map();for(const a4 of y){const a5=h['graph']['nodes']['get'](a4);for(const a6 of EDGE_SCHEMAS){if(a6['read']['kind']!=='reverse'||!f['allows'](a6,p))continue;if(!sourceMatches(a6['source'],a5))continue;const a7=a6['read']['parent'],a8=a4+'|'+a7;if(j['has'](a8))continue;if(!z['has'](a7))z['set'](a7,[]);z['get'](a7)['push'](a4);const a9=a4+'|'+a7+'|schema',aa=A['get'](a9)??[];aa['push'](a6),A['set'](a9,aa);}}for(const [ab,ac]of z){for(const ae of ac)j['add'](ae+'|'+ab);let ad=new Map();try{ad=await a['getKeyedFields'](ab,ac);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+ab);continue;}for(const af of ac){const ag=A['get'](af+'|'+ab+'|schema')??[],ah=lookupMapLower(ad,af);if(!ah)continue;const ai=extractReverseRefs(ab,ah['data']??ah);for(const aj of ag){const ak=aj['read'];for(const al of ai){if(al['schemaId']!==REVERSE_GROUP_WILDCARD&&al['schemaId']!==aj['id'])continue;let am=al['refs']['map'](an=>an['to']?an:{...an,'to':af});ak['kind']==='reverse'&&ak['filterType']&&(am=am['filter'](an=>inferObjectType(an['to'])===ak['filterType']));if(am['length']===0x0)continue;w['push']({'schema':aj,'sourceId':af,'refs':am,'observed':am['length']});}}}}for(const an of EDGE_SCHEMAS){const ao=an['read'];if(ao['kind']!=='event'||!f['allowsEvent'](an,p))continue;const ap=[...o]['filter'](ar=>{if(n['has'](ar+'|'+an['id']))return![];return sourceMatches(an['source'],h['graph']['nodes']['get'](ar));});if(ap['length']===0x0)continue;let aq=m['get'](ao['eventType']);if(!aq){aq={'events':[],'truncated':![],'failed':![]};try{const ar=await a['getEvents'](ao['eventType'],{'maxPages':e['maxEventPages']});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];aq['events']=ar['events'],aq['truncated']=ar['truncated'],ar['truncated']&&ar['events']['length']===0x0&&(aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']));}catch{aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']);}m['set'](ao['eventType'],aq);}if(aq['failed']){for(const as of ap)n['add'](as+'|'+an['id']);continue;}if(aq['truncated']){h['exhausted']['eventPages']=!![];for(const at of ap){h['markTruncation']({'nodeId':at,'schema':an['id'],'observed':aq['events']['length'],'limit':e['maxEventPages'],'reason':'event_pages'});}}for(const au of ap){n['add'](au+'|'+an['id']);const av=extractEventRefs(ao,au,aq['events']);if(av['length']===0x0)continue;w['push']({'schema':an,'sourceId':au,'refs':av,'observed':av['length'],'truncated':aq['truncated']});}}const B=new Set(),C=new Map();for(const aw of w){const ax=e['perKindCaps'][aw['schema']['id']]??e['maxFanoutPerNode'],ay=C['get'](aw['sourceId'])??0x0,az=Math['max'](0x0,e['maxFanoutPerNode']-ay),aA=Math['min'](ax,az),aB=aw['refs']['slice'](0x0,aA);aw['refs']['length']>aA&&h['markTruncation']({'nodeId':aw['sourceId'],'schema':aw['schema']['id'],'observed':aw['refs']['length'],'limit':a98a,'reason':'fanout'});const aC=new Map();for(const aD of aB){const aE=aD['from']??aw['sourceId'],aF=isWfNodeId(aD['to'])?p:p+0x1,aG=h['graph']['nodes']['has'](aD['to']),aH=f['effectiveMaxHops'](aw['schema']);if(aH!==undefined){const aJ=(t(aE,new Set())['get'](aw['schema']['id'])??0x0)+0x1;if(aJ>aH&&!aG){aC['set'](aE,(aC['get'](aE)??0x0)+0x1);continue;}}if(aF>e['maxDepth']&&!aG){h['exhausted']['depth']=!![];continue;}const aI=h['addNode'](aD['to'],Math['min'](aF,e['maxDepth']),{'schema':aw['schema']['id'],'from':aE});if(!aI)break;h['addEdge'](aw['schema'],aE,aD,q,aw['truncated']===!![]||aw['refs']['length']>aA),C['set'](aw['sourceId'],ay+0x1);if(!isWfNodeId(aD['to'])&&aF<=e['maxDepth'])B['add'](aD['to']);}for(const [aK,aL]of aC){h['markTruncation']({'nodeId':aK,'schema':aw['schema']['id'],'observed':aL,'limit':f['effectiveMaxHops'](aw['schema'])??0x0,'reason':'schema_hops'});}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}o=B;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{applyExposureGate as
|
|
1
|
+
import{applyExposureGate as a101a}from'../../config/exposure.js';export{resolveViability,factRef,parseFactRef}from'../../config/exposure.js';export const EXPOSURE_ROLES={'buyer':'buyer','merchant':'merchant','supplier':'supplier','collaborator':'collaborator','arbitrator':'arbitrator','system':'system','neutral':'neutral'};export function applyExposureGate(a,b){return a101a(a,b);}export function lossParty(a,b){return{'role':a,'basis':b};}export function gainPath(a,b,c,d){return{'role':a,'path':b,'viability':c,'gate':d};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{WOW_SINGLETON_IDS,objectTypeFromAddress}from'@wowok/wowok';import{EDGE_SCHEMAS}from'./edge-schema.js';const ADDR_RE=/^0x[0-9a-f]{64}$/;export function normAddr(a){if(typeof a!=='string')return undefined;const b=a['trim']()['toLowerCase']();return ADDR_RE['test'](b)?b:undefined;}export function rootOf(a){const b=a;return b?.['data']??b??{};}function dig(a,b){return b['split']('.')['reduce']((c,d)=>{if(c==null)return undefined;return c[d];},a);}function asArray(a){if(Array['isArray'](a))return a;if(a==null)return[];return[a];}function addrsOf(b,c){if(Array['isArray'](b))return b['flatMap'](d=>addrsOf(d,c));if(typeof b==='string'){const d=normAddr(b);return d?[d]:[];}if(b&&typeof b==='object'){const e=b,f=normAddr(e[c]??e['guard']??e['address']??e['who']);if(f)return[f];const g=e[c];if(g!==b&&Array['isArray'](g))return addrsOf(g,c);}return[];}export function walkDeepAddrs(b,c,d){let e=[{'rows':[],'value':b}];for(const g of c){const h=[];for(const i of e){for(const j of asArray(i['value'])){if(!j||typeof j!=='object')continue;const k=j,l=k[g];if(l==null)continue;for(const m of asArray(l)){if(m==null)continue;const n=typeof m==='object'?[...i['rows'],m]:i['rows'];h['push']({'rows':n,'value':m});}}}e=h;if(e['length']===0x0)return[];}const f=[];for(const {rows:p,value:q}of e){for(const r of asArray(q)){if(r==null)continue;if(typeof r==='string'){const t=normAddr(r);if(t)f['push']({'addr':t,'leaf':{},'rows':p});continue;}if(typeof r!=='object')continue;const s=r;for(const u of addrsOf(s,d||'guard')){f['push']({'addr':u,'leaf':s,'rows':p});}}}return f;}function leafContext(a){return Object['assign']({},...a['rows'],a['leaf']);}export function wfNodeId(a,b){return(normAddr(a)??a['toLowerCase']())+'::node::'+b;}function strAmt(a){if(a==null)return undefined;if(typeof a==='bigint')return a['toString']();const b=String(a);return b===''?undefined:b;}function numOrNull(a){if(a===null)return null;if(typeof a==='number'&&Number['isFinite'](a))return a;if(a!=null&&typeof a!=='object'){const b=Number(a);if(Number['isFinite'](b))return b;}return undefined;}function addrOrNull(a){if(a===null)return null;return normAddr(a)??undefined;}function num(a){if(typeof a==='number'&&Number['isFinite'](a))return a;if(a==null||typeof a==='object')return undefined;const b=Number(a);return Number['isFinite'](b)?b:undefined;}function extractFieldEdges(b,c,d){const e=rootOf(c),f=[];for(const g of EDGE_SCHEMAS){if(g['source']!==b)continue;const i=g['read'];if(i['kind']==='reverse'||i['kind']==='table'||i['kind']==='derived')continue;let j=[];switch(i['kind']){case'field':{const k=addrsOf(dig(e,i['path']),'guard')[0x0];if(k)j=[{'to':k}];break;}case'fields':{j=addrsOf(dig(e,i['path']),'guard')['map'](l=>({'to':l}));break;}case'structFields':{j=walkDeepAddrs(e,[i['path']],i['field'])['map'](l=>({'to':l['addr'],'payload':payloadFor(g['id'],leafContext(l),d)}));break;}case'deep':{if(g['id']==='progress.named_operator'){const l=asArray(e['namedOperator']);for(const m of l){const n=m??{};for(const p of asArray(n['operators'])){const q=normAddr(p);if(q)j['push']({'to':q,'key':String(n['name']??''),'payload':{'namedOperator':n['name']!=null?String(n['name']):null}});}}}else j=walkDeepAddrs(e,i['segments'],i['field'])['map'](r=>({'to':r['addr'],'payload':payloadFor(g['id'],leafContext(r),d)}));break;}}g['family']==='M'&&d&&(j=j['map'](s=>({...s,'payload':{'coinType':d,...s['payload']}})));if(j['length']>0x0)f['push']({'schemaId':g['id'],'refs':j});}return f;}function payloadFor(a,b,c){switch(a){case'payment.recipient':{const d=strAmt(b['amount']);return d!=null?{'amount':d,'coinType':c}:undefined;}case'arb.voter':return{'weight':Number(b['weight']??0x0)||undefined};case'contact.im':return{'imStatus':b['status']!=null?String(b['status']):undefined,'joinTime':typeof b['join_time']==='number'?b['join_time']:Number(b['join_time'])||undefined,'imDescription':b['description']!=null?String(b['description']):undefined};case'allocation.guard':case'service.order_allocator_guard':return b['mode']!=null?{'mode':clampMode(Number(b['mode']))}:undefined;case'treasury.deposit_guard':case'treasury.withdraw_guard':return{'identifier':numOrNull(b['identifier']),'storeFromId':numOrNull(b['store_from_id'])};default:return undefined;}}function clampMode(a){return a===0x1||a===0x2||a===0x3?a:0x0;}export const REVERSE_GROUP_WILDCARD='*';export function extractReverseRefs(a,b){const c=b??{};if(a===WOW_SINGLETON_IDS['registrar']){const f=[];for(const g of asArray(c['votes'])){const h=g??{},i=normAddr(h['who']);if(!i)continue;f['push']({'to':i,'payload':{'voteBits':(h['like']?0x2:0x0)|(h['dislike']?0x4:0x0)|(h['favor']?0x8:0x0),'voteLike':!!h['like'],'voteDislike':!!h['dislike'],'voteFavor':!!h['favor']}});}return f['length']?[{'schemaId':'target.vote','refs':f}]:[];}if(a===WOW_SINGLETON_IDS['entity'])return extractEntityProfile(c);const e=[];for(const j of asArray(c['items'])){const k=j??{},l=normAddr(k['permission']??k['contact']??k['order']??k['who']);if(!l)continue;const m=k['role']!=null?Number(k['role']):undefined;e['push']({'to':l,'payload':m!=null&&Number['isFinite'](m)?{'roleBits':m}:undefined});}return e['length']?[{'schemaId':REVERSE_GROUP_WILDCARD,'refs':e}]:[];}function extractEntityProfile(a){const b=[],c=typeof a['description']==='string'?a['description']:'',e=num(a['time']),f=[];for(const i of asArray(a['records'])){const j=i??{};if(typeof j['name']!=='string')continue;const k={'name':j['name']};if(j['value_type']!==undefined)k['valueType']=j['value_type'];else{if(j['typed_value']!==undefined)k['value']=j['typed_value'];}if(j['value']!==undefined)k['value']=j['value'];f['push'](k);}b['push']({'schemaId':'entity.profile','refs':[{'to':'','payload':{...c?{'description':c}:{},...e!=null?{'registeredAt':e}:{},...f['length']?{'profileRecords':f}:{}}}]});const g=normAddr(a['referrer']);g&&b['push']({'schemaId':'entity.referrer','refs':[{'to':g}]});const h=normAddr(a['resource']??a['mark_object']);return h&&b['push']({'schemaId':'entity.resource','refs':[{'to':h}]}),b;}export function extractTableRefs(a,b,c){switch(a){case'PermissionPerm':return extractPermissionTable(c);case'DemandPresenter':return extractPresenterTable(c);case'MachineNode':return extractMachineTable(b,c);case'TreasuryRecord':return extractTreasuryLedger(c);case'RewardClaimRecord':return extractRewardLedger(c);case'RepositoryData':return extractRepositoryDataTable(c);default:return[];}}export function extractEventRefs(a,b,c){const d=[];for(const e of c){const f=e??{},g=f['parsedJson']??{};if(a['matchField']!==undefined){if(normAddr(g[a['matchField']])!==b)continue;}else{if(a['matchSender']){if(normAddr(f['sender'])!==b)continue;}}const h=normAddr(g[a['targetField']]);if(!h)continue;const i=typeof f['timestampMs']==='string'?Number(f['timestampMs']):f['timestampMs'];d['push']({'to':h,'payload':{...g,...Number['isFinite'](i)?{'time':i}:{}}});}return d;}function extractPermissionTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['address']),g=Array['isArray'](e['perm'])?e['perm']['map'](Number):[];if(f)b['push']({'to':f,'payload':{'permIndices':g}});}return b['length']?[{'schemaId':'permission.entity','refs':b}]:[];}function extractPresenterTable(a){const b=[],c=[];for(const f of a){const g=rootOf(f['object']),h=normAddr(g['address']);if(h){b['push']({'to':h,'payload':{'service':normAddr(g['service'])??undefined,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined,'recommend':g['recommend']!=null?String(g['recommend']):undefined}});const i=normAddr(g['service']);i&&c['push']({'to':i,'key':h,'payload':{'presenter':h,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined}});}}const e=[];if(b['length'])e['push']({'schemaId':'demand.presenter','refs':b});if(c['length'])e['push']({'schemaId':'demand.presenter_service','refs':c});return e;}function extractTreasuryLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']);b['push']({'to':e,'payload':{'op':num(f['op']),'signer':normAddr(f['signer'])??undefined,'amount':strAmt(f['amount']),'time':num(f['time']),'externalGuard':addrOrNull(f['external_guard']),'storeFromId':addrOrNull(f['store_from_id'])}});}return b['length']?[{'schemaId':'treasury.record','refs':b}]:[];}function extractRewardLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']),g=(Array['isArray'](f['amount'])?f['amount']:[])['flatMap'](h=>{const i=h??{},j=normAddr(i['guard']);if(!j)return[];return[{'guard':j,'amount':strAmt(i['amount']),'time':num(i['time']),'storeFromId':addrOrNull(i['store_from_id'])}];});b['push']({'to':e,'payload':{'amount':strAmt(f['total']),'claims':g}});}return b['length']?[{'schemaId':'reward.claim','refs':b}]:[];}function extractRepositoryDataTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['id']);if(!f)continue;const g=e['key']!=null?String(e['key']):e['name']!=null?String(e['name']):undefined;b['push']({'to':f,'payload':{'dataName':g}});}return b['length']?[{'schemaId':'repository.data_about','refs':b}]:[];}function extractMachineTable(a,b){const c=[],e=[],g=[],h=new Set(),i=k=>{const l=String(k??'')['trim']();if(!l)return undefined;const m=wfNodeId(a,l);return!h['has'](m)&&(h['add'](m),c['push']({'to':m,'key':l,'payload':{'node':l}})),m;};for(const k of b){const l=rootOf(k['object']),m=String(l['name']??''),n=i(m);if(!n)continue;for(const o of asArray(l['value'])){const q=o??{},r=String(q['prev_node']??'')['trim']();if(r)i(r);const s=r?wfNodeId(a,r):n,t=Number(q['threshold']??0x0);for(const u of asArray(q['forwards'])){const v=u??{},w=String(v['name']??''),x=addrsOf(v['guard'],'guard')[0x0];s&&e['push']({'from':s,'to':n,'key':w||undefined,'payload':{'forward':w||undefined,'prevNode':r,'node':m,'threshold':t||undefined,'guard':x??undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}}),x&&g['push']({'to':x,'key':w||undefined,'payload':{'forward':w||undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}});}}}const j=[];if(c['length'])j['push']({'schemaId':'machine.node','refs':c});if(e['length'])j['push']({'schemaId':'wf.transition','refs':e});if(g['length'])j['push']({'schemaId':'wf.forward_guard','refs':g});return j;}export function inferObjectType(a){return objectTypeFromAddress(a)??undefined;}export function extractCoinType(a){if(typeof a!=='string'||!a['includes']('<'))return undefined;const b=a['slice'](a['indexOf']('<')+0x1,a['lastIndexOf']('>'));return b['trim']()||undefined;}export function extractObjectEdges(a,b){return extractFieldEdges(a,b,extractCoinType(b['type_raw']));}export function schemaById(a){return EDGE_SCHEMAS['find'](b=>b['id']===a);}
|
|
1
|
+
import{WOW_SINGLETON_IDS,objectTypeFromAddress}from'@wowok/wowok';import{EDGE_SCHEMAS}from'./edge-schema.js';const ADDR_RE=/^0x[0-9a-f]{64}$/;export function normAddr(a){if(typeof a!=='string')return undefined;const b=a['trim']()['toLowerCase']();return ADDR_RE['test'](b)?b:undefined;}export function rootOf(a){const b=a;return b?.['data']??b??{};}function dig(a,b){return b['split']('.')['reduce']((c,d)=>{if(c==null)return undefined;return c[d];},a);}function asArray(a){if(Array['isArray'](a))return a;if(a==null)return[];return[a];}function addrsOf(b,c){if(Array['isArray'](b))return b['flatMap'](d=>addrsOf(d,c));if(typeof b==='string'){const d=normAddr(b);return d?[d]:[];}if(b&&typeof b==='object'){const e=b,f=normAddr(e[c]??e['guard']??e['address']??e['who']);if(f)return[f];const g=e[c];if(g!==b&&Array['isArray'](g))return addrsOf(g,c);}return[];}export function walkDeepAddrs(b,c,d){let e=[{'rows':[],'value':b}];for(const g of c){const h=[];for(const i of e){for(const j of asArray(i['value'])){if(!j||typeof j!=='object')continue;const k=j,l=k[g];if(l==null)continue;for(const m of asArray(l)){if(m==null)continue;const n=typeof m==='object'?[...i['rows'],m]:i['rows'];h['push']({'rows':n,'value':m});}}}e=h;if(e['length']===0x0)return[];}const f=[];for(const {rows:p,value:q}of e){for(const r of asArray(q)){if(r==null)continue;if(typeof r==='string'){const t=normAddr(r);if(t)f['push']({'addr':t,'leaf':{},'rows':p});continue;}if(typeof r!=='object')continue;const s=r;for(const u of addrsOf(s,d||'guard')){f['push']({'addr':u,'leaf':s,'rows':p});}}}return f;}function leafContext(a){return Object['assign']({},...a['rows'],a['leaf']);}export function wfNodeId(a,b){return(normAddr(a)??a['toLowerCase']())+'::node::'+b;}function strAmt(a){if(a==null)return undefined;if(typeof a==='bigint')return a['toString']();const b=String(a);return b===''?undefined:b;}function numOrNull(a){if(a===null)return null;if(typeof a==='number'&&Number['isFinite'](a))return a;if(a!=null&&typeof a!=='object'){const b=Number(a);if(Number['isFinite'](b))return b;}return undefined;}function addrOrNull(a){if(a===null)return null;return normAddr(a)??undefined;}function num(a){if(typeof a==='number'&&Number['isFinite'](a))return a;if(a==null||typeof a==='object')return undefined;const b=Number(a);return Number['isFinite'](b)?b:undefined;}function extractFieldEdges(b,c,d){const e=rootOf(c),f=[];for(const g of EDGE_SCHEMAS){if(g['source']!==b)continue;const i=g['read'];if(i['kind']==='reverse'||i['kind']==='table'||i['kind']==='derived')continue;let j=[];switch(i['kind']){case'field':{const k=addrsOf(dig(e,i['path']),'guard')[0x0];if(k)j=[{'to':k}];break;}case'fields':{j=addrsOf(dig(e,i['path']),'guard')['map'](l=>({'to':l}));break;}case'structFields':{j=walkDeepAddrs(e,[i['path']],i['field'])['map'](l=>({'to':l['addr'],'payload':payloadFor(g['id'],leafContext(l),d)}));break;}case'deep':{if(g['id']==='progress.named_operator'){const l=asArray(e['namedOperator']);for(const m of l){const n=m??{};for(const p of asArray(n['operators'])){const q=normAddr(p);if(q)j['push']({'to':q,'key':String(n['name']??''),'payload':{'namedOperator':n['name']!=null?String(n['name']):null}});}}}else j=walkDeepAddrs(e,i['segments'],i['field'])['map'](r=>({'to':r['addr'],'payload':payloadFor(g['id'],leafContext(r),d)}));break;}}g['family']==='M'&&d&&(j=j['map'](s=>({...s,'payload':{'coinType':d,...s['payload']}})));if(j['length']>0x0)f['push']({'schemaId':g['id'],'refs':j});}return f;}function payloadFor(a,b,c){switch(a){case'payment.recipient':{const d=strAmt(b['amount']);return d!=null?{'amount':d,'coinType':c}:undefined;}case'arb.voter':return{'weight':Number(b['weight']??0x0)||undefined};case'contact.im':return{'imStatus':b['status']!=null?String(b['status']):undefined,'joinTime':typeof b['join_time']==='number'?b['join_time']:Number(b['join_time'])||undefined,'imDescription':b['description']!=null?String(b['description']):undefined};case'allocation.guard':case'service.order_allocator_guard':return b['mode']!=null?{'mode':clampMode(Number(b['mode']))}:undefined;case'treasury.deposit_guard':case'treasury.withdraw_guard':return{'identifier':numOrNull(b['identifier']),'storeFromId':numOrNull(b['store_from_id'])};default:return undefined;}}function clampMode(a){return a===0x1||a===0x2||a===0x3?a:0x0;}export const REVERSE_GROUP_WILDCARD='*';export function extractReverseRefs(a,b){const c=b??{};if(a===WOW_SINGLETON_IDS['registrar']){const f=[];for(const g of asArray(c['votes'])){const h=g??{},i=normAddr(h['who']);if(!i)continue;f['push']({'to':i,'payload':{'voteBits':(h['like']?0x2:0x0)|(h['dislike']?0x4:0x0)|(h['favor']?0x8:0x0),'voteLike':!!h['like'],'voteDislike':!!h['dislike'],'voteFavor':!!h['favor']}});}return f['length']?[{'schemaId':'target.vote','refs':f}]:[];}if(a===WOW_SINGLETON_IDS['entity'])return extractEntityProfile(c);const e=[];for(const j of asArray(c['items'])){const k=j??{},l=normAddr(k['permission']??k['contact']??k['order']??k['who']);if(!l)continue;const m=k['role']!=null?Number(k['role']):undefined;e['push']({'to':l,'payload':m!=null&&Number['isFinite'](m)?{'roleBits':m}:undefined});}return e['length']?[{'schemaId':REVERSE_GROUP_WILDCARD,'refs':e}]:[];}function extractEntityProfile(a){const b=[],c=typeof a['description']==='string'?a['description']:'',e=num(a['time']),f=[];for(const i of asArray(a['records'])){const j=i??{};if(typeof j['name']!=='string')continue;const k={'name':j['name']};if(j['value_type']!==undefined)k['valueType']=j['value_type'];else{if(j['typed_value']!==undefined)k['value']=j['typed_value'];}if(j['value']!==undefined)k['value']=j['value'];f['push'](k);}b['push']({'schemaId':'entity.profile','refs':[{'to':'','payload':{...c?{'description':c}:{},...e!=null?{'registeredAt':e}:{},...f['length']?{'profileRecords':f}:{}}}]});const g=normAddr(a['referrer']);g&&b['push']({'schemaId':'entity.referrer','refs':[{'to':g}]});const h=normAddr(a['resource']??a['mark_object']);return h&&b['push']({'schemaId':'entity.resource','refs':[{'to':h}]}),b;}export function extractTableRefs(a,b,c){switch(a){case'PermissionPerm':return extractPermissionTable(c);case'DemandPresenter':return extractPresenterTable(c);case'MachineNode':return extractMachineTable(b,c);case'TreasuryRecord':return extractTreasuryLedger(c);case'RewardClaimRecord':return extractRewardLedger(c);case'RepositoryData':return extractRepositoryDataTable(c);default:return[];}}export function extractEventRefs(a,b,c){const d=[];for(const e of c){const f=e??{},g=f['parsedJson']??{};if(a['matchField']!==undefined){if(normAddr(g[a['matchField']])!==b)continue;}else{if(a['matchSender']){if(normAddr(f['sender'])!==b)continue;}}const h=normAddr(g[a['targetField']]);if(!h)continue;const i=typeof f['timestampMs']==='string'?Number(f['timestampMs']):f['timestampMs'];d['push']({'to':h,'payload':{...g,...Number['isFinite'](i)?{'time':i}:{}}});}return d;}function extractPermissionTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['address']),g=Array['isArray'](e['perm'])?e['perm']['map'](Number):[];if(f)b['push']({'to':f,'payload':{'permIndices':g}});}return b['length']?[{'schemaId':'permission.entity','refs':b}]:[];}function extractPresenterTable(a){const b=[],c=[];for(const f of a){const g=rootOf(f['object']),h=normAddr(g['address']);if(h){b['push']({'to':h,'payload':{'service':normAddr(g['service'])??undefined,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined,'recommend':g['recommend']!=null?String(g['recommend']):undefined,'time':g['update_time']!=null?Number(g['update_time']):undefined,'feedback':g['feedback']!=null?String(g['feedback']):undefined,'feedbackTime':g['feedback_time']!=null?Number(g['feedback_time']):undefined}});const i=normAddr(g['service']);i&&c['push']({'to':i,'key':h,'payload':{'presenter':h,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined,'time':g['update_time']!=null?Number(g['update_time']):undefined,'feedbackTime':g['feedback_time']!=null?Number(g['feedback_time']):undefined}});}}const e=[];if(b['length'])e['push']({'schemaId':'demand.presenter','refs':b});if(c['length'])e['push']({'schemaId':'demand.presenter_service','refs':c});return e;}function extractTreasuryLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']);b['push']({'to':e,'payload':{'op':num(f['op']),'signer':normAddr(f['signer'])??undefined,'amount':strAmt(f['amount']),'time':num(f['time']),'externalGuard':addrOrNull(f['external_guard']),'storeFromId':addrOrNull(f['store_from_id'])}});}return b['length']?[{'schemaId':'treasury.record','refs':b}]:[];}function extractRewardLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']),g=(Array['isArray'](f['amount'])?f['amount']:[])['flatMap'](h=>{const i=h??{},j=normAddr(i['guard']);if(!j)return[];return[{'guard':j,'amount':strAmt(i['amount']),'time':num(i['time']),'storeFromId':addrOrNull(i['store_from_id'])}];});b['push']({'to':e,'payload':{'amount':strAmt(f['total']),'claims':g}});}return b['length']?[{'schemaId':'reward.claim','refs':b}]:[];}function extractRepositoryDataTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['id']);if(!f)continue;const g=e['key']!=null?String(e['key']):e['name']!=null?String(e['name']):undefined;b['push']({'to':f,'payload':{'dataName':g}});}return b['length']?[{'schemaId':'repository.data_about','refs':b}]:[];}function extractMachineTable(a,b){const c=[],e=[],g=[],h=new Set(),i=k=>{const l=String(k??'')['trim']();if(!l)return undefined;const m=wfNodeId(a,l);return!h['has'](m)&&(h['add'](m),c['push']({'to':m,'key':l,'payload':{'node':l}})),m;};for(const k of b){const l=rootOf(k['object']),m=String(l['name']??''),n=i(m);if(!n)continue;for(const o of asArray(l['value'])){const q=o??{},r=String(q['prev_node']??'')['trim']();if(r)i(r);const s=r?wfNodeId(a,r):n,t=Number(q['threshold']??0x0);for(const u of asArray(q['forwards'])){const v=u??{},w=String(v['name']??''),x=addrsOf(v['guard'],'guard')[0x0];s&&e['push']({'from':s,'to':n,'key':w||undefined,'payload':{'forward':w||undefined,'prevNode':r,'node':m,'threshold':t||undefined,'guard':x??undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}}),x&&g['push']({'to':x,'key':w||undefined,'payload':{'forward':w||undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}});}}}const j=[];if(c['length'])j['push']({'schemaId':'machine.node','refs':c});if(e['length'])j['push']({'schemaId':'wf.transition','refs':e});if(g['length'])j['push']({'schemaId':'wf.forward_guard','refs':g});return j;}export function inferObjectType(a){return objectTypeFromAddress(a)??undefined;}export function extractCoinType(a){if(typeof a!=='string'||!a['includes']('<'))return undefined;const b=a['slice'](a['indexOf']('<')+0x1,a['lastIndexOf']('>'));return b['trim']()||undefined;}export function extractObjectEdges(a,b){return extractFieldEdges(a,b,extractCoinType(b['type_raw']));}export function schemaById(a){return EDGE_SCHEMAS['find'](b=>b['id']===a);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{RETENTION_RANK,pathConfidence,findingWhere}from'./analyze.js';import{orderCompletionInGraph}from'./expand.js';import{profileOf}from'./viewport.js';const STATE_RANK={'present':0x0,'empty':0x1,'gap':0x2};function worstState(c,d){return STATE_RANK[c]>=STATE_RANK[d]?c:d;}export const COVERAGE_VOCABULARY={'present':'present\x20—\x20evidence\x20retrieved\x20and\x20non-empty;\x20real\x20material\x20the\x20rules\x20can\x20score.','empty':'empty\x20—\x20the\x20read\x20completed\x20and\x20verified\x20the\x20absence\x20of\x20data\x20(e.g.\x20no\x20review\x20votes);\x20an\x20answered\x20fact\x20the\x20rules\x20may\x20score,\x20never\x20a\x20fetch\x20failure.','gap':'gap\x20—\x20the\x20evidence\x20was\x20not\x20retrieved,\x20errored,\x20or\x20was\x20truncated;\x20it\x20is\x20unverifiable,\x20so\x20it\x20is\x20excluded\x20from\x20scoring\x20and\x20listed\x20in\x20unverified,\x20never\x20defaulted\x20to\x20a\x20low\x20score.','unverified':'unverified\x20—\x20rule\x20ids\x20excluded\x20from\x20the\x20score\x20because\x20their\x20evidence\x20is\x20gap-state;\x20missing\x20here\x20means\x20every\x20rule\x20was\x20scored\x20on\x20fetched\x20facts.','completeness':'completeness\x20—\x20percentage\x20of\x20required\x20evidence\x20slots\x20that\x20carry\x20material\x20(present);\x20verified-empty\x20slots\x20lower\x20it\x20but\x20stay\x20fully\x20scoreable.'};const REQUIRED_SLOTS=[{'slot':'service_snapshot','label':'Service\x20snapshot','gloss':'The\x20service\x27s\x20own\x20on-chain\x20record\x20(publish/pause\x20status,\x20price,\x20fund\x20and\x20bindings),\x20fetched\x20directly\x20from\x20chain.'},{'slot':'arbitration','label':'Arbitration\x20binding','gloss':'Dispute-resolution\x20services\x20bound\x20to\x20this\x20shop\x20—\x20whether\x20one\x20exists,\x20carries\x20a\x20voter\x20roster,\x20has\x20a\x20funded\x20fee,\x20and\x20is\x20not\x20paused.'},{'slot':'reviews','label':'Review\x20votes','gloss':'On-chain\x20like/dislike\x20votes\x20left\x20by\x20completed-order\x20counterparties;\x20an\x20empty\x20window\x20means\x20nobody\x20voted\x20yet,\x20not\x20a\x20bad\x20rating.'},{'slot':'fulfillment_orders','label':'Recent\x20orders','gloss':'Orders\x20in\x20the\x20shop\x27s\x20recent\x20order\x20window\x20with\x20completion\x20and\x20refund\x20outcomes,\x20used\x20to\x20measure\x20real\x20fulfillment.'},{'slot':'fulfillment_workflow','label':'Fulfillment\x20workflow','gloss':'The\x20bound\x20machine\x27s\x20nodes\x20and\x20forwards\x20that\x20every\x20paid\x20order\x20must\x20progress\x20through\x20to\x20reach\x20completion\x20or\x20refund.'},{'slot':'fund_safety','label':'Compensation\x20fund\x20vs\x20exposure','gloss':'The\x20merchant\x27s\x20compensation\x20fund\x20balance\x20measured\x20against\x20recent\x20order\x20volume\x20(the\x20safety\x20buffer\x20for\x20payouts).'},{'slot':'transparency','label':'Transparency\x20profile','gloss':'The\x20shop\x27s\x20public\x20on-chain\x20profile\x20—\x20description\x20and\x20publish/pause\x20flags\x20a\x20buyer\x20can\x20verify\x20before\x20paying.'}],SLOT_FACTS={'service_snapshot':[],'arbitration':['arbitration.binding'],'reviews':['reviews.votes'],'fulfillment_orders':['fulfillment.orders'],'fulfillment_workflow':['fulfillment.workflow'],'fund_safety':['fund.compensation','fund.exposure'],'transparency':['transparency.profile']},RISK_RULE_SOURCES={'risk_workflow':{'slots':['fulfillment_workflow'],'ruleIds':['R4']},'risk_fund':{'slots':['fund_safety','fulfillment_orders'],'ruleIds':['R2','R7','AC3','AC4']},'risk_trust':{'slots':['arbitration','transparency'],'ruleIds':['R1','R3','R6']},'risk_behavior':{'slots':['fulfillment_orders'],'ruleIds':['AC1','AC2']}};function nodeData(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}function isFetched(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return!!c&&a['visibleNodes']['has'](c['id'])&&!!c['raw']&&c['state']!=='error'&&c['state']!=='stub';}function truncationOf(a,b,c){const d=a['graph']['truncations']['find'](e=>e['nodeId']===b&&e['schema']===c);return d?{'observed':d['observed'],'limit':d['limit']}:undefined;}function outEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['from']===b['toLowerCase']()&&d['schema']===c);}function incEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['to']===b['toLowerCase']()&&d['schema']===c);}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function flag(a){return a===!![]||a===0x1||a==='1';}function snapProvenance(a){return{'path':a,'retention':'complete','confidence':'exact'};}function edgeProvenance(a,b,c){const {confidence:d,window:e}=pathConfidence(a,c),f=c['reduce']((g,h)=>RETENTION_RANK[h['retention']]>RETENTION_RANK[g]?h['retention']:g,'complete');return{'path':b,'retention':f,'confidence':d,...e?{'window':e}:{}};}export function projectEvaluationFacts(a,b,c){const f=b['toLowerCase'](),g=[],h=new Map(),i=new Map(),j=(U,V,W='exact')=>{h['set'](U,V),i['set'](U,W);},k=a['graph']['nodes']['get'](f),l=a['visibleNodes']['has'](f),m=!!(l&&k&&k['raw']&&k['state']!=='error'&&k['state']!=='stub'&&k['objectType']==='Service'),o=m?nodeData(a,f)??{}:{},q=k?.['coinType'];j('service_snapshot',m?'present':'gap');const r=Array['isArray'](o['arbitrations'])?o['arbitrations']['map'](String)['filter'](Boolean):[],u=outEdges(a,f,'service.arbitration'),w=[];let x=!![];for(const U of r){if(!isFetched(a,U)){x=![];continue;}const V=nodeData(a,U)??{},W=Array['isArray'](V['voting_guard'])?V['voting_guard']:[];w['push']({'id':U['toLowerCase'](),'paused':flag(V['bPaused']),'fee':toBigInt(V['fee'])['toString'](),'votingGuards':W['length'],'usageGuard':typeof V['usage_guard']==='string'&&V['usage_guard']!==''});}if(!m)j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','provenance':snapProvenance([f]),'evidence':'Arbitration\x20configuration\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(r['length']===0x0)j('arbitration','empty'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'empty','value':[],'provenance':snapProvenance([f,'Service.arbitrations']),'evidence':'Service\x20snapshot\x20shows\x20no\x20arbitration\x20service\x20configured\x20(verified\x20absence).'});else!x?(j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'/'+r['length']+'\x20arbitration\x20service(s)\x20resolved;\x20the\x20rest\x20failed\x20to\x20fetch.'})):(j('arbitration','present',u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u)['confidence']:'exact'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'present','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'\x20arbitration\x20service(s)\x20resolved\x20from\x20the\x20snapshot\x20with\x20voting\x20rosters.'}));}const y=outEdges(a,f,'target.vote'),z=truncationOf(a,f,'target.vote'),A={'total':y['length'],'like':0x0,'dislike':0x0,'favor':0x0};for(const X of y){const Y=typeof X['payload']?.['voteBits']==='number'?X['payload']['voteBits']:0x0;if(Y&0x2)A['like']+=0x1;if(Y&0x4)A['dislike']+=0x1;if(Y&0x8)A['favor']+=0x1;}const B=y['length']>0x0?edgeProvenance(a,[f,'target.vote'],y):snapProvenance([f,'registrar.votes']);if(!m)j('reviews','gap'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','provenance':snapProvenance([f]),'evidence':'Reputation\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(z)j('reviews','gap',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','value':A,'provenance':{...B,'window':z},'evidence':'Vote\x20window\x20truncated\x20at\x20'+z['limit']+';\x20'+A['total']+'\x20vote(s)\x20visible\x20—\x20counts\x20are\x20a\x20floor.'});else A['total']===0x0?(j('reviews','empty'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'empty','value':A,'provenance':B,'evidence':'No\x20registrar\x20votes\x20recorded\x20for\x20the\x20service\x20(window\x20read\x20empty,\x20no\x20truncation).'})):(j('reviews','present',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'present','value':A,'provenance':B,'evidence':A['total']+'\x20registrar\x20vote(s):\x20'+A['like']+'\x20like,\x20'+A['dislike']+'\x20dislike,\x20'+A['favor']+'\x20favor.'}));}const C=outEdges(a,f,'service.order'),D=truncationOf(a,f,'service.order'),E={'observed':C['length'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':'0'};let F=0x0n;for(const Z of C){const a0=orderCompletionInGraph(a['graph'],Z['to'])['status'];if(a0==='completed')E['completed']+=0x1;else{if(a0==='in_progress')E['inProgress']+=0x1;else E['unknown']+=0x1;}F+=toBigInt(nodeData(a,Z['to'])?.['amount']);}E['windowedAmount']=F['toString']();const G=C['length']>0x0?edgeProvenance(a,[f,'service.order','Order'],C):snapProvenance([f,'service.order']);let H;if(!m)H='gap';else{if(D)H='gap';else H=C['length']===0x0?'empty':'present';}j('fulfillment_orders',H,G['confidence']);if(H==='gap'&&m)g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','value':E,'provenance':{...G,'window':D},'evidence':'Order\x20window\x20truncated\x20at\x20'+D?.['limit']+'\x20(observed\x20'+D?.['observed']+');\x20'+E['observed']+'\x20order(s)\x20visible\x20—\x20completion\x20stats\x20are\x20a\x20partial\x20floor.'});else{if(H==='empty')g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'empty','value':E,'provenance':G,'evidence':'No\x20orders\x20in\x20the\x20service\x20window\x20(verified\x20absence).'});else H==='present'?g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'present','value':E,'provenance':G,'evidence':E['observed']+'\x20recent\x20order(s):\x20'+E['completed']+'\x20completed,\x20'+E['inProgress']+'\x20in\x20progress,\x20'+E['unknown']+'\x20unresolved.'}):g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','provenance':snapProvenance([f]),'evidence':'Order\x20window\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});}const I=typeof o['machine']==='string'?o['machine']:'',J=I!==''&&isFetched(a,I),K=I===''?'':I['toLowerCase']()+'::node::',L=K===''?[]:a['graph']['edges']['filter'](a1=>a1['schema']==='wf.transition'&&a1['from']['startsWith'](K)),M=new Set();for(const a1 of L){M['add'](a1['from']);const a2=String(a1['payload']?.['node']??'');if(a2!=='')M['add'](''+K+a2);}let N,O;if(!m)N='gap',O='Workflow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.';else{if(I==='')N='empty',O='No\x20workflow\x20template\x20configured\x20(verified\x20absence).';else{if(!J)N='gap',O='Machine\x20template\x20referenced\x20but\x20not\x20fetched\x20(fetch\x20gap).';else L['length']===0x0?(N='gap',O='Machine\x20fetched\x20but\x20no\x20wf.transition\x20edges\x20—\x20terminal\x20set\x20unverifiable;\x20completion\x20states\x20stay\x20unknown.'):(N='present',O='Machine\x20template\x20resolved\x20with\x20'+M['size']+'\x20workflow\x20node(s);\x20terminal\x20set\x20verifiable.');}}j('fulfillment_workflow',N,N==='present'?'exact':N==='empty'?'exact':'windowed'),g['push']({'dimension':'fulfillment','key':'fulfillment.workflow','state':N,...I!==''&&J?{'value':{'machine':I['toLowerCase'](),'nodes':M['size']}}:{},'provenance':N==='present'?edgeProvenance(a,[f,'service.machine','wf.transition'],L):snapProvenance([f,'Service.machine']),'evidence':O});const P=toBigInt(o['compensation_fund']);if(!m)j('fund_safety','gap'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'gap','provenance':snapProvenance([f]),'evidence':'Fund\x20backing\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'}),g['push']({'dimension':'fund_safety','key':'fund.exposure','state':'gap','provenance':snapProvenance([f]),'evidence':'Payout\x20exposure\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{j('fund_safety','present'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'present','value':{'fund':P['toString'](),...q?{'coinType':q}:{}},'provenance':snapProvenance([f,'Service.compensation_fund']),'evidence':'Compensation\x20fund\x20'+P['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'.'});const a3=F*0x3n,a4=worstState('present',H),a5=c['find'](a6=>a6['id']==='R2:'+f);g['push']({'dimension':'fund_safety','key':'fund.exposure','state':a4,'value':{'fund':P['toString'](),'windowedCount':E['observed'],'windowedAmount':F['toString'](),'neededCeiling':a3['toString'](),'coverageMet':P>=a3},'provenance':C['length']>0x0?edgeProvenance(a,[f,'service.order','Order.amount','Service.compensation_fund'],C):snapProvenance([f,'Service.compensation_fund']),'findingIds':a5?[a5['id']]:undefined,'evidence':H==='empty'?'No\x20recent\x20orders;\x20no\x20payout\x20exposure\x20to\x20cover.':'Recent\x20orders\x20total\x20'+F['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'\x20across\x20'+E['observed']+'\x20order(s);\x20the\x20compensation\x20fund\x20should\x20cover\x20at\x20least\x203x\x20that\x20('+a3['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+')\x20—\x20coverage\x20'+(P>=a3?'met':'not\x20met')+(D?'\x20(older\x20orders\x20outside\x20the\x20fetch\x20window,\x20floor\x20value\x20only)':'')+'.'});}if(!m)j('transparency','gap'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'gap','provenance':snapProvenance([f]),'evidence':'Transparency\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{const a6=typeof o['setting_lock_duration']==='number'?o['setting_lock_duration']:Number(toBigInt(o['setting_lock_duration'])),a7=flag(o['bPublished']);j('transparency','present'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'present','value':{'description':typeof o['description']==='string'?o['description']:'','location':typeof o['location']==='string'?o['location']:'','settingLockDuration':Number['isFinite'](a6)?a6:0x0,'published':a7,'paused':flag(o['bPaused'])},'provenance':snapProvenance([f,'Service.bPublished','Service.setting_lock_duration']),'findingIds':c['some'](a8=>a8['id']==='R6:'+f)?['R6:'+f]:undefined,'evidence':'Service\x20profile:\x20description\x20'+(typeof o['description']==='string'&&o['description']!==''?'provided':'not\x20provided')+',\x20location\x20'+(typeof o['location']==='string'&&o['location']!==''?'provided':'not\x20provided')+',\x20service\x20lock\x20'+a6+'\x20ms,\x20'+(a7?'published':'unpublished')+'.'});}for(const a8 of['risk_workflow','risk_fund','risk_trust','risk_behavior']){const a9=RISK_RULE_SOURCES[a8];let aa='present',ab,ac=-0x1;for(const aj of a9['slots']){const ak=h['get'](aj)??'gap';STATE_RANK[ak]>ac&&(ac=STATE_RANK[ak],aa=ak,ab=aj);}let ae;if(aa==='gap')ae='windowed';else{if(aa==='empty')ae='bounded';else ae=ab&&i['get'](ab)||'exact';}const af=f['toLowerCase'](),ag=new Set([af,...[...a['graph']['nodes']['keys']()]['map'](al=>al['toLowerCase']())]),ah=(al,am)=>{if(!al['startsWith'](am+':'))return![];const an=al['slice'](am['length']+0x1)['toLowerCase'](),ao=an['split']('#')[0x0]['split']('|')[0x0];return ao['split'](':')['some'](ap=>ap['length']===0x0||ag['has'](ap));},ai=c['filter'](al=>a9['ruleIds']['some'](am=>ah(al['id'],am)));g['push']({'dimension':a8,'key':a8+'.findings','state':aa,'value':{'findings':ai['map'](al=>({'id':al['id'],'severity':al['severity'],'title':al['title']})),'where':ai['map'](al=>findingWhere(al))},'provenance':{'path':[f,...a9['slots']],'retention':'derived','confidence':ae},'findingIds':ai['map'](al=>al['id']),'evidence':aa==='gap'?'Input\x20evidence\x20has\x20fetch\x20gaps;\x20the\x20risk\x20conclusion\x20is\x20unverifiable.':aa==='empty'?'Input\x20evidence\x20is\x20configured-empty;\x20the\x20risk\x20rules\x20are\x20not\x20applicable.':ai['length']>0x0?ai['length']+'\x20structural\x20risk\x20finding(s)\x20on\x20this\x20object,\x20from\x20the\x20analyzer\x20registry.':'No\x20risk\x20fired\x20on\x20this\x20object;\x20input\x20evidence\x20slots\x20are\x20fully\x20materialized.'});}const Q=[];for(const al of a['visibleNodes']){const am=profileOf(a,al);if(!am)continue;const an=Array['isArray'](am['profileRecords'])?am['profileRecords']:undefined;Q['push']({'nodeId':al,...typeof am['registeredAt']==='number'?{'registeredAt':am['registeredAt']}:{},'hasDescription':!!am['hasDescription']||typeof am['description']==='string','recordCount':typeof am['recordCount']==='number'?am['recordCount']:an?.['length']??0x0,...typeof am['description']==='string'?{'description':am['description']}:{},...an?{'profileRecords':an}:{}});}const R=REQUIRED_SLOTS['length'],S=REQUIRED_SLOTS['filter'](({slot:ao})=>h['get'](ao)==='present')['length'],T=R===0x0?0x64:Math['round'](S/R*0x64);return{'target':f,'role':String(a['role']),'facts':g,'slots':REQUIRED_SLOTS['map'](({slot:ao,label:ap,gloss:aq})=>({'slot':ao,'label':ap,'gloss':aq,'required':!![],'state':h['get'](ao)??'gap','facts':[...SLOT_FACTS[ao]??[]]})),'completeness':T,'profiles':Q};}
|
|
1
|
+
import{RETENTION_RANK,pathConfidence,findingWhere}from'./analyze.js';import{orderCompletionInGraph}from'./expand.js';import{profileOf}from'./viewport.js';const STATE_RANK={'present':0x0,'empty':0x1,'gap':0x2};function worstState(c,d){return STATE_RANK[c]>=STATE_RANK[d]?c:d;}export const COVERAGE_VOCABULARY={'present':'present\x20—\x20evidence\x20retrieved\x20and\x20non-empty;\x20real\x20material\x20the\x20rules\x20can\x20score.','empty':'empty\x20—\x20the\x20read\x20completed\x20and\x20verified\x20the\x20absence\x20of\x20data\x20(e.g.\x20no\x20review\x20votes);\x20an\x20answered\x20fact\x20the\x20rules\x20may\x20score,\x20never\x20a\x20fetch\x20failure.','gap':'gap\x20—\x20the\x20evidence\x20was\x20not\x20retrieved,\x20errored,\x20or\x20was\x20truncated;\x20it\x20is\x20unverifiable,\x20so\x20it\x20is\x20excluded\x20from\x20scoring\x20and\x20listed\x20in\x20unverified,\x20never\x20defaulted\x20to\x20a\x20low\x20score.','unverified':'unverified\x20—\x20rule\x20ids\x20excluded\x20from\x20the\x20score\x20because\x20their\x20evidence\x20is\x20gap-state;\x20missing\x20here\x20means\x20every\x20rule\x20was\x20scored\x20on\x20fetched\x20facts.','completeness':'completeness\x20—\x20percentage\x20of\x20required\x20evidence\x20slots\x20that\x20carry\x20material\x20(present);\x20verified-empty\x20slots\x20lower\x20it\x20but\x20stay\x20fully\x20scoreable.'};const REQUIRED_SLOTS=[{'slot':'service_snapshot','label':'Service\x20snapshot','gloss':'The\x20service\x27s\x20own\x20on-chain\x20record\x20(publish/pause\x20status,\x20price,\x20fund\x20and\x20bindings),\x20fetched\x20directly\x20from\x20chain.'},{'slot':'arbitration','label':'Arbitration\x20binding','gloss':'Dispute-resolution\x20services\x20bound\x20to\x20this\x20shop\x20—\x20whether\x20one\x20exists,\x20carries\x20a\x20voter\x20roster,\x20has\x20a\x20funded\x20fee,\x20and\x20is\x20not\x20paused.'},{'slot':'reviews','label':'Review\x20votes','gloss':'On-chain\x20like/dislike\x20votes\x20left\x20by\x20completed-order\x20counterparties;\x20an\x20empty\x20window\x20means\x20nobody\x20voted\x20yet,\x20not\x20a\x20bad\x20rating.'},{'slot':'fulfillment_orders','label':'Recent\x20orders','gloss':'Orders\x20in\x20the\x20shop\x27s\x20recent\x20order\x20window\x20with\x20completion\x20and\x20refund\x20outcomes,\x20used\x20to\x20measure\x20real\x20fulfillment.'},{'slot':'fulfillment_workflow','label':'Fulfillment\x20workflow','gloss':'The\x20bound\x20machine\x27s\x20nodes\x20and\x20forwards\x20that\x20every\x20paid\x20order\x20must\x20progress\x20through\x20to\x20reach\x20completion\x20or\x20refund.'},{'slot':'fund_safety','label':'Compensation\x20fund\x20vs\x20exposure','gloss':'The\x20merchant\x27s\x20compensation\x20fund\x20balance\x20measured\x20against\x20recent\x20order\x20volume\x20(the\x20safety\x20buffer\x20for\x20payouts).'},{'slot':'transparency','label':'Transparency\x20profile','gloss':'The\x20shop\x27s\x20public\x20on-chain\x20profile\x20—\x20description\x20and\x20publish/pause\x20flags\x20a\x20buyer\x20can\x20verify\x20before\x20paying.'}],SLOT_FACTS={'service_snapshot':[],'arbitration':['arbitration.binding'],'reviews':['reviews.votes'],'fulfillment_orders':['fulfillment.orders'],'fulfillment_workflow':['fulfillment.workflow'],'fund_safety':['fund.compensation','fund.exposure'],'transparency':['transparency.profile']},RISK_RULE_SOURCES={'risk_workflow':{'slots':['fulfillment_workflow'],'ruleIds':['R4']},'risk_fund':{'slots':['fund_safety','fulfillment_orders'],'ruleIds':['R2','R7','AC3','AC4']},'risk_trust':{'slots':['arbitration','transparency'],'ruleIds':['R1','R3','R6']},'risk_behavior':{'slots':['fulfillment_orders'],'ruleIds':['AC1','AC2']}};function nodeData(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}function isFetched(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return!!c&&a['visibleNodes']['has'](c['id'])&&!!c['raw']&&c['state']!=='error'&&c['state']!=='stub';}function truncationOf(a,b,c){const d=a['graph']['truncations']['find'](e=>e['nodeId']===b&&e['schema']===c);return d?{'observed':d['observed'],'limit':d['limit']}:undefined;}function outEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['from']===b['toLowerCase']()&&d['schema']===c);}function incEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['to']===b['toLowerCase']()&&d['schema']===c);}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function flag(a){return a===!![]||a===0x1||a==='1';}function snapProvenance(a){return{'path':a,'retention':'complete','confidence':'exact'};}function edgeProvenance(a,b,c){const {confidence:d,window:e}=pathConfidence(a,c),f=c['reduce']((g,h)=>RETENTION_RANK[h['retention']]>RETENTION_RANK[g]?h['retention']:g,'complete');return{'path':b,'retention':f,'confidence':d,...e?{'window':e}:{}};}export function projectEvaluationFacts(a,b,c){const f=b['toLowerCase'](),g=[],h=new Map(),i=new Map(),j=(U,V,W='exact')=>{h['set'](U,V),i['set'](U,W);},k=a['graph']['nodes']['get'](f),l=a['visibleNodes']['has'](f),m=!!(l&&k&&k['raw']&&k['state']!=='error'&&k['state']!=='stub'&&k['objectType']==='Service'),o=m?nodeData(a,f)??{}:{},q=k?.['coinType'];j('service_snapshot',m?'present':'gap');const r=Array['isArray'](o['arbitrations'])?o['arbitrations']['map'](String)['filter'](Boolean):[],u=outEdges(a,f,'service.arbitration'),w=[];let x=!![];for(const U of r){if(!isFetched(a,U)){x=![];continue;}const V=nodeData(a,U)??{},W=Array['isArray'](V['voting_guard'])?V['voting_guard']:[];w['push']({'id':U['toLowerCase'](),'paused':flag(V['bPaused']),'fee':toBigInt(V['fee'])['toString'](),'votingGuards':W['length'],'usageGuard':typeof V['usage_guard']==='string'&&V['usage_guard']!==''});}if(!m)j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','provenance':snapProvenance([f]),'evidence':'Arbitration\x20configuration\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(r['length']===0x0)j('arbitration','empty'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'empty','value':[],'provenance':snapProvenance([f,'Service.arbitrations']),'evidence':'Service\x20snapshot\x20shows\x20no\x20arbitration\x20service\x20configured\x20(verified\x20absence).'});else!x?(j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'/'+r['length']+'\x20arbitration\x20service(s)\x20resolved;\x20the\x20rest\x20failed\x20to\x20fetch.'})):(j('arbitration','present',u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u)['confidence']:'exact'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'present','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'\x20arbitration\x20service(s)\x20resolved\x20from\x20the\x20snapshot\x20with\x20voting\x20rosters.'}));}const y=outEdges(a,f,'target.vote'),z=truncationOf(a,f,'target.vote'),A={'total':y['length'],'like':0x0,'dislike':0x0,'favor':0x0};for(const X of y){const Y=typeof X['payload']?.['voteBits']==='number'?X['payload']['voteBits']:0x0;if(Y&0x2)A['like']+=0x1;if(Y&0x4)A['dislike']+=0x1;if(Y&0x8)A['favor']+=0x1;}const B=y['length']>0x0?edgeProvenance(a,[f,'target.vote'],y):snapProvenance([f,'registrar.votes']);if(!m)j('reviews','gap'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','provenance':snapProvenance([f]),'evidence':'Reputation\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(z)j('reviews','gap',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','value':A,'provenance':{...B,'window':z},'evidence':'Vote\x20window\x20truncated\x20at\x20'+z['limit']+';\x20'+A['total']+'\x20vote(s)\x20visible\x20—\x20counts\x20are\x20a\x20floor.'});else A['total']===0x0?(j('reviews','empty'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'empty','value':A,'provenance':B,'evidence':'No\x20registrar\x20votes\x20recorded\x20for\x20the\x20service\x20(window\x20read\x20empty,\x20no\x20truncation).'})):(j('reviews','present',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'present','value':A,'provenance':B,'evidence':A['total']+'\x20registrar\x20vote(s):\x20'+A['like']+'\x20like,\x20'+A['dislike']+'\x20dislike,\x20'+A['favor']+'\x20favor.'}));}const C=outEdges(a,f,'service.order'),D=truncationOf(a,f,'service.order'),E={'observed':C['length'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':'0'};let F=0x0n;for(const Z of C){const a0=orderCompletionInGraph(a['graph'],Z['to'])['status'];if(a0==='completed')E['completed']+=0x1;else{if(a0==='in_progress')E['inProgress']+=0x1;else E['unknown']+=0x1;}F+=toBigInt(nodeData(a,Z['to'])?.['amount']);}E['windowedAmount']=F['toString']();const G=C['length']>0x0?edgeProvenance(a,[f,'service.order','Order'],C):snapProvenance([f,'service.order']);let H;if(!m)H='gap';else{if(D)H='gap';else H=C['length']===0x0?'empty':'present';}j('fulfillment_orders',H,G['confidence']);if(H==='gap'&&m)g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','value':E,'provenance':{...G,'window':D},'evidence':'Order\x20window\x20truncated\x20at\x20'+D?.['limit']+'\x20(observed\x20'+D?.['observed']+');\x20'+E['observed']+'\x20order(s)\x20visible\x20—\x20completion\x20stats\x20are\x20a\x20partial\x20floor.'});else{if(H==='empty')g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'empty','value':E,'provenance':G,'evidence':'No\x20orders\x20in\x20the\x20service\x20window\x20(verified\x20absence).'});else H==='present'?g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'present','value':E,'provenance':G,'evidence':E['observed']+'\x20recent\x20order(s):\x20'+E['completed']+'\x20completed,\x20'+E['inProgress']+'\x20in\x20progress,\x20'+E['unknown']+'\x20unresolved.'}):g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','provenance':snapProvenance([f]),'evidence':'Order\x20window\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});}const I=typeof o['machine']==='string'?o['machine']:'',J=I!==''&&isFetched(a,I),K=I===''?'':I['toLowerCase']()+'::node::',L=K===''?[]:a['graph']['edges']['filter'](a1=>a1['schema']==='wf.transition'&&a1['from']['startsWith'](K)),M=new Set();for(const a1 of L){M['add'](a1['from']);const a2=String(a1['payload']?.['node']??'');if(a2!=='')M['add'](''+K+a2);}let N,O;if(!m)N='gap',O='Workflow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.';else{if(I==='')N='empty',O='No\x20workflow\x20template\x20configured\x20(verified\x20absence).';else{if(!J)N='gap',O='Machine\x20template\x20referenced\x20but\x20not\x20fetched\x20(fetch\x20gap).';else L['length']===0x0?(N='gap',O='Machine\x20fetched\x20but\x20no\x20wf.transition\x20edges\x20—\x20terminal\x20set\x20unverifiable;\x20completion\x20states\x20stay\x20unknown.'):(N='present',O='Machine\x20template\x20resolved\x20with\x20'+M['size']+'\x20workflow\x20node(s);\x20terminal\x20set\x20verifiable.');}}j('fulfillment_workflow',N,N==='present'?'exact':N==='empty'?'exact':'windowed'),g['push']({'dimension':'fulfillment','key':'fulfillment.workflow','state':N,...I!==''&&J?{'value':{'machine':I['toLowerCase'](),'nodes':M['size']}}:{},'provenance':N==='present'?edgeProvenance(a,[f,'service.machine','wf.transition'],L):snapProvenance([f,'Service.machine']),'evidence':O});const P=toBigInt(o['compensation_fund']);if(!m)j('fund_safety','gap'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'gap','provenance':snapProvenance([f]),'evidence':'Fund\x20backing\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'}),g['push']({'dimension':'fund_safety','key':'fund.exposure','state':'gap','provenance':snapProvenance([f]),'evidence':'Payout\x20exposure\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{j('fund_safety','present'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'present','value':{'fund':P['toString'](),...q?{'coinType':q}:{}},'provenance':snapProvenance([f,'Service.compensation_fund']),'evidence':'Compensation\x20fund\x20'+P['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'.'});const a3=F*0x3n,a4=worstState('present',H),a5=c['find'](a6=>a6['id']==='R2:'+f);g['push']({'dimension':'fund_safety','key':'fund.exposure','state':a4,'value':{'fund':P['toString'](),'windowedCount':E['observed'],'windowedAmount':F['toString'](),'neededCeiling':a3['toString'](),'coverageMet':P>=a3},'provenance':C['length']>0x0?edgeProvenance(a,[f,'service.order','Order.amount','Service.compensation_fund'],C):snapProvenance([f,'Service.compensation_fund']),'findingIds':a5?[a5['id']]:undefined,'evidence':H==='empty'?'No\x20recent\x20orders;\x20no\x20payout\x20exposure\x20to\x20cover.':'Recent\x20orders\x20total\x20'+F['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'\x20across\x20'+E['observed']+'\x20order(s);\x20the\x20compensation\x20fund\x20should\x20cover\x20at\x20least\x203x\x20that\x20('+a3['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+')\x20—\x20coverage\x20'+(P>=a3?'met':'not\x20met')+(D?'\x20(older\x20orders\x20outside\x20the\x20fetch\x20window,\x20floor\x20value\x20only)':'')+'.'});}if(!m)j('transparency','gap'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'gap','provenance':snapProvenance([f]),'evidence':'Transparency\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{const a6=typeof o['setting_lock_duration']==='number'?o['setting_lock_duration']:Number(toBigInt(o['setting_lock_duration'])),a7=flag(o['bPublished']);j('transparency','present'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'present','value':{'description':typeof o['description']==='string'?o['description']:'','location':typeof o['location']==='string'?o['location']:'','settingLockDuration':Number['isFinite'](a6)?a6:0x0,'published':a7,'paused':flag(o['bPaused'])},'provenance':snapProvenance([f,'Service.bPublished','Service.setting_lock_duration']),'findingIds':c['some'](a8=>a8['id']==='R6:'+f)?['R6:'+f]:undefined,'evidence':'Service\x20profile:\x20description\x20'+(typeof o['description']==='string'&&o['description']!==''?'provided':'not\x20provided')+',\x20location\x20'+(typeof o['location']==='string'&&o['location']!==''?'provided':'not\x20provided')+',\x20service\x20lock\x20'+a6+'\x20ms,\x20'+(a7?'published':'unpublished')+'.'});}for(const a8 of['risk_workflow','risk_fund','risk_trust','risk_behavior']){const a9=RISK_RULE_SOURCES[a8];let aa='present',ab,ac=-0x1;for(const ak of a9['slots']){const al=h['get'](ak)??'gap';STATE_RANK[al]>ac&&(ac=STATE_RANK[al],aa=al,ab=ak);}let ae;if(aa==='gap')ae='windowed';else{if(aa==='empty')ae='bounded';else ae=ab&&i['get'](ab)||'exact';}const af=f['toLowerCase'](),ag=new Set([af]);{const am=[af];while(am['length']>0x0){const an=am['shift']();for(const ao of a['graph']['out']['get'](an)??[]){if(ao['family']!=='F'&&ao['family']!=='W'&&ao['family']!=='M')continue;const ap=ao['to']['toLowerCase']();!ag['has'](ap)&&(ag['add'](ap),am['push'](ap));}}}const ah=(aq,ar)=>{if(!aq['startsWith'](ar+':'))return![];const as=aq['slice'](ar['length']+0x1)['toLowerCase'](),at=as['split']('#')[0x0]['split']('|')[0x0],au=at['split'](':');if(au['some'](av=>av['length']===0x0))return!![];return au['some'](av=>ag['has'](av));},ai=c['filter'](aq=>a9['ruleIds']['some'](ar=>ah(aq['id'],ar))),aj=c['filter'](aq=>a9['ruleIds']['some'](ar=>aq['id']['startsWith'](ar+':')&&!ah(aq['id'],ar)))['length'];g['push']({'dimension':a8,'key':a8+'.findings','state':aa,'value':{'findings':ai['map'](aq=>({'id':aq['id'],'severity':aq['severity'],'title':aq['title']})),'where':ai['map'](aq=>findingWhere(aq))},'provenance':{'path':[f,...a9['slots']],'retention':'derived','confidence':ae},'findingIds':ai['map'](aq=>aq['id']),'evidence':aa==='gap'?'Input\x20evidence\x20has\x20fetch\x20gaps;\x20the\x20risk\x20conclusion\x20is\x20unverifiable.':aa==='empty'?'Input\x20evidence\x20is\x20configured-empty;\x20the\x20risk\x20rules\x20are\x20not\x20applicable.':ai['length']>0x0?ai['length']+'\x20structural\x20risk\x20finding(s)\x20on\x20this\x20object,\x20from\x20the\x20analyzer\x20registry.'+(aj>0x0?'\x20'+aj+'\x20further\x20finding(s)\x20on\x20NEIGHBOR\x20objects\x20(reachable\x20only\x20through\x20shared\x20reverse/social\x20edges)\x20are\x20folded\x20here\x20as\x20a\x20count\x20—\x20they\x20do\x20not\x20belong\x20to\x20this\x20object\x27s\x20score\x20(N-K5).':''):aj>0x0?'No\x20risk\x20fired\x20on\x20this\x20object\x27s\x20own\x20structure;\x20'+aj+'\x20finding(s)\x20on\x20neighbor\x20objects\x20(shared\x20edges\x20only)\x20are\x20excluded\x20from\x20the\x20score\x20(N-K5).':'No\x20risk\x20fired\x20on\x20this\x20object;\x20input\x20evidence\x20slots\x20are\x20fully\x20materialized.'});}const Q=[];for(const aq of a['visibleNodes']){const ar=profileOf(a,aq);if(!ar)continue;const as=Array['isArray'](ar['profileRecords'])?ar['profileRecords']:undefined;Q['push']({'nodeId':aq,...typeof ar['registeredAt']==='number'?{'registeredAt':ar['registeredAt']}:{},'hasDescription':!!ar['hasDescription']||typeof ar['description']==='string','recordCount':typeof ar['recordCount']==='number'?ar['recordCount']:as?.['length']??0x0,...typeof ar['description']==='string'?{'description':ar['description']}:{},...as?{'profileRecords':as}:{}});}const R=REQUIRED_SLOTS['length'],S=REQUIRED_SLOTS['filter'](({slot:at})=>h['get'](at)==='present')['length'],T=R===0x0?0x64:Math['round'](S/R*0x64);return{'target':f,'role':String(a['role']),'facts':g,'slots':REQUIRED_SLOTS['map'](({slot:at,label:au,gloss:av})=>({'slot':at,'label':au,'gloss':av,'required':!![],'state':h['get'](at)??'gap','facts':[...SLOT_FACTS[at]??[]]})),'completeness':T,'profiles':Q};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{mkdtempSync,writeFileSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{afterAll,beforeAll,describe,expect,it}from'vitest';import{beginPolicyRun,endPolicyRun,factoryRulePack,getJudgmentDoc,judgmentStatus}from'../../config/judgment.js';import{evaluateRuleBook}from'../../config/rule-engine.js';import{graphFindingPolicy}from'./policy.js';const CONFIG_DIR=mkdtempSync(join(tmpdir(),'wowok-graph-policy-'));process['env']['WOWOK_CONFIG_DIR']=CONFIG_DIR;const GRAPH_IDS=['R1','R2','R3','R4','R6','R7-treasury','R7-reward','A1','A2','A3','G2','AC1','AC2','AC3','AC4'];beforeAll(()=>{beginPolicyRun();}),afterAll(()=>{endPolicyRun();}),describe('graph\x20finding\x20policy\x20—\x20factory\x20parity',()=>{it('factory\x20pack\x20carries\x20exactly\x20the\x20kernel\x20emission\x20ids',()=>{const a=factoryRulePack('graph');expect(a)['not']['toBeNull'](),expect(a['rules']['map'](b=>b['rule_id'])['sort']())['toEqual']([...GRAPH_IDS]['sort']());}),it('static\x20literals\x20resolve\x20to\x20the\x20kernel\x20severities',()=>{expect(graphFindingPolicy('R1',{'eoa':'0xa'})['severity'])['toBe']('high'),expect(graphFindingPolicy('R4',{'only':'name:ops'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R6',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R7-treasury',{})['severity'])['toBe']('critical'),expect(graphFindingPolicy('A1',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('A2',{})['severity'])['toBe']('low'),expect(graphFindingPolicy('A3',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('G2',{})['severity'])['toBe']('low'),expect(graphFindingPolicy('AC1',{})['severity'])['toBe']('high');}),it('dynamic\x20fact:\x20levels\x20resolve\x20through\x20the\x20extractor\x20facts',()=>{expect(graphFindingPolicy('R2',{'r2_level':'high'})['severity'])['toBe']('high'),expect(graphFindingPolicy('R2',{'r2_level':'medium'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R3',{'r3_level':'medium'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R3',{'r3_level':'low'})['severity'])['toBe']('low');for(const a of['high','medium','low']){expect(graphFindingPolicy('AC2',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC3',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_machine','ac_signal_level':a})['severity'])['toBe'](a);}}),it('R7-reward\x20mirrors\x20the\x20viability\x20gate:\x20viable\x20→\x20critical\x20confirmed',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'viable','r7_slot_audit':'#0\x20viable\x20—\x20no\x20binding'});expect(a['severity'])['toBe']('critical'),expect(a['exposure']?.['verdict'])['toBe']('confirmed'),expect(a['exposure']?.['gainPaths'][0x0]?.['gate'])['toContain']('#0\x20viable\x20—\x20no\x20binding'),expect(a['exposure']?.['gainPaths'][0x0]?.['viability'])['toBe']('viable');}),it('R7-reward\x20all-blocked\x20downgrades\x20to\x20info\x20with\x20baseSeverity\x20kept',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'blocked','r7_slot_audit':'#0\x20blocked\x20—\x20Entity\x20recipient'});expect(a['severity'])['toBe']('info'),expect(a['exposure']?.['verdict'])['toBe']('downgraded'),expect(a['exposure']?.['baseSeverity'])['toBe']('critical');}),it('R7-reward\x20undecided\x20keeps\x20critical\x20as\x20pending-disclosure',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'unverifiable','r7_slot_audit':'#0\x20unverifiable\x20—\x20guard\x20not\x20fetched'});expect(a['severity'])['toBe']('critical'),expect(a['exposure']?.['verdict'])['toBe']('pending-disclosure');}),it('AC4\x20selects\x20the\x20attribution\x20case\x20by\x20shell\x20code',()=>{const a=graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_arbitration','ac_signal_level':'high'});expect(a['exposure']?.['lossParties']['map'](d=>d['role']))['toEqual'](['buyer']),expect(a['exposure']?.['gainPaths'][0x0]?.['role'])['toBe']('merchant');const b=graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_machine','ac_signal_level':'low'});expect(b['exposure']?.['verdict'])['toBe']('confirmed');const c=graphFindingPolicy('AC4',{'ac_shell_code':'other','ac_signal_level':'high'});expect(c['enabled'])['toBe'](!![]),expect(c['severity'])['toBeNull']();}),it('an\x20emission\x20id\x20outside\x20the\x20pack\x20leaves\x20the\x20kernel\x20default\x20intact',()=>{expect(graphFindingPolicy('R5',{}))['toEqual']({'enabled':!![],'severity':null});});}),describe('graph\x20finding\x20policy\x20—\x20pack-driven\x20behavior\x20change',()=>{it('a\x20disabled\x20rule\x20id\x20suppresses\x20the\x20emission\x20with\x20a\x20trace',()=>{const {findings:a,disabled_traces:b}=evaluateRuleBook([{'rule_id':'R6','dimension':'structural','cases':[{'when':{'field':'kernel_fired','op':'truthy'},'level':'medium','title':'t','description':'d'}],'enabled':![]}],{'kernel_fired':!![]});expect(a)['toHaveLength'](0x0),expect(b)['toEqual'](['R6']);}),it('a\x20user\x20fact:\x20reference\x20outside\x20the\x20factory\x20vocabulary\x20is\x20rejected',async()=>{const a={'version':0x1,'rules':{'domains':{'graph':{'rules':[{'rule_id':'R1','cases':[{'when':{'field':'kernel_fired','op':'truthy'},'level':'fact:not_a_kernel_fact','title':'t','description':'d'}]}]}}}};writeFileSync(join(CONFIG_DIR,'judgment.json'),JSON['stringify'](a),'utf-8');const b=getJudgmentDoc();expect(factoryRulePack('graph'))['not']['toBeNull']();const c=judgmentStatus();expect(c['user_doc_loaded'])['toBe'](![]),expect(c['last_reload_error'])['toContain']('fact:not_a_kernel_fact'),expect(c['last_reload_error'])['toContain']('R1'),expect(graphFindingPolicy('R1',{'eoa':'0xa'})['severity'])['toBe']('high'),void b;});});
|
|
1
|
+
import{mkdtempSync,writeFileSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{afterAll,beforeAll,describe,expect,it}from'vitest';import{beginPolicyRun,endPolicyRun,factoryRulePack,getJudgmentDoc,judgmentStatus}from'../../config/judgment.js';import{evaluateRuleBook}from'../../config/rule-engine.js';import{graphFindingPolicy}from'./policy.js';const CONFIG_DIR=mkdtempSync(join(tmpdir(),'wowok-graph-policy-'));process['env']['WOWOK_CONFIG_DIR']=CONFIG_DIR;const GRAPH_IDS=['R1','R2','R3','R4','R6','R7-treasury','R7-reward','A1','A2','A3','G2','AC1','AC2','AC3','AC4','AC5','AC6','AC7'];beforeAll(()=>{beginPolicyRun();}),afterAll(()=>{endPolicyRun();}),describe('graph\x20finding\x20policy\x20—\x20factory\x20parity',()=>{it('factory\x20pack\x20carries\x20exactly\x20the\x20kernel\x20emission\x20ids',()=>{const a=factoryRulePack('graph');expect(a)['not']['toBeNull'](),expect(a['rules']['map'](b=>b['rule_id'])['sort']())['toEqual']([...GRAPH_IDS]['sort']());}),it('static\x20literals\x20resolve\x20to\x20the\x20kernel\x20severities',()=>{expect(graphFindingPolicy('R1',{'eoa':'0xa'})['severity'])['toBe']('high'),expect(graphFindingPolicy('R4',{'only':'name:ops'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R6',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R7-treasury',{})['severity'])['toBe']('critical'),expect(graphFindingPolicy('A1',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('A2',{})['severity'])['toBe']('low'),expect(graphFindingPolicy('A3',{})['severity'])['toBe']('medium'),expect(graphFindingPolicy('G2',{})['severity'])['toBe']('low'),expect(graphFindingPolicy('AC1',{})['severity'])['toBe']('high');}),it('dynamic\x20fact:\x20levels\x20resolve\x20through\x20the\x20extractor\x20facts',()=>{expect(graphFindingPolicy('R2',{'r2_level':'high'})['severity'])['toBe']('high'),expect(graphFindingPolicy('R2',{'r2_level':'medium'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R3',{'r3_level':'medium'})['severity'])['toBe']('medium'),expect(graphFindingPolicy('R3',{'r3_level':'low'})['severity'])['toBe']('low');for(const a of['high','medium','low']){expect(graphFindingPolicy('AC2',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC3',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_machine','ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC5',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC6',{'ac_signal_level':a})['severity'])['toBe'](a),expect(graphFindingPolicy('AC7',{'ac_signal_level':a})['severity'])['toBe'](a);}}),it('R7-reward\x20mirrors\x20the\x20viability\x20gate:\x20viable\x20→\x20critical\x20confirmed',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'viable','r7_slot_audit':'#0\x20viable\x20—\x20no\x20binding'});expect(a['severity'])['toBe']('critical'),expect(a['exposure']?.['verdict'])['toBe']('confirmed'),expect(a['exposure']?.['gainPaths'][0x0]?.['gate'])['toContain']('#0\x20viable\x20—\x20no\x20binding'),expect(a['exposure']?.['gainPaths'][0x0]?.['viability'])['toBe']('viable');}),it('R7-reward\x20all-blocked\x20downgrades\x20to\x20info\x20with\x20baseSeverity\x20kept',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'blocked','r7_slot_audit':'#0\x20blocked\x20—\x20Entity\x20recipient'});expect(a['severity'])['toBe']('info'),expect(a['exposure']?.['verdict'])['toBe']('downgraded'),expect(a['exposure']?.['baseSeverity'])['toBe']('critical');}),it('R7-reward\x20undecided\x20keeps\x20critical\x20as\x20pending-disclosure',()=>{const a=graphFindingPolicy('R7-reward',{'r7_slot_viability':'unverifiable','r7_slot_audit':'#0\x20unverifiable\x20—\x20guard\x20not\x20fetched'});expect(a['severity'])['toBe']('critical'),expect(a['exposure']?.['verdict'])['toBe']('pending-disclosure');}),it('AC4\x20selects\x20the\x20attribution\x20case\x20by\x20shell\x20code',()=>{const a=graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_arbitration','ac_signal_level':'high'});expect(a['exposure']?.['lossParties']['map'](d=>d['role']))['toEqual'](['buyer']),expect(a['exposure']?.['gainPaths'][0x0]?.['role'])['toBe']('merchant');const b=graphFindingPolicy('AC4',{'ac_shell_code':'shell_no_machine','ac_signal_level':'low'});expect(b['exposure']?.['verdict'])['toBe']('confirmed');const c=graphFindingPolicy('AC4',{'ac_shell_code':'other','ac_signal_level':'high'});expect(c['enabled'])['toBe'](!![]),expect(c['severity'])['toBeNull']();}),it('an\x20emission\x20id\x20outside\x20the\x20pack\x20leaves\x20the\x20kernel\x20default\x20intact',()=>{expect(graphFindingPolicy('R5',{}))['toEqual']({'enabled':!![],'severity':null});});}),describe('graph\x20finding\x20policy\x20—\x20pack-driven\x20behavior\x20change',()=>{it('a\x20disabled\x20rule\x20id\x20suppresses\x20the\x20emission\x20with\x20a\x20trace',()=>{const {findings:a,disabled_traces:b}=evaluateRuleBook([{'rule_id':'R6','dimension':'structural','cases':[{'when':{'field':'kernel_fired','op':'truthy'},'level':'medium','title':'t','description':'d'}],'enabled':![]}],{'kernel_fired':!![]});expect(a)['toHaveLength'](0x0),expect(b)['toEqual'](['R6']);}),it('a\x20user\x20fact:\x20reference\x20outside\x20the\x20factory\x20vocabulary\x20is\x20rejected',async()=>{const a={'version':0x1,'rules':{'domains':{'graph':{'rules':[{'rule_id':'R1','cases':[{'when':{'field':'kernel_fired','op':'truthy'},'level':'fact:not_a_kernel_fact','title':'t','description':'d'}]}]}}}};writeFileSync(join(CONFIG_DIR,'judgment.json'),JSON['stringify'](a),'utf-8');const b=getJudgmentDoc();expect(factoryRulePack('graph'))['not']['toBeNull']();const c=judgmentStatus();expect(c['user_doc_loaded'])['toBe'](![]),expect(c['last_reload_error'])['toContain']('fact:not_a_kernel_fact'),expect(c['last_reload_error'])['toContain']('R1'),expect(graphFindingPolicy('R1',{'eoa':'0xa'})['severity'])['toBe']('high'),void b;});});
|
|
@@ -8,8 +8,8 @@ export { SdkDataPlane } from "./sdk-dataplane.js";
|
|
|
8
8
|
export * from "./sdk-batch.js";
|
|
9
9
|
export { expandTopology, orderCompletionInGraph } from "./expand.js";
|
|
10
10
|
export { TOPOLOGY_INTENTS, INTENT_PRESETS, EVALUATION_SERVICE_INTENTS, EVALUATION_SERVICE_BUDGET, EVALUATION_SERVICE_EDGES, resolveExpansionStrategy, withEvaluationBundle, isTopologyIntent, normalizeTopologyFocusPref, normalizeSchemaHops, type TopologyIntent, type IntentPreset, type StrategyFragment, type ExpansionStrategy, type StrategyResolutionInput, type ExplicitExpansionParams, type TopologyFocusPref, } from "./strategy.js";
|
|
11
|
-
export { detectFakeOrders, detectFakeReviews, detectShellMerchant, reputationTradeNote, assessAntiCheat, } from "./anti-cheat.js";
|
|
12
|
-
export type { AntiCheatSeverity, AntiCheatSignal, OrderEvidence, ReviewEvidence, MerchantEvidence, } from "./anti-cheat.js";
|
|
11
|
+
export { detectFakeOrders, detectFakeReviews, detectShellMerchant, reputationTradeNote, assessAntiCheat, detectNewAccountBurst, detectVoteReciprocity, detectTargetFlood, summarizeVoterCredibility, VOTER_NEW_ACCOUNT_DAYS, VOTER_BURST_MIN_VOTES, VOTER_FLOOD_MIN_VOTES, VOTER_FLOOD_LOW_CRED_RATIO, } from "./anti-cheat.js";
|
|
12
|
+
export type { AntiCheatSeverity, AntiCheatSignal, OrderEvidence, ReviewEvidence, MerchantEvidence, VoteEdgeEvidence, VoterProfileEvidence, VoterCredibility, } from "./anti-cheat.js";
|
|
13
13
|
export { buildViewport, edgesOut, edgesInc, nodeOf } from "./viewport.js";
|
|
14
14
|
export { buildRoleInterest, toCommercialRole, viewerRoleOf, type RoleInterestResult, } from "./interest.js";
|
|
15
15
|
export { buildControlIndex } from "./analyze.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from'./types.js';export*from'./edge-schema.js';export*from'./extract.js';export*from'./order-status.js';export{MAX_OBJECTS_PER_QUERY,DEFAULT_BUDGET,mergeBudget,chunk50,mapPool,FakeDataPlane}from'./dataplane.js';export{SdkDataPlane}from'./sdk-dataplane.js';export*from'./sdk-batch.js';export{expandTopology,orderCompletionInGraph}from'./expand.js';export{TOPOLOGY_INTENTS,INTENT_PRESETS,EVALUATION_SERVICE_INTENTS,EVALUATION_SERVICE_BUDGET,EVALUATION_SERVICE_EDGES,resolveExpansionStrategy,withEvaluationBundle,isTopologyIntent,normalizeTopologyFocusPref,normalizeSchemaHops}from'./strategy.js';export{detectFakeOrders,detectFakeReviews,detectShellMerchant,reputationTradeNote,assessAntiCheat}from'./anti-cheat.js';export{buildViewport,edgesOut,edgesInc,nodeOf}from'./viewport.js';export{buildRoleInterest,toCommercialRole,viewerRoleOf}from'./interest.js';export{buildControlIndex}from'./analyze.js';export{projectExploration}from'./exploration.js';export{synthesizeVerdicts}from'./synthesis.js';export{applyExposureGate,gainPath,lossParty,EXPOSURE_ROLES}from'./exposure.js';export{projectEvaluationFacts}from'./facts.js';export{projectFacets}from'./facet-projection.js';export{projectRelationshipFacts}from'./project-relationship.js';export{DEFAULT_ANALYZERS,registerAnalyzer,getAnalyzer,listAnalyzers,runAnalyzers,adaptNodeAnalyzer,runNodeAnalyzers,pathConfidence,findingWhere,findingWhereResolved}from'./analyze.js';export{buildNameIndex,createNameResolver,humanizeStoredName,humanizeTypeTag,isWfNodeId,shortAddress,wfMachineOf,wfNodeName}from'./names.js';export{buildProposalGraph,PROPOSAL_GAP_ANALYZER}from'./proposal-graph.js';
|
|
1
|
+
export*from'./types.js';export*from'./edge-schema.js';export*from'./extract.js';export*from'./order-status.js';export{MAX_OBJECTS_PER_QUERY,DEFAULT_BUDGET,mergeBudget,chunk50,mapPool,FakeDataPlane}from'./dataplane.js';export{SdkDataPlane}from'./sdk-dataplane.js';export*from'./sdk-batch.js';export{expandTopology,orderCompletionInGraph}from'./expand.js';export{TOPOLOGY_INTENTS,INTENT_PRESETS,EVALUATION_SERVICE_INTENTS,EVALUATION_SERVICE_BUDGET,EVALUATION_SERVICE_EDGES,resolveExpansionStrategy,withEvaluationBundle,isTopologyIntent,normalizeTopologyFocusPref,normalizeSchemaHops}from'./strategy.js';export{detectFakeOrders,detectFakeReviews,detectShellMerchant,reputationTradeNote,assessAntiCheat,detectNewAccountBurst,detectVoteReciprocity,detectTargetFlood,summarizeVoterCredibility,VOTER_NEW_ACCOUNT_DAYS,VOTER_BURST_MIN_VOTES,VOTER_FLOOD_MIN_VOTES,VOTER_FLOOD_LOW_CRED_RATIO}from'./anti-cheat.js';export{buildViewport,edgesOut,edgesInc,nodeOf}from'./viewport.js';export{buildRoleInterest,toCommercialRole,viewerRoleOf}from'./interest.js';export{buildControlIndex}from'./analyze.js';export{projectExploration}from'./exploration.js';export{synthesizeVerdicts}from'./synthesis.js';export{applyExposureGate,gainPath,lossParty,EXPOSURE_ROLES}from'./exposure.js';export{projectEvaluationFacts}from'./facts.js';export{projectFacets}from'./facet-projection.js';export{projectRelationshipFacts}from'./project-relationship.js';export{DEFAULT_ANALYZERS,registerAnalyzer,getAnalyzer,listAnalyzers,runAnalyzers,adaptNodeAnalyzer,runNodeAnalyzers,pathConfidence,findingWhere,findingWhereResolved}from'./analyze.js';export{buildNameIndex,createNameResolver,humanizeStoredName,humanizeTypeTag,isWfNodeId,shortAddress,wfMachineOf,wfNodeName}from'./names.js';export{buildProposalGraph,PROPOSAL_GAP_ANALYZER}from'./proposal-graph.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{rootOf}from'./extract.js';const MAX_MANAGED_TOTAL=0x3c,MAX_ORDERS=0x28,MAX_DEMANDS=0x14,MAX_ALLOCATIONS=0x28,MAX_CONTACTS=0x14,MAX_MACHINES=0xa,MAX_ARB_SERVICES=0xf;function fld(a,b){if(!a?.['raw'])return undefined;const c=rootOf(a['raw']);return c[b];}function addrList(a,b){const c=fld(a,b);return(Array['isArray'](c)?c:[])['filter'](d=>typeof d==='string');}function outEdges(a,b,c){return(a['out']['get'](b['toLowerCase']())??[])['filter'](d=>d['schema']===c);}function rawOf(a,b){return b?a['nodes']['get'](b['toLowerCase']()):undefined;}function managedTargets(a,b){const c=new Set();for(const d of[...outEdges(a,b,'permission.core_binding'),...outEdges(a,b,'permission.tx_binding')]){c['add'](d['to']);}return[...c]['map'](f=>a['nodes']['get'](f))['filter'](f=>!!f&&f['kind']==='object');}function mapMode(a){if(a===0x1||a==='Rate')return'Rate';if(a===0x2||a==='Surplus')return'Surplus';if(a===0x3||a==='RateGross')return'RateGross';return'Amount';}export function projectRelationshipFacts(b,c){const f=c['toLowerCase'](),g=outEdges(b,f,'eoa.permission'),h=[],i=new Map();for(const C of g){const D=b['nodes']['get'](C['to']);if(!D)continue;const E=outEdges(b,D['id'],'permission.entity')['map'](H=>({'address':H['to'],'perm_indices':H['payload']?.['permIndices']??[]})),F=managedTargets(b,D['id']),G=F['filter'](H=>!!H['objectType'])['map'](H=>({'object_type':H['objectType'],'address':H['id']}));for(const H of G){if(i['size']>=MAX_MANAGED_TOTAL)break;i['set'](H['address']['toLowerCase'](),H);}h['push']({'address':D['id'],'owner':fld(D,'owner')??'','admins':addrList(D,'admin'),'entities':E,'anchor_role_bits':C['payload']?.['roleBits'],'managed_objects':G});}const j=I=>[...i['values']()]['filter'](J=>J['object_type']===I)['map'](J=>J['address']),k=j('Service'),l=j('Machine')['slice'](0x0,MAX_MACHINES),n=j('Demand')['slice'](0x0,MAX_DEMANDS),p=j('Contact')['slice'](0x0,MAX_CONTACTS),q=j('Arbitration'),r=new Map();for(const I of outEdges(b,f,'eoa.order'))r['set'](I['to'],'buyer');for(const J of k){for(const K of outEdges(b,J,'service.order'))r['set'](K['to'],'merchant');}const t=[],u={};for(const L of[...r['keys']()]['slice'](0x0,MAX_ORDERS)){const M=rawOf(b,L);if(!M||M['objectType']!=='Order')continue;const N=fld(M,'service')??'';t['push']({'address':M['id'],'owner':fld(M,'owner')??fld(M,'builder')??'','agents':addrList(M,'agent'),'service':N,'amount':fld(M,'amount'),'allocation':fld(M,'allocation'),'dispute_arbitrations':addrList(M,'dispute'),'claimed_by':fld(M,'claimed_by')??null});if(N){const O=rawOf(b,N),P=outEdges(b,N,'service.permission')[0x0]?.['to'],Q=rawOf(b,P),R=fld(Q,'owner');if(R)u[O?.['id']??N['toLowerCase']()]=R;}}const v=n['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'demand.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=outEdges(b,S,'demand.presenter')['map'](Y=>({'address':Y['to'],'service':typeof Y['payload']?.['service']==='string'?Y['payload']['service']:undefined,'acceptance_score':typeof Y['payload']?.['score']==='number'?Y['payload']['score']:undefined})),X=(fld(T,'guards')??[])['map'](Y=>typeof Y==='string'?Y:Y?.['guard'])['filter'](Y=>typeof Y==='string');return{'address':T['id'],'owner':V,'presenters':W,'rewards':addrList(T,'rewards'),'guards':X};}),w=[...new Set(t['map'](S=>S['allocation'])['filter'](S=>!!S))]['slice'](0x0,MAX_ALLOCATIONS),x=w['map'](S=>{const T=rawOf(b,S),U=fld(T,'allocators')??rootOf(T['raw']),V=Array['isArray'](U)?U:Array['isArray'](U?.['allocators'])?U['allocators']:[],W=V['flatMap'](X=>(Array['isArray'](X?.['sharing'])?X['sharing']:[])['map'](Y=>({'who':Y?.['who']??Y,'mode':mapMode(Y?.['mode']),'sharing':Y?.['sharing']!=null?String(Y['sharing']):undefined,'guard':typeof X?.['guard']==='string'?X['guard']:undefined})));return{'address':T['id'],'owner':fld(T,'owner'),'sharing':W};}),y=p['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'contact.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=(fld(T,'ims')??[])['map'](X=>typeof X==='string'?X:X?.['at'])['filter'](X=>typeof X==='string');return{'address':T['id'],'ims':W,'owner':V};}),z=l['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'machine.permission')[0x0]?.['to'],V=S['toLowerCase']()+'::node::',W=b['edges']['filter'](X=>X['schema']==='wf.transition'&&X['from']['startsWith'](V))['map'](X=>({'node':X['payload']?.['prevNode']??'','next_node':X['payload']?.['node']??'','forward_name':X['payload']?.['forward']??'','named_operator':X['payload']?.['namedOperator']??null,'permission_index':X['payload']?.['permissionIndex']??null,'guard':X['payload']?.['guard']??null}));return{'address':T['id'],'permission_address':U,'forwards':W};}),A=new Map();for(const S of t){const T=r['get'](S['address']['toLowerCase']())??'buyer';for(const U of S['dispute_arbitrations']??[])A['set'](U['toLowerCase'](),T);}const B=[];for(const [V,W]of A){const X=rawOf(b,V);if(!X)continue;const Y=(fld(X,'voted')??[])['map'](Z=>({'address':typeof Z?.['voter']==='string'?Z['voter']:'','weight':typeof Z?.['weight']==='number'?Z['weight']:undefined}))['filter'](Z=>Z['address']['length']>0x0);B['push']({'address':X['id'],'object_kind':'case','voters':Y,'order':fld(X,'order'),'arbitration':fld(X,'arbitration'),'anchor_side':W,'bound_services':[]});}for(const Z of q['slice'](0x0,MAX_ARB_SERVICES)){if(A['has'](Z['toLowerCase']()))continue;B['push']({'address':Z,'object_kind':'service','voters':[],'bound_services':[]});}return{'anchor':f,'permissions':h,'machines':z,'orders':t,'demands':v,'allocations':x,'contacts':y,'arbitrations':B,'service_owners':u};}
|
|
1
|
+
import{rootOf}from'./extract.js';const MAX_MANAGED_TOTAL=0x3c,MAX_ORDERS=0x28,MAX_DEMANDS=0x14,MAX_ALLOCATIONS=0x28,MAX_CONTACTS=0x14,MAX_MACHINES=0xa,MAX_ARB_SERVICES=0xf;function fld(a,b){if(!a?.['raw'])return undefined;const c=rootOf(a['raw']);return c[b];}function addrList(a,b){const c=fld(a,b);return(Array['isArray'](c)?c:[])['filter'](d=>typeof d==='string');}function outEdges(a,b,c){return(a['out']['get'](b['toLowerCase']())??[])['filter'](d=>d['schema']===c);}function rawOf(a,b){return b?a['nodes']['get'](b['toLowerCase']()):undefined;}function managedTargets(a,b){const c=new Set();for(const d of[...outEdges(a,b,'permission.core_binding'),...outEdges(a,b,'permission.tx_binding')]){c['add'](d['to']);}return[...c]['map'](f=>a['nodes']['get'](f))['filter'](f=>!!f&&f['kind']==='object');}function mapMode(a){if(a===0x1||a==='Rate')return'Rate';if(a===0x2||a==='Surplus')return'Surplus';if(a===0x3||a==='RateGross')return'RateGross';return'Amount';}export function projectRelationshipFacts(b,c){const f=c['toLowerCase'](),g=outEdges(b,f,'eoa.permission'),h=[],i=new Map();for(const C of g){const D=b['nodes']['get'](C['to']);if(!D)continue;const E=outEdges(b,D['id'],'permission.entity')['map'](H=>({'address':H['to'],'perm_indices':H['payload']?.['permIndices']??[]})),F=managedTargets(b,D['id']),G=F['filter'](H=>!!H['objectType'])['map'](H=>({'object_type':H['objectType'],'address':H['id']}));for(const H of G){if(i['size']>=MAX_MANAGED_TOTAL)break;i['set'](H['address']['toLowerCase'](),H);}h['push']({'address':D['id'],'owner':fld(D,'owner')??'','admins':addrList(D,'admin'),'entities':E,'anchor_role_bits':C['payload']?.['roleBits'],'managed_objects':G});}const j=I=>[...i['values']()]['filter'](J=>J['object_type']===I)['map'](J=>J['address']),k=j('Service'),l=j('Machine')['slice'](0x0,MAX_MACHINES),n=j('Demand')['slice'](0x0,MAX_DEMANDS),p=j('Contact')['slice'](0x0,MAX_CONTACTS),q=j('Arbitration'),r=new Map();for(const I of outEdges(b,f,'eoa.order'))r['set'](I['to'],'buyer');for(const J of k){for(const K of outEdges(b,J,'service.order'))r['set'](K['to'],'merchant');}const t=[],u={};for(const L of[...r['keys']()]['slice'](0x0,MAX_ORDERS)){const M=rawOf(b,L);if(!M||M['objectType']!=='Order')continue;const N=fld(M,'service')??'';t['push']({'address':M['id'],'owner':fld(M,'owner')??fld(M,'builder')??'','agents':addrList(M,'agent'),'service':N,'amount':fld(M,'amount'),'allocation':fld(M,'allocation'),'dispute_arbitrations':addrList(M,'dispute'),'claimed_by':fld(M,'claimed_by')??null});if(N){const O=rawOf(b,N),P=outEdges(b,N,'service.permission')[0x0]?.['to'],Q=rawOf(b,P),R=fld(Q,'owner');if(R)u[O?.['id']??N['toLowerCase']()]=R;}}const v=n['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'demand.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=outEdges(b,S,'demand.presenter')['map'](Y=>({'address':Y['to'],'service':typeof Y['payload']?.['service']==='string'?Y['payload']['service']:undefined,'acceptance_score':typeof Y['payload']?.['score']==='number'?Y['payload']['score']:undefined,'scoredAt':typeof Y['payload']?.['feedbackTime']==='number'&&Y['payload']['feedbackTime']>0x0?Y['payload']['feedbackTime']:typeof Y['payload']?.['time']==='number'&&Y['payload']['time']>0x0?Y['payload']['time']:undefined})),X=(fld(T,'guards')??[])['map'](Y=>typeof Y==='string'?Y:Y?.['guard'])['filter'](Y=>typeof Y==='string');return{'address':T['id'],'owner':V,'presenters':W,'rewards':addrList(T,'rewards'),'guards':X};}),w=[...new Set(t['map'](S=>S['allocation'])['filter'](S=>!!S))]['slice'](0x0,MAX_ALLOCATIONS),x=w['map'](S=>{const T=rawOf(b,S),U=fld(T,'allocators')??rootOf(T['raw']),V=Array['isArray'](U)?U:Array['isArray'](U?.['allocators'])?U['allocators']:[],W=V['flatMap'](X=>(Array['isArray'](X?.['sharing'])?X['sharing']:[])['map'](Y=>({'who':Y?.['who']??Y,'mode':mapMode(Y?.['mode']),'sharing':Y?.['sharing']!=null?String(Y['sharing']):undefined,'guard':typeof X?.['guard']==='string'?X['guard']:undefined})));return{'address':T['id'],'owner':fld(T,'owner'),'sharing':W};}),y=p['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'contact.permission')[0x0]?.['to'],V=fld(rawOf(b,U),'owner')??'',W=(fld(T,'ims')??[])['map'](X=>typeof X==='string'?X:X?.['at'])['filter'](X=>typeof X==='string');return{'address':T['id'],'ims':W,'owner':V};}),z=l['map'](S=>{const T=rawOf(b,S),U=outEdges(b,S,'machine.permission')[0x0]?.['to'],V=S['toLowerCase']()+'::node::',W=b['edges']['filter'](X=>X['schema']==='wf.transition'&&X['from']['startsWith'](V))['map'](X=>({'node':X['payload']?.['prevNode']??'','next_node':X['payload']?.['node']??'','forward_name':X['payload']?.['forward']??'','named_operator':X['payload']?.['namedOperator']??null,'permission_index':X['payload']?.['permissionIndex']??null,'guard':X['payload']?.['guard']??null}));return{'address':T['id'],'permission_address':U,'forwards':W};}),A=new Map();for(const S of t){const T=r['get'](S['address']['toLowerCase']())??'buyer';for(const U of S['dispute_arbitrations']??[])A['set'](U['toLowerCase'](),T);}const B=[];for(const [V,W]of A){const X=rawOf(b,V);if(!X)continue;const Y=(fld(X,'voted')??[])['map'](Z=>({'address':typeof Z?.['voter']==='string'?Z['voter']:'','weight':typeof Z?.['weight']==='number'?Z['weight']:undefined}))['filter'](Z=>Z['address']['length']>0x0);B['push']({'address':X['id'],'object_kind':'case','voters':Y,'order':fld(X,'order'),'arbitration':fld(X,'arbitration'),'anchor_side':W,'bound_services':[]});}for(const Z of q['slice'](0x0,MAX_ARB_SERVICES)){if(A['has'](Z['toLowerCase']()))continue;B['push']({'address':Z,'object_kind':'service','voters':[],'bound_services':[]});}return{'anchor':f,'permissions':h,'machines':z,'orders':t,'demands':v,'allocations':x,'contacts':y,'arbitrations':B,'service_owners':u};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{extractTableRefs}from'./extract.js';import{FULL,fullServiceState,fullServiceTables}from'./fixtures.js';function rowsOf(a){const b=fullServiceTables()['get'](a['toLowerCase']());if(!b)throw new Error('fixture\x20table\x20missing:\x20'+a);return b;}function edgeMap(a,b){return a['edges']['filter'](c=>c['schema']===b);}describe('Task\x208\x20ledger\x20tables\x20—\x20pure\x20extraction\x20(TR-8.1)',()=>{it('treasury.record:\x20table\x20key\x20is\x20the\x20Payment,\x20row\x20carries\x20the\x20ledger\x20payload',()=>{const [a]=extractTableRefs('TreasuryRecord',FULL['tres'],rowsOf(FULL['tres']));expect(a['schemaId'])['toBe']('treasury.record'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['pay2']]),expect(a['refs'][0x0]['payload'])['toMatchObject']({'op':0x0,'signer':FULL['merchant'],'externalGuard':FULL['gWd'],'amount':'50000','time':0x18bcfe5b620,'storeFromId':null});}),it('reward.claim:\x20table\x20key\x20is\x20the\x20claimant\x20EOA,\x20payload\x20has\x20total\x20+\x20claim\x20legs',()=>{const [a]=extractTableRefs('RewardClaimRecord',FULL['rew'],rowsOf(FULL['rew']));expect(a['schemaId'])['toBe']('reward.claim'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['claimant']]),expect(a['refs'][0x0]['payload']?.['amount'])['toBe']('1000'),expect(a['refs'][0x0]['payload']?.['claims'])['toEqual']([{'guard':FULL['gClaim'],'amount':'1000','time':0x18bcfe5dd30,'storeFromId':null}]);}),it('repository.data_about:\x20DataKey.id\x20fans\x20out\x20with\x20the\x20row\x20key\x20name',()=>{const [a]=extractTableRefs('RepositoryData',FULL['repo'],rowsOf(FULL['repo']));expect(a['schemaId'])['toBe']('repository.data_about'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['o1']]),expect(a['refs'][0x0]['payload']?.['dataName'])['toBe']('delivery-proof');}),it('demand\x20presenter\x20table\x20fans\x20out\x20BOTH\x20presenter\x20EOA\x20edges\x20and\x20service\x20co-edges',()=>{const a=extractTableRefs('DemandPresenter',FULL['dem'],rowsOf(FULL['dem'])),b=new Map(a['map'](
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{extractTableRefs}from'./extract.js';import{FULL,fullServiceState,fullServiceTables}from'./fixtures.js';function rowsOf(a){const b=fullServiceTables()['get'](a['toLowerCase']());if(!b)throw new Error('fixture\x20table\x20missing:\x20'+a);return b;}function edgeMap(a,b){return a['edges']['filter'](c=>c['schema']===b);}describe('Task\x208\x20ledger\x20tables\x20—\x20pure\x20extraction\x20(TR-8.1)',()=>{it('treasury.record:\x20table\x20key\x20is\x20the\x20Payment,\x20row\x20carries\x20the\x20ledger\x20payload',()=>{const [a]=extractTableRefs('TreasuryRecord',FULL['tres'],rowsOf(FULL['tres']));expect(a['schemaId'])['toBe']('treasury.record'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['pay2']]),expect(a['refs'][0x0]['payload'])['toMatchObject']({'op':0x0,'signer':FULL['merchant'],'externalGuard':FULL['gWd'],'amount':'50000','time':0x18bcfe5b620,'storeFromId':null});}),it('reward.claim:\x20table\x20key\x20is\x20the\x20claimant\x20EOA,\x20payload\x20has\x20total\x20+\x20claim\x20legs',()=>{const [a]=extractTableRefs('RewardClaimRecord',FULL['rew'],rowsOf(FULL['rew']));expect(a['schemaId'])['toBe']('reward.claim'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['claimant']]),expect(a['refs'][0x0]['payload']?.['amount'])['toBe']('1000'),expect(a['refs'][0x0]['payload']?.['claims'])['toEqual']([{'guard':FULL['gClaim'],'amount':'1000','time':0x18bcfe5dd30,'storeFromId':null}]);}),it('repository.data_about:\x20DataKey.id\x20fans\x20out\x20with\x20the\x20row\x20key\x20name',()=>{const [a]=extractTableRefs('RepositoryData',FULL['repo'],rowsOf(FULL['repo']));expect(a['schemaId'])['toBe']('repository.data_about'),expect(a['refs']['map'](b=>b['to']))['toEqual']([FULL['o1']]),expect(a['refs'][0x0]['payload']?.['dataName'])['toBe']('delivery-proof');}),it('demand\x20presenter\x20table\x20fans\x20out\x20BOTH\x20presenter\x20EOA\x20edges\x20and\x20service\x20co-edges',()=>{const a=extractTableRefs('DemandPresenter',FULL['dem'],rowsOf(FULL['dem'])),b=new Map(a['map'](e=>[e['schemaId'],e['refs']]));expect(b['get']('demand.presenter')?.['map'](e=>e['to'])['sort']())['toEqual']([FULL['member'],FULL['supplier']]['sort']());const c=b['get']('demand.presenter_service');expect(c['map'](e=>e['to']))['toEqual']([FULL['svc']]),expect(c[0x0]['key'])['toBe'](FULL['supplier']),expect(c[0x0]['payload'])['toMatchObject']({'presenter':FULL['supplier'],'score':0x5a}),expect(c[0x0]['payload'])['toMatchObject']({'time':0x18bcfe56800,'feedbackTime':0x0});const d=b['get']('demand.presenter')['find'](e=>e['to']===FULL['supplier']);expect(d['payload'])['toMatchObject']({'time':0x18bcfe56800,'feedbackTime':0x0,'feedback':''});}),it('malformed\x20keys\x20/\x20missing\x20targets\x20are\x20skipped,\x20never\x20thrown',()=>{const a=[{'key':'not-an-address','objectId':'x','object':{'object':'x','data':{'op':0x1}}},{'key':FULL['pay1'],'objectId':'x','object':{'object':'x','data':{'op':0x2,'signer':FULL['merchant']}}}],[b]=extractTableRefs('TreasuryRecord',FULL['tres'],a);expect(b['refs']['map'](e=>e['to']))['toEqual']([FULL['pay1']]);const c=[{'key':'02','objectId':'x','object':{'object':'x','data':{'name':'no-id'}}},{'key':'03','objectId':'x','object':{'object':'x','data':{'id':FULL['o2'],'key':'refund-proof'}}}],[d]=extractTableRefs('RepositoryData',FULL['repo'],c);expect(d['refs']['map'](e=>e['to']))['toEqual']([FULL['o2']]),expect(d['refs'][0x0]['payload']?.['dataName'])['toBe']('refund-proof');});}),describe('Task\x208\x20ledger\x20tables\x20—\x20end-to-end\x20expansion\x20from\x20seeds\x20(TR-8.1)',()=>{it('treasury.record\x20materializes\x20with\x20coin\x20type\x20from\x20the\x20Treasury<T>\x20node',async()=>{const a=new FakeDataPlane(fullServiceState()),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['tres'],'edges':{'tableEdges':['treasury.record']}}),c=edgeMap(b,'treasury.record');expect(c['map'](d=>d['to']))['toEqual']([FULL['pay2']]),expect(c[0x0]['payload']?.['coinType'])['toContain']('USDT'),expect(b['nodes']['has'](FULL['pay2']['toLowerCase']()))['toBe'](!![]);}),it('reward.claim\x20and\x20repository.data_about\x20materialize\x20through\x20the\x20table\x20channel',async()=>{const a=fullServiceState(),[b,c]=await Promise['all']([expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':FULL['rew'],'edges':{'tableEdges':['reward.claim']}}),expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':FULL['repo'],'edges':{'tableEdges':['repository.data_about']}})]);expect(edgeMap(b,'reward.claim')['map'](d=>d['to']))['toEqual']([FULL['claimant']]),expect(edgeMap(c,'repository.data_about')['map'](d=>d['to']))['toEqual']([FULL['o1']]);}),it('presenter_service\x20works\x20alone;\x20opting\x20into\x20both\x20co-edges\x20costs\x20ONE\x20physical\x20read',async()=>{const a=new FakeDataPlane(fullServiceState()),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['dem'],'edges':{'tableEdges':['demand.presenter_service']}});expect(edgeMap(b,'demand.presenter_service')['map'](f=>f['to']))['toEqual']([FULL['svc']]),expect(edgeMap(b,'demand.presenter'))['toEqual']([]),expect(a['batches']['tables'])['toBe'](0x1);const c=new FakeDataPlane(fullServiceState()),d=await expandTopology(c,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['dem'],'edges':{'tableEdges':['demand.presenter','demand.presenter_service']}});expect(edgeMap(d,'demand.presenter'))['toHaveLength'](0x2),expect(edgeMap(d,'demand.presenter_service'))['toHaveLength'](0x1),expect(c['batches']['tables'])['toBe'](0x1);}),it('table\x20pages\x20past\x20the\x20cap\x20are\x20reported\x20as\x20table_page\x20truncations',async()=>{const a=fullServiceState();a['tables']['set'](FULL['tres']['toLowerCase'](),[{'key':FULL['pay1'],'objectId':'x','object':{'object':'x','data':{'op':0x1,'amount':'1'}}},{'key':FULL['pay2'],'objectId':'x','object':{'object':'x','data':{'op':0x0,'amount':'2'}}}]);const b=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':FULL['tres'],'edges':{'tableEdges':['treasury.record']},'budget':{'perKindCaps':{'treasury.record':0x1}}}),c=b['truncations']['find'](d=>d['schema']==='treasury.record'&&d['reason']==='table_page');expect(c)['toBeDefined'](),expect(c?.['limit'])['toBe'](0x1);});}),describe('Task\x208\x20ledger\x20tables\x20—\x20opt-in\x20budget\x20protection\x20(TR-8.2)',()=>{it('no\x20table\x20opt-in\x20→\x20zero\x20table\x20RPCs\x20and\x20no\x20ledger\x20edges',async()=>{const a=new FakeDataPlane(fullServiceState()),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['tres'],'edges':{'schemas':['treasury.permission']}});expect(a['batches']['tables'])['toBe'](0x0),expect(edgeMap(b,'treasury.record'))['toEqual']([]),expect(edgeMap(b,'reward.claim'))['toEqual']([]),expect(edgeMap(b,'repository.data_about'))['toEqual']([]),expect(edgeMap(b,'demand.presenter_service'))['toEqual']([]);}),it('opting\x20into\x20one\x20ledger\x20table\x20does\x20not\x20light\x20the\x20others\x20on\x20the\x20same\x20node',async()=>{const a=new FakeDataPlane(fullServiceState()),b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['dem'],'edges':{'tableEdges':['demand.presenter']}});expect(edgeMap(b,'demand.presenter'))['toHaveLength'](0x2),expect(edgeMap(b,'demand.presenter_service'))['toEqual']([]),expect(a['batches']['tables'])['toBe'](0x1);});});
|
|
@@ -63,6 +63,9 @@ export interface TopoEdgePayload {
|
|
|
63
63
|
claims?: RewardClaimLeg[];
|
|
64
64
|
dataName?: string;
|
|
65
65
|
presenter?: string;
|
|
66
|
+
score?: number;
|
|
67
|
+
feedback?: string;
|
|
68
|
+
feedbackTime?: number;
|
|
66
69
|
description?: string;
|
|
67
70
|
registeredAt?: number;
|
|
68
71
|
profileRecords?: EntityProfileRecord[];
|