@wowok/agent-mcp 3.1.2 → 3.1.4
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/config-audit.spec.d.ts +1 -0
- package/dist/config/config-audit.spec.js +1 -0
- package/dist/config/exposure.d.ts +108 -0
- package/dist/config/exposure.js +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +1 -1
- package/dist/config/judgment.d.ts +1228 -0
- package/dist/config/judgment.js +1 -0
- package/dist/config/judgment.spec.d.ts +1 -0
- package/dist/config/judgment.spec.js +1 -0
- package/dist/config/rule-engine.d.ts +299 -0
- package/dist/config/rule-engine.js +1 -0
- package/dist/config/rule-engine.spec.d.ts +1 -0
- package/dist/config/rule-engine.spec.js +1 -0
- package/dist/config/runtime.js +1 -1
- package/dist/config/severity.d.ts +7 -0
- package/dist/config/severity.js +1 -0
- 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/order-monitor.d.ts +3 -1
- package/dist/customer/order-monitor.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/acceptance.d.ts +1 -0
- package/dist/evaluation/acceptance.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/demand-match.js +1 -1
- 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/game-strategy.d.ts +2 -2
- package/dist/evaluation/game-strategy.js +1 -1
- package/dist/evaluation/guard-scan.d.ts +10 -0
- package/dist/evaluation/guard-scan.js +1 -0
- package/dist/evaluation/match-operation.d.ts +2 -2
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/standards.d.ts +9 -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 +11 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/custom-registry-file.js +1 -1
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-audit.spec.d.ts +1 -0
- package/dist/extensions/industry-audit.spec.js +1 -0
- package/dist/extensions/industry-layers.d.ts +14 -5
- package/dist/extensions/industry-layers.js +1 -1
- package/dist/extensions/industry-pack.d.ts +2 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +16 -1
- 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 -2
- 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/exploration.d.ts +28 -0
- package/dist/graph/onchain/exploration.js +1 -0
- package/dist/graph/onchain/exploration.spec.d.ts +1 -0
- package/dist/graph/onchain/exploration.spec.js +1 -0
- package/dist/graph/onchain/exposure.d.ts +18 -0
- package/dist/graph/onchain/exposure.js +1 -0
- package/dist/graph/onchain/exposure.spec.d.ts +1 -0
- package/dist/graph/onchain/exposure.spec.js +1 -0
- 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/graph-policy.spec.d.ts +1 -0
- package/dist/graph/onchain/graph-policy.spec.js +1 -0
- package/dist/graph/onchain/index.d.ts +14 -2
- package/dist/graph/onchain/index.js +1 -1
- package/dist/graph/onchain/interest.js +1 -1
- package/dist/graph/onchain/interest.spec.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/policy.d.ts +8 -0
- package/dist/graph/onchain/policy.js +1 -0
- 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/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/synthesis.d.ts +20 -0
- package/dist/graph/onchain/synthesis.js +1 -0
- package/dist/graph/onchain/synthesis.spec.d.ts +1 -0
- package/dist/graph/onchain/synthesis.spec.js +1 -0
- 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 +57 -7
- 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/keeper/keeper.spec.js +1 -1
- package/dist/knowledge/alloc-audit-policy.spec.d.ts +1 -0
- package/dist/knowledge/alloc-audit-policy.spec.js +1 -0
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.d.ts +1 -1
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +4 -3
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/arb-risk.d.ts +6 -6
- package/dist/knowledge/arb-risk.js +1 -1
- package/dist/knowledge/arbitration-ledger.d.ts +4 -4
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-puzzle.d.ts +1 -1
- package/dist/knowledge/arbitration-puzzle.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +4 -3
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- 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/judgment-baselines.json +289 -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/baselines/rules/alloc_audit.json +290 -0
- package/dist/knowledge/baselines/rules/allocation.json +492 -0
- package/dist/knowledge/baselines/rules/arb.json +155 -0
- package/dist/knowledge/baselines/rules/arbitration.json +366 -0
- package/dist/knowledge/baselines/rules/bridge.json +197 -0
- package/dist/knowledge/baselines/rules/contact.json +152 -0
- package/dist/knowledge/baselines/rules/demand.json +158 -0
- package/dist/knowledge/baselines/rules/graph.json +453 -0
- package/dist/knowledge/baselines/rules/guard.json +981 -0
- package/dist/knowledge/baselines/rules/machine.json +706 -0
- package/dist/knowledge/baselines/rules/order.json +549 -0
- package/dist/knowledge/baselines/rules/payment.json +205 -0
- package/dist/knowledge/baselines/rules/permission.json +330 -0
- package/dist/knowledge/baselines/rules/personal.json +139 -0
- package/dist/knowledge/baselines/rules/progress.json +346 -0
- package/dist/knowledge/baselines/rules/proof.json +158 -0
- package/dist/knowledge/baselines/rules/registrar.json +159 -0
- package/dist/knowledge/baselines/rules/repository.json +244 -0
- package/dist/knowledge/baselines/rules/resource.json +117 -0
- package/dist/knowledge/baselines/rules/reward.json +471 -0
- package/dist/knowledge/baselines/rules/service.json +595 -0
- package/dist/knowledge/baselines/rules/treasury.json +440 -0
- package/dist/knowledge/baselines/rules/util.json +101 -0
- package/dist/knowledge/bridge-risk.d.ts +6 -6
- package/dist/knowledge/bridge-risk.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +26 -0
- package/dist/knowledge/builtin-templates.js +1 -0
- package/dist/knowledge/contact-risk.d.ts +6 -6
- 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 +6 -6
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/facts-sync.spec.d.ts +1 -0
- package/dist/knowledge/facts-sync.spec.js +1 -0
- 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 +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-lint.d.ts +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-risk.d.ts +7 -19
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +51 -45
- 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-ledger.js +1 -1
- package/dist/knowledge/machine-risk.d.ts +4 -7
- package/dist/knowledge/machine-risk.js +1 -1
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/migration-preflight.js +1 -1
- package/dist/knowledge/operation-dictionary.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/order-puzzle.d.ts +3 -3
- package/dist/knowledge/order-puzzle.js +1 -1
- package/dist/knowledge/order-risk.d.ts +7 -12
- package/dist/knowledge/order-risk.js +1 -1
- package/dist/knowledge/order-templates.js +1 -1
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/passport-templates.js +1 -1
- package/dist/knowledge/payment-risk.d.ts +8 -7
- package/dist/knowledge/payment-risk.js +1 -1
- package/dist/knowledge/payment-tracker.js +1 -1
- package/dist/knowledge/permission-ledger.js +1 -1
- package/dist/knowledge/permission-puzzle.d.ts +12 -12
- package/dist/knowledge/permission-puzzle.js +1 -1
- package/dist/knowledge/permission-risk.d.ts +4 -10
- package/dist/knowledge/permission-risk.js +1 -1
- package/dist/knowledge/permission-templates.js +1 -1
- package/dist/knowledge/personal-risk.d.ts +6 -6
- package/dist/knowledge/personal-risk.js +1 -1
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/progress-puzzle.d.ts +2 -2
- package/dist/knowledge/progress-puzzle.js +1 -1
- package/dist/knowledge/progress-risk.d.ts +4 -3
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/proof-risk.d.ts +6 -6
- 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 +20 -1
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/registrar-risk.d.ts +6 -6
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/repository-risk.d.ts +7 -7
- package/dist/knowledge/repository-risk.js +1 -1
- package/dist/knowledge/resource-risk.d.ts +6 -6
- package/dist/knowledge/resource-risk.js +1 -1
- package/dist/knowledge/reward-ledger.d.ts +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-puzzle.d.ts +2 -2
- package/dist/knowledge/reward-puzzle.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +5 -6
- 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-modes.d.ts +2 -2
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocator-audit-node.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-puzzle.d.ts +2 -2
- package/dist/knowledge/service-puzzle.js +1 -1
- package/dist/knowledge/service-risk-node.js +1 -1
- package/dist/knowledge/service-risk.d.ts +4 -4
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +84 -0
- package/dist/knowledge/template-loader.js +1 -0
- package/dist/knowledge/template-loader.spec.d.ts +1 -0
- package/dist/knowledge/template-loader.spec.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +17 -0
- package/dist/knowledge/template-scanner.js +1 -0
- package/dist/knowledge/template-scanner.spec.d.ts +1 -0
- package/dist/knowledge/template-scanner.spec.js +1 -0
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-ledger.d.ts +1 -1
- package/dist/knowledge/treasury-ledger.js +1 -1
- package/dist/knowledge/treasury-puzzle.d.ts +3 -3
- package/dist/knowledge/treasury-puzzle.js +1 -1
- package/dist/knowledge/treasury-risk.d.ts +6 -4
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/util-risk.d.ts +6 -6
- package/dist/knowledge/util-risk.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/arbitrator-interest.js +1 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/analyzer.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/index.js +1 -1
- package/dist/persona/model.d.ts +2 -1
- package/dist/persona/model.js +1 -1
- package/dist/persona/persona-audit.spec.d.ts +1 -0
- package/dist/persona/persona-audit.spec.js +1 -0
- package/dist/persona/topology-focus.d.ts +2 -2
- package/dist/persona/topology-focus.js +1 -1
- package/dist/persona/types.d.ts +14 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/facet-money.d.ts +33 -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/machine-panorama.d.ts +20 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +2 -2
- package/dist/playbooks/service-build/migration-planner.d.ts +43 -0
- package/dist/playbooks/service-build/migration-planner.js +1 -0
- package/dist/playbooks/service-build/object-panorama.d.ts +65 -24
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +3 -3
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.d.ts +4 -2
- package/dist/playbooks/service-build/risk-aggregator.js +1 -1
- package/dist/playbooks/service-build/semantic-graph.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +56 -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/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/arb.d.ts +0 -2
- package/dist/review/arb.js +1 -1
- package/dist/review/machine.js +1 -1
- package/dist/review/order.d.ts +0 -1
- package/dist/review/order.js +1 -1
- package/dist/review/service.js +1 -1
- package/dist/review/types.d.ts +7 -0
- 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/schema/benchmark-migration/index.d.ts +207 -0
- package/dist/schema/benchmark-migration/index.js +1 -0
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.d.ts +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +3374 -670
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/contact.d.ts +1 -1
- package/dist/schema/call/demand.d.ts +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +5 -5
- package/dist/schema/call/order.d.ts +3 -3
- package/dist/schema/call/payment.js +1 -1
- package/dist/schema/call/permission-handler.d.ts +1 -1
- package/dist/schema/call/permission-handler.js +1 -1
- package/dist/schema/call/permission.d.ts +16 -16
- package/dist/schema/call/permission.js +1 -1
- package/dist/schema/call/personal.d.ts +8 -8
- package/dist/schema/call/personal.js +1 -1
- package/dist/schema/call/progress.d.ts +3 -3
- package/dist/schema/call/receipt.d.ts +28 -0
- package/dist/schema/call/receipt.js +1 -0
- package/dist/schema/call/repository.d.ts +11 -11
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +1 -1
- 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/service.d.ts +7 -7
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +1 -1
- package/dist/schema/call/treasury.js +1 -1
- package/dist/schema/common/index.d.ts +6 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/config/index.d.ts +50 -1
- package/dist/schema/config/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +307 -213
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +6 -6
- package/dist/schema/goal/planning.d.ts +17 -17
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +1 -1
- package/dist/schema/interaction/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/messenger/index.d.ts +26 -26
- package/dist/schema/operations.d.ts +59 -43
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +4732 -24
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +830 -10
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +44 -44
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workflow/index.d.ts +1 -1
- package/dist/schema/workspace/index.d.ts +2 -2
- package/dist/schema-query-impl/index.d.ts +9 -0
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +1 -1
- package/dist/schemas/benchmark_migration_operation.output.json +793 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +83 -0
- package/dist/schemas/bridge_operation.output.json +1 -1
- package/dist/schemas/bridge_operation.schema.json +5 -5
- package/dist/schemas/config_operation.output.json +252 -0
- package/dist/schemas/config_operation.schema.json +21 -1
- package/dist/schemas/evaluation_operation.output.json +702 -162
- package/dist/schemas/evaluation_operation.schema.json +0 -429
- package/dist/schemas/goal_operation.schema.json +8 -8
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +7 -7
- package/dist/schemas/keeper_operation.output.json +1 -1
- package/dist/schemas/local_history_operation.output.json +1 -1
- package/dist/schemas/local_info_operation.output.json +1 -1
- package/dist/schemas/local_mark_operation.output.json +1 -1
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.output.json +1 -1
- package/dist/schemas/messenger_operation.schema.json +24 -12
- package/dist/schemas/monitor_events.output.json +1 -1
- package/dist/schemas/monitor_subscription.output.json +1 -1
- package/dist/schemas/onchain_events.output.json +2 -2
- package/dist/schemas/onchain_operations.output.json +6359 -3724
- package/dist/schemas/onchain_operations.schema.json +191 -141
- package/dist/schemas/onchain_operations_allocation.schema.json +13 -11
- package/dist/schemas/onchain_operations_arbitration.schema.json +10 -8
- package/dist/schemas/onchain_operations_contact.schema.json +7 -5
- package/dist/schemas/onchain_operations_demand.schema.json +7 -5
- package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +5 -3
- package/dist/schemas/onchain_operations_machine.schema.json +22 -18
- package/dist/schemas/onchain_operations_order.schema.json +11 -7
- package/dist/schemas/onchain_operations_payment.schema.json +3 -3
- package/dist/schemas/onchain_operations_permission.schema.json +19 -11
- package/dist/schemas/onchain_operations_personal.schema.json +16 -10
- package/dist/schemas/onchain_operations_progress.schema.json +11 -7
- package/dist/schemas/onchain_operations_proof.schema.json +5 -3
- package/dist/schemas/onchain_operations_repository.schema.json +12 -8
- package/dist/schemas/onchain_operations_reward.schema.json +11 -9
- package/dist/schemas/onchain_operations_service.schema.json +28 -22
- package/dist/schemas/onchain_operations_treasury.schema.json +13 -11
- package/dist/schemas/onchain_table_data.output.json +88 -88
- package/dist/schemas/persona_operation.output.json +15875 -1
- package/dist/schemas/persona_operation.schema.json +3056 -478
- package/dist/schemas/query_toolkit.output.json +1325 -212
- package/dist/schemas/query_toolkit.schema.json +60 -2
- package/dist/schemas/workflow_operation.schema.json +4 -2
- package/dist/strategy/metrics.js +1 -1
- package/dist/strategy/scorecard.js +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +2 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -0
- 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/industry-pack.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.d.ts +3 -0
- package/dist/tools/move-fn-index.gen.js +1 -0
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/config.js +1 -1
- package/dist/tools/registry/evaluation.d.ts +2 -0
- package/dist/tools/registry/evaluation.js +1 -0
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/sanitize-output.d.ts +3 -0
- package/dist/tools/sanitize-output.js +1 -0
- package/dist/tools/sanitize-output.spec.d.ts +1 -0
- package/dist/tools/sanitize-output.spec.js +1 -0
- 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 +9 -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
|
@@ -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','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['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;}}
|
|
@@ -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,20 @@
|
|
|
1
|
+
import { type Severity } from "../../config/severity.js";
|
|
2
|
+
import type { Finding } from "./types.js";
|
|
3
|
+
import type { OpenQuestion } from "./exploration.js";
|
|
4
|
+
export type SynthesisPosture = "prefer" | "avoid" | "neutral";
|
|
5
|
+
export interface RoleVerdict {
|
|
6
|
+
role: string;
|
|
7
|
+
level: Severity;
|
|
8
|
+
drivers: string[];
|
|
9
|
+
open_questions: string[];
|
|
10
|
+
posture: SynthesisPosture;
|
|
11
|
+
}
|
|
12
|
+
export interface SynthesisBlock {
|
|
13
|
+
per_role: RoleVerdict[];
|
|
14
|
+
basis: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SynthesisInput {
|
|
17
|
+
findings: ReadonlyArray<Finding>;
|
|
18
|
+
openQuestions?: ReadonlyArray<OpenQuestion>;
|
|
19
|
+
}
|
|
20
|
+
export declare function synthesizeVerdicts(input: SynthesisInput): SynthesisBlock | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{EXPOSURE_ROLES}from'../../config/exposure.js';import{maxSeverity}from'../../config/severity.js';import{policyJudgmentDoc}from'../../config/judgment.js';import{toCommercialRole}from'./interest.js';function drives(a,b){const c=a['exposure'];if(!c)return![];if(c['lossParties']['some'](d=>d['role']===b))return!![];return c['gainPaths']['some'](d=>d['role']===b&&(d['viability']==='viable'||d['viability']==='conditional'));}function postureFor(a,b){const c=policyJudgmentDoc()['game']?.['role_interests']?.[toCommercialRole(a)];if(!c)return'neutral';const d=b['toLowerCase']();if(c['avoid']['some'](e=>d['includes'](e['toLowerCase']())))return'avoid';if(c['prefer']['some'](e=>d['includes'](e['toLowerCase']())))return'prefer';return'neutral';}export function synthesizeVerdicts(a){const {findings:b,openQuestions:openQuestions=[]}=a,c=[];for(const f of EXPOSURE_ROLES){const g=b['filter'](l=>drives(l,f));if(g['length']===0x0)continue;const h=g['map'](l=>l['id']),i=maxSeverity(g['map'](l=>l['severity'])),j=openQuestions['filter'](l=>h['includes'](l['source']))['map'](l=>l['id']),k=g['map'](l=>l['title']+'\x20'+l['detail'])['join']('\x20');c['push']({'role':f,'level':i,'drivers':h,'open_questions':j,'posture':postureFor(f,k)});}if(c['length']===0x0)return undefined;const d=c['reduce']((l,m)=>l+m['open_questions']['length'],0x0),e='Per-role\x20verdicts\x20=\x20max\x20severity\x20over\x20exposure-driver\x20findings\x20(loss\x20parties\x20plus\x20viable/conditional\x20gain-path\x20roles);\x20'+'posture\x20from\x20the\x20judgment\x20game.role_interests\x20prefer/avoid\x20keyword\x20table\x20over\x20driver\x20texts;\x20'+(d+'\x20exploration\x20lead(s)\x20remain\x20open\x20across\x20these\x20verdicts.\x20')+'Provisional\x20by\x20construction\x20—\x20a\x20verdict\x20never\x20closes\x20while\x20its\x20open\x20questions\x20stand.';return{'per_role':c,'basis':e};}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{mkdtempSync,writeFileSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{beforeAll,describe,expect,it}from'vitest';import{beginPolicyRun,endPolicyRun}from'../../config/judgment.js';import{synthesizeVerdicts}from'./synthesis.js';const CONFIG_DIR=mkdtempSync(join(tmpdir(),'wowok-synthesis-'));process['env']['WOWOK_CONFIG_DIR']=CONFIG_DIR,beforeAll(()=>{writeFileSync(join(CONFIG_DIR,'judgment.json'),JSON['stringify']({'version':0x1,'game':{'role_interests':{'customer':{'prefer':['refund'],'avoid':['theft','steal'],'sensitivity':0x1},'merchant':{'prefer':['throughput'],'avoid':[],'sensitivity':0x1}}}}),'utf-8'),beginPolicyRun(),endPolicyRun(),beginPolicyRun();});function finding(a){return{'id':'F1','kind':'risk','severity':'high','title':'t','path':[],'confidence':'exact','roles':['buyer'],'detail':'d','suggestion':'s',...a};}describe('synthesizeVerdicts\x20—\x20drivers\x20and\x20aggregation',()=>{it('returns\x20undefined\x20when\x20no\x20finding\x20carries\x20exposure',()=>{expect(synthesizeVerdicts({'findings':[]}))['toBeUndefined'](),expect(synthesizeVerdicts({'findings':[finding({})]}))['toBeUndefined']();const a=finding({'exposure':{'lossParties':[],'gainPaths':[{'role':'neutral','path':'p','viability':'blocked','gate':'g'}],'verdict':'downgraded','baseSeverity':'high'}});expect(synthesizeVerdicts({'findings':[a]}))['toBeUndefined']();}),it('a\x20role\x20is\x20driven\x20by\x20loss\x20parties\x20and\x20viable/conditional\x20gain\x20paths\x20only',()=>{const a=finding({'id':'F1','severity':'high','exposure':{'lossParties':[{'role':'buyer','basis':'b'}],'gainPaths':[{'role':'merchant','path':'viable\x20path','viability':'viable','gate':'g'},{'role':'supplier','path':'conditional\x20path','viability':'conditional','gate':'g'},{'role':'neutral','path':'unverifiable\x20path','viability':'unverifiable','gate':'g'},{'role':'arbitrator','path':'blocked\x20path','viability':'blocked','gate':'g'}],'verdict':'confirmed'}}),b=synthesizeVerdicts({'findings':[a]});expect(b)['toBeDefined']();const c=b['per_role']['map'](d=>d['role'])['sort']();expect(c)['toEqual'](['buyer','merchant','supplier']),expect(b['per_role']['every'](d=>d['level']==='high'))['toBe'](!![]),expect(b['per_role']['every'](d=>d['drivers']['length']===0x1))['toBe'](!![]);}),it('level\x20is\x20the\x20max\x20driver\x20severity;\x20every\x20driver\x20id\x20is\x20carried',()=>{const a=finding({'id':'F-low','severity':'low','exposure':{'lossParties':[{'role':'buyer','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),b=finding({'id':'F-critical','severity':'critical','exposure':{'lossParties':[{'role':'buyer','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),c=synthesizeVerdicts({'findings':[a,b]}),d=c['per_role']['find'](e=>e['role']==='buyer');expect(d['level'])['toBe']('critical'),expect(d['drivers']['sort']())['toEqual'](['F-critical','F-low']);});}),describe('synthesizeVerdicts\x20—\x20posture\x20and\x20open\x20questions',()=>{it('posture\x20hits\x20the\x20injected\x20game.role_interests\x20keywords\x20over\x20driver\x20texts',()=>{const a=finding({'id':'F-theft','title':'Fund\x20theft\x20risk:\x20Signer\x20recipient\x20without\x20caller\x20identity\x20constraint','detail':'anyone\x20can\x20take\x20the\x20funds','exposure':{'lossParties':[{'role':'buyer','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),b=finding({'id':'F-flow','title':'Steady\x20settlement\x20throughput\x20on\x20the\x20allocation\x20route','detail':'allocations\x20settle\x20on\x20schedule','exposure':{'lossParties':[{'role':'merchant','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),c=synthesizeVerdicts({'findings':[a,b]});expect(c['per_role']['find'](d=>d['role']==='buyer')?.['posture'])['toBe']('avoid'),expect(c['per_role']['find'](d=>d['role']==='merchant')?.['posture'])['toBe']('prefer');}),it('a\x20role\x20without\x20interest-table\x20keywords\x20lands\x20neutral',()=>{const a=finding({'exposure':{'lossParties':[{'role':'supplier','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}});expect(synthesizeVerdicts({'findings':[a]})['per_role'][0x0]['posture'])['toBe']('neutral');}),it('carries\x20only\x20the\x20open\x20questions\x20whose\x20source\x20finding\x20drives\x20the\x20role',()=>{const a=finding({'id':'F-driver','exposure':{'lossParties':[{'role':'buyer','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),b=finding({'id':'F-other','exposure':{'lossParties':[{'role':'merchant','basis':'b'}],'gainPaths':[],'verdict':'confirmed'}}),c=[{'id':'X1','kind':'verification','question':'q1','resolves_with':[],'source':'F-driver'},{'id':'X2','kind':'data_gap','question':'q2','resolves_with':[],'source':'F-other'}],d=synthesizeVerdicts({'findings':[a,b],'openQuestions':c});expect(d['per_role']['find'](e=>e['role']==='buyer')?.['open_questions'])['toEqual'](['X1']),expect(d['per_role']['find'](e=>e['role']==='merchant')?.['open_questions'])['toEqual'](['X2']),expect(d['basis'])['toContain']('2\x20exploration\x20lead(s)\x20remain\x20open');});});
|
|
@@ -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);});});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ENTRYPOINT } from "@wowok/wowok";
|
|
1
|
+
import type { ENTRYPOINT, WowSingletonId } from "@wowok/wowok";
|
|
2
2
|
import type { PersonaDrive } from "../../evaluation/game-strategy.js";
|
|
3
3
|
import type { NodeGameAdvice } from "../../evaluation/node-game.js";
|
|
4
4
|
import type { ArbGameAdvice } from "../../evaluation/arbitration-game.js";
|
|
@@ -29,9 +29,14 @@ export interface TopoNode {
|
|
|
29
29
|
error?: string;
|
|
30
30
|
origins: NodeOrigin[];
|
|
31
31
|
depth: number;
|
|
32
|
+
proposal?: {
|
|
33
|
+
sourceKey: string;
|
|
34
|
+
missingDimensions: string[];
|
|
35
|
+
provenance?: "intent" | "external";
|
|
36
|
+
};
|
|
32
37
|
}
|
|
33
|
-
export type EdgeFamily = "F" | "R" | "M" | "W" | "S";
|
|
34
|
-
export type Retention = "complete" | "bounded_exact" | "bounded_window" | "membership" | "derived";
|
|
38
|
+
export type EdgeFamily = "F" | "R" | "M" | "W" | "S" | "E";
|
|
39
|
+
export type Retention = "complete" | "bounded_exact" | "bounded_window" | "membership" | "derived" | "event_full" | "event_degraded";
|
|
35
40
|
export interface TopoEdgePayload {
|
|
36
41
|
amount?: string;
|
|
37
42
|
coinType?: string;
|
|
@@ -46,8 +51,36 @@ export interface TopoEdgePayload {
|
|
|
46
51
|
namedOperator?: string | null;
|
|
47
52
|
permissionIndex?: number | null;
|
|
48
53
|
voteBits?: number;
|
|
54
|
+
imStatus?: string;
|
|
55
|
+
joinTime?: number;
|
|
56
|
+
imDescription?: string;
|
|
57
|
+
identifier?: number | null;
|
|
58
|
+
storeFromId?: number | string | null;
|
|
59
|
+
op?: number;
|
|
60
|
+
signer?: string;
|
|
61
|
+
externalGuard?: string | null;
|
|
62
|
+
time?: number;
|
|
63
|
+
claims?: RewardClaimLeg[];
|
|
64
|
+
dataName?: string;
|
|
65
|
+
presenter?: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
registeredAt?: number;
|
|
68
|
+
profileRecords?: EntityProfileRecord[];
|
|
69
|
+
hasDescription?: boolean;
|
|
70
|
+
recordCount?: number;
|
|
49
71
|
[key: string]: any;
|
|
50
72
|
}
|
|
73
|
+
export interface EntityProfileRecord {
|
|
74
|
+
name: string;
|
|
75
|
+
valueType?: string | number;
|
|
76
|
+
value?: any;
|
|
77
|
+
}
|
|
78
|
+
export interface RewardClaimLeg {
|
|
79
|
+
guard: string;
|
|
80
|
+
amount?: string;
|
|
81
|
+
time?: number;
|
|
82
|
+
storeFromId?: string | null;
|
|
83
|
+
}
|
|
51
84
|
export interface TopoEdge {
|
|
52
85
|
id: string;
|
|
53
86
|
schema: string;
|
|
@@ -55,7 +88,6 @@ export interface TopoEdge {
|
|
|
55
88
|
from: string;
|
|
56
89
|
to: string;
|
|
57
90
|
retention: Retention;
|
|
58
|
-
evidence: string;
|
|
59
91
|
observedAt: number;
|
|
60
92
|
payload?: TopoEdgePayload;
|
|
61
93
|
truncated?: boolean;
|
|
@@ -66,6 +98,7 @@ export interface Truncation {
|
|
|
66
98
|
schema: string;
|
|
67
99
|
observed: number;
|
|
68
100
|
limit: number;
|
|
101
|
+
reason?: "fanout" | "table_page" | "schema_hops" | "event_pages";
|
|
69
102
|
}
|
|
70
103
|
export interface RpcReport {
|
|
71
104
|
batches: number;
|
|
@@ -96,7 +129,7 @@ export interface TopologyGraph {
|
|
|
96
129
|
rpcReport: RpcReport;
|
|
97
130
|
budgetExhausted: BudgetExhausted;
|
|
98
131
|
}
|
|
99
|
-
export type SingletonId =
|
|
132
|
+
export type SingletonId = WowSingletonId;
|
|
100
133
|
export interface TableItem {
|
|
101
134
|
key: string;
|
|
102
135
|
objectId: string;
|
|
@@ -144,8 +177,9 @@ export interface EdgeWhitelist {
|
|
|
144
177
|
schemas?: string[];
|
|
145
178
|
deny?: string[];
|
|
146
179
|
tableEdges?: string[];
|
|
147
|
-
|
|
180
|
+
eventEdges?: string[];
|
|
148
181
|
familyDepths?: Partial<Record<EdgeFamily, number>>;
|
|
182
|
+
schemaHops?: Record<string, number>;
|
|
149
183
|
}
|
|
150
184
|
export interface ExpandOptions {
|
|
151
185
|
network: ENTRYPOINT;
|
|
@@ -161,11 +195,20 @@ export interface Viewport {
|
|
|
161
195
|
graph: TopologyGraph;
|
|
162
196
|
visibleNodes: Set<string>;
|
|
163
197
|
visibleEdges: TopoEdge[];
|
|
198
|
+
edgeById: Map<string, TopoEdge>;
|
|
164
199
|
maskedNodes: Set<string>;
|
|
165
200
|
}
|
|
166
201
|
export type FindingKind = "risk" | "arbitrage" | "opportunity" | "game";
|
|
167
|
-
export type FindingSeverity = "info" | "low" | "medium" | "high";
|
|
202
|
+
export type FindingSeverity = "info" | "low" | "medium" | "high" | "critical";
|
|
168
203
|
export type Confidence = "exact" | "bounded" | "windowed" | "derived";
|
|
204
|
+
export interface FindingAmount {
|
|
205
|
+
key: string;
|
|
206
|
+
label: string;
|
|
207
|
+
raw: string;
|
|
208
|
+
coin_type?: string;
|
|
209
|
+
}
|
|
210
|
+
import type { FindingExposure } from "../../config/exposure.js";
|
|
211
|
+
export type { ExposureParty, ExposureVerdict, FindingExposure, GainPath, GainPathViability, } from "../../config/exposure.js";
|
|
169
212
|
export interface Finding {
|
|
170
213
|
id: string;
|
|
171
214
|
kind: FindingKind;
|
|
@@ -180,7 +223,14 @@ export interface Finding {
|
|
|
180
223
|
roles: ViewerRole[];
|
|
181
224
|
detail: string;
|
|
182
225
|
suggestion: string;
|
|
226
|
+
ruleId?: string;
|
|
227
|
+
source?: "onchain" | "proposal" | "external";
|
|
183
228
|
interest?: InterestPayload;
|
|
229
|
+
amounts?: FindingAmount[];
|
|
230
|
+
objects?: string[];
|
|
231
|
+
evidence?: string;
|
|
232
|
+
nativeRisk?: unknown;
|
|
233
|
+
exposure?: FindingExposure;
|
|
184
234
|
}
|
|
185
235
|
export interface InterestStake {
|
|
186
236
|
object: string;
|
|
@@ -3,3 +3,4 @@ export declare function buildViewport(graph: TopologyGraph, observer: string, ro
|
|
|
3
3
|
export declare function edgesOut(v: Viewport, nodeId: string, schemaId?: string): TopoEdge[];
|
|
4
4
|
export declare function edgesInc(v: Viewport, nodeId: string, schemaId?: string): TopoEdge[];
|
|
5
5
|
export declare function nodeOf(v: Viewport, id: string): import("./types.js").TopoNode | undefined;
|
|
6
|
+
export declare function profileOf(v: Viewport, nodeId: string): import("./types.js").TopoEdgePayload | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const M_SCHEMAS=['payment.recipient','payment.from_object','payment.for_object','payment.for_guard'];function rule(a,b=[],c=[],d={}){return{'families':new Set(a),'allow':new Set(b),'deny':new Set(c),'directions':d};}const RULES={'buyer':rule(['F','W','M','S'],['eoa.order'],['service.order','eoa.permission','eoa.contact','permission.core_binding','permission.entity','target.vote','demand.permission','demand.guard','demand.reward','demand.presenter'],Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))),'merchant':rule(['F','W','M','S','R'],[],['target.vote','eoa.contact','demand.presenter'],Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))),'collaborator':rule(['F','W','M','S','R'],[],['target.vote','eoa.contact','demand.presenter'],Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))),'supplier':rule(['F','W','M'],['demand.presenter'],['service.order','eoa.order','eoa.permission','permission.core_binding','permission.entity','target.vote'],{'demand.presenter':'inc',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'arbitrator':rule(['F','W','M','S','R'],['arb.voter'],['service.order','eoa.order','eoa.contact','target.vote','demand.presenter'],{'arb.arbitration_service':'inc','arb.voter':'inc',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'demander':rule(['F','W','M','R'],[],['service.order','eoa.order','eoa.contact','target.vote'],{'demand.permission':'both','demand.presenter':'out',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))})};function allowsEdge(a,b){if(a['deny']['has'](b['schema']))return![];return a['families']['has'](b['family'])||a['allow']['has'](b['schema']);}export function buildViewport(a,b,c='neutral'){const d=b['toLowerCase'](),f=String(c);if(f==='neutral'||f==='system'||!RULES[f])return{'observer':d,'role':f,'graph':a,'visibleNodes':new Set(a['nodes']['keys']()),'visibleEdges':[...a['edges']],'maskedNodes':new Set()};const g=RULES[f],h=new Set([d]);let i=!![];while(i){i=![];for(const k of a['edges']){if(!allowsEdge(g,k))continue;const l=g['directions'][k['schema']]??'out',m=(n,o)=>{h['has'](n)&&!h['has'](o)&&(h['add'](o),i=!![]);};if(l==='out'||l==='both')m(k['from'],k['to']);if(l==='inc'||l==='both')m(k['to'],k['from']);}}const j=a['edges']['filter'](n=>allowsEdge(g,n)&&h['has'](n['from'])&&h['has'](n['to']));return{'observer':d,'role':f,'graph':a,'visibleNodes':h,'visibleEdges':j,'maskedNodes':new Set()};}
|
|
1
|
+
const M_SCHEMAS=['payment.recipient','payment.from_object','payment.for_object','payment.for_guard'];function rule(a,b=[],c=[],d={}){return{'families':new Set(a),'allow':new Set(b),'deny':new Set(c),'directions':d};}const RULES={'buyer':rule(['F','W','M','S'],['eoa.order'],['service.order','eoa.permission','eoa.contact','permission.core_binding','permission.entity','target.vote','demand.permission','demand.guard','demand.reward','demand.presenter','entity.referrer','entity.resource'],Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))),'merchant':rule(['F','W','M','S','R'],[],['target.vote','eoa.contact','demand.presenter'],{'entity.referrer':'both',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'collaborator':rule(['F','W','M','S','R'],[],['target.vote','eoa.contact','demand.presenter'],{'entity.referrer':'both',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'supplier':rule(['F','W','M'],['demand.presenter'],['service.order','eoa.order','eoa.permission','permission.core_binding','permission.entity','target.vote'],{'demand.presenter':'inc',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'arbitrator':rule(['F','W','M','S','R'],['arb.voter'],['service.order','eoa.order','eoa.contact','target.vote','demand.presenter'],{'arb.arbitration_service':'inc','arb.voter':'inc','entity.referrer':'both',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))}),'demander':rule(['F','W','M','R'],[],['service.order','eoa.order','eoa.contact','target.vote'],{'demand.permission':'both','demand.presenter':'out',...Object['fromEntries'](M_SCHEMAS['map'](a=>[a,'both']))})};function allowsEdge(a,b){if(a['deny']['has'](b['schema']))return![];return a['families']['has'](b['family'])||a['allow']['has'](b['schema']);}export function buildViewport(a,b,c='neutral'){const d=b['toLowerCase'](),f=String(c);if(f==='neutral'||f==='system'||!RULES[f])return{'observer':d,'role':f,'graph':a,'visibleNodes':new Set(a['nodes']['keys']()),'visibleEdges':[...a['edges']],'edgeById':new Map(a['edges']['map'](k=>[k['id'],k])),'maskedNodes':new Set()};const g=RULES[f],h=new Set([d]);let i=!![];while(i){i=![];for(const k of a['edges']){if(!allowsEdge(g,k))continue;const l=g['directions'][k['schema']]??'out',m=(n,o)=>{h['has'](n)&&!h['has'](o)&&(h['add'](o),i=!![]);};if(l==='out'||l==='both')m(k['from'],k['to']);if(l==='inc'||l==='both')m(k['to'],k['from']);}}const j=a['edges']['filter'](n=>allowsEdge(g,n)&&h['has'](n['from'])&&h['has'](n['to']))['map'](n=>projectProfileEdge(n,d));return{'observer':d,'role':f,'graph':a,'visibleNodes':h,'visibleEdges':j,'edgeById':new Map(j['map'](n=>[n['id'],n])),'maskedNodes':new Set()};}function projectProfileEdge(a,b){if(a['schema']!=='entity.profile'||a['from']===b)return a;const c=a['payload']??{};return{...a,'payload':{'registeredAt':c['registeredAt'],'hasDescription':!!c['description'],'recordCount':Array['isArray'](c['profileRecords'])?c['profileRecords']['length']:0x0}};}export function edgesOut(a,b,c){return(a['graph']['out']['get'](b['toLowerCase']())??[])['map'](d=>a['edgeById']['get'](d['id']))['filter'](d=>!!d&&(!c||d['schema']===c));}export function edgesInc(a,b,c){return(a['graph']['inc']['get'](b['toLowerCase']())??[])['map'](d=>a['edgeById']['get'](d['id']))['filter'](d=>!!d&&(!c||d['schema']===c));}export function nodeOf(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return c&&a['visibleNodes']['has'](c['id'])?c:undefined;}export function profileOf(a,b){return edgesOut(a,b,'entity.profile')[0x0]?.['payload'];}
|