@wowok/agent-mcp 2.7.0 → 2.7.2
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/index.js +1 -1
- package/dist/config/runtime.js +1 -238
- package/dist/customer/customer-advice.js +1 -130
- package/dist/customer/index.js +1 -11
- package/dist/customer/industry-risks.js +1 -438
- package/dist/customer/info-puzzle.js +1 -681
- package/dist/customer/order-monitor.js +1 -328
- package/dist/customer/order-strategy.js +1 -373
- package/dist/customer/post-purchase.js +1 -351
- package/dist/customer/preorder-compare.js +1 -34
- package/dist/customer/reminder-system.js +1 -316
- package/dist/customer/risk-assessment.d.ts +5 -1
- package/dist/customer/risk-assessment.js +1 -397
- package/dist/customer/types.js +1 -13
- package/dist/customer/user-preferences.js +1 -460
- package/dist/evaluation/arbitration-game.d.ts +23 -0
- package/dist/evaluation/arbitration-game.js +1 -0
- package/dist/evaluation/builtins/demand-match.d.ts +15 -0
- package/dist/evaluation/builtins/demand-match.js +1 -0
- package/dist/evaluation/builtins/index.d.ts +3 -0
- package/dist/evaluation/builtins/index.js +1 -0
- package/dist/evaluation/builtins/service-risk.d.ts +6 -0
- package/dist/evaluation/builtins/service-risk.js +1 -0
- package/dist/evaluation/capability.d.ts +50 -0
- package/dist/evaluation/capability.js +1 -0
- package/dist/evaluation/composer.d.ts +13 -0
- package/dist/evaluation/composer.js +1 -0
- package/dist/evaluation/engine.d.ts +18 -0
- package/dist/evaluation/engine.js +1 -0
- package/dist/evaluation/extract.d.ts +30 -0
- package/dist/evaluation/extract.js +1 -0
- package/dist/evaluation/game-strategy.d.ts +27 -0
- package/dist/evaluation/game-strategy.js +1 -0
- package/dist/evaluation/gap.d.ts +2 -0
- package/dist/evaluation/gap.js +1 -0
- package/dist/evaluation/index.d.ts +12 -0
- package/dist/evaluation/index.js +1 -0
- package/dist/evaluation/node-game.d.ts +62 -0
- package/dist/evaluation/node-game.js +1 -0
- package/dist/evaluation/region.d.ts +10 -0
- package/dist/evaluation/region.js +1 -0
- package/dist/evaluation/types.d.ts +77 -0
- package/dist/evaluation/types.js +1 -0
- package/dist/evaluation/user-injection.d.ts +6 -0
- package/dist/evaluation/user-injection.js +1 -0
- package/dist/examples/education-contact-create.json +40 -0
- package/dist/examples/freelance-contact-create.json +40 -0
- package/dist/examples/insurance-machine-create.json +1 -1
- package/dist/examples/insurance-service-allocators.json +1 -1
- package/dist/examples/machine-publish.json +1 -1
- package/dist/examples/rental-ziroom-service-create.json +1 -1
- package/dist/examples/retail-adv-guard-messenger-proof-create.json +1 -1
- package/dist/examples/retail-myshop-service-create.json +1 -1
- package/dist/examples/retail-myshop-service-customer-required.json +1 -1
- package/dist/examples/subscription-contact-create.json +40 -0
- package/dist/examples/threebody-machine-create.json +1 -1
- package/dist/examples/travel-machine-create.json +1 -1
- package/dist/examples/travel-service-create.json +1 -1
- package/dist/experience/experience-reuse.js +1 -103
- package/dist/experience/index.js +1 -5
- package/dist/experience/intent-distill.js +1 -83
- package/dist/experience/realtime-feedback.js +1 -94
- package/dist/experience/types.js +1 -1
- package/dist/experience/user-profile.js +1 -171
- package/dist/extensions/business-modules.js +1 -287
- package/dist/extensions/capability-manifest.js +1 -781
- package/dist/extensions/constraint-registry.js +1 -198
- package/dist/extensions/index.js +1 -6
- package/dist/extensions/metric-registry.js +1 -257
- package/dist/extensions/mode-evaluator.js +1 -170
- package/dist/extensions/modes.js +1 -499
- package/dist/extensions/registry.js +1 -717
- package/dist/extensions/types.js +1 -1
- package/dist/harness/auto-escalation.js +1 -68
- package/dist/harness/checkpoint.js +1 -129
- package/dist/harness/index.js +1 -78
- package/dist/harness/plan.js +1 -276
- package/dist/harness/recover.js +1 -139
- package/dist/harness/types.js +1 -1
- package/dist/harness/verify.js +1 -237
- package/dist/index.js +1 -273
- package/dist/intent/enrich.d.ts +1 -0
- package/dist/intent/enrich.js +1 -0
- package/dist/intent/index.d.ts +23 -0
- package/dist/intent/index.js +1 -0
- package/dist/intent/matcher.d.ts +2 -0
- package/dist/intent/matcher.js +1 -0
- package/dist/intent/store.d.ts +19 -0
- package/dist/intent/store.js +1 -0
- package/dist/intent/types.d.ts +33 -0
- package/dist/intent/types.js +1 -0
- package/dist/knowledge/acquisition-flywheel.js +1 -192
- package/dist/knowledge/allocation-confirm.js +1 -534
- package/dist/knowledge/allocation-context.js +1 -249
- package/dist/knowledge/allocation-ledger.js +1 -463
- package/dist/knowledge/allocation-puzzle.js +1 -298
- package/dist/knowledge/allocation-risk.js +1 -568
- package/dist/knowledge/allocation-templates.js +1 -970
- package/dist/knowledge/allocation-translation.js +1 -585
- package/dist/knowledge/arb-risk.js +1 -210
- package/dist/knowledge/arbitration-confirm.js +1 -559
- package/dist/knowledge/arbitration-context.js +1 -505
- package/dist/knowledge/arbitration-ledger.js +1 -521
- package/dist/knowledge/arbitration-puzzle.js +1 -304
- package/dist/knowledge/arbitration-risk.js +1 -433
- package/dist/knowledge/arbitration-templates.js +1 -276
- package/dist/knowledge/arbitration-translation.js +1 -487
- package/dist/knowledge/arbitration-trust.js +1 -117
- package/dist/knowledge/audit-rules.js +1 -141
- package/dist/knowledge/bridge-risk.js +1 -263
- package/dist/knowledge/contact-risk.js +1 -200
- package/dist/knowledge/contact-templates.d.ts +27 -0
- package/dist/knowledge/contact-templates.js +1 -0
- package/dist/knowledge/demand-confirm.js +1 -206
- package/dist/knowledge/demand-matching.js +1 -132
- package/dist/knowledge/demand-risk.js +1 -240
- package/dist/knowledge/demand-translation.js +1 -354
- package/dist/knowledge/deployment-scanner.js +1 -823
- package/dist/knowledge/dynamic-pricing.js +1 -87
- package/dist/knowledge/examples-scanner-cli.js +1 -26
- package/dist/knowledge/examples-scanner.js +1 -825
- package/dist/knowledge/flywheel-loop.js +1 -404
- package/dist/knowledge/fund-layer.js +1 -973
- package/dist/knowledge/glossary.js +1 -211
- package/dist/knowledge/guard-confirm.js +1 -406
- package/dist/knowledge/guard-context.js +1 -287
- package/dist/knowledge/guard-design-patterns.js +1 -360
- package/dist/knowledge/guard-ledger.js +1 -260
- package/dist/knowledge/guard-lint.js +1 -670
- package/dist/knowledge/guard-migration.js +1 -228
- package/dist/knowledge/guard-puzzle.js +1 -805
- package/dist/knowledge/guard-render.js +1 -700
- package/dist/knowledge/guard-risk.js +1 -1879
- package/dist/knowledge/guard-submission-prompt.js +1 -171
- package/dist/knowledge/guard-templates.js +1 -1105
- package/dist/knowledge/guard-translation.js +1 -1119
- package/dist/knowledge/index.js +1 -436
- package/dist/knowledge/industry-evolution.js +1 -323
- package/dist/knowledge/industry-generalizer.js +1 -381
- package/dist/knowledge/industry-registry.js +1 -174
- package/dist/knowledge/intent-metrics.d.ts +4 -3
- package/dist/knowledge/intent-metrics.js +1 -566
- package/dist/knowledge/machine-confirm.js +1 -559
- package/dist/knowledge/machine-context.js +1 -833
- package/dist/knowledge/machine-ledger.js +1 -338
- package/dist/knowledge/machine-puzzle.js +1 -494
- package/dist/knowledge/machine-render.js +1 -565
- package/dist/knowledge/machine-risk.js +1 -670
- package/dist/knowledge/machine-templates.js +1 -1597
- package/dist/knowledge/machine-topology.js +1 -234
- package/dist/knowledge/machine-translation.js +1 -513
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -45
- package/dist/knowledge/mcp-schema-audit.d.ts +1 -1
- package/dist/knowledge/mcp-schema-audit.js +1 -773
- package/dist/knowledge/onchain-constants.js +1 -35
- package/dist/knowledge/order-confirm.js +1 -573
- package/dist/knowledge/order-context.js +1 -390
- package/dist/knowledge/order-ledger.js +1 -341
- package/dist/knowledge/order-puzzle.js +1 -255
- package/dist/knowledge/order-risk.js +1 -653
- package/dist/knowledge/order-templates.js +1 -368
- package/dist/knowledge/order-translation.js +1 -550
- package/dist/knowledge/overrides-loader.js +1 -65
- package/dist/knowledge/passport-confirm.js +1 -531
- package/dist/knowledge/passport-context.js +1 -306
- package/dist/knowledge/passport-ledger.js +1 -282
- package/dist/knowledge/passport-puzzle.js +1 -333
- package/dist/knowledge/passport-risk.js +1 -450
- package/dist/knowledge/passport-templates.js +1 -568
- package/dist/knowledge/passport-translation.js +1 -516
- package/dist/knowledge/payment-risk.js +1 -249
- package/dist/knowledge/permission-confirm.js +1 -426
- package/dist/knowledge/permission-context.js +1 -224
- package/dist/knowledge/permission-ledger.js +1 -403
- package/dist/knowledge/permission-puzzle.js +1 -173
- package/dist/knowledge/permission-risk.js +1 -411
- package/dist/knowledge/permission-templates.js +1 -234
- package/dist/knowledge/permission-translation.js +1 -350
- package/dist/knowledge/personal-risk.js +1 -212
- package/dist/knowledge/process-model.js +1 -160
- package/dist/knowledge/progress-confirm.js +1 -456
- package/dist/knowledge/progress-context.js +1 -452
- package/dist/knowledge/progress-ledger.js +1 -330
- package/dist/knowledge/progress-puzzle.js +1 -219
- package/dist/knowledge/progress-risk.js +1 -461
- package/dist/knowledge/progress-templates.js +1 -228
- package/dist/knowledge/progress-translation.js +1 -405
- package/dist/knowledge/proof-confirm.js +1 -187
- package/dist/knowledge/proof-risk.js +1 -207
- package/dist/knowledge/proof-translation.js +1 -283
- package/dist/knowledge/registrar-risk.js +1 -217
- package/dist/knowledge/repository-confirm.js +1 -286
- package/dist/knowledge/repository-risk.js +1 -373
- package/dist/knowledge/repository-translation.js +1 -445
- package/dist/knowledge/reputation-rules.js +1 -99
- package/dist/knowledge/resource-risk.js +1 -157
- package/dist/knowledge/reward-confirm.js +1 -526
- package/dist/knowledge/reward-context.js +1 -504
- package/dist/knowledge/reward-ledger.js +1 -502
- package/dist/knowledge/reward-puzzle.js +1 -300
- package/dist/knowledge/reward-risk.js +1 -627
- package/dist/knowledge/reward-templates.js +1 -197
- package/dist/knowledge/reward-translation.js +1 -501
- package/dist/knowledge/safety-rules.js +1 -404
- package/dist/knowledge/scenario-modes.js +1 -321
- package/dist/knowledge/service-confirm.js +1 -807
- package/dist/knowledge/service-context.js +1 -403
- package/dist/knowledge/service-ledger.js +1 -609
- package/dist/knowledge/service-puzzle.js +1 -236
- package/dist/knowledge/service-risk.js +1 -615
- package/dist/knowledge/service-templates.js +1 -456
- package/dist/knowledge/service-translation.js +1 -622
- package/dist/knowledge/template-registry.d.ts +1 -1
- package/dist/knowledge/template-registry.js +1 -341
- package/dist/knowledge/tool-constraints.js +1 -195
- package/dist/knowledge/tools-reference.js +1 -155
- package/dist/knowledge/treasury-confirm.js +1 -512
- package/dist/knowledge/treasury-context.js +1 -363
- package/dist/knowledge/treasury-ledger.js +1 -300
- package/dist/knowledge/treasury-puzzle.js +1 -216
- package/dist/knowledge/treasury-risk.js +1 -440
- package/dist/knowledge/treasury-templates.js +1 -358
- package/dist/knowledge/treasury-translation.js +1 -498
- package/dist/knowledge/trust-metrics.js +1 -198
- package/dist/knowledge/util-risk.js +1 -135
- package/dist/loop-engineering/aggregate.js +1 -132
- package/dist/loop-engineering/context-collect.js +1 -83
- package/dist/loop-engineering/diagnose.js +1 -273
- package/dist/loop-engineering/improve.js +1 -405
- package/dist/loop-engineering/index.js +1 -4
- package/dist/loop-engineering/pipeline.js +1 -56
- package/dist/mode-market/index.js +1 -3
- package/dist/mode-market/registry.js +1 -124
- package/dist/mode-market/review.js +1 -214
- package/dist/mode-market/submission.js +1 -85
- package/dist/participation/collaborator-interest.d.ts +23 -0
- package/dist/participation/collaborator-interest.js +1 -0
- package/dist/participation/customer-interest.d.ts +25 -0
- package/dist/participation/customer-interest.js +1 -0
- package/dist/participation/merchant-interest.js +1 -100
- package/dist/participation/radar-core.d.ts +13 -3
- package/dist/participation/radar-core.js +1 -269
- package/dist/participation/supplier-interest.d.ts +25 -0
- package/dist/participation/supplier-interest.js +1 -0
- package/dist/persona/analyzer.d.ts +16 -0
- package/dist/persona/analyzer.js +1 -0
- package/dist/persona/bridge.d.ts +5 -0
- package/dist/persona/bridge.js +1 -0
- package/dist/persona/defaults.d.ts +4 -0
- package/dist/persona/defaults.js +1 -0
- package/dist/persona/experience-bridge.d.ts +3 -0
- package/dist/persona/experience-bridge.js +1 -0
- package/dist/persona/index.d.ts +18 -0
- package/dist/persona/index.js +1 -0
- package/dist/persona/model.d.ts +7 -0
- package/dist/persona/model.js +1 -0
- package/dist/persona/store.d.ts +19 -0
- package/dist/persona/store.js +1 -0
- package/dist/persona/types.d.ts +45 -0
- package/dist/persona/types.js +1 -0
- package/dist/project/business-puzzle.js +1 -383
- package/dist/project/context-assembly.js +1 -254
- package/dist/project/deployment-bridge.js +1 -120
- package/dist/project/deployment-doc.js +1 -1126
- package/dist/project/edit-planner.js +1 -1342
- package/dist/project/evaluation.js +1 -2011
- package/dist/project/game-theory.js +1 -177
- package/dist/project/graph-builder.js +1 -656
- package/dist/project/graph.js +1 -340
- package/dist/project/handlers.d.ts +5 -0
- package/dist/project/handlers.js +1 -1762
- package/dist/project/index.d.ts +1 -0
- package/dist/project/index.js +1 -301
- package/dist/project/intent-analyzer.js +1 -149
- package/dist/project/machine-nodes.js +1 -36
- package/dist/project/merchant-guide.js +1 -264
- package/dist/project/migration.js +1 -125
- package/dist/project/mode-actions.js +1 -309
- package/dist/project/namespace.js +1 -206
- package/dist/project/participation-radar.js +1 -428
- package/dist/project/pipeline-actions.js +1 -109
- package/dist/project/project-store.js +1 -422
- package/dist/project/query.js +1 -153
- package/dist/project/reverse-mapping.d.ts +34 -0
- package/dist/project/reverse-mapping.js +1 -0
- package/dist/project/risk-aggregator.js +1 -295
- package/dist/project/rollback-policy.js +1 -290
- package/dist/project/semantic-assembler.js +1 -345
- package/dist/project/semantic-graph.js +1 -245
- package/dist/project/stage-gate.js +1 -369
- package/dist/project/substep-trace.js +1 -332
- package/dist/project/task-tracker.js +1 -78
- package/dist/role/derivation.d.ts +18 -0
- package/dist/role/derivation.js +1 -0
- package/dist/role/index.d.ts +5 -0
- package/dist/role/index.js +1 -0
- package/dist/role/model.d.ts +8 -0
- package/dist/role/model.js +1 -0
- package/dist/role/resolution.d.ts +11 -0
- package/dist/role/resolution.js +1 -0
- package/dist/role/types.d.ts +11 -0
- package/dist/role/types.js +1 -0
- package/dist/rules.d.ts +2 -0
- package/dist/rules.js +1 -9
- package/dist/safety/confirm-gate.js +1 -88
- package/dist/safety/index.js +1 -3
- package/dist/safety/preview.js +1 -52
- package/dist/schema/call/allocation.js +1 -34
- package/dist/schema/call/arbitration.js +1 -113
- package/dist/schema/call/base.d.ts +15 -15
- package/dist/schema/call/base.js +1 -370
- package/dist/schema/call/bridge-handler.js +1 -265
- package/dist/schema/call/bridge.d.ts +7 -7
- package/dist/schema/call/bridge.js +1 -458
- package/dist/schema/call/contact.js +1 -37
- package/dist/schema/call/demand.js +1 -47
- package/dist/schema/call/guard.js +1 -161
- package/dist/schema/call/handler.js +1 -322
- package/dist/schema/call/index.js +1 -20
- package/dist/schema/call/machine.js +1 -193
- package/dist/schema/call/order.js +1 -35
- package/dist/schema/call/payment.js +1 -37
- package/dist/schema/call/permission-handler.js +1 -54
- package/dist/schema/call/permission.js +1 -105
- package/dist/schema/call/personal.js +1 -78
- package/dist/schema/call/progress.js +1 -47
- package/dist/schema/call/proof.js +1 -33
- package/dist/schema/call/repository.js +1 -77
- package/dist/schema/call/reward.js +1 -30
- package/dist/schema/call/semantic.js +1 -1657
- package/dist/schema/call/service.js +1 -178
- package/dist/schema/call/treasury.js +1 -71
- package/dist/schema/common/index.js +1 -407
- package/dist/schema/config/index.js +1 -68
- package/dist/schema/evaluation/index.d.ts +4436 -0
- package/dist/schema/evaluation/index.js +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.js +1 -13
- package/dist/schema/intent-radar/index.d.ts +284 -0
- package/dist/schema/intent-radar/index.js +1 -0
- package/dist/schema/local/index.d.ts +21 -21
- package/dist/schema/local/index.js +1 -927
- package/dist/schema/local/wip.js +1 -187
- package/dist/schema/messenger/index.d.ts +7 -7
- package/dist/schema/messenger/index.js +1 -475
- package/dist/schema/operations.d.ts +7 -7
- package/dist/schema/operations.js +1 -520
- package/dist/schema/persona/index.d.ts +1985 -0
- package/dist/schema/persona/index.js +1 -0
- package/dist/schema/project/index.d.ts +96 -50
- package/dist/schema/project/index.js +1 -2057
- package/dist/schema/query/index.d.ts +423 -7
- package/dist/schema/query/index.js +1 -1640
- package/dist/schema/schema-query/index.js +1 -104
- package/dist/schema/schema-version.js +1 -76
- package/dist/schema/sync-layer4.d.ts +1 -1
- package/dist/schema/sync-layer4.js +1 -282
- package/dist/schema/task-status.d.ts +168 -0
- package/dist/schema/task-status.js +1 -0
- package/dist/schema/trust/index.js +1 -314
- package/dist/schema/utils/guard-parser.js +1 -419
- package/dist/schema/utils/guard-query-utils.js +1 -46
- package/dist/schema/utils/node-parser.js +1 -369
- package/dist/schema/utils/object-type-utils.js +1 -35
- package/dist/schema/utils/permission-index-utils.js +1 -7
- package/dist/schema/utils/permission-machine-check.js +1 -121
- package/dist/schema/utils/skills-recommendation.js +1 -77
- package/dist/schema-query/index.js +1 -810
- package/dist/schemas/account_operation.output.json +5 -2
- package/dist/schemas/bridge_operation.output.json +5 -2
- package/dist/schemas/evaluation_operation.output.json +782 -0
- package/dist/schemas/evaluation_operation.schema.json +990 -0
- package/dist/schemas/index.json +25 -1
- package/dist/schemas/intent_radar.output.json +232 -0
- package/dist/schemas/intent_radar.schema.json +138 -0
- package/dist/schemas/local_info_operation.output.json +5 -2
- package/dist/schemas/local_mark_operation.output.json +5 -2
- package/dist/schemas/messenger_operation.output.json +5 -2
- package/dist/schemas/onchain_events.output.json +5 -2
- package/dist/schemas/onchain_operations.output.json +5 -2
- package/dist/schemas/onchain_operations.schema.json +6 -6
- package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_service.schema.json +3 -3
- package/dist/schemas/onchain_table_data.output.json +6 -3
- package/dist/schemas/persona_operation.output.json +392 -0
- package/dist/schemas/persona_operation.schema.json +250 -0
- package/dist/schemas/project_operation.output.json +28 -8
- package/dist/schemas/query_task_status.output.json +115 -0
- package/dist/schemas/query_task_status.schema.json +24 -0
- package/dist/schemas/query_toolkit.output.json +9 -6
- package/dist/schemas/trust_score.schema.json +1 -1
- package/dist/schemas/wowok_buildin_info.output.json +132 -0
- package/dist/schemas/wowok_buildin_info.schema.json +14 -0
- package/dist/telemetry/index.js +1 -112
- package/dist/telemetry/redact.js +1 -23
- package/dist/telemetry/storage.js +1 -80
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -74
- package/dist/tools/handlers/evaluation.d.ts +2 -0
- package/dist/tools/handlers/evaluation.js +1 -0
- package/dist/tools/handlers/file-export.js +1 -90
- package/dist/tools/handlers/intent-radar.d.ts +2 -0
- package/dist/tools/handlers/intent-radar.js +1 -0
- package/dist/tools/handlers/local.js +1 -53
- package/dist/tools/handlers/messenger.js +1 -188
- package/dist/tools/handlers/onchain.js +1 -1082
- package/dist/tools/handlers/persona.d.ts +4 -0
- package/dist/tools/handlers/persona.js +1 -0
- package/dist/tools/handlers/project.js +1 -211
- package/dist/tools/handlers/query.js +1 -434
- package/dist/tools/handlers/schema-query.js +1 -176
- package/dist/tools/handlers/task-status.d.ts +0 -168
- package/dist/tools/handlers/task-status.js +1 -55
- package/dist/tools/handlers/trust.js +1 -380
- package/dist/tools/handlers/wip.js +1 -90
- package/dist/tools/index.js +1 -1306
- package/dist/tools/retry.js +1 -85
- package/dist/tools/rules-hook.js +1 -23
- package/dist/tools/shared.js +1 -130
- package/dist/tools/types.js +1 -1
- package/dist/tools/upgrade-check.d.ts +19 -0
- package/dist/tools/upgrade-check.js +1 -0
- package/dist/tools/wip-deploy-assist.d.ts +1 -1
- package/dist/tools/wip-deploy-assist.js +1 -278
- package/dist/tools/wrap.js +1 -500
- package/package.json +5 -3
|
@@ -1,295 +1 @@
|
|
|
1
|
-
import { assessServiceRisks,
|
|
2
|
-
import { assessPermissionRisks } from "../knowledge/permission-risk.js";
|
|
3
|
-
const SEVERITY_ORDER = {
|
|
4
|
-
CRITICAL: 0,
|
|
5
|
-
HIGH: 1,
|
|
6
|
-
MEDIUM: 2,
|
|
7
|
-
LOW: 3,
|
|
8
|
-
INFO: 4,
|
|
9
|
-
};
|
|
10
|
-
const ALL_SEVERITIES = ["CRITICAL", "HIGH", "MEDIUM", "LOW", "INFO"];
|
|
11
|
-
function normalizeSeverity(level) {
|
|
12
|
-
if (typeof level !== "string")
|
|
13
|
-
return "INFO";
|
|
14
|
-
const upper = level.toUpperCase();
|
|
15
|
-
return ALL_SEVERITIES.includes(upper) ? upper : "INFO";
|
|
16
|
-
}
|
|
17
|
-
function extractRiskId(risk, fallback) {
|
|
18
|
-
if (!risk || typeof risk !== "object")
|
|
19
|
-
return fallback;
|
|
20
|
-
return String(risk.id ?? risk.risk_rule_id ?? risk.rule_id ?? fallback);
|
|
21
|
-
}
|
|
22
|
-
function extractRiskMessage(risk) {
|
|
23
|
-
if (!risk || typeof risk !== "object")
|
|
24
|
-
return "(no message)";
|
|
25
|
-
return String(risk.title ?? risk.message ?? risk.description ?? risk.trigger ?? "(no message)");
|
|
26
|
-
}
|
|
27
|
-
function extractFixSuggestion(risk) {
|
|
28
|
-
if (!risk || typeof risk !== "object")
|
|
29
|
-
return "";
|
|
30
|
-
return String(risk.mitigation ?? risk.fix_suggestion ?? risk.suggestion ?? "");
|
|
31
|
-
}
|
|
32
|
-
function toAggregatedRisk(risk, objectType, entryId) {
|
|
33
|
-
return {
|
|
34
|
-
risk_rule_id: extractRiskId(risk, `R-${objectType.toUpperCase()}-?`),
|
|
35
|
-
object_type: objectType,
|
|
36
|
-
entry_id: entryId,
|
|
37
|
-
severity: normalizeSeverity(risk?.level ?? risk?.severity),
|
|
38
|
-
message: extractRiskMessage(risk),
|
|
39
|
-
fix_suggestion: extractFixSuggestion(risk),
|
|
40
|
-
details: risk?.evidence
|
|
41
|
-
? { field_path: String(risk.evidence) }
|
|
42
|
-
: undefined,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function isL1L2Object(objType) {
|
|
46
|
-
return [
|
|
47
|
-
"service", "machine", "allocation", "treasury", "arb",
|
|
48
|
-
"reward", "progress", "order", "permission", "guard",
|
|
49
|
-
].includes(objType);
|
|
50
|
-
}
|
|
51
|
-
function buildL1L2Dispatch() {
|
|
52
|
-
const safeAssess = (puzzle, fn) => {
|
|
53
|
-
try {
|
|
54
|
-
const ctx = puzzle ?? {};
|
|
55
|
-
const result = fn(ctx);
|
|
56
|
-
if (Array.isArray(result))
|
|
57
|
-
return result;
|
|
58
|
-
if (result && typeof result === "object") {
|
|
59
|
-
const r = result.risks;
|
|
60
|
-
if (Array.isArray(r))
|
|
61
|
-
return r;
|
|
62
|
-
}
|
|
63
|
-
return [];
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return [];
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
return {
|
|
70
|
-
service: { assess: (p) => safeAssess(p, assessServiceRisks) },
|
|
71
|
-
machine: { assess: (p) => safeAssess(p, (ctx) => assessMachineRisks(ctx, {})) },
|
|
72
|
-
allocation: { assess: (p) => safeAssess(p, assessAllocationRisks) },
|
|
73
|
-
treasury: { assess: (p) => safeAssess(p, assessTreasuryRisks) },
|
|
74
|
-
arb: { assess: (p) => safeAssess(p, assessArbitrationRisks) },
|
|
75
|
-
reward: { assess: (p) => safeAssess(p, (ctx) => assessRewardRisks(ctx)) },
|
|
76
|
-
progress: { assess: (p) => safeAssess(p, (ctx) => assessProgressRisks(ctx)) },
|
|
77
|
-
order: { assess: (p) => safeAssess(p, assessOrderRisks) },
|
|
78
|
-
permission: { assess: (p) => safeAssess(p, assessPermissionRisks) },
|
|
79
|
-
guard: {
|
|
80
|
-
assess: (p) => {
|
|
81
|
-
try {
|
|
82
|
-
const result = assessGuardRisks({
|
|
83
|
-
table: [],
|
|
84
|
-
root: undefined,
|
|
85
|
-
});
|
|
86
|
-
if (Array.isArray(result))
|
|
87
|
-
return result;
|
|
88
|
-
if (result && typeof result === "object") {
|
|
89
|
-
const r = result.risks;
|
|
90
|
-
if (Array.isArray(r))
|
|
91
|
-
return r;
|
|
92
|
-
}
|
|
93
|
-
return [];
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function buildL3Dispatch() {
|
|
103
|
-
const safeCheck = (puzzle, fn) => {
|
|
104
|
-
try {
|
|
105
|
-
const ctx = puzzle ?? {};
|
|
106
|
-
const result = fn(ctx);
|
|
107
|
-
if (Array.isArray(result))
|
|
108
|
-
return result;
|
|
109
|
-
return [];
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return [];
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
return {
|
|
116
|
-
contact: { check: (p) => safeCheck(p, checkContactRisks) },
|
|
117
|
-
resource: { check: (p) => safeCheck(p, checkResourceRisks) },
|
|
118
|
-
payment: { check: (p) => safeCheck(p, checkPaymentRisks) },
|
|
119
|
-
arb: { check: (p) => safeCheck(p, checkArbRisks) },
|
|
120
|
-
personal: { check: (p) => safeCheck(p, checkPersonalRisks) },
|
|
121
|
-
util: { check: (p) => safeCheck(p, checkUtilRisks) },
|
|
122
|
-
registrar: { check: (p) => safeCheck(p, checkRegistrarRisks) },
|
|
123
|
-
bridge: { check: (p) => safeCheck(p, checkBridgeRisks) },
|
|
124
|
-
proof: { check: (p) => safeCheck(p, checkProofRisks) },
|
|
125
|
-
repository: { check: (p) => safeCheck(p, checkRepositoryRisks) },
|
|
126
|
-
demand: { check: (p) => safeCheck(p, checkDemandRisks) },
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
export function aggregateProjectRisks(input) {
|
|
130
|
-
const warnings = [];
|
|
131
|
-
if (!input || !input.project_prefix) {
|
|
132
|
-
warnings.push("input.project_prefix is empty");
|
|
133
|
-
}
|
|
134
|
-
const puzzles = input?.puzzles ?? {};
|
|
135
|
-
const findings = [];
|
|
136
|
-
const l1l2 = buildL1L2Dispatch();
|
|
137
|
-
const l3 = buildL3Dispatch();
|
|
138
|
-
for (const [objTypeStr, entry] of Object.entries(puzzles)) {
|
|
139
|
-
const objType = objTypeStr;
|
|
140
|
-
const entryId = `${input.project_prefix ?? "project"}_${objType}`;
|
|
141
|
-
const puzzle = entry?.puzzle;
|
|
142
|
-
if (isL1L2Object(objType)) {
|
|
143
|
-
const d = l1l2[objType];
|
|
144
|
-
if (!d) {
|
|
145
|
-
warnings.push(`No L1/L2 risk dispatcher for '${objType}'`);
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
const rawRisks = d.assess(puzzle);
|
|
149
|
-
for (const r of rawRisks) {
|
|
150
|
-
findings.push(toAggregatedRisk(r, objType, entryId));
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
const d = l3[objType];
|
|
155
|
-
if (!d) {
|
|
156
|
-
warnings.push(`No L3 risk dispatcher for '${objType}'`);
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const rawRisks = d.check(puzzle);
|
|
160
|
-
for (const r of rawRisks) {
|
|
161
|
-
findings.push(toAggregatedRisk(r, objType, entryId));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
sortFindings(findings);
|
|
166
|
-
const severity_summary = countBySeverity(findings);
|
|
167
|
-
const threshold = input.severity_threshold ?? "HIGH";
|
|
168
|
-
const status = determineStatus(severity_summary, threshold, input.user_confirmed_high_risks ?? [], findings);
|
|
169
|
-
let pending_confirmations;
|
|
170
|
-
if (status === "RISK_PENDING_CONFIRM") {
|
|
171
|
-
pending_confirmations = findings
|
|
172
|
-
.filter((f) => f.severity === "HIGH")
|
|
173
|
-
.filter((f) => !(input.user_confirmed_high_risks ?? []).includes(f.risk_rule_id))
|
|
174
|
-
.map((f) => ({
|
|
175
|
-
risk_rule_id: f.risk_rule_id,
|
|
176
|
-
description: f.message,
|
|
177
|
-
fix_suggestion: f.fix_suggestion,
|
|
178
|
-
object_type: f.object_type,
|
|
179
|
-
entry_id: f.entry_id,
|
|
180
|
-
}));
|
|
181
|
-
}
|
|
182
|
-
const fixSuggestionsGrouped = {};
|
|
183
|
-
for (const finding of findings) {
|
|
184
|
-
const key = finding.object_type;
|
|
185
|
-
if (!fixSuggestionsGrouped[key]) {
|
|
186
|
-
fixSuggestionsGrouped[key] = [];
|
|
187
|
-
}
|
|
188
|
-
fixSuggestionsGrouped[key].push({
|
|
189
|
-
risk_rule_id: finding.risk_rule_id,
|
|
190
|
-
severity: finding.severity,
|
|
191
|
-
message: finding.message,
|
|
192
|
-
fix_suggestion: finding.fix_suggestion,
|
|
193
|
-
entry_id: finding.entry_id,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
return {
|
|
197
|
-
namespace: {
|
|
198
|
-
prefix: input.project_prefix ?? "",
|
|
199
|
-
version: input.version ?? "",
|
|
200
|
-
industry: input.industry ?? "general",
|
|
201
|
-
},
|
|
202
|
-
findings,
|
|
203
|
-
severity_summary,
|
|
204
|
-
status,
|
|
205
|
-
pending_confirmations,
|
|
206
|
-
calibrated_at: Date.now(),
|
|
207
|
-
fix_suggestions_grouped: fixSuggestionsGrouped,
|
|
208
|
-
warnings,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
export function sortFindings(findings) {
|
|
212
|
-
return findings.sort((a, b) => {
|
|
213
|
-
const sevDiff = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
|
|
214
|
-
if (sevDiff !== 0)
|
|
215
|
-
return sevDiff;
|
|
216
|
-
if (a.object_type !== b.object_type) {
|
|
217
|
-
return a.object_type.localeCompare(b.object_type);
|
|
218
|
-
}
|
|
219
|
-
return a.risk_rule_id.localeCompare(b.risk_rule_id);
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
export function countBySeverity(findings) {
|
|
223
|
-
const counts = {
|
|
224
|
-
CRITICAL: 0,
|
|
225
|
-
HIGH: 0,
|
|
226
|
-
MEDIUM: 0,
|
|
227
|
-
LOW: 0,
|
|
228
|
-
INFO: 0,
|
|
229
|
-
};
|
|
230
|
-
for (const f of findings) {
|
|
231
|
-
counts[f.severity]++;
|
|
232
|
-
}
|
|
233
|
-
return counts;
|
|
234
|
-
}
|
|
235
|
-
export function determineStatus(severity_summary, threshold, user_confirmed_high_risks, findings) {
|
|
236
|
-
if (severity_summary.CRITICAL > 0)
|
|
237
|
-
return "RISK_BLOCKED";
|
|
238
|
-
const thresholdLevel = SEVERITY_ORDER[threshold];
|
|
239
|
-
if (severity_summary.HIGH > 0 && thresholdLevel <= SEVERITY_ORDER.HIGH) {
|
|
240
|
-
const unconfirmed = findings.filter((f) => f.severity === "HIGH" && !user_confirmed_high_risks.includes(f.risk_rule_id));
|
|
241
|
-
if (unconfirmed.length > 0)
|
|
242
|
-
return "RISK_PENDING_CONFIRM";
|
|
243
|
-
}
|
|
244
|
-
if (severity_summary.MEDIUM > 0 && thresholdLevel <= SEVERITY_ORDER.MEDIUM) {
|
|
245
|
-
return "RISK_BLOCKED";
|
|
246
|
-
}
|
|
247
|
-
if (severity_summary.LOW > 0 && thresholdLevel <= SEVERITY_ORDER.LOW) {
|
|
248
|
-
return "RISK_BLOCKED";
|
|
249
|
-
}
|
|
250
|
-
return "RISK_PASSED";
|
|
251
|
-
}
|
|
252
|
-
export function getCriticalRisks(result) {
|
|
253
|
-
if (!result?.findings)
|
|
254
|
-
return [];
|
|
255
|
-
return result.findings.filter((f) => f.severity === "CRITICAL");
|
|
256
|
-
}
|
|
257
|
-
export function summarizeRiskReport(result) {
|
|
258
|
-
if (!result)
|
|
259
|
-
return "(no result)";
|
|
260
|
-
const lines = [];
|
|
261
|
-
lines.push(`# Risk Aggregation Report`);
|
|
262
|
-
lines.push("");
|
|
263
|
-
lines.push(`- Project: ${result.namespace.prefix}_${result.namespace.version}`);
|
|
264
|
-
lines.push(`- Status: ${result.status}`);
|
|
265
|
-
lines.push(`- Calibrated at: ${new Date(result.calibrated_at).toISOString()}`);
|
|
266
|
-
lines.push("");
|
|
267
|
-
lines.push("## Severity Summary");
|
|
268
|
-
lines.push("");
|
|
269
|
-
lines.push("| Severity | Count |");
|
|
270
|
-
lines.push("|----------|-------|");
|
|
271
|
-
for (const sev of ALL_SEVERITIES) {
|
|
272
|
-
lines.push(`| ${sev} | ${result.severity_summary[sev] ?? 0} |`);
|
|
273
|
-
}
|
|
274
|
-
lines.push("");
|
|
275
|
-
if (result.findings.length === 0) {
|
|
276
|
-
lines.push("No risks found.");
|
|
277
|
-
return lines.join("\n");
|
|
278
|
-
}
|
|
279
|
-
lines.push("## Findings (sorted by severity)");
|
|
280
|
-
lines.push("");
|
|
281
|
-
for (const f of result.findings) {
|
|
282
|
-
lines.push(`- **[${f.severity}] ${f.risk_rule_id}** (${f.object_type} / ${f.entry_id})`);
|
|
283
|
-
lines.push(` - ${f.message}`);
|
|
284
|
-
if (f.fix_suggestion) {
|
|
285
|
-
lines.push(` - Fix: ${f.fix_suggestion}`);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (result.warnings.length > 0) {
|
|
289
|
-
lines.push("");
|
|
290
|
-
lines.push("## Warnings");
|
|
291
|
-
for (const w of result.warnings)
|
|
292
|
-
lines.push(`- ${w}`);
|
|
293
|
-
}
|
|
294
|
-
return lines.join("\n");
|
|
295
|
-
}
|
|
1
|
+
import{assessServiceRisks,assessMachineRisks,assessAllocationRisks,assessTreasuryRisks,assessArbitrationRisks,assessRewardRisks,assessProgressRisks,assessOrderRisks,assessGuardRisks,checkContactRisks,checkResourceRisks,checkPaymentRisks,checkArbRisks,checkPersonalRisks,checkUtilRisks,checkRegistrarRisks,checkBridgeRisks,checkProofRisks,checkRepositoryRisks,checkDemandRisks}from'../knowledge/index.js';import{assessPermissionRisks}from'../knowledge/permission-risk.js';const SEVERITY_ORDER={'CRITICAL':0x0,'HIGH':0x1,'MEDIUM':0x2,'LOW':0x3,'INFO':0x4},ALL_SEVERITIES=['CRITICAL','HIGH','MEDIUM','LOW','INFO'];function normalizeSeverity(a){if(typeof a!=='string')return'INFO';const b=a['toUpperCase']();return ALL_SEVERITIES['includes'](b)?b:'INFO';}function extractRiskId(a,b){if(!a||typeof a!=='object')return b;return String(a['id']??a['risk_rule_id']??a['rule_id']??b);}function extractRiskMessage(a){if(!a||typeof a!=='object')return'(no\x20message)';return String(a['title']??a['message']??a['description']??a['trigger']??'(no\x20message)');}function extractFixSuggestion(a){if(!a||typeof a!=='object')return'';return String(a['mitigation']??a['fix_suggestion']??a['suggestion']??'');}function toAggregatedRisk(a,b,c){return{'risk_rule_id':extractRiskId(a,'R-'+b['toUpperCase']()+'-?'),'object_type':b,'entry_id':c,'severity':normalizeSeverity(a?.['level']??a?.['severity']),'message':extractRiskMessage(a),'fix_suggestion':extractFixSuggestion(a),'details':a?.['evidence']?{'field_path':String(a['evidence'])}:undefined};}function isL1L2Object(a){return['service','machine','allocation','treasury','arb','reward','progress','order','permission','guard']['includes'](a);}function buildL1L2Dispatch(){const a=(b,c)=>{try{const d=b??{},e=c(d);if(Array['isArray'](e))return e;if(e&&typeof e==='object'){const f=e['risks'];if(Array['isArray'](f))return f;}return[];}catch{return[];}};return{'service':{'assess':b=>a(b,assessServiceRisks)},'machine':{'assess':b=>a(b,c=>assessMachineRisks(c,{}))},'allocation':{'assess':b=>a(b,assessAllocationRisks)},'treasury':{'assess':b=>a(b,assessTreasuryRisks)},'arb':{'assess':b=>a(b,assessArbitrationRisks)},'reward':{'assess':b=>a(b,c=>assessRewardRisks(c))},'progress':{'assess':b=>a(b,c=>assessProgressRisks(c))},'order':{'assess':b=>a(b,assessOrderRisks)},'permission':{'assess':b=>a(b,assessPermissionRisks)},'guard':{'assess':b=>{try{const c=assessGuardRisks({'table':[],'root':undefined});if(Array['isArray'](c))return c;if(c&&typeof c==='object'){const d=c['risks'];if(Array['isArray'](d))return d;}return[];}catch{return[];}}}};}function buildL3Dispatch(){const a=(b,c)=>{try{const d=b??{},e=c(d);if(Array['isArray'](e))return e;return[];}catch{return[];}};return{'contact':{'check':b=>a(b,checkContactRisks)},'resource':{'check':b=>a(b,checkResourceRisks)},'payment':{'check':b=>a(b,checkPaymentRisks)},'arb':{'check':b=>a(b,checkArbRisks)},'personal':{'check':b=>a(b,checkPersonalRisks)},'util':{'check':b=>a(b,checkUtilRisks)},'registrar':{'check':b=>a(b,checkRegistrarRisks)},'bridge':{'check':b=>a(b,checkBridgeRisks)},'proof':{'check':b=>a(b,checkProofRisks)},'repository':{'check':b=>a(b,checkRepositoryRisks)},'demand':{'check':b=>a(b,checkDemandRisks)}};}export function aggregateProjectRisks(a){const b=[];(!a||!a['project_prefix'])&&b['push']('input.project_prefix\x20is\x20empty');const c=a?.['puzzles']??{},e=[],f=buildL1L2Dispatch(),g=buildL3Dispatch();for(const [m,n]of Object['entries'](c)){const o=m,p=(a['project_prefix']??'project')+'_'+o,q=n?.['puzzle'];if(isL1L2Object(o)){const s=f[o];if(!s){b['push']('No\x20L1/L2\x20risk\x20dispatcher\x20for\x20\x27'+o+'\x27');continue;}const t=s['assess'](q);for(const u of t){e['push'](toAggregatedRisk(u,o,p));}}else{const v=g[o];if(!v){b['push']('No\x20L3\x20risk\x20dispatcher\x20for\x20\x27'+o+'\x27');continue;}const w=v['check'](q);for(const x of w){e['push'](toAggregatedRisk(x,o,p));}}}sortFindings(e);const h=countBySeverity(e),i=a['severity_threshold']??'HIGH',j=determineStatus(h,i,a['user_confirmed_high_risks']??[],e);let k;j==='RISK_PENDING_CONFIRM'&&(k=e['filter'](y=>y['severity']==='HIGH')['filter'](y=>!(a['user_confirmed_high_risks']??[])['includes'](y['risk_rule_id']))['map'](y=>({'risk_rule_id':y['risk_rule_id'],'description':y['message'],'fix_suggestion':y['fix_suggestion'],'object_type':y['object_type'],'entry_id':y['entry_id']})));const l={};for(const y of e){const z=y['object_type'];!l[z]&&(l[z]=[]),l[z]['push']({'risk_rule_id':y['risk_rule_id'],'severity':y['severity'],'message':y['message'],'fix_suggestion':y['fix_suggestion'],'entry_id':y['entry_id']});}return{'namespace':{'prefix':a['project_prefix']??'','version':a['version']??'','industry':a['industry']??'general'},'findings':e,'severity_summary':h,'status':j,'pending_confirmations':k,'calibrated_at':Date['now'](),'fix_suggestions_grouped':l,'warnings':b};}export function sortFindings(a){return a['sort']((c,d)=>{const e=SEVERITY_ORDER[c['severity']]-SEVERITY_ORDER[d['severity']];if(e!==0x0)return e;if(c['object_type']!==d['object_type'])return c['object_type']['localeCompare'](d['object_type']);return c['risk_rule_id']['localeCompare'](d['risk_rule_id']);});}export function countBySeverity(a){const b={'CRITICAL':0x0,'HIGH':0x0,'MEDIUM':0x0,'LOW':0x0,'INFO':0x0};for(const c of a){b[c['severity']]++;}return b;}export function determineStatus(a,b,c,d){if(a['CRITICAL']>0x0)return'RISK_BLOCKED';const e=SEVERITY_ORDER[b];if(a['HIGH']>0x0&&e<=SEVERITY_ORDER['HIGH']){const f=d['filter'](g=>g['severity']==='HIGH'&&!c['includes'](g['risk_rule_id']));if(f['length']>0x0)return'RISK_PENDING_CONFIRM';}if(a['MEDIUM']>0x0&&e<=SEVERITY_ORDER['MEDIUM'])return'RISK_BLOCKED';if(a['LOW']>0x0&&e<=SEVERITY_ORDER['LOW'])return'RISK_BLOCKED';return'RISK_PASSED';}export function getCriticalRisks(a){if(!a?.['findings'])return[];return a['findings']['filter'](b=>b['severity']==='CRITICAL');}export function summarizeRiskReport(a){if(!a)return'(no\x20result)';const b=[];b['push']('#\x20Risk\x20Aggregation\x20Report'),b['push'](''),b['push']('-\x20Project:\x20'+a['namespace']['prefix']+'_'+a['namespace']['version']),b['push']('-\x20Status:\x20'+a['status']),b['push']('-\x20Calibrated\x20at:\x20'+new Date(a['calibrated_at'])['toISOString']()),b['push'](''),b['push']('##\x20Severity\x20Summary'),b['push'](''),b['push']('|\x20Severity\x20|\x20Count\x20|'),b['push']('|----------|-------|');for(const c of ALL_SEVERITIES){b['push']('|\x20'+c+'\x20|\x20'+(a['severity_summary'][c]??0x0)+'\x20|');}b['push']('');if(a['findings']['length']===0x0)return b['push']('No\x20risks\x20found.'),b['join']('\x0a');b['push']('##\x20Findings\x20(sorted\x20by\x20severity)'),b['push']('');for(const d of a['findings']){b['push']('-\x20**['+d['severity']+']\x20'+d['risk_rule_id']+'**\x20('+d['object_type']+'\x20/\x20'+d['entry_id']+')'),b['push']('\x20\x20-\x20'+d['message']),d['fix_suggestion']&&b['push']('\x20\x20-\x20Fix:\x20'+d['fix_suggestion']);}if(a['warnings']['length']>0x0){b['push'](''),b['push']('##\x20Warnings');for(const e of a['warnings'])b['push']('-\x20'+e);}return b['join']('\x0a');}
|
|
@@ -1,290 +1 @@
|
|
|
1
|
-
import { existsSync,
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { loadStageState, projectDir, rollbackStage as rollbackStageState, } from "./project-store.js";
|
|
4
|
-
export const REVERSIBILITY_MATRIX = [
|
|
5
|
-
{
|
|
6
|
-
object_type: "permission",
|
|
7
|
-
lifecycle_state: "created",
|
|
8
|
-
struct_reversible: "reversible",
|
|
9
|
-
behavior_reversible: true,
|
|
10
|
-
gas_impact: "low",
|
|
11
|
-
explanation: "Permission (unpublished): can add tables/admins freely",
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
object_type: "permission",
|
|
15
|
-
lifecycle_state: "referenced",
|
|
16
|
-
struct_reversible: "limited",
|
|
17
|
-
behavior_reversible: true,
|
|
18
|
-
gas_impact: "medium",
|
|
19
|
-
explanation: "Permission (referenced by published service): modifications limited — affects dependents",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
object_type: "machine",
|
|
23
|
-
lifecycle_state: "created",
|
|
24
|
-
struct_reversible: "reversible",
|
|
25
|
-
behavior_reversible: true,
|
|
26
|
-
gas_impact: "low",
|
|
27
|
-
explanation: "Machine (unpublished): can modify nodes/edges/forwards freely",
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
object_type: "machine",
|
|
31
|
-
lifecycle_state: "published",
|
|
32
|
-
struct_reversible: "immutable",
|
|
33
|
-
behavior_reversible: true,
|
|
34
|
-
gas_impact: "none",
|
|
35
|
-
explanation: "Machine (published): structure is immutable — can only advance progress",
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
object_type: "service",
|
|
39
|
-
lifecycle_state: "created",
|
|
40
|
-
struct_reversible: "reversible",
|
|
41
|
-
behavior_reversible: true,
|
|
42
|
-
gas_impact: "low",
|
|
43
|
-
explanation: "Service (unpublished): can modify fields freely",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
object_type: "service",
|
|
47
|
-
lifecycle_state: "published",
|
|
48
|
-
struct_reversible: "immutable",
|
|
49
|
-
behavior_reversible: true,
|
|
50
|
-
gas_impact: "none",
|
|
51
|
-
explanation: "Service (published): machine/order_allocators frozen — can still transact normally",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
object_type: "guard",
|
|
55
|
-
lifecycle_state: "created",
|
|
56
|
-
struct_reversible: "immutable",
|
|
57
|
-
behavior_reversible: false,
|
|
58
|
-
gas_impact: "none",
|
|
59
|
-
explanation: "Guard: create-only semantics — immutable from creation",
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
object_type: "allocation",
|
|
63
|
-
lifecycle_state: "created",
|
|
64
|
-
struct_reversible: "reversible",
|
|
65
|
-
behavior_reversible: true,
|
|
66
|
-
gas_impact: "low",
|
|
67
|
-
explanation: "Allocator (unbound): can modify strategy freely",
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
object_type: "allocation",
|
|
71
|
-
lifecycle_state: "bound",
|
|
72
|
-
struct_reversible: "limited",
|
|
73
|
-
behavior_reversible: true,
|
|
74
|
-
gas_impact: "medium",
|
|
75
|
-
explanation: "Allocator (bound to published service): strategy modifications limited",
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
object_type: "treasury",
|
|
79
|
-
lifecycle_state: "created",
|
|
80
|
-
struct_reversible: "reversible",
|
|
81
|
-
behavior_reversible: true,
|
|
82
|
-
gas_impact: "low",
|
|
83
|
-
explanation: "Treasury: can modify rules freely",
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
object_type: "arb",
|
|
87
|
-
lifecycle_state: "created",
|
|
88
|
-
struct_reversible: "reversible",
|
|
89
|
-
behavior_reversible: true,
|
|
90
|
-
gas_impact: "low",
|
|
91
|
-
explanation: "Arbitration: can modify rules freely",
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
object_type: "reward",
|
|
95
|
-
lifecycle_state: "created",
|
|
96
|
-
struct_reversible: "reversible",
|
|
97
|
-
behavior_reversible: true,
|
|
98
|
-
gas_impact: "low",
|
|
99
|
-
explanation: "Reward: can modify rules freely",
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
object_type: "progress",
|
|
103
|
-
lifecycle_state: "bound",
|
|
104
|
-
struct_reversible: "immutable",
|
|
105
|
-
behavior_reversible: true,
|
|
106
|
-
gas_impact: "none",
|
|
107
|
-
explanation: "Progress (bound to machine): cannot swap machine — can only forward",
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
object_type: "order",
|
|
111
|
-
lifecycle_state: "created",
|
|
112
|
-
struct_reversible: "immutable",
|
|
113
|
-
behavior_reversible: true,
|
|
114
|
-
gas_impact: "none",
|
|
115
|
-
explanation: "Order: structure immutable after creation — can only advance state",
|
|
116
|
-
},
|
|
117
|
-
];
|
|
118
|
-
export function queryReversibility(objectType, lifecycleState) {
|
|
119
|
-
return REVERSIBILITY_MATRIX.find((e) => e.object_type === objectType && e.lifecycle_state === lifecycleState);
|
|
120
|
-
}
|
|
121
|
-
export function getReversibilityForType(objectType) {
|
|
122
|
-
return REVERSIBILITY_MATRIX.filter((e) => e.object_type === objectType);
|
|
123
|
-
}
|
|
124
|
-
export function recommendIterationStrategy(prefix, version, currentStage) {
|
|
125
|
-
const state = loadStageState(prefix, version);
|
|
126
|
-
if (!state) {
|
|
127
|
-
return {
|
|
128
|
-
strategy: "in_place",
|
|
129
|
-
reason: "Project not initialized — no stage state found. Use in-place for new projects.",
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
if (state.has_published_object) {
|
|
133
|
-
const versionMatch = version.match(/^v(\d+)$/);
|
|
134
|
-
const nextVersionNum = versionMatch ? parseInt(versionMatch[1]) + 1 : 2;
|
|
135
|
-
const forkTo = `v${nextVersionNum}`;
|
|
136
|
-
return {
|
|
137
|
-
strategy: "fork",
|
|
138
|
-
reason: `Project has published on-chain objects — in-place modification would break running business. ` +
|
|
139
|
-
`Fork to ${forkTo} to preserve the original version as a read-only historical snapshot.`,
|
|
140
|
-
fork_to_version: forkTo,
|
|
141
|
-
published_objects: state.stage_meta[5]?.committed
|
|
142
|
-
? ["see deployment/05-substeps/ for published object list"]
|
|
143
|
-
: [],
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
const stage = currentStage ?? state.stage;
|
|
147
|
-
return {
|
|
148
|
-
strategy: "in_place",
|
|
149
|
-
reason: `Project has no published objects (current stage: ${stage}). ` +
|
|
150
|
-
`Safe to modify the current version directly — all changes are local and reversible.`,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
const STAGE_DIR_SUFFIXES = {
|
|
154
|
-
1: "01-namespace",
|
|
155
|
-
2: "02-puzzle",
|
|
156
|
-
3: "03-risk",
|
|
157
|
-
4: "04-steps",
|
|
158
|
-
5: "05-substeps",
|
|
159
|
-
};
|
|
160
|
-
export function evaluateRollbackPolicy(prefix, version, targetStage) {
|
|
161
|
-
const state = loadStageState(prefix, version);
|
|
162
|
-
if (!state) {
|
|
163
|
-
return {
|
|
164
|
-
allowed: false,
|
|
165
|
-
target_stage: targetStage,
|
|
166
|
-
current_stage: 1,
|
|
167
|
-
block_reason: `Project not initialized: ${prefix}_${version}`,
|
|
168
|
-
files_to_clean: [],
|
|
169
|
-
warnings: [],
|
|
170
|
-
iteration_strategy: {
|
|
171
|
-
strategy: "in_place",
|
|
172
|
-
reason: "Project not initialized.",
|
|
173
|
-
},
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
const currentStage = state.stage;
|
|
177
|
-
const iterationStrategy = recommendIterationStrategy(prefix, version, currentStage);
|
|
178
|
-
if (state.has_published_object) {
|
|
179
|
-
return {
|
|
180
|
-
allowed: false,
|
|
181
|
-
target_stage: targetStage,
|
|
182
|
-
current_stage: currentStage,
|
|
183
|
-
block_reason: `Project has published on-chain objects — rollback is forbidden (§3.3). ` +
|
|
184
|
-
`Use fork_project to create a new version for modifications.`,
|
|
185
|
-
files_to_clean: [],
|
|
186
|
-
warnings: [],
|
|
187
|
-
iteration_strategy: iterationStrategy,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
if (targetStage >= currentStage) {
|
|
191
|
-
return {
|
|
192
|
-
allowed: false,
|
|
193
|
-
target_stage: targetStage,
|
|
194
|
-
current_stage: currentStage,
|
|
195
|
-
block_reason: `Target stage ${targetStage} must be less than current stage ${currentStage}.`,
|
|
196
|
-
files_to_clean: [],
|
|
197
|
-
warnings: [],
|
|
198
|
-
iteration_strategy: iterationStrategy,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
if (targetStage < 1) {
|
|
202
|
-
return {
|
|
203
|
-
allowed: false,
|
|
204
|
-
target_stage: targetStage,
|
|
205
|
-
current_stage: currentStage,
|
|
206
|
-
block_reason: "Cannot rollback below stage 1.",
|
|
207
|
-
files_to_clean: [],
|
|
208
|
-
warnings: [],
|
|
209
|
-
iteration_strategy: iterationStrategy,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
const filesToClean = [];
|
|
213
|
-
const warnings = [];
|
|
214
|
-
const depDir = join(projectDir(prefix, version), "deployment");
|
|
215
|
-
for (let s = targetStage + 1; s <= 5; s++) {
|
|
216
|
-
const stageDir = join(depDir, STAGE_DIR_SUFFIXES[s]);
|
|
217
|
-
if (existsSync(stageDir)) {
|
|
218
|
-
filesToClean.push(`deployment/${STAGE_DIR_SUFFIXES[s]}/`);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
if (targetStage <= 2 && existsSync(depDir)) {
|
|
222
|
-
filesToClean.length = 0;
|
|
223
|
-
filesToClean.push("deployment/");
|
|
224
|
-
}
|
|
225
|
-
if (filesToClean.length > 0) {
|
|
226
|
-
warnings.push(`Rollback will delete ${filesToClean.length} file(s)/directory(ies): ${filesToClean.join(", ")}. ` +
|
|
227
|
-
`This data will be lost — regenerate by re-running the stage action.`);
|
|
228
|
-
}
|
|
229
|
-
return {
|
|
230
|
-
allowed: true,
|
|
231
|
-
target_stage: targetStage,
|
|
232
|
-
current_stage: currentStage,
|
|
233
|
-
files_to_clean: filesToClean,
|
|
234
|
-
warnings,
|
|
235
|
-
iteration_strategy: iterationStrategy,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
export function rollbackStageWithPolicy(prefix, version, targetStage, reason) {
|
|
239
|
-
const policy = evaluateRollbackPolicy(prefix, version, targetStage);
|
|
240
|
-
if (!policy.allowed) {
|
|
241
|
-
return {
|
|
242
|
-
success: false,
|
|
243
|
-
target_stage: targetStage,
|
|
244
|
-
previous_stage: policy.current_stage,
|
|
245
|
-
files_to_clean: [],
|
|
246
|
-
files_cleaned: [],
|
|
247
|
-
stage_state: loadStageState(prefix, version),
|
|
248
|
-
warnings: [],
|
|
249
|
-
iteration_strategy: policy.iteration_strategy,
|
|
250
|
-
message: `Rollback blocked: ${policy.block_reason}`,
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
const filesCleaned = [];
|
|
254
|
-
const depDir = join(projectDir(prefix, version), "deployment");
|
|
255
|
-
if (policy.files_to_clean.includes("deployment/")) {
|
|
256
|
-
if (existsSync(depDir)) {
|
|
257
|
-
rmSync(depDir, { recursive: true, force: true });
|
|
258
|
-
filesCleaned.push("deployment/");
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
for (const relPath of policy.files_to_clean) {
|
|
263
|
-
const absPath = join(projectDir(prefix, version), relPath);
|
|
264
|
-
if (existsSync(absPath)) {
|
|
265
|
-
rmSync(absPath, { recursive: true, force: true });
|
|
266
|
-
filesCleaned.push(relPath);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
const newState = rollbackStageState(prefix, version, targetStage, {
|
|
271
|
-
reason: reason ?? `rollback to stage ${targetStage} (policy-evaluated)`,
|
|
272
|
-
affectedFiles: filesCleaned.length > 0 ? filesCleaned : ["stage.json"],
|
|
273
|
-
});
|
|
274
|
-
return {
|
|
275
|
-
success: true,
|
|
276
|
-
target_stage: targetStage,
|
|
277
|
-
previous_stage: policy.current_stage,
|
|
278
|
-
files_to_clean: policy.files_to_clean,
|
|
279
|
-
files_cleaned: filesCleaned,
|
|
280
|
-
stage_state: newState,
|
|
281
|
-
warnings: policy.warnings,
|
|
282
|
-
iteration_strategy: policy.iteration_strategy,
|
|
283
|
-
message: `Rolled back from stage ${policy.current_stage} to ${targetStage}. ` +
|
|
284
|
-
`${filesCleaned.length} file(s)/directory(ies) cleaned. ` +
|
|
285
|
-
`Stage state updated. ` +
|
|
286
|
-
(policy.iteration_strategy.strategy === "fork"
|
|
287
|
-
? `Note: this project has published objects — future modifications require fork.`
|
|
288
|
-
: `Project has no published objects — in-place modification is safe.`),
|
|
289
|
-
};
|
|
290
|
-
}
|
|
1
|
+
import{existsSync,rmSync}from'fs';import{join}from'path';import{loadStageState,projectDir,rollbackStage as a233a}from'./project-store.js';export const REVERSIBILITY_MATRIX=[{'object_type':'permission','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Permission\x20(unpublished):\x20can\x20add\x20tables/admins\x20freely'},{'object_type':'permission','lifecycle_state':'referenced','struct_reversible':'limited','behavior_reversible':!![],'gas_impact':'medium','explanation':'Permission\x20(referenced\x20by\x20published\x20service):\x20modifications\x20limited\x20—\x20affects\x20dependents'},{'object_type':'machine','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Machine\x20(unpublished):\x20can\x20modify\x20nodes/edges/forwards\x20freely'},{'object_type':'machine','lifecycle_state':'published','struct_reversible':'immutable','behavior_reversible':!![],'gas_impact':'none','explanation':'Machine\x20(published):\x20structure\x20is\x20immutable\x20—\x20can\x20only\x20advance\x20progress'},{'object_type':'service','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Service\x20(unpublished):\x20can\x20modify\x20fields\x20freely'},{'object_type':'service','lifecycle_state':'published','struct_reversible':'immutable','behavior_reversible':!![],'gas_impact':'none','explanation':'Service\x20(published):\x20machine/order_allocators\x20frozen\x20—\x20can\x20still\x20transact\x20normally'},{'object_type':'guard','lifecycle_state':'created','struct_reversible':'immutable','behavior_reversible':![],'gas_impact':'none','explanation':'Guard:\x20create-only\x20semantics\x20—\x20immutable\x20from\x20creation'},{'object_type':'allocation','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Allocator\x20(unbound):\x20can\x20modify\x20strategy\x20freely'},{'object_type':'allocation','lifecycle_state':'bound','struct_reversible':'limited','behavior_reversible':!![],'gas_impact':'medium','explanation':'Allocator\x20(bound\x20to\x20published\x20service):\x20strategy\x20modifications\x20limited'},{'object_type':'treasury','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Treasury:\x20can\x20modify\x20rules\x20freely'},{'object_type':'arb','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Arbitration:\x20can\x20modify\x20rules\x20freely'},{'object_type':'reward','lifecycle_state':'created','struct_reversible':'reversible','behavior_reversible':!![],'gas_impact':'low','explanation':'Reward:\x20can\x20modify\x20rules\x20freely'},{'object_type':'progress','lifecycle_state':'bound','struct_reversible':'immutable','behavior_reversible':!![],'gas_impact':'none','explanation':'Progress\x20(bound\x20to\x20machine):\x20cannot\x20swap\x20machine\x20—\x20can\x20only\x20forward'},{'object_type':'order','lifecycle_state':'created','struct_reversible':'immutable','behavior_reversible':!![],'gas_impact':'none','explanation':'Order:\x20structure\x20immutable\x20after\x20creation\x20—\x20can\x20only\x20advance\x20state'}];export function queryReversibility(a,b){return REVERSIBILITY_MATRIX['find'](c=>c['object_type']===a&&c['lifecycle_state']===b);}export function getReversibilityForType(a){return REVERSIBILITY_MATRIX['filter'](b=>b['object_type']===a);}export function recommendIterationStrategy(a,b,c){const d=loadStageState(a,b);if(!d)return{'strategy':'in_place','reason':'Project\x20not\x20initialized\x20—\x20no\x20stage\x20state\x20found.\x20Use\x20in-place\x20for\x20new\x20projects.'};if(d['has_published_object']){const f=b['match'](/^v(\d+)$/),g=f?parseInt(f[0x1])+0x1:0x2,h='v'+g;return{'strategy':'fork','reason':'Project\x20has\x20published\x20on-chain\x20objects\x20—\x20in-place\x20modification\x20would\x20break\x20running\x20business.\x20'+('Fork\x20to\x20'+h+'\x20to\x20preserve\x20the\x20original\x20version\x20as\x20a\x20read-only\x20historical\x20snapshot.'),'fork_to_version':h,'published_objects':d['stage_meta'][0x5]?.['committed']?['see\x20deployment/05-substeps/\x20for\x20published\x20object\x20list']:[]};}const e=c??d['stage'];return{'strategy':'in_place','reason':'Project\x20has\x20no\x20published\x20objects\x20(current\x20stage:\x20'+e+').\x20'+'Safe\x20to\x20modify\x20the\x20current\x20version\x20directly\x20—\x20all\x20changes\x20are\x20local\x20and\x20reversible.'};}const STAGE_DIR_SUFFIXES={0x1:'01-namespace',0x2:'02-puzzle',0x3:'03-risk',0x4:'04-steps',0x5:'05-substeps'};export function evaluateRollbackPolicy(a,b,c){const d=loadStageState(a,b);if(!d)return{'allowed':![],'target_stage':c,'current_stage':0x1,'block_reason':'Project\x20not\x20initialized:\x20'+a+'_'+b,'files_to_clean':[],'warnings':[],'iteration_strategy':{'strategy':'in_place','reason':'Project\x20not\x20initialized.'}};const e=d['stage'],f=recommendIterationStrategy(a,b,e);if(d['has_published_object'])return{'allowed':![],'target_stage':c,'current_stage':e,'block_reason':'Project\x20has\x20published\x20on-chain\x20objects\x20—\x20rollback\x20is\x20forbidden\x20(§3.3).\x20'+'Use\x20fork_project\x20to\x20create\x20a\x20new\x20version\x20for\x20modifications.','files_to_clean':[],'warnings':[],'iteration_strategy':f};if(c>=e)return{'allowed':![],'target_stage':c,'current_stage':e,'block_reason':'Target\x20stage\x20'+c+'\x20must\x20be\x20less\x20than\x20current\x20stage\x20'+e+'.','files_to_clean':[],'warnings':[],'iteration_strategy':f};if(c<0x1)return{'allowed':![],'target_stage':c,'current_stage':e,'block_reason':'Cannot\x20rollback\x20below\x20stage\x201.','files_to_clean':[],'warnings':[],'iteration_strategy':f};const g=[],h=[],i=join(projectDir(a,b),'deployment');for(let j=c+0x1;j<=0x5;j++){const k=join(i,STAGE_DIR_SUFFIXES[j]);existsSync(k)&&g['push']('deployment/'+STAGE_DIR_SUFFIXES[j]+'/');}return c<=0x2&&existsSync(i)&&(g['length']=0x0,g['push']('deployment/')),g['length']>0x0&&h['push']('Rollback\x20will\x20delete\x20'+g['length']+'\x20file(s)/directory(ies):\x20'+g['join'](',\x20')+'.\x20'+'This\x20data\x20will\x20be\x20lost\x20—\x20regenerate\x20by\x20re-running\x20the\x20stage\x20action.'),{'allowed':!![],'target_stage':c,'current_stage':e,'files_to_clean':g,'warnings':h,'iteration_strategy':f};}export function rollbackStageWithPolicy(a,b,c,d){const e=evaluateRollbackPolicy(a,b,c);if(!e['allowed'])return{'success':![],'target_stage':c,'previous_stage':e['current_stage'],'files_to_clean':[],'files_cleaned':[],'stage_state':loadStageState(a,b),'warnings':[],'iteration_strategy':e['iteration_strategy'],'message':'Rollback\x20blocked:\x20'+e['block_reason']};const f=[],g=join(projectDir(a,b),'deployment');if(e['files_to_clean']['includes']('deployment/'))existsSync(g)&&(rmSync(g,{'recursive':!![],'force':!![]}),f['push']('deployment/'));else for(const i of e['files_to_clean']){const j=join(projectDir(a,b),i);existsSync(j)&&(rmSync(j,{'recursive':!![],'force':!![]}),f['push'](i));}const h=a233a(a,b,c,{'reason':d??'rollback\x20to\x20stage\x20'+c+'\x20(policy-evaluated)','affectedFiles':f['length']>0x0?f:['stage.json']});return{'success':!![],'target_stage':c,'previous_stage':e['current_stage'],'files_to_clean':e['files_to_clean'],'files_cleaned':f,'stage_state':h,'warnings':e['warnings'],'iteration_strategy':e['iteration_strategy'],'message':'Rolled\x20back\x20from\x20stage\x20'+e['current_stage']+'\x20to\x20'+c+'.\x20'+(f['length']+'\x20file(s)/directory(ies)\x20cleaned.\x20')+'Stage\x20state\x20updated.\x20'+(e['iteration_strategy']['strategy']==='fork'?'Note:\x20this\x20project\x20has\x20published\x20objects\x20—\x20future\x20modifications\x20require\x20fork.':'Project\x20has\x20no\x20published\x20objects\x20—\x20in-place\x20modification\x20is\x20safe.')};}
|