@wowok/agent-mcp 3.1.0 → 3.1.3
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/config/runtime.js +1 -1
- package/dist/customer/index.d.ts +3 -9
- package/dist/customer/index.js +1 -1
- package/dist/customer/industry-risks.d.ts +3 -17
- package/dist/customer/industry-risks.js +1 -1
- package/dist/customer/types.d.ts +1 -165
- package/dist/customer/types.js +1 -1
- package/dist/customer/user-preferences.d.ts +0 -49
- package/dist/customer/user-preferences.js +1 -1
- package/dist/evaluation/arbitration-game.js +1 -1
- package/dist/evaluation/architecture.spec.d.ts +1 -0
- package/dist/evaluation/architecture.spec.js +1 -0
- package/dist/evaluation/builtins/graph-service.d.ts +16 -0
- package/dist/evaluation/builtins/graph-service.js +1 -0
- package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
- package/dist/evaluation/builtins/graph-service.spec.js +1 -0
- package/dist/evaluation/builtins/index.d.ts +1 -1
- package/dist/evaluation/builtins/index.js +1 -1
- package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
- package/dist/evaluation/builtins/purity.spec.js +1 -0
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/facets/catalog.d.ts +19 -0
- package/dist/evaluation/facets/catalog.js +1 -0
- package/dist/evaluation/guard-scan.d.ts +10 -0
- package/dist/evaluation/guard-scan.js +1 -0
- package/dist/evaluation/location-match.js +1 -1
- package/dist/evaluation/standards.d.ts +31 -0
- package/dist/evaluation/standards.js +1 -0
- package/dist/evaluation/standards.spec.d.ts +1 -0
- package/dist/evaluation/standards.spec.js +1 -0
- package/dist/evaluation/types.d.ts +9 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-layers.d.ts +6 -5
- package/dist/extensions/industry-layers.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/goal/GoalClassifier.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +16 -3
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/dataplane.d.ts +1 -1
- package/dist/graph/onchain/dataplane.js +1 -1
- package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
- package/dist/graph/onchain/edge-batch.spec.js +1 -0
- package/dist/graph/onchain/edge-schema.d.ts +11 -3
- package/dist/graph/onchain/edge-schema.js +1 -1
- package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
- package/dist/graph/onchain/entity-profile.spec.js +1 -0
- package/dist/graph/onchain/event-history.spec.d.ts +1 -0
- package/dist/graph/onchain/event-history.spec.js +1 -0
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
- package/dist/graph/onchain/extract-deep.spec.js +1 -0
- package/dist/graph/onchain/extract.d.ts +11 -3
- package/dist/graph/onchain/extract.js +1 -1
- package/dist/graph/onchain/facet-projection.d.ts +99 -0
- package/dist/graph/onchain/facet-projection.js +1 -0
- package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
- package/dist/graph/onchain/facet-projection.spec.js +1 -0
- package/dist/graph/onchain/facts.d.ts +103 -0
- package/dist/graph/onchain/facts.js +1 -0
- package/dist/graph/onchain/facts.spec.d.ts +1 -0
- package/dist/graph/onchain/facts.spec.js +1 -0
- package/dist/graph/onchain/field-manifest.d.ts +29 -0
- package/dist/graph/onchain/field-manifest.js +1 -0
- package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
- package/dist/graph/onchain/field-manifest.spec.js +1 -0
- package/dist/graph/onchain/fixtures.d.ts +80 -0
- package/dist/graph/onchain/fixtures.js +1 -0
- package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
- package/dist/graph/onchain/fixtures.spec.js +1 -0
- package/dist/graph/onchain/index.d.ts +8 -2
- package/dist/graph/onchain/index.js +1 -1
- package/dist/graph/onchain/interest.js +1 -1
- package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
- package/dist/graph/onchain/label-lint.spec.js +1 -0
- package/dist/graph/onchain/names.d.ts +23 -0
- package/dist/graph/onchain/names.js +1 -0
- package/dist/graph/onchain/names.spec.d.ts +1 -0
- package/dist/graph/onchain/names.spec.js +1 -0
- package/dist/graph/onchain/onchain.spec.js +1 -1
- package/dist/graph/onchain/proposal-graph.d.ts +11 -0
- package/dist/graph/onchain/proposal-graph.js +1 -0
- package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
- package/dist/graph/onchain/proposal-graph.spec.js +1 -0
- package/dist/graph/onchain/sdk-batch.d.ts +5 -1
- package/dist/graph/onchain/sdk-batch.js +1 -1
- package/dist/graph/onchain/sdk-dataplane.js +1 -1
- package/dist/graph/onchain/strategy.d.ts +16 -0
- package/dist/graph/onchain/strategy.js +1 -1
- package/dist/graph/onchain/strategy.spec.js +1 -1
- package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
- package/dist/graph/onchain/table-ledger.spec.js +1 -0
- package/dist/graph/onchain/types.d.ts +51 -11
- package/dist/graph/onchain/viewport.d.ts +1 -0
- package/dist/graph/onchain/viewport.js +1 -1
- package/dist/harness/index.d.ts +1 -5
- package/dist/harness/index.js +1 -1
- package/dist/harness/verify.d.ts +6 -1
- package/dist/harness/verify.js +1 -1
- package/dist/index.js +1 -1
- package/dist/knowledge/allocation-ledger.d.ts +2 -0
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +2 -3
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/arb-risk.d.ts +0 -1
- package/dist/knowledge/arb-risk.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +0 -2
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
- package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
- package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
- package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
- package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
- package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
- package/dist/knowledge/baselines/risk-cases.js +1 -0
- package/dist/knowledge/bridge-risk.d.ts +0 -1
- package/dist/knowledge/bridge-risk.js +1 -1
- package/dist/knowledge/contact-risk.d.ts +0 -1
- package/dist/knowledge/contact-risk.js +1 -1
- package/dist/knowledge/contract-invariants.d.ts +1 -0
- package/dist/knowledge/contract-invariants.js +1 -1
- package/dist/knowledge/demand-risk.d.ts +0 -1
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-eval.d.ts +15 -0
- package/dist/knowledge/guard-eval.js +1 -0
- package/dist/knowledge/guard-eval.spec.d.ts +1 -0
- package/dist/knowledge/guard-eval.spec.js +1 -0
- package/dist/knowledge/guard-field-cognition.d.ts +48 -0
- package/dist/knowledge/guard-field-cognition.js +1 -0
- package/dist/knowledge/guard-lint.d.ts +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-risk.d.ts +4 -19
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/index.d.ts +42 -43
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-rule-node.d.ts +7 -0
- package/dist/knowledge/industry-rule-node.js +1 -0
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-risk.d.ts +0 -6
- package/dist/knowledge/machine-risk.js +1 -1
- package/dist/knowledge/order-risk.d.ts +1 -9
- package/dist/knowledge/order-risk.js +1 -1
- package/dist/knowledge/payment-risk.d.ts +0 -1
- package/dist/knowledge/payment-risk.js +1 -1
- package/dist/knowledge/permission-risk.d.ts +0 -3
- package/dist/knowledge/permission-risk.js +1 -1
- package/dist/knowledge/personal-risk.d.ts +0 -1
- package/dist/knowledge/personal-risk.js +1 -1
- package/dist/knowledge/progress-risk.d.ts +0 -2
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/proof-risk.d.ts +0 -1
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/puzzle-projections.d.ts +11 -0
- package/dist/knowledge/puzzle-projections.js +1 -0
- package/dist/knowledge/recipient-constraint.d.ts +6 -1
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/registrar-risk.d.ts +0 -1
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/repository-risk.d.ts +0 -1
- package/dist/knowledge/repository-risk.js +1 -1
- package/dist/knowledge/resource-risk.d.ts +0 -1
- package/dist/knowledge/resource-risk.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -5
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
- package/dist/knowledge/rule-node-analyzers.js +1 -0
- package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
- package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
- package/dist/knowledge/rule-outcome.d.ts +5 -0
- package/dist/knowledge/rule-outcome.js +1 -0
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocator-audit-node.d.ts +3 -0
- package/dist/knowledge/service-allocator-audit-node.js +1 -0
- package/dist/knowledge/service-risk-node.js +1 -1
- package/dist/knowledge/service-risk.d.ts +0 -3
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-risk.d.ts +2 -3
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/util-risk.d.ts +0 -1
- package/dist/knowledge/util-risk.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +2 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/persona/bridge.js +1 -1
- package/dist/persona/facet-profile.d.ts +33 -0
- package/dist/persona/facet-profile.js +1 -0
- package/dist/persona/model.d.ts +2 -1
- package/dist/persona/model.js +1 -1
- package/dist/persona/strategy-intent.js +1 -1
- package/dist/persona/topology-focus.d.ts +2 -2
- package/dist/persona/topology-focus.js +1 -1
- package/dist/persona/types.d.ts +12 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/facet-money.d.ts +22 -0
- package/dist/playbooks/service-build/facet-money.js +1 -0
- package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
- package/dist/playbooks/service-build/facet-money.spec.js +1 -0
- package/dist/playbooks/service-build/intent-analyzer.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
- package/dist/playbooks/service-build/risk-aggregator.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
- package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
- package/dist/playbooks/service-build/topology-query.d.ts +13 -2
- package/dist/playbooks/service-build/topology-query.js +1 -1
- package/dist/review/arb.d.ts +0 -2
- package/dist/review/arb.js +1 -1
- package/dist/review/order.d.ts +0 -1
- package/dist/review/order.js +1 -1
- package/dist/role/profiles.js +1 -1
- package/dist/rules.d.ts +1 -2
- package/dist/rules.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/safety/preview.js +1 -1
- package/dist/schema/call/base.d.ts +3372 -668
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/receipt.d.ts +28 -0
- package/dist/schema/call/receipt.js +1 -0
- package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
- package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
- package/dist/schema/call/semantic.d.ts +5 -2
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/treasury.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +289 -211
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +1 -1
- package/dist/schema/goal/planning.d.ts +2 -2
- package/dist/schema/index.d.ts +0 -1
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +1 -1
- package/dist/schema/keeper/index.d.ts +1 -1
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/operations.d.ts +28 -10
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +24 -24
- package/dist/schema/query/bi.d.ts +629 -14
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +9 -9
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workspace/index.d.ts +2 -2
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +10 -10
- package/dist/schemas/account_operation.schema.json +3 -3
- package/dist/schemas/bridge_operation.output.json +10 -10
- package/dist/schemas/evaluation_operation.output.json +697 -169
- package/dist/schemas/evaluation_operation.schema.json +5 -434
- package/dist/schemas/index.json +1 -7
- package/dist/schemas/keeper_operation.output.json +10 -10
- package/dist/schemas/local_history_operation.output.json +10 -10
- package/dist/schemas/local_info_operation.output.json +10 -10
- package/dist/schemas/local_mark_operation.output.json +10 -10
- package/dist/schemas/messenger_operation.output.json +10 -10
- package/dist/schemas/monitor_events.output.json +10 -10
- package/dist/schemas/monitor_subscription.output.json +10 -10
- package/dist/schemas/onchain_events.output.json +11 -11
- package/dist/schemas/onchain_operations.output.json +6369 -3736
- package/dist/schemas/onchain_operations.schema.json +48 -48
- package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
- package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_demand.schema.json +2 -2
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_order.schema.json +2 -2
- package/dist/schemas/onchain_operations_payment.schema.json +2 -2
- package/dist/schemas/onchain_operations_permission.schema.json +2 -2
- package/dist/schemas/onchain_operations_progress.schema.json +2 -2
- package/dist/schemas/onchain_operations_repository.schema.json +2 -2
- package/dist/schemas/onchain_operations_reward.schema.json +6 -6
- package/dist/schemas/onchain_operations_service.schema.json +8 -8
- package/dist/schemas/onchain_operations_treasury.schema.json +10 -10
- package/dist/schemas/onchain_table_data.output.json +78 -84
- package/dist/schemas/query_toolkit.output.json +1087 -254
- package/dist/schemas/query_toolkit.schema.json +65 -3
- package/dist/strategy/collectors.js +1 -1
- package/dist/strategy/metrics.js +1 -1
- package/dist/task/playbook.js +1 -1
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
- package/dist/tools/handlers/dispatch-expectations.js +1 -0
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/evaluation.spec.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/evaluation.d.ts +2 -0
- package/dist/tools/registry/evaluation.js +1 -0
- package/dist/tools/registry/monitor.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/shared.d.ts +0 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +4 -3
- package/dist/customer/customer-advice.d.ts +0 -32
- package/dist/customer/customer-advice.js +0 -1
- package/dist/customer/info-puzzle.d.ts +0 -146
- package/dist/customer/info-puzzle.js +0 -1
- package/dist/customer/order-strategy.d.ts +0 -17
- package/dist/customer/order-strategy.js +0 -1
- package/dist/customer/preorder-compare.d.ts +0 -24
- package/dist/customer/preorder-compare.js +0 -1
- package/dist/customer/reminder-system.d.ts +0 -42
- package/dist/customer/reminder-system.js +0 -1
- package/dist/customer/risk-assessment.d.ts +0 -13
- package/dist/customer/risk-assessment.js +0 -1
- package/dist/evaluation/builtins/service-risk.d.ts +0 -7
- package/dist/evaluation/builtins/service-risk.js +0 -1
- package/dist/knowledge/trust-metrics.d.ts +0 -66
- package/dist/knowledge/trust-metrics.js +0 -1
- package/dist/schema/trust/index.d.ts +0 -334
- package/dist/schema/trust/index.js +0 -1
- package/dist/schemas/trust_score.output.json +0 -847
- package/dist/schemas/trust_score.schema.json +0 -364
- package/dist/tools/handlers/trust.d.ts +0 -16
- package/dist/tools/handlers/trust.js +0 -1
- package/dist/tools/registry/trust.d.ts +0 -2
- package/dist/tools/registry/trust.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology,orderCompletionInGraph}from'./expand.js';import{extractObjectEdges,extractReverseRefs,extractTableRefs}from'./extract.js';import{annotateNodeName,deriveOrderCompletion,terminalNamesOfEdges,terminalNamesOfRows,workflowSubgraphFromRows,workflowSubgraphFromEdges}from'./order-status.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMAS}from'./edge-schema.js';import{FIELD_MUTABILITY_RULES,fieldMutabilityOf,isActionForbidden}from'../../knowledge/contract-invariants.js';import{buildViewport}from'./viewport.js';function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),otherBuyer=eoa(0x2),merchant=eoa(0x3),collaborator=eoa(0x4),voter1=eoa(0x5),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),o2=obj(0x6,0x16),o3=obj(0x6,0x17),o4=obj(0x6,0x18),pr1=obj(0x7,0x1f),pr2=obj(0x7,0x20),pay=obj(0x8,0x29),perm=obj(0x0,0x33),g1=obj(0xa,0x3d),g2=obj(0xa,0x3e),gShip=obj(0xa,0x3f),gOther=obj(0xa,0x45),alloc=obj(0xd,0x47),arbsvc=obj(0x3,0x51),arb=obj(0x2,0x52);function raw(a,b,c,d){return{'object':a,'type':b,'data':c,...d?{'type_raw':d}:{}};}const OBJECTS=[raw(svc,'Service',{'permission':perm,'machine':mac,'arbitrations':[arbsvc],'order_allocators':{'allocators':[{'guard':g1}]}},'0x2::service::Service<'+T_USDT+'>'),raw(o1,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'allocation':alloc,'dispute':[arb]}),raw(o2,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr2,'allocation':alloc,'dispute':[]}),raw(o3,'Order',{'builder':buyer,'agent':[],'service':svc,'dispute':[]}),raw(o4,'Order',{'builder':otherBuyer,'agent':[],'service':svc,'machine':mac,'progress':undefined,'dispute':[]}),raw(mac,'Machine',{'permission':perm,'consensus_repositories':[]}),raw(pr1,'Progress',{'machine':mac,'task':o1,'current':'done'}),raw(pr2,'Progress',{'machine':mac,'task':o2,'current':'shipping'}),raw(alloc,'Allocation',{'allocators':{'threshold':0x1,'allocators':[{'guard':g1,'mode':0x0}]}},'0x2::allocation::Allocation<'+T_USDT+'>'),raw(perm,'Permission',{'admin':[merchant]}),raw(g1,'Guard',{'relies':[g2]}),raw(g2,'Guard',{'relies':[]}),raw(gShip,'Guard',{'relies':[]}),raw(arbsvc,'Arbitration',{'permission':perm,'voting_guard':[{'guard':g1}]}),raw(arb,'Arb',{'order':o1,'arbitration':arbsvc,'voted':[{'voter':voter1,'weight':0x3}]}),raw(pay,'Payment',{'record':[{'recipient':merchant,'amount':'99900'}],'from_object':alloc,'info':{'for_object':o1,'for_guard':g1}},'0x2::payment::Payment<'+T_USDT+'>')];let TABLE_SEQ=0x0;function nodeTableItem(a,b,c){TABLE_SEQ++;const d='0x9'+TABLE_SEQ['toString'](0x10)['padStart'](0x3f,'0');return{'key':a,'objectId':d,'object':raw(d,'TableItem_MachineNode',{'name':b,'value':c})};}function permTableItem(a,b){const c='0x9'+a['slice'](0x2,0x1e)['padEnd'](0x3f,'0')['slice'](0x0,0x3f);return{'key':a,'objectId':c,'object':raw(c,'TableItem_PermissionPerm',{'address':a,'perm':b})};}function makePlane(){const a=[nodeTableItem('start','start',[]),nodeTableItem('shipping','shipping',[{'prev_node':'start','threshold':0x0,'forwards':[{'name':'f_ship','weight':0x1,'guard':gShip}]}]),nodeTableItem('done','done',[{'prev_node':'shipping','threshold':0x0,'forwards':[{'name':'f_done','weight':0x1}]}])],b=new Map(OBJECTS['map'](e=>[e['object']['toLowerCase'](),e])),c=new Map();c['set']('0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1},{'role':0x2,'order':o2,'time':0x2},{'role':0x1,'order':o3,'time':0x3}]}]])),c['set']('0xaad',new Map([[merchant,{'items':[{'role':0x1,'permission':perm,'time':0x1}]}]])),c['set']('0xaae',new Map([[perm,{'items':[{'who':svc,'time':0x1}]}]])),c['set']('0xaaf',new Map([[svc,{'items':[{'who':o1,'time':0x1},{'who':o2,'time':0x2},{'who':o4,'time':0x3},{'who':gOther,'time':0x4}]}]]));const d=new Map([[mac['toLowerCase'](),a],[perm['toLowerCase'](),[permTableItem(collaborator,[0x1,0x2])]]]);return new FakeDataPlane({'objects':b,'keyedFields':c,'tables':d});}const FULL_EDGES={'tableEdges':['machine.node','permission.entity']};async function buildBuyerGraph(a){const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES,...a?{'budget':a}:{}});return{'graph':c,'plane':b};}describe('extract\x20—\x20field\x20edges',()=>{it('reads\x20scalar,\x20vector,\x20struct\x20and\x20deep\x20nested\x20refs\x20defensively',()=>{const a=extractObjectEdges('Service',OBJECTS[0x0]),b=new Map(a['map'](c=>[c['schemaId'],c['refs']['map'](d=>d['to'])]));expect(b['get']('service.permission'))['toEqual']([perm]),expect(b['get']('service.machine'))['toEqual']([mac]),expect(b['get']('service.arbitration'))['toEqual']([arbsvc]),expect(b['get']('service.order_allocator_guard'))['toEqual']([g1]);}),it('parses\x20coin\x20type\x20T\x20and\x20money\x20payloads\x20on\x20Payment',()=>{const a=extractObjectEdges('Payment',OBJECTS['find'](d=>d['object']===pay)),b=new Map(a['map'](d=>[d['schemaId'],d])),c=b['get']('payment.recipient')['refs'][0x0];expect(c['to'])['toBe'](merchant),expect(c['payload']?.['amount'])['toBe']('99900'),expect(c['payload']?.['coinType'])['toBe'](T_USDT),expect(b['get']('payment.from_object')['refs'][0x0]['to'])['toBe'](alloc),expect(b['get']('payment.for_guard')['refs'][0x0]['to'])['toBe'](g1);}),it('reverse\x20field\x20shapes:\x20items[]\x20and\x20votes[]\x20with\x20role/vote\x20payloads',()=>{expect(extractReverseRefs('0xaa8',{'items':[{'role':0x3,'order':o1}]})[0x0]['payload']?.['roleBits'])['toBe'](0x3);const a=extractReverseRefs('0xaaa',{'votes':[{'who':voter1,'like':!![],'favor':!![]}]});expect(a[0x0]['payload']?.['voteBits'])['toBe'](0x2|0x8);}),it('machine\x20table\x20rows\x20produce\x20node\x20+\x20transition\x20+\x20guard\x20edges',()=>{const a=makePlane()['state']['tables']['get'](mac['toLowerCase']()),b=extractTableRefs('machine.node',mac,a),c=new Map(b['map'](e=>[e['schemaId'],e['refs']]));expect(c['get']('machine.node')?.['length'])['toBe'](0x3);const d=c['get']('wf.transition');expect(d['map'](e=>[e['from']['includes']('start'),e['to']['includes']('shipping')]))['toContainEqual']([!![],!![]]),expect(c['get']('wf.forward_guard')?.[0x0]['to'])['toBe'](gShip);});}),describe('order-status\x20—\x20structural\x20authority',()=>{it('terminal\x20=\x20names\x20never\x20appearing\x20as\x20prev_node',()=>{const a=terminalNamesOfEdges([{'node':'shipping','prev_node':'start'},{'node':'done','prev_node':'shipping'}]);expect([...a])['toEqual'](['done']),expect([...terminalNamesOfRows([{'name':'a','value':[]},{'name':'b','value':[{'prev_node':'a'}]}])])['toEqual'](['b']);}),it('four\x20completion\x20states',()=>{const a=new Set(['done']);expect(deriveOrderCompletion({'machine':null})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':null})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'shipping','terminalNames':a})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':a})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':null})['status'])['toBe']('unknown');}),it('name\x20vocabulary\x20is\x20annotation\x20only',()=>{expect(annotateNodeName('order_refunded'))['toBe']('refund'),expect(annotateNodeName('dispute_node'))['toBe']('exception'),expect(annotateNodeName('shipping'))['toBeNull']();}),it('workflowSubgraphFromRows\x20flattens\x20pairs/forwards\x20and\x20keeps\x20structural\x20terminals',()=>{const a=workflowSubgraphFromRows([{'name':'shipped','value':[{'prev_node':'paid','threshold':0x2,'forwards':[{'name':'ship','guard':{'guard':'0xg','retained_submission':[]},'weight':0x1},{'name':'airdrop','namedOperator':'op','permissionIndex':0x3}]}]},{'name':'done','value':[{'prev_node':'shipped','forwards':[{'name':'confirm'}]}]}],'0xm');expect(a['machine'])['toBe']('0xm'),expect(a['transitions']['map'](b=>b['prevNode']+'>'+b['forward']+'>'+b['node']))['toEqual'](['paid>ship>shipped','paid>airdrop>shipped','shipped>confirm>done']),expect(a['transitions'][0x0]['guard'])['toBe']('0xg'),expect(a['transitions'][0x0]['threshold'])['toBe'](0x2),expect(a['transitions'][0x1]['namedOperator'])['toBe']('op'),expect(a['transitions'][0x1]['permissionIndex'])['toBe'](0x3),expect([...a['terminalNames']])['toEqual'](['done']);}),it('workflowSubgraphFromEdges\x20reads\x20wf.transition\x20payloads\x20and\x20filters\x20by\x20machine',()=>{const a=[{'schema':'wf.transition','from':'0xm1::node::paid','to':'0xm1::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}},{'schema':'wf.transition','from':'0xm2::node::paid','to':'0xm2::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm'}},{'schema':'machine.node','from':'0xm1','to':'0xm1::node::paid'}],b=workflowSubgraphFromEdges(a);expect(b['transitions'])['toHaveLength'](0x2);const c=workflowSubgraphFromEdges(a,'0xm1');expect(c['transitions'])['toHaveLength'](0x1),expect(c['transitions'][0x0])['toMatchObject']({'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}),expect([...c['terminalNames']])['toEqual'](['done']);});}),describe('expandTopology\x20—\x20wave\x20BFS\x20over\x20DataPlane',()=>{it('connects\x20F/R/W/S/M\x20edges\x20with\x20dedupe\x20and\x20no\x20per-id\x20fan-out',async()=>{const {graph:a,plane:b}=await buildBuyerGraph(),c=new Set(a['edges']['map'](f=>f['schema']));for(const e of['eoa.order','order.service','order.progress','order.allocation','service.permission','service.machine','service.order_allocator_guard','service.arbitration','machine.permission','progress.machine','machine.node','wf.transition','wf.forward_guard','guard.relies','arb.order','arb.voter','allocation.guard']){expect(c['has'](e),'missing\x20edge\x20'+e)['toBe'](!![]);}const d=a['edges']['filter'](f=>f['schema']==='service.order')['map'](f=>f['to']);expect(new Set(d))['toEqual'](new Set([o1,o2,o4])),expect(a['nodes']['get'](svc)?.['objectType'])['toBe']('Service'),expect(a['edges']['length'])['toBe'](new Set(a['edges']['map'](f=>f['id']))['size']),expect(b['batches']['objects'])['toBeLessThanOrEqual'](0x6),expect(a['gaps'])['toEqual']([]);}),it('resolves\x20completion\x20from\x20the\x20graph;\x20unknown\x20when\x20machine\x20table\x20not\x20expanded',async()=>{const {graph:a}=await buildBuyerGraph();expect(orderCompletionInGraph(a,o1)['status'])['toBe']('completed'),expect(orderCompletionInGraph(a,o2)['status'])['toBe']('in_progress'),expect(orderCompletionInGraph(a,o3)['status'])['toBe']('completed');const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(orderCompletionInGraph(c,o1)['status'])['toBe']('unknown');}),it('caps\x20per-kind\x20fanout\x20and\x20records\x20truncation;\x20window\x20edges\x20flagged',async()=>{const {graph:a}=await buildBuyerGraph({'perKindCaps':{'eoa.order':0x1}});expect(a['edges']['filter'](b=>b['schema']==='eoa.order'))['toHaveLength'](0x1),expect(a['truncations']['some'](b=>b['schema']==='eoa.order'))['toBe'](!![]),expect(a['edges']['find'](b=>b['schema']==='eoa.order')?.['truncated'])['toBe'](!![]);}),it('fail-soft:\x20missing\x20objects\x20become\x20gaps,\x20build\x20still\x20succeeds',async()=>{const a=makePlane();a['state']['objects']['delete'](mac['toLowerCase']());const b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES});expect(b['nodes']['get'](mac)?.['state'])['toBe']('error'),expect(b['gaps'])['toContain'](mac),expect(b['edges']['some'](c=>c['schema']==='order.service'))['toBe'](!![]);}),it('enforces\x20maxDepth',async()=>{const {graph:a}=await buildBuyerGraph({'maxDepth':0x1});expect(a['nodes']['has'](o1))['toBe'](!![]),expect(a['nodes']['has'](svc))['toBe'](![]),expect(a['budgetExhausted']['depth'])['toBe'](!![]);});}),describe('DataPlane\x20batching',()=>{it('chunks\x20at\x2050\x20and\x20counts\x20logical\x20RPC\x20batches',async()=>{const a=new FakeDataPlane({});await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),expect(a['dedupHits'])['toBe'](0x65);});}),describe('viewport',()=>{it('buyer\x20never\x20sees\x20other\x20customers\x20through\x20service.order',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'buyer');expect(b['visibleNodes']['has'](o1))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](![]);}),it('merchant\x20sees\x20shop\x20orders\x20and\x20their\x20parties',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,merchant,'merchant');expect(b['visibleNodes']['has'](perm))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](!![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](!![]),expect(b['visibleNodes']['has'](collaborator))['toBe'](!![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](!![]);}),it('neutral\x20role\x20sees\x20the\x20full\x20canon\x20graph',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']);});}),describe('edge\x20schema\x20registry',()=>{it('covers\x20the\x20core\x20commercial\x20object\x20types',()=>{for(const a of['Service','Order','Machine','Progress','Payment','Allocation','Arbitration','Arb','Permission','Guard','Demand','Reward','Contact','Treasury']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}});}),describe('EdgeSchema.contract\x20—\x20field\x20mutability\x20ground\x20truth',()=>{const a=['service.machine','service.buy_guard','service.arbitration','service.reward','service.repository','progress.machine','progress.task','machine.consensus_repository','machine.node','allocation.guard'];it('marks\x20exactly\x20the\x20address-field\x20edges\x20with\x20mutability\x20metadata',()=>{const b=EDGE_SCHEMAS['filter'](c=>c['contract'])['map'](c=>c['id'])['sort']();expect(b)['toEqual']([...a]['sort']());}),it('carries\x20the\x20publish-freeze\x20distinction\x20(machine\x20frozen,\x20buy_guard\x20mutable)',()=>{const b=EDGE_SCHEMAS['find'](d=>d['id']==='service.machine')['contract'];expect(b['frozenWhen'])['toBe']('after\x20publish'),expect(b['forbiddenActions'])['toContain']('set'),expect(b['unfreeze'])['toBeNull']();const c=EDGE_SCHEMAS['find'](d=>d['id']==='service.buy_guard')['contract'];expect(c['frozenWhen'])['toBeNull'](),expect(c['allowedActions'])['toContain']('set');}),it('derives\x20the\x20knowledge\x20field-rule\x20table\x20without\x20duplicating\x20facts',()=>{expect(fieldMutabilityOf('Service','machine')?.['frozen_when'])['toBe']('after\x20publish'),expect(fieldMutabilityOf('Machine','nodes')?.['forbidden_actions'])['toContain']('update'),expect(fieldMutabilityOf('Allocation','allocators')?.['frozen_when'])['toBe']('after\x20create\x20(share)'),expect(EDGE_SCHEMAS['find'](c=>c['id']==='allocation.guard')['contract']['field'])['toBe']('allocators');const b=FIELD_MUTABILITY_RULES['map'](c=>c['object_type']+'.'+c['field']);expect(new Set(b)['size'])['toBe'](b['length']),expect(FIELD_MUTABILITY_RULES)['toHaveLength'](0x14),expect(isActionForbidden('Service','machine','set',!![]))['toBe'](!![]),expect(isActionForbidden('Service','machine','set',![]))['toBe'](![]),expect(isActionForbidden('Service','buy_guard','set',!![]))['toBe'](![]);});});
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology,orderCompletionInGraph}from'./expand.js';import{extractObjectEdges,extractReverseRefs,extractTableRefs}from'./extract.js';import{annotateNodeName,deriveOrderCompletion,terminalNamesOfEdges,terminalNamesOfRows,workflowSubgraphFromRows,workflowSubgraphFromEdges}from'./order-status.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMAS}from'./edge-schema.js';import{FIELD_MUTABILITY_RULES,fieldMutabilityOf,isActionForbidden}from'../../knowledge/contract-invariants.js';import{buildViewport}from'./viewport.js';function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),otherBuyer=eoa(0x2),merchant=eoa(0x3),collaborator=eoa(0x4),voter1=eoa(0x5),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),o2=obj(0x6,0x16),o3=obj(0x6,0x17),o4=obj(0x6,0x18),pr1=obj(0x7,0x1f),pr2=obj(0x7,0x20),pay=obj(0x8,0x29),perm=obj(0x0,0x33),g1=obj(0xa,0x3d),g2=obj(0xa,0x3e),gShip=obj(0xa,0x3f),gOther=obj(0xa,0x45),alloc=obj(0xd,0x47),arbsvc=obj(0x3,0x51),arb=obj(0x2,0x52);function raw(a,b,c,d){return{'object':a,'type':b,'data':c,...d?{'type_raw':d}:{}};}const OBJECTS=[raw(svc,'Service',{'permission':perm,'machine':mac,'arbitrations':[arbsvc],'order_allocators':{'allocators':[{'guard':g1}]}},'0x2::service::Service<'+T_USDT+'>'),raw(o1,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'allocation':alloc,'dispute':[arb]}),raw(o2,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr2,'allocation':alloc,'dispute':[]}),raw(o3,'Order',{'builder':buyer,'agent':[],'service':svc,'dispute':[]}),raw(o4,'Order',{'builder':otherBuyer,'agent':[],'service':svc,'machine':mac,'progress':undefined,'dispute':[]}),raw(mac,'Machine',{'permission':perm,'consensus_repositories':[]}),raw(pr1,'Progress',{'machine':mac,'task':o1,'current':'done'}),raw(pr2,'Progress',{'machine':mac,'task':o2,'current':'shipping'}),raw(alloc,'Allocation',{'allocators':{'threshold':0x1,'allocators':[{'guard':g1,'mode':0x0}]}},'0x2::allocation::Allocation<'+T_USDT+'>'),raw(perm,'Permission',{'admin':[merchant]}),raw(g1,'Guard',{'relies':[g2]}),raw(g2,'Guard',{'relies':[]}),raw(gShip,'Guard',{'relies':[]}),raw(arbsvc,'Arbitration',{'permission':perm,'voting_guard':[{'guard':g1}]}),raw(arb,'Arb',{'order':o1,'arbitration':arbsvc,'voted':[{'voter':voter1,'weight':0x3}]}),raw(pay,'Payment',{'record':[{'recipient':merchant,'amount':'99900'}],'from_object':alloc,'info':{'for_object':o1,'for_guard':g1}},'0x2::payment::Payment<'+T_USDT+'>')];let TABLE_SEQ=0x0;function nodeTableItem(a,b,c){TABLE_SEQ++;const d='0x9'+TABLE_SEQ['toString'](0x10)['padStart'](0x3f,'0');return{'key':a,'objectId':d,'object':raw(d,'TableItem_MachineNode',{'name':b,'value':c})};}function permTableItem(a,b){const c='0x9'+a['slice'](0x2,0x1e)['padEnd'](0x3f,'0')['slice'](0x0,0x3f);return{'key':a,'objectId':c,'object':raw(c,'TableItem_PermissionPerm',{'address':a,'perm':b})};}function makePlane(){const a=[nodeTableItem('start','start',[]),nodeTableItem('shipping','shipping',[{'prev_node':'start','threshold':0x0,'forwards':[{'name':'f_ship','weight':0x1,'guard':gShip}]}]),nodeTableItem('done','done',[{'prev_node':'shipping','threshold':0x0,'forwards':[{'name':'f_done','weight':0x1}]}])],b=new Map(OBJECTS['map'](e=>[e['object']['toLowerCase'](),e])),c=new Map();c['set']('0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1},{'role':0x2,'order':o2,'time':0x2},{'role':0x1,'order':o3,'time':0x3}]}]])),c['set']('0xaad',new Map([[merchant,{'items':[{'role':0x1,'permission':perm,'time':0x1}]}]])),c['set']('0xaae',new Map([[perm,{'items':[{'who':svc,'time':0x1}]}]])),c['set']('0xaaf',new Map([[svc,{'items':[{'who':o1,'time':0x1},{'who':o2,'time':0x2},{'who':o4,'time':0x3},{'who':gOther,'time':0x4}]}]]));const d=new Map([[mac['toLowerCase'](),a],[perm['toLowerCase'](),[permTableItem(collaborator,[0x1,0x2])]]]);return new FakeDataPlane({'objects':b,'keyedFields':c,'tables':d});}const FULL_EDGES={'tableEdges':['machine.node','permission.entity']};async function buildBuyerGraph(a){const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES,...a?{'budget':a}:{}});return{'graph':c,'plane':b};}describe('extract\x20—\x20field\x20edges',()=>{it('reads\x20scalar,\x20vector,\x20struct\x20and\x20deep\x20nested\x20refs\x20defensively',()=>{const a=extractObjectEdges('Service',OBJECTS[0x0]),b=new Map(a['map'](c=>[c['schemaId'],c['refs']['map'](d=>d['to'])]));expect(b['get']('service.permission'))['toEqual']([perm]),expect(b['get']('service.machine'))['toEqual']([mac]),expect(b['get']('service.arbitration'))['toEqual']([arbsvc]),expect(b['get']('service.order_allocator_guard'))['toEqual']([g1]);}),it('parses\x20coin\x20type\x20T\x20and\x20money\x20payloads\x20on\x20Payment',()=>{const a=extractObjectEdges('Payment',OBJECTS['find'](d=>d['object']===pay)),b=new Map(a['map'](d=>[d['schemaId'],d])),c=b['get']('payment.recipient')['refs'][0x0];expect(c['to'])['toBe'](merchant),expect(c['payload']?.['amount'])['toBe']('99900'),expect(c['payload']?.['coinType'])['toBe'](T_USDT),expect(b['get']('payment.from_object')['refs'][0x0]['to'])['toBe'](alloc),expect(b['get']('payment.for_guard')['refs'][0x0]['to'])['toBe'](g1);}),it('reverse\x20field\x20shapes:\x20items[]\x20and\x20votes[]\x20with\x20role/vote\x20payloads',()=>{const a=extractReverseRefs('0xaa8',{'items':[{'role':0x3,'order':o1}]});expect(a[0x0]['refs'][0x0]['payload']?.['roleBits'])['toBe'](0x3);const b=extractReverseRefs('0xaaa',{'votes':[{'who':voter1,'like':!![],'favor':!![]}]});expect(b[0x0]['refs'][0x0]['payload']?.['voteBits'])['toBe'](0x2|0x8);}),it('machine\x20table\x20rows\x20produce\x20node\x20+\x20transition\x20+\x20guard\x20edges',()=>{const a=makePlane()['state']['tables']['get'](mac['toLowerCase']()),b=extractTableRefs('MachineNode',mac,a),c=new Map(b['map'](e=>[e['schemaId'],e['refs']]));expect(c['get']('machine.node')?.['length'])['toBe'](0x3);const d=c['get']('wf.transition');expect(d['map'](e=>[e['from']['includes']('start'),e['to']['includes']('shipping')]))['toContainEqual']([!![],!![]]),expect(c['get']('wf.forward_guard')?.[0x0]['to'])['toBe'](gShip);});}),describe('order-status\x20—\x20structural\x20authority',()=>{it('terminal\x20=\x20names\x20never\x20appearing\x20as\x20prev_node',()=>{const a=terminalNamesOfEdges([{'node':'shipping','prev_node':'start'},{'node':'done','prev_node':'shipping'}]);expect([...a])['toEqual'](['done']),expect([...terminalNamesOfRows([{'name':'a','value':[]},{'name':'b','value':[{'prev_node':'a'}]}])])['toEqual'](['b']);}),it('four\x20completion\x20states',()=>{const a=new Set(['done']);expect(deriveOrderCompletion({'machine':null})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':null})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'shipping','terminalNames':a})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':a})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':null})['status'])['toBe']('unknown');}),it('name\x20vocabulary\x20is\x20annotation\x20only',()=>{expect(annotateNodeName('order_refunded'))['toBe']('refund'),expect(annotateNodeName('dispute_node'))['toBe']('exception'),expect(annotateNodeName('shipping'))['toBeNull']();}),it('workflowSubgraphFromRows\x20flattens\x20pairs/forwards\x20and\x20keeps\x20structural\x20terminals',()=>{const a=workflowSubgraphFromRows([{'name':'shipped','value':[{'prev_node':'paid','threshold':0x2,'forwards':[{'name':'ship','guard':{'guard':'0xg','retained_submission':[]},'weight':0x1},{'name':'airdrop','namedOperator':'op','permissionIndex':0x3}]}]},{'name':'done','value':[{'prev_node':'shipped','forwards':[{'name':'confirm'}]}]}],'0xm');expect(a['machine'])['toBe']('0xm'),expect(a['transitions']['map'](b=>b['prevNode']+'>'+b['forward']+'>'+b['node']))['toEqual'](['paid>ship>shipped','paid>airdrop>shipped','shipped>confirm>done']),expect(a['transitions'][0x0]['guard'])['toBe']('0xg'),expect(a['transitions'][0x0]['threshold'])['toBe'](0x2),expect(a['transitions'][0x1]['namedOperator'])['toBe']('op'),expect(a['transitions'][0x1]['permissionIndex'])['toBe'](0x3),expect([...a['terminalNames']])['toEqual'](['done']);}),it('workflowSubgraphFromEdges\x20reads\x20wf.transition\x20payloads\x20and\x20filters\x20by\x20machine',()=>{const a=[{'schema':'wf.transition','from':'0xm1::node::paid','to':'0xm1::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}},{'schema':'wf.transition','from':'0xm2::node::paid','to':'0xm2::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm'}},{'schema':'machine.node','from':'0xm1','to':'0xm1::node::paid'}],b=workflowSubgraphFromEdges(a);expect(b['transitions'])['toHaveLength'](0x2);const c=workflowSubgraphFromEdges(a,'0xm1');expect(c['transitions'])['toHaveLength'](0x1),expect(c['transitions'][0x0])['toMatchObject']({'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}),expect([...c['terminalNames']])['toEqual'](['done']);});}),describe('expandTopology\x20—\x20wave\x20BFS\x20over\x20DataPlane',()=>{it('connects\x20F/R/W/S/M\x20edges\x20with\x20dedupe\x20and\x20no\x20per-id\x20fan-out',async()=>{const {graph:a,plane:b}=await buildBuyerGraph(),c=new Set(a['edges']['map'](f=>f['schema']));for(const e of['eoa.order','order.service','order.progress','order.allocation','service.permission','service.machine','service.order_allocator_guard','service.arbitration','machine.permission','progress.machine','machine.node','wf.transition','wf.forward_guard','guard.relies','arb.order','arb.voter','allocation.guard']){expect(c['has'](e),'missing\x20edge\x20'+e)['toBe'](!![]);}const d=a['edges']['filter'](f=>f['schema']==='service.order')['map'](f=>f['to']);expect(new Set(d))['toEqual'](new Set([o1,o2,o4])),expect(a['nodes']['get'](svc)?.['objectType'])['toBe']('Service'),expect(a['edges']['length'])['toBe'](new Set(a['edges']['map'](f=>f['id']))['size']),expect(b['batches']['objects'])['toBeLessThanOrEqual'](0x6),expect(a['gaps'])['toEqual']([]);}),it('resolves\x20completion\x20from\x20the\x20graph;\x20unknown\x20when\x20machine\x20table\x20not\x20expanded',async()=>{const {graph:a}=await buildBuyerGraph();expect(orderCompletionInGraph(a,o1)['status'])['toBe']('completed'),expect(orderCompletionInGraph(a,o2)['status'])['toBe']('in_progress'),expect(orderCompletionInGraph(a,o3)['status'])['toBe']('completed');const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(orderCompletionInGraph(c,o1)['status'])['toBe']('unknown');}),it('caps\x20per-kind\x20fanout\x20and\x20records\x20truncation;\x20window\x20edges\x20flagged',async()=>{const {graph:a}=await buildBuyerGraph({'perKindCaps':{'eoa.order':0x1}});expect(a['edges']['filter'](b=>b['schema']==='eoa.order'))['toHaveLength'](0x1),expect(a['truncations']['some'](b=>b['schema']==='eoa.order'))['toBe'](!![]),expect(a['edges']['find'](b=>b['schema']==='eoa.order')?.['truncated'])['toBe'](!![]);}),it('fail-soft:\x20missing\x20objects\x20become\x20gaps,\x20build\x20still\x20succeeds',async()=>{const a=makePlane();a['state']['objects']['delete'](mac['toLowerCase']());const b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES});expect(b['nodes']['get'](mac)?.['state'])['toBe']('error'),expect(b['gaps'])['toContain'](mac),expect(b['edges']['some'](c=>c['schema']==='order.service'))['toBe'](!![]);}),it('enforces\x20maxDepth',async()=>{const {graph:a}=await buildBuyerGraph({'maxDepth':0x1});expect(a['nodes']['has'](o1))['toBe'](!![]),expect(a['nodes']['has'](svc))['toBe'](![]),expect(a['budgetExhausted']['depth'])['toBe'](!![]);});}),describe('DataPlane\x20batching',()=>{it('chunks\x20at\x2050\x20and\x20counts\x20logical\x20RPC\x20batches',async()=>{const a=new FakeDataPlane({});await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),expect(a['dedupHits'])['toBe'](0x65);});}),describe('viewport',()=>{it('buyer\x20never\x20sees\x20other\x20customers\x20through\x20service.order',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'buyer');expect(b['visibleNodes']['has'](o1))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](![]);}),it('merchant\x20sees\x20shop\x20orders\x20and\x20their\x20parties',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,merchant,'merchant');expect(b['visibleNodes']['has'](perm))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](!![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](!![]),expect(b['visibleNodes']['has'](collaborator))['toBe'](!![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](!![]);}),it('neutral\x20role\x20sees\x20the\x20full\x20canon\x20graph',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']);});}),describe('edge\x20schema\x20registry',()=>{it('covers\x20the\x20core\x20commercial\x20object\x20types',()=>{for(const a of['Service','Order','Machine','Progress','Payment','Allocation','Arbitration','Arb','Permission','Guard','Demand','Reward','Contact','Treasury']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}});}),describe('EdgeSchema.contract\x20—\x20field\x20mutability\x20ground\x20truth',()=>{const a=['service.machine','service.buy_guard','service.arbitration','service.reward','service.repository','progress.machine','progress.task','machine.consensus_repository','machine.node','allocation.guard','permission.owner','contact.im','payment.signer'];it('marks\x20exactly\x20the\x20address-field\x20edges\x20with\x20mutability\x20metadata',()=>{const b=EDGE_SCHEMAS['filter'](c=>c['contract'])['map'](c=>c['id'])['sort']();expect(b)['toEqual']([...a]['sort']());}),it('carries\x20the\x20publish-freeze\x20distinction\x20(machine\x20frozen,\x20buy_guard\x20mutable)',()=>{const b=EDGE_SCHEMAS['find'](d=>d['id']==='service.machine')['contract'];expect(b['frozenWhen'])['toBe']('after\x20publish'),expect(b['forbiddenActions'])['toContain']('set'),expect(b['unfreeze'])['toBeNull']();const c=EDGE_SCHEMAS['find'](d=>d['id']==='service.buy_guard')['contract'];expect(c['frozenWhen'])['toBeNull'](),expect(c['allowedActions'])['toContain']('set');}),it('derives\x20the\x20knowledge\x20field-rule\x20table\x20without\x20duplicating\x20facts',()=>{expect(fieldMutabilityOf('Service','machine')?.['frozen_when'])['toBe']('after\x20publish'),expect(fieldMutabilityOf('Machine','nodes')?.['forbidden_actions'])['toContain']('update'),expect(fieldMutabilityOf('Allocation','allocators')?.['frozen_when'])['toBe']('after\x20create\x20(share)'),expect(EDGE_SCHEMAS['find'](c=>c['id']==='allocation.guard')['contract']['field'])['toBe']('allocators');const b=FIELD_MUTABILITY_RULES['map'](c=>c['object_type']+'.'+c['field']);expect(new Set(b)['size'])['toBe'](b['length']),expect(FIELD_MUTABILITY_RULES)['toHaveLength'](0x17),expect(isActionForbidden('Service','machine','set',!![]))['toBe'](!![]),expect(isActionForbidden('Service','machine','set',![]))['toBe'](![]),expect(isActionForbidden('Service','buy_guard','set',!![]))['toBe'](![]);});}),describe('expand\x20—\x20per-schema\x20hop\x20cap',()=>{const a=obj(0xa,0x5b),b=obj(0xa,0x5c),c=obj(0xa,0x5d),d=obj(0xa,0x5e);function e(){const f=new Map([raw(a,'Guard',{'relies':[b,d]}),raw(b,'Guard',{'relies':[c,d]}),raw(c,'Guard',{'relies':[]}),raw(d,'Guard',{'relies':[]})]['map'](g=>[g['object']['toLowerCase'](),g]));return new FakeDataPlane({'objects':f,'keyedFields':new Map(),'tables':new Map()});}it('cuts\x20guard.relies\x20beyond\x20one\x20hop,\x20keeps\x20closure\x20edges,\x20reports\x20schema_hops',async()=>{const f=await expandTopology(e(),{'network':ENTRYPOINT['Mainnet'],'seed':a}),g=f['edges']['filter'](i=>i['schema']==='guard.relies'),h=(i,j)=>g['some'](k=>k['from']===i&&k['to']===j);expect(h(a,b))['toBe'](!![]),expect(h(a,d))['toBe'](!![]),expect(h(b,d))['toBe'](!![]),expect(h(b,c))['toBe'](![]),expect(f['nodes']['has'](c))['toBe'](![]),expect(f['truncations'])['toEqual']([{'nodeId':b,'schema':'guard.relies','observed':0x1,'limit':0x1,'reason':'schema_hops'}]),expect(f['gaps'])['toEqual']([]);}),it('declares\x20maxHops=1\x20on\x20guard.relies\x20and\x20nowhere\x20else',()=>{const f=EDGE_SCHEMAS['filter'](g=>g['maxHops']!==undefined)['map'](g=>g['id']);expect(f)['toEqual'](['guard.relies']);});});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ENTRYPOINT } from "@wowok/wowok";
|
|
2
|
+
import type { ObjectPuzzleEntry } from "../../playbooks/service-build/business-puzzle.js";
|
|
3
|
+
import type { Analyzer, DataPlane, TopoNode, TopologyGraph } from "./types.js";
|
|
4
|
+
export declare function makeProposalNode(key: string, puzzle: unknown, missingDimensions?: string[]): TopoNode;
|
|
5
|
+
export interface ProposalGraphOptions {
|
|
6
|
+
network: ENTRYPOINT;
|
|
7
|
+
seed?: string;
|
|
8
|
+
plane?: DataPlane;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildProposalGraph(puzzles: Record<string, ObjectPuzzleEntry>, opts: ProposalGraphOptions): Promise<TopologyGraph>;
|
|
11
|
+
export declare const PROPOSAL_GAP_ANALYZER: Analyzer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{wowAddressKind}from'@wowok/wowok';import{inferObjectType}from'./extract.js';const PROJECT_TO_SDK={'service':'Service','machine':'Machine','allocation':'Allocation','treasury':'Treasury','arb':'Arb','reward':'Reward','progress':'Progress','order':'Order','permission':'Permission','guard':'Guard','contact':'Contact','repository':'Repository','demand':'Demand','payment':'Payment','proof':'Proof','resource':'Resource','registrar':'EntityRegistrar','personal':'Personal','util':'Util','bridge':'Bridge'},EXTERNAL_PROVENANCE_KEYS=new Set(['bridge']);function sdkObjectTypeOf(a){return PROJECT_TO_SDK[a['trim']()['toLowerCase']()];}export function makeProposalNode(a,b,c=[]){const d='proposal::'+a['trim']()['toLowerCase'](),e=a['trim']()['toLowerCase']();return{'id':d,'kind':'object','objectType':sdkObjectTypeOf(a),'state':'stub','raw':{'object':d,'data':b},'origins':[],'depth':0x0,'proposal':{'sourceKey':a,'missingDimensions':[...c],...EXTERNAL_PROVENANCE_KEYS['has'](e)?{'provenance':'external'}:{}}};}const MAX_WALK_DEPTH=0x8,MAX_REFS_PER_PROPOSAL=0x40,GAP_PREFIX='proposal-graph:';function toCanonicalAddress(a){const b=a['toLowerCase']()['startsWith']('0x'),c=b?a['slice'](0x2):a;if(c['length']===0x0||c['length']>0x40||!/^[0-9a-f]+$/['test'](c))return undefined;if(!b&&c['length']<0x4)return undefined;return'0x'+c['padStart'](0x40,'0');}export async function buildProposalGraph(a,b){const c=Date['now'](),d=new Map(),e=[],f=new Map(),g=new Map(),h=[],i=[],j=new Map();let k=0x0;const l=Object['keys'](a??{}),m=t=>'proposal::'+t['trim']()['toLowerCase'](),n=t=>{if(d['has'](t['id'])){k++;return;}d['set'](t['id'],t);},o=t=>{f['set'](t['from'],[...f['get'](t['from'])??[],t]),g['set'](t['to'],[...g['get'](t['to'])??[],t]),e['push'](t);};for(const t of l){const u=a[t];n(makeProposalNode(t,u?.['puzzle'],u?.['missing_dimensions']??[]));}const p=new Set(l['map'](v=>v['trim']()['toLowerCase']())),q=(v,w)=>{const x=[];let y=![];const z=new WeakSet(),A=(B,C,D)=>{if(x['length']>=MAX_REFS_PER_PROPOSAL){!y&&(y=!![],h['push'](GAP_PREFIX+'\x20fanout\x20cap\x20('+MAX_REFS_PER_PROPOSAL+')\x20reached\x20at\x20'+v+'\x20—\x20remaining\x20references\x20skipped'),i['push']({'nodeId':v,'schema':'proposal.*','observed':MAX_REFS_PER_PROPOSAL,'limit':MAX_REFS_PER_PROPOSAL,'reason':'fanout'}));return;}if(D>MAX_WALK_DEPTH||B==null||B==='')return;if(typeof B==='string'){const E=B['trim']();if(!E)return;if(p['has'](E['toLowerCase']())&&m(E)!==v){x['push']({'fieldPath':C,'target':E,'kind':'proposal'});return;}const F=toCanonicalAddress(E);if(!F)return;x['push']({'fieldPath':C,'target':F,'kind':wowAddressKind(F)==='user'?'eoa':'object'});return;}if(typeof B!=='object')return;if(z['has'](B))return;z['add'](B);if(Array['isArray'](B))B['forEach']((G,H)=>A(G,C+'.'+H,D+0x1));else for(const [G,H]of Object['entries'](B)){A(H,C?C+'.'+G:G,D+0x1);}};return A(w,'',0x0),x;};for(const v of l){const w=m(v),x=q(w,a[v]?.['puzzle']);if(x['length']===0x0)continue;j['set'](w,x);for(const y of x){const z=y['kind']==='proposal'?m(y['target']):y['target'];n({'id':z,'kind':y['kind']==='eoa'?'eoa':'object',...y['kind']==='object'?{'objectType':inferObjectType(y['target'])}:{},'state':'stub','origins':[{'via':'proposal.'+y['fieldPath'],'from':w,'depth':0x1}],'depth':0x1}),o({'id':'proposal.'+y['fieldPath']+'|'+w+'→'+z,'schema':'proposal.'+y['fieldPath'],'family':'F','from':w,'to':z,'retention':'derived','evidence':'business-puzzle\x20snapshot','observedAt':c,'payload':{'fieldPath':y['fieldPath']}});}}const r=[...new Set([...j['values']()]['flatMap'](A=>A['filter'](B=>B['kind']==='object')['map'](B=>B['target'])))];if(b['plane']&&r['length']>0x0){const A=await b['plane']['getObjects'](r);for(const B of r){const C=d['get'](B);if(!C)continue;const D=A['get'](B);if(D){C['state']='fetched',C['raw']=D;if(D['type'])C['objectType']=String(D['type']);}else h['push'](GAP_PREFIX+'\x20unresolved\x20object\x20reference\x20'+B+'\x20—\x20stays\x20a\x20stub');}}else!b['plane']&&r['length']>0x0&&h['push'](GAP_PREFIX+'\x20no\x20DataPlane\x20—\x20'+r['length']+'\x20object\x20reference(s)\x20stay\x20stubs');const s=(b['seed']??[...d['values']()]['filter'](E=>E['proposal'])['map'](E=>E['id'])['sort']()[0x0]??'')['toLowerCase']();return{'network':b['network'],'seed':s,'builtAt':c,'nodes':d,'edges':e,'out':f,'inc':g,'gaps':h,'truncations':i,'rpcReport':{'batches':b['plane']&&r['length']>0x0?0x1:0x0,'byChannel':{'objects':b['plane']?r['length']:0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':k},'budgetExhausted':{}};}const MAX_PROPOSAL_FINDINGS=0x14;export const PROPOSAL_GAP_ANALYZER={'id':'proposal.gap','kind':'risk','run'(a){const b=[];for(const c of a['visibleNodes']){if(b['length']>=MAX_PROPOSAL_FINDINGS)break;const d=a['graph']['nodes']['get'](c),e=d?.['proposal'];if(!e||e['missingDimensions']['length']===0x0)continue;b['push']({'id':'proposal.gap:'+d['id'],'kind':'risk','severity':'info','title':'Proposal\x20\x27'+e['sourceKey']+'\x27\x20is\x20missing\x20puzzle\x20dimensions','path':[d['id']],'confidence':'exact','roles':['neutral','merchant'],'detail':'Business\x20puzzle\x20for\x20\x27'+e['sourceKey']+'\x27\x20still\x20misses:\x20'+e['missingDimensions']['join'](',\x20')+'.','suggestion':'Complete\x20the\x20missing\x20dimensions\x20of\x20\x27'+e['sourceKey']+'\x27\x20before\x20publishing.','source':'proposal'});}return b;}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,it,expect}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{buildProposalGraph,buildViewport,runAnalyzers,listAnalyzers,FakeDataPlane}from'./index.js';import{RISK_CASES}from'../../knowledge/baselines/risk-cases.js';import{analyzeBusinessIntent}from'../../playbooks/service-build/business-puzzle.js';const EOA='0x'+'00'['repeat'](0x20),MACHINE='0x'+'15'+'ab'['repeat'](0x1f),SERVICE_ONCHAIN='0x'+'14'+'cd'['repeat'](0x1f),entry=(a,b=[])=>({'puzzle':a,'completeness':{},'missing_dimensions':b}),SNAPSHOT={'service':entry({'binding':{'permission':'Permission','machine':MACHINE,'arbitrations':[],'buy_guard':null,'um':''},'owner_note':'plain\x20prose,\x20never\x20an\x20address','admin':EOA,'upgrade_to':SERVICE_ONCHAIN},['Pricing','Arbitration']),'permission':entry({'threshold':0x2,'note':'co-sign'})};async function build(a,b){return buildProposalGraph(a,{'network':ENTRYPOINT['Testnet'],...b?{'plane':b['plane']}:{}});}describe('buildProposalGraph\x20(T22)',()=>{it('TR-22.1\x20synthesizes\x20one\x20proposal\x20node\x20per\x20snapshot\x20key',async()=>{const a=await build(SNAPSHOT);expect(a['nodes']['size'])['toBe'](0x2+0x3),expect(a['nodes']['get']('proposal::service')?.['proposal'])['toEqual']({'sourceKey':'service','missingDimensions':['Pricing','Arbitration']}),expect(a['nodes']['get']('proposal::permission')?.['proposal']?.['missingDimensions'])['toEqual']([]),expect(a['nodes']['get']('proposal::service')?.['objectType'])['toBe']('Service'),expect(a['nodes']['get']('proposal::permission')?.['objectType'])['toBe']('Permission');const b=a['nodes']['get']('proposal::service');expect(b['state'])['toBe']('stub'),expect(b['kind'])['toBe']('object'),expect((b['raw']?.['data'])['binding'])['toBeDefined'](),expect(b['depth'])['toBe'](0x0);}),it('TR-22.1\x20edges\x20mirror\x20declared\x20references\x20with\x20proposal.*\x20schemas',async()=>{const a=await build(SNAPSHOT);expect(a['edges']['length'])['toBe'](0x4);const b=a['edges']['map'](d=>d['schema'])['sort']();expect(b)['toEqual'](['proposal.admin','proposal.binding.machine','proposal.binding.permission','proposal.upgrade_to']);for(const d of a['edges']){expect(d['family'])['toBe']('F'),expect(d['retention'])['toBe']('derived'),expect(d['evidence'])['toBe']('business-puzzle\x20snapshot'),expect(d['from'])['toBe']('proposal::service'),expect(d['payload']?.['fieldPath'])['toBe'](d['schema']['slice']('proposal.'['length']));}expect(a['nodes']['get'](MACHINE)?.['kind'])['toBe']('object'),expect(a['nodes']['get'](MACHINE)?.['objectType'])['toBe']('Machine'),expect(a['nodes']['get'](SERVICE_ONCHAIN)?.['objectType'])['toBe']('Service'),expect(a['nodes']['get'](EOA)?.['kind'])['toBe']('eoa'),expect(a['nodes']['get'](MACHINE)?.['depth'])['toBe'](0x1),expect(a['nodes']['get'](MACHINE)?.['origins'][0x0]?.['via'])['toBe']('proposal.binding.machine');const c=a['edges']['find'](f=>f['schema']==='proposal.binding.permission');expect(c['to'])['toBe']('proposal::permission');}),it('TR-22.1\x20missing\x20dimensions\x20produce\x20proposal-gap\x20findings,\x20never\x20throws',async()=>{const a=await build(SNAPSHOT),b=buildViewport(a,EOA,'neutral'),c=runAnalyzers(b),d=c['filter'](e=>e['id']['startsWith']('proposal.gap'));expect(d['length'])['toBe'](0x1),expect(d[0x0]['source'])['toBe']('proposal'),expect(d[0x0]['severity'])['toBe']('info'),expect(d[0x0]['detail'])['toContain']('Pricing'),expect(d[0x0]['detail'])['toContain']('Arbitration'),expect(d[0x0]['path'])['toEqual'](['proposal::service']);}),it('whole\x20analysis\x20stack\x20runs\x20unmodified;\x20no\x20on-chain\x20analyzer\x20misfires',async()=>{const a=await build(SNAPSHOT),b=buildViewport(a,EOA,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']),expect(b['visibleEdges']['length'])['toBe'](a['edges']['length']);const c=runAnalyzers(b);for(const e of c)expect(e['id']['startsWith']('proposal.gap'))['toBe'](!![]);expect(listAnalyzers())['toContain']('proposal.gap');const d=buildViewport(a,'proposal::service','merchant');expect(d['visibleNodes']['size'])['toBe'](a['nodes']['size']),expect(d['visibleEdges']['length'])['toBe'](a['edges']['length']);}),it('no\x20DataPlane:\x20chain\x20refs\x20stay\x20stubs\x20with\x20a\x20gap\x20line',async()=>{const a=await build(SNAPSHOT);expect(a['nodes']['get'](MACHINE)?.['state'])['toBe']('stub'),expect(a['gaps']['some'](b=>b['includes']('no\x20DataPlane')))['toBe'](!![]),expect(a['rpcReport']['batches'])['toBe'](0x0);}),it('FakeDataPlane\x20enriches\x20known\x20refs,\x20unknown\x20refs\x20degrade\x20to\x20stub\x20+\x20gap',async()=>{const a=new FakeDataPlane({'objects':new Map([[MACHINE,{'object':MACHINE,'type':'Machine','data':{'pairs':[]}}]])}),b=await build(SNAPSHOT,{'plane':a}),c=b['nodes']['get'](MACHINE);expect(c['state'])['toBe']('fetched'),expect(c['raw']?.['type'])['toBe']('Machine'),expect(c['objectType'])['toBe']('Machine'),expect(b['nodes']['get'](SERVICE_ONCHAIN)?.['state'])['toBe']('stub'),expect(b['gaps']['some'](d=>d['includes']('unresolved\x20object\x20reference')))['toBe'](!![]),expect(b['rpcReport']['batches'])['toBe'](0x1);}),it('real\x20analyzeBusinessIntent\x20snapshot\x20builds\x20consistently\x20(Task\x202\x20baseline)',async()=>{const a=analyzeBusinessIntent({'user_intent':'I\x20want\x20to\x20sell\x20products\x20in\x20an\x20online\x20store\x20with\x20arbitration\x20protection'}),b=a['puzzles'];expect(Object['keys'](b)['length'])['toBeGreaterThan'](0x0);const c=await build(b),d=[...c['nodes']['values']()]['filter'](h=>h['proposal']);expect(d['length'])['toBe'](Object['keys'](b)['length']);for(const h of c['edges']){expect(h['from']['startsWith']('proposal::'))['toBe'](!![]),expect(c['nodes']['has'](h['to']))['toBe'](!![]);}const f=runAnalyzers(buildViewport(c,EOA,'neutral'));expect(Array['isArray'](f))['toBe'](!![]);}),it('RISK_CASES\x20baseline\x20contexts\x20build\x20without\x20throwing\x20(all\x2021\x20packs)',async()=>{const a=new Set(RISK_CASES['map'](g=>g['objectType'])),b={};for(const g of RISK_CASES)b[g['objectType']]=entry(g['empty']);const d=await build(b);expect(d['nodes']['size'])['toBe'](a['size']),expect(d['edges']['length'])['toBe'](0x0);const e={};for(const h of RISK_CASES)e[h['objectType']]=entry(h['trigger']);const f=await build(e);expect(f['nodes']['size'])['toBe'](a['size']+0x41),expect(f['truncations'])['toEqual']([{'nodeId':'proposal::reward','schema':'proposal.*','observed':0x40,'limit':0x40,'reason':'fanout'}]),expect(f['edges']['filter'](i=>i['from']==='proposal::reward')['length'])['toBe'](0x40);}),it('cycle-safe:\x20self-referencing\x20puzzle\x20payloads\x20terminate',async()=>{const a={'name':'a'};a['self']=a;const b={'tag':'x'};b['back']=b;const c=await build({'service':entry({'loop':a,'shared':b})});expect(c['nodes']['has']('proposal::service'))['toBe'](!![]),expect(c['edges']['length'])['toBe'](0x0);}),it('fanout\x20cap:\x20>64\x20references\x20truncate\x20with\x20an\x20explicit\x20record',async()=>{const a={'guards':Array['from']({'length':0x50},(d,e)=>'0x'+(e+0x1)['toString'](0x10)['padStart'](0x40,'0'))},b=await build({'machine':entry(a)}),c=b['edges']['filter'](d=>d['from']==='proposal::machine');expect(c['length'])['toBe'](0x40),expect(b['truncations']['length'])['toBe'](0x1),expect(b['truncations'][0x0]['reason'])['toBe']('fanout'),expect(b['gaps']['some'](d=>d['includes']('fanout\x20cap')))['toBe'](!![]);}),it('seed\x20defaults\x20to\x20the\x20first\x20proposal\x20node;\x20shorthand\x20hex\x20pads\x20left\x20(chain\x20convention)',async()=>{const a=await build(SNAPSHOT);expect(a['seed'])['toBe']('proposal::permission');const b=await build({'service':entry({'fee_receiver':'0x15'})}),c=[...b['nodes']['values']()]['find'](d=>d['id']['startsWith']('0x'));expect(c?.['id'])['toBe']('0x'+'15'['padStart'](0x40,'0')),expect(c?.['kind'])['toBe']('eoa');});});
|
|
@@ -105,12 +105,16 @@ export interface ObjectLinkerContext {
|
|
|
105
105
|
items: ObjectLinkerItem[];
|
|
106
106
|
byWho: Map<string, number>;
|
|
107
107
|
}
|
|
108
|
+
export declare const LINKER_RING_LIMIT = 5200;
|
|
109
|
+
export declare function ringWindowSaturated(observedCount: number): boolean;
|
|
108
110
|
export declare function batchFetchObjectLinker(objectId: string, targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
|
|
109
111
|
export declare function batchFetchObjectLinkerCore(targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
|
|
110
112
|
export declare function batchFetchObjectLinkerTx(targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
|
|
111
113
|
export declare function fetchObjectLinkerCore(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
|
|
112
114
|
export declare function fetchObjectLinkerTx(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
|
|
113
|
-
export declare function fetchServiceOrders(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext
|
|
115
|
+
export declare function fetchServiceOrders(targetAddr: string, network?: string, noCache?: boolean): Promise<(ObjectLinkerContext & {
|
|
116
|
+
ring_saturated: boolean;
|
|
117
|
+
}) | undefined>;
|
|
114
118
|
export interface PermissionContext {
|
|
115
119
|
admin: Set<string>;
|
|
116
120
|
table: Map<string, Set<number>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ObjectType,objectTypeFromAddress}from'@wowok/wowok';import{MAX_OBJECTS_PER_QUERY}from'./dataplane.js';import{SdkDataPlane}from'./sdk-dataplane.js';export const QUERY_OBJECTS_BATCH=MAX_OBJECTS_PER_QUERY;const planes=new Map();function batchPlane(a,b){const c=(a??'')+'|'+(b?0x1:0x0);let d=planes['get'](c);return!d&&(d=new SdkDataPlane(a??undefined,{'noCache':b}),planes['set'](c,d)),d;}function parentToken(a){return String(a)['toLowerCase']();}export async function batchQueryObjectsByIds(a,b,c){const d=await batchPlane(b,c)['getObjects'](a);return[...d['values']()];}export async function fetchTableEntries(a,b){const {items:c,truncated:d}=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit'],'fetchValues':![]});return{'entries':c['map'](f=>({'key':f['key'],'objectId':f['objectId']})),'truncated':d};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryTableItems(a,b){const c=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit']});return{'items':c['items'],'truncated':c['truncated']};}export async function fetchMachineNodes(a,b,c){const d=await batchQueryObjectsByIds([a],b,c),e=d[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e);}export async function batchReadKeyedItems(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'strict':!![]});}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'keyType':'u64'});}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function batchFetchEntityPermission(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_PERMISSION_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byPermission':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['permission']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'permission':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byPermission':m});}return f;}export async function fetchEntityPermission(a,b,c){try{const d=await batchFetchEntityPermission([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function batchFetchEntityContact(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_CONTACT_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byContact':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=String(n?.['contact']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(l['push']({'contact':o,'time':p}),m['set'](o,(m['get'](o)??0x0)||p));}f['set'](i,{'items':l,'byContact':m});}return f;}export async function fetchEntityContact(a,b,c){try{const d=await batchFetchEntityContact([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function batchFetchEntityOrder(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_ORDER_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byOrder':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['order']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'order':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byOrder':m});}return f;}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';export async function batchFetchObjectLinker(b,c,e,f){const g=new Map(),h=await batchReadKeyedItems(b,c,e,f);for(const i of new Set((c??[])['map'](j=>String(j)['toLowerCase']()))){g['set'](i,{'items':[],'byWho':new Map()});}for(const [j,k]of h){const l=k,m=[],n=new Map();for(const o of Array['isArray'](l?.['items'])?l['items']:[]){const p=String(o?.['who']??'')['toLowerCase'](),q=Number(o?.['time']??0x0);p&&(m['push']({'who':p,'time':q}),n['set'](p,q));}g['set'](j,{'items':m,'byWho':n});}return g;}export function batchFetchObjectLinkerCore(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function batchFetchObjectLinkerTx(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}async function fetchObjectLinker(a,b,c,d){try{const e=await batchFetchObjectLinker(a,[b],c,d);return e['get'](String(b)['toLowerCase']());}catch{return undefined;}}export function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](
|
|
1
|
+
import{ObjectType,objectTypeFromAddress}from'@wowok/wowok';import{MAX_OBJECTS_PER_QUERY}from'./dataplane.js';import{SdkDataPlane}from'./sdk-dataplane.js';export const QUERY_OBJECTS_BATCH=MAX_OBJECTS_PER_QUERY;const planes=new Map();function batchPlane(a,b){const c=(a??'')+'|'+(b?0x1:0x0);let d=planes['get'](c);return!d&&(d=new SdkDataPlane(a??undefined,{'noCache':b}),planes['set'](c,d)),d;}function parentToken(a){return String(a)['toLowerCase']();}export async function batchQueryObjectsByIds(a,b,c){const d=await batchPlane(b,c)['getObjects'](a);return[...d['values']()];}export async function fetchTableEntries(a,b){const {items:c,truncated:d}=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit'],'fetchValues':![]});return{'entries':c['map'](f=>({'key':f['key'],'objectId':f['objectId']})),'truncated':d};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryTableItems(a,b){const c=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit']});return{'items':c['items'],'truncated':c['truncated']};}export async function fetchMachineNodes(a,b,c){const d=await batchQueryObjectsByIds([a],b,c),e=d[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e);}export async function batchReadKeyedItems(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'strict':!![]});}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'keyType':'u64'});}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function batchFetchEntityPermission(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_PERMISSION_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byPermission':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['permission']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'permission':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byPermission':m});}return f;}export async function fetchEntityPermission(a,b,c){try{const d=await batchFetchEntityPermission([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function batchFetchEntityContact(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_CONTACT_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byContact':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=String(n?.['contact']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(l['push']({'contact':o,'time':p}),m['set'](o,(m['get'](o)??0x0)||p));}f['set'](i,{'items':l,'byContact':m});}return f;}export async function fetchEntityContact(a,b,c){try{const d=await batchFetchEntityContact([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function batchFetchEntityOrder(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_ORDER_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byOrder':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['order']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'order':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byOrder':m});}return f;}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';export const LINKER_RING_LIMIT=0x1450;export function ringWindowSaturated(a){return a>=LINKER_RING_LIMIT;}export async function batchFetchObjectLinker(b,c,e,f){const g=new Map(),h=await batchReadKeyedItems(b,c,e,f);for(const i of new Set((c??[])['map'](j=>String(j)['toLowerCase']()))){g['set'](i,{'items':[],'byWho':new Map()});}for(const [j,k]of h){const l=k,m=[],n=new Map();for(const o of Array['isArray'](l?.['items'])?l['items']:[]){const p=String(o?.['who']??'')['toLowerCase'](),q=Number(o?.['time']??0x0);p&&(m['push']({'who':p,'time':q}),n['set'](p,q));}g['set'](j,{'items':m,'byWho':n});}return g;}export function batchFetchObjectLinkerCore(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function batchFetchObjectLinkerTx(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}async function fetchObjectLinker(a,b,c,d){try{const e=await batchFetchObjectLinker(a,[b],c,d);return e['get'](String(b)['toLowerCase']());}catch{return undefined;}}export function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=ringWindowSaturated(d['items']['length']),f=d['items']['filter'](g=>objectTypeFromAddress(g['who'])===ObjectType['Order']);return{'items':f,'byWho':new Map(f['map'](g=>[g['who'],g['time']])),'ring_saturated':e};}export async function fetchPermissionContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'],m=l?.['data']??l;m?.['address']!=null&&Array['isArray'](m['perm'])&&i['set'](String(m['address'])['toLowerCase'](),new Set(m['perm']['map'](n=>Number(n))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0];if(f?.['type']!=='Order'&&f?.['data']?.['type']!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g['builder']??g['owner']??''),'agent':new Set((g['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bcs,deriveDynamicFieldID,query_events,query_objects,query_table,LocalMark}from'@wowok/wowok';import{chunk50,mapPool}from'./dataplane.js';export class SdkDataPlane{['network'];['opts'];['objectCache']=new
|
|
1
|
+
import{bcs,deriveDynamicFieldID,query_events,query_objects,query_table,LocalMark,lastWriteAtAny}from'@wowok/wowok';import{chunk50,mapPool}from'./dataplane.js';const SESSION_CACHE_TTL_MS=0x5*0x3c*0x3e8;let sessionWatermark=lastWriteAtAny();function checkWriteClock(){const a=lastWriteAtAny();a>sessionWatermark&&(sessionWatermark=a,sessionEntries['clear']());}const sessionEntries=new Set();class SessionMap{['map']=new Map();['registered']=![];['get'](a){const b=this['map']['get'](a);if(!b)return undefined;if(Date['now']()-b['at']>SESSION_CACHE_TTL_MS)return this['map']['delete'](a),undefined;return b['value'];}['set'](a,b){!this['registered']&&(sessionEntries['add'](this),this['registered']=!![]),this['map']['set'](a,{'value':b,'at':Date['now']()});}['clear'](){this['map']['clear']();}}export class SdkDataPlane{['network'];['opts'];['objectCache']=new SessionMap();['keyedCache']=new Map();['stats']={'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};constructor(a,b){this['network']=a,this['opts']=b;}async['getObjects'](a,b){const c=a['map'](j=>String(j)['toLowerCase']()),d=await LocalMark['Instance']()['get_many_address'](c),e=[...new Set(d['filter'](j=>!!j))],f=new Map(),g=[],h=this['opts']?.['noCache']===!![];if(!h)checkWriteClock();for(const j of e){const k=h?undefined:this['objectCache']['get'](j);k?(this['stats']['dedupHits']++,f['set'](j,k)):g['push'](j);}if(g['length']===0x0)return f;const i=chunk50(g);return await mapPool(i,this['opts']?.['concurrency']??0x4,async l=>{this['stats']['batches']++,this['stats']['byChannel']['objects']++;try{const m=await query_objects({'objects':l,'no_cache':this['opts']?.['noCache'],'network':this['network']});for(const n of m?.['objects']??[]){const p=String(n?.['object']??'')['toLowerCase']();if(!p)continue;if(!h)this['objectCache']['set'](p,n);f['set'](p,n);}}catch(q){if(b?.['strict'])throw q;}}),f;}async['getKeyedFields'](a,b,c){const d=c?.['keyType']??'address',e=String(a)['toLowerCase'](),f=a+':'+d,g=this['opts']?.['noCache']===!![];if(!g)checkWriteClock();const h=g?undefined:this['keyedCache']['get'](f),i=new Map(),j=[];for(const o of b){const p=String(o)['toLowerCase'](),q=h?.['get'](p);if(q){this['stats']['dedupHits']++,i['set'](p,q);continue;}const r=d==='u64'?bcs['u64']()['serialize'](Number(p))['toBytes']():bcs['Address']['serialize'](p)['toBytes'](),s=deriveDynamicFieldID(e,d,r)['toLowerCase']();j['push']({'key':p,'fieldId':s});}if(j['length']===0x0)return i;const k=new Map();for(const t of j)k['set'](t['fieldId'],t['key']);const l=chunk50(j)['length'],m=await this['getObjects']([...k['keys']()],{'strict':c?.['strict']});this['stats']['byChannel']['objects']=Math['max'](0x0,this['stats']['byChannel']['objects']-l),this['stats']['byChannel']['keyedFields']+=l;const n=h??new SessionMap();for(const [u,v]of k){const x=m['get'](u);if(!x)continue;const y=x['data']??x,z=y;n['set'](v,z),i['set'](v,z);}if(!g)this['keyedCache']['set'](f,n);return i;}async['getTable'](a,b){const c=[];let d=![],f;for(;;){this['stats']['batches']++,this['stats']['byChannel']['tables']++;let g;try{g=await query_table({'parent':a,'cursor':f??undefined,'limit':b?.['pageLimit'],'no_cache':this['opts']?.['noCache'],'network':this['network']});}catch{break;}for(const h of g?.['items']??[]){const i=String(h?.['object']??'')['toLowerCase']();if(i['startsWith']('0x'))c['push']({'key':String(h?.['key']?.['value']??''),'objectId':i});}if(b?.['maxItems']!=null&&c['length']>=b['maxItems']){c['length']=b['maxItems'],d=g?.['hasNextPage']===!![];break;}if(g?.['hasNextPage']!==!![]||!g['nextCursor'])break;f=String(g['nextCursor']);}if(b?.['fetchValues']!==![]&&c['length']>0x0){const j=await this['getObjects'](c['map'](k=>k['objectId']));for(const k of c)k['object']=j['get'](k['objectId']);}return{'items':c,'truncated':d};}async['getEvents'](a,b){const c=[];let d=b?.['cursor']??null;const e=b?.['maxPages']??0x1,f=b?.['limit']??0x32;let g=![];for(let h=0x0;h<e;h++){this['stats']['batches']++,this['stats']['byChannel']['events']++;let i;try{i=await query_events({'type':a,'cursor':d,'limit':f,'order':'descending','no_cache':this['opts']?.['noCache'],'network':this['network']});}catch{g=!![];break;}const j=i?.['data']??[];c['push'](...j);if(i?.['hasNextPage']!==!![]||!i['nextCursor']){d=i?.['nextCursor']??null;break;}d=i['nextCursor'];if(h+0x1===e)g=!![];}return{'events':c,'cursor':d,'truncated':g};}}
|
|
@@ -6,7 +6,9 @@ export interface StrategyFragment {
|
|
|
6
6
|
families?: EdgeFamily[];
|
|
7
7
|
schemas?: string[];
|
|
8
8
|
tableEdges?: string[];
|
|
9
|
+
eventEdges?: string[];
|
|
9
10
|
familyDepths?: Partial<Record<EdgeFamily, number>>;
|
|
11
|
+
schemaHops?: Record<string, number>;
|
|
10
12
|
maxDepth?: number;
|
|
11
13
|
maxNodes?: number;
|
|
12
14
|
maxFanout?: number;
|
|
@@ -15,6 +17,14 @@ export interface IntentPreset extends StrategyFragment {
|
|
|
15
17
|
description: string;
|
|
16
18
|
}
|
|
17
19
|
export declare const INTENT_PRESETS: Record<TopologyIntent, IntentPreset>;
|
|
20
|
+
export declare const EVALUATION_SERVICE_INTENTS: readonly TopologyIntent[];
|
|
21
|
+
export declare const EVALUATION_SERVICE_BUDGET: Readonly<Partial<ExpandBudget>>;
|
|
22
|
+
export declare const EVALUATION_SERVICE_EDGES: Readonly<{
|
|
23
|
+
familyDepths: {
|
|
24
|
+
S: number;
|
|
25
|
+
};
|
|
26
|
+
}>;
|
|
27
|
+
export declare function withEvaluationBundle(s: ExpansionStrategy): ExpansionStrategy;
|
|
18
28
|
export interface ExpansionStrategy {
|
|
19
29
|
intents: TopologyIntent[];
|
|
20
30
|
edges: EdgeWhitelist;
|
|
@@ -26,6 +36,8 @@ export interface ExplicitExpansionParams {
|
|
|
26
36
|
schemas?: string[];
|
|
27
37
|
deny?: string[];
|
|
28
38
|
tableEdges?: string[];
|
|
39
|
+
eventEdges?: string[];
|
|
40
|
+
schemaHops?: Record<string, number>;
|
|
29
41
|
budget?: Partial<ExpandBudget>;
|
|
30
42
|
}
|
|
31
43
|
export interface StrategyResolutionInput {
|
|
@@ -36,17 +48,21 @@ export interface StrategyResolutionInput {
|
|
|
36
48
|
roleDefault?: {
|
|
37
49
|
intents?: TopologyIntent[];
|
|
38
50
|
} & StrategyFragment;
|
|
51
|
+
defaultIntents?: TopologyIntent[];
|
|
39
52
|
industryTemplate?: StrategyFragment & {
|
|
40
53
|
label?: string;
|
|
41
54
|
};
|
|
42
55
|
explicitEdges?: ExplicitExpansionParams;
|
|
43
56
|
}
|
|
57
|
+
export declare function normalizeSchemaHops(raw: unknown, dropped?: string[]): Record<string, number> | undefined;
|
|
44
58
|
export declare function resolveExpansionStrategy(input: StrategyResolutionInput): ExpansionStrategy;
|
|
45
59
|
export interface TopologyFocusPref {
|
|
46
60
|
intents?: TopologyIntent[];
|
|
47
61
|
families?: EdgeFamily[];
|
|
48
62
|
table_edges?: string[];
|
|
63
|
+
event_edges?: string[];
|
|
49
64
|
family_depths?: Partial<Record<EdgeFamily, number>>;
|
|
65
|
+
schema_hops?: Record<string, number>;
|
|
50
66
|
max_depth?: number;
|
|
51
67
|
max_nodes?: number;
|
|
52
68
|
max_fanout?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const TOPOLOGY_INTENTS=['full_map','order_health','fund_flow','workflow','counterparty','reputation','permission','supply_chain','arbitration','demand_match'];export function isTopologyIntent(a){return typeof a==='string'&&TOPOLOGY_INTENTS['includes'](a);}export const INTENT_PRESETS={'full_map':{'description':'complete\x20structural\x20map\x20—\x20all\x20families\x20at\x20kernel\x20default\x20depths','tableEdges':['machine.node','permission.entity','demand.presenter']},'order_health':{'description':'order\x20lifecycle:\x20orders,\x20fulfillment\x20progress,\x20disputes,\x20completion','schemas':['order.builder','order.agent','order.service','order.machine','order.progress','order.allocation','order.discount','order.dispute','order.claimed_by','progress.machine','progress.task','progress.named_operator','service.order','eoa.order','service.machine','service.permission','arb.order','arb.arbitration_service'],'tableEdges':['machine.node'],'familyDepths':{'W':0x3,'M':0x2}},'fund_flow':{'description':'money\x20flow:\x20payment\x20legs,\x20allocation\x20waterfall,\x20guard-gated\x20splits','schemas':['payment.recipient','payment.from_object','payment.for_object','payment.for_guard','order.allocation','order.service','order.machine','order.progress','allocation.guard','service.order_allocator_guard','service.permission','treasury.permission','treasury.external_guard'],'familyDepths':{'M':0x4}},'workflow':{'description':'Machine\x20workflow\x20graphs:\x20nodes,\x20transitions,\x20guards,\x20progress\x20runtime','schemas':['service.machine','order.machine','order.progress','order.service','progress.machine','progress.task','progress.named_operator','machine.permission','machine.consensus_repository','wf.transition','wf.forward_guard'],'tableEdges':['machine.node'],'familyDepths':{'W':0x5}},'counterparty':{'description':'who\x20is\x20on\x20the\x20other\x20side:\x20buyers,\x20sellers,\x20agents,\x20operators','schemas':['order.builder','order.agent','order.service','order.machine','service.order','eoa.order','service.permission','service.um','machine.permission','progress.named_operator','contact.permission'],'tableEdges':['permission.entity'],'familyDepths':{'S':0x1}},'reputation':{'description':'social\x20proof:\x20registrar\x20votes,\x20arbitration\x20voting\x20record,\x20contacts','schemas':['target.vote','arb.voter','arb.order','arb.arbitration_service','eoa.contact','contact.permission','arbitration.voting_guard'],'familyDepths':{'S':0x3}},'permission':{'description':'governance:\x20permission\x20groups,\x20bindings,\x20entity\x20tables,\x20admins','schemas':['permission.admin','permission.core_binding','permission.tx_binding','eoa.permission','eoa.contact','contact.permission','service.permission','machine.permission','demand.permission','reward.permission','repository.permission','treasury.permission','arbitration.permission','progress.named_operator'],'tableEdges':['permission.entity'],'familyDepths':{'R':0x4}},'supply_chain':{'description':'multi-leg\x20settlement:\x20allocation\x20templates,\x20forward\x20guards,\x20sub-orders','schemas':['order.allocation','order.machine','order.progress','order.service','allocation.guard','service.order_allocator_guard','service.machine','wf.forward_guard','wf.transition','progress.task','machine.consensus_repository'],'tableEdges':['machine.node'],'familyDepths':{'W':0x4,'M':0x3}},'arbitration':{'description':'disputes:\x20cases,\x20arbitration\x20services,\x20voters,\x20guards','schemas':['order.dispute','order.claimed_by','order.service','arb.order','arb.arbitration_service','arb.voter','arbitration.permission','arbitration.voting_guard','arbitration.usage_guard','service.arbitration','service.permission'],'familyDepths':{'S':0x2}},'demand_match':{'description':'demand\x20matching:\x20presenters,\x20guards,\x20reward\x20pools,\x20permissions','schemas':['demand.permission','demand.guard','demand.reward','demand.um','reward.permission','reward.guard','reward.um','eoa.order','order.service','order.builder'],'tableEdges':['demand.presenter'],'familyDepths':{'R':0x3}}};const KERNEL_DEFAULT_TABLE_EDGES=['machine.node'];function unionDedup(...a){const b=[];for(const c of a){for(const d of c??[])if(!b['includes'](d))b['push'](d);}return b;}export function resolveExpansionStrategy(a){const b=[],c=a['intents']?.['length']?a['intents']:a['personaPref']?.['intents']?.['length']?a['personaPref']['intents']:a['roleDefault']?.['intents']??[];if(a['intents']?.['length'])b['push']('intent\x20(explicit):\x20'+a['intents']['join'](',\x20'));else{if(a['personaPref']?.['intents']?.['length'])b['push']('intent\x20(persona):\x20'+a['personaPref']['intents']['join'](',\x20'));else a['roleDefault']?.['intents']?.['length']&&b['push']('intent\x20(role\x20default):\x20'+a['roleDefault']['intents']['join'](',\x20'));}const d=[];a['industryTemplate']&&d['push']({'label':'industry\x20template'+(a['industryTemplate']['label']?'\x20('+a['industryTemplate']['label']+')':''),'frag':a['industryTemplate']});if(c['length']>0x0){const p={},q=[],r=[],u=[];let v,w,x,y;for(const z of c){const A=INTENT_PRESETS[z];if(!A)continue;for(const B of A['families']??[])if(!q['includes'](B))q['push'](B);for(const C of A['schemas']??[])if(!r['includes'](C))r['push'](C);for(const D of A['tableEdges']??[])if(!u['includes'](D))u['push'](D);if(A['familyDepths'])v={...v??{},...A['familyDepths']};if(A['maxDepth']!==undefined)w=A['maxDepth'];if(A['maxNodes']!==undefined)x=A['maxNodes'];if(A['maxFanout']!==undefined)y=A['maxFanout'];}if(q['length']>0x0)p['families']=q;if(r['length']>0x0)p['schemas']=r;if(u['length']>0x0)p['tableEdges']=u;if(v)p['familyDepths']=v;if(w!==undefined)p['maxDepth']=w;if(x!==undefined)p['maxNodes']=x;if(y!==undefined)p['maxFanout']=y;d['push']({'label':'intent\x20presets\x20('+c['join'](',\x20')+')','frag':p});}a['personaPref']&&d['push']({'label':'persona\x20preference','frag':a['personaPref']});let e,g,h,i,j,k,l;for(const {label:E,frag:F}of d){const G=[];F['families']&&(e=F['families'],G['push']('families='+F['families']['join']('/')));F['schemas']&&(g=F['schemas'],G['push'](F['schemas']['length']+'\x20schema(s)'));F['tableEdges']?.['length']&&(l=unionDedup(l,F['tableEdges']),G['push']('tables\x20+['+F['tableEdges']['join'](',')+']'));F['familyDepths']&&(h={...h??{},...F['familyDepths']},G['push'](Object['entries'](F['familyDepths'])['map'](([H,I])=>H+'≤'+I)['join']('\x20')));F['maxDepth']!==undefined&&(i=F['maxDepth'],G['push']('depth='+F['maxDepth']));F['maxNodes']!==undefined&&(j=F['maxNodes'],G['push']('nodes='+F['maxNodes']));F['maxFanout']!==undefined&&(k=F['maxFanout'],G['push']('fanout='+F['maxFanout']));if(G['length']>0x0)b['push'](E+':\x20'+G['join'](';\x20'));}const m=a['explicitEdges'];m?.['families']&&(e=m['families'],b['push']('explicit:\x20families='+m['families']['join']('/')));m?.['schemas']&&(g=m['schemas'],b['push']('explicit:\x20'+m['schemas']['length']+'\x20schema(s)'));m?.['tableEdges']&&(l=m['tableEdges'],b['push']('explicit:\x20tables='+m['tableEdges']['join'](',')));if(m?.['deny'])b['push']('explicit:\x20deny='+m['deny']['join'](','));if(m?.['budget']){if(m['budget']['maxDepth']!==undefined)i=m['budget']['maxDepth'];if(m['budget']['maxNodes']!==undefined)j=m['budget']['maxNodes'];if(m['budget']['maxFanoutPerNode']!==undefined)k=m['budget']['maxFanoutPerNode'];if(m['budget']['maxRpcs']!==undefined)b['push']('explicit:\x20rpcs='+m['budget']['maxRpcs']);b['push']('explicit:\x20budget\x20overrides\x20applied');}const n=l?.['length']?l:KERNEL_DEFAULT_TABLE_EDGES;if(!l?.['length'])b['push']('kernel\x20default:\x20tables=['+KERNEL_DEFAULT_TABLE_EDGES['join'](',')+']\x20(all\x20families,\x20depth\x204)');const o=c['length']>0x0?c:['full_map'];return{'intents':o,'edges':{...e?{'families':e}:{},...g?{'schemas':g}:{},...m?.['deny']?{'deny':m['deny']}:{},'tableEdges':n,...h?{'familyDepths':h}:{}},'budget':{...i!==undefined?{'maxDepth':i}:{},...j!==undefined?{'maxNodes':j}:{},...k!==undefined?{'maxFanoutPerNode':k}:{},...m?.['budget']?.['maxRpcs']!==undefined?{'maxRpcs':m['budget']['maxRpcs']}:{}},'trace':b};}export function normalizeTopologyFocusPref(a){if(typeof a!=='object'||a===null)return undefined;const b=a,c={};if(Array['isArray'](b['intents'])){const e=b['intents']['filter'](isTopologyIntent);if(e['length']>0x0)c['intents']=e;}if(Array['isArray'](b['families'])){const g=b['families']['filter'](h=>typeof h==='string'&&['F','R','M','W','S']['includes'](h));if(g['length']>0x0)c['families']=g;}if(Array['isArray'](b['table_edges'])){const h=b['table_edges']['filter'](i=>typeof i==='string');if(h['length']>0x0)c['table_edges']=h;}if(typeof b['family_depths']==='object'&&b['family_depths']!==null){const i={};for(const [j,k]of Object['entries'](b['family_depths'])){['F','R','M','W','S']['includes'](j)&&typeof k==='number'&&k>=0x0&&k<=0x8&&(i[j]=Math['floor'](k));}if(Object['keys'](i)['length']>0x0)c['family_depths']=i;}if(typeof b['max_depth']==='number'&&b['max_depth']>=0x0&&b['max_depth']<=0x8)c['max_depth']=Math['floor'](b['max_depth']);if(typeof b['max_nodes']==='number'&&b['max_nodes']>=0x1&&b['max_nodes']<=0xbb8)c['max_nodes']=Math['floor'](b['max_nodes']);if(typeof b['max_fanout']==='number'&&b['max_fanout']>=0x1&&b['max_fanout']<=0x1450)c['max_fanout']=Math['floor'](b['max_fanout']);return Object['keys'](c)['length']>0x0?c:undefined;}
|
|
1
|
+
import{EDGE_SCHEMAS}from'./edge-schema.js';export const TOPOLOGY_INTENTS=['full_map','order_health','fund_flow','workflow','counterparty','reputation','permission','supply_chain','arbitration','demand_match'];export function isTopologyIntent(a){return typeof a==='string'&&TOPOLOGY_INTENTS['includes'](a);}export const INTENT_PRESETS={'full_map':{'description':'complete\x20structural\x20map\x20—\x20all\x20families\x20at\x20kernel\x20default\x20depths','tableEdges':['machine.node','permission.entity','demand.presenter','demand.presenter_service','treasury.record','reward.claim','repository.data_about']},'order_health':{'description':'order\x20lifecycle:\x20orders,\x20fulfillment\x20progress,\x20disputes,\x20completion','schemas':['order.builder','order.agent','order.service','order.machine','order.progress','order.allocation','order.discount','order.dispute','order.claimed_by','order.required_info','progress.machine','progress.task','progress.named_operator','progress.context_repository','service.order','eoa.order','service.machine','service.permission','arb.order','arb.arbitration_service'],'tableEdges':['machine.node','repository.data_about'],'eventEdges':['service.order_history','eoa.order_history'],'familyDepths':{'W':0x3,'M':0x2}},'fund_flow':{'description':'money\x20flow:\x20payment\x20legs,\x20allocation\x20waterfall,\x20guard-gated\x20splits','schemas':['payment.recipient','payment.from_object','payment.for_object','payment.for_guard','payment.signer','order.allocation','order.service','order.machine','order.progress','allocation.guard','allocation.payment','allocation.for_object','allocation.for_guard','service.order_allocator_guard','service.permission','treasury.permission','treasury.deposit_guard','treasury.withdraw_guard'],'tableEdges':['treasury.record','reward.claim'],'familyDepths':{'M':0x4}},'workflow':{'description':'Machine\x20workflow\x20graphs:\x20nodes,\x20transitions,\x20guards,\x20progress\x20runtime','schemas':['service.machine','order.machine','order.progress','order.service','progress.machine','progress.task','progress.named_operator','progress.context_repository','machine.permission','machine.consensus_repository','wf.transition','wf.forward_guard'],'tableEdges':['machine.node'],'familyDepths':{'W':0x5}},'counterparty':{'description':'who\x20is\x20on\x20the\x20other\x20side:\x20buyers,\x20sellers,\x20agents,\x20operators','schemas':['order.builder','order.agent','order.service','order.machine','service.order','eoa.order','service.permission','service.um','machine.permission','progress.named_operator','contact.permission','entity.profile','entity.referrer'],'tableEdges':['permission.entity'],'familyDepths':{'S':0x1}},'reputation':{'description':'social\x20proof:\x20registrar\x20votes,\x20arbitration\x20voting\x20record,\x20contacts','schemas':['target.vote','arb.voter','arb.order','arb.arbitration_service','eoa.contact','contact.permission','contact.im','arbitration.voting_guard','entity.profile','entity.referrer','entity.resource'],'tableEdges':['reward.claim'],'familyDepths':{'S':0x3}},'permission':{'description':'governance:\x20permission\x20groups,\x20bindings,\x20entity\x20tables,\x20admins,\x20buyer\x20gate','schemas':['permission.admin','permission.owner','permission.um','permission.core_binding','permission.tx_binding','eoa.permission','eoa.contact','contact.permission','service.permission','service.buy_guard','machine.permission','demand.permission','reward.permission','repository.permission','treasury.permission','arbitration.permission','progress.named_operator'],'tableEdges':['permission.entity'],'familyDepths':{'R':0x4}},'supply_chain':{'description':'multi-leg\x20settlement:\x20allocation\x20templates,\x20forward\x20guards,\x20sub-orders','schemas':['order.allocation','order.machine','order.progress','order.service','allocation.guard','service.order_allocator_guard','service.machine','wf.forward_guard','wf.transition','progress.task','machine.consensus_repository'],'tableEdges':['machine.node','repository.data_about'],'familyDepths':{'W':0x4,'M':0x3}},'arbitration':{'description':'disputes:\x20cases,\x20arbitration\x20services,\x20voters,\x20guards','schemas':['order.dispute','order.claimed_by','order.service','arb.order','arb.arbitration_service','arb.voter','arbitration.permission','arbitration.voting_guard','arbitration.usage_guard','service.arbitration','service.permission'],'eventEdges':['arb.history'],'familyDepths':{'S':0x2}},'demand_match':{'description':'demand\x20matching:\x20presenters,\x20guards,\x20reward\x20pools,\x20permissions','schemas':['demand.permission','demand.guard','demand.reward','demand.um','reward.permission','reward.guard','reward.um','eoa.order','order.service','order.builder'],'tableEdges':['demand.presenter','demand.presenter_service'],'familyDepths':{'R':0x3}}};export const EVALUATION_SERVICE_INTENTS=['order_health','supply_chain','arbitration','workflow','fund_flow','permission','reputation'];export const EVALUATION_SERVICE_BUDGET={'maxDepth':0x5,'maxNodes':0x190,'maxFanoutPerNode':0x3c,'maxRpcs':0x64};export const EVALUATION_SERVICE_EDGES={'familyDepths':{'S':0x5}};export function withEvaluationBundle(a){return{...a,'edges':{...a['edges'],'familyDepths':{...a['edges']['familyDepths']??{},...EVALUATION_SERVICE_EDGES['familyDepths']}},'budget':{...a['budget'],...EVALUATION_SERVICE_BUDGET},'trace':[...a['trace'],'evaluation\x20bundle:\x20S≤'+EVALUATION_SERVICE_EDGES['familyDepths']['S']+'\x20floor\x20'+('(fund-counterparty\x20identity\x20read\x20sits\x20at\x20wave\x204),\x20budget\x20maxDepth='+EVALUATION_SERVICE_BUDGET['maxDepth'])]};}const KERNEL_DEFAULT_TABLE_EDGES=['machine.node'],KNOWN_SCHEMA_IDS=new Set(EDGE_SCHEMAS['map'](a=>a['id']));export function normalizeSchemaHops(a,b){if(typeof a!=='object'||a===null)return undefined;const c={};for(const [d,e]of Object['entries'](a)){typeof e==='number'&&Number['isInteger'](e)&&e>=0x0&&e<=0x8&&KNOWN_SCHEMA_IDS['has'](d)?c[d]=e:b?.['push'](d);}return Object['keys'](c)['length']>0x0?c:undefined;}function formatHops(a){return Object['keys'](a)['sort']()['map'](b=>b+'≤'+a[b])['join']('\x20');}function unionDedup(...a){const b=[];for(const c of a){for(const d of c??[])if(!b['includes'](d))b['push'](d);}return b;}export function resolveExpansionStrategy(a){const b=[],c=a['intents']?.['length']?a['intents']:a['personaPref']?.['intents']?.['length']?a['personaPref']['intents']:a['roleDefault']?.['intents']?.['length']?a['roleDefault']['intents']:a['defaultIntents']??[];if(a['intents']?.['length'])b['push']('intent\x20(explicit):\x20'+a['intents']['join'](',\x20'));else{if(a['personaPref']?.['intents']?.['length'])b['push']('intent\x20(persona):\x20'+a['personaPref']['intents']['join'](',\x20'));else{if(a['roleDefault']?.['intents']?.['length'])b['push']('intent\x20(role\x20default):\x20'+a['roleDefault']['intents']['join'](',\x20'));else a['defaultIntents']?.['length']&&b['push']('intent\x20(default):\x20'+a['defaultIntents']['join'](',\x20'));}}const d=[];a['industryTemplate']&&d['push']({'label':'industry\x20template'+(a['industryTemplate']['label']?'\x20('+a['industryTemplate']['label']+')':''),'frag':a['industryTemplate']});if(c['length']>0x0){const u={},v=[],w=[],x=[],y=[];let z,A,B,C,D;for(const E of c){const F=INTENT_PRESETS[E];if(!F)continue;for(const G of F['families']??[])if(!v['includes'](G))v['push'](G);for(const H of F['schemas']??[])if(!w['includes'](H))w['push'](H);for(const I of F['tableEdges']??[])if(!x['includes'](I))x['push'](I);for(const J of F['eventEdges']??[])if(!y['includes'](J))y['push'](J);if(F['familyDepths'])z={...z??{},...F['familyDepths']};if(F['schemaHops'])A={...A??{},...F['schemaHops']};if(F['maxDepth']!==undefined)B=F['maxDepth'];if(F['maxNodes']!==undefined)C=F['maxNodes'];if(F['maxFanout']!==undefined)D=F['maxFanout'];}if(v['length']>0x0)u['families']=v;if(w['length']>0x0)u['schemas']=w;if(x['length']>0x0)u['tableEdges']=x;if(y['length']>0x0)u['eventEdges']=y;if(z)u['familyDepths']=z;if(A)u['schemaHops']=A;if(B!==undefined)u['maxDepth']=B;if(C!==undefined)u['maxNodes']=C;if(D!==undefined)u['maxFanout']=D;d['push']({'label':'intent\x20presets\x20('+c['join'](',\x20')+')','frag':u});}a['personaPref']&&d['push']({'label':'persona\x20preference','frag':a['personaPref']});let g,h,i,j,k,l,m,n,o;for(const {label:K,frag:L}of d){const M=[];L['families']&&(g=L['families'],M['push']('families='+L['families']['join']('/')));L['schemas']&&(h=L['schemas'],M['push'](L['schemas']['length']+'\x20schema(s)'));L['tableEdges']?.['length']&&(n=unionDedup(n,L['tableEdges']),M['push']('tables\x20+['+L['tableEdges']['join'](',')+']'));L['eventEdges']?.['length']&&(o=unionDedup(o,L['eventEdges']),M['push']('events\x20+['+L['eventEdges']['join'](',')+']'));L['familyDepths']&&(i={...i??{},...L['familyDepths']},M['push'](Object['entries'](L['familyDepths'])['map'](([N,O])=>N+'≤'+O)['join']('\x20')));L['schemaHops']&&(j={...j??{},...L['schemaHops']},M['push']('hops\x20'+formatHops(L['schemaHops'])));L['maxDepth']!==undefined&&(k=L['maxDepth'],M['push']('depth='+L['maxDepth']));L['maxNodes']!==undefined&&(l=L['maxNodes'],M['push']('nodes='+L['maxNodes']));L['maxFanout']!==undefined&&(m=L['maxFanout'],M['push']('fanout='+L['maxFanout']));if(M['length']>0x0)b['push'](K+':\x20'+M['join'](';\x20'));}const p=a['explicitEdges'];p?.['families']&&(g=p['families'],b['push']('explicit:\x20families='+p['families']['join']('/')));p?.['schemas']&&(h=p['schemas'],b['push']('explicit:\x20'+p['schemas']['length']+'\x20schema(s)'));p?.['tableEdges']&&(n=p['tableEdges'],b['push']('explicit:\x20tables='+p['tableEdges']['join'](',')));p?.['eventEdges']&&(o=p['eventEdges'],b['push']('explicit:\x20events='+p['eventEdges']['join'](',')));if(p?.['schemaHops']){const N=[],O=normalizeSchemaHops(p['schemaHops'],N);O&&(j={...j??{},...O},b['push']('explicit:\x20hops\x20'+formatHops(O)));if(N['length']>0x0)b['push']('explicit:\x20dropped\x20invalid\x20hops\x20['+N['join'](',')+']');}if(p?.['deny'])b['push']('explicit:\x20deny='+p['deny']['join'](','));if(p?.['budget']){if(p['budget']['maxDepth']!==undefined)k=p['budget']['maxDepth'];if(p['budget']['maxNodes']!==undefined)l=p['budget']['maxNodes'];if(p['budget']['maxFanoutPerNode']!==undefined)m=p['budget']['maxFanoutPerNode'];if(p['budget']['maxRpcs']!==undefined)b['push']('explicit:\x20rpcs='+p['budget']['maxRpcs']);b['push']('explicit:\x20budget\x20overrides\x20applied');}const q=n?.['length']?n:KERNEL_DEFAULT_TABLE_EDGES;if(!n?.['length'])b['push']('kernel\x20default:\x20tables=['+KERNEL_DEFAULT_TABLE_EDGES['join'](',')+']\x20(all\x20families,\x20depth\x204)');j&&Object['keys'](j)['length']>0x0&&b['push']('effective\x20schema\x20hops:\x20'+formatHops(j));const r=c['length']>0x0?c:['full_map'];return{'intents':r,'edges':{...g?{'families':g}:{},...h?{'schemas':h}:{},...p?.['deny']?{'deny':p['deny']}:{},'tableEdges':q,...o?.['length']?{'eventEdges':o}:{},...i?{'familyDepths':i}:{},...j&&Object['keys'](j)['length']>0x0?{'schemaHops':j}:{}},'budget':{...k!==undefined?{'maxDepth':k}:{},...l!==undefined?{'maxNodes':l}:{},...m!==undefined?{'maxFanoutPerNode':m}:{},...p?.['budget']?.['maxRpcs']!==undefined?{'maxRpcs':p['budget']['maxRpcs']}:{}},'trace':b};}export function normalizeTopologyFocusPref(a){if(typeof a!=='object'||a===null)return undefined;const b=a,c={};if(Array['isArray'](b['intents'])){const e=b['intents']['filter'](isTopologyIntent);if(e['length']>0x0)c['intents']=e;}if(Array['isArray'](b['families'])){const g=b['families']['filter'](h=>typeof h==='string'&&['F','R','M','W','S','E']['includes'](h));if(g['length']>0x0)c['families']=g;}if(Array['isArray'](b['table_edges'])){const h=b['table_edges']['filter'](i=>typeof i==='string');if(h['length']>0x0)c['table_edges']=h;}if(Array['isArray'](b['event_edges'])){const i=b['event_edges']['filter'](j=>typeof j==='string');if(i['length']>0x0)c['event_edges']=i;}if(typeof b['family_depths']==='object'&&b['family_depths']!==null){const j={};for(const [k,l]of Object['entries'](b['family_depths'])){['F','R','M','W','S','E']['includes'](k)&&typeof l==='number'&&l>=0x0&&l<=0x8&&(j[k]=Math['floor'](l));}if(Object['keys'](j)['length']>0x0)c['family_depths']=j;}{const m=normalizeSchemaHops(b['schema_hops']);if(m)c['schema_hops']=m;}if(typeof b['max_depth']==='number'&&b['max_depth']>=0x0&&b['max_depth']<=0x8)c['max_depth']=Math['floor'](b['max_depth']);if(typeof b['max_nodes']==='number'&&b['max_nodes']>=0x1&&b['max_nodes']<=0xbb8)c['max_nodes']=Math['floor'](b['max_nodes']);if(typeof b['max_fanout']==='number'&&b['max_fanout']>=0x1&&b['max_fanout']<=0x1450)c['max_fanout']=Math['floor'](b['max_fanout']);return Object['keys'](c)['length']>0x0?c:undefined;}
|
|
@@ -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{EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{INTENT_PRESETS,TOPOLOGY_INTENTS,isTopologyIntent,normalizeTopologyFocusPref,resolveExpansionStrategy}from'./strategy.js';import{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS}from'../../persona/topology-focus.js';import{PERSONA_ROLES}from'../../persona/types.js';describe('strategy\x20—\x20registries',()=>{it('every\x20intent\x20has\x20a\x20preset\x20and\x20vice\x20versa',()=>{for(const a of TOPOLOGY_INTENTS){expect(INTENT_PRESETS[a])['toBeDefined'](),expect(INTENT_PRESETS[a]['description']['length'])['toBeGreaterThan'](0x0);}expect(Object['keys'](INTENT_PRESETS)['sort']())['toEqual']([...TOPOLOGY_INTENTS]['sort']());}),it('preset\x20schema\x20ids\x20reference\x20real\x20edge\x20schemas',()=>{for(const a of Object['values'](INTENT_PRESETS)){for(const b of a['schemas']??[]){expect(EDGE_SCHEMA_BY_ID['has'](b),'unknown\x20schema\x20id\x20'+b)['toBe'](!![]);}for(const c of a['tableEdges']??[]){const d=EDGE_SCHEMA_BY_ID['get'](c);expect(d,'table\x20edge\x20'+c+'\x20must\x20be\x20a\x20real\x20schema')['toBeDefined'](),expect(d['read']['kind'])['toBe']('table');}}}),it('role\x20defaults\x20cover\x20every\x20persona\x20role\x20with\x20valid\x20intents',()=>{for(const a of PERSONA_ROLES){const b=ROLE_TOPOLOGY_DEFAULTS[a];expect(b,'role\x20'+a)['toBeDefined'](),expect(b['intents']['length'])['toBeGreaterThan'](0x0);for(const c of b['intents'])expect(isTopologyIntent(c))['toBe'](!![]);expect(b['rationale']['length'])['toBeGreaterThan'](0x0);}}),it('industry\x20templates\x20cover\x20the\x20six\x20built-in\x20industries',()=>{for(const a of['freelance','rental','education','travel','subscription','retail']){expect(INDUSTRY_TOPOLOGY_DEFAULTS[a],a)['toBeDefined']();}});}),describe('strategy\x20—\x20resolveExpansionStrategy\x20layering',()=>{it('no\x20inputs\x20→\x20kernel\x20default\x20posture\x20(full_map,\x20machine.node,\x20no\x20narrowing)',()=>{const a=resolveExpansionStrategy({});expect(a['intents'])['toEqual'](['full_map']),expect(a['edges']['tableEdges'])['toEqual'](['machine.node']),expect(a['edges']['families'])['toBeUndefined'](),expect(a['edges']['schemas'])['toBeUndefined'](),expect(a['edges']['familyDepths'])['toBeUndefined'](),expect(a['budget']['maxDepth'])['toBeUndefined'](),expect(a['trace']['some'](b=>b['startsWith']('kernel\x20default')))['toBe'](!![]);}),it('industry\x20template\x20shapes\x20family\x20depths\x20without\x20cutting\x20families',()=>{const a=resolveExpansionStrategy({'industryTemplate':INDUSTRY_TOPOLOGY_DEFAULTS['rental']});expect(a['edges']['familyDepths'])['toEqual']({'M':0x4,'W':0x2}),expect(a['edges']['families'])['toBeUndefined'](),expect(a['intents'])['toEqual'](['full_map']),expect(a['trace']['some'](b=>b['startsWith']('industry\x20template')))['toBe'](!![]);}),it('role\x20default\x20intents\x20select\x20the\x20preset\x20layer',()=>{const a=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['prospect']});expect(a['intents'])['toEqual'](['counterparty','reputation','fund_flow']),expect(a['edges']['schemas'])['toContain']('order.builder'),expect(a['edges']['schemas'])['toContain']('target.vote'),expect(a['edges']['schemas'])['toContain']('payment.recipient'),expect(a['edges']['familyDepths'])['toMatchObject']({'M':0x4,'S':0x3}),expect(a['trace']['some'](b=>b['startsWith']('intent\x20(role\x20default)')))['toBe'](!![]);}),it('explicit\x20intent\x20beats\x20persona\x20intents\x20beats\x20role\x20default\x20intents',()=>{const a=resolveExpansionStrategy({'intents':['workflow'],'personaPref':{'intents':['reputation']},'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer']});expect(a['intents'])['toEqual'](['workflow']),expect(a['edges']['tableEdges'])['toContain']('machine.node'),expect(a['trace'][0x0])['toBe']('intent\x20(explicit):\x20workflow');}),it('persona\x20preference\x20overrides\x20preset\x20fragments\x20(identity-specific)',()=>{const a=normalizeTopologyFocusPref({'intents':['order_health'],'table_edges':['machine.node','permission.entity'],'family_depths':{'M':0x3},'max_depth':0x6}),b=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer'],'personaPref':{'intents':a['intents'],'tableEdges':a['table_edges'],'familyDepths':a['family_depths'],'maxDepth':a['max_depth']}});expect(b['intents'])['toEqual'](['order_health']),expect(b['edges']['tableEdges'])['toEqual'](['machine.node','permission.entity']),expect(b['edges']['familyDepths'])['toMatchObject']({'M':0x3}),expect(b['budget']['maxDepth'])['toBe'](0x6),expect(b['trace']['some'](c=>c['startsWith']('persona\x20preference')))['toBe'](!![]);}),it('explicit\x20table_edges\x20REPLACES\x20the\x20accumulated\x20union;\x20explicit\x20budget\x20wins',()=>{const a=resolveExpansionStrategy({'intents':['permission'],'personaPref':{'tableEdges':['permission.entity']},'explicitEdges':{'tableEdges':['demand.presenter'],'budget':{'maxDepth':0x2,'maxNodes':0x64,'maxRpcs':0x1e}}});expect(a['edges']['tableEdges'])['toEqual'](['demand.presenter']),expect(a['budget'])['toEqual']({'maxDepth':0x2,'maxNodes':0x64,'maxFanoutPerNode':undefined,'maxRpcs':0x1e});}),it('table\x20edges\x20accumulate\x20(union)\x20across\x20industry\x20+\x20presets\x20+\x20persona',()=>{const a=resolveExpansionStrategy({'industryTemplate':{'label':'t','tableEdges':['permission.entity']},'intents':['demand_match'],'personaPref':{'tableEdges':['machine.node']}});expect(a['edges']['tableEdges'])['toEqual'](['permission.entity','demand.presenter','machine.node']);}),it('deny\x20only\x20ever\x20comes\x20from\x20explicit\x20params',()=>{const a=resolveExpansionStrategy({'personaPref':{'families':['M']},'explicitEdges':{'deny':['target.vote']}});expect(a['edges']['deny'])['toEqual'](['target.vote']);});}),describe('strategy\x20—\x20normalizeTopologyFocusPref',()=>{it('keeps\x20valid\x20fields,\x20drops\x20invalid\x20ones',()=>{const a=normalizeTopologyFocusPref({'intents':['fund_flow','bogus_intent'],'families':['M','X'],'table_edges':['machine.node',0x2a],'family_depths':{'M':0x3,'Z':0x9},'max_depth':0x5,'max_nodes':0x270f,'max_fanout':-0x1});expect(a)['toEqual']({'intents':['fund_flow'],'families':['M'],'table_edges':['machine.node'],'family_depths':{'M':0x3},'max_depth':0x5});}),it('returns\x20undefined\x20for\x20empty/invalid\x20input',()=>{expect(normalizeTopologyFocusPref(null))['toBeUndefined'](),expect(normalizeTopologyFocusPref('x'))['toBeUndefined'](),expect(normalizeTopologyFocusPref({}))['toBeUndefined'](),expect(normalizeTopologyFocusPref({'intents':'not-an-array'}))['toBeUndefined']();});});function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),merchant=eoa(0x3),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),pr1=obj(0x7,0x1f),pay=obj(0x8,0x29),perm=obj(0x0,0x33);function depthPlane(){const a=new Map([[o1['toLowerCase'](),{'object':o1,'type':'Order','data':{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'dispute':[]}}],[svc['toLowerCase'](),{'object':svc,'type':'Service','data':{'permission':perm,'machine':mac},'type_raw':'0x2::service::Service<'+T_USDT+'>'}],[mac['toLowerCase'](),{'object':mac,'type':'Machine','data':{'permission':perm}}],[pr1['toLowerCase'](),{'object':pr1,'type':'Progress','data':{'machine':mac,'task':o1,'current':'done'}}],[pay['toLowerCase'](),{'object':pay,'type':'Payment','data':{'record':[{'recipient':merchant,'amount':'100'}],'info':{}},'type_raw':'0x2::payment::Payment<'+T_USDT+'>'}],[perm['toLowerCase'](),{'object':perm,'type':'Permission','data':{'admin':[merchant]}}]]),b=new Map([['0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1}]}]])]]),c=new Map([]);return new FakeDataPlane({'objects':a,'keyedFields':b,'tables':c});}describe('strategy\x20—\x20Gate\x20familyDepths\x20in\x20expandTopology',()=>{it('F\x20cap\x201\x20from\x20an\x20EOA\x20seed\x20blocks\x20every\x20field\x20edge\x20(orders\x20reached,\x20service\x20not)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x1}}});expect(a['nodes']['has'](o1['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](![]),expect(a['edges']['some'](b=>b['family']==='F'))['toBe'](![]);}),it('F\x20cap\x202\x20allows\x20one\x20hop\x20of\x20field\x20edges\x20then\x20stops',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x2}}});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['edges']['some'](b=>b['schema']==='service.permission'))['toBe'](![]);}),it('W\x20cap\x200\x20keeps\x20the\x20workflow\x20family\x20closed\x20even\x20with\x20machine.node\x20whitelisted',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'tableEdges':['machine.node'],'familyDepths':{'W':0x0}}});expect(a['edges']['some'](b=>b['family']==='W'))['toBe'](![]);}),it('unset\x20families\x20fall\x20back\x20to\x20the\x20global\x20maxDepth\x20(no\x20regression)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](perm['toLowerCase']()))['toBe'](!![]);});});
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{INTENT_PRESETS,TOPOLOGY_INTENTS,EVALUATION_SERVICE_INTENTS,EVALUATION_SERVICE_BUDGET,isTopologyIntent,normalizeTopologyFocusPref,normalizeSchemaHops,resolveExpansionStrategy,withEvaluationBundle}from'./strategy.js';import{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS}from'../../persona/topology-focus.js';import{PERSONA_ROLES}from'../../persona/types.js';describe('strategy\x20—\x20registries',()=>{it('every\x20intent\x20has\x20a\x20preset\x20and\x20vice\x20versa',()=>{for(const a of TOPOLOGY_INTENTS){expect(INTENT_PRESETS[a])['toBeDefined'](),expect(INTENT_PRESETS[a]['description']['length'])['toBeGreaterThan'](0x0);}expect(Object['keys'](INTENT_PRESETS)['sort']())['toEqual']([...TOPOLOGY_INTENTS]['sort']());}),it('preset\x20schema\x20ids\x20reference\x20real\x20edge\x20schemas',()=>{for(const a of Object['values'](INTENT_PRESETS)){for(const b of a['schemas']??[]){expect(EDGE_SCHEMA_BY_ID['has'](b),'unknown\x20schema\x20id\x20'+b)['toBe'](!![]);}for(const c of a['tableEdges']??[]){const d=EDGE_SCHEMA_BY_ID['get'](c);expect(d,'table\x20edge\x20'+c+'\x20must\x20be\x20a\x20real\x20schema')['toBeDefined'](),expect(d['read']['kind'])['toBe']('table');}}}),it('role\x20defaults\x20cover\x20every\x20persona\x20role\x20with\x20valid\x20intents',()=>{for(const a of PERSONA_ROLES){const b=ROLE_TOPOLOGY_DEFAULTS[a];expect(b,'role\x20'+a)['toBeDefined'](),expect(b['intents']['length'])['toBeGreaterThan'](0x0);for(const c of b['intents'])expect(isTopologyIntent(c))['toBe'](!![]);expect(b['rationale']['length'])['toBeGreaterThan'](0x0);}}),it('industry\x20templates\x20cover\x20the\x20six\x20built-in\x20industries',()=>{for(const a of['freelance','rental','education','travel','subscription','retail']){expect(INDUSTRY_TOPOLOGY_DEFAULTS[a],a)['toBeDefined']();}});}),describe('strategy\x20—\x20resolveExpansionStrategy\x20layering',()=>{it('no\x20inputs\x20→\x20kernel\x20default\x20posture\x20(full_map,\x20machine.node,\x20no\x20narrowing)',()=>{const a=resolveExpansionStrategy({});expect(a['intents'])['toEqual'](['full_map']),expect(a['edges']['tableEdges'])['toEqual'](['machine.node']),expect(a['edges']['families'])['toBeUndefined'](),expect(a['edges']['schemas'])['toBeUndefined'](),expect(a['edges']['familyDepths'])['toBeUndefined'](),expect(a['budget']['maxDepth'])['toBeUndefined'](),expect(a['trace']['some'](b=>b['startsWith']('kernel\x20default')))['toBe'](!![]);}),it('industry\x20template\x20shapes\x20family\x20depths\x20without\x20cutting\x20families',()=>{const a=resolveExpansionStrategy({'industryTemplate':INDUSTRY_TOPOLOGY_DEFAULTS['rental']});expect(a['edges']['familyDepths'])['toEqual']({'M':0x4,'W':0x2}),expect(a['edges']['families'])['toBeUndefined'](),expect(a['intents'])['toEqual'](['full_map']),expect(a['trace']['some'](b=>b['startsWith']('industry\x20template')))['toBe'](!![]);}),it('role\x20default\x20intents\x20select\x20the\x20preset\x20layer',()=>{const a=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['prospect']});expect(a['intents'])['toEqual'](['counterparty','reputation','fund_flow']),expect(a['edges']['schemas'])['toContain']('order.builder'),expect(a['edges']['schemas'])['toContain']('target.vote'),expect(a['edges']['schemas'])['toContain']('payment.recipient'),expect(a['edges']['familyDepths'])['toMatchObject']({'M':0x4,'S':0x3}),expect(a['trace']['some'](b=>b['startsWith']('intent\x20(role\x20default)')))['toBe'](!![]);}),it('explicit\x20intent\x20beats\x20persona\x20intents\x20beats\x20role\x20default\x20intents',()=>{const a=resolveExpansionStrategy({'intents':['workflow'],'personaPref':{'intents':['reputation']},'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer']});expect(a['intents'])['toEqual'](['workflow']),expect(a['edges']['tableEdges'])['toContain']('machine.node'),expect(a['trace'][0x0])['toBe']('intent\x20(explicit):\x20workflow');}),it('persona\x20preference\x20overrides\x20preset\x20fragments\x20(identity-specific)',()=>{const a=normalizeTopologyFocusPref({'intents':['order_health'],'table_edges':['machine.node','permission.entity'],'family_depths':{'M':0x3},'max_depth':0x6}),b=resolveExpansionStrategy({'roleDefault':ROLE_TOPOLOGY_DEFAULTS['customer'],'personaPref':{'intents':a['intents'],'tableEdges':a['table_edges'],'familyDepths':a['family_depths'],'maxDepth':a['max_depth']}});expect(b['intents'])['toEqual'](['order_health']),expect(b['edges']['tableEdges'])['toEqual'](['machine.node','repository.data_about','permission.entity']),expect(b['edges']['familyDepths'])['toMatchObject']({'M':0x3}),expect(b['budget']['maxDepth'])['toBe'](0x6),expect(b['trace']['some'](c=>c['startsWith']('persona\x20preference')))['toBe'](!![]);}),it('explicit\x20table_edges\x20REPLACES\x20the\x20accumulated\x20union;\x20explicit\x20budget\x20wins',()=>{const a=resolveExpansionStrategy({'intents':['permission'],'personaPref':{'tableEdges':['permission.entity']},'explicitEdges':{'tableEdges':['demand.presenter'],'budget':{'maxDepth':0x2,'maxNodes':0x64,'maxRpcs':0x1e}}});expect(a['edges']['tableEdges'])['toEqual'](['demand.presenter']),expect(a['budget'])['toEqual']({'maxDepth':0x2,'maxNodes':0x64,'maxFanoutPerNode':undefined,'maxRpcs':0x1e});}),it('table\x20edges\x20accumulate\x20(union)\x20across\x20industry\x20+\x20presets\x20+\x20persona',()=>{const a=resolveExpansionStrategy({'industryTemplate':{'label':'t','tableEdges':['permission.entity']},'intents':['demand_match'],'personaPref':{'tableEdges':['machine.node']}});expect(a['edges']['tableEdges'])['toEqual'](['permission.entity','demand.presenter','demand.presenter_service','machine.node']);}),it('event\x20edges:\x20presets\x20opt\x20in,\x20layers\x20union,\x20explicit\x20replaces,\x20no\x20kernel\x20default',()=>{const a=resolveExpansionStrategy({'intents':['order_health']});expect(a['edges']['eventEdges'])['toEqual'](['service.order_history','eoa.order_history']);const b=resolveExpansionStrategy({'intents':['arbitration']});expect(b['edges']['eventEdges'])['toEqual'](['arb.history']);const c=resolveExpansionStrategy({'intents':['order_health','arbitration']});expect(c['edges']['eventEdges'])['toEqual'](['service.order_history','eoa.order_history','arb.history']);const d=resolveExpansionStrategy({'intents':['order_health'],'explicitEdges':{'eventEdges':['arb.history']}});expect(d['edges']['eventEdges'])['toEqual'](['arb.history']),expect(resolveExpansionStrategy({'intents':['fund_flow']})['edges']['eventEdges'])['toBeUndefined']();}),it('deny\x20only\x20ever\x20comes\x20from\x20explicit\x20params',()=>{const a=resolveExpansionStrategy({'personaPref':{'families':['M']},'explicitEdges':{'deny':['target.vote']}});expect(a['edges']['deny'])['toEqual'](['target.vote']);});}),describe('strategy\x20—\x20schemaHops\x20five-layer\x20merge',()=>{it('merges\x20per\x20key\x20with\x20industry\x20<\x20intent\x20<\x20persona\x20<\x20explicit\x20and\x20traces\x20every\x20layer',()=>{const a=resolveExpansionStrategy({'industryTemplate':{'label':'t','schemaHops':{'guard.relies':0x2,'arb.voter':0x4}},'intents':['arbitration'],'personaPref':{'schemaHops':{'guard.relies':0x1,'arb.order':0x3}},'explicitEdges':{'schemaHops':{'guard.relies':0x0}}});expect(a['edges']['schemaHops'])['toEqual']({'guard.relies':0x0,'arb.voter':0x4,'arb.order':0x3});const b=a['trace']['join']('\x0a');expect(b)['toContain']('industry\x20template\x20(t):\x20hops'),expect(b)['toContain']('persona\x20preference:\x20hops'),expect(b)['toContain']('explicit:\x20hops\x20guard.relies≤0'),expect(b)['toContain']('effective\x20schema\x20hops:'),expect(b)['toContain']('intent\x20presets\x20(arbitration):');}),it('kernel-default\x20resolution\x20carries\x20no\x20schemaHops\x20and\x20no\x20effective\x20line',()=>{const a=resolveExpansionStrategy({});expect(a['edges']['schemaHops'])['toBeUndefined'](),expect(a['trace']['some'](b=>b['includes']('schema\x20hops')))['toBe'](![]);}),it('drops\x20out-of-range,\x20non-integer\x20and\x20unknown-schema\x20values\x20(TR-4.2)',()=>{const a={'guard.relies':0x9,'arb.order':2.5,'arb.voter':'2','not.a.schema':0x1};a['arb.order']=0x2;const b=resolveExpansionStrategy({'explicitEdges':{'schemaHops':a}});expect(b['edges']['schemaHops'])['toEqual']({'arb.order':0x2});const c=b['trace']['filter'](d=>d['includes']('dropped\x20invalid\x20hops'));expect(c)['toHaveLength'](0x1),expect(c[0x0])['toContain']('guard.relies'),expect(c[0x0])['toContain']('arb.voter'),expect(c[0x0])['toContain']('not.a.schema');}),it('normalizeSchemaHops\x20and\x20persona\x20schema_hops\x20share\x20the\x20same\x20rules',()=>{expect(normalizeSchemaHops({'guard.relies':0x1,'bogus':0x1,'x':-0x1}))['toEqual']({'guard.relies':0x1}),expect(normalizeSchemaHops(null))['toBeUndefined'](),expect(normalizeSchemaHops({'bogus':0x1}))['toBeUndefined']();const a=normalizeTopologyFocusPref({'schema_hops':{'guard.relies':0x1,'nope':0x2}});expect(a['schema_hops'])['toEqual']({'guard.relies':0x1});});}),describe('strategy\x20—\x20EVALUATION_SERVICE\x20bundle',()=>{it('is\x20the\x20seven-intent\x20union\x20with\x20valid\x20ids\x20and\x20a\x20bounded\x20budget',()=>{expect([...EVALUATION_SERVICE_INTENTS])['toEqual'](['order_health','supply_chain','arbitration','workflow','fund_flow','permission','reputation']);for(const a of EVALUATION_SERVICE_INTENTS)expect(isTopologyIntent(a))['toBe'](!![]);expect(EVALUATION_SERVICE_BUDGET['maxNodes'])['toBeLessThanOrEqual'](0x1f4),expect(EVALUATION_SERVICE_BUDGET['maxRpcs'])['toBeLessThanOrEqual'](0x78);}),it('resolves\x20into\x20a\x20union\x20whitelist\x20carrying\x20the\x20bundle\x27s\x20tables\x20and\x20depths',()=>{const a=resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]});expect(a['edges']['tableEdges'])['toContain']('machine.node'),expect(a['edges']['schemas'])['toContain']('payment.recipient'),expect(a['edges']['schemas'])['toContain']('arb.voter'),expect(a['edges']['schemas'])['toContain']('arbitration.voting_guard'),expect(a['edges']['schemas'])['toContain']('service.order'),expect(a['edges']['schemas'])['toContain']('eoa.order'),expect(a['edges']['familyDepths'])['toMatchObject']({'W':0x5,'M':0x4,'S':0x3,'R':0x4});}),it('withEvaluationBundle\x20raises\x20the\x20S\x20floor\x20to\x205\x20and\x20stamps\x20the\x20budget',()=>{const a=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]}));expect(a['edges']['familyDepths'])['toEqual']({'W':0x5,'M':0x4,'S':0x5,'R':0x4}),expect(a['budget'])['toEqual'](EVALUATION_SERVICE_BUDGET),expect(a['trace']['some'](b=>b['includes']('S≤5\x20floor')))['toBe'](!![]);});}),describe('strategy\x20—\x20normalizeTopologyFocusPref',()=>{it('keeps\x20valid\x20fields,\x20drops\x20invalid\x20ones',()=>{const a=normalizeTopologyFocusPref({'intents':['fund_flow','bogus_intent'],'families':['M','X'],'table_edges':['machine.node',0x2a],'family_depths':{'M':0x3,'Z':0x9},'max_depth':0x5,'max_nodes':0x270f,'max_fanout':-0x1});expect(a)['toEqual']({'intents':['fund_flow'],'families':['M'],'table_edges':['machine.node'],'family_depths':{'M':0x3},'max_depth':0x5});}),it('returns\x20undefined\x20for\x20empty/invalid\x20input',()=>{expect(normalizeTopologyFocusPref(null))['toBeUndefined'](),expect(normalizeTopologyFocusPref('x'))['toBeUndefined'](),expect(normalizeTopologyFocusPref({}))['toBeUndefined'](),expect(normalizeTopologyFocusPref({'intents':'not-an-array'}))['toBeUndefined']();});});function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),merchant=eoa(0x3),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),pr1=obj(0x7,0x1f),pay=obj(0x8,0x29),perm=obj(0x0,0x33);function depthPlane(){const a=new Map([[o1['toLowerCase'](),{'object':o1,'type':'Order','data':{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'dispute':[]}}],[svc['toLowerCase'](),{'object':svc,'type':'Service','data':{'permission':perm,'machine':mac},'type_raw':'0x2::service::Service<'+T_USDT+'>'}],[mac['toLowerCase'](),{'object':mac,'type':'Machine','data':{'permission':perm}}],[pr1['toLowerCase'](),{'object':pr1,'type':'Progress','data':{'machine':mac,'task':o1,'current':'done'}}],[pay['toLowerCase'](),{'object':pay,'type':'Payment','data':{'record':[{'recipient':merchant,'amount':'100'}],'info':{}},'type_raw':'0x2::payment::Payment<'+T_USDT+'>'}],[perm['toLowerCase'](),{'object':perm,'type':'Permission','data':{'admin':[merchant]}}]]),b=new Map([['0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1}]}]])]]),c=new Map([]);return new FakeDataPlane({'objects':a,'keyedFields':b,'tables':c});}describe('strategy\x20—\x20Gate\x20familyDepths\x20in\x20expandTopology',()=>{it('F\x20cap\x201\x20from\x20an\x20EOA\x20seed\x20blocks\x20every\x20field\x20edge\x20(orders\x20reached,\x20service\x20not)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x1}}});expect(a['nodes']['has'](o1['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](![]),expect(a['edges']['some'](b=>b['family']==='F'))['toBe'](![]);}),it('F\x20cap\x202\x20allows\x20one\x20hop\x20of\x20field\x20edges\x20then\x20stops',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'familyDepths':{'F':0x2}}});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['edges']['some'](b=>b['schema']==='service.permission'))['toBe'](![]);}),it('W\x20cap\x200\x20keeps\x20the\x20workflow\x20family\x20closed\x20even\x20with\x20machine.node\x20whitelisted',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':{'tableEdges':['machine.node'],'familyDepths':{'W':0x0}}});expect(a['edges']['some'](b=>b['family']==='W'))['toBe'](![]);}),it('unset\x20families\x20fall\x20back\x20to\x20the\x20global\x20maxDepth\x20(no\x20regression)',async()=>{const a=await expandTopology(depthPlane(),{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(a['nodes']['has'](svc['toLowerCase']()))['toBe'](!![]),expect(a['nodes']['has'](perm['toLowerCase']()))['toBe'](!![]);});}),describe('strategy\x20—\x20Gate\x20schemaHops\x20in\x20expandTopology',()=>{const a=obj(0xa,0x83),b=obj(0xa,0x84),c=obj(0xa,0x85);function d(){const e=new Map([[a['toLowerCase'](),{'object':a,'type':'Guard','data':{'relies':[b]}}],[b['toLowerCase'](),{'object':b,'type':'Guard','data':{'relies':[c]}}],[c['toLowerCase'](),{'object':c,'type':'Guard','data':{'relies':[]}}]]);return new FakeDataPlane({'objects':e,'keyedFields':new Map(),'tables':new Map()});}it('strategy\x20cannot\x20raise\x20the\x20contract\x20cap\x20(guard.relies\x20stays\x201\x20with\x20schemaHops=2)',async()=>{const e=await expandTopology(d(),{'network':ENTRYPOINT['Mainnet'],'seed':a,'edges':{'schemaHops':{'guard.relies':0x2}}});expect(e['edges']['some'](f=>f['schema']==='guard.relies'&&f['from']===a&&f['to']===b))['toBe'](!![]),expect(e['edges']['some'](f=>f['schema']==='guard.relies'&&f['from']===b&&f['to']===c))['toBe'](![]),expect(e['truncations']['find'](f=>f['reason']==='schema_hops')?.['limit'])['toBe'](0x1);}),it('strategy\x20narrows\x20below\x20the\x20contract\x20cap\x20(schemaHops=0\x20blocks\x20even\x20the\x20first\x20hop)',async()=>{const e=await expandTopology(d(),{'network':ENTRYPOINT['Mainnet'],'seed':a,'edges':{'schemaHops':{'guard.relies':0x0}}});expect(e['edges']['some'](g=>g['schema']==='guard.relies'))['toBe'](![]),expect(e['nodes']['has'](b['toLowerCase']()))['toBe'](![]);const f=e['truncations']['find'](g=>g['reason']==='schema_hops');expect(f)['toMatchObject']({'nodeId':a,'schema':'guard.relies','limit':0x0,'observed':0x1});});}),describe('strategy\x20—\x20caller\x20default\x20intents\x20(Task\x2016)',()=>{it('resolves\x20when\x20no\x20higher\x20intent\x20layer\x20exists,\x20with\x20its\x20own\x20trace\x20line',()=>{const a=resolveExpansionStrategy({'defaultIntents':['workflow']});expect(a['intents'])['toEqual'](['workflow']),expect(a['trace']['some'](b=>b['startsWith']('intent\x20(default):\x20workflow')))['toBe'](!![]);}),it('explicit\x20>\x20persona\x20>\x20role\x20default\x20>\x20caller\x20default',()=>{expect(resolveExpansionStrategy({'intents':['arbitration'],'defaultIntents':['workflow']})['intents'])['toEqual'](['arbitration']),expect(resolveExpansionStrategy({'personaPref':{'intents':['reputation']},'defaultIntents':['workflow']})['intents'])['toEqual'](['reputation']),expect(resolveExpansionStrategy({'roleDefault':{'intents':['fund_flow']},'defaultIntents':['workflow']})['intents'])['toEqual'](['fund_flow']);});});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{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'](d=>[d['schemaId'],d['refs']]));expect(b['get']('demand.presenter')?.['map'](d=>d['to'])['sort']())['toEqual']([FULL['member'],FULL['supplier']]['sort']());const c=b['get']('demand.presenter_service');expect(c['map'](d=>d['to']))['toEqual']([FULL['svc']]),expect(c[0x0]['key'])['toBe'](FULL['supplier']),expect(c[0x0]['payload'])['toMatchObject']({'presenter':FULL['supplier'],'score':0x5a});}),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);});});
|