@blxzer/pactile 0.6.0-beta.2 → 0.6.0-beta.4

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 (703) hide show
  1. package/README.md +93 -84
  2. package/README.zh-CN.md +90 -81
  3. package/dist/bin/compat-warning.d.ts +2 -0
  4. package/dist/bin/compat-warning.d.ts.map +1 -0
  5. package/dist/bin/compat-warning.js +8 -0
  6. package/dist/bin/compat-warning.js.map +1 -0
  7. package/dist/bin/cstl.d.ts +3 -0
  8. package/dist/bin/cstl.d.ts.map +1 -0
  9. package/{bin → dist/bin}/cstl.js +2 -3
  10. package/dist/bin/cstl.js.map +1 -0
  11. package/dist/bin/pactile.d.ts +3 -0
  12. package/dist/bin/pactile.d.ts.map +1 -0
  13. package/dist/bin/pactile.js +4 -0
  14. package/dist/bin/pactile.js.map +1 -0
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +77 -17
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/commands/capability.d.ts +3 -0
  19. package/dist/commands/capability.d.ts.map +1 -0
  20. package/dist/commands/capability.js +129 -0
  21. package/dist/commands/capability.js.map +1 -0
  22. package/dist/commands/codex.d.ts.map +1 -1
  23. package/dist/commands/codex.js +54 -6
  24. package/dist/commands/codex.js.map +1 -1
  25. package/dist/commands/context.d.ts +2 -0
  26. package/dist/commands/context.d.ts.map +1 -1
  27. package/dist/commands/context.js +367 -41
  28. package/dist/commands/context.js.map +1 -1
  29. package/dist/commands/detach.d.ts.map +1 -1
  30. package/dist/commands/detach.js +5 -4
  31. package/dist/commands/detach.js.map +1 -1
  32. package/dist/commands/init.d.ts.map +1 -1
  33. package/dist/commands/init.js +615 -259
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/legacy-task.d.ts +3 -0
  36. package/dist/commands/legacy-task.d.ts.map +1 -0
  37. package/dist/commands/legacy-task.js +295 -0
  38. package/dist/commands/legacy-task.js.map +1 -0
  39. package/dist/commands/pi.d.ts +3 -2
  40. package/dist/commands/pi.d.ts.map +1 -1
  41. package/dist/commands/pi.js +333 -10
  42. package/dist/commands/pi.js.map +1 -1
  43. package/dist/commands/session.d.ts.map +1 -1
  44. package/dist/commands/session.js +148 -24
  45. package/dist/commands/session.js.map +1 -1
  46. package/dist/commands/task-schedule.d.ts +17 -0
  47. package/dist/commands/task-schedule.d.ts.map +1 -0
  48. package/dist/commands/task-schedule.js +395 -0
  49. package/dist/commands/task-schedule.js.map +1 -0
  50. package/dist/commands/task-verify-plan.d.ts +3 -0
  51. package/dist/commands/task-verify-plan.d.ts.map +1 -0
  52. package/dist/commands/task-verify-plan.js +503 -0
  53. package/dist/commands/task-verify-plan.js.map +1 -0
  54. package/dist/commands/task-worktree-close.d.ts +4 -0
  55. package/dist/commands/task-worktree-close.d.ts.map +1 -0
  56. package/dist/commands/task-worktree-close.js +81 -0
  57. package/dist/commands/task-worktree-close.js.map +1 -0
  58. package/dist/commands/task.d.ts +3 -0
  59. package/dist/commands/task.d.ts.map +1 -1
  60. package/dist/commands/task.js +1373 -184
  61. package/dist/commands/task.js.map +1 -1
  62. package/dist/commands/tile-selection.d.ts +3 -0
  63. package/dist/commands/tile-selection.d.ts.map +1 -0
  64. package/dist/commands/tile-selection.js +174 -0
  65. package/dist/commands/tile-selection.js.map +1 -0
  66. package/dist/commands/update.d.ts +1 -1
  67. package/dist/commands/update.d.ts.map +1 -1
  68. package/dist/commands/update.js +80 -55
  69. package/dist/commands/update.js.map +1 -1
  70. package/dist/commands/worktree.d.ts +4 -0
  71. package/dist/commands/worktree.d.ts.map +1 -0
  72. package/dist/commands/worktree.js +198 -0
  73. package/dist/commands/worktree.js.map +1 -0
  74. package/dist/configurators/shared.js +1 -1
  75. package/dist/configurators/shared.js.map +1 -1
  76. package/dist/core/compat/environment.d.ts +0 -1
  77. package/dist/core/compat/environment.d.ts.map +1 -1
  78. package/dist/core/compat/environment.js +1 -9
  79. package/dist/core/compat/environment.js.map +1 -1
  80. package/dist/core/pactile/bounded-capabilities.d.ts +127 -0
  81. package/dist/core/pactile/bounded-capabilities.d.ts.map +1 -0
  82. package/dist/core/pactile/bounded-capabilities.js +188 -0
  83. package/dist/core/pactile/bounded-capabilities.js.map +1 -0
  84. package/dist/core/pactile/index.d.ts +1 -0
  85. package/dist/core/pactile/index.d.ts.map +1 -1
  86. package/dist/core/pactile/index.js +1 -0
  87. package/dist/core/pactile/index.js.map +1 -1
  88. package/dist/core/task/index.d.ts +4 -2
  89. package/dist/core/task/index.d.ts.map +1 -1
  90. package/dist/core/task/index.js +2 -1
  91. package/dist/core/task/index.js.map +1 -1
  92. package/dist/core/task/kernel-cli.d.ts +14 -1
  93. package/dist/core/task/kernel-cli.d.ts.map +1 -1
  94. package/dist/core/task/kernel-cli.js +128 -0
  95. package/dist/core/task/kernel-cli.js.map +1 -1
  96. package/dist/core/task/kernel-contract.d.ts +6 -3
  97. package/dist/core/task/kernel-contract.d.ts.map +1 -1
  98. package/dist/core/task/kernel-contract.js +71 -23
  99. package/dist/core/task/kernel-contract.js.map +1 -1
  100. package/dist/core/task/kernel-store.d.ts +6 -0
  101. package/dist/core/task/kernel-store.d.ts.map +1 -1
  102. package/dist/core/task/kernel-store.js +54 -2
  103. package/dist/core/task/kernel-store.js.map +1 -1
  104. package/dist/core/task/legacy-task-migration-reader.d.ts +137 -0
  105. package/dist/core/task/legacy-task-migration-reader.d.ts.map +1 -0
  106. package/dist/core/task/legacy-task-migration-reader.js +512 -0
  107. package/dist/core/task/legacy-task-migration-reader.js.map +1 -0
  108. package/dist/core/task/legacy-task-migration.d.ts +105 -0
  109. package/dist/core/task/legacy-task-migration.d.ts.map +1 -0
  110. package/dist/core/task/legacy-task-migration.js +562 -0
  111. package/dist/core/task/legacy-task-migration.js.map +1 -0
  112. package/dist/core/task/legacy-task-overlay-durable-io.d.ts +18 -0
  113. package/dist/core/task/legacy-task-overlay-durable-io.d.ts.map +1 -0
  114. package/dist/core/task/legacy-task-overlay-durable-io.js +66 -0
  115. package/dist/core/task/legacy-task-overlay-durable-io.js.map +1 -0
  116. package/dist/core/task/legacy-task-reconciliation-reader.d.ts +26 -0
  117. package/dist/core/task/legacy-task-reconciliation-reader.d.ts.map +1 -0
  118. package/dist/core/task/legacy-task-reconciliation-reader.js +324 -0
  119. package/dist/core/task/legacy-task-reconciliation-reader.js.map +1 -0
  120. package/dist/core/task/legacy-task-v2-import.d.ts +67 -0
  121. package/dist/core/task/legacy-task-v2-import.d.ts.map +1 -0
  122. package/dist/core/task/legacy-task-v2-import.js +1046 -0
  123. package/dist/core/task/legacy-task-v2-import.js.map +1 -0
  124. package/dist/core/task/project-file-observer.d.ts +46 -0
  125. package/dist/core/task/project-file-observer.d.ts.map +1 -0
  126. package/dist/core/task/project-file-observer.js +618 -0
  127. package/dist/core/task/project-file-observer.js.map +1 -0
  128. package/dist/core/task/start-authority.d.ts +14 -0
  129. package/dist/core/task/start-authority.d.ts.map +1 -0
  130. package/dist/core/task/start-authority.js +146 -0
  131. package/dist/core/task/start-authority.js.map +1 -0
  132. package/dist/core/task/strategy.d.ts +24 -0
  133. package/dist/core/task/strategy.d.ts.map +1 -0
  134. package/dist/core/task/strategy.js +136 -0
  135. package/dist/core/task/strategy.js.map +1 -0
  136. package/dist/core/task/task-candidate-observer.d.ts +111 -0
  137. package/dist/core/task/task-candidate-observer.d.ts.map +1 -0
  138. package/dist/core/task/task-candidate-observer.js +762 -0
  139. package/dist/core/task/task-candidate-observer.js.map +1 -0
  140. package/dist/core/task/task-kernel-close.d.ts +5 -0
  141. package/dist/core/task/task-kernel-close.d.ts.map +1 -0
  142. package/dist/core/task/task-kernel-close.js +367 -0
  143. package/dist/core/task/task-kernel-close.js.map +1 -0
  144. package/dist/core/task/task-kernel-dependencies.d.ts +3 -0
  145. package/dist/core/task/task-kernel-dependencies.d.ts.map +1 -0
  146. package/dist/core/task/task-kernel-dependencies.js +24 -0
  147. package/dist/core/task/task-kernel-dependencies.js.map +1 -0
  148. package/dist/core/task/task-kernel-host.d.ts +5 -0
  149. package/dist/core/task/task-kernel-host.d.ts.map +1 -0
  150. package/dist/core/task/task-kernel-host.js +136 -0
  151. package/dist/core/task/task-kernel-host.js.map +1 -0
  152. package/dist/core/task/task-kernel-paths.d.ts +19 -0
  153. package/dist/core/task/task-kernel-paths.d.ts.map +1 -0
  154. package/dist/core/task/task-kernel-paths.js +237 -0
  155. package/dist/core/task/task-kernel-paths.js.map +1 -0
  156. package/dist/core/task/task-kernel-reviews.d.ts +3 -0
  157. package/dist/core/task/task-kernel-reviews.d.ts.map +1 -0
  158. package/dist/core/task/task-kernel-reviews.js +100 -0
  159. package/dist/core/task/task-kernel-reviews.js.map +1 -0
  160. package/dist/core/task/task-kernel-runs.d.ts +5 -0
  161. package/dist/core/task/task-kernel-runs.d.ts.map +1 -0
  162. package/dist/core/task/task-kernel-runs.js +196 -0
  163. package/dist/core/task/task-kernel-runs.js.map +1 -0
  164. package/dist/core/task/task-kernel-schema.d.ts +29 -0
  165. package/dist/core/task/task-kernel-schema.d.ts.map +1 -0
  166. package/dist/core/task/task-kernel-schema.js +1169 -0
  167. package/dist/core/task/task-kernel-schema.js.map +1 -0
  168. package/dist/core/task/task-kernel-store-v2.d.ts +33 -0
  169. package/dist/core/task/task-kernel-store-v2.d.ts.map +1 -0
  170. package/dist/core/task/task-kernel-store-v2.js +574 -0
  171. package/dist/core/task/task-kernel-store-v2.js.map +1 -0
  172. package/dist/core/task/task-kernel-types.d.ts +585 -0
  173. package/dist/core/task/task-kernel-types.d.ts.map +1 -0
  174. package/dist/core/task/task-kernel-types.js +31 -0
  175. package/dist/core/task/task-kernel-types.js.map +1 -0
  176. package/dist/core/task/task-kernel-workspaces.d.ts +10 -0
  177. package/dist/core/task/task-kernel-workspaces.d.ts.map +1 -0
  178. package/dist/core/task/task-kernel-workspaces.js +250 -0
  179. package/dist/core/task/task-kernel-workspaces.js.map +1 -0
  180. package/dist/core/task/task-kernel-write-set.d.ts +3 -0
  181. package/dist/core/task/task-kernel-write-set.d.ts.map +1 -0
  182. package/dist/core/task/task-kernel-write-set.js +12 -0
  183. package/dist/core/task/task-kernel-write-set.js.map +1 -0
  184. package/dist/core/task/task-kernel.d.ts +19 -0
  185. package/dist/core/task/task-kernel.d.ts.map +1 -0
  186. package/dist/core/task/task-kernel.js +17 -0
  187. package/dist/core/task/task-kernel.js.map +1 -0
  188. package/dist/core/task/task-pull-request-observer.d.ts +25 -0
  189. package/dist/core/task/task-pull-request-observer.d.ts.map +1 -0
  190. package/dist/core/task/task-pull-request-observer.js +187 -0
  191. package/dist/core/task/task-pull-request-observer.js.map +1 -0
  192. package/dist/core/task/task-review-evidence.d.ts +27 -0
  193. package/dist/core/task/task-review-evidence.d.ts.map +1 -0
  194. package/dist/core/task/task-review-evidence.js +383 -0
  195. package/dist/core/task/task-review-evidence.js.map +1 -0
  196. package/dist/migrations/index.d.ts +1 -1
  197. package/dist/migrations/index.d.ts.map +1 -1
  198. package/dist/migrations/index.js +5 -3
  199. package/dist/migrations/index.js.map +1 -1
  200. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  201. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  202. package/dist/pactile/artifacts/documents.d.ts +72 -0
  203. package/dist/pactile/artifacts/documents.d.ts.map +1 -0
  204. package/dist/pactile/artifacts/documents.js +406 -0
  205. package/dist/pactile/artifacts/documents.js.map +1 -0
  206. package/dist/pactile/artifacts/index.d.ts +6 -0
  207. package/dist/pactile/artifacts/index.d.ts.map +1 -0
  208. package/dist/pactile/artifacts/index.js +6 -0
  209. package/dist/pactile/artifacts/index.js.map +1 -0
  210. package/dist/pactile/artifacts/projection.d.ts +50 -0
  211. package/dist/pactile/artifacts/projection.d.ts.map +1 -0
  212. package/dist/pactile/artifacts/projection.js +139 -0
  213. package/dist/pactile/artifacts/projection.js.map +1 -0
  214. package/dist/pactile/artifacts/reader.d.ts +20 -0
  215. package/dist/pactile/artifacts/reader.d.ts.map +1 -0
  216. package/dist/pactile/artifacts/reader.js +559 -0
  217. package/dist/pactile/artifacts/reader.js.map +1 -0
  218. package/dist/pactile/artifacts/schema.d.ts +4 -0
  219. package/dist/pactile/artifacts/schema.d.ts.map +1 -0
  220. package/dist/pactile/artifacts/schema.js +217 -0
  221. package/dist/pactile/artifacts/schema.js.map +1 -0
  222. package/dist/pactile/artifacts/types.d.ts +66 -0
  223. package/dist/pactile/artifacts/types.d.ts.map +1 -0
  224. package/dist/pactile/artifacts/types.js +45 -0
  225. package/dist/pactile/artifacts/types.js.map +1 -0
  226. package/dist/pactile/capabilities/claim.d.ts +3 -0
  227. package/dist/pactile/capabilities/claim.d.ts.map +1 -0
  228. package/dist/pactile/capabilities/claim.js +97 -0
  229. package/dist/pactile/capabilities/claim.js.map +1 -0
  230. package/dist/pactile/capabilities/command.d.ts +6 -0
  231. package/dist/pactile/capabilities/command.d.ts.map +1 -0
  232. package/dist/pactile/capabilities/command.js +253 -0
  233. package/dist/pactile/capabilities/command.js.map +1 -0
  234. package/dist/pactile/capabilities/discover.d.ts +6 -0
  235. package/dist/pactile/capabilities/discover.d.ts.map +1 -0
  236. package/dist/pactile/capabilities/discover.js +48 -0
  237. package/dist/pactile/capabilities/discover.js.map +1 -0
  238. package/dist/pactile/capabilities/node.d.ts +15 -0
  239. package/dist/pactile/capabilities/node.d.ts.map +1 -0
  240. package/dist/pactile/capabilities/node.js +292 -0
  241. package/dist/pactile/capabilities/node.js.map +1 -0
  242. package/dist/pactile/capabilities/read.d.ts +6 -0
  243. package/dist/pactile/capabilities/read.d.ts.map +1 -0
  244. package/dist/pactile/capabilities/read.js +100 -0
  245. package/dist/pactile/capabilities/read.js.map +1 -0
  246. package/dist/pactile/capabilities/receipts.d.ts +17 -0
  247. package/dist/pactile/capabilities/receipts.d.ts.map +1 -0
  248. package/dist/pactile/capabilities/receipts.js +90 -0
  249. package/dist/pactile/capabilities/receipts.js.map +1 -0
  250. package/dist/pactile/capabilities/search.d.ts +6 -0
  251. package/dist/pactile/capabilities/search.d.ts.map +1 -0
  252. package/dist/pactile/capabilities/search.js +181 -0
  253. package/dist/pactile/capabilities/search.js.map +1 -0
  254. package/dist/pactile/capabilities/shared.d.ts +29 -0
  255. package/dist/pactile/capabilities/shared.d.ts.map +1 -0
  256. package/dist/pactile/capabilities/shared.js +134 -0
  257. package/dist/pactile/capabilities/shared.js.map +1 -0
  258. package/dist/pactile/capabilities/workspace.d.ts +19 -0
  259. package/dist/pactile/capabilities/workspace.d.ts.map +1 -0
  260. package/dist/pactile/capabilities/workspace.js +273 -0
  261. package/dist/pactile/capabilities/workspace.js.map +1 -0
  262. package/dist/pactile/codex/bridge.d.ts +105 -2
  263. package/dist/pactile/codex/bridge.d.ts.map +1 -1
  264. package/dist/pactile/codex/bridge.js +1266 -92
  265. package/dist/pactile/codex/bridge.js.map +1 -1
  266. package/dist/pactile/codex/dispatch-stop-proof.d.ts +43 -0
  267. package/dist/pactile/codex/dispatch-stop-proof.d.ts.map +1 -0
  268. package/dist/pactile/codex/dispatch-stop-proof.js +177 -0
  269. package/dist/pactile/codex/dispatch-stop-proof.js.map +1 -0
  270. package/dist/pactile/codex/host-stop.d.ts +47 -0
  271. package/dist/pactile/codex/host-stop.d.ts.map +1 -0
  272. package/dist/pactile/codex/host-stop.js +344 -0
  273. package/dist/pactile/codex/host-stop.js.map +1 -0
  274. package/dist/pactile/coordination/index.d.ts +4 -0
  275. package/dist/pactile/coordination/index.d.ts.map +1 -0
  276. package/dist/pactile/coordination/index.js +4 -0
  277. package/dist/pactile/coordination/index.js.map +1 -0
  278. package/dist/pactile/coordination/journal.d.ts +10 -0
  279. package/dist/pactile/coordination/journal.d.ts.map +1 -0
  280. package/dist/pactile/coordination/journal.js +255 -0
  281. package/dist/pactile/coordination/journal.js.map +1 -0
  282. package/dist/pactile/coordination/kernel-resume.d.ts +8 -0
  283. package/dist/pactile/coordination/kernel-resume.d.ts.map +1 -0
  284. package/dist/pactile/coordination/kernel-resume.js +87 -0
  285. package/dist/pactile/coordination/kernel-resume.js.map +1 -0
  286. package/dist/pactile/coordination/model.d.ts +553 -0
  287. package/dist/pactile/coordination/model.d.ts.map +1 -0
  288. package/dist/pactile/coordination/model.js +239 -0
  289. package/dist/pactile/coordination/model.js.map +1 -0
  290. package/dist/pactile/coordination/state.d.ts +46 -0
  291. package/dist/pactile/coordination/state.d.ts.map +1 -0
  292. package/dist/pactile/coordination/state.js +301 -0
  293. package/dist/pactile/coordination/state.js.map +1 -0
  294. package/dist/pactile/coordination/store.d.ts +94 -0
  295. package/dist/pactile/coordination/store.d.ts.map +1 -0
  296. package/dist/pactile/coordination/store.js +396 -0
  297. package/dist/pactile/coordination/store.js.map +1 -0
  298. package/dist/pactile/index.d.ts +7 -1
  299. package/dist/pactile/index.d.ts.map +1 -1
  300. package/dist/pactile/index.js +7 -1
  301. package/dist/pactile/index.js.map +1 -1
  302. package/dist/pactile/jev/contracts.d.ts +104 -0
  303. package/dist/pactile/jev/contracts.d.ts.map +1 -0
  304. package/dist/pactile/jev/contracts.js +53 -0
  305. package/dist/pactile/jev/contracts.js.map +1 -0
  306. package/dist/pactile/jev/decision.d.ts +58 -0
  307. package/dist/pactile/jev/decision.d.ts.map +1 -0
  308. package/dist/pactile/jev/decision.js +149 -0
  309. package/dist/pactile/jev/decision.js.map +1 -0
  310. package/dist/pactile/jev/http.d.ts +25 -0
  311. package/dist/pactile/jev/http.d.ts.map +1 -0
  312. package/dist/pactile/jev/http.js +234 -0
  313. package/dist/pactile/jev/http.js.map +1 -0
  314. package/dist/pactile/jev/index.d.ts +8 -0
  315. package/dist/pactile/jev/index.d.ts.map +1 -0
  316. package/dist/pactile/jev/index.js +4 -0
  317. package/dist/pactile/jev/index.js.map +1 -0
  318. package/dist/pactile/jev/outbound.d.ts +15 -0
  319. package/dist/pactile/jev/outbound.d.ts.map +1 -0
  320. package/dist/pactile/jev/outbound.js +264 -0
  321. package/dist/pactile/jev/outbound.js.map +1 -0
  322. package/dist/pactile/jev/project-policy.d.ts +10 -0
  323. package/dist/pactile/jev/project-policy.d.ts.map +1 -0
  324. package/dist/pactile/jev/project-policy.js +53 -0
  325. package/dist/pactile/jev/project-policy.js.map +1 -0
  326. package/dist/pactile/jev/response.d.ts +17 -0
  327. package/dist/pactile/jev/response.d.ts.map +1 -0
  328. package/dist/pactile/jev/response.js +280 -0
  329. package/dist/pactile/jev/response.js.map +1 -0
  330. package/dist/pactile/jev/scheduler-advice.d.ts +92 -0
  331. package/dist/pactile/jev/scheduler-advice.d.ts.map +1 -0
  332. package/dist/pactile/jev/scheduler-advice.js +323 -0
  333. package/dist/pactile/jev/scheduler-advice.js.map +1 -0
  334. package/dist/pactile/jev/transport.d.ts +6 -0
  335. package/dist/pactile/jev/transport.d.ts.map +1 -0
  336. package/dist/pactile/jev/transport.js +87 -0
  337. package/dist/pactile/jev/transport.js.map +1 -0
  338. package/dist/pactile/lifecycle/deferred-live.d.ts +17 -0
  339. package/dist/pactile/lifecycle/deferred-live.d.ts.map +1 -0
  340. package/dist/pactile/lifecycle/deferred-live.js +173 -0
  341. package/dist/pactile/lifecycle/deferred-live.js.map +1 -0
  342. package/dist/pactile/lifecycle/legacy-import.d.ts +1 -1
  343. package/dist/pactile/lifecycle/legacy-import.js +3 -3
  344. package/dist/pactile/lifecycle/legacy-import.js.map +1 -1
  345. package/dist/pactile/lifecycle/project-files.d.ts.map +1 -1
  346. package/dist/pactile/lifecycle/project-files.js +1 -0
  347. package/dist/pactile/lifecycle/project-files.js.map +1 -1
  348. package/dist/pactile/migration/legacy-task-batch-generation.d.ts +23 -0
  349. package/dist/pactile/migration/legacy-task-batch-generation.d.ts.map +1 -0
  350. package/dist/pactile/migration/legacy-task-batch-generation.js +102 -0
  351. package/dist/pactile/migration/legacy-task-batch-generation.js.map +1 -0
  352. package/dist/pactile/migration/legacy-task-batch-io.d.ts +9 -0
  353. package/dist/pactile/migration/legacy-task-batch-io.d.ts.map +1 -0
  354. package/dist/pactile/migration/legacy-task-batch-io.js +208 -0
  355. package/dist/pactile/migration/legacy-task-batch-io.js.map +1 -0
  356. package/dist/pactile/migration/legacy-task-batch-journal.d.ts +6 -0
  357. package/dist/pactile/migration/legacy-task-batch-journal.d.ts.map +1 -0
  358. package/dist/pactile/migration/legacy-task-batch-journal.js +121 -0
  359. package/dist/pactile/migration/legacy-task-batch-journal.js.map +1 -0
  360. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts +18 -0
  361. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts.map +1 -0
  362. package/dist/pactile/migration/legacy-task-batch-orchestrator.js +634 -0
  363. package/dist/pactile/migration/legacy-task-batch-orchestrator.js.map +1 -0
  364. package/dist/pactile/migration/legacy-task-batch-source.d.ts +8 -0
  365. package/dist/pactile/migration/legacy-task-batch-source.d.ts.map +1 -0
  366. package/dist/pactile/migration/legacy-task-batch-source.js +158 -0
  367. package/dist/pactile/migration/legacy-task-batch-source.js.map +1 -0
  368. package/dist/pactile/migration/legacy-task-batch-types.d.ts +127 -0
  369. package/dist/pactile/migration/legacy-task-batch-types.d.ts.map +1 -0
  370. package/dist/pactile/migration/legacy-task-batch-types.js +127 -0
  371. package/dist/pactile/migration/legacy-task-batch-types.js.map +1 -0
  372. package/dist/pactile/migration/legacy-task-batch.d.ts +3 -0
  373. package/dist/pactile/migration/legacy-task-batch.d.ts.map +1 -0
  374. package/dist/pactile/migration/legacy-task-batch.js +2 -0
  375. package/dist/pactile/migration/legacy-task-batch.js.map +1 -0
  376. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts +27 -0
  377. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts.map +1 -0
  378. package/dist/pactile/migration/legacy-task-held-source-reader.js +261 -0
  379. package/dist/pactile/migration/legacy-task-held-source-reader.js.map +1 -0
  380. package/dist/pactile/migration/legacy-task-reconciliation.d.ts +46 -0
  381. package/dist/pactile/migration/legacy-task-reconciliation.d.ts.map +1 -0
  382. package/dist/pactile/migration/legacy-task-reconciliation.js +589 -0
  383. package/dist/pactile/migration/legacy-task-reconciliation.js.map +1 -0
  384. package/dist/pactile/migration/legacy-task-update.d.ts +19 -0
  385. package/dist/pactile/migration/legacy-task-update.d.ts.map +1 -0
  386. package/dist/pactile/migration/legacy-task-update.js +164 -0
  387. package/dist/pactile/migration/legacy-task-update.js.map +1 -0
  388. package/dist/pactile/parallel/batch.d.ts +21 -2
  389. package/dist/pactile/parallel/batch.d.ts.map +1 -1
  390. package/dist/pactile/parallel/batch.js +271 -50
  391. package/dist/pactile/parallel/batch.js.map +1 -1
  392. package/dist/pactile/parallel/policy.d.ts +1 -1
  393. package/dist/pactile/parallel/policy.d.ts.map +1 -1
  394. package/dist/pactile/parallel/policy.js +130 -102
  395. package/dist/pactile/parallel/policy.js.map +1 -1
  396. package/dist/pactile/pi/bridge.d.ts +139 -2
  397. package/dist/pactile/pi/bridge.d.ts.map +1 -1
  398. package/dist/pactile/pi/bridge.js +1317 -106
  399. package/dist/pactile/pi/bridge.js.map +1 -1
  400. package/dist/pactile/pi/rpc.d.ts +23 -4
  401. package/dist/pactile/pi/rpc.d.ts.map +1 -1
  402. package/dist/pactile/pi/rpc.js +243 -42
  403. package/dist/pactile/pi/rpc.js.map +1 -1
  404. package/dist/pactile/pi/v2-dispatch.d.ts +113 -0
  405. package/dist/pactile/pi/v2-dispatch.d.ts.map +1 -0
  406. package/dist/pactile/pi/v2-dispatch.js +919 -0
  407. package/dist/pactile/pi/v2-dispatch.js.map +1 -0
  408. package/dist/pactile/projection/planner.js +1 -1
  409. package/dist/pactile/projection/planner.js.map +1 -1
  410. package/dist/pactile/registry.d.ts +63 -1
  411. package/dist/pactile/registry.d.ts.map +1 -1
  412. package/dist/pactile/registry.js +633 -4
  413. package/dist/pactile/registry.js.map +1 -1
  414. package/dist/pactile/retrieval/index.d.ts +1 -0
  415. package/dist/pactile/retrieval/index.d.ts.map +1 -1
  416. package/dist/pactile/retrieval/index.js +1 -0
  417. package/dist/pactile/retrieval/index.js.map +1 -1
  418. package/dist/pactile/retrieval/jev-planning.d.ts +28 -0
  419. package/dist/pactile/retrieval/jev-planning.d.ts.map +1 -0
  420. package/dist/pactile/retrieval/jev-planning.js +96 -0
  421. package/dist/pactile/retrieval/jev-planning.js.map +1 -0
  422. package/dist/pactile/review/contract.d.ts +232 -0
  423. package/dist/pactile/review/contract.d.ts.map +1 -0
  424. package/dist/pactile/review/contract.js +695 -0
  425. package/dist/pactile/review/contract.js.map +1 -0
  426. package/dist/pactile/review/escalation-artifacts.d.ts +41 -0
  427. package/dist/pactile/review/escalation-artifacts.d.ts.map +1 -0
  428. package/dist/pactile/review/escalation-artifacts.js +415 -0
  429. package/dist/pactile/review/escalation-artifacts.js.map +1 -0
  430. package/dist/pactile/review/escalation-contract.d.ts +115 -0
  431. package/dist/pactile/review/escalation-contract.d.ts.map +1 -0
  432. package/dist/pactile/review/escalation-contract.js +151 -0
  433. package/dist/pactile/review/escalation-contract.js.map +1 -0
  434. package/dist/pactile/review/escalation-finalize.d.ts +14 -0
  435. package/dist/pactile/review/escalation-finalize.d.ts.map +1 -0
  436. package/dist/pactile/review/escalation-finalize.js +319 -0
  437. package/dist/pactile/review/escalation-finalize.js.map +1 -0
  438. package/dist/pactile/review/escalation-reply.d.ts +10 -0
  439. package/dist/pactile/review/escalation-reply.d.ts.map +1 -0
  440. package/dist/pactile/review/escalation-reply.js +61 -0
  441. package/dist/pactile/review/escalation-reply.js.map +1 -0
  442. package/dist/pactile/review/escalation-transport.d.ts +32 -0
  443. package/dist/pactile/review/escalation-transport.d.ts.map +1 -0
  444. package/dist/pactile/review/escalation-transport.js +216 -0
  445. package/dist/pactile/review/escalation-transport.js.map +1 -0
  446. package/dist/pactile/review/escalation.d.ts +7 -0
  447. package/dist/pactile/review/escalation.d.ts.map +1 -0
  448. package/dist/pactile/review/escalation.js +6 -0
  449. package/dist/pactile/review/escalation.js.map +1 -0
  450. package/dist/pactile/review/evidence.d.ts +25 -0
  451. package/dist/pactile/review/evidence.d.ts.map +1 -0
  452. package/dist/pactile/review/evidence.js +58 -0
  453. package/dist/pactile/review/evidence.js.map +1 -0
  454. package/dist/pactile/review/jev-escalation-advice.d.ts +77 -0
  455. package/dist/pactile/review/jev-escalation-advice.d.ts.map +1 -0
  456. package/dist/pactile/review/jev-escalation-advice.js +358 -0
  457. package/dist/pactile/review/jev-escalation-advice.js.map +1 -0
  458. package/dist/pactile/scheduler/index.d.ts +6 -0
  459. package/dist/pactile/scheduler/index.d.ts.map +1 -0
  460. package/dist/pactile/scheduler/index.js +5 -0
  461. package/dist/pactile/scheduler/index.js.map +1 -0
  462. package/dist/pactile/scheduler/project-lease-store.d.ts +35 -0
  463. package/dist/pactile/scheduler/project-lease-store.d.ts.map +1 -0
  464. package/dist/pactile/scheduler/project-lease-store.js +189 -0
  465. package/dist/pactile/scheduler/project-lease-store.js.map +1 -0
  466. package/dist/pactile/scheduler/scheduler.d.ts +91 -0
  467. package/dist/pactile/scheduler/scheduler.d.ts.map +1 -0
  468. package/dist/pactile/scheduler/scheduler.js +589 -0
  469. package/dist/pactile/scheduler/scheduler.js.map +1 -0
  470. package/dist/pactile/scheduler/task-kernel-admission.d.ts +173 -0
  471. package/dist/pactile/scheduler/task-kernel-admission.d.ts.map +1 -0
  472. package/dist/pactile/scheduler/task-kernel-admission.js +1560 -0
  473. package/dist/pactile/scheduler/task-kernel-admission.js.map +1 -0
  474. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts +184 -0
  475. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts.map +1 -0
  476. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js +952 -0
  477. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js.map +1 -0
  478. package/dist/pactile/scheduler/task-map-scheduler.d.ts +116 -0
  479. package/dist/pactile/scheduler/task-map-scheduler.d.ts.map +1 -0
  480. package/dist/pactile/scheduler/task-map-scheduler.js +1448 -0
  481. package/dist/pactile/scheduler/task-map-scheduler.js.map +1 -0
  482. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts +7 -0
  483. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts.map +1 -0
  484. package/dist/pactile/scheduler/task-run-dispatch-state.js +69 -0
  485. package/dist/pactile/scheduler/task-run-dispatch-state.js.map +1 -0
  486. package/dist/pactile/task/authorization.d.ts +3 -0
  487. package/dist/pactile/task/authorization.d.ts.map +1 -0
  488. package/dist/pactile/task/authorization.js +43 -0
  489. package/dist/pactile/task/authorization.js.map +1 -0
  490. package/dist/pactile/task/creation.d.ts +22 -0
  491. package/dist/pactile/task/creation.d.ts.map +1 -0
  492. package/dist/pactile/task/creation.js +95 -0
  493. package/dist/pactile/task/creation.js.map +1 -0
  494. package/dist/pactile/task/guards.d.ts +1 -4
  495. package/dist/pactile/task/guards.d.ts.map +1 -1
  496. package/dist/pactile/task/guards.js +5 -57
  497. package/dist/pactile/task/guards.js.map +1 -1
  498. package/dist/pactile/task/session-jev-receipt.d.ts +58 -0
  499. package/dist/pactile/task/session-jev-receipt.d.ts.map +1 -0
  500. package/dist/pactile/task/session-jev-receipt.js +375 -0
  501. package/dist/pactile/task/session-jev-receipt.js.map +1 -0
  502. package/dist/pactile/task/session-jev.d.ts +7 -0
  503. package/dist/pactile/task/session-jev.d.ts.map +1 -0
  504. package/dist/pactile/task/session-jev.js +217 -0
  505. package/dist/pactile/task/session-jev.js.map +1 -0
  506. package/dist/pactile/task/session-pack.d.ts.map +1 -1
  507. package/dist/pactile/task/session-pack.js +155 -16
  508. package/dist/pactile/task/session-pack.js.map +1 -1
  509. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts +49 -0
  510. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts.map +1 -0
  511. package/dist/pactile/task/session-retrieval-jev-receipt.js +97 -0
  512. package/dist/pactile/task/session-retrieval-jev-receipt.js.map +1 -0
  513. package/dist/pactile/task/session-retrieval-jev.d.ts +8 -0
  514. package/dist/pactile/task/session-retrieval-jev.d.ts.map +1 -0
  515. package/dist/pactile/task/session-retrieval-jev.js +352 -0
  516. package/dist/pactile/task/session-retrieval-jev.js.map +1 -0
  517. package/dist/pactile/task/strategy.d.ts +1 -23
  518. package/dist/pactile/task/strategy.d.ts.map +1 -1
  519. package/dist/pactile/task/strategy.js +2 -135
  520. package/dist/pactile/task/strategy.js.map +1 -1
  521. package/dist/pactile/tiles/jev-selection.d.ts +44 -0
  522. package/dist/pactile/tiles/jev-selection.d.ts.map +1 -0
  523. package/dist/pactile/tiles/jev-selection.js +210 -0
  524. package/dist/pactile/tiles/jev-selection.js.map +1 -0
  525. package/dist/pactile/tiles/safe-yaml.d.ts +5 -1
  526. package/dist/pactile/tiles/safe-yaml.d.ts.map +1 -1
  527. package/dist/pactile/tiles/safe-yaml.js +8 -8
  528. package/dist/pactile/tiles/safe-yaml.js.map +1 -1
  529. package/dist/pactile/tiles/selection-receipts.d.ts +71 -0
  530. package/dist/pactile/tiles/selection-receipts.d.ts.map +1 -0
  531. package/dist/pactile/tiles/selection-receipts.js +319 -0
  532. package/dist/pactile/tiles/selection-receipts.js.map +1 -0
  533. package/dist/pactile/tiles/selection.d.ts +185 -0
  534. package/dist/pactile/tiles/selection.d.ts.map +1 -0
  535. package/dist/pactile/tiles/selection.js +985 -0
  536. package/dist/pactile/tiles/selection.js.map +1 -0
  537. package/dist/pactile/verification/git-observer.d.ts +3 -0
  538. package/dist/pactile/verification/git-observer.d.ts.map +1 -0
  539. package/dist/pactile/verification/git-observer.js +3 -0
  540. package/dist/pactile/verification/git-observer.js.map +1 -0
  541. package/dist/pactile/verification/index.d.ts +11 -0
  542. package/dist/pactile/verification/index.d.ts.map +1 -0
  543. package/dist/pactile/verification/index.js +6 -0
  544. package/dist/pactile/verification/index.js.map +1 -0
  545. package/dist/pactile/verification/jev-advice.d.ts +78 -0
  546. package/dist/pactile/verification/jev-advice.d.ts.map +1 -0
  547. package/dist/pactile/verification/jev-advice.js +397 -0
  548. package/dist/pactile/verification/jev-advice.js.map +1 -0
  549. package/dist/pactile/verification/planner.d.ts +15 -0
  550. package/dist/pactile/verification/planner.d.ts.map +1 -0
  551. package/dist/pactile/verification/planner.js +412 -0
  552. package/dist/pactile/verification/planner.js.map +1 -0
  553. package/dist/pactile/verification/receipt.d.ts +101 -0
  554. package/dist/pactile/verification/receipt.d.ts.map +1 -0
  555. package/dist/pactile/verification/receipt.js +400 -0
  556. package/dist/pactile/verification/receipt.js.map +1 -0
  557. package/dist/pactile/verification/types.d.ts +72 -0
  558. package/dist/pactile/verification/types.d.ts.map +1 -0
  559. package/dist/pactile/verification/types.js +21 -0
  560. package/dist/pactile/verification/types.js.map +1 -0
  561. package/dist/pactile/worktree/git-probe.d.ts +32 -0
  562. package/dist/pactile/worktree/git-probe.d.ts.map +1 -0
  563. package/dist/pactile/worktree/git-probe.js +336 -0
  564. package/dist/pactile/worktree/git-probe.js.map +1 -0
  565. package/dist/pactile/worktree/git-removal.d.ts +3 -0
  566. package/dist/pactile/worktree/git-removal.d.ts.map +1 -0
  567. package/dist/pactile/worktree/git-removal.js +11 -0
  568. package/dist/pactile/worktree/git-removal.js.map +1 -0
  569. package/dist/pactile/worktree/index.d.ts +2 -0
  570. package/dist/pactile/worktree/index.d.ts.map +1 -0
  571. package/dist/pactile/worktree/index.js +2 -0
  572. package/dist/pactile/worktree/index.js.map +1 -0
  573. package/dist/pactile/worktree/integration-evidence.d.ts +80 -0
  574. package/dist/pactile/worktree/integration-evidence.d.ts.map +1 -0
  575. package/dist/pactile/worktree/integration-evidence.js +166 -0
  576. package/dist/pactile/worktree/integration-evidence.js.map +1 -0
  577. package/dist/pactile/worktree/manager-core.d.ts +50 -0
  578. package/dist/pactile/worktree/manager-core.d.ts.map +1 -0
  579. package/dist/pactile/worktree/manager-core.js +359 -0
  580. package/dist/pactile/worktree/manager-core.js.map +1 -0
  581. package/dist/pactile/worktree/manager-provenance.d.ts +32 -0
  582. package/dist/pactile/worktree/manager-provenance.d.ts.map +1 -0
  583. package/dist/pactile/worktree/manager-provenance.js +409 -0
  584. package/dist/pactile/worktree/manager-provenance.js.map +1 -0
  585. package/dist/pactile/worktree/manager-types.d.ts +84 -0
  586. package/dist/pactile/worktree/manager-types.d.ts.map +1 -0
  587. package/dist/pactile/worktree/manager-types.js +11 -0
  588. package/dist/pactile/worktree/manager-types.js.map +1 -0
  589. package/dist/pactile/worktree/manager.d.ts +10 -0
  590. package/dist/pactile/worktree/manager.d.ts.map +1 -0
  591. package/dist/pactile/worktree/manager.js +6 -0
  592. package/dist/pactile/worktree/manager.js.map +1 -0
  593. package/dist/pactile/worktree/run-workspace-cleanup.d.ts +10 -0
  594. package/dist/pactile/worktree/run-workspace-cleanup.d.ts.map +1 -0
  595. package/dist/pactile/worktree/run-workspace-cleanup.js +695 -0
  596. package/dist/pactile/worktree/run-workspace-cleanup.js.map +1 -0
  597. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts +65 -0
  598. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts.map +1 -0
  599. package/dist/pactile/worktree/run-workspace-lifecycle.js +276 -0
  600. package/dist/pactile/worktree/run-workspace-lifecycle.js.map +1 -0
  601. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-hooks.md +1 -1
  602. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/generated-files.md +1 -1
  603. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/hooks-and-settings.md +1 -1
  604. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/overview.md +1 -1
  605. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/platform-map.md +1 -1
  606. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +2 -0
  607. package/dist/templates/common/skills/brainstorm.md +19 -13
  608. package/dist/templates/markdown/agents.md +2 -2
  609. package/dist/templates/markdown/framework/execution-strategy.md.txt +1 -1
  610. package/dist/templates/markdown/framework/index.md.txt +1 -1
  611. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +17 -105
  612. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +3 -3
  613. package/dist/templates/markdown/framework/release-boundary.md.txt +9 -10
  614. package/dist/templates/markdown/framework/retrieval-daily-guide.md.txt +1 -1
  615. package/dist/templates/pactile/CONTEXT.md +48 -36
  616. package/dist/templates/pactile/modules/approval-personal/contract.md +12 -24
  617. package/dist/templates/pactile/modules/close-basic/contract.md +15 -18
  618. package/dist/templates/pactile/modules/debug-recovery/contract.md +4 -4
  619. package/dist/templates/pactile/modules/define-basic/contract.md +15 -19
  620. package/dist/templates/pactile/modules/define-extended/contract.md +3 -3
  621. package/dist/templates/pactile/modules/execute-agent/contract.md +11 -19
  622. package/dist/templates/pactile/modules/intake-basic/contract.md +16 -13
  623. package/dist/templates/pactile/modules/verify-basic/contract.md +11 -20
  624. package/dist/templates/pactile/tasks/templates/release-execution/design.md +5 -5
  625. package/dist/templates/pactile/tasks/templates/release-readiness/design.md +6 -6
  626. package/dist/templates/pactile/tasks/templates/release-readiness/handoff-template.md +8 -2
  627. package/dist/templates/pactile/workflow.md +37 -41
  628. package/dist/templates/template-utils.d.ts +1 -2
  629. package/dist/templates/template-utils.d.ts.map +1 -1
  630. package/dist/templates/template-utils.js +2 -13
  631. package/dist/templates/template-utils.js.map +1 -1
  632. package/dist/types/ai-tools.d.ts +1 -1
  633. package/dist/types/ai-tools.js +1 -1
  634. package/dist/utils/manifest-prune.js +1 -1
  635. package/dist/utils/manifest-prune.js.map +1 -1
  636. package/dist/utils/p36-upgrade.d.ts +2 -2
  637. package/dist/utils/p36-upgrade.d.ts.map +1 -1
  638. package/dist/utils/p36-upgrade.js +2 -10
  639. package/dist/utils/p36-upgrade.js.map +1 -1
  640. package/dist/utils/post-update-smoke.js +1 -1
  641. package/dist/utils/post-update-smoke.js.map +1 -1
  642. package/dist/utils/readiness.d.ts +2 -2
  643. package/dist/utils/readiness.js +2 -2
  644. package/dist/utils/uninstall-scrubbers.js +1 -1
  645. package/dist/utils/workflow-dir.d.ts +1 -1
  646. package/dist/utils/workflow-dir.d.ts.map +1 -1
  647. package/dist/utils/workflow-dir.js +1 -1
  648. package/dist/utils/workflow-dir.js.map +1 -1
  649. package/package.json +42 -37
  650. package/CHANGELOG.md +0 -651
  651. package/bin/compat-warning.js +0 -11
  652. package/bin/pactile.js +0 -3
  653. package/bin/smart-search.js +0 -38
  654. package/dist/migrations/manifests/0.1.0.json +0 -9
  655. package/dist/migrations/manifests/0.1.1.json +0 -9
  656. package/dist/migrations/manifests/0.1.2.json +0 -9
  657. package/dist/migrations/manifests/0.1.3.json +0 -9
  658. package/dist/migrations/manifests/0.1.4.json +0 -9
  659. package/dist/migrations/manifests/0.2.1.json +0 -9
  660. package/dist/migrations/manifests/0.2.10.json +0 -374
  661. package/dist/migrations/manifests/0.2.2.json +0 -9
  662. package/dist/migrations/manifests/0.2.3.json +0 -9
  663. package/dist/migrations/manifests/0.2.4.json +0 -9
  664. package/dist/migrations/manifests/0.2.5.json +0 -9
  665. package/dist/migrations/manifests/0.2.6.json +0 -9
  666. package/dist/migrations/manifests/0.2.7.json +0 -9
  667. package/dist/migrations/manifests/0.2.8.json +0 -9
  668. package/dist/migrations/manifests/0.2.9.json +0 -9
  669. package/dist/migrations/manifests/0.3.0.json +0 -89
  670. package/dist/migrations/manifests/0.3.1.json +0 -32
  671. package/dist/migrations/manifests/0.3.2.json +0 -16
  672. package/dist/migrations/manifests/0.3.3.json +0 -9
  673. package/dist/migrations/manifests/0.3.4.json +0 -9
  674. package/dist/migrations/manifests/0.3.5.json +0 -9
  675. package/dist/migrations/manifests/0.3.6.json +0 -9
  676. package/dist/migrations/manifests/0.4.0.json +0 -9
  677. package/dist/migrations/manifests/0.4.1.json +0 -9
  678. package/dist/migrations/manifests/0.4.2.json +0 -9
  679. package/dist/migrations/manifests/0.4.3.json +0 -9
  680. package/dist/migrations/manifests/0.5.0-beta.0.json +0 -9
  681. package/dist/migrations/manifests/0.5.0-beta.1.json +0 -9
  682. package/dist/migrations/manifests/0.5.0-beta.2.json +0 -9
  683. package/dist/migrations/manifests/0.5.0-beta.3.json +0 -9
  684. package/dist/migrations/manifests/0.5.0-beta.4.json +0 -9
  685. package/dist/migrations/manifests/0.5.0-beta.5.json +0 -9
  686. package/dist/migrations/manifests/0.5.0.json +0 -9
  687. package/dist/pactile/compat/retired-alternate-client.d.ts +0 -42
  688. package/dist/pactile/compat/retired-alternate-client.d.ts.map +0 -1
  689. package/dist/pactile/compat/retired-alternate-client.js +0 -153
  690. package/dist/pactile/compat/retired-alternate-client.js.map +0 -1
  691. package/dist/pactile/compat/update-residue.d.ts +0 -4
  692. package/dist/pactile/compat/update-residue.d.ts.map +0 -1
  693. package/dist/pactile/compat/update-residue.js +0 -55
  694. package/dist/pactile/compat/update-residue.js.map +0 -1
  695. package/dist/utils/cursor-retrieval-env.d.ts +0 -17
  696. package/dist/utils/cursor-retrieval-env.d.ts.map +0 -1
  697. package/dist/utils/cursor-retrieval-env.js +0 -19
  698. package/dist/utils/cursor-retrieval-env.js.map +0 -1
  699. package/dist/utils/proxy.d.ts +0 -25
  700. package/dist/utils/proxy.d.ts.map +0 -1
  701. package/dist/utils/proxy.js +0 -60
  702. package/dist/utils/proxy.js.map +0 -1
  703. package/scripts/postinstall.js +0 -6
@@ -0,0 +1,1169 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import path from "node:path";
3
+ import { KernelError, isKernelCondition, isKernelOutcome, isKernelPhase, isNonNegativeInt, requireNonEmptyString, } from "./kernel-contract.js";
4
+ import { isPlainObject } from "./schema.js";
5
+ import { verifyProjectFileBaseline } from "./project-file-observer.js";
6
+ import { TASK_DELIVERY_LEVELS, TASK_KERNEL_SCHEMA_VERSION, TASK_RUN_WORKSPACE_CLEANUP_RISK_DISCLOSURE, } from "./task-kernel-types.js";
7
+ export function requireArrayEntry(value, field) {
8
+ if (value === undefined)
9
+ throw new KernelError("CORRUPT_STATE", `${field} is missing`);
10
+ return value;
11
+ }
12
+ const FINGERPRINT_RE = /^[a-f0-9]{64}$/;
13
+ const TASK_ID_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
14
+ const RUN_STATES = [
15
+ "waiting",
16
+ "running",
17
+ "completed",
18
+ "failed",
19
+ "blocked",
20
+ "cancelled",
21
+ ];
22
+ export const REVIEW_DECISIONS = [
23
+ "pass",
24
+ "fail",
25
+ "needs-changes",
26
+ ];
27
+ const EVENT_TYPES = [
28
+ "task.created", "task.dependency-added", "run.queued", "run.started", "run.resumed", "run.completed",
29
+ "run.failed", "run.blocked", "run.cancelled", "run.host-bound", "run.host-settlement-recorded", "run.host-settled",
30
+ "run.workspace-bound", "run.workspace-claim-refused", "run.workspace-integrated", "run.workspace-cleanup-acquired", "run.workspace-reclaimed",
31
+ "run.workspace-cleanup-refused", "run.workspace-retained", "run.workspace-recovery-required", "review.recorded", "task.closed",
32
+ ];
33
+ export function isTaskDeliveryLevel(value) {
34
+ return (typeof value === "string" &&
35
+ TASK_DELIVERY_LEVELS.includes(value));
36
+ }
37
+ export function fingerprintTaskValue(value) {
38
+ return createHash("sha256").update(stableJson(value)).digest("hex");
39
+ }
40
+ export function createTaskCandidateSnapshot(entries) {
41
+ const parsed = parseSnapshotEntries(entries, "candidateEntries");
42
+ if (!parsed.length)
43
+ throw new KernelError("INVALID_REQUEST", "a completed Run requires at least one candidate snapshot entry");
44
+ return {
45
+ id: randomUUID(),
46
+ entries: parsed,
47
+ fingerprint: fingerprintTaskValue(parsed),
48
+ };
49
+ }
50
+ /** Pure V2 lifecycle projection for consumers that need replayable gate facts without mutation. */
51
+ export function projectTaskKernelLifecycle(kernel) {
52
+ const latestRun = kernel.runs.at(-1) ?? null;
53
+ const candidate = latestRun?.candidateSnapshot ?? null;
54
+ const latestReview = latestRun && candidate
55
+ ? (kernel.reviews
56
+ .filter((review) => review.runId === latestRun.id &&
57
+ review.candidateSnapshotId === candidate.id &&
58
+ review.candidateFingerprint === candidate.fingerprint)
59
+ .at(-1) ?? null)
60
+ : null;
61
+ const missingAcceptanceCriteria = latestReview
62
+ ? kernel.definition.acceptanceCriteria
63
+ .filter((criterion) => !getOwnRecordValue(latestReview.acceptanceEvidence, criterion.id)
64
+ ?.length)
65
+ .map((criterion) => criterion.id)
66
+ : kernel.definition.acceptanceCriteria.map((criterion) => criterion.id);
67
+ const activeRun = kernel.runs.find((run) => run.state === "running" || run.state === "waiting") ?? null;
68
+ return {
69
+ taskId: kernel.identity.taskId,
70
+ revision: kernel.revision,
71
+ phase: kernel.phase,
72
+ condition: kernel.condition,
73
+ outcome: kernel.outcome,
74
+ deliveryLevel: kernel.definition.deliveryLevel,
75
+ dependencies: [...kernel.definition.dependencies],
76
+ closed: kernel.phase === "close" && kernel.closure !== null,
77
+ approvalSnapshot: latestRun
78
+ ? {
79
+ recorded: true,
80
+ runId: latestRun.id,
81
+ approvedBy: latestRun.authorization.approvedBy,
82
+ approvedAt: latestRun.authorization.approvedAt,
83
+ scope: latestRun.authorization.scope,
84
+ evidenceRef: latestRun.authorization.evidenceRef,
85
+ }
86
+ : {
87
+ recorded: false,
88
+ runId: null,
89
+ approvedBy: null,
90
+ approvedAt: null,
91
+ scope: null,
92
+ evidenceRef: null,
93
+ },
94
+ gateSnapshot: {
95
+ kernelRevision: kernel.revision,
96
+ runStart: {
97
+ phaseAllowsRun: ["define", "approve", "execute", "verify"].includes(kernel.phase),
98
+ activeRunId: activeRun?.id ?? null,
99
+ hardDependencies: [...kernel.definition.dependencies],
100
+ dependencyKernelCheckRequired: kernel.definition.dependencies.length > 0,
101
+ },
102
+ review: {
103
+ phaseAllowsReview: kernel.phase === "verify" &&
104
+ latestRun?.state === "completed" &&
105
+ candidate !== null,
106
+ runId: latestRun?.id ?? null,
107
+ candidateSnapshotId: candidate?.id ?? null,
108
+ latestReviewId: latestReview?.id ?? null,
109
+ latestDecision: latestReview?.decision ?? null,
110
+ unresolvedBlockers: [...(latestReview?.unresolvedBlockers ?? [])],
111
+ },
112
+ close: {
113
+ phaseAllowsClose: kernel.phase === "verify" &&
114
+ latestRun?.state === "completed" &&
115
+ candidate !== null &&
116
+ latestReview?.decision === "pass",
117
+ runId: latestRun?.id ?? null,
118
+ reviewId: latestReview?.id ?? null,
119
+ candidateSnapshotId: candidate?.id ?? null,
120
+ candidateFingerprint: candidate?.fingerprint ?? null,
121
+ missingAcceptanceCriteria,
122
+ unresolvedBlockers: [...(latestReview?.unresolvedBlockers ?? [])],
123
+ currentCandidateObservationRequired: true,
124
+ deliveryEvidenceRequired: true,
125
+ },
126
+ },
127
+ };
128
+ }
129
+ export function parseTaskKernelSnapshotV2(input) {
130
+ if (!isPlainObject(input) ||
131
+ input.schemaVersion !== TASK_KERNEL_SCHEMA_VERSION) {
132
+ throw new KernelError("CORRUPT_STATE", "kernel is not a Task Kernel schema v2 snapshot");
133
+ }
134
+ const identity = parseObject(input.identity, "kernel.identity");
135
+ const taskId = requireTaskId(identity.taskId, "kernel.identity.taskId");
136
+ const definition = parseDefinition(input.definition, "kernel.definition");
137
+ if (definition.taskId !== taskId)
138
+ throw new KernelError("CORRUPT_STATE", "kernel identity and Task definition IDs differ");
139
+ if (!isNonNegativeInt(input.revision))
140
+ throw new KernelError("CORRUPT_STATE", "kernel.revision must be a non-negative integer");
141
+ if (!isKernelPhase(input.phase))
142
+ throw new KernelError("CORRUPT_STATE", "kernel.phase is invalid");
143
+ if (!isKernelCondition(input.condition))
144
+ throw new KernelError("CORRUPT_STATE", "kernel.condition is invalid");
145
+ if (input.outcome !== null && !isKernelOutcome(input.outcome))
146
+ throw new KernelError("CORRUPT_STATE", "kernel.outcome is invalid");
147
+ if (!Array.isArray(input.runs) ||
148
+ !Array.isArray(input.reviews) ||
149
+ !Array.isArray(input.audit) ||
150
+ !Array.isArray(input.events)) {
151
+ throw new KernelError("CORRUPT_STATE", "kernel runs, reviews, audit, and events must be arrays");
152
+ }
153
+ const runs = input.runs.map((value, index) => parseRun(value, `kernel.runs[${index}]`));
154
+ const reviews = input.reviews.map((value, index) => parseReview(value, `kernel.reviews[${index}]`));
155
+ const audit = input.audit.map((value, index) => parseKernelAudit(value, index));
156
+ const events = input.events.map((value, index) => parseEvent(value, index));
157
+ const runIds = new Set();
158
+ for (const run of runs) {
159
+ if (run.taskId !== taskId || runIds.has(run.id))
160
+ throw new KernelError("CORRUPT_STATE", "Run identity is duplicated or belongs to another Task");
161
+ runIds.add(run.id);
162
+ }
163
+ const reviewIds = new Set();
164
+ for (const review of reviews) {
165
+ if (review.taskId !== taskId ||
166
+ !runIds.has(review.runId) ||
167
+ reviewIds.has(review.id)) {
168
+ throw new KernelError("CORRUPT_STATE", "Review identity is duplicated or references another Task or missing Run");
169
+ }
170
+ const run = runs.find((candidate) => candidate.id === review.runId);
171
+ if (review.candidateSnapshotId !== run?.candidateSnapshot?.id ||
172
+ review.candidateFingerprint !== run.candidateSnapshot.fingerprint) {
173
+ throw new KernelError("CORRUPT_STATE", "Review is not bound to its Run candidate snapshot");
174
+ }
175
+ if (review.decision === "pass" && review.unresolvedBlockers.length)
176
+ throw new KernelError("CORRUPT_STATE", "passing Review cannot contain unresolved blockers");
177
+ reviewIds.add(review.id);
178
+ }
179
+ const closure = input.closure === null
180
+ ? null
181
+ : parseClosure(input.closure, "kernel.closure");
182
+ if (closure &&
183
+ (!runIds.has(closure.runId) || !reviewIds.has(closure.reviewId))) {
184
+ throw new KernelError("CORRUPT_STATE", "Task closure references a missing Run or Review");
185
+ }
186
+ if (closure) {
187
+ const run = runs.find((candidate) => candidate.id === closure.runId);
188
+ const review = reviews.find((candidate) => candidate.id === closure.reviewId);
189
+ if (!run || !review || !run.candidateSnapshot)
190
+ throw new KernelError("CORRUPT_STATE", "Task closure references an incomplete Run or Review");
191
+ if (closure.candidateSnapshotId !== run.candidateSnapshot.id ||
192
+ closure.candidateFingerprint !== run.candidateSnapshot.fingerprint ||
193
+ review.runId !== run.id ||
194
+ review.candidateSnapshotId !== closure.candidateSnapshotId ||
195
+ review.candidateFingerprint !== closure.candidateFingerprint) {
196
+ throw new KernelError("CORRUPT_STATE", "Task closure is not bound to its Run and Review candidate snapshot");
197
+ }
198
+ if (closure.candidateObservation.snapshotId !== closure.candidateSnapshotId ||
199
+ closure.candidateObservation.fingerprint !== closure.candidateFingerprint) {
200
+ throw new KernelError("CORRUPT_STATE", "Task closure candidate observation does not match the accepted candidate");
201
+ }
202
+ }
203
+ validateAuditChain(audit, input.revision);
204
+ validateEvents(events, input.revision);
205
+ return {
206
+ schemaVersion: TASK_KERNEL_SCHEMA_VERSION,
207
+ identity: { taskId },
208
+ revision: input.revision,
209
+ phase: input.phase,
210
+ condition: input.condition,
211
+ outcome: input.outcome,
212
+ definition,
213
+ runs,
214
+ reviews,
215
+ closure,
216
+ audit,
217
+ events,
218
+ };
219
+ }
220
+ export function parseDefinition(value, field) {
221
+ const input = parseObject(value, field);
222
+ const taskId = requireTaskId(input.taskId, `${field}.taskId`);
223
+ if (!isTaskDeliveryLevel(input.deliveryLevel))
224
+ throw new KernelError("INVALID_REQUEST", `${field}.deliveryLevel is invalid`);
225
+ if (!Array.isArray(input.acceptanceCriteria) ||
226
+ input.acceptanceCriteria.length === 0)
227
+ throw new KernelError("INVALID_REQUEST", `${field}.acceptanceCriteria must contain at least one criterion`);
228
+ const criteria = input.acceptanceCriteria.map((item, index) => {
229
+ const criterion = parseObject(item, `${field}.acceptanceCriteria[${index}]`);
230
+ return {
231
+ id: requireNonEmptyString(criterion.id, `${field}.acceptanceCriteria[${index}].id`),
232
+ description: requireNonEmptyString(criterion.description, `${field}.acceptanceCriteria[${index}].description`),
233
+ };
234
+ });
235
+ if (new Set(criteria.map((item) => item.id)).size !== criteria.length)
236
+ throw new KernelError("INVALID_REQUEST", `${field}.acceptanceCriteria IDs must be unique`);
237
+ const dependencies = parseStringArray(input.dependencies, `${field}.dependencies`, true).map((id, index) => requireTaskId(id, `${field}.dependencies[${index}]`));
238
+ if (new Set(dependencies).size !== dependencies.length ||
239
+ dependencies.includes(taskId))
240
+ throw new KernelError("INVALID_REQUEST", `${field}.dependencies must be unique and cannot include the Task itself`);
241
+ return {
242
+ taskId,
243
+ title: requireNonEmptyString(input.title, `${field}.title`),
244
+ description: input.description === undefined
245
+ ? ""
246
+ : requireString(input.description, `${field}.description`, true),
247
+ deliverable: requireNonEmptyString(input.deliverable, `${field}.deliverable`),
248
+ deliveryLevel: input.deliveryLevel,
249
+ acceptanceCriteria: criteria,
250
+ dependencies,
251
+ createdAt: requireNonEmptyString(input.createdAt, `${field}.createdAt`),
252
+ createdBy: requireNonEmptyString(input.createdBy, `${field}.createdBy`),
253
+ };
254
+ }
255
+ function parseRun(value, field) {
256
+ const input = parseObject(value, field);
257
+ const state = input.state;
258
+ if (typeof state !== "string" ||
259
+ !RUN_STATES.includes(state))
260
+ throw new KernelError("CORRUPT_STATE", `${field}.state is invalid`);
261
+ const snapshot = input.candidateSnapshot === null
262
+ ? null
263
+ : parseCandidateSnapshot(input.candidateSnapshot, `${field}.candidateSnapshot`);
264
+ const result = input.result === null
265
+ ? null
266
+ : parseRunResult(input.result, `${field}.result`);
267
+ const runId = requireNonEmptyString(input.id, `${field}.id`);
268
+ const workspace = input.workspace === null
269
+ ? null
270
+ : parseWorkspaceBinding(input.workspace, runId, `${field}.workspace`);
271
+ if (result?.evidenceVerification &&
272
+ (!snapshot ||
273
+ result.evidenceVerification.runId !== runId ||
274
+ result.evidenceVerification.candidateSnapshotId !== snapshot.id ||
275
+ result.evidenceVerification.candidateFingerprint !== snapshot.fingerprint ||
276
+ JSON.stringify(result.evidenceVerification.items.map((item) => item.ref)) !==
277
+ JSON.stringify(result.evidenceRefs))) {
278
+ throw new KernelError("CORRUPT_STATE", `${field}.result.evidenceVerification must bind exactly to the Run result and candidate snapshot`);
279
+ }
280
+ const failure = input.failure === null
281
+ ? null
282
+ : parseFailure(input.failure, `${field}.failure`);
283
+ if ((state === "running" || state === "waiting") &&
284
+ (snapshot || result || failure || input.completedAt !== null))
285
+ throw new KernelError("CORRUPT_STATE", `${field} non-terminal state cannot have terminal data`);
286
+ if (state === "completed" &&
287
+ (!snapshot || !result || failure || typeof input.completedAt !== "string"))
288
+ throw new KernelError("CORRUPT_STATE", `${field} completed state requires candidate, result, and completion time`);
289
+ if ((state === "failed" || state === "blocked" || state === "cancelled") &&
290
+ (!failure ||
291
+ typeof input.completedAt !== "string" ||
292
+ (result && !result.summary)))
293
+ throw new KernelError("CORRUPT_STATE", `${field} failed/blocked/cancelled state requires failure details and completion time`);
294
+ const candidateBaseSha = input.candidateBaseSha === undefined || input.candidateBaseSha === null
295
+ ? (workspace?.baseSha ?? null)
296
+ : parseCommitSha(input.candidateBaseSha, `${field}.candidateBaseSha`);
297
+ const candidateBaseBranch = input.candidateBaseBranch === undefined ||
298
+ input.candidateBaseBranch === null
299
+ ? (workspace?.branch ?? null)
300
+ : requireNonEmptyString(input.candidateBaseBranch, `${field}.candidateBaseBranch`);
301
+ if (candidateBaseBranch !== null &&
302
+ candidateBaseBranch !== candidateBaseBranch.trim()) {
303
+ throw new KernelError("CORRUPT_STATE", `${field}.candidateBaseBranch must be a trimmed branch name`);
304
+ }
305
+ const candidateFileBaseline = input.candidateFileBaseline === undefined ||
306
+ input.candidateFileBaseline === null
307
+ ? null
308
+ : parseProjectFileBaseline(input.candidateFileBaseline, `${field}.candidateFileBaseline`);
309
+ if (candidateFileBaseline !== null &&
310
+ (workspace !== null || candidateBaseSha !== null || candidateBaseBranch !== null)) {
311
+ throw new KernelError("CORRUPT_STATE", `${field} cannot combine a non-Git file baseline with a Git or managed-worktree baseline`);
312
+ }
313
+ if (workspace &&
314
+ (candidateBaseSha?.toLowerCase() !== workspace.baseSha.toLowerCase() ||
315
+ candidateBaseBranch !== workspace.branch)) {
316
+ throw new KernelError("CORRUPT_STATE", `${field} candidate Git baseline must match its workspace base and branch`);
317
+ }
318
+ return {
319
+ id: runId,
320
+ taskId: requireTaskId(input.taskId, `${field}.taskId`),
321
+ attempt: requirePositiveInt(input.attempt, `${field}.attempt`),
322
+ sequence: requirePositiveInt(input.sequence, `${field}.sequence`),
323
+ state: state,
324
+ startedAt: requireNonEmptyString(input.startedAt, `${field}.startedAt`),
325
+ startedBy: requireNonEmptyString(input.startedBy, `${field}.startedBy`),
326
+ input: parseRunInput(input.input, `${field}.input`),
327
+ authorization: parseAuthorization(input.authorization, `${field}.authorization`),
328
+ writeSetSnapshot: parseStringArray(input.writeSetSnapshot, `${field}.writeSetSnapshot`, true),
329
+ estimatedDurations: parseDurations(input.estimatedDurations, `${field}.estimatedDurations`),
330
+ measurementRefs: parseMeasurementRefs(input.measurementRefs, `${field}.measurementRefs`),
331
+ candidateBaseSha,
332
+ candidateBaseBranch,
333
+ candidateFileBaseline,
334
+ workspace,
335
+ host: input.host === null
336
+ ? null
337
+ : parseHostBinding(input.host, `${field}.host`),
338
+ candidateSnapshot: snapshot,
339
+ result,
340
+ failure,
341
+ completedAt: input.completedAt === null
342
+ ? null
343
+ : requireNonEmptyString(input.completedAt, `${field}.completedAt`),
344
+ };
345
+ }
346
+ function parseProjectFileBaseline(value, field) {
347
+ const input = parseObject(value, field);
348
+ if (input.schemaVersion !== 1 ||
349
+ input.source !== "pactile-project-file-baseline-v1" ||
350
+ input.policy !== "project-files-bounded-v1" ||
351
+ !Array.isArray(input.files)) {
352
+ throw new KernelError("CORRUPT_STATE", `${field} has an unsupported policy or shape`);
353
+ }
354
+ const files = input.files.map((value, index) => {
355
+ const entry = parseObject(value, `${field}.files[${index}]`);
356
+ if (!isNonNegativeInt(entry.sizeBytes)) {
357
+ throw new KernelError("CORRUPT_STATE", `${field}.files[${index}].sizeBytes must be a non-negative integer`);
358
+ }
359
+ return {
360
+ path: requireNonEmptyString(entry.path, `${field}.files[${index}].path`),
361
+ sizeBytes: entry.sizeBytes,
362
+ sha256: requireFingerprint(entry.sha256, `${field}.files[${index}].sha256`),
363
+ };
364
+ });
365
+ const baseline = {
366
+ schemaVersion: 1,
367
+ source: "pactile-project-file-baseline-v1",
368
+ policy: "project-files-bounded-v1",
369
+ rootIdentitySha256: requireFingerprint(input.rootIdentitySha256, `${field}.rootIdentitySha256`),
370
+ files,
371
+ fingerprint: requireFingerprint(input.fingerprint, `${field}.fingerprint`),
372
+ };
373
+ if (!verifyProjectFileBaseline(baseline)) {
374
+ throw new KernelError("CORRUPT_STATE", `${field} fingerprint, paths, or snapshot budget is invalid`);
375
+ }
376
+ return baseline;
377
+ }
378
+ function parseReview(value, field) {
379
+ const input = parseObject(value, field);
380
+ if (!REVIEW_DECISIONS.includes(input.decision))
381
+ throw new KernelError("CORRUPT_STATE", `${field}.decision is invalid`);
382
+ if (input.independent !== true)
383
+ throw new KernelError("CORRUPT_STATE", `${field}.independent must be true`);
384
+ const unresolvedBlockers = parseStringArray(input.unresolvedBlockers, `${field}.unresolvedBlockers`, true);
385
+ if (input.decision === "pass" && unresolvedBlockers.length)
386
+ throw new KernelError("CORRUPT_STATE", `${field} passing Review cannot contain unresolved blockers`);
387
+ const id = requireNonEmptyString(input.id, `${field}.id`);
388
+ const taskId = requireTaskId(input.taskId, `${field}.taskId`);
389
+ const runId = requireNonEmptyString(input.runId, `${field}.runId`);
390
+ const candidateSnapshotId = requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`);
391
+ const candidateFingerprint = requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`);
392
+ const reviewer = requireNonEmptyString(input.reviewer, `${field}.reviewer`);
393
+ const evidenceRefs = parseStringArray(input.evidenceRefs, `${field}.evidenceRefs`);
394
+ const acceptanceEvidence = parseEvidenceMap(input.acceptanceEvidence, `${field}.acceptanceEvidence`, input.decision !== "pass");
395
+ const evidenceVerification = input.evidenceVerification === undefined
396
+ ? undefined
397
+ : parseReviewEvidenceVerification(input.evidenceVerification, `${field}.evidenceVerification`, {
398
+ runId,
399
+ candidateSnapshotId,
400
+ candidateFingerprint,
401
+ evidenceRefs,
402
+ acceptanceEvidence,
403
+ });
404
+ return {
405
+ id,
406
+ taskId,
407
+ runId,
408
+ candidateSnapshotId,
409
+ candidateFingerprint,
410
+ reviewer,
411
+ independent: true,
412
+ decision: input.decision,
413
+ evidenceRefs,
414
+ acceptanceEvidence,
415
+ ...(evidenceVerification === undefined ? {} : { evidenceVerification }),
416
+ unresolvedBlockers,
417
+ reviewedAt: requireNonEmptyString(input.reviewedAt, `${field}.reviewedAt`),
418
+ };
419
+ }
420
+ function parseReviewEvidenceVerification(value, field, binding) {
421
+ const input = parseObject(value, field);
422
+ if (input.schemaVersion !== 1 ||
423
+ input.source !== "pactile-task-review-evidence-v1") {
424
+ throw new KernelError("CORRUPT_STATE", `${field} has an unsupported source or schema version`);
425
+ }
426
+ const observedAt = requireNonEmptyString(input.observedAt, `${field}.observedAt`);
427
+ if (!Number.isFinite(Date.parse(observedAt))) {
428
+ throw new KernelError("CORRUPT_STATE", `${field}.observedAt is invalid`);
429
+ }
430
+ const runId = requireNonEmptyString(input.runId, `${field}.runId`);
431
+ const candidateSnapshotId = requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`);
432
+ const candidateFingerprint = requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`);
433
+ if (runId !== binding.runId ||
434
+ candidateSnapshotId !== binding.candidateSnapshotId ||
435
+ candidateFingerprint !== binding.candidateFingerprint) {
436
+ throw new KernelError("CORRUPT_STATE", `${field} is not bound to the Review Run and candidate`);
437
+ }
438
+ if (!Array.isArray(input.items)) {
439
+ throw new KernelError("CORRUPT_STATE", `${field}.items must be an array`);
440
+ }
441
+ const items = input.items.map((value, index) => {
442
+ const itemField = `${field}.items[${index}]`;
443
+ const item = parseObject(value, itemField);
444
+ const source = item.source;
445
+ if (source !== "candidate-snapshot" &&
446
+ source !== "run-evidence" &&
447
+ source !== "task-evidence" &&
448
+ source !== "pactile-receipt") {
449
+ throw new KernelError("CORRUPT_STATE", `${itemField}.source is invalid`);
450
+ }
451
+ if (!isNonNegativeInt(item.sizeBytes)) {
452
+ throw new KernelError("CORRUPT_STATE", `${itemField}.sizeBytes must be a non-negative integer`);
453
+ }
454
+ return {
455
+ ref: parseRepositoryRelativePath(item.ref, `${itemField}.ref`),
456
+ sha256: requireFingerprint(item.sha256, `${itemField}.sha256`),
457
+ sizeBytes: item.sizeBytes,
458
+ source: source,
459
+ };
460
+ });
461
+ const refs = items.map((item) => item.ref);
462
+ if (new Set(refs).size !== refs.length) {
463
+ throw new KernelError("CORRUPT_STATE", `${field}.items contains duplicate refs`);
464
+ }
465
+ const expectedRefs = [
466
+ ...new Set([
467
+ ...binding.evidenceRefs,
468
+ ...Object.values(binding.acceptanceEvidence).flat(),
469
+ ]),
470
+ ].sort();
471
+ if (JSON.stringify([...refs].sort()) !== JSON.stringify(expectedRefs)) {
472
+ throw new KernelError("CORRUPT_STATE", `${field}.items must match all Review and acceptance evidence references`);
473
+ }
474
+ return {
475
+ schemaVersion: 1,
476
+ source: "pactile-task-review-evidence-v1",
477
+ observedAt,
478
+ runId,
479
+ candidateSnapshotId,
480
+ candidateFingerprint,
481
+ items,
482
+ };
483
+ }
484
+ function parseClosure(value, field) {
485
+ const input = parseObject(value, field);
486
+ const deliveryEvidence = parseDeliveryEvidence(input.deliveryEvidence);
487
+ const deliveryVerification = input.deliveryVerification === undefined
488
+ ? undefined
489
+ : parseDeliveryVerification(input.deliveryVerification, `${field}.deliveryVerification`);
490
+ if (deliveryVerification &&
491
+ (deliveryVerification.level !== deliveryEvidence.level ||
492
+ deliveryVerification.path !== deliveryEvidence.path)) {
493
+ throw new KernelError("CORRUPT_STATE", `${field}.deliveryVerification must match the recorded delivery level and path`);
494
+ }
495
+ return {
496
+ runId: requireNonEmptyString(input.runId, `${field}.runId`),
497
+ reviewId: requireNonEmptyString(input.reviewId, `${field}.reviewId`),
498
+ candidateSnapshotId: requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`),
499
+ candidateFingerprint: requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`),
500
+ candidateObservation: parseCandidateObservation(input.candidateObservation),
501
+ deliveryEvidence,
502
+ acceptanceEvidence: parseEvidenceMap(input.acceptanceEvidence, `${field}.acceptanceEvidence`),
503
+ ...(deliveryVerification === undefined ? {} : { deliveryVerification }),
504
+ closedAt: requireNonEmptyString(input.closedAt, `${field}.closedAt`),
505
+ closedBy: requireNonEmptyString(input.closedBy, `${field}.closedBy`),
506
+ };
507
+ }
508
+ function parseCommitSha(value, field) {
509
+ const sha = requireNonEmptyString(value, field).toLowerCase();
510
+ if (!/^[a-f0-9]{40}([a-f0-9]{24})?$/.test(sha)) {
511
+ throw new KernelError("CORRUPT_STATE", `${field} must be a full Git commit SHA`);
512
+ }
513
+ return sha;
514
+ }
515
+ function parseDeliveryVerification(value, field) {
516
+ const input = parseObject(value, field);
517
+ if (input.schemaVersion !== 1 ||
518
+ input.source !== "pactile-task-delivery-observer-v1") {
519
+ throw new KernelError("CORRUPT_STATE", `${field} has an unsupported source or schema version`);
520
+ }
521
+ if (!isTaskDeliveryLevel(input.level))
522
+ throw new KernelError("CORRUPT_STATE", `${field}.level is invalid`);
523
+ const nullableSha = (item, name) => item === null ? null : parseCommitSha(item, `${field}.${name}`);
524
+ const nullableFileHash = (item, name) => item === null ? null : requireFingerprint(item, `${field}.${name}`);
525
+ let pullRequest = null;
526
+ if (input.pullRequest !== null) {
527
+ const pr = parseObject(input.pullRequest, `${field}.pullRequest`);
528
+ if (pr.source !== "github-rest-pull-request-v1" ||
529
+ (pr.state !== "open" && pr.state !== "closed")) {
530
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest source or state is invalid`);
531
+ }
532
+ if (typeof pr.draft !== "boolean" ||
533
+ typeof pr.merged !== "boolean" ||
534
+ !Number.isSafeInteger(pr.number) ||
535
+ Number(pr.number) < 1) {
536
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest facts are invalid`);
537
+ }
538
+ let url;
539
+ try {
540
+ url = new URL(requireNonEmptyString(pr.url, `${field}.pullRequest.url`));
541
+ }
542
+ catch {
543
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest.url must be an absolute HTTPS URL`);
544
+ }
545
+ if (url.protocol !== "https:")
546
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest.url must be HTTPS`);
547
+ pullRequest = {
548
+ source: "github-rest-pull-request-v1",
549
+ url: url.toString(),
550
+ repository: requireNonEmptyString(pr.repository, `${field}.pullRequest.repository`).toLowerCase(),
551
+ number: Number(pr.number),
552
+ state: pr.state,
553
+ draft: pr.draft,
554
+ headSha: parseCommitSha(pr.headSha, `${field}.pullRequest.headSha`),
555
+ baseBranch: requireNonEmptyString(pr.baseBranch, `${field}.pullRequest.baseBranch`),
556
+ merged: pr.merged,
557
+ mergeCommitSha: nullableSha(pr.mergeCommitSha, `${field}.pullRequest.mergeCommitSha`),
558
+ };
559
+ if (pullRequest.merged && pullRequest.state !== "closed") {
560
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest merged state is inconsistent`);
561
+ }
562
+ }
563
+ if (input.ancestryVerified !== null &&
564
+ typeof input.ancestryVerified !== "boolean") {
565
+ throw new KernelError("CORRUPT_STATE", `${field}.ancestryVerified must be boolean or null`);
566
+ }
567
+ const candidateFingerprint = requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`);
568
+ const candidateSource = input.candidateSource === undefined
569
+ ? (input.candidateHead === null ? null : "git-working-tree-v1")
570
+ : input.candidateSource;
571
+ if (candidateSource !== "git-working-tree-v1" &&
572
+ candidateSource !== "project-files-v1") {
573
+ throw new KernelError("CORRUPT_STATE", `${field}.candidateSource is invalid`);
574
+ }
575
+ const candidateHead = input.candidateHead === null
576
+ ? null
577
+ : parseCommitSha(input.candidateHead, `${field}.candidateHead`);
578
+ if ((candidateSource === "git-working-tree-v1" && candidateHead === null) ||
579
+ (candidateSource === "project-files-v1" && candidateHead !== null)) {
580
+ throw new KernelError("CORRUPT_STATE", `${field}.candidateSource and candidateHead disagree`);
581
+ }
582
+ const path = parseRepositoryRelativePath(input.path, `${field}.path`);
583
+ const fileSha256 = requireFingerprint(input.fileSha256, `${field}.fileSha256`);
584
+ const gitBlobSha256 = nullableFileHash(input.gitBlobSha256, "gitBlobSha256");
585
+ const targetBranch = input.targetBranch === null
586
+ ? null
587
+ : requireNonEmptyString(input.targetBranch, `${field}.targetBranch`);
588
+ const targetSha = nullableSha(input.targetSha, "targetSha");
589
+ const integrationCommitSha = nullableSha(input.integrationCommitSha, "integrationCommitSha");
590
+ const ancestryVerified = input.ancestryVerified;
591
+ if (candidateSource === "project-files-v1" &&
592
+ (input.level === "pull-request" ||
593
+ input.level === "merged-result" ||
594
+ gitBlobSha256 !== null ||
595
+ pullRequest !== null ||
596
+ targetBranch !== null ||
597
+ targetSha !== null ||
598
+ integrationCommitSha !== null ||
599
+ ancestryVerified !== null)) {
600
+ throw new KernelError("CORRUPT_STATE", `${field} non-Git snapshots only support local-result or documentation delivery`);
601
+ }
602
+ if (pullRequest) {
603
+ const url = new URL(pullRequest.url);
604
+ const parts = url.pathname.split("/").filter(Boolean);
605
+ const urlRepository = `${parts[0] ?? ""}/${parts[1] ?? ""}`.toLowerCase();
606
+ if (url.origin !== "https://github.com" ||
607
+ url.search.length > 0 ||
608
+ url.hash.length > 0 ||
609
+ parts.length !== 4 ||
610
+ parts[2]?.toLowerCase() !== "pull" ||
611
+ !/^\d+$/.test(parts[3] ?? "") ||
612
+ urlRepository !== pullRequest.repository ||
613
+ Number(parts[3]) !== pullRequest.number) {
614
+ throw new KernelError("CORRUPT_STATE", `${field}.pullRequest URL must identify its recorded GitHub repository and number`);
615
+ }
616
+ }
617
+ if (input.level === "pull-request") {
618
+ if (candidateSource !== "git-working-tree-v1" ||
619
+ pullRequest?.state !== "open" ||
620
+ pullRequest.merged ||
621
+ pullRequest.draft ||
622
+ pullRequest.headSha !== candidateHead ||
623
+ gitBlobSha256 === null ||
624
+ fileSha256 !== gitBlobSha256 ||
625
+ targetBranch !== null ||
626
+ targetSha !== null ||
627
+ integrationCommitSha !== null ||
628
+ ancestryVerified !== null) {
629
+ throw new KernelError("CORRUPT_STATE", `${field} has inconsistent pull-request delivery facts`);
630
+ }
631
+ }
632
+ else if (input.level === "merged-result") {
633
+ if (candidateSource !== "git-working-tree-v1" ||
634
+ pullRequest?.state !== "closed" ||
635
+ !pullRequest.merged ||
636
+ pullRequest.draft ||
637
+ pullRequest.headSha !== candidateHead ||
638
+ gitBlobSha256 === null ||
639
+ fileSha256 !== gitBlobSha256 ||
640
+ !pullRequest.mergeCommitSha ||
641
+ !targetBranch ||
642
+ !targetSha ||
643
+ integrationCommitSha !== pullRequest.mergeCommitSha ||
644
+ ancestryVerified !== true) {
645
+ throw new KernelError("CORRUPT_STATE", `${field} has inconsistent merged-result delivery facts`);
646
+ }
647
+ }
648
+ else if (pullRequest !== null ||
649
+ targetBranch !== null ||
650
+ targetSha !== null ||
651
+ integrationCommitSha !== null ||
652
+ ancestryVerified !== null) {
653
+ throw new KernelError("CORRUPT_STATE", `${field} has integration or Pull Request facts for a local delivery`);
654
+ }
655
+ return {
656
+ schemaVersion: 1,
657
+ source: "pactile-task-delivery-observer-v1",
658
+ observedAt: requireNonEmptyString(input.observedAt, `${field}.observedAt`),
659
+ candidateFingerprint,
660
+ candidateSource,
661
+ candidateHead,
662
+ level: input.level,
663
+ path,
664
+ fileSha256,
665
+ gitBlobSha256,
666
+ targetBranch,
667
+ targetSha,
668
+ integrationCommitSha,
669
+ ancestryVerified,
670
+ pullRequest,
671
+ };
672
+ }
673
+ function parseRepositoryRelativePath(value, field) {
674
+ const input = requireNonEmptyString(value, field);
675
+ const normalized = input.replace(/\\/g, "/");
676
+ const segments = normalized.split("/");
677
+ if (normalized.startsWith("/") ||
678
+ /^[A-Za-z]:/.test(normalized) ||
679
+ segments.some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
680
+ throw new KernelError("CORRUPT_STATE", `${field} must be a safe repository-relative path`);
681
+ }
682
+ return segments.join("/");
683
+ }
684
+ export function parseDeliveryEvidence(value, expectedLevel) {
685
+ const input = parseObject(value, "deliveryEvidence");
686
+ if (!isTaskDeliveryLevel(input.level))
687
+ throw new KernelError("INVALID_DELIVERY_EVIDENCE", "delivery evidence level is invalid");
688
+ if (expectedLevel && input.level !== expectedLevel)
689
+ throw new KernelError("INVALID_DELIVERY_EVIDENCE", `Task requires delivery level ${expectedLevel}, got ${input.level}`);
690
+ const reference = requireNonEmptyString(input.reference, "deliveryEvidence.reference");
691
+ const summary = requireNonEmptyString(input.summary, "deliveryEvidence.summary");
692
+ if (input.level === "pull-request" || input.level === "merged-result") {
693
+ let url;
694
+ try {
695
+ url = new URL(reference);
696
+ }
697
+ catch {
698
+ throw new KernelError("INVALID_DELIVERY_EVIDENCE", `${input.level} requires an absolute HTTPS URL reference`);
699
+ }
700
+ if (url.protocol !== "https:")
701
+ throw new KernelError("INVALID_DELIVERY_EVIDENCE", `${input.level} requires an HTTPS reference`);
702
+ }
703
+ const pathValue = input.path === undefined
704
+ ? undefined
705
+ : parseRepositoryRelativePath(input.path, "deliveryEvidence.path");
706
+ const targetBranch = input.targetBranch === undefined
707
+ ? undefined
708
+ : requireNonEmptyString(input.targetBranch, "deliveryEvidence.targetBranch");
709
+ return {
710
+ level: input.level,
711
+ reference,
712
+ summary,
713
+ ...(pathValue === undefined ? {} : { path: pathValue }),
714
+ ...(targetBranch === undefined ? {} : { targetBranch }),
715
+ };
716
+ }
717
+ export function parseRunInput(value, field) {
718
+ const input = parseObject(value, field);
719
+ const summary = requireNonEmptyString(input.summary, `${field}.summary`);
720
+ const references = parseStringArray(input.references, `${field}.references`, true);
721
+ const expected = fingerprintTaskValue({ summary, references });
722
+ if (input.fingerprint !== undefined && input.fingerprint !== expected)
723
+ throw new KernelError("INVALID_REQUEST", `${field}.fingerprint does not match its contents`);
724
+ return { summary, references, fingerprint: expected };
725
+ }
726
+ export function parseAuthorization(value, field) {
727
+ const input = parseObject(value, field);
728
+ return {
729
+ approvedBy: requireNonEmptyString(input.approvedBy, `${field}.approvedBy`),
730
+ approvedAt: requireNonEmptyString(input.approvedAt, `${field}.approvedAt`),
731
+ scope: requireNonEmptyString(input.scope, `${field}.scope`),
732
+ evidenceRef: requireNonEmptyString(input.evidenceRef, `${field}.evidenceRef`),
733
+ };
734
+ }
735
+ function parseCandidateSnapshot(value, field) {
736
+ const input = parseObject(value, field);
737
+ const entries = parseSnapshotEntries(input.entries, `${field}.entries`);
738
+ if (!entries.length)
739
+ throw new KernelError("CORRUPT_STATE", `${field}.entries cannot be empty`);
740
+ const fingerprint = fingerprintTaskValue(entries);
741
+ if (input.fingerprint !== fingerprint)
742
+ throw new KernelError("CORRUPT_STATE", `${field}.fingerprint does not match its entries`);
743
+ return {
744
+ id: requireNonEmptyString(input.id, `${field}.id`),
745
+ entries,
746
+ fingerprint,
747
+ };
748
+ }
749
+ export function parseCandidateObservation(value) {
750
+ const input = parseObject(value, "candidateObservation");
751
+ return {
752
+ snapshotId: requireNonEmptyString(input.snapshotId, "candidateObservation.snapshotId"),
753
+ fingerprint: requireFingerprint(input.fingerprint, "candidateObservation.fingerprint"),
754
+ observedBy: requireNonEmptyString(input.observedBy, "candidateObservation.observedBy"),
755
+ observedAt: requireNonEmptyString(input.observedAt, "candidateObservation.observedAt"),
756
+ source: requireNonEmptyString(input.source, "candidateObservation.source"),
757
+ evidenceRef: requireNonEmptyString(input.evidenceRef, "candidateObservation.evidenceRef"),
758
+ };
759
+ }
760
+ export function parseDurations(value, field) {
761
+ const input = parseObject(value, field);
762
+ const duration = (name) => {
763
+ const raw = input[name];
764
+ if (raw === undefined || raw === null)
765
+ return null;
766
+ if (!isNonNegativeInt(raw))
767
+ throw new KernelError("INVALID_REQUEST", `${field}.${name} must be a non-negative integer or null`);
768
+ return raw;
769
+ };
770
+ return {
771
+ executionMs: duration("executionMs"),
772
+ waitingMs: duration("waitingMs"),
773
+ reviewMs: duration("reviewMs"),
774
+ };
775
+ }
776
+ export function parseMeasurementRefs(value, field) {
777
+ const input = parseObject(value, field);
778
+ const reference = (name) => input[name] === undefined || input[name] === null
779
+ ? null
780
+ : requireNonEmptyString(input[name], `${field}.${name}`);
781
+ return {
782
+ execution: reference("execution"),
783
+ waiting: reference("waiting"),
784
+ review: reference("review"),
785
+ };
786
+ }
787
+ export function parseSnapshotEntries(value, field) {
788
+ if (!Array.isArray(value))
789
+ throw new KernelError("INVALID_REQUEST", `${field} must be an array`);
790
+ const entries = value
791
+ .map((item, index) => {
792
+ const input = parseObject(item, `${field}[${index}]`);
793
+ return {
794
+ ref: requireNonEmptyString(input.ref, `${field}[${index}].ref`),
795
+ fingerprint: requireFingerprint(input.fingerprint, `${field}[${index}].fingerprint`),
796
+ };
797
+ })
798
+ .sort((a, b) => a.ref.localeCompare(b.ref));
799
+ if (new Set(entries.map((entry) => entry.ref)).size !== entries.length)
800
+ throw new KernelError("INVALID_REQUEST", `${field} refs must be unique`);
801
+ return entries;
802
+ }
803
+ function parseTaskRunEvidenceVerificationV1(value, field) {
804
+ const input = parseObject(value, field);
805
+ if (input.schemaVersion !== 1 || input.source !== "pactile-task-run-evidence-v1") {
806
+ throw new KernelError("CORRUPT_STATE", `${field} has an unsupported schema or source`);
807
+ }
808
+ if (!Array.isArray(input.items) || input.items.length > 128) {
809
+ throw new KernelError("CORRUPT_STATE", `${field}.items must be an array with at most 128 entries`);
810
+ }
811
+ const items = input.items.map((value, index) => {
812
+ const item = parseObject(value, `${field}.items[${index}]`);
813
+ if (item.source !== "candidate-snapshot" &&
814
+ item.source !== "task-evidence") {
815
+ throw new KernelError("CORRUPT_STATE", `${field}.items[${index}].source is invalid`);
816
+ }
817
+ const sizeBytes = item.sizeBytes;
818
+ if (!isNonNegativeInt(sizeBytes) || sizeBytes > 8 * 1024 * 1024) {
819
+ throw new KernelError("CORRUPT_STATE", `${field}.items[${index}].sizeBytes is out of bounds`);
820
+ }
821
+ return {
822
+ ref: requireNonEmptyString(item.ref, `${field}.items[${index}].ref`),
823
+ sha256: requireFingerprint(item.sha256, `${field}.items[${index}].sha256`),
824
+ sizeBytes,
825
+ source: item.source,
826
+ };
827
+ });
828
+ if (new Set(items.map((item) => item.ref)).size !== items.length) {
829
+ throw new KernelError("CORRUPT_STATE", `${field}.items refs must be unique`);
830
+ }
831
+ if (items.reduce((total, item) => total + item.sizeBytes, 0) > 32 * 1024 * 1024) {
832
+ throw new KernelError("CORRUPT_STATE", `${field}.items exceed the total byte limit`);
833
+ }
834
+ return {
835
+ schemaVersion: 1,
836
+ source: "pactile-task-run-evidence-v1",
837
+ observedAt: requireNonEmptyString(input.observedAt, `${field}.observedAt`),
838
+ runId: requireNonEmptyString(input.runId, `${field}.runId`),
839
+ candidateSnapshotId: requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`),
840
+ candidateFingerprint: requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`),
841
+ items,
842
+ };
843
+ }
844
+ function parseRunResult(value, field) {
845
+ const input = parseObject(value, field);
846
+ const evidenceRefs = parseStringArray(input.evidenceRefs, `${field}.evidenceRefs`, true);
847
+ const evidenceVerification = input.evidenceVerification === undefined
848
+ ? undefined
849
+ : parseTaskRunEvidenceVerificationV1(input.evidenceVerification, `${field}.evidenceVerification`);
850
+ return {
851
+ summary: requireNonEmptyString(input.summary, `${field}.summary`),
852
+ evidenceRefs,
853
+ ...(evidenceVerification ? { evidenceVerification } : {}),
854
+ };
855
+ }
856
+ export function parseFailure(value, field) {
857
+ const input = parseObject(value, field);
858
+ return {
859
+ category: requireNonEmptyString(input.category, `${field}.category`),
860
+ message: requireNonEmptyString(input.message, `${field}.message`),
861
+ evidenceRef: input.evidenceRef === null || input.evidenceRef === undefined
862
+ ? null
863
+ : requireNonEmptyString(input.evidenceRef, `${field}.evidenceRef`),
864
+ };
865
+ }
866
+ export function parseWorkspaceBinding(value, runId, field) {
867
+ const input = parseObject(value, field);
868
+ if (input.ownerRunId !== runId)
869
+ throw new KernelError("CORRUPT_STATE", `${field}.ownerRunId must match its Run`);
870
+ const canonicalPath = requireNonEmptyString(input.canonicalPath, `${field}.canonicalPath`);
871
+ if (!path.isAbsolute(canonicalPath))
872
+ throw new KernelError("INVALID_REQUEST", `${field}.canonicalPath must be absolute`);
873
+ if (input.integrationState !== "not-integrated" &&
874
+ input.integrationState !== "integrated")
875
+ throw new KernelError("CORRUPT_STATE", `${field}.integrationState is invalid`);
876
+ if (![
877
+ "not-requested",
878
+ "pending",
879
+ "reclaimed",
880
+ "failed",
881
+ "recovery-required",
882
+ ].includes(String(input.reclamationState)))
883
+ throw new KernelError("CORRUPT_STATE", `${field}.reclamationState is invalid`);
884
+ return {
885
+ ownerRunId: runId,
886
+ canonicalPath,
887
+ branch: requireNonEmptyString(input.branch, `${field}.branch`),
888
+ baseSha: requireNonEmptyString(input.baseSha, `${field}.baseSha`),
889
+ writeSet: parseStringArray(input.writeSet, `${field}.writeSet`, true),
890
+ integrationState: input.integrationState,
891
+ reclamationState: input.reclamationState,
892
+ manager: input.manager === null || input.manager === undefined ? null : parseWorkspaceManagerBinding(input.manager, `${field}.manager`),
893
+ integrationReceipt: input.integrationReceipt === null || input.integrationReceipt === undefined ? null : parseWorkspaceIntegrationReceipt(input.integrationReceipt, `${field}.integrationReceipt`),
894
+ cleanupLease: input.cleanupLease === null || input.cleanupLease === undefined ? null : parseWorkspaceCleanupLease(input.cleanupLease, `${field}.cleanupLease`),
895
+ };
896
+ }
897
+ function parseWorkspaceManagerBinding(value, field) {
898
+ const input = parseObject(value, field);
899
+ if (input.version !== 1)
900
+ throw new KernelError("CORRUPT_STATE", `${field}.version is invalid`);
901
+ if (input.source !== "created" && input.source !== "adopted")
902
+ throw new KernelError("CORRUPT_STATE", `${field}.source is invalid`);
903
+ for (const name of ["projectRoot", "commonDir", "gitDir"]) {
904
+ const candidate = requireNonEmptyString(input[name], `${field}.${name}`);
905
+ if (!path.isAbsolute(candidate))
906
+ throw new KernelError("CORRUPT_STATE", `${field}.${name} must be absolute`);
907
+ }
908
+ return {
909
+ version: 1,
910
+ credentialId: requireNonEmptyString(input.credentialId, `${field}.credentialId`),
911
+ projectRoot: input.projectRoot,
912
+ commonDir: input.commonDir,
913
+ gitDir: input.gitDir,
914
+ source: input.source,
915
+ recordedAt: requireNonEmptyString(input.recordedAt, `${field}.recordedAt`),
916
+ };
917
+ }
918
+ export function parseWorkspaceIntegrationReceipt(value, field) {
919
+ const input = parseObject(value, field);
920
+ return {
921
+ runId: requireNonEmptyString(input.runId, `${field}.runId`),
922
+ worktreeHeadSha: requireNonEmptyString(input.worktreeHeadSha, `${field}.worktreeHeadSha`),
923
+ targetRef: requireNonEmptyString(input.targetRef, `${field}.targetRef`),
924
+ targetBranch: requireNonEmptyString(input.targetBranch, `${field}.targetBranch`),
925
+ targetHeadSha: requireNonEmptyString(input.targetHeadSha, `${field}.targetHeadSha`),
926
+ verifiedAt: requireNonEmptyString(input.verifiedAt, `${field}.verifiedAt`),
927
+ resultEvidenceRefs: parseStringArray(input.resultEvidenceRefs, `${field}.resultEvidenceRefs`),
928
+ candidateSnapshotId: requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`),
929
+ candidateFingerprint: requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`),
930
+ ...(input.contentFingerprint === undefined ? {} : { contentFingerprint: requireFingerprint(input.contentFingerprint, `${field}.contentFingerprint`) }),
931
+ };
932
+ }
933
+ export function parseWorkspaceCleanupLease(value, field) {
934
+ const input = parseObject(value, field);
935
+ if (input.riskDisclosure !== undefined && input.riskDisclosure !== TASK_RUN_WORKSPACE_CLEANUP_RISK_DISCLOSURE) {
936
+ throw new KernelError("CORRUPT_STATE", `${field}.riskDisclosure is not recognized`);
937
+ }
938
+ const states = ["held", "reclaimed", "retained", "partial-removal", "recovery-required"];
939
+ if (typeof input.state !== "string" || !states.includes(input.state)) {
940
+ throw new KernelError("CORRUPT_STATE", `${field}.state is invalid`);
941
+ }
942
+ if (!isNonNegativeInt(input.processId) || input.processId === 0)
943
+ throw new KernelError("CORRUPT_STATE", `${field}.processId is invalid`);
944
+ return {
945
+ leaseId: requireNonEmptyString(input.leaseId, `${field}.leaseId`),
946
+ state: input.state,
947
+ processId: input.processId,
948
+ acquiredAt: requireNonEmptyString(input.acquiredAt, `${field}.acquiredAt`),
949
+ expectedHeadSha: requireNonEmptyString(input.expectedHeadSha, `${field}.expectedHeadSha`),
950
+ targetBranch: requireNonEmptyString(input.targetBranch, `${field}.targetBranch`),
951
+ targetHeadSha: requireNonEmptyString(input.targetHeadSha, `${field}.targetHeadSha`),
952
+ receiptRef: requireNonEmptyString(input.receiptRef, `${field}.receiptRef`),
953
+ reason: input.reason === null ? null : requireNonEmptyString(input.reason, `${field}.reason`),
954
+ ...(input.riskDisclosure === undefined ? {} : { riskDisclosure: requireNonEmptyString(input.riskDisclosure, `${field}.riskDisclosure`) }),
955
+ };
956
+ }
957
+ export function parseHostStopReceipt(value, field) {
958
+ const input = parseObject(value, field);
959
+ if (typeof input.contractStale !== "boolean")
960
+ throw new KernelError("CORRUPT_STATE", `${field}.contractStale is invalid`);
961
+ if (!isNonNegativeInt(input.requestKernelRevision) || !isNonNegativeInt(input.receiptKernelRevision)) {
962
+ throw new KernelError("CORRUPT_STATE", `${field} kernel revisions are invalid`);
963
+ }
964
+ if (input.candidateSource !== null && input.candidateSource !== "captured" && input.candidateSource !== "derived") {
965
+ throw new KernelError("CORRUPT_STATE", `${field}.candidateSource is invalid`);
966
+ }
967
+ return {
968
+ source: requireNonEmptyString(input.source, `${field}.source`),
969
+ assurance: requireNonEmptyString(input.assurance, `${field}.assurance`),
970
+ evidenceLevel: requireNonEmptyString(input.evidenceLevel, `${field}.evidenceLevel`),
971
+ taskId: requireTaskId(input.taskId, `${field}.taskId`),
972
+ runId: requireNonEmptyString(input.runId, `${field}.runId`),
973
+ sessionId: input.sessionId === null ? null : requireNonEmptyString(input.sessionId, `${field}.sessionId`),
974
+ threadId: input.threadId === null ? null : requireNonEmptyString(input.threadId, `${field}.threadId`),
975
+ startRequestId: requireNonEmptyString(input.startRequestId, `${field}.startRequestId`),
976
+ settleReceiptId: requireNonEmptyString(input.settleReceiptId, `${field}.settleReceiptId`),
977
+ terminalStatus: requireNonEmptyString(input.terminalStatus, `${field}.terminalStatus`),
978
+ requestKernelRevision: input.requestKernelRevision,
979
+ receiptKernelRevision: input.receiptKernelRevision,
980
+ contractFingerprint: requireFingerprint(input.contractFingerprint, `${field}.contractFingerprint`),
981
+ contractStale: input.contractStale,
982
+ candidateSnapshotId: input.candidateSnapshotId === null ? null : requireNonEmptyString(input.candidateSnapshotId, `${field}.candidateSnapshotId`),
983
+ candidateFingerprint: input.candidateFingerprint === null ? null : requireFingerprint(input.candidateFingerprint, `${field}.candidateFingerprint`),
984
+ candidateSource: input.candidateSource,
985
+ receiptRef: requireNonEmptyString(input.receiptRef, `${field}.receiptRef`),
986
+ evidenceRef: requireNonEmptyString(input.evidenceRef, `${field}.evidenceRef`),
987
+ recordedAt: requireNonEmptyString(input.recordedAt, `${field}.recordedAt`),
988
+ };
989
+ }
990
+ export function parseHostBinding(value, field) {
991
+ const input = parseObject(value, field);
992
+ if (!isNonNegativeInt(input.kernelRevision))
993
+ throw new KernelError("CORRUPT_STATE", `${field}.kernelRevision is invalid`);
994
+ return {
995
+ host: requireNonEmptyString(input.host, `${field}.host`),
996
+ role: requireNonEmptyString(input.role, `${field}.role`),
997
+ sessionId: input.sessionId === null || input.sessionId === undefined
998
+ ? null
999
+ : requireNonEmptyString(input.sessionId, `${field}.sessionId`),
1000
+ threadId: input.threadId === null || input.threadId === undefined
1001
+ ? null
1002
+ : requireNonEmptyString(input.threadId, `${field}.threadId`),
1003
+ kernelRevision: input.kernelRevision,
1004
+ contractFingerprint: requireFingerprint(input.contractFingerprint, `${field}.contractFingerprint`),
1005
+ requestRefs: parseStringArray(input.requestRefs ?? [], `${field}.requestRefs`, true),
1006
+ eventRefs: parseStringArray(input.eventRefs ?? [], `${field}.eventRefs`, true),
1007
+ resultRefs: parseStringArray(input.resultRefs ?? [], `${field}.resultRefs`, true),
1008
+ assuranceSource: input.assuranceSource === null || input.assuranceSource === undefined
1009
+ ? null
1010
+ : requireNonEmptyString(input.assuranceSource, `${field}.assuranceSource`),
1011
+ hostId: input.hostId === null || input.hostId === undefined ? null : requireNonEmptyString(input.hostId, `${field}.hostId`),
1012
+ stopReceipt: input.stopReceipt === null || input.stopReceipt === undefined ? null : parseHostStopReceipt(input.stopReceipt, `${field}.stopReceipt`),
1013
+ };
1014
+ }
1015
+ export function parseAcceptanceEvidence(value, criteria, requireComplete) {
1016
+ const evidence = parseEvidenceMap(value, "acceptanceEvidence", !requireComplete);
1017
+ const allowed = new Set(criteria.map((criterion) => criterion.id));
1018
+ for (const key of Object.keys(evidence))
1019
+ if (!allowed.has(key))
1020
+ throw new KernelError("INVALID_REQUEST", `acceptanceEvidence references unknown criterion ${key}`);
1021
+ if (requireComplete) {
1022
+ const missing = criteria
1023
+ .filter((criterion) => !getOwnRecordValue(evidence, criterion.id)?.length)
1024
+ .map((criterion) => criterion.id);
1025
+ if (missing.length)
1026
+ throw new KernelError("ACCEPTANCE_EVIDENCE_MISSING", `passing Review requires evidence for every acceptance criterion: ${missing.join(", ")}`);
1027
+ }
1028
+ return evidence;
1029
+ }
1030
+ function parseEvidenceMap(value, field, allowEmptyReferences = false) {
1031
+ const input = parseObject(value, field);
1032
+ const result = {};
1033
+ for (const [key, refs] of Object.entries(input)) {
1034
+ Object.defineProperty(result, requireNonEmptyString(key, `${field} key`), {
1035
+ value: parseStringArray(refs, `${field}.${key}`, allowEmptyReferences),
1036
+ enumerable: true,
1037
+ writable: true,
1038
+ configurable: true,
1039
+ });
1040
+ }
1041
+ return result;
1042
+ }
1043
+ function parseEvent(value, index) {
1044
+ const field = `kernel.events[${index}]`;
1045
+ const input = parseObject(value, field);
1046
+ if (!EVENT_TYPES.includes(input.type))
1047
+ throw new KernelError("CORRUPT_STATE", `${field}.type is invalid`);
1048
+ return {
1049
+ id: requireNonEmptyString(input.id, `${field}.id`),
1050
+ revision: requirePositiveInt(input.revision, `${field}.revision`),
1051
+ at: requireNonEmptyString(input.at, `${field}.at`),
1052
+ actor: requireNonEmptyString(input.actor, `${field}.actor`),
1053
+ idempotencyKey: requireNonEmptyString(input.idempotencyKey, `${field}.idempotencyKey`),
1054
+ type: input.type,
1055
+ entityId: requireNonEmptyString(input.entityId, `${field}.entityId`),
1056
+ requestFingerprint: requireFingerprint(input.requestFingerprint, `${field}.requestFingerprint`),
1057
+ };
1058
+ }
1059
+ function parseKernelAudit(value, index) {
1060
+ const field = `kernel.audit[${index}]`;
1061
+ const input = parseObject(value, field);
1062
+ const parseState = (raw, name) => {
1063
+ const state = parseObject(raw, name);
1064
+ if (!isKernelPhase(state.phase) ||
1065
+ !isKernelCondition(state.condition) ||
1066
+ !isNonNegativeInt(state.revision) ||
1067
+ (state.outcome !== null && !isKernelOutcome(state.outcome))) {
1068
+ throw new KernelError("CORRUPT_STATE", `${name} state is invalid`);
1069
+ }
1070
+ return {
1071
+ phase: state.phase,
1072
+ condition: state.condition,
1073
+ outcome: state.outcome,
1074
+ revision: state.revision,
1075
+ };
1076
+ };
1077
+ if (input.evidence !== null && typeof input.evidence !== "string")
1078
+ throw new KernelError("CORRUPT_STATE", `${field}.evidence is invalid`);
1079
+ return {
1080
+ id: requireNonEmptyString(input.id, `${field}.id`),
1081
+ at: requireNonEmptyString(input.at, `${field}.at`),
1082
+ actor: requireNonEmptyString(input.actor, `${field}.actor`),
1083
+ idempotencyKey: requireNonEmptyString(input.idempotencyKey, `${field}.idempotencyKey`),
1084
+ evidence: input.evidence,
1085
+ from: parseState(input.from, `${field}.from`),
1086
+ to: parseState(input.to, `${field}.to`),
1087
+ };
1088
+ }
1089
+ function validateAuditChain(audit, revision) {
1090
+ if (!audit.length)
1091
+ throw new KernelError("CORRUPT_STATE", "Task Kernel v2 requires an audit event");
1092
+ for (let index = 0; index < audit.length; index++) {
1093
+ const event = requireArrayEntry(audit[index], `kernel.audit[${index}]`);
1094
+ const previous = index > 0
1095
+ ? requireArrayEntry(audit[index - 1], `kernel.audit[${index - 1}]`)
1096
+ : null;
1097
+ if (event.to.revision !== event.from.revision + 1 ||
1098
+ (previous && previous.to.revision !== event.from.revision)) {
1099
+ throw new KernelError("CORRUPT_STATE", "Task Kernel v2 audit revisions are not contiguous");
1100
+ }
1101
+ }
1102
+ if (requireArrayEntry(audit.at(-1), "latest kernel audit event").to.revision !==
1103
+ revision)
1104
+ throw new KernelError("CORRUPT_STATE", "Task Kernel v2 audit does not end at the current revision");
1105
+ }
1106
+ function validateEvents(events, revision) {
1107
+ const keys = new Set();
1108
+ const ids = new Set();
1109
+ for (const event of events) {
1110
+ if (event.revision > revision)
1111
+ throw new KernelError("CORRUPT_STATE", "Task Kernel event revision is in the future");
1112
+ if (keys.has(event.idempotencyKey) || ids.has(event.id))
1113
+ throw new KernelError("CORRUPT_STATE", "Task Kernel events contain a duplicate ID or idempotency key");
1114
+ keys.add(event.idempotencyKey);
1115
+ ids.add(event.id);
1116
+ }
1117
+ if (!events.length)
1118
+ throw new KernelError("CORRUPT_STATE", "Task Kernel v2 requires a domain event");
1119
+ }
1120
+ export function getOwnRecordValue(record, key) {
1121
+ return Object.prototype.hasOwnProperty.call(record, key)
1122
+ ? record[key]
1123
+ : undefined;
1124
+ }
1125
+ function parseObject(value, field) {
1126
+ if (!isPlainObject(value))
1127
+ throw new KernelError("CORRUPT_STATE", `${field} must be an object`);
1128
+ return value;
1129
+ }
1130
+ export function parseStringArray(value, field, allowEmpty = false) {
1131
+ if (!Array.isArray(value) ||
1132
+ value.some((item) => typeof item !== "string" || !item.trim()))
1133
+ throw new KernelError("INVALID_REQUEST", `${field} must be an array of non-empty strings`);
1134
+ if (!allowEmpty && value.length === 0)
1135
+ throw new KernelError("INVALID_REQUEST", `${field} must contain at least one reference`);
1136
+ return [...value];
1137
+ }
1138
+ export function requireString(value, field, allowEmpty = false) {
1139
+ if (typeof value !== "string" || (!allowEmpty && !value.trim()))
1140
+ throw new KernelError("INVALID_REQUEST", `${field} must be ${allowEmpty ? "a string" : "a non-empty string"}`);
1141
+ return value;
1142
+ }
1143
+ export function requireTaskId(value, field) {
1144
+ const taskId = requireNonEmptyString(value, field);
1145
+ if (!TASK_ID_RE.test(taskId))
1146
+ throw new KernelError("INVALID_REQUEST", `${field} must be a lowercase slug`);
1147
+ return taskId;
1148
+ }
1149
+ function requireFingerprint(value, field) {
1150
+ if (typeof value !== "string" || !FINGERPRINT_RE.test(value))
1151
+ throw new KernelError("INVALID_REQUEST", `${field} must be a lowercase SHA-256 fingerprint`);
1152
+ return value;
1153
+ }
1154
+ function requirePositiveInt(value, field) {
1155
+ if (!isNonNegativeInt(value) || value < 1)
1156
+ throw new KernelError("CORRUPT_STATE", `${field} must be a positive integer`);
1157
+ return value;
1158
+ }
1159
+ function stableJson(value) {
1160
+ if (Array.isArray(value))
1161
+ return `[${value.map((item) => stableJson(item)).join(",")}]`;
1162
+ if (isPlainObject(value))
1163
+ return `{${Object.keys(value)
1164
+ .sort()
1165
+ .map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`)
1166
+ .join(",")}}`;
1167
+ return JSON.stringify(value);
1168
+ }
1169
+ //# sourceMappingURL=task-kernel-schema.js.map