@wowok/agent-mcp 2.7.2 → 2.7.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/runtime.js +1 -1
- package/dist/customer/account-events.d.ts +32 -0
- package/dist/customer/account-events.js +1 -0
- package/dist/customer/customer-advice.d.ts +1 -0
- package/dist/customer/customer-advice.js +1 -1
- package/dist/customer/info-puzzle.js +1 -1
- package/dist/customer/order-strategy.d.ts +1 -1
- package/dist/customer/reminder-system.d.ts +2 -0
- package/dist/customer/reminder-system.js +1 -1
- package/dist/customer/risk-assessment.d.ts +1 -0
- package/dist/customer/risk-assessment.js +1 -1
- package/dist/customer/types.d.ts +2 -0
- package/dist/evaluation/builtins/arbitration-score.d.ts +41 -0
- package/dist/evaluation/builtins/arbitration-score.js +1 -0
- package/dist/evaluation/builtins/index.d.ts +1 -0
- package/dist/evaluation/builtins/index.js +1 -1
- package/dist/evaluation/category-match-rules.d.ts +30 -0
- package/dist/evaluation/category-match-rules.js +1 -0
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/extract.js +1 -1
- package/dist/evaluation/index.d.ts +1 -0
- package/dist/evaluation/index.js +1 -1
- package/dist/evaluation/location-match.d.ts +42 -0
- package/dist/evaluation/location-match.js +1 -0
- package/dist/evaluation/path-reasoning.d.ts +35 -0
- package/dist/evaluation/path-reasoning.js +1 -0
- package/dist/evaluation/region.d.ts +6 -0
- package/dist/evaluation/region.js +1 -1
- package/dist/evaluation/types.d.ts +17 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/experience/user-profile.d.ts +1 -1
- package/dist/extensions/index.d.ts +6 -0
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-layers.d.ts +75 -0
- package/dist/extensions/industry-layers.js +1 -0
- package/dist/extensions/industry-pack.d.ts +105 -0
- package/dist/extensions/industry-pack.js +1 -0
- package/dist/extensions/metric-registry.js +1 -1
- package/dist/extensions/mode-evaluator.d.ts +1 -1
- package/dist/extensions/registry.d.ts +1 -0
- package/dist/extensions/registry.js +1 -1
- package/dist/graph/base.d.ts +8 -0
- package/dist/graph/base.js +1 -0
- package/dist/harness/index.d.ts +1 -0
- package/dist/harness/index.js +1 -1
- package/dist/harness/plan.d.ts +2 -0
- package/dist/harness/plan.js +1 -1
- package/dist/harness/recover.d.ts +1 -1
- package/dist/harness/types.d.ts +2 -3
- package/dist/index.js +1 -1
- package/dist/knowledge/allocation-confirm.js +1 -1
- package/dist/knowledge/anti-cheat.d.ts +37 -0
- package/dist/knowledge/anti-cheat.js +1 -0
- package/dist/knowledge/arb-confirm.d.ts +28 -0
- package/dist/knowledge/arb-confirm.js +1 -0
- package/dist/knowledge/arb-translation.d.ts +48 -0
- package/dist/knowledge/arb-translation.js +1 -0
- package/dist/knowledge/arbitration-context.js +1 -1
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/bridge-confirm.d.ts +26 -0
- package/dist/knowledge/bridge-confirm.js +1 -0
- package/dist/knowledge/bridge-translation.d.ts +37 -0
- package/dist/knowledge/bridge-translation.js +1 -0
- package/dist/knowledge/contact-confirm.d.ts +27 -0
- package/dist/knowledge/contact-confirm.js +1 -0
- package/dist/knowledge/contact-translation.d.ts +39 -0
- package/dist/knowledge/contact-translation.js +1 -0
- package/dist/knowledge/demand-confirm.js +1 -1
- package/dist/knowledge/demand-context.d.ts +17 -0
- package/dist/knowledge/demand-context.js +1 -0
- package/dist/knowledge/demand-ledger.d.ts +26 -0
- package/dist/knowledge/demand-ledger.js +1 -0
- package/dist/knowledge/demand-puzzle.d.ts +29 -0
- package/dist/knowledge/demand-puzzle.js +1 -0
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/demand-templates.d.ts +12 -0
- package/dist/knowledge/demand-templates.js +1 -0
- package/dist/knowledge/demand-translation.js +1 -1
- package/dist/knowledge/deployment-scanner.js +1 -1
- package/dist/knowledge/evidence-review.d.ts +12 -0
- package/dist/knowledge/evidence-review.js +1 -0
- package/dist/knowledge/examples-scanner-cli.js +1 -1
- package/dist/knowledge/examples-scanner.js +1 -1
- package/dist/knowledge/flywheel-loop.d.ts +0 -1
- package/dist/knowledge/flywheel-loop.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-migration.d.ts +1 -1
- package/dist/knowledge/index.d.ts +71 -3
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/machine-render.js +1 -1
- package/dist/knowledge/market-metrics.d.ts +12 -0
- package/dist/knowledge/market-metrics.js +1 -0
- package/dist/knowledge/market-operations.d.ts +46 -0
- package/dist/knowledge/market-operations.js +1 -0
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
- package/dist/knowledge/mcp-schema-audit.d.ts +22 -22
- package/dist/knowledge/mcp-schema-audit.js +1 -1
- package/dist/knowledge/onchain-constants.d.ts +2 -2
- package/dist/knowledge/onchain-constants.js +1 -1
- package/dist/knowledge/payment-confirm.d.ts +26 -0
- package/dist/knowledge/payment-confirm.js +1 -0
- package/dist/knowledge/payment-risk.js +1 -1
- package/dist/knowledge/payment-translation.d.ts +37 -0
- package/dist/knowledge/payment-translation.js +1 -0
- package/dist/knowledge/permission-context.d.ts +11 -0
- package/dist/knowledge/permission-context.js +1 -1
- package/dist/knowledge/permission-ledger.d.ts +11 -0
- package/dist/knowledge/permission-ledger.js +1 -1
- package/dist/knowledge/personal-confirm.d.ts +29 -0
- package/dist/knowledge/personal-confirm.js +1 -0
- package/dist/knowledge/personal-risk.js +1 -1
- package/dist/knowledge/personal-translation.d.ts +37 -0
- package/dist/knowledge/personal-translation.js +1 -0
- package/dist/knowledge/process-model.d.ts +1 -11
- package/dist/knowledge/process-model.js +1 -1
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/progress-translation.js +1 -1
- package/dist/knowledge/proof-context.d.ts +17 -0
- package/dist/knowledge/proof-context.js +1 -0
- package/dist/knowledge/proof-ledger.d.ts +34 -0
- package/dist/knowledge/proof-ledger.js +1 -0
- package/dist/knowledge/proof-puzzle.d.ts +35 -0
- package/dist/knowledge/proof-puzzle.js +1 -0
- package/dist/knowledge/proof-templates.d.ts +22 -0
- package/dist/knowledge/proof-templates.js +1 -0
- package/dist/knowledge/registrar-confirm.d.ts +26 -0
- package/dist/knowledge/registrar-confirm.js +1 -0
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/registrar-translation.d.ts +37 -0
- package/dist/knowledge/registrar-translation.js +1 -0
- package/dist/knowledge/repository-context.d.ts +12 -0
- package/dist/knowledge/repository-context.js +1 -0
- package/dist/knowledge/repository-ledger.d.ts +25 -0
- package/dist/knowledge/repository-ledger.js +1 -0
- package/dist/knowledge/repository-puzzle.d.ts +30 -0
- package/dist/knowledge/repository-puzzle.js +1 -0
- package/dist/knowledge/repository-templates.d.ts +14 -0
- package/dist/knowledge/repository-templates.js +1 -0
- package/dist/knowledge/resource-confirm.d.ts +25 -0
- package/dist/knowledge/resource-confirm.js +1 -0
- package/dist/knowledge/resource-translation.d.ts +37 -0
- package/dist/knowledge/resource-translation.js +1 -0
- package/dist/knowledge/reward-context.d.ts +2 -2
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-translation.js +1 -1
- package/dist/knowledge/safety-rules.d.ts +1 -0
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/service-risk.d.ts +1 -1
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-context.d.ts +1 -1
- package/dist/knowledge/treasury-context.js +1 -1
- package/dist/knowledge/treasury-ledger.js +1 -1
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/universal-template.d.ts +22 -0
- package/dist/knowledge/universal-template.js +1 -0
- package/dist/knowledge/util-confirm.d.ts +24 -0
- package/dist/knowledge/util-confirm.js +1 -0
- package/dist/knowledge/util-risk.js +1 -1
- package/dist/knowledge/util-translation.d.ts +39 -0
- package/dist/knowledge/util-translation.js +1 -0
- package/dist/knowledge/workflow-guidance.d.ts +180 -0
- package/dist/knowledge/workflow-guidance.js +1 -0
- package/dist/participation/employee-kpi.d.ts +25 -0
- package/dist/participation/employee-kpi.js +1 -0
- package/dist/participation/employee-store.d.ts +16 -0
- package/dist/participation/employee-store.js +1 -0
- package/dist/participation/index.d.ts +2 -0
- package/dist/participation/index.js +1 -0
- package/dist/persona/defaults.js +1 -1
- package/dist/persona/index.d.ts +9 -2
- package/dist/persona/index.js +1 -1
- package/dist/persona/local-region.d.ts +20 -0
- package/dist/persona/local-region.js +1 -0
- package/dist/persona/model.js +1 -1
- package/dist/persona/overrides.d.ts +10 -0
- package/dist/persona/overrides.js +1 -0
- package/dist/persona/pack-personae.d.ts +11 -0
- package/dist/persona/pack-personae.js +1 -0
- package/dist/persona/strategy-intent.d.ts +20 -0
- package/dist/persona/strategy-intent.js +1 -0
- package/dist/persona/types.d.ts +3 -1
- package/dist/project/business-puzzle.d.ts +1 -1
- package/dist/project/business-puzzle.js +1 -1
- package/dist/project/deployment-doc.js +1 -1
- package/dist/project/edit-planner.js +1 -1
- package/dist/project/evaluation.d.ts +37 -1
- package/dist/project/evaluation.js +1 -1
- package/dist/project/graph-builder.d.ts +2 -2
- package/dist/project/graph-builder.js +1 -1
- package/dist/project/graph.d.ts +3 -6
- package/dist/project/handlers.d.ts +33 -2
- package/dist/project/handlers.js +1 -1
- package/dist/project/index.d.ts +1 -0
- package/dist/project/index.js +1 -1
- package/dist/project/merchant-guide.d.ts +19 -0
- package/dist/project/merchant-guide.js +1 -1
- package/dist/project/mode-actions.js +1 -1
- package/dist/project/rollback-policy.js +1 -1
- package/dist/project/semantic-assembler.d.ts +2 -2
- package/dist/project/semantic-assembler.js +1 -1
- package/dist/project/semantic-graph.d.ts +3 -5
- package/dist/project/workflow-design-assessment.d.ts +24 -0
- package/dist/project/workflow-design-assessment.js +1 -0
- package/dist/safety/confirm-gate.d.ts +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/call/allocation.d.ts +186 -1385
- package/dist/schema/call/arbitration.d.ts +272 -1871
- package/dist/schema/call/base.d.ts +1831 -9076
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +911 -3171
- package/dist/schema/call/contact.d.ts +135 -931
- package/dist/schema/call/demand.d.ts +164 -1194
- package/dist/schema/call/guard.d.ts +298 -1140
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/machine.d.ts +459 -5403
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/order.d.ts +137 -844
- package/dist/schema/call/payment.d.ts +74 -561
- package/dist/schema/call/permission.d.ts +335 -2791
- package/dist/schema/call/personal.d.ts +227 -1814
- package/dist/schema/call/progress.d.ts +140 -843
- package/dist/schema/call/proof.d.ts +42 -258
- package/dist/schema/call/repository.d.ts +324 -2222
- package/dist/schema/call/reward.d.ts +153 -1183
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +376 -3431
- package/dist/schema/call/treasury.d.ts +252 -2158
- package/dist/schema/common/index.d.ts +222 -697
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/config/index.d.ts +18 -161
- package/dist/schema/employee/index.d.ts +99 -0
- package/dist/schema/employee/index.js +1 -0
- package/dist/schema/evaluation/index.d.ts +1035 -3918
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +132 -0
- package/dist/schema/industry-pack/index.js +1 -0
- package/dist/schema/intent-radar/index.d.ts +92 -245
- package/dist/schema/intent-radar/index.js +1 -1
- package/dist/schema/local/index.d.ts +2045 -18080
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/local/wip.d.ts +61 -651
- package/dist/schema/local/wip.js +1 -1
- package/dist/schema/messenger/index.d.ts +949 -5557
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +3168 -26468
- package/dist/schema/operations.js +1 -1
- package/dist/schema/permission/index.d.ts +121 -0
- package/dist/schema/permission/index.js +1 -0
- package/dist/schema/persona/index.d.ts +469 -1820
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/project/index.d.ts +1023 -8450
- package/dist/schema/project/index.js +1 -1
- package/dist/schema/query/index.d.ts +12121 -75556
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-query/index.d.ts +35 -98
- package/dist/schema/schema-query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/task-status.d.ts +26 -132
- package/dist/schema/trust/index.d.ts +194 -1290
- package/dist/schema/utils/guard-parser.js +1 -1
- package/dist/schema/utils/node-parser.js +1 -1
- package/dist/schema/utils/skills-recommendation.d.ts +1 -0
- package/dist/schema/utils/skills-recommendation.js +1 -1
- package/dist/schema/workflow/index.d.ts +161 -0
- package/dist/schema/workflow/index.js +1 -0
- package/dist/schema/workspace/index.d.ts +69 -0
- package/dist/schema/workspace/index.js +1 -0
- package/dist/{schema-query → schema-query-impl}/index.js +1 -1
- package/dist/schemas/account_operation.output.json +3147 -1655
- package/dist/schemas/account_operation.schema.json +225 -218
- package/dist/schemas/bridge_operation.output.json +1168 -653
- package/dist/schemas/bridge_operation.schema.json +736 -504
- package/dist/schemas/config_operation.output.json +185 -179
- package/dist/schemas/config_operation.schema.json +21 -26
- package/dist/schemas/employee_operation.output.json +207 -0
- package/dist/schemas/employee_operation.schema.json +176 -0
- package/dist/schemas/evaluation_operation.output.json +2268 -601
- package/dist/schemas/evaluation_operation.schema.json +2919 -787
- package/dist/schemas/guard2file.output.json +58 -64
- package/dist/schemas/guard2file.schema.json +79 -81
- package/dist/schemas/index.json +41 -11
- package/dist/schemas/industry_pack_operation.output.json +594 -0
- package/dist/schemas/industry_pack_operation.schema.json +55 -0
- package/dist/schemas/intent_radar.output.json +275 -203
- package/dist/schemas/intent_radar.schema.json +124 -126
- package/dist/schemas/local_info_operation.output.json +1174 -660
- package/dist/schemas/local_info_operation.schema.json +119 -125
- package/dist/schemas/local_mark_operation.output.json +1239 -692
- package/dist/schemas/local_mark_operation.schema.json +91 -96
- package/dist/schemas/machineNode2file.output.json +63 -69
- package/dist/schemas/machineNode2file.schema.json +79 -81
- package/dist/schemas/messenger_operation.output.json +2722 -1531
- package/dist/schemas/messenger_operation.schema.json +1482 -1264
- package/dist/schemas/onchain_events.output.json +2590 -978
- package/dist/schemas/onchain_events.schema.json +117 -99
- package/dist/schemas/onchain_operations.output.json +3957 -2312
- package/dist/schemas/onchain_operations.schema.json +20799 -9285
- package/dist/schemas/onchain_operations_allocation.schema.json +171 -107
- package/dist/schemas/onchain_operations_arbitration.schema.json +233 -146
- package/dist/schemas/onchain_operations_contact.schema.json +129 -90
- package/dist/schemas/onchain_operations_demand.schema.json +170 -112
- package/dist/schemas/onchain_operations_gen_passport.schema.json +61 -646
- package/dist/schemas/onchain_operations_gen_proof.schema.json +40 -172
- package/dist/schemas/onchain_operations_guard.schema.json +3765 -294
- package/dist/schemas/onchain_operations_machine.schema.json +536 -163
- package/dist/schemas/onchain_operations_order.schema.json +126 -96
- package/dist/schemas/onchain_operations_payment.schema.json +82 -67
- package/dist/schemas/onchain_operations_permission.schema.json +331 -93
- package/dist/schemas/onchain_operations_personal.schema.json +636 -96
- package/dist/schemas/onchain_operations_progress.schema.json +125 -92
- package/dist/schemas/onchain_operations_proof.schema.json +76 -69
- package/dist/schemas/onchain_operations_repository.schema.json +636 -249
- package/dist/schemas/onchain_operations_reward.schema.json +218 -108
- package/dist/schemas/onchain_operations_service.schema.json +678 -220
- package/dist/schemas/onchain_operations_treasury.schema.json +401 -135
- package/dist/schemas/onchain_table_data.output.json +6833 -2432
- package/dist/schemas/onchain_table_data.schema.json +684 -417
- package/dist/schemas/permission_operation.output.json +173 -0
- package/dist/schemas/permission_operation.schema.json +39 -0
- package/dist/schemas/persona_operation.output.json +1568 -268
- package/dist/schemas/persona_operation.schema.json +346 -205
- package/dist/schemas/project_operation.output.json +6922 -5132
- package/dist/schemas/project_operation.schema.json +1050 -1020
- package/dist/schemas/query_task_status.output.json +195 -99
- package/dist/schemas/query_task_status.schema.json +12 -18
- package/dist/schemas/query_toolkit.output.json +18862 -14561
- package/dist/schemas/query_toolkit.schema.json +614 -522
- package/dist/schemas/schema_query.output.json +127 -129
- package/dist/schemas/schema_query.schema.json +64 -69
- package/dist/schemas/trust_score.output.json +678 -587
- package/dist/schemas/trust_score.schema.json +289 -277
- package/dist/schemas/wip_file.output.json +116 -124
- package/dist/schemas/wip_file.schema.json +142 -143
- package/dist/schemas/workflow_operation.output.json +164 -0
- package/dist/schemas/workflow_operation.schema.json +116 -0
- package/dist/schemas/workspace_operation.output.json +277 -0
- package/dist/schemas/workspace_operation.schema.json +45 -0
- package/dist/schemas/wowok_buildin_info.output.json +1682 -844
- package/dist/schemas/wowok_buildin_info.schema.json +576 -526
- package/dist/tools/handlers/bridge.d.ts +8 -1
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/employee.d.ts +2 -0
- package/dist/tools/handlers/employee.js +1 -0
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/file-export.js +1 -1
- package/dist/tools/handlers/industry-pack.d.ts +2 -0
- package/dist/tools/handlers/industry-pack.js +1 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.d.ts +2 -0
- package/dist/tools/handlers/permission.js +1 -0
- package/dist/tools/handlers/persona.js +1 -1
- package/dist/tools/handlers/project.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/trust.js +1 -1
- package/dist/tools/handlers/wip.js +1 -1
- package/dist/tools/handlers/workflow.d.ts +2 -0
- package/dist/tools/handlers/workflow.js +1 -0
- package/dist/tools/handlers/workspace.d.ts +4 -0
- package/dist/tools/handlers/workspace.js +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/rules-hook.d.ts +1 -1
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/shared.d.ts +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/types.d.ts +2 -1
- package/package.json +4 -5
- package/dist/knowledge/arbitration-trust.d.ts +0 -24
- package/dist/knowledge/arbitration-trust.js +0 -1
- package/dist/schema/call/bridge-handler.d.ts +0 -8
- package/dist/schema/call/bridge-handler.js +0 -1
- package/dist/schema/sync-layer4.d.ts +0 -21
- package/dist/schema/sync-layer4.js +0 -1
- /package/dist/{schema-query → schema-query-impl}/index.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';const R_PR_1_01={'id':'R-PR-1-01','category':'structural','trigger':'named_operator\x20addresses\x20count\x20>\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','check':a=>{if(!a['progress_namedOperator'])return null;const b=a['progress_namedOperator']['operators']['length'];if(b>MAX_NAMED_OPERATOR_ADDRESS_COUNT)return{'id':'R-PR-1-01','level':'HIGH','category':'structural','title':'named_operator\x20address\x20count\x20exceeds\x20limit','description':'named_operator\x20\x22'+a['progress_namedOperator']['name']+'\x22\x20has\x20'+b+'\x20addresses,\x20'+('exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT+'.\x20')+'Move\x20aborts\x20with\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT.','affected_stakeholders':['owner','named_operator'],'scenario':'Adding\x20>\x2080\x20addresses\x20to\x20a\x20single\x20named\x20operator','mitigation':'Split\x20into\x20multiple\x20named_operator\x20names,\x20or\x20remove\x20inactive\x20addresses\x20first','evidence':'addr_count='+b};return null;}},R_PR_1_02={'id':'R-PR-1-02','category':'structural','trigger':'Adding\x20new\x20named_operator\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20(60)','check':a=>{if(!a['progress_namedOperator']||a['progress_namedOperator']['op']!=='add')return null;const b=a['current_named_operator_count']??0x0;if(b>=MAX_NAMED_OPERATOR_COUNT)return{'id':'R-PR-1-02','level':'HIGH','category':'structural','title':'named_operator\x20namespace\x20count\x20at\x20limit','description':'Progress\x20already\x20has\x20'+b+'\x20named\x20operators,\x20'+('at\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT+'.\x20Adding\x20a\x20new\x20name\x20will\x20abort\x20with\x20E_MAX_NAMED_OPERATOR_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20a\x2061st\x20named_operator\x20name\x20to\x20a\x20full\x20Progress','mitigation':'Use\x20\x27set\x27\x20on\x20an\x20existing\x20name\x20(replace\x20address\x20list),\x20or\x20remove\x20an\x20unused\x20name\x20first','evidence':'named_operator_count='+b};return null;}},R_PR_1_03={'id':'R-PR-1-03','category':'structural','trigger':'context_repository\x20add\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30)','check':a=>{if(!a['repository'])return null;if(a['repository']['op']==='clear')return null;const b=a['repository']['op']==='remove'?0x0:a['repository']['objects']['length'];if(b===0x0)return null;const c=a['current_context_repository_count']??0x0;if(c+b>MAX_CONTEXT_REPOSITORY_COUNT)return{'id':'R-PR-1-03','level':'HIGH','category':'structural','title':'context_repository\x20count\x20exceeds\x20limit','description':'Progress\x20has\x20'+c+'\x20repositories,\x20adding\x20'+b+'\x20would\x20total\x20'+(c+b)+',\x20'+('exceeds\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT+'.\x20Move\x20aborts\x20with\x20E_MAX_CONTEXT_REPOSITORY_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20too\x20many\x20context\x20repositories','mitigation':'Remove\x20unused\x20repositories\x20first,\x20or\x20use\x20repository\x20\x27set\x27\x20to\x20replace\x20the\x20list','evidence':'current='+c+',\x20add='+b};return null;}},R_PR_1_04={'id':'R-PR-1-04','category':'structural','trigger':'named_operator\x20name\x20is\x20empty\x20string\x20but\x20is_order_holder_namespace=false','check':a=>{if(!a['progress_namedOperator'])return null;if(a['progress_namedOperator']['name']===''&&a['progress_namedOperator']['op']!=='remove')return{'id':'R-PR-1-04','level':'MEDIUM','category':'structural','title':'named_operator\x20name\x20is\x20empty\x20(OrderHolder\x20namespace)','description':'progress_namedOperator.name=\x22\x22\x20—\x20empty\x20string\x20maps\x20to\x20the\x20OrderHolder\x20namespace\x20'+'(machine::init_node_name()).\x20This\x20is\x20typically\x20set\x20by\x20service::buy,\x20not\x20by\x20direct\x20user\x20op.\x20'+'Manual\x20manipulation\x20may\x20overwrite\x20order-payer\x20authorization.','affected_stakeholders':['owner','named_operator'],'scenario':'User\x20manually\x20setting\x20the\x20empty-name\x20namespace','mitigation':'If\x20intentional\x20(e.g.\x20order_owner_set\x20internal\x20call),\x20confirm.\x20Otherwise\x20use\x20a\x20non-empty\x20name.','evidence':'name=\x22\x22'};return null;}},R_PR_2_01={'id':'R-PR-2-01','category':'semantic','trigger':'task_set\x20on\x20Progress\x20that\x20already\x20has\x20a\x20task\x20(E_TASK_ALREADY_SET)','check':a=>{if(!a['task'])return null;if(a['current_task']!==null&&a['current_task']!==undefined)return{'id':'R-PR-2-01','level':'HIGH','category':'semantic','title':'task_set\x20on\x20already-bound\x20Progress\x20(irreversible)','description':'Progress\x20already\x20has\x20task='+a['current_task']+'.\x20task_set\x20is\x20one-time;\x20'+'Move\x20aborts\x20with\x20E_TASK_ALREADY_SET.\x20There\x20is\x20no\x20way\x20to\x20change\x20the\x20task\x20after\x20first\x20set.','affected_stakeholders':['owner','submitter'],'scenario':'User\x20tries\x20to\x20rebind\x20Progress\x20to\x20a\x20different\x20Order','mitigation':'Create\x20a\x20new\x20Progress\x20via\x20service::buy\x20with\x20the\x20new\x20Order;\x20the\x20old\x20Progress\x20is\x20permanently\x20bound','evidence':'current_task='+a['current_task']};return null;}},R_PR_2_02={'id':'R-PR-2-02','category':'semantic','trigger':'operate.message\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(long-name\x20constraint)','check':a=>{if(!a['operate']?.['message'])return null;const b=a['operate']['message'];if(b['length']>0x400)return{'id':'R-PR-2-02','level':'MEDIUM','category':'semantic','title':'operate.message\x20exceeds\x20long-name\x20length','description':'operate.message\x20length\x20'+b['length']+'\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(1024).\x20'+'Move\x20aborts\x20in\x20common::LONG_NAME\x20check.','affected_stakeholders':['submitter'],'scenario':'Long\x20deliverable\x20message','mitigation':'Truncate\x20message\x20to\x20≤\x201024\x20chars;\x20store\x20full\x20payload\x20in\x20a\x20context\x20Repository','evidence':'msg_len='+b['length']};return null;}},R_PR_2_03={'id':'R-PR-2-03','category':'semantic','trigger':'operate.op\x20is\x20not\x20a\x20valid\x20enum\x20value\x20(schema-enforced,\x20defense-in-depth)','check':a=>{if(!a['operate'])return null;const b=['next','hold','unhold','adminUnhold'];if(a['operate']['op']&&!b['includes'](a['operate']['op']))return{'id':'R-PR-2-03','level':'HIGH','category':'semantic','title':'operate.op\x20must\x20be\x20one\x20of:\x20'+b['join'](',\x20'),'description':'op\x20enum\x20selects\x20the\x20Move\x20function:\x20next=accomplish,\x20hold=hold(bHold=true),\x20'+'unhold=hold(bHold=false),\x20adminUnhold=unhold\x20(224\x20permission).','affected_stakeholders':['submitter'],'scenario':'Schema\x20validation\x20bypassed\x20or\x20stale\x20client','mitigation':'Use\x20one\x20of:\x20'+b['join'](',\x20'),'evidence':'op='+a['operate']['op']};return null;}},R_PR_3_01={'id':'R-PR-3-01','category':'permission','trigger':'op=\x27adminUnhold\x27\x20(224\x20permission)\x20—\x20force\x20release\x20bypassing\x20holder\x20check','check':a=>{if(a['operate']?.['op']!=='adminUnhold')return null;return{'id':'R-PR-3-01','level':'HIGH','category':'permission','title':'adminUnhold\x20bypasses\x20holder\x20check\x20(broad\x20blast\x20radius)','description':'adminUnhold\x20uses\x20224\x20permission\x20to\x20release\x20a\x20held\x20forward\x20WITHOUT\x20verifying\x20sender\x20==\x20holder.\x20'+'If\x20224\x20is\x20granted\x20too\x20broadly,\x20any\x20224-holder\x20can\x20release\x20ANY\x20held\x20forward\x20in\x20this\x20Progress.','affected_stakeholders':['owner','named_operator','submitter'],'scenario':'Admin\x20force-releases\x20a\x20forward\x20that\x20the\x20original\x20holder\x20still\x20wanted\x20held','mitigation':'1)\x20Grant\x20224\x20only\x20to\x20dedicated\x20recovery\x20addresses.\x202)\x20Log\x20every\x20adminUnhold\x20for\x20audit.\x20'+'3)\x20Prefer\x20normal\x20unhold\x20(holder\x20self-release)\x20when\x20possible.','evidence':'adminUnhold=true,\x20forward='+a['operate']['operation']['forward']};}},R_PR_3_02={'id':'R-PR-3-02','category':'permission','trigger':'namedOperator\x20short-circuit\x20bypasses\x20220-225\x20permission\x20check','check':a=>{if(!a['operate'])return null;if(a['forward_named_operator']&&a['forward_named_operator']!=='')return{'id':'R-PR-3-02','level':'MEDIUM','category':'permission','title':'Forward\x20advance\x20via\x20named_operator\x20short-circuits\x20220-225\x20check','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20uses\x20namedOperator=\x22'+a['forward_named_operator']+'\x22.\x20'+'Move\x27s\x20ASSERT_PERMISSION\x20returns\x20immediately\x20if\x20IsNamedOperator()\x20succeeds,\x20WITHOUT\x20checking\x20'+'any\x20permission\x20index.\x20Anyone\x20in\x20the\x20named_operator\x20list\x20can\x20advance\x20this\x20forward.','affected_stakeholders':['owner','named_operator'],'scenario':'Operator\x20list\x20too\x20permissive\x20(e.g.\x20includes\x20expired/compromised\x20addresses)','mitigation':'1)\x20Keep\x20named_operator\x20lists\x20minimal.\x202)\x20Use\x20namedOperator_remove\x20to\x20revoke\x20access\x20promptly.\x20'+'3)\x20For\x20sensitive\x20forwards,\x20prefer\x20Forward.permissionIndex\x20(Some)\x20for\x20dual-check.','evidence':'named_operator='+a['forward_named_operator']};return null;}},R_PR_3_03={'id':'R-PR-3-03','category':'permission','trigger':'Forward\x20has\x20guard\x20(Some)\x20—\x20Passport\x20required\x20but\x20not\x20provided','check':a=>{if(!a['operate'])return null;if(a['forward_has_guard']&&!a['forward_permission_index'])return{'id':'R-PR-3-03','level':'HIGH','category':'permission','title':'Forward\x20guard\x20requires\x20Passport','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20has\x20a\x20guard\x20(Some).\x20'+'Move\x27s\x20next_imp\x20asserts\x20E_NEED_PASSPORT\x20for\x20guarded\x20forwards\x20when\x20called\x20without\x20passport.\x20'+'Use\x20next_with_passport\x20/\x20order_next_with_passport\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20calls\x20next()\x20on\x20a\x20guarded\x20forward\x20without\x20passport','mitigation':'Submit\x20via\x20*_with_passport\x20variant;\x20ensure\x20submission\x20data\x20is\x20valid\x20for\x20the\x20Guard','evidence':'forward='+a['operate']['operation']['forward']+',\x20has_guard='+a['forward_has_guard']};return null;}},R_PR_4_01={'id':'R-PR-4-01','category':'lifecycle','trigger':'Machine\x20not\x20published\x20—\x20Progress\x20cannot\x20be\x20created','check':a=>{if(a['machine_published']===![])return{'id':'R-PR-4-01','level':'CRITICAL','category':'lifecycle','title':'Machine\x20not\x20published\x20—\x20Progress\x20creation\x20blocked','description':'Machine\x20'+(a['current_machine']??'(unknown)')+'\x20is\x20not\x20published.\x20'+'Progress\x20requires\x20a\x20published\x20Machine\x20(machine::on_progress_new\x20asserts\x20published\x20state).\x20'+'All\x20Progress\x20ops\x20will\x20fail\x20with\x20E_MACHINE_NOT_MATCH\x20or\x20similar.','affected_stakeholders':['owner'],'scenario':'User\x20attempts\x20to\x20create\x20Progress\x20before\x20Machine\x20publish','mitigation':'Publish\x20the\x20Machine\x20first\x20(machine::publish,\x20205\x20permission),\x20then\x20create\x20Progress','evidence':'machine='+a['current_machine']+',\x20published=false'};return null;}},R_PR_4_02={'id':'R-PR-4-02','category':'lifecycle','trigger':'operate\x20on\x20already-accomplished\x20forward\x20(E_FORWARD_ALREADY_ACCOMPLISHED)','check':a=>{if(!a['operate'])return null;if(a['forward_already_accomplished'])return{'id':'R-PR-4-02','level':'MEDIUM','category':'lifecycle','title':'Forward\x20already\x20accomplished\x20—\x20re-hold\x20blocked','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20to\x20\x22'+a['operate']['operation']['next_node_name']+'\x22\x20'+'is\x20already\x20accomplished.\x20Move\x20aborts\x20with\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20any\x20re-hold\x20attempt.','affected_stakeholders':['submitter'],'scenario':'User\x20retries\x20an\x20already-completed\x20forward\x20(race\x20condition\x20or\x20stale\x20state)','mitigation':'Query\x20Progress.current\x20—\x20if\x20already\x20past\x20target,\x20no\x20action\x20needed;\x20if\x20parallel\x20session,\x20use\x20a\x20different\x20forward','evidence':'forward='+a['operate']['operation']['forward']+',\x20accomplished=true'};return null;}},R_PR_4_03={'id':'R-PR-4-03','category':'lifecycle','trigger':'unhold\x20by\x20non-holder\x20without\x20224\x20permission\x20(E_NOT_THE_HOLDER)','check':a=>{if(!a['operate']||a['operate']['op']!=='unhold')return null;if(a['holder_address']&&a['signer']&&a['holder_address']!==a['signer'])return{'id':'R-PR-4-03','level':'HIGH','category':'lifecycle','title':'unhold\x20by\x20non-holder\x20—\x20Move\x20will\x20abort\x20E_NOT_THE_HOLDER','description':'Forward\x20is\x20held\x20by\x20'+a['holder_address']+',\x20but\x20signer\x20is\x20'+a['signer']+'.\x20'+'Move\x20aborts\x20with\x20E_NOT_THE_HOLDER\x20unless\x20signer\x20has\x20224\x20permission\x20(adminUnhold\x20path).','affected_stakeholders':['submitter'],'scenario':'User\x20other\x20than\x20holder\x20tries\x20to\x20release\x20a\x20hold','mitigation':'1)\x20Have\x20the\x20original\x20holder\x20call\x20unhold.\x202)\x20If\x20holder\x20is\x20unresponsive,\x20use\x20adminUnhold=true\x20(requires\x20224).','evidence':'holder='+a['holder_address']+',\x20signer='+a['signer']};return null;}},R_PR_5_01={'id':'R-PR-5-01','category':'cross_object','trigger':'operate.order_next\x20called\x20but\x20progress.task\x20!=\x20order\x20address\x20(E_ORDER_NOT_MATCH)','check':a=>{if(!a['operate'])return null;if(a['current_task']&&a['signer'])return null;return null;}},R_PR_5_02={'id':'R-PR-5-02','category':'cross_object','trigger':'context_repository_add\x20without\x20Registrar\x20affiliation\x20check','check':a=>{if(!a['repository']||a['repository']['op']!=='add')return null;return{'id':'R-PR-5-02','level':'LOW','category':'cross_object','title':'context_repository_add\x20creates\x20Registrar\x20affiliation','description':'Adding\x20'+a['repository']['objects']['length']+'\x20repository(ies)\x20creates\x20Registrar\x20affiliation\x20'+'entries.\x20If\x20the\x20Repository\x20is\x20later\x20removed\x20(disaffiliation),\x20cross-object\x20queries\x20'+'that\x20depend\x20on\x20it\x20will\x20return\x20empty\x20results\x20without\x20warning.','affected_stakeholders':['owner','system'],'scenario':'Repository\x20deleted\x20while\x20Progress\x20still\x20references\x20it','mitigation':'Use\x20context_repository_remove\x20before\x20deleting\x20a\x20Repository;\x20audit\x20affiliations\x20periodically','evidence':'add_count='+a['repository']['objects']['length']};}},R_PR_5_03={'id':'R-PR-5-03','category':'cross_object','trigger':'Permission\x20used\x20by\x20Progress\x20is\x20shared\x20with\x20other\x20host\x20objects','check':a=>{if(!a['target_objects_types']||a['target_objects_types']['length']<0x2)return null;const b=new Set(a['target_objects_types']);if(b['size']>0x1)return{'id':'R-PR-5-03','level':'MEDIUM','category':'cross_object','title':'Permission\x20shared\x20across\x20heterogeneous\x20host\x20objects','description':'Single\x20Permission\x20applied\x20to\x20'+[...b]['join'](',\x20')+'.\x20'+'Progress\x20builtin\x20indexes\x20(220-225)\x20have\x20different\x20semantics\x20per\x20host\x20object;\x20'+'granting\x20221\x20(PROGRESS_NAMED_OPERATOR)\x20to\x20a\x20non-Progress\x20entity\x20is\x20meaningless.','affected_stakeholders':['owner'],'scenario':'One\x20Permission\x20for\x20both\x20Progress\x20and\x20Machine','mitigation':'Use\x20separate\x20Permission\x20objects\x20per\x20host\x20object\x20type','evidence':'types='+[...b]['join'](',')};return null;}},R_PR_5_04={'id':'R-PR-5-04','category':'cross_object','trigger':'Progress\x20without\x20bound\x20Order\x20(order=null)\x20—\x20order_next/order_hold\x20blocked','check':a=>{if(!a['operate'])return null;if(a['current_task']===null&&a['operate']['op']!==undefined)return{'id':'R-PR-5-04','level':'MEDIUM','category':'cross_object','title':'operate\x20without\x20bound\x20Order\x20—\x20order_next/order_hold\x20unavailable','description':'Progress\x20has\x20no\x20bound\x20task\x20(task=null).\x20order_next\x20and\x20order_hold\x20require\x20'+'progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH).\x20Use\x20plain\x20next()/hold()\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20tries\x20order\x20variant\x20on\x20a\x20task-less\x20Progress','mitigation':'Use\x20non-order\x20next()/hold()\x20variant,\x20OR\x20call\x20task_set\x20first\x20to\x20bind\x20an\x20Order','evidence':'task=null'};return null;}},ALL_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_1_04,R_PR_2_01,R_PR_2_02,R_PR_2_03,R_PR_3_01,R_PR_3_02,R_PR_3_03,R_PR_4_01,R_PR_4_02,R_PR_4_03,R_PR_5_01,R_PR_5_02,R_PR_5_03,R_PR_5_04];export const PROGRESS_RISK_VERSION='1.0.0';export function getAllProgressRiskRules(){return[...ALL_RULES];}export function getProgressRiskRulesCount(){return ALL_RULES['length'];}export function getProgressRiskRulesByCategory(a){return ALL_RULES['filter'](b=>b['category']===a);}export function assessProgressRisks(a){const b=[];for(const f of ALL_RULES){const g=f['check'](a);if(g)b['push'](g);}const c=b['length']===0x0?'LOW':b['some'](h=>h['level']==='CRITICAL')?'CRITICAL':b['some'](h=>h['level']==='HIGH')?'HIGH':b['some'](h=>h['level']==='MEDIUM')?'MEDIUM':'LOW',d={};for(const h of b){d[h['category']]=(d[h['category']]??0x0)+0x1;}const e={};for(const i of b){for(const j of i['affected_stakeholders']){if(!e[j])e[j]=[];e[j]['push'](i['id']+':\x20'+i['mitigation']);}}return{'summary':'Assessed\x20'+b['length']+'\x20risk(s)\x20across\x20'+Object['keys'](d)['length']+'\x20categories','risks':b,'overall_risk':c,'risks_by_category':d,'stakeholder_advice':e,'needs_human_review':b['some'](k=>k['level']==='CRITICAL'||k['level']==='HIGH')};}
|
|
1
|
+
import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';const R_PR_1_01={'id':'R-PR-1-01','category':'structural','trigger':'named_operator\x20addresses\x20count\x20>\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','check':a=>{if(!a['progress_namedOperator'])return null;const b=a['progress_namedOperator']['operators']['length'];if(b>MAX_NAMED_OPERATOR_ADDRESS_COUNT)return{'id':'R-PR-1-01','level':'HIGH','category':'structural','title':'named_operator\x20address\x20count\x20exceeds\x20limit','description':'named_operator\x20\x22'+a['progress_namedOperator']['name']+'\x22\x20has\x20'+b+'\x20addresses,\x20'+('exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT+'.\x20')+'Move\x20aborts\x20with\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT.','affected_stakeholders':['owner','named_operator'],'scenario':'Adding\x20>\x2080\x20addresses\x20to\x20a\x20single\x20named\x20operator','mitigation':'Split\x20into\x20multiple\x20named_operator\x20names,\x20or\x20remove\x20inactive\x20addresses\x20first','evidence':'addr_count='+b};return null;}},R_PR_1_02={'id':'R-PR-1-02','category':'structural','trigger':'Adding\x20new\x20named_operator\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20(60)','check':a=>{if(!a['progress_namedOperator']||a['progress_namedOperator']['op']!=='add')return null;const b=a['current_named_operator_count']??0x0;if(b>=MAX_NAMED_OPERATOR_COUNT)return{'id':'R-PR-1-02','level':'HIGH','category':'structural','title':'named_operator\x20namespace\x20count\x20at\x20limit','description':'Progress\x20already\x20has\x20'+b+'\x20named\x20operators,\x20'+('at\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT+'.\x20Adding\x20a\x20new\x20name\x20will\x20abort\x20with\x20E_MAX_NAMED_OPERATOR_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20a\x2061st\x20named_operator\x20name\x20to\x20a\x20full\x20Progress','mitigation':'Use\x20\x27set\x27\x20on\x20an\x20existing\x20name\x20(replace\x20address\x20list),\x20or\x20remove\x20an\x20unused\x20name\x20first','evidence':'named_operator_count='+b};return null;}},R_PR_1_03={'id':'R-PR-1-03','category':'structural','trigger':'context_repository\x20add\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30)','check':a=>{if(!a['repository'])return null;if(a['repository']['op']==='clear')return null;const b=a['repository']['op']==='remove'?0x0:a['repository']['objects']['length'];if(b===0x0)return null;const c=a['current_context_repository_count']??0x0;if(c+b>MAX_CONTEXT_REPOSITORY_COUNT)return{'id':'R-PR-1-03','level':'HIGH','category':'structural','title':'context_repository\x20count\x20exceeds\x20limit','description':'Progress\x20has\x20'+c+'\x20repositories,\x20adding\x20'+b+'\x20would\x20total\x20'+(c+b)+',\x20'+('exceeds\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT+'.\x20Move\x20aborts\x20with\x20E_MAX_CONTEXT_REPOSITORY_COUNT.'),'affected_stakeholders':['owner'],'scenario':'Adding\x20too\x20many\x20context\x20repositories','mitigation':'Remove\x20unused\x20repositories\x20first,\x20or\x20use\x20repository\x20\x27set\x27\x20to\x20replace\x20the\x20list','evidence':'current='+c+',\x20add='+b};return null;}},R_PR_1_04={'id':'R-PR-1-04','category':'structural','trigger':'named_operator\x20name\x20is\x20empty\x20string\x20but\x20is_order_holder_namespace=false','check':a=>{if(!a['progress_namedOperator'])return null;if(a['progress_namedOperator']['name']===''&&a['progress_namedOperator']['op']!=='remove')return{'id':'R-PR-1-04','level':'MEDIUM','category':'structural','title':'named_operator\x20name\x20is\x20empty\x20(OrderHolder\x20namespace)','description':'progress_namedOperator.name=\x22\x22\x20—\x20empty\x20string\x20maps\x20to\x20the\x20OrderHolder\x20namespace\x20'+'(machine::init_node_name()).\x20This\x20is\x20typically\x20set\x20by\x20service::buy,\x20not\x20by\x20direct\x20user\x20op.\x20'+'Manual\x20manipulation\x20may\x20overwrite\x20order-payer\x20authorization.','affected_stakeholders':['owner','named_operator'],'scenario':'User\x20manually\x20setting\x20the\x20empty-name\x20namespace','mitigation':'If\x20intentional\x20(e.g.\x20order_owner_set\x20internal\x20call),\x20confirm.\x20Otherwise\x20use\x20a\x20non-empty\x20name.','evidence':'name=\x22\x22'};return null;}},R_PR_2_01={'id':'R-PR-2-01','category':'semantic','trigger':'task_set\x20on\x20Progress\x20that\x20already\x20has\x20a\x20task\x20(E_TASK_ALREADY_SET)','check':a=>{if(!a['task'])return null;if(a['current_task']!==null&&a['current_task']!==undefined)return{'id':'R-PR-2-01','level':'HIGH','category':'semantic','title':'task_set\x20on\x20already-bound\x20Progress\x20(irreversible)','description':'Progress\x20already\x20has\x20task='+a['current_task']+'.\x20task_set\x20is\x20one-time;\x20'+'Move\x20aborts\x20with\x20E_TASK_ALREADY_SET.\x20There\x20is\x20no\x20way\x20to\x20change\x20the\x20task\x20after\x20first\x20set.','affected_stakeholders':['owner','submitter'],'scenario':'User\x20tries\x20to\x20rebind\x20Progress\x20to\x20a\x20different\x20Order','mitigation':'Create\x20a\x20new\x20Progress\x20via\x20service::buy\x20with\x20the\x20new\x20Order;\x20the\x20old\x20Progress\x20is\x20permanently\x20bound','evidence':'current_task='+a['current_task']};return null;}},R_PR_2_02={'id':'R-PR-2-02','category':'semantic','trigger':'operate.message\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(long-name\x20constraint)','check':a=>{if(!a['operate']?.['message'])return null;const b=a['operate']['message'];if(b['length']>0x400)return{'id':'R-PR-2-02','level':'MEDIUM','category':'semantic','title':'operate.message\x20exceeds\x20long-name\x20length','description':'operate.message\x20length\x20'+b['length']+'\x20exceeds\x20MAX_LONG_NAME_LENGTH\x20(1024).\x20'+'Move\x20aborts\x20in\x20common::LONG_NAME\x20check.','affected_stakeholders':['submitter'],'scenario':'Long\x20deliverable\x20message','mitigation':'Truncate\x20message\x20to\x20≤\x201024\x20chars;\x20store\x20full\x20payload\x20in\x20a\x20context\x20Repository','evidence':'msg_len='+b['length']};return null;}},R_PR_2_03={'id':'R-PR-2-03','category':'semantic','trigger':'operate.op\x20is\x20not\x20a\x20valid\x20enum\x20value\x20(schema-enforced,\x20defense-in-depth)','check':a=>{if(!a['operate'])return null;const b=['next','hold','unhold','adminUnhold'];if(a['operate']['op']&&!b['includes'](a['operate']['op']))return{'id':'R-PR-2-03','level':'HIGH','category':'semantic','title':'operate.op\x20must\x20be\x20one\x20of:\x20'+b['join'](',\x20'),'description':'op\x20enum\x20selects\x20the\x20Move\x20function:\x20next=accomplish,\x20hold=hold(bHold=true),\x20'+'unhold=hold(bHold=false),\x20adminUnhold=unhold\x20(224\x20permission).','affected_stakeholders':['submitter'],'scenario':'Schema\x20validation\x20bypassed\x20or\x20stale\x20client','mitigation':'Use\x20one\x20of:\x20'+b['join'](',\x20'),'evidence':'op='+a['operate']['op']};return null;}},R_PR_3_01={'id':'R-PR-3-01','category':'permission','trigger':'op=\x27adminUnhold\x27\x20(224\x20permission)\x20—\x20force\x20release\x20bypassing\x20holder\x20check','check':a=>{if(a['operate']?.['op']!=='adminUnhold')return null;return{'id':'R-PR-3-01','level':'HIGH','category':'permission','title':'adminUnhold\x20bypasses\x20holder\x20check\x20(broad\x20blast\x20radius)','description':'adminUnhold\x20uses\x20224\x20permission\x20to\x20release\x20a\x20held\x20forward\x20WITHOUT\x20verifying\x20sender\x20==\x20holder.\x20'+'If\x20224\x20is\x20granted\x20too\x20broadly,\x20any\x20224-holder\x20can\x20release\x20ANY\x20held\x20forward\x20in\x20this\x20Progress.','affected_stakeholders':['owner','named_operator','submitter'],'scenario':'Admin\x20force-releases\x20a\x20forward\x20that\x20the\x20original\x20holder\x20still\x20wanted\x20held','mitigation':'1)\x20Grant\x20224\x20only\x20to\x20dedicated\x20recovery\x20addresses.\x202)\x20Log\x20every\x20adminUnhold\x20for\x20audit.\x20'+'3)\x20Prefer\x20normal\x20unhold\x20(holder\x20self-release)\x20when\x20possible.','evidence':'adminUnhold=true,\x20forward='+a['operate']['operation']['forward']};}},R_PR_3_02={'id':'R-PR-3-02','category':'permission','trigger':'namedOperator\x20short-circuit\x20bypasses\x20220-225\x20permission\x20check','check':a=>{if(!a['operate'])return null;if(a['forward_named_operator']&&a['forward_named_operator']!=='')return{'id':'R-PR-3-02','level':'MEDIUM','category':'permission','title':'Forward\x20advance\x20via\x20named_operator\x20short-circuits\x20220-225\x20check','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20uses\x20namedOperator=\x22'+a['forward_named_operator']+'\x22.\x20'+'Move\x27s\x20ASSERT_PERMISSION\x20returns\x20immediately\x20if\x20IsNamedOperator()\x20succeeds,\x20WITHOUT\x20checking\x20'+'any\x20permission\x20index.\x20Anyone\x20in\x20the\x20named_operator\x20list\x20can\x20advance\x20this\x20forward.','affected_stakeholders':['owner','named_operator'],'scenario':'Operator\x20list\x20too\x20permissive\x20(e.g.\x20includes\x20expired/compromised\x20addresses)','mitigation':'1)\x20Keep\x20named_operator\x20lists\x20minimal.\x202)\x20Use\x20namedOperator_remove\x20to\x20revoke\x20access\x20promptly.\x20'+'3)\x20For\x20sensitive\x20forwards,\x20prefer\x20Forward.permissionIndex\x20(Some)\x20for\x20dual-check.','evidence':'named_operator='+a['forward_named_operator']};return null;}},R_PR_3_03={'id':'R-PR-3-03','category':'permission','trigger':'Forward\x20has\x20guard\x20(Some)\x20—\x20Passport\x20required\x20but\x20not\x20provided','check':a=>{if(!a['operate'])return null;if(a['forward_has_guard']&&!a['forward_permission_index'])return{'id':'R-PR-3-03','level':'HIGH','category':'permission','title':'Forward\x20guard\x20requires\x20Passport','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20has\x20a\x20guard\x20(Some).\x20'+'Move\x27s\x20next_imp\x20asserts\x20E_NEED_PASSPORT\x20for\x20guarded\x20forwards\x20when\x20called\x20without\x20passport.\x20'+'Use\x20next_with_passport\x20/\x20order_next_with_passport\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20calls\x20next()\x20on\x20a\x20guarded\x20forward\x20without\x20passport','mitigation':'Submit\x20via\x20*_with_passport\x20variant;\x20ensure\x20submission\x20data\x20is\x20valid\x20for\x20the\x20Guard','evidence':'forward='+a['operate']['operation']['forward']+',\x20has_guard='+a['forward_has_guard']};return null;}},R_PR_4_01={'id':'R-PR-4-01','category':'lifecycle','trigger':'Machine\x20not\x20published\x20—\x20Progress\x20cannot\x20be\x20created','check':a=>{if(a['machine_published']===![])return{'id':'R-PR-4-01','level':'CRITICAL','category':'lifecycle','title':'Machine\x20not\x20published\x20—\x20Progress\x20creation\x20blocked','description':'Machine\x20'+(a['current_machine']??'(unknown)')+'\x20is\x20not\x20published.\x20'+'Progress\x20requires\x20a\x20published\x20Machine\x20(machine::on_progress_new\x20asserts\x20published\x20state).\x20'+'All\x20Progress\x20ops\x20will\x20fail\x20with\x20E_MACHINE_NOT_MATCH\x20or\x20similar.','affected_stakeholders':['owner'],'scenario':'User\x20attempts\x20to\x20create\x20Progress\x20before\x20Machine\x20publish','mitigation':'Publish\x20the\x20Machine\x20first\x20(machine::publish,\x20205\x20permission),\x20then\x20create\x20Progress','evidence':'machine='+a['current_machine']+',\x20published=false'};return null;}},R_PR_4_02={'id':'R-PR-4-02','category':'lifecycle','trigger':'operate\x20on\x20already-accomplished\x20forward\x20(E_FORWARD_ALREADY_ACCOMPLISHED)','check':a=>{if(!a['operate'])return null;if(a['forward_already_accomplished'])return{'id':'R-PR-4-02','level':'MEDIUM','category':'lifecycle','title':'Forward\x20already\x20accomplished\x20—\x20re-hold\x20blocked','description':'Forward\x20\x22'+a['operate']['operation']['forward']+'\x22\x20to\x20\x22'+a['operate']['operation']['next_node_name']+'\x22\x20'+'is\x20already\x20accomplished.\x20Move\x20aborts\x20with\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20any\x20re-hold\x20attempt.','affected_stakeholders':['submitter'],'scenario':'User\x20retries\x20an\x20already-completed\x20forward\x20(race\x20condition\x20or\x20stale\x20state)','mitigation':'Query\x20Progress.current\x20—\x20if\x20already\x20past\x20target,\x20no\x20action\x20needed;\x20if\x20parallel\x20session,\x20use\x20a\x20different\x20forward','evidence':'forward='+a['operate']['operation']['forward']+',\x20accomplished=true'};return null;}},R_PR_4_03={'id':'R-PR-4-03','category':'lifecycle','trigger':'unhold\x20by\x20non-holder\x20without\x20224\x20permission\x20(E_NOT_THE_HOLDER)','check':a=>{if(!a['operate']||a['operate']['op']!=='unhold')return null;if(a['holder_address']&&a['signer']&&a['holder_address']!==a['signer'])return{'id':'R-PR-4-03','level':'HIGH','category':'lifecycle','title':'unhold\x20by\x20non-holder\x20—\x20Move\x20will\x20abort\x20E_NOT_THE_HOLDER','description':'Forward\x20is\x20held\x20by\x20'+a['holder_address']+',\x20but\x20signer\x20is\x20'+a['signer']+'.\x20'+'Move\x20aborts\x20with\x20E_NOT_THE_HOLDER\x20unless\x20signer\x20has\x20224\x20permission\x20(adminUnhold\x20path).','affected_stakeholders':['submitter'],'scenario':'User\x20other\x20than\x20holder\x20tries\x20to\x20release\x20a\x20hold','mitigation':'1)\x20Have\x20the\x20original\x20holder\x20call\x20unhold.\x202)\x20If\x20holder\x20is\x20unresponsive,\x20use\x20adminUnhold=true\x20(requires\x20224).','evidence':'holder='+a['holder_address']+',\x20signer='+a['signer']};return null;}},R_PR_5_01={'id':'R-PR-5-01','category':'cross_object','trigger':'operate.order_next\x20called\x20but\x20progress.task\x20!=\x20order\x20address\x20(E_ORDER_NOT_MATCH)','check':a=>{if(!a['operate'])return null;if(a['current_task']&&a['signer'])return null;return null;}},R_PR_5_02={'id':'R-PR-5-02','category':'cross_object','trigger':'context_repository_add\x20without\x20object-linker\x20tx\x20binding\x20check','check':a=>{if(!a['repository']||a['repository']['op']!=='add')return null;return{'id':'R-PR-5-02','level':'LOW','category':'cross_object','title':'context_repository_add\x20creates\x20object-linker\x20tx\x20binding','description':'Adding\x20'+a['repository']['objects']['length']+'\x20repository(ies)\x20creates\x20object-linker\x20tx\x20binding\x20'+'entries.\x20If\x20the\x20Repository\x20is\x20later\x20removed\x20(object_linker::disaffiliation_tx),\x20cross-object\x20queries\x20'+'that\x20depend\x20on\x20it\x20will\x20return\x20empty\x20results\x20without\x20warning.','affected_stakeholders':['owner','system'],'scenario':'Repository\x20deleted\x20while\x20Progress\x20still\x20references\x20it','mitigation':'Use\x20context_repository_remove\x20before\x20deleting\x20a\x20Repository;\x20audit\x20object-linker\x20bindings\x20periodically','evidence':'add_count='+a['repository']['objects']['length']};}},R_PR_5_03={'id':'R-PR-5-03','category':'cross_object','trigger':'Permission\x20used\x20by\x20Progress\x20is\x20shared\x20with\x20other\x20host\x20objects','check':a=>{if(!a['target_objects_types']||a['target_objects_types']['length']<0x2)return null;const b=new Set(a['target_objects_types']);if(b['size']>0x1)return{'id':'R-PR-5-03','level':'MEDIUM','category':'cross_object','title':'Permission\x20shared\x20across\x20heterogeneous\x20host\x20objects','description':'Single\x20Permission\x20applied\x20to\x20'+[...b]['join'](',\x20')+'.\x20'+'Progress\x20builtin\x20indexes\x20(220-225)\x20have\x20different\x20semantics\x20per\x20host\x20object;\x20'+'granting\x20221\x20(PROGRESS_NAMED_OPERATOR)\x20to\x20a\x20non-Progress\x20entity\x20is\x20meaningless.','affected_stakeholders':['owner'],'scenario':'One\x20Permission\x20for\x20both\x20Progress\x20and\x20Machine','mitigation':'Use\x20separate\x20Permission\x20objects\x20per\x20host\x20object\x20type','evidence':'types='+[...b]['join'](',')};return null;}},R_PR_5_04={'id':'R-PR-5-04','category':'cross_object','trigger':'Progress\x20without\x20bound\x20Order\x20(order=null)\x20—\x20order_next/order_hold\x20blocked','check':a=>{if(!a['operate'])return null;if(a['current_task']===null&&a['operate']['op']!==undefined)return{'id':'R-PR-5-04','level':'MEDIUM','category':'cross_object','title':'operate\x20without\x20bound\x20Order\x20—\x20order_next/order_hold\x20unavailable','description':'Progress\x20has\x20no\x20bound\x20task\x20(task=null).\x20order_next\x20and\x20order_hold\x20require\x20'+'progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH).\x20Use\x20plain\x20next()/hold()\x20instead.','affected_stakeholders':['submitter'],'scenario':'User\x20tries\x20order\x20variant\x20on\x20a\x20task-less\x20Progress','mitigation':'Use\x20non-order\x20next()/hold()\x20variant,\x20OR\x20call\x20task_set\x20first\x20to\x20bind\x20an\x20Order','evidence':'task=null'};return null;}},ALL_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_1_04,R_PR_2_01,R_PR_2_02,R_PR_2_03,R_PR_3_01,R_PR_3_02,R_PR_3_03,R_PR_4_01,R_PR_4_02,R_PR_4_03,R_PR_5_01,R_PR_5_02,R_PR_5_03,R_PR_5_04];export const PROGRESS_RISK_VERSION='1.0.0';export function getAllProgressRiskRules(){return[...ALL_RULES];}export function getProgressRiskRulesCount(){return ALL_RULES['length'];}export function getProgressRiskRulesByCategory(a){return ALL_RULES['filter'](b=>b['category']===a);}export function assessProgressRisks(a){const b=[];for(const f of ALL_RULES){const g=f['check'](a);if(g)b['push'](g);}const c=b['length']===0x0?'LOW':b['some'](h=>h['level']==='CRITICAL')?'CRITICAL':b['some'](h=>h['level']==='HIGH')?'HIGH':b['some'](h=>h['level']==='MEDIUM')?'MEDIUM':'LOW',d={};for(const h of b){d[h['category']]=(d[h['category']]??0x0)+0x1;}const e={};for(const i of b){for(const j of i['affected_stakeholders']){if(!e[j])e[j]=[];e[j]['push'](i['id']+':\x20'+i['mitigation']);}}return{'summary':'Assessed\x20'+b['length']+'\x20risk(s)\x20across\x20'+Object['keys'](d)['length']+'\x20categories','risks':b,'overall_risk':c,'risks_by_category':d,'stakeholder_advice':e,'needs_human_review':b['some'](k=>k['level']==='CRITICAL'||k['level']==='HIGH')};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PROGRESS_TEMPLATES=[{'id':'T-PR-01','name':'Single\x20named_operator\x20workflow','description':'Bind\x20a\x20single\x20named_operator\x20role\x20(e.g.\x20\x27seller\x27\x20or\x20\x27logistics\x27)\x20to\x20a\x20Progress.\x20'+'Suitable\x20for\x20linear\x20flows\x20with\x20one\x20external\x20operator\x20besides\x20OrderHolder.','applicable_scenes':['progress_named_operator','progress_task_submit'],'industry_tags':['universal','ecommerce'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'operator_name','type':'name','description':'named_operator\x20name\x20(e.g.\x20\x27seller\x27,\x20\x27logistics\x27)','required':!![]},{'name':'operator_address','type':'address','description':'Single\x20operator\x20address','required':!![]}],'body':a=>({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':a['operator_name'],'operators':[a['operator_address']]}}),'notes':['Use\x20\x27set\x27\x20for\x20initial\x20assignment\x20(REPLACE\x20list);\x20use\x20\x27add\x27\x20for\x20extending\x20existing\x20list','Operator\x20name\x20must\x20be\x20a\x20valid\x20NAME\x20(common::NAME)\x20—\x20non-empty,\x20length-bounded','Empty\x20name\x20\x27\x27\x20is\x20reserved\x20for\x20OrderHolder\x20—\x20do\x20not\x20use\x20here']},{'id':'T-PR-02','name':'Multi\x20named_operator\x20collaborative\x20workflow','description':'Bind\x20multiple\x20named_operator\x20roles\x20in\x20one\x20transaction\x20(e.g.\x20seller\x20+\x20logistics\x20+\x20reviewer).\x20'+'Suitable\x20for\x20collaborative\x20workflows\x20where\x20different\x20roles\x20advance\x20different\x20forwards.','applicable_scenes':['progress_named_operator'],'industry_tags':['logistics','arbitration','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'roles','type':'string[]','description':'named_operator\x20names\x20(e.g.\x20[\x27seller\x27,\x27logistics\x27,\x27reviewer\x27])','required':!![]},{'name':'addresses_per_role','type':'string','description':'Comma-separated\x20addresses\x20per\x20role,\x20semicolon-separated\x20roles\x20(e.g.\x20\x270xA,0xB;0xC;0xD,0xE\x27)','required':!![]}],'body':a=>{const b=a['roles'],c=a['addresses_per_role']['split'](';'),d=[];for(let e=0x0;e<b['length'];e++){const f=b[e],g=(c[e]??'')['split'](',')['map'](h=>h['trim']())['filter'](h=>h['length']>0x0);d['push']({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':f,'operators':g}});}return{'_batch':d,'_note':'Each\x20entry\x20is\x20a\x20separate\x20CallProgress_Data;\x20submit\x20all\x20in\x20one\x20transaction'};},'notes':['Each\x20role\x20must\x20satisfy\x20common::NAME\x20—\x20non-empty,\x20length-bounded','Total\x20roles\x20≤\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20each\x20role\x27s\x20addresses\x20≤\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','Submit\x20all\x20operations\x20in\x20a\x20single\x20transaction\x20for\x20atomicity']},{'id':'T-PR-03','name':'Context_repository\x20binding\x20workflow','description':'Bind\x20context\x20Repository\x20objects\x20to\x20a\x20Progress\x20for\x20query-time\x20context\x20'+'(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20Up\x20to\x2030\x20repositories.','applicable_scenes':['progress_context_repository'],'industry_tags':['education','content','rental','cross_chain'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'repository_addresses','type':'string[]','description':'Repository\x20object\x20addresses\x20to\x20bind','required':!![]},{'name':'op','type':'string','description':'Operation:\x20\x27add\x27\x20(extend)\x20|\x20\x27set\x27\x20(replace)\x20|\x20\x27remove\x27\x20|\x20\x27clear\x27','required':![],'default':'add'}],'body':a=>({'object':a['progress_address'],'repository':{'op':a['op']||'add','objects':a['repository_addresses']}}),'notes':['op=\x27add\x27\x20is\x20idempotent\x20(vector::contains\x20check);\x20op=\x27set\x27\x20clears\x20then\x20adds','Total\x20count\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','Binding\x20creates\x20Registrar\x20affiliation\x20—\x20remove\x20before\x20deleting\x20Repository\x20to\x20avoid\x20dangling\x20refs','Bind\x20BEFORE\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data']},{'id':'T-PR-04','name':'Forward\x20advancement\x20workflow','description':'Advance\x20a\x20Progress\x20forward\x20(next\x20or\x20hold).\x20Forwards\x20are\x20defined\x20in\x20the\x20bound\x20Machine;\x20'+'this\x20template\x20emits\x20the\x20operate\x20payload\x20for\x20a\x20single\x20forward\x20step.','applicable_scenes':['progress_completed','progress_unhold'],'industry_tags':['universal'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(must\x20exist\x20in\x20Machine)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(from\x20current\x20→\x20next_node_name)','required':!![]},{'name':'op','type':'string','description':'\x27next\x27\x20to\x20advance\x20the\x20forward,\x20\x27hold\x27\x20to\x20lock\x20the\x20forward','required':![],'default':'next'},{'name':'message','type':'string','description':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['op']||'next','message':a['message']||''}}),'notes':['Forward\x20must\x20exist\x20in\x20Machine:\x20query\x20machine::info_borrow(machine,\x20current,\x20next_node,\x20forward)','If\x20Forward.guard\x20is\x20Some,\x20use\x20*_with_passport\x20variant\x20(SDK\x20auto-selects\x20based\x20on\x20submission)','If\x20Forward.namedOperator\x20is\x20set,\x20caller\x20must\x20be\x20in\x20that\x20operator\x20list\x20(IsNamedOperator\x20short-circuit)','op=\x27hold\x27\x20blocks\x20the\x20forward;\x20op=\x27next\x27\x20advances\x20it;\x20op=\x27unhold\x27\x20self-releases;\x20op=\x27adminUnhold\x27\x20force-releases\x20via\x20224']},{'id':'T-PR-05','name':'Unhold\x20/\x20adminUnhold\x20workflow','description':'Release\x20a\x20previously-held\x20forward.\x20Two\x20modes:\x20(a)\x20self-unhold\x20by\x20original\x20holder\x20(op=\x27unhold\x27);\x20'+'(b)\x20adminUnhold\x20via\x20224\x20permission\x20to\x20bypass\x20holder\x20check\x20(op=\x27adminUnhold\x27,\x20deadlock\x20recovery).','applicable_scenes':['progress_unhold'],'industry_tags':['content','rental','arbitration','subscription'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'admin_unhold','type':'string','description':'\x27true\x27\x20to\x20force-release\x20via\x20224\x20permission\x20(op=\x27adminUnhold\x27);\x20\x27false\x27\x20for\x20self-unhold\x20(op=\x27unhold\x27)','required':![],'default':'false'},{'name':'message','type':'string','description':'Release\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['admin_unhold']==='true'?'adminUnhold':'unhold','message':a['message']||''}}),'notes':['op=\x27unhold\x27:\x20sender\x20must\x20==\x20Holder.who;\x20else\x20E_NOT_THE_HOLDER','op=\x27adminUnhold\x27:\x20requires\x20224\x20permission\x20(PROGRESS_UNHOLD);\x20bypasses\x20holder\x20check','Re-hold\x20on\x20already-accomplished\x20forward\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED','Use\x20adminUnhold\x20sparingly\x20—\x20log\x20every\x20invocation\x20for\x20audit']},{'id':'T-PR-06','name':'Owner\x20receive\x20workflow','description':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node.\x20'+'Unwraps\x20via\x20Payment.unwrap_with_check;\x20forwards\x20to\x20Permission\x20owner.\x20'+'Note:\x20NOT\x20exposed\x20in\x20CallProgress_Data\x20—\x20direct\x20Move\x20call\x20required.','applicable_scenes':['progress_owner_receive'],'industry_tags':['finance','treasury','rental','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'machine_address','type':'address','description':'Bound\x20Machine\x20object\x20address','required':!![]},{'name':'permission_address','type':'address','description':'Machine\x27s\x20Permission\x20object\x20address','required':!![]},{'name':'asset_type','type':'string','description':'\x27coin\x27\x20or\x20\x27object\x27','required':!![]},{'name':'received_object','type':'address','description':'Receiving<K>\x20object\x20address\x20(the\x20received\x20\x27envelope\x27)','required':!![]},{'name':'payment_object','type':'address','description':'Payment<T>\x20object\x20address\x20(only\x20for\x20asset_type=\x27coin\x27)','required':![]}],'body':a=>({'_note':'This\x20operation\x20is\x20NOT\x20exposed\x20via\x20CallProgress_Data;\x20must\x20be\x20called\x20via\x20direct\x20Move\x20call.','_move_target':a['asset_type']==='coin'?'progress::owner_receive<T>':'progress::owner_receive_object<K>','_arguments':a['asset_type']==='coin'?[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object'],a['payment_object']]:[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object']],'_permission_required':0xe1,'_permission_label':'PROGRESS_OWNER_RECEIVE'}),'notes':['Permission\x20225\x20(PROGRESS_OWNER_RECEIVE)\x20is\x20required;\x20SDK\x20CallProgress_Data\x20does\x20NOT\x20expose\x20this\x20op','Recipient\x20is\x20Permission\x20owner\x20(Machine.permission\x27s\x20owner),\x20NOT\x20Progress\x20creator','Triggered\x20at\x20terminal\x20nodes:\x20\x27return_approved\x27,\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27paid\x27','For\x20coins:\x20Payment.unwrap_with_check\x20validates\x20amount\x20before\x20forwarding\x20to\x20owner','For\x20objects:\x20generic\x20K:key+store\x20—\x20forwarded\x20directly\x20via\x20permission::owner_receive_inner']}];export const PROGRESS_TEMPLATES_VERSION='1.0.0';export function getAllProgressTemplates(){return[...PROGRESS_TEMPLATES];}export function getProgressTemplateById(a){return PROGRESS_TEMPLATES['find'](b=>b['id']===a);}export function getProgressTemplatesByScene(a){return PROGRESS_TEMPLATES['filter'](b=>b['applicable_scenes']['includes'](a));}export function getProgressTemplatesByIndustry(a){return PROGRESS_TEMPLATES['filter'](b=>b['industry_tags']['includes'](a)||b['industry_tags']['includes']('universal'));}export function suggestProgressTemplateForScene(a){const b=getProgressTemplatesByScene(a);return b['length']>0x0?b[0x0]:undefined;}export function listProgressTemplates(){return PROGRESS_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'description':a['description'],'scenes':a['applicable_scenes']}));}export function fillProgressTemplate(a,b){const c=getProgressTemplateById(a);if(!c)return{'ok':![],'error':'Template\x20'+a+'\x20not\x20found'};for(const d of c['params']){if(d['required']&&!(d['name']in b))return{'ok':![],'error':'Missing\x20required\x20param:\x20'+d['name']};}return{'ok':!![],'body':c['body'](b)};}
|
|
1
|
+
export const PROGRESS_TEMPLATES=[{'id':'T-PR-01','name':'Single\x20named_operator\x20workflow','description':'Bind\x20a\x20single\x20named_operator\x20role\x20(e.g.\x20\x27seller\x27\x20or\x20\x27logistics\x27)\x20to\x20a\x20Progress.\x20'+'Suitable\x20for\x20linear\x20flows\x20with\x20one\x20external\x20operator\x20besides\x20OrderHolder.','applicable_scenes':['progress_named_operator','progress_task_submit'],'industry_tags':['universal','ecommerce'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'operator_name','type':'name','description':'named_operator\x20name\x20(e.g.\x20\x27seller\x27,\x20\x27logistics\x27)','required':!![]},{'name':'operator_address','type':'address','description':'Single\x20operator\x20address','required':!![]}],'body':a=>({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':a['operator_name'],'operators':[a['operator_address']]}}),'notes':['Use\x20\x27set\x27\x20for\x20initial\x20assignment\x20(REPLACE\x20list);\x20use\x20\x27add\x27\x20for\x20extending\x20existing\x20list','Operator\x20name\x20must\x20be\x20a\x20valid\x20NAME\x20(common::NAME)\x20—\x20non-empty,\x20length-bounded','Empty\x20name\x20\x27\x27\x20is\x20reserved\x20for\x20OrderHolder\x20—\x20do\x20not\x20use\x20here']},{'id':'T-PR-02','name':'Multi\x20named_operator\x20collaborative\x20workflow','description':'Bind\x20multiple\x20named_operator\x20roles\x20in\x20one\x20transaction\x20(e.g.\x20seller\x20+\x20logistics\x20+\x20reviewer).\x20'+'Suitable\x20for\x20collaborative\x20workflows\x20where\x20different\x20roles\x20advance\x20different\x20forwards.','applicable_scenes':['progress_named_operator'],'industry_tags':['logistics','arbitration','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'roles','type':'string[]','description':'named_operator\x20names\x20(e.g.\x20[\x27seller\x27,\x27logistics\x27,\x27reviewer\x27])','required':!![]},{'name':'addresses_per_role','type':'string','description':'Comma-separated\x20addresses\x20per\x20role,\x20semicolon-separated\x20roles\x20(e.g.\x20\x270xA,0xB;0xC;0xD,0xE\x27)','required':!![]}],'body':a=>{const b=a['roles'],c=a['addresses_per_role']['split'](';'),d=[];for(let e=0x0;e<b['length'];e++){const f=b[e],g=(c[e]??'')['split'](',')['map'](h=>h['trim']())['filter'](h=>h['length']>0x0);d['push']({'object':a['progress_address'],'progress_namedOperator':{'op':'set','name':f,'operators':g}});}return{'_batch':d,'_note':'Each\x20entry\x20is\x20a\x20separate\x20CallProgress_Data;\x20submit\x20all\x20in\x20one\x20transaction'};},'notes':['Each\x20role\x20must\x20satisfy\x20common::NAME\x20—\x20non-empty,\x20length-bounded','Total\x20roles\x20≤\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20each\x20role\x27s\x20addresses\x20≤\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80)','Submit\x20all\x20operations\x20in\x20a\x20single\x20transaction\x20for\x20atomicity']},{'id':'T-PR-03','name':'Context_repository\x20binding\x20workflow','description':'Bind\x20context\x20Repository\x20objects\x20to\x20a\x20Progress\x20for\x20query-time\x20context\x20'+'(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20Up\x20to\x2030\x20repositories.','applicable_scenes':['progress_context_repository'],'industry_tags':['education','content','rental','cross_chain'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'repository_addresses','type':'string[]','description':'Repository\x20object\x20addresses\x20to\x20bind','required':!![]},{'name':'op','type':'string','description':'Operation:\x20\x27add\x27\x20(extend)\x20|\x20\x27set\x27\x20(replace)\x20|\x20\x27remove\x27\x20|\x20\x27clear\x27','required':![],'default':'add'}],'body':a=>({'object':a['progress_address'],'repository':{'op':a['op']||'add','objects':a['repository_addresses']}}),'notes':['op=\x27add\x27\x20is\x20idempotent\x20(vector::contains\x20check);\x20op=\x27set\x27\x20clears\x20then\x20adds','Total\x20count\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','Binding\x20creates\x20object-linker\x20tx\x20binding\x20—\x20remove\x20before\x20deleting\x20Repository\x20to\x20avoid\x20dangling\x20refs','Bind\x20BEFORE\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data']},{'id':'T-PR-04','name':'Forward\x20advancement\x20workflow','description':'Advance\x20a\x20Progress\x20forward\x20(next\x20or\x20hold).\x20Forwards\x20are\x20defined\x20in\x20the\x20bound\x20Machine;\x20'+'this\x20template\x20emits\x20the\x20operate\x20payload\x20for\x20a\x20single\x20forward\x20step.','applicable_scenes':['progress_completed','progress_unhold'],'industry_tags':['universal'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(must\x20exist\x20in\x20Machine)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(from\x20current\x20→\x20next_node_name)','required':!![]},{'name':'op','type':'string','description':'\x27next\x27\x20to\x20advance\x20the\x20forward,\x20\x27hold\x27\x20to\x20lock\x20the\x20forward','required':![],'default':'next'},{'name':'message','type':'string','description':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['op']||'next','message':a['message']||''}}),'notes':['Forward\x20must\x20exist\x20in\x20Machine:\x20query\x20machine::info_borrow(machine,\x20current,\x20next_node,\x20forward)','If\x20Forward.guard\x20is\x20Some,\x20use\x20*_with_passport\x20variant\x20(SDK\x20auto-selects\x20based\x20on\x20submission)','If\x20Forward.namedOperator\x20is\x20set,\x20caller\x20must\x20be\x20in\x20that\x20operator\x20list\x20(IsNamedOperator\x20short-circuit)','op=\x27hold\x27\x20blocks\x20the\x20forward;\x20op=\x27next\x27\x20advances\x20it;\x20op=\x27unhold\x27\x20self-releases;\x20op=\x27adminUnhold\x27\x20force-releases\x20via\x20224']},{'id':'T-PR-05','name':'Unhold\x20/\x20adminUnhold\x20workflow','description':'Release\x20a\x20previously-held\x20forward.\x20Two\x20modes:\x20(a)\x20self-unhold\x20by\x20original\x20holder\x20(op=\x27unhold\x27);\x20'+'(b)\x20adminUnhold\x20via\x20224\x20permission\x20to\x20bypass\x20holder\x20check\x20(op=\x27adminUnhold\x27,\x20deadlock\x20recovery).','applicable_scenes':['progress_unhold'],'industry_tags':['content','rental','arbitration','subscription'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'next_node_name','type':'name','description':'Target\x20node\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'forward','type':'name','description':'Forward\x20name\x20(matches\x20the\x20held\x20forward)','required':!![]},{'name':'admin_unhold','type':'string','description':'\x27true\x27\x20to\x20force-release\x20via\x20224\x20permission\x20(op=\x27adminUnhold\x27);\x20\x27false\x27\x20for\x20self-unhold\x20(op=\x27unhold\x27)','required':![],'default':'false'},{'name':'message','type':'string','description':'Release\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH)','required':![],'default':''}],'body':a=>({'object':a['progress_address'],'operate':{'operation':{'next_node_name':a['next_node_name'],'forward':a['forward']},'op':a['admin_unhold']==='true'?'adminUnhold':'unhold','message':a['message']||''}}),'notes':['op=\x27unhold\x27:\x20sender\x20must\x20==\x20Holder.who;\x20else\x20E_NOT_THE_HOLDER','op=\x27adminUnhold\x27:\x20requires\x20224\x20permission\x20(PROGRESS_UNHOLD);\x20bypasses\x20holder\x20check','Re-hold\x20on\x20already-accomplished\x20forward\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED','Use\x20adminUnhold\x20sparingly\x20—\x20log\x20every\x20invocation\x20for\x20audit']},{'id':'T-PR-06','name':'Owner\x20receive\x20workflow','description':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node.\x20'+'Unwraps\x20via\x20Payment.unwrap_with_check;\x20forwards\x20to\x20Permission\x20owner.\x20'+'Note:\x20NOT\x20exposed\x20in\x20CallProgress_Data\x20—\x20direct\x20Move\x20call\x20required.','applicable_scenes':['progress_owner_receive'],'industry_tags':['finance','treasury','rental','freelance'],'params':[{'name':'progress_address','type':'address','description':'Progress\x20object\x20address','required':!![]},{'name':'machine_address','type':'address','description':'Bound\x20Machine\x20object\x20address','required':!![]},{'name':'permission_address','type':'address','description':'Machine\x27s\x20Permission\x20object\x20address','required':!![]},{'name':'asset_type','type':'string','description':'\x27coin\x27\x20or\x20\x27object\x27','required':!![]},{'name':'received_object','type':'address','description':'Receiving<K>\x20object\x20address\x20(the\x20received\x20\x27envelope\x27)','required':!![]},{'name':'payment_object','type':'address','description':'Payment<T>\x20object\x20address\x20(only\x20for\x20asset_type=\x27coin\x27)','required':![]}],'body':a=>({'_note':'This\x20operation\x20is\x20NOT\x20exposed\x20via\x20CallProgress_Data;\x20must\x20be\x20called\x20via\x20direct\x20Move\x20call.','_move_target':a['asset_type']==='coin'?'progress::owner_receive<T>':'progress::owner_receive_object<K>','_arguments':a['asset_type']==='coin'?[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object'],a['payment_object']]:[a['progress_address'],a['machine_address'],a['permission_address'],a['received_object']],'_permission_required':0xe1,'_permission_label':'PROGRESS_OWNER_RECEIVE'}),'notes':['Permission\x20225\x20(PROGRESS_OWNER_RECEIVE)\x20is\x20required;\x20SDK\x20CallProgress_Data\x20does\x20NOT\x20expose\x20this\x20op','Recipient\x20is\x20Permission\x20owner\x20(Machine.permission\x27s\x20owner),\x20NOT\x20Progress\x20creator','Triggered\x20at\x20terminal\x20nodes:\x20\x27return_approved\x27,\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27paid\x27','For\x20coins:\x20Payment.unwrap_with_check\x20validates\x20amount\x20before\x20forwarding\x20to\x20owner','For\x20objects:\x20generic\x20K:key+store\x20—\x20forwarded\x20directly\x20via\x20permission::owner_receive_inner']}];export const PROGRESS_TEMPLATES_VERSION='1.0.0';export function getAllProgressTemplates(){return[...PROGRESS_TEMPLATES];}export function getProgressTemplateById(a){return PROGRESS_TEMPLATES['find'](b=>b['id']===a);}export function getProgressTemplatesByScene(a){return PROGRESS_TEMPLATES['filter'](b=>b['applicable_scenes']['includes'](a));}export function getProgressTemplatesByIndustry(a){return PROGRESS_TEMPLATES['filter'](b=>b['industry_tags']['includes'](a)||b['industry_tags']['includes']('universal'));}export function suggestProgressTemplateForScene(a){const b=getProgressTemplatesByScene(a);return b['length']>0x0?b[0x0]:undefined;}export function listProgressTemplates(){return PROGRESS_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'description':a['description'],'scenes':a['applicable_scenes']}));}export function fillProgressTemplate(a,b){const c=getProgressTemplateById(a);if(!c)return{'ok':![],'error':'Template\x20'+a+'\x20not\x20found'};for(const d of c['params']){if(d['required']&&!(d['name']in b))return{'ok':![],'error':'Missing\x20required\x20param:\x20'+d['name']};}return{'ok':!![],'body':c['body'](b)};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isProgressBuiltinPermission,getBuiltinPermissionByIndex}from'./progress-ledger.js';export const PROGRESS_SEMANTIC_TO_SCHEMA_RULES=[{'id':'P-PR-01','pattern_name':'Advance\x20Progress\x20(next\x20/\x20order_next)','semantic_intent':'Push\x20Progress\x20forward\x20via\x20a\x20Forward\x20definition;\x20accumulate\x20weight,\x20possibly\x20complete\x20session','match_keywords':['next','advance','proceed','complete\x20forward'],'schema_fields':['object','operate(operation,\x20op=\x27next\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'shipped','forward':'ship'},'op':'next','message':'Order\x20shipped\x20via\x20FedEx,\x20tracking\x2012345'}},'reverse_explanation':'operate.op=\x27next\x27\x20→\x20calls\x20progress::next\x20or\x20order_next\x20(if\x20task\x20bound).\x20'+'Move\x20accumulates\x20forward.weight;\x20on\x20reaching\x20threshold,\x20session\x20→\x20history\x20and\x20current\x20=\x20next_node_name.\x20'+'⚠\x20ROUTING\x20RULE:\x20When\x20Forward.namedOperator=\x22\x22\x20(empty\x20string\x20=\x20OrderHolder),\x20the\x20caller\x20MUST\x20use\x20'+'order.progress\x20(not\x20progress.operate)\x20—\x20order_next\x20uses\x20order.has_op_permission\x20which\x20recognizes\x20'+'the\x20OrderHolder\x20short-circuit.\x20Direct\x20progress::next\x20will\x20abort\x20with\x20\x27Permission\x20denied\x27\x20(code\x205).\x20'+'For\x20non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20forwards,\x20use\x20progress.operate\x20directly.'},{'id':'P-PR-02','pattern_name':'Hold\x20Progress\x20(block\x20forward)','semantic_intent':'Lock\x20a\x20Forward\x20so\x20no\x20one\x20else\x20can\x20advance\x20it\x20until\x20unhold','match_keywords':['hold','lock','block','pause\x20forward'],'schema_fields':['object','operate(operation,\x20op=\x27hold\x27,\x20message)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'revision_required','forward':'request_revision'},'op':'hold','message':'Please\x20revise\x20section\x203'}},'reverse_explanation':'operate.op=\x27hold\x27\x20→\x20calls\x20progress::hold\x20or\x20order_hold.\x20session_hold\x20sets\x20Holder.who\x20=\x20sender;\x20'+'other\x20callers\x20will\x20hit\x20E_NOT_THE_HOLDER\x20if\x20they\x20try\x20to\x20advance.'},{'id':'P-PR-03','pattern_name':'Self-unhold\x20(release\x20own\x20hold)','semantic_intent':'Release\x20a\x20forward\x20that\x20I\x20previously\x20held','match_keywords':['unhold','release','self\x20release'],'schema_fields':['object','operate(operation,\x20op=\x27unhold\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'reviewing','forward':'resubmit'},'op':'unhold','message':'Revised\x20content\x20uploaded'}},'reverse_explanation':'operate.op=\x27unhold\x27\x20→\x20calls\x20progress::hold(bHold=false)\x20or\x20order_hold(bHold=false).\x20'+'Move\x27s\x20session_hold\x20releases\x20the\x20lock\x20(sender\x20==\x20Holder.who).\x20'+'After\x20release,\x20the\x20forward\x20can\x20be\x20re-locked\x20or\x20accomplished\x20by\x20eligible\x20callers.'},{'id':'P-PR-04','pattern_name':'Admin\x20force-unhold\x20(224\x20permission)','semantic_intent':'Force-release\x20a\x20held\x20forward\x20using\x20224\x20permission,\x20bypassing\x20holder\x20check','match_keywords':['adminUnhold','force\x20unhold','admin\x20release'],'schema_fields':['object','operate(operation,\x20op=\x27adminUnhold\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'arb_decided','forward':'decide'},'op':'adminUnhold','message':'Admin\x20override:\x20holder\x20unresponsive\x20for\x207\x20days'}},'reverse_explanation':'operate.op=\x27adminUnhold\x27\x20→\x20calls\x20progress::unhold.\x20Move\x20checks\x20sender_has_permission_idcheck(224);\x20'+'if\x20true,\x20force\x20release\x20(bForce=true).\x20If\x20false,\x20falls\x20back\x20to\x20holder-match\x20check.'},{'id':'P-PR-05','pattern_name':'Bind\x20task\x20(one-time,\x20immutable)','semantic_intent':'Associate\x20an\x20Order/Reward\x20address\x20with\x20this\x20Progress\x20(only\x20once\x20per\x20Progress)','match_keywords':['task_set','bind\x20task','set\x20task'],'schema_fields':['object','task'],'example_json':{'object':'0xPROGRESS_ADDRESS','task':'0xORDER_ADDRESS'},'reverse_explanation':'Calls\x20progress::task_set.\x20Move\x20asserts\x20option::is_none(&self.task);\x20if\x20already\x20set,\x20E_TASK_ALREADY_SET\x20aborts.\x20'+'There\x20is\x20NO\x20task_unset\x20—\x20once\x20bound,\x20the\x20Progress\x20is\x20permanently\x20tied\x20to\x20that\x20Order/Reward.'},{'id':'P-PR-06','pattern_name':'Manage\x20context\x20repositories','semantic_intent':'Add/remove/clear\x20Repository\x20objects\x20as\x20query\x20context\x20(≤\x2030\x20total)','match_keywords':['repository','context'],'schema_fields':['object','repository(op,\x20objects)'],'example_json':{'object':'0xPROGRESS_ADDRESS','repository':{'op':'add','objects':['0xREPO1','0xREPO2']}},'reverse_explanation':'op=add:\x20appends\x20(idempotent\x20via\x20vector::contains).\x20op=remove:\x20drops\x20listed\x20addresses.\x20'+'op=clear:\x20empties\x20the\x20list.\x20op=set:\x20clears\x20then\x20adds.\x20Count\x20must\x20stay\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30).'},{'id':'P-PR-07','pattern_name':'Manage\x20named_operator\x20namespace','semantic_intent':'Add/set/remove\x20addresses\x20for\x20a\x20named\x20operator\x20role\x20(Forward\x20gate)','match_keywords':['named_operator','operator'],'schema_fields':['object','progress_namedOperator(op,\x20name,\x20operators)'],'example_json':{'object':'0xPROGRESS_ADDRESS','progress_namedOperator':{'op':'add','name':'logistics','operators':['0xADDR1','0xADDR2']}},'reverse_explanation':'op=add:\x20appends\x20(deduped).\x20op=set:\x20REPLACES\x20the\x20address\x20list.\x20op=remove:\x20drops\x20listed\x20addresses.\x20'+'Up\x20to\x2060\x20named_operator\x20names\x20per\x20Progress;\x20up\x20to\x2080\x20addresses\x20per\x20name.'},{'id':'P-PR-08','pattern_name':'Owner\x20receive\x20(terminal\x20node\x20unwrap)','semantic_intent':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node','match_keywords':['owner_receive','unwrap','withdraw'],'schema_fields':['(SDK\x20does\x20not\x20expose\x20this\x20in\x20CallProgress_Data\x20—\x20direct\x20move\x20call\x20required)'],'example_json':{'_note':'Not\x20exposed\x20in\x20CallProgress_Data;\x20direct\x20Move\x20call:','target':'progress::owner_receive<T>','arguments':['progress','machine','permission','received','payment']},'reverse_explanation':'Calls\x20progress::owner_receive\x20(225\x20permission).\x20Unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check,\x20'+'forwards\x20coin/object\x20to\x20Permission\x20owner.\x20Typically\x20triggered\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced).'}];export const PROGRESS_SCHEMA_TO_SEMANTIC_RULES=[{'element_type':'field','type_name':'object','semantic_explanation':'Progress\x20object\x20address.\x20Always\x20required\x20for\x20operate\x20calls\x20(Progress\x20is\x20created\x20indirectly\x20via\x20service::buy).'},{'element_type':'field','type_name':'task','semantic_explanation':'Bind\x20a\x20task\x20(Order/Reward)\x20address.\x20ONE-TIME\x20only\x20—\x20E_TASK_ALREADY_SET\x20on\x20re-set.'},{'element_type':'field','type_name':'repository','semantic_explanation':'Context\x20Repository\x20list\x20management.\x20op=add/set/remove/clear.\x20Total\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30).'},{'element_type':'field','type_name':'progress_namedOperator','semantic_explanation':'named_operator\x20namespace\x20management.\x20name=\x27\x27\x20is\x20the\x20OrderHolder\x20special\x20namespace.\x20≤\x2060\x20names,\x20≤\x2080\x20addresses\x20each.'},{'element_type':'field','type_name':'operate','semantic_explanation':'Forward\x20advancement\x20/\x20hold\x20/\x20unhold.\x20Contains\x20operation\x20(next_node_name\x20+\x20forward)\x20and\x20hold/adminUnhold/message\x20flags.'},{'element_type':'field','type_name':'operate.operation.next_node_name','semantic_explanation':'Target\x20node\x20name.\x20Must\x20exist\x20in\x20Machine\x20and\x20be\x20reachable\x20from\x20current\x20via\x20a\x20Forward\x20definition.'},{'element_type':'field','type_name':'operate.operation.forward','semantic_explanation':'Forward\x20name.\x20Must\x20be\x20one\x20of\x20the\x20forwards\x20defined\x20from\x20current\x20→\x20next_node_name\x20in\x20the\x20Machine.'},{'element_type':'field','type_name':'operate.op','semantic_explanation':'Operation\x20type:\x20\x27next\x27\x20=\x20advance\x20forward;\x20\x27hold\x27\x20=\x20lock\x20forward\x20(Holder.who\x20=\x20sender);\x20\x27unhold\x27\x20=\x20self-release\x20own\x20hold;\x20\x27adminUnhold\x27\x20=\x20force\x20release\x20via\x20224\x20permission\x20(bypasses\x20holder\x20check).'},{'element_type':'field','type_name':'operate.message','semantic_explanation':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH).\x20Stored\x20in\x20Holder.msg\x20/\x20delivered\x20on\x20accomplishment.'},{'element_type':'op','type_name':'next','semantic_explanation':'Plain\x20forward\x20advance.\x20Use\x20when\x20no\x20bound\x20Order,\x20OR\x20caller\x20is\x20named_operator\x20(not\x20OrderHolder).'},{'element_type':'op','type_name':'order_next','semantic_explanation':'Order-bound\x20forward\x20advance.\x20Caller\x20must\x20satisfy\x20order.has_op_permission\x20(order\x20owner/agent).'},{'element_type':'op','type_name':'hold','semantic_explanation':'Lock\x20forward.\x20Holder.who\x20=\x20sender;\x20subsequent\x20callers\x20hit\x20E_NOT_THE_HOLDER.'},{'element_type':'op','type_name':'order_hold','semantic_explanation':'Order-bound\x20hold.\x20Same\x20as\x20hold\x20but\x20uses\x20order.has_op_permission\x20for\x20OrderHolder\x20verification.'},{'element_type':'op','type_name':'unhold','semantic_explanation':'Self-release\x20(sender\x20==\x20Holder.who)\x20OR\x20admin\x20force-release\x20(224\x20permission).'},{'element_type':'op','type_name':'namedOperator_add','semantic_explanation':'Append\x20addresses\x20to\x20a\x20named_operator\x20(deduped;\x20fails\x20if\x20name\x20new\x20and\x20≥\x2060\x20names).'},{'element_type':'op','type_name':'namedOperator_set','semantic_explanation':'REPLACE\x20the\x20address\x20list\x20for\x20a\x20named_operator\x20name\x20(or\x20create\x20if\x20name\x20new).'},{'element_type':'op','type_name':'namedOperator_remove','semantic_explanation':'Drop\x20listed\x20addresses\x20from\x20a\x20named_operator\x20name\x20(no-op\x20if\x20name\x20doesn\x27t\x20exist).'},{'element_type':'phase','type_name':'creation','semantic_explanation':'Indirect:\x20service::buy\x20→\x20progress::new_imp\x20(bypasses\x20220\x20assertion\x20via\x20package-internal\x20entry).'},{'element_type':'phase','type_name':'task_binding','semantic_explanation':'One-time\x20task_set\x20(222).\x20E_TASK_ALREADY_SET\x20on\x20any\x20retry.'},{'element_type':'phase','type_name':'forward_advance','semantic_explanation':'Dynamic\x20permission:\x20IsNamedOperator\x20OR\x20Forward.permissionIndex\x20OR\x20Forward.guard\x20(Passport).\x20NOT\x20220-225.'},{'element_type':'phase','type_name':'completed','semantic_explanation':'session.weights\x20≥\x20threshold\x20→\x20push\x20to\x20history,\x20current\x20=\x20next_node.\x20Atomic.'}];export const PROGRESS_CONSTRAINT_RULES=[{'id':'MC-PR-01','category':'structural','rule':'Machine\x20must\x20be\x20published\x20before\x20Progress\x20creation\x20(machine::on_progress_new\x20asserts\x20published\x20state)','applies_to':['creation']},{'id':'MC-PR-02','category':'structural','rule':'Progress.machine\x20is\x20immutable\x20after\x20creation\x20(E_MACHINE_NOT_MATCH\x20on\x20every\x20op)','applies_to':['operate','task','repository','progress_namedOperator']},{'id':'MC-PR-03','category':'structural','rule':'named_operator\x20count\x20<\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20E_MAX_NAMED_OPERATOR_COUNT\x20on\x20overflow','applies_to':['progress_namedOperator.op=add\x20(new\x20name)']},{'id':'MC-PR-04','category':'structural','rule':'named_operator\x20addresses\x20<\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80);\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20on\x20overflow','applies_to':['progress_namedOperator.operators']},{'id':'MC-PR-05','category':'structural','rule':'context_repository\x20count\x20<\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','applies_to':['repository.op=add','repository.op=set']},{'id':'MC-PR-06','category':'semantic','rule':'task_set\x20is\x20one-time:\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment','applies_to':['task']},{'id':'MC-PR-07','category':'semantic','rule':'operate.op\x20must\x20be\x20one\x20of:\x20next\x20|\x20hold\x20|\x20unhold\x20|\x20adminUnhold\x20(schema-enforced\x20enum)','applies_to':['operate.op']},{'id':'MC-PR-08','category':'semantic','rule':'operate.message\x20must\x20satisfy\x20common::LONG_NAME\x20(≤\x20MAX_LONG_NAME_LENGTH)','applies_to':['operate.message']},{'id':'MC-PR-09','category':'permission','rule':'Forward\x20advance\x20uses\x20DYNAMIC\x20permission:\x20namedOperator\x20OR\x20Forward.permissionIndex\x20OR\x20Forward.guard\x20—\x20NOT\x20220-225','applies_to':['operate\x20(next/hold/unhold)']},{'id':'MC-PR-10','category':'permission','rule':'220-225\x20builtin\x20indexes\x20are\x20MANAGEMENT-ONLY\x20(named_operator/task/repository/unhold/owner_receive)','applies_to':['progress_namedOperator','task','repository','operate.op=\x27adminUnhold\x27']},{'id':'MC-PR-11','category':'permission','rule':'adminUnhold\x20(224)\x20bypasses\x20holder\x20check\x20—\x20grant\x20only\x20to\x20dedicated\x20recovery\x20addresses','applies_to':['operate.op=\x27adminUnhold\x27']},{'id':'MC-PR-12','category':'lifecycle','rule':'Forward\x20already\x20accomplished\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20re-hold\x20(idempotent\x20completion)','applies_to':['operate.op=\x27hold\x27']},{'id':'MC-PR-13','category':'lifecycle','rule':'unhold\x20by\x20non-holder\x20requires\x20224\x20permission;\x20else\x20E_NOT_THE_HOLDER','applies_to':['operate.op=\x27unhold\x27']},{'id':'MC-PR-14','category':'cross_object','rule':'order_next/order_hold\x20require\x20progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH)','applies_to':['operate\x20(order\x20variant)']},{'id':'MC-PR-15','category':'cross_object','rule':'context_repository_add\x20creates\x20Registrar\x20affiliation\x20—\x20remove\x20before\x20deleting\x20Repository','applies_to':['repository.op=add']},{'id':'MC-PR-16','category':'cross_object','rule':'Forward.guard\x20(Some)\x20requires\x20*_with_passport\x20variant;\x20plain\x20next()\x20aborts\x20E_NEED_PASSPORT','applies_to':['operate\x20(guarded\x20forward)']}];export const PROGRESS_TRANSLATION_VERSION='1.0.0';export function matchSemanticPattern(a){const b=a['toLowerCase']();return PROGRESS_SEMANTIC_TO_SCHEMA_RULES['filter'](c=>c['match_keywords']['some'](d=>b['includes'](d['toLowerCase']())));}export function explainProgressCallData(a){const b=[];!a['object']?b['push']('Operation:\x20CREATE\x20Progress\x20(indirect\x20—\x20service::buy\x20→\x20new_imp)'):b['push']('Operation:\x20OPERATE\x20Progress\x20at\x20'+a['object']);a['task']&&b['push']('-\x20⚠️\x20task_set:\x20'+a['task']+'\x20(one-time,\x20immutable\x20—\x20E_TASK_ALREADY_SET\x20on\x20re-set)');if(a['repository']){const c=a['repository'],d=c['objects']?.['length']??0x0;b['push']('-\x20Repository\x20'+c['op']+':\x20'+d+'\x20object(s)');}if(a['progress_namedOperator']){const e=a['progress_namedOperator'],f=e['operators']?.['length']??0x0,g=e['name']===''?'(OrderHolder\x20namespace)':'\x22'+e['name']+'\x22';b['push']('-\x20namedOperator\x20'+e['op']+'\x20'+g+':\x20'+f+'\x20address(es)');}if(a['operate']){const h=a['operate'];b['push']('-\x20Operation:\x20'+h['operation']['forward']+'\x20→\x20'+h['operation']['next_node_name']);h['op']&&b['push']('\x20\x20op='+h['op']);if(h['op']==='hold')b['push']('\x20\x20⚠️\x20hold:\x20lock\x20this\x20forward\x20(Holder.who\x20=\x20sender)');else{if(h['op']==='adminUnhold')b['push']('\x20\x20⚠️\x20adminUnhold:\x20force\x20release\x20via\x20224\x20permission\x20(bypasses\x20holder\x20check)');else h['op']==='unhold'?b['push']('\x20\x20ℹ️\x20unhold:\x20self-release\x20own\x20hold\x20(sender\x20must\x20==\x20Holder.who)'):b['push']('\x20\x20Submit\x20result\x20(advance\x20forward,\x20accumulate\x20weight\x20toward\x20threshold)');}h['message']&&b['push']('\x20\x20Message:\x20\x22'+h['message']+'\x22');}return b['join']('\x0a');}export function explainField(a){return PROGRESS_SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='field'&&b['type_name']===a);}export function explainOp(a){return PROGRESS_SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='op'&&b['type_name']===a);}export function getConstraintsByCategory(a){return PROGRESS_CONSTRAINT_RULES['filter'](b=>b['category']===a);}export function explainPermissionIndex(a){if(isProgressBuiltinPermission(a)){const b=getBuiltinPermissionByIndex(a);return b['name']+'\x20('+a+')\x20—\x20'+b['description'];}return'Custom/dynamic\x20permission\x20index\x20('+a+')\x20—\x20resolved\x20via\x20Forward.permissionIndex\x20in\x20Machine';}
|
|
1
|
+
import{isProgressBuiltinPermission,getBuiltinPermissionByIndex}from'./progress-ledger.js';export const PROGRESS_SEMANTIC_TO_SCHEMA_RULES=[{'id':'P-PR-01','pattern_name':'Advance\x20Progress\x20(next\x20/\x20order_next)','semantic_intent':'Push\x20Progress\x20forward\x20via\x20a\x20Forward\x20definition;\x20accumulate\x20weight,\x20possibly\x20complete\x20session','match_keywords':['next','advance','proceed','complete\x20forward'],'schema_fields':['object','operate(operation,\x20op=\x27next\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'shipped','forward':'ship'},'op':'next','message':'Order\x20shipped\x20via\x20FedEx,\x20tracking\x2012345'}},'reverse_explanation':'operate.op=\x27next\x27\x20→\x20calls\x20progress::next\x20or\x20order_next\x20(if\x20task\x20bound).\x20'+'Move\x20accumulates\x20forward.weight;\x20on\x20reaching\x20threshold,\x20session\x20→\x20history\x20and\x20current\x20=\x20next_node_name.\x20'+'⚠\x20ROUTING\x20RULE:\x20When\x20Forward.namedOperator=\x22\x22\x20(empty\x20string\x20=\x20OrderHolder),\x20the\x20caller\x20MUST\x20use\x20'+'order.progress\x20(not\x20progress.operate)\x20—\x20order_next\x20uses\x20order.has_op_permission\x20which\x20recognizes\x20'+'the\x20OrderHolder\x20short-circuit.\x20Direct\x20progress::next\x20will\x20abort\x20with\x20\x27Permission\x20denied\x27\x20(code\x205).\x20'+'For\x20non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20forwards,\x20use\x20progress.operate\x20directly.'},{'id':'P-PR-02','pattern_name':'Hold\x20Progress\x20(block\x20forward)','semantic_intent':'Lock\x20a\x20Forward\x20so\x20no\x20one\x20else\x20can\x20advance\x20it\x20until\x20unhold','match_keywords':['hold','lock','block','pause\x20forward'],'schema_fields':['object','operate(operation,\x20op=\x27hold\x27,\x20message)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'revision_required','forward':'request_revision'},'op':'hold','message':'Please\x20revise\x20section\x203'}},'reverse_explanation':'operate.op=\x27hold\x27\x20→\x20calls\x20progress::hold\x20or\x20order_hold.\x20session_hold\x20sets\x20Holder.who\x20=\x20sender;\x20'+'other\x20callers\x20will\x20hit\x20E_NOT_THE_HOLDER\x20if\x20they\x20try\x20to\x20advance.'},{'id':'P-PR-03','pattern_name':'Self-unhold\x20(release\x20own\x20hold)','semantic_intent':'Release\x20a\x20forward\x20that\x20I\x20previously\x20held','match_keywords':['unhold','release','self\x20release'],'schema_fields':['object','operate(operation,\x20op=\x27unhold\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'reviewing','forward':'resubmit'},'op':'unhold','message':'Revised\x20content\x20uploaded'}},'reverse_explanation':'operate.op=\x27unhold\x27\x20→\x20calls\x20progress::hold(bHold=false)\x20or\x20order_hold(bHold=false).\x20'+'Move\x27s\x20session_hold\x20releases\x20the\x20lock\x20(sender\x20==\x20Holder.who).\x20'+'After\x20release,\x20the\x20forward\x20can\x20be\x20re-locked\x20or\x20accomplished\x20by\x20eligible\x20callers.'},{'id':'P-PR-04','pattern_name':'Admin\x20force-unhold\x20(224\x20permission)','semantic_intent':'Force-release\x20a\x20held\x20forward\x20using\x20224\x20permission,\x20bypassing\x20holder\x20check','match_keywords':['adminUnhold','force\x20unhold','admin\x20release'],'schema_fields':['object','operate(operation,\x20op=\x27adminUnhold\x27)'],'example_json':{'object':'0xPROGRESS_ADDRESS','operate':{'operation':{'next_node_name':'arb_decided','forward':'decide'},'op':'adminUnhold','message':'Admin\x20override:\x20holder\x20unresponsive\x20for\x207\x20days'}},'reverse_explanation':'operate.op=\x27adminUnhold\x27\x20→\x20calls\x20progress::unhold.\x20Move\x20checks\x20sender_has_permission_idcheck(224);\x20'+'if\x20true,\x20force\x20release\x20(bForce=true).\x20If\x20false,\x20falls\x20back\x20to\x20holder-match\x20check.'},{'id':'P-PR-05','pattern_name':'Bind\x20task\x20(one-time,\x20immutable)','semantic_intent':'Associate\x20an\x20Order/Reward\x20address\x20with\x20this\x20Progress\x20(only\x20once\x20per\x20Progress)','match_keywords':['task_set','bind\x20task','set\x20task'],'schema_fields':['object','task'],'example_json':{'object':'0xPROGRESS_ADDRESS','task':'0xORDER_ADDRESS'},'reverse_explanation':'Calls\x20progress::task_set.\x20Move\x20asserts\x20option::is_none(&self.task);\x20if\x20already\x20set,\x20E_TASK_ALREADY_SET\x20aborts.\x20'+'There\x20is\x20NO\x20task_unset\x20—\x20once\x20bound,\x20the\x20Progress\x20is\x20permanently\x20tied\x20to\x20that\x20Order/Reward.'},{'id':'P-PR-06','pattern_name':'Manage\x20context\x20repositories','semantic_intent':'Add/remove/clear\x20Repository\x20objects\x20as\x20query\x20context\x20(≤\x2030\x20total)','match_keywords':['repository','context'],'schema_fields':['object','repository(op,\x20objects)'],'example_json':{'object':'0xPROGRESS_ADDRESS','repository':{'op':'add','objects':['0xREPO1','0xREPO2']}},'reverse_explanation':'op=add:\x20appends\x20(idempotent\x20via\x20vector::contains).\x20op=remove:\x20drops\x20listed\x20addresses.\x20'+'op=clear:\x20empties\x20the\x20list.\x20op=set:\x20clears\x20then\x20adds.\x20Count\x20must\x20stay\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30).'},{'id':'P-PR-07','pattern_name':'Manage\x20named_operator\x20namespace','semantic_intent':'Add/set/remove\x20addresses\x20for\x20a\x20named\x20operator\x20role\x20(Forward\x20gate)','match_keywords':['named_operator','operator'],'schema_fields':['object','progress_namedOperator(op,\x20name,\x20operators)'],'example_json':{'object':'0xPROGRESS_ADDRESS','progress_namedOperator':{'op':'add','name':'logistics','operators':['0xADDR1','0xADDR2']}},'reverse_explanation':'op=add:\x20appends\x20(deduped).\x20op=set:\x20REPLACES\x20the\x20address\x20list.\x20op=remove:\x20drops\x20listed\x20addresses.\x20'+'Up\x20to\x2060\x20named_operator\x20names\x20per\x20Progress;\x20up\x20to\x2080\x20addresses\x20per\x20name.'},{'id':'P-PR-08','pattern_name':'Owner\x20receive\x20(terminal\x20node\x20unwrap)','semantic_intent':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20at\x20a\x20terminal\x20node','match_keywords':['owner_receive','unwrap','withdraw'],'schema_fields':['(SDK\x20does\x20not\x20expose\x20this\x20in\x20CallProgress_Data\x20—\x20direct\x20move\x20call\x20required)'],'example_json':{'_note':'Not\x20exposed\x20in\x20CallProgress_Data;\x20direct\x20Move\x20call:','target':'progress::owner_receive<T>','arguments':['progress','machine','permission','received','payment']},'reverse_explanation':'Calls\x20progress::owner_receive\x20(225\x20permission).\x20Unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check,\x20'+'forwards\x20coin/object\x20to\x20Permission\x20owner.\x20Typically\x20triggered\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced).'}];export const PROGRESS_SCHEMA_TO_SEMANTIC_RULES=[{'element_type':'field','type_name':'object','semantic_explanation':'Progress\x20object\x20address.\x20Always\x20required\x20for\x20operate\x20calls\x20(Progress\x20is\x20created\x20indirectly\x20via\x20service::buy).'},{'element_type':'field','type_name':'task','semantic_explanation':'Bind\x20a\x20task\x20(Order/Reward)\x20address.\x20ONE-TIME\x20only\x20—\x20E_TASK_ALREADY_SET\x20on\x20re-set.'},{'element_type':'field','type_name':'repository','semantic_explanation':'Context\x20Repository\x20list\x20management.\x20op=add/set/remove/clear.\x20Total\x20≤\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30).'},{'element_type':'field','type_name':'progress_namedOperator','semantic_explanation':'named_operator\x20namespace\x20management.\x20name=\x27\x27\x20is\x20the\x20OrderHolder\x20special\x20namespace.\x20≤\x2060\x20names,\x20≤\x2080\x20addresses\x20each.'},{'element_type':'field','type_name':'operate','semantic_explanation':'Forward\x20advancement\x20/\x20hold\x20/\x20unhold.\x20Contains\x20operation\x20(next_node_name\x20+\x20forward)\x20and\x20hold/adminUnhold/message\x20flags.'},{'element_type':'field','type_name':'operate.operation.next_node_name','semantic_explanation':'Target\x20node\x20name.\x20Must\x20exist\x20in\x20Machine\x20and\x20be\x20reachable\x20from\x20current\x20via\x20a\x20Forward\x20definition.'},{'element_type':'field','type_name':'operate.operation.forward','semantic_explanation':'Forward\x20name.\x20Must\x20be\x20one\x20of\x20the\x20forwards\x20defined\x20from\x20current\x20→\x20next_node_name\x20in\x20the\x20Machine.'},{'element_type':'field','type_name':'operate.op','semantic_explanation':'Operation\x20type:\x20\x27next\x27\x20=\x20advance\x20forward;\x20\x27hold\x27\x20=\x20lock\x20forward\x20(Holder.who\x20=\x20sender);\x20\x27unhold\x27\x20=\x20self-release\x20own\x20hold;\x20\x27adminUnhold\x27\x20=\x20force\x20release\x20via\x20224\x20permission\x20(bypasses\x20holder\x20check).'},{'element_type':'field','type_name':'operate.message','semantic_explanation':'Deliverable\x20message\x20(≤\x20MAX_LONG_NAME_LENGTH).\x20Stored\x20in\x20Holder.msg\x20/\x20delivered\x20on\x20accomplishment.'},{'element_type':'op','type_name':'next','semantic_explanation':'Plain\x20forward\x20advance.\x20Use\x20when\x20no\x20bound\x20Order,\x20OR\x20caller\x20is\x20named_operator\x20(not\x20OrderHolder).'},{'element_type':'op','type_name':'order_next','semantic_explanation':'Order-bound\x20forward\x20advance.\x20Caller\x20must\x20satisfy\x20order.has_op_permission\x20(order\x20owner/agent).'},{'element_type':'op','type_name':'hold','semantic_explanation':'Lock\x20forward.\x20Holder.who\x20=\x20sender;\x20subsequent\x20callers\x20hit\x20E_NOT_THE_HOLDER.'},{'element_type':'op','type_name':'order_hold','semantic_explanation':'Order-bound\x20hold.\x20Same\x20as\x20hold\x20but\x20uses\x20order.has_op_permission\x20for\x20OrderHolder\x20verification.'},{'element_type':'op','type_name':'unhold','semantic_explanation':'Self-release\x20(sender\x20==\x20Holder.who)\x20OR\x20admin\x20force-release\x20(224\x20permission).'},{'element_type':'op','type_name':'namedOperator_add','semantic_explanation':'Append\x20addresses\x20to\x20a\x20named_operator\x20(deduped;\x20fails\x20if\x20name\x20new\x20and\x20≥\x2060\x20names).'},{'element_type':'op','type_name':'namedOperator_set','semantic_explanation':'REPLACE\x20the\x20address\x20list\x20for\x20a\x20named_operator\x20name\x20(or\x20create\x20if\x20name\x20new).'},{'element_type':'op','type_name':'namedOperator_remove','semantic_explanation':'Drop\x20listed\x20addresses\x20from\x20a\x20named_operator\x20name\x20(no-op\x20if\x20name\x20doesn\x27t\x20exist).'},{'element_type':'phase','type_name':'creation','semantic_explanation':'Indirect:\x20service::buy\x20→\x20progress::new_imp\x20(bypasses\x20220\x20assertion\x20via\x20package-internal\x20entry).'},{'element_type':'phase','type_name':'task_binding','semantic_explanation':'One-time\x20task_set\x20(222).\x20E_TASK_ALREADY_SET\x20on\x20any\x20retry.'},{'element_type':'phase','type_name':'forward_advance','semantic_explanation':'Dynamic\x20permission:\x20IsNamedOperator\x20OR\x20Forward.permissionIndex\x20OR\x20Forward.guard\x20(Passport).\x20NOT\x20220-225.'},{'element_type':'phase','type_name':'completed','semantic_explanation':'session.weights\x20≥\x20threshold\x20→\x20push\x20to\x20history,\x20current\x20=\x20next_node.\x20Atomic.'}];export const PROGRESS_CONSTRAINT_RULES=[{'id':'MC-PR-01','category':'structural','rule':'Machine\x20must\x20be\x20published\x20before\x20Progress\x20creation\x20(machine::on_progress_new\x20asserts\x20published\x20state)','applies_to':['creation']},{'id':'MC-PR-02','category':'structural','rule':'Progress.machine\x20is\x20immutable\x20after\x20creation\x20(E_MACHINE_NOT_MATCH\x20on\x20every\x20op)','applies_to':['operate','task','repository','progress_namedOperator']},{'id':'MC-PR-03','category':'structural','rule':'named_operator\x20count\x20<\x20MAX_NAMED_OPERATOR_COUNT\x20(60);\x20E_MAX_NAMED_OPERATOR_COUNT\x20on\x20overflow','applies_to':['progress_namedOperator.op=add\x20(new\x20name)']},{'id':'MC-PR-04','category':'structural','rule':'named_operator\x20addresses\x20<\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20(80);\x20E_MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20on\x20overflow','applies_to':['progress_namedOperator.operators']},{'id':'MC-PR-05','category':'structural','rule':'context_repository\x20count\x20<\x20MAX_CONTEXT_REPOSITORY_COUNT\x20(30);\x20E_MAX_CONTEXT_REPOSITORY_COUNT\x20on\x20overflow','applies_to':['repository.op=add','repository.op=set']},{'id':'MC-PR-06','category':'semantic','rule':'task_set\x20is\x20one-time:\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment','applies_to':['task']},{'id':'MC-PR-07','category':'semantic','rule':'operate.op\x20must\x20be\x20one\x20of:\x20next\x20|\x20hold\x20|\x20unhold\x20|\x20adminUnhold\x20(schema-enforced\x20enum)','applies_to':['operate.op']},{'id':'MC-PR-08','category':'semantic','rule':'operate.message\x20must\x20satisfy\x20common::LONG_NAME\x20(≤\x20MAX_LONG_NAME_LENGTH)','applies_to':['operate.message']},{'id':'MC-PR-09','category':'permission','rule':'Forward\x20advance\x20uses\x20DYNAMIC\x20permission:\x20namedOperator\x20OR\x20Forward.permissionIndex\x20OR\x20Forward.guard\x20—\x20NOT\x20220-225','applies_to':['operate\x20(next/hold/unhold)']},{'id':'MC-PR-10','category':'permission','rule':'220-225\x20builtin\x20indexes\x20are\x20MANAGEMENT-ONLY\x20(named_operator/task/repository/unhold/owner_receive)','applies_to':['progress_namedOperator','task','repository','operate.op=\x27adminUnhold\x27']},{'id':'MC-PR-11','category':'permission','rule':'adminUnhold\x20(224)\x20bypasses\x20holder\x20check\x20—\x20grant\x20only\x20to\x20dedicated\x20recovery\x20addresses','applies_to':['operate.op=\x27adminUnhold\x27']},{'id':'MC-PR-12','category':'lifecycle','rule':'Forward\x20already\x20accomplished\x20→\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20on\x20re-hold\x20(idempotent\x20completion)','applies_to':['operate.op=\x27hold\x27']},{'id':'MC-PR-13','category':'lifecycle','rule':'unhold\x20by\x20non-holder\x20requires\x20224\x20permission;\x20else\x20E_NOT_THE_HOLDER','applies_to':['operate.op=\x27unhold\x27']},{'id':'MC-PR-14','category':'cross_object','rule':'order_next/order_hold\x20require\x20progress.task\x20==\x20order\x20address\x20(E_ORDER_NOT_MATCH)','applies_to':['operate\x20(order\x20variant)']},{'id':'MC-PR-15','category':'cross_object','rule':'context_repository_add\x20creates\x20object-linker\x20tx\x20binding\x20—\x20remove\x20before\x20deleting\x20Repository','applies_to':['repository.op=add']},{'id':'MC-PR-16','category':'cross_object','rule':'Forward.guard\x20(Some)\x20requires\x20*_with_passport\x20variant;\x20plain\x20next()\x20aborts\x20E_NEED_PASSPORT','applies_to':['operate\x20(guarded\x20forward)']}];export const PROGRESS_TRANSLATION_VERSION='1.0.0';export function matchSemanticPattern(a){const b=a['toLowerCase']();return PROGRESS_SEMANTIC_TO_SCHEMA_RULES['filter'](c=>c['match_keywords']['some'](d=>b['includes'](d['toLowerCase']())));}export function explainProgressCallData(a){const b=[];!a['object']?b['push']('Operation:\x20CREATE\x20Progress\x20(indirect\x20—\x20service::buy\x20→\x20new_imp)'):b['push']('Operation:\x20OPERATE\x20Progress\x20at\x20'+a['object']);a['task']&&b['push']('-\x20⚠️\x20task_set:\x20'+a['task']+'\x20(one-time,\x20immutable\x20—\x20E_TASK_ALREADY_SET\x20on\x20re-set)');if(a['repository']){const c=a['repository'],d=c['objects']?.['length']??0x0;b['push']('-\x20Repository\x20'+c['op']+':\x20'+d+'\x20object(s)');}if(a['progress_namedOperator']){const e=a['progress_namedOperator'],f=e['operators']?.['length']??0x0,g=e['name']===''?'(OrderHolder\x20namespace)':'\x22'+e['name']+'\x22';b['push']('-\x20namedOperator\x20'+e['op']+'\x20'+g+':\x20'+f+'\x20address(es)');}if(a['operate']){const h=a['operate'];b['push']('-\x20Operation:\x20'+h['operation']['forward']+'\x20→\x20'+h['operation']['next_node_name']);h['op']&&b['push']('\x20\x20op='+h['op']);if(h['op']==='hold')b['push']('\x20\x20⚠️\x20hold:\x20lock\x20this\x20forward\x20(Holder.who\x20=\x20sender)');else{if(h['op']==='adminUnhold')b['push']('\x20\x20⚠️\x20adminUnhold:\x20force\x20release\x20via\x20224\x20permission\x20(bypasses\x20holder\x20check)');else h['op']==='unhold'?b['push']('\x20\x20ℹ️\x20unhold:\x20self-release\x20own\x20hold\x20(sender\x20must\x20==\x20Holder.who)'):b['push']('\x20\x20Submit\x20result\x20(advance\x20forward,\x20accumulate\x20weight\x20toward\x20threshold)');}h['message']&&b['push']('\x20\x20Message:\x20\x22'+h['message']+'\x22');}return b['join']('\x0a');}export function explainField(a){return PROGRESS_SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='field'&&b['type_name']===a);}export function explainOp(a){return PROGRESS_SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='op'&&b['type_name']===a);}export function getConstraintsByCategory(a){return PROGRESS_CONSTRAINT_RULES['filter'](b=>b['category']===a);}export function explainPermissionIndex(a){if(isProgressBuiltinPermission(a)){const b=getBuiltinPermissionByIndex(a);return b['name']+'\x20('+a+')\x20—\x20'+b['description'];}return'Custom/dynamic\x20permission\x20index\x20('+a+')\x20—\x20resolved\x20via\x20Forward.permissionIndex\x20in\x20Machine';}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ProofScene } from "./proof-ledger.js";
|
|
2
|
+
export declare const PROOF_CONTEXT_VERSION = "1.0.0";
|
|
3
|
+
export interface ProofContextBundle {
|
|
4
|
+
scene?: ProofScene;
|
|
5
|
+
binding: "entity_bound" | "free_standing";
|
|
6
|
+
immutable: true;
|
|
7
|
+
summary: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BuildProofContextInput {
|
|
10
|
+
proof_type?: number | bigint | string;
|
|
11
|
+
about_address?: string | null;
|
|
12
|
+
description?: string;
|
|
13
|
+
proof?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildProofContext(input: BuildProofContextInput): ProofContextBundle;
|
|
16
|
+
export declare function getProofContextSummary(ctx: ProofContextBundle): string;
|
|
17
|
+
export declare function isWtsProof(proofType: number | bigint | string): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';import{getProofSceneByType}from'./proof-ledger.js';export const PROOF_CONTEXT_VERSION='1.0.0';export function buildProofContext(a){const b=a['proof_type']!==undefined?getProofSceneByType(a['proof_type']):undefined,c=a['about_address']?'entity_bound':'free_standing',d=[];return b?d['push']('proof_type\x20'+b['proof_type_range']+'\x20('+b['semantic']+')'):d['push']('proof_type\x20not\x20classified'),a['description']&&d['push']('description\x20\x22'+a['description']+'\x22'),d['push'](c==='entity_bound'?'bound\x20to\x20on-chain\x20entity':'free-standing\x20attestation'),d['push']('immutable\x20(freeze_object)'),{'scene':b,'binding':c,'immutable':!![],'summary':d['join']('\x20·\x20')};}export function getProofContextSummary(a){return a['summary'];}export function isWtsProof(a){const b=typeof a==='string'?BigInt(a):BigInt(a);return b===BigInt(WOWOK_WTS_PROOF_TYPE);}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const PROOF_LEDGER_VERSION = "1.0.0";
|
|
2
|
+
export type ProofFieldMutability = "immutable";
|
|
3
|
+
export interface ProofFieldEntry {
|
|
4
|
+
field: string;
|
|
5
|
+
move_field?: string;
|
|
6
|
+
value_type: string;
|
|
7
|
+
semantic: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
mutability: ProofFieldMutability;
|
|
10
|
+
error_code?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const PROOF_FIELDS: ProofFieldEntry[];
|
|
13
|
+
export interface ProofErrorEntry {
|
|
14
|
+
code: string;
|
|
15
|
+
value: number;
|
|
16
|
+
description: string;
|
|
17
|
+
related_field: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const PROOF_ERROR_CODES: ProofErrorEntry[];
|
|
20
|
+
export type ProofSceneClassification = "wts" | "custom_reserved" | "custom_user";
|
|
21
|
+
export interface ProofScene {
|
|
22
|
+
id: string;
|
|
23
|
+
classification: ProofSceneClassification;
|
|
24
|
+
proof_type_range: string;
|
|
25
|
+
semantic: string;
|
|
26
|
+
recommended: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare const PROOF_SCENES: ProofScene[];
|
|
29
|
+
export declare function getProofField(field: string): ProofFieldEntry | undefined;
|
|
30
|
+
export declare function getProofFieldsCount(): number;
|
|
31
|
+
export declare function getProofErrorByCode(code: string): ProofErrorEntry | undefined;
|
|
32
|
+
export declare function getProofErrorByValue(value: number): ProofErrorEntry | undefined;
|
|
33
|
+
export declare function getProofSceneByType(proofType: number | bigint | string): ProofScene | undefined;
|
|
34
|
+
export declare function inferProofSceneFromIntent(intent: string): ProofScene | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WOWOK_WTS_PROOF_TYPE,MAX_PROOF_SIZE,MAX_SERVER_PUBKEY_SIZE,MAX_SERVER_SIGNATURE_SIZE}from'@wowok/wowok';export const PROOF_LEDGER_VERSION='1.0.0';export const PROOF_FIELDS=[{'field':'description','value_type':'string','semantic':'Human-readable\x20one-line\x20summary\x20(audit/discoverability).','required':!![],'mutability':'immutable'},{'field':'proof','value_type':'string\x20(hex-encoded)','semantic':'Cryptographic\x20proof\x20content\x20(merkle\x20root\x20/\x20hash\x20digest\x20/\x20compact\x20attestation).','required':!![],'mutability':'immutable','error_code':'E_MAX_PROOF_SIZE'},{'field':'server_pubkey','value_type':'string\x20(hex-encoded)','semantic':'Raw\x20public\x20key\x20of\x20the\x20off-chain\x20signing\x20server\x20(not\x20a\x20certificate).','required':!![],'mutability':'immutable','error_code':'E_MAX_SERVER_PUBKEY_SIZE'},{'field':'server_signature','value_type':'string\x20(hex-encoded)','semantic':'Signature\x20produced\x20by\x20the\x20off-chain\x20server\x20over\x20`proof`\x20(or\x20documented\x20pre-image).','required':!![],'mutability':'immutable','error_code':'E_MAX_SERVER_SIGNATURE_SIZE'},{'field':'proof_type','value_type':'u64','semantic':'Proof\x20verification\x20classification\x20(1=WTS,\x202-100\x20reserved,\x20>100\x20user-defined).','required':!![],'mutability':'immutable'},{'field':'about_address','move_field':'about','value_type':'Option<address>','semantic':'On-chain\x20entity\x20this\x20proof\x20attests\x20to;\x20null\x20=\x20free-standing\x20statement.','required':![],'mutability':'immutable'},{'field':'item_count','move_field':'item_count','value_type':'Option<u64>','semantic':'Optional\x20count\x20of\x20items\x20in\x20the\x20off-chain\x20data\x20structure\x20(e.g.\x20merkle\x20leaf\x20count).','required':![],'mutability':'immutable'},{'field':'signer','value_type':'address','semantic':'The\x20tx\x20sender\x20who\x20created\x20the\x20proof\x20(frozen\x20at\x20creation).','required':!![],'mutability':'immutable'},{'field':'time','value_type':'u64\x20(timestamp\x20ms)','semantic':'Creation\x20timestamp\x20(clock::timestamp_ms).','required':!![],'mutability':'immutable'}];export const PROOF_ERROR_CODES=[{'code':'E_MAX_PROOF_SIZE','value':0x1,'description':'proof\x20string\x20length\x20exceeds\x20MAX_PROOF_SIZE\x20('+MAX_PROOF_SIZE+'\x20bytes).','related_field':'proof'},{'code':'E_MAX_SERVER_PUBKEY_SIZE','value':0x2,'description':'server_pubkey\x20length\x20exceeds\x20MAX_SERVER_PUBKEY_SIZE\x20('+MAX_SERVER_PUBKEY_SIZE+'\x20bytes).','related_field':'server_pubkey'},{'code':'E_MAX_SERVER_SIGNATURE_SIZE','value':0x3,'description':'server_signature\x20length\x20exceeds\x20MAX_SERVER_SIGNATURE_SIZE\x20('+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes).','related_field':'server_signature'}];export const PROOF_SCENES=[{'id':'proof_wts','classification':'wts','proof_type_range':''+WOWOK_WTS_PROOF_TYPE,'semantic':'Wowok\x20Will-To-Sign:\x20an\x20off-chain\x20server\x20attests\x20to\x20a\x20fact\x20and\x20signs\x20it\x20(server_pubkey\x20+\x20server_signature).','recommended':!![]},{'id':'proof_custom_reserved','classification':'custom_reserved','proof_type_range':'2-100','semantic':'Custom\x20proof\x20in\x20Wowok\x20reserved\x20range\x20—\x20NOT\x20recommended\x20(future\x20protocol\x20upgrades\x20may\x20reassign).','recommended':![]},{'id':'proof_custom_user','classification':'custom_user','proof_type_range':'>100','semantic':'User-defined\x20application-specific\x20proof\x20—\x20creator\x20documents\x20the\x20off-chain\x20verification\x20logic.','recommended':!![]}];export function getProofField(a){return PROOF_FIELDS['find'](b=>b['field']===a);}export function getProofFieldsCount(){return PROOF_FIELDS['length'];}export function getProofErrorByCode(a){return PROOF_ERROR_CODES['find'](b=>b['code']===a);}export function getProofErrorByValue(a){return PROOF_ERROR_CODES['find'](b=>b['value']===a);}export function getProofSceneByType(a){const b=typeof a==='string'?BigInt(a):BigInt(a);if(b===BigInt(WOWOK_WTS_PROOF_TYPE))return PROOF_SCENES['find'](c=>c['classification']==='wts');if(b>0x1n&&b<=0x64n)return PROOF_SCENES['find'](c=>c['classification']==='custom_reserved');if(b>0x64n)return PROOF_SCENES['find'](c=>c['classification']==='custom_user');return undefined;}export function inferProofSceneFromIntent(a){const b=a['toLowerCase']();if(/(wts|will.?to.?sign|server.?signed|attestation|merkle|kyc|timestamp)/['test'](b))return PROOF_SCENES['find'](c=>c['classification']==='wts');if(/(reserved|wowok.?defined|protocol.?reserved)/['test'](b))return PROOF_SCENES['find'](c=>c['classification']==='custom_reserved');if(/(custom|user.?defined|application.?specific)/['test'](b))return PROOF_SCENES['find'](c=>c['classification']==='custom_user');return undefined;}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ProofScene } from "./proof-ledger.js";
|
|
2
|
+
export declare const PROOF_PUZZLE_VERSION = "1.0.0";
|
|
3
|
+
export type ProofPuzzleDimension = "intent" | "fields";
|
|
4
|
+
export interface ProofIntentPuzzle {
|
|
5
|
+
scene?: ProofScene;
|
|
6
|
+
proof_type?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ProofFieldState {
|
|
9
|
+
field: string;
|
|
10
|
+
present: boolean;
|
|
11
|
+
required: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ProofPuzzle {
|
|
14
|
+
intent: ProofIntentPuzzle;
|
|
15
|
+
fields: ProofFieldState[];
|
|
16
|
+
}
|
|
17
|
+
export interface ProofPuzzleCompleteness {
|
|
18
|
+
complete: boolean;
|
|
19
|
+
missing_required: string[];
|
|
20
|
+
missing_optional: string[];
|
|
21
|
+
reason: string;
|
|
22
|
+
}
|
|
23
|
+
export interface InitProofPuzzleInput {
|
|
24
|
+
intent: string;
|
|
25
|
+
proof_type?: number;
|
|
26
|
+
description?: string;
|
|
27
|
+
proof?: string;
|
|
28
|
+
server_pubkey?: string;
|
|
29
|
+
server_signature?: string;
|
|
30
|
+
about_address?: string | null;
|
|
31
|
+
item_count?: number | bigint | string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare function initProofPuzzleFromIntent(input: InitProofPuzzleInput): ProofPuzzle;
|
|
34
|
+
export declare function checkProofPuzzleCompleteness(puzzle: ProofPuzzle): ProofPuzzleCompleteness;
|
|
35
|
+
export declare function generateProofConfirmationText(puzzle: ProofPuzzle): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';import{PROOF_FIELDS,inferProofSceneFromIntent}from'./proof-ledger.js';export const PROOF_PUZZLE_VERSION='1.0.0';export function initProofPuzzleFromIntent(a){const b=inferProofSceneFromIntent(a['intent']),c=a['proof_type']??(b?.['classification']==='wts'?WOWOK_WTS_PROOF_TYPE:undefined),d={'description':!!a['description'],'proof':!!a['proof'],'server_pubkey':!!a['server_pubkey'],'server_signature':!!a['server_signature'],'proof_type':c!==undefined,'about_address':a['about_address']!=null&&a['about_address']!=='','item_count':a['item_count']!=null&&a['item_count']!==''},e=PROOF_FIELDS['filter'](g=>g['field']in d||g['field']==='signer'||g['field']==='time')['map'](g=>{if(g['field']==='signer'||g['field']==='time')return{'field':g['field'],'present':!![],'required':g['required']};return{'field':g['field'],'present':!!d[g['field']],'required':g['required']};});return{'intent':{'scene':b,'proof_type':c},'fields':e};}export function checkProofPuzzleCompleteness(a){const b=a['fields']['filter'](e=>e['required']&&!e['present'])['map'](e=>e['field']),c=a['fields']['filter'](e=>!e['required']&&!e['present'])['map'](e=>e['field']),d=b['length']===0x0;return{'complete':d,'missing_required':b,'missing_optional':c,'reason':d?'All\x20required\x20proof\x20fields\x20present.':'Missing\x20required:\x20'+b['join'](',\x20')+'.'};}export function generateProofConfirmationText(a){const b=checkProofPuzzleCompleteness(a),d=a['intent']['scene'],e=d?'Scene:\x20'+d['id']+'\x20(proof_type\x20'+d['proof_type_range']+')':'Scene:\x20not\x20classified\x20(provide\x20more\x20intent)';return[e,b['reason']]['join']('\x0a');}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const PROOF_TEMPLATES_VERSION = "1.0.0";
|
|
2
|
+
export type ProofTemplateParamType = "string" | "u64" | "address" | "number";
|
|
3
|
+
export interface ProofTemplateParam {
|
|
4
|
+
name: string;
|
|
5
|
+
type: ProofTemplateParamType;
|
|
6
|
+
required: boolean;
|
|
7
|
+
description: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProofTemplate {
|
|
10
|
+
id: string;
|
|
11
|
+
scene_id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
proof_type: number;
|
|
15
|
+
params: ProofTemplateParam[];
|
|
16
|
+
about_address_required: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const PROOF_TEMPLATES: ProofTemplate[];
|
|
19
|
+
export declare function getProofTemplateById(id: string): ProofTemplate | undefined;
|
|
20
|
+
export declare function getProofTemplatesByScene(sceneId: string): ProofTemplate[];
|
|
21
|
+
export declare function suggestProofTemplateForScene(sceneId: string): ProofTemplate | undefined;
|
|
22
|
+
export declare function listProofTemplates(): ProofTemplate[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';export const PROOF_TEMPLATES_VERSION='1.0.0';export const PROOF_TEMPLATES=[{'id':'proof_wts_kyc','scene_id':'proof_wts','name':'WTS\x20KYC\x20attestation','description':'An\x20off-chain\x20server\x20attests\x20to\x20a\x20user\x27s\x20identity\x20(merkle\x20root\x20of\x20N\x20leaves).','proof_type':WOWOK_WTS_PROOF_TYPE,'params':[{'name':'proof','type':'string','required':!![],'description':'Merkle\x20root\x20hex'},{'name':'server_pubkey','type':'string','required':!![],'description':'Server\x20public\x20key\x20hex'},{'name':'server_signature','type':'string','required':!![],'description':'Server\x20signature\x20hex'},{'name':'description','type':'string','required':!![],'description':'One-line\x20summary'},{'name':'item_count','type':'u64','required':![],'description':'Merkle\x20leaf\x20count'},{'name':'about_address','type':'address','required':![],'description':'Attested\x20user\x20address'}],'about_address_required':!![]},{'id':'proof_wts_timestamp','scene_id':'proof_wts','name':'WTS\x20timestamp\x20attestation','description':'A\x20free-standing\x20server\x20timestamp\x20(no\x20on-chain\x20entity\x20binding).','proof_type':WOWOK_WTS_PROOF_TYPE,'params':[{'name':'proof','type':'string','required':!![],'description':'Timestamp\x20hash\x20hex'},{'name':'server_pubkey','type':'string','required':!![],'description':'Server\x20public\x20key\x20hex'},{'name':'server_signature','type':'string','required':!![],'description':'Server\x20signature\x20hex'},{'name':'description','type':'string','required':!![],'description':'One-line\x20summary'}],'about_address_required':![]},{'id':'proof_custom_attestation','scene_id':'proof_custom_user','name':'Custom\x20attestation','description':'Application-specific\x20proof\x20with\x20creator-documented\x20verification\x20logic.','proof_type':0xc8,'params':[{'name':'proof','type':'string','required':!![],'description':'Application-specific\x20proof\x20format'},{'name':'server_pubkey','type':'string','required':!![],'description':'Signer\x20public\x20key\x20hex'},{'name':'server_signature','type':'string','required':!![],'description':'Signer\x20signature\x20hex'},{'name':'description','type':'string','required':!![],'description':'One-line\x20summary'},{'name':'proof_type','type':'number','required':!![],'description':'>100\x20user-defined'},{'name':'about_address','type':'address','required':![],'description':'Optional\x20entity\x20binding'}],'about_address_required':![]}];export function getProofTemplateById(a){return PROOF_TEMPLATES['find'](b=>b['id']===a);}export function getProofTemplatesByScene(a){return PROOF_TEMPLATES['filter'](b=>b['scene_id']===a);}export function suggestProofTemplateForScene(a){return PROOF_TEMPLATES['find'](b=>b['scene_id']===a);}export function listProofTemplates(){return PROOF_TEMPLATES;}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const REGISTRAR_CONFIRM_VERSION = "1.0.0";
|
|
2
|
+
export type ConfirmSeverity = "block" | "warn" | "info";
|
|
3
|
+
export interface RegistrarConfirmItem {
|
|
4
|
+
id: string;
|
|
5
|
+
severity: ConfirmSeverity;
|
|
6
|
+
title: string;
|
|
7
|
+
description: string;
|
|
8
|
+
passed: boolean;
|
|
9
|
+
evidence?: string;
|
|
10
|
+
fix_hint?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RegistrarOpCheckInput {
|
|
13
|
+
typed_value_first_byte?: number;
|
|
14
|
+
typed_value_length?: number;
|
|
15
|
+
address_count?: number;
|
|
16
|
+
expects_fresh_resource_on_register?: boolean;
|
|
17
|
+
is_resource_transfer?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function preCheckRegistrarOp(input: RegistrarOpCheckInput): RegistrarConfirmItem[];
|
|
20
|
+
export declare function canProceedRegistrarOp(input: RegistrarOpCheckInput): {
|
|
21
|
+
canProceed: boolean;
|
|
22
|
+
blockers: RegistrarConfirmItem[];
|
|
23
|
+
warnings: RegistrarConfirmItem[];
|
|
24
|
+
info: RegistrarConfirmItem[];
|
|
25
|
+
};
|
|
26
|
+
export declare function formatRegistrarOpSummary(input: RegistrarOpCheckInput): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MAX_ADDRESS_COUNT,MAX_RECORD_LENGTH}from'@wowok/wowok';export const REGISTRAR_CONFIRM_VERSION='1.0.0';function checkTypedValue(a){if(a['typed_value_first_byte']===undefined)return{'id':'C-REGISTRAR-01','severity':'info','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20known\x20ValueType','description':'The\x20first\x20byte\x20encodes\x20ValueType;\x20the\x20Move\x20layer\x20only\x20checks\x20non-empty,\x20not\x20validity.','passed':!![],'evidence':'not\x20provided'};const b=a['typed_value_first_byte']!==0x0&&a['typed_value_first_byte']!==0xff;return{'id':'C-REGISTRAR-01','severity':b?'info':'warn','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20known\x20ValueType','description':'Move\x20validates\x20only\x20that\x20typed_value\x20is\x20non-empty;\x20a\x20misencoded\x20first\x20byte\x20deserializes\x20to\x20garbage\x20without\x20an\x20abort.','passed':b,'evidence':'first_byte=0x'+a['typed_value_first_byte']['toString'](0x10),'fix_hint':'Validate\x20the\x20first\x20byte\x20against\x20the\x20ValueType\x20enum\x20before\x20submitting.'};}function checkRecordLength(a){if(a['typed_value_length']===undefined)return{'id':'C-REGISTRAR-02','severity':'info','title':'typed_value\x20length\x20≤\x20MAX_RECORD_LENGTH\x20('+MAX_RECORD_LENGTH+')','description':'record()\x20aborts\x20with\x20ERecordLengthExceeded\x20(2)\x20above\x20the\x20cap.','passed':!![],'evidence':'not\x20provided'};const b=a['typed_value_length']>0x0&&a['typed_value_length']<=MAX_RECORD_LENGTH;return{'id':'C-REGISTRAR-02','severity':b?'info':'block','title':'typed_value\x20length\x20in\x20(0,\x20MAX_RECORD_LENGTH]\x20('+MAX_RECORD_LENGTH+')','description':'record()\x20requires\x20a\x20non-empty\x20typed_value\x20≤\x20MAX_RECORD_LENGTH='+MAX_RECORD_LENGTH+';\x20empty\x20aborts\x20with\x20ERecordTypeEmpty\x20(3).','passed':b,'evidence':'typed_value_length='+a['typed_value_length']+',\x20limit='+MAX_RECORD_LENGTH,'fix_hint':'Trim\x20the\x20record\x20payload\x20or\x20store\x20bulk\x20data\x20off-chain.'};}function checkAddressCount(a){if(a['address_count']===undefined)return{'id':'C-REGISTRAR-03','severity':'info','title':'address_count\x20below\x20MAX_ADDRESS_COUNT\x20('+MAX_ADDRESS_COUNT+')','description':'Entity/Registrar\x20ParentTables\x20are\x20bounded\x20by\x20MAX_ADDRESS_COUNT.','passed':!![],'evidence':'not\x20provided'};const b=a['address_count']<MAX_ADDRESS_COUNT;return{'id':'C-REGISTRAR-03','severity':b?'info':'warn','title':'address_count\x20below\x20MAX_ADDRESS_COUNT\x20('+MAX_ADDRESS_COUNT+')','description':'Registration\x20aborts\x20when\x20the\x20address\x20cap\x20MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20is\x20reached;\x20raising\x20it\x20needs\x20a\x20package\x20upgrade.','passed':b,'evidence':'address_count='+a['address_count']+',\x20limit='+MAX_ADDRESS_COUNT,'fix_hint':'Monitor\x20address_count\x20and\x20plan\x20a\x20package\x20upgrade\x20before\x20hitting\x20the\x20cap.'};}function checkIdempotency(a){if(!a['expects_fresh_resource_on_register'])return{'id':'C-REGISTRAR-04','severity':'info','title':'entity_register\x20is\x20idempotent','description':'entity_register\x20returns\x20the\x20existing\x20Resource\x20for\x20an\x20already-registered\x20user.','passed':!![],'evidence':'idempotency\x20understood'};return{'id':'C-REGISTRAR-04','severity':'warn','title':'entity_register\x20returns\x20the\x20existing\x20Resource\x20(not\x20a\x20fresh\x20one)','description':'After\x20a\x20forced\x20destroy,\x20use\x20entity_register_with_resource_forced\x20to\x20re-allocate;\x20entity_register\x20would\x20return\x20the\x20old\x20(now-invalid)\x20address.','passed':![],'evidence':'expects_fresh_resource_on_register=true','fix_hint':'Use\x20entity_register_with_resource_forced\x20only\x20when\x20the\x20old\x20Resource\x20is\x20truly\x20gone.'};}function checkTransfer(a){if(!a['is_resource_transfer'])return{'id':'C-REGISTRAR-05','severity':'info','title':'entity_resource_transfer\x20detaches\x20source\x20address','description':'Transferring\x20the\x20Resource\x20moves\x20it\x20to\x20a\x20new\x20address;\x20the\x20source\x20loses\x20the\x20binding.','passed':!![],'evidence':'not\x20transferring'};return{'id':'C-REGISTRAR-05','severity':'warn','title':'entity_resource_transfer\x20will\x20detach\x20Resource\x20from\x20source\x20address','description':'Downstream\x20services\x20keyed\x20on\x20the\x20source\x20address\x20lose\x20the\x20binding;\x20no\x20forwarding\x20stub\x20is\x20left\x20behind.','passed':![],'evidence':'is_resource_transfer=true','fix_hint':'Warn\x20that\x20old-address\x20bindings\x20break;\x20track\x20users\x20by\x20Resource\x20address.'};}export function preCheckRegistrarOp(a){return[checkTypedValue(a),checkRecordLength(a),checkAddressCount(a),checkIdempotency(a),checkTransfer(a)];}export function canProceedRegistrarOp(a){const b=preCheckRegistrarOp(a);return{'canProceed':b['every'](c=>c['severity']!=='block'||c['passed']),'blockers':b['filter'](c=>c['severity']==='block'&&!c['passed']),'warnings':b['filter'](c=>c['severity']==='warn'&&!c['passed']),'info':b['filter'](c=>c['severity']==='info')};}export function formatRegistrarOpSummary(a){const {canProceed:b,blockers:c,warnings:d}=canProceedRegistrarOp(a),e=[b?'✓\x20Registrar\x20operation\x20pre-check\x20PASSED':'✗\x20Registrar\x20operation\x20pre-check\x20FAILED',''];return c['length']>0x0&&(e['push']('BLOCKERS:'),c['forEach'](f=>e['push']('\x20\x20['+f['id']+']\x20'+f['title']+'\x20—\x20'+(f['evidence']??''))),e['push']('')),d['length']>0x0&&(e['push']('WARNINGS:'),d['forEach'](f=>e['push']('\x20\x20['+f['id']+']\x20'+f['title']+'\x20—\x20'+(f['evidence']??'')))),e['join']('\x0a');}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH}from'@wowok/wowok';const BIT_NO_INFO=0x0,BIT_LIKE=0x2,BIT_DISLIKE=0x4,BIT_AFFILIATION=0x8,R_REG_01={'rule':{'id':'R-REG-01','level':'HIGH','category':'lifecycle','title':'Entity\x20and\x20Registrar\x20are\x20system\x20singletons\x20—\x20cannot\x20be\x20migrated\x20post-deploy','description':'Entity\x20and\x20Registrar\x20are\x20created\x20once\x20at\x20package\x20init\x20by\x20@0x0\x20(registrar.move:152-166)\x20'+'and\x20are\x20globally\x20unique.\x20They\x20cannot\x20be\x20re-created,\x20migrated,\x20or\x20re-initialized.\x20If\x20'+'the\x20singleton\x27s\x20storage\x20layout\x20needs\x20to\x20change\x20(e.g.\x20ParentTable\x20schema),\x20the\x20only\x20'+'option\x20is\x20a\x20new\x20package\x20version\x20with\x20a\x20migration\x20path.\x20There\x20is\x20no\x20in-place\x20migration\x20'+'API.\x20All\x2022\x20objects\x20depend\x20on\x20these\x20singletons\x20via\x20affiliation,\x20so\x20a\x20migration\x20would\x20'+'cascade\x20to\x20every\x20object.','affected_stakeholders':['system','user'],'scenario':'Operator\x20wants\x20to\x20migrate\x20Entity\x20to\x20a\x20new\x20schema;\x20no\x20migration\x20API\x20exists','mitigation':'Confirm\x20the\x20schema\x20before\x20deployment.\x20For\x20schema\x20evolution,\x20plan\x20a\x20new\x20package\x20'+'version\x20with\x20an\x20explicit\x20migration\x20script.\x20Never\x20assume\x20the\x20singleton\x20can\x20be\x20\x27reset\x27.','auto_fixable':![]},'check':a=>{if(!a['expects_singleton_migration'])return null;return{...R_REG_01['rule'],'evidence':'expects_singleton_migration=true\x20(no\x20migration\x20API)'};}},R_REG_02={'rule':{'id':'R-REG-02','level':'MEDIUM','category':'structural','title':'MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20may\x20be\x20insufficient\x20for\x20large\x20deployments','description':'The\x20Entity\x20and\x20Registrar\x20ParentTables\x20are\x20bounded\x20by\x20MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20'+'(registrar.move).\x20Exceeding\x20the\x20cap\x20aborts\x20address\x20registration.\x20For\x20mass-market\x20'+('applications,\x20'+MAX_ADDRESS_COUNT+'\x20entries\x20may\x20be\x20too\x20few;\x20the\x20limit\x20is\x20a\x20single\x20')+'Move\x20constant\x20that\x20requires\x20a\x20package\x20upgrade\x20to\x20change.','affected_stakeholders':['system','user'],'scenario':'Popular\x20service\x20reaches\x205200\x20registered\x20users;\x20new\x20registrations\x20abort','mitigation':'Monitor\x20address_count.\x20Plan\x20a\x20package\x20upgrade\x20that\x20raises\x20MAX_ADDRESS_COUNT\x20before\x20'+'hitting\x20the\x20cap.\x20For\x20shardable\x20workloads,\x20consider\x20multiple\x20Entity\x20tables\x20in\x20a\x20future\x20'+'package\x20version.','auto_fixable':![]},'check':a=>{if(a['address_count']===undefined)return null;if(a['address_count']<MAX_ADDRESS_COUNT)return null;return{...R_REG_02['rule'],'evidence':'address_count='+a['address_count']+',\x20limit='+MAX_ADDRESS_COUNT};}},R_REG_03={'rule':{'id':'R-REG-03','level':'MEDIUM','category':'semantic','title':'Vote.info\x20uses\x20u8\x20bitmask\x20—\x20bits\x204-7\x20reserved,\x20future\x20expansion\x20must\x20stay\x20compatible','description':'Vote.info\x20is\x20a\x20u8\x20bitmask:\x20BIT_NO_INFO='+BIT_NO_INFO+',\x20BIT_LIKE='+BIT_LIKE+',\x20'+('BIT_DISLIKE='+BIT_DISLIKE+',\x20BIT_AFFILIATION='+BIT_AFFILIATION+'.\x20Bits\x204-7\x20are\x20reserved.\x20')+'A\x20future\x20version\x20that\x20repurposes\x20bits\x204-7\x20would\x20conflict\x20with\x20any\x20off-chain\x20code\x20that\x20'+'reads\x20the\x20raw\x20byte.\x20The\x20reserved\x20bits\x20MUST\x20be\x20treated\x20as\x20zero\x20today;\x20non-zero\x20values\x20'+'in\x20bits\x204-7\x20indicate\x20a\x20forward-incompatible\x20voter.','affected_stakeholders':['voter','system'],'scenario':'Future\x20version\x20assigns\x20bit\x204\x20to\x20a\x20new\x20flag;\x20old\x20indexers\x20misread\x20the\x20byte','mitigation':'Off-chain\x20code\x20must\x20mask\x20to\x20bits\x200-3\x20today\x20and\x20ignore\x20bits\x204-7.\x20When\x20a\x20new\x20flag\x20is\x20'+'assigned,\x20ship\x20a\x20coordinated\x20Move\x20+\x20SDK\x20+\x20indexer\x20update.','auto_fixable':![]},'check':a=>{if(!a['uses_reserved_vote_bits'])return null;return{...R_REG_03['rule'],'evidence':'uses_reserved_vote_bits=true\x20(bits\x204-7\x20are\x20reserved)'};}},R_REG_05={'rule':{'id':'R-REG-05','level':'MEDIUM','category':'cross_object','title':'affiliation\x20/\x20disaffiliation\x20emit\x20no\x20events\x20—\x20indexers\x20must\x20poll\x20Registrar.table','description':'affiliation,\x20disaffiliation,\x20and\x20affiliation_change\x20(registrar.move)\x20mutate\x20the\x20'+'Registrar\x20dependency\x20graph\x20but\x20emit\x20no\x20events.\x20External\x20indexers\x20that\x20track\x20the\x20'+'object-dependency\x20graph\x20cannot\x20rely\x20on\x20an\x20event\x20stream;\x20they\x20must\x20poll\x20the\x20'+'ParentTable,\x20which\x20is\x20expensive\x20as\x20the\x20graph\x20grows.','affected_stakeholders':['system'],'scenario':'Indexer\x20expects\x20an\x20AffiliationEvent;\x20none\x20is\x20emitted,\x20dependency\x20graph\x20is\x20stale','mitigation':'Indexers\x20should\x20poll\x20Registrar.table\x20on\x20a\x20cadence\x20and\x20diff.\x20Future\x20versions\x20may\x20add\x20'+'AffiliationEvent;\x20until\x20then,\x20do\x20not\x20build\x20critical\x20UX\x20on\x20affiliation\x20event\x20streams.','auto_fixable':![]},'check':a=>{if(!a['expects_affiliation_event'])return null;return{...R_REG_05['rule'],'evidence':'expects_affiliation_event=true\x20(no\x20events)'};}},R_REG_04={'rule':{'id':'R-REG-04','level':'LOW','category':'lifecycle','title':'entity_register\x20is\x20idempotent\x20—\x20returns\x20existing\x20Resource,\x20not\x20a\x20fresh\x20one','description':'entity_register\x20(registrar.move:177-187)\x20checks\x20whether\x20the\x20sender\x20already\x20has\x20an\x20'+'Entity\x20record.\x20If\x20so,\x20it\x20returns\x20the\x20existing\x20Resource\x20address\x20without\x20creating\x20a\x20new\x20'+'one.\x20Callers\x20who\x20expect\x20a\x20fresh\x20Resource\x20on\x20each\x20call\x20(e.g.\x20after\x20a\x20forced\x20destroy)\x20'+'will\x20silently\x20receive\x20the\x20old\x20one.\x20Use\x20entity_register_with_resource_forced\x20to\x20'+'force-reallocate,\x20and\x20only\x20when\x20the\x20old\x20Resource\x20is\x20truly\x20gone.','affected_stakeholders':['user'],'scenario':'User\x20destroys\x20their\x20Resource\x20then\x20calls\x20entity_register;\x20gets\x20the\x20old\x20(now-invalid)\x20address','mitigation':'Document\x20the\x20idempotent\x20behavior.\x20After\x20a\x20forced\x20destroy,\x20callers\x20MUST\x20use\x20'+'entity_register_with_resource_forced.\x20SDK\x20should\x20detect\x20destroyed\x20Resource\x20and\x20route\x20'+'accordingly.','auto_fixable':![]},'check':a=>{if(!a['expects_fresh_resource_on_register'])return null;return{...R_REG_04['rule'],'evidence':'expects_fresh_resource_on_register=true\x20(idempotent)'};}},R_REG_06={'rule':{'id':'R-REG-06','level':'LOW','category':'semantic','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20ValueType\x20—\x20convention\x20enforced\x20only\x20by\x20docs','description':'Record.typed_value\x20is\x20a\x20vector<u8>\x20whose\x20first\x20byte\x20encodes\x20the\x20ValueType\x20(registrar.move:111).\x20'+'The\x20Move\x20layer\x20validates\x20that\x20the\x20vector\x20is\x20non-empty\x20and\x20within\x20MAX_RECORD_LENGTH='+(MAX_RECORD_LENGTH+',\x20but\x20it\x20does\x20not\x20validate\x20that\x20the\x20first\x20byte\x20is\x20a\x20known\x20ValueType.\x20')+'Off-chain\x20consumers\x20must\x20agree\x20on\x20the\x20ValueType\x20byte\x20layout;\x20a\x20misencoded\x20record\x20will\x20'+'deserialize\x20to\x20garbage\x20without\x20an\x20on-chain\x20abort.\x20Record\x20count\x20is\x20bounded\x20by\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'.'),'affected_stakeholders':['user','system'],'scenario':'Caller\x20writes\x20a\x20record\x20with\x20first\x20byte\x200xFF;\x20no\x20on-chain\x20error,\x20but\x20consumers\x20cannot\x20decode','mitigation':'SDK\x20must\x20validate\x20the\x20first\x20byte\x20against\x20the\x20ValueType\x20enum\x20before\x20submitting.\x20'+'Document\x20the\x20ValueType\x20byte\x20layout\x20in\x20both\x20Move\x20and\x20SDK.\x20Add\x20a\x20sync\x20test\x20that\x20'+'asserts\x20the\x20ValueType\x20enum\x20matches\x20across\x20layers.','related_move_error':'ERecordTypeEmpty\x20(3)\x20—\x20only\x20catches\x20empty\x20typed_value','auto_fixable':![]},'check':a=>{if(!a['relies_on_typed_value_convention'])return null;return{...R_REG_06['rule'],'evidence':'relies_on_typed_value_convention=true\x20(docs-only\x20enforcement)'};}},R_REG_07={'rule':{'id':'R-REG-07','level':'MEDIUM','category':'cross_object','title':'entity_resource_transfer\x20detaches\x20Resource\x20from\x20the\x20source\x20address','description':'entity_resource_transfer(resource,\x20new_address,\x20ctx)\x20moves\x20the\x20Resource\x20backing\x20a\x20'+'user\x27s\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20'+'Resource\x20—\x20any\x20downstream\x20service\x20that\x20keyed\x20identity\x20on\x20the\x20source\x20address\x20loses\x20'+'the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','system'],'scenario':'User\x20transfers\x20Resource\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20services\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20Resource\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20'+'should\x20track\x20users\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20'+'window\x20where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_resource_transfer'])return null;return{...R_REG_07['rule'],'evidence':'is_resource_transfer=true\x20(source\x20loses\x20Resource)'};}},R_REG_08={'rule':{'id':'R-REG-08','level':'LOW','category':'semantic','title':'Vote.time\x20updates\x20on\x20every\x20toggle\x20—\x20including\x20like→no-like','description':'Vote.time\x20(registrar.move)\x20is\x20set\x20to\x20clock.timestamp_ms()\x20on\x20every\x20like/dislike\x20'+'operation,\x20including\x20toggles\x20that\x20remove\x20a\x20like\x20(like→no-like).\x20Consumers\x20who\x20'+'interpret\x20Vote.time\x20as\x20\x27last\x20liked\x20at\x27\x20will\x20be\x20confused\x20when\x20it\x20advances\x20on\x20an\x20'+'un-like.\x20The\x20field\x20semantically\x20means\x20\x27last\x20vote\x20op\x20time\x27,\x20not\x20\x27last\x20positive\x20vote\x27.','affected_stakeholders':['voter','system'],'scenario':'User\x20un-likes;\x20Vote.time\x20advances;\x20indexer\x20reads\x20it\x20as\x20\x27recently\x20liked\x27','mitigation':'Document\x20Vote.time\x20as\x20\x27last\x20vote\x20operation\x20time\x27.\x20For\x20\x27last\x20liked\x20at\x27\x20semantics,\x20'+'track\x20the\x20previous\x20Vote.info\x20state\x20and\x20only\x20record\x20time\x20when\x20BIT_LIKE\x20transitions\x20to\x20set.','auto_fixable':![]},'check':a=>{if(!a['expects_vote_time_only_on_like'])return null;return{...R_REG_08['rule'],'evidence':'expects_vote_time_only_on_like=true\x20(updates\x20on\x20toggle)'};}};export const REGISTRAR_RISK_RULES=[R_REG_01,R_REG_02,R_REG_03,R_REG_04,R_REG_05,R_REG_06,R_REG_07,R_REG_08];export const REGISTRAR_RISK_VERSION='1.0.0';export function checkRegistrarRisks(a){const b=[];for(const c of REGISTRAR_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getRegistrarRiskById(a){return REGISTRAR_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
|
|
1
|
+
import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH}from'@wowok/wowok';const BIT_NO_INFO=0x0,BIT_LIKE=0x2,BIT_DISLIKE=0x4,BIT_AFFILIATION=0x8,R_REG_01={'rule':{'id':'R-REG-01','level':'HIGH','category':'lifecycle','title':'Entity\x20and\x20Registrar\x20are\x20system\x20singletons\x20—\x20cannot\x20be\x20migrated\x20post-deploy','description':'Entity\x20and\x20Registrar\x20are\x20created\x20once\x20at\x20package\x20init\x20by\x20@0x0\x20(registrar.move:152-166)\x20'+'and\x20are\x20globally\x20unique.\x20They\x20cannot\x20be\x20re-created,\x20migrated,\x20or\x20re-initialized.\x20If\x20'+'the\x20singleton\x27s\x20storage\x20layout\x20needs\x20to\x20change\x20(e.g.\x20ParentTable\x20schema),\x20the\x20only\x20'+'option\x20is\x20a\x20new\x20package\x20version\x20with\x20a\x20migration\x20path.\x20There\x20is\x20no\x20in-place\x20migration\x20'+'API.\x20All\x2022\x20objects\x20depend\x20on\x20these\x20singletons\x20via\x20object-linker\x20bindings,\x20so\x20a\x20migration\x20would\x20'+'cascade\x20to\x20every\x20object.','affected_stakeholders':['system','user'],'scenario':'Operator\x20wants\x20to\x20migrate\x20Entity\x20to\x20a\x20new\x20schema;\x20no\x20migration\x20API\x20exists','mitigation':'Confirm\x20the\x20schema\x20before\x20deployment.\x20For\x20schema\x20evolution,\x20plan\x20a\x20new\x20package\x20'+'version\x20with\x20an\x20explicit\x20migration\x20script.\x20Never\x20assume\x20the\x20singleton\x20can\x20be\x20\x27reset\x27.','auto_fixable':![]},'check':a=>{if(!a['expects_singleton_migration'])return null;return{...R_REG_01['rule'],'evidence':'expects_singleton_migration=true\x20(no\x20migration\x20API)'};}},R_REG_02={'rule':{'id':'R-REG-02','level':'MEDIUM','category':'structural','title':'MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20may\x20be\x20insufficient\x20for\x20large\x20deployments','description':'The\x20Entity\x20and\x20Registrar\x20ParentTables\x20are\x20bounded\x20by\x20MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20'+'(registrar.move).\x20Exceeding\x20the\x20cap\x20aborts\x20address\x20registration.\x20For\x20mass-market\x20'+('applications,\x20'+MAX_ADDRESS_COUNT+'\x20entries\x20may\x20be\x20too\x20few;\x20the\x20limit\x20is\x20a\x20single\x20')+'Move\x20constant\x20that\x20requires\x20a\x20package\x20upgrade\x20to\x20change.','affected_stakeholders':['system','user'],'scenario':'Popular\x20service\x20reaches\x205200\x20registered\x20users;\x20new\x20registrations\x20abort','mitigation':'Monitor\x20address_count.\x20Plan\x20a\x20package\x20upgrade\x20that\x20raises\x20MAX_ADDRESS_COUNT\x20before\x20'+'hitting\x20the\x20cap.\x20For\x20shardable\x20workloads,\x20consider\x20multiple\x20Entity\x20tables\x20in\x20a\x20future\x20'+'package\x20version.','auto_fixable':![]},'check':a=>{if(a['address_count']===undefined)return null;if(a['address_count']<MAX_ADDRESS_COUNT)return null;return{...R_REG_02['rule'],'evidence':'address_count='+a['address_count']+',\x20limit='+MAX_ADDRESS_COUNT};}},R_REG_03={'rule':{'id':'R-REG-03','level':'MEDIUM','category':'semantic','title':'Vote.info\x20uses\x20u8\x20bitmask\x20—\x20bits\x204-7\x20reserved,\x20future\x20expansion\x20must\x20stay\x20compatible','description':'Vote.info\x20is\x20a\x20u8\x20bitmask:\x20BIT_NO_INFO='+BIT_NO_INFO+',\x20BIT_LIKE='+BIT_LIKE+',\x20'+('BIT_DISLIKE='+BIT_DISLIKE+',\x20BIT_AFFILIATION='+BIT_AFFILIATION+'.\x20Bits\x204-7\x20are\x20reserved.\x20')+'A\x20future\x20version\x20that\x20repurposes\x20bits\x204-7\x20would\x20conflict\x20with\x20any\x20off-chain\x20code\x20that\x20'+'reads\x20the\x20raw\x20byte.\x20The\x20reserved\x20bits\x20MUST\x20be\x20treated\x20as\x20zero\x20today;\x20non-zero\x20values\x20'+'in\x20bits\x204-7\x20indicate\x20a\x20forward-incompatible\x20voter.','affected_stakeholders':['voter','system'],'scenario':'Future\x20version\x20assigns\x20bit\x204\x20to\x20a\x20new\x20flag;\x20old\x20indexers\x20misread\x20the\x20byte','mitigation':'Off-chain\x20code\x20must\x20mask\x20to\x20bits\x200-3\x20today\x20and\x20ignore\x20bits\x204-7.\x20When\x20a\x20new\x20flag\x20is\x20'+'assigned,\x20ship\x20a\x20coordinated\x20Move\x20+\x20SDK\x20+\x20indexer\x20update.','auto_fixable':![]},'check':a=>{if(!a['uses_reserved_vote_bits'])return null;return{...R_REG_03['rule'],'evidence':'uses_reserved_vote_bits=true\x20(bits\x204-7\x20are\x20reserved)'};}},R_REG_05={'rule':{'id':'R-REG-05','level':'MEDIUM','category':'cross_object','title':'object-linker\x20affiliation\x20/\x20disaffiliation\x20emit\x20no\x20events\x20—\x20indexers\x20must\x20poll\x20object_linker\x20tables','description':'object_linker::affiliation_core/tx,\x20disaffiliation,\x20and\x20affiliation_change\x20(object_linker.move)\x20mutate\x20the\x20'+'binding\x20graph\x20but\x20emit\x20no\x20events.\x20External\x20indexers\x20that\x20track\x20the\x20'+'object-dependency\x20graph\x20cannot\x20rely\x20on\x20an\x20event\x20stream;\x20they\x20must\x20poll\x20the\x20'+'ParentTable,\x20which\x20is\x20expensive\x20as\x20the\x20graph\x20grows.','affected_stakeholders':['system'],'scenario':'Indexer\x20expects\x20an\x20AffiliationEvent;\x20none\x20is\x20emitted,\x20dependency\x20graph\x20is\x20stale','mitigation':'Indexers\x20should\x20poll\x20object_linker\x20tables\x20on\x20a\x20cadence\x20and\x20diff.\x20Future\x20versions\x20may\x20add\x20'+'AffiliationEvent;\x20until\x20then,\x20do\x20not\x20build\x20critical\x20UX\x20on\x20affiliation\x20event\x20streams.','auto_fixable':![]},'check':a=>{if(!a['expects_affiliation_event'])return null;return{...R_REG_05['rule'],'evidence':'expects_affiliation_event=true\x20(no\x20events)'};}},R_REG_04={'rule':{'id':'R-REG-04','level':'LOW','category':'lifecycle','title':'entity_register\x20is\x20idempotent\x20—\x20returns\x20existing\x20Resource,\x20not\x20a\x20fresh\x20one','description':'entity_register\x20(registrar.move:177-187)\x20checks\x20whether\x20the\x20sender\x20already\x20has\x20an\x20'+'Entity\x20record.\x20If\x20so,\x20it\x20returns\x20the\x20existing\x20Resource\x20address\x20without\x20creating\x20a\x20new\x20'+'one.\x20Callers\x20who\x20expect\x20a\x20fresh\x20Resource\x20on\x20each\x20call\x20(e.g.\x20after\x20a\x20forced\x20destroy)\x20'+'will\x20silently\x20receive\x20the\x20old\x20one.\x20Use\x20entity_register_with_resource_forced\x20to\x20'+'force-reallocate,\x20and\x20only\x20when\x20the\x20old\x20Resource\x20is\x20truly\x20gone.','affected_stakeholders':['user'],'scenario':'User\x20destroys\x20their\x20Resource\x20then\x20calls\x20entity_register;\x20gets\x20the\x20old\x20(now-invalid)\x20address','mitigation':'Document\x20the\x20idempotent\x20behavior.\x20After\x20a\x20forced\x20destroy,\x20callers\x20MUST\x20use\x20'+'entity_register_with_resource_forced.\x20SDK\x20should\x20detect\x20destroyed\x20Resource\x20and\x20route\x20'+'accordingly.','auto_fixable':![]},'check':a=>{if(!a['expects_fresh_resource_on_register'])return null;return{...R_REG_04['rule'],'evidence':'expects_fresh_resource_on_register=true\x20(idempotent)'};}},R_REG_06={'rule':{'id':'R-REG-06','level':'LOW','category':'semantic','title':'Record.typed_value\x20first\x20byte\x20is\x20a\x20ValueType\x20—\x20convention\x20enforced\x20only\x20by\x20docs','description':'Record.typed_value\x20is\x20a\x20vector<u8>\x20whose\x20first\x20byte\x20encodes\x20the\x20ValueType\x20(registrar.move:111).\x20'+'The\x20Move\x20layer\x20validates\x20that\x20the\x20vector\x20is\x20non-empty\x20and\x20within\x20MAX_RECORD_LENGTH='+(MAX_RECORD_LENGTH+',\x20but\x20it\x20does\x20not\x20validate\x20that\x20the\x20first\x20byte\x20is\x20a\x20known\x20ValueType.\x20')+'Off-chain\x20consumers\x20must\x20agree\x20on\x20the\x20ValueType\x20byte\x20layout;\x20a\x20misencoded\x20record\x20will\x20'+'deserialize\x20to\x20garbage\x20without\x20an\x20on-chain\x20abort.\x20Record\x20count\x20is\x20bounded\x20by\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'.'),'affected_stakeholders':['user','system'],'scenario':'Caller\x20writes\x20a\x20record\x20with\x20first\x20byte\x200xFF;\x20no\x20on-chain\x20error,\x20but\x20consumers\x20cannot\x20decode','mitigation':'SDK\x20must\x20validate\x20the\x20first\x20byte\x20against\x20the\x20ValueType\x20enum\x20before\x20submitting.\x20'+'Document\x20the\x20ValueType\x20byte\x20layout\x20in\x20both\x20Move\x20and\x20SDK.\x20Add\x20a\x20sync\x20test\x20that\x20'+'asserts\x20the\x20ValueType\x20enum\x20matches\x20across\x20layers.','related_move_error':'ERecordTypeEmpty\x20(3)\x20—\x20only\x20catches\x20empty\x20typed_value','auto_fixable':![]},'check':a=>{if(!a['relies_on_typed_value_convention'])return null;return{...R_REG_06['rule'],'evidence':'relies_on_typed_value_convention=true\x20(docs-only\x20enforcement)'};}},R_REG_07={'rule':{'id':'R-REG-07','level':'MEDIUM','category':'cross_object','title':'entity_resource_transfer\x20detaches\x20Resource\x20from\x20the\x20source\x20address','description':'entity_resource_transfer(resource,\x20new_address,\x20ctx)\x20moves\x20the\x20Resource\x20backing\x20a\x20'+'user\x27s\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20'+'Resource\x20—\x20any\x20downstream\x20service\x20that\x20keyed\x20identity\x20on\x20the\x20source\x20address\x20loses\x20'+'the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','system'],'scenario':'User\x20transfers\x20Resource\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20services\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20Resource\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20'+'should\x20track\x20users\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20'+'window\x20where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_resource_transfer'])return null;return{...R_REG_07['rule'],'evidence':'is_resource_transfer=true\x20(source\x20loses\x20Resource)'};}},R_REG_08={'rule':{'id':'R-REG-08','level':'LOW','category':'semantic','title':'Vote.time\x20updates\x20on\x20every\x20toggle\x20—\x20including\x20like→no-like','description':'Vote.time\x20(registrar.move)\x20is\x20set\x20to\x20clock.timestamp_ms()\x20on\x20every\x20like/dislike\x20'+'operation,\x20including\x20toggles\x20that\x20remove\x20a\x20like\x20(like→no-like).\x20Consumers\x20who\x20'+'interpret\x20Vote.time\x20as\x20\x27last\x20liked\x20at\x27\x20will\x20be\x20confused\x20when\x20it\x20advances\x20on\x20an\x20'+'un-like.\x20The\x20field\x20semantically\x20means\x20\x27last\x20vote\x20op\x20time\x27,\x20not\x20\x27last\x20positive\x20vote\x27.','affected_stakeholders':['voter','system'],'scenario':'User\x20un-likes;\x20Vote.time\x20advances;\x20indexer\x20reads\x20it\x20as\x20\x27recently\x20liked\x27','mitigation':'Document\x20Vote.time\x20as\x20\x27last\x20vote\x20operation\x20time\x27.\x20For\x20\x27last\x20liked\x20at\x27\x20semantics,\x20'+'track\x20the\x20previous\x20Vote.info\x20state\x20and\x20only\x20record\x20time\x20when\x20BIT_LIKE\x20transitions\x20to\x20set.','auto_fixable':![]},'check':a=>{if(!a['expects_vote_time_only_on_like'])return null;return{...R_REG_08['rule'],'evidence':'expects_vote_time_only_on_like=true\x20(updates\x20on\x20toggle)'};}};export const REGISTRAR_RISK_RULES=[R_REG_01,R_REG_02,R_REG_03,R_REG_04,R_REG_05,R_REG_06,R_REG_07,R_REG_08];export const REGISTRAR_RISK_VERSION='1.0.0';export function checkRegistrarRisks(a){const b=[];for(const c of REGISTRAR_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}export function getRegistrarRiskById(a){return REGISTRAR_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
|