@12ui/design 0.2.57 → 0.2.59

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 (456) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/artifact-materializer.d.ts.map +1 -1
  3. package/dist/artifact-materializer.js +4 -1
  4. package/dist/artifact-materializer.js.map +1 -1
  5. package/dist/atomic-file-replace.d.ts +21 -0
  6. package/dist/atomic-file-replace.d.ts.map +1 -0
  7. package/dist/atomic-file-replace.js +48 -0
  8. package/dist/atomic-file-replace.js.map +1 -0
  9. package/dist/branch-client.d.ts +84 -2
  10. package/dist/branch-client.d.ts.map +1 -1
  11. package/dist/branch-client.js +30 -0
  12. package/dist/branch-client.js.map +1 -1
  13. package/dist/cli-arguments.d.ts.map +1 -1
  14. package/dist/cli-arguments.js +2 -1
  15. package/dist/cli-arguments.js.map +1 -1
  16. package/dist/cli-capabilities.d.ts +1 -1
  17. package/dist/cli-conversion-derivation.d.ts +14 -1
  18. package/dist/cli-conversion-derivation.d.ts.map +1 -1
  19. package/dist/cli-conversion-derivation.js +14 -7
  20. package/dist/cli-conversion-derivation.js.map +1 -1
  21. package/dist/cli-convert-command.d.ts +2 -0
  22. package/dist/cli-convert-command.d.ts.map +1 -1
  23. package/dist/cli-convert-command.js +86 -34
  24. package/dist/cli-convert-command.js.map +1 -1
  25. package/dist/cli-corpus-command.d.ts.map +1 -1
  26. package/dist/cli-corpus-command.js +0 -3
  27. package/dist/cli-corpus-command.js.map +1 -1
  28. package/dist/cli-draft-command.d.ts +16 -0
  29. package/dist/cli-draft-command.d.ts.map +1 -1
  30. package/dist/cli-draft-command.js +47 -9
  31. package/dist/cli-draft-command.js.map +1 -1
  32. package/dist/cli-help/design.d.ts +7 -4
  33. package/dist/cli-help/design.d.ts.map +1 -1
  34. package/dist/cli-help/design.js +20 -7
  35. package/dist/cli-help/design.js.map +1 -1
  36. package/dist/cli-help/index.d.ts +9 -6
  37. package/dist/cli-help/index.d.ts.map +1 -1
  38. package/dist/cli-help/meta.d.ts +2 -2
  39. package/dist/cli-help/meta.d.ts.map +1 -1
  40. package/dist/cli-help/meta.js +4 -1
  41. package/dist/cli-help/meta.js.map +1 -1
  42. package/dist/cli-improve-command.d.ts.map +1 -1
  43. package/dist/cli-improve-command.js +215 -33
  44. package/dist/cli-improve-command.js.map +1 -1
  45. package/dist/cli-redesign-command.d.ts.map +1 -1
  46. package/dist/cli-redesign-command.js +268 -156
  47. package/dist/cli-redesign-command.js.map +1 -1
  48. package/dist/cli-run.d.ts.map +1 -1
  49. package/dist/cli-run.js +13 -3
  50. package/dist/cli-run.js.map +1 -1
  51. package/dist/cli-spend-command.d.ts +12 -1
  52. package/dist/cli-spend-command.d.ts.map +1 -1
  53. package/dist/cli-spend-command.js +94 -2
  54. package/dist/cli-spend-command.js.map +1 -1
  55. package/dist/cli-usage.js +5 -5
  56. package/dist/cli-usage.js.map +1 -1
  57. package/dist/concept-input.d.ts +6 -77
  58. package/dist/concept-input.d.ts.map +1 -1
  59. package/dist/concept-input.js +6 -87
  60. package/dist/concept-input.js.map +1 -1
  61. package/dist/conversion-client.d.ts +106 -17
  62. package/dist/conversion-client.d.ts.map +1 -1
  63. package/dist/conversion-client.js +244 -80
  64. package/dist/conversion-client.js.map +1 -1
  65. package/dist/corpus-client.d.ts.map +1 -1
  66. package/dist/corpus-client.js +0 -3
  67. package/dist/corpus-client.js.map +1 -1
  68. package/dist/draft-identity.d.ts +7 -0
  69. package/dist/draft-identity.d.ts.map +1 -1
  70. package/dist/draft-identity.js +4 -0
  71. package/dist/draft-identity.js.map +1 -1
  72. package/dist/draft-run.d.ts +13 -0
  73. package/dist/draft-run.d.ts.map +1 -1
  74. package/dist/draft-run.js +20 -2
  75. package/dist/draft-run.js.map +1 -1
  76. package/dist/draft-workspace.d.ts +4 -0
  77. package/dist/draft-workspace.d.ts.map +1 -1
  78. package/dist/draft-workspace.js.map +1 -1
  79. package/dist/hosted-draft-identity.d.ts +18 -0
  80. package/dist/hosted-draft-identity.d.ts.map +1 -1
  81. package/dist/hosted-draft-identity.js +8 -0
  82. package/dist/hosted-draft-identity.js.map +1 -1
  83. package/dist/hosted-draft-run.d.ts +15 -0
  84. package/dist/hosted-draft-run.d.ts.map +1 -1
  85. package/dist/hosted-draft-run.js +27 -0
  86. package/dist/hosted-draft-run.js.map +1 -1
  87. package/dist/improve-added-specs.d.ts +12 -40
  88. package/dist/improve-added-specs.d.ts.map +1 -1
  89. package/dist/improve-added-specs.js +63 -172
  90. package/dist/improve-added-specs.js.map +1 -1
  91. package/dist/improve-artifact-writer.d.ts +13 -0
  92. package/dist/improve-artifact-writer.d.ts.map +1 -0
  93. package/dist/improve-artifact-writer.js +27 -0
  94. package/dist/improve-artifact-writer.js.map +1 -0
  95. package/dist/improve-bootstrap-history.d.ts +21 -0
  96. package/dist/improve-bootstrap-history.d.ts.map +1 -0
  97. package/dist/improve-bootstrap-history.js +43 -0
  98. package/dist/improve-bootstrap-history.js.map +1 -0
  99. package/dist/improve-branch-stage.d.ts +10 -0
  100. package/dist/improve-branch-stage.d.ts.map +1 -0
  101. package/dist/improve-branch-stage.js +325 -0
  102. package/dist/improve-branch-stage.js.map +1 -0
  103. package/dist/improve-capture-redirect.d.ts +19 -0
  104. package/dist/improve-capture-redirect.d.ts.map +1 -1
  105. package/dist/improve-capture-redirect.js +18 -1
  106. package/dist/improve-capture-redirect.js.map +1 -1
  107. package/dist/improve-capture-words.d.ts +43 -0
  108. package/dist/improve-capture-words.d.ts.map +1 -0
  109. package/dist/improve-capture-words.js +25 -0
  110. package/dist/improve-capture-words.js.map +1 -0
  111. package/dist/improve-concept.d.ts +6 -20
  112. package/dist/improve-concept.d.ts.map +1 -1
  113. package/dist/improve-concept.js +12 -59
  114. package/dist/improve-concept.js.map +1 -1
  115. package/dist/improve-conversion-attempts.d.ts +12 -4
  116. package/dist/improve-conversion-attempts.d.ts.map +1 -1
  117. package/dist/improve-conversion-attempts.js.map +1 -1
  118. package/dist/improve-conversion-stage.d.ts +13 -2
  119. package/dist/improve-conversion-stage.d.ts.map +1 -1
  120. package/dist/improve-conversion-stage.js +211 -20
  121. package/dist/improve-conversion-stage.js.map +1 -1
  122. package/dist/improve-convert-progress.d.ts +10 -2
  123. package/dist/improve-convert-progress.d.ts.map +1 -1
  124. package/dist/improve-convert-progress.js +7 -3
  125. package/dist/improve-convert-progress.js.map +1 -1
  126. package/dist/improve-convert-resilience.d.ts +60 -13
  127. package/dist/improve-convert-resilience.d.ts.map +1 -1
  128. package/dist/improve-convert-resilience.js +85 -22
  129. package/dist/improve-convert-resilience.js.map +1 -1
  130. package/dist/improve-core/concept-input.d.ts +80 -0
  131. package/dist/improve-core/concept-input.d.ts.map +1 -0
  132. package/dist/improve-core/concept-input.js +92 -0
  133. package/dist/improve-core/concept-input.js.map +1 -0
  134. package/dist/improve-core/improve-added-specs.d.ts +62 -0
  135. package/dist/improve-core/improve-added-specs.d.ts.map +1 -0
  136. package/dist/improve-core/improve-added-specs.js +160 -0
  137. package/dist/improve-core/improve-added-specs.js.map +1 -0
  138. package/dist/improve-core/improve-artifacts.d.ts +18 -0
  139. package/dist/improve-core/improve-artifacts.d.ts.map +1 -0
  140. package/dist/improve-core/improve-artifacts.js +4 -0
  141. package/dist/improve-core/improve-artifacts.js.map +1 -0
  142. package/dist/improve-core/improve-concept.d.ts +11 -0
  143. package/dist/improve-core/improve-concept.d.ts.map +1 -0
  144. package/dist/improve-core/improve-concept.js +190 -0
  145. package/dist/improve-core/improve-concept.js.map +1 -0
  146. package/dist/improve-core/improve-discovery.d.ts +84 -0
  147. package/dist/improve-core/improve-discovery.d.ts.map +1 -0
  148. package/dist/improve-core/improve-discovery.js +154 -0
  149. package/dist/improve-core/improve-discovery.js.map +1 -0
  150. package/dist/improve-core/improve-dom-anchor.d.ts.map +1 -0
  151. package/dist/{improve-dom-anchor.js → improve-core/improve-dom-anchor.js} +2 -0
  152. package/dist/improve-core/improve-dom-anchor.js.map +1 -0
  153. package/dist/improve-core/improve-dom-diff.d.ts +59 -0
  154. package/dist/improve-core/improve-dom-diff.d.ts.map +1 -0
  155. package/dist/improve-core/improve-dom-diff.js +151 -0
  156. package/dist/improve-core/improve-dom-diff.js.map +1 -0
  157. package/dist/improve-core/improve-dom-extract.d.ts.map +1 -0
  158. package/dist/{improve-dom-extract.js → improve-core/improve-dom-extract.js} +2 -0
  159. package/dist/improve-core/improve-dom-extract.js.map +1 -0
  160. package/dist/improve-core/improve-dom-gate.d.ts +49 -0
  161. package/dist/improve-core/improve-dom-gate.d.ts.map +1 -0
  162. package/dist/improve-core/improve-dom-gate.js +99 -0
  163. package/dist/improve-core/improve-dom-gate.js.map +1 -0
  164. package/dist/improve-core/improve-dom-neighbour.d.ts.map +1 -0
  165. package/dist/{improve-dom-neighbour.js → improve-core/improve-dom-neighbour.js} +2 -0
  166. package/dist/improve-core/improve-dom-neighbour.js.map +1 -0
  167. package/dist/improve-core/improve-dom-scale.d.ts.map +1 -0
  168. package/dist/{improve-dom-scale.js → improve-core/improve-dom-scale.js} +2 -0
  169. package/dist/improve-core/improve-dom-scale.js.map +1 -0
  170. package/dist/improve-core/improve-icon-svg.d.ts +29 -0
  171. package/dist/improve-core/improve-icon-svg.d.ts.map +1 -0
  172. package/dist/{improve-icon-svg.js → improve-core/improve-icon-svg.js} +2 -0
  173. package/dist/improve-core/improve-icon-svg.js.map +1 -0
  174. package/dist/improve-core/improve-kit-asset-model.d.ts +177 -0
  175. package/dist/improve-core/improve-kit-asset-model.d.ts.map +1 -0
  176. package/dist/improve-core/improve-kit-asset-model.js +269 -0
  177. package/dist/improve-core/improve-kit-asset-model.js.map +1 -0
  178. package/dist/improve-core/improve-layerdoc-diff.d.ts.map +1 -0
  179. package/dist/{improve-layerdoc-diff.js → improve-core/improve-layerdoc-diff.js} +2 -0
  180. package/dist/improve-core/improve-layerdoc-diff.js.map +1 -0
  181. package/dist/{improve-layerdoc-types.d.ts → improve-core/improve-layerdoc-types.d.ts} +9 -0
  182. package/dist/improve-core/improve-layerdoc-types.d.ts.map +1 -0
  183. package/dist/improve-core/improve-layerdoc-types.js +4 -0
  184. package/dist/improve-core/improve-layerdoc-types.js.map +1 -0
  185. package/dist/improve-core/improve-page-words.d.ts +180 -0
  186. package/dist/improve-core/improve-page-words.d.ts.map +1 -0
  187. package/dist/improve-core/improve-page-words.js +303 -0
  188. package/dist/improve-core/improve-page-words.js.map +1 -0
  189. package/dist/{improve-plan-annotated-render.d.ts → improve-core/improve-plan-annotated-render.d.ts} +6 -1
  190. package/dist/improve-core/improve-plan-annotated-render.d.ts.map +1 -0
  191. package/dist/{improve-plan-annotated-render.js → improve-core/improve-plan-annotated-render.js} +56 -28
  192. package/dist/{improve-plan-annotated-render.js.map → improve-core/improve-plan-annotated-render.js.map} +1 -1
  193. package/dist/improve-core/improve-plan-annotator.d.ts +34 -0
  194. package/dist/improve-core/improve-plan-annotator.d.ts.map +1 -0
  195. package/dist/improve-core/improve-plan-annotator.js +52 -0
  196. package/dist/improve-core/improve-plan-annotator.js.map +1 -0
  197. package/dist/{improve-plan-render.d.ts → improve-core/improve-plan-render.d.ts} +2 -1
  198. package/dist/improve-core/improve-plan-render.d.ts.map +1 -0
  199. package/dist/{improve-plan-render.js → improve-core/improve-plan-render.js} +7 -1
  200. package/dist/improve-core/improve-plan-render.js.map +1 -0
  201. package/dist/improve-core/improve-plan-vector-keep.d.ts +29 -0
  202. package/dist/improve-core/improve-plan-vector-keep.d.ts.map +1 -0
  203. package/dist/improve-core/improve-plan-vector-keep.js +68 -0
  204. package/dist/improve-core/improve-plan-vector-keep.js.map +1 -0
  205. package/dist/{improve-raster-layers-section.d.ts → improve-core/improve-raster-layers-section.d.ts} +9 -1
  206. package/dist/improve-core/improve-raster-layers-section.d.ts.map +1 -0
  207. package/dist/{improve-raster-layers-section.js → improve-core/improve-raster-layers-section.js} +5 -2
  208. package/dist/improve-core/improve-raster-layers-section.js.map +1 -0
  209. package/dist/improve-core/improve-refusal.d.ts +6 -0
  210. package/dist/improve-core/improve-refusal.d.ts.map +1 -0
  211. package/dist/improve-core/improve-refusal.js +27 -0
  212. package/dist/improve-core/improve-refusal.js.map +1 -0
  213. package/dist/improve-core/improve-retain.d.ts +121 -0
  214. package/dist/improve-core/improve-retain.d.ts.map +1 -0
  215. package/dist/improve-core/improve-retain.js +115 -0
  216. package/dist/improve-core/improve-retain.js.map +1 -0
  217. package/dist/improve-core/improve-site-plan.d.ts +75 -0
  218. package/dist/improve-core/improve-site-plan.d.ts.map +1 -0
  219. package/dist/improve-core/improve-site-plan.js +135 -0
  220. package/dist/improve-core/improve-site-plan.js.map +1 -0
  221. package/dist/improve-core/improve-site-shell.d.ts +56 -0
  222. package/dist/improve-core/improve-site-shell.d.ts.map +1 -0
  223. package/dist/improve-core/improve-site-shell.js +152 -0
  224. package/dist/improve-core/improve-site-shell.js.map +1 -0
  225. package/dist/improve-core/improve-site-tokens.d.ts +44 -0
  226. package/dist/improve-core/improve-site-tokens.d.ts.map +1 -0
  227. package/dist/improve-core/improve-site-tokens.js +87 -0
  228. package/dist/improve-core/improve-site-tokens.js.map +1 -0
  229. package/dist/improve-core/improve-source-hints.d.ts +25 -0
  230. package/dist/improve-core/improve-source-hints.d.ts.map +1 -0
  231. package/dist/improve-core/improve-source-hints.js +17 -0
  232. package/dist/improve-core/improve-source-hints.js.map +1 -0
  233. package/dist/improve-core/improve-token-patch.d.ts.map +1 -0
  234. package/dist/{improve-token-patch.js → improve-core/improve-token-patch.js} +2 -0
  235. package/dist/improve-core/improve-token-patch.js.map +1 -0
  236. package/dist/improve-core/index.d.ts +47 -0
  237. package/dist/improve-core/index.d.ts.map +1 -0
  238. package/dist/improve-core/index.js +49 -0
  239. package/dist/improve-core/index.js.map +1 -0
  240. package/dist/improve-delivery-stages.d.ts +6 -0
  241. package/dist/improve-delivery-stages.d.ts.map +1 -1
  242. package/dist/improve-delivery-stages.js +87 -6
  243. package/dist/improve-delivery-stages.js.map +1 -1
  244. package/dist/improve-dom-diff.d.ts +8 -24
  245. package/dist/improve-dom-diff.d.ts.map +1 -1
  246. package/dist/improve-dom-diff.js +23 -123
  247. package/dist/improve-dom-diff.js.map +1 -1
  248. package/dist/improve-dom-gate.d.ts +1 -18
  249. package/dist/improve-dom-gate.d.ts.map +1 -1
  250. package/dist/improve-dom-gate.js +1 -46
  251. package/dist/improve-dom-gate.js.map +1 -1
  252. package/dist/improve-generation-stages.d.ts +0 -2
  253. package/dist/improve-generation-stages.d.ts.map +1 -1
  254. package/dist/improve-generation-stages.js +162 -15
  255. package/dist/improve-generation-stages.js.map +1 -1
  256. package/dist/improve-kit-assets.d.ts +8 -116
  257. package/dist/improve-kit-assets.d.ts.map +1 -1
  258. package/dist/improve-kit-assets.js +9 -229
  259. package/dist/improve-kit-assets.js.map +1 -1
  260. package/dist/improve-kit-readme.d.ts +4 -0
  261. package/dist/improve-kit-readme.d.ts.map +1 -1
  262. package/dist/improve-kit-readme.js +57 -16
  263. package/dist/improve-kit-readme.js.map +1 -1
  264. package/dist/improve-kit-stall.d.ts +3 -1
  265. package/dist/improve-kit-stall.d.ts.map +1 -1
  266. package/dist/improve-kit-stall.js +46 -14
  267. package/dist/improve-kit-stall.js.map +1 -1
  268. package/dist/improve-kit-status.d.ts.map +1 -1
  269. package/dist/improve-kit-status.js +8 -3
  270. package/dist/improve-kit-status.js.map +1 -1
  271. package/dist/improve-options.d.ts +8 -0
  272. package/dist/improve-options.d.ts.map +1 -1
  273. package/dist/improve-options.js +92 -12
  274. package/dist/improve-options.js.map +1 -1
  275. package/dist/improve-passthrough-flags.d.ts +8 -0
  276. package/dist/improve-passthrough-flags.d.ts.map +1 -0
  277. package/dist/improve-passthrough-flags.js +11 -0
  278. package/dist/improve-passthrough-flags.js.map +1 -0
  279. package/dist/improve-plan-annotator.d.ts +8 -2
  280. package/dist/improve-plan-annotator.d.ts.map +1 -1
  281. package/dist/improve-plan-annotator.js +35 -38
  282. package/dist/improve-plan-annotator.js.map +1 -1
  283. package/dist/improve-pricing-plan.d.ts +3 -0
  284. package/dist/improve-pricing-plan.d.ts.map +1 -1
  285. package/dist/improve-pricing-plan.js +33 -5
  286. package/dist/improve-pricing-plan.js.map +1 -1
  287. package/dist/improve-recheck.d.ts +9 -0
  288. package/dist/improve-recheck.d.ts.map +1 -0
  289. package/dist/improve-recheck.js +200 -0
  290. package/dist/improve-recheck.js.map +1 -0
  291. package/dist/improve-reset.d.ts.map +1 -1
  292. package/dist/improve-reset.js +11 -0
  293. package/dist/improve-reset.js.map +1 -1
  294. package/dist/improve-run-summary.d.ts +6 -0
  295. package/dist/improve-run-summary.d.ts.map +1 -1
  296. package/dist/improve-run-summary.js +29 -5
  297. package/dist/improve-run-summary.js.map +1 -1
  298. package/dist/improve-site-plan.d.ts +57 -0
  299. package/dist/improve-site-plan.d.ts.map +1 -0
  300. package/dist/improve-site-plan.js +79 -0
  301. package/dist/improve-site-plan.js.map +1 -0
  302. package/dist/improve-site-shell.d.ts +11 -0
  303. package/dist/improve-site-shell.d.ts.map +1 -0
  304. package/dist/improve-site-shell.js +24 -0
  305. package/dist/improve-site-shell.js.map +1 -0
  306. package/dist/improve-site-stage.d.ts +10 -0
  307. package/dist/improve-site-stage.d.ts.map +1 -0
  308. package/dist/improve-site-stage.js +84 -0
  309. package/dist/improve-site-stage.js.map +1 -0
  310. package/dist/improve-site-tokens.d.ts +9 -0
  311. package/dist/improve-site-tokens.d.ts.map +1 -0
  312. package/dist/improve-site-tokens.js +17 -0
  313. package/dist/improve-site-tokens.js.map +1 -0
  314. package/dist/improve-source-hints.d.ts +3 -12
  315. package/dist/improve-source-hints.d.ts.map +1 -1
  316. package/dist/improve-source-hints.js +4 -5
  317. package/dist/improve-source-hints.js.map +1 -1
  318. package/dist/improve-spend-ledger.d.ts +69 -0
  319. package/dist/improve-spend-ledger.d.ts.map +1 -0
  320. package/dist/improve-spend-ledger.js +118 -0
  321. package/dist/improve-spend-ledger.js.map +1 -0
  322. package/dist/improve-stage-runners.d.ts +5 -2
  323. package/dist/improve-stage-runners.d.ts.map +1 -1
  324. package/dist/improve-stage-runners.js +5 -2
  325. package/dist/improve-stage-runners.js.map +1 -1
  326. package/dist/improve-stage-shared.d.ts +10 -1
  327. package/dist/improve-stage-shared.d.ts.map +1 -1
  328. package/dist/improve-stage-shared.js.map +1 -1
  329. package/dist/improve-stop-handler.d.ts +15 -0
  330. package/dist/improve-stop-handler.d.ts.map +1 -1
  331. package/dist/improve-stop-handler.js +74 -3
  332. package/dist/improve-stop-handler.js.map +1 -1
  333. package/dist/improve-terminal-event.d.ts.map +1 -1
  334. package/dist/improve-terminal-event.js +7 -4
  335. package/dist/improve-terminal-event.js.map +1 -1
  336. package/dist/improve-workspace.d.ts +198 -2
  337. package/dist/improve-workspace.d.ts.map +1 -1
  338. package/dist/improve-workspace.js +249 -92
  339. package/dist/improve-workspace.js.map +1 -1
  340. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  341. package/dist/legacy-skill-catalog.js +79 -0
  342. package/dist/legacy-skill-catalog.js.map +1 -1
  343. package/dist/mcp-convert.js +1 -1
  344. package/dist/mcp-convert.js.map +1 -1
  345. package/dist/mcp-tool-definitions.js +1 -1
  346. package/dist/mcp-tool-definitions.js.map +1 -1
  347. package/dist/mcp-tool-handler.d.ts.map +1 -1
  348. package/dist/mcp-tool-handler.js +0 -3
  349. package/dist/mcp-tool-handler.js.map +1 -1
  350. package/dist/redesign-branch-adoption.d.ts +29 -0
  351. package/dist/redesign-branch-adoption.d.ts.map +1 -0
  352. package/dist/redesign-branch-adoption.js +183 -0
  353. package/dist/redesign-branch-adoption.js.map +1 -0
  354. package/dist/redesign-branch-identity.d.ts +23 -0
  355. package/dist/redesign-branch-identity.d.ts.map +1 -0
  356. package/dist/redesign-branch-identity.js +27 -0
  357. package/dist/redesign-branch-identity.js.map +1 -0
  358. package/dist/redesign-branch-record-verification.d.ts +51 -0
  359. package/dist/redesign-branch-record-verification.d.ts.map +1 -0
  360. package/dist/redesign-branch-record-verification.js +127 -0
  361. package/dist/redesign-branch-record-verification.js.map +1 -0
  362. package/dist/redesign-branch-stage.d.ts +17 -0
  363. package/dist/redesign-branch-stage.d.ts.map +1 -0
  364. package/dist/redesign-branch-stage.js +218 -0
  365. package/dist/redesign-branch-stage.js.map +1 -0
  366. package/dist/redesign-capture.d.ts +145 -15
  367. package/dist/redesign-capture.d.ts.map +1 -1
  368. package/dist/redesign-capture.js +182 -71
  369. package/dist/redesign-capture.js.map +1 -1
  370. package/dist/redesign-page-candidates.d.ts +40 -0
  371. package/dist/redesign-page-candidates.d.ts.map +1 -0
  372. package/dist/redesign-page-candidates.js +131 -0
  373. package/dist/redesign-page-candidates.js.map +1 -0
  374. package/dist/redesign-page-ownership.d.ts +36 -0
  375. package/dist/redesign-page-ownership.d.ts.map +1 -0
  376. package/dist/redesign-page-ownership.js +174 -0
  377. package/dist/redesign-page-ownership.js.map +1 -0
  378. package/dist/redesign-plan-identity.d.ts +3 -1
  379. package/dist/redesign-plan-identity.d.ts.map +1 -1
  380. package/dist/redesign-plan-identity.js +4 -1
  381. package/dist/redesign-plan-identity.js.map +1 -1
  382. package/dist/redesign-plan.d.ts.map +1 -1
  383. package/dist/redesign-plan.js +12 -6
  384. package/dist/redesign-plan.js.map +1 -1
  385. package/dist/redesign-record-validation.d.ts +4 -0
  386. package/dist/redesign-record-validation.d.ts.map +1 -0
  387. package/dist/redesign-record-validation.js +210 -0
  388. package/dist/redesign-record-validation.js.map +1 -0
  389. package/dist/redesign-workspace.d.ts +43 -5
  390. package/dist/redesign-workspace.d.ts.map +1 -1
  391. package/dist/redesign-workspace.js +66 -7
  392. package/dist/redesign-workspace.js.map +1 -1
  393. package/dist/responsive-alternative-materializer.d.ts +8 -3
  394. package/dist/responsive-alternative-materializer.d.ts.map +1 -1
  395. package/dist/responsive-alternative-materializer.js +68 -51
  396. package/dist/responsive-alternative-materializer.js.map +1 -1
  397. package/dist/result-integrity.d.ts +38 -0
  398. package/dist/result-integrity.d.ts.map +1 -0
  399. package/dist/result-integrity.js +46 -0
  400. package/dist/result-integrity.js.map +1 -0
  401. package/dist/review-edit-source.d.ts.map +1 -1
  402. package/dist/review-edit-source.js +6 -2
  403. package/dist/review-edit-source.js.map +1 -1
  404. package/dist/review-edit.js +2 -2
  405. package/dist/review-edit.js.map +1 -1
  406. package/dist/review-prototype-gap.js +1 -1
  407. package/dist/review-prototype-gap.js.map +1 -1
  408. package/dist/run-journal.d.ts +3 -1
  409. package/dist/run-journal.d.ts.map +1 -1
  410. package/dist/run-journal.js +7 -1
  411. package/dist/run-journal.js.map +1 -1
  412. package/dist/spend-run-filter.d.ts +21 -0
  413. package/dist/spend-run-filter.d.ts.map +1 -0
  414. package/dist/spend-run-filter.js +67 -0
  415. package/dist/spend-run-filter.js.map +1 -0
  416. package/dist/spend-scoped-report-lines.d.ts +4 -0
  417. package/dist/spend-scoped-report-lines.d.ts.map +1 -0
  418. package/dist/spend-scoped-report-lines.js +46 -0
  419. package/dist/spend-scoped-report-lines.js.map +1 -0
  420. package/dist/spend-scoped-report.d.ts +28 -0
  421. package/dist/spend-scoped-report.d.ts.map +1 -0
  422. package/dist/spend-scoped-report.js +45 -0
  423. package/dist/spend-scoped-report.js.map +1 -0
  424. package/open-design.json +2 -2
  425. package/package.json +5 -5
  426. package/skills/12ui-design/SKILL.md +8 -4
  427. package/skills/12ui-design/improve.md +50 -3
  428. package/dist/improve-dom-anchor.d.ts.map +0 -1
  429. package/dist/improve-dom-anchor.js.map +0 -1
  430. package/dist/improve-dom-extract.d.ts.map +0 -1
  431. package/dist/improve-dom-extract.js.map +0 -1
  432. package/dist/improve-dom-neighbour.d.ts.map +0 -1
  433. package/dist/improve-dom-neighbour.js.map +0 -1
  434. package/dist/improve-dom-scale.d.ts.map +0 -1
  435. package/dist/improve-dom-scale.js.map +0 -1
  436. package/dist/improve-icon-svg.d.ts +0 -47
  437. package/dist/improve-icon-svg.d.ts.map +0 -1
  438. package/dist/improve-icon-svg.js.map +0 -1
  439. package/dist/improve-layerdoc-diff.d.ts.map +0 -1
  440. package/dist/improve-layerdoc-diff.js.map +0 -1
  441. package/dist/improve-layerdoc-types.d.ts.map +0 -1
  442. package/dist/improve-layerdoc-types.js +0 -2
  443. package/dist/improve-layerdoc-types.js.map +0 -1
  444. package/dist/improve-plan-annotated-render.d.ts.map +0 -1
  445. package/dist/improve-plan-render.d.ts.map +0 -1
  446. package/dist/improve-plan-render.js.map +0 -1
  447. package/dist/improve-raster-layers-section.d.ts.map +0 -1
  448. package/dist/improve-raster-layers-section.js.map +0 -1
  449. package/dist/improve-token-patch.d.ts.map +0 -1
  450. package/dist/improve-token-patch.js.map +0 -1
  451. /package/dist/{improve-dom-anchor.d.ts → improve-core/improve-dom-anchor.d.ts} +0 -0
  452. /package/dist/{improve-dom-extract.d.ts → improve-core/improve-dom-extract.d.ts} +0 -0
  453. /package/dist/{improve-dom-neighbour.d.ts → improve-core/improve-dom-neighbour.d.ts} +0 -0
  454. /package/dist/{improve-dom-scale.d.ts → improve-core/improve-dom-scale.d.ts} +0 -0
  455. /package/dist/{improve-layerdoc-diff.d.ts → improve-core/improve-layerdoc-diff.d.ts} +0 -0
  456. /package/dist/{improve-token-patch.d.ts → improve-core/improve-token-patch.d.ts} +0 -0
@@ -7,6 +7,33 @@ export type { ConversionOutput } from './conversion-outputs.js';
7
7
  export type ConversionStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'expired';
8
8
  export declare const LAYERDOC_V2_MEDIA_TYPE: "application/vnd.12ui.layerdoc+json;version=2";
9
9
  export declare const MAX_LAYERDOC_INPUT_BYTES: number;
10
+ /**
11
+ * How long a running operation's published heartbeat may lag before the client
12
+ * DESCRIBES the wait that just ended as stalled rather than merely unfinished.
13
+ *
14
+ * This is a sentence, never a deadline. It was a deadline until 2026-09-04, on
15
+ * the premise stated here — that it matched the deployed watchdog — and that
16
+ * premise is false in both directions:
17
+ *
18
+ * - The server's reclaim window for a stage holding an in-flight paid effect
19
+ * is `max(image timeout, text timeout) + STAGE_SILENCE_CEILING_MS`
20
+ * (`workers/api/src/conversion/stageLeaseRecovery.ts`), which is 515s in
21
+ * production. `CONVERSION_STAGE_STALE_MS = 180000` stopped deciding that
22
+ * window on 2026-08-06. Three minutes is inside the window, not at it.
23
+ * - A parent awaiting child conversions publishes no heartbeat at all:
24
+ * `deferStageForDependencies` parks its stage `queued`, so
25
+ * `heartbeatStageLease`'s `status = 'running'` guard stops matching the run
26
+ * row for the whole dependency wait. The measured median child conversion
27
+ * is 243s, so more than half of those waits look silent for longer than
28
+ * three minutes while the run is perfectly healthy.
29
+ *
30
+ * Both windows are also env-derived per deployment, so no constant compiled
31
+ * into a client can track them. `updated_at` age therefore cannot tell a dead
32
+ * run from a healthy quiet one, and this module no longer asks it to: the
33
+ * caller's own bound ends the wait, and this threshold only decides which true
34
+ * sentence the caller is handed when it does.
35
+ */
36
+ export declare const CONVERSION_RUNNING_STALE_MS: number;
10
37
  export type ConversionRevisionBoundary = {
11
38
  kind: 'pipeline' | 'package';
12
39
  admitted_pipeline_revision?: string;
@@ -36,7 +63,6 @@ export type ConversionArtifact = {
36
63
  width?: number;
37
64
  height?: number;
38
65
  };
39
- export declare const RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE: "application/vnd.12ui.responsive-html-band-manifest+json;version=1";
40
66
  export type ResponsiveArtifactCoverageBand = {
41
67
  anchor_id: 'mobile' | 'tablet' | 'compact-desktop';
42
68
  viewport_width: number;
@@ -46,19 +72,28 @@ export type ResponsiveArtifactCoverage = {
46
72
  landed: ResponsiveArtifactCoverageBand[];
47
73
  missing: ResponsiveArtifactCoverageBand[];
48
74
  };
75
+ /**
76
+ * The verified fixed page a responsive run falls back to when NO planned band
77
+ * landed. A run that landed at least one band ships degraded instead and
78
+ * carries `responsive_coverage`, so there is no partial variant here.
79
+ */
49
80
  export type ResponsiveHtmlAlternative = {
50
- disposition: 'partial_responsive';
51
- media_type: typeof RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE;
52
- coverage: ResponsiveArtifactCoverage;
53
- bands: Array<ResponsiveArtifactCoverageBand & {
54
- artifact: ConversionArtifact;
55
- }>;
56
- } | {
57
81
  disposition: 'fixed_html_alternative';
58
82
  media_type: typeof CONVERSION_OUTPUT_MEDIA_TYPES.html_fixed;
59
83
  coverage: ResponsiveArtifactCoverage;
60
84
  artifact: ConversionArtifact;
61
85
  };
86
+ /** What a SUCCEEDED responsive export says about itself when it shipped with
87
+ * fewer layouts than planned. Absent means every planned layout landed. */
88
+ export type ResponsiveCoverageDisclosure = {
89
+ revision: 'responsive-coverage-disclosure-v1';
90
+ complete: false;
91
+ planned: ResponsiveArtifactCoverageBand[];
92
+ landed: ResponsiveArtifactCoverageBand[];
93
+ missing: ResponsiveArtifactCoverageBand[];
94
+ headline: string;
95
+ detail: string;
96
+ };
62
97
  export type ResponsiveConversionPreviewFrame = {
63
98
  id: 'mobile' | 'tablet' | 'compact-desktop';
64
99
  viewport_width: number;
@@ -100,6 +135,13 @@ export type ConversionHistory = {
100
135
  type ConversionResultBase = {
101
136
  media_type: string;
102
137
  artifacts: ConversionArtifact[];
138
+ /**
139
+ * SHA-256 and byte length of the exact body the result `href` serves. Both
140
+ * are absent together on a service deployed before result digests existed;
141
+ * `publishedResultIntegrity` is the one reader of the pair.
142
+ */
143
+ sha256?: string;
144
+ size_bytes?: number;
103
145
  [key: string]: unknown;
104
146
  };
105
147
  export type ConversionResult = ConversionResultBase & ({
@@ -185,6 +227,8 @@ export type ConversionOperation = {
185
227
  error?: ConversionProblem;
186
228
  result?: ConversionResult;
187
229
  responsive_alternative?: ResponsiveHtmlAlternative;
230
+ /** Present exactly when a succeeded responsive export shipped degraded. */
231
+ responsive_coverage?: ResponsiveCoverageDisclosure;
188
232
  };
189
233
  export type ConversionClientOptions = {
190
234
  origin: string;
@@ -193,7 +237,29 @@ export type ConversionClientOptions = {
193
237
  };
194
238
  export type ConversionWaitOptions = {
195
239
  intervalMs?: number;
240
+ /**
241
+ * An overall client-side wall clock. This is deliberately distinct from the
242
+ * liveness policy below: callers that know a conversion remains live can
243
+ * keep collecting it without treating a healthy long wall as a failed
244
+ * purchase. Absent, and with no `stallTimeoutMs` either, the wait runs the
245
+ * default wall below.
246
+ */
196
247
  timeoutMs?: number;
248
+ /**
249
+ * The optional no-progress portion of this client's single wait policy:
250
+ * terminal results settle immediately; each fresh non-304 running stage or
251
+ * active-lane observation resets this bound. Queued work has no liveness
252
+ * fact, so it expires at this bound. A caller that sets it is saying it will
253
+ * wait for as long as the service keeps showing progress, so it takes no
254
+ * default wall — only `expiresAt` caps it.
255
+ */
256
+ stallTimeoutMs?: number;
257
+ /**
258
+ * When the operation's result stops being collectable. It CAPS the wall; it
259
+ * never supplies one. It is a seven-day artifact retention horizon, not a
260
+ * measure of anyone's patience, and reading it as a wall left every caller
261
+ * that passes it — which is all of them — with no effective wall at all.
262
+ */
197
263
  expiresAt?: string;
198
264
  signal?: AbortSignal;
199
265
  /**
@@ -299,13 +365,6 @@ export type ConversionDownload = {
299
365
  mediaType: string;
300
366
  };
301
367
  export type DownloadedResponsiveHtmlAlternative = {
302
- disposition: 'partial_responsive';
303
- coverage: ResponsiveArtifactCoverage;
304
- bands: Array<ResponsiveArtifactCoverageBand & {
305
- artifact: ConversionArtifact;
306
- download: ConversionDownload;
307
- }>;
308
- } | {
309
368
  disposition: 'fixed_html_alternative';
310
369
  coverage: ResponsiveArtifactCoverage;
311
370
  artifact: ConversionArtifact;
@@ -317,6 +376,26 @@ export declare class ConversionClientError extends Error {
317
376
  readonly retryAfterMs: number | null;
318
377
  constructor(message: string, status: number, problem: ConversionProblem, retryAfterMs: number | null);
319
378
  }
379
+ /**
380
+ * The caller's wait ended while the operation was still running and quiet.
381
+ *
382
+ * This is a description of the wait, not a verdict on the run. The run is
383
+ * recoverable from its own durable record, and callers must not create another
384
+ * paid conversion to escape it. The previous wording promised the reader that
385
+ * "the server watchdog" would "record recovery"; on the 2026-09-03 population
386
+ * there was nothing to recover — the runs were mid-dependency-wait and settled
387
+ * on their own — and the client exiting was the only thing that stopped anyone
388
+ * collecting them.
389
+ */
390
+ export declare class ConversionStalledError extends Error {
391
+ readonly operation: ConversionOperation;
392
+ readonly heartbeatAgeMs: number;
393
+ constructor(operation: ConversionOperation, heartbeatAgeMs: number);
394
+ }
395
+ /** Only a running operation owns a heartbeat. Queued work is admission state,
396
+ * not evidence that a stage isolate disappeared. */
397
+ export declare const runningConversionHeartbeatAgeMs: (operation: ConversionOperation, observedAt?: number) => number | null;
398
+ export declare const isRunningConversionStalled: (operation: ConversionOperation, observedAt?: number) => boolean;
320
399
  export declare class TwelveUiConversionClient {
321
400
  readonly origin: string;
322
401
  private readonly apiKey;
@@ -331,8 +410,18 @@ export declare class TwelveUiConversionClient {
331
410
  waitForConversion(id: string, options?: ConversionWaitOptions): Promise<ConversionOperation>;
332
411
  waitForEdit(id: string, options?: ConversionWaitOptions): Promise<ConversionOperation>;
333
412
  private waitForOperation;
334
- downloadResult(id: string, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
335
- downloadEditResult(id: string, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
413
+ /**
414
+ * Downloads a settled operation's result body and verifies it.
415
+ *
416
+ * Takes the OPERATION rather than its id, matching `downloadArtifact` and
417
+ * `downloadResponsiveAlternative`: the digest that says whether the bytes
418
+ * arrived intact travels on the payload, so the download and the thing it is
419
+ * checked against cannot be separated by a caller who did not think about
420
+ * it. An operation whose result publishes no digest — an older service —
421
+ * downloads exactly as it always did.
422
+ */
423
+ downloadResult(operation: ConversionOperation, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
424
+ downloadEditResult(operation: ConversionOperation, output: ConversionOutput, signal?: AbortSignal): Promise<ConversionDownload>;
336
425
  private downloadOperationResult;
337
426
  downloadArtifact(artifact: ConversionArtifact, signal?: AbortSignal): Promise<ConversionDownload>;
338
427
  downloadResponsiveAlternative(operation: ConversionOperation, signal?: AbortSignal): Promise<DownloadedResponsiveHtmlAlternative>;
@@ -1 +1 @@
1
- {"version":3,"file":"conversion-client.d.ts","sourceRoot":"","sources":["../src/conversion-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversion-client.d.ts","sourceRoot":"","sources":["../src/conversion-client.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,67 @@ import { CONVERSION_OUTPUT_MEDIA_TYPES, isConversionOutput, isLayerDocInputOutpu
7
7
  import { NO_POLL_FAILURES, annotatePollFailure, decidePollFailure, } from './operation-poll-policy.js';
8
8
  import { isResponsiveConversionQuality, parseResponsiveConversionPlan, } from './responsive-quality.js';
9
9
  import { canonicalConversionOutputProfileJson, isProjectConversionOutput, parseConversionOutputProfile, } from './project-profiles.js';
10
+ import { assertResultDigest, publishedResultIntegrity, } from './result-integrity.js';
10
11
  export const LAYERDOC_V2_MEDIA_TYPE = CONVERSION_OUTPUT_MEDIA_TYPES.layerdoc;
11
12
  export const MAX_LAYERDOC_INPUT_BYTES = 5 * 1024 * 1024;
12
- export const RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE = 'application/vnd.12ui.responsive-html-band-manifest+json;version=1';
13
+ /**
14
+ * How long a running operation's published heartbeat may lag before the client
15
+ * DESCRIBES the wait that just ended as stalled rather than merely unfinished.
16
+ *
17
+ * This is a sentence, never a deadline. It was a deadline until 2026-09-04, on
18
+ * the premise stated here — that it matched the deployed watchdog — and that
19
+ * premise is false in both directions:
20
+ *
21
+ * - The server's reclaim window for a stage holding an in-flight paid effect
22
+ * is `max(image timeout, text timeout) + STAGE_SILENCE_CEILING_MS`
23
+ * (`workers/api/src/conversion/stageLeaseRecovery.ts`), which is 515s in
24
+ * production. `CONVERSION_STAGE_STALE_MS = 180000` stopped deciding that
25
+ * window on 2026-08-06. Three minutes is inside the window, not at it.
26
+ * - A parent awaiting child conversions publishes no heartbeat at all:
27
+ * `deferStageForDependencies` parks its stage `queued`, so
28
+ * `heartbeatStageLease`'s `status = 'running'` guard stops matching the run
29
+ * row for the whole dependency wait. The measured median child conversion
30
+ * is 243s, so more than half of those waits look silent for longer than
31
+ * three minutes while the run is perfectly healthy.
32
+ *
33
+ * Both windows are also env-derived per deployment, so no constant compiled
34
+ * into a client can track them. `updated_at` age therefore cannot tell a dead
35
+ * run from a healthy quiet one, and this module no longer asks it to: the
36
+ * caller's own bound ends the wait, and this threshold only decides which true
37
+ * sentence the caller is handed when it does.
38
+ */
39
+ export const CONVERSION_RUNNING_STALE_MS = 3 * 60_000;
40
+ /**
41
+ * The wall a caller that declared no bound of its own gets.
42
+ *
43
+ * It is the documented default and it is now reachable: it used to be dead
44
+ * code, because every caller passes `expiresAt` and `expiresAt` was read as a
45
+ * wall. The longest healthy conversion this repo has measured is a 796s tall
46
+ * standard landing (`improve-convert-resilience.ts`), so twenty minutes clears
47
+ * the measured envelope with room and still ends the same day.
48
+ */
49
+ const DEFAULT_CONVERSION_WAIT_MS = 20 * 60_000;
50
+ /**
51
+ * The longest delay `setTimeout` can hold. Past it Node overflows its 32-bit
52
+ * delay, silently rewrites the delay to 1ms, and the timer fires AT ONCE — so
53
+ * an unclamped far-future bound does not mean "wait a long time", it means
54
+ * "abort immediately". Any wall derived from a caller's `expiresAt` has to be
55
+ * clamped before it reaches a timer.
56
+ */
57
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
58
+ /**
59
+ * A no-progress bound is allowed to expire only when the service has stopped
60
+ * giving us a live fact. Percent alone is intentionally not used: the service
61
+ * publishes reliable stage and lane facts even when its aggregate percent is
62
+ * unchanged for a long extraction or responsive-reference pass.
63
+ */
64
+ const conversionShowsLiveProgress = (operation) => {
65
+ if (operation.status !== 'running')
66
+ return false;
67
+ if (operation.progress?.stage)
68
+ return true;
69
+ return operation.progress?.active?.some((lane) => (lane.status === 'running' || lane.status === 'retrying')) ?? false;
70
+ };
13
71
  export class ConversionClientError extends Error {
14
72
  status;
15
73
  problem;
@@ -22,7 +80,80 @@ export class ConversionClientError extends Error {
22
80
  this.name = 'ConversionClientError';
23
81
  }
24
82
  }
83
+ /**
84
+ * The caller's wait ended while the operation was still running and quiet.
85
+ *
86
+ * This is a description of the wait, not a verdict on the run. The run is
87
+ * recoverable from its own durable record, and callers must not create another
88
+ * paid conversion to escape it. The previous wording promised the reader that
89
+ * "the server watchdog" would "record recovery"; on the 2026-09-03 population
90
+ * there was nothing to recover — the runs were mid-dependency-wait and settled
91
+ * on their own — and the client exiting was the only thing that stopped anyone
92
+ * collecting them.
93
+ */
94
+ export class ConversionStalledError extends Error {
95
+ operation;
96
+ heartbeatAgeMs;
97
+ constructor(operation, heartbeatAgeMs) {
98
+ super(`Conversion ${operation.id} did not settle before this wait ended, and is recoverable: `
99
+ + 'it is still running server-side and last published an update '
100
+ + `${Math.floor(heartbeatAgeMs / 1_000)} seconds ago. `
101
+ + 'No new conversion was started; the same purchase is still collectable.');
102
+ this.operation = operation;
103
+ this.heartbeatAgeMs = heartbeatAgeMs;
104
+ this.name = 'ConversionStalledError';
105
+ }
106
+ }
107
+ /** Only a running operation owns a heartbeat. Queued work is admission state,
108
+ * not evidence that a stage isolate disappeared. */
109
+ export const runningConversionHeartbeatAgeMs = (operation, observedAt = Date.now()) => {
110
+ if (operation.status !== 'running')
111
+ return null;
112
+ const heartbeatAt = Date.parse(operation.updated_at);
113
+ if (!Number.isFinite(heartbeatAt))
114
+ return null;
115
+ return Math.max(0, observedAt - heartbeatAt);
116
+ };
117
+ export const isRunningConversionStalled = (operation, observedAt = Date.now()) => {
118
+ const heartbeatAgeMs = runningConversionHeartbeatAgeMs(operation, observedAt);
119
+ return heartbeatAgeMs !== null && heartbeatAgeMs >= CONVERSION_RUNNING_STALE_MS;
120
+ };
25
121
  const resultAccept = (output) => CONVERSION_OUTPUT_MEDIA_TYPES[output];
122
+ /**
123
+ * Artifact bytes are asked for as bytes, never as a document.
124
+ *
125
+ * The artifact route ignores `Accept` entirely and always answers with the
126
+ * artifact's own recorded media type, so this header decides nothing about
127
+ * what is served. What it does decide is how the CDN in front of the API
128
+ * classifies the response: a request whose `Accept` begins with `text/html`
129
+ * is treated as a page navigation, and an HTML payload returned to a
130
+ * navigation is rewritten in flight — the edge appends its analytics beacon
131
+ * script. Those extra bytes are invisible to the API and fatal to the caller,
132
+ * because every HTML artifact carries a SHA-256 that can then never match
133
+ * (`docs/analysis/f44-alternative-digest-2026-09-03.md`). Downloading bytes as
134
+ * bytes is both the honest description of a digest-verified transfer and what
135
+ * keeps the payload byte-exact.
136
+ */
137
+ const ARTIFACT_DOWNLOAD_ACCEPT = 'application/octet-stream';
138
+ /**
139
+ * A result body is asked for as bytes too, for the same reason and one more.
140
+ *
141
+ * `application/octet-stream` is an alias the operation route publishes for the
142
+ * run's own output: it answers with the identical body under that output's own
143
+ * `content-type`, so nothing about the representation changes. What changes is
144
+ * that the request no longer looks like a page navigation, which is the only
145
+ * way to receive an HTML result unrewritten — asking for it as
146
+ * `text/html;profile=…` is what invited the beacon in the first place, and
147
+ * unlike an artifact there was previously no other header that named it.
148
+ * Verification below then has bytes worth verifying.
149
+ *
150
+ * Sent only when the result payload publishes a digest, because the alias and
151
+ * the digest shipped together: a service old enough to publish neither has no
152
+ * `application/octet-stream` in its negotiation table and answers 406. So the
153
+ * presence of `result.sha256` is read as "this service speaks bytes", and its
154
+ * absence keeps both the old header and the old unverified download.
155
+ */
156
+ const RESULT_DOWNLOAD_ACCEPT = 'application/octet-stream';
26
157
  const CONVERSION_POLL_BOOTSTRAP_VALIDATOR = 'W/"conversion-operation-bootstrap-v1"';
27
158
  const bytesAsArrayBuffer = (bytes) => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
28
159
  const layerDocBytes = (value) => {
@@ -190,48 +321,6 @@ const parseResponsiveAlternative = (record) => {
190
321
  const alternative = operationRecord(record.responsive_alternative);
191
322
  if (!alternative)
192
323
  throw new Error('Conversion operation has an invalid responsive alternative');
193
- if (alternative.disposition === 'partial_responsive') {
194
- assertExactRuntimeKeys(alternative, ['disposition', 'media_type', 'coverage', 'bands'], 'Responsive partial alternative');
195
- const coverage = parseAlternativeCoverage(alternative.coverage);
196
- if (alternative.media_type !== RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE
197
- || !Array.isArray(alternative.bands)
198
- || alternative.bands.length !== coverage.landed.length
199
- || coverage.landed.length === 0) {
200
- throw new Error('Conversion operation has an invalid partial responsive alternative');
201
- }
202
- const landed = new Map(coverage.landed.map((band) => [`${band.anchor_id}:${band.viewport_width}`, band]));
203
- const bands = alternative.bands.map((value, index) => {
204
- const band = operationRecord(value);
205
- if (!band)
206
- throw new Error('Conversion operation partial responsive bands do not match coverage');
207
- assertExactRuntimeKeys(band, ['anchor_id', 'viewport_width', 'artifact'], `Responsive alternative band ${index}`);
208
- const identity = parseAlternativeBandIdentity({ anchor_id: band.anchor_id, viewport_width: band.viewport_width }, `Responsive alternative band ${index}`);
209
- const key = `${identity.anchor_id}:${identity.viewport_width}`;
210
- const coverageBand = landed.get(key);
211
- if (!coverageBand) {
212
- throw new Error('Conversion operation partial responsive bands do not match coverage');
213
- }
214
- landed.delete(key);
215
- const artifact = parseAlternativeArtifact(band.artifact, `Responsive alternative band ${index}`);
216
- if (artifact.role !== 'responsive-partial-band'
217
- || artifact.width !== identity.viewport_width) {
218
- throw new Error(`Responsive alternative band ${index} artifact does not match its wrapper`);
219
- }
220
- return {
221
- ...coverageBand,
222
- artifact,
223
- };
224
- });
225
- if (landed.size !== 0) {
226
- throw new Error('Conversion operation partial responsive bands do not match coverage');
227
- }
228
- return {
229
- disposition: 'partial_responsive',
230
- media_type: RESPONSIVE_PARTIAL_HTML_MANIFEST_MEDIA_TYPE,
231
- coverage,
232
- bands,
233
- };
234
- }
235
324
  if (alternative.disposition === 'fixed_html_alternative') {
236
325
  assertExactRuntimeKeys(alternative, ['disposition', 'media_type', 'coverage', 'artifact'], 'Responsive fixed HTML alternative');
237
326
  const coverage = parseAlternativeCoverage(alternative.coverage);
@@ -547,18 +636,65 @@ export class TwelveUiConversionClient {
547
636
  }
548
637
  const intervalMs = Math.max(250, options.intervalMs ?? 2_000);
549
638
  const expiresAt = options.expiresAt ? Date.parse(options.expiresAt) : NaN;
550
- const timeoutMs = Math.max(1_000, options.timeoutMs
551
- ?? (Number.isFinite(expiresAt) ? expiresAt - Date.now() : 20 * 60_000));
552
- const deadline = Date.now() + timeoutMs;
639
+ // A caller that declared neither bound gets the default wall. A caller that
640
+ // declared a no-progress bound is deliberately unwalled: it is saying it
641
+ // will keep collecting for as long as the service keeps showing progress.
642
+ const declaredTimeoutMs = options.timeoutMs
643
+ ?? (options.stallTimeoutMs === undefined ? DEFAULT_CONVERSION_WAIT_MS : undefined);
644
+ // `expires_at` only ever shortens a wait. Waiting past the moment the result
645
+ // stops being collectable buys nothing, and a seven-day retention horizon is
646
+ // not a wall — reading it as one is what left every CLI caller unwalled.
647
+ const timeoutMs = Number.isFinite(expiresAt)
648
+ ? Math.min(declaredTimeoutMs ?? Number.POSITIVE_INFINITY, expiresAt - Date.now())
649
+ : declaredTimeoutMs;
650
+ const boundedTimeoutMs = timeoutMs === undefined || !Number.isFinite(timeoutMs)
651
+ ? undefined
652
+ : Math.max(1_000, Math.min(MAX_TIMER_DELAY_MS, timeoutMs));
653
+ const deadline = boundedTimeoutMs === undefined ? undefined : Date.now() + boundedTimeoutMs;
553
654
  const timeoutError = new Error(`Timed out waiting for conversion ${id}`);
655
+ const stallTimeoutMs = options.stallTimeoutMs === undefined
656
+ ? undefined
657
+ : Math.max(1_000, options.stallTimeoutMs);
658
+ const stallError = stallTimeoutMs === undefined
659
+ ? undefined
660
+ : new Error(`Timed out waiting for conversion ${id}: no live status or progress for ${stallTimeoutMs}ms`);
554
661
  const controller = new AbortController();
555
662
  const onAbort = () => controller.abort(options.signal?.reason ?? new Error('Conversion wait aborted'));
556
663
  options.signal?.addEventListener('abort', onAbort, { once: true });
557
- const timer = setTimeout(() => controller.abort(timeoutError), timeoutMs);
664
+ const timer = boundedTimeoutMs === undefined
665
+ ? undefined
666
+ : setTimeout(() => controller.abort(timeoutError), boundedTimeoutMs);
667
+ let stallTimer;
668
+ const noteLiveProgress = () => {
669
+ if (stallTimeoutMs === undefined || stallError === undefined)
670
+ return;
671
+ if (stallTimer !== undefined)
672
+ clearTimeout(stallTimer);
673
+ stallTimer = setTimeout(() => controller.abort(stallError), stallTimeoutMs);
674
+ };
675
+ noteLiveProgress();
558
676
  let retained = { validator: CONVERSION_POLL_BOOTSTRAP_VALIDATOR };
559
677
  let failures = NO_POLL_FAILURES;
678
+ /**
679
+ * What one of THIS wait's own bounds expiring means, said in the caller's
680
+ * terms. A caller cancel and a read failure keep their own reason: only the
681
+ * two errors this loop raises are re-described. A running operation that
682
+ * had gone quiet is recoverable and must not be re-bought, so it is named
683
+ * as such rather than reported as a bare timeout.
684
+ */
685
+ const endOfWait = (reason) => {
686
+ if (reason !== timeoutError && reason !== stallError)
687
+ return reason;
688
+ const operation = retained.operation;
689
+ if (!operation)
690
+ return reason;
691
+ const heartbeatAgeMs = runningConversionHeartbeatAgeMs(operation);
692
+ if (heartbeatAgeMs === null || heartbeatAgeMs < CONVERSION_RUNNING_STALE_MS)
693
+ return reason;
694
+ return new ConversionStalledError(operation, heartbeatAgeMs);
695
+ };
560
696
  try {
561
- while (Date.now() < deadline) {
697
+ while (deadline === undefined || Date.now() < deadline) {
562
698
  let response;
563
699
  try {
564
700
  response = await this.readConversion(id, controller.signal, retained, operationKind);
@@ -577,7 +713,9 @@ export class TwelveUiConversionClient {
577
713
  budget: failures,
578
714
  now: Date.now(),
579
715
  intervalMs,
580
- remainingMs: Math.max(0, deadline - Date.now()),
716
+ remainingMs: deadline === undefined
717
+ ? Number.MAX_SAFE_INTEGER
718
+ : Math.max(0, deadline - Date.now()),
581
719
  });
582
720
  if (verdict.kind === 'exhausted')
583
721
  throw annotatePollFailure(error, verdict.reason);
@@ -593,46 +731,82 @@ export class TwelveUiConversionClient {
593
731
  operation,
594
732
  validator: response.validator ?? CONVERSION_POLL_BOOTSTRAP_VALIDATOR,
595
733
  };
596
- options.onProgress?.(operation);
597
- if (operation.status === 'succeeded' || operation.responsive_alternative)
734
+ if (operation.status === 'succeeded' || operation.responsive_alternative) {
735
+ options.onProgress?.(operation);
598
736
  return operation;
737
+ }
599
738
  if (operation.status === 'failed' || operation.status === 'expired') {
739
+ options.onProgress?.(operation);
600
740
  throw new Error(operation.error?.detail || `Conversion ${operation.status}`);
601
741
  }
602
- const remaining = Math.max(0, deadline - Date.now());
742
+ options.onProgress?.(operation);
743
+ // A fresh live projection proves this purchase still has a server-side
744
+ // path. A 304 merely repeats retained state, so it cannot reset the
745
+ // no-progress timer.
746
+ if (!response.notModified && conversionShowsLiveProgress(operation))
747
+ noteLiveProgress();
748
+ const remaining = deadline === undefined ? Number.POSITIVE_INFINITY : Math.max(0, deadline - Date.now());
603
749
  await wait(Math.min(remaining, Math.max(intervalMs, response.retryAfterMs ?? 0)), controller.signal);
604
750
  }
605
- throw timeoutError;
751
+ throw endOfWait(timeoutError);
606
752
  }
607
753
  catch (error) {
608
754
  if (controller.signal.aborted)
609
- throw controller.signal.reason ?? error;
755
+ throw endOfWait(controller.signal.reason ?? error);
610
756
  throw error;
611
757
  }
612
758
  finally {
613
- clearTimeout(timer);
759
+ if (timer !== undefined)
760
+ clearTimeout(timer);
761
+ if (stallTimer !== undefined)
762
+ clearTimeout(stallTimer);
614
763
  options.signal?.removeEventListener('abort', onAbort);
615
764
  }
616
765
  }
617
- async downloadResult(id, output, signal) {
618
- return await this.downloadOperationResult(id, output, signal, 'convert');
619
- }
620
- async downloadEditResult(id, output, signal) {
621
- return await this.downloadOperationResult(id, output, signal, 'edit');
622
- }
623
- async downloadOperationResult(id, output, signal, operationKind) {
624
- const response = await abortable(this.fetchImpl(this.operationUrl(id, operationKind), {
625
- headers: this.headers({ Accept: resultAccept(output) }),
766
+ /**
767
+ * Downloads a settled operation's result body and verifies it.
768
+ *
769
+ * Takes the OPERATION rather than its id, matching `downloadArtifact` and
770
+ * `downloadResponsiveAlternative`: the digest that says whether the bytes
771
+ * arrived intact travels on the payload, so the download and the thing it is
772
+ * checked against cannot be separated by a caller who did not think about
773
+ * it. An operation whose result publishes no digest — an older service —
774
+ * downloads exactly as it always did.
775
+ */
776
+ async downloadResult(operation, output, signal) {
777
+ return await this.downloadOperationResult(operation, output, signal, 'convert');
778
+ }
779
+ async downloadEditResult(operation, output, signal) {
780
+ return await this.downloadOperationResult(operation, output, signal, 'edit');
781
+ }
782
+ async downloadOperationResult(operation, output, signal, operationKind) {
783
+ // The payload IS the version signal, so no probe request is needed and no
784
+ // fallback exists to get wrong. A service that publishes a result digest
785
+ // is by construction one that answers `application/octet-stream`; a
786
+ // service that publishes none predates the alias and would 406 on it, so
787
+ // it is asked exactly as it always was and its bytes go unverified —
788
+ // which is no worse than the day before, and the only thing this client
789
+ // can honestly do with bytes nobody described.
790
+ const expected = publishedResultIntegrity(operation.result);
791
+ const response = await abortable(this.fetchImpl(this.operationUrl(operation.id, operationKind), {
792
+ headers: this.headers({ Accept: expected ? RESULT_DOWNLOAD_ACCEPT : resultAccept(output) }),
626
793
  signal,
627
794
  }), signal);
628
795
  if (response.status === 202) {
629
- const operation = parseOperation(await abortable(response.json(), signal));
630
- throw new Error(`Conversion is not ready (${operation.status})`);
796
+ const pending = parseOperation(await abortable(response.json(), signal));
797
+ throw new Error(`Conversion is not ready (${pending.status})`);
631
798
  }
632
799
  if (!response.ok)
633
800
  throw await responseError('Conversion result failed', response, signal);
801
+ const bytes = new Uint8Array(await abortable(response.arrayBuffer(), signal));
802
+ // Verified before the bytes leave this method, so no caller downstream can
803
+ // write a rewritten or truncated body: on a mismatch there are no bytes to
804
+ // write, only the named failure.
805
+ if (expected) {
806
+ assertResultDigest({ conversionId: operation.id, output, expected, bytes });
807
+ }
634
808
  return {
635
- bytes: new Uint8Array(await abortable(response.arrayBuffer(), signal)),
809
+ bytes,
636
810
  mediaType: response.headers.get('content-type') || resultAccept(output),
637
811
  };
638
812
  }
@@ -642,7 +816,7 @@ export class TwelveUiConversionClient {
642
816
  throw new Error(`Conversion artifact ${artifact.id} has an untrusted href`);
643
817
  }
644
818
  const response = await abortable(this.fetchImpl(url, {
645
- headers: { Accept: artifact.media_type },
819
+ headers: { Accept: ARTIFACT_DOWNLOAD_ACCEPT },
646
820
  signal,
647
821
  }), signal);
648
822
  if (!response.ok) {
@@ -658,21 +832,11 @@ export class TwelveUiConversionClient {
658
832
  if (!alternative || operation.status !== 'failed' || operation.result) {
659
833
  throw new Error(`Conversion ${operation.id} has no responsive HTML alternative`);
660
834
  }
661
- if (alternative.disposition === 'fixed_html_alternative') {
662
- return {
663
- disposition: alternative.disposition,
664
- coverage: alternative.coverage,
665
- artifact: alternative.artifact,
666
- download: await this.downloadArtifact(alternative.artifact, signal),
667
- };
668
- }
669
835
  return {
670
836
  disposition: alternative.disposition,
671
837
  coverage: alternative.coverage,
672
- bands: await Promise.all(alternative.bands.map(async (band) => ({
673
- ...band,
674
- download: await this.downloadArtifact(band.artifact, signal),
675
- }))),
838
+ artifact: alternative.artifact,
839
+ download: await this.downloadArtifact(alternative.artifact, signal),
676
840
  };
677
841
  }
678
842
  operationUrl(id, operationKind = 'convert') {