@mannyc1/ts-release 0.0.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/ARCHITECTURE.md +184 -92
  2. package/CHANGELOG.md +197 -0
  3. package/LICENSE +21 -0
  4. package/README.md +404 -327
  5. package/SPEC.md +257 -310
  6. package/apps/release-ts/README.md +39 -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 +122 -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 +39346 -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 +9 -0
  82. package/dist/drivers/archive.d.ts.map +1 -0
  83. package/dist/drivers/archive.js +105 -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/python-wheel.d.ts +21 -0
  106. package/dist/drivers/python-wheel.d.ts.map +1 -0
  107. package/dist/drivers/python-wheel.js +109 -0
  108. package/dist/drivers/python-wheel.js.map +1 -0
  109. package/dist/drivers/redact.d.ts +4 -0
  110. package/dist/drivers/redact.d.ts.map +1 -0
  111. package/dist/drivers/redact.js +24 -0
  112. package/dist/drivers/redact.js.map +1 -0
  113. package/dist/drivers/seccomp-helper-source.d.ts +7 -0
  114. package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
  115. package/dist/drivers/seccomp-helper-source.js +121 -0
  116. package/dist/drivers/seccomp-helper-source.js.map +1 -0
  117. package/dist/drivers/utils.d.ts +4 -0
  118. package/dist/drivers/utils.d.ts.map +1 -0
  119. package/dist/drivers/utils.js +5 -0
  120. package/dist/drivers/utils.js.map +1 -0
  121. package/dist/drivers/workspace.d.ts +9 -0
  122. package/dist/drivers/workspace.d.ts.map +1 -0
  123. package/dist/drivers/workspace.js +53 -0
  124. package/dist/drivers/workspace.js.map +1 -0
  125. package/dist/extensions/provider-adapter.d.ts +48 -0
  126. package/dist/extensions/provider-adapter.d.ts.map +1 -0
  127. package/dist/extensions/provider-adapter.js +64 -0
  128. package/dist/extensions/provider-adapter.js.map +1 -0
  129. package/dist/host.d.ts +33 -0
  130. package/dist/host.d.ts.map +1 -0
  131. package/dist/host.js +20 -0
  132. package/dist/host.js.map +1 -0
  133. package/dist/index.d.ts +19 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +12 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/model/artifact-collection.d.ts +84 -0
  138. package/dist/model/artifact-collection.d.ts.map +1 -0
  139. package/dist/model/artifact-collection.js +185 -0
  140. package/dist/model/artifact-collection.js.map +1 -0
  141. package/dist/model/authority.d.ts +89 -0
  142. package/dist/model/authority.d.ts.map +1 -0
  143. package/dist/model/authority.js +80 -0
  144. package/dist/model/authority.js.map +1 -0
  145. package/dist/model/bun-targets.d.ts +34 -0
  146. package/dist/model/bun-targets.d.ts.map +1 -0
  147. package/dist/model/bun-targets.js +17 -0
  148. package/dist/model/bun-targets.js.map +1 -0
  149. package/dist/model/canonical.d.ts +8 -0
  150. package/dist/model/canonical.d.ts.map +1 -0
  151. package/dist/model/canonical.js +205 -0
  152. package/dist/model/canonical.js.map +1 -0
  153. package/dist/model/catalog.d.ts +76 -0
  154. package/dist/model/catalog.d.ts.map +1 -0
  155. package/dist/model/catalog.js +174 -0
  156. package/dist/model/catalog.js.map +1 -0
  157. package/dist/model/digest.d.ts +53 -0
  158. package/dist/model/digest.d.ts.map +1 -0
  159. package/dist/model/digest.js +127 -0
  160. package/dist/model/digest.js.map +1 -0
  161. package/dist/model/errors.d.ts +14 -0
  162. package/dist/model/errors.d.ts.map +1 -0
  163. package/dist/model/errors.js +8 -0
  164. package/dist/model/errors.js.map +1 -0
  165. package/dist/model/primitives.d.ts +19 -0
  166. package/dist/model/primitives.d.ts.map +1 -0
  167. package/dist/model/primitives.js +18 -0
  168. package/dist/model/primitives.js.map +1 -0
  169. package/dist/model/pypi.d.ts +12 -0
  170. package/dist/model/pypi.d.ts.map +1 -0
  171. package/dist/model/pypi.js +20 -0
  172. package/dist/model/pypi.js.map +1 -0
  173. package/dist/model/python-distribution.d.ts +33 -0
  174. package/dist/model/python-distribution.d.ts.map +1 -0
  175. package/dist/model/python-distribution.js +367 -0
  176. package/dist/model/python-distribution.js.map +1 -0
  177. package/dist/model/secret-patterns.d.ts +2 -0
  178. package/dist/model/secret-patterns.d.ts.map +1 -0
  179. package/dist/model/secret-patterns.js +12 -0
  180. package/dist/model/secret-patterns.js.map +1 -0
  181. package/dist/operation-journal/authority.d.ts +3 -0
  182. package/dist/operation-journal/authority.d.ts.map +1 -0
  183. package/dist/operation-journal/authority.js +147 -0
  184. package/dist/operation-journal/authority.js.map +1 -0
  185. package/dist/operation-journal/aws/deadline.d.ts +12 -0
  186. package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
  187. package/dist/operation-journal/aws/deadline.js +38 -0
  188. package/dist/operation-journal/aws/deadline.js.map +1 -0
  189. package/dist/operation-journal/aws/oidc.d.ts +27 -0
  190. package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
  191. package/dist/operation-journal/aws/oidc.js +361 -0
  192. package/dist/operation-journal/aws/oidc.js.map +1 -0
  193. package/dist/operation-journal/aws/policy.d.ts +42 -0
  194. package/dist/operation-journal/aws/policy.d.ts.map +1 -0
  195. package/dist/operation-journal/aws/policy.js +404 -0
  196. package/dist/operation-journal/aws/policy.js.map +1 -0
  197. package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
  198. package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
  199. package/dist/operation-journal/aws/s3-boundary.js +417 -0
  200. package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
  201. package/dist/operation-journal/aws.d.ts +11 -0
  202. package/dist/operation-journal/aws.d.ts.map +1 -0
  203. package/dist/operation-journal/aws.js +50 -0
  204. package/dist/operation-journal/aws.js.map +1 -0
  205. package/dist/operation-journal/canonical.d.ts +52 -0
  206. package/dist/operation-journal/canonical.d.ts.map +1 -0
  207. package/dist/operation-journal/canonical.js +282 -0
  208. package/dist/operation-journal/canonical.js.map +1 -0
  209. package/dist/operation-journal/model.d.ts +251 -0
  210. package/dist/operation-journal/model.d.ts.map +1 -0
  211. package/dist/operation-journal/model.js +56 -0
  212. package/dist/operation-journal/model.js.map +1 -0
  213. package/dist/operation-journal/reducer.d.ts +28 -0
  214. package/dist/operation-journal/reducer.d.ts.map +1 -0
  215. package/dist/operation-journal/reducer.js +73 -0
  216. package/dist/operation-journal/reducer.js.map +1 -0
  217. package/dist/operation-journal/s3.d.ts +7 -0
  218. package/dist/operation-journal/s3.d.ts.map +1 -0
  219. package/dist/operation-journal/s3.js +667 -0
  220. package/dist/operation-journal/s3.js.map +1 -0
  221. package/dist/operation-journal.d.ts +14 -0
  222. package/dist/operation-journal.d.ts.map +1 -0
  223. package/dist/operation-journal.js +12 -0
  224. package/dist/operation-journal.js.map +1 -0
  225. package/dist/platform/bun.d.ts +7 -0
  226. package/dist/platform/bun.d.ts.map +1 -0
  227. package/dist/platform/bun.js +15 -0
  228. package/dist/platform/bun.js.map +1 -0
  229. package/dist/platform/credentials.d.ts +32 -0
  230. package/dist/platform/credentials.d.ts.map +1 -0
  231. package/dist/platform/credentials.js +834 -0
  232. package/dist/platform/credentials.js.map +1 -0
  233. package/dist/platform/host-support.d.ts +2 -0
  234. package/dist/platform/host-support.d.ts.map +1 -0
  235. package/dist/platform/host-support.js +4 -0
  236. package/dist/platform/host-support.js.map +1 -0
  237. package/dist/platform/node.d.ts +7 -0
  238. package/dist/platform/node.d.ts.map +1 -0
  239. package/dist/platform/node.js +15 -0
  240. package/dist/platform/node.js.map +1 -0
  241. package/dist/platform/release-runtime.d.ts +11 -0
  242. package/dist/platform/release-runtime.d.ts.map +1 -0
  243. package/dist/platform/release-runtime.js +34 -0
  244. package/dist/platform/release-runtime.js.map +1 -0
  245. package/dist/platform/services.d.ts +15 -0
  246. package/dist/platform/services.d.ts.map +1 -0
  247. package/dist/platform/services.js +30 -0
  248. package/dist/platform/services.js.map +1 -0
  249. package/dist/platform/source-observer.d.ts +5 -0
  250. package/dist/platform/source-observer.d.ts.map +1 -0
  251. package/dist/platform/source-observer.js +159 -0
  252. package/dist/platform/source-observer.js.map +1 -0
  253. package/dist/provider-sdk.d.ts +14 -0
  254. package/dist/provider-sdk.d.ts.map +1 -0
  255. package/dist/provider-sdk.js +10 -0
  256. package/dist/provider-sdk.js.map +1 -0
  257. package/dist/publication/adapter.d.ts +212 -0
  258. package/dist/publication/adapter.d.ts.map +1 -0
  259. package/dist/publication/adapter.js +83 -0
  260. package/dist/publication/adapter.js.map +1 -0
  261. package/dist/publication/authority.d.ts +137 -0
  262. package/dist/publication/authority.d.ts.map +1 -0
  263. package/dist/publication/authority.js +233 -0
  264. package/dist/publication/authority.js.map +1 -0
  265. package/dist/publication/catalog-git.d.ts +37 -0
  266. package/dist/publication/catalog-git.d.ts.map +1 -0
  267. package/dist/publication/catalog-git.js +451 -0
  268. package/dist/publication/catalog-git.js.map +1 -0
  269. package/dist/publication/claim.d.ts +39 -0
  270. package/dist/publication/claim.d.ts.map +1 -0
  271. package/dist/publication/claim.js +31 -0
  272. package/dist/publication/claim.js.map +1 -0
  273. package/dist/publication/coordinator.d.ts +246 -0
  274. package/dist/publication/coordinator.d.ts.map +1 -0
  275. package/dist/publication/coordinator.js +370 -0
  276. package/dist/publication/coordinator.js.map +1 -0
  277. package/dist/publication/github.d.ts +36 -0
  278. package/dist/publication/github.d.ts.map +1 -0
  279. package/dist/publication/github.js +695 -0
  280. package/dist/publication/github.js.map +1 -0
  281. package/dist/publication/http.d.ts +69 -0
  282. package/dist/publication/http.d.ts.map +1 -0
  283. package/dist/publication/http.js +29 -0
  284. package/dist/publication/http.js.map +1 -0
  285. package/dist/publication/index.d.ts +5 -0
  286. package/dist/publication/index.d.ts.map +1 -0
  287. package/dist/publication/index.js +5 -0
  288. package/dist/publication/index.js.map +1 -0
  289. package/dist/publication/npm.d.ts +40 -0
  290. package/dist/publication/npm.d.ts.map +1 -0
  291. package/dist/publication/npm.js +359 -0
  292. package/dist/publication/npm.js.map +1 -0
  293. package/dist/publication/profiles.d.ts +136 -0
  294. package/dist/publication/profiles.d.ts.map +1 -0
  295. package/dist/publication/profiles.js +90 -0
  296. package/dist/publication/profiles.js.map +1 -0
  297. package/dist/publication/publisher.d.ts +82 -0
  298. package/dist/publication/publisher.d.ts.map +1 -0
  299. package/dist/publication/publisher.js +53 -0
  300. package/dist/publication/publisher.js.map +1 -0
  301. package/dist/publication/pypi.d.ts +45 -0
  302. package/dist/publication/pypi.d.ts.map +1 -0
  303. package/dist/publication/pypi.js +369 -0
  304. package/dist/publication/pypi.js.map +1 -0
  305. package/dist/publication/recovery.d.ts +663 -0
  306. package/dist/publication/recovery.d.ts.map +1 -0
  307. package/dist/publication/recovery.js +252 -0
  308. package/dist/publication/recovery.js.map +1 -0
  309. package/dist/publication/report.d.ts +1061 -0
  310. package/dist/publication/report.d.ts.map +1 -0
  311. package/dist/publication/report.js +441 -0
  312. package/dist/publication/report.js.map +1 -0
  313. package/dist/recipes/config.d.ts +296 -0
  314. package/dist/recipes/config.d.ts.map +1 -0
  315. package/dist/recipes/config.js +325 -0
  316. package/dist/recipes/config.js.map +1 -0
  317. package/dist/release/capabilities.d.ts +12 -0
  318. package/dist/release/capabilities.d.ts.map +1 -0
  319. package/dist/release/capabilities.js +395 -0
  320. package/dist/release/capabilities.js.map +1 -0
  321. package/dist/release/compiler.d.ts +5 -0
  322. package/dist/release/compiler.d.ts.map +1 -0
  323. package/dist/release/compiler.js +19 -0
  324. package/dist/release/compiler.js.map +1 -0
  325. package/dist/release/config.d.ts +5 -0
  326. package/dist/release/config.d.ts.map +1 -0
  327. package/dist/release/config.js +10 -0
  328. package/dist/release/config.js.map +1 -0
  329. package/dist/release/context.d.ts +96 -0
  330. package/dist/release/context.d.ts.map +1 -0
  331. package/dist/release/context.js +168 -0
  332. package/dist/release/context.js.map +1 -0
  333. package/dist/release/graph.d.ts +271 -0
  334. package/dist/release/graph.d.ts.map +1 -0
  335. package/dist/release/graph.js +766 -0
  336. package/dist/release/graph.js.map +1 -0
  337. package/dist/release/inspect.d.ts +88 -0
  338. package/dist/release/inspect.d.ts.map +1 -0
  339. package/dist/release/inspect.js +75 -0
  340. package/dist/release/inspect.js.map +1 -0
  341. package/dist/release/prepare.d.ts +24 -0
  342. package/dist/release/prepare.d.ts.map +1 -0
  343. package/dist/release/prepare.js +1115 -0
  344. package/dist/release/prepare.js.map +1 -0
  345. package/dist/release/prepared-ref.d.ts +60 -0
  346. package/dist/release/prepared-ref.d.ts.map +1 -0
  347. package/dist/release/prepared-ref.js +131 -0
  348. package/dist/release/prepared-ref.js.map +1 -0
  349. package/dist/release/prepared-store.d.ts +90 -0
  350. package/dist/release/prepared-store.d.ts.map +1 -0
  351. package/dist/release/prepared-store.js +339 -0
  352. package/dist/release/prepared-store.js.map +1 -0
  353. package/dist/release/prepared.d.ts +172 -0
  354. package/dist/release/prepared.d.ts.map +1 -0
  355. package/dist/release/prepared.js +268 -0
  356. package/dist/release/prepared.js.map +1 -0
  357. package/dist/release/staging.d.ts +31 -0
  358. package/dist/release/staging.d.ts.map +1 -0
  359. package/dist/release/staging.js +218 -0
  360. package/dist/release/staging.js.map +1 -0
  361. package/dist/resolve/authored.d.ts +53 -0
  362. package/dist/resolve/authored.d.ts.map +1 -0
  363. package/dist/resolve/authored.js +55 -0
  364. package/dist/resolve/authored.js.map +1 -0
  365. package/dist/resolve/encode.d.ts +3 -0
  366. package/dist/resolve/encode.d.ts.map +1 -0
  367. package/dist/resolve/encode.js +21 -0
  368. package/dist/resolve/encode.js.map +1 -0
  369. package/dist/resolve/errors.d.ts +7 -0
  370. package/dist/resolve/errors.d.ts.map +1 -0
  371. package/dist/resolve/errors.js +17 -0
  372. package/dist/resolve/errors.js.map +1 -0
  373. package/dist/resolve/facts.d.ts +12 -0
  374. package/dist/resolve/facts.d.ts.map +1 -0
  375. package/dist/resolve/facts.js +18 -0
  376. package/dist/resolve/facts.js.map +1 -0
  377. package/dist/resolve/resolve.d.ts +10 -0
  378. package/dist/resolve/resolve.d.ts.map +1 -0
  379. package/dist/resolve/resolve.js +242 -0
  380. package/dist/resolve/resolve.js.map +1 -0
  381. package/dist/store.d.ts +11 -0
  382. package/dist/store.d.ts.map +1 -0
  383. package/dist/store.js +9 -0
  384. package/dist/store.js.map +1 -0
  385. package/examples/README.md +20 -30
  386. package/examples/github-release/release.config.json +11 -18
  387. package/examples/homebrew-tap/README.md +11 -0
  388. package/examples/homebrew-tap/release.config.json +40 -28
  389. package/examples/multi-target/release.config.json +28 -53
  390. package/examples/npm-first-publish/release.config.json +23 -25
  391. package/examples/npm-only/release.config.json +22 -30
  392. package/examples/portable-cli/README.md +17 -0
  393. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
  394. package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
  395. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
  396. package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
  397. package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
  398. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
  399. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
  400. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
  401. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
  402. package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
  403. package/examples/portable-cli/package.json +9 -0
  404. package/examples/portable-cli/release.config.json +53 -0
  405. package/examples/portable-cli/src/cli.ts +3 -0
  406. package/examples/pypi-registry/README.md +8 -0
  407. package/examples/scoop-bucket/README.md +10 -0
  408. package/examples/scoop-bucket/release.config.json +40 -30
  409. package/package.json +73 -154
  410. package/src/api/api.ts +365 -0
  411. package/src/api/errors.ts +36 -0
  412. package/src/api/input.ts +92 -0
  413. package/src/api/runtime.ts +14 -0
  414. package/src/api/types.ts +103 -0
  415. package/src/capabilities/bun-targets.ts +2 -0
  416. package/src/capabilities/field-ownership.ts +60 -0
  417. package/src/capabilities/module.ts +158 -0
  418. package/src/capabilities/registry.ts +333 -0
  419. package/src/config/config.ts +48 -0
  420. package/src/correction/coordinator.ts +336 -0
  421. package/src/correction/index.ts +2 -0
  422. package/src/correction/intent.ts +172 -0
  423. package/src/drivers/archive.ts +111 -0
  424. package/src/drivers/contain.ts +20 -0
  425. package/src/drivers/environment.ts +28 -0
  426. package/src/drivers/errors.ts +6 -0
  427. package/src/drivers/glob.ts +137 -0
  428. package/src/drivers/process.ts +339 -0
  429. package/src/drivers/python-wheel.ts +145 -0
  430. package/src/drivers/redact.ts +31 -0
  431. package/src/drivers/seccomp-helper-source.ts +121 -0
  432. package/src/drivers/utils.ts +10 -0
  433. package/src/drivers/workspace.ts +46 -0
  434. package/src/extensions/provider-adapter.ts +99 -0
  435. package/src/host.ts +140 -0
  436. package/src/index.ts +64 -0
  437. package/src/model/artifact-collection.ts +237 -0
  438. package/src/model/authority.ts +116 -0
  439. package/src/model/bun-targets.ts +34 -0
  440. package/src/model/canonical.ts +205 -0
  441. package/src/model/catalog.ts +220 -0
  442. package/src/model/digest.ts +172 -0
  443. package/src/model/errors.ts +6 -0
  444. package/src/model/primitives.ts +37 -0
  445. package/src/model/pypi.ts +30 -0
  446. package/src/model/python-distribution.ts +360 -0
  447. package/src/model/secret-patterns.ts +11 -0
  448. package/src/operation-journal/authority.ts +162 -0
  449. package/src/operation-journal/aws/deadline.ts +41 -0
  450. package/src/operation-journal/aws/oidc.ts +439 -0
  451. package/src/operation-journal/aws/policy.ts +491 -0
  452. package/src/operation-journal/aws/s3-boundary.ts +562 -0
  453. package/src/operation-journal/aws.ts +60 -0
  454. package/src/operation-journal/canonical.ts +373 -0
  455. package/src/operation-journal/model.ts +301 -0
  456. package/src/operation-journal/reducer.ts +112 -0
  457. package/src/operation-journal/s3.ts +884 -0
  458. package/src/operation-journal.ts +51 -0
  459. package/src/platform/bun.ts +38 -0
  460. package/src/platform/credentials.ts +1151 -0
  461. package/src/platform/host-support.ts +4 -0
  462. package/src/platform/node.ts +38 -0
  463. package/src/platform/release-runtime.ts +47 -0
  464. package/src/platform/services.ts +57 -0
  465. package/src/platform/source-observer.ts +193 -0
  466. package/src/provider-sdk.ts +48 -0
  467. package/src/publication/adapter.ts +132 -0
  468. package/src/publication/authority.ts +397 -0
  469. package/src/publication/catalog-git.ts +603 -0
  470. package/src/publication/claim.ts +51 -0
  471. package/src/publication/coordinator.ts +578 -0
  472. package/src/publication/github.ts +1022 -0
  473. package/src/publication/http.ts +101 -0
  474. package/src/publication/index.ts +4 -0
  475. package/src/publication/npm.ts +525 -0
  476. package/src/publication/profiles.ts +94 -0
  477. package/src/publication/publisher.ts +130 -0
  478. package/src/publication/pypi.ts +463 -0
  479. package/src/publication/recovery.ts +349 -0
  480. package/src/publication/report.ts +628 -0
  481. package/src/recipes/config.ts +395 -0
  482. package/src/release/capabilities.ts +460 -0
  483. package/src/release/compiler.ts +28 -0
  484. package/src/release/config.ts +12 -0
  485. package/src/release/context.ts +223 -0
  486. package/src/release/graph.ts +866 -0
  487. package/src/release/inspect.ts +83 -0
  488. package/src/release/prepare.ts +1329 -0
  489. package/src/release/prepared-ref.ts +193 -0
  490. package/src/release/prepared-store.ts +378 -0
  491. package/src/release/prepared.ts +299 -0
  492. package/src/release/staging.ts +257 -0
  493. package/src/resolve/authored.ts +64 -0
  494. package/src/resolve/encode.ts +22 -0
  495. package/src/resolve/errors.ts +15 -0
  496. package/src/resolve/facts.ts +18 -0
  497. package/src/resolve/resolve.ts +328 -0
  498. package/src/store.ts +28 -0
  499. package/templates/README.md +55 -72
  500. package/templates/bun-cli-github/README.md +7 -9
  501. package/templates/bun-cli-github/release.config.json +35 -73
  502. package/templates/github-actions/release.yml +74 -0
  503. package/templates/github-actions/reviewed-release.yml +115 -0
  504. package/templates/multi-target-homebrew/README.md +10 -0
  505. package/templates/multi-target-homebrew/release.config.json +43 -60
  506. package/templates/multi-target-scoop/README.md +10 -0
  507. package/templates/multi-target-scoop/release.config.json +43 -62
  508. package/templates/npm-github/release.config.json +25 -38
  509. package/templates/npm-github/reviewed-release.config.json +37 -0
  510. package/templates/npm-only/README.md +10 -0
  511. package/templates/npm-only/release.config.json +15 -30
  512. package/templates/portable-cli/README.md +13 -0
  513. package/templates/portable-cli/release.config.json +53 -0
  514. package/dist/artifacts/adapter.d.ts +0 -39
  515. package/dist/artifacts/adapter.d.ts.map +0 -1
  516. package/dist/artifacts/adapter.js +0 -23
  517. package/dist/artifacts/adapter.js.map +0 -1
  518. package/dist/artifacts/registry.d.ts +0 -21
  519. package/dist/artifacts/registry.d.ts.map +0 -1
  520. package/dist/artifacts/registry.js +0 -21
  521. package/dist/artifacts/registry.js.map +0 -1
  522. package/dist/config/errors.d.ts +0 -24
  523. package/dist/config/errors.d.ts.map +0 -1
  524. package/dist/config/errors.js +0 -19
  525. package/dist/config/errors.js.map +0 -1
  526. package/dist/config/load.d.ts +0 -9
  527. package/dist/config/load.d.ts.map +0 -1
  528. package/dist/config/load.js +0 -29
  529. package/dist/config/load.js.map +0 -1
  530. package/dist/config/schema.d.ts +0 -12
  531. package/dist/config/schema.d.ts.map +0 -1
  532. package/dist/config/schema.js +0 -19
  533. package/dist/config/schema.js.map +0 -1
  534. package/dist/domain/artifact.d.ts +0 -118
  535. package/dist/domain/artifact.d.ts.map +0 -1
  536. package/dist/domain/artifact.js +0 -197
  537. package/dist/domain/artifact.js.map +0 -1
  538. package/dist/domain/evidence.d.ts +0 -59
  539. package/dist/domain/evidence.d.ts.map +0 -1
  540. package/dist/domain/evidence.js +0 -51
  541. package/dist/domain/evidence.js.map +0 -1
  542. package/dist/domain/operation.d.ts +0 -143
  543. package/dist/domain/operation.d.ts.map +0 -1
  544. package/dist/domain/operation.js +0 -198
  545. package/dist/domain/operation.js.map +0 -1
  546. package/dist/domain/release.d.ts +0 -93
  547. package/dist/domain/release.d.ts.map +0 -1
  548. package/dist/domain/release.js +0 -82
  549. package/dist/domain/release.js.map +0 -1
  550. package/dist/domain/remote-state.d.ts +0 -58
  551. package/dist/domain/remote-state.d.ts.map +0 -1
  552. package/dist/domain/remote-state.js +0 -55
  553. package/dist/domain/remote-state.js.map +0 -1
  554. package/dist/domain/target.d.ts +0 -148
  555. package/dist/domain/target.d.ts.map +0 -1
  556. package/dist/domain/target.js +0 -151
  557. package/dist/domain/target.js.map +0 -1
  558. package/dist/host/host.d.ts +0 -32
  559. package/dist/host/host.d.ts.map +0 -1
  560. package/dist/host/host.js +0 -24
  561. package/dist/host/host.js.map +0 -1
  562. package/dist/host/http-live.d.ts +0 -6
  563. package/dist/host/http-live.d.ts.map +0 -1
  564. package/dist/host/http-live.js +0 -86
  565. package/dist/host/http-live.js.map +0 -1
  566. package/dist/host/http.d.ts +0 -43
  567. package/dist/host/http.d.ts.map +0 -1
  568. package/dist/host/http.js +0 -59
  569. package/dist/host/http.js.map +0 -1
  570. package/dist/host/platform.d.ts +0 -10
  571. package/dist/host/platform.d.ts.map +0 -1
  572. package/dist/host/platform.js +0 -114
  573. package/dist/host/platform.js.map +0 -1
  574. package/dist/host/test.d.ts +0 -23
  575. package/dist/host/test.d.ts.map +0 -1
  576. package/dist/host/test.js +0 -222
  577. package/dist/host/test.js.map +0 -1
  578. package/dist/internal/workspace-path.d.ts +0 -15
  579. package/dist/internal/workspace-path.d.ts.map +0 -1
  580. package/dist/internal/workspace-path.js +0 -36
  581. package/dist/internal/workspace-path.js.map +0 -1
  582. package/dist/planner/artifact-inventory.d.ts +0 -9
  583. package/dist/planner/artifact-inventory.d.ts.map +0 -1
  584. package/dist/planner/artifact-inventory.js +0 -86
  585. package/dist/planner/artifact-inventory.js.map +0 -1
  586. package/dist/planner/create-release-plan.d.ts +0 -5
  587. package/dist/planner/create-release-plan.d.ts.map +0 -1
  588. package/dist/planner/create-release-plan.js +0 -25
  589. package/dist/planner/create-release-plan.js.map +0 -1
  590. package/dist/planner/errors.d.ts +0 -67
  591. package/dist/planner/errors.d.ts.map +0 -1
  592. package/dist/planner/errors.js +0 -58
  593. package/dist/planner/errors.js.map +0 -1
  594. package/dist/planner/evidence-recorder.d.ts +0 -28
  595. package/dist/planner/evidence-recorder.d.ts.map +0 -1
  596. package/dist/planner/evidence-recorder.js +0 -362
  597. package/dist/planner/evidence-recorder.js.map +0 -1
  598. package/dist/planner/executor.d.ts +0 -58
  599. package/dist/planner/executor.d.ts.map +0 -1
  600. package/dist/planner/executor.js +0 -147
  601. package/dist/planner/executor.js.map +0 -1
  602. package/dist/planner/normalize-release.d.ts +0 -19
  603. package/dist/planner/normalize-release.d.ts.map +0 -1
  604. package/dist/planner/normalize-release.js +0 -342
  605. package/dist/planner/normalize-release.js.map +0 -1
  606. package/dist/planner/reconcile.d.ts +0 -17
  607. package/dist/planner/reconcile.d.ts.map +0 -1
  608. package/dist/planner/reconcile.js +0 -259
  609. package/dist/planner/reconcile.js.map +0 -1
  610. package/dist/planner/render-plan.d.ts +0 -15
  611. package/dist/planner/render-plan.d.ts.map +0 -1
  612. package/dist/planner/render-plan.js +0 -231
  613. package/dist/planner/render-plan.js.map +0 -1
  614. package/dist/targets/adapter-helpers.d.ts +0 -79
  615. package/dist/targets/adapter-helpers.d.ts.map +0 -1
  616. package/dist/targets/adapter-helpers.js +0 -194
  617. package/dist/targets/adapter-helpers.js.map +0 -1
  618. package/dist/targets/adapter.d.ts +0 -17
  619. package/dist/targets/adapter.d.ts.map +0 -1
  620. package/dist/targets/adapter.js +0 -2
  621. package/dist/targets/adapter.js.map +0 -1
  622. package/dist/targets/github-release.d.ts +0 -25
  623. package/dist/targets/github-release.d.ts.map +0 -1
  624. package/dist/targets/github-release.js +0 -82
  625. package/dist/targets/github-release.js.map +0 -1
  626. package/dist/targets/github.d.ts +0 -11
  627. package/dist/targets/github.d.ts.map +0 -1
  628. package/dist/targets/github.js +0 -117
  629. package/dist/targets/github.js.map +0 -1
  630. package/dist/targets/homebrew.d.ts +0 -11
  631. package/dist/targets/homebrew.d.ts.map +0 -1
  632. package/dist/targets/homebrew.js +0 -210
  633. package/dist/targets/homebrew.js.map +0 -1
  634. package/dist/targets/live.d.ts +0 -5
  635. package/dist/targets/live.d.ts.map +0 -1
  636. package/dist/targets/live.js +0 -50
  637. package/dist/targets/live.js.map +0 -1
  638. package/dist/targets/npm.d.ts +0 -10
  639. package/dist/targets/npm.d.ts.map +0 -1
  640. package/dist/targets/npm.js +0 -112
  641. package/dist/targets/npm.js.map +0 -1
  642. package/dist/targets/pypi.d.ts +0 -11
  643. package/dist/targets/pypi.d.ts.map +0 -1
  644. package/dist/targets/pypi.js +0 -141
  645. package/dist/targets/pypi.js.map +0 -1
  646. package/dist/targets/registry.d.ts +0 -25
  647. package/dist/targets/registry.d.ts.map +0 -1
  648. package/dist/targets/registry.js +0 -34
  649. package/dist/targets/registry.js.map +0 -1
  650. package/dist/targets/scoop.d.ts +0 -11
  651. package/dist/targets/scoop.d.ts.map +0 -1
  652. package/dist/targets/scoop.js +0 -88
  653. package/dist/targets/scoop.js.map +0 -1
  654. package/dist/types/effect-internal.d.ts +0 -5
  655. package/dist/types/effect-internal.d.ts.map +0 -1
  656. package/dist/types/effect-internal.js +0 -2
  657. package/dist/types/effect-internal.js.map +0 -1
  658. package/dist/workflows/config.d.ts +0 -202
  659. package/dist/workflows/config.d.ts.map +0 -1
  660. package/dist/workflows/config.js +0 -420
  661. package/dist/workflows/config.js.map +0 -1
  662. package/dist/workflows/diagnostics.d.ts +0 -62
  663. package/dist/workflows/diagnostics.d.ts.map +0 -1
  664. package/dist/workflows/diagnostics.js +0 -530
  665. package/dist/workflows/diagnostics.js.map +0 -1
  666. package/dist/workflows/distribution.d.ts +0 -25
  667. package/dist/workflows/distribution.d.ts.map +0 -1
  668. package/dist/workflows/distribution.js +0 -24
  669. package/dist/workflows/distribution.js.map +0 -1
  670. package/dist/workflows/evidence.d.ts +0 -17
  671. package/dist/workflows/evidence.d.ts.map +0 -1
  672. package/dist/workflows/evidence.js +0 -32
  673. package/dist/workflows/evidence.js.map +0 -1
  674. package/dist/workflows/index.d.ts +0 -8
  675. package/dist/workflows/index.d.ts.map +0 -1
  676. package/dist/workflows/index.js +0 -7
  677. package/dist/workflows/index.js.map +0 -1
  678. package/dist/workflows/init.d.ts +0 -84
  679. package/dist/workflows/init.d.ts.map +0 -1
  680. package/dist/workflows/init.js +0 -487
  681. package/dist/workflows/init.js.map +0 -1
  682. package/dist/workflows/live.d.ts +0 -9
  683. package/dist/workflows/live.d.ts.map +0 -1
  684. package/dist/workflows/live.js +0 -7
  685. package/dist/workflows/live.js.map +0 -1
  686. package/dist/workflows/options.d.ts +0 -30
  687. package/dist/workflows/options.d.ts.map +0 -1
  688. package/dist/workflows/options.js +0 -16
  689. package/dist/workflows/options.js.map +0 -1
  690. package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
  691. package/examples/non-strict-skips/release.config.json +0 -31
  692. package/examples/pypi-registry/release.config.json +0 -31
  693. package/templates/github-actions/plan-and-approved-execute.yml +0 -58
  694. package/templates/github-actions/plan-only.yml +0 -33
  695. 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