project-tiny-context-harness 0.8.17 → 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.
Files changed (488) hide show
  1. package/README.md +93 -30
  2. package/assets/README.md +158 -44
  3. package/assets/README.zh-CN.md +88 -29
  4. package/assets/agents/AGENTS_CORE.md +2 -2
  5. package/assets/context_templates/context.toml +6 -1
  6. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_helpers.cs +301 -0
  7. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_run.cs +197 -0
  8. package/assets/runtime/windows-job-supervisor/formal_process_supervisor_native_types.cs +215 -0
  9. package/assets/runtime/windows-job-supervisor/windows_job_process_supervisor.ps1 +117 -0
  10. package/assets/skills/design-resource-authoring/SKILL.md +6 -3
  11. package/assets/skills/design-resource-authoring/references/authority-delta-assessment.md +52 -0
  12. package/assets/skills/design-resource-authoring/references/downstream-handoff.md +5 -1
  13. package/assets/skills/design-system-authoring/SKILL.md +23 -17
  14. package/assets/skills/design-system-authoring/references/authority-adoption.md +19 -9
  15. package/assets/skills/design-system-authoring/references/open-design-design-system-provider.md +4 -0
  16. package/assets/skills/long-task-workflow/SKILL.md +6 -6
  17. package/assets/skills/long-task-workflow/references/authority-lifecycle.md +10 -4
  18. package/assets/skills/long-task-workflow/references/contract-authoring.md +5 -5
  19. package/assets/skills/long-task-workflow/references/evidence-design.md +14 -3
  20. package/assets/skills/long-task-workflow/references/source-authoring.md +11 -8
  21. package/assets/tools/context_rules.json +53 -0
  22. package/assets/tools/validate_context.py +302 -77
  23. package/dist/cli.js +2 -1
  24. package/dist/commands/context-create.d.ts +1 -0
  25. package/dist/commands/context-create.js +90 -0
  26. package/dist/commands/context-inspect.d.ts +1 -0
  27. package/dist/commands/context-inspect.js +98 -0
  28. package/dist/commands/context-move.d.ts +1 -0
  29. package/dist/commands/context-move.js +78 -0
  30. package/dist/commands/context-register.d.ts +1 -0
  31. package/dist/commands/context-register.js +110 -0
  32. package/dist/commands/context-transaction.d.ts +1 -0
  33. package/dist/commands/context-transaction.js +84 -0
  34. package/dist/commands/context.d.ts +1 -0
  35. package/dist/commands/context.js +36 -0
  36. package/dist/commands/design-authority-delta.d.ts +1 -0
  37. package/dist/commands/design-authority-delta.js +53 -0
  38. package/dist/commands/design-authority.d.ts +1 -0
  39. package/dist/commands/design-authority.js +104 -0
  40. package/dist/commands/design-resource.js +8 -1
  41. package/dist/commands/doctor.d.ts +1 -1
  42. package/dist/commands/doctor.js +61 -3
  43. package/dist/commands/index.js +19 -2
  44. package/dist/commands/long-task-authoring.js +20 -2
  45. package/dist/commands/long-task-workdir.d.ts +2 -0
  46. package/dist/commands/long-task-workdir.js +23 -0
  47. package/dist/commands/long-task.js +75 -6
  48. package/dist/commands/route.d.ts +15 -0
  49. package/dist/commands/route.js +142 -0
  50. package/dist/index.d.ts +3 -13
  51. package/dist/index.js +3 -12
  52. package/dist/lib/cli-exit.d.ts +14 -0
  53. package/dist/lib/cli-exit.js +19 -0
  54. package/dist/lib/context-catalog/catalog-default-footprint.d.ts +3 -0
  55. package/dist/lib/context-catalog/catalog-default-footprint.js +53 -0
  56. package/dist/lib/context-catalog/catalog-diagnostics.d.ts +9 -0
  57. package/dist/lib/context-catalog/catalog-diagnostics.js +34 -0
  58. package/dist/lib/context-catalog/catalog-discovery.d.ts +7 -0
  59. package/dist/lib/context-catalog/catalog-discovery.js +81 -0
  60. package/dist/lib/context-catalog/catalog-load.d.ts +8 -0
  61. package/dist/lib/context-catalog/catalog-load.js +187 -0
  62. package/dist/lib/context-catalog/catalog-path-validation.d.ts +7 -0
  63. package/dist/lib/context-catalog/catalog-path-validation.js +62 -0
  64. package/dist/lib/context-catalog/catalog-paths.d.ts +11 -0
  65. package/dist/lib/context-catalog/catalog-paths.js +41 -0
  66. package/dist/lib/context-catalog/catalog-portable-contract.d.ts +15 -0
  67. package/dist/lib/context-catalog/catalog-portable-contract.js +68 -0
  68. package/dist/lib/context-catalog/catalog-staged-path-safety.d.ts +1 -0
  69. package/dist/lib/context-catalog/catalog-staged-path-safety.js +36 -0
  70. package/dist/lib/context-catalog/catalog-types.d.ts +40 -0
  71. package/dist/lib/context-catalog/catalog-types.js +1 -0
  72. package/dist/lib/context-catalog/catalog-validation.d.ts +9 -0
  73. package/dist/lib/context-catalog/catalog-validation.js +148 -0
  74. package/dist/lib/context-create/context-create-path.d.ts +2 -0
  75. package/dist/lib/context-create/context-create-path.js +30 -0
  76. package/dist/lib/context-create/context-create-template.d.ts +2 -0
  77. package/dist/lib/context-create/context-create-template.js +95 -0
  78. package/dist/lib/context-create/context-create-types.d.ts +28 -0
  79. package/dist/lib/context-create/context-create-types.js +1 -0
  80. package/dist/lib/context-create/context-create-write.d.ts +1 -0
  81. package/dist/lib/context-create/context-create-write.js +85 -0
  82. package/dist/lib/context-create/context-create.d.ts +2 -0
  83. package/dist/lib/context-create/context-create.js +84 -0
  84. package/dist/lib/context-default-footprint.d.ts +2 -3
  85. package/dist/lib/context-default-footprint.js +49 -57
  86. package/dist/lib/context-doctor/context-doctor-types.d.ts +16 -0
  87. package/dist/lib/context-doctor/context-doctor-types.js +15 -0
  88. package/dist/lib/context-doctor/context-doctor.d.ts +2 -0
  89. package/dist/lib/context-doctor/context-doctor.js +130 -0
  90. package/dist/lib/context-graph-snapshot.d.ts +5 -0
  91. package/dist/lib/context-graph-snapshot.js +46 -25
  92. package/dist/lib/context-inspect/context-inspect-projection.d.ts +9 -0
  93. package/dist/lib/context-inspect/context-inspect-projection.js +49 -0
  94. package/dist/lib/context-inspect/context-inspect-render.d.ts +2 -0
  95. package/dist/lib/context-inspect/context-inspect-render.js +29 -0
  96. package/dist/lib/context-inspect/context-inspect-types.d.ts +43 -0
  97. package/dist/lib/context-inspect/context-inspect-types.js +1 -0
  98. package/dist/lib/context-inspect/context-inspect.d.ts +2 -0
  99. package/dist/lib/context-inspect/context-inspect.js +104 -0
  100. package/dist/lib/context-manifest-schema.d.ts +1 -1
  101. package/dist/lib/context-manifest-schema.js +4 -20
  102. package/dist/lib/context-markdown/context-markdown-analysis.d.ts +15 -0
  103. package/dist/lib/context-markdown/context-markdown-analysis.js +245 -0
  104. package/dist/lib/context-markdown/context-markdown-extract.d.ts +7 -0
  105. package/dist/lib/context-markdown/context-markdown-extract.js +114 -0
  106. package/dist/lib/context-markdown/context-markdown-types.d.ts +57 -0
  107. package/dist/lib/context-markdown/context-markdown-types.js +1 -0
  108. package/dist/lib/context-move/context-move-input.d.ts +8 -0
  109. package/dist/lib/context-move/context-move-input.js +17 -0
  110. package/dist/lib/context-move/context-move-literal-scan.d.ts +20 -0
  111. package/dist/lib/context-move/context-move-literal-scan.js +213 -0
  112. package/dist/lib/context-move/context-move-live-validation.d.ts +3 -0
  113. package/dist/lib/context-move/context-move-live-validation.js +56 -0
  114. package/dist/lib/context-move/context-move-markdown-plan.d.ts +22 -0
  115. package/dist/lib/context-move/context-move-markdown-plan.js +39 -0
  116. package/dist/lib/context-move/context-move-projection.d.ts +3 -0
  117. package/dist/lib/context-move/context-move-projection.js +11 -0
  118. package/dist/lib/context-move/context-move-reference-validation.d.ts +11 -0
  119. package/dist/lib/context-move/context-move-reference-validation.js +64 -0
  120. package/dist/lib/context-move/context-move-render.d.ts +2 -0
  121. package/dist/lib/context-move/context-move-render.js +24 -0
  122. package/dist/lib/context-move/context-move-support.d.ts +10 -0
  123. package/dist/lib/context-move/context-move-support.js +88 -0
  124. package/dist/lib/context-move/context-move-transaction-plan.d.ts +24 -0
  125. package/dist/lib/context-move/context-move-transaction-plan.js +108 -0
  126. package/dist/lib/context-move/context-move-types.d.ts +74 -0
  127. package/dist/lib/context-move/context-move-types.js +1 -0
  128. package/dist/lib/context-move/context-move.d.ts +8 -0
  129. package/dist/lib/context-move/context-move.js +180 -0
  130. package/dist/lib/context-mutation/manifest-lossless-patch.d.ts +28 -0
  131. package/dist/lib/context-mutation/manifest-lossless-patch.js +208 -0
  132. package/dist/lib/context-mutation/markdown-link-patch.d.ts +34 -0
  133. package/dist/lib/context-mutation/markdown-link-patch.js +143 -0
  134. package/dist/lib/context-mutation/markdown-link-spans.d.ts +10 -0
  135. package/dist/lib/context-mutation/markdown-link-spans.js +179 -0
  136. package/dist/lib/context-mutation/mutation-cas.d.ts +13 -0
  137. package/dist/lib/context-mutation/mutation-cas.js +365 -0
  138. package/dist/lib/context-mutation/mutation-command-support.d.ts +12 -0
  139. package/dist/lib/context-mutation/mutation-command-support.js +57 -0
  140. package/dist/lib/context-mutation/mutation-commit.d.ts +12 -0
  141. package/dist/lib/context-mutation/mutation-commit.js +89 -0
  142. package/dist/lib/context-mutation/mutation-directories.d.ts +5 -0
  143. package/dist/lib/context-mutation/mutation-directories.js +56 -0
  144. package/dist/lib/context-mutation/mutation-file-state.d.ts +14 -0
  145. package/dist/lib/context-mutation/mutation-file-state.js +137 -0
  146. package/dist/lib/context-mutation/mutation-journal-file-validation.d.ts +1 -0
  147. package/dist/lib/context-mutation/mutation-journal-file-validation.js +106 -0
  148. package/dist/lib/context-mutation/mutation-journal-io.d.ts +5 -0
  149. package/dist/lib/context-mutation/mutation-journal-io.js +55 -0
  150. package/dist/lib/context-mutation/mutation-journal-storage.d.ts +18 -0
  151. package/dist/lib/context-mutation/mutation-journal-storage.js +283 -0
  152. package/dist/lib/context-mutation/mutation-journal-validation-support.d.ts +16 -0
  153. package/dist/lib/context-mutation/mutation-journal-validation-support.js +140 -0
  154. package/dist/lib/context-mutation/mutation-journal-validation.d.ts +3 -0
  155. package/dist/lib/context-mutation/mutation-journal-validation.js +177 -0
  156. package/dist/lib/context-mutation/mutation-journal.d.ts +8 -0
  157. package/dist/lib/context-mutation/mutation-journal.js +111 -0
  158. package/dist/lib/context-mutation/mutation-live-validation.d.ts +3 -0
  159. package/dist/lib/context-mutation/mutation-live-validation.js +51 -0
  160. package/dist/lib/context-mutation/mutation-long-task-guard.d.ts +6 -0
  161. package/dist/lib/context-mutation/mutation-long-task-guard.js +57 -0
  162. package/dist/lib/context-mutation/mutation-recovery.d.ts +4 -0
  163. package/dist/lib/context-mutation/mutation-recovery.js +189 -0
  164. package/dist/lib/context-mutation/mutation-staged-fs.d.ts +5 -0
  165. package/dist/lib/context-mutation/mutation-staged-fs.js +56 -0
  166. package/dist/lib/context-mutation/mutation-types.d.ts +103 -0
  167. package/dist/lib/context-mutation/mutation-types.js +1 -0
  168. package/dist/lib/context-register/context-register-input.d.ts +11 -0
  169. package/dist/lib/context-register/context-register-input.js +43 -0
  170. package/dist/lib/context-register/context-register-render.d.ts +2 -0
  171. package/dist/lib/context-register/context-register-render.js +21 -0
  172. package/dist/lib/context-register/context-register-support.d.ts +6 -0
  173. package/dist/lib/context-register/context-register-support.js +46 -0
  174. package/dist/lib/context-register/context-register-types.d.ts +46 -0
  175. package/dist/lib/context-register/context-register-types.js +1 -0
  176. package/dist/lib/context-register/context-register.d.ts +8 -0
  177. package/dist/lib/context-register/context-register.js +155 -0
  178. package/dist/lib/context-router/context-route-budget.d.ts +15 -0
  179. package/dist/lib/context-router/context-route-budget.js +14 -0
  180. package/dist/lib/context-router/context-route-candidates.d.ts +15 -0
  181. package/dist/lib/context-router/context-route-candidates.js +112 -0
  182. package/dist/lib/context-router/context-route-order.d.ts +6 -0
  183. package/dist/lib/context-router/context-route-order.js +53 -0
  184. package/dist/lib/context-router/context-route-paths.d.ts +16 -0
  185. package/dist/lib/context-router/context-route-paths.js +109 -0
  186. package/dist/lib/context-router/context-route-render.d.ts +2 -0
  187. package/dist/lib/context-router/context-route-render.js +32 -0
  188. package/dist/lib/context-router/context-route-scan.d.ts +18 -0
  189. package/dist/lib/context-router/context-route-scan.js +156 -0
  190. package/dist/lib/context-router/context-route-selection.d.ts +16 -0
  191. package/dist/lib/context-router/context-route-selection.js +72 -0
  192. package/dist/lib/context-router/context-route-terms.d.ts +13 -0
  193. package/dist/lib/context-router/context-route-terms.js +202 -0
  194. package/dist/lib/context-router/context-route-types.d.ts +101 -0
  195. package/dist/lib/context-router/context-route-types.js +1 -0
  196. package/dist/lib/context-router/context-route.d.ts +2 -0
  197. package/dist/lib/context-router/context-route.js +127 -0
  198. package/dist/lib/context-units-migration.d.ts +13 -0
  199. package/dist/lib/context-units-migration.js +217 -0
  200. package/dist/lib/design-authority-binding.d.ts +7 -0
  201. package/dist/lib/design-authority-binding.js +96 -0
  202. package/dist/lib/design-authority-closure.d.ts +3 -0
  203. package/dist/lib/design-authority-closure.js +201 -0
  204. package/dist/lib/design-authority-delta-codec-primitives.d.ts +10 -0
  205. package/dist/lib/design-authority-delta-codec-primitives.js +58 -0
  206. package/dist/lib/design-authority-delta-codec.d.ts +2 -0
  207. package/dist/lib/design-authority-delta-codec.js +193 -0
  208. package/dist/lib/design-authority-delta-types.d.ts +65 -0
  209. package/dist/lib/design-authority-delta-types.js +6 -0
  210. package/dist/lib/design-authority-delta-validation.d.ts +2 -0
  211. package/dist/lib/design-authority-delta-validation.js +16 -0
  212. package/dist/lib/design-authority-digest.d.ts +8 -0
  213. package/dist/lib/design-authority-digest.js +36 -0
  214. package/dist/lib/design-authority-files.d.ts +9 -0
  215. package/dist/lib/design-authority-files.js +62 -0
  216. package/dist/lib/design-authority-format.d.ts +2 -0
  217. package/dist/lib/design-authority-format.js +93 -0
  218. package/dist/lib/design-authority-links.d.ts +10 -0
  219. package/dist/lib/design-authority-links.js +137 -0
  220. package/dist/lib/design-authority-manifest.d.ts +4 -0
  221. package/dist/lib/design-authority-manifest.js +144 -0
  222. package/dist/lib/design-authority-tokens.d.ts +9 -0
  223. package/dist/lib/design-authority-tokens.js +45 -0
  224. package/dist/lib/design-authority-types.d.ts +80 -0
  225. package/dist/lib/design-authority-types.js +23 -0
  226. package/dist/lib/design-md-tool-adapter.d.ts +9 -0
  227. package/dist/lib/design-md-tool-adapter.js +152 -0
  228. package/dist/lib/design-md-tool-normalization.d.ts +7 -0
  229. package/dist/lib/design-md-tool-normalization.js +78 -0
  230. package/dist/lib/design-md-tool-types.d.ts +99 -0
  231. package/dist/lib/design-md-tool-types.js +8 -0
  232. package/dist/lib/design-resource-handoff-input-types.d.ts +1 -1
  233. package/dist/lib/design-resource-handoff-manifest-projection.js +3 -0
  234. package/dist/lib/design-resource-handoff-shape.js +14 -2
  235. package/dist/lib/design-resource-handoff-types.d.ts +3 -0
  236. package/dist/lib/design-resource-handoff-validation.js +16 -4
  237. package/dist/lib/design-resource-implementation-feasibility-validation-support.js +1 -1
  238. package/dist/lib/design-resource-recovery-current.js +22 -0
  239. package/dist/lib/design-resource-recovery-shape.js +64 -7
  240. package/dist/lib/design-resource-recovery-types.d.ts +4 -1
  241. package/dist/lib/design-resource-symbolic-fact-shape.js +7 -1
  242. package/dist/lib/design-resource-symbolic-fact-types.d.ts +3 -0
  243. package/dist/lib/design-resource-symbolic-fact-validation.js +15 -3
  244. package/dist/lib/doctor.d.ts +2 -1
  245. package/dist/lib/doctor.js +29 -1
  246. package/dist/lib/fs.js +1 -1
  247. package/dist/lib/long-task-acceptance-reachability-claims.d.ts +2 -0
  248. package/dist/lib/long-task-acceptance-reachability-claims.js +279 -0
  249. package/dist/lib/long-task-acceptance-reachability-design.d.ts +2 -0
  250. package/dist/lib/long-task-acceptance-reachability-design.js +96 -0
  251. package/dist/lib/long-task-acceptance-reachability-external.d.ts +9 -0
  252. package/dist/lib/long-task-acceptance-reachability-external.js +123 -0
  253. package/dist/lib/long-task-acceptance-reachability-helpers.d.ts +64 -0
  254. package/dist/lib/long-task-acceptance-reachability-helpers.js +473 -0
  255. package/dist/lib/long-task-acceptance-reachability-semantic.d.ts +2 -0
  256. package/dist/lib/long-task-acceptance-reachability-semantic.js +122 -0
  257. package/dist/lib/long-task-acceptance-reachability-types.d.ts +91 -0
  258. package/dist/lib/long-task-acceptance-reachability-types.js +1 -0
  259. package/dist/lib/long-task-acceptance-reachability.d.ts +4 -0
  260. package/dist/lib/long-task-acceptance-reachability.js +115 -0
  261. package/dist/lib/long-task-activation-validation.d.ts +6 -0
  262. package/dist/lib/long-task-activation-validation.js +72 -69
  263. package/dist/lib/long-task-active-authority-lock-context.d.ts +4 -0
  264. package/dist/lib/long-task-active-authority-lock-context.js +29 -0
  265. package/dist/lib/long-task-applicability-identity.d.ts +25 -0
  266. package/dist/lib/long-task-applicability-identity.js +60 -0
  267. package/dist/lib/long-task-authoring-preflight-diagnostics.js +8 -0
  268. package/dist/lib/long-task-authoring-preflight-types.d.ts +2 -0
  269. package/dist/lib/long-task-authoring-preflight-types.js +9 -0
  270. package/dist/lib/long-task-authoring-preflight.js +18 -2
  271. package/dist/lib/long-task-authority-material-diff.js +4 -0
  272. package/dist/lib/long-task-authority-materials.js +19 -0
  273. package/dist/lib/long-task-authority-policy.d.ts +3 -0
  274. package/dist/lib/long-task-authority-policy.js +3 -0
  275. package/dist/lib/long-task-authority-revision-details.js +2 -1
  276. package/dist/lib/long-task-authority-types.d.ts +2 -0
  277. package/dist/lib/long-task-authority.js +2 -0
  278. package/dist/lib/long-task-check-shape.js +6 -1
  279. package/dist/lib/long-task-claim-definitions.js +1 -3
  280. package/dist/lib/long-task-claim-semantic-proof-floor.d.ts +3 -0
  281. package/dist/lib/long-task-claim-semantic-proof-floor.js +78 -0
  282. package/dist/lib/long-task-claims.d.ts +0 -18
  283. package/dist/lib/long-task-claims.js +15 -14
  284. package/dist/lib/long-task-command-process.js +3 -0
  285. package/dist/lib/long-task-compact-authoring.js +3 -0
  286. package/dist/lib/long-task-compact-projections.js +10 -0
  287. package/dist/lib/long-task-complete-delivery-evidence-types.d.ts +38 -0
  288. package/dist/lib/long-task-complete-delivery-evidence-types.js +1 -0
  289. package/dist/lib/long-task-completion-types.d.ts +109 -0
  290. package/dist/lib/long-task-completion-types.js +1 -0
  291. package/dist/lib/long-task-conformance-policy.d.ts +2 -1
  292. package/dist/lib/long-task-conformance-policy.js +11 -4
  293. package/dist/lib/long-task-context-authority-topology.js +6 -4
  294. package/dist/lib/long-task-contract-types.d.ts +52 -1
  295. package/dist/lib/long-task-counterfactual-sandbox.d.ts +7 -1
  296. package/dist/lib/long-task-counterfactual-sandbox.js +86 -6
  297. package/dist/lib/long-task-delivery-compiler-preflight.d.ts +24 -0
  298. package/dist/lib/long-task-delivery-compiler-preflight.js +32 -0
  299. package/dist/lib/long-task-delivery-compiler.d.ts +1 -0
  300. package/dist/lib/long-task-delivery-compiler.js +59 -44
  301. package/dist/lib/long-task-delivery-parser.d.ts +3 -0
  302. package/dist/lib/long-task-delivery-parser.js +26 -8
  303. package/dist/lib/long-task-delivery-types.d.ts +2 -0
  304. package/dist/lib/long-task-delivery-types.js +2 -0
  305. package/dist/lib/long-task-delivery-validation.d.ts +6 -1
  306. package/dist/lib/long-task-delivery-validation.js +19 -4
  307. package/dist/lib/long-task-design-feasibility-binding.d.ts +1 -0
  308. package/dist/lib/long-task-design-feasibility-binding.js +3 -3
  309. package/dist/lib/long-task-design-feasibility-source-closure.js +11 -2
  310. package/dist/lib/long-task-design-obligation.d.ts +50 -0
  311. package/dist/lib/long-task-design-obligation.js +99 -0
  312. package/dist/lib/long-task-design-resource-handoff.d.ts +3 -1
  313. package/dist/lib/long-task-design-resource-handoff.js +36 -12
  314. package/dist/lib/long-task-design-resource-method-binding.js +12 -0
  315. package/dist/lib/long-task-effective-external-takeover.d.ts +15 -0
  316. package/dist/lib/long-task-effective-external-takeover.js +109 -0
  317. package/dist/lib/long-task-effective-external-ui-takeover.d.ts +5 -0
  318. package/dist/lib/long-task-effective-external-ui-takeover.js +117 -0
  319. package/dist/lib/long-task-evidence-capability-codec.js +91 -0
  320. package/dist/lib/long-task-evidence-capability-runtime.js +62 -14
  321. package/dist/lib/long-task-evidence-capability-types.d.ts +3 -2
  322. package/dist/lib/long-task-evidence-v2.d.ts +6 -1
  323. package/dist/lib/long-task-evidence-v2.js +253 -170
  324. package/dist/lib/long-task-execution-observation.d.ts +7 -0
  325. package/dist/lib/long-task-execution-observation.js +21 -4
  326. package/dist/lib/long-task-expected-authority.d.ts +4 -0
  327. package/dist/lib/long-task-expected-authority.js +126 -0
  328. package/dist/lib/long-task-external-confirmation-artifacts.d.ts +9 -0
  329. package/dist/lib/long-task-external-confirmation-artifacts.js +138 -0
  330. package/dist/lib/long-task-external-confirmation-attestation.d.ts +20 -0
  331. package/dist/lib/long-task-external-confirmation-attestation.js +115 -0
  332. package/dist/lib/long-task-external-confirmation-challenge.d.ts +23 -0
  333. package/dist/lib/long-task-external-confirmation-challenge.js +164 -0
  334. package/dist/lib/long-task-external-confirmation-context.d.ts +14 -0
  335. package/dist/lib/long-task-external-confirmation-context.js +53 -0
  336. package/dist/lib/long-task-external-confirmation-evaluation.d.ts +11 -0
  337. package/dist/lib/long-task-external-confirmation-evaluation.js +454 -0
  338. package/dist/lib/long-task-external-confirmation-expected.d.ts +8 -0
  339. package/dist/lib/long-task-external-confirmation-expected.js +200 -0
  340. package/dist/lib/long-task-external-confirmation-identity.d.ts +10 -0
  341. package/dist/lib/long-task-external-confirmation-identity.js +77 -0
  342. package/dist/lib/long-task-external-confirmation-plan.d.ts +25 -0
  343. package/dist/lib/long-task-external-confirmation-plan.js +148 -0
  344. package/dist/lib/long-task-external-confirmation-preparation.d.ts +4 -0
  345. package/dist/lib/long-task-external-confirmation-preparation.js +100 -0
  346. package/dist/lib/long-task-external-confirmation-shape.d.ts +8 -0
  347. package/dist/lib/long-task-external-confirmation-shape.js +387 -0
  348. package/dist/lib/long-task-external-confirmation-state.d.ts +10 -0
  349. package/dist/lib/long-task-external-confirmation-state.js +109 -0
  350. package/dist/lib/long-task-external-confirmation-types.d.ts +195 -0
  351. package/dist/lib/long-task-external-confirmation-types.js +1 -0
  352. package/dist/lib/long-task-final-integrity.d.ts +2 -0
  353. package/dist/lib/long-task-final-integrity.js +21 -10
  354. package/dist/lib/long-task-final-v2.d.ts +7 -2
  355. package/dist/lib/long-task-final-v2.js +179 -55
  356. package/dist/lib/long-task-finalization-identity.d.ts +27 -0
  357. package/dist/lib/long-task-finalization-identity.js +58 -0
  358. package/dist/lib/long-task-finding-context.d.ts +1 -1
  359. package/dist/lib/long-task-finding-context.js +139 -13
  360. package/dist/lib/long-task-freshness.d.ts +27 -0
  361. package/dist/lib/long-task-freshness.js +128 -5
  362. package/dist/lib/long-task-git.js +3 -3
  363. package/dist/lib/long-task-material-input-closure.d.ts +3 -0
  364. package/dist/lib/long-task-material-input-closure.js +92 -0
  365. package/dist/lib/long-task-obligation-authority-resolution.d.ts +12 -0
  366. package/dist/lib/long-task-obligation-authority-resolution.js +57 -0
  367. package/dist/lib/long-task-obligation-semantic-identity.d.ts +16 -0
  368. package/dist/lib/long-task-obligation-semantic-identity.js +116 -0
  369. package/dist/lib/long-task-observation-authority.d.ts +11 -0
  370. package/dist/lib/long-task-observation-authority.js +137 -6
  371. package/dist/lib/long-task-process-table.d.ts +2 -5
  372. package/dist/lib/long-task-process-table.js +21 -53
  373. package/dist/lib/long-task-process-tree.d.ts +0 -1
  374. package/dist/lib/long-task-process-tree.js +24 -54
  375. package/dist/lib/long-task-proof-adequacy.d.ts +12 -0
  376. package/dist/lib/long-task-proof-adequacy.js +57 -0
  377. package/dist/lib/long-task-proof-capability-floor.d.ts +6 -0
  378. package/dist/lib/long-task-proof-capability-floor.js +137 -0
  379. package/dist/lib/long-task-repair-frontier-checks.d.ts +8 -0
  380. package/dist/lib/long-task-repair-frontier-checks.js +93 -0
  381. package/dist/lib/long-task-repair-frontier-groups.d.ts +2 -0
  382. package/dist/lib/long-task-repair-frontier-groups.js +64 -0
  383. package/dist/lib/long-task-repair-frontier-utils.d.ts +6 -0
  384. package/dist/lib/long-task-repair-frontier-utils.js +27 -0
  385. package/dist/lib/long-task-repair-frontier.d.ts +14 -0
  386. package/dist/lib/long-task-repair-frontier.js +132 -0
  387. package/dist/lib/long-task-risk.d.ts +3 -2
  388. package/dist/lib/long-task-risk.js +73 -24
  389. package/dist/lib/long-task-root-shape.js +148 -8
  390. package/dist/lib/long-task-runner-freeze.d.ts +2 -1
  391. package/dist/lib/long-task-runner-freeze.js +23 -8
  392. package/dist/lib/long-task-runtime-types.d.ts +34 -40
  393. package/dist/lib/long-task-semantic-assurance-policy.js +2 -11
  394. package/dist/lib/long-task-semantic-contract-types.d.ts +2 -1
  395. package/dist/lib/long-task-semantic-drift-migration.js +48 -2
  396. package/dist/lib/long-task-semantic-fact-binding-types.d.ts +20 -0
  397. package/dist/lib/long-task-semantic-fact-closure.d.ts +5 -1
  398. package/dist/lib/long-task-semantic-fact-closure.js +33 -5
  399. package/dist/lib/long-task-semantic-fact-contract-closure.js +176 -1
  400. package/dist/lib/long-task-semantic-fact-contract-proofs.js +18 -1
  401. package/dist/lib/long-task-semantic-fact-input-closure.d.ts +16 -2
  402. package/dist/lib/long-task-semantic-fact-input-closure.js +138 -15
  403. package/dist/lib/long-task-semantic-fact-provenance-closure.js +1 -1
  404. package/dist/lib/long-task-semantic-fact-shape.d.ts +2 -1
  405. package/dist/lib/long-task-semantic-fact-shape.js +35 -1
  406. package/dist/lib/long-task-semantic-proof-adequacy.d.ts +2 -0
  407. package/dist/lib/long-task-semantic-proof-adequacy.js +19 -0
  408. package/dist/lib/long-task-semantic-proof-profile.d.ts +5 -0
  409. package/dist/lib/long-task-semantic-proof-profile.js +187 -0
  410. package/dist/lib/long-task-shape-primitives.d.ts +1 -1
  411. package/dist/lib/long-task-shape-primitives.js +5 -0
  412. package/dist/lib/long-task-source-anchors.d.ts +10 -0
  413. package/dist/lib/long-task-source-anchors.js +102 -0
  414. package/dist/lib/long-task-source-authority-types.d.ts +46 -0
  415. package/dist/lib/long-task-source-claim-validation.js +36 -0
  416. package/dist/lib/long-task-source-conservation-facts.d.ts +8 -0
  417. package/dist/lib/long-task-source-conservation-facts.js +57 -0
  418. package/dist/lib/long-task-source-conservation-types.d.ts +34 -0
  419. package/dist/lib/long-task-source-conservation-types.js +1 -0
  420. package/dist/lib/long-task-source-conservation.d.ts +7 -0
  421. package/dist/lib/long-task-source-conservation.js +110 -0
  422. package/dist/lib/long-task-source-fragments.d.ts +6 -0
  423. package/dist/lib/long-task-source-fragments.js +219 -0
  424. package/dist/lib/long-task-source-projection-resolution.d.ts +5 -0
  425. package/dist/lib/long-task-source-projection-resolution.js +57 -0
  426. package/dist/lib/long-task-source-projection-validation.d.ts +17 -0
  427. package/dist/lib/long-task-source-projection-validation.js +154 -0
  428. package/dist/lib/long-task-source-shape.js +14 -6
  429. package/dist/lib/long-task-source-supersession.d.ts +5 -0
  430. package/dist/lib/long-task-source-supersession.js +138 -0
  431. package/dist/lib/long-task-stage-policy.d.ts +7 -2
  432. package/dist/lib/long-task-stage-policy.js +67 -23
  433. package/dist/lib/long-task-state.d.ts +18 -4
  434. package/dist/lib/long-task-state.js +319 -33
  435. package/dist/lib/long-task-static-observation-freeze.js +4 -3
  436. package/dist/lib/long-task-status-projection.d.ts +3 -1
  437. package/dist/lib/long-task-status-projection.js +44 -13
  438. package/dist/lib/long-task-status-v2.d.ts +10 -6
  439. package/dist/lib/long-task-status-v2.js +70 -58
  440. package/dist/lib/long-task-target-policy.d.ts +8 -3
  441. package/dist/lib/long-task-target-policy.js +40 -9
  442. package/dist/lib/long-task-terminal-finalization.d.ts +12 -0
  443. package/dist/lib/long-task-terminal-finalization.js +190 -0
  444. package/dist/lib/long-task-ui-design-policy.js +15 -4
  445. package/dist/lib/long-task-verifier-counterfactuals.d.ts +11 -0
  446. package/dist/lib/long-task-verifier-counterfactuals.js +96 -0
  447. package/dist/lib/long-task-verifier-execution.d.ts +9 -0
  448. package/dist/lib/long-task-verifier-execution.js +67 -0
  449. package/dist/lib/long-task-verifier-identity.js +16 -5
  450. package/dist/lib/long-task-verifier-v2.js +52 -65
  451. package/dist/lib/long-task-windows-job-supervisor-helper.d.ts +1 -0
  452. package/dist/lib/long-task-windows-job-supervisor-helper.js +104 -0
  453. package/dist/lib/long-task-windows-job-supervisor-protocol.d.ts +28 -0
  454. package/dist/lib/long-task-windows-job-supervisor-protocol.js +124 -0
  455. package/dist/lib/long-task-windows-job-supervisor-result.d.ts +11 -0
  456. package/dist/lib/long-task-windows-job-supervisor-result.js +152 -0
  457. package/dist/lib/long-task-windows-job-supervisor.d.ts +2 -0
  458. package/dist/lib/long-task-windows-job-supervisor.js +126 -0
  459. package/dist/lib/long-task-workspace-scope.d.ts +1 -0
  460. package/dist/lib/long-task-workspace-scope.js +4 -1
  461. package/dist/lib/long-task-workspace.d.ts +1 -0
  462. package/dist/lib/long-task-workspace.js +10 -0
  463. package/dist/lib/migrations.js +43 -2
  464. package/dist/lib/repository-path-safety.d.ts +1 -0
  465. package/dist/lib/repository-path-safety.js +3 -3
  466. package/dist/lib/semantic-fact-input-shape.d.ts +7 -2
  467. package/dist/lib/semantic-fact-input-shape.js +25 -1
  468. package/dist/lib/semantic-fact-inventory-types.d.ts +8 -2
  469. package/dist/lib/semantic-fact-policy-census.d.ts +1 -1
  470. package/dist/lib/semantic-fact-policy-census.js +5 -2
  471. package/dist/lib/semantic-fact-policy.d.ts +1 -1
  472. package/dist/lib/semantic-fact-policy.js +2 -2
  473. package/dist/lib/semantic-fact-proof-shape.d.ts +1 -1
  474. package/dist/lib/semantic-fact-property-shape.d.ts +1 -1
  475. package/dist/lib/validators.d.ts +3 -0
  476. package/dist/lib/validators.js +45 -157
  477. package/dist/public-api-core.d.ts +12 -0
  478. package/dist/public-api-core.js +12 -0
  479. package/dist/public-api-long-task.d.ts +10 -0
  480. package/dist/public-api-long-task.js +10 -0
  481. package/dist/public-types.d.ts +5 -1
  482. package/dist/schemas/design-authority-delta-assessment-v1.schema.json +191 -0
  483. package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +166 -2
  484. package/dist/schemas/long-task-external-confirmation-record-v1.schema.json +155 -0
  485. package/dist/schemas/long-task-external-confirmation-record-v2.schema.json +209 -0
  486. package/migrations/README.md +99 -0
  487. package/package.json +7 -5
  488. package/source-mappings.yaml +18 -0
@@ -0,0 +1,89 @@
1
+ import { applyMutationChangeForward, assertMutationChangesCurrent, assertMutationChangesContentState, cleanupMutationTemporary, mutationChangeDisposition, prepareMutationTemporaryForRecovery, stageMutationTemporary, } from "./mutation-cas.js";
2
+ import { assertMutationDirectoriesAbsent, prepareMutationDirectories, } from "./mutation-directories.js";
3
+ import { createContextMutationJournal, removeContextMutationJournal, updateContextMutationJournal, } from "./mutation-journal.js";
4
+ import { contextMutationAffectedPaths, withContextMutationAuthorityInterlock, } from "./mutation-long-task-guard.js";
5
+ import { validateLiveContextMutation } from "./mutation-live-validation.js";
6
+ export async function executeContextMutationPlan(repository, plan, options = {}) {
7
+ await withContextMutationAuthorityInterlock(repository, contextMutationAffectedPaths(plan), async () => executeContextMutationPlanLocked(repository, plan, options));
8
+ }
9
+ async function executeContextMutationPlanLocked(repository, plan, options) {
10
+ await assertMutationDirectoriesAbsent(repository, plan.directories);
11
+ await assertMutationChangesCurrent(repository, plan.files);
12
+ let journal = await createContextMutationJournal(repository, plan);
13
+ await checkpoint(options, "journal_created");
14
+ await prepareMutationDirectories(repository, plan.directories);
15
+ for (const change of ordered(journal.files)) {
16
+ const temporary = await stageMutationTemporary(repository, change, "after", temporaryCreatedCheckpoint(options));
17
+ if (!temporary)
18
+ continue;
19
+ const successor = replaceJournalFile(journal, change.path, {
20
+ temporary_state: temporary,
21
+ });
22
+ journal = await updateContextMutationJournal(repository, journal, successor, ["planning"]);
23
+ }
24
+ journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "prepared" }, ["planning"]);
25
+ await checkpoint(options, "prepared");
26
+ await assertMutationChangesCurrent(repository, plan.files);
27
+ journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "committing" }, ["prepared"]);
28
+ for (const planned of ordered(journal.files)) {
29
+ let change = journal.files.find((entry) => entry.path === planned.path);
30
+ if (!change.after.exists &&
31
+ (await mutationChangeDisposition(repository, change)) !== "after") {
32
+ const temporary = await prepareMutationTemporaryForRecovery(repository, change, "after", options.before_second_cas, temporaryCreatedCheckpoint(options));
33
+ const successor = replaceJournalFile(journal, change.path, {
34
+ temporary_state: temporary,
35
+ });
36
+ journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
37
+ change = journal.files.find((entry) => entry.path === planned.path);
38
+ }
39
+ const published = await applyMutationChangeForward(repository, change, options.before_second_cas);
40
+ await checkpoint(options, `published_before_journal:${change.path}`, change);
41
+ let successor = replaceJournalFile(journal, change.path, {
42
+ published_after: published,
43
+ });
44
+ successor = markApplied(successor, change);
45
+ journal = await updateContextMutationJournal(repository, journal, successor, ["committing"]);
46
+ await checkpoint(options, `applied:${change.path}`, change);
47
+ }
48
+ journal = await updateContextMutationJournal(repository, journal, { ...journal, state: "validating" }, ["committing"]);
49
+ await checkpoint(options, "before_validation");
50
+ await assertMutationChangesContentState(repository, journal.files, "after");
51
+ await validateLiveContextMutation(repository, journal);
52
+ await assertMutationChangesContentState(repository, journal.files, "after");
53
+ await finishContextMutation(repository, journal);
54
+ }
55
+ function replaceJournalFile(journal, file, replacement) {
56
+ return {
57
+ ...journal,
58
+ files: journal.files.map((entry) => entry.path === file ? { ...entry, ...replacement } : entry),
59
+ };
60
+ }
61
+ export async function finishContextMutation(repository, journal) {
62
+ await cleanupContextMutationTemporaries(repository, journal);
63
+ await removeContextMutationJournal(repository, journal);
64
+ }
65
+ export async function cleanupContextMutationTemporaries(repository, journal) {
66
+ for (const change of ordered(journal.files))
67
+ await cleanupMutationTemporary(repository, change);
68
+ }
69
+ function ordered(values) {
70
+ return [...values].sort((left, right) => left.commit_order - right.commit_order);
71
+ }
72
+ function markApplied(journal, change) {
73
+ if (journal.applied_paths.includes(change.path))
74
+ return journal;
75
+ if (journal.applied_paths.length !== change.commit_order)
76
+ throw new Error(`context_mutation_invalid:journal_applied_paths_not_prefix:${change.path}`);
77
+ return {
78
+ ...journal,
79
+ applied_paths: [...journal.applied_paths, change.path],
80
+ };
81
+ }
82
+ function temporaryCreatedCheckpoint(options) {
83
+ return async (change) => checkpoint(options, `temporary_created_before_identity:${change.path}`, change);
84
+ }
85
+ async function checkpoint(options, point, change) {
86
+ await options.barrier?.(point, change);
87
+ if (options.fault_after === point)
88
+ throw new Error(`context_mutation_fault_injected:${point}`);
89
+ }
@@ -0,0 +1,5 @@
1
+ import type { MutationDirectoryChange, MutationDirectoryStatus } from "./mutation-types.js";
2
+ export declare function assertMutationDirectoriesAbsent(repository: string, directories: MutationDirectoryChange[]): Promise<void>;
3
+ export declare function prepareMutationDirectories(repository: string, directories: MutationDirectoryChange[]): Promise<void>;
4
+ export declare function rollbackMutationDirectories(repository: string, directories: MutationDirectoryChange[]): Promise<void>;
5
+ export declare function mutationDirectoryStatus(repository: string, entry: MutationDirectoryChange): Promise<MutationDirectoryStatus>;
@@ -0,0 +1,56 @@
1
+ import { lstat, rmdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { assertProtectedRepositoryDirectory, ensureSafeRepositoryDirectory, resolveInsideRepository, } from "../repository-path-safety.js";
4
+ export async function assertMutationDirectoriesAbsent(repository, directories) {
5
+ const conflicts = [];
6
+ for (const entry of directories)
7
+ if ((await mutationDirectoryStatus(repository, entry)).state !== "absent")
8
+ conflicts.push(entry.path);
9
+ if (conflicts.length)
10
+ invalid(`directory_cas_conflict:${conflicts.join(",")}`);
11
+ }
12
+ export async function prepareMutationDirectories(repository, directories) {
13
+ for (const entry of directories)
14
+ await ensureSafeRepositoryDirectory(repository, entry.path, "context_mutation_directory");
15
+ }
16
+ export async function rollbackMutationDirectories(repository, directories) {
17
+ for (const entry of [...directories].reverse()) {
18
+ const status = await mutationDirectoryStatus(repository, entry);
19
+ if (status.state === "absent")
20
+ continue;
21
+ if (status.state !== "directory")
22
+ invalid(`directory_recovery_conflict:${entry.path}`);
23
+ const absolute = await assertProtectedRepositoryDirectory(repository, path.join(repository, ...entry.path.split("/")), "context_mutation_directory_rollback");
24
+ try {
25
+ await rmdir(absolute);
26
+ }
27
+ catch (error) {
28
+ if (error.code === "ENOTEMPTY")
29
+ invalid(`directory_recovery_not_empty:${entry.path}`);
30
+ throw error;
31
+ }
32
+ }
33
+ }
34
+ export async function mutationDirectoryStatus(repository, entry) {
35
+ const absolute = resolveInsideRepository(repository, entry.path, "context_mutation_directory_status");
36
+ const status = await lstat(absolute).catch((error) => {
37
+ if (error.code === "ENOENT")
38
+ return null;
39
+ throw error;
40
+ });
41
+ if (!status)
42
+ return { path: entry.path, state: "absent" };
43
+ if (status.isDirectory() && !status.isSymbolicLink()) {
44
+ try {
45
+ await assertProtectedRepositoryDirectory(repository, absolute, "context_mutation_directory_status");
46
+ return { path: entry.path, state: "directory" };
47
+ }
48
+ catch {
49
+ return { path: entry.path, state: "conflict" };
50
+ }
51
+ }
52
+ return { path: entry.path, state: "conflict" };
53
+ }
54
+ function invalid(reason) {
55
+ throw new Error(`context_mutation_invalid:${reason}`);
56
+ }
@@ -0,0 +1,14 @@
1
+ import type { MutationFileChange, MutationFileIdentity, MutationRecordedFileState, MutationFileState } from "./mutation-types.js";
2
+ export declare function captureMutationFileState(repository: string, relative: string, options?: {
3
+ allow_hardlinks?: boolean;
4
+ }): Promise<MutationFileState>;
5
+ export declare function mutationFileStateFromBytes(bytes: Uint8Array, mode: number): MutationFileState;
6
+ export declare function absentMutationFileState(): MutationFileState;
7
+ export declare function assertMutationChangesCurrent(repository: string, changes: MutationFileChange[]): Promise<void>;
8
+ export declare function assertMutationChangesContentState(repository: string, changes: MutationFileChange[], side: "before" | "after"): Promise<void>;
9
+ export declare function sameMutationContentState(left: MutationFileState, right: MutationFileState): boolean;
10
+ export declare function mutationPhysicalPath(change: Pick<MutationFileChange, "path" | "physical_path">): string;
11
+ export declare function mutationRecordedFileState(state: MutationFileState): MutationRecordedFileState;
12
+ export declare function sameMutationRecordedState(current: MutationFileState, expected: MutationRecordedFileState | MutationFileState): boolean;
13
+ export declare function sameMutationSnapshot(current: MutationFileState, expected: MutationFileState): boolean;
14
+ export declare function sameMutationIdentity(left: MutationFileIdentity | null, right: MutationFileIdentity | null): boolean;
@@ -0,0 +1,137 @@
1
+ import { lstat, readFile } from "node:fs/promises";
2
+ import { assertSafeRepositoryFilePath } from "../repository-path-safety.js";
3
+ import { sha256Hex } from "../strict-codec.js";
4
+ export async function captureMutationFileState(repository, relative, options = {}) {
5
+ let safe;
6
+ try {
7
+ safe = await assertSafeRepositoryFilePath(repository, relative, "context_mutation_snapshot", {
8
+ destinationMayBeAbsent: true,
9
+ allowHardlinks: options.allow_hardlinks === true,
10
+ });
11
+ }
12
+ catch (error) {
13
+ if (/^protected_input_parent_not_found:/u.test(message(error)))
14
+ return absentMutationFileState();
15
+ throw error;
16
+ }
17
+ if (!safe.status)
18
+ return absentMutationFileState();
19
+ const before = await lstat(safe.absolute, { bigint: true });
20
+ if (!before.isFile() || before.isSymbolicLink())
21
+ invalid(`snapshot_target_unsafe:${relative}`);
22
+ if (!options.allow_hardlinks && before.nlink !== 1n)
23
+ invalid(`snapshot_target_hardlinked:${relative}`);
24
+ const bytes = await readFile(safe.absolute);
25
+ const after = await lstat(safe.absolute, { bigint: true });
26
+ if (!sameBigIntStatus(before, after))
27
+ invalid(`snapshot_changed_during_read:${relative}`);
28
+ if (after.ino === 0n)
29
+ invalid(`snapshot_identity_unavailable:${relative}`);
30
+ return {
31
+ exists: true,
32
+ sha256: sha256Hex(bytes),
33
+ bytes_base64: bytes.toString("base64"),
34
+ mode: Number(after.mode & 511n),
35
+ identity: fileIdentity(after),
36
+ };
37
+ }
38
+ export function mutationFileStateFromBytes(bytes, mode) {
39
+ const buffer = Buffer.from(bytes);
40
+ return {
41
+ exists: true,
42
+ sha256: sha256Hex(buffer),
43
+ bytes_base64: buffer.toString("base64"),
44
+ mode: mode & 0o777,
45
+ identity: null,
46
+ };
47
+ }
48
+ export function absentMutationFileState() {
49
+ return {
50
+ exists: false,
51
+ sha256: null,
52
+ bytes_base64: null,
53
+ mode: null,
54
+ identity: null,
55
+ };
56
+ }
57
+ export async function assertMutationChangesCurrent(repository, changes) {
58
+ const conflicts = [];
59
+ for (const change of changes) {
60
+ const current = await captureMutationFileState(repository, mutationPhysicalPath(change));
61
+ if (!sameMutationSnapshot(current, change.before))
62
+ conflicts.push(change.path);
63
+ }
64
+ if (conflicts.length)
65
+ invalid(`cas_conflict:${conflicts.sort().join(",")}`);
66
+ }
67
+ export async function assertMutationChangesContentState(repository, changes, side) {
68
+ const conflicts = [];
69
+ for (const change of changes) {
70
+ const expected = side === "before"
71
+ ? (change.published_before ?? change.before)
72
+ : (change.published_after ?? change.after);
73
+ const current = await captureMutationFileState(repository, mutationPhysicalPath(change));
74
+ if (!sameMutationRecordedState(current, expected))
75
+ conflicts.push(change.path);
76
+ }
77
+ if (conflicts.length)
78
+ invalid(`${side}_state_conflict:${conflicts.sort().join(",")}`);
79
+ }
80
+ export function sameMutationContentState(left, right) {
81
+ return left.exists === right.exists && left.sha256 === right.sha256;
82
+ }
83
+ export function mutationPhysicalPath(change) {
84
+ return change.physical_path ?? change.path;
85
+ }
86
+ export function mutationRecordedFileState(state) {
87
+ return {
88
+ exists: state.exists,
89
+ sha256: state.sha256,
90
+ mode: state.mode,
91
+ identity: state.identity,
92
+ };
93
+ }
94
+ export function sameMutationRecordedState(current, expected) {
95
+ return (current.exists === expected.exists &&
96
+ current.sha256 === expected.sha256 &&
97
+ current.mode === expected.mode &&
98
+ sameMutationIdentity(current.identity, expected.identity));
99
+ }
100
+ export function sameMutationSnapshot(current, expected) {
101
+ return sameMutationRecordedState(current, expected);
102
+ }
103
+ export function sameMutationIdentity(left, right) {
104
+ if (left === null || right === null)
105
+ return left === right;
106
+ return (left.dev === right.dev &&
107
+ left.ino === right.ino &&
108
+ left.nlink === right.nlink &&
109
+ left.size === right.size &&
110
+ left.mtime_ns === right.mtime_ns &&
111
+ left.ctime_ns === right.ctime_ns);
112
+ }
113
+ function fileIdentity(status) {
114
+ return {
115
+ dev: status.dev.toString(10),
116
+ ino: status.ino.toString(10),
117
+ nlink: status.nlink.toString(10),
118
+ size: status.size.toString(10),
119
+ mtime_ns: status.mtimeNs.toString(10),
120
+ ctime_ns: status.ctimeNs.toString(10),
121
+ };
122
+ }
123
+ function sameBigIntStatus(left, right) {
124
+ return (left.dev === right.dev &&
125
+ left.ino === right.ino &&
126
+ left.nlink === right.nlink &&
127
+ left.size === right.size &&
128
+ left.mode === right.mode &&
129
+ left.mtimeNs === right.mtimeNs &&
130
+ left.ctimeNs === right.ctimeNs);
131
+ }
132
+ function invalid(reason) {
133
+ throw new Error(`context_mutation_invalid:${reason}`);
134
+ }
135
+ function message(error) {
136
+ return error instanceof Error ? error.message : String(error);
137
+ }
@@ -0,0 +1 @@
1
+ export declare function validateJournalFiles(value: unknown, transactionId: string, maxFiles: number, maxStoredBytes: number, physicalPathMode: "forbidden-v2" | "required-v3"): Record<string, unknown>[];
@@ -0,0 +1,106 @@
1
+ import { assertJournalMutationTarget, assertJournalRelative, invalidJournal, isJournalRecord, requiredJournalInteger, requiredJournalString, sameJournalFileState, sameJournalRecordedPayload, validateJournalFileState, validateJournalRecordedFileState, validateJournalTemporaryPath, } from "./mutation-journal-validation-support.js";
2
+ import { normalizeContextPath } from "../context-catalog/catalog-paths.js";
3
+ export function validateJournalFiles(value, transactionId, maxFiles, maxStoredBytes, physicalPathMode) {
4
+ if (!Array.isArray(value) || value.length === 0 || value.length > maxFiles)
5
+ invalidJournal("journal_files_invalid");
6
+ const orders = new Set();
7
+ const paths = new Set();
8
+ const physicalPaths = new Set();
9
+ const files = [];
10
+ let storedBytes = 0;
11
+ for (const entry of value) {
12
+ if (!isJournalRecord(entry))
13
+ invalidJournal("journal_file_object_required");
14
+ const file = requiredJournalString(entry.path, "file.path");
15
+ assertJournalRelative(file, "file.path");
16
+ assertJournalMutationTarget(file);
17
+ if (physicalPathMode === "required-v3" &&
18
+ file !== normalizeContextPath(file))
19
+ invalidJournal("journal_file_logical_path_not_nfc");
20
+ if (paths.has(file))
21
+ invalidJournal("journal_file_path_duplicate");
22
+ paths.add(file);
23
+ if (physicalPathMode === "forbidden-v2" &&
24
+ entry.physical_path !== undefined)
25
+ invalidJournal("journal_v2_physical_path_forbidden");
26
+ if (physicalPathMode === "required-v3" && entry.physical_path === undefined)
27
+ invalidJournal("journal_v3_physical_path_required");
28
+ const physicalFile = physicalPathMode === "required-v3"
29
+ ? requiredJournalString(entry.physical_path, "file.physical_path")
30
+ : file;
31
+ assertJournalRelative(physicalFile, "file.physical_path");
32
+ assertJournalMutationTarget(physicalFile);
33
+ if (normalizeContextPath(physicalFile) !== normalizeContextPath(file))
34
+ invalidJournal("journal_file_physical_path_identity_mismatch");
35
+ if (physicalPaths.has(physicalFile))
36
+ invalidJournal("journal_file_physical_path_duplicate");
37
+ physicalPaths.add(physicalFile);
38
+ const order = requiredJournalInteger(entry.commit_order, "file.commit_order");
39
+ if (orders.has(order))
40
+ invalidJournal("journal_commit_order_duplicate");
41
+ orders.add(order);
42
+ storedBytes += validateJournalFileState(entry.before, "file.before");
43
+ storedBytes += validateJournalFileState(entry.after, "file.after");
44
+ assertSemanticIdentityShape(entry, file);
45
+ if (sameJournalFileState(entry.before, entry.after))
46
+ invalidJournal("journal_file_noop");
47
+ validateJournalTemporaryPath(entry.temporary_path, physicalFile, transactionId, order);
48
+ validateTemporaryState(entry, file);
49
+ validatePublishedState(entry, "before", file);
50
+ validatePublishedState(entry, "after", file);
51
+ files.push(entry);
52
+ }
53
+ if (orders.size !== files.length ||
54
+ [...orders].some((order) => order >= files.length))
55
+ invalidJournal("journal_commit_order_not_contiguous");
56
+ if (storedBytes > maxStoredBytes)
57
+ invalidJournal("journal_byte_budget_exceeded");
58
+ return files;
59
+ }
60
+ function assertSemanticIdentityShape(entry, file) {
61
+ if (!isJournalRecord(entry.before) || !isJournalRecord(entry.after))
62
+ invalidJournal(`file_state_object_required:${file}`);
63
+ if (entry.before.exists === true && entry.before.identity === null)
64
+ invalidJournal(`file_before_identity_required:${file}`);
65
+ if (entry.before.exists === true &&
66
+ isJournalRecord(entry.before.identity) &&
67
+ entry.before.identity.nlink !== "1")
68
+ invalidJournal(`file_before_hardlink_forbidden:${file}`);
69
+ if (entry.after.identity !== null)
70
+ invalidJournal(`file_after_planned_identity_forbidden:${file}`);
71
+ }
72
+ function validateTemporaryState(entry, file) {
73
+ if (entry.temporary_state === null)
74
+ return;
75
+ if (!isJournalRecord(entry.temporary_state))
76
+ invalidJournal(`file_temporary_state_object_required:${file}`);
77
+ const side = entry.temporary_state.side;
78
+ if (side !== "before" && side !== "after")
79
+ invalidJournal(`file_temporary_state_side_invalid:${file}`);
80
+ validateJournalRecordedFileState(entry.temporary_state.state, `file.temporary_state.state`);
81
+ const semantic = entry[side];
82
+ if (!isJournalRecord(semantic) ||
83
+ semantic.exists !== true ||
84
+ !sameJournalRecordedPayload(entry.temporary_state.state, semantic))
85
+ invalidJournal(`file_temporary_state_payload_mismatch:${file}`);
86
+ const identity = isJournalRecord(entry.temporary_state.state)
87
+ ? entry.temporary_state.state.identity
88
+ : null;
89
+ if (!isJournalRecord(identity) ||
90
+ !["1", "2"].includes(identity.nlink))
91
+ invalidJournal(`file_temporary_state_link_count_invalid:${file}`);
92
+ if (identity.nlink === "2" &&
93
+ isJournalRecord(entry[side === "before" ? "after" : "before"]) &&
94
+ entry[side === "before" ? "after" : "before"]
95
+ .exists !== false)
96
+ invalidJournal(`file_deletion_tombstone_transition_invalid:${file}`);
97
+ }
98
+ function validatePublishedState(entry, side, file) {
99
+ const field = side === "before" ? "published_before" : "published_after";
100
+ const value = entry[field];
101
+ if (value === null)
102
+ return;
103
+ validateJournalRecordedFileState(value, `file.${field}`);
104
+ if (!sameJournalRecordedPayload(value, entry[side]))
105
+ invalidJournal(`file_${field}_payload_mismatch:${file}`);
106
+ }
@@ -0,0 +1,5 @@
1
+ import type { ContextMutationJournal } from "./mutation-types.js";
2
+ export declare function writeJournalTemporary(temporary: string, journal: ContextMutationJournal): Promise<void>;
3
+ export declare function linkJournalTemporary(source: string, target: string): Promise<void>;
4
+ export declare function unlinkJournalPath(target: string): Promise<void>;
5
+ export declare function syncJournalDirectory(directory: string): Promise<void>;
@@ -0,0 +1,55 @@
1
+ import { link, open, unlink } from "node:fs/promises";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { canonicalJson } from "../strict-codec.js";
4
+ const WINDOWS_IO_ATTEMPTS = 32;
5
+ export async function writeJournalTemporary(temporary, journal) {
6
+ const handle = await open(temporary, "wx", 0o600);
7
+ try {
8
+ await handle.writeFile(canonicalJson(journal), "utf8");
9
+ await handle.sync();
10
+ }
11
+ finally {
12
+ await handle.close();
13
+ }
14
+ }
15
+ export async function linkJournalTemporary(source, target) {
16
+ await retryWindowsIo(() => link(source, target), false);
17
+ }
18
+ export async function unlinkJournalPath(target) {
19
+ await retryWindowsIo(() => unlink(target), true);
20
+ }
21
+ export async function syncJournalDirectory(directory) {
22
+ let handle;
23
+ try {
24
+ handle = await open(directory, "r");
25
+ await handle.sync();
26
+ }
27
+ catch (error) {
28
+ const code = error.code;
29
+ if (process.platform === "win32" &&
30
+ ["EACCES", "EINVAL", "EPERM"].includes(code ?? ""))
31
+ return;
32
+ throw error;
33
+ }
34
+ finally {
35
+ await handle?.close();
36
+ }
37
+ }
38
+ async function retryWindowsIo(operation, missingIsSuccess) {
39
+ const retryable = new Set(["EACCES", "EBUSY", "EPERM"]);
40
+ const attempts = process.platform === "win32" ? WINDOWS_IO_ATTEMPTS : 1;
41
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
42
+ try {
43
+ await operation();
44
+ return;
45
+ }
46
+ catch (error) {
47
+ const code = error.code ?? "";
48
+ if (missingIsSuccess && code === "ENOENT")
49
+ return;
50
+ if (attempt + 1 === attempts || !retryable.has(code))
51
+ throw error;
52
+ await delay(Math.min(250, 10 * 2 ** attempt));
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,18 @@
1
+ import type { BigIntStats } from "node:fs";
2
+ import type { ContextMutationJournal } from "./mutation-types.js";
3
+ export declare const CONTEXT_MUTATION_JOURNAL_DIRECTORY = "tmp/ty-context/context-transactions";
4
+ export interface ContextMutationJournalSnapshot {
5
+ absolute: string;
6
+ bytes: Buffer;
7
+ identity: BigIntStats;
8
+ journal: ContextMutationJournal;
9
+ relative: string;
10
+ }
11
+ export interface ContextMutationJournalReadOptions {
12
+ after_snapshot_read?: (absolute: string) => Promise<void>;
13
+ }
14
+ export declare function readLatestJournalSnapshot(repository: string, options?: ContextMutationJournalReadOptions): Promise<ContextMutationJournalSnapshot | null>;
15
+ export declare function publishInitialJournalSnapshot(repository: string, journal: ContextMutationJournal): Promise<ContextMutationJournalSnapshot>;
16
+ export declare function publishNextJournalSnapshot(repository: string, journal: ContextMutationJournal, expected: ContextMutationJournalSnapshot): Promise<ContextMutationJournalSnapshot>;
17
+ export declare function removeJournalSnapshotChain(repository: string, expected: ContextMutationJournalSnapshot): Promise<void>;
18
+ export declare function assertExpectedJournalSnapshot(current: ContextMutationJournalSnapshot | undefined, expected: ContextMutationJournalSnapshot): void;