@mannyc1/ts-release 0.0.6 → 0.2.2

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 (639) hide show
  1. package/ARCHITECTURE.md +124 -87
  2. package/CHANGELOG.md +115 -0
  3. package/LICENSE +21 -0
  4. package/README.md +272 -540
  5. package/SPEC.md +206 -305
  6. package/apps/release-ts/README.md +32 -0
  7. package/apps/release-ts/src/cli/command.ts +164 -0
  8. package/apps/release-ts/src/cli/commands.ts +351 -0
  9. package/apps/release-ts/src/cli/main.ts +43 -0
  10. package/apps/release-ts/src/cli/node-main.ts +49 -0
  11. package/apps/ts-release-agents/LICENSE +21 -0
  12. package/apps/ts-release-agents/README.md +21 -0
  13. package/apps/ts-release-agents/evals/cases.json +11 -0
  14. package/apps/ts-release-agents/manifests/claude.json +5 -0
  15. package/apps/ts-release-agents/manifests/codex.json +5 -0
  16. package/apps/ts-release-agents/package.json +11 -0
  17. package/apps/ts-release-agents/skills/release/SKILL.md +48 -0
  18. package/apps/ts-release-agents/skills/release/references/configuration.md +18 -0
  19. package/apps/ts-release-agents/skills/release/references/recovery.md +10 -0
  20. package/apps/ts-release-agents/skills/release/references/staged-workflow.md +12 -0
  21. package/apps/ts-release-agents/skills/release/references/target-selection.md +13 -0
  22. package/apps/ts-release-agents/skills/release/references/verification.md +14 -0
  23. package/apps/ts-release-agents/src/build.ts +105 -0
  24. package/apps/ts-release-agents/src/check.ts +117 -0
  25. package/apps/ts-release-agents/src/install.ts +121 -0
  26. package/apps/ts-release-agents/test/contract.test.ts +56 -0
  27. package/apps/ts-release-agents/tsconfig.json +5 -0
  28. package/dist/api/api.d.ts +15 -0
  29. package/dist/api/api.d.ts.map +1 -0
  30. package/dist/api/api.js +244 -0
  31. package/dist/api/api.js.map +1 -0
  32. package/dist/api/errors.d.ts +39 -0
  33. package/dist/api/errors.d.ts.map +1 -0
  34. package/dist/api/errors.js +32 -0
  35. package/dist/api/errors.js.map +1 -0
  36. package/dist/api/input.d.ts +10 -0
  37. package/dist/api/input.d.ts.map +1 -0
  38. package/dist/api/input.js +73 -0
  39. package/dist/api/input.js.map +1 -0
  40. package/dist/api/runtime.d.ts +18 -0
  41. package/dist/api/runtime.d.ts.map +1 -0
  42. package/dist/api/runtime.js +7 -0
  43. package/dist/api/runtime.js.map +1 -0
  44. package/dist/api/types.d.ts +76 -0
  45. package/dist/api/types.d.ts.map +1 -0
  46. package/dist/api/types.js +17 -0
  47. package/dist/api/types.js.map +1 -0
  48. package/dist/bin/ts-release.js +39239 -0
  49. package/dist/capabilities/bun-targets.d.ts +3 -0
  50. package/dist/capabilities/bun-targets.d.ts.map +1 -0
  51. package/dist/capabilities/bun-targets.js +3 -0
  52. package/dist/capabilities/bun-targets.js.map +1 -0
  53. package/dist/capabilities/field-ownership.d.ts +17 -0
  54. package/dist/capabilities/field-ownership.d.ts.map +1 -0
  55. package/dist/capabilities/field-ownership.js +40 -0
  56. package/dist/capabilities/field-ownership.js.map +1 -0
  57. package/dist/capabilities/module.d.ts +91 -0
  58. package/dist/capabilities/module.d.ts.map +1 -0
  59. package/dist/capabilities/module.js +2 -0
  60. package/dist/capabilities/module.js.map +1 -0
  61. package/dist/capabilities/registry.d.ts +829 -0
  62. package/dist/capabilities/registry.d.ts.map +1 -0
  63. package/dist/capabilities/registry.js +291 -0
  64. package/dist/capabilities/registry.js.map +1 -0
  65. package/dist/config/config.d.ts +6 -0
  66. package/dist/config/config.d.ts.map +1 -0
  67. package/dist/config/config.js +42 -0
  68. package/dist/config/config.js.map +1 -0
  69. package/dist/correction/coordinator.d.ts +248 -0
  70. package/dist/correction/coordinator.d.ts.map +1 -0
  71. package/dist/correction/coordinator.js +274 -0
  72. package/dist/correction/coordinator.js.map +1 -0
  73. package/dist/correction/index.d.ts +3 -0
  74. package/dist/correction/index.d.ts.map +1 -0
  75. package/dist/correction/index.js +3 -0
  76. package/dist/correction/index.js.map +1 -0
  77. package/dist/correction/intent.d.ts +111 -0
  78. package/dist/correction/intent.d.ts.map +1 -0
  79. package/dist/correction/intent.js +146 -0
  80. package/dist/correction/intent.js.map +1 -0
  81. package/dist/drivers/archive.d.ts +8 -0
  82. package/dist/drivers/archive.d.ts.map +1 -0
  83. package/dist/drivers/archive.js +101 -0
  84. package/dist/drivers/archive.js.map +1 -0
  85. package/dist/drivers/contain.d.ts +6 -0
  86. package/dist/drivers/contain.d.ts.map +1 -0
  87. package/dist/drivers/contain.js +17 -0
  88. package/dist/drivers/contain.js.map +1 -0
  89. package/dist/drivers/environment.d.ts +4 -0
  90. package/dist/drivers/environment.d.ts.map +1 -0
  91. package/dist/drivers/environment.js +18 -0
  92. package/dist/drivers/environment.js.map +1 -0
  93. package/dist/drivers/errors.d.ts +9 -0
  94. package/dist/drivers/errors.d.ts.map +1 -0
  95. package/dist/drivers/errors.js +6 -0
  96. package/dist/drivers/errors.js.map +1 -0
  97. package/dist/drivers/glob.d.ts +2 -0
  98. package/dist/drivers/glob.d.ts.map +1 -0
  99. package/dist/drivers/glob.js +162 -0
  100. package/dist/drivers/glob.js.map +1 -0
  101. package/dist/drivers/process.d.ts +48 -0
  102. package/dist/drivers/process.d.ts.map +1 -0
  103. package/dist/drivers/process.js +257 -0
  104. package/dist/drivers/process.js.map +1 -0
  105. package/dist/drivers/redact.d.ts +4 -0
  106. package/dist/drivers/redact.d.ts.map +1 -0
  107. package/dist/drivers/redact.js +24 -0
  108. package/dist/drivers/redact.js.map +1 -0
  109. package/dist/drivers/seccomp-helper-source.d.ts +7 -0
  110. package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
  111. package/dist/drivers/seccomp-helper-source.js +121 -0
  112. package/dist/drivers/seccomp-helper-source.js.map +1 -0
  113. package/dist/drivers/utils.d.ts +4 -0
  114. package/dist/drivers/utils.d.ts.map +1 -0
  115. package/dist/drivers/utils.js +5 -0
  116. package/dist/drivers/utils.js.map +1 -0
  117. package/dist/drivers/workspace.d.ts +6 -0
  118. package/dist/drivers/workspace.d.ts.map +1 -0
  119. package/dist/drivers/workspace.js +49 -0
  120. package/dist/drivers/workspace.js.map +1 -0
  121. package/dist/extensions/provider-adapter.d.ts +48 -0
  122. package/dist/extensions/provider-adapter.d.ts.map +1 -0
  123. package/dist/extensions/provider-adapter.js +64 -0
  124. package/dist/extensions/provider-adapter.js.map +1 -0
  125. package/dist/host.d.ts +33 -0
  126. package/dist/host.d.ts.map +1 -0
  127. package/dist/host.js +20 -0
  128. package/dist/host.js.map +1 -0
  129. package/dist/index.d.ts +19 -1
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +12 -1
  132. package/dist/index.js.map +1 -1
  133. package/dist/model/artifact-collection.d.ts +84 -0
  134. package/dist/model/artifact-collection.d.ts.map +1 -0
  135. package/dist/model/artifact-collection.js +185 -0
  136. package/dist/model/artifact-collection.js.map +1 -0
  137. package/dist/model/authority.d.ts +89 -0
  138. package/dist/model/authority.d.ts.map +1 -0
  139. package/dist/model/authority.js +80 -0
  140. package/dist/model/authority.js.map +1 -0
  141. package/dist/model/bun-targets.d.ts +34 -0
  142. package/dist/model/bun-targets.d.ts.map +1 -0
  143. package/dist/model/bun-targets.js +17 -0
  144. package/dist/model/bun-targets.js.map +1 -0
  145. package/dist/model/canonical.d.ts +8 -0
  146. package/dist/model/canonical.d.ts.map +1 -0
  147. package/dist/model/canonical.js +205 -0
  148. package/dist/model/canonical.js.map +1 -0
  149. package/dist/model/catalog.d.ts +76 -0
  150. package/dist/model/catalog.d.ts.map +1 -0
  151. package/dist/model/catalog.js +174 -0
  152. package/dist/model/catalog.js.map +1 -0
  153. package/dist/model/digest.d.ts +53 -0
  154. package/dist/model/digest.d.ts.map +1 -0
  155. package/dist/model/digest.js +127 -0
  156. package/dist/model/digest.js.map +1 -0
  157. package/dist/model/errors.d.ts +14 -0
  158. package/dist/model/errors.d.ts.map +1 -0
  159. package/dist/model/errors.js +8 -0
  160. package/dist/model/errors.js.map +1 -0
  161. package/dist/model/primitives.d.ts +19 -0
  162. package/dist/model/primitives.d.ts.map +1 -0
  163. package/dist/model/primitives.js +18 -0
  164. package/dist/model/primitives.js.map +1 -0
  165. package/dist/model/pypi.d.ts +12 -0
  166. package/dist/model/pypi.d.ts.map +1 -0
  167. package/dist/model/pypi.js +20 -0
  168. package/dist/model/pypi.js.map +1 -0
  169. package/dist/model/python-distribution.d.ts +33 -0
  170. package/dist/model/python-distribution.d.ts.map +1 -0
  171. package/dist/model/python-distribution.js +367 -0
  172. package/dist/model/python-distribution.js.map +1 -0
  173. package/dist/model/secret-patterns.d.ts +2 -0
  174. package/dist/model/secret-patterns.d.ts.map +1 -0
  175. package/dist/model/secret-patterns.js +12 -0
  176. package/dist/model/secret-patterns.js.map +1 -0
  177. package/dist/platform/bun.d.ts +7 -0
  178. package/dist/platform/bun.d.ts.map +1 -0
  179. package/dist/platform/bun.js +15 -0
  180. package/dist/platform/bun.js.map +1 -0
  181. package/dist/platform/credentials.d.ts +32 -0
  182. package/dist/platform/credentials.d.ts.map +1 -0
  183. package/dist/platform/credentials.js +772 -0
  184. package/dist/platform/credentials.js.map +1 -0
  185. package/dist/platform/host-support.d.ts +2 -0
  186. package/dist/platform/host-support.d.ts.map +1 -0
  187. package/dist/platform/host-support.js +4 -0
  188. package/dist/platform/host-support.js.map +1 -0
  189. package/dist/platform/node.d.ts +7 -0
  190. package/dist/platform/node.d.ts.map +1 -0
  191. package/dist/platform/node.js +15 -0
  192. package/dist/platform/node.js.map +1 -0
  193. package/dist/platform/release-runtime.d.ts +11 -0
  194. package/dist/platform/release-runtime.d.ts.map +1 -0
  195. package/dist/platform/release-runtime.js +34 -0
  196. package/dist/platform/release-runtime.js.map +1 -0
  197. package/dist/platform/services.d.ts +15 -0
  198. package/dist/platform/services.d.ts.map +1 -0
  199. package/dist/platform/services.js +30 -0
  200. package/dist/platform/services.js.map +1 -0
  201. package/dist/platform/source-observer.d.ts +5 -0
  202. package/dist/platform/source-observer.d.ts.map +1 -0
  203. package/dist/platform/source-observer.js +159 -0
  204. package/dist/platform/source-observer.js.map +1 -0
  205. package/dist/provider-sdk.d.ts +14 -0
  206. package/dist/provider-sdk.d.ts.map +1 -0
  207. package/dist/provider-sdk.js +10 -0
  208. package/dist/provider-sdk.js.map +1 -0
  209. package/dist/publication/adapter.d.ts +212 -0
  210. package/dist/publication/adapter.d.ts.map +1 -0
  211. package/dist/publication/adapter.js +83 -0
  212. package/dist/publication/adapter.js.map +1 -0
  213. package/dist/publication/authority.d.ts +137 -0
  214. package/dist/publication/authority.d.ts.map +1 -0
  215. package/dist/publication/authority.js +233 -0
  216. package/dist/publication/authority.js.map +1 -0
  217. package/dist/publication/catalog-git.d.ts +37 -0
  218. package/dist/publication/catalog-git.d.ts.map +1 -0
  219. package/dist/publication/catalog-git.js +451 -0
  220. package/dist/publication/catalog-git.js.map +1 -0
  221. package/dist/publication/claim.d.ts +39 -0
  222. package/dist/publication/claim.d.ts.map +1 -0
  223. package/dist/publication/claim.js +31 -0
  224. package/dist/publication/claim.js.map +1 -0
  225. package/dist/publication/coordinator.d.ts +246 -0
  226. package/dist/publication/coordinator.d.ts.map +1 -0
  227. package/dist/publication/coordinator.js +370 -0
  228. package/dist/publication/coordinator.js.map +1 -0
  229. package/dist/publication/github.d.ts +36 -0
  230. package/dist/publication/github.d.ts.map +1 -0
  231. package/dist/publication/github.js +644 -0
  232. package/dist/publication/github.js.map +1 -0
  233. package/dist/publication/http.d.ts +69 -0
  234. package/dist/publication/http.d.ts.map +1 -0
  235. package/dist/publication/http.js +29 -0
  236. package/dist/publication/http.js.map +1 -0
  237. package/dist/publication/index.d.ts +5 -0
  238. package/dist/publication/index.d.ts.map +1 -0
  239. package/dist/publication/index.js +5 -0
  240. package/dist/publication/index.js.map +1 -0
  241. package/dist/publication/npm.d.ts +40 -0
  242. package/dist/publication/npm.d.ts.map +1 -0
  243. package/dist/publication/npm.js +359 -0
  244. package/dist/publication/npm.js.map +1 -0
  245. package/dist/publication/profiles.d.ts +136 -0
  246. package/dist/publication/profiles.d.ts.map +1 -0
  247. package/dist/publication/profiles.js +90 -0
  248. package/dist/publication/profiles.js.map +1 -0
  249. package/dist/publication/publisher.d.ts +82 -0
  250. package/dist/publication/publisher.d.ts.map +1 -0
  251. package/dist/publication/publisher.js +53 -0
  252. package/dist/publication/publisher.js.map +1 -0
  253. package/dist/publication/pypi.d.ts +45 -0
  254. package/dist/publication/pypi.d.ts.map +1 -0
  255. package/dist/publication/pypi.js +369 -0
  256. package/dist/publication/pypi.js.map +1 -0
  257. package/dist/publication/recovery.d.ts +663 -0
  258. package/dist/publication/recovery.d.ts.map +1 -0
  259. package/dist/publication/recovery.js +252 -0
  260. package/dist/publication/recovery.js.map +1 -0
  261. package/dist/publication/report.d.ts +1061 -0
  262. package/dist/publication/report.d.ts.map +1 -0
  263. package/dist/publication/report.js +441 -0
  264. package/dist/publication/report.js.map +1 -0
  265. package/dist/recipes/config.d.ts +296 -0
  266. package/dist/recipes/config.d.ts.map +1 -0
  267. package/dist/recipes/config.js +325 -0
  268. package/dist/recipes/config.js.map +1 -0
  269. package/dist/release/capabilities.d.ts +12 -0
  270. package/dist/release/capabilities.d.ts.map +1 -0
  271. package/dist/release/capabilities.js +395 -0
  272. package/dist/release/capabilities.js.map +1 -0
  273. package/dist/release/compiler.d.ts +5 -0
  274. package/dist/release/compiler.d.ts.map +1 -0
  275. package/dist/release/compiler.js +19 -0
  276. package/dist/release/compiler.js.map +1 -0
  277. package/dist/release/config.d.ts +5 -0
  278. package/dist/release/config.d.ts.map +1 -0
  279. package/dist/release/config.js +10 -0
  280. package/dist/release/config.js.map +1 -0
  281. package/dist/release/context.d.ts +96 -0
  282. package/dist/release/context.d.ts.map +1 -0
  283. package/dist/release/context.js +168 -0
  284. package/dist/release/context.js.map +1 -0
  285. package/dist/release/graph.d.ts +271 -0
  286. package/dist/release/graph.d.ts.map +1 -0
  287. package/dist/release/graph.js +766 -0
  288. package/dist/release/graph.js.map +1 -0
  289. package/dist/release/inspect.d.ts +88 -0
  290. package/dist/release/inspect.d.ts.map +1 -0
  291. package/dist/release/inspect.js +75 -0
  292. package/dist/release/inspect.js.map +1 -0
  293. package/dist/release/prepare.d.ts +24 -0
  294. package/dist/release/prepare.d.ts.map +1 -0
  295. package/dist/release/prepare.js +1116 -0
  296. package/dist/release/prepare.js.map +1 -0
  297. package/dist/release/prepared-ref.d.ts +60 -0
  298. package/dist/release/prepared-ref.d.ts.map +1 -0
  299. package/dist/release/prepared-ref.js +131 -0
  300. package/dist/release/prepared-ref.js.map +1 -0
  301. package/dist/release/prepared-store.d.ts +90 -0
  302. package/dist/release/prepared-store.d.ts.map +1 -0
  303. package/dist/release/prepared-store.js +337 -0
  304. package/dist/release/prepared-store.js.map +1 -0
  305. package/dist/release/prepared.d.ts +172 -0
  306. package/dist/release/prepared.d.ts.map +1 -0
  307. package/dist/release/prepared.js +268 -0
  308. package/dist/release/prepared.js.map +1 -0
  309. package/dist/release/staging.d.ts +31 -0
  310. package/dist/release/staging.d.ts.map +1 -0
  311. package/dist/release/staging.js +218 -0
  312. package/dist/release/staging.js.map +1 -0
  313. package/dist/resolve/authored.d.ts +53 -0
  314. package/dist/resolve/authored.d.ts.map +1 -0
  315. package/dist/resolve/authored.js +55 -0
  316. package/dist/resolve/authored.js.map +1 -0
  317. package/dist/resolve/encode.d.ts +3 -0
  318. package/dist/resolve/encode.d.ts.map +1 -0
  319. package/dist/resolve/encode.js +21 -0
  320. package/dist/resolve/encode.js.map +1 -0
  321. package/dist/resolve/errors.d.ts +7 -0
  322. package/dist/resolve/errors.d.ts.map +1 -0
  323. package/dist/resolve/errors.js +17 -0
  324. package/dist/resolve/errors.js.map +1 -0
  325. package/dist/resolve/facts.d.ts +12 -0
  326. package/dist/resolve/facts.d.ts.map +1 -0
  327. package/dist/resolve/facts.js +18 -0
  328. package/dist/resolve/facts.js.map +1 -0
  329. package/dist/resolve/resolve.d.ts +10 -0
  330. package/dist/resolve/resolve.d.ts.map +1 -0
  331. package/dist/resolve/resolve.js +242 -0
  332. package/dist/resolve/resolve.js.map +1 -0
  333. package/dist/store.d.ts +11 -0
  334. package/dist/store.d.ts.map +1 -0
  335. package/dist/store.js +9 -0
  336. package/dist/store.js.map +1 -0
  337. package/examples/README.md +20 -30
  338. package/examples/github-release/release.config.json +11 -18
  339. package/examples/homebrew-tap/README.md +11 -0
  340. package/examples/homebrew-tap/release.config.json +40 -28
  341. package/examples/multi-target/release.config.json +28 -53
  342. package/examples/npm-first-publish/release.config.json +23 -25
  343. package/examples/npm-only/release.config.json +22 -30
  344. package/examples/portable-cli/README.md +17 -0
  345. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
  346. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
  347. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
  348. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
  349. package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
  350. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
  351. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
  352. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
  353. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
  354. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
  355. package/examples/portable-cli/package.json +9 -0
  356. package/examples/portable-cli/release.config.json +53 -0
  357. package/examples/portable-cli/src/cli.ts +3 -0
  358. package/examples/pypi-registry/README.md +8 -0
  359. package/examples/scoop-bucket/README.md +10 -0
  360. package/examples/scoop-bucket/release.config.json +40 -30
  361. package/package.json +61 -154
  362. package/src/api/api.ts +365 -0
  363. package/src/api/errors.ts +36 -0
  364. package/src/api/input.ts +92 -0
  365. package/src/api/runtime.ts +14 -0
  366. package/src/api/types.ts +103 -0
  367. package/src/capabilities/bun-targets.ts +2 -0
  368. package/src/capabilities/field-ownership.ts +60 -0
  369. package/src/capabilities/module.ts +158 -0
  370. package/src/capabilities/registry.ts +333 -0
  371. package/src/config/config.ts +48 -0
  372. package/src/correction/coordinator.ts +336 -0
  373. package/src/correction/index.ts +2 -0
  374. package/src/correction/intent.ts +172 -0
  375. package/src/drivers/archive.ts +102 -0
  376. package/src/drivers/contain.ts +20 -0
  377. package/src/drivers/environment.ts +28 -0
  378. package/src/drivers/errors.ts +6 -0
  379. package/src/drivers/glob.ts +137 -0
  380. package/src/drivers/process.ts +340 -0
  381. package/src/drivers/redact.ts +31 -0
  382. package/src/drivers/seccomp-helper-source.ts +121 -0
  383. package/src/drivers/utils.ts +10 -0
  384. package/src/drivers/workspace.ts +40 -0
  385. package/src/extensions/provider-adapter.ts +99 -0
  386. package/src/host.ts +140 -0
  387. package/src/index.ts +64 -0
  388. package/src/model/artifact-collection.ts +237 -0
  389. package/src/model/authority.ts +116 -0
  390. package/src/model/bun-targets.ts +34 -0
  391. package/src/model/canonical.ts +205 -0
  392. package/src/model/catalog.ts +220 -0
  393. package/src/model/digest.ts +172 -0
  394. package/src/model/errors.ts +6 -0
  395. package/src/model/primitives.ts +37 -0
  396. package/src/model/pypi.ts +30 -0
  397. package/src/model/python-distribution.ts +360 -0
  398. package/src/model/secret-patterns.ts +11 -0
  399. package/src/platform/bun.ts +38 -0
  400. package/src/platform/credentials.ts +1083 -0
  401. package/src/platform/host-support.ts +4 -0
  402. package/src/platform/node.ts +38 -0
  403. package/src/platform/release-runtime.ts +47 -0
  404. package/src/platform/services.ts +57 -0
  405. package/src/platform/source-observer.ts +193 -0
  406. package/src/provider-sdk.ts +48 -0
  407. package/src/publication/adapter.ts +132 -0
  408. package/src/publication/authority.ts +397 -0
  409. package/src/publication/catalog-git.ts +603 -0
  410. package/src/publication/claim.ts +51 -0
  411. package/src/publication/coordinator.ts +578 -0
  412. package/src/publication/github.ts +954 -0
  413. package/src/publication/http.ts +101 -0
  414. package/src/publication/index.ts +4 -0
  415. package/src/publication/npm.ts +525 -0
  416. package/src/publication/profiles.ts +94 -0
  417. package/src/publication/publisher.ts +130 -0
  418. package/src/publication/pypi.ts +463 -0
  419. package/src/publication/recovery.ts +349 -0
  420. package/src/publication/report.ts +628 -0
  421. package/src/recipes/config.ts +395 -0
  422. package/src/release/capabilities.ts +459 -0
  423. package/src/release/compiler.ts +28 -0
  424. package/src/release/config.ts +12 -0
  425. package/src/release/context.ts +223 -0
  426. package/src/release/graph.ts +866 -0
  427. package/src/release/inspect.ts +83 -0
  428. package/src/release/prepare.ts +1331 -0
  429. package/src/release/prepared-ref.ts +193 -0
  430. package/src/release/prepared-store.ts +377 -0
  431. package/src/release/prepared.ts +299 -0
  432. package/src/release/staging.ts +257 -0
  433. package/src/resolve/authored.ts +64 -0
  434. package/src/resolve/encode.ts +22 -0
  435. package/src/resolve/errors.ts +15 -0
  436. package/src/resolve/facts.ts +18 -0
  437. package/src/resolve/resolve.ts +328 -0
  438. package/src/store.ts +28 -0
  439. package/templates/README.md +55 -59
  440. package/templates/bun-cli-github/README.md +12 -0
  441. package/templates/bun-cli-github/release.config.json +51 -0
  442. package/templates/github-actions/release.yml +57 -0
  443. package/templates/github-actions/reviewed-release.yml +80 -0
  444. package/templates/multi-target-homebrew/README.md +10 -0
  445. package/templates/multi-target-homebrew/release.config.json +43 -60
  446. package/templates/multi-target-scoop/README.md +10 -0
  447. package/templates/multi-target-scoop/release.config.json +43 -62
  448. package/templates/npm-github/release.config.json +25 -38
  449. package/templates/npm-github/reviewed-release.config.json +37 -0
  450. package/templates/npm-only/README.md +10 -0
  451. package/templates/npm-only/release.config.json +15 -30
  452. package/templates/portable-cli/README.md +13 -0
  453. package/templates/portable-cli/release.config.json +53 -0
  454. package/dist/config/errors.d.ts +0 -24
  455. package/dist/config/errors.d.ts.map +0 -1
  456. package/dist/config/errors.js +0 -19
  457. package/dist/config/errors.js.map +0 -1
  458. package/dist/config/load.d.ts +0 -9
  459. package/dist/config/load.d.ts.map +0 -1
  460. package/dist/config/load.js +0 -29
  461. package/dist/config/load.js.map +0 -1
  462. package/dist/config/schema.d.ts +0 -12
  463. package/dist/config/schema.d.ts.map +0 -1
  464. package/dist/config/schema.js +0 -19
  465. package/dist/config/schema.js.map +0 -1
  466. package/dist/domain/artifact.d.ts +0 -36
  467. package/dist/domain/artifact.d.ts.map +0 -1
  468. package/dist/domain/artifact.js +0 -29
  469. package/dist/domain/artifact.js.map +0 -1
  470. package/dist/domain/evidence.d.ts +0 -108
  471. package/dist/domain/evidence.d.ts.map +0 -1
  472. package/dist/domain/evidence.js +0 -96
  473. package/dist/domain/evidence.js.map +0 -1
  474. package/dist/domain/operation.d.ts +0 -153
  475. package/dist/domain/operation.d.ts.map +0 -1
  476. package/dist/domain/operation.js +0 -320
  477. package/dist/domain/operation.js.map +0 -1
  478. package/dist/domain/release.d.ts +0 -141
  479. package/dist/domain/release.d.ts.map +0 -1
  480. package/dist/domain/release.js +0 -127
  481. package/dist/domain/release.js.map +0 -1
  482. package/dist/domain/remote-state.d.ts +0 -85
  483. package/dist/domain/remote-state.d.ts.map +0 -1
  484. package/dist/domain/remote-state.js +0 -77
  485. package/dist/domain/remote-state.js.map +0 -1
  486. package/dist/domain/status.d.ts +0 -43
  487. package/dist/domain/status.d.ts.map +0 -1
  488. package/dist/domain/status.js +0 -51
  489. package/dist/domain/status.js.map +0 -1
  490. package/dist/domain/target.d.ts +0 -135
  491. package/dist/domain/target.d.ts.map +0 -1
  492. package/dist/domain/target.js +0 -137
  493. package/dist/domain/target.js.map +0 -1
  494. package/dist/host/host.d.ts +0 -32
  495. package/dist/host/host.d.ts.map +0 -1
  496. package/dist/host/host.js +0 -24
  497. package/dist/host/host.js.map +0 -1
  498. package/dist/host/http-live.d.ts +0 -6
  499. package/dist/host/http-live.d.ts.map +0 -1
  500. package/dist/host/http-live.js +0 -86
  501. package/dist/host/http-live.js.map +0 -1
  502. package/dist/host/http.d.ts +0 -43
  503. package/dist/host/http.d.ts.map +0 -1
  504. package/dist/host/http.js +0 -59
  505. package/dist/host/http.js.map +0 -1
  506. package/dist/host/platform.d.ts +0 -10
  507. package/dist/host/platform.d.ts.map +0 -1
  508. package/dist/host/platform.js +0 -114
  509. package/dist/host/platform.js.map +0 -1
  510. package/dist/host/test.d.ts +0 -23
  511. package/dist/host/test.d.ts.map +0 -1
  512. package/dist/host/test.js +0 -222
  513. package/dist/host/test.js.map +0 -1
  514. package/dist/internal/workflow-phases.d.ts +0 -3
  515. package/dist/internal/workflow-phases.d.ts.map +0 -1
  516. package/dist/internal/workflow-phases.js +0 -2
  517. package/dist/internal/workflow-phases.js.map +0 -1
  518. package/dist/internal/workspace-path.d.ts +0 -15
  519. package/dist/internal/workspace-path.d.ts.map +0 -1
  520. package/dist/internal/workspace-path.js +0 -36
  521. package/dist/internal/workspace-path.js.map +0 -1
  522. package/dist/planner/artifact-inventory.d.ts +0 -9
  523. package/dist/planner/artifact-inventory.d.ts.map +0 -1
  524. package/dist/planner/artifact-inventory.js +0 -84
  525. package/dist/planner/artifact-inventory.js.map +0 -1
  526. package/dist/planner/create-release-plan.d.ts +0 -5
  527. package/dist/planner/create-release-plan.d.ts.map +0 -1
  528. package/dist/planner/create-release-plan.js +0 -25
  529. package/dist/planner/create-release-plan.js.map +0 -1
  530. package/dist/planner/errors.d.ts +0 -81
  531. package/dist/planner/errors.d.ts.map +0 -1
  532. package/dist/planner/errors.js +0 -70
  533. package/dist/planner/errors.js.map +0 -1
  534. package/dist/planner/evidence-recorder.d.ts +0 -26
  535. package/dist/planner/evidence-recorder.d.ts.map +0 -1
  536. package/dist/planner/evidence-recorder.js +0 -330
  537. package/dist/planner/evidence-recorder.js.map +0 -1
  538. package/dist/planner/executor.d.ts +0 -58
  539. package/dist/planner/executor.d.ts.map +0 -1
  540. package/dist/planner/executor.js +0 -159
  541. package/dist/planner/executor.js.map +0 -1
  542. package/dist/planner/normalize-release.d.ts +0 -16
  543. package/dist/planner/normalize-release.d.ts.map +0 -1
  544. package/dist/planner/normalize-release.js +0 -218
  545. package/dist/planner/normalize-release.js.map +0 -1
  546. package/dist/planner/reconcile.d.ts +0 -17
  547. package/dist/planner/reconcile.d.ts.map +0 -1
  548. package/dist/planner/reconcile.js +0 -261
  549. package/dist/planner/reconcile.js.map +0 -1
  550. package/dist/planner/release-eligibility.d.ts +0 -39
  551. package/dist/planner/release-eligibility.d.ts.map +0 -1
  552. package/dist/planner/release-eligibility.js +0 -578
  553. package/dist/planner/release-eligibility.js.map +0 -1
  554. package/dist/planner/render-plan.d.ts +0 -15
  555. package/dist/planner/render-plan.d.ts.map +0 -1
  556. package/dist/planner/render-plan.js +0 -238
  557. package/dist/planner/render-plan.js.map +0 -1
  558. package/dist/planner/status.d.ts +0 -40
  559. package/dist/planner/status.d.ts.map +0 -1
  560. package/dist/planner/status.js +0 -313
  561. package/dist/planner/status.js.map +0 -1
  562. package/dist/targets/adapter-helpers.d.ts +0 -64
  563. package/dist/targets/adapter-helpers.d.ts.map +0 -1
  564. package/dist/targets/adapter-helpers.js +0 -124
  565. package/dist/targets/adapter-helpers.js.map +0 -1
  566. package/dist/targets/adapter.d.ts +0 -17
  567. package/dist/targets/adapter.d.ts.map +0 -1
  568. package/dist/targets/adapter.js +0 -2
  569. package/dist/targets/adapter.js.map +0 -1
  570. package/dist/targets/github-release.d.ts +0 -25
  571. package/dist/targets/github-release.d.ts.map +0 -1
  572. package/dist/targets/github-release.js +0 -82
  573. package/dist/targets/github-release.js.map +0 -1
  574. package/dist/targets/github.d.ts +0 -11
  575. package/dist/targets/github.d.ts.map +0 -1
  576. package/dist/targets/github.js +0 -125
  577. package/dist/targets/github.js.map +0 -1
  578. package/dist/targets/homebrew.d.ts +0 -11
  579. package/dist/targets/homebrew.d.ts.map +0 -1
  580. package/dist/targets/homebrew.js +0 -97
  581. package/dist/targets/homebrew.js.map +0 -1
  582. package/dist/targets/live.d.ts +0 -5
  583. package/dist/targets/live.d.ts.map +0 -1
  584. package/dist/targets/live.js +0 -50
  585. package/dist/targets/live.js.map +0 -1
  586. package/dist/targets/npm.d.ts +0 -10
  587. package/dist/targets/npm.d.ts.map +0 -1
  588. package/dist/targets/npm.js +0 -118
  589. package/dist/targets/npm.js.map +0 -1
  590. package/dist/targets/pypi.d.ts +0 -11
  591. package/dist/targets/pypi.d.ts.map +0 -1
  592. package/dist/targets/pypi.js +0 -103
  593. package/dist/targets/pypi.js.map +0 -1
  594. package/dist/targets/registry.d.ts +0 -25
  595. package/dist/targets/registry.d.ts.map +0 -1
  596. package/dist/targets/registry.js +0 -34
  597. package/dist/targets/registry.js.map +0 -1
  598. package/dist/targets/scoop.d.ts +0 -11
  599. package/dist/targets/scoop.d.ts.map +0 -1
  600. package/dist/targets/scoop.js +0 -78
  601. package/dist/targets/scoop.js.map +0 -1
  602. package/dist/types/effect-internal.d.ts +0 -5
  603. package/dist/types/effect-internal.d.ts.map +0 -1
  604. package/dist/types/effect-internal.js +0 -2
  605. package/dist/types/effect-internal.js.map +0 -1
  606. package/dist/workflows/config.d.ts +0 -252
  607. package/dist/workflows/config.d.ts.map +0 -1
  608. package/dist/workflows/config.js +0 -465
  609. package/dist/workflows/config.js.map +0 -1
  610. package/dist/workflows/diagnostics.d.ts +0 -62
  611. package/dist/workflows/diagnostics.d.ts.map +0 -1
  612. package/dist/workflows/diagnostics.js +0 -527
  613. package/dist/workflows/diagnostics.js.map +0 -1
  614. package/dist/workflows/evidence.d.ts +0 -26
  615. package/dist/workflows/evidence.d.ts.map +0 -1
  616. package/dist/workflows/evidence.js +0 -44
  617. package/dist/workflows/evidence.js.map +0 -1
  618. package/dist/workflows/index.d.ts +0 -7
  619. package/dist/workflows/index.d.ts.map +0 -1
  620. package/dist/workflows/index.js +0 -6
  621. package/dist/workflows/index.js.map +0 -1
  622. package/dist/workflows/init.d.ts +0 -84
  623. package/dist/workflows/init.d.ts.map +0 -1
  624. package/dist/workflows/init.js +0 -441
  625. package/dist/workflows/init.js.map +0 -1
  626. package/dist/workflows/live.d.ts +0 -9
  627. package/dist/workflows/live.d.ts.map +0 -1
  628. package/dist/workflows/live.js +0 -7
  629. package/dist/workflows/live.js.map +0 -1
  630. package/dist/workflows/options.d.ts +0 -30
  631. package/dist/workflows/options.d.ts.map +0 -1
  632. package/dist/workflows/options.js +0 -16
  633. package/dist/workflows/options.js.map +0 -1
  634. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
  635. package/examples/non-strict-skips/release.config.json +0 -31
  636. package/examples/pypi-registry/release.config.json +0 -31
  637. package/templates/github-actions/plan-and-approved-execute.yml +0 -58
  638. package/templates/github-actions/plan-only.yml +0 -33
  639. package/templates/github-actions/trusted-publishing.yml +0 -61
@@ -0,0 +1,246 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { SubjectId, type CredentialRequest } from "../model/authority.js";
4
+ import { CredentialProvider, type CredentialGrant, type MutationCredentialGrant } from "./authority.js";
5
+ import { ConclusiveProviderRejection, DependencyBlocked, InconclusiveObservation, ObservedSubject, OutcomeUnknown, PresentEquivalent, ProviderBlocked, RejectedBeforeDispatch, Started, type Applied, type MutationAttempt, type MutationDecision, type Observation, type ProviderDecision, type RejectedByProvider } from "./report.js";
6
+ import { type RecoveryCapabilityProfile as RecoveryCapabilityProfileType } from "./recovery.js";
7
+ declare const ReleaseSubjectError_base: Schema.Class<ReleaseSubjectError, Schema.TaggedStruct<"ReleaseSubjectError", {
8
+ readonly subject: Schema.brand<Schema.NonEmptyString, "SubjectId">;
9
+ readonly phase: Schema.Literals<readonly ["observe", "mutate"]>;
10
+ readonly commitment: Schema.Literals<readonly ["before-dispatch", "unknown"]>;
11
+ readonly reason: Schema.brand<Schema.String, "SafeReason">;
12
+ }>, import("effect/Cause").YieldableError>;
13
+ export declare class ReleaseSubjectError extends ReleaseSubjectError_base {
14
+ }
15
+ declare const ReleaseCoordinatorConstructionError_base: Schema.Class<ReleaseCoordinatorConstructionError, Schema.TaggedStruct<"ReleaseCoordinatorConstructionError", {
16
+ readonly reason: Schema.brand<Schema.String, "SafeReason">;
17
+ }>, import("effect/Cause").YieldableError>;
18
+ export declare class ReleaseCoordinatorConstructionError extends ReleaseCoordinatorConstructionError_base {
19
+ }
20
+ /** Provider-neutral subject derived from one verified prepared intent. */
21
+ export type ReleaseObservationContext = {
22
+ readonly phase: "pre-mutation";
23
+ } | {
24
+ readonly phase: "post-mutation";
25
+ readonly attempt: MutationAttempt;
26
+ };
27
+ export interface ReleaseSubject {
28
+ readonly id: SubjectId;
29
+ /** Durable provider policy. Coordinator retries are derived only from this value. */
30
+ readonly recovery: RecoveryCapabilityProfileType;
31
+ /** Earlier prepared subjects that must converge before this subject may run. */
32
+ readonly prerequisites?: ReadonlyArray<SubjectId>;
33
+ readonly observationRequests: readonly [CredentialRequest, ...Array<CredentialRequest>];
34
+ readonly mutationRequest: CredentialRequest;
35
+ /** Required by every durable-cas-required recovery profile. Runs before mutation authority acquisition. */
36
+ readonly claimMutation?: (decision: MutationDecision) => Effect.Effect<void, ReleaseSubjectError>;
37
+ readonly observe: (grant: CredentialGrant, context: ReleaseObservationContext) => Effect.Effect<Observation, ReleaseSubjectError>;
38
+ readonly decide: (observation: Observation) => ProviderDecision;
39
+ readonly mutate: (decision: MutationDecision, grant: MutationCredentialGrant) => Effect.Effect<MutationAttempt, ReleaseSubjectError>;
40
+ }
41
+ export interface ReleaseSubjectsInput {
42
+ /** Local, already-verified prepared identity; always makes the report nonempty. */
43
+ readonly prepared: SubjectId;
44
+ /** Dependency-ordered remote subjects. */
45
+ readonly subjects: ReadonlyArray<ReleaseSubject>;
46
+ }
47
+ /** Read-only projection. It never asks for publish or correction authority. */
48
+ export declare const observeReleaseSubjects: (input: ReleaseSubjectsInput) => Effect.Effect<{
49
+ readonly subjects: readonly [ObservedSubject, ...ObservedSubject[]];
50
+ readonly status: "equivalent" | "different" | "inconclusive";
51
+ }, ReleaseCoordinatorConstructionError, CredentialProvider>;
52
+ /** Dependency-ordered observation, lazy authority, mutation, and reobservation. */
53
+ export declare const publishReleaseSubjects: (input: ReleaseSubjectsInput) => Effect.Effect<{
54
+ readonly subjects: readonly [{
55
+ readonly _tag: "NotReached";
56
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
57
+ readonly reason: DependencyBlocked | import("./report.js").RunAborted;
58
+ } | {
59
+ readonly _tag: "AlreadyEquivalent";
60
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
61
+ readonly observationAuthorities: readonly {
62
+ readonly _tag: "AuthorityAcquired";
63
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
64
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
65
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
66
+ readonly requestedPurpose: "observe" | "publish" | "correct";
67
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
68
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
69
+ }[];
70
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
71
+ } | {
72
+ readonly _tag: "ConvergedAfterMutation";
73
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
74
+ readonly observationAuthorities: readonly {
75
+ readonly _tag: "AuthorityAcquired";
76
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
77
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
78
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
79
+ readonly requestedPurpose: "observe" | "publish" | "correct";
80
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
81
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
82
+ }[];
83
+ readonly preObservations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
84
+ readonly decision: import("./report.js").NeedsMutation | import("./report.js").ProviderAuthorizedCreate;
85
+ readonly authority: {
86
+ readonly _tag: "AuthorityAcquired";
87
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
88
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
89
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
90
+ readonly requestedPurpose: "observe" | "publish" | "correct";
91
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
92
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
93
+ };
94
+ readonly attempt: RejectedByProvider | Applied | OutcomeUnknown;
95
+ readonly postObservations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
96
+ } | {
97
+ readonly _tag: "BlockedSubject";
98
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
99
+ readonly observationAuthorities: readonly {
100
+ readonly _tag: "AuthorityAcquired";
101
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
102
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
103
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
104
+ readonly requestedPurpose: "observe" | "publish" | "correct";
105
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
106
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
107
+ }[];
108
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
109
+ readonly cause: import("./report.js").Conflict | ProviderBlocked | RejectedBeforeDispatch | {
110
+ readonly _tag: "AuthorityAcquiredButMutationNotDispatched";
111
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
112
+ readonly authority: {
113
+ readonly _tag: "AuthorityAcquired";
114
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
115
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
116
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
117
+ readonly requestedPurpose: "observe" | "publish" | "correct";
118
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
119
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
120
+ };
121
+ readonly attempt: RejectedBeforeDispatch;
122
+ } | ConclusiveProviderRejection;
123
+ } | {
124
+ readonly _tag: "UncertainSubject";
125
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
126
+ readonly observationAuthorities: readonly {
127
+ readonly _tag: "AuthorityAcquired";
128
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
129
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
130
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
131
+ readonly requestedPurpose: "observe" | "publish" | "correct";
132
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
133
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
134
+ }[];
135
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
136
+ readonly authority: {
137
+ readonly _tag: "AuthorityAcquired";
138
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
139
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
140
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
141
+ readonly requestedPurpose: "observe" | "publish" | "correct";
142
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
143
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
144
+ };
145
+ readonly attempt: Started | RejectedByProvider | Applied | OutcomeUnknown;
146
+ readonly trace: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
147
+ readonly decision?: import("./report.js").NeedsMutation | import("./report.js").ProviderAuthorizedCreate | import("./report.js").ProviderAlreadyEquivalent | import("./report.js").Conflict | ProviderBlocked;
148
+ }, ...({
149
+ readonly _tag: "NotReached";
150
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
151
+ readonly reason: DependencyBlocked | import("./report.js").RunAborted;
152
+ } | {
153
+ readonly _tag: "AlreadyEquivalent";
154
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
155
+ readonly observationAuthorities: readonly {
156
+ readonly _tag: "AuthorityAcquired";
157
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
158
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
159
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
160
+ readonly requestedPurpose: "observe" | "publish" | "correct";
161
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
162
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
163
+ }[];
164
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
165
+ } | {
166
+ readonly _tag: "ConvergedAfterMutation";
167
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
168
+ readonly observationAuthorities: readonly {
169
+ readonly _tag: "AuthorityAcquired";
170
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
171
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
172
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
173
+ readonly requestedPurpose: "observe" | "publish" | "correct";
174
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
175
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
176
+ }[];
177
+ readonly preObservations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
178
+ readonly decision: import("./report.js").NeedsMutation | import("./report.js").ProviderAuthorizedCreate;
179
+ readonly authority: {
180
+ readonly _tag: "AuthorityAcquired";
181
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
182
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
183
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
184
+ readonly requestedPurpose: "observe" | "publish" | "correct";
185
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
186
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
187
+ };
188
+ readonly attempt: RejectedByProvider | Applied | OutcomeUnknown;
189
+ readonly postObservations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
190
+ } | {
191
+ readonly _tag: "BlockedSubject";
192
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
193
+ readonly observationAuthorities: readonly {
194
+ readonly _tag: "AuthorityAcquired";
195
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
196
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
197
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
198
+ readonly requestedPurpose: "observe" | "publish" | "correct";
199
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
200
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
201
+ }[];
202
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
203
+ readonly cause: import("./report.js").Conflict | ProviderBlocked | RejectedBeforeDispatch | {
204
+ readonly _tag: "AuthorityAcquiredButMutationNotDispatched";
205
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
206
+ readonly authority: {
207
+ readonly _tag: "AuthorityAcquired";
208
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
209
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
210
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
211
+ readonly requestedPurpose: "observe" | "publish" | "correct";
212
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
213
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
214
+ };
215
+ readonly attempt: RejectedBeforeDispatch;
216
+ } | ConclusiveProviderRejection;
217
+ } | {
218
+ readonly _tag: "UncertainSubject";
219
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
220
+ readonly observationAuthorities: readonly {
221
+ readonly _tag: "AuthorityAcquired";
222
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
223
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
224
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
225
+ readonly requestedPurpose: "observe" | "publish" | "correct";
226
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
227
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
228
+ }[];
229
+ readonly observations: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
230
+ readonly authority: {
231
+ readonly _tag: "AuthorityAcquired";
232
+ readonly subject: string & import("effect/Brand").Brand<"SubjectId">;
233
+ readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
234
+ readonly audience: string & import("effect/Brand").Brand<"CanonicalAudience">;
235
+ readonly requestedPurpose: "observe" | "publish" | "correct";
236
+ readonly grantKind: "AnonymousAccess" | "ScopedSecret" | "WorkloadIdentity";
237
+ readonly purposes: readonly ["observe" | "publish" | "correct", ...("observe" | "publish" | "correct")[]];
238
+ };
239
+ readonly attempt: Started | RejectedByProvider | Applied | OutcomeUnknown;
240
+ readonly trace: readonly [PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation, ...(PresentEquivalent | import("./report.js").PresentDifferent | import("./report.js").AuthoritativelyAbsent | import("./report.js").VisibilityPending | InconclusiveObservation)[]];
241
+ readonly decision?: import("./report.js").NeedsMutation | import("./report.js").ProviderAuthorizedCreate | import("./report.js").ProviderAlreadyEquivalent | import("./report.js").Conflict | ProviderBlocked;
242
+ })[]];
243
+ readonly status: "complete" | "blocked" | "uncertain";
244
+ }, ReleaseCoordinatorConstructionError, CredentialProvider>;
245
+ export {};
246
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/publication/coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,SAAS,EACT,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,kBAAkB,EAElB,KAAK,eAAe,EAGpB,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,2BAA2B,EAG3B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,OAAO,EAeP,KAAK,OAAO,EAGZ,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAGhB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAIxB,MAAM,aAAa,CAAA;AACpB,OAAO,EAGL,KAAK,yBAAyB,IAAI,6BAA6B,EAChE,MAAM,eAAe,CAAA;;;;;;;AAEtB,qBAAa,mBACX,SAAQ,wBAKN;CAAG;;;;AAEP,qBAAa,mCACX,SAAQ,wCAGP;CAAG;AAEN,0EAA0E;AAC1E,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAA;AAE1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAA;IACtB,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAA;IAChD,gFAAgF;IAChF,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACvF,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAA;IAC3C,2GAA2G;IAC3G,QAAQ,CAAC,aAAa,CAAC,EAAE,CACvB,QAAQ,EAAE,gBAAgB,KACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,CAChB,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,yBAAyB,KAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAA;IACpD,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,gBAAgB,CAAA;IAC/D,QAAQ,CAAC,MAAM,EAAE,CACf,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,uBAAuB,KAC3B,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAA;CACzD;AAED,MAAM,WAAW,oBAAoB;IACnC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;CACjD;AA8ZD,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB;;;2DAqBjC,CAAA;AAEF,mFAAmF;AACnF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DA2BjC,CAAA"}
@@ -0,0 +1,370 @@
1
+ import * as Clock from "effect/Clock";
2
+ import * as Duration from "effect/Duration";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Exit from "effect/Exit";
5
+ import * as Result from "effect/Result";
6
+ import * as Schema from "effect/Schema";
7
+ import { SubjectId } from "../model/authority.js";
8
+ import { CredentialProvider } from "./authority.js";
9
+ import { ConclusiveProviderRejection, CredentialStrategyUnsupportedCause, CredentialUnavailableCause, DependencyBlocked, InconclusiveObservation, ObservedSubject, OutcomeUnknown, PresentEquivalent, ProviderBlocked, RejectedBeforeDispatch, SafeReason, absentObservation, differentObservation, equivalentObservation, inconclusiveObservation, makeAlreadyEquivalent, makeAuthorityAcquired, makeAuthorityAcquiredButMutationNotDispatched, makeBlockedSubject, makeConvergedAfterMutation, makeNotReached, makeObservationReport, makeReleaseReport, makeUncertainSubject } from "./report.js";
10
+ import { RecoveryCapabilityProfile, isReadConvergenceLagCapable } from "./recovery.js";
11
+ export class ReleaseSubjectError extends Schema.TaggedErrorClass()("ReleaseSubjectError", {
12
+ subject: SubjectId,
13
+ phase: Schema.Literals(["observe", "mutate"]),
14
+ commitment: Schema.Literals(["before-dispatch", "unknown"]),
15
+ reason: SafeReason
16
+ }) {
17
+ }
18
+ export class ReleaseCoordinatorConstructionError extends Schema.TaggedErrorClass()("ReleaseCoordinatorConstructionError", { reason: SafeReason }) {
19
+ }
20
+ const constructionFailure = (reason) => new ReleaseCoordinatorConstructionError({
21
+ reason: typeof reason === "string" ? SafeReason.make(reason) : reason
22
+ });
23
+ const validateRequestIdentity = (subject, request, purpose) => {
24
+ if (request.subject !== subject.id) {
25
+ throw constructionFailure("A credential request does not match its prepared subject identity.");
26
+ }
27
+ if (purpose === "observe" ? request.purpose !== "observe" : request.purpose === "observe") {
28
+ throw constructionFailure("A credential request is assigned to the wrong authority phase.");
29
+ }
30
+ if (purpose === "mutation" && request.strategy.kind === "anonymous") {
31
+ throw constructionFailure("A mutation credential request cannot use anonymous authority.");
32
+ }
33
+ };
34
+ const validateInput = (input) => Effect.try({
35
+ try: () => {
36
+ const identities = new Set([input.prepared]);
37
+ for (const subject of input.subjects) {
38
+ if (identities.has(subject.id)) {
39
+ throw constructionFailure("Prepared and remote subject identities must be unique.");
40
+ }
41
+ const prerequisites = new Set();
42
+ for (const prerequisite of subject.prerequisites ?? []) {
43
+ if (!identities.has(prerequisite)) {
44
+ throw constructionFailure("Every prerequisite must identify the prepared subject or an earlier remote subject.");
45
+ }
46
+ if (prerequisites.has(prerequisite)) {
47
+ throw constructionFailure("A release subject cannot declare the same prerequisite twice.");
48
+ }
49
+ prerequisites.add(prerequisite);
50
+ }
51
+ if (subject.observationRequests.length === 0) {
52
+ throw constructionFailure("Every remote subject requires at least one observation strategy.");
53
+ }
54
+ Schema.decodeUnknownSync(RecoveryCapabilityProfile, { onExcessProperty: "error" })(subject.recovery);
55
+ if (subject.recovery.historyRequirement === "durable-cas-required" && subject.claimMutation === undefined) {
56
+ throw constructionFailure("A durable-cas-required subject has no terminal mutation-claim boundary.");
57
+ }
58
+ subject.observationRequests.forEach((request, index) => {
59
+ validateRequestIdentity(subject, request, "observe");
60
+ if (request.strategy.kind === "anonymous" && index !== 0) {
61
+ throw constructionFailure("Anonymous observation must be the first declared strategy.");
62
+ }
63
+ });
64
+ validateRequestIdentity(subject, subject.mutationRequest, "mutation");
65
+ identities.add(subject.id);
66
+ }
67
+ },
68
+ catch: (cause) => cause instanceof ReleaseCoordinatorConstructionError
69
+ ? cause
70
+ : constructionFailure("The release subject contract is invalid.")
71
+ });
72
+ const fromReportResult = (result) => Result.isFailure(result)
73
+ ? Effect.fail(constructionFailure(result.failure.reason))
74
+ : Effect.succeed(result.success);
75
+ // The error contributes only its closed tag. Host error fields, especially
76
+ // `reason`, are transient diagnostics and may contain credential material.
77
+ const credentialFailureCause = (request, error) => error._tag === "CredentialUnavailable"
78
+ ? CredentialUnavailableCause.make({
79
+ provider: request.provider,
80
+ purpose: request.purpose,
81
+ strategy: request.strategy.kind
82
+ })
83
+ : CredentialStrategyUnsupportedCause.make({
84
+ provider: request.provider,
85
+ purpose: request.purpose,
86
+ strategy: request.strategy.kind
87
+ });
88
+ const unavailableObservation = (subject, request, error) => InconclusiveObservation.make({
89
+ subject,
90
+ reason: SafeReason.make("Observation authority or provider read was unavailable."),
91
+ ...(request === undefined || error === undefined ? {} : { cause: credentialFailureCause(request, error) })
92
+ });
93
+ const subjectObservationFailure = (subject, error) => error.subject !== subject.id
94
+ ? Effect.fail(constructionFailure("A subject error does not match its prepared subject identity."))
95
+ : Effect.succeed(InconclusiveObservation.make({ subject: subject.id, reason: error.reason }));
96
+ const observeOnce = (credentials, subject, request, context) => credentials.acquireForObservation(request).pipe(Effect.flatMap((grant) => makeAuthority(request, grant).pipe(Effect.flatMap((authority) => subject.observe(grant, context).pipe(Effect.catch((error) => subjectObservationFailure(subject, error)), Effect.map((observation) => ({ observation, authorities: [authority] })))))), Effect.catchTags({
97
+ CredentialUnavailable: (error) => Effect.succeed({
98
+ observation: unavailableObservation(subject.id, request, error), authorities: []
99
+ }),
100
+ CredentialAudienceMismatch: () => Effect.succeed({
101
+ observation: unavailableObservation(subject.id), authorities: []
102
+ }),
103
+ CredentialPurposeMismatch: () => Effect.succeed({
104
+ observation: unavailableObservation(subject.id), authorities: []
105
+ }),
106
+ CredentialStrategyUnsupported: (error) => Effect.succeed({
107
+ observation: unavailableObservation(subject.id, request, error), authorities: []
108
+ }),
109
+ CredentialSubjectMismatch: () => Effect.succeed({
110
+ observation: unavailableObservation(subject.id), authorities: []
111
+ })
112
+ }), Effect.flatMap((result) => result.observation.subject === subject.id
113
+ ? Effect.succeed(result)
114
+ : Effect.fail(constructionFailure("An observation does not match its prepared subject identity."))));
115
+ const observeTrace = Effect.fn("observeReleaseSubject")(function* (credentials, subject, context) {
116
+ const observations = [];
117
+ const authorities = [];
118
+ for (const request of subject.observationRequests) {
119
+ const observed = yield* observeOnce(credentials, subject, request, context);
120
+ let observation = observed.observation;
121
+ authorities.push(...observed.authorities);
122
+ const visibilityPendingIsAdmitted = context.phase === "post-mutation" &&
123
+ context.attempt._tag !== "RejectedBeforeDispatch" &&
124
+ context.attempt._tag !== "RejectedByProvider" &&
125
+ isReadConvergenceLagCapable(subject.recovery);
126
+ if (observation._tag === "VisibilityPending" && !visibilityPendingIsAdmitted) {
127
+ observation = InconclusiveObservation.make({
128
+ subject: subject.id,
129
+ reason: SafeReason.make("VisibilityPending was not admitted by a lag-capable same-invocation mutation profile and was treated as inconclusive.")
130
+ });
131
+ }
132
+ observations.push(observation);
133
+ if (observation._tag !== "Inconclusive")
134
+ break;
135
+ }
136
+ return {
137
+ observations: observations,
138
+ authorities
139
+ };
140
+ });
141
+ const retryEligibleObservation = (observation) => observation._tag === "VisibilityPending" || observation._tag === "Inconclusive";
142
+ const retryDelayMs = (profile, completedAttempts) => {
143
+ const { baseMs, factor, capMs } = profile.readConvergence.observationRetry.backoff;
144
+ const scaled = baseMs * factor ** Math.max(0, completedAttempts - 1);
145
+ return Math.min(capMs, scaled);
146
+ };
147
+ const observeAfterMutation = Effect.fn("observeReleaseSubjectAfterMutation")(function* (credentials, subject, attempt) {
148
+ const observations = [];
149
+ const authorities = [];
150
+ const policy = subject.recovery.readConvergence.observationRetry;
151
+ const maxAttempts = attempt._tag === "RejectedBeforeDispatch" ? 1 : policy.maxAttempts;
152
+ const startedAt = yield* Clock.currentTimeMillis;
153
+ let completedAttempts = 0;
154
+ while (completedAttempts < maxAttempts) {
155
+ if (completedAttempts > 0) {
156
+ const delayMs = retryDelayMs(subject.recovery, completedAttempts);
157
+ const now = yield* Clock.currentTimeMillis;
158
+ const elapsedMs = Math.max(0, now - startedAt);
159
+ if (elapsedMs + delayMs > policy.totalBudgetMs)
160
+ break;
161
+ yield* Effect.sleep(Duration.millis(delayMs));
162
+ }
163
+ const observed = yield* observeTrace(credentials, subject, { phase: "post-mutation", attempt });
164
+ observations.push(...observed.observations);
165
+ authorities.push(...observed.authorities);
166
+ completedAttempts += 1;
167
+ if (!retryEligibleObservation(observed.observations.at(-1)))
168
+ break;
169
+ }
170
+ return {
171
+ observations: observations,
172
+ authorities
173
+ };
174
+ });
175
+ const classifyObservation = (observation) => {
176
+ switch (observation._tag) {
177
+ case "PresentEquivalent":
178
+ return equivalentObservation();
179
+ case "PresentDifferent":
180
+ return differentObservation(observation.differences);
181
+ case "AuthoritativelyAbsent":
182
+ return absentObservation(observation.basis);
183
+ case "VisibilityPending":
184
+ return inconclusiveObservation(SafeReason.make("Provider visibility remains pending."));
185
+ case "Inconclusive":
186
+ return inconclusiveObservation(observation.reason, observation.cause);
187
+ }
188
+ };
189
+ const providerBlockedFromAuthority = (subject, request, error) => ProviderBlocked.make({
190
+ subject,
191
+ reason: SafeReason.make("Mutation authority was unavailable for the exact prepared request."),
192
+ ...(error._tag === "CredentialUnavailable" || error._tag === "CredentialStrategyUnsupported"
193
+ ? { cause: credentialFailureCause(request, error) }
194
+ : {})
195
+ });
196
+ const makeAuthority = (request, grant) => {
197
+ const purposes = [...grant.purposes];
198
+ if (purposes.length === 0) {
199
+ return Effect.fail(constructionFailure("A credential grant carries no authority purpose."));
200
+ }
201
+ if (grant.subject !== request.subject || grant.provider !== request.provider ||
202
+ grant.audience !== request.audience || !grant.purposes.has(request.purpose)) {
203
+ return Effect.fail(constructionFailure("A credential grant does not match the exact prepared request."));
204
+ }
205
+ return fromReportResult(makeAuthorityAcquired({
206
+ subject: request.subject,
207
+ provider: request.provider,
208
+ audience: request.audience,
209
+ requestedPurpose: request.purpose,
210
+ grantKind: grant._tag,
211
+ purposes: purposes
212
+ }));
213
+ };
214
+ const decide = (subject, observation) => Effect.try({
215
+ try: () => subject.decide(observation),
216
+ catch: () => constructionFailure("The provider decision function did not return a total decision.")
217
+ }).pipe(Effect.flatMap((decision) => decision.subject === subject.id
218
+ ? Effect.succeed(decision)
219
+ : Effect.fail(constructionFailure("A provider decision does not match its prepared subject identity."))));
220
+ const performMutation = (subject, decision, grant) => subject.mutate(decision, grant).pipe(Effect.catch((error) => error.subject !== subject.id
221
+ ? Effect.fail(constructionFailure("A mutation error does not match its prepared subject identity."))
222
+ : Effect.succeed(error.commitment === "before-dispatch"
223
+ ? RejectedBeforeDispatch.make({ subject: subject.id, reason: error.reason })
224
+ : OutcomeUnknown.make({ subject: subject.id, reason: error.reason }))), Effect.flatMap((attempt) => attempt.subject === subject.id
225
+ ? Effect.succeed(attempt)
226
+ : Effect.fail(constructionFailure("A mutation attempt does not match its prepared subject identity."))));
227
+ const uncertainAttempt = (attempt) => attempt;
228
+ const convergedAttempt = (attempt) => attempt._tag === "Started"
229
+ ? OutcomeUnknown.make({
230
+ subject: attempt.subject,
231
+ reason: SafeReason.make("Mutation started without a terminal provider response before reobservation.")
232
+ })
233
+ : attempt;
234
+ const publishSubject = Effect.fn("publishReleaseSubject")(function* (credentials, subject) {
235
+ const before = yield* observeTrace(credentials, subject, { phase: "pre-mutation" });
236
+ const decision = yield* decide(subject, before.observations.at(-1));
237
+ switch (decision._tag) {
238
+ case "AlreadyEquivalent":
239
+ return yield* fromReportResult(makeAlreadyEquivalent(subject.id, before.observations, before.authorities));
240
+ case "Conflict":
241
+ case "Blocked":
242
+ return yield* fromReportResult(makeBlockedSubject({
243
+ subject: subject.id,
244
+ observationAuthorities: before.authorities,
245
+ observations: before.observations,
246
+ cause: decision
247
+ }));
248
+ case "NeedsMutation":
249
+ case "ProviderAuthorizedCreate": {
250
+ if (subject.claimMutation !== undefined) {
251
+ const claimed = yield* Effect.exit(subject.claimMutation(decision));
252
+ if (Exit.isFailure(claimed)) {
253
+ return yield* fromReportResult(makeBlockedSubject({
254
+ subject: subject.id,
255
+ observationAuthorities: before.authorities,
256
+ observations: before.observations,
257
+ cause: ProviderBlocked.make({
258
+ subject: subject.id,
259
+ reason: SafeReason.make("The terminal publication claim was unavailable or already occupied.")
260
+ })
261
+ }));
262
+ }
263
+ }
264
+ const acquisition = yield* credentials.acquireForMutation(subject.mutationRequest, decision).pipe(Effect.map((grant) => ({ _tag: "Granted", grant })), Effect.catch((error) => Effect.succeed({ _tag: "Denied", error })));
265
+ if (acquisition._tag === "Denied") {
266
+ return yield* fromReportResult(makeBlockedSubject({
267
+ subject: subject.id,
268
+ observationAuthorities: before.authorities,
269
+ observations: before.observations,
270
+ cause: providerBlockedFromAuthority(subject.id, subject.mutationRequest, acquisition.error)
271
+ }));
272
+ }
273
+ const grant = acquisition.grant;
274
+ const authority = yield* makeAuthority(subject.mutationRequest, grant);
275
+ const attempt = yield* performMutation(subject, decision, grant);
276
+ const after = yield* observeAfterMutation(credentials, subject, attempt);
277
+ const observationAuthorities = [...before.authorities, ...after.authorities];
278
+ if (attempt._tag === "RejectedBeforeDispatch") {
279
+ const cause = yield* fromReportResult(makeAuthorityAcquiredButMutationNotDispatched({
280
+ subject: subject.id,
281
+ authority,
282
+ attempt
283
+ }));
284
+ return yield* fromReportResult(makeBlockedSubject({
285
+ subject: subject.id,
286
+ observationAuthorities,
287
+ observations: [...before.observations, ...after.observations],
288
+ cause
289
+ }));
290
+ }
291
+ if (after.observations.at(-1)?._tag === "PresentEquivalent") {
292
+ return yield* fromReportResult(makeConvergedAfterMutation({
293
+ subject: subject.id,
294
+ observationAuthorities,
295
+ preObservations: before.observations,
296
+ decision,
297
+ authority,
298
+ attempt: convergedAttempt(attempt),
299
+ postObservations: after.observations
300
+ }));
301
+ }
302
+ if (attempt._tag === "RejectedByProvider" &&
303
+ after.observations.at(-1)?._tag !== "Inconclusive" &&
304
+ after.observations.at(-1)?._tag !== "VisibilityPending") {
305
+ return yield* fromReportResult(makeBlockedSubject({
306
+ subject: subject.id,
307
+ observationAuthorities,
308
+ observations: before.observations,
309
+ cause: ConclusiveProviderRejection.make({
310
+ subject: subject.id,
311
+ fact: attempt.fact,
312
+ postObservations: after.observations
313
+ })
314
+ }));
315
+ }
316
+ return yield* fromReportResult(makeUncertainSubject({
317
+ subject: subject.id,
318
+ observationAuthorities,
319
+ observations: before.observations,
320
+ decision,
321
+ authority,
322
+ attempt: uncertainAttempt(attempt),
323
+ trace: after.observations
324
+ }));
325
+ }
326
+ }
327
+ });
328
+ /** Read-only projection. It never asks for publish or correction authority. */
329
+ export const observeReleaseSubjects = Effect.fn("observeReleaseSubjects")(function* (input) {
330
+ yield* validateInput(input);
331
+ const credentials = yield* CredentialProvider;
332
+ const observed = [
333
+ new ObservedSubject({
334
+ subject: input.prepared,
335
+ observationAuthorities: [],
336
+ observation: equivalentObservation()
337
+ })
338
+ ];
339
+ for (const subject of input.subjects) {
340
+ const trace = yield* observeTrace(credentials, subject, { phase: "pre-mutation" });
341
+ observed.push(new ObservedSubject({
342
+ subject: subject.id,
343
+ observationAuthorities: trace.authorities,
344
+ observation: classifyObservation(trace.observations.at(-1))
345
+ }));
346
+ }
347
+ return makeObservationReport(observed);
348
+ });
349
+ /** Dependency-ordered observation, lazy authority, mutation, and reobservation. */
350
+ export const publishReleaseSubjects = Effect.fn("publishReleaseSubjects")(function* (input) {
351
+ yield* validateInput(input);
352
+ const credentials = yield* CredentialProvider;
353
+ const localObservation = PresentEquivalent.make({ subject: input.prepared });
354
+ const local = yield* fromReportResult(makeAlreadyEquivalent(input.prepared, [localObservation], []));
355
+ const reports = [local];
356
+ const converged = new Map([[input.prepared, true]]);
357
+ for (const subject of input.subjects) {
358
+ const prerequisite = (subject.prerequisites ?? []).find((candidate) => converged.get(candidate) !== true);
359
+ if (prerequisite !== undefined) {
360
+ reports.push(yield* fromReportResult(makeNotReached(subject.id, new DependencyBlocked({ prerequisite }))));
361
+ converged.set(subject.id, false);
362
+ continue;
363
+ }
364
+ const report = yield* publishSubject(credentials, subject);
365
+ reports.push(report);
366
+ converged.set(subject.id, report._tag === "AlreadyEquivalent" || report._tag === "ConvergedAfterMutation");
367
+ }
368
+ return makeReleaseReport(reports);
369
+ });
370
+ //# sourceMappingURL=coordinator.js.map