@wowok/agent-mcp 3.1.3 → 3.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/config-audit.spec.d.ts +1 -0
- package/dist/config/config-audit.spec.js +1 -0
- package/dist/config/exposure.d.ts +108 -0
- package/dist/config/exposure.js +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +1 -1
- package/dist/config/judgment.d.ts +1228 -0
- package/dist/config/judgment.js +1 -0
- package/dist/config/judgment.spec.d.ts +1 -0
- package/dist/config/judgment.spec.js +1 -0
- package/dist/config/rule-engine.d.ts +299 -0
- package/dist/config/rule-engine.js +1 -0
- package/dist/config/rule-engine.spec.d.ts +1 -0
- package/dist/config/rule-engine.spec.js +1 -0
- package/dist/config/severity.d.ts +7 -0
- package/dist/config/severity.js +1 -0
- package/dist/customer/order-monitor.d.ts +3 -1
- package/dist/customer/order-monitor.js +1 -1
- package/dist/evaluation/acceptance.d.ts +1 -0
- package/dist/evaluation/acceptance.js +1 -1
- package/dist/evaluation/arbitration-game.js +1 -1
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/game-strategy.d.ts +2 -2
- package/dist/evaluation/game-strategy.js +1 -1
- package/dist/evaluation/match-operation.d.ts +2 -2
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/standards.d.ts +3 -25
- package/dist/evaluation/standards.js +1 -1
- package/dist/evaluation/types.d.ts +2 -1
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/custom-registry-file.js +1 -1
- package/dist/extensions/industry-audit.spec.d.ts +1 -0
- package/dist/extensions/industry-audit.spec.js +1 -0
- package/dist/extensions/industry-layers.d.ts +8 -0
- package/dist/extensions/industry-layers.js +1 -1
- package/dist/extensions/industry-pack.d.ts +2 -0
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/analyze.d.ts +3 -1
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/edge-schema.d.ts +1 -0
- package/dist/graph/onchain/edge-schema.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exploration.d.ts +28 -0
- package/dist/graph/onchain/exploration.js +1 -0
- package/dist/graph/onchain/exploration.spec.d.ts +1 -0
- package/dist/graph/onchain/exploration.spec.js +1 -0
- package/dist/graph/onchain/exposure.d.ts +18 -0
- package/dist/graph/onchain/exposure.js +1 -0
- package/dist/graph/onchain/exposure.spec.d.ts +1 -0
- package/dist/graph/onchain/exposure.spec.js +1 -0
- package/dist/graph/onchain/graph-policy.spec.d.ts +1 -0
- package/dist/graph/onchain/graph-policy.spec.js +1 -0
- package/dist/graph/onchain/index.d.ts +6 -0
- package/dist/graph/onchain/index.js +1 -1
- package/dist/graph/onchain/interest.js +1 -1
- package/dist/graph/onchain/interest.spec.js +1 -1
- package/dist/graph/onchain/names.js +1 -1
- package/dist/graph/onchain/names.spec.js +1 -1
- package/dist/graph/onchain/policy.d.ts +8 -0
- package/dist/graph/onchain/policy.js +1 -0
- package/dist/graph/onchain/proposal-graph.js +1 -1
- package/dist/graph/onchain/proposal-graph.spec.js +1 -1
- package/dist/graph/onchain/synthesis.d.ts +20 -0
- package/dist/graph/onchain/synthesis.js +1 -0
- package/dist/graph/onchain/synthesis.spec.d.ts +1 -0
- package/dist/graph/onchain/synthesis.spec.js +1 -0
- package/dist/graph/onchain/types.d.ts +11 -1
- package/dist/keeper/keeper.spec.js +1 -1
- package/dist/knowledge/alloc-audit-policy.spec.d.ts +1 -0
- package/dist/knowledge/alloc-audit-policy.spec.js +1 -0
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.d.ts +1 -1
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +4 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/allocation-templates.js +1 -1
- package/dist/knowledge/arb-risk.d.ts +6 -5
- package/dist/knowledge/arb-risk.js +1 -1
- package/dist/knowledge/arbitration-ledger.d.ts +4 -4
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-puzzle.d.ts +1 -1
- package/dist/knowledge/arbitration-puzzle.js +1 -1
- package/dist/knowledge/arbitration-risk.d.ts +4 -1
- package/dist/knowledge/arbitration-risk.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +289 -0
- package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
- package/dist/knowledge/baselines/rules/alloc_audit.json +290 -0
- package/dist/knowledge/baselines/rules/allocation.json +492 -0
- package/dist/knowledge/baselines/rules/arb.json +155 -0
- package/dist/knowledge/baselines/rules/arbitration.json +366 -0
- package/dist/knowledge/baselines/rules/bridge.json +197 -0
- package/dist/knowledge/baselines/rules/contact.json +152 -0
- package/dist/knowledge/baselines/rules/demand.json +158 -0
- package/dist/knowledge/baselines/rules/graph.json +453 -0
- package/dist/knowledge/baselines/rules/guard.json +981 -0
- package/dist/knowledge/baselines/rules/machine.json +706 -0
- package/dist/knowledge/baselines/rules/order.json +549 -0
- package/dist/knowledge/baselines/rules/payment.json +205 -0
- package/dist/knowledge/baselines/rules/permission.json +330 -0
- package/dist/knowledge/baselines/rules/personal.json +139 -0
- package/dist/knowledge/baselines/rules/progress.json +346 -0
- package/dist/knowledge/baselines/rules/proof.json +158 -0
- package/dist/knowledge/baselines/rules/registrar.json +159 -0
- package/dist/knowledge/baselines/rules/repository.json +244 -0
- package/dist/knowledge/baselines/rules/resource.json +117 -0
- package/dist/knowledge/baselines/rules/reward.json +471 -0
- package/dist/knowledge/baselines/rules/service.json +595 -0
- package/dist/knowledge/baselines/rules/treasury.json +440 -0
- package/dist/knowledge/baselines/rules/util.json +101 -0
- package/dist/knowledge/bridge-risk.d.ts +6 -5
- package/dist/knowledge/bridge-risk.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +26 -0
- package/dist/knowledge/builtin-templates.js +1 -0
- package/dist/knowledge/contact-risk.d.ts +6 -5
- package/dist/knowledge/contact-risk.js +1 -1
- package/dist/knowledge/demand-risk.d.ts +6 -5
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/facts-sync.spec.d.ts +1 -0
- package/dist/knowledge/facts-sync.spec.js +1 -0
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.d.ts +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-risk.d.ts +4 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +10 -2
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-ledger.js +1 -1
- package/dist/knowledge/machine-risk.d.ts +4 -1
- package/dist/knowledge/machine-risk.js +1 -1
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/migration-preflight.js +1 -1
- package/dist/knowledge/operation-dictionary.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/order-puzzle.d.ts +3 -3
- package/dist/knowledge/order-puzzle.js +1 -1
- package/dist/knowledge/order-risk.d.ts +6 -3
- package/dist/knowledge/order-risk.js +1 -1
- package/dist/knowledge/order-templates.js +1 -1
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/passport-templates.js +1 -1
- package/dist/knowledge/payment-risk.d.ts +8 -6
- package/dist/knowledge/payment-risk.js +1 -1
- package/dist/knowledge/payment-tracker.js +1 -1
- package/dist/knowledge/permission-ledger.js +1 -1
- package/dist/knowledge/permission-puzzle.d.ts +12 -12
- package/dist/knowledge/permission-puzzle.js +1 -1
- package/dist/knowledge/permission-risk.d.ts +4 -7
- package/dist/knowledge/permission-risk.js +1 -1
- package/dist/knowledge/permission-templates.js +1 -1
- package/dist/knowledge/personal-risk.d.ts +6 -5
- package/dist/knowledge/personal-risk.js +1 -1
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/progress-puzzle.d.ts +2 -2
- package/dist/knowledge/progress-puzzle.js +1 -1
- package/dist/knowledge/progress-risk.d.ts +4 -1
- package/dist/knowledge/progress-risk.js +1 -1
- package/dist/knowledge/progress-templates.js +1 -1
- package/dist/knowledge/proof-risk.d.ts +6 -5
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/puzzle-projections.js +1 -1
- package/dist/knowledge/recipient-constraint.d.ts +20 -1
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/registrar-risk.d.ts +6 -5
- package/dist/knowledge/registrar-risk.js +1 -1
- package/dist/knowledge/repository-risk.d.ts +7 -6
- package/dist/knowledge/repository-risk.js +1 -1
- package/dist/knowledge/resource-risk.d.ts +6 -5
- package/dist/knowledge/resource-risk.js +1 -1
- package/dist/knowledge/reward-ledger.d.ts +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-puzzle.d.ts +2 -2
- package/dist/knowledge/reward-puzzle.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +4 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/rule-node-analyzers.spec.js +1 -1
- package/dist/knowledge/rule-outcome.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +2 -2
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-allocator-audit-node.js +1 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/service-puzzle.d.ts +2 -2
- package/dist/knowledge/service-puzzle.js +1 -1
- package/dist/knowledge/service-risk-node.js +1 -1
- package/dist/knowledge/service-risk.d.ts +4 -1
- package/dist/knowledge/service-risk.js +1 -1
- package/dist/knowledge/service-templates.js +1 -1
- package/dist/knowledge/strategy-manuals.d.ts +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +84 -0
- package/dist/knowledge/template-loader.js +1 -0
- package/dist/knowledge/template-loader.spec.d.ts +1 -0
- package/dist/knowledge/template-loader.spec.js +1 -0
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +17 -0
- package/dist/knowledge/template-scanner.js +1 -0
- package/dist/knowledge/template-scanner.spec.d.ts +1 -0
- package/dist/knowledge/template-scanner.spec.js +1 -0
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/treasury-ledger.d.ts +1 -1
- package/dist/knowledge/treasury-ledger.js +1 -1
- package/dist/knowledge/treasury-puzzle.d.ts +3 -3
- package/dist/knowledge/treasury-puzzle.js +1 -1
- package/dist/knowledge/treasury-risk.d.ts +4 -1
- package/dist/knowledge/treasury-risk.js +1 -1
- package/dist/knowledge/treasury-templates.js +1 -1
- package/dist/knowledge/util-risk.d.ts +6 -5
- package/dist/knowledge/util-risk.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/arbitrator-interest.js +1 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/analyzer.js +1 -1
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.js +1 -1
- package/dist/persona/persona-audit.spec.d.ts +1 -0
- package/dist/persona/persona-audit.spec.js +1 -0
- package/dist/persona/types.d.ts +2 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/facet-money.d.ts +11 -0
- package/dist/playbooks/service-build/facet-money.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.d.ts +17 -0
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +2 -2
- package/dist/playbooks/service-build/migration-planner.d.ts +43 -0
- package/dist/playbooks/service-build/migration-planner.js +1 -0
- package/dist/playbooks/service-build/object-panorama.d.ts +42 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
- package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
- package/dist/playbooks/service-build/risk-aggregator.js +1 -1
- package/dist/playbooks/service-build/semantic-graph.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +53 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -1
- package/dist/playbooks/service-build/topology-query.js +1 -1
- package/dist/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
- package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/machine.js +1 -1
- package/dist/review/order.js +1 -1
- package/dist/review/service.js +1 -1
- package/dist/review/types.d.ts +7 -0
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +207 -0
- package/dist/schema/benchmark-migration/index.js +1 -0
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.d.ts +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +5 -5
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/contact.d.ts +1 -1
- package/dist/schema/call/demand.d.ts +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/machine.d.ts +5 -5
- package/dist/schema/call/order.d.ts +3 -3
- package/dist/schema/call/payment.js +1 -1
- package/dist/schema/call/permission-handler.d.ts +1 -1
- package/dist/schema/call/permission-handler.js +1 -1
- package/dist/schema/call/permission.d.ts +16 -16
- package/dist/schema/call/permission.js +1 -1
- package/dist/schema/call/personal.d.ts +8 -8
- package/dist/schema/call/personal.js +1 -1
- package/dist/schema/call/progress.d.ts +3 -3
- package/dist/schema/call/repository.d.ts +11 -11
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +7 -7
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +1 -1
- package/dist/schema/common/index.d.ts +6 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/config/index.d.ts +50 -1
- package/dist/schema/config/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +27 -11
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +5 -5
- package/dist/schema/goal/planning.d.ts +15 -15
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/interaction/index.d.ts +1 -1
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +26 -26
- package/dist/schema/operations.d.ts +33 -33
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +4708 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +232 -25
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +35 -35
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workflow/index.d.ts +1 -1
- package/dist/schema/workspace/index.d.ts +53 -0
- package/dist/schema/workspace/index.js +1 -1
- package/dist/schema-query-impl/index.d.ts +9 -0
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/benchmark_migration_operation.output.json +793 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +83 -0
- package/dist/schemas/bridge_operation.schema.json +5 -5
- package/dist/schemas/config_operation.output.json +252 -0
- package/dist/schemas/config_operation.schema.json +21 -1
- package/dist/schemas/evaluation_operation.output.json +22 -10
- package/dist/schemas/goal_operation.schema.json +8 -8
- package/dist/schemas/guard2file.schema.json +1 -1
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/machineNode2file.schema.json +1 -1
- package/dist/schemas/messenger_operation.schema.json +24 -12
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.output.json +4 -2
- package/dist/schemas/onchain_operations.schema.json +189 -139
- package/dist/schemas/onchain_operations_allocation.schema.json +13 -11
- package/dist/schemas/onchain_operations_arbitration.schema.json +10 -8
- package/dist/schemas/onchain_operations_contact.schema.json +7 -5
- package/dist/schemas/onchain_operations_demand.schema.json +7 -5
- package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +5 -3
- package/dist/schemas/onchain_operations_machine.schema.json +22 -18
- package/dist/schemas/onchain_operations_order.schema.json +11 -7
- package/dist/schemas/onchain_operations_payment.schema.json +3 -3
- package/dist/schemas/onchain_operations_permission.schema.json +19 -11
- package/dist/schemas/onchain_operations_personal.schema.json +16 -10
- package/dist/schemas/onchain_operations_progress.schema.json +11 -7
- package/dist/schemas/onchain_operations_proof.schema.json +5 -3
- package/dist/schemas/onchain_operations_repository.schema.json +12 -8
- package/dist/schemas/onchain_operations_reward.schema.json +11 -9
- package/dist/schemas/onchain_operations_service.schema.json +28 -22
- package/dist/schemas/onchain_operations_treasury.schema.json +11 -9
- package/dist/schemas/onchain_table_data.output.json +27 -17
- package/dist/schemas/persona_operation.output.json +15875 -1
- package/dist/schemas/persona_operation.schema.json +3056 -478
- package/dist/schemas/query_toolkit.output.json +343 -63
- package/dist/schemas/query_toolkit.schema.json +1 -1
- package/dist/schemas/workflow_operation.schema.json +4 -2
- package/dist/schemas/workspace_operation.output.json +181 -1
- package/dist/schemas/workspace_operation.schema.json +61 -2
- package/dist/strategy/scorecard.js +1 -1
- package/dist/tools/handlers/benchmark-migration.d.ts +2 -0
- package/dist/tools/handlers/benchmark-migration.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/workspace.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.d.ts +3 -0
- package/dist/tools/move-fn-index.gen.js +1 -0
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/config.js +1 -1
- package/dist/tools/registry/evaluation.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/sanitize-output.d.ts +3 -0
- package/dist/tools/sanitize-output.js +1 -0
- package/dist/tools/sanitize-output.spec.d.ts +1 -0
- package/dist/tools/sanitize-output.spec.js +1 -0
- package/package.json +9 -4
- package/dist/knowledge/baselines/evaluation-baselines.json +0 -79
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type Facts, type FindingExposure } from "../config/rule-engine.js";
|
|
1
2
|
import { type PermissionScene } from "./permission-ledger.js";
|
|
2
|
-
export type RiskLevel = "
|
|
3
|
+
export type RiskLevel = "critical" | "high" | "medium" | "low";
|
|
3
4
|
export type RiskCategory = "structural" | "semantic" | "authority" | "lifecycle" | "cross_object";
|
|
4
5
|
export interface PermissionRisk {
|
|
5
6
|
id: string;
|
|
@@ -11,14 +12,9 @@ export interface PermissionRisk {
|
|
|
11
12
|
scenario: string;
|
|
12
13
|
mitigation: string;
|
|
13
14
|
evidence?: string;
|
|
15
|
+
exposure?: FindingExposure;
|
|
14
16
|
}
|
|
15
17
|
export type PermissionStakeholder = "owner" | "admin" | "entity" | "user" | "system";
|
|
16
|
-
export interface RiskRule {
|
|
17
|
-
id: string;
|
|
18
|
-
category: RiskCategory;
|
|
19
|
-
trigger: string;
|
|
20
|
-
check: (ctx: RiskCheckContext) => PermissionRisk | null;
|
|
21
|
-
}
|
|
22
18
|
export interface RiskCheckContext {
|
|
23
19
|
object?: string | null;
|
|
24
20
|
description?: string;
|
|
@@ -60,6 +56,7 @@ export interface RiskCheckContext {
|
|
|
60
56
|
current_entity_count?: number;
|
|
61
57
|
target_objects_types?: string[];
|
|
62
58
|
}
|
|
59
|
+
export declare function permissionRiskFacts(ctx: RiskCheckContext): Facts;
|
|
63
60
|
export declare const PERMISSION_RISK_VERSION = "1.0.0";
|
|
64
61
|
export interface PermissionRiskAssessment {
|
|
65
62
|
summary: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{USER_DEFINED_PERM_INDEX_START,MAX_ENTITY_COUNT,MAX_PERM_FOR_ENTITY,MAX_ADMIN_COUNT}from'@wowok/wowok';import{isBuiltinPermission,findSceneByPermissionIndex}from'./permission-ledger.js';const R_P_01={'id':'R-P-1-01','category':'structural','trigger':'Custom\x20permission\x20index\x20<\x20USER_DEFINED_PERM_INDEX_START\x20(1000)\x20and\x20not\x20builtin','check':a=>{if(!a['table'])return null;if('index'in a['table']&&typeof a['table']['index']==='number'){const b=a['table']['index'];if(b<USER_DEFINED_PERM_INDEX_START&&!isBuiltinPermission(b))return{'id':'R-P-1-01','level':'CRITICAL','category':'structural','title':'Invalid\x20permission\x20index\x20(<\x201000\x20and\x20not\x20builtin)','description':'Permission\x20index\x20'+b+'\x20is\x20below\x20USER_DEFINED_PERM_INDEX_START\x20('+USER_DEFINED_PERM_INDEX_START+')\x20and\x20not\x20a\x20builtin\x20permission.\x20Custom\x20indexes\x20must\x20be\x20>=\x201000.','affected_stakeholders':['owner','admin','system'],'scenario':'User\x20defines\x20a\x20custom\x20permission\x20with\x20index\x20<\x201000','mitigation':'Use\x20index\x20>=\x20'+USER_DEFINED_PERM_INDEX_START+'\x20for\x20custom\x20permissions,\x20or\x20use\x20a\x20builtin\x20index\x20if\x20applicable','evidence':'index='+b};}return null;}},R_P_02={'id':'R-P-1-02','category':'structural','trigger':'Entity\x20count\x20exceeds\x20MAX_ENTITY_COUNT\x20(1000)','check':a=>{const b=a['current_entity_count']??0x0;if(b>MAX_ENTITY_COUNT)return{'id':'R-P-1-02','level':'HIGH','category':'structural','title':'Entity\x20count\x20exceeds\x20limit','description':'Permission\x20has\x20'+b+'\x20entities,\x20exceeds\x20MAX_ENTITY_COUNT\x20'+MAX_ENTITY_COUNT,'affected_stakeholders':['owner','admin'],'scenario':'Adding\x20entities\x20beyond\x20the\x20protocol\x20limit','mitigation':'Split\x20into\x20multiple\x20Permission\x20objects\x20or\x20remove\x20inactive\x20entities','evidence':'entity_count='+b};return null;}},R_P_03={'id':'R-P-1-03','category':'structural','trigger':'Per-entity\x20permission\x20count\x20exceeds\x20MAX_PERM_FOR_ENTITY\x20(1000)','check':a=>{if(a['table']&&'index'in a['table']&&Array['isArray'](a['table']['index'])){if(a['table']['index']['length']>MAX_PERM_FOR_ENTITY)return{'id':'R-P-1-03','level':'HIGH','category':'structural','title':'Per-entity\x20permission\x20count\x20exceeds\x20limit','description':'Entity\x20'+a['table']['entity']+'\x20has\x20'+a['table']['index']['length']+'\x20permissions,\x20exceeds\x20MAX_PERM_FOR_ENTITY\x20'+MAX_PERM_FOR_ENTITY,'affected_stakeholders':['entity','admin'],'scenario':'Granting\x20too\x20many\x20permissions\x20to\x20one\x20entity','mitigation':'Consolidate\x20similar\x20permissions\x20or\x20split\x20entity\x20into\x20multiple\x20roles','evidence':'perm_count='+a['table']['index']['length']};}return null;}},R_P_04={'id':'R-P-1-04','category':'structural','trigger':'Admin\x20count\x20exceeds\x20MAX_ADMIN_COUNT\x20(500)','check':a=>{if(a['admin']){const b=a['admin']['op']==='add'?(a['current_admin_count']??0x0)+a['admin']['addresses']['length']:a['admin']['addresses']['length'];if(b>MAX_ADMIN_COUNT)return{'id':'R-P-1-04','level':'HIGH','category':'structural','title':'Admin\x20count\x20exceeds\x20limit','description':'Admin\x20count\x20would\x20be\x20'+b+',\x20exceeds\x20MAX_ADMIN_COUNT\x20'+MAX_ADMIN_COUNT,'affected_stakeholders':['owner','admin'],'scenario':'Adding\x20too\x20many\x20admins','mitigation':'Remove\x20inactive\x20admins\x20before\x20adding\x20new\x20ones','evidence':'admin_count='+b};}return null;}},R_P_2_01={'id':'R-P-2-01','category':'semantic','trigger':'Builtin\x20permission\x20index\x20used\x20outside\x20its\x20host\x20object\x20scene','check':a=>{if(!a['table']||!('index'in a['table'])||typeof a['table']['index']!=='number')return null;const b=a['table']['index'];if(!isBuiltinPermission(b))return null;const c=findSceneByPermissionIndex(b);if(!c)return null;if(a['target_objects_types']&&a['target_objects_types']['length']>0x0){const d=a['target_objects_types']['filter'](e=>e!==c['host_object']);if(d['length']>0x0)return{'id':'R-P-2-01','level':'HIGH','category':'semantic','title':'Permission\x20index\x20host\x20object\x20mismatch','description':'Permission\x20'+b+'\x20('+c['builtin_indexes']['find'](e=>e['index']===b)?.['name']+')\x20is\x20for\x20'+c['host_object']+',\x20but\x20apply\x20targets:\x20'+d['join'](',\x20'),'affected_stakeholders':['owner','admin'],'scenario':'Using\x20SERVICE_*\x20index\x20on\x20Machine\x20object','mitigation':'Use\x20'+c['host_object']+'-specific\x20permission\x20indexes\x20for\x20'+d['join'](',\x20'),'evidence':'index='+b+',\x20targets='+d['join'](',')};}return null;}},R_P_2_02={'id':'R-P-2-02','category':'semantic','trigger':'Custom\x20permission\x20(>=\x201000)\x20without\x20remark','check':a=>{if(!a['table']||!('index'in a['table'])||typeof a['table']['index']!=='number')return null;const b=a['table']['index'];if(b<USER_DEFINED_PERM_INDEX_START)return null;if(a['remark']&&a['remark']['op']==='set'&&a['remark']['index']===b)return null;return{'id':'R-P-2-02','level':'LOW','category':'semantic','title':'Custom\x20permission\x20without\x20remark','description':'Custom\x20permission\x20'+b+'\x20has\x20no\x20remark;\x20future\x20maintainers\x20won\x27t\x20know\x20its\x20purpose','affected_stakeholders':['admin'],'scenario':'Adding\x20custom\x20permission\x20without\x20documentation','mitigation':'Add\x20remark:\x20{\x20op:\x20\x22set\x22,\x20index:\x20'+b+',\x20remark:\x20\x22<purpose>\x22\x20}','evidence':'index='+b};}},R_P_3_01={'id':'R-P-3-01','category':'authority','trigger':'Permission\x20over-concentration:\x20owner\x20is\x20the\x20only\x20admin','check':a=>{if(!a['admin']||a['admin']['op']!=='set')return null;if(a['admin']['addresses']['length']===0x1)return{'id':'R-P-3-01','level':'MEDIUM','category':'authority','title':'Permission\x20over-concentration','description':'Only\x20one\x20admin\x20(likely\x20owner);\x20loss\x20of\x20owner\x20key\x20means\x20permanent\x20lockout','affected_stakeholders':['owner'],'scenario':'Single-admin\x20Permission','mitigation':'Add\x201-2\x20backup\x20admins\x20with\x20limited\x20permission\x20indexes','evidence':'admin_count=1'};return null;}},R_P_3_02={'id':'R-P-3-02','category':'authority','trigger':'Permission\x20over-dispersion:\x20admin\x20count\x20>\x2050','check':a=>{if(!a['admin'])return null;const b=a['admin']['op']==='set'?a['admin']['addresses']['length']:a['current_admin_count']??0x0;if(b>0x32)return{'id':'R-P-3-02','level':'MEDIUM','category':'authority','title':'Permission\x20over-dispersion','description':b+'\x20admins\x20increases\x20coordination\x20cost\x20and\x20key-management\x20risk','affected_stakeholders':['owner','admin'],'scenario':'Large\x20admin\x20committee','mitigation':'Use\x20multi-sig\x20or\x20hierarchical\x20admin\x20structure','evidence':'admin_count='+b};return null;}},R_P_3_03={'id':'R-P-3-03','category':'authority','trigger':'UM\x20is\x20owner\x20self-reference','check':a=>{if(a['um']===undefined||a['um']===null)return null;if(a['builder']&&a['um']===a['builder'])return{'id':'R-P-3-03','level':'MEDIUM','category':'authority','title':'UM\x20is\x20owner\x20self-reference','description':'Setting\x20UM\x20to\x20owner\x20address\x20defeats\x20separation\x20of\x20concerns','affected_stakeholders':['owner'],'scenario':'Owner\x20delegates\x20UM\x20to\x20self','mitigation':'Use\x20a\x20separate\x20Contact\x20object\x20address\x20for\x20UM','evidence':'um='+a['um']};return null;}},R_P_4_01={'id':'R-P-4-01','category':'lifecycle','trigger':'Ownership\x20transfer\x20operation\x20(builder\x20field\x20set)','check':a=>{if(!a['builder'])return null;return{'id':'R-P-4-01','level':'HIGH','category':'lifecycle','title':'Ownership\x20transfer\x20—\x20irreversible','description':'Transferring\x20Permission\x20to\x20'+a['builder']+'.\x20Once\x20executed,\x20original\x20owner\x20loses\x20ALL\x20control\x20permanently.','affected_stakeholders':['owner'],'scenario':'Owner\x20transfers\x20Permission\x20to\x20new\x20address','mitigation':'1)\x20Verify\x20new\x20owner\x20address\x20twice.\x202)\x20Export\x20Permission\x20JSON\x20before\x20transfer.\x203)\x20Coordinate\x20with\x20new\x20owner\x20to\x20confirm\x20receipt.','evidence':'new_owner='+a['builder']};}},R_P_4_02={'id':'R-P-4-02','category':'lifecycle','trigger':'Apply\x20to\x20multiple\x20objects\x20at\x20once','check':a=>{if(!a['apply']||a['apply']['length']===0x0)return null;if(a['apply']['length']>0x3)return{'id':'R-P-4-02','level':'MEDIUM','category':'lifecycle','title':'Batch\x20apply\x20to\x20multiple\x20objects','description':'Applying\x20Permission\x20to\x20'+a['apply']['length']+'\x20objects\x20at\x20once;\x20if\x20any\x20object\x20type\x20mismatches,\x20transaction\x20may\x20fail\x20or\x20silently\x20misalign','affected_stakeholders':['owner'],'scenario':'Batch\x20apply\x20across\x20heterogeneous\x20objects','mitigation':'Apply\x20to\x201-3\x20objects\x20at\x20a\x20time;\x20verify\x20each\x20object\x20type\x20matches\x20permission\x20indexes','evidence':'apply_count='+a['apply']['length']};return null;}},R_P_4_03={'id':'R-P-4-03','category':'lifecycle','trigger':'Entity\x20replace\x20operation\x20(destructive)','check':a=>{if(!a['entity']||a['entity']['op']!=='replace')return null;return{'id':'R-P-4-03','level':'MEDIUM','category':'lifecycle','title':'Entity\x20replace\x20—\x20destructive','description':'Replacing\x20'+a['entity']['entity1']+'\x20with\x20'+a['entity']['entity2']+';\x20entity1\x20loses\x20ALL\x20permissions\x20permanently','affected_stakeholders':['entity'],'scenario':'Replacing\x20a\x20user\x20who\x20left\x20the\x20organization','mitigation':'Prefer\x20\x27copy\x27\x20over\x20\x27replace\x27\x20if\x20entity1\x20should\x20retain\x20permissions','evidence':'entity1='+a['entity']['entity1']+',\x20entity2='+a['entity']['entity2']};}},R_P_5_01={'id':'R-P-5-01','category':'cross_object','trigger':'Apply\x20to\x20Progress\x20object\x20(Permission\x20becomes\x20immutable\x20on\x20bind)','check':a=>{if(!a['apply'])return null;if(a['target_objects_types']?.['includes']('Progress'))return{'id':'R-P-5-01','level':'MEDIUM','category':'cross_object','title':'Apply\x20to\x20Progress\x20—\x20post-bind\x20mutability\x20limited','description':'Once\x20Permission\x20is\x20bound\x20to\x20Progress\x20(which\x20binds\x20Machine),\x20permission\x20table\x20changes\x20may\x20not\x20affect\x20already-published\x20Machine\x20workflow','affected_stakeholders':['owner'],'scenario':'Permission\x20shared\x20across\x20Machine/Progress','mitigation':'Configure\x20all\x20permission\x20indexes\x20before\x20Machine\x20publish','evidence':'target=Progress'};return null;}},R_P_5_02={'id':'R-P-5-02','category':'cross_object','trigger':'Permission\x20reused\x20across\x20multiple\x20host\x20object\x20types','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-P-5-02','level':'MEDIUM','category':'cross_object','title':'Permission\x20shared\x20across\x20heterogeneous\x20objects','description':'Single\x20Permission\x20applied\x20to\x20'+[...b]['join'](',\x20')+';\x20permission\x20indexes\x20may\x20have\x20different\x20semantics\x20per\x20object','affected_stakeholders':['owner','admin'],'scenario':'One\x20Permission\x20for\x20both\x20Service\x20and\x20Treasury','mitigation':'Use\x20separate\x20Permission\x20objects\x20per\x20host\x20object\x20type\x20for\x20clarity','evidence':'types='+[...b]['join'](',')};return null;}},R_P_5_03={'id':'R-P-5-03','category':'cross_object','trigger':'Treasury\x20external_*_guard\x20management\x20(255/256)\x20granted\x20—\x20verify\x20guard\x20lists\x20are\x20populated','check':a=>{if(!a['table']||!('index'in a['table'])||typeof a['table']['index']!=='number')return null;const b=a['table']['index'];if(b===0xff||b===0x100)return{'id':'R-P-5-03','level':'HIGH','category':'cross_object','title':'Treasury\x20external\x20guard\x20management\x20granted\x20—\x20populate\x20guard\x20lists','description':'Permission\x20'+b+'\x20('+(b===0xff?'TREASURY_EXTERNAL_DEPOSIT_GUARD':'TREASURY_EXTERNAL_WITHDRAW_GUARD')+')\x20granted;\x20ensure\x20external_'+(b===0xff?'deposit':'withdraw')+'_guard\x20list\x20is\x20populated\x20via\x20external_*_guard_add\x20so\x20external\x20operations\x20are\x20authorized','affected_stakeholders':['owner','admin'],'scenario':'External\x20treasury\x20guard\x20management\x20without\x20populated\x20guard\x20lists','mitigation':'Call\x20treasury.external_'+(b===0xff?'deposit':'withdraw')+'_guard_add\x20to\x20register\x20Guard\x20objects;\x20external_deposit/external_withdraw\x20require\x20Guard\x20+\x20Passport\x20(no\x20Permission\x20index)','evidence':'index='+b};return null;}},ALL_RULES=[R_P_01,R_P_02,R_P_03,R_P_04,R_P_2_01,R_P_2_02,R_P_3_01,R_P_3_02,R_P_3_03,R_P_4_01,R_P_4_02,R_P_4_03,R_P_5_01,R_P_5_02,R_P_5_03];export const PERMISSION_RISK_VERSION='1.0.0';export function assessPermissionRisks(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{getJudgmentDoc}from'../config/judgment.js';import{evaluateRuleBook}from'../config/rule-engine.js';import{USER_DEFINED_PERM_INDEX_START,MAX_ENTITY_COUNT,MAX_PERM_FOR_ENTITY,MAX_ADMIN_COUNT}from'@wowok/wowok';import{isBuiltinPermission,findSceneByPermissionIndex}from'./permission-ledger.js';export function permissionRiskFacts(a){const b=a['table'],c=b&&'index'in b&&typeof b['index']==='number'?b['index']:undefined,d=b&&'index'in b&&Array['isArray'](b['index'])?b['index']:undefined,e=a['admin'],f=e?e['op']==='add'?(a['current_admin_count']??0x0)+e['addresses']['length']:e['addresses']['length']:undefined,g=e?e['op']==='set'?e['addresses']['length']:a['current_admin_count']??0x0:undefined,h=a['current_entity_count']??0x0,i=c!==undefined&&isBuiltinPermission(c)?findSceneByPermissionIndex(c):undefined,j=i&&a['target_objects_types']&&a['target_objects_types']['length']>0x0?a['target_objects_types']['filter'](n=>n!==i['host_object']):undefined,k=a['target_objects_types']?[...new Set(a['target_objects_types'])]:undefined,l=c===0xff?'deposit':c===0x100?'withdraw':undefined,m=c===0xff?'TREASURY_EXTERNAL_DEPOSIT_GUARD':c===0x100?'TREASURY_EXTERNAL_WITHDRAW_GUARD':undefined;return{'apply':a['apply'],'builder':a['builder'],'um':a['um'],'current_admin_count':a['current_admin_count'],'current_entity_count':a['current_entity_count'],'target_objects_types':a['target_objects_types'],'user_defined_perm_index_start':USER_DEFINED_PERM_INDEX_START,'max_entity_count':MAX_ENTITY_COUNT,'max_perm_for_entity':MAX_PERM_FOR_ENTITY,'max_admin_count':MAX_ADMIN_COUNT,'table_index_number':c,'table_entity':d!==undefined?b['entity']:undefined,'perm_count_for_entity':d?.['length'],'admin_op':e?.['op'],'admin_address_count':e?.['addresses']['length'],'admin_effective_count':f,'admin_dispersion_count':g,'entity_op':a['entity']?.['op'],'entity_replace_from':a['entity']?.['op']==='replace'?a['entity']['entity1']:undefined,'entity_replace_to':a['entity']?.['op']==='replace'?a['entity']['entity2']:undefined,'custom_index_invalid':c!==undefined&&c<USER_DEFINED_PERM_INDEX_START&&!isBuiltinPermission(c),'custom_index_without_remark':c!==undefined&&c>=USER_DEFINED_PERM_INDEX_START&&!(a['remark']&&a['remark']['op']==='set'&&a['remark']['index']===c),'entity_count':h,'entity_count_over_limit':h>MAX_ENTITY_COUNT,'perm_count_over_limit':d!==undefined&&d['length']>MAX_PERM_FOR_ENTITY,'admin_count_over_limit':f!==undefined&&f>MAX_ADMIN_COUNT,'builtin_permission_name':i?.['builtin_indexes']['find'](n=>n['index']===c)?.['name'],'perm_scene_host_object':i?.['host_object'],'target_types_mismatched_count':j?.['length'],'mismatched_targets_csv':j?.['join'](',\x20'),'mismatched_targets_csv_nospace':j?.['join'](','),'targets_include_progress':a['target_objects_types']?.['includes']('Progress')??![],'um_is_builder':a['um']!==undefined&&a['um']!==null&&!!a['builder']&&a['um']===a['builder'],'apply_count':a['apply']?.['length'],'unique_target_type_count':k?.['length'],'unique_target_types_csv':k?.['join'](',\x20'),'unique_target_types_csv_nospace':k?.['join'](','),'treasury_external_guard_name':m,'treasury_external_guard_op':l};}function permissionRuleBook(){const a=getJudgmentDoc()['rules']['domains']['permission'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27permission\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function findingToPermissionRisk(a){return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'structural','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','evidence':a['evidence'],...a['exposure']!=null?{'exposure':a['exposure']}:{}};}export const PERMISSION_RISK_VERSION='1.0.0';export function assessPermissionRisks(a){const {findings:b}=evaluateRuleBook(permissionRuleBook(),permissionRiskFacts(a)),c=b['map'](findingToPermissionRisk),d=c['length']===0x0?'low':c['some'](g=>g['level']==='critical')?'critical':c['some'](g=>g['level']==='high')?'high':c['some'](g=>g['level']==='medium')?'medium':'low',e={};for(const g of c){e[g['category']]=(e[g['category']]??0x0)+0x1;}const f={};for(const h of c){for(const i of h['affected_stakeholders']){if(!f[i])f[i]=[];f[i]['push'](h['id']+':\x20'+h['mitigation']);}}return{'summary':'Assessed\x20'+c['length']+'\x20risk(s)\x20across\x20'+Object['keys'](e)['length']+'\x20categories','risks':c,'overall_risk':d,'risks_by_category':e,'stakeholder_advice':f,'needs_human_review':c['some'](j=>j['level']==='critical'||j['level']==='high')};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PERMISSION_TEMPLATES=[{'id':'T-P-01','name':'Basic\x20permission','description':'Single-admin\x20permission\x20(owner=admin).\x20Suitable\x20for\x20solo\x20operators','applicable_scenes':['repository_permission','reward_permission','progress_permission','demand_permission','contact_permission'],'industry_tags':['universal'],'params':[{'name':'owner_address','type':'address','description':'Owner\x20address\x20(also\x20becomes\x20admin)','required':!![]},{'name':'description','type':'string','description':'Permission\x20description','required':!![]}],'body':a=>({'object':null,'description':a['description'],'admin':{'op':'set','addresses':[a['owner_address']]}}),'notes':['Use\x20this\x20as\x20a\x20starting\x20point;\x20add\x20admins\x20or\x20entities\x20as\x20needed']},{'id':'T-P-02','name':'Multi-admin\x20permission','description':'Multiple\x20admins\x20for\x20collaborative\x20management.\x20Suitable\x20for\x20teams','applicable_scenes':['service_permission','machine_permission','treasury_permission','arbitration_permission'],'industry_tags':['universal'],'params':[{'name':'owner_address','type':'address','description':'Owner\x20address','required':!![]},{'name':'admin_addresses','type':'string[]','description':'Additional\x20admin\x20addresses','required':!![]},{'name':'description','type':'string','description':'Permission\x20description','required':!![]}],'body':a=>({'object':null,'description':a['description'],'admin':{'op':'set','addresses':[a['owner_address'],...a['admin_addresses']]}}),'notes':['All\x20admins\x20have\x20equal\x20power;\x20use\x20multi-sig\x20if\x20available']},{'id':'T-P-03','name':'Service\x20permission','description':'Template\x20for\x20Service\x20object\x20with\x20publish/pause/allocator\x20permissions','applicable_scenes':['service_permission'],'industry_tags':['retail','service'],'params':[{'name':'owner_address','type':'address','description':'Service\x20owner','required':!![]},{'name':'publisher_address','type':'address','description':'Address\x20allowed\x20to\x20publish\x20(can\x20be\x20same\x20as\x20owner)','required':!![]},{'name':'allocator_address','type':'address','description':'Address\x20allowed\x20to\x20set\x20order\x20allocator','required':!![]},{'name':'pauser_address','type':'address','description':'Address\x20allowed\x20to\x20pause/resume','required':!![]},{'name':'service_address','type':'address','description':'Target\x20Service\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b={'object':null,'description':'Service\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':[{'op':'add\x20perm\x20by\x20index','index':0x137,'entity':[a['publisher_address']]},{'op':'add\x20perm\x20by\x20index','index':0x139,'entity':[a['allocator_address']]},{'op':'add\x20perm\x20by\x20index','index':0x136,'entity':[a['pauser_address']]}],'remark':[{'op':'set','index':0x137,'remark':'service.publish'},{'op':'set','index':0x139,'remark':'service.order_allocator'},{'op':'set','index':0x136,'remark':'service.pause'}]};if(a['service_address'])b['apply']=[a['service_address']];return b;},'notes':['Assign\x20different\x20addresses\x20to\x20different\x20roles\x20for\x20least-privilege']},{'id':'T-P-04','name':'Machine\x20permission','description':'Template\x20for\x20Machine\x20object\x20with\x20publish/node/pause\x20permissions','applicable_scenes':['machine_permission'],'industry_tags':['workflow','automation'],'params':[{'name':'owner_address','type':'address','description':'Machine\x20owner','required':!![]},{'name':'node_editor_address','type':'address','description':'Address\x20allowed\x20to\x20edit\x20nodes\x20(pre-publish\x20only)','required':!![]},{'name':'pauser_address','type':'address','description':'Address\x20allowed\x20to\x20pause/resume','required':!![]},{'name':'machine_address','type':'address','description':'Target\x20Machine\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b={'object':null,'description':'Machine\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':[{'op':'add\x20perm\x20by\x20index','index':0xcd,'entity':[a['owner_address']]},{'op':'add\x20perm\x20by\x20index','index':0xce,'entity':[a['node_editor_address']]},{'op':'add\x20perm\x20by\x20index','index':0xcc,'entity':[a['pauser_address']]}],'remark':[{'op':'set','index':0xcd,'remark':'machine.publish'},{'op':'set','index':0xce,'remark':'machine.node'},{'op':'set','index':0xcc,'remark':'machine.pause'}]};if(a['machine_address'])b['apply']=[a['machine_address']];return b;},'notes':['MACHINE_PUBLISH\x20(205)\x20should\x20be\x20owner-only','Node\x20editing\x20only\x20effective\x20before\x20publish']},{'id':'T-P-05','name':'Treasury\x20permission','description':'Template\x20for\x20Treasury\x20with\x20deposit/withdraw/external\x20ops\x20+\x20guard','applicable_scenes':['treasury_permission'],'industry_tags':['finance','treasury'],'params':[{'name':'owner_address','type':'address','description':'Treasury\x20owner','required':!![]},{'name':'depositor_address','type':'address','description':'Address\x20allowed\x20to\x20deposit','required':!![]},{'name':'withdrawer_address','type':'address','description':'Address\x20allowed\x20to\x20withdraw','required':!![]},{'name':'external_operator_address','type':'address','description':'Address\x20for\x20external\x20deposit/withdraw','required':![]},{'name':'treasury_address','type':'address','description':'Target\x20Treasury\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b=[{'op':'add\x20perm\x20by\x20index','index':0xfc,'entity':[a['depositor_address']]},{'op':'add\x20perm\x20by\x20index','index':0xfe,'entity':[a['withdrawer_address']]}],c=[{'op':'set','index':0xfc,'remark':'treasury.deposit'},{'op':'set','index':0xfe,'remark':'treasury.withdraw'}];a['external_operator_address']&&(b['push']({'op':'add\x20perm\x20by\x20index','index':0xff,'entity':[a['owner_address']]},{'op':'add\x20perm\x20by\x20index','index':0x100,'entity':[a['owner_address']]}),c['push']({'op':'set','index':0xff,'remark':'treasury.external_deposit_guard'},{'op':'set','index':0x100,'remark':'treasury.external_withdraw_guard'}));const d={'object':null,'description':'Treasury\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':b,'remark':c};if(a['treasury_address'])d['apply']=[a['treasury_address']];return d;},'notes':['Grant\x20TREASURY_EXTERNAL_*_GUARD\x20(255/256)\x20to\x20owner\x20for\x20guard-list\x20management;\x20authorize\x20external\x20operators\x20via\x20external_*_guard_add\x20(Guard\x20+\x20Passport,\x20no\x20Permission\x20index)']},{'id':'T-P-06','name':'Arbitration\x20permission','description':'Template\x20for\x20Arbitration\x20with\x20vote/feedback/confirm\x20permissions','applicable_scenes':['arbitration_permission'],'industry_tags':['arbitration','dispute'],'params':[{'name':'owner_address','type':'address','description':'Arbitration\x20owner','required':!![]},{'name':'voter_addresses','type':'string[]','description':'Arbiter\x20addresses\x20allowed\x20to\x20vote','required':!![]},{'name':'feedback_address','type':'address','description':'Address\x20allowed\x20to\x20provide\x20feedback','required':![]},{'name':'
|
|
1
|
+
export const PERMISSION_TEMPLATES=[{'id':'T-P-01','name':'Basic\x20permission','description':'Single-admin\x20permission\x20(owner=admin).\x20Suitable\x20for\x20solo\x20operators','applicable_scenes':['repository_permission','reward_permission','progress_permission','demand_permission','contact_permission'],'industry_tags':['universal'],'params':[{'name':'owner_address','type':'address','description':'Owner\x20address\x20(also\x20becomes\x20admin)','required':!![]},{'name':'description','type':'string','description':'Permission\x20description','required':!![]}],'body':a=>({'object':null,'description':a['description'],'admin':{'op':'set','addresses':[a['owner_address']]}}),'notes':['Use\x20this\x20as\x20a\x20starting\x20point;\x20add\x20admins\x20or\x20entities\x20as\x20needed']},{'id':'T-P-02','name':'Multi-admin\x20permission','description':'Multiple\x20admins\x20for\x20collaborative\x20management.\x20Suitable\x20for\x20teams','applicable_scenes':['service_permission','machine_permission','treasury_permission','arbitration_permission'],'industry_tags':['universal'],'params':[{'name':'owner_address','type':'address','description':'Owner\x20address','required':!![]},{'name':'admin_addresses','type':'string[]','description':'Additional\x20admin\x20addresses','required':!![]},{'name':'description','type':'string','description':'Permission\x20description','required':!![]}],'body':a=>({'object':null,'description':a['description'],'admin':{'op':'set','addresses':[a['owner_address'],...a['admin_addresses']]}}),'notes':['All\x20admins\x20have\x20equal\x20power;\x20use\x20multi-sig\x20if\x20available']},{'id':'T-P-03','name':'Service\x20permission','description':'Template\x20for\x20Service\x20object\x20with\x20publish/pause/allocator\x20permissions','applicable_scenes':['service_permission'],'industry_tags':['retail','service'],'params':[{'name':'owner_address','type':'address','description':'Service\x20owner','required':!![]},{'name':'publisher_address','type':'address','description':'Address\x20allowed\x20to\x20publish\x20(can\x20be\x20same\x20as\x20owner)','required':!![]},{'name':'allocator_address','type':'address','description':'Address\x20allowed\x20to\x20set\x20order\x20allocator','required':!![]},{'name':'pauser_address','type':'address','description':'Address\x20allowed\x20to\x20pause/resume','required':!![]},{'name':'service_address','type':'address','description':'Target\x20Service\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b={'object':null,'description':'Service\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':[{'op':'add\x20perm\x20by\x20index','index':0x137,'entity':[a['publisher_address']]},{'op':'add\x20perm\x20by\x20index','index':0x139,'entity':[a['allocator_address']]},{'op':'add\x20perm\x20by\x20index','index':0x136,'entity':[a['pauser_address']]}],'remark':[{'op':'set','index':0x137,'remark':'service.publish'},{'op':'set','index':0x139,'remark':'service.order_allocator'},{'op':'set','index':0x136,'remark':'service.pause'}]};if(a['service_address'])b['apply']=[a['service_address']];return b;},'notes':['Assign\x20different\x20addresses\x20to\x20different\x20roles\x20for\x20least-privilege']},{'id':'T-P-04','name':'Machine\x20permission','description':'Template\x20for\x20Machine\x20object\x20with\x20publish/node/pause\x20permissions','applicable_scenes':['machine_permission'],'industry_tags':['workflow','automation'],'params':[{'name':'owner_address','type':'address','description':'Machine\x20owner','required':!![]},{'name':'node_editor_address','type':'address','description':'Address\x20allowed\x20to\x20edit\x20nodes\x20(pre-publish\x20only)','required':!![]},{'name':'pauser_address','type':'address','description':'Address\x20allowed\x20to\x20pause/resume','required':!![]},{'name':'machine_address','type':'address','description':'Target\x20Machine\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b={'object':null,'description':'Machine\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':[{'op':'add\x20perm\x20by\x20index','index':0xcd,'entity':[a['owner_address']]},{'op':'add\x20perm\x20by\x20index','index':0xce,'entity':[a['node_editor_address']]},{'op':'add\x20perm\x20by\x20index','index':0xcc,'entity':[a['pauser_address']]}],'remark':[{'op':'set','index':0xcd,'remark':'machine.publish'},{'op':'set','index':0xce,'remark':'machine.node'},{'op':'set','index':0xcc,'remark':'machine.pause'}]};if(a['machine_address'])b['apply']=[a['machine_address']];return b;},'notes':['MACHINE_PUBLISH\x20(205)\x20should\x20be\x20owner-only','Node\x20editing\x20only\x20effective\x20before\x20publish']},{'id':'T-P-05','name':'Treasury\x20permission','description':'Template\x20for\x20Treasury\x20with\x20deposit/withdraw/external\x20ops\x20+\x20guard','applicable_scenes':['treasury_permission'],'industry_tags':['finance','treasury'],'params':[{'name':'owner_address','type':'address','description':'Treasury\x20owner','required':!![]},{'name':'depositor_address','type':'address','description':'Address\x20allowed\x20to\x20deposit','required':!![]},{'name':'withdrawer_address','type':'address','description':'Address\x20allowed\x20to\x20withdraw','required':!![]},{'name':'external_operator_address','type':'address','description':'Address\x20for\x20external\x20deposit/withdraw','required':![]},{'name':'treasury_address','type':'address','description':'Target\x20Treasury\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b=[{'op':'add\x20perm\x20by\x20index','index':0xfc,'entity':[a['depositor_address']]},{'op':'add\x20perm\x20by\x20index','index':0xfe,'entity':[a['withdrawer_address']]}],c=[{'op':'set','index':0xfc,'remark':'treasury.deposit'},{'op':'set','index':0xfe,'remark':'treasury.withdraw'}];a['external_operator_address']&&(b['push']({'op':'add\x20perm\x20by\x20index','index':0xff,'entity':[a['owner_address']]},{'op':'add\x20perm\x20by\x20index','index':0x100,'entity':[a['owner_address']]}),c['push']({'op':'set','index':0xff,'remark':'treasury.external_deposit_guard'},{'op':'set','index':0x100,'remark':'treasury.external_withdraw_guard'}));const d={'object':null,'description':'Treasury\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':b,'remark':c};if(a['treasury_address'])d['apply']=[a['treasury_address']];return d;},'notes':['Grant\x20TREASURY_EXTERNAL_*_GUARD\x20(255/256)\x20to\x20owner\x20for\x20guard-list\x20management;\x20authorize\x20external\x20operators\x20via\x20external_*_guard_add\x20(Guard\x20+\x20Passport,\x20no\x20Permission\x20index)']},{'id':'T-P-06','name':'Arbitration\x20permission','description':'Template\x20for\x20Arbitration\x20with\x20vote/feedback/confirm\x20permissions','applicable_scenes':['arbitration_permission'],'industry_tags':['arbitration','dispute'],'params':[{'name':'owner_address','type':'address','description':'Arbitration\x20owner','required':!![]},{'name':'voter_addresses','type':'string[]','description':'Arbiter\x20addresses\x20allowed\x20to\x20vote','required':!![]},{'name':'feedback_address','type':'address','description':'Address\x20allowed\x20to\x20provide\x20feedback','required':![]},{'name':'arbitration_object','type':'address','description':'Target\x20Arbitration\x20object\x20address\x20(for\x20apply)','required':![]}],'body':a=>{const b={'object':null,'description':'Arbitration\x20permission','admin':{'op':'set','addresses':[a['owner_address']]},'table':[{'op':'add\x20perm\x20by\x20index','index':0x165,'entity':a['voter_addresses']}],'remark':[{'op':'set','index':0x165,'remark':'arbitration.vote'}]};a['feedback_address']&&(b['table']['push']({'op':'add\x20perm\x20by\x20index','index':0x167,'entity':[a['feedback_address']]}),b['remark']['push']({'op':'set','index':0x167,'remark':'arbitration.feedback'}));if(a['arbitration_object'])b['apply']=[a['arbitration_object']];return b;},'notes':['Voting\x20weight\x20is\x20determined\x20by\x20voting_guard,\x20not\x20by\x20permission\x20index','Multiple\x20arbiters\x20can\x20share\x20ARBITRATION_VOTE']},{'id':'T-P-08','name':'Ownership\x20transfer','description':'Template\x20for\x20transferring\x20Permission\x20ownership','applicable_scenes':['ownership_transfer'],'industry_tags':['universal'],'params':[{'name':'permission_address','type':'address','description':'Permission\x20object\x20address','required':!![]},{'name':'new_owner_address','type':'address','description':'New\x20owner\x20address','required':!![]}],'body':a=>({'object':a['permission_address'],'builder':a['new_owner_address']}),'notes':['⚠️\x20IRREVERSIBLE\x20operation','Export\x20Permission\x20JSON\x20before\x20transfer','Verify\x20new\x20owner\x20address\x20twice']}];export const PERMISSION_TEMPLATES_VERSION='1.0.0';export function getAllTemplates(){return[...PERMISSION_TEMPLATES];}export function getTemplateById(a){return PERMISSION_TEMPLATES['find'](b=>b['id']===a);}export function getTemplatesByScene(a){return PERMISSION_TEMPLATES['filter'](b=>b['applicable_scenes']['includes'](a));}export function getTemplatesByIndustry(a){return PERMISSION_TEMPLATES['filter'](b=>b['industry_tags']['includes'](a)||b['industry_tags']['includes']('universal'));}export function suggestTemplateForScene(a){const b=getTemplatesByScene(a);return b['length']>0x0?b[0x0]:undefined;}export function listTemplates(){return PERMISSION_TEMPLATES['map'](a=>({'id':a['id'],'name':a['name'],'description':a['description'],'scenes':a['applicable_scenes']}));}export function fillTemplate(a,b){const c=getTemplateById(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,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Facts } from "../config/rule-engine.js";
|
|
2
|
+
export type PersonalRiskLevel = "critical" | "high" | "medium" | "low" | "info";
|
|
2
3
|
export type PersonalRiskCategory = "structural" | "semantic" | "lifecycle" | "cross_object" | "knowledge";
|
|
3
4
|
export type PersonalStakeholder = "user" | "consumer" | "system";
|
|
4
5
|
export interface PersonalRisk {
|
|
@@ -27,9 +28,9 @@ export interface PersonalRiskCheckContext {
|
|
|
27
28
|
singleton_enforced?: boolean;
|
|
28
29
|
constants_synced?: boolean;
|
|
29
30
|
}
|
|
30
|
-
export declare
|
|
31
|
-
rule: PersonalRisk;
|
|
32
|
-
check: (ctx: PersonalRiskCheckContext) => PersonalRisk | null;
|
|
33
|
-
}[];
|
|
31
|
+
export declare function personalRiskFacts(ctx: PersonalRiskCheckContext): Facts;
|
|
34
32
|
export declare const PERSONAL_RISK_VERSION = "1.0.0";
|
|
33
|
+
export declare const PERSONAL_RISK_RULES: Array<PersonalRisk & {
|
|
34
|
+
trigger?: string;
|
|
35
|
+
}>;
|
|
35
36
|
export declare function checkPersonalRisks(ctx: PersonalRiskCheckContext): PersonalRisk[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH,MAX_TAGS_COUNT}from'@wowok/wowok';function detectSensitiveInformation(a){const b=[];for(const c of a){const d=typeof c['value']==='string'?c['value']:String(c['value']??''),f=d['toLowerCase']();if(/^\+?\d{10,15}$/['test'](d))b['push'](c['name']+'=phone-like');if(/[^\s@]+@[^\s@]+\.[^\s@]+/['test'](d))b['push'](c['name']+'=email-like');if(/^(0x)?[0-9a-fA-F]{64}$/['test'](d))b['push'](c['name']+'=private-key-like');if(/^([a-z]{3,8}\s){11,23}[a-z]{3,8}$/['test'](d['trim']()))b['push'](c['name']+'=mnemonic-like');if(/private[_-]?key|secret|mnemonic|seed/i['test'](c['name']))b['push'](c['name']+'=secret-named');void f;}return b;}const R_PE_01={'rule':{'id':'R-PERSONAL-01','level':'HIGH','category':'semantic','title':'Sensitive\x20information\x20leakage\x20—\x20on-chain\x20data\x20is\x20permanent','description':'information\x20is\x20stored\x20via\x20Entity.info_add\x20as\x20on-chain\x20Records.\x20The\x20schema\x20description\x20'+'warns\x20\x27NEVER:\x20phone,\x20address,\x20private\x20keys\x27\x20but\x20the\x20Move\x20layer\x20does\x20not\x20validate\x20'+'content.\x20Once\x20a\x20phone\x20number,\x20physical\x20address,\x20email,\x20or\x20private\x20key\x20is\x20written\x20'+'on-chain,\x20it\x20is\x20permanent\x20and\x20publicly\x20readable\x20—\x20there\x20is\x20no\x20delete\x20(info_remove\x20'+'only\x20removes\x20the\x20named\x20entry\x20from\x20the\x20user\x27s\x20record;\x20the\x20data\x20remains\x20in\x20the\x20'+'transaction\x20history).','affected_stakeholders':['user'],'scenario':'User\x20adds\x20information\x20{name:\x20\x27phone\x27,\x20value:\x20\x27+8613800000000\x27};\x20number\x20is\x20public\x20forever','mitigation':'MCP\x20schema\x20description\x20MUST\x20warn.\x20AI\x20agents\x20MUST\x20re-confirm\x20before\x20adding\x20any\x20'+'information\x20entry.\x20Business\x20layer\x20should\x20run\x20a\x20sensitive-data\x20regex\x20(phone/email/'+'private-key/mnemonic)\x20and\x20reject\x20matches.\x20Use\x20the\x20\x27local\x27\x20tool\x20for\x20private\x20data.','auto_fixable':![]},'check':a=>{if(!a['information_entries']||a['information_entries']['length']===0x0)return null;const b=detectSensitiveInformation(a['information_entries']);if(b['length']===0x0)return null;return{...R_PE_01['rule'],'evidence':'sensitive\x20patterns:\x20'+b['join'](';\x20')};}},R_PE_02={'rule':{'id':'R-PERSONAL-02','level':'MEDIUM','category':'lifecycle','title':'mark\x20destroy\x20is\x20irreversible\x20—\x20identity\x20mark\x20permanently\x20lost','description':'The\x20\x27destroy\x27\x20mark\x20op\x20permanently\x20deletes\x20the\x20Resource\x20object\x20backing\x20the\x20user\x27s\x20'+'identity\x20mark.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20After\x20destroy,\x20the\x20'+'user\x20has\x20no\x20on-chain\x20identity\x20mark\x20until\x20they\x20create\x20a\x20new\x20one,\x20and\x20any\x20external\x20'+'system\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20breaks.','affected_stakeholders':['user','consumer'],'scenario':'User\x20destroys\x20their\x20mark;\x20downstream\x20services\x20keyed\x20on\x20the\x20old\x20Resource\x20address\x20fail','mitigation':'Require\x20explicit\x20confirmation\x20before\x20destroy.\x20SDK\x20should\x20refuse\x20destroy\x20if\x20any\x20'+'live\x20consumer\x20still\x20references\x20the\x20mark.\x20Provide\x20a\x20\x27replace\x27\x20alternative\x20that\x20'+'swaps\x20the\x20underlying\x20Resource\x20without\x20losing\x20continuity.','auto_fixable':![]},'check':a=>{if(!a['is_mark_destroy'])return null;return{...R_PE_02['rule'],'evidence':'is_mark_destroy=true\x20(irreversible)'};}},R_PE_03={'rule':{'id':'R-PERSONAL-03','level':'MEDIUM','category':'semantic','title':'referrer\x20chain\x20can\x20be\x20abused\x20to\x20fabricate\x20trust\x20signals','description':'When\x20registering,\x20a\x20user\x20may\x20specify\x20any\x20referrer\x20address.\x20There\x20is\x20no\x20on-chain\x20'+'verification\x20that\x20the\x20referrer\x20actually\x20invited\x20the\x20user.\x20A\x20sybil\x20attacker\x20can\x20'+'register\x20many\x20accounts\x20chained\x20to\x20a\x20reputable\x20address,\x20fabricating\x20an\x20association\x20'+'to\x20borrow\x20trust.\x20The\x20Registrar\x20records\x20referrer\x20but\x20does\x20not\x20validate\x20consent.','affected_stakeholders':['user','consumer'],'scenario':'Attacker\x20registers\x20100\x20accounts\x20all\x20citing\x20a\x20reputable\x20merchant\x20as\x20referrer','mitigation':'Business\x20layer\x20should\x20treat\x20referrer\x20as\x20a\x20self-attested\x20hint,\x20not\x20a\x20verified\x20trust\x20'+'signal.\x20Audit\x20referrer\x20chains\x20off-chain;\x20require\x20the\x20referrer\x20to\x20co-sign\x20if\x20used\x20for\x20'+'trust\x20scoring.','auto_fixable':![]},'check':a=>{if(!a['has_referrer'])return null;return{...R_PE_03['rule'],'evidence':'has_referrer=true\x20(self-attested,\x20unverified)'};}},R_PE_04={'rule':{'id':'R-PERSONAL-04','level':'LOW','category':'structural','title':'information\x20inherits\x20MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20—\x20permissive','description':'Personal\x20does\x20not\x20define\x20its\x20own\x20record\x20cap;\x20it\x20inherits\x20Entity\x27s\x20'+('MAX_RECORD_COUNT_REGISTRAR='+MAX_RECORD_COUNT_REGISTRAR+'\x20(registrar.move)\x20and\x20')+('MAX_RECORD_LENGTH='+MAX_RECORD_LENGTH+'\x20per\x20record.\x20'+MAX_RECORD_COUNT_REGISTRAR+'\x20records\x20')+'per\x20user\x20is\x20generous\x20and\x20can\x20bloat\x20on-chain\x20storage\x20if\x20users\x20add\x20many\x20entries.\x20'+('MAX_ADDRESS_COUNT='+MAX_ADDRESS_COUNT+'\x20and\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20also\x20apply\x20via\x20Entity/Resource.'),'affected_stakeholders':['user','system'],'scenario':'User\x20adds\x201000\x20information\x20entries;\x20Entity\x20record\x20storage\x20is\x20heavy\x20and\x20slow\x20to\x20read','mitigation':'Business\x20layer\x20should\x20self-limit\x20information\x20count\x20(e.g.\x20≤50).\x20For\x20bulk\x20profile\x20data,\x20'+'store\x20off-chain\x20and\x20reference\x20via\x20a\x20Repository\x20or\x20Proof.','auto_fixable':![]},'check':a=>{if(a['information_count']===undefined)return null;if(a['information_count']<MAX_RECORD_COUNT_REGISTRAR)return null;return{...R_PE_04['rule'],'evidence':'information_count='+a['information_count']+',\x20limit='+MAX_RECORD_COUNT_REGISTRAR};}},R_PE_05={'rule':{'id':'R-PERSONAL-05','level':'MEDIUM','category':'lifecycle','title':'mark\x20transfer\x20loses\x20identity\x20mark\x20at\x20the\x20source\x20address','description':'The\x20\x27transfer\x27\x20mark\x20op\x20moves\x20the\x20Resource\x20backing\x20the\x20identity\x20mark\x20to\x20a\x20new\x20address.\x20'+'After\x20transfer,\x20the\x20source\x20address\x20has\x20no\x20mark\x20—\x20any\x20service\x20that\x20keyed\x20identity\x20on\x20'+'the\x20source\x20address\x20loses\x20the\x20binding.\x20There\x20is\x20no\x20automatic\x20forwarding\x20stub\x20left\x20behind.','affected_stakeholders':['user','consumer'],'scenario':'User\x20transfers\x20mark\x20to\x20a\x20new\x20wallet;\x20old-wallet-based\x20logins\x20all\x20break','mitigation':'Surface\x20a\x20\x27transfer\x20will\x20detach\x20the\x20mark\x20from\x20this\x20address\x27\x20warning.\x20Consumers\x20should\x20'+'track\x20marks\x20by\x20Resource\x20address,\x20not\x20by\x20user\x20address.\x20Provide\x20a\x20migration\x20window\x20'+'where\x20both\x20addresses\x20are\x20valid.','auto_fixable':![]},'check':a=>{if(!a['is_mark_transfer'])return null;return{...R_PE_05['rule'],'evidence':'is_mark_transfer=true\x20(source\x20loses\x20mark)'};}},R_PE_06={'rule':{'id':'R-PERSONAL-06','level':'LOW','category':'cross_object','title':'Personal\x20has\x20no\x20dedicated\x20Move\x20struct\x20—\x20depends\x20entirely\x20on\x20Entity\x20+\x20Resource','description':'Personal\x20is\x20an\x20SDK-layer\x20construct:\x20there\x20is\x20no\x20personal.move.\x20The\x20SDK\x20composes\x20'+'Entity\x20(information/description)\x20and\x20Resource\x20(mark)\x20on\x20behalf\x20of\x20the\x20user.\x20Any\x20'+'breaking\x20change\x20in\x20Entity\x20or\x20Resource\x20directly\x20affects\x20Personal.\x20The\x20MCP\x20layer\x20'+'cannot\x20fix\x20Personal\x20bugs\x20without\x20touching\x20Entity/Resource.','affected_stakeholders':['system'],'scenario':'Entity\x20schema\x20changes;\x20Personal.information\x20silently\x20breaks','mitigation':'Track\x20Entity\x20and\x20Resource\x20changelogs\x20as\x20first-order\x20dependencies\x20of\x20Personal.\x20Add\x20'+'integration\x20tests\x20that\x20exercise\x20Personal\x20flows\x20whenever\x20Entity/Resource\x20change.','auto_fixable':![]},'check':a=>{if(!a['expects_dedicated_move_struct'])return null;return{...R_PE_06['rule'],'evidence':'expects_dedicated_move_struct=true\x20(none\x20exists)'};}},R_PE_07={'rule':{'id':'R-PERSONAL-07','level':'MEDIUM','category':'lifecycle','title':'Singleton\x20assumption\x20—\x20if\x20violated,\x20multiple\x20Personal\x20instances\x20conflict','description':'Personal\x20assumes\x20each\x20account\x20has\x20exactly\x20one\x20Entity\x20record\x20(and\x20one\x20Resource\x20mark).\x20'+'The\x20Move\x20layer\x20enforces\x20this\x20via\x20entity_register\x27s\x20idempotency\x20(returns\x20the\x20existing\x20'+'Resource\x20for\x20already-registered\x20users).\x20But\x20if\x20the\x20SDK\x20ever\x20bypasses\x20entity_register\x20'+'and\x20creates\x20duplicates\x20(e.g.\x20via\x20entity_register_with_resource_forced),\x20downstream\x20'+'code\x20that\x20assumes\x20a\x20singleton\x20would\x20see\x20inconsistent\x20state.','affected_stakeholders':['user','consumer'],'scenario':'SDK\x20calls\x20entity_register_with_resource_forced;\x20user\x20now\x20has\x20two\x20Resource\x20marks','mitigation':'SDK\x20MUST\x20enforce\x20the\x20singleton\x20invariant:\x20refuse\x20to\x20call\x20entity_register_with_resource_forced\x20'+'unless\x20the\x20user\x20explicitly\x20opts\x20in.\x20Document\x20that\x20forced\x20re-registration\x20invalidates\x20'+'the\x20old\x20Resource\x20address.','auto_fixable':![]},'check':a=>{if(a['singleton_enforced'])return null;return{...R_PE_07['rule'],'evidence':'singleton_enforced=false\x20(needs\x20SDK\x20guard)'};}};export const PERSONAL_RISK_RULES=[R_PE_01,R_PE_02,R_PE_03,R_PE_04,R_PE_05,R_PE_06,R_PE_07];export const PERSONAL_RISK_VERSION='1.0.0';export function checkPersonalRisks(a){const b=[];for(const c of PERSONAL_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}
|
|
1
|
+
import{MAX_ADDRESS_COUNT,MAX_RECORD_COUNT_REGISTRAR,MAX_RECORD_LENGTH,MAX_TAGS_COUNT}from'@wowok/wowok';import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook,interpolate}from'../config/rule-engine.js';function detectSensitiveInformation(a){const b=[];for(const c of a){const d=typeof c['value']==='string'?c['value']:String(c['value']??''),f=d['toLowerCase']();if(/^\+?\d{10,15}$/['test'](d))b['push'](c['name']+'=phone-like');if(/[^\s@]+@[^\s@]+\.[^\s@]+/['test'](d))b['push'](c['name']+'=email-like');if(/^(0x)?[0-9a-fA-F]{64}$/['test'](d))b['push'](c['name']+'=private-key-like');if(/^([a-z]{3,8}\s){11,23}[a-z]{3,8}$/['test'](d['trim']()))b['push'](c['name']+'=mnemonic-like');if(/private[_-]?key|secret|mnemonic|seed/i['test'](c['name']))b['push'](c['name']+'=secret-named');void f;}return b;}export function personalRiskFacts(a){const b=detectSensitiveInformation(a['information_entries']??[]);return{'sensitive_hits_found':b['length']>0x0,'sensitive_patterns_text':b['join'](';\x20'),'is_mark_destroy':a['is_mark_destroy'],'has_referrer':a['has_referrer'],'is_mark_transfer':a['is_mark_transfer'],'information_count':a['information_count'],'information_count_over_limit':a['information_count']!==undefined&&a['information_count']>=MAX_RECORD_COUNT_REGISTRAR,'expects_dedicated_move_struct':a['expects_dedicated_move_struct'],'singleton_enforced':a['singleton_enforced'],'max_record_count_registrar':MAX_RECORD_COUNT_REGISTRAR,'max_record_length':MAX_RECORD_LENGTH,'max_address_count':MAX_ADDRESS_COUNT,'max_tags_count':MAX_TAGS_COUNT};}function personalRuleBook(){const a=getJudgmentDoc()['rules']['domains']['personal'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27personal\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function findingToPersonalRisk(a){return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'semantic','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','auto_fixable':![],...a['evidence']===undefined?{}:{'evidence':a['evidence']}};}export const PERSONAL_RISK_VERSION='1.0.0';export const PERSONAL_RISK_RULES=((()=>{const a=factoryRulePack('personal');if(!a)return[];const b=personalRiskFacts({});return a['rules']['map'](d=>{const e=d['cases'][0x0];return{'id':d['rule_id'],'level':e['level'],'category':d['dimension']??'semantic','title':interpolate(e['title'],b),'description':interpolate(e['description'],b),'affected_stakeholders':e['stakeholders']??[],'scenario':e['scenario']===undefined?'':interpolate(e['scenario'],b),'mitigation':e['mitigation']===undefined?'':interpolate(e['mitigation'],b),'auto_fixable':![],...d['trigger']===undefined?{}:{'trigger':d['trigger']}};});})());export function checkPersonalRisks(a){const {findings:b}=evaluateRuleBook(personalRuleBook(),personalRiskFacts(a));return b['map'](findingToPersonalRisk);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';export{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT};export const PROGRESS_NEW={'index':0xdc,'name':'PROGRESS_NEW','description':'Create\x20new\x20Progress\x20(asserted\x20by\x20progress::new\x20/\x20new_with_passport)','governed_operations':['progress::new','progress::new_with_passport'],'sdk_exposed':![]};export const PROGRESS_NAMED_OPERATOR={'index':0xdd,'name':'PROGRESS_NAMED_OPERATOR','description':'Manage\x20named\x20operators\x20(add/set/remove)\x20for\x20the\x20namedOperator\x20namespace','governed_operations':['progress::namedOperator_add','progress::namedOperator_set','progress::namedOperator_remove','progress::namedOperator_add_with_passport','progress::namedOperator_set_with_passport','progress::namedOperator_remove_with_passport'],'sdk_exposed':!![]};export const PROGRESS_TASK={'index':0xde,'name':'PROGRESS_TASK','description':'Submit\x20task\x20(one-time,\x20immutable\x20once\x20set\x20—\x20E_TASK_ALREADY_SET)','governed_operations':['progress::task_set','progress::task_set_with_passport'],'sdk_exposed':!![]};export const PROGRESS_CONTEXT_REPOSITORY={'index':0xdf,'name':'PROGRESS_CONTEXT_REPOSITORY','description':'Bind/unbind\x20context\x20Repository\x20(≤\x20MAX_CONTEXT_REPOSITORY_COUNT=30)','governed_operations':['progress::context_repository_add','progress::context_repository_remove','progress::context_repository_clear','progress::context_repository_add_with_passport','progress::context_repository_remove_with_passport','progress::context_repository_clear_with_passport'],'sdk_exposed':!![]};export const PROGRESS_UNHOLD={'index':0xe0,'name':'PROGRESS_UNHOLD','description':'Force\x20unhold\x20(adminUnhold)\x20—\x20bypasses\x20holder\x20check,\x20releases\x20blocked\x20forward','governed_operations':['progress::unhold','progress::unhold_with_passport'],'sdk_exposed':!![]};export const PROGRESS_OWNER_RECEIVE={'index':0xe1,'name':'PROGRESS_OWNER_RECEIVE','description':'Owner\x20receives\x20objects/coins\x20(unwrap\x20Receiving<K>\x20→\x20owner)','governed_operations':['progress::owner_receive','progress::owner_receive_object','progress::owner_receive_with_passport','progress::owner_receive_object_with_passport'],'sdk_exposed':![]};export const PROGRESS_PERMISSIONS=[PROGRESS_NEW,PROGRESS_NAMED_OPERATOR,PROGRESS_TASK,PROGRESS_CONTEXT_REPOSITORY,PROGRESS_UNHOLD,PROGRESS_OWNER_RECEIVE];export const PROGRESS_SCENES=[{'id':'progress_task_submit','name':'Task\x20submission\x20&\x20binding\x20workflow','industry':['universal','ecommerce','logistics','education'],'scenario':'Submit\x20a\x20task\x20(Order/Reward/etc.)\x20to\x20Progress\x20via\x20task_set.\x20'+'Task\x20is\x20one-time,\x20immutable\x20—\x20once\x20set,\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment.\x20'+'Binds\x20Progress\x201:1\x20to\x20the\x20task\x20object\x20for\x20the\x20rest\x20of\x20its\x20lifecycle.','phases':['task_binding','forward_advance'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_TASK],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['task_set\x20is\x20one-time:\x20verify\x20task\x20address\x20before\x20submission\x20(E_TASK_ALREADY_SET\x20blocks\x20reset)','task\x20is\x20usually\x20an\x20Order\x20created\x20by\x20service::buy\x20→\x20Progress.task\x20=\x20Order\x20address','Without\x20task,\x20Forward\x20advancement\x20falls\x20back\x20to\x20non-order\x20next()/hold()\x20paths'],'recommended_templates':['T-PR-01']},{'id':'progress_named_operator','name':'Named\x20operator\x20namespace\x20management','industry':['universal','logistics','arbitration','freelance'],'scenario':'Manage\x20named_operator\x20namespace\x20for\x20a\x20Progress.\x20Each\x20named\x20operator\x20is\x20a\x20(name\x20→\x20address\x20list)\x20'+'binding\x20used\x20by\x20Machine.forward.namedOperator\x20to\x20gate\x20next()/hold()\x20advancement.\x20'+'Up\x20to\x2060\x20named\x20operators\x20per\x20Progress,\x20up\x20to\x2080\x20addresses\x20per\x20operator.','phases':['named_operator_mgmt'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[{'role':'seller','typical_count':0x1},{'role':'logistics','typical_count':0x1},{'role':'reviewer','typical_count':0x3},{'role':'arbitrator','typical_count':0x5}],'builtin_indexes_consumed':[PROGRESS_NAMED_OPERATOR],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['namedOperator\x20name=\x27\x27:\x20special\x20case\x20—\x20means\x20OrderHolder\x20(order.owner/agent),\x20NOT\x20a\x20real\x20named\x20operator','add/set/remove\x20are\x20idempotent\x20on\x20duplicate\x20addresses\x20(vector::contains\x20check\x20before\x20push)','Use\x20\x27set\x27\x20to\x20REPLACE\x20an\x20operator\x27s\x20address\x20list;\x20use\x20\x27add\x27\x20to\x20extend;\x20\x27remove\x27\x20to\x20subtract','Names\x20must\x20satisfy\x20common::NAME\x20(isValidName)\x20—\x20non-empty,\x20length-bounded'],'recommended_templates':['T-PR-01','T-PR-02']},{'id':'progress_unhold','name':'Hold\x20release\x20(unhold\x20/\x20adminUnhold)\x20workflow','industry':['content','rental','arbitration','subscription'],'scenario':'Release\x20a\x20forward\x20that\x20was\x20previously\x20held.\x20Two\x20paths:\x20'+'(a)\x20unhold\x20by\x20original\x20holder\x20(named_operator\x20match);\x20'+'(b)\x20adminUnhold\x20(224)\x20by\x20permission-table\x20holder\x20—\x20bypasses\x20holder\x20check.\x20'+'adminUnhold\x20is\x20the\x20deadlock-resolution\x20escape\x20hatch\x20when\x20a\x20holder\x20is\x20unresponsive.','phases':['hold_state','unhold_state'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'holder','typical_count':0x1},{'role':'admin','typical_count':0x1}],'builtin_indexes_consumed':[PROGRESS_UNHOLD],'typical_context_repository_count':0x0,'uses_hold_mechanism':!![],'uses_admin_unhold':!![],'common_patterns':['unhold\x20checks\x20sender_has_permission_idcheck(224):\x20if\x20yes,\x20force\x20release;\x20if\x20no,\x20require\x20holder\x20match','adminUnhold\x20has\x20wider\x20blast\x20radius\x20—\x20only\x20grant\x20224\x20to\x20trusted\x20recovery\x20operators','If\x20forward\x20already\x20accomplished,\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20blocks\x20re-hold','Repeated\x20hold/unhold\x20cycles\x20indicate\x20a\x20stuck\x20workflow\x20—\x20surface\x20to\x20order-monitor'],'recommended_templates':['T-PR-05']},{'id':'progress_context_repository','name':'Context\x20Repository\x20binding\x20workflow','industry':['education','content','rental','cross_chain'],'scenario':'Bind/unbind\x20Repository\x20objects\x20as\x20Progress\x20context_repositories.\x20'+'Used\x20to\x20provide\x20query-time\x20context\x20(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20'+'Up\x20to\x20MAX_CONTEXT_REPOSITORY_COUNT=30\x20repositories\x20per\x20Progress.','phases':['context_binding'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_CONTEXT_REPOSITORY],'typical_context_repository_count':0x3,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['context_repository_add\x20registers\x20binding\x20via\x20object_linker::affiliation_tx\x20(enables\x20cross-object\x20queries)','context_repository_remove\x20disaffiliates\x20via\x20object_linker::disaffiliation_tx\x20—\x20Repository\x20may\x20be\x20garbage-collected\x20if\x20no\x20other\x20refs','context_repository_clear\x20empties\x20the\x20entire\x20list\x20in\x20one\x20transaction','add\x20is\x20idempotent:\x20if\x20Repository\x20already\x20in\x20list,\x20no-op\x20(vector::contains\x20check)','Bind\x20before\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data'],'recommended_templates':['T-PR-03']},{'id':'progress_owner_receive','name':'Owner\x20receive\x20(unwrap)\x20workflow','industry':['finance','treasury','rental','freelance'],'scenario':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20sent\x20to\x20the\x20Progress\x20object.\x20'+'unwrap\x20→\x20permission::owner_receive_inner\x20forwards\x20to\x20Permission\x20owner.\x20'+'Used\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced)\x20to\x20disburse\x20funds.','phases':['owner_receive'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_OWNER_RECEIVE],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check\x20(amount\x20validation)','owner_receive_object\x20receives\x20a\x20generic\x20K:key+store\x20object\x20and\x20forwards\x20to\x20Permission\x20owner','Triggered\x20at\x20terminal\x20nodes\x20(e.g.\x20\x27return_approved\x27\x20in\x20rental,\x20\x27enforced\x27\x20in\x20arbitration)','Permission\x20owner\x20≠\x20Progress\x20creator:\x20receives\x20flow\x20to\x20whoever\x20owns\x20the\x20bound\x20Machine\x27s\x20Permission'],'recommended_templates':['T-PR-06']},{'id':'progress_completed','name':'Forward\x20advancement\x20&\x20session\x20completion','industry':['universal'],'scenario':'Advance\x20Progress\x20via\x20next()/order_next()\x20—\x20accumulates\x20weights\x20in\x20session.forwards,\x20'+'and\x20when\x20weights\x20≥\x20threshold,\x20moves\x20session\x20into\x20history\x20and\x20updates\x20Progress.current.\x20'+'This\x20is\x20the\x20canonical\x20Forward\x20advancement\x20path\x20for\x20ALL\x20non-hold\x20operations.','phases':['forward_advance','completed'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'OrderHolder','typical_count':0x1},{'role':'next_node_operator','typical_count':0x1}],'builtin_indexes_consumed':[],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Forward\x20guard\x20(Some):\x20requires\x20Passport;\x20uses\x20passport::result_for_guard\x20for\x20verification','Forward\x20guard\x20(None):\x20requires\x20permissionIndex\x20(Some)\x20or\x20namedOperator\x20match\x20(ASSERT_PERMISSION)','session.weights\x20+=\x20forward.weight;\x20when\x20≥\x20threshold,\x20push\x20session\x20into\x20ParentTableVec<History>','Progress.current\x20=\x20next_node\x20only\x20after\x20session\x20completes\x20(atomic\x20update)','E_NOT_THE_HOLDER:\x20if\x20forward\x20was\x20held\x20by\x20another\x20address,\x20next()\x20aborts','E_FORWARD_ALREADY_ACCOMPLISHED:\x20re-hold\x20on\x20completed\x20forward\x20is\x20blocked','⚠\x20ROUTING\x20RULE:\x20Forward.namedOperator=\x22\x22\x20(empty)\x20→\x20MUST\x20call\x20order.progress\x20(order_next);\x20'+'non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20→\x20MUST\x20call\x20progress.operate\x20(next).\x20'+'Wrong\x20path\x20→\x20Permission\x20denied\x20(abort\x20code\x205).\x20See\x20file\x20header\x20CRITICAL\x20ROUTING\x20RULE.'],'recommended_templates':['T-PR-04']}];export const PROGRESS_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return PROGRESS_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return PROGRESS_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return PROGRESS_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return PROGRESS_PERMISSIONS['find'](b=>b['index']===a);}export function isProgressBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['adminunhold','progress_unhold'],['admin\x20unhold','progress_unhold'],['force\x20unhold','progress_unhold'],['unhold','progress_unhold'],['release\x20hold','progress_unhold'],['owner_receive','progress_owner_receive'],['owner\x20receive','progress_owner_receive'],['unwrap','progress_owner_receive'],['context_repository','progress_context_repository'],['context\x20repository','progress_context_repository'],['repository\x20binding','progress_context_repository'],['named_operator','progress_named_operator'],['named\x20operator','progress_named_operator'],['namedoperator','progress_named_operator'],['task_set','progress_task_submit'],['task\x20set','progress_task_submit'],['submit\x20task','progress_task_submit'],['next','progress_completed'],['order_next','progress_completed'],['advance','progress_completed'],['complete','progress_completed']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export function getAllBuiltinPermissions(){return[...PROGRESS_PERMISSIONS];}export function getProgressScenesCount(){return PROGRESS_SCENES['length'];}export function validateNamedOperatorAddressList(b){const c=[];b['length']>MAX_NAMED_OPERATOR_ADDRESS_COUNT&&c['push']('Named\x20operator\x20address\x20count\x20'+b['length']+'\x20exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT);const d=new Set();for(const e of b){if(d['has'](e)){c['push']('Duplicate\x20address\x20in\x20list:\x20'+e+'\x20(Move\x20will\x20dedupe\x20silently)');break;}d['add'](e);}return{'ok':c['length']===0x0,'violations':c};}export function validateNamedOperatorCount(a){if(a>=MAX_NAMED_OPERATOR_COUNT)return{'ok':![],'violation':'Named\x20operator\x20count\x20'+a+'\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT};return{'ok':!![]};}export function validateContextRepositoryCount(a,b){const c=a+b;if(c>MAX_CONTEXT_REPOSITORY_COUNT)return{'ok':![],'violation':'Context\x20repository\x20count\x20'+c+'\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT};return{'ok':!![]};}export const PROGRESS_CROSS_OBJECT_REFS=[{'object':'Machine','phase':'universal','relationship':'Progress.machine\x20(immutable\x20bind,\x20E_MACHINE_NOT_MATCH\x20on\x20every\x20op)'},{'object':'Order','phase':'forward_advance','relationship':'Progress.task\x20=\x20Order.address\x20(1:1,\x20set\x20via\x20task_set\x20or\x20service::buy)'},{'object':'Order','phase':'forward_advance','relationship':'order_next\x20/\x20order_hold:\x20order.has_op_permission(order,\x20ctx)\x20gates\x20Forward\x20advance'},{'object':'Permission','phase':'universal','relationship':'Machine.permission\x20is\x20borrowed\x20for\x20ALL\x20220-225\x20assertions'},{'object':'Repository','phase':'context_binding','relationship':'context_repositories:\x20vector<address>\x20(≤\x2030),\x20bound\x20via\x20object_linker::affiliation_tx'},{'object':'Service','phase':'creation','relationship':'service::buy\x20→\x20new_imp\x20(bypasses\x20220\x20assertion\x20—\x20package-internal\x20entry)'},{'object':'Passport','phase':'forward_advance','relationship':'Forward.guard\x20(Some)\x20requires\x20Passport\x20+\x20passport::result_for_guard'},{'object':'Passport','phase':'unhold_state','relationship':'unhold_with_passport:\x20224\x20check\x20via\x20passport\x20(fallback\x20when\x20sender_has_permission_idcheck\x20fails)'},{'object':'Payment','phase':'owner_receive','relationship':'owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check'},{'object':'Allocation','phase':'completed','relationship':'Terminal\x20node\x20triggers\x20Allocation\x20alloc\x20(e.g.\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27return_approved\x27)'}];
|
|
1
|
+
import{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT}from'@wowok/wowok';export{MAX_NAMED_OPERATOR_COUNT,MAX_NAMED_OPERATOR_ADDRESS_COUNT,MAX_CONTEXT_REPOSITORY_COUNT};export const PROGRESS_NEW={'index':0xdc,'name':'PROGRESS_NEW','description':'Create\x20new\x20Progress\x20(asserted\x20on\x20direct\x20Progress\x20creation)','governed_operations':['direct\x20Progress\x20creation','passport-guarded\x20Progress\x20creation'],'sdk_exposed':![]};export const PROGRESS_NAMED_OPERATOR={'index':0xdd,'name':'PROGRESS_NAMED_OPERATOR','description':'Manage\x20named\x20operators\x20(add/set/remove)\x20for\x20the\x20namedOperator\x20namespace','governed_operations':['progress::namedOperator_add','progress::namedOperator_set','progress::namedOperator_remove','progress::namedOperator_add_with_passport','progress::namedOperator_set_with_passport','progress::namedOperator_remove_with_passport'],'sdk_exposed':!![]};export const PROGRESS_TASK={'index':0xde,'name':'PROGRESS_TASK','description':'Submit\x20task\x20(one-time,\x20immutable\x20once\x20set\x20—\x20E_TASK_ALREADY_SET)','governed_operations':['submit\x20the\x20task\x20(one-time)','submit\x20the\x20task\x20with\x20a\x20passport'],'sdk_exposed':!![]};export const PROGRESS_CONTEXT_REPOSITORY={'index':0xdf,'name':'PROGRESS_CONTEXT_REPOSITORY','description':'Bind/unbind\x20context\x20Repository\x20(≤\x20MAX_CONTEXT_REPOSITORY_COUNT=30)','governed_operations':['bind\x20a\x20context\x20repository','unbind\x20a\x20context\x20repository','clear\x20all\x20context\x20repositories','bind\x20a\x20context\x20repository\x20(passport-guarded)','unbind\x20a\x20context\x20repository\x20(passport-guarded)','clear\x20all\x20context\x20repositories\x20(passport-guarded)'],'sdk_exposed':!![]};export const PROGRESS_UNHOLD={'index':0xe0,'name':'PROGRESS_UNHOLD','description':'Force\x20unhold\x20(adminUnhold)\x20—\x20bypasses\x20holder\x20check,\x20releases\x20blocked\x20forward','governed_operations':['force\x20unhold\x20(adminUnhold)','force\x20unhold\x20via\x20passport'],'sdk_exposed':!![]};export const PROGRESS_OWNER_RECEIVE={'index':0xe1,'name':'PROGRESS_OWNER_RECEIVE','description':'Owner\x20receives\x20objects/coins\x20(unwrap\x20Receiving<K>\x20→\x20owner)','governed_operations':['owner\x20receives\x20coins','owner\x20receives\x20a\x20generic\x20object','owner\x20receives\x20coins\x20via\x20passport','owner\x20receives\x20a\x20generic\x20object\x20via\x20passport'],'sdk_exposed':![]};export const PROGRESS_PERMISSIONS=[PROGRESS_NEW,PROGRESS_NAMED_OPERATOR,PROGRESS_TASK,PROGRESS_CONTEXT_REPOSITORY,PROGRESS_UNHOLD,PROGRESS_OWNER_RECEIVE];export const PROGRESS_SCENES=[{'id':'progress_task_submit','name':'Task\x20submission\x20&\x20binding\x20workflow','industry':['universal','ecommerce','logistics','education'],'scenario':'Submit\x20a\x20task\x20(Order/Reward/etc.)\x20to\x20Progress\x20via\x20task\x20submission.\x20'+'Task\x20is\x20one-time,\x20immutable\x20—\x20once\x20set,\x20E_TASK_ALREADY_SET\x20blocks\x20any\x20re-assignment.\x20'+'Binds\x20Progress\x201:1\x20to\x20the\x20task\x20object\x20for\x20the\x20rest\x20of\x20its\x20lifecycle.','phases':['task_binding','forward_advance'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_TASK],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Task\x20submission\x20is\x20one-time:\x20verify\x20task\x20address\x20before\x20submission\x20(E_TASK_ALREADY_SET\x20blocks\x20reset)','task\x20is\x20usually\x20an\x20Order\x20created\x20by\x20the\x20buy\x20flow\x20→\x20Progress.task\x20=\x20Order\x20address','Without\x20task,\x20Forward\x20advancement\x20falls\x20back\x20to\x20non-order\x20next()/hold()\x20paths'],'recommended_templates':['T-PR-01']},{'id':'progress_named_operator','name':'Named\x20operator\x20namespace\x20management','industry':['universal','logistics','arbitration','freelance'],'scenario':'Manage\x20named_operator\x20namespace\x20for\x20a\x20Progress.\x20Each\x20named\x20operator\x20is\x20a\x20(name\x20→\x20address\x20list)\x20'+'binding\x20used\x20by\x20Machine.forward.namedOperator\x20to\x20gate\x20next()/hold()\x20advancement.\x20'+'Up\x20to\x2060\x20named\x20operators\x20per\x20Progress,\x20up\x20to\x2080\x20addresses\x20per\x20operator.','phases':['named_operator_mgmt'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[{'role':'seller','typical_count':0x1},{'role':'logistics','typical_count':0x1},{'role':'reviewer','typical_count':0x3},{'role':'arbitrator','typical_count':0x5}],'builtin_indexes_consumed':[PROGRESS_NAMED_OPERATOR],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['namedOperator\x20name=\x27\x27:\x20special\x20case\x20—\x20means\x20OrderHolder\x20(order.owner/agent),\x20NOT\x20a\x20real\x20named\x20operator','add/set/remove\x20are\x20idempotent\x20on\x20duplicate\x20addresses\x20(vector::contains\x20check\x20before\x20push)','Use\x20\x27set\x27\x20to\x20REPLACE\x20an\x20operator\x27s\x20address\x20list;\x20use\x20\x27add\x27\x20to\x20extend;\x20\x27remove\x27\x20to\x20subtract','Names\x20must\x20satisfy\x20common::NAME\x20(isValidName)\x20—\x20non-empty,\x20length-bounded'],'recommended_templates':['T-PR-01','T-PR-02']},{'id':'progress_unhold','name':'Hold\x20release\x20(unhold\x20/\x20adminUnhold)\x20workflow','industry':['content','rental','arbitration','subscription'],'scenario':'Release\x20a\x20forward\x20that\x20was\x20previously\x20held.\x20Two\x20paths:\x20'+'(a)\x20unhold\x20by\x20original\x20holder\x20(named_operator\x20match);\x20'+'(b)\x20adminUnhold\x20(224)\x20by\x20permission-table\x20holder\x20—\x20bypasses\x20holder\x20check.\x20'+'adminUnhold\x20is\x20the\x20deadlock-resolution\x20escape\x20hatch\x20when\x20a\x20holder\x20is\x20unresponsive.','phases':['hold_state','unhold_state'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'holder','typical_count':0x1},{'role':'admin','typical_count':0x1}],'builtin_indexes_consumed':[PROGRESS_UNHOLD],'typical_context_repository_count':0x0,'uses_hold_mechanism':!![],'uses_admin_unhold':!![],'common_patterns':['unhold\x20checks\x20whether\x20the\x20sender\x20holds\x20permission\x20index\x20224:\x20if\x20yes,\x20force\x20release;\x20if\x20no,\x20require\x20holder\x20match','adminUnhold\x20has\x20wider\x20blast\x20radius\x20—\x20only\x20grant\x20224\x20to\x20trusted\x20recovery\x20operators','If\x20forward\x20already\x20accomplished,\x20E_FORWARD_ALREADY_ACCOMPLISHED\x20blocks\x20re-hold','Repeated\x20hold/unhold\x20cycles\x20indicate\x20a\x20stuck\x20workflow\x20—\x20surface\x20to\x20order-monitor'],'recommended_templates':['T-PR-05']},{'id':'progress_context_repository','name':'Context\x20Repository\x20binding\x20workflow','industry':['education','content','rental','cross_chain'],'scenario':'Bind/unbind\x20Repository\x20objects\x20as\x20Progress\x20context_repositories.\x20'+'Used\x20to\x20provide\x20query-time\x20context\x20(learning\x20progress,\x20inspection\x20records,\x20bridge\x20state).\x20'+'Up\x20to\x20MAX_CONTEXT_REPOSITORY_COUNT=30\x20repositories\x20per\x20Progress.','phases':['context_binding'],'requires_published_machine':!![],'requires_order_bound':![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_CONTEXT_REPOSITORY],'typical_context_repository_count':0x3,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Binding\x20a\x20context\x20repository\x20registers\x20the\x20link\x20through\x20an\x20affiliation\x20transaction\x20(enables\x20cross-object\x20queries)','Unbinding\x20disaffiliates\x20the\x20link\x20—\x20Repository\x20may\x20be\x20garbage-collected\x20if\x20no\x20other\x20refs','Clearing\x20empties\x20the\x20entire\x20list\x20in\x20one\x20transaction','add\x20is\x20idempotent:\x20if\x20Repository\x20already\x20in\x20list,\x20no-op\x20(vector::contains\x20check)','Bind\x20before\x20forward\x20advance\x20so\x20on-chain\x20guards\x20can\x20read\x20context\x20data'],'recommended_templates':['T-PR-03']},{'id':'progress_owner_receive','name':'Owner\x20receive\x20(unwrap)\x20workflow','industry':['finance','treasury','rental','freelance'],'scenario':'Owner\x20receives\x20Receiving<K>\x20objects\x20or\x20CoinWrapper<T>\x20coins\x20sent\x20to\x20the\x20Progress\x20object.\x20'+'unwrap\x20→\x20forwarded\x20to\x20the\x20Permission\x20owner\x20through\x20the\x20permission\x20owner-receive\x20path.\x20'+'Used\x20at\x20terminal\x20nodes\x20(return_approved,\x20completed,\x20enforced)\x20to\x20disburse\x20funds.','phases':['owner_receive'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[],'builtin_indexes_consumed':[PROGRESS_OWNER_RECEIVE],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20the\x20payment\x27s\x20type-checked\x20unwrap\x20(amount\x20validation)','Receiving\x20a\x20generic\x20K:key+store\x20object\x20forwards\x20it\x20to\x20the\x20Permission\x20owner','Triggered\x20at\x20terminal\x20nodes\x20(e.g.\x20\x27return_approved\x27\x20in\x20rental,\x20\x27enforced\x27\x20in\x20arbitration)','Permission\x20owner\x20≠\x20Progress\x20creator:\x20receives\x20flow\x20to\x20whoever\x20owns\x20the\x20bound\x20Machine\x27s\x20Permission'],'recommended_templates':['T-PR-06']},{'id':'progress_completed','name':'Forward\x20advancement\x20&\x20session\x20completion','industry':['universal'],'scenario':'Advance\x20Progress\x20via\x20next()\x20/\x20the\x20order-holder\x20advancement\x20path\x20—\x20accumulates\x20weights\x20in\x20session.forwards,\x20'+'and\x20when\x20weights\x20≥\x20threshold,\x20moves\x20session\x20into\x20history\x20and\x20updates\x20Progress.current.\x20'+'This\x20is\x20the\x20canonical\x20Forward\x20advancement\x20path\x20for\x20ALL\x20non-hold\x20operations.','phases':['forward_advance','completed'],'requires_published_machine':!![],'requires_order_bound':!![],'named_operator_roles':[{'role':'OrderHolder','typical_count':0x1},{'role':'next_node_operator','typical_count':0x1}],'builtin_indexes_consumed':[],'typical_context_repository_count':0x0,'uses_hold_mechanism':![],'uses_admin_unhold':![],'common_patterns':['Forward\x20guard\x20(Some):\x20requires\x20Passport;\x20the\x20passport\x20verification\x20against\x20the\x20guard\x20must\x20pass','Forward\x20guard\x20(None):\x20requires\x20permissionIndex\x20(Some)\x20or\x20namedOperator\x20match\x20(ASSERT_PERMISSION)','session.weights\x20+=\x20forward.weight;\x20when\x20≥\x20threshold,\x20push\x20session\x20into\x20ParentTableVec<History>','Progress.current\x20=\x20next_node\x20only\x20after\x20session\x20completes\x20(atomic\x20update)','E_NOT_THE_HOLDER:\x20if\x20forward\x20was\x20held\x20by\x20another\x20address,\x20next()\x20aborts','E_FORWARD_ALREADY_ACCOMPLISHED:\x20re-hold\x20on\x20completed\x20forward\x20is\x20blocked','⚠\x20ROUTING\x20RULE:\x20Forward.namedOperator=\x22\x22\x20(empty)\x20→\x20MUST\x20use\x20the\x20order-holder\x20path\x20(order.progress);\x20'+'non-empty\x20namedOperator\x20or\x20permissionIndex-only\x20→\x20MUST\x20call\x20progress.operate\x20(next).\x20'+'Wrong\x20path\x20→\x20Permission\x20denied\x20(abort\x20code\x205).\x20See\x20file\x20header\x20CRITICAL\x20ROUTING\x20RULE.'],'recommended_templates':['T-PR-04']}];export const PROGRESS_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return PROGRESS_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return PROGRESS_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return PROGRESS_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return PROGRESS_PERMISSIONS['find'](b=>b['index']===a);}export function isProgressBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['adminunhold','progress_unhold'],['admin\x20unhold','progress_unhold'],['force\x20unhold','progress_unhold'],['unhold','progress_unhold'],['release\x20hold','progress_unhold'],['owner_receive','progress_owner_receive'],['owner\x20receive','progress_owner_receive'],['unwrap','progress_owner_receive'],['context_repository','progress_context_repository'],['context\x20repository','progress_context_repository'],['repository\x20binding','progress_context_repository'],['named_operator','progress_named_operator'],['named\x20operator','progress_named_operator'],['namedoperator','progress_named_operator'],['task\x20set','progress_task_submit'],['submit\x20task','progress_task_submit'],['next','progress_completed'],['advance','progress_completed'],['complete','progress_completed']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export function getAllBuiltinPermissions(){return[...PROGRESS_PERMISSIONS];}export function getProgressScenesCount(){return PROGRESS_SCENES['length'];}export function validateNamedOperatorAddressList(b){const c=[];b['length']>MAX_NAMED_OPERATOR_ADDRESS_COUNT&&c['push']('Named\x20operator\x20address\x20count\x20'+b['length']+'\x20exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT);const d=new Set();for(const e of b){if(d['has'](e)){c['push']('Duplicate\x20address\x20in\x20list:\x20'+e+'\x20(Move\x20will\x20dedupe\x20silently)');break;}d['add'](e);}return{'ok':c['length']===0x0,'violations':c};}export function validateNamedOperatorCount(a){if(a>=MAX_NAMED_OPERATOR_COUNT)return{'ok':![],'violation':'Named\x20operator\x20count\x20'+a+'\x20would\x20exceed\x20MAX_NAMED_OPERATOR_COUNT\x20'+MAX_NAMED_OPERATOR_COUNT};return{'ok':!![]};}export function validateContextRepositoryCount(a,b){const c=a+b;if(c>MAX_CONTEXT_REPOSITORY_COUNT)return{'ok':![],'violation':'Context\x20repository\x20count\x20'+c+'\x20would\x20exceed\x20MAX_CONTEXT_REPOSITORY_COUNT\x20'+MAX_CONTEXT_REPOSITORY_COUNT};return{'ok':!![]};}export const PROGRESS_CROSS_OBJECT_REFS=[{'object':'Machine','phase':'universal','relationship':'Progress.machine\x20(immutable\x20bind,\x20E_MACHINE_NOT_MATCH\x20on\x20every\x20op)'},{'object':'Order','phase':'forward_advance','relationship':'Progress.task\x20=\x20Order.address\x20(1:1,\x20set\x20via\x20task\x20submission\x20or\x20the\x20buy\x20flow)'},{'object':'Order','phase':'forward_advance','relationship':'order-holder\x20paths\x20(advance\x20/\x20hold):\x20the\x20order\x20owner-or-agent\x20permission\x20check\x20gates\x20Forward\x20advance'},{'object':'Permission','phase':'universal','relationship':'Machine.permission\x20is\x20borrowed\x20for\x20ALL\x20220-225\x20assertions'},{'object':'Repository','phase':'context_binding','relationship':'context_repositories:\x20vector<address>\x20(≤\x2030),\x20bound\x20via\x20an\x20affiliation\x20transaction'},{'object':'Service','phase':'creation','relationship':'the\x20buy\x20flow\x20creates\x20the\x20Progress\x20internally\x20(bypasses\x20220\x20assertion\x20—\x20package-internal\x20entry)'},{'object':'Passport','phase':'forward_advance','relationship':'Forward.guard\x20(Some)\x20requires\x20Passport\x20+\x20passing\x20the\x20passport\x20verification'},{'object':'Passport','phase':'unhold_state','relationship':'passport-based\x20unhold:\x20224\x20check\x20via\x20passport\x20(fallback\x20when\x20the\x20sender\x27s\x20direct\x20224\x20permission\x20check\x20fails)'},{'object':'Payment','phase':'owner_receive','relationship':'owner_receive\x20unwraps\x20CoinWrapper<T>\x20via\x20the\x20payment\x27s\x20type-checked\x20unwrap'},{'object':'Allocation','phase':'completed','relationship':'Terminal\x20node\x20triggers\x20Allocation\x20alloc\x20(e.g.\x20\x27completed\x27,\x20\x27enforced\x27,\x20\x27return_approved\x27)'}];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ProgressBuiltinPermissionEntry } from "./progress-ledger.js";
|
|
2
2
|
export interface ProgressIntentPuzzle {
|
|
3
|
-
action: "create" | "operate" | "
|
|
3
|
+
action: "create" | "operate" | "bind task" | "named_operator" | "repository" | "owner_receive" | "query";
|
|
4
4
|
target_progress?: string;
|
|
5
5
|
rule_sentence: string;
|
|
6
6
|
failure_conditions: string[];
|
|
@@ -70,7 +70,7 @@ export declare function initPuzzleFromIntent(intent: Partial<ProgressIntentPuzzl
|
|
|
70
70
|
export declare function checkPuzzleCompleteness(puzzle: ProgressPuzzle): ProgressPuzzleCompleteness;
|
|
71
71
|
export interface ProgressConstraintViolation {
|
|
72
72
|
constraint_id: string;
|
|
73
|
-
severity: "
|
|
73
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
74
74
|
message: string;
|
|
75
75
|
current_value?: string | number;
|
|
76
76
|
limit?: string | number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_NAMED_OPERATOR_ADDRESS_COUNT}from'@wowok/wowok';import{getBuiltinPermissionByIndex}from'./progress-ledger.js';export function initPuzzleFromIntent(a){const b={};return(a['action']||a['rule_sentence'])&&(b['intent']={'action':a['action']??'operate','target_progress':a['target_progress'],'rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_PR_01_machine_published':![],'F_PR_02_machine_bound':![],'F_PR_03_named_operator_count_le_60':!![],'F_PR_04_named_operator_addr_le_80':!![],'F_PR_05_context_repository_le_30':!![],'F_PR_06_task_one_time':!![],'F_PR_07_forward_exists_in_machine':![],'F_PR_08_holder_match_for_unhold':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],c=[];if(!a['intent'])b['push']('A'),c['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20rule_sentence)'});else!a['intent']['rule_sentence']&&(b['push']('A'),c['push']({'dimension':'A','reason':'rule_sentence\x20is\x20empty'}));const d=a['intent']?.['action']==='query';if(!d){if(!a['workflow'])b['push']('B'),c['push']({'dimension':'B','reason':'Workflow\x20not\x20specified\x20(machine\x20+\x20current_node)'});else{if(!a['workflow']['machine'])b['push']('B'),c['push']({'dimension':'B','reason':'machine\x20address\x20missing'});else!a['workflow']['machine_published']&&(b['push']('B'),c['push']({'dimension':'B','reason':'Machine\x20not\x20published\x20—\x20Progress\x20requires\x20published\x20Machine'}));}}if(a['intent']?.['action']==='named_operator'){if(!a['named_operator'])b['push']('C'),c['push']({'dimension':'C','reason':'named_operator\x20config\x20not\x20specified\x20(name\x20+\x20op\x20+\x20addresses)'});else!a['named_operator']['name']&&!a['named_operator']['is_order_holder_namespace']&&(b['push']('C'),c['push']({'dimension':'C','reason':'named_operator.name\x20is\x20empty\x20(use\x20is_order_holder_namespace=true\x20for\x20OrderHolder)'}));}if(a['intent']?.['action']==='
|
|
1
|
+
import{MAX_NAMED_OPERATOR_ADDRESS_COUNT}from'@wowok/wowok';import{getBuiltinPermissionByIndex}from'./progress-ledger.js';export function initPuzzleFromIntent(a){const b={};return(a['action']||a['rule_sentence'])&&(b['intent']={'action':a['action']??'operate','target_progress':a['target_progress'],'rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_PR_01_machine_published':![],'F_PR_02_machine_bound':![],'F_PR_03_named_operator_count_le_60':!![],'F_PR_04_named_operator_addr_le_80':!![],'F_PR_05_context_repository_le_30':!![],'F_PR_06_task_one_time':!![],'F_PR_07_forward_exists_in_machine':![],'F_PR_08_holder_match_for_unhold':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],c=[];if(!a['intent'])b['push']('A'),c['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20rule_sentence)'});else!a['intent']['rule_sentence']&&(b['push']('A'),c['push']({'dimension':'A','reason':'rule_sentence\x20is\x20empty'}));const d=a['intent']?.['action']==='query';if(!d){if(!a['workflow'])b['push']('B'),c['push']({'dimension':'B','reason':'Workflow\x20not\x20specified\x20(machine\x20+\x20current_node)'});else{if(!a['workflow']['machine'])b['push']('B'),c['push']({'dimension':'B','reason':'machine\x20address\x20missing'});else!a['workflow']['machine_published']&&(b['push']('B'),c['push']({'dimension':'B','reason':'Machine\x20not\x20published\x20—\x20Progress\x20requires\x20published\x20Machine'}));}}if(a['intent']?.['action']==='named_operator'){if(!a['named_operator'])b['push']('C'),c['push']({'dimension':'C','reason':'named_operator\x20config\x20not\x20specified\x20(name\x20+\x20op\x20+\x20addresses)'});else!a['named_operator']['name']&&!a['named_operator']['is_order_holder_namespace']&&(b['push']('C'),c['push']({'dimension':'C','reason':'named_operator.name\x20is\x20empty\x20(use\x20is_order_holder_namespace=true\x20for\x20OrderHolder)'}));}if(a['intent']?.['action']==='bind\x20task'){if(!a['task'])b['push']('D'),c['push']({'dimension':'D','reason':'Task\x20data\x20not\x20specified\x20(task_address\x20+\x20immutability_acknowledged)'});else{if(!a['task']['task_address'])b['push']('D'),c['push']({'dimension':'D','reason':'task_address\x20missing'});else!a['task']['immutability_acknowledged']&&(b['push']('D'),c['push']({'dimension':'D','reason':'immutability_acknowledged=false\x20—\x20user\x20must\x20acknowledge\x20task\x20is\x20one-time'}));}}return!a['permission']&&(b['push']('E'),c['push']({'dimension':'E','reason':'Permission\x20config\x20not\x20specified\x20(builtin_indexes\x20/\x20forward_permission_index\x20/\x20passport)'})),!a['constraints']&&(b['push']('F'),c['push']({'dimension':'F','reason':'Constraints\x20not\x20checked'})),{'dimensions':['A','B','C','D','E','F'],'missing':b,'missing_details':c,'complete':b['length']===0x0,'next_step':b['length']===0x0?'Puzzle\x20complete\x20—\x20ready\x20for\x20confirmation\x20text\x20generation':'Next:\x20complete\x20dimension\x20'+b[0x0]+'\x20—\x20'+c[0x0]['reason']};}export function validateConstraints(a){const b=[];return a['workflow']&&!a['workflow']['machine_published']&&b['push']({'constraint_id':'F-PR-01','severity':'critical','message':'Machine\x20'+a['workflow']['machine']+'\x20is\x20not\x20published\x20—\x20Progress\x20requires\x20a\x20published\x20Machine','current_value':'unpublished','limit':'published'}),a['named_operator']&&(a['named_operator']['addresses']['length']>MAX_NAMED_OPERATOR_ADDRESS_COUNT&&b['push']({'constraint_id':'F-PR-04','severity':'high','message':'named_operator\x20\x22'+a['named_operator']['name']+'\x22\x20has\x20'+a['named_operator']['addresses']['length']+'\x20addresses,\x20exceeds\x20MAX_NAMED_OPERATOR_ADDRESS_COUNT\x20'+MAX_NAMED_OPERATOR_ADDRESS_COUNT,'current_value':a['named_operator']['addresses']['length'],'limit':MAX_NAMED_OPERATOR_ADDRESS_COUNT})),a['task']&&!a['task']['immutability_acknowledged']&&b['push']({'constraint_id':'F-PR-06','severity':'high','message':'Task\x20immutability\x20not\x20acknowledged\x20—\x20task\x20is\x20one-time,\x20E_TASK_ALREADY_SET\x20blocks\x20reset','current_value':'not_acknowledged','limit':'acknowledged'}),a['intent']?.['action']==='operate'&&a['intent']['rule_sentence']['toLowerCase']()['includes']('unhold')&&a['constraints']&&!a['constraints']['F_PR_08_holder_match_for_unhold']&&b['push']({'constraint_id':'F-PR-08','severity':'high','message':'unhold\x20requires\x20sender\x20==\x20holder\x20OR\x20sender\x20has\x20224\x20permission\x20(adminUnhold)'}),b;}export function generateConfirmationText(a){const b=[];b['push']('═══\x20Progress\x20Confirmation\x20═══'),b['push']('');if(a['intent']){b['push']('Action:\x20'+a['intent']['action']);if(a['intent']['target_progress'])b['push']('Target\x20Progress:\x20'+a['intent']['target_progress']);b['push']('Rule:\x20'+a['intent']['rule_sentence']);if(a['intent']['failure_conditions']['length']>0x0){b['push']('Failure\x20conditions:');for(const d of a['intent']['failure_conditions'])b['push']('\x20\x20-\x20'+d);}b['push']('');}a['workflow']&&(b['push']('─\x20Workflow\x20──────────────'),b['push']('Machine:\x20'+a['workflow']['machine']+'\x20(published:\x20'+(a['workflow']['machine_published']?'YES':'NO')+')'),b['push']('Order/Task:\x20'+(a['workflow']['order']??'(not\x20bound)')),b['push']('Current\x20node:\x20'+a['workflow']['current_node']),a['workflow']['forward_target']&&b['push']('Forward\x20target:\x20'+a['workflow']['current_node']+'\x20--('+a['workflow']['forward_target']['forward']+')-->\x20'+a['workflow']['forward_target']['next_node_name']),b['push']('Use\x20order\x20variant:\x20'+(a['workflow']['use_order_variant']?'YES\x20(order-variant\x20next\x20/\x20hold)':'NO\x20(next\x20/\x20hold)')),b['push'](''));a['named_operator']&&(b['push']('─\x20Named\x20Operator\x20──────────────'),b['push']('Name:\x20\x22'+a['named_operator']['name']+'\x22'+(a['named_operator']['is_order_holder_namespace']?'\x20(OrderHolder\x20namespace)':'')),b['push']('Op:\x20'+a['named_operator']['op']),b['push']('Addresses\x20('+a['named_operator']['addresses']['length']+'/'+MAX_NAMED_OPERATOR_ADDRESS_COUNT+'):\x20'+a['named_operator']['addresses']['join'](',\x20')),b['push'](''));a['task']&&(b['push']('─\x20Task\x20──────────────'),b['push']('Task\x20address:\x20'+a['task']['task_address']),a['task']['submitted_data']&&b['push']('Submitted\x20data\x20('+a['task']['submitted_data']['type']+'):\x20'+a['task']['submitted_data']['payload']['slice'](0x0,0x50)+(a['task']['submitted_data']['payload']['length']>0x50?'…':'')),b['push']('Immutability\x20acknowledged:\x20'+(a['task']['immutability_acknowledged']?'YES':'NO')),b['push'](''));if(a['permission']){b['push']('─\x20Permission\x20──────────────');if(a['permission']['builtin_indexes_used']['length']>0x0){b['push']('Builtin\x20indexes\x20used\x20(management):');for(const e of a['permission']['builtin_indexes_used']){b['push']('\x20\x20['+e['index']+']\x20'+e['name']+':\x20'+e['description']);}}a['permission']['forward_permission_index']!==null&&b['push']('Forward.permissionIndex:\x20'+a['permission']['forward_permission_index']),b['push']('Named\x20operator\x20short-circuit:\x20'+(a['permission']['uses_named_operator_short_circuit']?'YES':'NO')),b['push']('Requires\x20Passport:\x20'+(a['permission']['requires_passport']?'YES':'NO')),b['push']('Uses\x20order-level\x20operation\x20permission\x20check:\x20'+(a['permission']['uses_order_permission']?'YES':'NO')),b['push']('');}const c=validateConstraints(a);if(c['length']>0x0){b['push']('─\x20Constraint\x20Violations\x20──────────────');for(const f of c)b['push']('\x20\x20['+f['severity']+']\x20'+f['constraint_id']+':\x20'+f['message']);b['push']('');}return b['join']('\x0a');}export function resolveBuiltinPermission(a){return getBuiltinPermissionByIndex(a);}export function isOrderHolderForward(a){return a['permission']?.['uses_named_operator_short_circuit']===![]&&a['permission']?.['forward_permission_index']===null&&a['workflow']?.['use_order_variant']===!![];}export function getRelevantDimensions(a){const b=['A','B','E','F'];if(a==='named_operator')b['push']('C');if(a==='bind\x20task')b['push']('D');return b;}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type Facts, type FindingExposure } from "../config/rule-engine.js";
|
|
1
2
|
import { type ProgressScene } from "./progress-ledger.js";
|
|
2
|
-
export type ProgressRiskLevel = "
|
|
3
|
+
export type ProgressRiskLevel = "critical" | "high" | "medium" | "low";
|
|
3
4
|
export type ProgressRiskCategory = "structural" | "semantic" | "permission" | "lifecycle" | "cross_object";
|
|
4
5
|
export interface ProgressRisk {
|
|
5
6
|
id: string;
|
|
@@ -11,6 +12,7 @@ export interface ProgressRisk {
|
|
|
11
12
|
scenario: string;
|
|
12
13
|
mitigation: string;
|
|
13
14
|
evidence?: string;
|
|
15
|
+
exposure?: FindingExposure;
|
|
14
16
|
}
|
|
15
17
|
export type ProgressStakeholder = "owner" | "named_operator" | "submitter" | "system";
|
|
16
18
|
export interface ProgressRiskRule {
|
|
@@ -58,6 +60,7 @@ export interface ProgressRiskCheckContext {
|
|
|
58
60
|
forward_has_guard?: boolean;
|
|
59
61
|
target_objects_types?: string[];
|
|
60
62
|
}
|
|
63
|
+
export declare function progressRiskFacts(ctx: ProgressRiskCheckContext): Facts;
|
|
61
64
|
export declare const PROGRESS_RISK_VERSION = "1.0.0";
|
|
62
65
|
export declare function getAllProgressRiskRules(): ProgressRiskRule[];
|
|
63
66
|
export interface ProgressRiskAssessment {
|
|
@@ -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\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 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';import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook}from'../config/rule-engine.js';const MAX_LONG_NAME_LENGTH=0x400;export function progressRiskFacts(a){const b=a['progress_namedOperator'],c=b?b['operators']?.['length']??0x0:undefined,d=a['current_named_operator_count']??0x0,e=a['repository'],f=e?e['op']==='remove'||e['op']==='clear'?0x0:e['objects']?.['length']??0x0:0x0,g=a['current_context_repository_count']??0x0,h=a['current_task']!==null&&a['current_task']!==undefined,i=a['operate'],j=i?.['op'],k=typeof i?.['message']==='string'?i['message']['length']:undefined,l=i?String(i['operation']?.['forward']):undefined,m=i?String(i['operation']?.['next_node_name']):undefined,n=a['target_objects_types'],o=Array['isArray'](n)?[...new Set(n)]:[];return{'named_operator_addr_count':c,'named_operator_name':b?String(b['name']):undefined,'max_named_operator_address_count':MAX_NAMED_OPERATOR_ADDRESS_COUNT,'named_operator_addr_count_exceeded':!!b&&(c??0x0)>MAX_NAMED_OPERATOR_ADDRESS_COUNT,'named_operator_count_current':d,'max_named_operator_count':MAX_NAMED_OPERATOR_COUNT,'named_operator_count_at_limit':b?.['op']==='add'&&d>=MAX_NAMED_OPERATOR_COUNT,'context_repo_current':g,'context_repo_add_count':f,'context_repo_total':g+f,'max_context_repository_count':MAX_CONTEXT_REPOSITORY_COUNT,'context_repo_count_exceeded':!!e&&e['op']!=='clear'&&f>0x0&&g+f>MAX_CONTEXT_REPOSITORY_COUNT,'named_operator_empty_name':!!b&&b['name']===''&&b['op']!=='remove','task_submit_blocked':!!a['task']&&h,'current_task_display':h?String(a['current_task']):undefined,'operate_message_over_long':k!==undefined&&k>MAX_LONG_NAME_LENGTH,'operate_message_length':k,'operate_op_invalid':!!j&&!['next','hold','unhold','adminUnhold']['includes'](j),'operate_op':i?String(j):undefined,'admin_unhold_op':j==='adminUnhold','operate_forward':l,'operate_next_node_name':m,'forward_named_operator':a['forward_named_operator'],'forward_named_op_bypass':!!i&&!!a['forward_named_operator']&&a['forward_named_operator']!=='','forward_has_guard_display':i?String(a['forward_has_guard']):undefined,'guard_passport_required':!!i&&!!a['forward_has_guard']&&!a['forward_permission_index'],'machine_published_false':a['machine_published']===![],'machine_name':String(a['current_machine']),'machine_name_or_unknown':String(a['current_machine']??'(unknown)'),'forward_reaccomplish':!!i&&!!a['forward_already_accomplished'],'unhold_non_holder':j==='unhold'&&!!a['holder_address']&&!!a['signer']&&a['holder_address']!==a['signer'],'holder_display':String(a['holder_address']),'signer_display':String(a['signer']),'repository_add_op':e?.['op']==='add','repo_add_count':f,'heterogeneous_host_types':!!n&&n['length']>=0x2&&o['length']>0x1,'unique_target_types_csv_space':o['length']>0x1?o['join'](',\x20'):undefined,'unique_target_types_csv':o['length']>0x1?o['join'](','):undefined,'orderless_operate':!!i&&a['current_task']===null&&j!==undefined};}function progressRuleBook(){const a=getJudgmentDoc()['rules']['domains']['progress'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27progress\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function findingToProgressRisk(a){return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'structural','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','evidence':a['evidence'],...a['exposure']!=null?{'exposure':a['exposure']}:{}};}export const PROGRESS_RISK_VERSION='1.0.0';export function getAllProgressRiskRules(){const a=factoryRulePack('progress');if(!a)return[];return a['rules']['map'](b=>({'id':b['rule_id'],'category':b['dimension']??'structural','trigger':b['trigger']??'','check':c=>{const {findings:d}=evaluateRuleBook([b],progressRiskFacts(c));return d['length']>0x0?findingToProgressRisk(d[0x0]):null;}}));}export function assessProgressRisks(a){const {findings:b}=evaluateRuleBook(progressRuleBook(),progressRiskFacts(a)),c=b['map'](findingToProgressRisk),d=c['length']===0x0?'low':c['some'](g=>g['level']==='critical')?'critical':c['some'](g=>g['level']==='high')?'high':c['some'](g=>g['level']==='medium')?'medium':'low',e={};for(const g of c){e[g['category']]=(e[g['category']]??0x0)+0x1;}const f={};for(const h of c){for(const i of h['affected_stakeholders']){if(!f[i])f[i]=[];f[i]['push'](h['id']+':\x20'+h['mitigation']);}}return{'summary':'Assessed\x20'+c['length']+'\x20risk(s)\x20across\x20'+Object['keys'](e)['length']+'\x20categories','risks':c,'overall_risk':d,'risks_by_category':e,'stakeholder_advice':f,'needs_human_review':c['some'](j=>j['level']==='critical'||j['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\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
|
+
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:\x20verify\x20via\x20the\x20Machine\x20forward-info\x20lookup\x20(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\x20the\x20Payment\x20with\x20an\x20amount\x20check;\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\x20owner-receive\x20(coin\x20variant)':'Progress\x20owner-receive\x20(object\x20variant)','_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:\x20unwrapping\x20the\x20Payment\x20validates\x20the\x20amount\x20before\x20forwarding\x20to\x20owner','For\x20objects:\x20generic\x20K:key+store\x20—\x20forwarded\x20directly\x20through\x20the\x20Permission\x27s\x20owner-receive\x20path']}];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)};}
|