@rpamis/comet 0.4.0-beta.6 → 0.4.0-beta.7
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 +209 -74
- package/assets/manifest.json +14 -5
- package/assets/skills/comet/SKILL.md +17 -282
- package/assets/skills/comet/reference/comet-yaml-fields.md +1 -1
- package/assets/skills/comet/reference/context-recovery.md +3 -3
- package/assets/skills/comet/reference/intent-frame.md +2 -2
- package/assets/skills/comet/reference/scripts.md +2 -2
- package/assets/skills/comet/rules/comet-workflow-guard.en.md +32 -0
- package/assets/skills/comet/rules/comet-workflow-guard.md +32 -0
- package/assets/skills/comet/scripts/comet-entry-runtime.mjs +7834 -0
- package/assets/skills/comet/scripts/comet-hook-router.mjs +10307 -0
- package/assets/skills/comet/scripts/comet-runtime.mjs +612 -499
- package/assets/skills/comet-any/SKILL.md +4 -4
- package/assets/skills/comet-any/reference/authoring-subagents.md +1 -1
- package/assets/skills/comet-any/reference/bundle-authoring.md +1 -1
- package/assets/skills/comet-any/reference/subagents/reference-author.md +1 -1
- package/assets/skills/comet-any/reference/subagents/script-author.md +1 -1
- package/assets/skills/comet-any/reference/subagents/skill-core-author.md +1 -1
- package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +2 -2
- package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +3 -3
- package/assets/skills/comet-archive/SKILL.md +1 -2
- package/assets/skills/comet-build/SKILL.md +1 -1
- package/assets/skills/comet-classic/SKILL.md +293 -0
- package/assets/skills/comet-design/SKILL.md +1 -1
- package/assets/skills/comet-hotfix/SKILL.md +4 -4
- package/assets/skills/comet-native/SKILL.md +257 -0
- package/assets/skills/comet-native/reference/artifacts.md +204 -0
- package/assets/skills/comet-native/reference/commands.md +118 -0
- package/assets/skills/comet-native/reference/recovery.md +143 -0
- package/assets/skills/comet-native/scripts/comet-native-hook-guard.mjs +4 -0
- package/assets/skills/comet-native/scripts/comet-native-runtime.mjs +28898 -0
- package/assets/skills/comet-open/SKILL.md +4 -4
- package/assets/skills/comet-tweak/SKILL.md +7 -7
- package/assets/skills-zh/comet/SKILL.md +17 -270
- package/assets/skills-zh/comet/reference/comet-yaml-fields.md +1 -1
- package/assets/skills-zh/comet/reference/context-recovery.md +3 -3
- package/assets/skills-zh/comet/reference/intent-frame.md +2 -2
- package/assets/skills-zh/comet/reference/scripts.md +2 -2
- package/assets/skills-zh/comet-any/SKILL.md +4 -4
- package/assets/skills-zh/comet-any/reference/authoring-subagents.md +1 -1
- package/assets/skills-zh/comet-any/reference/bundle-authoring.md +1 -1
- package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +1 -1
- package/assets/skills-zh/comet-any/reference/subagents/script-author.md +1 -1
- package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +1 -1
- package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +2 -2
- package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +3 -3
- package/assets/skills-zh/comet-archive/SKILL.md +1 -2
- package/assets/skills-zh/comet-build/SKILL.md +1 -1
- package/assets/skills-zh/comet-classic/SKILL.md +281 -0
- package/assets/skills-zh/comet-design/SKILL.md +1 -1
- package/assets/skills-zh/comet-hotfix/SKILL.md +4 -4
- package/assets/skills-zh/comet-native/SKILL.md +257 -0
- package/assets/skills-zh/comet-native/reference/artifacts.md +206 -0
- package/assets/skills-zh/comet-native/reference/commands.md +118 -0
- package/assets/skills-zh/comet-native/reference/recovery.md +143 -0
- package/assets/skills-zh/comet-open/SKILL.md +4 -4
- package/assets/skills-zh/comet-tweak/SKILL.md +7 -7
- package/dist/app/cli/index.js +59 -13
- package/dist/app/cli/index.js.map +1 -1
- package/dist/app/commands/command-result.d.ts +6 -0
- package/dist/app/commands/command-result.d.ts.map +1 -0
- package/dist/app/commands/command-result.js +4 -0
- package/dist/app/commands/command-result.js.map +1 -0
- package/dist/app/commands/doctor.d.ts +1 -0
- package/dist/app/commands/doctor.d.ts.map +1 -1
- package/dist/app/commands/doctor.js +201 -26
- package/dist/app/commands/doctor.js.map +1 -1
- package/dist/app/commands/eval.d.ts +3 -1
- package/dist/app/commands/eval.d.ts.map +1 -1
- package/dist/app/commands/eval.js +17 -7
- package/dist/app/commands/eval.js.map +1 -1
- package/dist/app/commands/i18n.d.ts +1 -1
- package/dist/app/commands/i18n.d.ts.map +1 -1
- package/dist/app/commands/i18n.js +6 -2
- package/dist/app/commands/i18n.js.map +1 -1
- package/dist/app/commands/init.d.ts +10 -2
- package/dist/app/commands/init.d.ts.map +1 -1
- package/dist/app/commands/init.js +331 -50
- package/dist/app/commands/init.js.map +1 -1
- package/dist/app/commands/native.d.ts +2 -0
- package/dist/app/commands/native.d.ts.map +1 -0
- package/dist/app/commands/native.js +10 -0
- package/dist/app/commands/native.js.map +1 -0
- package/dist/app/commands/project-scope-selection.d.ts.map +1 -1
- package/dist/app/commands/project-scope-selection.js +2 -0
- package/dist/app/commands/project-scope-selection.js.map +1 -1
- package/dist/app/commands/resume-probe.d.ts.map +1 -1
- package/dist/app/commands/resume-probe.js +8 -2
- package/dist/app/commands/resume-probe.js.map +1 -1
- package/dist/app/commands/status.d.ts +0 -32
- package/dist/app/commands/status.d.ts.map +1 -1
- package/dist/app/commands/status.js +44 -177
- package/dist/app/commands/status.js.map +1 -1
- package/dist/app/commands/update.d.ts +20 -4
- package/dist/app/commands/update.d.ts.map +1 -1
- package/dist/app/commands/update.js +698 -90
- package/dist/app/commands/update.js.map +1 -1
- package/dist/app/commands/workflow.d.ts +6 -0
- package/dist/app/commands/workflow.d.ts.map +1 -0
- package/dist/app/commands/workflow.js +11 -0
- package/dist/app/commands/workflow.js.map +1 -0
- package/dist/config/repository-layout.json +21 -1
- package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-archive.js +3 -0
- package/dist/domains/comet-classic/classic-archive.js.map +1 -1
- package/dist/domains/comet-classic/classic-current-change.d.ts +3 -5
- package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-current-change.js +31 -57
- package/dist/domains/comet-classic/classic-current-change.js.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.d.ts +9 -0
- package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.js +84 -11
- package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
- package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-project-config.js +12 -8
- package/dist/domains/comet-classic/classic-project-config.js.map +1 -1
- package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-runtime-run.js +9 -1
- package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
- package/dist/domains/comet-entry/current-selection-repair.d.ts +17 -0
- package/dist/domains/comet-entry/current-selection-repair.d.ts.map +1 -0
- package/dist/domains/comet-entry/current-selection-repair.js +19 -0
- package/dist/domains/comet-entry/current-selection-repair.js.map +1 -0
- package/dist/domains/comet-entry/current-selection.d.ts +28 -0
- package/dist/domains/comet-entry/current-selection.d.ts.map +1 -0
- package/dist/domains/comet-entry/current-selection.js +116 -0
- package/dist/domains/comet-entry/current-selection.js.map +1 -0
- package/dist/domains/comet-entry/entry-runtime-entry.d.ts +2 -0
- package/dist/domains/comet-entry/entry-runtime-entry.d.ts.map +1 -0
- package/dist/domains/comet-entry/entry-runtime-entry.js +3 -0
- package/dist/domains/comet-entry/entry-runtime-entry.js.map +1 -0
- package/dist/domains/comet-entry/entry-runtime.d.ts +7 -0
- package/dist/domains/comet-entry/entry-runtime.d.ts.map +1 -0
- package/dist/domains/comet-entry/entry-runtime.js +55 -0
- package/dist/domains/comet-entry/entry-runtime.js.map +1 -0
- package/dist/domains/comet-entry/hook-adapter.d.ts +6 -0
- package/dist/domains/comet-entry/hook-adapter.d.ts.map +1 -0
- package/dist/domains/comet-entry/hook-adapter.js +202 -0
- package/dist/domains/comet-entry/hook-adapter.js.map +1 -0
- package/dist/domains/comet-entry/hook-router-entry.d.ts +8 -0
- package/dist/domains/comet-entry/hook-router-entry.d.ts.map +1 -0
- package/dist/domains/comet-entry/hook-router-entry.js +92 -0
- package/dist/domains/comet-entry/hook-router-entry.js.map +1 -0
- package/dist/domains/comet-entry/hook-router.d.ts +32 -0
- package/dist/domains/comet-entry/hook-router.d.ts.map +1 -0
- package/dist/domains/comet-entry/hook-router.js +133 -0
- package/dist/domains/comet-entry/hook-router.js.map +1 -0
- package/dist/domains/comet-entry/hook-types.d.ts +20 -0
- package/dist/domains/comet-entry/hook-types.d.ts.map +1 -0
- package/dist/domains/comet-entry/hook-types.js +2 -0
- package/dist/domains/comet-entry/hook-types.js.map +1 -0
- package/dist/domains/comet-entry/init-workflow.d.ts +16 -0
- package/dist/domains/comet-entry/init-workflow.d.ts.map +1 -0
- package/dist/domains/comet-entry/init-workflow.js +103 -0
- package/dist/domains/comet-entry/init-workflow.js.map +1 -0
- package/dist/domains/comet-entry/project-status.d.ts +3 -0
- package/dist/domains/comet-entry/project-status.d.ts.map +1 -0
- package/dist/domains/comet-entry/project-status.js +222 -0
- package/dist/domains/comet-entry/project-status.js.map +1 -0
- package/dist/domains/comet-entry/resolve-entry.d.ts +3 -0
- package/dist/domains/comet-entry/resolve-entry.d.ts.map +1 -0
- package/dist/domains/comet-entry/resolve-entry.js +22 -0
- package/dist/domains/comet-entry/resolve-entry.js.map +1 -0
- package/dist/domains/comet-entry/resume-probe.d.ts +34 -0
- package/dist/domains/comet-entry/resume-probe.d.ts.map +1 -0
- package/dist/domains/comet-entry/resume-probe.js +458 -0
- package/dist/domains/comet-entry/resume-probe.js.map +1 -0
- package/dist/domains/comet-entry/types.d.ts +59 -0
- package/dist/domains/comet-entry/types.d.ts.map +1 -0
- package/dist/domains/comet-entry/types.js +2 -0
- package/dist/domains/comet-entry/types.js.map +1 -0
- package/dist/domains/comet-entry/workflow-resolution.d.ts +8 -0
- package/dist/domains/comet-entry/workflow-resolution.d.ts.map +1 -0
- package/dist/domains/comet-entry/workflow-resolution.js +16 -0
- package/dist/domains/comet-entry/workflow-resolution.js.map +1 -0
- package/dist/domains/comet-native/index.d.ts +35 -0
- package/dist/domains/comet-native/index.d.ts.map +1 -0
- package/dist/domains/comet-native/index.js +35 -0
- package/dist/domains/comet-native/index.js.map +1 -0
- package/dist/domains/comet-native/native-acceptance.d.ts +42 -0
- package/dist/domains/comet-native/native-acceptance.d.ts.map +1 -0
- package/dist/domains/comet-native/native-acceptance.js +503 -0
- package/dist/domains/comet-native/native-acceptance.js.map +1 -0
- package/dist/domains/comet-native/native-archive-content.d.ts +26 -0
- package/dist/domains/comet-native/native-archive-content.d.ts.map +1 -0
- package/dist/domains/comet-native/native-archive-content.js +159 -0
- package/dist/domains/comet-native/native-archive-content.js.map +1 -0
- package/dist/domains/comet-native/native-archive-inspection.d.ts +9 -0
- package/dist/domains/comet-native/native-archive-inspection.d.ts.map +1 -0
- package/dist/domains/comet-native/native-archive-inspection.js +94 -0
- package/dist/domains/comet-native/native-archive-inspection.js.map +1 -0
- package/dist/domains/comet-native/native-archive-preflight.d.ts +52 -0
- package/dist/domains/comet-native/native-archive-preflight.d.ts.map +1 -0
- package/dist/domains/comet-native/native-archive-preflight.js +214 -0
- package/dist/domains/comet-native/native-archive-preflight.js.map +1 -0
- package/dist/domains/comet-native/native-archive-transaction.d.ts +19 -0
- package/dist/domains/comet-native/native-archive-transaction.d.ts.map +1 -0
- package/dist/domains/comet-native/native-archive-transaction.js +1181 -0
- package/dist/domains/comet-native/native-archive-transaction.js.map +1 -0
- package/dist/domains/comet-native/native-archive.d.ts +36 -0
- package/dist/domains/comet-native/native-archive.d.ts.map +1 -0
- package/dist/domains/comet-native/native-archive.js +403 -0
- package/dist/domains/comet-native/native-archive.js.map +1 -0
- package/dist/domains/comet-native/native-artifacts.d.ts +10 -0
- package/dist/domains/comet-native/native-artifacts.d.ts.map +1 -0
- package/dist/domains/comet-native/native-artifacts.js +204 -0
- package/dist/domains/comet-native/native-artifacts.js.map +1 -0
- package/dist/domains/comet-native/native-atomic-file.d.ts +10 -0
- package/dist/domains/comet-native/native-atomic-file.d.ts.map +1 -0
- package/dist/domains/comet-native/native-atomic-file.js +175 -0
- package/dist/domains/comet-native/native-atomic-file.js.map +1 -0
- package/dist/domains/comet-native/native-bounded-file.d.ts +19 -0
- package/dist/domains/comet-native/native-bounded-file.d.ts.map +1 -0
- package/dist/domains/comet-native/native-bounded-file.js +180 -0
- package/dist/domains/comet-native/native-bounded-file.js.map +1 -0
- package/dist/domains/comet-native/native-build-evidence.d.ts +42 -0
- package/dist/domains/comet-native/native-build-evidence.d.ts.map +1 -0
- package/dist/domains/comet-native/native-build-evidence.js +257 -0
- package/dist/domains/comet-native/native-build-evidence.js.map +1 -0
- package/dist/domains/comet-native/native-canonical-hash.d.ts +10 -0
- package/dist/domains/comet-native/native-canonical-hash.d.ts.map +1 -0
- package/dist/domains/comet-native/native-canonical-hash.js +100 -0
- package/dist/domains/comet-native/native-canonical-hash.js.map +1 -0
- package/dist/domains/comet-native/native-change-recovery.d.ts +11 -0
- package/dist/domains/comet-native/native-change-recovery.d.ts.map +1 -0
- package/dist/domains/comet-native/native-change-recovery.js +15 -0
- package/dist/domains/comet-native/native-change-recovery.js.map +1 -0
- package/dist/domains/comet-native/native-change.d.ts +61 -0
- package/dist/domains/comet-native/native-change.d.ts.map +1 -0
- package/dist/domains/comet-native/native-change.js +696 -0
- package/dist/domains/comet-native/native-change.js.map +1 -0
- package/dist/domains/comet-native/native-check-receipt-model.d.ts +63 -0
- package/dist/domains/comet-native/native-check-receipt-model.d.ts.map +1 -0
- package/dist/domains/comet-native/native-check-receipt-model.js +347 -0
- package/dist/domains/comet-native/native-check-receipt-model.js.map +1 -0
- package/dist/domains/comet-native/native-check-receipt-storage.d.ts +10 -0
- package/dist/domains/comet-native/native-check-receipt-storage.d.ts.map +1 -0
- package/dist/domains/comet-native/native-check-receipt-storage.js +196 -0
- package/dist/domains/comet-native/native-check-receipt-storage.js.map +1 -0
- package/dist/domains/comet-native/native-check-receipt.d.ts +19 -0
- package/dist/domains/comet-native/native-check-receipt.d.ts.map +1 -0
- package/dist/domains/comet-native/native-check-receipt.js +446 -0
- package/dist/domains/comet-native/native-check-receipt.js.map +1 -0
- package/dist/domains/comet-native/native-check.d.ts +18 -0
- package/dist/domains/comet-native/native-check.d.ts.map +1 -0
- package/dist/domains/comet-native/native-check.js +29 -0
- package/dist/domains/comet-native/native-check.js.map +1 -0
- package/dist/domains/comet-native/native-checkpoint-journal.d.ts +13 -0
- package/dist/domains/comet-native/native-checkpoint-journal.d.ts.map +1 -0
- package/dist/domains/comet-native/native-checkpoint-journal.js +53 -0
- package/dist/domains/comet-native/native-checkpoint-journal.js.map +1 -0
- package/dist/domains/comet-native/native-checkpoint-storage.d.ts +43 -0
- package/dist/domains/comet-native/native-checkpoint-storage.d.ts.map +1 -0
- package/dist/domains/comet-native/native-checkpoint-storage.js +487 -0
- package/dist/domains/comet-native/native-checkpoint-storage.js.map +1 -0
- package/dist/domains/comet-native/native-cli-entry.d.ts +2 -0
- package/dist/domains/comet-native/native-cli-entry.d.ts.map +1 -0
- package/dist/domains/comet-native/native-cli-entry.js +18 -0
- package/dist/domains/comet-native/native-cli-entry.js.map +1 -0
- package/dist/domains/comet-native/native-cli.d.ts +7 -0
- package/dist/domains/comet-native/native-cli.d.ts.map +1 -0
- package/dist/domains/comet-native/native-cli.js +642 -0
- package/dist/domains/comet-native/native-cli.js.map +1 -0
- package/dist/domains/comet-native/native-config.d.ts +15 -0
- package/dist/domains/comet-native/native-config.d.ts.map +1 -0
- package/dist/domains/comet-native/native-config.js +281 -0
- package/dist/domains/comet-native/native-config.js.map +1 -0
- package/dist/domains/comet-native/native-conflict-inspection.d.ts +17 -0
- package/dist/domains/comet-native/native-conflict-inspection.d.ts.map +1 -0
- package/dist/domains/comet-native/native-conflict-inspection.js +90 -0
- package/dist/domains/comet-native/native-conflict-inspection.js.map +1 -0
- package/dist/domains/comet-native/native-conflict-radar.d.ts +75 -0
- package/dist/domains/comet-native/native-conflict-radar.d.ts.map +1 -0
- package/dist/domains/comet-native/native-conflict-radar.js +326 -0
- package/dist/domains/comet-native/native-conflict-radar.js.map +1 -0
- package/dist/domains/comet-native/native-continuation.d.ts +9 -0
- package/dist/domains/comet-native/native-continuation.d.ts.map +1 -0
- package/dist/domains/comet-native/native-continuation.js +146 -0
- package/dist/domains/comet-native/native-continuation.js.map +1 -0
- package/dist/domains/comet-native/native-contract-files.d.ts +24 -0
- package/dist/domains/comet-native/native-contract-files.d.ts.map +1 -0
- package/dist/domains/comet-native/native-contract-files.js +66 -0
- package/dist/domains/comet-native/native-contract-files.js.map +1 -0
- package/dist/domains/comet-native/native-contract.d.ts +41 -0
- package/dist/domains/comet-native/native-contract.d.ts.map +1 -0
- package/dist/domains/comet-native/native-contract.js +141 -0
- package/dist/domains/comet-native/native-contract.js.map +1 -0
- package/dist/domains/comet-native/native-diagnostics.d.ts +18 -0
- package/dist/domains/comet-native/native-diagnostics.d.ts.map +1 -0
- package/dist/domains/comet-native/native-diagnostics.js +522 -0
- package/dist/domains/comet-native/native-diagnostics.js.map +1 -0
- package/dist/domains/comet-native/native-doctor.d.ts +12 -0
- package/dist/domains/comet-native/native-doctor.d.ts.map +1 -0
- package/dist/domains/comet-native/native-doctor.js +768 -0
- package/dist/domains/comet-native/native-doctor.js.map +1 -0
- package/dist/domains/comet-native/native-evidence-retention.d.ts +37 -0
- package/dist/domains/comet-native/native-evidence-retention.d.ts.map +1 -0
- package/dist/domains/comet-native/native-evidence-retention.js +885 -0
- package/dist/domains/comet-native/native-evidence-retention.js.map +1 -0
- package/dist/domains/comet-native/native-evidence-storage.d.ts +41 -0
- package/dist/domains/comet-native/native-evidence-storage.d.ts.map +1 -0
- package/dist/domains/comet-native/native-evidence-storage.js +351 -0
- package/dist/domains/comet-native/native-evidence-storage.js.map +1 -0
- package/dist/domains/comet-native/native-findings.d.ts +8 -0
- package/dist/domains/comet-native/native-findings.d.ts.map +1 -0
- package/dist/domains/comet-native/native-findings.js +238 -0
- package/dist/domains/comet-native/native-findings.js.map +1 -0
- package/dist/domains/comet-native/native-guards.d.ts +7 -0
- package/dist/domains/comet-native/native-guards.d.ts.map +1 -0
- package/dist/domains/comet-native/native-guards.js +126 -0
- package/dist/domains/comet-native/native-guards.js.map +1 -0
- package/dist/domains/comet-native/native-hash.d.ts +3 -0
- package/dist/domains/comet-native/native-hash.d.ts.map +1 -0
- package/dist/domains/comet-native/native-hash.js +12 -0
- package/dist/domains/comet-native/native-hash.js.map +1 -0
- package/dist/domains/comet-native/native-hook-guard.d.ts +17 -0
- package/dist/domains/comet-native/native-hook-guard.d.ts.map +1 -0
- package/dist/domains/comet-native/native-hook-guard.js +154 -0
- package/dist/domains/comet-native/native-hook-guard.js.map +1 -0
- package/dist/domains/comet-native/native-lock.d.ts +47 -0
- package/dist/domains/comet-native/native-lock.d.ts.map +1 -0
- package/dist/domains/comet-native/native-lock.js +395 -0
- package/dist/domains/comet-native/native-lock.js.map +1 -0
- package/dist/domains/comet-native/native-mutation-lock.d.ts +5 -0
- package/dist/domains/comet-native/native-mutation-lock.d.ts.map +1 -0
- package/dist/domains/comet-native/native-mutation-lock.js +66 -0
- package/dist/domains/comet-native/native-mutation-lock.js.map +1 -0
- package/dist/domains/comet-native/native-paths.d.ts +10 -0
- package/dist/domains/comet-native/native-paths.d.ts.map +1 -0
- package/dist/domains/comet-native/native-paths.js +171 -0
- package/dist/domains/comet-native/native-paths.js.map +1 -0
- package/dist/domains/comet-native/native-progress-checkpoint.d.ts +13 -0
- package/dist/domains/comet-native/native-progress-checkpoint.d.ts.map +1 -0
- package/dist/domains/comet-native/native-progress-checkpoint.js +104 -0
- package/dist/domains/comet-native/native-progress-checkpoint.js.map +1 -0
- package/dist/domains/comet-native/native-protected-file.d.ts +113 -0
- package/dist/domains/comet-native/native-protected-file.d.ts.map +1 -0
- package/dist/domains/comet-native/native-protected-file.js +509 -0
- package/dist/domains/comet-native/native-protected-file.js.map +1 -0
- package/dist/domains/comet-native/native-redaction.d.ts +2 -0
- package/dist/domains/comet-native/native-redaction.d.ts.map +1 -0
- package/dist/domains/comet-native/native-redaction.js +18 -0
- package/dist/domains/comet-native/native-redaction.js.map +1 -0
- package/dist/domains/comet-native/native-repair-integration.d.ts +42 -0
- package/dist/domains/comet-native/native-repair-integration.d.ts.map +1 -0
- package/dist/domains/comet-native/native-repair-integration.js +184 -0
- package/dist/domains/comet-native/native-repair-integration.js.map +1 -0
- package/dist/domains/comet-native/native-repair-runtime.d.ts +73 -0
- package/dist/domains/comet-native/native-repair-runtime.d.ts.map +1 -0
- package/dist/domains/comet-native/native-repair-runtime.js +509 -0
- package/dist/domains/comet-native/native-repair-runtime.js.map +1 -0
- package/dist/domains/comet-native/native-repair-stagnation.d.ts +85 -0
- package/dist/domains/comet-native/native-repair-stagnation.d.ts.map +1 -0
- package/dist/domains/comet-native/native-repair-stagnation.js +256 -0
- package/dist/domains/comet-native/native-repair-stagnation.js.map +1 -0
- package/dist/domains/comet-native/native-resume-view.d.ts +14 -0
- package/dist/domains/comet-native/native-resume-view.d.ts.map +1 -0
- package/dist/domains/comet-native/native-resume-view.js +105 -0
- package/dist/domains/comet-native/native-resume-view.js.map +1 -0
- package/dist/domains/comet-native/native-revision.d.ts +20 -0
- package/dist/domains/comet-native/native-revision.d.ts.map +1 -0
- package/dist/domains/comet-native/native-revision.js +32 -0
- package/dist/domains/comet-native/native-revision.js.map +1 -0
- package/dist/domains/comet-native/native-root-move.d.ts +20 -0
- package/dist/domains/comet-native/native-root-move.d.ts.map +1 -0
- package/dist/domains/comet-native/native-root-move.js +812 -0
- package/dist/domains/comet-native/native-root-move.js.map +1 -0
- package/dist/domains/comet-native/native-run-consistency.d.ts +3 -0
- package/dist/domains/comet-native/native-run-consistency.d.ts.map +1 -0
- package/dist/domains/comet-native/native-run-consistency.js +136 -0
- package/dist/domains/comet-native/native-run-consistency.js.map +1 -0
- package/dist/domains/comet-native/native-run-store.d.ts +41 -0
- package/dist/domains/comet-native/native-run-store.d.ts.map +1 -0
- package/dist/domains/comet-native/native-run-store.js +451 -0
- package/dist/domains/comet-native/native-run-store.js.map +1 -0
- package/dist/domains/comet-native/native-runtime-package.d.ts +16 -0
- package/dist/domains/comet-native/native-runtime-package.d.ts.map +1 -0
- package/dist/domains/comet-native/native-runtime-package.js +72 -0
- package/dist/domains/comet-native/native-runtime-package.js.map +1 -0
- package/dist/domains/comet-native/native-schema-migration.d.ts +11 -0
- package/dist/domains/comet-native/native-schema-migration.d.ts.map +1 -0
- package/dist/domains/comet-native/native-schema-migration.js +899 -0
- package/dist/domains/comet-native/native-schema-migration.js.map +1 -0
- package/dist/domains/comet-native/native-selection.d.ts +12 -0
- package/dist/domains/comet-native/native-selection.d.ts.map +1 -0
- package/dist/domains/comet-native/native-selection.js +52 -0
- package/dist/domains/comet-native/native-selection.js.map +1 -0
- package/dist/domains/comet-native/native-sensitive-paths.d.ts +7 -0
- package/dist/domains/comet-native/native-sensitive-paths.d.ts.map +1 -0
- package/dist/domains/comet-native/native-sensitive-paths.js +69 -0
- package/dist/domains/comet-native/native-sensitive-paths.js.map +1 -0
- package/dist/domains/comet-native/native-snapshot.d.ts +74 -0
- package/dist/domains/comet-native/native-snapshot.d.ts.map +1 -0
- package/dist/domains/comet-native/native-snapshot.js +2308 -0
- package/dist/domains/comet-native/native-snapshot.js.map +1 -0
- package/dist/domains/comet-native/native-specs.d.ts +12 -0
- package/dist/domains/comet-native/native-specs.d.ts.map +1 -0
- package/dist/domains/comet-native/native-specs.js +270 -0
- package/dist/domains/comet-native/native-specs.js.map +1 -0
- package/dist/domains/comet-native/native-trajectory-limits.d.ts +7 -0
- package/dist/domains/comet-native/native-trajectory-limits.d.ts.map +1 -0
- package/dist/domains/comet-native/native-trajectory-limits.js +13 -0
- package/dist/domains/comet-native/native-trajectory-limits.js.map +1 -0
- package/dist/domains/comet-native/native-trajectory-recovery.d.ts +37 -0
- package/dist/domains/comet-native/native-trajectory-recovery.d.ts.map +1 -0
- package/dist/domains/comet-native/native-trajectory-recovery.js +133 -0
- package/dist/domains/comet-native/native-trajectory-recovery.js.map +1 -0
- package/dist/domains/comet-native/native-trajectory.d.ts +16 -0
- package/dist/domains/comet-native/native-trajectory.d.ts.map +1 -0
- package/dist/domains/comet-native/native-trajectory.js +27 -0
- package/dist/domains/comet-native/native-trajectory.js.map +1 -0
- package/dist/domains/comet-native/native-transaction.d.ts +45 -0
- package/dist/domains/comet-native/native-transaction.d.ts.map +1 -0
- package/dist/domains/comet-native/native-transaction.js +846 -0
- package/dist/domains/comet-native/native-transaction.js.map +1 -0
- package/dist/domains/comet-native/native-transition-evidence.d.ts +4 -0
- package/dist/domains/comet-native/native-transition-evidence.d.ts.map +1 -0
- package/dist/domains/comet-native/native-transition-evidence.js +20 -0
- package/dist/domains/comet-native/native-transition-evidence.js.map +1 -0
- package/dist/domains/comet-native/native-transition-journal.d.ts +30 -0
- package/dist/domains/comet-native/native-transition-journal.d.ts.map +1 -0
- package/dist/domains/comet-native/native-transition-journal.js +819 -0
- package/dist/domains/comet-native/native-transition-journal.js.map +1 -0
- package/dist/domains/comet-native/native-transitions.d.ts +13 -0
- package/dist/domains/comet-native/native-transitions.d.ts.map +1 -0
- package/dist/domains/comet-native/native-transitions.js +632 -0
- package/dist/domains/comet-native/native-transitions.js.map +1 -0
- package/dist/domains/comet-native/native-types.d.ts +547 -0
- package/dist/domains/comet-native/native-types.d.ts.map +1 -0
- package/dist/domains/comet-native/native-types.js +8 -0
- package/dist/domains/comet-native/native-types.js.map +1 -0
- package/dist/domains/comet-native/native-verification-evidence.d.ts +86 -0
- package/dist/domains/comet-native/native-verification-evidence.d.ts.map +1 -0
- package/dist/domains/comet-native/native-verification-evidence.js +480 -0
- package/dist/domains/comet-native/native-verification-evidence.js.map +1 -0
- package/dist/domains/comet-native/native-verification-runtime.d.ts +58 -0
- package/dist/domains/comet-native/native-verification-runtime.d.ts.map +1 -0
- package/dist/domains/comet-native/native-verification-runtime.js +321 -0
- package/dist/domains/comet-native/native-verification-runtime.js.map +1 -0
- package/dist/domains/comet-native/native-verification-scope.d.ts +117 -0
- package/dist/domains/comet-native/native-verification-scope.d.ts.map +1 -0
- package/dist/domains/comet-native/native-verification-scope.js +1040 -0
- package/dist/domains/comet-native/native-verification-scope.js.map +1 -0
- package/dist/domains/comet-native/native-workspace.d.ts +46 -0
- package/dist/domains/comet-native/native-workspace.d.ts.map +1 -0
- package/dist/domains/comet-native/native-workspace.js +276 -0
- package/dist/domains/comet-native/native-workspace.js.map +1 -0
- package/dist/domains/dashboard/collector.d.ts.map +1 -1
- package/dist/domains/dashboard/collector.js +9 -1
- package/dist/domains/dashboard/collector.js.map +1 -1
- package/dist/domains/dashboard/native-adapter.d.ts +157 -0
- package/dist/domains/dashboard/native-adapter.d.ts.map +1 -0
- package/dist/domains/dashboard/native-adapter.js +302 -0
- package/dist/domains/dashboard/native-adapter.js.map +1 -0
- package/dist/domains/dashboard/native-collector.d.ts +6 -0
- package/dist/domains/dashboard/native-collector.d.ts.map +1 -0
- package/dist/domains/dashboard/native-collector.js +285 -0
- package/dist/domains/dashboard/native-collector.js.map +1 -0
- package/dist/domains/dashboard/types.d.ts +5 -0
- package/dist/domains/dashboard/types.d.ts.map +1 -1
- package/dist/domains/dashboard/web/assets/{arc-TGVUG2WN.js → arc-CxdiLJ50.js} +1 -1
- package/dist/domains/dashboard/web/assets/{architectureDiagram-3BPJPVTR-ASHmiHoP.js → architectureDiagram-3BPJPVTR-D5YCQu4e.js} +1 -1
- package/dist/domains/dashboard/web/assets/{blockDiagram-GPEHLZMM-CwASxBKe.js → blockDiagram-GPEHLZMM-8NfdCOQ8.js} +1 -1
- package/dist/domains/dashboard/web/assets/{c4Diagram-AAUBKEIU-BU8z_WNk.js → c4Diagram-AAUBKEIU-B3cFnNT7.js} +1 -1
- package/dist/domains/dashboard/web/assets/channel-B6AFly29.js +1 -0
- package/dist/domains/dashboard/web/assets/{chunk-2J33WTMH-CBGlUx4_.js → chunk-2J33WTMH-CBNfW-Dr.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-4BX2VUAB-CS-iGcFz.js → chunk-4BX2VUAB-vWyemRBr.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-55IACEB6-BUtCVJat.js → chunk-55IACEB6-H6haOo2C.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-727SXJPM-C94tj_pf.js → chunk-727SXJPM-D02UjGND.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-AQP2D5EJ-BFOKcpdG.js → chunk-AQP2D5EJ-wKsbOw_T.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-FMBD7UC4-Dmx8B-st.js → chunk-FMBD7UC4-eYFEZimP.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-ND2GUHAM-DYV00CNn.js → chunk-ND2GUHAM-fMaIDDI2.js} +1 -1
- package/dist/domains/dashboard/web/assets/{chunk-QZHKN3VN-DMJJyQnw.js → chunk-QZHKN3VN-C9rhF6Hm.js} +1 -1
- package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-BcnrxOTt.js +1 -0
- package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-BcnrxOTt.js +1 -0
- package/dist/domains/dashboard/web/assets/{cose-bilkent-S5V4N54A-P4nE2rea.js → cose-bilkent-S5V4N54A-CbaShPub.js} +1 -1
- package/dist/domains/dashboard/web/assets/{cynefin-VYW2F7L2-C-R1HXDv.js → cynefin-VYW2F7L2-DN4emAQv.js} +1 -1
- package/dist/domains/dashboard/web/assets/{dagre-BM42HDAG-BH8d-C9z.js → dagre-BM42HDAG-BpSzbk_V.js} +1 -1
- package/dist/domains/dashboard/web/assets/demo-BuVau32v.js +25 -0
- package/dist/domains/dashboard/web/assets/{diagram-2AECGRRQ-DpXTgQIH.js → diagram-2AECGRRQ-CfXwGGpQ.js} +1 -1
- package/dist/domains/dashboard/web/assets/{diagram-5GNKFQAL-DSiFJzSw.js → diagram-5GNKFQAL-DMp0Zmot.js} +1 -1
- package/dist/domains/dashboard/web/assets/{diagram-KO2AKTUF-DULMkben.js → diagram-KO2AKTUF-C7ZvofsM.js} +1 -1
- package/dist/domains/dashboard/web/assets/{diagram-LMA3HP47-Pi8m_NO9.js → diagram-LMA3HP47-BjmxFnap.js} +1 -1
- package/dist/domains/dashboard/web/assets/{diagram-OG6HWLK6-BSe6bCWm.js → diagram-OG6HWLK6-DFBG1Iqy.js} +1 -1
- package/dist/domains/dashboard/web/assets/{erDiagram-TEJ5UH35-zb-FEcbq.js → erDiagram-TEJ5UH35-MpNT7dzt.js} +1 -1
- package/dist/domains/dashboard/web/assets/{flowDiagram-I6XJVG4X-Dr-Gk0z2.js → flowDiagram-I6XJVG4X-_1wAR6c1.js} +1 -1
- package/dist/domains/dashboard/web/assets/{ganttDiagram-6RSMTGT7-qs6Zb2A6.js → ganttDiagram-6RSMTGT7-DJKjDeWl.js} +1 -1
- package/dist/domains/dashboard/web/assets/{gitGraphDiagram-PVQCEYII-BQ314orT.js → gitGraphDiagram-PVQCEYII-BL7yUEn-.js} +1 -1
- package/dist/domains/dashboard/web/assets/index-CjE9mHGb.js +24 -0
- package/dist/domains/dashboard/web/assets/index-D-AGxvI4.css +1 -0
- package/dist/domains/dashboard/web/assets/{infoDiagram-5YYISTIA-O0bQp98A.js → infoDiagram-5YYISTIA-Bt5fqrOd.js} +1 -1
- package/dist/domains/dashboard/web/assets/{ishikawaDiagram-YF4QCWOH-BPC7wbKh.js → ishikawaDiagram-YF4QCWOH-COCMcjBM.js} +1 -1
- package/dist/domains/dashboard/web/assets/{journeyDiagram-JHISSGLW-ohViOd4b.js → journeyDiagram-JHISSGLW-DGcpcWny.js} +1 -1
- package/dist/domains/dashboard/web/assets/{kanban-definition-UN3LZRKU-CHleNdbG.js → kanban-definition-UN3LZRKU-QSBNsWMP.js} +1 -1
- package/dist/domains/dashboard/web/assets/{linear-CyqiW--Q.js → linear-9uyeeBZf.js} +1 -1
- package/dist/domains/dashboard/web/assets/{mermaid.core-qS9XvtaK.js → mermaid.core-CkNdB471.js} +4 -4
- package/dist/domains/dashboard/web/assets/{mindmap-definition-RKZ34NQL-oaGkqO9l.js → mindmap-definition-RKZ34NQL-CiNxI0gP.js} +1 -1
- package/dist/domains/dashboard/web/assets/{pieDiagram-4H26LBE5-CPcB-AFh.js → pieDiagram-4H26LBE5-BLJ6QnRO.js} +1 -1
- package/dist/domains/dashboard/web/assets/{quadrantDiagram-W4KKPZXB-LFy52Qtj.js → quadrantDiagram-W4KKPZXB-CflW-eFH.js} +1 -1
- package/dist/domains/dashboard/web/assets/{requirementDiagram-4Y6WPE33-BdjeaYP_.js → requirementDiagram-4Y6WPE33-B9HLmRWH.js} +1 -1
- package/dist/domains/dashboard/web/assets/{sankeyDiagram-5OEKKPKP-DDJ4styL.js → sankeyDiagram-5OEKKPKP-6xnco5k5.js} +1 -1
- package/dist/domains/dashboard/web/assets/{sequenceDiagram-3UESZ5HK-BL5bFNoz.js → sequenceDiagram-3UESZ5HK-Dp1rujNZ.js} +1 -1
- package/dist/domains/dashboard/web/assets/{stateDiagram-AJRCARHV-BNUfikui.js → stateDiagram-AJRCARHV-C1Xc90ek.js} +1 -1
- package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-p-qmzXyE.js +1 -0
- package/dist/domains/dashboard/web/assets/{timeline-definition-PNZ67QCA--ps2uu6L.js → timeline-definition-PNZ67QCA-g9s-m5Z4.js} +1 -1
- package/dist/domains/dashboard/web/assets/{vennDiagram-CIIHVFJN-C2q8q26c.js → vennDiagram-CIIHVFJN-rkEyhyCc.js} +1 -1
- package/dist/domains/dashboard/web/assets/{wardleyDiagram-YWT4CUSO-BUH9gXqd.js → wardleyDiagram-YWT4CUSO-CJLrWGXc.js} +1 -1
- package/dist/domains/dashboard/web/assets/{xychartDiagram-2RQKCTM6-B-DielEy.js → xychartDiagram-2RQKCTM6-BxJvPNqo.js} +1 -1
- package/dist/domains/dashboard/web/index.html +2 -2
- package/dist/domains/engine/storage-layout.d.ts +14 -0
- package/dist/domains/engine/storage-layout.d.ts.map +1 -0
- package/dist/domains/engine/storage-layout.js +32 -0
- package/dist/domains/engine/storage-layout.js.map +1 -0
- package/dist/domains/engine/storage-run.d.ts +9 -0
- package/dist/domains/engine/storage-run.d.ts.map +1 -0
- package/dist/domains/engine/storage-run.js +116 -0
- package/dist/domains/engine/storage-run.js.map +1 -0
- package/dist/domains/factory/package.d.ts.map +1 -1
- package/dist/domains/factory/package.js +5 -3
- package/dist/domains/factory/package.js.map +1 -1
- package/dist/domains/integrations/openspec.d.ts.map +1 -1
- package/dist/domains/integrations/openspec.js +8 -6
- package/dist/domains/integrations/openspec.js.map +1 -1
- package/dist/domains/skill/platform-inspect.d.ts +6 -2
- package/dist/domains/skill/platform-inspect.d.ts.map +1 -1
- package/dist/domains/skill/platform-inspect.js +52 -8
- package/dist/domains/skill/platform-inspect.js.map +1 -1
- package/dist/domains/skill/platform-install.d.ts +18 -7
- package/dist/domains/skill/platform-install.d.ts.map +1 -1
- package/dist/domains/skill/platform-install.js +338 -71
- package/dist/domains/skill/platform-install.js.map +1 -1
- package/dist/domains/skill/project-instructions.d.ts.map +1 -1
- package/dist/domains/skill/project-instructions.js +12 -6
- package/dist/domains/skill/project-instructions.js.map +1 -1
- package/dist/domains/skill/uninstall.d.ts.map +1 -1
- package/dist/domains/skill/uninstall.js +15 -3
- package/dist/domains/skill/uninstall.js.map +1 -1
- package/dist/domains/workflow-contract/builtins.d.ts +6 -0
- package/dist/domains/workflow-contract/builtins.d.ts.map +1 -1
- package/dist/domains/workflow-contract/builtins.js +137 -0
- package/dist/domains/workflow-contract/builtins.js.map +1 -1
- package/dist/domains/workflow-contract/index.d.ts +3 -1
- package/dist/domains/workflow-contract/index.d.ts.map +1 -1
- package/dist/domains/workflow-contract/index.js +2 -1
- package/dist/domains/workflow-contract/index.js.map +1 -1
- package/dist/domains/workflow-contract/normalize.d.ts.map +1 -1
- package/dist/domains/workflow-contract/normalize.js +28 -10
- package/dist/domains/workflow-contract/normalize.js.map +1 -1
- package/dist/domains/workflow-contract/project-config.d.ts +7 -0
- package/dist/domains/workflow-contract/project-config.d.ts.map +1 -0
- package/dist/domains/workflow-contract/project-config.js +110 -0
- package/dist/domains/workflow-contract/project-config.js.map +1 -0
- package/dist/domains/workflow-contract/types.d.ts +4 -2
- package/dist/domains/workflow-contract/types.d.ts.map +1 -1
- package/dist/domains/workflow-contract/validation.d.ts.map +1 -1
- package/dist/domains/workflow-contract/validation.js +14 -5
- package/dist/domains/workflow-contract/validation.js.map +1 -1
- package/dist/platform/install/detect.d.ts +3 -1
- package/dist/platform/install/detect.d.ts.map +1 -1
- package/dist/platform/install/detect.js +4 -1
- package/dist/platform/install/detect.js.map +1 -1
- package/dist/platform/install/project-registry.js +2 -2
- package/dist/platform/install/project-registry.js.map +1 -1
- package/dist/platform/paths/repository-layout.d.ts +16 -0
- package/dist/platform/paths/repository-layout.d.ts.map +1 -1
- package/dist/platform/paths/repository-layout.js.map +1 -1
- package/eval/local/README.md +50 -0
- package/eval/local/scripts/compare_baselines.py +127 -1
- package/eval/local/scripts/regression_check.py +3 -4
- package/eval/local/tasks/comet-native-clarification/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-clarification/environment/test_wordcount.py +25 -0
- package/eval/local/tasks/comet-native-clarification/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-clarification/instruction.md +7 -0
- package/eval/local/tasks/comet-native-clarification/task.toml +40 -0
- package/eval/local/tasks/comet-native-clarification/validation/test_native_clarification.py +193 -0
- package/eval/local/tasks/comet-native-clarification-modes/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-clarification-modes/environment/test_wordcount.py +25 -0
- package/eval/local/tasks/comet-native-clarification-modes/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-clarification-modes/instruction.md +13 -0
- package/eval/local/tasks/comet-native-clarification-modes/task.toml +39 -0
- package/eval/local/tasks/comet-native-clarification-modes/validation/test_native_clarification_modes.py +235 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/.comet/config.yaml +6 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/brief.md +17 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/comet-state.yaml +12 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/runtime/transition.json +69 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/docs/comet/changes/add-character-counting/specs/character-counting/spec.md +3 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/test_wordcount.py +20 -0
- package/eval/local/tasks/comet-native-interrupted-transition/environment/wordcount.py +27 -0
- package/eval/local/tasks/comet-native-interrupted-transition/instruction.md +7 -0
- package/eval/local/tasks/comet-native-interrupted-transition/task.toml +35 -0
- package/eval/local/tasks/comet-native-interrupted-transition/validation/test_native_interrupted_transition.py +63 -0
- package/eval/local/tasks/comet-native-repository-fact/environment/Dockerfile +26 -0
- package/eval/local/tasks/comet-native-repository-fact/environment/PRODUCT_RULES.md +3 -0
- package/eval/local/tasks/comet-native-repository-fact/environment/test_wordcount.py +20 -0
- package/eval/local/tasks/comet-native-repository-fact/environment/wordcount.py +27 -0
- package/eval/local/tasks/comet-native-repository-fact/instruction.md +7 -0
- package/eval/local/tasks/comet-native-repository-fact/task.toml +35 -0
- package/eval/local/tasks/comet-native-repository-fact/validation/test_native_repository_fact.py +53 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/test_wordcount.py +27 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/instruction.md +9 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/task.toml +40 -0
- package/eval/local/tasks/comet-native-wave-b-decision-resume/validation/test_native_wave_b_decision_resume.py +208 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/test_wordcount.py +27 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/instruction.md +11 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/task.toml +36 -0
- package/eval/local/tasks/comet-native-wave-c-verification-integrity/validation/test_native_wave_c_verification_integrity.py +344 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/test_wordcount.py +27 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/instruction.md +11 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/task.toml +37 -0
- package/eval/local/tasks/comet-native-wave-d-stagnation-stop/validation/test_native_wave_d_stagnation_stop.py +284 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/.include-trusted-native-runtime +1 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/test_wordcount.py +27 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/instruction.md +9 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/task.toml +37 -0
- package/eval/local/tasks/comet-native-wave-e-parallel-safety/validation/test_native_wave_e_parallel_safety.py +309 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/.include-current-comet-cli +1 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/Dockerfile +31 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet-package.json +18 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/current-comet.sh +14 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/test_wordcount.py +27 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/instruction.md +7 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/task.toml +36 -0
- package/eval/local/tasks/comet-native-wave-f-dashboard-readonly/validation/test_native_wave_f_dashboard_readonly.py +469 -0
- package/eval/local/tasks/comet-native-workflow/environment/Dockerfile +27 -0
- package/eval/local/tasks/comet-native-workflow/environment/test_wordcount.py +25 -0
- package/eval/local/tasks/comet-native-workflow/environment/wordcount.py +36 -0
- package/eval/local/tasks/comet-native-workflow/instruction.md +14 -0
- package/eval/local/tasks/comet-native-workflow/task.toml +36 -0
- package/eval/local/tasks/comet-native-workflow/validation/test_native_workflow.py +149 -0
- package/eval/local/tasks/index.yaml +61 -0
- package/eval/local/tests/conftest.py +407 -22
- package/eval/local/tests/scaffold/test_aligned_comparison.py +1012 -0
- package/eval/local/tests/scaffold/test_conftest_helpers.py +187 -7
- package/eval/local/tests/scaffold/test_logging.py +135 -1
- package/eval/local/tests/scaffold/test_manifests.py +2 -0
- package/eval/local/tests/scaffold/test_native_aligned_eval.py +346 -0
- package/eval/local/tests/scaffold/test_native_wave_evaluations.py +1889 -0
- package/eval/local/tests/scaffold/test_profiles.py +33 -0
- package/eval/local/tests/scaffold/test_sample_quality.py +57 -0
- package/eval/local/tests/scaffold/test_tasks.py +377 -1
- package/eval/local/tests/scaffold/test_treatments.py +59 -13
- package/eval/local/tests/scaffold/test_utils.py +277 -4
- package/eval/local/tests/tasks/__init__.py +1 -0
- package/eval/local/tests/tasks/test_tasks.py +104 -78
- package/eval/local/tests/tasks/test_validation_scripts.py +37 -0
- package/eval/local/treatments/comet/comet_native_phase1.yaml +66 -0
- package/eval/scaffold/python/aligned_comparison.py +1631 -0
- package/eval/scaffold/python/generic_llm_judge.py +3 -1
- package/eval/scaffold/python/llm_judge.py +0 -3
- package/eval/scaffold/python/logging.py +115 -16
- package/eval/scaffold/python/manifests.py +2 -0
- package/eval/scaffold/python/native_eval.py +138 -0
- package/eval/scaffold/python/pass_at_k.py +0 -1
- package/eval/scaffold/python/report_outputs.py +226 -44
- package/eval/scaffold/python/sample_quality.py +45 -2
- package/eval/scaffold/python/tasks.py +11 -0
- package/eval/scaffold/python/utils.py +108 -20
- package/eval/scaffold/python/validation/__init__.py +15 -5
- package/eval/scaffold/python/validation/comet_workflow.py +10 -5
- package/eval/scaffold/python/validation/generic_rubric.py +1 -2
- package/eval/scaffold/python/validation/native_wave.py +2154 -0
- package/eval/scaffold/python/validation/native_workflow.py +252 -0
- package/eval/scaffold/python/validation/rubric.py +0 -2
- package/eval/scaffold/shell/completion-point.sh +18 -0
- package/eval/scaffold/shell/decision-point.sh +35 -0
- package/eval/scaffold/shell/docker.sh +150 -9
- package/eval/scaffold/shell/run-claude-loop.sh +57 -27
- package/package.json +19 -5
- package/dist/domains/dashboard/web/assets/channel-kp6Ng2JJ.js +0 -1
- package/dist/domains/dashboard/web/assets/classDiagram-4FO5ZUOK-yBDjgMY_.js +0 -1
- package/dist/domains/dashboard/web/assets/classDiagram-v2-Q7XG4LA2-yBDjgMY_.js +0 -1
- package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +0 -1
- package/dist/domains/dashboard/web/assets/index-BLAfkNTu.css +0 -1
- package/dist/domains/dashboard/web/assets/index-DtLUOcAW.js +0 -24
- package/dist/domains/dashboard/web/assets/stateDiagram-v2-BHNVJYJU-DGrsmWts.js +0 -1
- package/eval/.env.example +0 -52
- package/eval/langsmith/.env.example +0 -16
|
@@ -0,0 +1,846 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { TextDecoder } from 'util';
|
|
4
|
+
import { atomicWriteJson, atomicWriteText } from './native-atomic-file.js';
|
|
5
|
+
import { isInsidePath, resolveContainedNativePath } from './native-paths.js';
|
|
6
|
+
import { copyNativeProtectedFile, ensureNativeProtectedDirectory, moveNativeProtectedDirectory, readNativeProtectedDirectory, readNativeProtectedFile, removeNativeProtectedFile, } from './native-protected-file.js';
|
|
7
|
+
const JOURNAL_KEYS = new Set([
|
|
8
|
+
'schema',
|
|
9
|
+
'id',
|
|
10
|
+
'kind',
|
|
11
|
+
'status',
|
|
12
|
+
'projectRoot',
|
|
13
|
+
'nativeRoot',
|
|
14
|
+
'change',
|
|
15
|
+
'createdAt',
|
|
16
|
+
'operations',
|
|
17
|
+
]);
|
|
18
|
+
const OPERATION_KEYS = new Set(['id', 'type', 'source', 'target', 'staged', 'backup']);
|
|
19
|
+
const ARCHIVE_V2_JOURNAL_KEYS = new Set([
|
|
20
|
+
'schema',
|
|
21
|
+
'id',
|
|
22
|
+
'kind',
|
|
23
|
+
'status',
|
|
24
|
+
'change',
|
|
25
|
+
'createdAt',
|
|
26
|
+
'preflightHash',
|
|
27
|
+
'operations',
|
|
28
|
+
]);
|
|
29
|
+
const ARCHIVE_V2_OPERATION_KEYS = new Set([
|
|
30
|
+
'id',
|
|
31
|
+
'type',
|
|
32
|
+
'source',
|
|
33
|
+
'target',
|
|
34
|
+
'staged',
|
|
35
|
+
'backup',
|
|
36
|
+
'expectedSourceHash',
|
|
37
|
+
'expectedTargetHash',
|
|
38
|
+
'stagedHash',
|
|
39
|
+
]);
|
|
40
|
+
const EVENT_KEYS = new Set(['sequence', 'timestamp', 'type', 'operationId']);
|
|
41
|
+
const TRANSACTION_STATUSES = new Set([
|
|
42
|
+
'prepared',
|
|
43
|
+
'applying',
|
|
44
|
+
'committed',
|
|
45
|
+
'rolling-back',
|
|
46
|
+
'rolled-back',
|
|
47
|
+
]);
|
|
48
|
+
const EVENT_TYPES = new Set([
|
|
49
|
+
'prepared',
|
|
50
|
+
'operation-started',
|
|
51
|
+
'operation-completed',
|
|
52
|
+
'archive-finalization-started',
|
|
53
|
+
'archive-finalized',
|
|
54
|
+
'commit',
|
|
55
|
+
'rollback-started',
|
|
56
|
+
'rollback-completed',
|
|
57
|
+
]);
|
|
58
|
+
const NATIVE_TRANSACTION_JOURNAL_MAX_BYTES = 256 * 1024;
|
|
59
|
+
const NATIVE_TRANSACTION_EVENTS_MAX_BYTES = 1024 * 1024;
|
|
60
|
+
const NATIVE_TRANSACTION_EVENT_MAX_BYTES = 16 * 1024;
|
|
61
|
+
const NATIVE_TRANSACTION_EVENT_MAX_COUNT = 1024;
|
|
62
|
+
const NATIVE_LEGACY_TRANSACTION_FILE_MAX_BYTES = 64 * 1024 * 1024;
|
|
63
|
+
const NATIVE_LEGACY_TRANSACTION_DIRECTORY_MAX_ENTRIES = 20_000;
|
|
64
|
+
const UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });
|
|
65
|
+
function record(value, label) {
|
|
66
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
67
|
+
throw new Error(`${label} must be an object`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
function rejectUnknown(value, keys, label) {
|
|
72
|
+
const unknown = Object.keys(value).filter((key) => !keys.has(key));
|
|
73
|
+
if (unknown.length > 0)
|
|
74
|
+
throw new Error(`${label} has unknown field(s): ${unknown.join(', ')}`);
|
|
75
|
+
}
|
|
76
|
+
function validTimestamp(value) {
|
|
77
|
+
if (typeof value !== 'string')
|
|
78
|
+
return false;
|
|
79
|
+
const parsed = new Date(value);
|
|
80
|
+
return !Number.isNaN(parsed.valueOf()) && parsed.toISOString() === value;
|
|
81
|
+
}
|
|
82
|
+
function assertRef(ref, label) {
|
|
83
|
+
if (typeof ref !== 'string' ||
|
|
84
|
+
ref.length === 0 ||
|
|
85
|
+
path.isAbsolute(ref) ||
|
|
86
|
+
/^(?:[A-Za-z]:|~|[\\/])/u.test(ref) ||
|
|
87
|
+
ref.split(/[\\/]/u).includes('..')) {
|
|
88
|
+
throw new Error(`${label} must stay inside the Native root`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertHash(value, label) {
|
|
92
|
+
if (typeof value !== 'string' || !/^[a-f0-9]{64}$/u.test(value)) {
|
|
93
|
+
throw new Error(`${label} must be a SHA-256 hash`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function assertArchiveRef(ref, label) {
|
|
97
|
+
assertRef(ref, label);
|
|
98
|
+
if (ref.includes('\\') ||
|
|
99
|
+
ref !== path.posix.normalize(ref) ||
|
|
100
|
+
ref.split('/').includes('.') ||
|
|
101
|
+
ref.endsWith('/') ||
|
|
102
|
+
Buffer.byteLength(ref, 'utf8') > 1024) {
|
|
103
|
+
throw new Error(`${label} must be a normalized Native-relative ref`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function parseOperation(value, index) {
|
|
107
|
+
const operation = record(value, `transaction operations[${index}]`);
|
|
108
|
+
rejectUnknown(operation, OPERATION_KEYS, `transaction operations[${index}]`);
|
|
109
|
+
if (typeof operation.id !== 'string' || !/^[a-z0-9][a-z0-9-]*$/u.test(operation.id)) {
|
|
110
|
+
throw new Error(`transaction operations[${index}].id is invalid`);
|
|
111
|
+
}
|
|
112
|
+
if (operation.type !== 'write' && operation.type !== 'remove' && operation.type !== 'move') {
|
|
113
|
+
throw new Error(`transaction operation ${operation.id} has an invalid type`);
|
|
114
|
+
}
|
|
115
|
+
assertRef(operation.target, `transaction operation ${operation.id} target`);
|
|
116
|
+
for (const field of ['source', 'staged', 'backup']) {
|
|
117
|
+
if (operation[field] !== undefined) {
|
|
118
|
+
assertRef(operation[field], `transaction operation ${operation.id} ${field}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (operation.type === 'write') {
|
|
122
|
+
if (operation.staged === undefined || operation.source !== undefined) {
|
|
123
|
+
throw new Error(`write operation ${operation.id} requires staged and forbids source`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (operation.type === 'remove') {
|
|
127
|
+
if (operation.source !== undefined || operation.staged !== undefined) {
|
|
128
|
+
throw new Error(`remove operation ${operation.id} forbids source and staged`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (operation.source === undefined ||
|
|
132
|
+
operation.staged !== undefined ||
|
|
133
|
+
operation.backup !== undefined) {
|
|
134
|
+
throw new Error(`move operation ${operation.id} requires source and forbids staged and backup`);
|
|
135
|
+
}
|
|
136
|
+
return operation;
|
|
137
|
+
}
|
|
138
|
+
export function parseNativeArchiveTransactionJournalV2(value) {
|
|
139
|
+
const journal = record(value, 'Native Archive transaction journal');
|
|
140
|
+
rejectUnknown(journal, ARCHIVE_V2_JOURNAL_KEYS, 'Native Archive transaction journal');
|
|
141
|
+
if (journal.schema !== 'comet.native.transaction.v2') {
|
|
142
|
+
throw new Error('Unsupported Native Archive transaction schema');
|
|
143
|
+
}
|
|
144
|
+
if (typeof journal.id !== 'string' || !/^[a-f0-9-]{8,}$/u.test(journal.id)) {
|
|
145
|
+
throw new Error('Native Archive transaction id is invalid');
|
|
146
|
+
}
|
|
147
|
+
if (journal.kind !== 'archive')
|
|
148
|
+
throw new Error('Native v2 transaction kind must be archive');
|
|
149
|
+
if (typeof journal.status !== 'string' ||
|
|
150
|
+
!TRANSACTION_STATUSES.has(journal.status)) {
|
|
151
|
+
throw new Error('Native Archive transaction status is invalid');
|
|
152
|
+
}
|
|
153
|
+
if (typeof journal.change !== 'string' ||
|
|
154
|
+
!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u.test(journal.change)) {
|
|
155
|
+
throw new Error('Native Archive transaction change name is invalid');
|
|
156
|
+
}
|
|
157
|
+
if (!validTimestamp(journal.createdAt)) {
|
|
158
|
+
throw new Error('Native Archive transaction createdAt is invalid');
|
|
159
|
+
}
|
|
160
|
+
assertHash(journal.preflightHash, 'Native Archive transaction preflightHash');
|
|
161
|
+
if (!Array.isArray(journal.operations) || journal.operations.length > 65) {
|
|
162
|
+
throw new Error('Native Archive transaction operations must be an array');
|
|
163
|
+
}
|
|
164
|
+
const operations = journal.operations.map((value, index) => {
|
|
165
|
+
const operation = record(value, `Archive transaction operations[${index}]`);
|
|
166
|
+
rejectUnknown(operation, ARCHIVE_V2_OPERATION_KEYS, `Archive transaction operations[${index}]`);
|
|
167
|
+
if (typeof operation.id !== 'string' || !/^[a-z0-9][a-z0-9-]*$/u.test(operation.id)) {
|
|
168
|
+
throw new Error(`Archive transaction operations[${index}].id is invalid`);
|
|
169
|
+
}
|
|
170
|
+
if (operation.type !== 'write' && operation.type !== 'remove' && operation.type !== 'move') {
|
|
171
|
+
throw new Error(`Archive transaction operation ${operation.id} has an invalid type`);
|
|
172
|
+
}
|
|
173
|
+
assertArchiveRef(operation.target, `Archive transaction operation ${operation.id} target`);
|
|
174
|
+
for (const field of ['source', 'staged', 'backup']) {
|
|
175
|
+
if (operation[field] !== undefined) {
|
|
176
|
+
assertArchiveRef(operation[field], `Archive transaction operation ${operation.id} ${field}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (operation.expectedTargetHash !== null) {
|
|
180
|
+
assertHash(operation.expectedTargetHash, `Archive transaction operation ${operation.id} expectedTargetHash`);
|
|
181
|
+
}
|
|
182
|
+
if (operation.type === 'write') {
|
|
183
|
+
if (operation.staged === undefined ||
|
|
184
|
+
operation.source !== undefined ||
|
|
185
|
+
operation.expectedSourceHash !== undefined) {
|
|
186
|
+
throw new Error(`Archive write operation ${operation.id} requires staged and forbids source`);
|
|
187
|
+
}
|
|
188
|
+
assertHash(operation.stagedHash, `Archive write operation ${operation.id} stagedHash`);
|
|
189
|
+
if ((operation.expectedTargetHash === null) !== (operation.backup === undefined)) {
|
|
190
|
+
throw new Error(`Archive write operation ${operation.id} backup must match target existence`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (operation.type === 'remove') {
|
|
194
|
+
if (operation.source !== undefined ||
|
|
195
|
+
operation.staged !== undefined ||
|
|
196
|
+
operation.stagedHash !== undefined ||
|
|
197
|
+
operation.expectedSourceHash !== undefined ||
|
|
198
|
+
operation.backup === undefined ||
|
|
199
|
+
operation.expectedTargetHash === null) {
|
|
200
|
+
throw new Error(`Archive remove operation ${operation.id} requires a bound target and backup`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
if (operation.source === undefined ||
|
|
205
|
+
operation.staged !== undefined ||
|
|
206
|
+
operation.stagedHash !== undefined ||
|
|
207
|
+
operation.backup !== undefined ||
|
|
208
|
+
operation.expectedTargetHash !== null) {
|
|
209
|
+
throw new Error(`Archive move operation ${operation.id} requires source and an absent target`);
|
|
210
|
+
}
|
|
211
|
+
assertHash(operation.expectedSourceHash, `Archive move operation ${operation.id} expectedSourceHash`);
|
|
212
|
+
}
|
|
213
|
+
return operation;
|
|
214
|
+
});
|
|
215
|
+
const operationIds = operations.map((operation) => operation.id);
|
|
216
|
+
if (new Set(operationIds).size !== operationIds.length) {
|
|
217
|
+
throw new Error('Native Archive transaction operation ids must be unique');
|
|
218
|
+
}
|
|
219
|
+
const transactionPrefix = `runtime/transactions/${journal.id}`;
|
|
220
|
+
const archiveMoves = operations.filter((operation) => operation.type === 'move');
|
|
221
|
+
if (archiveMoves.length !== 1 ||
|
|
222
|
+
archiveMoves[0].id !== 'archive-change' ||
|
|
223
|
+
archiveMoves[0].source !== `changes/${journal.change}` ||
|
|
224
|
+
!new RegExp(`^archive/\\d{4}-\\d{2}-\\d{2}-${journal.change}$`, 'u').test(archiveMoves[0].target) ||
|
|
225
|
+
operations.at(-1) !== archiveMoves[0]) {
|
|
226
|
+
throw new Error('Native Archive transaction must end with its exact change move');
|
|
227
|
+
}
|
|
228
|
+
const specTargets = new Set();
|
|
229
|
+
for (const operation of operations.slice(0, -1)) {
|
|
230
|
+
if (operation.type === 'move' ||
|
|
231
|
+
!/^specs\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*\/spec\.md$/u.test(operation.target) ||
|
|
232
|
+
specTargets.has(operation.target)) {
|
|
233
|
+
throw new Error(`Native Archive transaction spec target is invalid: ${operation.target}`);
|
|
234
|
+
}
|
|
235
|
+
specTargets.add(operation.target);
|
|
236
|
+
if (operation.staged !== undefined &&
|
|
237
|
+
!operation.staged.startsWith(`${transactionPrefix}/staged/specs/`)) {
|
|
238
|
+
throw new Error(`Native Archive transaction staged ref is invalid: ${operation.staged}`);
|
|
239
|
+
}
|
|
240
|
+
if (operation.backup !== undefined &&
|
|
241
|
+
!operation.backup.startsWith(`${transactionPrefix}/backups/specs/`)) {
|
|
242
|
+
throw new Error(`Native Archive transaction backup ref is invalid: ${operation.backup}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
schema: 'comet.native.transaction.v2',
|
|
247
|
+
id: journal.id,
|
|
248
|
+
kind: 'archive',
|
|
249
|
+
status: journal.status,
|
|
250
|
+
change: journal.change,
|
|
251
|
+
createdAt: journal.createdAt,
|
|
252
|
+
preflightHash: journal.preflightHash,
|
|
253
|
+
operations,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function parseJournal(value) {
|
|
257
|
+
const journal = record(value, 'Native transaction journal');
|
|
258
|
+
if (journal.schema === 'comet.native.transaction.v2') {
|
|
259
|
+
// Generic callers (mutation lock and doctor) only consume the common id/kind/status/change
|
|
260
|
+
// fields. Archive execution always reparses through the v2-specific API below.
|
|
261
|
+
return parseNativeArchiveTransactionJournalV2(journal);
|
|
262
|
+
}
|
|
263
|
+
rejectUnknown(journal, JOURNAL_KEYS, 'Native transaction journal');
|
|
264
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
265
|
+
throw new Error('Unsupported Native transaction schema');
|
|
266
|
+
}
|
|
267
|
+
if (typeof journal.id !== 'string' || !/^[a-f0-9-]{8,}$/u.test(journal.id)) {
|
|
268
|
+
throw new Error('Native transaction id is invalid');
|
|
269
|
+
}
|
|
270
|
+
if (journal.kind !== 'archive' && journal.kind !== 'root-move') {
|
|
271
|
+
throw new Error('Native transaction kind is invalid');
|
|
272
|
+
}
|
|
273
|
+
if (typeof journal.status !== 'string' ||
|
|
274
|
+
!TRANSACTION_STATUSES.has(journal.status)) {
|
|
275
|
+
throw new Error('Native transaction status is invalid');
|
|
276
|
+
}
|
|
277
|
+
if (typeof journal.projectRoot !== 'string' ||
|
|
278
|
+
!path.isAbsolute(journal.projectRoot) ||
|
|
279
|
+
typeof journal.nativeRoot !== 'string' ||
|
|
280
|
+
!path.isAbsolute(journal.nativeRoot)) {
|
|
281
|
+
throw new Error('Native transaction roots must be absolute paths');
|
|
282
|
+
}
|
|
283
|
+
if (journal.change !== undefined &&
|
|
284
|
+
(typeof journal.change !== 'string' || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u.test(journal.change))) {
|
|
285
|
+
throw new Error('Native transaction change name is invalid');
|
|
286
|
+
}
|
|
287
|
+
if (!validTimestamp(journal.createdAt)) {
|
|
288
|
+
throw new Error('Native transaction createdAt is invalid');
|
|
289
|
+
}
|
|
290
|
+
if (!Array.isArray(journal.operations)) {
|
|
291
|
+
throw new Error('Native transaction operations must be an array');
|
|
292
|
+
}
|
|
293
|
+
const operations = journal.operations.map(parseOperation);
|
|
294
|
+
const operationIds = operations.map((operation) => operation.id);
|
|
295
|
+
if (new Set(operationIds).size !== operationIds.length) {
|
|
296
|
+
throw new Error('Native transaction operation ids must be unique');
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
schema: 'comet.native.transaction.v1',
|
|
300
|
+
id: journal.id,
|
|
301
|
+
kind: journal.kind,
|
|
302
|
+
status: journal.status,
|
|
303
|
+
projectRoot: journal.projectRoot,
|
|
304
|
+
nativeRoot: journal.nativeRoot,
|
|
305
|
+
...(typeof journal.change === 'string' ? { change: journal.change } : {}),
|
|
306
|
+
createdAt: journal.createdAt,
|
|
307
|
+
operations,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
function parseEvent(value, line) {
|
|
311
|
+
const event = record(value, `Native transaction event at line ${line}`);
|
|
312
|
+
rejectUnknown(event, EVENT_KEYS, `Native transaction event at line ${line}`);
|
|
313
|
+
if (event.sequence !== line) {
|
|
314
|
+
throw new Error(`Native transaction event sequence at line ${line} must be ${line}`);
|
|
315
|
+
}
|
|
316
|
+
if (!validTimestamp(event.timestamp)) {
|
|
317
|
+
throw new Error(`Native transaction event timestamp at line ${line} is invalid`);
|
|
318
|
+
}
|
|
319
|
+
if (typeof event.type !== 'string' ||
|
|
320
|
+
!EVENT_TYPES.has(event.type)) {
|
|
321
|
+
throw new Error(`Native transaction event type at line ${line} is invalid`);
|
|
322
|
+
}
|
|
323
|
+
const operationEvent = event.type === 'operation-started' || event.type === 'operation-completed';
|
|
324
|
+
if ((operationEvent &&
|
|
325
|
+
(typeof event.operationId !== 'string' ||
|
|
326
|
+
!/^[a-z0-9][a-z0-9-]*$/u.test(event.operationId) ||
|
|
327
|
+
Buffer.byteLength(event.operationId, 'utf8') > 256)) ||
|
|
328
|
+
(!operationEvent && event.operationId !== undefined)) {
|
|
329
|
+
throw new Error(`Native transaction event operationId at line ${line} is invalid`);
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
sequence: event.sequence,
|
|
333
|
+
timestamp: event.timestamp,
|
|
334
|
+
type: event.type,
|
|
335
|
+
...(typeof event.operationId === 'string' ? { operationId: event.operationId } : {}),
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function matchesIsoTimestampPrefix(value) {
|
|
339
|
+
if (value.length > 24)
|
|
340
|
+
return false;
|
|
341
|
+
const shape = '0000-00-00T00:00:00.000Z';
|
|
342
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
343
|
+
const expected = shape[index];
|
|
344
|
+
const actual = value[index];
|
|
345
|
+
if (expected === '0') {
|
|
346
|
+
if (!/[0-9]/u.test(actual))
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
else if (actual !== expected) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const numericRanges = [
|
|
354
|
+
[5, 2, 1, 12],
|
|
355
|
+
[8, 2, 1, 31],
|
|
356
|
+
[11, 2, 0, 23],
|
|
357
|
+
[14, 2, 0, 59],
|
|
358
|
+
[17, 2, 0, 59],
|
|
359
|
+
[20, 3, 0, 999],
|
|
360
|
+
];
|
|
361
|
+
for (const [offset, width, minimum, maximum] of numericRanges) {
|
|
362
|
+
if (value.length <= offset)
|
|
363
|
+
continue;
|
|
364
|
+
const partial = value.slice(offset, Math.min(offset + width, value.length));
|
|
365
|
+
const completable = Array.from({ length: maximum - minimum + 1 }, (_entry, index) => String(minimum + index).padStart(width, '0')).some((candidate) => candidate.startsWith(partial));
|
|
366
|
+
if (!completable)
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
if (value.length >= 10 && !validTimestamp(`${value.slice(0, 10)}T00:00:00.000Z`)) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
return value.length < 24 || validTimestamp(value);
|
|
373
|
+
}
|
|
374
|
+
function isStrictLiteralPrefix(value, expected) {
|
|
375
|
+
return value.length < expected.length && expected.startsWith(value);
|
|
376
|
+
}
|
|
377
|
+
function couldCompleteOperationEventSuffix(value) {
|
|
378
|
+
const operationPrefix = '","operationId":"';
|
|
379
|
+
if (isStrictLiteralPrefix(value, operationPrefix))
|
|
380
|
+
return true;
|
|
381
|
+
if (!value.startsWith(operationPrefix))
|
|
382
|
+
return false;
|
|
383
|
+
const remainder = value.slice(operationPrefix.length);
|
|
384
|
+
const closingQuote = remainder.indexOf('"');
|
|
385
|
+
if (closingQuote === -1) {
|
|
386
|
+
return remainder.length === 0 || /^[a-z0-9][a-z0-9-]*$/u.test(remainder);
|
|
387
|
+
}
|
|
388
|
+
const operationId = remainder.slice(0, closingQuote);
|
|
389
|
+
if (!/^[a-z0-9][a-z0-9-]*$/u.test(operationId))
|
|
390
|
+
return false;
|
|
391
|
+
return isStrictLiteralPrefix(remainder.slice(closingQuote), '"}');
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Legacy writers appended JSON and the trailing newline in one write. A crash
|
|
395
|
+
* could therefore leave only a prefix of the canonical event serialization.
|
|
396
|
+
* Do not treat arbitrary invalid JSON as recoverable: the final bytes must be a
|
|
397
|
+
* strict prefix of an event this runtime could have generated for the next
|
|
398
|
+
* sequence number.
|
|
399
|
+
*/
|
|
400
|
+
function isRecognizedIncompleteEventTail(source, sequence) {
|
|
401
|
+
if (source.length === 0 ||
|
|
402
|
+
Buffer.byteLength(source, 'utf8') > NATIVE_TRANSACTION_EVENT_MAX_BYTES) {
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
const prefix = `{"sequence":${sequence},"timestamp":"`;
|
|
406
|
+
if (isStrictLiteralPrefix(source, prefix))
|
|
407
|
+
return true;
|
|
408
|
+
if (!source.startsWith(prefix))
|
|
409
|
+
return false;
|
|
410
|
+
const afterPrefix = source.slice(prefix.length);
|
|
411
|
+
const timestamp = afterPrefix.slice(0, Math.min(24, afterPrefix.length));
|
|
412
|
+
if (!matchesIsoTimestampPrefix(timestamp))
|
|
413
|
+
return false;
|
|
414
|
+
if (afterPrefix.length < 24)
|
|
415
|
+
return true;
|
|
416
|
+
if (!validTimestamp(timestamp))
|
|
417
|
+
return false;
|
|
418
|
+
const typePrefix = '","type":"';
|
|
419
|
+
const afterTimestamp = afterPrefix.slice(24);
|
|
420
|
+
if (isStrictLiteralPrefix(afterTimestamp, typePrefix))
|
|
421
|
+
return true;
|
|
422
|
+
if (!afterTimestamp.startsWith(typePrefix))
|
|
423
|
+
return false;
|
|
424
|
+
const typeAndSuffix = afterTimestamp.slice(typePrefix.length);
|
|
425
|
+
for (const type of EVENT_TYPES) {
|
|
426
|
+
if (isStrictLiteralPrefix(typeAndSuffix, type))
|
|
427
|
+
return true;
|
|
428
|
+
if (!typeAndSuffix.startsWith(type))
|
|
429
|
+
continue;
|
|
430
|
+
const suffix = typeAndSuffix.slice(type.length);
|
|
431
|
+
if (type === 'operation-started' || type === 'operation-completed') {
|
|
432
|
+
if (couldCompleteOperationEventSuffix(suffix))
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
else if (isStrictLiteralPrefix(suffix, '"}')) {
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
function parseEventLine(source, line) {
|
|
442
|
+
if (source.length === 0)
|
|
443
|
+
throw new Error('Blank transaction event line');
|
|
444
|
+
if (Buffer.byteLength(source, 'utf8') > NATIVE_TRANSACTION_EVENT_MAX_BYTES) {
|
|
445
|
+
throw new Error(`Native transaction event at line ${line} is too large`);
|
|
446
|
+
}
|
|
447
|
+
return parseEvent(JSON.parse(source), line);
|
|
448
|
+
}
|
|
449
|
+
function parseEventLogSource(source) {
|
|
450
|
+
const entries = source.split('\n');
|
|
451
|
+
const terminated = entries.at(-1) === '';
|
|
452
|
+
if (terminated)
|
|
453
|
+
entries.pop();
|
|
454
|
+
if (entries.length > NATIVE_TRANSACTION_EVENT_MAX_COUNT) {
|
|
455
|
+
throw new Error(`Native transaction event log exceeds ${NATIVE_TRANSACTION_EVENT_MAX_COUNT} events`);
|
|
456
|
+
}
|
|
457
|
+
const events = [];
|
|
458
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
459
|
+
const line = index + 1;
|
|
460
|
+
const raw = entries[index];
|
|
461
|
+
const entry = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
|
|
462
|
+
const finalUnterminated = !terminated && index === entries.length - 1;
|
|
463
|
+
try {
|
|
464
|
+
events.push(parseEventLine(entry, line));
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
if (finalUnterminated) {
|
|
468
|
+
let syntacticallyComplete = false;
|
|
469
|
+
try {
|
|
470
|
+
JSON.parse(entry);
|
|
471
|
+
syntacticallyComplete = true;
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
// Only a canonical event prefix is a recoverable crash tail.
|
|
475
|
+
}
|
|
476
|
+
if (!syntacticallyComplete && isRecognizedIncompleteEventTail(entry, line))
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
throw new Error(`Invalid Native transaction event at line ${line}`, { cause: error });
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return events;
|
|
483
|
+
}
|
|
484
|
+
function canonicalEventLogSource(events) {
|
|
485
|
+
return events.length === 0 ? '' : `${events.map((event) => JSON.stringify(event)).join('\n')}\n`;
|
|
486
|
+
}
|
|
487
|
+
function transactionDir(paths, id) {
|
|
488
|
+
if (!/^[a-f0-9-]{8,}$/u.test(id))
|
|
489
|
+
throw new Error(`Invalid Native transaction id: ${id}`);
|
|
490
|
+
return path.join(paths.transactionsDir, id);
|
|
491
|
+
}
|
|
492
|
+
export function nativeTransactionPaths(paths, id) {
|
|
493
|
+
const directory = transactionDir(paths, id);
|
|
494
|
+
return {
|
|
495
|
+
directory,
|
|
496
|
+
journal: path.join(directory, 'transaction.json'),
|
|
497
|
+
events: path.join(directory, 'events.jsonl'),
|
|
498
|
+
staged: path.join(directory, 'staged'),
|
|
499
|
+
backups: path.join(directory, 'backups'),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
export async function resolveNativeTransactionPaths(paths, id) {
|
|
503
|
+
const transaction = nativeTransactionPaths(paths, id);
|
|
504
|
+
await Promise.all(Object.values(transaction).map((target) => resolveContainedNativePath(paths.nativeRoot, target)));
|
|
505
|
+
return transaction;
|
|
506
|
+
}
|
|
507
|
+
function resolveRefLexically(paths, ref) {
|
|
508
|
+
if (ref.length === 0 ||
|
|
509
|
+
path.isAbsolute(ref) ||
|
|
510
|
+
/^(?:[A-Za-z]:|~|[\\/])/u.test(ref) ||
|
|
511
|
+
ref.split(/[\\/]/u).includes('..')) {
|
|
512
|
+
throw new Error(`Unsafe Native transaction ref: ${ref}`);
|
|
513
|
+
}
|
|
514
|
+
const target = path.resolve(paths.nativeRoot, ...ref.split(/[\\/]/u));
|
|
515
|
+
if (!isInsidePath(paths.nativeRoot, target))
|
|
516
|
+
throw new Error(`Unsafe Native transaction ref: ${ref}`);
|
|
517
|
+
return target;
|
|
518
|
+
}
|
|
519
|
+
async function resolveRef(paths, ref) {
|
|
520
|
+
return resolveContainedNativePath(paths.nativeRoot, resolveRefLexically(paths, ref));
|
|
521
|
+
}
|
|
522
|
+
async function exists(file) {
|
|
523
|
+
try {
|
|
524
|
+
await fs.access(file);
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
catch (error) {
|
|
528
|
+
if (error.code === 'ENOENT')
|
|
529
|
+
return false;
|
|
530
|
+
throw error;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
async function readEventLogSnapshot(paths, id, options = {}) {
|
|
534
|
+
const tx = await resolveNativeTransactionPaths(paths, id);
|
|
535
|
+
try {
|
|
536
|
+
await fs.lstat(tx.events);
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
if (error.code === 'ENOENT') {
|
|
540
|
+
return {
|
|
541
|
+
exists: false,
|
|
542
|
+
hash: null,
|
|
543
|
+
size: 0,
|
|
544
|
+
events: [],
|
|
545
|
+
canonicalSource: '',
|
|
546
|
+
needsRepair: false,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
throw error;
|
|
550
|
+
}
|
|
551
|
+
try {
|
|
552
|
+
const snapshot = await readNativeProtectedFile({
|
|
553
|
+
root: paths.nativeRoot,
|
|
554
|
+
file: tx.events,
|
|
555
|
+
maxBytes: NATIVE_TRANSACTION_EVENTS_MAX_BYTES,
|
|
556
|
+
label: `Native transaction event log ${id}`,
|
|
557
|
+
hooks: options.hooks,
|
|
558
|
+
});
|
|
559
|
+
let source;
|
|
560
|
+
try {
|
|
561
|
+
source = UTF8_DECODER.decode(snapshot.bytes);
|
|
562
|
+
}
|
|
563
|
+
catch (error) {
|
|
564
|
+
throw new Error(`Native transaction event log ${id} is not valid UTF-8`, { cause: error });
|
|
565
|
+
}
|
|
566
|
+
const events = parseEventLogSource(source);
|
|
567
|
+
const canonicalSource = canonicalEventLogSource(events);
|
|
568
|
+
return {
|
|
569
|
+
exists: true,
|
|
570
|
+
hash: snapshot.hash,
|
|
571
|
+
size: snapshot.size,
|
|
572
|
+
events,
|
|
573
|
+
canonicalSource,
|
|
574
|
+
needsRepair: source !== canonicalSource,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
catch (error) {
|
|
578
|
+
if (error.code === 'ENOENT') {
|
|
579
|
+
throw new Error(`Native transaction event log ${id} changed while reading`, {
|
|
580
|
+
cause: error,
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
throw error;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
async function assertEventLogSnapshotUnchanged(paths, id, expected) {
|
|
587
|
+
const actual = await readEventLogSnapshot(paths, id);
|
|
588
|
+
if (actual.exists !== expected.exists ||
|
|
589
|
+
actual.hash !== expected.hash ||
|
|
590
|
+
actual.size !== expected.size) {
|
|
591
|
+
throw new Error(`Native transaction event log ${id} changed before append`);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
export async function appendNativeTransactionEvent(paths, id, type, operationId) {
|
|
595
|
+
const tx = await resolveNativeTransactionPaths(paths, id);
|
|
596
|
+
const snapshot = await readEventLogSnapshot(paths, id);
|
|
597
|
+
const existing = snapshot.events.find((event) => event.type === type && event.operationId === operationId);
|
|
598
|
+
if (existing) {
|
|
599
|
+
if (snapshot.needsRepair) {
|
|
600
|
+
await atomicWriteText(tx.events, snapshot.canonicalSource, {
|
|
601
|
+
containedRoot: paths.nativeRoot,
|
|
602
|
+
beforeCommit: () => assertEventLogSnapshotUnchanged(paths, id, snapshot),
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
return existing;
|
|
606
|
+
}
|
|
607
|
+
if (snapshot.events.length >= NATIVE_TRANSACTION_EVENT_MAX_COUNT) {
|
|
608
|
+
throw new Error(`Native transaction event log ${id} exceeds ${NATIVE_TRANSACTION_EVENT_MAX_COUNT} events`);
|
|
609
|
+
}
|
|
610
|
+
const event = {
|
|
611
|
+
sequence: snapshot.events.length + 1,
|
|
612
|
+
timestamp: new Date().toISOString(),
|
|
613
|
+
type,
|
|
614
|
+
...(operationId ? { operationId } : {}),
|
|
615
|
+
};
|
|
616
|
+
parseEvent(event, event.sequence);
|
|
617
|
+
await fs.mkdir(tx.directory, { recursive: true });
|
|
618
|
+
await atomicWriteText(tx.events, canonicalEventLogSource([...snapshot.events, event]), {
|
|
619
|
+
containedRoot: paths.nativeRoot,
|
|
620
|
+
beforeCommit: () => assertEventLogSnapshotUnchanged(paths, id, snapshot),
|
|
621
|
+
});
|
|
622
|
+
return event;
|
|
623
|
+
}
|
|
624
|
+
export async function createNativeTransaction(paths, journal) {
|
|
625
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
626
|
+
throw new Error('Native Archive v2 transactions require the content-bound transaction API');
|
|
627
|
+
}
|
|
628
|
+
journal = parseJournal(journal);
|
|
629
|
+
const tx = await resolveNativeTransactionPaths(paths, journal.id);
|
|
630
|
+
await fs.mkdir(tx.staged, { recursive: true });
|
|
631
|
+
await fs.mkdir(tx.backups, { recursive: true });
|
|
632
|
+
await atomicWriteJson(tx.journal, journal);
|
|
633
|
+
await appendNativeTransactionEvent(paths, journal.id, 'prepared');
|
|
634
|
+
}
|
|
635
|
+
export async function readNativeTransaction(paths, id, options = {}) {
|
|
636
|
+
const tx = await resolveNativeTransactionPaths(paths, id);
|
|
637
|
+
const snapshot = await readNativeProtectedFile({
|
|
638
|
+
root: paths.nativeRoot,
|
|
639
|
+
file: tx.journal,
|
|
640
|
+
maxBytes: NATIVE_TRANSACTION_JOURNAL_MAX_BYTES,
|
|
641
|
+
label: `Native transaction journal ${id}`,
|
|
642
|
+
hooks: options.hooks,
|
|
643
|
+
});
|
|
644
|
+
const value = JSON.parse(UTF8_DECODER.decode(snapshot.bytes));
|
|
645
|
+
const journal = parseJournal(value);
|
|
646
|
+
if (journal.id !== id) {
|
|
647
|
+
throw new Error(`Invalid Native transaction journal: ${id}`);
|
|
648
|
+
}
|
|
649
|
+
return journal;
|
|
650
|
+
}
|
|
651
|
+
export async function readNativeTransactionEvents(paths, id, options = {}) {
|
|
652
|
+
return (await readEventLogSnapshot(paths, id, options)).events;
|
|
653
|
+
}
|
|
654
|
+
export async function setNativeTransactionStatus(paths, journal, status) {
|
|
655
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
656
|
+
throw new Error('Native Archive v2 transactions require the content-bound transaction API');
|
|
657
|
+
}
|
|
658
|
+
const updated = parseJournal({ ...journal, status });
|
|
659
|
+
await atomicWriteJson((await resolveNativeTransactionPaths(paths, journal.id)).journal, updated);
|
|
660
|
+
return updated;
|
|
661
|
+
}
|
|
662
|
+
async function readLegacyTransactionFile(paths, file, label) {
|
|
663
|
+
try {
|
|
664
|
+
return await readNativeProtectedFile({
|
|
665
|
+
root: paths.nativeRoot,
|
|
666
|
+
file,
|
|
667
|
+
maxBytes: NATIVE_LEGACY_TRANSACTION_FILE_MAX_BYTES,
|
|
668
|
+
label,
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
catch (error) {
|
|
672
|
+
if (error.code === 'ENOENT')
|
|
673
|
+
return null;
|
|
674
|
+
throw error;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
async function copyAtomic(paths, source, target, label) {
|
|
678
|
+
const sourceSnapshot = await readLegacyTransactionFile(paths, source, `${label} source`);
|
|
679
|
+
if (!sourceSnapshot)
|
|
680
|
+
throw new Error(`${label} source does not exist`);
|
|
681
|
+
const targetSnapshot = await readLegacyTransactionFile(paths, target, `${label} target`);
|
|
682
|
+
await ensureNativeProtectedDirectory({
|
|
683
|
+
root: paths.nativeRoot,
|
|
684
|
+
directory: path.dirname(target),
|
|
685
|
+
label: `${label} target parent`,
|
|
686
|
+
});
|
|
687
|
+
await copyNativeProtectedFile({
|
|
688
|
+
sourceRoot: paths.nativeRoot,
|
|
689
|
+
source,
|
|
690
|
+
targetRoot: paths.nativeRoot,
|
|
691
|
+
target,
|
|
692
|
+
maxBytes: NATIVE_LEGACY_TRANSACTION_FILE_MAX_BYTES,
|
|
693
|
+
label,
|
|
694
|
+
expectedHash: sourceSnapshot.hash,
|
|
695
|
+
expectedTargetHash: targetSnapshot?.hash ?? null,
|
|
696
|
+
exclusive: targetSnapshot === null,
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
async function removeLegacyTransactionFile(paths, file, label) {
|
|
700
|
+
const snapshot = await readLegacyTransactionFile(paths, file, label);
|
|
701
|
+
if (!snapshot)
|
|
702
|
+
return;
|
|
703
|
+
await removeNativeProtectedFile({
|
|
704
|
+
root: paths.nativeRoot,
|
|
705
|
+
file,
|
|
706
|
+
maxBytes: NATIVE_LEGACY_TRANSACTION_FILE_MAX_BYTES,
|
|
707
|
+
expectedHash: snapshot.hash,
|
|
708
|
+
expectedSize: snapshot.size,
|
|
709
|
+
label,
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
async function backupTarget(paths, operation) {
|
|
713
|
+
if (!operation.backup)
|
|
714
|
+
return;
|
|
715
|
+
const target = await resolveRef(paths, operation.target);
|
|
716
|
+
const backup = await resolveRef(paths, operation.backup);
|
|
717
|
+
if (!(await exists(target)) || (await exists(backup)))
|
|
718
|
+
return;
|
|
719
|
+
await copyAtomic(paths, target, backup, `Legacy Native transaction backup ${operation.id}`);
|
|
720
|
+
}
|
|
721
|
+
async function applyOperation(paths, operation) {
|
|
722
|
+
const target = await resolveRef(paths, operation.target);
|
|
723
|
+
if (operation.type === 'write') {
|
|
724
|
+
if (!operation.staged)
|
|
725
|
+
throw new Error(`Write operation ${operation.id} has no staged ref`);
|
|
726
|
+
await backupTarget(paths, operation);
|
|
727
|
+
await copyAtomic(paths, await resolveRef(paths, operation.staged), target, `Legacy Native transaction write ${operation.id}`);
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
if (operation.type === 'remove') {
|
|
731
|
+
await backupTarget(paths, operation);
|
|
732
|
+
await removeLegacyTransactionFile(paths, target, `Legacy Native transaction remove ${operation.id}`);
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
if (!operation.source)
|
|
736
|
+
throw new Error(`Move operation ${operation.id} has no source ref`);
|
|
737
|
+
const source = await resolveRef(paths, operation.source);
|
|
738
|
+
const [sourceExists, targetExists] = await Promise.all([exists(source), exists(target)]);
|
|
739
|
+
if (!sourceExists && targetExists) {
|
|
740
|
+
const targetDirectory = await readNativeProtectedDirectory({
|
|
741
|
+
root: paths.nativeRoot,
|
|
742
|
+
directory: target,
|
|
743
|
+
label: `Legacy Native transaction move target ${operation.id}`,
|
|
744
|
+
maxEntries: NATIVE_LEGACY_TRANSACTION_DIRECTORY_MAX_ENTRIES,
|
|
745
|
+
});
|
|
746
|
+
await targetDirectory.verify();
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
749
|
+
if (targetExists)
|
|
750
|
+
throw new Error(`Move target already exists: ${operation.target}`);
|
|
751
|
+
if (!sourceExists)
|
|
752
|
+
throw new Error(`Move source does not exist: ${operation.source}`);
|
|
753
|
+
await moveNativeProtectedDirectory({
|
|
754
|
+
root: paths.nativeRoot,
|
|
755
|
+
source,
|
|
756
|
+
target,
|
|
757
|
+
label: `Legacy Native transaction move ${operation.id}`,
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
export async function applyNativeTransaction(paths, journal, hooks) {
|
|
761
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
762
|
+
throw new Error('Native Archive v2 transactions require the content-bound transaction API');
|
|
763
|
+
}
|
|
764
|
+
let current = journal.status === 'prepared'
|
|
765
|
+
? await setNativeTransactionStatus(paths, journal, 'applying')
|
|
766
|
+
: journal;
|
|
767
|
+
const events = await readNativeTransactionEvents(paths, journal.id);
|
|
768
|
+
const completed = new Set(events
|
|
769
|
+
.filter((event) => event.type === 'operation-completed')
|
|
770
|
+
.map((event) => event.operationId));
|
|
771
|
+
let completedCount = completed.size;
|
|
772
|
+
for (const operation of current.operations) {
|
|
773
|
+
if (completed.has(operation.id))
|
|
774
|
+
continue;
|
|
775
|
+
await appendNativeTransactionEvent(paths, current.id, 'operation-started', operation.id);
|
|
776
|
+
await applyOperation(paths, operation);
|
|
777
|
+
await appendNativeTransactionEvent(paths, current.id, 'operation-completed', operation.id);
|
|
778
|
+
completedCount += 1;
|
|
779
|
+
await hooks?.afterOperation?.(operation, completedCount);
|
|
780
|
+
}
|
|
781
|
+
current = await readNativeTransaction(paths, current.id);
|
|
782
|
+
return current;
|
|
783
|
+
}
|
|
784
|
+
async function rollbackOperation(paths, operation) {
|
|
785
|
+
const target = await resolveRef(paths, operation.target);
|
|
786
|
+
const backup = operation.backup ? await resolveRef(paths, operation.backup) : null;
|
|
787
|
+
if (operation.type === 'move') {
|
|
788
|
+
if (!operation.source)
|
|
789
|
+
throw new Error(`Move operation ${operation.id} has no source ref`);
|
|
790
|
+
const source = await resolveRef(paths, operation.source);
|
|
791
|
+
if (await exists(target)) {
|
|
792
|
+
if (await exists(source)) {
|
|
793
|
+
throw new Error(`Legacy Native rollback source already exists: ${operation.source}`);
|
|
794
|
+
}
|
|
795
|
+
await moveNativeProtectedDirectory({
|
|
796
|
+
root: paths.nativeRoot,
|
|
797
|
+
source: target,
|
|
798
|
+
target: source,
|
|
799
|
+
label: `Legacy Native transaction rollback move ${operation.id}`,
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
804
|
+
if (backup && (await exists(backup))) {
|
|
805
|
+
await copyAtomic(paths, backup, target, `Legacy Native transaction rollback restore ${operation.id}`);
|
|
806
|
+
}
|
|
807
|
+
else {
|
|
808
|
+
await removeLegacyTransactionFile(paths, target, `Legacy Native transaction rollback remove ${operation.id}`);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
export async function rollbackNativeTransaction(paths, journal) {
|
|
812
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
813
|
+
throw new Error('Native Archive v2 transactions require the content-bound transaction API');
|
|
814
|
+
}
|
|
815
|
+
const events = await readNativeTransactionEvents(paths, journal.id);
|
|
816
|
+
if (events.some((event) => event.type === 'archive-finalization-started' || event.type === 'archive-finalized')) {
|
|
817
|
+
throw new Error('An archive whose finalization started can only be recovered by continuing it');
|
|
818
|
+
}
|
|
819
|
+
let current = await setNativeTransactionStatus(paths, journal, 'rolling-back');
|
|
820
|
+
await appendNativeTransactionEvent(paths, current.id, 'rollback-started');
|
|
821
|
+
const started = new Set(events
|
|
822
|
+
.filter((event) => event.type === 'operation-started' || event.type === 'operation-completed')
|
|
823
|
+
.map((event) => event.operationId));
|
|
824
|
+
for (const operation of [...current.operations].reverse()) {
|
|
825
|
+
if (started.has(operation.id))
|
|
826
|
+
await rollbackOperation(paths, operation);
|
|
827
|
+
}
|
|
828
|
+
await appendNativeTransactionEvent(paths, current.id, 'rollback-completed');
|
|
829
|
+
current = await setNativeTransactionStatus(paths, current, 'rolled-back');
|
|
830
|
+
return current;
|
|
831
|
+
}
|
|
832
|
+
export async function finalizeNativeTransaction(paths, journal, event) {
|
|
833
|
+
if (journal.schema !== 'comet.native.transaction.v1') {
|
|
834
|
+
throw new Error('Native Archive v2 transactions require the content-bound transaction API');
|
|
835
|
+
}
|
|
836
|
+
await appendNativeTransactionEvent(paths, journal.id, event);
|
|
837
|
+
return event === 'commit' ? setNativeTransactionStatus(paths, journal, 'committed') : journal;
|
|
838
|
+
}
|
|
839
|
+
export function nativeRootRef(paths, target) {
|
|
840
|
+
const absolute = path.resolve(target);
|
|
841
|
+
if (!isInsidePath(paths.nativeRoot, absolute)) {
|
|
842
|
+
throw new Error(`Path is outside the Native root: ${target}`);
|
|
843
|
+
}
|
|
844
|
+
return path.relative(paths.nativeRoot, absolute).split(path.sep).join('/');
|
|
845
|
+
}
|
|
846
|
+
//# sourceMappingURL=native-transaction.js.map
|