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

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 (704) 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/migrations/manifests/0.6.0-beta.5.json +9 -0
  203. package/dist/pactile/artifacts/documents.d.ts +72 -0
  204. package/dist/pactile/artifacts/documents.d.ts.map +1 -0
  205. package/dist/pactile/artifacts/documents.js +406 -0
  206. package/dist/pactile/artifacts/documents.js.map +1 -0
  207. package/dist/pactile/artifacts/index.d.ts +6 -0
  208. package/dist/pactile/artifacts/index.d.ts.map +1 -0
  209. package/dist/pactile/artifacts/index.js +6 -0
  210. package/dist/pactile/artifacts/index.js.map +1 -0
  211. package/dist/pactile/artifacts/projection.d.ts +50 -0
  212. package/dist/pactile/artifacts/projection.d.ts.map +1 -0
  213. package/dist/pactile/artifacts/projection.js +139 -0
  214. package/dist/pactile/artifacts/projection.js.map +1 -0
  215. package/dist/pactile/artifacts/reader.d.ts +20 -0
  216. package/dist/pactile/artifacts/reader.d.ts.map +1 -0
  217. package/dist/pactile/artifacts/reader.js +559 -0
  218. package/dist/pactile/artifacts/reader.js.map +1 -0
  219. package/dist/pactile/artifacts/schema.d.ts +4 -0
  220. package/dist/pactile/artifacts/schema.d.ts.map +1 -0
  221. package/dist/pactile/artifacts/schema.js +217 -0
  222. package/dist/pactile/artifacts/schema.js.map +1 -0
  223. package/dist/pactile/artifacts/types.d.ts +66 -0
  224. package/dist/pactile/artifacts/types.d.ts.map +1 -0
  225. package/dist/pactile/artifacts/types.js +45 -0
  226. package/dist/pactile/artifacts/types.js.map +1 -0
  227. package/dist/pactile/capabilities/claim.d.ts +3 -0
  228. package/dist/pactile/capabilities/claim.d.ts.map +1 -0
  229. package/dist/pactile/capabilities/claim.js +97 -0
  230. package/dist/pactile/capabilities/claim.js.map +1 -0
  231. package/dist/pactile/capabilities/command.d.ts +6 -0
  232. package/dist/pactile/capabilities/command.d.ts.map +1 -0
  233. package/dist/pactile/capabilities/command.js +253 -0
  234. package/dist/pactile/capabilities/command.js.map +1 -0
  235. package/dist/pactile/capabilities/discover.d.ts +6 -0
  236. package/dist/pactile/capabilities/discover.d.ts.map +1 -0
  237. package/dist/pactile/capabilities/discover.js +48 -0
  238. package/dist/pactile/capabilities/discover.js.map +1 -0
  239. package/dist/pactile/capabilities/node.d.ts +15 -0
  240. package/dist/pactile/capabilities/node.d.ts.map +1 -0
  241. package/dist/pactile/capabilities/node.js +292 -0
  242. package/dist/pactile/capabilities/node.js.map +1 -0
  243. package/dist/pactile/capabilities/read.d.ts +6 -0
  244. package/dist/pactile/capabilities/read.d.ts.map +1 -0
  245. package/dist/pactile/capabilities/read.js +100 -0
  246. package/dist/pactile/capabilities/read.js.map +1 -0
  247. package/dist/pactile/capabilities/receipts.d.ts +17 -0
  248. package/dist/pactile/capabilities/receipts.d.ts.map +1 -0
  249. package/dist/pactile/capabilities/receipts.js +90 -0
  250. package/dist/pactile/capabilities/receipts.js.map +1 -0
  251. package/dist/pactile/capabilities/search.d.ts +6 -0
  252. package/dist/pactile/capabilities/search.d.ts.map +1 -0
  253. package/dist/pactile/capabilities/search.js +181 -0
  254. package/dist/pactile/capabilities/search.js.map +1 -0
  255. package/dist/pactile/capabilities/shared.d.ts +29 -0
  256. package/dist/pactile/capabilities/shared.d.ts.map +1 -0
  257. package/dist/pactile/capabilities/shared.js +134 -0
  258. package/dist/pactile/capabilities/shared.js.map +1 -0
  259. package/dist/pactile/capabilities/workspace.d.ts +19 -0
  260. package/dist/pactile/capabilities/workspace.d.ts.map +1 -0
  261. package/dist/pactile/capabilities/workspace.js +273 -0
  262. package/dist/pactile/capabilities/workspace.js.map +1 -0
  263. package/dist/pactile/codex/bridge.d.ts +105 -2
  264. package/dist/pactile/codex/bridge.d.ts.map +1 -1
  265. package/dist/pactile/codex/bridge.js +1266 -92
  266. package/dist/pactile/codex/bridge.js.map +1 -1
  267. package/dist/pactile/codex/dispatch-stop-proof.d.ts +43 -0
  268. package/dist/pactile/codex/dispatch-stop-proof.d.ts.map +1 -0
  269. package/dist/pactile/codex/dispatch-stop-proof.js +177 -0
  270. package/dist/pactile/codex/dispatch-stop-proof.js.map +1 -0
  271. package/dist/pactile/codex/host-stop.d.ts +47 -0
  272. package/dist/pactile/codex/host-stop.d.ts.map +1 -0
  273. package/dist/pactile/codex/host-stop.js +344 -0
  274. package/dist/pactile/codex/host-stop.js.map +1 -0
  275. package/dist/pactile/coordination/index.d.ts +4 -0
  276. package/dist/pactile/coordination/index.d.ts.map +1 -0
  277. package/dist/pactile/coordination/index.js +4 -0
  278. package/dist/pactile/coordination/index.js.map +1 -0
  279. package/dist/pactile/coordination/journal.d.ts +10 -0
  280. package/dist/pactile/coordination/journal.d.ts.map +1 -0
  281. package/dist/pactile/coordination/journal.js +255 -0
  282. package/dist/pactile/coordination/journal.js.map +1 -0
  283. package/dist/pactile/coordination/kernel-resume.d.ts +8 -0
  284. package/dist/pactile/coordination/kernel-resume.d.ts.map +1 -0
  285. package/dist/pactile/coordination/kernel-resume.js +87 -0
  286. package/dist/pactile/coordination/kernel-resume.js.map +1 -0
  287. package/dist/pactile/coordination/model.d.ts +553 -0
  288. package/dist/pactile/coordination/model.d.ts.map +1 -0
  289. package/dist/pactile/coordination/model.js +239 -0
  290. package/dist/pactile/coordination/model.js.map +1 -0
  291. package/dist/pactile/coordination/state.d.ts +46 -0
  292. package/dist/pactile/coordination/state.d.ts.map +1 -0
  293. package/dist/pactile/coordination/state.js +301 -0
  294. package/dist/pactile/coordination/state.js.map +1 -0
  295. package/dist/pactile/coordination/store.d.ts +94 -0
  296. package/dist/pactile/coordination/store.d.ts.map +1 -0
  297. package/dist/pactile/coordination/store.js +396 -0
  298. package/dist/pactile/coordination/store.js.map +1 -0
  299. package/dist/pactile/index.d.ts +7 -1
  300. package/dist/pactile/index.d.ts.map +1 -1
  301. package/dist/pactile/index.js +7 -1
  302. package/dist/pactile/index.js.map +1 -1
  303. package/dist/pactile/jev/contracts.d.ts +104 -0
  304. package/dist/pactile/jev/contracts.d.ts.map +1 -0
  305. package/dist/pactile/jev/contracts.js +53 -0
  306. package/dist/pactile/jev/contracts.js.map +1 -0
  307. package/dist/pactile/jev/decision.d.ts +58 -0
  308. package/dist/pactile/jev/decision.d.ts.map +1 -0
  309. package/dist/pactile/jev/decision.js +149 -0
  310. package/dist/pactile/jev/decision.js.map +1 -0
  311. package/dist/pactile/jev/http.d.ts +25 -0
  312. package/dist/pactile/jev/http.d.ts.map +1 -0
  313. package/dist/pactile/jev/http.js +234 -0
  314. package/dist/pactile/jev/http.js.map +1 -0
  315. package/dist/pactile/jev/index.d.ts +8 -0
  316. package/dist/pactile/jev/index.d.ts.map +1 -0
  317. package/dist/pactile/jev/index.js +4 -0
  318. package/dist/pactile/jev/index.js.map +1 -0
  319. package/dist/pactile/jev/outbound.d.ts +15 -0
  320. package/dist/pactile/jev/outbound.d.ts.map +1 -0
  321. package/dist/pactile/jev/outbound.js +264 -0
  322. package/dist/pactile/jev/outbound.js.map +1 -0
  323. package/dist/pactile/jev/project-policy.d.ts +10 -0
  324. package/dist/pactile/jev/project-policy.d.ts.map +1 -0
  325. package/dist/pactile/jev/project-policy.js +53 -0
  326. package/dist/pactile/jev/project-policy.js.map +1 -0
  327. package/dist/pactile/jev/response.d.ts +17 -0
  328. package/dist/pactile/jev/response.d.ts.map +1 -0
  329. package/dist/pactile/jev/response.js +280 -0
  330. package/dist/pactile/jev/response.js.map +1 -0
  331. package/dist/pactile/jev/scheduler-advice.d.ts +92 -0
  332. package/dist/pactile/jev/scheduler-advice.d.ts.map +1 -0
  333. package/dist/pactile/jev/scheduler-advice.js +323 -0
  334. package/dist/pactile/jev/scheduler-advice.js.map +1 -0
  335. package/dist/pactile/jev/transport.d.ts +6 -0
  336. package/dist/pactile/jev/transport.d.ts.map +1 -0
  337. package/dist/pactile/jev/transport.js +87 -0
  338. package/dist/pactile/jev/transport.js.map +1 -0
  339. package/dist/pactile/lifecycle/deferred-live.d.ts +17 -0
  340. package/dist/pactile/lifecycle/deferred-live.d.ts.map +1 -0
  341. package/dist/pactile/lifecycle/deferred-live.js +173 -0
  342. package/dist/pactile/lifecycle/deferred-live.js.map +1 -0
  343. package/dist/pactile/lifecycle/legacy-import.d.ts +1 -1
  344. package/dist/pactile/lifecycle/legacy-import.js +3 -3
  345. package/dist/pactile/lifecycle/legacy-import.js.map +1 -1
  346. package/dist/pactile/lifecycle/project-files.d.ts.map +1 -1
  347. package/dist/pactile/lifecycle/project-files.js +1 -0
  348. package/dist/pactile/lifecycle/project-files.js.map +1 -1
  349. package/dist/pactile/migration/legacy-task-batch-generation.d.ts +23 -0
  350. package/dist/pactile/migration/legacy-task-batch-generation.d.ts.map +1 -0
  351. package/dist/pactile/migration/legacy-task-batch-generation.js +102 -0
  352. package/dist/pactile/migration/legacy-task-batch-generation.js.map +1 -0
  353. package/dist/pactile/migration/legacy-task-batch-io.d.ts +9 -0
  354. package/dist/pactile/migration/legacy-task-batch-io.d.ts.map +1 -0
  355. package/dist/pactile/migration/legacy-task-batch-io.js +208 -0
  356. package/dist/pactile/migration/legacy-task-batch-io.js.map +1 -0
  357. package/dist/pactile/migration/legacy-task-batch-journal.d.ts +6 -0
  358. package/dist/pactile/migration/legacy-task-batch-journal.d.ts.map +1 -0
  359. package/dist/pactile/migration/legacy-task-batch-journal.js +121 -0
  360. package/dist/pactile/migration/legacy-task-batch-journal.js.map +1 -0
  361. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts +18 -0
  362. package/dist/pactile/migration/legacy-task-batch-orchestrator.d.ts.map +1 -0
  363. package/dist/pactile/migration/legacy-task-batch-orchestrator.js +634 -0
  364. package/dist/pactile/migration/legacy-task-batch-orchestrator.js.map +1 -0
  365. package/dist/pactile/migration/legacy-task-batch-source.d.ts +8 -0
  366. package/dist/pactile/migration/legacy-task-batch-source.d.ts.map +1 -0
  367. package/dist/pactile/migration/legacy-task-batch-source.js +158 -0
  368. package/dist/pactile/migration/legacy-task-batch-source.js.map +1 -0
  369. package/dist/pactile/migration/legacy-task-batch-types.d.ts +127 -0
  370. package/dist/pactile/migration/legacy-task-batch-types.d.ts.map +1 -0
  371. package/dist/pactile/migration/legacy-task-batch-types.js +127 -0
  372. package/dist/pactile/migration/legacy-task-batch-types.js.map +1 -0
  373. package/dist/pactile/migration/legacy-task-batch.d.ts +3 -0
  374. package/dist/pactile/migration/legacy-task-batch.d.ts.map +1 -0
  375. package/dist/pactile/migration/legacy-task-batch.js +2 -0
  376. package/dist/pactile/migration/legacy-task-batch.js.map +1 -0
  377. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts +27 -0
  378. package/dist/pactile/migration/legacy-task-held-source-reader.d.ts.map +1 -0
  379. package/dist/pactile/migration/legacy-task-held-source-reader.js +261 -0
  380. package/dist/pactile/migration/legacy-task-held-source-reader.js.map +1 -0
  381. package/dist/pactile/migration/legacy-task-reconciliation.d.ts +46 -0
  382. package/dist/pactile/migration/legacy-task-reconciliation.d.ts.map +1 -0
  383. package/dist/pactile/migration/legacy-task-reconciliation.js +589 -0
  384. package/dist/pactile/migration/legacy-task-reconciliation.js.map +1 -0
  385. package/dist/pactile/migration/legacy-task-update.d.ts +19 -0
  386. package/dist/pactile/migration/legacy-task-update.d.ts.map +1 -0
  387. package/dist/pactile/migration/legacy-task-update.js +164 -0
  388. package/dist/pactile/migration/legacy-task-update.js.map +1 -0
  389. package/dist/pactile/parallel/batch.d.ts +21 -2
  390. package/dist/pactile/parallel/batch.d.ts.map +1 -1
  391. package/dist/pactile/parallel/batch.js +271 -50
  392. package/dist/pactile/parallel/batch.js.map +1 -1
  393. package/dist/pactile/parallel/policy.d.ts +1 -1
  394. package/dist/pactile/parallel/policy.d.ts.map +1 -1
  395. package/dist/pactile/parallel/policy.js +130 -102
  396. package/dist/pactile/parallel/policy.js.map +1 -1
  397. package/dist/pactile/pi/bridge.d.ts +139 -2
  398. package/dist/pactile/pi/bridge.d.ts.map +1 -1
  399. package/dist/pactile/pi/bridge.js +1317 -106
  400. package/dist/pactile/pi/bridge.js.map +1 -1
  401. package/dist/pactile/pi/rpc.d.ts +23 -4
  402. package/dist/pactile/pi/rpc.d.ts.map +1 -1
  403. package/dist/pactile/pi/rpc.js +243 -42
  404. package/dist/pactile/pi/rpc.js.map +1 -1
  405. package/dist/pactile/pi/v2-dispatch.d.ts +113 -0
  406. package/dist/pactile/pi/v2-dispatch.d.ts.map +1 -0
  407. package/dist/pactile/pi/v2-dispatch.js +919 -0
  408. package/dist/pactile/pi/v2-dispatch.js.map +1 -0
  409. package/dist/pactile/projection/planner.js +1 -1
  410. package/dist/pactile/projection/planner.js.map +1 -1
  411. package/dist/pactile/registry.d.ts +63 -1
  412. package/dist/pactile/registry.d.ts.map +1 -1
  413. package/dist/pactile/registry.js +633 -4
  414. package/dist/pactile/registry.js.map +1 -1
  415. package/dist/pactile/retrieval/index.d.ts +1 -0
  416. package/dist/pactile/retrieval/index.d.ts.map +1 -1
  417. package/dist/pactile/retrieval/index.js +1 -0
  418. package/dist/pactile/retrieval/index.js.map +1 -1
  419. package/dist/pactile/retrieval/jev-planning.d.ts +28 -0
  420. package/dist/pactile/retrieval/jev-planning.d.ts.map +1 -0
  421. package/dist/pactile/retrieval/jev-planning.js +96 -0
  422. package/dist/pactile/retrieval/jev-planning.js.map +1 -0
  423. package/dist/pactile/review/contract.d.ts +232 -0
  424. package/dist/pactile/review/contract.d.ts.map +1 -0
  425. package/dist/pactile/review/contract.js +695 -0
  426. package/dist/pactile/review/contract.js.map +1 -0
  427. package/dist/pactile/review/escalation-artifacts.d.ts +41 -0
  428. package/dist/pactile/review/escalation-artifacts.d.ts.map +1 -0
  429. package/dist/pactile/review/escalation-artifacts.js +415 -0
  430. package/dist/pactile/review/escalation-artifacts.js.map +1 -0
  431. package/dist/pactile/review/escalation-contract.d.ts +115 -0
  432. package/dist/pactile/review/escalation-contract.d.ts.map +1 -0
  433. package/dist/pactile/review/escalation-contract.js +151 -0
  434. package/dist/pactile/review/escalation-contract.js.map +1 -0
  435. package/dist/pactile/review/escalation-finalize.d.ts +14 -0
  436. package/dist/pactile/review/escalation-finalize.d.ts.map +1 -0
  437. package/dist/pactile/review/escalation-finalize.js +319 -0
  438. package/dist/pactile/review/escalation-finalize.js.map +1 -0
  439. package/dist/pactile/review/escalation-reply.d.ts +10 -0
  440. package/dist/pactile/review/escalation-reply.d.ts.map +1 -0
  441. package/dist/pactile/review/escalation-reply.js +61 -0
  442. package/dist/pactile/review/escalation-reply.js.map +1 -0
  443. package/dist/pactile/review/escalation-transport.d.ts +32 -0
  444. package/dist/pactile/review/escalation-transport.d.ts.map +1 -0
  445. package/dist/pactile/review/escalation-transport.js +216 -0
  446. package/dist/pactile/review/escalation-transport.js.map +1 -0
  447. package/dist/pactile/review/escalation.d.ts +7 -0
  448. package/dist/pactile/review/escalation.d.ts.map +1 -0
  449. package/dist/pactile/review/escalation.js +6 -0
  450. package/dist/pactile/review/escalation.js.map +1 -0
  451. package/dist/pactile/review/evidence.d.ts +25 -0
  452. package/dist/pactile/review/evidence.d.ts.map +1 -0
  453. package/dist/pactile/review/evidence.js +58 -0
  454. package/dist/pactile/review/evidence.js.map +1 -0
  455. package/dist/pactile/review/jev-escalation-advice.d.ts +77 -0
  456. package/dist/pactile/review/jev-escalation-advice.d.ts.map +1 -0
  457. package/dist/pactile/review/jev-escalation-advice.js +358 -0
  458. package/dist/pactile/review/jev-escalation-advice.js.map +1 -0
  459. package/dist/pactile/scheduler/index.d.ts +6 -0
  460. package/dist/pactile/scheduler/index.d.ts.map +1 -0
  461. package/dist/pactile/scheduler/index.js +5 -0
  462. package/dist/pactile/scheduler/index.js.map +1 -0
  463. package/dist/pactile/scheduler/project-lease-store.d.ts +35 -0
  464. package/dist/pactile/scheduler/project-lease-store.d.ts.map +1 -0
  465. package/dist/pactile/scheduler/project-lease-store.js +189 -0
  466. package/dist/pactile/scheduler/project-lease-store.js.map +1 -0
  467. package/dist/pactile/scheduler/scheduler.d.ts +91 -0
  468. package/dist/pactile/scheduler/scheduler.d.ts.map +1 -0
  469. package/dist/pactile/scheduler/scheduler.js +589 -0
  470. package/dist/pactile/scheduler/scheduler.js.map +1 -0
  471. package/dist/pactile/scheduler/task-kernel-admission.d.ts +173 -0
  472. package/dist/pactile/scheduler/task-kernel-admission.d.ts.map +1 -0
  473. package/dist/pactile/scheduler/task-kernel-admission.js +1560 -0
  474. package/dist/pactile/scheduler/task-kernel-admission.js.map +1 -0
  475. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts +184 -0
  476. package/dist/pactile/scheduler/task-kernel-wave-dispatch.d.ts.map +1 -0
  477. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js +952 -0
  478. package/dist/pactile/scheduler/task-kernel-wave-dispatch.js.map +1 -0
  479. package/dist/pactile/scheduler/task-map-scheduler.d.ts +116 -0
  480. package/dist/pactile/scheduler/task-map-scheduler.d.ts.map +1 -0
  481. package/dist/pactile/scheduler/task-map-scheduler.js +1448 -0
  482. package/dist/pactile/scheduler/task-map-scheduler.js.map +1 -0
  483. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts +7 -0
  484. package/dist/pactile/scheduler/task-run-dispatch-state.d.ts.map +1 -0
  485. package/dist/pactile/scheduler/task-run-dispatch-state.js +69 -0
  486. package/dist/pactile/scheduler/task-run-dispatch-state.js.map +1 -0
  487. package/dist/pactile/task/authorization.d.ts +3 -0
  488. package/dist/pactile/task/authorization.d.ts.map +1 -0
  489. package/dist/pactile/task/authorization.js +43 -0
  490. package/dist/pactile/task/authorization.js.map +1 -0
  491. package/dist/pactile/task/creation.d.ts +22 -0
  492. package/dist/pactile/task/creation.d.ts.map +1 -0
  493. package/dist/pactile/task/creation.js +95 -0
  494. package/dist/pactile/task/creation.js.map +1 -0
  495. package/dist/pactile/task/guards.d.ts +1 -4
  496. package/dist/pactile/task/guards.d.ts.map +1 -1
  497. package/dist/pactile/task/guards.js +5 -57
  498. package/dist/pactile/task/guards.js.map +1 -1
  499. package/dist/pactile/task/session-jev-receipt.d.ts +58 -0
  500. package/dist/pactile/task/session-jev-receipt.d.ts.map +1 -0
  501. package/dist/pactile/task/session-jev-receipt.js +375 -0
  502. package/dist/pactile/task/session-jev-receipt.js.map +1 -0
  503. package/dist/pactile/task/session-jev.d.ts +7 -0
  504. package/dist/pactile/task/session-jev.d.ts.map +1 -0
  505. package/dist/pactile/task/session-jev.js +217 -0
  506. package/dist/pactile/task/session-jev.js.map +1 -0
  507. package/dist/pactile/task/session-pack.d.ts.map +1 -1
  508. package/dist/pactile/task/session-pack.js +155 -16
  509. package/dist/pactile/task/session-pack.js.map +1 -1
  510. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts +49 -0
  511. package/dist/pactile/task/session-retrieval-jev-receipt.d.ts.map +1 -0
  512. package/dist/pactile/task/session-retrieval-jev-receipt.js +97 -0
  513. package/dist/pactile/task/session-retrieval-jev-receipt.js.map +1 -0
  514. package/dist/pactile/task/session-retrieval-jev.d.ts +8 -0
  515. package/dist/pactile/task/session-retrieval-jev.d.ts.map +1 -0
  516. package/dist/pactile/task/session-retrieval-jev.js +352 -0
  517. package/dist/pactile/task/session-retrieval-jev.js.map +1 -0
  518. package/dist/pactile/task/strategy.d.ts +1 -23
  519. package/dist/pactile/task/strategy.d.ts.map +1 -1
  520. package/dist/pactile/task/strategy.js +2 -135
  521. package/dist/pactile/task/strategy.js.map +1 -1
  522. package/dist/pactile/tiles/jev-selection.d.ts +44 -0
  523. package/dist/pactile/tiles/jev-selection.d.ts.map +1 -0
  524. package/dist/pactile/tiles/jev-selection.js +210 -0
  525. package/dist/pactile/tiles/jev-selection.js.map +1 -0
  526. package/dist/pactile/tiles/safe-yaml.d.ts +5 -1
  527. package/dist/pactile/tiles/safe-yaml.d.ts.map +1 -1
  528. package/dist/pactile/tiles/safe-yaml.js +8 -8
  529. package/dist/pactile/tiles/safe-yaml.js.map +1 -1
  530. package/dist/pactile/tiles/selection-receipts.d.ts +71 -0
  531. package/dist/pactile/tiles/selection-receipts.d.ts.map +1 -0
  532. package/dist/pactile/tiles/selection-receipts.js +319 -0
  533. package/dist/pactile/tiles/selection-receipts.js.map +1 -0
  534. package/dist/pactile/tiles/selection.d.ts +185 -0
  535. package/dist/pactile/tiles/selection.d.ts.map +1 -0
  536. package/dist/pactile/tiles/selection.js +985 -0
  537. package/dist/pactile/tiles/selection.js.map +1 -0
  538. package/dist/pactile/verification/git-observer.d.ts +3 -0
  539. package/dist/pactile/verification/git-observer.d.ts.map +1 -0
  540. package/dist/pactile/verification/git-observer.js +3 -0
  541. package/dist/pactile/verification/git-observer.js.map +1 -0
  542. package/dist/pactile/verification/index.d.ts +11 -0
  543. package/dist/pactile/verification/index.d.ts.map +1 -0
  544. package/dist/pactile/verification/index.js +6 -0
  545. package/dist/pactile/verification/index.js.map +1 -0
  546. package/dist/pactile/verification/jev-advice.d.ts +78 -0
  547. package/dist/pactile/verification/jev-advice.d.ts.map +1 -0
  548. package/dist/pactile/verification/jev-advice.js +397 -0
  549. package/dist/pactile/verification/jev-advice.js.map +1 -0
  550. package/dist/pactile/verification/planner.d.ts +15 -0
  551. package/dist/pactile/verification/planner.d.ts.map +1 -0
  552. package/dist/pactile/verification/planner.js +412 -0
  553. package/dist/pactile/verification/planner.js.map +1 -0
  554. package/dist/pactile/verification/receipt.d.ts +101 -0
  555. package/dist/pactile/verification/receipt.d.ts.map +1 -0
  556. package/dist/pactile/verification/receipt.js +400 -0
  557. package/dist/pactile/verification/receipt.js.map +1 -0
  558. package/dist/pactile/verification/types.d.ts +72 -0
  559. package/dist/pactile/verification/types.d.ts.map +1 -0
  560. package/dist/pactile/verification/types.js +21 -0
  561. package/dist/pactile/verification/types.js.map +1 -0
  562. package/dist/pactile/worktree/git-probe.d.ts +32 -0
  563. package/dist/pactile/worktree/git-probe.d.ts.map +1 -0
  564. package/dist/pactile/worktree/git-probe.js +336 -0
  565. package/dist/pactile/worktree/git-probe.js.map +1 -0
  566. package/dist/pactile/worktree/git-removal.d.ts +3 -0
  567. package/dist/pactile/worktree/git-removal.d.ts.map +1 -0
  568. package/dist/pactile/worktree/git-removal.js +11 -0
  569. package/dist/pactile/worktree/git-removal.js.map +1 -0
  570. package/dist/pactile/worktree/index.d.ts +2 -0
  571. package/dist/pactile/worktree/index.d.ts.map +1 -0
  572. package/dist/pactile/worktree/index.js +2 -0
  573. package/dist/pactile/worktree/index.js.map +1 -0
  574. package/dist/pactile/worktree/integration-evidence.d.ts +80 -0
  575. package/dist/pactile/worktree/integration-evidence.d.ts.map +1 -0
  576. package/dist/pactile/worktree/integration-evidence.js +166 -0
  577. package/dist/pactile/worktree/integration-evidence.js.map +1 -0
  578. package/dist/pactile/worktree/manager-core.d.ts +50 -0
  579. package/dist/pactile/worktree/manager-core.d.ts.map +1 -0
  580. package/dist/pactile/worktree/manager-core.js +359 -0
  581. package/dist/pactile/worktree/manager-core.js.map +1 -0
  582. package/dist/pactile/worktree/manager-provenance.d.ts +32 -0
  583. package/dist/pactile/worktree/manager-provenance.d.ts.map +1 -0
  584. package/dist/pactile/worktree/manager-provenance.js +409 -0
  585. package/dist/pactile/worktree/manager-provenance.js.map +1 -0
  586. package/dist/pactile/worktree/manager-types.d.ts +84 -0
  587. package/dist/pactile/worktree/manager-types.d.ts.map +1 -0
  588. package/dist/pactile/worktree/manager-types.js +11 -0
  589. package/dist/pactile/worktree/manager-types.js.map +1 -0
  590. package/dist/pactile/worktree/manager.d.ts +10 -0
  591. package/dist/pactile/worktree/manager.d.ts.map +1 -0
  592. package/dist/pactile/worktree/manager.js +6 -0
  593. package/dist/pactile/worktree/manager.js.map +1 -0
  594. package/dist/pactile/worktree/run-workspace-cleanup.d.ts +10 -0
  595. package/dist/pactile/worktree/run-workspace-cleanup.d.ts.map +1 -0
  596. package/dist/pactile/worktree/run-workspace-cleanup.js +695 -0
  597. package/dist/pactile/worktree/run-workspace-cleanup.js.map +1 -0
  598. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts +65 -0
  599. package/dist/pactile/worktree/run-workspace-lifecycle.d.ts.map +1 -0
  600. package/dist/pactile/worktree/run-workspace-lifecycle.js +276 -0
  601. package/dist/pactile/worktree/run-workspace-lifecycle.js.map +1 -0
  602. package/dist/templates/common/bundled-skills/pactile-meta/references/customize-local/change-hooks.md +1 -1
  603. package/dist/templates/common/bundled-skills/pactile-meta/references/local-architecture/generated-files.md +1 -1
  604. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/hooks-and-settings.md +1 -1
  605. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/overview.md +1 -1
  606. package/dist/templates/common/bundled-skills/pactile-meta/references/platform-files/platform-map.md +1 -1
  607. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +2 -0
  608. package/dist/templates/common/skills/brainstorm.md +19 -13
  609. package/dist/templates/markdown/agents.md +2 -2
  610. package/dist/templates/markdown/framework/execution-strategy.md.txt +1 -1
  611. package/dist/templates/markdown/framework/index.md.txt +1 -1
  612. package/dist/templates/markdown/framework/parallel-first-execution.md.txt +17 -105
  613. package/dist/templates/markdown/framework/prd-grill-frontier.md.txt +3 -3
  614. package/dist/templates/markdown/framework/release-boundary.md.txt +9 -10
  615. package/dist/templates/markdown/framework/retrieval-daily-guide.md.txt +1 -1
  616. package/dist/templates/pactile/CONTEXT.md +48 -36
  617. package/dist/templates/pactile/modules/approval-personal/contract.md +12 -24
  618. package/dist/templates/pactile/modules/close-basic/contract.md +15 -18
  619. package/dist/templates/pactile/modules/debug-recovery/contract.md +4 -4
  620. package/dist/templates/pactile/modules/define-basic/contract.md +15 -19
  621. package/dist/templates/pactile/modules/define-extended/contract.md +3 -3
  622. package/dist/templates/pactile/modules/execute-agent/contract.md +11 -19
  623. package/dist/templates/pactile/modules/intake-basic/contract.md +16 -13
  624. package/dist/templates/pactile/modules/verify-basic/contract.md +11 -20
  625. package/dist/templates/pactile/tasks/templates/release-execution/design.md +5 -5
  626. package/dist/templates/pactile/tasks/templates/release-readiness/design.md +6 -6
  627. package/dist/templates/pactile/tasks/templates/release-readiness/handoff-template.md +8 -2
  628. package/dist/templates/pactile/workflow.md +37 -41
  629. package/dist/templates/template-utils.d.ts +1 -2
  630. package/dist/templates/template-utils.d.ts.map +1 -1
  631. package/dist/templates/template-utils.js +2 -13
  632. package/dist/templates/template-utils.js.map +1 -1
  633. package/dist/types/ai-tools.d.ts +1 -1
  634. package/dist/types/ai-tools.js +1 -1
  635. package/dist/utils/manifest-prune.js +1 -1
  636. package/dist/utils/manifest-prune.js.map +1 -1
  637. package/dist/utils/p36-upgrade.d.ts +2 -2
  638. package/dist/utils/p36-upgrade.d.ts.map +1 -1
  639. package/dist/utils/p36-upgrade.js +2 -10
  640. package/dist/utils/p36-upgrade.js.map +1 -1
  641. package/dist/utils/post-update-smoke.js +1 -1
  642. package/dist/utils/post-update-smoke.js.map +1 -1
  643. package/dist/utils/readiness.d.ts +2 -2
  644. package/dist/utils/readiness.js +2 -2
  645. package/dist/utils/uninstall-scrubbers.js +1 -1
  646. package/dist/utils/workflow-dir.d.ts +1 -1
  647. package/dist/utils/workflow-dir.d.ts.map +1 -1
  648. package/dist/utils/workflow-dir.js +1 -1
  649. package/dist/utils/workflow-dir.js.map +1 -1
  650. package/package.json +42 -37
  651. package/CHANGELOG.md +0 -651
  652. package/bin/compat-warning.js +0 -11
  653. package/bin/pactile.js +0 -3
  654. package/bin/smart-search.js +0 -38
  655. package/dist/migrations/manifests/0.1.0.json +0 -9
  656. package/dist/migrations/manifests/0.1.1.json +0 -9
  657. package/dist/migrations/manifests/0.1.2.json +0 -9
  658. package/dist/migrations/manifests/0.1.3.json +0 -9
  659. package/dist/migrations/manifests/0.1.4.json +0 -9
  660. package/dist/migrations/manifests/0.2.1.json +0 -9
  661. package/dist/migrations/manifests/0.2.10.json +0 -374
  662. package/dist/migrations/manifests/0.2.2.json +0 -9
  663. package/dist/migrations/manifests/0.2.3.json +0 -9
  664. package/dist/migrations/manifests/0.2.4.json +0 -9
  665. package/dist/migrations/manifests/0.2.5.json +0 -9
  666. package/dist/migrations/manifests/0.2.6.json +0 -9
  667. package/dist/migrations/manifests/0.2.7.json +0 -9
  668. package/dist/migrations/manifests/0.2.8.json +0 -9
  669. package/dist/migrations/manifests/0.2.9.json +0 -9
  670. package/dist/migrations/manifests/0.3.0.json +0 -89
  671. package/dist/migrations/manifests/0.3.1.json +0 -32
  672. package/dist/migrations/manifests/0.3.2.json +0 -16
  673. package/dist/migrations/manifests/0.3.3.json +0 -9
  674. package/dist/migrations/manifests/0.3.4.json +0 -9
  675. package/dist/migrations/manifests/0.3.5.json +0 -9
  676. package/dist/migrations/manifests/0.3.6.json +0 -9
  677. package/dist/migrations/manifests/0.4.0.json +0 -9
  678. package/dist/migrations/manifests/0.4.1.json +0 -9
  679. package/dist/migrations/manifests/0.4.2.json +0 -9
  680. package/dist/migrations/manifests/0.4.3.json +0 -9
  681. package/dist/migrations/manifests/0.5.0-beta.0.json +0 -9
  682. package/dist/migrations/manifests/0.5.0-beta.1.json +0 -9
  683. package/dist/migrations/manifests/0.5.0-beta.2.json +0 -9
  684. package/dist/migrations/manifests/0.5.0-beta.3.json +0 -9
  685. package/dist/migrations/manifests/0.5.0-beta.4.json +0 -9
  686. package/dist/migrations/manifests/0.5.0-beta.5.json +0 -9
  687. package/dist/migrations/manifests/0.5.0.json +0 -9
  688. package/dist/pactile/compat/retired-alternate-client.d.ts +0 -42
  689. package/dist/pactile/compat/retired-alternate-client.d.ts.map +0 -1
  690. package/dist/pactile/compat/retired-alternate-client.js +0 -153
  691. package/dist/pactile/compat/retired-alternate-client.js.map +0 -1
  692. package/dist/pactile/compat/update-residue.d.ts +0 -4
  693. package/dist/pactile/compat/update-residue.d.ts.map +0 -1
  694. package/dist/pactile/compat/update-residue.js +0 -55
  695. package/dist/pactile/compat/update-residue.js.map +0 -1
  696. package/dist/utils/cursor-retrieval-env.d.ts +0 -17
  697. package/dist/utils/cursor-retrieval-env.d.ts.map +0 -1
  698. package/dist/utils/cursor-retrieval-env.js +0 -19
  699. package/dist/utils/cursor-retrieval-env.js.map +0 -1
  700. package/dist/utils/proxy.d.ts +0 -25
  701. package/dist/utils/proxy.d.ts.map +0 -1
  702. package/dist/utils/proxy.js +0 -60
  703. package/dist/utils/proxy.js.map +0 -1
  704. package/scripts/postinstall.js +0 -6
@@ -0,0 +1,985 @@
1
+ import { ASSURANCE_LEVELS_V1, PACTILE_INTENTS_V1, fingerprintPactileContractV1, parseResolvedProviderV1, parseTileManifestV1, policyWithinCeilingV1, tilePolicyCeilingV1, } from "../../core/index.js";
2
+ import { KERNEL_CONDITIONS, KERNEL_OUTCOMES, KERNEL_PHASES, } from "../../core/task/index.js";
3
+ import { buildTileCatalog, compareTileRefs, conflictDiagnostics, diagnostic, expandTileSelection, isCanonicalTileCallerReference, sortTileDiagnostics, } from "./catalog.js";
4
+ import { compileTileComposition, } from "./compiler.js";
5
+ import { TILE_COMPILER_ABI_VERSION, } from "./loader.js";
6
+ export const TILE_SELECTION_SCHEMA_VERSION = 1;
7
+ export const MAX_TILE_SELECTION_CATALOG = 128;
8
+ export const MAX_TILE_SELECTION_OUTPUTS = 32;
9
+ export const MAX_TILE_SELECTION_CAPABILITIES = 128;
10
+ export const MAX_TILE_SELECTION_REFERENCES = 32;
11
+ export const MAX_TILE_SELECTION_SEARCH_NODES = 4096;
12
+ export const BASELINE_TILE_PHASES = {
13
+ "intake-basic": ["open"],
14
+ "define-basic": ["define"],
15
+ "approval-personal": ["approve"],
16
+ "execute-agent": ["execute"],
17
+ "verify-basic": ["verify"],
18
+ "close-basic": ["close"],
19
+ "context-progressive": ["open", "define", "approve", "execute", "verify", "integrate", "close"],
20
+ "observability-local": ["execute"],
21
+ };
22
+ export const ONDEMAND_TILE_PHASES = {
23
+ "define-extended": ["define"],
24
+ "independent-check": ["verify"],
25
+ "worker-orchestration": ["execute"],
26
+ "parent-child": ["define", "execute", "integrate", "verify"],
27
+ "spec-learning": ["close"],
28
+ "vcs-integration": ["close"],
29
+ };
30
+ export function tileAllowedInTaskPhase(tileId, tier, phase) {
31
+ const phases = tier === "baseline"
32
+ ? BASELINE_TILE_PHASES[tileId]
33
+ : ONDEMAND_TILE_PHASES[tileId];
34
+ return phases?.includes(phase) ?? false;
35
+ }
36
+ export function createTileSelectionLifecycleFailureReceipt(reasonCode, taskLifecycle = null) {
37
+ const body = {
38
+ schemaVersion: TILE_SELECTION_SCHEMA_VERSION,
39
+ outcome: "lifecycle-unavailable",
40
+ reasonCode,
41
+ taskLifecycle,
42
+ };
43
+ return { ...body, fingerprint: fingerprintPactileContractV1(body) };
44
+ }
45
+ /**
46
+ * Read-only request profile used by the built-in Task/Agent entry points.
47
+ * Callers may further restrict it; the selected-Task registry intersects it
48
+ * with the Task's recorded Tile grant before preparing an offer.
49
+ */
50
+ export function taskTileSelectionRequest(phase) {
51
+ const intentByPhase = {
52
+ open: "semantic",
53
+ define: "structural",
54
+ approve: "exact",
55
+ execute: "structural",
56
+ verify: "structural",
57
+ integrate: "structural",
58
+ close: "exact",
59
+ };
60
+ const outputsByPhase = {
61
+ open: ["request.scope"],
62
+ define: ["task.design"],
63
+ approve: ["approval.boundary"],
64
+ execute: ["worker.handoff"],
65
+ verify: ["review.verdict"],
66
+ integrate: ["integration.candidate"],
67
+ close: ["close.outcome"],
68
+ };
69
+ return {
70
+ intent: intentByPhase[phase],
71
+ requiredOutputs: outputsByPhase[phase],
72
+ policyCeiling: {
73
+ filesystem: "read",
74
+ process: "none",
75
+ network: "forbidden",
76
+ credentials: "forbidden",
77
+ privacy: "local-only",
78
+ egressDestinations: [],
79
+ telemetry: "local-only",
80
+ cost: "low",
81
+ },
82
+ capabilities: [],
83
+ providerFacts: [],
84
+ channel: "agent",
85
+ };
86
+ }
87
+ const TIER_ORDER = {
88
+ baseline: 0,
89
+ "on-demand": 1,
90
+ };
91
+ function failure(code, at = "$", tileRef = null) {
92
+ return {
93
+ success: false,
94
+ diagnostics: [diagnostic(code, tileRef, null, at)],
95
+ };
96
+ }
97
+ function isRecord(value) {
98
+ return value !== null && typeof value === "object" && !Array.isArray(value);
99
+ }
100
+ function canonicalPolicy(policy) {
101
+ return {
102
+ ...policy,
103
+ egressDestinations: [...policy.egressDestinations].sort(compareTileRefs),
104
+ };
105
+ }
106
+ function normalizeRequest(catalog, request) {
107
+ if (!isRecord(request))
108
+ return failure("tile-selection-invalid-request");
109
+ if (!PACTILE_INTENTS_V1.includes(request.intent))
110
+ return failure("tile-selection-invalid-intent", "$.intent");
111
+ const channel = request.channel ?? "agent";
112
+ if (channel !== "agent" && channel !== "explicit")
113
+ return failure("tile-selection-invalid-channel", "$.channel");
114
+ let taskLifecycle = null;
115
+ if (request.taskLifecycle !== undefined) {
116
+ const task = request.taskLifecycle;
117
+ if (!isRecord(task) ||
118
+ !isCanonicalTileCallerReference(task.taskId, false) ||
119
+ typeof task.projectFingerprint !== "string" ||
120
+ !/^sha256:[a-f0-9]{64}$/.test(task.projectFingerprint) ||
121
+ typeof task.scopeFingerprint !== "string" ||
122
+ !/^sha256:[a-f0-9]{64}$/.test(task.scopeFingerprint) ||
123
+ !isRecord(task.selectionGrant) ||
124
+ !(task.selectionGrant.source === "safe-default" || task.selectionGrant.source === "task-kernel-approval-snapshot") ||
125
+ !(task.selectionGrant.assurance === "no-grant" || task.selectionGrant.assurance === "recorded-user-assertion") ||
126
+ typeof task.selectionGrant.fingerprint !== "string" ||
127
+ !/^sha256:[a-f0-9]{64}$/.test(task.selectionGrant.fingerprint) ||
128
+ !Number.isSafeInteger(task.revision) ||
129
+ Number(task.revision) < 0 ||
130
+ !KERNEL_PHASES.includes(task.phase) ||
131
+ !KERNEL_CONDITIONS.includes(task.condition) ||
132
+ !(task.outcome === null || KERNEL_OUTCOMES.includes(task.outcome)))
133
+ return failure("tile-selection-invalid-task-lifecycle", "$.taskLifecycle");
134
+ taskLifecycle = {
135
+ taskId: task.taskId,
136
+ projectFingerprint: task.projectFingerprint,
137
+ scopeFingerprint: task.scopeFingerprint,
138
+ selectionGrant: {
139
+ source: task.selectionGrant.source,
140
+ assurance: task.selectionGrant.assurance,
141
+ fingerprint: task.selectionGrant.fingerprint,
142
+ },
143
+ revision: task.revision,
144
+ phase: task.phase,
145
+ condition: task.condition,
146
+ outcome: task.outcome,
147
+ };
148
+ }
149
+ if (!Array.isArray(request.requiredOutputs) ||
150
+ request.requiredOutputs.length === 0 ||
151
+ request.requiredOutputs.length > MAX_TILE_SELECTION_OUTPUTS)
152
+ return failure("tile-selection-output-bound", "$.requiredOutputs");
153
+ const requiredOutputs = [...request.requiredOutputs];
154
+ if (requiredOutputs.some((output) => !isCanonicalTileCallerReference(output, false)) ||
155
+ new Set(requiredOutputs).size !== requiredOutputs.length)
156
+ return failure("tile-selection-invalid-output", "$.requiredOutputs");
157
+ if (!Array.isArray(request.capabilities) ||
158
+ request.capabilities.length > MAX_TILE_SELECTION_CAPABILITIES)
159
+ return failure("tile-selection-capability-bound", "$.capabilities");
160
+ if (!Array.isArray(request.providerFacts ?? []) ||
161
+ (request.providerFacts ?? []).length > MAX_TILE_SELECTION_CAPABILITIES)
162
+ return failure("tile-selection-invalid-provider-facts", "$.providerFacts");
163
+ const policy = request.policyCeiling;
164
+ if (!isRecord(policy) || !Array.isArray(policy.egressDestinations))
165
+ return failure("tile-invalid-policy", "$.policyCeiling");
166
+ const probe = catalog.entries[0];
167
+ if (!probe)
168
+ return failure("tile-selection-empty-catalog");
169
+ const validPolicy = parseTileManifestV1({
170
+ ...probe.manifest,
171
+ permissions: {
172
+ filesystem: policy.filesystem,
173
+ process: policy.process,
174
+ credentials: policy.credentials,
175
+ },
176
+ egress: {
177
+ network: policy.network,
178
+ privacy: policy.privacy,
179
+ telemetry: policy.telemetry,
180
+ destinations: policy.egressDestinations,
181
+ },
182
+ cost: { ceiling: policy.cost },
183
+ fallback: { allowed: false, minimumAssurance: null, policy: null },
184
+ });
185
+ if (!validPolicy.success)
186
+ return failure("tile-invalid-policy", "$.policyCeiling");
187
+ const capabilities = [];
188
+ for (const [index, fact] of request.capabilities.entries()) {
189
+ if (!isRecord(fact) ||
190
+ !isCanonicalTileCallerReference(fact.id, false) ||
191
+ !ASSURANCE_LEVELS_V1.includes(fact.assurance))
192
+ return failure("tile-selection-invalid-capability", `$.capabilities[${index}]`);
193
+ capabilities.push({ id: fact.id, assurance: fact.assurance });
194
+ }
195
+ const providerFacts = [];
196
+ for (const [index, fact] of (request.providerFacts ?? []).entries()) {
197
+ const resolution = isRecord(fact) ? parseResolvedProviderV1(fact.resolution) : null;
198
+ if (!isRecord(fact) ||
199
+ !Array.isArray(fact.capabilityIds) ||
200
+ fact.capabilityIds.some((id) => !isCanonicalTileCallerReference(id, false)) ||
201
+ typeof fact.authorized !== "boolean" ||
202
+ !resolution?.success)
203
+ return failure("tile-selection-invalid-provider-facts", `$.providerFacts[${index}]`);
204
+ providerFacts.push({
205
+ capabilityIds: [...fact.capabilityIds].sort(compareTileRefs),
206
+ authorized: fact.authorized,
207
+ resolution: {
208
+ ...resolution.data,
209
+ evidenceRefs: resolution.data.evidenceRefs.map((ref) => /^pactile-evidence-ref-sha256:[a-f0-9]{64}$/.test(ref)
210
+ ? ref
211
+ : `pactile-evidence-ref-sha256:${fingerprintPactileContractV1({
212
+ schemaVersion: 1,
213
+ kind: "pactile.tile-selection.provider-evidence-ref",
214
+ reference: ref,
215
+ }).slice(7)}`),
216
+ },
217
+ });
218
+ }
219
+ const canonicalCapabilities = capabilities.sort((left, right) => compareTileRefs(JSON.stringify(left), JSON.stringify(right)));
220
+ const canonicalProviders = providerFacts.sort((left, right) => compareTileRefs(fingerprintPactileContractV1(left), fingerprintPactileContractV1(right)));
221
+ return {
222
+ success: true,
223
+ data: {
224
+ intent: request.intent,
225
+ requiredOutputs: requiredOutputs.sort(compareTileRefs),
226
+ policyCeiling: canonicalPolicy(policy),
227
+ capabilities: canonicalCapabilities,
228
+ providerFacts: canonicalProviders,
229
+ channel,
230
+ taskLifecycle,
231
+ },
232
+ };
233
+ }
234
+ /** Canonical request validation without requiring a full catalog fact table. */
235
+ export function normalizeTileSelectionRequest(catalog, request) {
236
+ const checked = buildTileCatalog(catalog.entries);
237
+ if (!checked.success)
238
+ return checked;
239
+ const normalized = normalizeRequest(checked.data, request);
240
+ if (!normalized.success)
241
+ return normalized;
242
+ const value = normalized.data;
243
+ return {
244
+ success: true,
245
+ data: {
246
+ intent: value.intent,
247
+ requiredOutputs: value.requiredOutputs,
248
+ policyCeiling: value.policyCeiling,
249
+ capabilities: value.capabilities,
250
+ providerFacts: value.providerFacts,
251
+ channel: value.channel,
252
+ ...(value.taskLifecycle ? { taskLifecycle: value.taskLifecycle } : {}),
253
+ },
254
+ };
255
+ }
256
+ function validateSelectionFacts(catalog, facts) {
257
+ if (!Array.isArray(facts) || facts.length !== catalog.entries.length)
258
+ return failure("tile-selection-facts-mismatch", "$.facts");
259
+ const known = new Set(catalog.entries.map((entry) => entry.ref));
260
+ const byRef = new Map();
261
+ for (const [index, fact] of facts.entries()) {
262
+ if (!isRecord(fact) ||
263
+ typeof fact.ref !== "string" ||
264
+ !known.has(fact.ref) ||
265
+ (fact.tier !== "baseline" && fact.tier !== "on-demand") ||
266
+ !["active", "registered", "deprecated", "disabled", "retired", "degraded"].includes(String(fact.lifecycle)) ||
267
+ byRef.has(fact.ref))
268
+ return failure("tile-selection-invalid-fact", `$.facts[${index}]`);
269
+ byRef.set(fact.ref, fact);
270
+ }
271
+ for (const entry of catalog.entries)
272
+ if (!byRef.has(entry.ref))
273
+ return failure("tile-selection-facts-mismatch", "$.facts");
274
+ return { success: true, data: byRef };
275
+ }
276
+ /** Canonical, validated inputs for a durable decision replay snapshot. */
277
+ export function normalizeTileSelectionReplayInput(catalog, request, facts) {
278
+ const checked = buildTileCatalog(catalog.entries);
279
+ if (!checked.success)
280
+ return checked;
281
+ const normalized = normalizeRequest(checked.data, request);
282
+ if (!normalized.success)
283
+ return normalized;
284
+ const validatedFacts = validateSelectionFacts(checked.data, facts);
285
+ if (!validatedFacts.success)
286
+ return validatedFacts;
287
+ const normalizedRequest = normalizeTileSelectionRequest(checked.data, request);
288
+ if (!normalizedRequest.success)
289
+ return normalizedRequest;
290
+ return {
291
+ success: true,
292
+ data: {
293
+ request: normalizedRequest.data,
294
+ facts: [...validatedFacts.data.values()].sort((left, right) => compareTileRefs(left.ref, right.ref)),
295
+ },
296
+ };
297
+ }
298
+ function compositionOutputs(catalog, expandedRefs) {
299
+ const entries = new Map(catalog.entries.map((entry) => [entry.ref, entry]));
300
+ return [...new Set(expandedRefs.flatMap((ref) => entries.get(ref)?.manifest.outputs ?? []))].sort(compareTileRefs);
301
+ }
302
+ function coverage(required, available) {
303
+ const availableSet = new Set(available);
304
+ const covered = required.filter((output) => availableSet.has(output));
305
+ const missing = required.filter((output) => !availableSet.has(output));
306
+ return { covered, missing };
307
+ }
308
+ function channelAllows(mode, channel) {
309
+ return mode === "both" || (channel === "agent" ? mode === "model" : mode === "explicit");
310
+ }
311
+ function isSelectableLifecycle(fact) {
312
+ return fact.lifecycle === "active" ||
313
+ (fact.tier === "on-demand" && fact.lifecycle === "registered");
314
+ }
315
+ function compilerRequest(request, requestedSelection) {
316
+ return {
317
+ requestedSelection,
318
+ capabilities: request.capabilities,
319
+ providerFacts: request.providerFacts,
320
+ policyCeiling: request.policyCeiling,
321
+ };
322
+ }
323
+ function buildSuggestion(catalog, request, eligible) {
324
+ let visitedStates = 0;
325
+ let searchBudgetExhausted = false;
326
+ let solution = null;
327
+ let bestPartial = {
328
+ selectedRefs: [],
329
+ expandedSelection: [],
330
+ coveredOutputs: [],
331
+ missingOutputs: [...request.requiredOutputs],
332
+ };
333
+ const visited = new Set();
334
+ const isBetterPartial = (candidate, current) => candidate.coveredOutputs.length > current.coveredOutputs.length ||
335
+ (candidate.coveredOutputs.length === current.coveredOutputs.length &&
336
+ (candidate.selectedRefs.length < current.selectedRefs.length ||
337
+ (candidate.selectedRefs.length === current.selectedRefs.length &&
338
+ (candidate.expandedSelection.length < current.expandedSelection.length ||
339
+ (candidate.expandedSelection.length === current.expandedSelection.length &&
340
+ compareTileRefs(JSON.stringify(candidate.selectedRefs), JSON.stringify(current.selectedRefs)) < 0)))));
341
+ const visit = (selectedRefs, knownComposition, knownOutputs) => {
342
+ if (solution || searchBudgetExhausted)
343
+ return;
344
+ const canonicalRefs = [...selectedRefs].sort(compareTileRefs);
345
+ const key = JSON.stringify(canonicalRefs);
346
+ if (visited.has(key))
347
+ return;
348
+ if (visitedStates >= MAX_TILE_SELECTION_SEARCH_NODES) {
349
+ searchBudgetExhausted = true;
350
+ return;
351
+ }
352
+ visited.add(key);
353
+ visitedStates += 1;
354
+ let composition = knownComposition;
355
+ let outputs = knownOutputs ?? [];
356
+ if (canonicalRefs.length && !composition) {
357
+ const compiled = compileTileComposition(catalog, compilerRequest(request, canonicalRefs));
358
+ if (!compiled.success)
359
+ return;
360
+ composition = compiled.data;
361
+ outputs = compositionOutputs(catalog, composition.expandedSelection);
362
+ }
363
+ const currentCoverage = coverage(request.requiredOutputs, outputs);
364
+ const state = {
365
+ selectedRefs: canonicalRefs,
366
+ expandedSelection: composition?.expandedSelection ?? [],
367
+ coveredOutputs: currentCoverage.covered,
368
+ missingOutputs: currentCoverage.missing,
369
+ };
370
+ if (isBetterPartial(state, bestPartial))
371
+ bestPartial = state;
372
+ if (currentCoverage.missing.length === 0) {
373
+ solution = state;
374
+ return;
375
+ }
376
+ const options = [];
377
+ for (const candidate of eligible) {
378
+ if (canonicalRefs.includes(candidate.candidate.ref))
379
+ continue;
380
+ const combined = [...canonicalRefs, candidate.candidate.ref].sort(compareTileRefs);
381
+ const compiled = compileTileComposition(catalog, compilerRequest(request, combined));
382
+ if (!compiled.success)
383
+ continue;
384
+ const combinedOutputs = compositionOutputs(catalog, compiled.data.expandedSelection);
385
+ const gainedOutputs = currentCoverage.missing.filter((output) => combinedOutputs.includes(output));
386
+ if (!gainedOutputs.length)
387
+ continue;
388
+ options.push({
389
+ selectedRefs: combined,
390
+ composition: compiled.data,
391
+ outputs: combinedOutputs,
392
+ gainedOutputs,
393
+ });
394
+ }
395
+ const outputChoices = currentCoverage.missing.map((output) => ({
396
+ output,
397
+ options: options.filter((option) => option.gainedOutputs.includes(output)),
398
+ }));
399
+ outputChoices.sort((left, right) => left.options.length - right.options.length || compareTileRefs(left.output, right.output));
400
+ const nextChoices = outputChoices[0]?.options ?? [];
401
+ for (const option of nextChoices) {
402
+ visit(option.selectedRefs, option.composition, option.outputs);
403
+ if (solution || searchBudgetExhausted)
404
+ return;
405
+ }
406
+ };
407
+ visit([]);
408
+ const result = solution ?? bestPartial;
409
+ const searchStatus = solution
410
+ ? "solution-found"
411
+ : searchBudgetExhausted
412
+ ? "budget-exhausted"
413
+ : "no-solution";
414
+ return {
415
+ selectedRefs: result.selectedRefs,
416
+ expandedSelection: result.expandedSelection,
417
+ coveredOutputs: result.coveredOutputs,
418
+ missingOutputs: result.missingOutputs,
419
+ complete: result.missingOutputs.length === 0,
420
+ searchStatus,
421
+ };
422
+ }
423
+ /**
424
+ * Build an Agent-facing offer only after intent, lifecycle, dependency,
425
+ * permission, conflict and compiler checks have accepted each candidate.
426
+ */
427
+ export function prepareTileSelection(sourceCatalog, request, facts) {
428
+ if (sourceCatalog.entries.length > MAX_TILE_SELECTION_CATALOG)
429
+ return failure("tile-selection-catalog-bound");
430
+ const checked = buildTileCatalog(sourceCatalog.entries);
431
+ if (!checked.success)
432
+ return checked;
433
+ const normalized = normalizeRequest(checked.data, request);
434
+ if (!normalized.success)
435
+ return normalized;
436
+ const factMap = validateSelectionFacts(checked.data, facts);
437
+ if (!factMap.success)
438
+ return factMap;
439
+ const inputFingerprint = fingerprintPactileContractV1({
440
+ compilerAbiVersion: TILE_COMPILER_ABI_VERSION,
441
+ catalogFingerprint: checked.data.fingerprint,
442
+ request: normalized.data,
443
+ facts: [...factMap.data.values()].sort((left, right) => compareTileRefs(left.ref, right.ref)),
444
+ });
445
+ const audit = [];
446
+ const eligible = [];
447
+ for (const entry of checked.data.entries) {
448
+ const fact = factMap.data.get(entry.ref);
449
+ if (!fact)
450
+ return failure("tile-selection-facts-mismatch");
451
+ const filterCodes = [];
452
+ if (normalized.data.taskLifecycle &&
453
+ (normalized.data.taskLifecycle.outcome !== null ||
454
+ (normalized.data.taskLifecycle.condition !== "ready" &&
455
+ normalized.data.taskLifecycle.condition !== "active")))
456
+ filterCodes.push("tile-selection-task-lifecycle-inactive");
457
+ if (normalized.data.taskLifecycle &&
458
+ !tileAllowedInTaskPhase(entry.manifest.identity.id, fact.tier, normalized.data.taskLifecycle.phase))
459
+ filterCodes.push("tile-selection-phase-ineligible");
460
+ if (!entry.manifest.trigger.intents.includes(normalized.data.intent))
461
+ filterCodes.push("tile-selection-intent-mismatch");
462
+ if (!channelAllows(entry.manifest.trigger.mode, normalized.data.channel))
463
+ filterCodes.push("tile-selection-channel-mismatch");
464
+ const closure = expandTileSelection(checked.data.entries, [entry.ref]);
465
+ if (!closure.success)
466
+ filterCodes.push("tile-selection-dependency-invalid");
467
+ const closureEntries = closure.success ? closure.data : [];
468
+ if (closureEntries.some((dependency) => {
469
+ const dependencyFact = factMap.data.get(dependency.ref);
470
+ return !dependencyFact || !isSelectableLifecycle(dependencyFact);
471
+ }))
472
+ filterCodes.push("tile-selection-lifecycle-ineligible");
473
+ if (closureEntries.some((dependency) => !policyWithinCeilingV1(tilePolicyCeilingV1(dependency.manifest), normalized.data.policyCeiling)))
474
+ filterCodes.push("tile-selection-permission-exceeded");
475
+ if (closure.success && conflictDiagnostics(closure.data).length)
476
+ filterCodes.push("tile-selection-conflict");
477
+ let compiled = null;
478
+ if (filterCodes.length === 0) {
479
+ compiled = compileTileComposition(checked.data, compilerRequest(normalized.data, [entry.ref]));
480
+ if (!compiled.success)
481
+ filterCodes.push("tile-selection-compiler-rejected");
482
+ }
483
+ const uniqueCodes = [...new Set(filterCodes)];
484
+ const item = {
485
+ ref: entry.ref,
486
+ tier: fact.tier,
487
+ lifecycle: fact.lifecycle,
488
+ eligible: uniqueCodes.length === 0,
489
+ filterCodes: uniqueCodes,
490
+ };
491
+ audit.push(item);
492
+ if (!item.eligible || !compiled?.success)
493
+ continue;
494
+ const outputs = compositionOutputs(checked.data, compiled.data.expandedSelection);
495
+ const matches = coverage(normalized.data.requiredOutputs, outputs).covered;
496
+ const explanations = [
497
+ "intent-match",
498
+ "channel-allowed",
499
+ fact.lifecycle === "registered" ? "lifecycle-registered" : "lifecycle-active",
500
+ ...(normalized.data.taskLifecycle ? ["task-lifecycle-actionable"] : []),
501
+ "dependencies-available",
502
+ "permissions-within-ceiling",
503
+ "conflict-free",
504
+ "compiler-valid",
505
+ ...(matches.length ? ["required-output-match"] : []),
506
+ ];
507
+ eligible.push({
508
+ candidate: {
509
+ ref: entry.ref,
510
+ tier: fact.tier,
511
+ lifecycle: fact.lifecycle,
512
+ summary: entry.manifest.summary,
513
+ trigger: entry.manifest.trigger,
514
+ inputs: entry.manifest.inputs,
515
+ outputs: entry.manifest.outputs,
516
+ dependencies: entry.manifest.dependencies,
517
+ conflicts: entry.manifest.conflicts,
518
+ dependencyClosure: compiled.data.expandedSelection,
519
+ minimumAssurance: compiled.data.minimumAssurance,
520
+ fingerprint: entry.fingerprint,
521
+ outputScore: matches.length,
522
+ explanations,
523
+ },
524
+ outputs,
525
+ });
526
+ }
527
+ eligible.sort((left, right) => right.candidate.outputScore - left.candidate.outputScore ||
528
+ left.candidate.dependencyClosure.length - right.candidate.dependencyClosure.length ||
529
+ TIER_ORDER[left.candidate.tier] - TIER_ORDER[right.candidate.tier] ||
530
+ compareTileRefs(left.candidate.ref, right.candidate.ref));
531
+ const suggestion = buildSuggestion(checked.data, normalized.data, eligible);
532
+ const eligibleIds = new Set(eligible.map((item) => item.candidate.ref.slice(0, item.candidate.ref.lastIndexOf("@"))));
533
+ const offerContent = {
534
+ schemaVersion: TILE_SELECTION_SCHEMA_VERSION,
535
+ compilerAbiVersion: TILE_COMPILER_ABI_VERSION,
536
+ catalogFingerprint: checked.data.fingerprint,
537
+ inputFingerprint,
538
+ intent: normalized.data.intent,
539
+ channel: normalized.data.channel,
540
+ requiredOutputs: normalized.data.requiredOutputs,
541
+ taskLifecycle: normalized.data.taskLifecycle,
542
+ candidates: eligible.map((item) => ({
543
+ ...item.candidate,
544
+ conflicts: item.candidate.conflicts.filter((id) => eligibleIds.has(id)),
545
+ })),
546
+ suggestion,
547
+ };
548
+ return {
549
+ success: true,
550
+ data: {
551
+ offer: {
552
+ ...offerContent,
553
+ fingerprint: fingerprintPactileContractV1(offerContent),
554
+ },
555
+ audit,
556
+ },
557
+ };
558
+ }
559
+ function normalizeAttempt(candidateRefs, values, required) {
560
+ const diagnostics = [];
561
+ const references = values ?? [];
562
+ let invalidReferenceCount = 0;
563
+ if (!Array.isArray(references) || references.length > MAX_TILE_SELECTION_REFERENCES) {
564
+ return {
565
+ refs: [],
566
+ invalidReferenceCount: Array.isArray(references)
567
+ ? MAX_TILE_SELECTION_REFERENCES + 1
568
+ : 1,
569
+ diagnostics: [diagnostic("tile-selection-reference-bound", null)],
570
+ };
571
+ }
572
+ if (required && references.length === 0)
573
+ diagnostics.push(diagnostic("tile-empty-selection", null));
574
+ const refs = new Set();
575
+ for (const [index, reference] of references.entries()) {
576
+ if (!isCanonicalTileCallerReference(reference, true)) {
577
+ invalidReferenceCount += 1;
578
+ diagnostics.push(diagnostic("tile-invalid-caller-reference", null, null, `$.selectedRefs[${index}]`));
579
+ continue;
580
+ }
581
+ const resolved = resolveCandidateSelectionRef(candidateRefs, reference);
582
+ if (!resolved) {
583
+ invalidReferenceCount += 1;
584
+ diagnostics.push(diagnostic("tile-missing-reference", null, null, `$.selectedRefs[${index}]`));
585
+ continue;
586
+ }
587
+ if (refs.has(resolved)) {
588
+ diagnostics.push(diagnostic("tile-duplicate-selection", resolved));
589
+ continue;
590
+ }
591
+ refs.add(resolved);
592
+ if (!candidateRefs.has(resolved))
593
+ diagnostics.push(diagnostic("tile-selection-not-eligible", resolved));
594
+ }
595
+ return {
596
+ refs: [...refs].sort(compareTileRefs),
597
+ invalidReferenceCount,
598
+ diagnostics: sortTileDiagnostics(diagnostics),
599
+ };
600
+ }
601
+ function resolveCandidateSelectionRef(candidateRefs, reference) {
602
+ const matches = [...candidateRefs].filter((candidateRef) => reference.includes("@")
603
+ ? candidateRef === reference
604
+ : candidateRef.slice(0, candidateRef.lastIndexOf("@")) === reference);
605
+ return matches.length === 1 ? matches[0] : null;
606
+ }
607
+ function redactedMissingReference(candidateRefs, index) {
608
+ const ids = new Set([...candidateRefs].map((ref) => ref.slice(0, ref.lastIndexOf("@"))));
609
+ let suffix = index;
610
+ let candidate = `pactile-redacted-ref-${suffix}`;
611
+ while (ids.has(candidate))
612
+ candidate = `pactile-redacted-ref-${++suffix}`;
613
+ return candidate;
614
+ }
615
+ function sanitizeDecisionReferences(candidateRefs, values) {
616
+ if (values === undefined)
617
+ return undefined;
618
+ if (!Array.isArray(values))
619
+ return undefined;
620
+ if (values.length > MAX_TILE_SELECTION_REFERENCES)
621
+ return Array.from({ length: MAX_TILE_SELECTION_REFERENCES + 1 }, (_, index) => redactedMissingReference(candidateRefs, index));
622
+ return values.map((value, index) => {
623
+ if (typeof value !== "string" || !isCanonicalTileCallerReference(value, true))
624
+ return "<redacted-invalid-ref>";
625
+ return resolveCandidateSelectionRef(candidateRefs, value) ? value : redactedMissingReference(candidateRefs, index);
626
+ });
627
+ }
628
+ /** Redact caller strings using only references already present in the offer. */
629
+ export function sanitizeTileSelectionDecisionForOffer(offer, decision) {
630
+ if (!isRecord(decision) || typeof decision.offerFingerprint !== "string")
631
+ return failure("tile-selection-replay-decision-invalid");
632
+ const isKnownKind = decision.kind === "adopt" || decision.kind === "override" || decision.kind === "no-match";
633
+ const kind = isKnownKind ? decision.kind : "invalid";
634
+ const candidateRefs = new Set(offer.candidates.map((candidate) => candidate.ref));
635
+ const knownFingerprint = /^sha256:[a-f0-9]{64}$/.test(decision.offerFingerprint);
636
+ const alternateFingerprint = offer.fingerprint === `sha256:${"0".repeat(64)}`
637
+ ? `sha256:${"1".repeat(64)}`
638
+ : `sha256:${"0".repeat(64)}`;
639
+ const safeDecision = {
640
+ kind,
641
+ offerFingerprint: knownFingerprint ? decision.offerFingerprint : alternateFingerprint,
642
+ ...(!isKnownKind ? {} : decision.selectedRefs !== undefined
643
+ ? {
644
+ selectedRefs: kind === "adopt"
645
+ ? []
646
+ : sanitizeDecisionReferences(candidateRefs, decision.selectedRefs),
647
+ }
648
+ : {}),
649
+ ...(isKnownKind && decision.priorAttemptRefs !== undefined
650
+ ? { priorAttemptRefs: sanitizeDecisionReferences(candidateRefs, decision.priorAttemptRefs) }
651
+ : {}),
652
+ };
653
+ return { success: true, data: safeDecision };
654
+ }
655
+ /** Redact invalid refs before comparing current-input replay receipts. */
656
+ export function sanitizeTileSelectionDecisionForReplay(catalog, request, facts, decision) {
657
+ if (!isRecord(decision) || typeof decision.offerFingerprint !== "string")
658
+ return failure("tile-selection-replay-decision-invalid");
659
+ const plan = prepareTileSelection(catalog, request, facts);
660
+ if (!plan.success)
661
+ return plan;
662
+ const safeDecision = sanitizeTileSelectionDecisionForOffer(plan.data.offer, decision);
663
+ if (!safeDecision.success)
664
+ return safeDecision;
665
+ const original = decideTileSelection(catalog, request, facts, decision);
666
+ if (!original.success)
667
+ return original;
668
+ const sanitized = decideTileSelection(catalog, request, facts, safeDecision.data);
669
+ if (!sanitized.success)
670
+ return sanitized;
671
+ if (original.data.fingerprint !== sanitized.data.fingerprint)
672
+ return failure("tile-selection-replay-redaction-mismatch");
673
+ return safeDecision;
674
+ }
675
+ function outputCoverageForComposition(catalog, requiredOutputs, expandedRefs) {
676
+ return coverage(requiredOutputs, compositionOutputs(catalog, expandedRefs));
677
+ }
678
+ function makeAttemptReceipt(catalog, request, refs, invalidReferenceCount, initialDiagnostics, candidates) {
679
+ const diagnostics = [...initialDiagnostics];
680
+ if (refs.some((ref) => !candidates.has(ref)))
681
+ diagnostics.push(...refs.filter((ref) => !candidates.has(ref)).map((ref) => diagnostic("tile-selection-not-eligible", ref)));
682
+ const canCompile = diagnostics.length === 0 && refs.length > 0;
683
+ const compiled = canCompile
684
+ ? compileTileComposition(catalog, compilerRequest(request, refs))
685
+ : null;
686
+ if (compiled && !compiled.success)
687
+ diagnostics.push(...compiled.diagnostics);
688
+ const compilerPassed = !!compiled?.success;
689
+ const resultCoverage = compiled?.success
690
+ ? outputCoverageForComposition(catalog, request.requiredOutputs, compiled.data.expandedSelection)
691
+ : { covered: [], missing: [...request.requiredOutputs] };
692
+ const outcome = diagnostics.length > 0 || invalidReferenceCount > 0 || !compilerPassed
693
+ ? "invalid-selection"
694
+ : resultCoverage.missing.length > 0
695
+ ? "mis-selection"
696
+ : "valid";
697
+ return {
698
+ outcome,
699
+ selectedRefs: refs,
700
+ invalidReferenceCount,
701
+ compilerPassed,
702
+ coveredOutputs: resultCoverage.covered,
703
+ missingOutputs: resultCoverage.missing,
704
+ diagnosticCodes: [...new Set(diagnostics.map((item) => item.code))].sort(compareTileRefs),
705
+ };
706
+ }
707
+ function receiptFingerprint(receipt) {
708
+ return fingerprintPactileContractV1(receipt);
709
+ }
710
+ function decideTileSelectionAgainstOffer(checked, normalized, offer, decision) {
711
+ const candidates = new Set(offer.candidates.map((candidate) => candidate.ref));
712
+ const diagnostics = [];
713
+ const decisionRecord = isRecord(decision) ? decision : null;
714
+ const decisionKind = decisionRecord?.kind;
715
+ const safeDecisionKind = decisionKind === "adopt"
716
+ ? "adopt"
717
+ : decisionKind === "override"
718
+ ? "override"
719
+ : decisionKind === "no-match"
720
+ ? "no-match"
721
+ : "invalid";
722
+ const decisionIsValid = safeDecisionKind !== "invalid";
723
+ let selectedRefs = [];
724
+ let invalidReferenceCount = 0;
725
+ let compilerPassed = false;
726
+ let compositionFingerprint = null;
727
+ let expandedSelection = [];
728
+ let coveredOutputs = [];
729
+ let missingOutputs = [...normalized.requiredOutputs];
730
+ let priorAttempt = null;
731
+ let outcome;
732
+ if (!decisionIsValid || typeof decisionRecord?.offerFingerprint !== "string") {
733
+ diagnostics.push(diagnostic("tile-selection-invalid-decision", null));
734
+ outcome = "invalid-selection";
735
+ }
736
+ else if (decisionRecord.offerFingerprint !== offer.fingerprint) {
737
+ diagnostics.push(diagnostic("tile-selection-stale-offer", null));
738
+ outcome = "stale-offer";
739
+ }
740
+ else {
741
+ const decisionValue = decisionRecord;
742
+ if (decisionValue.priorAttemptRefs !== undefined) {
743
+ const attempt = normalizeAttempt(candidates, decisionValue.priorAttemptRefs, true);
744
+ priorAttempt = makeAttemptReceipt(checked, normalized, attempt.refs, attempt.invalidReferenceCount, attempt.diagnostics, candidates);
745
+ }
746
+ if (decisionKind === "no-match") {
747
+ if (decisionValue.selectedRefs !== undefined) {
748
+ const attemptedSelection = normalizeAttempt(candidates, decisionValue.selectedRefs, false);
749
+ if (attemptedSelection.refs.length || attemptedSelection.diagnostics.length || attemptedSelection.invalidReferenceCount) {
750
+ diagnostics.push(diagnostic("tile-no-match-has-selection", null));
751
+ outcome = "invalid-selection";
752
+ }
753
+ else
754
+ outcome = "no-match";
755
+ }
756
+ else
757
+ outcome = "no-match";
758
+ }
759
+ else if (decisionKind === "adopt") {
760
+ selectedRefs = offer.suggestion.selectedRefs;
761
+ if (!offer.suggestion.complete) {
762
+ selectedRefs = [];
763
+ if (offer.suggestion.searchStatus === "budget-exhausted") {
764
+ diagnostics.push(diagnostic("tile-selection-search-budget-exhausted", null));
765
+ outcome = "search-incomplete";
766
+ }
767
+ else {
768
+ diagnostics.push(diagnostic("tile-suggestion-incomplete", null));
769
+ outcome = "no-match";
770
+ }
771
+ }
772
+ else if (decisionValue.selectedRefs !== undefined) {
773
+ diagnostics.push(diagnostic("tile-adopt-selection-must-use-suggestion", null));
774
+ outcome = "invalid-selection";
775
+ }
776
+ else
777
+ outcome = "selected";
778
+ }
779
+ else {
780
+ const attempt = normalizeAttempt(candidates, decisionValue.selectedRefs, true);
781
+ selectedRefs = attempt.refs;
782
+ invalidReferenceCount = attempt.invalidReferenceCount;
783
+ diagnostics.push(...attempt.diagnostics);
784
+ if (attempt.diagnostics.length || attempt.invalidReferenceCount)
785
+ outcome = "invalid-selection";
786
+ else
787
+ outcome = "overridden";
788
+ }
789
+ if (outcome === "selected" || outcome === "overridden") {
790
+ const compiled = compileTileComposition(checked, compilerRequest(normalized, selectedRefs));
791
+ if (!compiled.success) {
792
+ diagnostics.push(...compiled.diagnostics);
793
+ outcome = "compile-rejected";
794
+ }
795
+ else {
796
+ compilerPassed = true;
797
+ compositionFingerprint = compiled.data.fingerprint;
798
+ expandedSelection = compiled.data.expandedSelection;
799
+ const resultCoverage = outputCoverageForComposition(checked, normalized.requiredOutputs, compiled.data.expandedSelection);
800
+ coveredOutputs = resultCoverage.covered;
801
+ missingOutputs = resultCoverage.missing;
802
+ if (missingOutputs.length)
803
+ outcome = "mis-selection";
804
+ }
805
+ }
806
+ }
807
+ const normalizedDiagnostics = sortTileDiagnostics(diagnostics);
808
+ const receiptBody = {
809
+ schemaVersion: TILE_SELECTION_SCHEMA_VERSION,
810
+ catalogFingerprint: checked.fingerprint,
811
+ inputFingerprint: offer.inputFingerprint,
812
+ offerFingerprint: offer.fingerprint,
813
+ decision: safeDecisionKind,
814
+ outcome,
815
+ selectedRefs,
816
+ expandedSelection,
817
+ invalidReferenceCount,
818
+ compilerPassed,
819
+ compositionFingerprint,
820
+ coveredOutputs,
821
+ missingOutputs,
822
+ taskLifecycle: normalized.taskLifecycle,
823
+ diagnostics: normalizedDiagnostics,
824
+ priorAttempt,
825
+ };
826
+ return {
827
+ success: true,
828
+ data: { ...receiptBody, fingerprint: receiptFingerprint(receiptBody) },
829
+ };
830
+ }
831
+ function sameSelectionValue(left, right) {
832
+ return fingerprintPactileContractV1(left) === fingerprintPactileContractV1(right);
833
+ }
834
+ function validateHistoricalOffer(catalog, request, offer, candidateFacts) {
835
+ if (!isRecord(offer) || !Array.isArray(offer.candidates) || offer.candidates.length > catalog.entries.length)
836
+ return failure("tile-selection-snapshot-offer-invalid");
837
+ const { fingerprint, ...offerContent } = offer;
838
+ if (offer.schemaVersion !== TILE_SELECTION_SCHEMA_VERSION ||
839
+ offer.compilerAbiVersion !== TILE_COMPILER_ABI_VERSION ||
840
+ offer.catalogFingerprint !== catalog.fingerprint ||
841
+ !/^sha256:[a-f0-9]{64}$/.test(offer.inputFingerprint) ||
842
+ typeof fingerprint !== "string" ||
843
+ fingerprintPactileContractV1(offerContent) !== fingerprint ||
844
+ offer.intent !== request.intent ||
845
+ offer.channel !== request.channel ||
846
+ !sameSelectionValue(offer.requiredOutputs, request.requiredOutputs) ||
847
+ !sameSelectionValue(offer.taskLifecycle, request.taskLifecycle))
848
+ return failure("tile-selection-snapshot-offer-mismatch");
849
+ const catalogByRef = new Map(catalog.entries.map((entry) => [entry.ref, entry]));
850
+ const candidateRefs = new Set();
851
+ for (const candidate of offer.candidates) {
852
+ if (!isRecord(candidate) || typeof candidate.ref !== "string" || candidateRefs.has(candidate.ref))
853
+ return failure("tile-selection-snapshot-offer-invalid");
854
+ candidateRefs.add(candidate.ref);
855
+ }
856
+ const eligibleIds = new Set([...candidateRefs].map((ref) => ref.slice(0, ref.lastIndexOf("@"))));
857
+ const factsByRef = new Map();
858
+ const requiredFactRefs = new Set();
859
+ for (const candidate of offer.candidates) {
860
+ requiredFactRefs.add(candidate.ref);
861
+ if (!Array.isArray(candidate.dependencyClosure))
862
+ return failure("tile-selection-snapshot-offer-invalid");
863
+ for (const ref of candidate.dependencyClosure) {
864
+ if (typeof ref !== "string" || !catalogByRef.has(ref))
865
+ return failure("tile-selection-snapshot-offer-invalid");
866
+ requiredFactRefs.add(ref);
867
+ }
868
+ }
869
+ if (!Array.isArray(candidateFacts) || candidateFacts.length !== requiredFactRefs.size)
870
+ return failure("tile-selection-snapshot-input-mismatch");
871
+ for (const fact of candidateFacts) {
872
+ if (!isRecord(fact) ||
873
+ typeof fact.ref !== "string" ||
874
+ !requiredFactRefs.has(fact.ref) ||
875
+ (fact.tier !== "baseline" && fact.tier !== "on-demand") ||
876
+ !["active", "registered", "deprecated", "disabled", "retired", "degraded"].includes(String(fact.lifecycle)) ||
877
+ factsByRef.has(fact.ref))
878
+ return failure("tile-selection-snapshot-input-mismatch");
879
+ factsByRef.set(fact.ref, fact);
880
+ }
881
+ if ([...requiredFactRefs].some((ref) => !factsByRef.has(ref)))
882
+ return failure("tile-selection-snapshot-input-mismatch");
883
+ const lifecycle = request.taskLifecycle;
884
+ if (lifecycle && (lifecycle.outcome !== null || (lifecycle.condition !== "ready" && lifecycle.condition !== "active")))
885
+ return failure("tile-selection-snapshot-offer-invalid");
886
+ const eligible = [];
887
+ for (const candidate of offer.candidates) {
888
+ const entry = catalogByRef.get(candidate.ref);
889
+ const fact = factsByRef.get(candidate.ref);
890
+ if (!entry || !fact || !isSelectableLifecycle(fact) || fact.tier !== candidate.tier || fact.lifecycle !== candidate.lifecycle)
891
+ return failure("tile-selection-snapshot-offer-invalid");
892
+ const manifest = entry.manifest;
893
+ if ((lifecycle && !tileAllowedInTaskPhase(manifest.identity.id, fact.tier, lifecycle.phase)) ||
894
+ !manifest.trigger.intents.includes(request.intent) ||
895
+ !channelAllows(manifest.trigger.mode, request.channel))
896
+ return failure("tile-selection-snapshot-offer-invalid");
897
+ const closure = expandTileSelection(catalog.entries, [entry.ref]);
898
+ if (!closure.success || conflictDiagnostics(closure.data).length)
899
+ return failure("tile-selection-snapshot-offer-invalid");
900
+ if (closure.data.some((dependency) => {
901
+ const dependencyFact = factsByRef.get(dependency.ref);
902
+ return !dependencyFact || !isSelectableLifecycle(dependencyFact) ||
903
+ !policyWithinCeilingV1(tilePolicyCeilingV1(dependency.manifest), request.policyCeiling);
904
+ }))
905
+ return failure("tile-selection-snapshot-offer-invalid");
906
+ const compiled = compileTileComposition(catalog, compilerRequest(request, [entry.ref]));
907
+ if (!compiled.success)
908
+ return failure("tile-selection-snapshot-offer-invalid");
909
+ const outputs = compositionOutputs(catalog, compiled.data.expandedSelection);
910
+ const matches = coverage(request.requiredOutputs, outputs).covered;
911
+ const expectedCandidate = {
912
+ ref: entry.ref,
913
+ tier: fact.tier,
914
+ lifecycle: fact.lifecycle,
915
+ summary: manifest.summary,
916
+ trigger: manifest.trigger,
917
+ inputs: manifest.inputs,
918
+ outputs: manifest.outputs,
919
+ dependencies: manifest.dependencies,
920
+ conflicts: manifest.conflicts.filter((id) => eligibleIds.has(id)),
921
+ dependencyClosure: compiled.data.expandedSelection,
922
+ minimumAssurance: compiled.data.minimumAssurance,
923
+ fingerprint: entry.fingerprint,
924
+ outputScore: matches.length,
925
+ explanations: [
926
+ "intent-match",
927
+ "channel-allowed",
928
+ fact.lifecycle === "registered" ? "lifecycle-registered" : "lifecycle-active",
929
+ ...(lifecycle ? ["task-lifecycle-actionable"] : []),
930
+ "dependencies-available",
931
+ "permissions-within-ceiling",
932
+ "conflict-free",
933
+ "compiler-valid",
934
+ ...(matches.length ? ["required-output-match"] : []),
935
+ ],
936
+ };
937
+ if (!sameSelectionValue(candidate, expectedCandidate))
938
+ return failure("tile-selection-snapshot-offer-invalid");
939
+ eligible.push({ candidate: expectedCandidate, outputs });
940
+ }
941
+ eligible.sort((left, right) => right.candidate.outputScore - left.candidate.outputScore ||
942
+ left.candidate.dependencyClosure.length - right.candidate.dependencyClosure.length ||
943
+ TIER_ORDER[left.candidate.tier] - TIER_ORDER[right.candidate.tier] ||
944
+ compareTileRefs(left.candidate.ref, right.candidate.ref));
945
+ if (!sameSelectionValue(offer.candidates, eligible.map((item) => item.candidate)))
946
+ return failure("tile-selection-snapshot-offer-invalid");
947
+ const expectedSuggestion = buildSuggestion(catalog, request, eligible);
948
+ if (!sameSelectionValue(offer.suggestion, expectedSuggestion))
949
+ return failure("tile-selection-snapshot-offer-invalid");
950
+ return { success: true, data: true };
951
+ }
952
+ /** Re-run a historical decision from a filtered Offer and the matching catalog version. */
953
+ export function replayTileSelectionDecisionFromOffer(sourceCatalog, request, offer, candidateFacts, decision) {
954
+ const checked = buildTileCatalog(sourceCatalog.entries);
955
+ if (!checked.success)
956
+ return checked;
957
+ const normalized = normalizeRequest(checked.data, request);
958
+ if (!normalized.success)
959
+ return normalized;
960
+ const validatedOffer = validateHistoricalOffer(checked.data, normalized.data, offer, candidateFacts);
961
+ if (!validatedOffer.success)
962
+ return validatedOffer;
963
+ return decideTileSelectionAgainstOffer(checked.data, normalized.data, offer, decision);
964
+ }
965
+ /**
966
+ * Produce a replayable decision result. Adoption and override both re-run the
967
+ * compiler; overrides can change the suggestion but cannot bypass its checks.
968
+ */
969
+ export function decideTileSelection(catalog, request, facts, decision) {
970
+ const plan = prepareTileSelection(catalog, request, facts);
971
+ if (!plan.success)
972
+ return plan;
973
+ const checked = buildTileCatalog(catalog.entries);
974
+ if (!checked.success)
975
+ return checked;
976
+ const normalized = normalizeRequest(checked.data, request);
977
+ if (!normalized.success)
978
+ return normalized;
979
+ return decideTileSelectionAgainstOffer(checked.data, normalized.data, plan.data.offer, decision);
980
+ }
981
+ /** Recompute the same offer and decision receipt from their original inputs. */
982
+ export function replayTileSelectionDecision(catalog, request, facts, decision) {
983
+ return decideTileSelection(catalog, request, facts, decision);
984
+ }
985
+ //# sourceMappingURL=selection.js.map