project-tiny-context-harness 0.8.16 → 0.11.0
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/README.md +119 -41
- package/assets/README.md +184 -55
- package/assets/README.zh-CN.md +114 -40
- package/assets/agents/AGENTS_CORE.md +2 -2
- package/assets/context_templates/context.toml +6 -1
- package/assets/context_templates/screen-contract.md +16 -0
- package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_helpers.cs +301 -0
- package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_run.cs +197 -0
- package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_types.cs +215 -0
- package/assets/runtime/windows-job-supervisor/windows_job_process_supervisor.ps1 +117 -0
- package/assets/skills/context_development_engineer/SKILL.md +16 -30
- package/assets/skills/context_development_engineer/references/engineering-design-reasoning.md +93 -0
- package/assets/skills/context_surface_contract/SKILL.md +13 -2
- package/assets/skills/context_uiux_design/SKILL.md +7 -3
- package/assets/skills/context_uiux_design/references/task-uiux-analysis.md +82 -0
- package/assets/skills/design-resource-authoring/SKILL.md +18 -9
- package/assets/skills/design-resource-authoring/references/authority-delta-assessment.md +52 -0
- package/assets/skills/design-resource-authoring/references/downstream-handoff.md +22 -6
- package/assets/skills/design-resource-authoring/references/formal-selected-web-app-handoff.md +26 -8
- package/assets/skills/design-resource-authoring/references/implementation-feasibility.md +111 -0
- package/assets/skills/design-resource-authoring/references/open-design-provider.md +45 -7
- package/assets/skills/design-resource-authoring/references/recovery-and-writeback.md +7 -1
- package/assets/skills/design-resource-authoring/references/resource-selection.md +115 -3
- package/assets/skills/design-system-authoring/SKILL.md +23 -17
- package/assets/skills/design-system-authoring/references/authority-adoption.md +19 -9
- package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +4 -0
- package/assets/skills/long-task-workflow/SKILL.md +6 -6
- package/assets/skills/long-task-workflow/references/authority-lifecycle.md +10 -4
- package/assets/skills/long-task-workflow/references/contract-authoring.md +5 -5
- package/assets/skills/long-task-workflow/references/evidence-design.md +14 -3
- package/assets/skills/long-task-workflow/references/source-authoring.md +11 -8
- package/assets/tools/context_rules.json +53 -0
- package/assets/tools/validate_context.py +302 -77
- package/dist/cli.js +2 -1
- package/dist/commands/context-create.d.ts +1 -0
- package/dist/commands/context-create.js +90 -0
- package/dist/commands/context-inspect.d.ts +1 -0
- package/dist/commands/context-inspect.js +98 -0
- package/dist/commands/context-move.d.ts +1 -0
- package/dist/commands/context-move.js +78 -0
- package/dist/commands/context-register.d.ts +1 -0
- package/dist/commands/context-register.js +110 -0
- package/dist/commands/context-transaction.d.ts +1 -0
- package/dist/commands/context-transaction.js +84 -0
- package/dist/commands/context.d.ts +1 -0
- package/dist/commands/context.js +36 -0
- package/dist/commands/design-authority-delta.d.ts +1 -0
- package/dist/commands/design-authority-delta.js +53 -0
- package/dist/commands/design-authority.d.ts +1 -0
- package/dist/commands/design-authority.js +104 -0
- package/dist/commands/design-resource.js +17 -3
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +61 -3
- package/dist/commands/index.js +19 -2
- package/dist/commands/long-task-authoring.js +20 -2
- package/dist/commands/long-task-workdir.d.ts +2 -0
- package/dist/commands/long-task-workdir.js +23 -0
- package/dist/commands/long-task.js +75 -6
- package/dist/commands/route.d.ts +15 -0
- package/dist/commands/route.js +142 -0
- package/dist/index.d.ts +3 -13
- package/dist/index.js +3 -12
- package/dist/lib/cli-exit.d.ts +14 -0
- package/dist/lib/cli-exit.js +19 -0
- package/dist/lib/context-catalog/catalog-default-footprint.d.ts +3 -0
- package/dist/lib/context-catalog/catalog-default-footprint.js +53 -0
- package/dist/lib/context-catalog/catalog-diagnostics.d.ts +9 -0
- package/dist/lib/context-catalog/catalog-diagnostics.js +34 -0
- package/dist/lib/context-catalog/catalog-discovery.d.ts +7 -0
- package/dist/lib/context-catalog/catalog-discovery.js +81 -0
- package/dist/lib/context-catalog/catalog-load.d.ts +8 -0
- package/dist/lib/context-catalog/catalog-load.js +187 -0
- package/dist/lib/context-catalog/catalog-path-validation.d.ts +7 -0
- package/dist/lib/context-catalog/catalog-path-validation.js +62 -0
- package/dist/lib/context-catalog/catalog-paths.d.ts +11 -0
- package/dist/lib/context-catalog/catalog-paths.js +41 -0
- package/dist/lib/context-catalog/catalog-portable-contract.d.ts +15 -0
- package/dist/lib/context-catalog/catalog-portable-contract.js +68 -0
- package/dist/lib/context-catalog/catalog-staged-path-safety.d.ts +1 -0
- package/dist/lib/context-catalog/catalog-staged-path-safety.js +36 -0
- package/dist/lib/context-catalog/catalog-types.d.ts +40 -0
- package/dist/lib/context-catalog/catalog-types.js +1 -0
- package/dist/lib/context-catalog/catalog-validation.d.ts +9 -0
- package/dist/lib/context-catalog/catalog-validation.js +148 -0
- package/dist/lib/context-create/context-create-path.d.ts +2 -0
- package/dist/lib/context-create/context-create-path.js +30 -0
- package/dist/lib/context-create/context-create-template.d.ts +2 -0
- package/dist/lib/context-create/context-create-template.js +95 -0
- package/dist/lib/context-create/context-create-types.d.ts +28 -0
- package/dist/lib/context-create/context-create-types.js +1 -0
- package/dist/lib/context-create/context-create-write.d.ts +1 -0
- package/dist/lib/context-create/context-create-write.js +85 -0
- package/dist/lib/context-create/context-create.d.ts +2 -0
- package/dist/lib/context-create/context-create.js +84 -0
- package/dist/lib/context-default-footprint.d.ts +2 -3
- package/dist/lib/context-default-footprint.js +49 -57
- package/dist/lib/context-doctor/context-doctor-types.d.ts +16 -0
- package/dist/lib/context-doctor/context-doctor-types.js +15 -0
- package/dist/lib/context-doctor/context-doctor.d.ts +2 -0
- package/dist/lib/context-doctor/context-doctor.js +130 -0
- package/dist/lib/context-graph-snapshot.d.ts +5 -0
- package/dist/lib/context-graph-snapshot.js +46 -25
- package/dist/lib/context-inspect/context-inspect-projection.d.ts +9 -0
- package/dist/lib/context-inspect/context-inspect-projection.js +49 -0
- package/dist/lib/context-inspect/context-inspect-render.d.ts +2 -0
- package/dist/lib/context-inspect/context-inspect-render.js +29 -0
- package/dist/lib/context-inspect/context-inspect-types.d.ts +43 -0
- package/dist/lib/context-inspect/context-inspect-types.js +1 -0
- package/dist/lib/context-inspect/context-inspect.d.ts +2 -0
- package/dist/lib/context-inspect/context-inspect.js +104 -0
- package/dist/lib/context-manifest-schema.d.ts +1 -1
- package/dist/lib/context-manifest-schema.js +4 -20
- package/dist/lib/context-markdown/context-markdown-analysis.d.ts +15 -0
- package/dist/lib/context-markdown/context-markdown-analysis.js +245 -0
- package/dist/lib/context-markdown/context-markdown-extract.d.ts +7 -0
- package/dist/lib/context-markdown/context-markdown-extract.js +114 -0
- package/dist/lib/context-markdown/context-markdown-types.d.ts +57 -0
- package/dist/lib/context-markdown/context-markdown-types.js +1 -0
- package/dist/lib/context-move/context-move-input.d.ts +8 -0
- package/dist/lib/context-move/context-move-input.js +17 -0
- package/dist/lib/context-move/context-move-literal-scan.d.ts +20 -0
- package/dist/lib/context-move/context-move-literal-scan.js +213 -0
- package/dist/lib/context-move/context-move-live-validation.d.ts +3 -0
- package/dist/lib/context-move/context-move-live-validation.js +56 -0
- package/dist/lib/context-move/context-move-markdown-plan.d.ts +22 -0
- package/dist/lib/context-move/context-move-markdown-plan.js +39 -0
- package/dist/lib/context-move/context-move-projection.d.ts +3 -0
- package/dist/lib/context-move/context-move-projection.js +11 -0
- package/dist/lib/context-move/context-move-reference-validation.d.ts +11 -0
- package/dist/lib/context-move/context-move-reference-validation.js +64 -0
- package/dist/lib/context-move/context-move-render.d.ts +2 -0
- package/dist/lib/context-move/context-move-render.js +24 -0
- package/dist/lib/context-move/context-move-support.d.ts +10 -0
- package/dist/lib/context-move/context-move-support.js +88 -0
- package/dist/lib/context-move/context-move-transaction-plan.d.ts +24 -0
- package/dist/lib/context-move/context-move-transaction-plan.js +108 -0
- package/dist/lib/context-move/context-move-types.d.ts +74 -0
- package/dist/lib/context-move/context-move-types.js +1 -0
- package/dist/lib/context-move/context-move.d.ts +8 -0
- package/dist/lib/context-move/context-move.js +180 -0
- package/dist/lib/context-mutation/manifest-lossless-patch.d.ts +28 -0
- package/dist/lib/context-mutation/manifest-lossless-patch.js +208 -0
- package/dist/lib/context-mutation/markdown-link-patch.d.ts +34 -0
- package/dist/lib/context-mutation/markdown-link-patch.js +143 -0
- package/dist/lib/context-mutation/markdown-link-spans.d.ts +10 -0
- package/dist/lib/context-mutation/markdown-link-spans.js +179 -0
- package/dist/lib/context-mutation/mutation-cas.d.ts +13 -0
- package/dist/lib/context-mutation/mutation-cas.js +365 -0
- package/dist/lib/context-mutation/mutation-command-support.d.ts +12 -0
- package/dist/lib/context-mutation/mutation-command-support.js +57 -0
- package/dist/lib/context-mutation/mutation-commit.d.ts +12 -0
- package/dist/lib/context-mutation/mutation-commit.js +89 -0
- package/dist/lib/context-mutation/mutation-directories.d.ts +5 -0
- package/dist/lib/context-mutation/mutation-directories.js +56 -0
- package/dist/lib/context-mutation/mutation-file-state.d.ts +14 -0
- package/dist/lib/context-mutation/mutation-file-state.js +137 -0
- package/dist/lib/context-mutation/mutation-journal-file-validation.d.ts +1 -0
- package/dist/lib/context-mutation/mutation-journal-file-validation.js +106 -0
- package/dist/lib/context-mutation/mutation-journal-io.d.ts +5 -0
- package/dist/lib/context-mutation/mutation-journal-io.js +55 -0
- package/dist/lib/context-mutation/mutation-journal-storage.d.ts +18 -0
- package/dist/lib/context-mutation/mutation-journal-storage.js +283 -0
- package/dist/lib/context-mutation/mutation-journal-validation-support.d.ts +16 -0
- package/dist/lib/context-mutation/mutation-journal-validation-support.js +140 -0
- package/dist/lib/context-mutation/mutation-journal-validation.d.ts +3 -0
- package/dist/lib/context-mutation/mutation-journal-validation.js +177 -0
- package/dist/lib/context-mutation/mutation-journal.d.ts +8 -0
- package/dist/lib/context-mutation/mutation-journal.js +111 -0
- package/dist/lib/context-mutation/mutation-live-validation.d.ts +3 -0
- package/dist/lib/context-mutation/mutation-live-validation.js +51 -0
- package/dist/lib/context-mutation/mutation-long-task-guard.d.ts +6 -0
- package/dist/lib/context-mutation/mutation-long-task-guard.js +57 -0
- package/dist/lib/context-mutation/mutation-recovery.d.ts +4 -0
- package/dist/lib/context-mutation/mutation-recovery.js +189 -0
- package/dist/lib/context-mutation/mutation-staged-fs.d.ts +5 -0
- package/dist/lib/context-mutation/mutation-staged-fs.js +56 -0
- package/dist/lib/context-mutation/mutation-types.d.ts +103 -0
- package/dist/lib/context-mutation/mutation-types.js +1 -0
- package/dist/lib/context-register/context-register-input.d.ts +11 -0
- package/dist/lib/context-register/context-register-input.js +43 -0
- package/dist/lib/context-register/context-register-render.d.ts +2 -0
- package/dist/lib/context-register/context-register-render.js +21 -0
- package/dist/lib/context-register/context-register-support.d.ts +6 -0
- package/dist/lib/context-register/context-register-support.js +46 -0
- package/dist/lib/context-register/context-register-types.d.ts +46 -0
- package/dist/lib/context-register/context-register-types.js +1 -0
- package/dist/lib/context-register/context-register.d.ts +8 -0
- package/dist/lib/context-register/context-register.js +155 -0
- package/dist/lib/context-router/context-route-budget.d.ts +15 -0
- package/dist/lib/context-router/context-route-budget.js +14 -0
- package/dist/lib/context-router/context-route-candidates.d.ts +15 -0
- package/dist/lib/context-router/context-route-candidates.js +112 -0
- package/dist/lib/context-router/context-route-order.d.ts +6 -0
- package/dist/lib/context-router/context-route-order.js +53 -0
- package/dist/lib/context-router/context-route-paths.d.ts +16 -0
- package/dist/lib/context-router/context-route-paths.js +109 -0
- package/dist/lib/context-router/context-route-render.d.ts +2 -0
- package/dist/lib/context-router/context-route-render.js +32 -0
- package/dist/lib/context-router/context-route-scan.d.ts +18 -0
- package/dist/lib/context-router/context-route-scan.js +156 -0
- package/dist/lib/context-router/context-route-selection.d.ts +16 -0
- package/dist/lib/context-router/context-route-selection.js +72 -0
- package/dist/lib/context-router/context-route-terms.d.ts +13 -0
- package/dist/lib/context-router/context-route-terms.js +202 -0
- package/dist/lib/context-router/context-route-types.d.ts +101 -0
- package/dist/lib/context-router/context-route-types.js +1 -0
- package/dist/lib/context-router/context-route.d.ts +2 -0
- package/dist/lib/context-router/context-route.js +127 -0
- package/dist/lib/context-units-migration.d.ts +13 -0
- package/dist/lib/context-units-migration.js +217 -0
- package/dist/lib/design-authority-binding.d.ts +7 -0
- package/dist/lib/design-authority-binding.js +96 -0
- package/dist/lib/design-authority-closure.d.ts +3 -0
- package/dist/lib/design-authority-closure.js +201 -0
- package/dist/lib/design-authority-delta-codec-primitives.d.ts +10 -0
- package/dist/lib/design-authority-delta-codec-primitives.js +58 -0
- package/dist/lib/design-authority-delta-codec.d.ts +2 -0
- package/dist/lib/design-authority-delta-codec.js +193 -0
- package/dist/lib/design-authority-delta-types.d.ts +65 -0
- package/dist/lib/design-authority-delta-types.js +6 -0
- package/dist/lib/design-authority-delta-validation.d.ts +2 -0
- package/dist/lib/design-authority-delta-validation.js +16 -0
- package/dist/lib/design-authority-digest.d.ts +8 -0
- package/dist/lib/design-authority-digest.js +36 -0
- package/dist/lib/design-authority-files.d.ts +9 -0
- package/dist/lib/design-authority-files.js +62 -0
- package/dist/lib/design-authority-format.d.ts +2 -0
- package/dist/lib/design-authority-format.js +93 -0
- package/dist/lib/design-authority-links.d.ts +10 -0
- package/dist/lib/design-authority-links.js +137 -0
- package/dist/lib/design-authority-manifest.d.ts +4 -0
- package/dist/lib/design-authority-manifest.js +144 -0
- package/dist/lib/design-authority-tokens.d.ts +9 -0
- package/dist/lib/design-authority-tokens.js +45 -0
- package/dist/lib/design-authority-types.d.ts +80 -0
- package/dist/lib/design-authority-types.js +23 -0
- package/dist/lib/design-md-tool-adapter.d.ts +9 -0
- package/dist/lib/design-md-tool-adapter.js +152 -0
- package/dist/lib/design-md-tool-normalization.d.ts +7 -0
- package/dist/lib/design-md-tool-normalization.js +78 -0
- package/dist/lib/design-md-tool-types.d.ts +99 -0
- package/dist/lib/design-md-tool-types.js +8 -0
- package/dist/lib/design-resource-handoff-bundle.js +5 -0
- package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
- package/dist/lib/design-resource-handoff-manifest-projection.js +4 -0
- package/dist/lib/design-resource-handoff-set-integrity.js +1 -0
- package/dist/lib/design-resource-handoff-shape.js +18 -2
- package/dist/lib/design-resource-handoff-types.d.ts +8 -0
- package/dist/lib/design-resource-handoff-validation.js +24 -0
- package/dist/lib/design-resource-implementation-feasibility-model.d.ts +35 -0
- package/dist/lib/design-resource-implementation-feasibility-model.js +62 -0
- package/dist/lib/design-resource-implementation-feasibility-shape-sections.d.ts +43 -0
- package/dist/lib/design-resource-implementation-feasibility-shape-sections.js +142 -0
- package/dist/lib/design-resource-implementation-feasibility-shape.d.ts +4 -0
- package/dist/lib/design-resource-implementation-feasibility-shape.js +154 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.d.ts +24 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision-projection.js +106 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision.d.ts +21 -0
- package/dist/lib/design-resource-implementation-feasibility-source-decision.js +75 -0
- package/dist/lib/design-resource-implementation-feasibility-types.d.ts +135 -0
- package/dist/lib/design-resource-implementation-feasibility-types.js +37 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-cells.d.ts +5 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-cells.js +125 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-document.d.ts +4 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-document.js +167 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-facts.d.ts +3 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-facts.js +76 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-realizations.d.ts +8 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-realizations.js +76 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-support.d.ts +10 -0
- package/dist/lib/design-resource-implementation-feasibility-validation-support.js +75 -0
- package/dist/lib/design-resource-implementation-feasibility-validation.d.ts +3 -0
- package/dist/lib/design-resource-implementation-feasibility-validation.js +138 -0
- package/dist/lib/design-resource-recovery-current.js +22 -0
- package/dist/lib/design-resource-recovery-shape.js +64 -7
- package/dist/lib/design-resource-recovery-types.d.ts +4 -1
- package/dist/lib/design-resource-symbolic-fact-shape.js +9 -1
- package/dist/lib/design-resource-symbolic-fact-types.d.ts +8 -0
- package/dist/lib/design-resource-symbolic-fact-validation.js +25 -0
- package/dist/lib/doctor.d.ts +2 -1
- package/dist/lib/doctor.js +29 -1
- package/dist/lib/fs.js +1 -1
- package/dist/lib/long-task-acceptance-reachability-claims.d.ts +2 -0
- package/dist/lib/long-task-acceptance-reachability-claims.js +279 -0
- package/dist/lib/long-task-acceptance-reachability-design.d.ts +2 -0
- package/dist/lib/long-task-acceptance-reachability-design.js +96 -0
- package/dist/lib/long-task-acceptance-reachability-external.d.ts +9 -0
- package/dist/lib/long-task-acceptance-reachability-external.js +123 -0
- package/dist/lib/long-task-acceptance-reachability-helpers.d.ts +64 -0
- package/dist/lib/long-task-acceptance-reachability-helpers.js +473 -0
- package/dist/lib/long-task-acceptance-reachability-semantic.d.ts +2 -0
- package/dist/lib/long-task-acceptance-reachability-semantic.js +122 -0
- package/dist/lib/long-task-acceptance-reachability-types.d.ts +91 -0
- package/dist/lib/long-task-acceptance-reachability-types.js +1 -0
- package/dist/lib/long-task-acceptance-reachability.d.ts +4 -0
- package/dist/lib/long-task-acceptance-reachability.js +115 -0
- package/dist/lib/long-task-activation-validation.d.ts +6 -0
- package/dist/lib/long-task-activation-validation.js +96 -23
- package/dist/lib/long-task-active-authority-lock-context.d.ts +4 -0
- package/dist/lib/long-task-active-authority-lock-context.js +29 -0
- package/dist/lib/long-task-applicability-identity.d.ts +25 -0
- package/dist/lib/long-task-applicability-identity.js +60 -0
- package/dist/lib/long-task-authoring-preflight-diagnostics.js +8 -0
- package/dist/lib/long-task-authoring-preflight-types.d.ts +2 -0
- package/dist/lib/long-task-authoring-preflight-types.js +9 -0
- package/dist/lib/long-task-authoring-preflight.js +18 -2
- package/dist/lib/long-task-authority-material-diff.js +4 -0
- package/dist/lib/long-task-authority-materials.js +19 -0
- package/dist/lib/long-task-authority-policy.d.ts +3 -0
- package/dist/lib/long-task-authority-policy.js +3 -0
- package/dist/lib/long-task-authority-revision-details.js +2 -1
- package/dist/lib/long-task-authority-types.d.ts +2 -0
- package/dist/lib/long-task-authority.js +2 -0
- package/dist/lib/long-task-check-runner.js +3 -296
- package/dist/lib/long-task-check-shape.js +6 -1
- package/dist/lib/long-task-claim-definitions.js +1 -3
- package/dist/lib/long-task-claim-semantic-proof-floor.d.ts +3 -0
- package/dist/lib/long-task-claim-semantic-proof-floor.js +78 -0
- package/dist/lib/long-task-claims.d.ts +0 -18
- package/dist/lib/long-task-claims.js +15 -14
- package/dist/lib/long-task-command-process.d.ts +9 -0
- package/dist/lib/long-task-command-process.js +178 -0
- package/dist/lib/long-task-compact-authoring.js +3 -0
- package/dist/lib/long-task-compact-projections.js +10 -0
- package/dist/lib/long-task-complete-delivery-evidence-types.d.ts +38 -0
- package/dist/lib/long-task-complete-delivery-evidence-types.js +1 -0
- package/dist/lib/long-task-completion-types.d.ts +109 -0
- package/dist/lib/long-task-completion-types.js +1 -0
- package/dist/lib/long-task-conformance-policy.d.ts +2 -1
- package/dist/lib/long-task-conformance-policy.js +11 -4
- package/dist/lib/long-task-context-authority-topology.js +6 -4
- package/dist/lib/long-task-contract-types.d.ts +52 -1
- package/dist/lib/long-task-counterfactual-sandbox.d.ts +7 -1
- package/dist/lib/long-task-counterfactual-sandbox.js +86 -6
- package/dist/lib/long-task-delivery-compiler-preflight.d.ts +24 -0
- package/dist/lib/long-task-delivery-compiler-preflight.js +32 -0
- package/dist/lib/long-task-delivery-compiler.d.ts +1 -0
- package/dist/lib/long-task-delivery-compiler.js +59 -44
- package/dist/lib/long-task-delivery-parser.d.ts +3 -0
- package/dist/lib/long-task-delivery-parser.js +26 -8
- package/dist/lib/long-task-delivery-types.d.ts +2 -0
- package/dist/lib/long-task-delivery-types.js +2 -0
- package/dist/lib/long-task-delivery-validation.d.ts +11 -3
- package/dist/lib/long-task-delivery-validation.js +23 -8
- package/dist/lib/long-task-design-feasibility-binding-owners.d.ts +6 -0
- package/dist/lib/long-task-design-feasibility-binding-owners.js +52 -0
- package/dist/lib/long-task-design-feasibility-binding.d.ts +14 -0
- package/dist/lib/long-task-design-feasibility-binding.js +114 -0
- package/dist/lib/long-task-design-feasibility-source-closure.d.ts +11 -0
- package/dist/lib/long-task-design-feasibility-source-closure.js +87 -0
- package/dist/lib/long-task-design-obligation.d.ts +50 -0
- package/dist/lib/long-task-design-obligation.js +99 -0
- package/dist/lib/long-task-design-resource-handoff.d.ts +5 -3
- package/dist/lib/long-task-design-resource-handoff.js +64 -4
- package/dist/lib/long-task-design-resource-method-binding.js +20 -2
- package/dist/lib/long-task-effective-external-takeover.d.ts +15 -0
- package/dist/lib/long-task-effective-external-takeover.js +109 -0
- package/dist/lib/long-task-effective-external-ui-takeover.d.ts +5 -0
- package/dist/lib/long-task-effective-external-ui-takeover.js +117 -0
- package/dist/lib/long-task-evidence-capability-codec.js +91 -0
- package/dist/lib/long-task-evidence-capability-runtime.js +62 -14
- package/dist/lib/long-task-evidence-capability-types.d.ts +3 -2
- package/dist/lib/long-task-evidence-v2.d.ts +6 -1
- package/dist/lib/long-task-evidence-v2.js +253 -170
- package/dist/lib/long-task-execution-observation.d.ts +7 -0
- package/dist/lib/long-task-execution-observation.js +21 -4
- package/dist/lib/long-task-expected-authority.d.ts +4 -0
- package/dist/lib/long-task-expected-authority.js +126 -0
- package/dist/lib/long-task-external-confirmation-artifacts.d.ts +9 -0
- package/dist/lib/long-task-external-confirmation-artifacts.js +138 -0
- package/dist/lib/long-task-external-confirmation-attestation.d.ts +20 -0
- package/dist/lib/long-task-external-confirmation-attestation.js +115 -0
- package/dist/lib/long-task-external-confirmation-challenge.d.ts +23 -0
- package/dist/lib/long-task-external-confirmation-challenge.js +164 -0
- package/dist/lib/long-task-external-confirmation-context.d.ts +14 -0
- package/dist/lib/long-task-external-confirmation-context.js +53 -0
- package/dist/lib/long-task-external-confirmation-evaluation.d.ts +11 -0
- package/dist/lib/long-task-external-confirmation-evaluation.js +454 -0
- package/dist/lib/long-task-external-confirmation-expected.d.ts +8 -0
- package/dist/lib/long-task-external-confirmation-expected.js +200 -0
- package/dist/lib/long-task-external-confirmation-identity.d.ts +10 -0
- package/dist/lib/long-task-external-confirmation-identity.js +77 -0
- package/dist/lib/long-task-external-confirmation-plan.d.ts +25 -0
- package/dist/lib/long-task-external-confirmation-plan.js +148 -0
- package/dist/lib/long-task-external-confirmation-preparation.d.ts +4 -0
- package/dist/lib/long-task-external-confirmation-preparation.js +100 -0
- package/dist/lib/long-task-external-confirmation-shape.d.ts +8 -0
- package/dist/lib/long-task-external-confirmation-shape.js +387 -0
- package/dist/lib/long-task-external-confirmation-state.d.ts +10 -0
- package/dist/lib/long-task-external-confirmation-state.js +109 -0
- package/dist/lib/long-task-external-confirmation-types.d.ts +195 -0
- package/dist/lib/long-task-external-confirmation-types.js +1 -0
- package/dist/lib/long-task-final-integrity.d.ts +2 -0
- package/dist/lib/long-task-final-integrity.js +21 -10
- package/dist/lib/long-task-final-v2.d.ts +7 -2
- package/dist/lib/long-task-final-v2.js +179 -55
- package/dist/lib/long-task-finalization-identity.d.ts +27 -0
- package/dist/lib/long-task-finalization-identity.js +58 -0
- package/dist/lib/long-task-finding-context.d.ts +1 -1
- package/dist/lib/long-task-finding-context.js +139 -13
- package/dist/lib/long-task-freshness.d.ts +27 -0
- package/dist/lib/long-task-freshness.js +129 -6
- package/dist/lib/long-task-git.js +3 -3
- package/dist/lib/long-task-material-input-closure.d.ts +3 -0
- package/dist/lib/long-task-material-input-closure.js +92 -0
- package/dist/lib/long-task-obligation-authority-resolution.d.ts +12 -0
- package/dist/lib/long-task-obligation-authority-resolution.js +57 -0
- package/dist/lib/long-task-obligation-semantic-identity.d.ts +16 -0
- package/dist/lib/long-task-obligation-semantic-identity.js +116 -0
- package/dist/lib/long-task-observation-authority.d.ts +11 -0
- package/dist/lib/long-task-observation-authority.js +137 -6
- package/dist/lib/long-task-process-table.d.ts +9 -0
- package/dist/lib/long-task-process-table.js +87 -0
- package/dist/lib/long-task-process-tree.d.ts +8 -0
- package/dist/lib/long-task-process-tree.js +108 -0
- package/dist/lib/long-task-proof-adequacy.d.ts +12 -0
- package/dist/lib/long-task-proof-adequacy.js +57 -0
- package/dist/lib/long-task-proof-capability-floor.d.ts +6 -0
- package/dist/lib/long-task-proof-capability-floor.js +137 -0
- package/dist/lib/long-task-protected-files.d.ts +1 -1
- package/dist/lib/long-task-protected-files.js +1 -1
- package/dist/lib/long-task-repair-frontier-checks.d.ts +8 -0
- package/dist/lib/long-task-repair-frontier-checks.js +93 -0
- package/dist/lib/long-task-repair-frontier-groups.d.ts +2 -0
- package/dist/lib/long-task-repair-frontier-groups.js +64 -0
- package/dist/lib/long-task-repair-frontier-utils.d.ts +6 -0
- package/dist/lib/long-task-repair-frontier-utils.js +27 -0
- package/dist/lib/long-task-repair-frontier.d.ts +14 -0
- package/dist/lib/long-task-repair-frontier.js +132 -0
- package/dist/lib/long-task-risk.d.ts +3 -2
- package/dist/lib/long-task-risk.js +73 -24
- package/dist/lib/long-task-root-shape.js +148 -8
- package/dist/lib/long-task-runner-freeze.d.ts +2 -1
- package/dist/lib/long-task-runner-freeze.js +23 -8
- package/dist/lib/long-task-runtime-types.d.ts +34 -40
- package/dist/lib/long-task-semantic-assurance-policy.js +2 -11
- package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
- package/dist/lib/long-task-semantic-drift-migration.js +48 -2
- package/dist/lib/long-task-semantic-fact-binding-types.d.ts +20 -0
- package/dist/lib/long-task-semantic-fact-closure.d.ts +5 -1
- package/dist/lib/long-task-semantic-fact-closure.js +33 -5
- package/dist/lib/long-task-semantic-fact-contract-closure.js +176 -1
- package/dist/lib/long-task-semantic-fact-contract-proofs.js +18 -1
- package/dist/lib/long-task-semantic-fact-input-closure.d.ts +16 -2
- package/dist/lib/long-task-semantic-fact-input-closure.js +138 -15
- package/dist/lib/long-task-semantic-fact-provenance-closure.js +1 -1
- package/dist/lib/long-task-semantic-fact-shape.d.ts +2 -1
- package/dist/lib/long-task-semantic-fact-shape.js +35 -1
- package/dist/lib/long-task-semantic-proof-adequacy.d.ts +2 -0
- package/dist/lib/long-task-semantic-proof-adequacy.js +19 -0
- package/dist/lib/long-task-semantic-proof-profile.d.ts +5 -0
- package/dist/lib/long-task-semantic-proof-profile.js +187 -0
- package/dist/lib/long-task-shape-primitives.d.ts +1 -1
- package/dist/lib/long-task-shape-primitives.js +5 -0
- package/dist/lib/long-task-source-anchors.d.ts +10 -0
- package/dist/lib/long-task-source-anchors.js +102 -0
- package/dist/lib/long-task-source-authority-types.d.ts +46 -0
- package/dist/lib/long-task-source-claim-validation.js +36 -0
- package/dist/lib/long-task-source-conservation-facts.d.ts +8 -0
- package/dist/lib/long-task-source-conservation-facts.js +57 -0
- package/dist/lib/long-task-source-conservation-types.d.ts +34 -0
- package/dist/lib/long-task-source-conservation-types.js +1 -0
- package/dist/lib/long-task-source-conservation.d.ts +7 -0
- package/dist/lib/long-task-source-conservation.js +110 -0
- package/dist/lib/long-task-source-fragments.d.ts +6 -0
- package/dist/lib/long-task-source-fragments.js +219 -0
- package/dist/lib/long-task-source-projection-resolution.d.ts +5 -0
- package/dist/lib/long-task-source-projection-resolution.js +57 -0
- package/dist/lib/long-task-source-projection-validation.d.ts +17 -0
- package/dist/lib/long-task-source-projection-validation.js +154 -0
- package/dist/lib/long-task-source-shape.js +14 -6
- package/dist/lib/long-task-source-supersession.d.ts +5 -0
- package/dist/lib/long-task-source-supersession.js +138 -0
- package/dist/lib/long-task-stage-policy.d.ts +7 -2
- package/dist/lib/long-task-stage-policy.js +67 -23
- package/dist/lib/long-task-state.d.ts +18 -4
- package/dist/lib/long-task-state.js +319 -33
- package/dist/lib/long-task-static-observation-freeze.js +4 -3
- package/dist/lib/long-task-status-projection.d.ts +3 -1
- package/dist/lib/long-task-status-projection.js +44 -13
- package/dist/lib/long-task-status-v2.d.ts +10 -6
- package/dist/lib/long-task-status-v2.js +70 -58
- package/dist/lib/long-task-target-policy.d.ts +8 -3
- package/dist/lib/long-task-target-policy.js +40 -9
- package/dist/lib/long-task-terminal-finalization.d.ts +12 -0
- package/dist/lib/long-task-terminal-finalization.js +190 -0
- package/dist/lib/long-task-ui-design-policy.js +15 -4
- package/dist/lib/long-task-ui-surface-policy.d.ts +2 -1
- package/dist/lib/long-task-ui-surface-policy.js +7 -4
- package/dist/lib/long-task-ui-surface-validation.d.ts +3 -1
- package/dist/lib/long-task-ui-surface-validation.js +2 -2
- package/dist/lib/long-task-verifier-counterfactuals.d.ts +11 -0
- package/dist/lib/long-task-verifier-counterfactuals.js +96 -0
- package/dist/lib/long-task-verifier-execution.d.ts +9 -0
- package/dist/lib/long-task-verifier-execution.js +67 -0
- package/dist/lib/long-task-verifier-identity.js +16 -5
- package/dist/lib/long-task-verifier-v2.js +52 -65
- package/dist/lib/long-task-windows-job-supervisor-helper.d.ts +1 -0
- package/dist/lib/long-task-windows-job-supervisor-helper.js +104 -0
- package/dist/lib/long-task-windows-job-supervisor-protocol.d.ts +28 -0
- package/dist/lib/long-task-windows-job-supervisor-protocol.js +124 -0
- package/dist/lib/long-task-windows-job-supervisor-result.d.ts +11 -0
- package/dist/lib/long-task-windows-job-supervisor-result.js +152 -0
- package/dist/lib/long-task-windows-job-supervisor.d.ts +2 -0
- package/dist/lib/long-task-windows-job-supervisor.js +126 -0
- package/dist/lib/long-task-workspace-scope.d.ts +1 -0
- package/dist/lib/long-task-workspace-scope.js +4 -1
- package/dist/lib/long-task-workspace.d.ts +1 -0
- package/dist/lib/long-task-workspace.js +10 -0
- package/dist/lib/migrations.js +43 -2
- package/dist/lib/repository-path-safety.d.ts +3 -0
- package/dist/lib/repository-path-safety.js +39 -3
- package/dist/lib/semantic-fact-input-shape.d.ts +7 -2
- package/dist/lib/semantic-fact-input-shape.js +25 -1
- package/dist/lib/semantic-fact-inventory-types.d.ts +8 -2
- package/dist/lib/semantic-fact-policy-census.d.ts +1 -1
- package/dist/lib/semantic-fact-policy-census.js +5 -2
- package/dist/lib/semantic-fact-policy.d.ts +1 -1
- package/dist/lib/semantic-fact-policy.js +2 -2
- package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
- package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
- package/dist/lib/validators.d.ts +3 -0
- package/dist/lib/validators.js +45 -157
- package/dist/public-api-core.d.ts +12 -0
- package/dist/public-api-core.js +12 -0
- package/dist/public-api-long-task.d.ts +10 -0
- package/dist/public-api-long-task.js +10 -0
- package/dist/public-types.d.ts +6 -1
- package/dist/schemas/design-authority-delta-assessment-v1.schema.json +191 -0
- package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +166 -2
- package/dist/schemas/long-task-external-confirmation-record-v1.schema.json +155 -0
- package/dist/schemas/long-task-external-confirmation-record-v2.schema.json +209 -0
- package/migrations/README.md +99 -0
- package/package.json +7 -5
- package/source-mappings.yaml +18 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { canonicalJson, sha256Hex } from "../strict-codec.js";
|
|
2
|
+
import { publishInitialJournalSnapshot, publishNextJournalSnapshot, readLatestJournalSnapshot, removeJournalSnapshotChain, assertExpectedJournalSnapshot, } from "./mutation-journal-storage.js";
|
|
3
|
+
export { CONTEXT_MUTATION_JOURNAL_DIRECTORY } from "./mutation-journal-storage.js";
|
|
4
|
+
import { CONTEXT_MUTATION_JOURNAL_SCHEMA, validateContextMutationJournal, } from "./mutation-journal-validation.js";
|
|
5
|
+
const journalSnapshotBindings = new WeakMap();
|
|
6
|
+
export async function readContextMutationJournal(repository) {
|
|
7
|
+
const snapshot = await readLatestJournalSnapshot(repository);
|
|
8
|
+
return snapshot ? bindJournalSnapshot(snapshot) : null;
|
|
9
|
+
}
|
|
10
|
+
export async function assertNoUnfinishedContextMutationForAuthority(repository) {
|
|
11
|
+
const journal = await readContextMutationJournal(repository);
|
|
12
|
+
if (journal)
|
|
13
|
+
throw new Error(`active_authority_context_mutation_unfinished:${journal.transaction_id}`);
|
|
14
|
+
}
|
|
15
|
+
export async function createContextMutationJournal(repository, plan) {
|
|
16
|
+
const journal = {
|
|
17
|
+
schema_version: CONTEXT_MUTATION_JOURNAL_SCHEMA,
|
|
18
|
+
...plan,
|
|
19
|
+
journal_sequence: 0,
|
|
20
|
+
previous_journal_sha256: null,
|
|
21
|
+
state: "planning",
|
|
22
|
+
applied_paths: [],
|
|
23
|
+
};
|
|
24
|
+
validateContextMutationJournal(journal);
|
|
25
|
+
return bindJournalSnapshot(await publishInitialJournalSnapshot(repository, journal));
|
|
26
|
+
}
|
|
27
|
+
export async function updateContextMutationJournal(repository, expected, successor, expectedStates) {
|
|
28
|
+
validateContextMutationJournal(expected);
|
|
29
|
+
validateContextMutationJournal(successor);
|
|
30
|
+
if (canonicalJson(immutableMutationPlan(expected)) !==
|
|
31
|
+
canonicalJson(immutableMutationPlan(successor)))
|
|
32
|
+
invalid("journal_successor_plan_changed");
|
|
33
|
+
const current = await readLatestJournalSnapshot(repository);
|
|
34
|
+
if (!current)
|
|
35
|
+
invalid("journal_missing");
|
|
36
|
+
try {
|
|
37
|
+
assertExpectedJournalSnapshot(current, requiredSnapshotBinding(expected));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (/journal_compare_and_swap_failed$/u.test(message(error)))
|
|
41
|
+
invalid("journal_predecessor_compare_and_swap_failed");
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
if (current.journal.transaction_id !== expected.transaction_id)
|
|
45
|
+
invalid("journal_transaction_changed");
|
|
46
|
+
const expectedBytes = Buffer.from(canonicalJson(expected), "utf8");
|
|
47
|
+
if (current.journal.journal_sequence !== expected.journal_sequence ||
|
|
48
|
+
sha256Hex(current.bytes) !== sha256Hex(expectedBytes))
|
|
49
|
+
invalid("journal_predecessor_compare_and_swap_failed");
|
|
50
|
+
if (!expectedStates.includes(current.journal.state))
|
|
51
|
+
invalid(`journal_state_changed:${current.journal.state}`);
|
|
52
|
+
const next = {
|
|
53
|
+
...successor,
|
|
54
|
+
journal_sequence: expected.journal_sequence + 1,
|
|
55
|
+
previous_journal_sha256: sha256Hex(current.bytes),
|
|
56
|
+
};
|
|
57
|
+
validateContextMutationJournal(next);
|
|
58
|
+
return bindJournalSnapshot(await publishNextJournalSnapshot(repository, next, current));
|
|
59
|
+
}
|
|
60
|
+
function immutableMutationPlan(journal) {
|
|
61
|
+
return {
|
|
62
|
+
transaction_id: journal.transaction_id,
|
|
63
|
+
operation: journal.operation,
|
|
64
|
+
catalog_before_identity: journal.catalog_before_identity,
|
|
65
|
+
catalog_after_identity: journal.catalog_after_identity,
|
|
66
|
+
directories: journal.directories,
|
|
67
|
+
files: journal.files.map((file) => ({
|
|
68
|
+
path: file.path,
|
|
69
|
+
physical_path: file.physical_path,
|
|
70
|
+
before: file.before,
|
|
71
|
+
after: file.after,
|
|
72
|
+
commit_order: file.commit_order,
|
|
73
|
+
temporary_path: file.temporary_path,
|
|
74
|
+
})),
|
|
75
|
+
operation_data: journal.operation_data,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function removeContextMutationJournal(repository, expected) {
|
|
79
|
+
validateContextMutationJournal(expected);
|
|
80
|
+
const current = await readLatestJournalSnapshot(repository);
|
|
81
|
+
if (!current)
|
|
82
|
+
invalid("journal_missing");
|
|
83
|
+
const expectedSnapshot = requiredSnapshotBinding(expected);
|
|
84
|
+
assertExpectedJournalSnapshot(current, expectedSnapshot);
|
|
85
|
+
if (current.journal.journal_sequence !== expected.journal_sequence ||
|
|
86
|
+
sha256Hex(current.bytes) !==
|
|
87
|
+
sha256Hex(Buffer.from(canonicalJson(expected), "utf8")))
|
|
88
|
+
invalid("journal_terminal_compare_and_swap_failed");
|
|
89
|
+
await removeJournalSnapshotChain(repository, current);
|
|
90
|
+
}
|
|
91
|
+
export function assertSameContextMutationJournalSnapshot(expected, current) {
|
|
92
|
+
const expectedSnapshot = requiredSnapshotBinding(expected);
|
|
93
|
+
const currentSnapshot = requiredSnapshotBinding(current);
|
|
94
|
+
assertExpectedJournalSnapshot(currentSnapshot, expectedSnapshot);
|
|
95
|
+
}
|
|
96
|
+
function bindJournalSnapshot(snapshot) {
|
|
97
|
+
journalSnapshotBindings.set(snapshot.journal, snapshot);
|
|
98
|
+
return snapshot.journal;
|
|
99
|
+
}
|
|
100
|
+
function requiredSnapshotBinding(journal) {
|
|
101
|
+
const snapshot = journalSnapshotBindings.get(journal);
|
|
102
|
+
if (!snapshot)
|
|
103
|
+
invalid("journal_predecessor_identity_missing");
|
|
104
|
+
return snapshot;
|
|
105
|
+
}
|
|
106
|
+
function invalid(reason) {
|
|
107
|
+
throw new Error(`context_mutation_invalid:${reason}`);
|
|
108
|
+
}
|
|
109
|
+
function message(error) {
|
|
110
|
+
return error instanceof Error ? error.message : String(error);
|
|
111
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ContextMutationJournal } from "./mutation-types.js";
|
|
2
|
+
export declare function validateLiveContextMutation(repository: string, journal: ContextMutationJournal): Promise<void>;
|
|
3
|
+
export declare function validateRolledBackContextMutation(repository: string, journal: ContextMutationJournal): Promise<void>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { loadContextCatalog } from "../context-catalog/catalog-load.js";
|
|
3
|
+
import { catalogErrors } from "../context-catalog/catalog-diagnostics.js";
|
|
4
|
+
import { resolveCatalogFile } from "../context-catalog/catalog-paths.js";
|
|
5
|
+
import { assertProtectedRepositoryFile } from "../repository-path-safety.js";
|
|
6
|
+
import { validateContextContentForRole } from "../validators.js";
|
|
7
|
+
import { validateLiveContextMove } from "../context-move/context-move-live-validation.js";
|
|
8
|
+
import { contextCatalogIdentity, contextFootprintState, } from "./mutation-staged-fs.js";
|
|
9
|
+
export async function validateLiveContextMutation(repository, journal) {
|
|
10
|
+
const catalog = await loadContextCatalog(repository);
|
|
11
|
+
const errors = catalogErrors(catalog.diagnostics);
|
|
12
|
+
if (errors.length)
|
|
13
|
+
invalid(`live_catalog:${errors.join("|")}`);
|
|
14
|
+
if (contextCatalogIdentity(catalog) !== journal.catalog_after_identity)
|
|
15
|
+
invalid("live_catalog_identity_mismatch");
|
|
16
|
+
const footprint = contextFootprintState(catalog);
|
|
17
|
+
if (footprint.bytes !== journal.operation_data.expected_default_bytes ||
|
|
18
|
+
!sameArray(footprint.paths, journal.operation_data.expected_default_paths))
|
|
19
|
+
invalid("live_default_footprint_mismatch");
|
|
20
|
+
if (journal.operation_data.kind === "register") {
|
|
21
|
+
const data = journal.operation_data;
|
|
22
|
+
const registered = catalog.registered_contexts.filter((entry) => entry.path === data.context_path && entry.source === "context");
|
|
23
|
+
if (registered.length !== 1)
|
|
24
|
+
invalid("live_registration_missing");
|
|
25
|
+
if (registered[0].role !== data.role ||
|
|
26
|
+
registered[0].read_policy !== data.read_policy)
|
|
27
|
+
invalid("live_registration_metadata_mismatch");
|
|
28
|
+
const file = resolveCatalogFile(catalog, data.context_path);
|
|
29
|
+
if (!file)
|
|
30
|
+
invalid("live_registration_file_missing");
|
|
31
|
+
const absolute = await assertProtectedRepositoryFile(repository, file.absolute_path, "context_mutation_registered_context");
|
|
32
|
+
const content = await readFile(absolute, "utf8");
|
|
33
|
+
const recoveryErrors = validateContextContentForRole(repository, data.context_path, content, data.role);
|
|
34
|
+
if (recoveryErrors.length)
|
|
35
|
+
invalid(`live_context_recovery:${recoveryErrors.join("|")}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await validateLiveContextMove(repository, catalog, journal);
|
|
39
|
+
}
|
|
40
|
+
export async function validateRolledBackContextMutation(repository, journal) {
|
|
41
|
+
const catalog = await loadContextCatalog(repository);
|
|
42
|
+
if (contextCatalogIdentity(catalog) !== journal.catalog_before_identity)
|
|
43
|
+
invalid("rollback_catalog_identity_mismatch");
|
|
44
|
+
}
|
|
45
|
+
function sameArray(left, right) {
|
|
46
|
+
return (left.length === right.length &&
|
|
47
|
+
left.every((value, index) => value === right[index]));
|
|
48
|
+
}
|
|
49
|
+
function invalid(reason) {
|
|
50
|
+
throw new Error(`context_mutation_invalid:${reason}`);
|
|
51
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ContextMutationJournal, ContextMutationPlan } from "./mutation-types.js";
|
|
2
|
+
type ContextMutationAuthorityConflictPhase = "start" | "recovery";
|
|
3
|
+
export declare function assertContextMutationOutsideActiveLongTask(repository: string, affectedPaths: Iterable<string>): Promise<void>;
|
|
4
|
+
export declare function withContextMutationAuthorityInterlock<T>(repository: string, affectedPaths: Iterable<string>, action: () => Promise<T>, conflictPhase?: ContextMutationAuthorityConflictPhase): Promise<T>;
|
|
5
|
+
export declare function contextMutationAffectedPaths(mutation: ContextMutationPlan | ContextMutationJournal): string[];
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { CLI_EXIT_CODES, CliCommandError } from "../cli-exit.js";
|
|
2
|
+
import { repositoryRoot } from "../long-task-git.js";
|
|
3
|
+
import { readActiveLongTaskBinding, withActiveAuthorityLock, } from "../long-task-state.js";
|
|
4
|
+
export async function assertContextMutationOutsideActiveLongTask(repository, affectedPaths) {
|
|
5
|
+
const gitRepository = await contextMutationGitRepository(repository);
|
|
6
|
+
if (!gitRepository)
|
|
7
|
+
return;
|
|
8
|
+
await assertPathsOutsideActiveLongTask(gitRepository, affectedPaths);
|
|
9
|
+
}
|
|
10
|
+
export async function withContextMutationAuthorityInterlock(repository, affectedPaths, action, conflictPhase = "start") {
|
|
11
|
+
const gitRepository = await contextMutationGitRepository(repository);
|
|
12
|
+
if (!gitRepository)
|
|
13
|
+
return action();
|
|
14
|
+
return withActiveAuthorityLock(gitRepository, "context_mutation", async () => {
|
|
15
|
+
await assertPathsOutsideActiveLongTask(gitRepository, affectedPaths, conflictPhase);
|
|
16
|
+
return action();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function contextMutationAffectedPaths(mutation) {
|
|
20
|
+
const paths = new Set(mutation.files.map((entry) => entry.path));
|
|
21
|
+
if (mutation.operation_data.kind === "register")
|
|
22
|
+
paths.add(mutation.operation_data.context_path);
|
|
23
|
+
else {
|
|
24
|
+
paths.add(mutation.operation_data.from_path);
|
|
25
|
+
paths.add(mutation.operation_data.to_path);
|
|
26
|
+
}
|
|
27
|
+
return [...paths].sort((left, right) => Buffer.from(left, "utf8").compare(Buffer.from(right, "utf8")));
|
|
28
|
+
}
|
|
29
|
+
async function contextMutationGitRepository(repository) {
|
|
30
|
+
return repositoryRoot(repository).catch((error) => {
|
|
31
|
+
if (/(?:not a git repository|--local can only be used inside a git repository)/iu.test(message(error)))
|
|
32
|
+
return null;
|
|
33
|
+
throw new CliCommandError(CLI_EXIT_CODES.catalog, `context mutation cannot establish Long-Task Authority state: ${message(error)}`, { cause: error });
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async function assertPathsOutsideActiveLongTask(gitRepository, affectedPaths, conflictPhase = "start") {
|
|
37
|
+
const active = await readActiveLongTaskBinding(gitRepository).catch((error) => {
|
|
38
|
+
throw new CliCommandError(CLI_EXIT_CODES.catalog, `context mutation cannot establish Long-Task Authority state: ${message(error)}`, { cause: error });
|
|
39
|
+
});
|
|
40
|
+
if (!active)
|
|
41
|
+
return;
|
|
42
|
+
const bound = new Set([
|
|
43
|
+
...active.authority_snapshot.context_snapshot.files,
|
|
44
|
+
...Object.keys(active.authority_snapshot.source_hashes),
|
|
45
|
+
]);
|
|
46
|
+
const conflicts = [...affectedPaths]
|
|
47
|
+
.filter((file) => bound.has(file))
|
|
48
|
+
.sort((left, right) => Buffer.from(left, "utf8").compare(Buffer.from(right, "utf8")));
|
|
49
|
+
if (conflicts.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
throw new CliCommandError(CLI_EXIT_CODES.catalog, conflictPhase === "recovery"
|
|
52
|
+
? `unfinished Context mutation conflicts with active Long-Task Authority binding for ${conflicts.join(", ")}; first end or abandon that binding through its legitimate Long-Task lifecycle, then complete or rollback the transaction, then use a fresh Compile/rebind and any required Authority Revision; Compile, Revision, and activation cannot bypass the unfinished journal`
|
|
53
|
+
: `active Long-Task Authority binds ${conflicts.join(", ")}; end or abandon that binding through its legitimate Long-Task lifecycle before starting Context mutation; after the mutation, use a fresh Compile/rebind and Authority Revision only if the lifecycle requires it`);
|
|
54
|
+
}
|
|
55
|
+
function message(error) {
|
|
56
|
+
return error instanceof Error ? error.message : String(error);
|
|
57
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ContextMutationStatus } from "./mutation-types.js";
|
|
2
|
+
export declare function contextMutationStatus(repository: string): Promise<ContextMutationStatus>;
|
|
3
|
+
export declare function completeContextMutation(repository: string): Promise<ContextMutationStatus>;
|
|
4
|
+
export declare function rollbackContextMutation(repository: string): Promise<ContextMutationStatus>;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { applyMutationChangeBackward, applyMutationChangeForward, assertMutationChangesContentState, captureMutationFileState, mutationChangeDisposition, prepareMutationTemporaryForRecovery, } from "./mutation-cas.js";
|
|
2
|
+
import { cleanupContextMutationTemporaries, finishContextMutation, } from "./mutation-commit.js";
|
|
3
|
+
import { mutationDirectoryStatus, prepareMutationDirectories, rollbackMutationDirectories, } from "./mutation-directories.js";
|
|
4
|
+
import { assertSameContextMutationJournalSnapshot, readContextMutationJournal, updateContextMutationJournal, } from "./mutation-journal.js";
|
|
5
|
+
import { contextMutationAffectedPaths, withContextMutationAuthorityInterlock, } from "./mutation-long-task-guard.js";
|
|
6
|
+
import { validateLiveContextMutation, validateRolledBackContextMutation, } from "./mutation-live-validation.js";
|
|
7
|
+
import { canonicalJson } from "../strict-codec.js";
|
|
8
|
+
import { mutationPhysicalPath } from "./mutation-file-state.js";
|
|
9
|
+
export async function contextMutationStatus(repository) {
|
|
10
|
+
const journal = await readContextMutationJournal(repository);
|
|
11
|
+
if (!journal)
|
|
12
|
+
return {
|
|
13
|
+
schema_version: 1,
|
|
14
|
+
journal_present: false,
|
|
15
|
+
directories: [],
|
|
16
|
+
files: [],
|
|
17
|
+
recovery_commands: [],
|
|
18
|
+
};
|
|
19
|
+
const directories = [];
|
|
20
|
+
for (const entry of journal.directories)
|
|
21
|
+
directories.push(await mutationDirectoryStatus(repository, entry));
|
|
22
|
+
const files = [];
|
|
23
|
+
for (const change of ordered(journal.files)) {
|
|
24
|
+
const state = await mutationChangeDisposition(repository, change);
|
|
25
|
+
const current = await currentDigest(repository, change);
|
|
26
|
+
files.push({ path: change.path, state, current_sha256: current });
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
schema_version: 1,
|
|
30
|
+
journal_present: true,
|
|
31
|
+
transaction_id: journal.transaction_id,
|
|
32
|
+
operation: journal.operation,
|
|
33
|
+
state: journal.state,
|
|
34
|
+
directories,
|
|
35
|
+
files,
|
|
36
|
+
recovery_commands: [
|
|
37
|
+
"ty-context context transaction rollback",
|
|
38
|
+
"ty-context context transaction complete",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export async function completeContextMutation(repository) {
|
|
43
|
+
const initial = await requiredJournal(repository);
|
|
44
|
+
return withContextMutationAuthorityInterlock(repository, contextMutationAffectedPaths(initial), async () => completeContextMutationLocked(repository, initial), "recovery");
|
|
45
|
+
}
|
|
46
|
+
async function completeContextMutationLocked(repository, initial) {
|
|
47
|
+
let journal = await requiredMatchingJournal(repository, initial);
|
|
48
|
+
await assertRecoveryLiveVector(repository, journal);
|
|
49
|
+
const previousState = journal.state;
|
|
50
|
+
journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "committing" }, [previousState]);
|
|
51
|
+
await prepareMutationDirectories(repository, journal.directories);
|
|
52
|
+
const forward = ordered(journal.files);
|
|
53
|
+
for (const planned of forward) {
|
|
54
|
+
let change = journal.files.find((entry) => entry.path === planned.path);
|
|
55
|
+
if ((await mutationChangeDisposition(repository, change)) !== "after") {
|
|
56
|
+
const temporary = await prepareMutationTemporaryForRecovery(repository, change, "after");
|
|
57
|
+
const successor = replaceJournalFile(journal, change.path, {
|
|
58
|
+
temporary_state: temporary,
|
|
59
|
+
});
|
|
60
|
+
journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
|
|
61
|
+
change = journal.files.find((entry) => entry.path === planned.path);
|
|
62
|
+
}
|
|
63
|
+
const published = await applyMutationChangeForward(repository, change);
|
|
64
|
+
let successor = replaceJournalFile(journal, change.path, {
|
|
65
|
+
published_after: published,
|
|
66
|
+
});
|
|
67
|
+
successor = markApplied(successor, change);
|
|
68
|
+
journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
|
|
69
|
+
}
|
|
70
|
+
journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "validating" }, ["committing"]);
|
|
71
|
+
await assertMutationChangesContentState(repository, journal.files, "after");
|
|
72
|
+
await validateLiveContextMutation(repository, journal);
|
|
73
|
+
await assertMutationChangesContentState(repository, journal.files, "after");
|
|
74
|
+
await finishContextMutation(repository, journal);
|
|
75
|
+
return contextMutationStatus(repository);
|
|
76
|
+
}
|
|
77
|
+
export async function rollbackContextMutation(repository) {
|
|
78
|
+
const initial = await requiredJournal(repository);
|
|
79
|
+
return withContextMutationAuthorityInterlock(repository, contextMutationAffectedPaths(initial), async () => rollbackContextMutationLocked(repository, initial), "recovery");
|
|
80
|
+
}
|
|
81
|
+
async function rollbackContextMutationLocked(repository, initial) {
|
|
82
|
+
let journal = await requiredMatchingJournal(repository, initial);
|
|
83
|
+
await assertRecoveryLiveVector(repository, journal);
|
|
84
|
+
const previousState = journal.state;
|
|
85
|
+
journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "committing" }, [previousState]);
|
|
86
|
+
const backward = ordered(journal.files).reverse();
|
|
87
|
+
for (const planned of backward) {
|
|
88
|
+
let change = journal.files.find((entry) => entry.path === planned.path);
|
|
89
|
+
if ((await mutationChangeDisposition(repository, change)) !== "before") {
|
|
90
|
+
const temporary = await prepareMutationTemporaryForRecovery(repository, change, "before");
|
|
91
|
+
const successor = replaceJournalFile(journal, change.path, {
|
|
92
|
+
temporary_state: temporary,
|
|
93
|
+
});
|
|
94
|
+
journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
|
|
95
|
+
change = journal.files.find((entry) => entry.path === planned.path);
|
|
96
|
+
}
|
|
97
|
+
const published = await applyMutationChangeBackward(repository, change);
|
|
98
|
+
let successor = replaceJournalFile(journal, change.path, {
|
|
99
|
+
published_before: published,
|
|
100
|
+
});
|
|
101
|
+
successor = markRolledBack(successor, change);
|
|
102
|
+
journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
|
|
103
|
+
}
|
|
104
|
+
await assertMutationChangesContentState(repository, journal.files, "before");
|
|
105
|
+
await validateRolledBackContextMutation(repository, journal);
|
|
106
|
+
await cleanupContextMutationTemporaries(repository, journal);
|
|
107
|
+
await rollbackMutationDirectories(repository, journal.directories);
|
|
108
|
+
await finishContextMutation(repository, journal);
|
|
109
|
+
return contextMutationStatus(repository);
|
|
110
|
+
}
|
|
111
|
+
async function requiredMatchingJournal(repository, expected) {
|
|
112
|
+
const current = await requiredJournal(repository);
|
|
113
|
+
if (current.transaction_id !== expected.transaction_id ||
|
|
114
|
+
canonicalJson(current) !== canonicalJson(expected))
|
|
115
|
+
invalid("journal_transaction_changed");
|
|
116
|
+
assertSameContextMutationJournalSnapshot(expected, current);
|
|
117
|
+
return current;
|
|
118
|
+
}
|
|
119
|
+
async function requiredJournal(repository) {
|
|
120
|
+
const journal = await readContextMutationJournal(repository);
|
|
121
|
+
if (!journal)
|
|
122
|
+
invalid("journal_missing");
|
|
123
|
+
return journal;
|
|
124
|
+
}
|
|
125
|
+
async function assertRecoveryLiveVector(repository, journal) {
|
|
126
|
+
const conflicts = [];
|
|
127
|
+
const dispositions = [];
|
|
128
|
+
for (const change of ordered(journal.files)) {
|
|
129
|
+
const disposition = await mutationChangeDisposition(repository, change);
|
|
130
|
+
if (disposition === "conflict")
|
|
131
|
+
conflicts.push(change.path);
|
|
132
|
+
else
|
|
133
|
+
dispositions.push(disposition);
|
|
134
|
+
}
|
|
135
|
+
if (conflicts.length)
|
|
136
|
+
invalid(`recovery_conflict:${conflicts.sort().join(",")}`);
|
|
137
|
+
let observedPrefix = 0;
|
|
138
|
+
let beforeSeen = false;
|
|
139
|
+
for (const disposition of dispositions) {
|
|
140
|
+
if (disposition === "before")
|
|
141
|
+
beforeSeen = true;
|
|
142
|
+
else if (beforeSeen)
|
|
143
|
+
invalid("recovery_live_vector_not_applied_prefix");
|
|
144
|
+
else
|
|
145
|
+
observedPrefix += 1;
|
|
146
|
+
}
|
|
147
|
+
const recordedPrefix = journal.applied_paths.length;
|
|
148
|
+
const allowed = journal.state === "validating"
|
|
149
|
+
? observedPrefix === journal.files.length
|
|
150
|
+
: journal.state === "planning" || journal.state === "prepared"
|
|
151
|
+
? observedPrefix === 0
|
|
152
|
+
: Math.abs(observedPrefix - recordedPrefix) <= 1;
|
|
153
|
+
if (!allowed)
|
|
154
|
+
invalid(`recovery_live_vector_applied_prefix_mismatch:${journal.state}:${recordedPrefix}:${observedPrefix}`);
|
|
155
|
+
}
|
|
156
|
+
async function currentDigest(repository, change) {
|
|
157
|
+
return (await captureMutationFileState(repository, mutationPhysicalPath(change), {
|
|
158
|
+
allow_hardlinks: true,
|
|
159
|
+
})).sha256;
|
|
160
|
+
}
|
|
161
|
+
function ordered(values) {
|
|
162
|
+
return [...values].sort((left, right) => left.commit_order - right.commit_order);
|
|
163
|
+
}
|
|
164
|
+
function replaceJournalFile(journal, file, replacement) {
|
|
165
|
+
return {
|
|
166
|
+
...journal,
|
|
167
|
+
files: journal.files.map((entry) => entry.path === file ? { ...entry, ...replacement } : entry),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function markApplied(journal, change) {
|
|
171
|
+
if (journal.applied_paths.includes(change.path))
|
|
172
|
+
return journal;
|
|
173
|
+
if (journal.applied_paths.length !== change.commit_order)
|
|
174
|
+
invalid(`journal_applied_paths_not_prefix:${change.path}`);
|
|
175
|
+
return {
|
|
176
|
+
...journal,
|
|
177
|
+
applied_paths: [...journal.applied_paths, change.path],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function markRolledBack(journal, change) {
|
|
181
|
+
if (!journal.applied_paths.includes(change.path))
|
|
182
|
+
return journal;
|
|
183
|
+
if (journal.applied_paths.at(-1) !== change.path)
|
|
184
|
+
invalid(`journal_applied_paths_not_prefix:${change.path}`);
|
|
185
|
+
return { ...journal, applied_paths: journal.applied_paths.slice(0, -1) };
|
|
186
|
+
}
|
|
187
|
+
function invalid(reason) {
|
|
188
|
+
throw new Error(`context_mutation_invalid:${reason}`);
|
|
189
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ContextCatalog } from "../context-catalog/catalog-types.js";
|
|
2
|
+
import type { ContextFootprintState } from "./mutation-types.js";
|
|
3
|
+
export declare function stagedFileOverrides(entries: Iterable<readonly [string, Uint8Array | null]>): ReadonlyMap<string, Uint8Array | null>;
|
|
4
|
+
export declare function contextCatalogIdentity(catalog: ContextCatalog): string;
|
|
5
|
+
export declare function contextFootprintState(catalog: ContextCatalog): ContextFootprintState;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { canonicalValueJson, sha256Hex } from "../strict-codec.js";
|
|
2
|
+
export function stagedFileOverrides(entries) {
|
|
3
|
+
const result = new Map();
|
|
4
|
+
for (const [file, bytes] of entries) {
|
|
5
|
+
if (result.has(file))
|
|
6
|
+
throw new Error(`context_mutation_overlay_duplicate:${file}`);
|
|
7
|
+
result.set(file, bytes === null ? null : Buffer.from(bytes));
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
export function contextCatalogIdentity(catalog) {
|
|
12
|
+
return sha256Hex(canonicalValueJson({
|
|
13
|
+
manifest_path: catalog.manifest_path,
|
|
14
|
+
manifest_sha256: catalog.manifest_content === undefined
|
|
15
|
+
? null
|
|
16
|
+
: sha256Hex(catalog.manifest_content),
|
|
17
|
+
areas: catalog.areas.map((entry) => ({
|
|
18
|
+
id: entry.id,
|
|
19
|
+
root: entry.root,
|
|
20
|
+
context: entry.context,
|
|
21
|
+
kind: entry.kind,
|
|
22
|
+
default: entry.default,
|
|
23
|
+
})),
|
|
24
|
+
contexts: (catalog.manifest?.contexts ?? []).map((entry) => ({
|
|
25
|
+
path: entry.path,
|
|
26
|
+
role: entry.role,
|
|
27
|
+
read_policy: entry.read_policy ?? null,
|
|
28
|
+
read_when: entry.read_when ?? null,
|
|
29
|
+
triggers: [...entry.triggers],
|
|
30
|
+
default_children: [...entry.default_children],
|
|
31
|
+
})),
|
|
32
|
+
files: catalog.context_files.map((entry) => ({
|
|
33
|
+
path: entry.path,
|
|
34
|
+
bytes: entry.bytes,
|
|
35
|
+
})),
|
|
36
|
+
default_paths: [...catalog.default_footprint.keys()],
|
|
37
|
+
errors: catalog.diagnostics
|
|
38
|
+
.filter((entry) => entry.severity === "error")
|
|
39
|
+
.map((entry) => ({
|
|
40
|
+
code: entry.code,
|
|
41
|
+
path: entry.path ?? null,
|
|
42
|
+
line: entry.line ?? null,
|
|
43
|
+
})),
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
export function contextFootprintState(catalog) {
|
|
47
|
+
const sizes = new Map(catalog.context_files.map((entry) => [entry.path, entry.bytes]));
|
|
48
|
+
const paths = [...catalog.default_footprint.keys()];
|
|
49
|
+
let bytes = 0;
|
|
50
|
+
for (const file of paths)
|
|
51
|
+
bytes +=
|
|
52
|
+
file === catalog.manifest_path
|
|
53
|
+
? Buffer.byteLength(catalog.manifest_content ?? "", "utf8")
|
|
54
|
+
: (sizes.get(file) ?? 0);
|
|
55
|
+
return { paths, path_count: paths.length, bytes };
|
|
56
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ContextRole } from "../context-catalog/catalog-portable-contract.js";
|
|
2
|
+
export type ContextMutationOperation = "register" | "move";
|
|
3
|
+
export type ContextMutationJournalState = "planning" | "prepared" | "committing" | "validating";
|
|
4
|
+
export interface MutationFileIdentity {
|
|
5
|
+
dev: string;
|
|
6
|
+
ino: string;
|
|
7
|
+
nlink: string;
|
|
8
|
+
size: string;
|
|
9
|
+
mtime_ns: string;
|
|
10
|
+
ctime_ns: string;
|
|
11
|
+
}
|
|
12
|
+
export interface MutationFileState {
|
|
13
|
+
exists: boolean;
|
|
14
|
+
sha256: string | null;
|
|
15
|
+
bytes_base64: string | null;
|
|
16
|
+
mode: number | null;
|
|
17
|
+
identity: MutationFileIdentity | null;
|
|
18
|
+
}
|
|
19
|
+
export interface MutationRecordedFileState {
|
|
20
|
+
exists: boolean;
|
|
21
|
+
sha256: string | null;
|
|
22
|
+
mode: number | null;
|
|
23
|
+
identity: MutationFileIdentity | null;
|
|
24
|
+
}
|
|
25
|
+
export interface MutationTemporaryState {
|
|
26
|
+
side: "before" | "after";
|
|
27
|
+
state: MutationRecordedFileState;
|
|
28
|
+
}
|
|
29
|
+
export interface MutationFileChange {
|
|
30
|
+
path: string;
|
|
31
|
+
physical_path?: string;
|
|
32
|
+
before: MutationFileState;
|
|
33
|
+
after: MutationFileState;
|
|
34
|
+
commit_order: number;
|
|
35
|
+
temporary_path: string | null;
|
|
36
|
+
temporary_state: MutationTemporaryState | null;
|
|
37
|
+
published_before: MutationRecordedFileState | null;
|
|
38
|
+
published_after: MutationRecordedFileState | null;
|
|
39
|
+
}
|
|
40
|
+
export interface MutationDirectoryChange {
|
|
41
|
+
path: string;
|
|
42
|
+
before_exists: false;
|
|
43
|
+
}
|
|
44
|
+
export interface RegisterMutationData {
|
|
45
|
+
kind: "register";
|
|
46
|
+
context_path: string;
|
|
47
|
+
role: ContextRole;
|
|
48
|
+
read_policy: string;
|
|
49
|
+
expected_default_paths: string[];
|
|
50
|
+
expected_default_bytes: number;
|
|
51
|
+
}
|
|
52
|
+
export interface MoveMutationData {
|
|
53
|
+
kind: "move";
|
|
54
|
+
from_path: string;
|
|
55
|
+
to_path: string;
|
|
56
|
+
owner_source: "area" | "context";
|
|
57
|
+
role: ContextRole;
|
|
58
|
+
read_policy: string | null;
|
|
59
|
+
expected_reference_issues: string[];
|
|
60
|
+
expected_default_paths: string[];
|
|
61
|
+
expected_default_bytes: number;
|
|
62
|
+
}
|
|
63
|
+
export type ContextMutationOperationData = RegisterMutationData | MoveMutationData;
|
|
64
|
+
export interface ContextMutationPlan {
|
|
65
|
+
transaction_id: string;
|
|
66
|
+
operation: ContextMutationOperation;
|
|
67
|
+
catalog_before_identity: string;
|
|
68
|
+
catalog_after_identity: string;
|
|
69
|
+
directories: MutationDirectoryChange[];
|
|
70
|
+
files: MutationFileChange[];
|
|
71
|
+
operation_data: ContextMutationOperationData;
|
|
72
|
+
}
|
|
73
|
+
export interface ContextMutationJournal extends ContextMutationPlan {
|
|
74
|
+
schema_version: "context-mutation-journal-v2" | "context-mutation-journal-v3";
|
|
75
|
+
journal_sequence: number;
|
|
76
|
+
previous_journal_sha256: string | null;
|
|
77
|
+
state: ContextMutationJournalState;
|
|
78
|
+
applied_paths: string[];
|
|
79
|
+
}
|
|
80
|
+
export interface MutationFileStatus {
|
|
81
|
+
path: string;
|
|
82
|
+
state: "before" | "after" | "conflict";
|
|
83
|
+
current_sha256: string | null;
|
|
84
|
+
}
|
|
85
|
+
export interface MutationDirectoryStatus {
|
|
86
|
+
path: string;
|
|
87
|
+
state: "absent" | "directory" | "conflict";
|
|
88
|
+
}
|
|
89
|
+
export interface ContextMutationStatus {
|
|
90
|
+
schema_version: 1;
|
|
91
|
+
journal_present: boolean;
|
|
92
|
+
transaction_id?: string;
|
|
93
|
+
operation?: ContextMutationOperation;
|
|
94
|
+
state?: ContextMutationJournalState;
|
|
95
|
+
directories: MutationDirectoryStatus[];
|
|
96
|
+
files: MutationFileStatus[];
|
|
97
|
+
recovery_commands: string[];
|
|
98
|
+
}
|
|
99
|
+
export interface ContextFootprintState {
|
|
100
|
+
paths: string[];
|
|
101
|
+
path_count: number;
|
|
102
|
+
bytes: number;
|
|
103
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ContextRole } from "../context-catalog/catalog-portable-contract.js";
|
|
2
|
+
import type { ContextRegisterInput } from "./context-register-types.js";
|
|
3
|
+
export interface NormalizedRegisterInput {
|
|
4
|
+
path: string;
|
|
5
|
+
role: ContextRole;
|
|
6
|
+
read_policy: "default" | "on-demand";
|
|
7
|
+
read_when?: string;
|
|
8
|
+
triggers: string[];
|
|
9
|
+
default_children: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function normalizeContextRegisterInput(input: ContextRegisterInput): NormalizedRegisterInput;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CLI_EXIT_CODES, CliCommandError } from "../cli-exit.js";
|
|
2
|
+
import { normalizeContextRole, } from "../context-catalog/catalog-portable-contract.js";
|
|
3
|
+
import { normalizeContextPath } from "../context-catalog/catalog-paths.js";
|
|
4
|
+
import { normalizeContextFilePath } from "../context-create/context-create-path.js";
|
|
5
|
+
const CURRENT_POLICIES = new Set(["default", "on-demand"]);
|
|
6
|
+
export function normalizeContextRegisterInput(input) {
|
|
7
|
+
const contextPath = normalizeContextFilePath(input.context_path, "context register");
|
|
8
|
+
const role = normalizeContextRole(input.role);
|
|
9
|
+
if (!role)
|
|
10
|
+
argumentFailure(`context register has unsupported role: ${input.role}`);
|
|
11
|
+
const readPolicy = input.read_policy ?? "on-demand";
|
|
12
|
+
if (!CURRENT_POLICIES.has(readPolicy))
|
|
13
|
+
argumentFailure("context register --read-policy must be default or on-demand");
|
|
14
|
+
return {
|
|
15
|
+
path: contextPath,
|
|
16
|
+
role,
|
|
17
|
+
read_policy: readPolicy,
|
|
18
|
+
read_when: optionalBoundedText(input.read_when, "read-when", 1024),
|
|
19
|
+
triggers: boundedUniqueValues(input.triggers ?? [], "trigger", 64, 128),
|
|
20
|
+
default_children: boundedUniqueValues((input.default_children ?? []).map(normalizeContextPath), "default-child", 64, 512),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function optionalBoundedText(value, label, maximum) {
|
|
24
|
+
if (value === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const normalized = value.normalize("NFC").trim();
|
|
27
|
+
if (!normalized || [...normalized].length > maximum)
|
|
28
|
+
argumentFailure(`context register --${label} must contain 1-${maximum} code points`);
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
function boundedUniqueValues(values, label, maximumCount, maximumLength) {
|
|
32
|
+
if (values.length > maximumCount)
|
|
33
|
+
argumentFailure(`context register accepts at most ${maximumCount} --${label} values`);
|
|
34
|
+
const normalized = values.map((value) => value.normalize("NFC").trim());
|
|
35
|
+
if (normalized.some((value) => !value || [...value].length > maximumLength))
|
|
36
|
+
argumentFailure(`context register --${label} values must contain 1-${maximumLength} code points`);
|
|
37
|
+
if (new Set(normalized).size !== normalized.length)
|
|
38
|
+
argumentFailure(`context register has duplicate --${label} values`);
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
function argumentFailure(messageText) {
|
|
42
|
+
throw new CliCommandError(CLI_EXIT_CODES.arguments, messageText);
|
|
43
|
+
}
|