@wowok/agent-mcp 3.1.3 → 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/severity.d.ts +7 -0
- package/dist/config/severity.js +1 -0
- package/dist/customer/order-monitor.d.ts +3 -1
- package/dist/customer/order-monitor.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/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/game-strategy.d.ts +2 -2
- package/dist/evaluation/game-strategy.js +1 -1
- package/dist/evaluation/match-operation.d.ts +2 -2
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/standards.d.ts +3 -25
- package/dist/evaluation/standards.js +1 -1
- package/dist/evaluation/types.d.ts +2 -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/industry-audit.spec.d.ts +1 -0
- package/dist/extensions/industry-audit.spec.js +1 -0
- package/dist/extensions/industry-layers.d.ts +8 -0
- 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 +3 -1
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/edge-schema.d.ts +1 -0
- package/dist/graph/onchain/edge-schema.js +1 -1
- 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/graph-policy.spec.d.ts +1 -0
- package/dist/graph/onchain/graph-policy.spec.js +1 -0
- package/dist/graph/onchain/index.d.ts +6 -0
- 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/names.js +1 -1
- package/dist/graph/onchain/names.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.js +1 -1
- package/dist/graph/onchain/proposal-graph.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/types.d.ts +11 -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 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/arb-risk.d.ts +6 -5
- 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 -1
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +289 -0
- package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
- 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 -5
- 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 -5
- package/dist/knowledge/contact-risk.js +1 -1
- package/dist/knowledge/demand-risk.d.ts +6 -5
- 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-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-risk.d.ts +4 -1
- 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 +10 -2
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- 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 -1
- 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 +6 -3
- 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 -6
- 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 -7
- package/dist/knowledge/permission-risk.js +1 -1
- package/dist/knowledge/permission-templates.js +1 -1
- package/dist/knowledge/personal-risk.d.ts +6 -5
- 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 -1
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/proof-risk.d.ts +6 -5
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/puzzle-projections.js +1 -1
- 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 -5
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/repository-risk.d.ts +7 -6
- package/dist/knowledge/repository-risk.js +1 -1
- package/dist/knowledge/resource-risk.d.ts +6 -5
- 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 +4 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/rule-node-analyzers.spec.js +1 -1
- package/dist/knowledge/rule-outcome.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 -1
- 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 +4 -1
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/util-risk.d.ts +6 -5
- 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/index.js +1 -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/types.d.ts +2 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/facet-money.d.ts +11 -0
- package/dist/playbooks/service-build/facet-money.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +17 -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 +42 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
- package/dist/playbooks/service-build/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 +2 -1
- 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 +53 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -1
- 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/machine.js +1 -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/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 +5 -5
- 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/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/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.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/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 +27 -11
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +5 -5
- package/dist/schema/goal/planning.d.ts +15 -15
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/interaction/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 +33 -33
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +4708 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +232 -25
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +35 -35
- 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-query-impl/index.d.ts +9 -0
- package/dist/schema-query-impl/index.js +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.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 +22 -10
- package/dist/schemas/goal_operation.schema.json +8 -8
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.schema.json +24 -12
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.output.json +4 -2
- package/dist/schemas/onchain_operations.schema.json +189 -139
- 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 +11 -9
- package/dist/schemas/onchain_table_data.output.json +27 -17
- 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 +343 -63
- package/dist/schemas/query_toolkit.schema.json +1 -1
- package/dist/schemas/workflow_operation.schema.json +4 -2
- 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/config.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.js +1 -1
- package/dist/tools/registry/onchain.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/package.json +9 -4
- package/dist/knowledge/baselines/evaluation-baselines.json +0 -79
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{buildMachineGraph}from'./machine-nodes.js';import{formatMoneyAnnotation}from'./facet-money.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let f=d??await Config['Instance']()['network_get']();const h=[];let j=c;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const S=await LocalMark['Instance']()['get_address'](c);if(!S)throw new Error('Cannot\x20resolve\x20service\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Service\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');j=S;}let k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f});if(!k?.['service']&&d){const T=await Config['Instance']()['network_get']();T&&T!==f&&(f=T,k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f}));}const l=k['service'];j=l['object']??j;const m=new Set(),n=U=>{if(U)m['add'](U);};n(j),n(l['machine']),n(l['permission']),n(l['um']);for(const U of l['arbitrations']??[])n(U);for(const V of l['rewards']??[])n(V);for(const W of l['repositories']??[])n(W);const p=k['permission'];if(p){const X=Array['isArray'](p['admin'])?p['admin']:[];X[0x0]&&n(typeof X[0x0]==='string'?X[0x0]:X[0x0]?.['account']);if(p['builder'])n(p['builder']);}const q=await markOfMany([...m]),u=q['get'](j)??{'name':null,'tags':[],'updated_at_ms':null},w=u['name'],x=Y=>Y?q['get'](Y)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let y=null;const z=k['machine'],A=k['machine_nodes']??[];if(z||A['length']>0x0){const {nodes:Y,edges:Z}=buildMachineGraph(A);y={'address':z?.['object']??l['machine']??'','name':x(z?.['object']??l['machine'])['name'],'description':z?.['description']??null,'published':typeof z?.['bPublished']==='boolean'?z['bPublished']:null,'paused':typeof z?.['bPaused']==='boolean'?z['bPaused']:null,'node_count':typeof z?.['node_count']==='number'?z['node_count']:null,'consensus_repositories':Array['isArray'](z?.['consensus_repositories'])?z['consensus_repositories']:[],'nodes':Y,'edges':Z};}let B=null;try{const a0=await query_object_last_updated({'object':j,'network':f});a0?.['timestamp_ms']&&(B={'timestamp_ms':a0['timestamp_ms'],'digest':a0['digest']??null,'sender':a0['sender']??null});}catch{h['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let C=null;try{C=await resolveSupplyChainGraph(j,f);}catch{h['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let D=null;try{const a1=[l];for(const a2 of Object['values'](k['referenced']??{})){if(a2&&a2['object']!==j)a1['push'](a2);}D=generateBusinessReport({'objects':a1,'machine_nodes':A['map'](a3=>({'name':a3['name']}))});}catch{h['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const E=l?.['type_raw']??l?.['type']??'',F=E['match'](/<(.+)>$/),G=F?F[0x1]:null,H=(a3,a4)=>{const a5=[];return a3?a5['push']('Pricing\x20&\x20settlement\x20coin:\x20'+a3+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):a5['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),a5['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](a4)?a5['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):a5['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),a5['join']('\x20');},I=a3=>formatMoneyAnnotation(a3,G,f);let J=null;try{const a3=await fetchServiceOrders(j,f,!![]),a4=Array['isArray'](a3?.['items'])?a3['items']:[],a5=a4['map'](ad=>typeof ad?.['who']==='string'?ad['who']:'')['filter'](ad=>ad!==''),a6=new Map();try{if(a5['length']>0x0){const ad=await batchQueryObjectsByIds(a5,f,!![]);for(const ae of ad){ae&&ae['type']===ObjectType['Order']&&a6['set'](ae['object'],ae);}}}catch{h['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const a7=new Map(),a8=new Map(),a9=new Map();try{const af=new Set();for(const ag of a6['values']()){if(ag?.['progress'])af['add'](ag['progress']);if(ag?.['allocation'])af['add'](ag['allocation']);}if(af['size']>0x0){const ah=await batchQueryObjectsByIds(Array['from'](af),f,!![]);for(const ai of ah){if(!ai?.['object'])continue;if(ai['type']===ObjectType['Progress']){const aj=ai?.['current'];a7['set'](ai['object'],typeof aj==='string'&&aj!==''?aj:null),a8['set'](ai['object'],Number(ai?.['current_time'])||null);}else{if(ai['type']===ObjectType['Allocation']){const ak=Number(ai?.['balance']??0x0);a9['set'](ai['object'],Number['isFinite'](ak)&&ak===0x0?'allocated':'pending');}}}}}catch{h['push']('recent_orders:\x20progress/allocation\x20details\x20unavailable\x20(non-blocking)');}const aa=new Map();try{const al=Array['from'](new Set(a4['map'](an=>typeof an?.['who']==='string'?an['who']:'')['filter'](Boolean))),am=await Promise['allSettled'](al['map'](an=>query_object_last_updated({'object':an,'network':f})));for(let an=0x0;an<al['length'];an++){const ao=am[an];aa['set'](al[an],ao['status']==='fulfilled'&&ao['value']?.['timestamp_ms']?Number(ao['value']['timestamp_ms'])||null:null);}}catch{h['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const ab=await Promise['all'](a4['map'](async ap=>{const aq=typeof ap?.['who']==='string'?ap['who']:'',ar=a6['get'](aq),as=ar?.['amount']!==null&&ar?.['amount']!==undefined?String(ar['amount']):'',at=await I(as);return{'order':aq,'time':typeof ap?.['time']==='number'?ap['time']:0x0,'updated_ms':aa['get'](aq)??null,'amount':as,'amount_display':at['display'],'amount_tip':at['tip'],'progress':ar?.['progress']??null,'allocation':ar?.['allocation']??null,'disputes':Array['isArray'](ar?.['dispute'])?ar['dispute']:[],'agent':Array['isArray'](ar?.['agent'])?ar['agent']:[],'owner':ownerAddr(ar?.['builder']??ar?.['owner']),'claimed_by':ar?.['claimed_by']??null,'required_info':ar?.['required_info']??null,'progress_next':ar?.['progress']?a7['get'](ar['progress'])??null:null,'progress_since':ar?.['progress']?a8['get'](ar['progress'])??null:null,'allocation_state':ar?.['allocation']?a9['get'](ar['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](ar?.['items'])?ar['items']:[])['map'](async au=>({'name':String(au?.['name']??''),'price_display':(await I(au?.['price']!==null&&au?.['price']!==undefined?String(au['price']):null))['display'],'quantity':String(au?.['quantity']??'0'),'wip_hash':String(au?.['wip_hash']??'')})))};})),ac=ab['filter'](ap=>ap['order']!=='');J={'count':a4['length'],'window_saturated':a3?.['ring_saturated']??ringWindowSaturated(a4['length']),'preview_truncated':a4['length']>ac['slice'](-0x14)['length'],'items':ac['slice'](-0x14)['reverse']()};}catch{h['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const K=[];try{const ap=await query_affiliations({'address':j,'no_cache':!![],'network':f}),aq=new Set(),ar=new Map();for(const at of ap?.['entries']??[]){const au=typeof at?.['who']==='string'?at['who']:'';if(!au||aq['has'](au))continue;aq['add'](au);const av=objectTypeFromAddress(au);if(!av)continue;if(av===ObjectType['Order'])continue;const aw=String(av);let ax=ar['get'](aw);!ax&&(ax=[],ar['set'](aw,ax)),ax['push']({'address':au,'type_label':aw,'name':x(au)['name'],'time':typeof at?.['time']==='number'?at['time']:null});}const as=['Progress','Allocation','Payment','Guard'];for(const ay of as){const az=ar['get'](ay);az&&az['length']>0x0&&(K['push']({'type_label':ay,'items':az}),ar['delete'](ay));}for(const [aA,aB]of ar){if(aB['length']>0x0)K['push']({'type_label':aA,'items':aB});}}catch{h['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const L=[];for(const aC of k['allocator_guards']??[]){const aD=summarizeGuard(aC);if(aD)L['push'](aD);}const M=[];for(const aE of Array['isArray'](l['sales'])?l['sales']:[]){const aF=balanceStr(aE?.['price']),aG=await I(aF);M['push']({'name':typeof aE?.['name']==='string'?aE['name']:'','price':aF,'price_display':aG['display'],'price_tip':aG['tip'],'stock':balanceStr(aE?.['stock']),'suspension':aE?.['suspension']===!![],'wip':typeof aE?.['wip']==='string'?aE['wip']:'','wip_hash':typeof aE?.['wip_hash']==='string'?aE['wip_hash']:''});}const N=l['order_allocators']?{'description':l['order_allocators']['description']??'','threshold':balanceStr(l['order_allocators']['threshold']),'allocators':(l['order_allocators']['allocators']??[])['map'](aH=>({'guard':aH['guard'],'sharing_count':Array['isArray'](aH['sharing'])?aH['sharing']['length']:0x0,'max':balanceStr(aH['max']??null)}))}:null,O=summarizePermission(k['permission'],x(l['permission'])),P=O?.['owner']??B?.['sender']??null,Q=P?await markOf(P):null,R=await I(balanceStr(l['compensation_fund']));return{'action':'service_panorama','network':f,'service':{'address':j,'name':w,'description':l['description']??'','location':l['location']??'','published':l['bPublished']===!![],'paused':l['bPaused']===!![],'paused_time':typeof l['paused_time']==='number'?l['paused_time']:null,'setting_lock_duration':balanceStr(l['setting_lock_duration']),'customer_required':Array['isArray'](l['customer_required'])?l['customer_required']:[],'compensation_fund':balanceStr(l['compensation_fund']),'compensation_fund_display':R['display'],'compensation_fund_tip':R['tip'],'sales':M,'machine':l['machine']??null,'buy_guard':l['buy_guard']??null,'permission':l['permission']??'','um':l['um']??null,'arbitrations':Array['isArray'](l['arbitrations'])?l['arbitrations']:[],'rewards':Array['isArray'](l['rewards'])?l['rewards']:[],'repositories':Array['isArray'](l['repositories'])?l['repositories']:[],'order_allocators':N,'payment_token':{'coin_type':G,'guidance':H(G,f)},'onchain_last_updated':B,'tags':u['tags']??[],'owner':P,'owner_name':Q?.['name']??null},'machine_graph':y,'buy_guard':summarizeGuard(k['buy_guard']),'permission':O,'allocator_guards':L,'related':{'groups':K},'supply_chain':C,'business_report':D,'recent_orders':J,'data_gaps':h};}
|
|
1
|
+
import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{projectExploration}from'../../graph/onchain/exploration.js';import{buildMachineGraph}from'./machine-nodes.js';import{formatMoneyAnnotation}from'./facet-money.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let h=d??await Config['Instance']()['network_get']();const j=[];let k=c;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const a5=await LocalMark['Instance']()['get_address'](c);if(!a5)throw new Error('Cannot\x20resolve\x20service\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Service\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');k=a5;}let l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h});if(!l?.['service']&&d){const a6=await Config['Instance']()['network_get']();a6&&a6!==h&&(h=a6,l=await query_serviceContext({'service':k,'include_machine_nodes':!![],'network':h}));}const m=l['service'];k=m['object']??k;const q=new Set(),w=a7=>{if(a7)q['add'](a7);};w(k),w(m['machine']),w(m['permission']),w(m['um']);for(const a7 of m['arbitrations']??[])w(a7);for(const a8 of m['rewards']??[])w(a8);for(const a9 of m['repositories']??[])w(a9);const x=l['permission'];if(x){const aa=Array['isArray'](x['admin'])?x['admin']:[];aa[0x0]&&w(typeof aa[0x0]==='string'?aa[0x0]:aa[0x0]?.['account']);if(x['builder'])w(x['builder']);}const y=await markOfMany([...q]),z=y['get'](k)??{'name':null,'tags':[],'updated_at_ms':null},A=z['name'],B=ab=>ab?y['get'](ab)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let C=null;const D=l['machine'],E=l['machine_nodes']??[];if(D||E['length']>0x0){const {nodes:ab,edges:ac}=buildMachineGraph(E);C={'address':D?.['object']??m['machine']??'','name':B(D?.['object']??m['machine'])['name'],'description':D?.['description']??null,'published':typeof D?.['bPublished']==='boolean'?D['bPublished']:null,'paused':typeof D?.['bPaused']==='boolean'?D['bPaused']:null,'node_count':typeof D?.['node_count']==='number'?D['node_count']:null,'consensus_repositories':Array['isArray'](D?.['consensus_repositories'])?D['consensus_repositories']:[],'nodes':ab,'edges':ac};}let F=null;try{const ad=await query_object_last_updated({'object':k,'network':h});ad?.['timestamp_ms']&&(F={'timestamp_ms':ad['timestamp_ms'],'digest':ad['digest']??null,'sender':ad['sender']??null});}catch{j['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let G=null;try{G=await resolveSupplyChainGraph(k,h);}catch{j['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let H=null;try{const ae=[m];for(const af of Object['values'](l['referenced']??{})){if(af&&af['object']!==k)ae['push'](af);}H=generateBusinessReport({'objects':ae,'machine_nodes':E['map'](ag=>({'name':ag['name']}))});}catch{j['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const I=m?.['type_raw']??m?.['type']??'',J=I['match'](/<(.+)>$/),K=J?J[0x1]:null,L=(ag,ah)=>{const ai=[];return ag?ai['push']('Pricing\x20&\x20settlement\x20coin:\x20'+ag+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):ai['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),ai['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](ah)?ai['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):ai['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),ai['join']('\x20');},M=ag=>formatMoneyAnnotation(ag,K,h),N=0x3,O=0x32;let P=null;try{const ag=await fetchServiceOrders(k,h,!![]),ah=Array['isArray'](ag?.['items'])?ag['items']:[],ai=ah['slice'](-O),aj=ah['slice'](-N),ak=ai['map'](aI=>typeof aI?.['who']==='string'?aI['who']:'')['filter'](aI=>aI!==''),al=aj['map'](aI=>typeof aI?.['who']==='string'?aI['who']:'')['filter'](aI=>aI!==''),am=new Map();try{if(ak['length']>0x0){const aI=await batchQueryObjectsByIds(ak,h,!![]);for(const aJ of aI){aJ&&aJ['type']===ObjectType['Order']&&am['set'](aJ['object'],aJ);}}}catch{j['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const an=new Map();try{const aK=new Set();for(const aL of am['values']()){if(aL?.['allocation'])aK['add'](aL['allocation']);}if(aK['size']>0x0){const aM=await batchQueryObjectsByIds(Array['from'](aK),h,!![]);for(const aN of aM){if(!aN?.['object'])continue;if(aN['type']===ObjectType['Allocation']){const aO=Number(aN?.['balance']??0x0);an['set'](aN['object'],Number['isFinite'](aO)&&aO===0x0?'allocated':'pending');}}}}catch{j['push']('recent_orders:\x20allocation\x20details\x20unavailable\x20(non-blocking)');}const ao=new Map(),ap=new Map();try{const aP=new Set();for(const aQ of al){const aR=am['get'](aQ);if(aR?.['progress'])aP['add'](aR['progress']);}if(aP['size']>0x0){const aS=await batchQueryObjectsByIds(Array['from'](aP),h,!![]);for(const aT of aS){if(!aT?.['object'])continue;if(aT['type']===ObjectType['Progress']){const aU=aT?.['current'];ao['set'](aT['object'],typeof aU==='string'&&aU!==''?aU:null),ap['set'](aT['object'],Number(aT?.['current_time'])||null);}}}}catch{j['push']('recent_orders:\x20progress\x20details\x20unavailable\x20(non-blocking)');}const aq=new Map();try{const aV=al,aW=await Promise['allSettled'](aV['map'](aX=>query_object_last_updated({'object':aX,'network':h})));for(let aX=0x0;aX<aV['length'];aX++){const aY=aW[aX];aq['set'](aV[aX],aY['status']==='fulfilled'&&aY['value']?.['timestamp_ms']?Number(aY['value']['timestamp_ms'])||null:null);}}catch{j['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const ar=await Promise['all'](aj['map'](async aZ=>{const b0=typeof aZ?.['who']==='string'?aZ['who']:'',b1=am['get'](b0),b2=b1?.['amount']!==null&&b1?.['amount']!==undefined?String(b1['amount']):'',b3=await M(b2);return{'order':b0,'time':typeof aZ?.['time']==='number'?aZ['time']:0x0,'updated_ms':aq['get'](b0)??null,'amount':b2,'amount_display':b3['display'],'amount_tip':b3['tip'],'progress':b1?.['progress']??null,'allocation':b1?.['allocation']??null,'disputes':Array['isArray'](b1?.['dispute'])?b1['dispute']:[],'agent':Array['isArray'](b1?.['agent'])?b1['agent']:[],'owner':ownerAddr(b1?.['builder']??b1?.['owner']),'claimed_by':b1?.['claimed_by']??null,'required_info':b1?.['required_info']??null,'progress_next':b1?.['progress']?ao['get'](b1['progress'])??null:null,'progress_since':b1?.['progress']?ap['get'](b1['progress'])??null:null,'allocation_state':b1?.['allocation']?an['get'](b1['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](b1?.['items'])?b1['items']:[])['map'](async b4=>({'name':String(b4?.['name']??''),'price_display':(await M(b4?.['price']!==null&&b4?.['price']!==undefined?String(b4['price']):null))['display'],'quantity':String(b4?.['quantity']??'0'),'wip_hash':String(b4?.['wip_hash']??'')})))};})),as=ar['filter'](aZ=>aZ['order']!==''),at=ak['map'](aZ=>am['get'](aZ))['filter'](aZ=>!!aZ);let au=0x0n,av=0x0,aw=0x0,ax=0x0,ay=0x0,az=0x0,aA=null,aB=null;for(const aZ of at){const b0=aZ?.['amount']!==null&&aZ?.['amount']!==undefined?String(aZ['amount']):'';/^\d+$/['test'](b0)&&(au+=BigInt(b0),av++);if(Array['isArray'](aZ?.['dispute'])&&aZ['dispute']['length']>0x0)aw++;const b1=aZ?.['allocation']?an['get'](aZ['allocation'])??'pending':'none';if(b1==='pending')ax++;else{if(b1==='allocated')ay++;else az++;}}for(const b2 of ai){if(typeof b2?.['time']==='number'){if(aA===null||b2['time']<aA)aA=b2['time'];if(aB===null||b2['time']>aB)aB=b2['time'];}}const aC=av>0x0?au['toString']():null,aD=aC!==null?await M(aC):null,aE=ah['length'],aF=ag?.['ring_saturated']??ringWindowSaturated(aE),aG=as['length'],aH='Analyze\x20ALL\x20orders\x20of\x20Service\x20'+k+'\x20('+h+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20orders\x20live\x20in\x20the\x20Service\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+aE+(aF?',\x20saturated':'')+').\x20')+'For\x20each\x20order\x20call\x20object_panorama\x20with\x20the\x20order\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20order:\x20'+'order\x20address\x20chip\x20(first\x20column)\x20|\x20created\x20+\x20last-updated\x20(local\x20dates)\x20|\x20amount\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20fund\x20state\x20(none\x20/\x20pending\x20/\x20allocated)\x20|\x20current\x20machine\x20node\x20|\x20disputes\x20(each\x20dispute\x20case\x20as\x20its\x20own\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20—\x20an\x20order\x27s\x20progress,\x20allocation\x20and\x20arb\x20cases\x20are\x20its\x20children\x20and\x20are\x20never\x20split\x20into\x20a\x20separate\x20flat\x20list)\x20|\x20buyer\x20address\x20chip.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(amount\x20distribution,\x20stuck\x20or\x20paused\x20orders,\x20dispute\x20rate).\x20Orders\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Service\x20itself.';P={'count':aE,'window_saturated':aF,'preview_truncated':aE>aG,'stats':{'scope_count':at['length'],'scoped':at['length']<aE,'amount_sum_raw':aC,'amount_sum_display':aD?.['display']??null,'amount_sum_tip':aD?.['tip']??null,'amount_known_count':av,'disputed_order_count':aw,'allocation_pending_count':ax,'allocation_allocated_count':ay,'allocation_none_count':az,'first_created_ms':aA,'last_created_ms':aB},...aE>aG?{'drilldown':{'total_count':aE,'analyzed_count':aG,'stats_scope_count':at['length'],'prompt':aH}}:{},'items':as};}catch{j['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const Q=[];try{const b3=await query_affiliations({'address':k,'no_cache':!![],'network':h}),b4=new Set(),b5=new Map();for(const b7 of b3?.['entries']??[]){const b8=typeof b7?.['who']==='string'?b7['who']:'';if(!b8||b4['has'](b8))continue;b4['add'](b8);const b9=objectTypeFromAddress(b8);if(!b9)continue;if(b9===ObjectType['Order'])continue;const ba=String(b9);let bb=b5['get'](ba);!bb&&(bb=[],b5['set'](ba,bb)),bb['push']({'address':b8,'type_label':ba,'name':B(b8)['name'],'time':typeof b7?.['time']==='number'?b7['time']:null,'via':typeof b7?.['table']==='string'?b7['table']:null});}const b6=['Progress','Allocation','Payment','Guard'];for(const bc of b6){const bd=b5['get'](bc);bd&&bd['length']>0x0&&(Q['push']({'type_label':bc,'items':bd}),b5['delete'](bc));}for(const [be,bf]of b5){if(bf['length']>0x0)Q['push']({'type_label':be,'items':bf});}}catch{j['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const R=new Set(),S=bg=>{typeof bg==='string'&&/^0x[0-9a-fA-F]{40,64}$/['test'](bg)&&R['add'](bg['toLowerCase']());};S(m['buy_guard']);for(const bg of E){for(const bh of bg?.['pairs']??[]){for(const bi of bh?.['forwards']??[])S(bi?.['guard']);}}for(const bj of m['order_allocators']?.['allocators']??[])S(bj?.['guard']);for(const bk of l['allocator_guards']??[])S(bk?.['object']);for(const bl of Object['values'](l['referenced']??{})){const bm=bl;if(!bm||typeof bm!=='object')continue;if(bm['type']===ObjectType['Reward']){for(const bn of bm['guards']??[])S(bn?.['guard']);}if(bm['type']===ObjectType['Treasury']){for(const bo of bm['external_withdraw_guard']??[])S(bo?.['guard']);for(const bp of bm['external_deposit_guard']??[])S(bp?.['guard']);}(bm['type']===ObjectType['Arbitration']||bm['type']===ObjectType['Arb'])&&S(bm['voting_guard']);}const T=Q['find'](bq=>bq['type_label']===String(ObjectType['Guard']));if(T){T['items']=T['items']['filter'](bq=>!R['has'](bq['address']['toLowerCase']()));if(T['items']['length']===0x0)Q['splice'](Q['indexOf'](T),0x1);else{const bq=T['items'];try{const br=await batchQueryObjectsByIds(bq['map'](bt=>bt['address']),h,!![]),bs=new Map();for(const bt of br){if(bt?.['object'])bs['set'](String(bt['object'])['toLowerCase'](),bt);}for(const bu of bq){const bv=bs['get'](bu['address']['toLowerCase']());if(!bv){bu['explanation']=null;continue;}const bw=Array['isArray'](bv['table'])?bv['table']:[],bx=[];let by=0x0;for(const bA of bw){if(bA?.['b_submission']===!![]){by++;continue;}bA?.['value_type']==='Address'&&typeof bA?.['value']==='string'&&bA['value']['startsWith']('0x')&&bx['push'](bA['value']);}const bz=bx['some'](bB=>bB['toLowerCase']()===k['toLowerCase']());bu['explanation']={'description':typeof bv['description']==='string'?bv['description']:null,'table_refs':bx,'references_this_service':bz,'submission_slots':by,'note':bz?'One-off\x20verification\x20guard:\x20NOT\x20mounted\x20on\x20any\x20host\x20field;\x20its\x20table\x20carries\x20this\x20Service\x20as\x20an\x20on-chain\x20constant\x20(the\x20affiliation\x20is\x20written\x20at\x20creation).\x20It\x20acts\x20only\x20when\x20submitted\x20inside\x20a\x20passport\x20at\x20runtime.':'Guard\x20surfaced\x20by\x20the\x20affiliation\x20window\x20only;\x20not\x20mounted\x20on\x20any\x20host\x20field\x20reachable\x20from\x20this\x20panorama.\x20It\x20acts\x20only\x20when\x20referenced\x20at\x20runtime\x20(passport\x20submission\x20or\x20a\x20host\x20outside\x20this\x20view).'};}}catch{j['push']('related:\x20unbound-guard\x20explanation\x20unavailable\x20(non-blocking)');}}}const U=new Map();for(const bB of l['allocator_guards']??[]){const bC=bB;if(bC?.['object'])U['set'](String(bC['object'])['toLowerCase'](),bC);}const V=[];for(const bD of Array['isArray'](m['sales'])?m['sales']:[]){const bE=balanceStr(bD?.['price']),bF=await M(bE);V['push']({'name':typeof bD?.['name']==='string'?bD['name']:'','price':bE,'price_display':bF['display'],'price_tip':bF['tip'],'stock':balanceStr(bD?.['stock']),'suspension':bD?.['suspension']===!![],'wip':typeof bD?.['wip']==='string'?bD['wip']:'','wip_hash':typeof bD?.['wip_hash']==='string'?bD['wip_hash']:''});}const W=bG=>bG===0x0?'amount':bG===0x2?'surplus':'rate',X=bG=>{const bH=bG?.['who'];if(bH&&typeof bH==='object'&&'Entity'in bH){const bI=bH['Entity'],bJ=typeof bI==='string'?bI:typeof bI?.['name_or_address']==='string'?bI['name_or_address']:null;return{'who':bJ?'Entity\x20'+bJ:'Entity','entity':bJ&&/^0x[0-9a-fA-F]{6,64}$/['test'](bJ)?bJ:null,'mode':W(bG?.['mode']),'value':balanceStr(bG?.['sharing'])};}if(bH&&typeof bH==='object'&&'GuardIdentifier'in bH)return{'who':'Guard\x20identifier\x20#'+bH['GuardIdentifier'],'entity':null,'mode':W(bG?.['mode']),'value':balanceStr(bG?.['sharing'])};return{'who':'Signer','entity':null,'mode':W(bG?.['mode']),'value':balanceStr(bG?.['sharing'])};},Y=m['order_allocators']?{'description':m['order_allocators']['description']??'','threshold':balanceStr(m['order_allocators']['threshold']),'allocators':(m['order_allocators']['allocators']??[])['map'](bG=>({'guard':bG['guard'],'sharing_count':Array['isArray'](bG['sharing'])?bG['sharing']['length']:0x0,'sharing':(Array['isArray'](bG['sharing'])?bG['sharing']:[])['map'](X),'max':balanceStr(bG['max']??null),'guard_summary':summarizeGuard(U['get'](String(bG['guard']??'')['toLowerCase']()))}))}:null,Z=[];{const bG=new Map();for(const bH of m['order_allocators']?.['allocators']??[]){for(const bI of Array['isArray'](bH['sharing'])?bH['sharing']:[]){const bJ=X(bI);if(bJ['entity']){const bK=bJ['entity']['toLowerCase'](),bL=bG['get'](bK)??{'raw':bJ['entity'],'guards':[]};bL['guards']['push'](bH['guard']??''),bG['set'](bK,bL);}}}if(bG['size']>0x0)try{const bM=await batchQueryObjectsByIds([...bG['keys']()],h,!![]),bN=new Map();for(const bO of bM){if(bO?.['object'])bN['set'](String(bO['object'])['toLowerCase'](),bO);}for(const [bP,bQ]of bG){const bR=bN['get'](bP),bS='order_allocators\x20sharing\x20of\x20allocator\x20guard\x20'+bQ['guards'][0x0];if(bR&&bR['permission']!==undefined){const bT=balanceStr(bR['balance']),bU=await M(bT);Z['push']({'address':String(bR['object']),'kind':'treasury','description':typeof bR['description']==='string'?bR['description']:null,'permission':typeof bR['permission']==='string'?bR['permission']:null,'balance':bT,'balance_display':bU['display'],'balance_tip':bU['tip'],'external_deposit_guard_count':Array['isArray'](bR['external_deposit_guard'])?bR['external_deposit_guard']['length']:null,'external_withdraw_guard_count':Array['isArray'](bR['external_withdraw_guard'])?bR['external_withdraw_guard']['length']:null,'via':bS});}else Z['push']({'address':bQ['raw'],'kind':'account','description':null,'permission':null,'balance':null,'balance_display':null,'balance_tip':null,'external_deposit_guard_count':null,'external_withdraw_guard_count':null,'via':bS});}}catch{j['push']('income_recipients:\x20Sharing\x20entity\x20read\x20failed\x20(non-blocking)');}}const a0=summarizePermission(l['permission'],B(m['permission'])),a1=a0?.['owner']??F?.['sender']??null,a2=a1?await markOf(a1):null,a3=await M(balanceStr(m['compensation_fund'])),a4=projectExploration([],{'truncations':[],'budgetExhausted':{},'dataGaps':j});return{'action':'service_panorama','network':h,'service':{'address':k,'name':A,'description':m['description']??'','location':m['location']??'','published':m['bPublished']===!![],'paused':m['bPaused']===!![],'paused_time':typeof m['paused_time']==='number'?m['paused_time']:typeof m['paused_time']==='string'&&/^\d+$/['test'](m['paused_time'])?Number(m['paused_time']):null,'setting_lock_duration':balanceStr(m['setting_lock_duration']),'customer_required':Array['isArray'](m['customer_required'])?m['customer_required']:[],'compensation_fund':balanceStr(m['compensation_fund']),'compensation_fund_display':a3['display'],'compensation_fund_tip':a3['tip'],'sales':V,'machine':m['machine']??null,'buy_guard':m['buy_guard']??null,'permission':m['permission']??'','um':m['um']??null,'arbitrations':Array['isArray'](m['arbitrations'])?m['arbitrations']:[],'rewards':Array['isArray'](m['rewards'])?m['rewards']:[],'repositories':Array['isArray'](m['repositories'])?m['repositories']:[],'order_allocators':Y,'income_recipients':Z,'payment_token':{'coin_type':K,'guidance':L(K,h)},'onchain_last_updated':F,'tags':z['tags']??[],'owner':a1,'owner_name':a2?.['name']??null},'machine_graph':C,'buy_guard':summarizeGuard(l['buy_guard']),'permission':a0,'related':{'groups':Q},'supply_chain':G,'business_report':H,'recent_orders':P,'data_gaps':j,...a4['open_questions']['length']>0x0?{'exploration':a4}:{}};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,fullServiceState}from'../../graph/onchain/fixtures.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{registerGraphServiceEvaluations}from'../../evaluation/builtins/graph-service.js';import{handleOnchainTopology}from'./topology-query.js';const NET='mainnet';describe('onchain_topology\x20evaluation\x20projection\x20(Task\x2016)',()=>{it('TR-16.1:\x20full\x20shop\x20—\x20evaluation\x20section\x20with\x20real\x20arbitration\x20conclusion\x20+\x20coverage',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeDefined']();const b=a['evaluation'];expect(Number['isInteger'](b['completeness']))['toBe'](!![]),expect(b['completeness'])['toBeGreaterThan'](0x0),expect(b['completeness'])['toBeLessThanOrEqual'](0x64),expect(b['coverage']['length'])['toBeGreaterThan'](0x0),expect(b['target'])['toBe'](FULL['svc']['toLowerCase']()),expect(b['unverified'])['toEqual']([]);const c=b['trust']['breakdown']['find'](d=>d['rule_id']==='trust_arbitration');expect(c?.['score'])['toBe'](0x64),expect(c?.['matched']?.['length']??0x0)['toBeGreaterThan'](0x0),expect(a['summary'])['toContain']('Evaluation:\x20trust\x20'+b['trust']['total']+'/100,\x20risk\x20'+b['risk']['total']+'/100');}),it('TR-16.2:\x20single\x20expansion\x20—\x20evaluation\x20adds\x20zero\x20fetches,\x20the\x20probe\x20is\x20a\x20dedup\x20hit',async()=>{registerGraphServiceEvaluations();const a=withEvaluationBundle(resolveExpansionStrategy({'defaultIntents':[...EVALUATION_SERVICE_INTENTS]})),b=new FakeDataPlane(fullServiceState()),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'budget':a['budget'],'edges':a['edges']}),d=new FakeDataPlane(fullServiceState()),e=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},d);expect(d['batches']['objects'])['toBe'](b['batches']['objects']),expect(e['stats']['rpc']['batches'])['toBe'](c['rpcReport']['batches']),expect(d['dedupHits'])['toBe'](b['dedupHits']);}),it('wiring:\x20no-intent\x20Service\x20seed\x20defaults\x20to\x20the\x20evaluation\x20bundle\x20with\x20its\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual']([...EVALUATION_SERVICE_INTENTS]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(default):\x20')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);}),it('wiring:\x20role-default\x20intents\x20UNION\x20onto\x20the\x20evaluation\x20floor,\x20never\x20replace\x20it',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'role':'customer','context_network':NET},new FakeDataPlane(fullServiceState()));for(const c of EVALUATION_SERVICE_INTENTS)expect(a['strategy']['intents'])['toContain'](c);expect(a['strategy']['intents'])['toContain']('order_health'),expect(a['strategy']['intents'])['toContain']('counterparty'),expect(a['strategy']['trace']['some'](d=>d['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);const b=a['facets']?.['items']['find'](d=>d['id']==='arbitration');expect(b?.['state'])['toBe']('present'),expect(a['evaluation']['unverified'])['not']['toContain']('risk_trust');}),it('wiring:\x20an\x20explicit\x20intent\x20wins\x20over\x20the\x20default\x20and\x20skips\x20the\x20bundle\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'intent':'workflow','context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['workflow']),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(explicit):\x20workflow')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](![]),expect(a['evaluation'])['toBeDefined']();}),it('wiring:\x20a\x20non-Service\x20seed\x20keeps\x20the\x20kernel\x20default\x20posture;\x20gap\x20dims\x20are\x20excluded\x20honestly',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['mac'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['full_map']),expect(a['evaluation'])['toBeDefined'](),expect(a['evaluation']['unverified']['length'])['toBeGreaterThan'](0x0);}),it('analyze=false\x20drops\x20the\x20evaluation\x20section\x20(no\x20findings-less\x20all-clear)',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'analyze':![],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeUndefined'](),expect(a['findings'])['toEqual']([]);});});
|
|
1
|
+
import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,fullServiceState}from'../../graph/onchain/fixtures.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{registerGraphServiceEvaluations}from'../../evaluation/builtins/graph-service.js';import{handleOnchainTopology}from'./topology-query.js';const NET='mainnet';describe('onchain_topology\x20evaluation\x20projection\x20(Task\x2016)',()=>{it('TR-16.1:\x20full\x20shop\x20—\x20evaluation\x20section\x20with\x20real\x20arbitration\x20conclusion\x20+\x20coverage',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeDefined']();const b=a['evaluation'];expect(Number['isInteger'](b['completeness']))['toBe'](!![]),expect(b['completeness'])['toBeGreaterThan'](0x0),expect(b['completeness'])['toBeLessThanOrEqual'](0x64),expect(b['coverage']['length'])['toBeGreaterThan'](0x0),expect(b['target'])['toBe'](FULL['svc']['toLowerCase']()),expect(b['unverified'])['toEqual']([]);const c=b['trust']['breakdown']['find'](d=>d['rule_id']==='trust_arbitration');expect(c?.['score'])['toBe'](0x64),expect(c?.['matched']?.['length']??0x0)['toBeGreaterThan'](0x0),expect(a['summary'])['toContain']('Evaluation:\x20trust\x20'+b['trust']['total']+'/100,\x20risk\x20'+b['risk']['total']+'/100');}),it('TR-16.2:\x20single\x20expansion\x20—\x20evaluation\x20adds\x20zero\x20fetches,\x20the\x20probe\x20is\x20a\x20dedup\x20hit',async()=>{registerGraphServiceEvaluations();const a=withEvaluationBundle(resolveExpansionStrategy({'defaultIntents':[...EVALUATION_SERVICE_INTENTS]})),b=new FakeDataPlane(fullServiceState()),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'budget':a['budget'],'edges':a['edges']}),d=new FakeDataPlane(fullServiceState()),e=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},d);expect(d['batches']['objects'])['toBe'](b['batches']['objects']),expect(e['stats']['rpc']['batches'])['toBe'](c['rpcReport']['batches']),expect(d['dedupHits'])['toBe'](b['dedupHits']);}),it('wiring:\x20no-intent\x20Service\x20seed\x20defaults\x20to\x20the\x20evaluation\x20bundle\x20with\x20its\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual']([...EVALUATION_SERVICE_INTENTS]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(default):\x20')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);}),it('wiring:\x20role-default\x20intents\x20UNION\x20onto\x20the\x20evaluation\x20floor,\x20never\x20replace\x20it',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'role':'customer','context_network':NET},new FakeDataPlane(fullServiceState()));for(const c of EVALUATION_SERVICE_INTENTS)expect(a['strategy']['intents'])['toContain'](c);expect(a['strategy']['intents'])['toContain']('order_health'),expect(a['strategy']['intents'])['toContain']('counterparty'),expect(a['strategy']['trace']['some'](d=>d['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);const b=a['facets']?.['items']['find'](d=>d['id']==='arbitration');expect(b?.['state'])['toBe']('present'),expect(a['evaluation']['unverified'])['not']['toContain']('risk_trust');}),it('wiring:\x20an\x20explicit\x20intent\x20wins\x20over\x20the\x20default\x20and\x20skips\x20the\x20bundle\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'intent':'workflow','context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['workflow']),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(explicit):\x20workflow')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](![]),expect(a['evaluation'])['toBeDefined']();}),it('wiring:\x20an\x20explicit\x20intent\x20on\x20a\x20non-Service\x20seed\x20keeps\x20the\x20kernel\x20default\x20posture;\x20gap\x20dims\x20are\x20excluded\x20honestly',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['mac'],'intent':'full_map','context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['full_map']),expect(a['evaluation'])['toBeDefined'](),expect(a['evaluation']['unverified']['length'])['toBeGreaterThan'](0x0);}),it('wiring:\x20a\x20no-intent\x20trust-evaluation\x20call\x20on\x20a\x20non-Service\x20focus\x20is\x20refused\x20before\x20any\x20traversal',async()=>{registerGraphServiceEvaluations(),await expect(handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['mac'],'context_network':NET}))['rejects']['toThrow'](/not a Service/);}),it('analyze=false\x20drops\x20the\x20evaluation\x20section\x20(no\x20findings-less\x20all-clear)',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'analyze':![],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeUndefined'](),expect(a['findings'])['toEqual']([]);});});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config}from'@wowok/wowok/w/local';import{SdkDataPlane,expandTopology,inferObjectType,buildViewport,buildRoleInterest,runAnalyzers,runNodeAnalyzers,listAnalyzers,toCommercialRole,workflowSubgraphFromEdges,orderCompletionInGraph,resolveExpansionStrategy,withEvaluationBundle,EVALUATION_SERVICE_INTENTS,projectEvaluationFacts,projectFacets}from'../../graph/onchain/index.js';import{resolveAddress}from'./relationship-profile.js';import{evaluateGraphServiceFacts}from'../../evaluation/builtins/graph-service.js';import{RULE_NODE_ANALYZERS}from'../../knowledge/rule-node-analyzers.js';import{recommendedCallForForwardBinding}from'../../participation/radar-core.js';import{resolveTopologyContext}from'../../persona/topology-focus.js';import{deriveRuleWeights,resolveFacetProfile}from'../../persona/facet-profile.js';import{annotateFacetMoney}from'./facet-money.js';const NODE_MARK='::node::';function withDerivedFacetWeights(a,b){if(Object['keys'](b)['length']===0x0)return a;const c={...a?.['overrides']?.['rules']??{}};for(const [d,e]of Object['entries'](b)){if(!c[d])c[d]={'weight':e};}return{...a,'overrides':{...a?.['overrides']??{},'rules':c}};}function tally(a){const b={};for(const c of a){if(!c)continue;b[c]=(b[c]??0x0)+0x1;}return b;}export async function buildOnchainTopologyResult(a,b,c={}){const d=b['toLowerCase'](),f=[],g=new Set();for(const w of a['edges']){if(w['schema']!=='wf.transition')continue;for(const x of[w['from'],w['to']]){const y=x['indexOf'](NODE_MARK);if(y<=0x0)continue;const z=x['slice'](0x0,y)['toLowerCase']();!g['has'](z)&&(g['add'](z),f['push'](z));}}f['sort']();const h=f['map'](A=>{const B=workflowSubgraphFromEdges(a['edges'],A);return{'machine':A,'transitions':B['transitions']['map'](C=>({'node':C['node'],'prev_node':C['prevNode'],...C['forward']!==undefined?{'forward':C['forward']}:{},...C['threshold']!==undefined?{'threshold':C['threshold']}:{},'guard':C['guard']??null,'weight':C['weight']??null,'named_operator':C['namedOperator']??null,'permission_index':C['permissionIndex']??null,'recommended_call':recommendedCallForForwardBinding({'permissionIndex':C['permissionIndex']??null,'namedOperator':C['namedOperator']??null,'hasGuard':!!C['guard']})??null})),'terminal_names':[...B['terminalNames']]['sort']()};}),i=[...a['nodes']['values']()]['filter'](A=>A['kind']==='object'&&A['state']==='fetched'&&A['objectType']==='Order')['map'](A=>({'order':A['id'],...orderCompletionInGraph(a,A['id'])})),j=buildViewport(a,d,'neutral'),k=[...a['gaps']];let l=[],m;if(c['analyze']??!![]){const A=c['analyzerKinds'],B=c['onlyAnalyzers']?new Set(c['onlyAnalyzers']):undefined;try{l=runAnalyzers(j,{...A?{'kinds':A}:{},...B?{'only':[...B]}:{}});}catch(C){k['push']('Analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(C?.['message']??String(C)));}try{const D=RULE_NODE_ANALYZERS['filter'](E=>(!A||A['includes'](E['kind']))&&(!B||B['has'](E['id'])));l['push'](...runNodeAnalyzers(j,D));}catch(E){k['push']('Node\x20analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(E?.['message']??String(E)));}if(c['interestRole']&&c['interestObserver'])try{const F=buildRoleInterest(a,c['interestObserver'],toCommercialRole(c['interestRole']),c['interestDrive']);l['push'](F['finding']),m=F['view'];}catch(G){k['push']('Role\x20interest\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(G?.['message']??String(G)));}}let n,o;if(c['analyze']??!![])try{const H=projectEvaluationFacts(j,d,l);n=await evaluateGraphServiceFacts(H,c['injection']);if(c['facetProfile'])try{o=projectFacets({'graph':a,'viewport':j,'target':d,'facts':H,'evaluation':n,'workflows':h,'profile':{'role':c['facetProfile']['role'],'industry':c['facetProfile']['industry'],'persona_applied':c['facetProfile']['personaApplied'],'sources':c['facetProfile']['sources'],'facets':c['facetProfile']['facets']},...m?{'roleInterest':m}:{}});}catch(I){k['push']('Facet\x20projection\x20failed\x20(evaluation\x20is\x20intact):\x20'+(I?.['message']??String(I)));}}catch(J){k['push']('Evaluation\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(J?.['message']??String(J)));}for(const K of a['truncations']){k['push']('truncated\x20'+K['schema']+'\x20at\x20'+K['nodeId']+':\x20observed\x20at\x20least\x20'+K['observed']+'\x20edge(s)\x20(limit\x20'+K['limit']+')');}if(a['budgetExhausted']['rpcs'])k['push']('RPC\x20batch\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_rpcs).');if(a['budgetExhausted']['nodes'])k['push']('Node\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_nodes).');if(a['budgetExhausted']['depth'])k['push']('Depth\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_depth).');if(a['budgetExhausted']['eventPages'])k['push']('Event-page\x20budget\x20exhausted\x20—\x20event-derived\x20edges\x20are\x20partial.');const p=[...a['nodes']['values']()]['map'](L=>({'id':L['id'],'kind':L['kind'],...L['objectType']?{'object_type':L['objectType']}:{},...L['coinType']?{'coin_type':L['coinType']}:{},'state':L['state'],'depth':L['depth'],...L['error']?{'error':L['error']}:{},...c['includeRaw']&&L['raw']!==undefined?{'raw':L['raw']}:{}})),q=a['edges']['map'](L=>({'id':L['id'],'schema':L['schema'],'family':L['family'],'from':L['from'],'to':L['to'],'retention':L['retention'],'evidence':L['evidence'],...L['key']!==undefined?{'key':L['key']}:{},...L['truncated']!==undefined?{'truncated':L['truncated']}:{},...L['payload']!==undefined?{'payload':L['payload']}:{}})),r=tally(i['map'](L=>L['status'])),s=tally(a['edges']['map'](L=>L['family'])),u=Object['entries'](s)['map'](([L,M])=>L+'×'+M)['join'](',\x20');let v='Topology\x20around\x20'+d+'\x20on\x20'+a['network']+':\x20'+a['nodes']['size']+'\x20node(s),\x20'+a['edges']['length']+'\x20edge(s)'+(u?'\x20('+u+')':'')+(',\x20'+h['length']+'\x20workflow\x20graph(s),\x20'+i['length']+'\x20order(s)')+('\x20['+['completed','in_progress','unknown']['map'](L=>L+'='+(r[L]??0x0))['join'](',\x20')+']')+(',\x20'+l['length']+'\x20finding(s).');return n&&(v+='\x20Evaluation:\x20trust\x20'+n['trust']['total']+'/100,\x20risk\x20'+n['risk']['total']+'/100,\x20completeness\x20'+n['completeness']+'%'+(n['unverified']['length']>0x0?'\x20(unverifiable,\x20excluded:\x20'+n['unverified']['join'](',\x20')+')':'')+'.'),k['length']>0x0&&(v+='\x20'+k['length']+'\x20data\x20gap/partial-data\x20marker(s)\x20—\x20see\x20data_gaps/truncations/budget_exhausted\x20before\x20drawing\x20conclusions.'),{'action':'onchain_topology','seed':d,'network':a['network'],'strategy':{'intents':c['strategy']?.['intents']??['full_map'],...c['strategy']?.['edges']['families']?{'families':c['strategy']['edges']['families']}:{},...c['strategy']?.['edges']['schemas']?{'schemas':c['strategy']['edges']['schemas']}:{},'table_edges':c['strategy']?.['edges']['tableEdges']??['machine.node'],...c['strategy']?.['edges']['eventEdges']?{'event_edges':c['strategy']['edges']['eventEdges']}:{},...c['strategy']?.['edges']['familyDepths']?{'family_depths':c['strategy']['edges']['familyDepths']}:{},'budget':{...c['strategy']?.['budget']['maxDepth']!==undefined?{'max_depth':c['strategy']['budget']['maxDepth']}:{},...c['strategy']?.['budget']['maxNodes']!==undefined?{'max_nodes':c['strategy']['budget']['maxNodes']}:{},...c['strategy']?.['budget']['maxFanoutPerNode']!==undefined?{'max_fanout':c['strategy']['budget']['maxFanoutPerNode']}:{},...c['strategy']?.['budget']['maxRpcs']!==undefined?{'max_rpcs':c['strategy']['budget']['maxRpcs']}:{}},'trace':c['strategy']?.['trace']??['kernel\x20default:\x20all\x20families,\x20tables\x20[machine.node],\x20depth\x204']},'analyzers':[...listAnalyzers(),...RULE_NODE_ANALYZERS['map'](L=>L['id'])],'stats':{'nodes_total':a['nodes']['size'],'nodes_by_kind':tally([...a['nodes']['values']()]['map'](L=>L['kind'])),'nodes_by_object_type':tally([...a['nodes']['values']()]['map'](L=>L['objectType']??'')),'edges_total':a['edges']['length'],'edges_by_family':s,'edges_by_schema':tally(a['edges']['map'](L=>L['schema'])),'rpc':{'batches':a['rpcReport']['batches'],'by_channel':{'objects':a['rpcReport']['byChannel']['objects'],'keyed_fields':a['rpcReport']['byChannel']['keyedFields'],'tables':a['rpcReport']['byChannel']['tables'],'events':a['rpcReport']['byChannel']['events']},'dedup_hits':a['rpcReport']['dedupHits']}},'nodes':p,'edges':q,'workflows':h,'orders_completion':i,'findings':l,...n?{'evaluation':n}:{},...o?{'facets':o}:{},...m?{'role_interest':m}:{},'truncations':a['truncations']['map'](L=>({'node_id':L['nodeId'],'schema':L['schema'],'observed':L['observed'],'limit':L['limit']})),'budget_exhausted':{...a['budgetExhausted']['nodes']?{'nodes':!![]}:{},...a['budgetExhausted']['depth']?{'depth':!![]}:{},...a['budgetExhausted']['rpcs']?{'rpcs':!![]}:{},...a['budgetExhausted']['eventPages']?{'event_pages':!![]}:{}},'data_gaps':k,'summary':v};}export async function handleOnchainTopology(a,b,c){if(!a['focus'])throw new Error('\x27focus\x27\x20is\x20required\x20for\x20onchain_topology\x20—\x20an\x20on-chain\x20address\x20(0x...)\x20or\x20a\x20LocalMark\x20name.');const d=a['context_network']??await Config['Instance']()['network_get'](),e=await resolveAddress(a['focus'],'focus'),f=b??new SdkDataPlane(d,{'noCache':a['no_cache']});let g={};try{g=await resolveTopologyContext({...a['context_account']?{'account':a['context_account']['toLowerCase']()}:{},...a['industry']?{'industry':a['industry']}:{},...a['role']?{'role':a['role']}:{}});}catch{}const h=[];for(const x of[...g['roleDefault']?.['intents']??[],...g['personaPref']?.['intents']??[]]){if(!h['includes'](x))h['push'](x);}let j;if(!a['intent']&&(a['analyze']??!![])&&inferObjectType(e)==='Service'){j=[...EVALUATION_SERVICE_INTENTS];for(const y of h)if(!j['includes'](y))j['push'](y);}const k=g['personaPref']?j?((()=>{const {intents:z,...A}=g['personaPref'];return A;})()):g['personaPref']:undefined,l=resolveExpansionStrategy({...a['intent']?{'intents':[a['intent']]}:{},...j?{'defaultIntents':j}:{},...g['roleDefault']&&!j?{'roleDefault':g['roleDefault']}:{},...g['industryTemplate']?{'industryTemplate':g['industryTemplate']}:{},...k?{'personaPref':{...k,...k['table_edges']?{'tableEdges':k['table_edges']}:{},...k['event_edges']?{'eventEdges':k['event_edges']}:{},...k['family_depths']?{'familyDepths':k['family_depths']}:{},...k['schema_hops']?{'schemaHops':k['schema_hops']}:{},...k['max_depth']!==undefined?{'maxDepth':k['max_depth']}:{},...k['max_nodes']!==undefined?{'maxNodes':k['max_nodes']}:{},...k['max_fanout']!==undefined?{'maxFanout':k['max_fanout']}:{}}}:{},'explicitEdges':{...a['table_edges']?{'tableEdges':a['table_edges']}:{},...a['event_edges']?{'eventEdges':a['event_edges']}:{},...a['schema_hops']?{'schemaHops':a['schema_hops']}:{},...a['budget']?{'budget':{...a['budget']['max_depth']!==undefined?{'maxDepth':a['budget']['max_depth']}:{},...a['budget']['max_nodes']!==undefined?{'maxNodes':a['budget']['max_nodes']}:{},...a['budget']['max_fanout']!==undefined?{'maxFanoutPerNode':a['budget']['max_fanout']}:{},...a['budget']['max_rpcs']!==undefined?{'maxRpcs':a['budget']['max_rpcs']}:{}}}:{}}});let m=l;j&&(m=withEvaluationBundle(l),a['budget']&&(m={...m,'budget':l['budget'],'trace':[...m['trace'],'evaluation\x20bundle\x20budget\x20skipped:\x20explicit\x20caller\x20budget\x20wins']}));const n=await expandTopology(f,{'network':d,'seed':e,'budget':m['budget'],'edges':m['edges']}),o=a['interest_role']??a['role']??g['personaRole'];let p=a['context_account']?.['toLowerCase']();if(!p&&e['startsWith']('0x00'))p=e;const q=g['drive'],r=o&&p?toCommercialRole(o):undefined,s=a['role']?a['role']:g['personaRole'],t=resolveFacetProfile({...s?{'role':s}:{},...a['industry']?{'industry':a['industry']}:{},...g['evaluation']?{'personaEvaluation':g['evaluation']}:{},...a['facets']?{'request':a['facets']}:{}}),u=withDerivedFacetWeights(c,deriveRuleWeights(t)),w=await buildOnchainTopologyResult(n,e,{'analyze':a['analyze'],...a['analyzer_kinds']?{'analyzerKinds':a['analyzer_kinds']}:{},...a['only_analyzers']?{'onlyAnalyzers':a['only_analyzers']}:{},'includeRaw':a['include_raw'],'injection':u,'facetProfile':t,'strategy':m,...r&&p?{'interestRole':r,...q?{'interestDrive':q}:{},'interestObserver':p}:{}});if(w['facets']?.['items']['length'])try{await annotateFacetMoney(w['facets']['items'],d);}catch(z){w['data_gaps']['push']('Facet\x20money\x20annotation\x20failed\x20(raw\x20amounts\x20retained):\x20'+(z?.['message']??String(z)));}return o&&!p&&w['data_gaps']['push']('interest_role\x20given\x20but\x20no\x20observer\x20EOA\x20(pass\x20context_account,\x20or\x20seed\x20an\x20EOA\x20address)\x20—\x20role\x20interest\x20view\x20skipped'),w;}export async function evaluateServiceFromGraph(a,b={}){const c=await handleOnchainTopology({'query_type':'onchain_topology','focus':a,'analyze':!![],'include_raw':![],...b['context_network']?{'context_network':b['context_network']}:{},...b['no_cache']!==undefined?{'no_cache':b['no_cache']}:{}},undefined,b['injection']);if(!c['evaluation'])throw new Error('Graph\x20evaluation\x20unavailable\x20for\x20'+a+'\x20—\x20the\x20topology\x20result\x20carries\x20no\x20evaluation\x20section\x20(see\x20its\x20data_gaps).');return c['evaluation'];}
|
|
1
|
+
import{Config}from'@wowok/wowok/w/local';import{SdkDataPlane,expandTopology,inferObjectType,buildViewport,buildRoleInterest,runAnalyzers,runNodeAnalyzers,listAnalyzers,toCommercialRole,workflowSubgraphFromEdges,orderCompletionInGraph,projectExploration,synthesizeVerdicts,resolveExpansionStrategy,withEvaluationBundle,EVALUATION_SERVICE_INTENTS,projectEvaluationFacts,projectFacets}from'../../graph/onchain/index.js';import{resolveAddress}from'./relationship-profile.js';import{evaluateGraphServiceFacts}from'../../evaluation/builtins/graph-service.js';import{RULE_NODE_ANALYZERS}from'../../knowledge/rule-node-analyzers.js';import{recommendedCallForForwardBinding}from'../../participation/radar-core.js';import{resolveTopologyContext}from'../../persona/topology-focus.js';import{deriveRuleWeights,resolveFacetProfile}from'../../persona/facet-profile.js';import{annotateFacetMoney,annotateFindingMoney}from'./facet-money.js';const NODE_MARK='::node::';function withDerivedFacetWeights(a,b){if(Object['keys'](b)['length']===0x0)return a;const c={...a?.['overrides']?.['rules']??{}};for(const [d,e]of Object['entries'](b)){if(!c[d])c[d]={'weight':e};}return{...a,'overrides':{...a?.['overrides']??{},'rules':c}};}function tally(a){const b={};for(const c of a){if(!c)continue;b[c]=(b[c]??0x0)+0x1;}return b;}export async function buildOnchainTopologyResult(a,b,c={}){const d=b['toLowerCase'](),f=[],g=new Set();for(const z of a['edges']){if(z['schema']!=='wf.transition')continue;for(const A of[z['from'],z['to']]){const B=A['indexOf'](NODE_MARK);if(B<=0x0)continue;const C=A['slice'](0x0,B)['toLowerCase']();!g['has'](C)&&(g['add'](C),f['push'](C));}}f['sort']();const h=f['map'](D=>{const E=workflowSubgraphFromEdges(a['edges'],D);return{'machine':D,'transitions':E['transitions']['map'](F=>({'node':F['node'],'prev_node':F['prevNode'],...F['forward']!==undefined?{'forward':F['forward']}:{},...F['threshold']!==undefined?{'threshold':F['threshold']}:{},'guard':F['guard']??null,'weight':F['weight']??null,'named_operator':F['namedOperator']??null,'permission_index':F['permissionIndex']??null,'recommended_call':recommendedCallForForwardBinding({'permissionIndex':F['permissionIndex']??null,'namedOperator':F['namedOperator']??null,'hasGuard':!!F['guard']})??null})),'terminal_names':[...E['terminalNames']]['sort']()};}),i=[...a['nodes']['values']()]['filter'](D=>D['kind']==='object'&&D['state']==='fetched'&&D['objectType']==='Order')['map'](D=>({'order':D['id'],...orderCompletionInGraph(a,D['id'])})),j=buildViewport(a,d,'neutral'),k=[...a['gaps']],l=[];let m=[],n;if(c['analyze']??!![]){const D=c['analyzerKinds'],E=c['onlyAnalyzers']?new Set(c['onlyAnalyzers']):undefined;try{m=runAnalyzers(j,{...D?{'kinds':D}:{},...E?{'only':[...E]}:{}});}catch(F){k['push']('Analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(F?.['message']??String(F)));}try{const G=RULE_NODE_ANALYZERS['filter'](H=>(!D||D['includes'](H['kind']))&&(!E||E['has'](H['id'])));m['push'](...runNodeAnalyzers(j,G));}catch(H){k['push']('Node\x20analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(H?.['message']??String(H)));}if(c['interestRole']&&c['interestObserver'])try{const I=buildRoleInterest(a,c['interestObserver'],toCommercialRole(c['interestRole']),c['interestDrive']);m['push'](I['finding']),n=I['view'];}catch(J){k['push']('Role\x20interest\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(J?.['message']??String(J)));}}let o,p;if(c['analyze']??!![])try{const K=projectEvaluationFacts(j,d,m);o=await evaluateGraphServiceFacts(K,c['injection']);if(c['facetProfile'])try{p=projectFacets({'graph':a,'viewport':j,'target':d,'facts':K,'evaluation':o,'workflows':h,'profile':{'role':c['facetProfile']['role'],'industry':c['facetProfile']['industry'],'persona_applied':c['facetProfile']['personaApplied'],'sources':c['facetProfile']['sources'],'facets':c['facetProfile']['facets']},...n?{'roleInterest':n}:{}});}catch(L){k['push']('Facet\x20projection\x20failed\x20(evaluation\x20is\x20intact):\x20'+(L?.['message']??String(L)));}}catch(M){k['push']('Evaluation\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(M?.['message']??String(M)));}for(const N of a['truncations']){l['push']('truncated\x20'+N['schema']+'\x20at\x20'+N['nodeId']+':\x20observed\x20at\x20least\x20'+N['observed']+'\x20edge(s)\x20(limit\x20'+N['limit']+')');}if(a['budgetExhausted']['rpcs'])l['push']('RPC\x20batch\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_rpcs).');if(a['budgetExhausted']['nodes'])l['push']('Node\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_nodes).');if(a['budgetExhausted']['depth'])l['push']('Depth\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_depth).');if(a['budgetExhausted']['eventPages'])l['push']('Event-page\x20budget\x20exhausted\x20—\x20event-derived\x20edges\x20are\x20partial.');const q=[...a['nodes']['values']()]['map'](O=>({'id':O['id'],'kind':O['kind'],...O['objectType']?{'object_type':O['objectType']}:{},...O['coinType']?{'coin_type':O['coinType']}:{},'state':O['state'],'depth':O['depth'],...O['error']?{'error':O['error']}:{},...c['includeRaw']&&O['raw']!==undefined?{'raw':O['raw']}:{}})),r=a['edges']['map'](O=>({'id':O['id'],'schema':O['schema'],'family':O['family'],'from':O['from'],'to':O['to'],'retention':O['retention'],...O['key']!==undefined?{'key':O['key']}:{},...O['truncated']!==undefined?{'truncated':O['truncated']}:{},...O['payload']!==undefined?{'payload':O['payload']}:{}})),s=tally(i['map'](O=>O['status'])),u=tally(a['edges']['map'](O=>O['family'])),v=Object['entries'](u)['map'](([O,P])=>O+'×'+P)['join'](',\x20');let w='Topology\x20around\x20'+d+'\x20on\x20'+a['network']+':\x20'+a['nodes']['size']+'\x20node(s),\x20'+a['edges']['length']+'\x20edge(s)'+(v?'\x20('+v+')':'')+(',\x20'+h['length']+'\x20workflow\x20graph(s),\x20'+i['length']+'\x20order(s)')+('\x20['+['completed','in_progress','unknown']['map'](O=>O+'='+(s[O]??0x0))['join'](',\x20')+']')+(',\x20'+m['length']+'\x20finding(s).');o&&(w+='\x20Evaluation:\x20trust\x20'+o['trust']['total']+'/100,\x20risk\x20'+o['risk']['total']+'/100,\x20completeness\x20'+o['completeness']+'%'+(o['unverified']['length']>0x0?'\x20(unverifiable,\x20excluded:\x20'+o['unverified']['join'](',\x20')+')':'')+'.');k['length']+l['length']>0x0&&(w+='\x20'+(k['length']+l['length'])+'\x20data\x20gap/partial-data\x20marker(s)\x20—\x20see\x20data_gaps/truncations/budget_exhausted\x20before\x20drawing\x20conclusions.');const x=projectExploration(m,{'truncations':a['truncations'],'budgetExhausted':a['budgetExhausted'],'dataGaps':k}),y=synthesizeVerdicts({'findings':m,'openQuestions':x['open_questions']});return{'action':'onchain_topology','seed':d,'network':a['network'],'strategy':{'intents':c['strategy']?.['intents']??['full_map'],...c['strategy']?.['edges']['families']?{'families':c['strategy']['edges']['families']}:{},...c['strategy']?.['edges']['schemas']?{'schemas':c['strategy']['edges']['schemas']}:{},'table_edges':c['strategy']?.['edges']['tableEdges']??['machine.node'],...c['strategy']?.['edges']['eventEdges']?{'event_edges':c['strategy']['edges']['eventEdges']}:{},...c['strategy']?.['edges']['familyDepths']?{'family_depths':c['strategy']['edges']['familyDepths']}:{},'budget':{...c['strategy']?.['budget']['maxDepth']!==undefined?{'max_depth':c['strategy']['budget']['maxDepth']}:{},...c['strategy']?.['budget']['maxNodes']!==undefined?{'max_nodes':c['strategy']['budget']['maxNodes']}:{},...c['strategy']?.['budget']['maxFanoutPerNode']!==undefined?{'max_fanout':c['strategy']['budget']['maxFanoutPerNode']}:{},...c['strategy']?.['budget']['maxRpcs']!==undefined?{'max_rpcs':c['strategy']['budget']['maxRpcs']}:{}},'trace':c['strategy']?.['trace']??['kernel\x20default:\x20all\x20families,\x20tables\x20[machine.node],\x20depth\x204']},'analyzers':[...listAnalyzers(),...RULE_NODE_ANALYZERS['map'](O=>O['id'])],'stats':{'nodes_total':a['nodes']['size'],'nodes_by_kind':tally([...a['nodes']['values']()]['map'](O=>O['kind'])),'nodes_by_object_type':tally([...a['nodes']['values']()]['map'](O=>O['objectType']??'')),'edges_total':a['edges']['length'],'edges_by_family':u,'edges_by_schema':tally(a['edges']['map'](O=>O['schema'])),'rpc':{'batches':a['rpcReport']['batches'],'by_channel':{'objects':a['rpcReport']['byChannel']['objects'],'keyed_fields':a['rpcReport']['byChannel']['keyedFields'],'tables':a['rpcReport']['byChannel']['tables'],'events':a['rpcReport']['byChannel']['events']},'dedup_hits':a['rpcReport']['dedupHits']}},'nodes':q,'edges':r,'workflows':h,'orders_completion':i,'findings':m,...o?{'evaluation':o}:{},...p?{'facets':p}:{},...n?{'role_interest':n}:{},'truncations':a['truncations']['map'](O=>({'node_id':O['nodeId'],'schema':O['schema'],'observed':O['observed'],'limit':O['limit']})),'budget_exhausted':{...a['budgetExhausted']['nodes']?{'nodes':!![]}:{},...a['budgetExhausted']['depth']?{'depth':!![]}:{},...a['budgetExhausted']['rpcs']?{'rpcs':!![]}:{},...a['budgetExhausted']['eventPages']?{'event_pages':!![]}:{}},'data_gaps':[...k,...l],...x['open_questions']['length']>0x0?{'exploration':x}:{},...y?{'synthesis':y}:{},'summary':w};}export async function handleOnchainTopology(a,b,c){if(!a['focus'])throw new Error('\x27focus\x27\x20is\x20required\x20for\x20onchain_topology\x20—\x20an\x20on-chain\x20address\x20(0x...)\x20or\x20a\x20LocalMark\x20name.');const d=a['context_network']??await Config['Instance']()['network_get'](),e=await resolveAddress(a['focus'],'focus'),f=inferObjectType(e);if(!a['intent']&&(a['analyze']??!![])&&f!=='Service')throw new Error('onchain_topology\x20trust\x20evaluation\x20is\x20not\x20applicable:\x20the\x20focus\x20is\x20not\x20a\x20Service'+(f?'\x20(it\x20is\x20a\x20'+f+')':'')+'.\x20The\x20evaluation\x20suite\x20reads\x20Service-snapshot\x20evidence\x20slots,\x20so\x20evaluate\x20the\x20Service\x20'+'that\x20hosts\x20or\x20uses\x20this\x20object\x20instead.\x20For\x20a\x20plain\x20topology\x20read\x20of\x20this\x20focus,\x20pass\x20'+'an\x20explicit\x20intent\x20(e.g.\x20\x27full_map\x27)\x20or\x20analyze=false.');const g=b??new SdkDataPlane(d,{'noCache':a['no_cache']});let h={};try{h=await resolveTopologyContext({...a['context_account']?{'account':a['context_account']['toLowerCase']()}:{},...a['industry']?{'industry':a['industry']}:{},...a['role']?{'role':a['role']}:{}});}catch{}const j=[];for(const y of[...h['roleDefault']?.['intents']??[],...h['personaPref']?.['intents']??[]]){if(!j['includes'](y))j['push'](y);}let k;if(!a['intent']&&(a['analyze']??!![])&&inferObjectType(e)==='Service'){k=[...EVALUATION_SERVICE_INTENTS];for(const z of j)if(!k['includes'](z))k['push'](z);}const l=h['personaPref']?k?((()=>{const {intents:A,...B}=h['personaPref'];return B;})()):h['personaPref']:undefined,m=resolveExpansionStrategy({...a['intent']?{'intents':[a['intent']]}:{},...k?{'defaultIntents':k}:{},...h['roleDefault']&&!k?{'roleDefault':h['roleDefault']}:{},...h['industryTemplate']?{'industryTemplate':h['industryTemplate']}:{},...l?{'personaPref':{...l,...l['table_edges']?{'tableEdges':l['table_edges']}:{},...l['event_edges']?{'eventEdges':l['event_edges']}:{},...l['family_depths']?{'familyDepths':l['family_depths']}:{},...l['schema_hops']?{'schemaHops':l['schema_hops']}:{},...l['max_depth']!==undefined?{'maxDepth':l['max_depth']}:{},...l['max_nodes']!==undefined?{'maxNodes':l['max_nodes']}:{},...l['max_fanout']!==undefined?{'maxFanout':l['max_fanout']}:{}}}:{},'explicitEdges':{...a['table_edges']?{'tableEdges':a['table_edges']}:{},...a['event_edges']?{'eventEdges':a['event_edges']}:{},...a['schema_hops']?{'schemaHops':a['schema_hops']}:{},...a['budget']?{'budget':{...a['budget']['max_depth']!==undefined?{'maxDepth':a['budget']['max_depth']}:{},...a['budget']['max_nodes']!==undefined?{'maxNodes':a['budget']['max_nodes']}:{},...a['budget']['max_fanout']!==undefined?{'maxFanoutPerNode':a['budget']['max_fanout']}:{},...a['budget']['max_rpcs']!==undefined?{'maxRpcs':a['budget']['max_rpcs']}:{}}}:{}}});let n=m;k&&(n=withEvaluationBundle(m),a['budget']&&(n={...n,'budget':m['budget'],'trace':[...n['trace'],'evaluation\x20bundle\x20budget\x20skipped:\x20explicit\x20caller\x20budget\x20wins']}));const o=await expandTopology(g,{'network':d,'seed':e,'budget':n['budget'],'edges':n['edges']}),p=a['interest_role']??a['role']??h['personaRole'];let q=a['context_account']?.['toLowerCase']();if(!q&&e['startsWith']('0x00'))q=e;const r=h['drive'],s=p&&q?toCommercialRole(p):undefined,t=a['role']?a['role']:h['personaRole'],u=resolveFacetProfile({...t?{'role':t}:{},...a['industry']?{'industry':a['industry']}:{},...h['evaluation']?{'personaEvaluation':h['evaluation']}:{},...a['facets']?{'request':a['facets']}:{}}),w=withDerivedFacetWeights(c,deriveRuleWeights(u)),x=await buildOnchainTopologyResult(o,e,{'analyze':a['analyze'],...a['analyzer_kinds']?{'analyzerKinds':a['analyzer_kinds']}:{},...a['only_analyzers']?{'onlyAnalyzers':a['only_analyzers']}:{},'includeRaw':a['include_raw'],'injection':w,'facetProfile':u,'strategy':n,...s&&q?{'interestRole':s,...r?{'interestDrive':r}:{},'interestObserver':q}:{}});if(x['facets']?.['items']['length'])try{await annotateFacetMoney(x['facets']['items'],d);}catch(A){x['data_gaps']['push']('Facet\x20money\x20annotation\x20failed\x20(raw\x20amounts\x20retained):\x20'+(A?.['message']??String(A)));}if(x['findings']['length'])try{await annotateFindingMoney(x['findings'],d);}catch(B){x['data_gaps']['push']('Finding\x20money\x20annotation\x20failed\x20(raw\x20amounts\x20retained):\x20'+(B?.['message']??String(B)));}return a['interest_role']&&!q&&x['data_gaps']['push']('interest_role\x20given\x20but\x20no\x20observer\x20EOA\x20(pass\x20context_account,\x20or\x20seed\x20an\x20EOA\x20address)\x20—\x20role\x20interest\x20view\x20skipped'),x;}export async function evaluateServiceFromGraph(a,b={}){const c=await handleOnchainTopology({'query_type':'onchain_topology','focus':a,'analyze':!![],'include_raw':![],...b['context_network']?{'context_network':b['context_network']}:{},...b['no_cache']!==undefined?{'no_cache':b['no_cache']}:{}},undefined,b['injection']);if(!c['evaluation'])throw new Error('Graph\x20evaluation\x20unavailable\x20for\x20'+a+'\x20—\x20the\x20topology\x20result\x20carries\x20no\x20evaluation\x20section\x20(see\x20its\x20data_gaps).');return c['evaluation'];}
|
|
@@ -4,13 +4,13 @@ export interface DesignCheck {
|
|
|
4
4
|
id: string;
|
|
5
5
|
dimension: "intent" | "game" | "value";
|
|
6
6
|
passed: boolean;
|
|
7
|
-
severity: "critical" | "
|
|
7
|
+
severity: "critical" | "medium" | "info";
|
|
8
8
|
message: string;
|
|
9
9
|
fix?: string;
|
|
10
10
|
}
|
|
11
11
|
export interface DesignFinding {
|
|
12
12
|
kind: "business_loophole" | "semantic_loophole";
|
|
13
|
-
severity: "critical" | "
|
|
13
|
+
severity: "critical" | "medium" | "info";
|
|
14
14
|
message: string;
|
|
15
15
|
fix: string;
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{checkGameTheoryConstraints}from'./game-theory.js';const VALUE_DIMENSION_CARRIERS=[{'dimension':'escrow_quality','type':'allocation','desc':'funds\x20locked\x20in\x20contract,\x20released\x20by\x20guard'},{'dimension':'proof_integrity','type':'repository','desc':'tamper-proof\x20delivery\x20evidence'},{'dimension':'arbitration_fairness','type':'arb','desc':'independent\x20dispute\x20resolution'},{'dimension':'permission_safety','type':'permission','desc':'governance\x20+\x20forward\x20authorization'},{'dimension':'content_commitment','type':'guard','desc':'delivery\x20verification\x20rules'}];function detectRefundBypass(a){const b=[],c=a['some'](e=>/refund|cancel|disput/i['test'](e['id'])),d=a['some'](e=>/arbitr/i['test'](e['id'])||e['type']==='arb');return c&&!d&&b['push']({'kind':'business_loophole','severity':'critical','message':'A\x20refund/cancel\x20path\x20exists\x20but\x20no\x20Arbitration\x20node\x20is\x20present\x20—\x20refunds\x20would\x20bypass\x20independent\x20dispute\x20review.','fix':'Add\x20an\x20Arbitration\x20node\x20(independent\x20Permission)\x20so\x20the\x20refund\x20path\x20routes\x20through\x20dispute\x20resolution.'}),b;}function detectMissingAcceptTimeout(a,b){const c=[],d=a['some'](f=>/complet|accept|finaliz|done/i['test'](f['id'])),e=b['some'](f=>/timeout|time_guard|accept_timeout/i['test'](f['relation']))||a['some'](f=>/timeout|time_guard/i['test'](f['id']));return d&&!e&&c['push']({'kind':'semantic_loophole','severity':'
|
|
1
|
+
import{checkGameTheoryConstraints}from'./game-theory.js';const VALUE_DIMENSION_CARRIERS=[{'dimension':'escrow_quality','type':'allocation','desc':'funds\x20locked\x20in\x20contract,\x20released\x20by\x20guard'},{'dimension':'proof_integrity','type':'repository','desc':'tamper-proof\x20delivery\x20evidence'},{'dimension':'arbitration_fairness','type':'arb','desc':'independent\x20dispute\x20resolution'},{'dimension':'permission_safety','type':'permission','desc':'governance\x20+\x20forward\x20authorization'},{'dimension':'content_commitment','type':'guard','desc':'delivery\x20verification\x20rules'}];function detectRefundBypass(a){const b=[],c=a['some'](e=>/refund|cancel|disput/i['test'](e['id'])),d=a['some'](e=>/arbitr/i['test'](e['id'])||e['type']==='arb');return c&&!d&&b['push']({'kind':'business_loophole','severity':'critical','message':'A\x20refund/cancel\x20path\x20exists\x20but\x20no\x20Arbitration\x20node\x20is\x20present\x20—\x20refunds\x20would\x20bypass\x20independent\x20dispute\x20review.','fix':'Add\x20an\x20Arbitration\x20node\x20(independent\x20Permission)\x20so\x20the\x20refund\x20path\x20routes\x20through\x20dispute\x20resolution.'}),b;}function detectMissingAcceptTimeout(a,b){const c=[],d=a['some'](f=>/complet|accept|finaliz|done/i['test'](f['id'])),e=b['some'](f=>/timeout|time_guard|accept_timeout/i['test'](f['relation']))||a['some'](f=>/timeout|time_guard/i['test'](f['id']));return d&&!e&&c['push']({'kind':'semantic_loophole','severity':'medium','message':'A\x20completion/accept\x20path\x20exists\x20without\x20an\x20accept-timeout\x20mechanism\x20—\x20customer\x20silence\x20could\x20stall\x20settlement\x20indefinitely.','fix':'Adopt\x20accept_timeout_protection:\x20add\x20a\x20time_guard\x20on\x20the\x20accept\x20forward\x20so\x20silence\x20advances\x20the\x20order.'}),c;}function checkIntentConsistency(a){const b=[],{businessIntent:c}=a,d=new Set(a['nodes']['map'](h=>h['type'])),e=new Set(a['nodes']['map'](h=>h['id']['toLowerCase']()));b['push']({'id':'intent_core_service','dimension':'intent','passed':d['has']('service'),'severity':'critical','message':d['has']('service')?'Core\x20Service\x20node\x20present\x20—\x20merchant\x20intent\x20has\x20a\x20structural\x20home.':'No\x20Service\x20node\x20in\x20the\x20blueprint\x20—\x20merchant\x20intent\x20has\x20no\x20structural\x20home.','fix':d['has']('service')?undefined:'Add\x20a\x20Service\x20node\x20to\x20the\x20blueprint.'});c['roles']['arbitrators']&&b['push']({'id':'intent_arbitrator','dimension':'intent','passed':d['has']('arb')||e['has']('main_arbitration'),'severity':'medium','message':'Declared\x20arbitrator\x20role\x20has\x20no\x20Arbitration\x20carrier\x20object\x20in\x20the\x20blueprint.','fix':'Add\x20an\x20Arbitration\x20object\x20to\x20the\x20blueprint.'});const f=c['deliverables']??[];f['length']>0x0&&!d['has']('repository')&&!d['has']('proof')&&b['push']({'id':'intent_deliverable','dimension':'intent','passed':![],'severity':'info','message':f['length']+'\x20deliverable(s)\x20declared\x20but\x20no\x20Repository/Proof\x20carrier\x20—\x20delivery\x20evidence\x20has\x20no\x20on-chain\x20home.','fix':'Bind\x20a\x20Repository\x20(and\x20optionally\x20Proof)\x20to\x20store\x20delivery\x20hashes.'});const g=c['payment']?.['kind']??'';return/milestone|escrow/i['test'](g)&&!d['has']('allocation')&&b['push']({'id':'intent_payment','dimension':'intent','passed':![],'severity':'critical','message':'Milestone/escrow\x20payment\x20declared\x20but\x20no\x20Allocation\x20carrier\x20—\x20funds\x20have\x20no\x20release\x20gate.','fix':'Bind\x20order_allocators\x20(Allocation)\x20so\x20funds\x20release\x20per\x20verified\x20milestone.'}),b;}function checkValueCoverage(a){const b=new Set(a['nodes']['map'](c=>c['type']));return VALUE_DIMENSION_CARRIERS['map'](d=>({'id':'value_'+d['dimension'],'dimension':'value','passed':b['has'](d['type']),'severity':d['type']==='allocation'||d['type']==='arb'?'critical':'info','message':b['has'](d['type'])?d['dimension']+':\x20'+d['type']+'\x20present\x20('+d['desc']+').':d['dimension']+':\x20missing\x20'+d['type']+'\x20carrier\x20('+d['desc']+').','fix':b['has'](d['type'])?undefined:'Add\x20a\x20'+d['type']+'\x20object\x20to\x20cover\x20'+d['dimension']+'.'}));}export function assessWorkflowDesign(a){const b=checkGameTheoryConstraints(a,a['businessIntent']),c=checkIntentConsistency(a),d=checkValueCoverage(a),e=b['results']['map'](l=>({'id':'game_'+l['scenario'],'dimension':'game','passed':l['covered'],'severity':l['scenario']==='merchant_may_abandon'?'critical':'medium','message':l['covered']?'Covered:\x20'+l['conflict']:'EXPOSED:\x20'+l['conflict'],'fix':l['covered']?undefined:l['recommendation']})),f=[...detectRefundBypass(a['nodes']),...detectMissingAcceptTimeout(a['nodes'],a['edges'])],g=[...c,...e,...d],h=g['filter'](l=>!l['passed']&&l['severity']==='critical')['length'],i=g['filter'](l=>!l['passed'])['length'],j=Math['max'](0x0,Math['min'](0x64,0x64-h*0x14-i*0x5)),k=h>0x0?'Design\x20NOT\x20ready:\x20'+h+'\x20critical\x20+\x20'+i+'\x20total\x20open\x20loop(s).':i>0x0?'Design\x20mostly\x20sound:\x20'+i+'\x20open\x20loop(s),\x20no\x20critical.':'Design\x20sound:\x20intent/game/value\x20all\x20covered.';return{'checks':g,'findings':f,'game_coverage':b,'score':j,'summary':k};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const EMPLOYMENT={'kind':'employment','semantics':'Merchant\x27s\x20internal\x20staff\x20via\x20Permission\x20entity\x20membership\x20(no\x20node\x20operator\x20power\x20of\x20their\x20own)\x20—\x20principal-agent.','anchor_role':'merchant','counterparty_role':'employee','tension':{'anchor_goal':'Maximize\x20delivered\x20output\x20quality\x20at\x20fixed\x20labor\x20cost;\x20errors\x20are\x20attributed\x20to\x20the\x20merchant\x20outwardly.','counterparty_goal':'Maximize\x20compensation\x20while\x20minimizing\x20effort\x20and\x20personal\x20liability\x20exposure.','divergence':'Fixed\x20pay\x20decouples\x20effort\x20from\x20outcome:\x20the\x20employee\x20bears\x20only\x20bounded\x20liability\x20(resolveLiability)\x20while\x20the\x20merchant\x27s\x20reputation\x20and\x20compensation_fund\x20absorb\x20the\x20residue.','alignment_mechanisms':['Employee\x20KPI:\x20assessReactionKpi\x20measures\x20node\x20reaction\x20time\x20against\x20a\x20budget\x20(participation/employee-kpi.ts)','Acceptance\x20gate:\x20node\x20advancement\x20requires\x20the\x20merchant-side\x20permission\x20or\x20evidence\x20upload\x20(machine
|
|
1
|
+
const EMPLOYMENT={'kind':'employment','semantics':'Merchant\x27s\x20internal\x20staff\x20via\x20Permission\x20entity\x20membership\x20(no\x20node\x20operator\x20power\x20of\x20their\x20own)\x20—\x20principal-agent.','anchor_role':'merchant','counterparty_role':'employee','tension':{'anchor_goal':'Maximize\x20delivered\x20output\x20quality\x20at\x20fixed\x20labor\x20cost;\x20errors\x20are\x20attributed\x20to\x20the\x20merchant\x20outwardly.','counterparty_goal':'Maximize\x20compensation\x20while\x20minimizing\x20effort\x20and\x20personal\x20liability\x20exposure.','divergence':'Fixed\x20pay\x20decouples\x20effort\x20from\x20outcome:\x20the\x20employee\x20bears\x20only\x20bounded\x20liability\x20(resolveLiability)\x20while\x20the\x20merchant\x27s\x20reputation\x20and\x20compensation_fund\x20absorb\x20the\x20residue.','alignment_mechanisms':['Employee\x20KPI:\x20assessReactionKpi\x20measures\x20node\x20reaction\x20time\x20against\x20a\x20budget\x20(participation/employee-kpi.ts)','Acceptance\x20gate:\x20node\x20advancement\x20requires\x20the\x20merchant-side\x20permission\x20or\x20evidence\x20upload\x20(machine\x20forwards)','Compensation-before-resume:\x20an\x20employee-error\x20loss\x20must\x20compensate\x20the\x20order\x20user\x20before\x20the\x20workflow\x20resumes\x20(resolveLiability)','Incentive\x20bridge:\x20KPI\x20+\x20acceptance\x20→\x20Reward\x20suggestion,\x20executed\x20only\x20after\x20merchant\x20confirmation\x20(relationship/incentive.ts)']}},PROCESS_OPERATION={'kind':'process_operation','semantics':'Machine\x20node\x20operators\x20—\x20namedOperator\x20addresses,\x20permissionIndex\x20entities,\x20or\x20guard\x20proofs\x20(machine\x20Forward).','anchor_role':'machine/merchant\x20side','counterparty_role':'node\x20operator','tension':{'anchor_goal':'Workflow\x20advances\x20correctly\x20and\x20on\x20schedule;\x20WIP\x20evidence\x20is\x20complete.','counterparty_goal':'Complete\x20assigned\x20nodes\x20with\x20minimal\x20friction;\x20parallel\x20forwards\x20let\x20operators\x20pick\x20favorable\x20edges.','divergence':'Multi-path\x20forwards\x20(multiple\x20forwards\x20from\x20one\x20prev_node)\x20let\x20operators\x20choose\x20the\x20cheap\x20edge,\x20not\x20the\x20quality\x20edge.','alignment_mechanisms':['Forward\x20guard:\x20each\x20edge\x20can\x20require\x20a\x20guard\x20proof\x20(machine\x20Forward.guard)','Threshold\x20accumulation:\x20parallel\x20edges\x20need\x20accumulated\x20weights\x20to\x20migrate\x20the\x20node','WIP\x20evidence:\x20progress\x20records\x20who\x20advanced\x20what\x20and\x20when\x20(progress\x20Holder)']}},AGENCY={'kind':'agency','semantics':'Order\x20owner\x20(buyer)\x20delegates\x20purchasing\x20power\x20to\x20order\x20agents\x20(order\x20agent[]).','anchor_role':'buyer','counterparty_role':'agent','tension':{'anchor_goal':'Agent\x20acts\x20strictly\x20within\x20the\x20principal\x27s\x20interest\x20when\x20spending\x20escrowed\x20funds.','counterparty_goal':'Operational\x20latitude;\x20agents\x20may\x20face\x20incentives\x20from\x20the\x20merchant\x20side.','divergence':'The\x20agent\x20spends\x20the\x20principal\x27s\x20money:\x20classic\x20delegated-spending\x20moral\x20hazard.','alignment_mechanisms':['Order\x20operation\x20gate:\x20only\x20owner/agent\x20can\x20operate\x20the\x20order','Order\x20agent\x20assignment\x20is\x20revocable\x20at\x20any\x20time\x20by\x20the\x20owner','All\x20agent\x20operations\x20are\x20on-chain\x20auditable\x20events']}},TRANSACTION={'kind':'transaction','semantics':'Customer\x20(order\x20owner)\x20↔\x20merchant\x20(service\x20side)\x20—\x20the\x20core\x20adversarial-cooperative\x20exchange.','anchor_role':'customer','counterparty_role':'merchant','tension':{'anchor_goal':'Receive\x20the\x20agreed\x20deliverable;\x20keep\x20the\x20refund\x20path\x20available\x20until\x20acceptance.','counterparty_goal':'Get\x20escrowed\x20funds\x20released\x20as\x20early\x20as\x20possible;\x20minimize\x20dispute\x20surface.','divergence':'Fund\x20release\x20vs\x20acceptance\x20timing:\x20the\x20customer\x20wants\x20evidence\x20before\x20release,\x20the\x20merchant\x20wants\x20release\x20on\x20completion\x20terminal.','alignment_mechanisms':['Escrow:\x20order\x20amount\x20is\x20locked\x20until\x20the\x20workflow\x20reaches\x20a\x20terminal','buy_guard:\x20merchant\x20can\x20pre-screen\x20buyers','compensation_fund\x20+\x20bound\x20arbitrations:\x20breach\x20recourse\x20without\x20a\x20platform\x20(service\x20publish\x20rule)','Registrar\x20votes\x20(BIT_LIKE/BIT_DISLIKE/BIT_FAVOR):\x20post-transaction\x20reputation\x20accumulation','Demand\x20feedback\x20acceptance_score:\x20demander\x20rates\x20the\x20supplier\x20on-chain\x20(demand\x20feedback)']}},SUPPLY={'kind':'supply','semantics':'Demander\x20(demand\x20permission\x20owner)\x20×\x20presenter\x20(supplier\x20presenting\x20a\x20service\x20to\x20the\x20demand).','anchor_role':'demander','counterparty_role':'supplier/presenter','tension':{'anchor_goal':'Select\x20the\x20best-fitting\x20service;\x20personalized\x20support\x20before\x20committing.','counterparty_goal':'Win\x20the\x20selection;\x20the\x20present\x20call\x20is\x20cheap\x20so\x20over-presenting\x20is\x20rational.','divergence':'Presentation\x20is\x20free\x20for\x20the\x20supplier\x20but\x20selection\x20is\x20costly\x20for\x20the\x20demander\x20—\x20asymmetric\x20effort.','alignment_mechanisms':['Presenters\x20map\x20with\x20recommend\x20field\x20and\x20update_time\x20(demand\x20present)','On-chain\x20acceptance_score\x20feedback\x20loop\x20(demand\x20feedback)\x20—\x20bad\x20presentations\x20get\x20scored','Demand\x20guards:\x20present/claim\x20can\x20be\x20gated\x20(demand\x20guards)','Demand\x20rewards:\x20only\x20the\x20selected\x20winner\x27s\x20claim\x20guard\x20passes']}},ARBITRATION_DELEGATION={'kind':'arbitration_delegation','semantics':'Service\x20owner\x20delegates\x20dispute\x20resolution\x20to\x20an\x20Arbitration\x27s\x20voting\x20guards\x20(service\x20arbitrations).','anchor_role':'service\x20owner\x20(merchant)','counterparty_role':'arbitrators\x20(voting\x20guard\x20members)','tension':{'anchor_goal':'Fair\x20verdicts\x20that\x20protect\x20the\x20merchant\x27s\x20reputation;\x20predictable\x20fee\x20costs.','counterparty_goal':'Earn\x20arbitration\x20fees;\x20vote\x20throughput\x20matters\x20more\x20than\x20deep\x20investigation.','divergence':'Vote\x20cost\x20asymmetry:\x20fast\x20votes\x20earn\x20the\x20same\x20fee\x20as\x20investigated\x20votes.','alignment_mechanisms':['Separation\x20of\x20powers:\x20arbitration\x20permission\x20must\x20differ\x20from\x20the\x20service\x20permission\x20(the\x20Service\x20arbitration-binding\x20rule)','vote_weight\x20per\x20voting\x20guard\x20member\x20—\x20weighted,\x20not\x20majority-count','Arb\x20indemnity\x20is\x20paid\x20from\x20the\x20merchant\x27s\x20compensation_fund\x20—\x20verdicts\x20cost\x20the\x20merchant\x20real\x20money','Registrar\x20reputation\x20for\x20the\x20arbitration\x20object\x20itself']}},DISPUTE_RESOLUTION={'kind':'dispute_resolution','semantics':'Arbitrator\x20↔\x20disputants\x20through\x20Arb\x20lifecycle\x20(order\x20dispute[]\x20/\x20claimed_by).','anchor_role':'arbitrator','counterparty_role':'disputants','tension':{'anchor_goal':'Resolve\x20with\x20a\x20defensible\x20proposition\x20before\x20the\x20voting\x20deadline.','counterparty_goal':'Maximize\x20own-side\x20indemnity\x20/\x20minimize\x20own-side\x20loss.','divergence':'Zero-sum\x20over\x20the\x20indemnity\x20amount\x20within\x20the\x20voting\x20deadline\x20window.','alignment_mechanisms':['voting_deadline\x20forces\x20resolution','Voted\x20records\x20are\x20on-chain\x20and\x20auditable','compensation\x20claim\x20is\x20single-shot\x20(order\x20claimed_by\x20guard,\x20E_ORDER_ALREADY_CLAIMED)']}},VALUE_DISTRIBUTION={'kind':'value_distribution','semantics':'Declared\x20value\x20flow:\x20allocation\x20recipients\x20(Entity\x20/\x20Signer\x20/\x20GuardIdentifier)\x20sharing\x20escrowed\x20funds.','anchor_role':'payer\x20/\x20allocation\x20owner','counterparty_role':'recipient','tension':{'anchor_goal':'Control\x20outflow:\x20threshold,\x20max\x20cap,\x20guard-gated\x20release.','counterparty_goal':'Receive\x20distribution\x20as\x20early\x20and\x20as\x20fully\x20as\x20possible.','divergence':'Every\x20basis\x20point\x20of\x20Rate\x20sharing\x20is\x20contested;\x20Surplus\x20absorbs\x20the\x20remainder.','alignment_mechanisms':['Allocator\x20guard\x20must\x20pass\x20before\x20any\x20split','Rate\x20total\x20must\x20be\x20exactly\x2010000\x20without\x20Surplus\x20/\x20at\x20most\x2010000\x20with\x20one\x20(contract\x20invariants)','max\x20cap\x20for\x20Amount-mode\x20allocators','Payment\x20objects\x20record\x20the\x20per-recipient\x20breakdown\x20(NewPaymentEvent)']}},CONTACT_MEMBERSHIP={'kind':'contact_membership','semantics':'Communication\x20channel\x20membership\x20(contact\x20ims[]).','anchor_role':'contact\x20owner','counterparty_role':'IM\x20member','tension':undefined};export const RELATIONSHIP_KIND_REGISTRY={'employment':EMPLOYMENT,'process_operation':PROCESS_OPERATION,'agency':AGENCY,'transaction':TRANSACTION,'supply':SUPPLY,'arbitration_delegation':ARBITRATION_DELEGATION,'dispute_resolution':DISPUTE_RESOLUTION,'value_distribution':VALUE_DISTRIBUTION,'contact_membership':CONTACT_MEMBERSHIP};export function interestHintsFor(a,b){const c=RELATIONSHIP_KIND_REGISTRY[a];if(!c?.['tension'])return{'gains':[],'exposures':[]};return b?{'gains':['Aligned\x20outcome\x20of:\x20'+c['tension']['anchor_goal']],'exposures':[c['tension']['divergence']]}:{'gains':['Aligned\x20outcome\x20of:\x20'+c['tension']['counterparty_goal']],'exposures':[c['tension']['divergence']]};}
|
package/dist/review/machine.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function assembleMachineReview(a){const b=a['head'],c=a['fields'],d=a['graph']['nodes'],e=a['graph']['edges'],g=[b['published']===![]?{'v':'UNPUBLISHED','tone':'amber','tip':'Machine\x20is\x20not\x20published\x20—\x20a\x20draft\x20template;\x20orders\x20cannot\x20advance\x20through\x20it.'}:b['paused']?{'v':'PAUSED','tone':'red','tip':'Machine\x20is\x20paused\x20—\x20progress\x20objects\x20cannot\x20advance\x20until\x20it\x20is\x20resumed.'}:{'v':'LIVE','tone':'green','tip':'Machine\x20is\x20published\x20and\x20running\x20—\x20progress\x20objects\x20can\x20advance\x20through\x20its\x20workflow.'}],i=[{'label':'Nodes','tip':'Workflow\x20nodes\x20(stages)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(c['node_count']??d['length']),'tone':'strong'}},{'label':'Edges','tip':'Workflow\x20edges\x20(node\x20transitions)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(e['length']),'tone':'strong'}},{'label':'Progress','tip':'Progress\x20objects\x20currently\x20registered\x20under\x20this\x20Machine\x20in\x20the\x20global\x20tx\x20table\x20(click\x20for\x20the\x20list).','value':{'t':'count','n':a['progresses']['count'],'panel_title':'Progress','addrs':a['progresses']['items']['map'](n=>n['progress'])}}],j={'kind':'core','title':'Permission','rows':c['permission']?[{'label':'Permission','ref':{'address':c['permission'],'obj_type':'Permission'}}]:[]},k={'kind':'fields','columns':0x2,'fields':[{'label':'Published','tip':'YES\x20—\x20the\x20Machine\x20is\x20published\x20on-chain\x20and\x20can\x20accept\x20progress\x20objects.\x20no\x20—\x20still\x20a\x20draft\x20template;\x20orders\x20cannot\x20advance\x20through\x20it.','value':{'t':'text','v':b['published']==null?'unknown':b['published']?'YES':'no'}},{'label':'Paused','tip':b['paused']?'The\x20workflow\x20is\x20paused\x20—\x20progress\x20objects\x20cannot\x20advance\x20until\x20it\x20is\x20resumed.':'The\x20workflow\x20is\x20running\x20normally.','value':{'t':'text','v':b['paused']==null?'unknown':b['paused']?'YES':'no'}},{'label':'Node\x20count','tip':'Number\x20of\x20workflow\x20nodes\x20(stages)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(c['node_count']??d['length']),'tone':'strong'}},{'label':'Consensus\x20repositories','tip':'Repositories\x20consulted\x20for\x20machine\x20consensus\x20(evidence\x20/\x20data\x20verification).','value':{'t':'count','n':c['consensus_repositories']['length'],'panel_title':'Consensus\x20repositories','addrs':c['consensus_repositories']}},{'label':'UM','tip':'UM\x20(um:\x20Option<address>)\x20—\x20a\x20Contact\x20designated\x20as\x20this\x20Machine\x27s\x20customer-service\x20/\x20update\x20channel\x20(
|
|
1
|
+
export function assembleMachineReview(a){const b=a['head'],c=a['fields'],d=a['graph']['nodes'],e=a['graph']['edges'],g=[b['published']===![]?{'v':'UNPUBLISHED','tone':'amber','tip':'Machine\x20is\x20not\x20published\x20—\x20a\x20draft\x20template;\x20orders\x20cannot\x20advance\x20through\x20it.'}:b['paused']?{'v':'PAUSED','tone':'red','tip':'Machine\x20is\x20paused\x20—\x20progress\x20objects\x20cannot\x20advance\x20until\x20it\x20is\x20resumed.'}:{'v':'LIVE','tone':'green','tip':'Machine\x20is\x20published\x20and\x20running\x20—\x20progress\x20objects\x20can\x20advance\x20through\x20its\x20workflow.'}],i=[{'label':'Nodes','tip':'Workflow\x20nodes\x20(stages)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(c['node_count']??d['length']),'tone':'strong'}},{'label':'Edges','tip':'Workflow\x20edges\x20(node\x20transitions)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(e['length']),'tone':'strong'}},{'label':'Progress','tip':'Progress\x20objects\x20currently\x20registered\x20under\x20this\x20Machine\x20in\x20the\x20global\x20tx\x20table\x20(click\x20for\x20the\x20list).','value':{'t':'count','n':a['progresses']['count'],'panel_title':'Progress','addrs':a['progresses']['items']['map'](n=>n['progress'])}}],j={'kind':'core','title':'Permission','rows':c['permission']?[{'label':'Permission','ref':{'address':c['permission'],'obj_type':'Permission'}}]:[]},k={'kind':'fields','columns':0x2,'fields':[{'label':'Published','tip':'YES\x20—\x20the\x20Machine\x20is\x20published\x20on-chain\x20and\x20can\x20accept\x20progress\x20objects.\x20no\x20—\x20still\x20a\x20draft\x20template;\x20orders\x20cannot\x20advance\x20through\x20it.','value':{'t':'text','v':b['published']==null?'unknown':b['published']?'YES':'no'}},{'label':'Paused','tip':b['paused']?'The\x20workflow\x20is\x20paused\x20—\x20progress\x20objects\x20cannot\x20advance\x20until\x20it\x20is\x20resumed.':'The\x20workflow\x20is\x20running\x20normally.','value':{'t':'text','v':b['paused']==null?'unknown':b['paused']?'YES':'no'}},{'label':'Node\x20count','tip':'Number\x20of\x20workflow\x20nodes\x20(stages)\x20defined\x20in\x20this\x20Machine.','value':{'t':'text','v':String(c['node_count']??d['length']),'tone':'strong'}},{'label':'Consensus\x20repositories','tip':'Repositories\x20consulted\x20for\x20machine\x20consensus\x20(evidence\x20/\x20data\x20verification).','value':{'t':'count','n':c['consensus_repositories']['length'],'panel_title':'Consensus\x20repositories','addrs':c['consensus_repositories']}},{'label':'UM','tip':'UM\x20(um:\x20Option<address>)\x20—\x20a\x20Contact\x20designated\x20as\x20this\x20Machine\x27s\x20customer-service\x20/\x20update\x20channel\x20(settable\x20and\x20clearable).','value':c['um']?{'t':'addr','v':c['um'],'obj_type':'Contact'}:null}]},l={'kind':'graph','title':'Graph','empty':'No\x20workflow\x20topology\x20defined\x20for\x20this\x20Machine.','graph':{'machineAddress':a['machineAddress'],'machineName':b['name'],'published':b['published'],'paused':b['paused'],'permission':a['graph']['permission']??(a['fields']['permission']?{'address':a['fields']['permission'],'remarks':[]}:null),'nodes':d,'edges':e}},m={'kind':'related','title':'Related\x20objects'+(a['related']['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20this\x20Machine\x20yet\x20—\x20Progress\x20objects\x20created\x20on\x20this\x20workflow,\x20and\x20anything\x20linked\x20to\x20it,\x20will\x20appear\x20here.','groups':a['related']['groups'],'count':a['related']['count']};return{'action':'review_pack','object_type':'Machine','head':{'address':a['machineAddress'],'network':a['network'],'name':b['name'],'description':b['description'],'tags':b['tags'],'last_active_ms':null,'badges':g,'info_rows':[i]},'sections':[j,k,l,m],'data_gaps':a['data_gaps']};}
|
package/dist/review/order.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function groupRelated(a){const b=new Map();for(const c of a){const d=c['object_type']||'Unknown',e=b['get'](d);if(e)e['push']({'address':c['address'],'time':c['time']});else b['set'](d,[{'address':c['address'],'time':c['time']}]);}return[...b['entries']()]['map'](([f,g])=>({'label':f,'items':g}))['sort']((f,g)=>(g['items'][0x0]?.['time']??0x0)-(f['items'][0x0]?.['time']??0x0));}export function assembleOrderReview(a){const b=a['fields'],c=b['amount_display']||null,d=[{'label':'Required\x20info','tip':'Buyer-submitted\x20private\x20info\x20(order.required_info,\
|
|
1
|
+
export function groupRelated(a){const b=new Map();for(const c of a){const d=c['object_type']||'Unknown',e=b['get'](d);if(e)e['push']({'address':c['address'],'time':c['time']});else b['set'](d,[{'address':c['address'],'time':c['time']}]);}return[...b['entries']()]['map'](([f,g])=>({'label':f,'items':g}))['sort']((f,g)=>(g['items'][0x0]?.['time']??0x0)-(f['items'][0x0]?.['time']??0x0));}export function assembleOrderReview(a){const b=a['fields'],c=b['amount_display']||null,d=[{'label':'Required\x20info','tip':'Buyer-submitted\x20private\x20info\x20(order.required_info,\x20buyer-updatable):\x20the\x20buyer\x27s\x20messenger\x20Contact\x20object\x20or\x20a\x20WTS\x20proof\x20id,\x20shared\x20with\x20the\x20merchant\x20to\x20satisfy\x20the\x20Service\x27s\x20customer\x20requirements.','value':b['required_info']?{'t':'addr','v':b['required_info']}:null},{'label':'Owner','tip':'The\x20account\x20that\x20created\x20(bought)\x20this\x20order\x20(order.owner)','value':b['owner']?{'t':'addr','v':b['owner']}:null},{'label':'Created\x20at','tip':'When\x20the\x20buyer\x20created\x20this\x20order\x20(order.time).\x20The\x20top-right\x20stamp\x20is\x20the\x20UPDATED\x20time\x20(last\x20on-chain\x20tx)\x20—\x20two\x20distinct\x20clocks.','value':b['time']!=null?{'t':'time','v':b['time']}:null}],e=[{'label':'Progress','value':{'t':'progress','v':b['progress']??'','node':a['progress_next'],'since':a['progress_since'],'machine':b['machine']??null}},{'label':'Disputes','tip':'Arbitration\x20objects\x20that\x20opened\x20a\x20dispute\x20on\x20this\x20order\x20(order.dispute,\x20max\x2010)','value':{'t':'count','n':a['disputes']['length'],'panel_title':'Disputes','addrs':a['disputes']}},...b['claimed_by']?[{'label':'Claimed\x20by','tip':'Compensation\x20claimant\x20—\x20the\x20Arbitration\x20object\x20that\x20claimed\x20the\x20order\x27s\x20compensation\x20(order.compensate).\x20Once\x20set,\x20the\x20order\x20can\x20no\x20longer\x20be\x20claimed\x20or\x20disputed.','value':{'t':'addr','v':b['claimed_by']}}]:[]],g={'kind':'items','title':'Bought\x20('+a['items']['length']+')','empty':'No\x20purchased\x20items\x20on\x20this\x20order\x20yet.','items':a['items']['map'](k=>({'name':k['name']??'--','meta':[{'label':'price','value':k['price_display']||k['price']||'--'},{'label':'qty','value':k['quantity']??'--'}],'hash':k['wip_hash']??null}))},h={'kind':'fields','columns':0x2,'fields':[{'label':'Service','tip':'The\x20Service\x20this\x20order\x20was\x20placed\x20against.','value':b['service']?{'t':'addr','v':b['service'],'obj_type':'Service'}:null},{'label':'Machine','tip':'The\x20Machine\x20workflow\x20template\x20this\x20order\x20runs\x20through.\x20Empty\x20for\x20machine-less\x20orders.','value':b['machine']?{'t':'addr','v':b['machine'],'obj_type':'Machine'}:null},{'label':'Discount','tip':'The\x20Discount\x20object\x20applied\x20to\x20this\x20order\x20at\x20purchase\x20time.','value':b['discount']?{'t':'addr','v':b['discount'],'obj_type':'Discount'}:null},{'label':'Agents','tip':'Operator\x20accounts\x20besides\x20the\x20owner\x20that\x20can\x20act\x20on\x20this\x20order.','value':{'t':'count','n':a['agents']['length'],'panel_title':'Agents','addrs':a['agents']}},{'label':'Allocation','tip':'The\x20fund-splitting\x20object\x20bound\x20to\x20this\x20order\x20(order.allocation).\x20Green\x20\x27allocated\x27\x20=\x20balance\x20==\x200,\x20fully\x20split\x20to\x20recipients\x20(allocation.alloc);\x20amber\x20\x27pending\x27\x20=\x20balance\x20>\x200.','value':b['allocation']?{'t':'addr','v':b['allocation'],'obj_type':'Allocation','badge':a['allocation_state']==='allocated'?{'v':'allocated','tone':'green'}:a['allocation_state']==='pending'?{'v':'pending','tone':'amber'}:undefined}:null},{'label':'Progress','tip':'The\x20Progress\x20object\x20tracking\x20this\x20order\x20through\x20the\x20machine\x20workflow\x20(order.progress);\x20its\x20latest\x20node\x20and\x20elapsed\x20time\x20show\x20on\x20the\x20header\x20card.','value':b['progress']?{'t':'addr','v':b['progress'],'obj_type':'Progress'}:null}]},i=a['related']?.['items']??[],j={'kind':'related','title':'Related\x20objects'+(a['related']?.['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Order\x20yet.','groups':groupRelated(i),'count':a['related']?.['count']??i['length']};return{'action':'review_pack','object_type':'Order','head':{'address':a['object'],'network':a['network'],'name':a['head']['name'],'description':a['head']['description'],'tags':a['head']['tags'],'last_active_ms':a['updated_ms'],'badges':[],...c?{'amount':{'text':c,'tip':b['amount_tip']||'Order\x20total\x20in\x20the\x20shop\x27s\x20payment\x20token\x20(Service<T>\x20generic).'}}:{},'info_rows':[d,e]},'sections':[g,h,j],'data_gaps':a['data_gaps']};}
|
package/dist/review/service.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function shortHex(b){return b['length']>0xe?b['slice'](0x0,0x6)+'…'+b['slice'](-0x4):b;}export function fmtDuration(a){if(a===null||a===undefined||a==='')return'--';const b=Number(a);if(!Number['isFinite'](b)||b<=0x0)return'--';const c=[[0x5265c00,'d'],[0x36ee80,'h'],[0xea60,'m'],[0x3e8,'s']],d=[];let e=Math['floor'](b);for(const [f,g]of c){if(d['length']>=0x2)break;const h=Math['floor'](e/f);e-=h*f;if(h>0x0)d['push'](''+h+g);else{if(d['length']>0x0)break;}}return d['length']===0x0?'<1s':d['join']('\x20');}export function assembleServiceReview(a){const b=a['service'],c=[];if(!b['published'])c['push']({'v':'UNPUBLISHED','tone':'amber','tip':'Service\x20is\x20not\x20published\x20—\x20invisible\x20to\x20customers\x20on\x20the\x20WoW\x20market\x20listing;\x20every\x20sale\x20item\x20is\x20unbuyable.'});else b['paused']&&c['push']({'v':'PAUSED','tone':'red','tip':'Service\x20is\x20paused\x20—\x20new\x20orders\x20are\x20rejected\x20(existing\x20orders\x20still\x20progress);\x20every\x20sale\x20item\x20is\x20unbuyable.'});const d=!b['published']||b['paused'],e={'kind':'items','title':'Sales\x20('+b['sales']['length']+')','empty':'No\x20sale\x20items\x20configured\x20—\x20the\x20storefront\x20is\x20empty.','items':b['sales']['map'](o=>({'name':o['name']||'(unnamed)','meta':[{'label':'price','value':o['price_display']||o['price']||'--','tip':o['price_tip']||'On-chain\x20price\x20in\x20the\x20smallest\x20unit.\x20Payment\x20token\x20info\x20unavailable\x20—\x20showing\x20the\x20raw\x20stored\x20value.'},{'label':'stock','value':o['stock']??'--','tip':'Remaining\x20sellable\x20stock\x20for\x20this\x20item.'},{'label':'wip','value':o['wip']||'--','tip':'Work-in-progress\x20product\x20template.\x20Every\x20purchase\x20mints\x20a\x20new\x20item\x20from\x20this\x20WIP\x20blueprint.'}],'badge':o['suspension']?{'v':'SUSPENDED','tone':'red'}:null,'dim':d||!!o['suspension']}))},f={'kind':'core','title':'Permission','rows':[{'label':'Permission','ref':{'address':b['permission'],'obj_type':'Permission'}}]},g={'kind':'fields','columns':0x2,'fields':[{'label':'Location','tip':'The\x20service\x20area\x20and\x20scope\x20as\x20stated\x20by\x20the\x20merchant.','value':b['location']?{'t':'text','v':b['location']}:null},{'label':'Purchase\x20guard','tip':'Guard\x20every\x20customer\x20must\x20pass\x20to\x20place\x20an\x20order\x20(whitelist\x20/\x20KYC\x20/\x20payment\x20proof).\x20Set\x20→\x20buyers\x20must\x20satisfy\x20its\x20conditions;\x20unset\x20→\x20purchase\x20is\x20unconditional.','value':a['buy_guard']?.['address']??b['buy_guard']?{'t':'addr','v':a['buy_guard']?.['address']??b['buy_guard'],'obj_type':'Guard'}:null},{'label':'Compensation\x20fund','tip':'Pre-funded\x20on-chain\x20guarantee.\x20Buyers\x20can\x20claim\x20from\x20this\x20fund\x20BEFORE\x20going\x20to\x20arbitration\x20—\x20the\x20key\x20risk-reduction\x20signal\x20customers\x20look\x20for.\x20Merchant-side\x20withdrawal\x20is\x20gated\x20by\x20the\x20Setting\x20lock:\x20the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed\x20(paused_time\x20+\x20setting_lock_duration\x20≤\x20now).','value':b['compensation_fund']?{'t':'text','v':b['compensation_fund']}:null},{'label':'Published','tip':'Service\x20is\x20published\x20→\x20visible\x20to\x20customers\x20on\x20the\x20WoW\x20market\x20listing.\x20Unpublished\x20→\x20merchant-only\x20preview.','value':b['published']?{'t':'badge','v':'YES','tone':'red'}:{'t':'badge','v':'no','tone':'green'}},{'label':'Paused','tip':'When\x20paused,\x20new\x20orders\x20are\x20rejected\x20(existing\x20orders\x20still\x20progress).\x20If\x20paused,\x20shows\x20the\x20time\x20of\x20the\x20most\x20recent\x20pause\x20(the\x20PAUSE\x20tx\x20timestamp);\x20\x27no\x27\x20=\x20not\x20paused.\x20The\x20pause\x20timestamp\x20anchors\x20the\x20Setting-lock\x20window\x20that\x20gates\x20compensation-fund\x20withdrawal\x20and\x20arbitration/reward\x20removal.','value':b['paused']?{'t':'time','v':b['paused_time']??0x0,'tip':'Most\x20recent\x20pause\x20(the\x20PAUSE\x20tx\x20timestamp).'}:{'t':'text','v':'no'}},{'label':'Setting\x20lock','tip':'Lock\x20window\x20(ms)\x20anchored\x20at\x20the\x20pause\x20timestamp.\x20It\x20gates\x20exactly\x20three\x20operations:\x20withdrawing\x20the\x20Compensation\x20fund,\x20and\x20removing/clearing\x20Arbitrations\x20or\x20Rewards\x20while\x20the\x20Service\x20is\x20published\x20—\x20each\x20requires\x20the\x20Service\x20to\x20be\x20paused\x20AND\x20the\x20window\x20elapsed\x20since\x20the\x20pause.\x20Adding\x20arbitrations/rewards\x20and\x20every\x20other\x20setting\x20change\x20are\x20NOT\x20gated;\x20unpublished\x20services\x20may\x20remove\x20rewards/arbitrations\x20freely.','value':{'t':'text','v':fmtDuration(b['setting_lock_duration'])}},{'label':'UM','tip':'Update\x20Manager\x20—\x20a\x20Contact\x20designated\x20as\x20this\x20Service\x27s\x20customer-service\x20/\x20update\x20channel.\x20Buyers\x20and\x20off-chain\x20clients\x20route\x20support\x20requests\x20and\x20update\x20notices\x20through\x20this\x20Contact.','value':b['um']?{'t':'addr','v':b['um'],'obj_type':'Contact'}:null},{'label':'Machine','tip':'Workflow\x20Machine\x20bound\x20to\x20this\x20Service.\x20Orders\x20inherit\x20it\x20at\x20buy\x20time\x20—\x20an\x20order\x27s\x20Machine\x20and\x20its\x20fulfillment\x20Progress\x20nodes\x20are\x20fixed\x20when\x20the\x20order\x20is\x20created.','value':b['machine']?{'t':'addr','v':b['machine'],'obj_type':'Machine'}:null},{'label':'Customer\x20requirements','tip':'Proof\x20types\x20every\x20customer\x20must\x20satisfy\x20before/while\x20ordering\x20(e.g.\x20ID\x20proof,\x20residency,\x20off-chain\x20signature).','value':b['customer_required']['length']?{'t':'text','v':b['customer_required']['join'](',\x20')}:null},{'label':'Arbitrations','tip':'Dispute\x20channels\x20bound\x20to\x20this\x20Service.\x20An\x20arbitration\x20resolves\x20conflicts\x20when\x20the\x20compensation-fund\x20claim-path\x20does\x20not\x20suffice.\x20While\x20published,\x20removing/clearing\x20is\x20gated\x20by\x20the\x20Setting\x20lock\x20(the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed);\x20adding\x20is\x20allowed\x20anytime.','value':{'t':'count','n':b['arbitrations']['length'],'panel_title':'Arbitrations','addrs':b['arbitrations']}},{'label':'Rewards','tip':'On-chain\x20reward\x20pools\x20bound\x20to\x20this\x20Service\x20—\x20typically\x20pay\x20out\x20to\x20customers\x20on\x20purchase\x20milestones,\x20or\x20to\x20staff\x20for\x20on-time\x20fulfillment.\x20While\x20published,\x20removing/clearing\x20is\x20gated\x20by\x20the\x20Setting\x20lock\x20(the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed);\x20adding\x20is\x20allowed\x20anytime.','value':{'t':'count','n':b['rewards']['length'],'panel_title':'Rewards','addrs':b['rewards']}},{'label':'Repositories','tip':'Evidence\x20/\x20data\x20repositories\x20consulted\x20for\x20fulfillment\x20proofs.\x20The\x20Machine\x20workflow\x20can\x20require\x20repository-gated\x20consensus\x20before\x20advancing\x20a\x20stage.','value':{'t':'count','n':b['repositories']['length'],'panel_title':'Repositories','addrs':b['repositories']}}]},h=a['machine_graph'],i=h?{'kind':'graph','title':'Workflow\x20Graph','empty':'No\x20workflow\x20machine\x20bound\x20to\x20this\x20Service.','graph':{'machineAddress':h['address'],'machineName':h['name'],'published':h['published'],'paused':h['paused'],'nodes':h['nodes'],'edges':h['edges']}}:null,j=a['allocator_guards']['map']((o,p)=>({'name':'Guard\x20'+(p+0x1),'ref':{'address':o['address'],'obj_type':'Guard'},'meta':[{'label':'entries','value':String(o['table_entry_count']),'tip':'Guard\x20table\x20entries\x20=\x20the\x20conditions\x20/\x20proof\x20slots\x20defined\x20in\x20this\x20guard.'},{'label':'submissions','value':String(o['submission_slot_count']),'tip':'Submission\x20slots\x20=\x20dynamic\x20proof\x20fields\x20the\x20operator\x20must\x20fill\x20at\x20execution\x20time.'},...o['rep']!=null?[{'label':'rep','value':o['rep']?'yes':'no','tip':'Reputation-flagged\x20guard\x20—\x20requires\x20a\x20reputation\x20marker\x20to\x20pass.'}]:[],...o['relies_logic_and']!=null?[{'label':'logic','value':o['relies_logic_and']?'AND':'OR','tip':'AND\x20=\x20all\x20relied-guards\x20must\x20pass;\x20OR\x20=\x20any\x20relied-guard\x20passing\x20is\x20enough.'}]:[],...o['relies']['length']>0x0?[{'label':'relies','value':String(o['relies']['length']),'tip':'Upstream\x20guards\x20this\x20guard\x20composes\x20with\x20(evidence\x20verification\x20chaining)\x20—\x20open\x20the\x20Guard\x20detail\x20for\x20the\x20full\x20tree.'}]:[]],'note':o['description']??undefined}));if(b['order_allocators']){const o=b['order_allocators'];j['push']({'name':'Order\x20allocators','meta':[{'label':'threshold','value':o['threshold']??'--','tip':'Escrow\x20amount\x20threshold\x20above\x20which\x20the\x20allocator\x20strategy\x20applies.'}],'note':o['description']||'(no\x20description)'}),o['allocators']['forEach']((p,q)=>{j['push']({'name':'Allocator\x20'+(q+0x1),'ref':{'address':p['guard'],'obj_type':'Guard'},'meta':[{'label':'shares','value':String(p['sharing_count']),'tip':'Number\x20of\x20settlement\x20shares\x20this\x20allocator\x20guard\x20controls.'},...p['max']?[{'label':'max','value':p['max'],'tip':'Per-share\x20cap\x20for\x20this\x20allocator\x20guard.'}]:[]]});});}const k={'kind':'items','title':'Allocation\x20Guards\x20('+a['allocator_guards']['length']+')','empty':'No\x20allocation\x20guards\x20—\x20settlement\x20splits\x20use\x20the\x20default\x20allocator\x20strategy.\x20(A\x20configured\x20purchase\x20guard\x20is\x20listed\x20in\x20the\x20Fields\x20card.)','items':j},l=a['related']['groups']['reduce']((p,q)=>p+q['items']['length'],0x0),m={'kind':'related','title':'Related\x20objects'+(l>0x0?'\x20('+l+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Service\x20yet\x20—\x20orders,\x20progress,\x20allocations,\x20payments\x20and\x20guards\x20targeting\x20this\x20Service\x20will\x20appear\x20here.','groups':a['related']['groups']['map'](p=>({'label':p['type_label'],'items':p['items']['map'](q=>({'address':q['address'],'time':q['time']}))})),'count':l},n=[e,f,g,...i?[i]:[],k,m];return{'action':'review_pack','object_type':'Service','head':{'address':b['address'],'network':a['network'],'name':b['name'],'description':b['description']||null,'tags':b['tags'],'last_active_ms':b['onchain_last_updated']?Number(b['onchain_last_updated']['timestamp_ms'])||null:null,'badges':c,'info_rows':[]},'sections':n,'data_gaps':a['data_gaps']};}
|
|
1
|
+
export function shortHex(b){return b['length']>0xe?b['slice'](0x0,0x6)+'…'+b['slice'](-0x4):b;}export function fmtDuration(a){if(a===null||a===undefined||a==='')return'--';const b=Number(a);if(!Number['isFinite'](b)||b<=0x0)return'--';const c=[[0x5265c00,'d'],[0x36ee80,'h'],[0xea60,'m'],[0x3e8,'s']],d=[];let e=Math['floor'](b);for(const [f,g]of c){if(d['length']>=0x2)break;const h=Math['floor'](e/f);e-=h*f;if(h>0x0)d['push'](''+h+g);else{if(d['length']>0x0)break;}}return d['length']===0x0?'<1s':d['join']('\x20');}export function assembleServiceReview(a){const b=a['service'],c=[];if(!b['published'])c['push']({'v':'UNPUBLISHED','tone':'amber','tip':'Service\x20is\x20not\x20published\x20—\x20invisible\x20to\x20customers\x20on\x20the\x20WoW\x20market\x20listing;\x20every\x20sale\x20item\x20is\x20unbuyable.'});else b['paused']&&c['push']({'v':'PAUSED','tone':'red','tip':'Service\x20is\x20paused\x20—\x20new\x20orders\x20are\x20rejected\x20(existing\x20orders\x20still\x20progress);\x20every\x20sale\x20item\x20is\x20unbuyable.'});const d=!b['published']||b['paused'],e={'kind':'items','title':'Sales\x20('+b['sales']['length']+')','empty':'No\x20sale\x20items\x20configured\x20—\x20the\x20storefront\x20is\x20empty.','items':b['sales']['map'](o=>({'name':o['name']||'(unnamed)','meta':[{'label':'price','value':o['price_display']||o['price']||'--','tip':o['price_tip']||'On-chain\x20price\x20in\x20the\x20smallest\x20unit.\x20Payment\x20token\x20info\x20unavailable\x20—\x20showing\x20the\x20raw\x20stored\x20value.'},{'label':'stock','value':o['stock']??'--','tip':'Remaining\x20sellable\x20stock\x20for\x20this\x20item.'},{'label':'wip','value':o['wip']||'--','tip':'Work-in-progress\x20product\x20template.\x20Every\x20purchase\x20mints\x20a\x20new\x20item\x20from\x20this\x20WIP\x20blueprint.'}],'badge':o['suspension']?{'v':'SUSPENDED','tone':'red'}:null,'dim':d||!!o['suspension']}))},f={'kind':'core','title':'Permission','rows':[{'label':'Permission','ref':{'address':b['permission'],'obj_type':'Permission'}}]},g={'kind':'fields','columns':0x2,'fields':[{'label':'Location','tip':'The\x20service\x20area\x20and\x20scope\x20as\x20stated\x20by\x20the\x20merchant.','value':b['location']?{'t':'text','v':b['location']}:null},{'label':'Purchase\x20guard','tip':'Guard\x20every\x20customer\x20must\x20pass\x20to\x20place\x20an\x20order\x20(whitelist\x20/\x20KYC\x20/\x20payment\x20proof).\x20Set\x20→\x20buyers\x20must\x20satisfy\x20its\x20conditions;\x20unset\x20→\x20purchase\x20is\x20unconditional.','value':a['buy_guard']?.['address']??b['buy_guard']?{'t':'addr','v':a['buy_guard']?.['address']??b['buy_guard'],'obj_type':'Guard'}:null},{'label':'Compensation\x20fund','tip':'Pre-funded\x20on-chain\x20guarantee.\x20Buyers\x20can\x20claim\x20from\x20this\x20fund\x20BEFORE\x20going\x20to\x20arbitration\x20—\x20the\x20key\x20risk-reduction\x20signal\x20customers\x20look\x20for.\x20Merchant-side\x20withdrawal\x20is\x20gated\x20by\x20the\x20Setting\x20lock:\x20the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed\x20(paused_time\x20+\x20setting_lock_duration\x20≤\x20now).','value':b['compensation_fund']?{'t':'text','v':b['compensation_fund']}:null},{'label':'Published','tip':'Service\x20is\x20published\x20→\x20visible\x20to\x20customers\x20on\x20the\x20WoW\x20market\x20listing.\x20Unpublished\x20→\x20merchant-only\x20preview.','value':b['published']?{'t':'badge','v':'YES','tone':'red'}:{'t':'badge','v':'no','tone':'green'}},{'label':'Paused','tip':'When\x20paused,\x20new\x20orders\x20are\x20rejected\x20(existing\x20orders\x20still\x20progress).\x20If\x20paused,\x20shows\x20the\x20time\x20of\x20the\x20most\x20recent\x20pause\x20(the\x20PAUSE\x20tx\x20timestamp);\x20\x27no\x27\x20=\x20not\x20paused.\x20The\x20pause\x20timestamp\x20anchors\x20the\x20Setting-lock\x20window\x20that\x20gates\x20compensation-fund\x20withdrawal\x20and\x20arbitration/reward\x20removal.','value':b['paused']?{'t':'time','v':b['paused_time']??0x0,'tip':'Most\x20recent\x20pause\x20(the\x20PAUSE\x20tx\x20timestamp).'}:{'t':'text','v':'no'}},{'label':'Setting\x20lock','tip':'Lock\x20window\x20(ms)\x20anchored\x20at\x20the\x20pause\x20timestamp.\x20It\x20gates\x20exactly\x20three\x20operations:\x20withdrawing\x20the\x20Compensation\x20fund,\x20and\x20removing/clearing\x20Arbitrations\x20or\x20Rewards\x20while\x20the\x20Service\x20is\x20published\x20—\x20each\x20requires\x20the\x20Service\x20to\x20be\x20paused\x20AND\x20the\x20window\x20elapsed\x20since\x20the\x20pause.\x20Adding\x20arbitrations/rewards\x20and\x20every\x20other\x20setting\x20change\x20are\x20NOT\x20gated;\x20unpublished\x20services\x20may\x20remove\x20rewards/arbitrations\x20freely.','value':{'t':'text','v':fmtDuration(b['setting_lock_duration'])}},{'label':'UM','tip':'Update\x20Manager\x20—\x20a\x20Contact\x20designated\x20as\x20this\x20Service\x27s\x20customer-service\x20/\x20update\x20channel.\x20Buyers\x20and\x20off-chain\x20clients\x20route\x20support\x20requests\x20and\x20update\x20notices\x20through\x20this\x20Contact.','value':b['um']?{'t':'addr','v':b['um'],'obj_type':'Contact'}:null},{'label':'Machine','tip':'Workflow\x20Machine\x20bound\x20to\x20this\x20Service.\x20Orders\x20inherit\x20it\x20at\x20buy\x20time\x20—\x20an\x20order\x27s\x20Machine\x20and\x20its\x20fulfillment\x20Progress\x20nodes\x20are\x20fixed\x20when\x20the\x20order\x20is\x20created.','value':b['machine']?{'t':'addr','v':b['machine'],'obj_type':'Machine'}:null},{'label':'Customer\x20requirements','tip':'Proof\x20types\x20every\x20customer\x20must\x20satisfy\x20before/while\x20ordering\x20(e.g.\x20ID\x20proof,\x20residency,\x20off-chain\x20signature).','value':b['customer_required']['length']?{'t':'text','v':b['customer_required']['join'](',\x20')}:null},{'label':'Arbitrations','tip':'Dispute\x20channels\x20bound\x20to\x20this\x20Service.\x20An\x20arbitration\x20resolves\x20conflicts\x20when\x20the\x20compensation-fund\x20claim-path\x20does\x20not\x20suffice.\x20While\x20published,\x20removing/clearing\x20is\x20gated\x20by\x20the\x20Setting\x20lock\x20(the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed);\x20adding\x20is\x20allowed\x20anytime.','value':{'t':'count','n':b['arbitrations']['length'],'panel_title':'Arbitrations','addrs':b['arbitrations']}},{'label':'Rewards','tip':'On-chain\x20reward\x20pools\x20bound\x20to\x20this\x20Service\x20—\x20typically\x20pay\x20out\x20to\x20customers\x20on\x20purchase\x20milestones,\x20or\x20to\x20staff\x20for\x20on-time\x20fulfillment.\x20While\x20published,\x20removing/clearing\x20is\x20gated\x20by\x20the\x20Setting\x20lock\x20(the\x20Service\x20must\x20be\x20paused\x20and\x20the\x20window\x20elapsed);\x20adding\x20is\x20allowed\x20anytime.','value':{'t':'count','n':b['rewards']['length'],'panel_title':'Rewards','addrs':b['rewards']}},{'label':'Repositories','tip':'Evidence\x20/\x20data\x20repositories\x20consulted\x20for\x20fulfillment\x20proofs.\x20The\x20Machine\x20workflow\x20can\x20require\x20repository-gated\x20consensus\x20before\x20advancing\x20a\x20stage.','value':{'t':'count','n':b['repositories']['length'],'panel_title':'Repositories','addrs':b['repositories']}}]},h=a['machine_graph'],i=h?{'kind':'graph','title':'Workflow\x20Graph','empty':'No\x20workflow\x20machine\x20bound\x20to\x20this\x20Service.','graph':{'machineAddress':h['address'],'machineName':h['name'],'published':h['published'],'paused':h['paused'],'nodes':h['nodes'],'edges':h['edges']}}:null,j=[];if(b['order_allocators']){const o=b['order_allocators'];j['push']({'name':'Order\x20allocators','meta':[{'label':'threshold','value':o['threshold']??'--','tip':'Escrow\x20amount\x20threshold\x20above\x20which\x20the\x20allocator\x20strategy\x20applies.'}],'note':o['description']||'(no\x20description)'}),o['allocators']['forEach']((p,q)=>{const r=p['guard_summary'];j['push']({'name':'Allocator\x20'+(q+0x1),'ref':{'address':p['guard'],'obj_type':'Guard'},'meta':[{'label':'shares','value':String(p['sharing_count']),'tip':'Number\x20of\x20settlement\x20shares\x20this\x20allocator\x20guard\x20controls.'},...p['max']?[{'label':'max','value':p['max'],'tip':'Per-share\x20cap\x20for\x20this\x20allocator\x20guard.'}]:[],...r?[{'label':'entries','value':String(r['table_entry_count']),'tip':'Guard\x20table\x20entries\x20=\x20the\x20conditions\x20/\x20proof\x20slots\x20defined\x20in\x20this\x20guard.'},{'label':'submissions','value':String(r['submission_slot_count']),'tip':'Submission\x20slots\x20=\x20dynamic\x20proof\x20fields\x20the\x20operator\x20must\x20fill\x20at\x20execution\x20time.'},...r['rep']!=null?[{'label':'rep','value':r['rep']?'yes':'no','tip':'Reputation-flagged\x20guard\x20—\x20requires\x20a\x20reputation\x20marker\x20to\x20pass.'}]:[],...r['relies_logic_and']!=null?[{'label':'logic','value':r['relies_logic_and']?'AND':'OR','tip':'AND\x20=\x20all\x20relied-guards\x20must\x20pass;\x20OR\x20=\x20any\x20relied-guard\x20passing\x20is\x20enough.'}]:[],...r['relies']['length']>0x0?[{'label':'relies','value':String(r['relies']['length']),'tip':'Upstream\x20guards\x20this\x20guard\x20composes\x20with\x20(evidence\x20verification\x20chaining)\x20—\x20open\x20the\x20Guard\x20detail\x20for\x20the\x20full\x20tree.'}]:[]]:[]],'note':r?.['description']??undefined});});}const k={'kind':'items','title':'Allocation\x20Guards\x20('+j['length']+')','empty':'No\x20allocation\x20guards\x20—\x20settlement\x20splits\x20use\x20the\x20default\x20allocator\x20strategy.\x20(A\x20configured\x20purchase\x20guard\x20is\x20listed\x20in\x20the\x20Fields\x20card.)','items':j},l=a['related']['groups']['reduce']((p,q)=>p+q['items']['length'],0x0),m={'kind':'related','title':'Related\x20objects'+(l>0x0?'\x20('+l+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Service\x20yet\x20—\x20orders,\x20progress,\x20allocations,\x20payments\x20and\x20guards\x20targeting\x20this\x20Service\x20will\x20appear\x20here.','groups':a['related']['groups']['map'](p=>({'label':p['type_label'],'items':p['items']['map'](q=>({'address':q['address'],'time':q['time']}))})),'count':l},n=[e,f,g,...i?[i]:[],k,m];return{'action':'review_pack','object_type':'Service','head':{'address':b['address'],'network':a['network'],'name':b['name'],'description':b['description']||null,'tags':b['tags'],'last_active_ms':b['onchain_last_updated']?Number(b['onchain_last_updated']['timestamp_ms'])||null:null,'badges':c,'info_rows':[]},'sections':n,'data_gaps':a['data_gaps']};}
|
package/dist/review/types.d.ts
CHANGED
|
@@ -82,6 +82,13 @@ export interface ReviewGraph {
|
|
|
82
82
|
machineName: string | null;
|
|
83
83
|
published: boolean | null;
|
|
84
84
|
paused: boolean | null;
|
|
85
|
+
permission?: {
|
|
86
|
+
address: string;
|
|
87
|
+
remarks?: {
|
|
88
|
+
index: number;
|
|
89
|
+
remark: string;
|
|
90
|
+
}[];
|
|
91
|
+
} | null;
|
|
85
92
|
nodes: {
|
|
86
93
|
name: string;
|
|
87
94
|
description: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CONFIRMATION_RULES,resolveOverrideId}from'../knowledge/safety-rules.js';import{isEnabled as
|
|
1
|
+
import{CONFIRMATION_RULES,resolveOverrideId}from'../knowledge/safety-rules.js';import{isEnabled as a344a}from'../config/index.js';import{isPlanPreapproved}from'../goal/plan-approval.js';export function isConfirmGateEnabled(){return a344a('confirm_gate');}const internalErrorCounts={};function logInternalError(a,b){const c=a;internalErrorCounts[c]=(internalErrorCounts[c]??0x0)+0x1;const d=internalErrorCounts[c];console['warn']('[ConfirmGate]\x20internal_error\x20context=\x22'+a+'\x22\x20count='+d+'\x20error='+(b instanceof Error?b['message']:String(b)));}export function getFailMode(a){switch(a){case'irreversible':case'publish':case'amount':return'closed';case'standard':case'none':default:return'open';}}function buildInternalErrorResult(a,b,c){const d=b instanceof Error?b['message']:b!==undefined?String(b):undefined;return{'pass':![],'level':'irreversible','preview':{'level':'irreversible','operation':a,'irreversible':!![],'warnings':[...c?['ConfirmGate\x20rule\x20\x27'+c+'\x27\x20matched\x20but\x20its\x20preview\x20could\x20not\x20be\x20generated.']:['An\x20error\x20occurred\x20while\x20matching\x20confirmation\x20rules.'],...d!==undefined?['Reason:\x20'+d]:[],'The\x20operation\x20was\x20NOT\x20executed.\x20Review\x20the\x20parameters\x20for\x20malformed\x20values\x20(e.g.\x20decimal\x20amounts\x20instead\x20of\x20smallest-unit\x20integers)\x20before\x20confirming.']},'rule_id':'internal_error'};}export function confirmGate(a,b,c,d,f,g){if(!isConfirmGateEnabled())return{'pass':!![]};if(c?.['confirmed']===!![])return{'pass':!![]};let h,i=null;try{h=CONFIRMATION_RULES['find'](n=>{try{return n['when'](a,b,c);}catch(o){logInternalError('rule_when:'+n['id'],o);if(getFailMode(n['level'])==='closed')throw o;return![];}});}catch(n){i=n;}if(i)return logInternalError('rule_search',i),buildInternalErrorResult(a,i);if(!h)return{'pass':!![]};if(getFailMode(h['level'])==='open'&&isPlanPreapproved(c))return{'pass':!![]};const j=resolveOverrideId(h['id'],a),k=j?f?.[j]:undefined;if(k==='auto')return{'pass':!![]};const l=c?.['confirm_mode']==='quiet'||c?.['confirm_mode']==='streamlined'?c['confirm_mode']:'full';if(l!=='full'&&k!=='block'&&getFailMode(h['level'])==='open')return{'pass':!![]};if(k!=='block'&&g?.['intent_bypass']!==![]&&h['bypass_on_explicit_intent']&&d&&d['length']>0x0){const o=d['map'](q=>q['toLowerCase']()),p=h['bypass_on_explicit_intent']['some'](q=>o['some'](r=>r['includes'](q['toLowerCase']())));if(p)return{'pass':!![]};}let m;try{m=h['preview'](a,b,c);}catch(q){logInternalError('rule_preview:'+h['id'],q);if(getFailMode(h['level'])==='closed')return buildInternalErrorResult(a,q,h['id']);return{'pass':!![]};}return{'pass':![],'level':h['level'],'preview':m,'rule_id':h['id']};}export function isExplicitlyConfirmed(a){return a?.['confirmed']===!![];}
|