@12ui/design 0.2.55 → 0.2.57

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 (222) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/branch-client.d.ts +2 -0
  3. package/dist/branch-client.d.ts.map +1 -1
  4. package/dist/branch-client.js +1 -0
  5. package/dist/branch-client.js.map +1 -1
  6. package/dist/cli-arguments.d.ts.map +1 -1
  7. package/dist/cli-arguments.js +2 -0
  8. package/dist/cli-arguments.js.map +1 -1
  9. package/dist/cli-conversion-derivation.d.ts +2 -1
  10. package/dist/cli-conversion-derivation.d.ts.map +1 -1
  11. package/dist/cli-conversion-derivation.js +9 -1
  12. package/dist/cli-conversion-derivation.js.map +1 -1
  13. package/dist/cli-convert-command.d.ts.map +1 -1
  14. package/dist/cli-convert-command.js +111 -16
  15. package/dist/cli-convert-command.js.map +1 -1
  16. package/dist/cli-corpus-command.d.ts.map +1 -1
  17. package/dist/cli-corpus-command.js +5 -2
  18. package/dist/cli-corpus-command.js.map +1 -1
  19. package/dist/cli-corpus-evidence.d.ts.map +1 -1
  20. package/dist/cli-corpus-evidence.js +2 -1
  21. package/dist/cli-corpus-evidence.js.map +1 -1
  22. package/dist/cli-corpus-reference-downloads.d.ts +1 -0
  23. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -1
  24. package/dist/cli-corpus-reference-downloads.js +13 -3
  25. package/dist/cli-corpus-reference-downloads.js.map +1 -1
  26. package/dist/cli-corpus-types.d.ts +2 -0
  27. package/dist/cli-corpus-types.d.ts.map +1 -1
  28. package/dist/cli-draft-command.d.ts +11 -0
  29. package/dist/cli-draft-command.d.ts.map +1 -1
  30. package/dist/cli-draft-command.js +10 -1
  31. package/dist/cli-draft-command.js.map +1 -1
  32. package/dist/cli-help/design.d.ts +2 -2
  33. package/dist/cli-help/design.d.ts.map +1 -1
  34. package/dist/cli-help/design.js +12 -2
  35. package/dist/cli-help/design.js.map +1 -1
  36. package/dist/cli-help/index.d.ts +2 -2
  37. package/dist/cli-improve-command.d.ts.map +1 -1
  38. package/dist/cli-improve-command.js +317 -70
  39. package/dist/cli-improve-command.js.map +1 -1
  40. package/dist/cli-next-command.d.ts.map +1 -1
  41. package/dist/cli-next-command.js +44 -4
  42. package/dist/cli-next-command.js.map +1 -1
  43. package/dist/cli-usage.js +2 -2
  44. package/dist/concept-input.d.ts +21 -0
  45. package/dist/concept-input.d.ts.map +1 -1
  46. package/dist/concept-input.js +32 -10
  47. package/dist/concept-input.js.map +1 -1
  48. package/dist/conversion-client.d.ts +39 -1
  49. package/dist/conversion-client.d.ts.map +1 -1
  50. package/dist/conversion-client.js +205 -3
  51. package/dist/conversion-client.js.map +1 -1
  52. package/dist/corpus-client.d.ts +7 -1
  53. package/dist/corpus-client.d.ts.map +1 -1
  54. package/dist/corpus-client.js +6 -2
  55. package/dist/corpus-client.js.map +1 -1
  56. package/dist/corpus-reference-download-retry.d.ts +68 -0
  57. package/dist/corpus-reference-download-retry.d.ts.map +1 -0
  58. package/dist/corpus-reference-download-retry.js +123 -0
  59. package/dist/corpus-reference-download-retry.js.map +1 -0
  60. package/dist/corpus-request-error.d.ts +17 -0
  61. package/dist/corpus-request-error.d.ts.map +1 -0
  62. package/dist/corpus-request-error.js +21 -0
  63. package/dist/corpus-request-error.js.map +1 -0
  64. package/dist/draft-run.d.ts +9 -0
  65. package/dist/draft-run.d.ts.map +1 -1
  66. package/dist/draft-run.js +22 -5
  67. package/dist/draft-run.js.map +1 -1
  68. package/dist/draft-workspace.d.ts +2 -1
  69. package/dist/draft-workspace.d.ts.map +1 -1
  70. package/dist/draft-workspace.js.map +1 -1
  71. package/dist/hosted-draft-identity.d.ts +1 -0
  72. package/dist/hosted-draft-identity.d.ts.map +1 -1
  73. package/dist/hosted-draft-identity.js +1 -0
  74. package/dist/hosted-draft-identity.js.map +1 -1
  75. package/dist/improve-added-specs.d.ts +9 -0
  76. package/dist/improve-added-specs.d.ts.map +1 -1
  77. package/dist/improve-added-specs.js +28 -7
  78. package/dist/improve-added-specs.js.map +1 -1
  79. package/dist/improve-bootstrap-secret.d.ts +35 -0
  80. package/dist/improve-bootstrap-secret.d.ts.map +1 -0
  81. package/dist/improve-bootstrap-secret.js +61 -0
  82. package/dist/improve-bootstrap-secret.js.map +1 -0
  83. package/dist/improve-capture-redirect.d.ts +46 -0
  84. package/dist/improve-capture-redirect.d.ts.map +1 -0
  85. package/dist/improve-capture-redirect.js +68 -0
  86. package/dist/improve-capture-redirect.js.map +1 -0
  87. package/dist/improve-concept.d.ts +14 -1
  88. package/dist/improve-concept.d.ts.map +1 -1
  89. package/dist/improve-concept.js +29 -8
  90. package/dist/improve-concept.js.map +1 -1
  91. package/dist/improve-conversion-attempts.d.ts +96 -0
  92. package/dist/improve-conversion-attempts.d.ts.map +1 -0
  93. package/dist/improve-conversion-attempts.js +93 -0
  94. package/dist/improve-conversion-attempts.js.map +1 -0
  95. package/dist/improve-conversion-stage.d.ts +14 -0
  96. package/dist/improve-conversion-stage.d.ts.map +1 -1
  97. package/dist/improve-conversion-stage.js +254 -70
  98. package/dist/improve-conversion-stage.js.map +1 -1
  99. package/dist/improve-convert-progress.d.ts +36 -0
  100. package/dist/improve-convert-progress.d.ts.map +1 -0
  101. package/dist/improve-convert-progress.js +43 -0
  102. package/dist/improve-convert-progress.js.map +1 -0
  103. package/dist/improve-convert-resilience.d.ts +116 -0
  104. package/dist/improve-convert-resilience.d.ts.map +1 -1
  105. package/dist/improve-convert-resilience.js +158 -1
  106. package/dist/improve-convert-resilience.js.map +1 -1
  107. package/dist/improve-delivery-stages.d.ts.map +1 -1
  108. package/dist/improve-delivery-stages.js +5 -0
  109. package/dist/improve-delivery-stages.js.map +1 -1
  110. package/dist/improve-dom-diff.d.ts +2 -0
  111. package/dist/improve-dom-diff.d.ts.map +1 -1
  112. package/dist/improve-dom-diff.js +7 -0
  113. package/dist/improve-dom-diff.js.map +1 -1
  114. package/dist/improve-dom-gate.d.ts +7 -0
  115. package/dist/improve-dom-gate.d.ts.map +1 -1
  116. package/dist/improve-dom-gate.js +13 -0
  117. package/dist/improve-dom-gate.js.map +1 -1
  118. package/dist/improve-generation-stages.d.ts +3 -0
  119. package/dist/improve-generation-stages.d.ts.map +1 -1
  120. package/dist/improve-generation-stages.js +56 -10
  121. package/dist/improve-generation-stages.js.map +1 -1
  122. package/dist/improve-icon-svg.d.ts +47 -0
  123. package/dist/improve-icon-svg.d.ts.map +1 -0
  124. package/dist/improve-icon-svg.js +83 -0
  125. package/dist/improve-icon-svg.js.map +1 -0
  126. package/dist/improve-kit-assets.d.ts +129 -0
  127. package/dist/improve-kit-assets.d.ts.map +1 -0
  128. package/dist/improve-kit-assets.js +333 -0
  129. package/dist/improve-kit-assets.js.map +1 -0
  130. package/dist/improve-kit-ignore.d.ts +32 -0
  131. package/dist/improve-kit-ignore.d.ts.map +1 -0
  132. package/dist/improve-kit-ignore.js +111 -0
  133. package/dist/improve-kit-ignore.js.map +1 -0
  134. package/dist/improve-kit-readme.d.ts +11 -2
  135. package/dist/improve-kit-readme.d.ts.map +1 -1
  136. package/dist/improve-kit-readme.js +282 -26
  137. package/dist/improve-kit-readme.js.map +1 -1
  138. package/dist/improve-kit-stall.d.ts +113 -0
  139. package/dist/improve-kit-stall.d.ts.map +1 -0
  140. package/dist/improve-kit-stall.js +311 -0
  141. package/dist/improve-kit-stall.js.map +1 -0
  142. package/dist/improve-kit-status.d.ts +105 -0
  143. package/dist/improve-kit-status.d.ts.map +1 -0
  144. package/dist/improve-kit-status.js +215 -0
  145. package/dist/improve-kit-status.js.map +1 -0
  146. package/dist/improve-options.d.ts +16 -1
  147. package/dist/improve-options.d.ts.map +1 -1
  148. package/dist/improve-options.js +65 -15
  149. package/dist/improve-options.js.map +1 -1
  150. package/dist/improve-plan-annotated-render.d.ts +45 -0
  151. package/dist/improve-plan-annotated-render.d.ts.map +1 -0
  152. package/dist/improve-plan-annotated-render.js +196 -0
  153. package/dist/improve-plan-annotated-render.js.map +1 -0
  154. package/dist/improve-plan-annotator.d.ts +7 -1
  155. package/dist/improve-plan-annotator.d.ts.map +1 -1
  156. package/dist/improve-plan-annotator.js +22 -45
  157. package/dist/improve-plan-annotator.js.map +1 -1
  158. package/dist/improve-raster-layers-section.d.ts +21 -0
  159. package/dist/improve-raster-layers-section.d.ts.map +1 -0
  160. package/dist/improve-raster-layers-section.js +45 -0
  161. package/dist/improve-raster-layers-section.js.map +1 -0
  162. package/dist/improve-reset.d.ts +122 -0
  163. package/dist/improve-reset.d.ts.map +1 -0
  164. package/dist/improve-reset.js +141 -0
  165. package/dist/improve-reset.js.map +1 -0
  166. package/dist/improve-run-summary.d.ts +35 -0
  167. package/dist/improve-run-summary.d.ts.map +1 -0
  168. package/dist/improve-run-summary.js +180 -0
  169. package/dist/improve-run-summary.js.map +1 -0
  170. package/dist/improve-stage-shared.d.ts +44 -1
  171. package/dist/improve-stage-shared.d.ts.map +1 -1
  172. package/dist/improve-stage-shared.js +80 -3
  173. package/dist/improve-stage-shared.js.map +1 -1
  174. package/dist/improve-stop-handler.d.ts +73 -0
  175. package/dist/improve-stop-handler.d.ts.map +1 -0
  176. package/dist/improve-stop-handler.js +126 -0
  177. package/dist/improve-stop-handler.js.map +1 -0
  178. package/dist/improve-terminal-event.d.ts +118 -0
  179. package/dist/improve-terminal-event.d.ts.map +1 -0
  180. package/dist/improve-terminal-event.js +87 -0
  181. package/dist/improve-terminal-event.js.map +1 -0
  182. package/dist/improve-token-patch.d.ts +2 -0
  183. package/dist/improve-token-patch.d.ts.map +1 -1
  184. package/dist/improve-token-patch.js +23 -5
  185. package/dist/improve-token-patch.js.map +1 -1
  186. package/dist/improve-workspace.d.ts +94 -2
  187. package/dist/improve-workspace.d.ts.map +1 -1
  188. package/dist/improve-workspace.js +19 -1
  189. package/dist/improve-workspace.js.map +1 -1
  190. package/dist/index.d.ts +2 -1
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -0
  193. package/dist/index.js.map +1 -1
  194. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  195. package/dist/legacy-skill-catalog.js +143 -0
  196. package/dist/legacy-skill-catalog.js.map +1 -1
  197. package/dist/mcp-tool-definitions.js +1 -1
  198. package/dist/mcp-tool-definitions.js.map +1 -1
  199. package/dist/mcp-tool-handler.d.ts.map +1 -1
  200. package/dist/mcp-tool-handler.js +3 -0
  201. package/dist/mcp-tool-handler.js.map +1 -1
  202. package/dist/redesign-capture.d.ts +17 -0
  203. package/dist/redesign-capture.d.ts.map +1 -1
  204. package/dist/redesign-capture.js +55 -3
  205. package/dist/redesign-capture.js.map +1 -1
  206. package/dist/responsive-alternative-materializer.d.ts +19 -0
  207. package/dist/responsive-alternative-materializer.d.ts.map +1 -0
  208. package/dist/responsive-alternative-materializer.js +76 -0
  209. package/dist/responsive-alternative-materializer.js.map +1 -0
  210. package/dist/run-journal-unfinished.d.ts +56 -0
  211. package/dist/run-journal-unfinished.d.ts.map +1 -0
  212. package/dist/run-journal-unfinished.js +126 -0
  213. package/dist/run-journal-unfinished.js.map +1 -0
  214. package/dist/run-journal.d.ts +25 -1
  215. package/dist/run-journal.d.ts.map +1 -1
  216. package/dist/run-journal.js +15 -1
  217. package/dist/run-journal.js.map +1 -1
  218. package/open-design.json +2 -2
  219. package/package.json +1 -1
  220. package/skills/12ui-design/SKILL.md +9 -1
  221. package/skills/12ui-design/improve.md +83 -6
  222. package/skills/12ui-design/inspire.md +1 -1
@@ -0,0 +1,61 @@
1
+ import { createHash } from 'node:crypto';
2
+ /**
3
+ * The bootstrap triple is a credential, and the kit is written inside a
4
+ * repository (F31).
5
+ *
6
+ * `--bootstrap 'http://host/auth/callback?token=…||**\/app'` is how a lane
7
+ * seats an authenticated session before capture, and it worked — zendesk's app
8
+ * route is the wave's first successful authenticated capture. But the value
9
+ * was persisted verbatim into `improve.json`, and `improve.json` sits at
10
+ * `.improve/<surface>/` inside the working tree. Mode 0600 does not survive a
11
+ * commit, and F17 is the standing proof that kits get swept in by `git add -A`
12
+ * (typeform, 100.8 MiB); a committed kit would put a live session token in
13
+ * history permanently.
14
+ *
15
+ * So the durable record keeps the shape and not the secret: origin and path as
16
+ * written, every query value and any fragment replaced, plus a sha256 of the
17
+ * original so a later run can tell whether it was handed the same value. The
18
+ * live triple exists only in the parsed options for the length of the capture.
19
+ * Redaction is idempotent, so re-writing an older record scrubs it.
20
+ */
21
+ export const IMPROVE_REDACTED = '<redacted>';
22
+ const redactUserInfo = (field) => field.replace(/^(https?:\/\/)[^/@]+@/iu, `$1${IMPROVE_REDACTED}@`);
23
+ /**
24
+ * String surgery rather than URL parsing: a wait glob (`**\/app?token=…`) is
25
+ * not a URL, and re-serializing one would percent-encode the placeholder.
26
+ */
27
+ const redactField = (field) => {
28
+ const hash = field.indexOf('#');
29
+ const base = redactUserInfo(hash < 0 ? field : field.slice(0, hash));
30
+ const fragment = hash < 0 ? '' : `#${IMPROVE_REDACTED}`;
31
+ const query = base.indexOf('?');
32
+ if (query < 0)
33
+ return `${base}${fragment}`;
34
+ const redacted = base.slice(query + 1).split('&').map((pair) => {
35
+ if (!pair)
36
+ return pair;
37
+ const equals = pair.indexOf('=');
38
+ return equals < 0 ? IMPROVE_REDACTED : `${pair.slice(0, equals)}=${IMPROVE_REDACTED}`;
39
+ }).join('&');
40
+ return `${base.slice(0, query)}?${redacted}${fragment}`;
41
+ };
42
+ /** The durable form of one `--bootstrap` triple: shape kept, secrets removed. */
43
+ export const redactImproveBootstrap = (value) => value
44
+ .split('|').map(redactField).join('|');
45
+ /** Identity of the original value, so a replay can tell it was handed the same one. */
46
+ export const improveBootstrapDigest = (value) => createHash('sha256')
47
+ .update(value, 'utf8').digest('hex');
48
+ /** The two record fields, built together so neither can be written without the other. */
49
+ export const improveBootstrapRecordFields = (values) => ({
50
+ bootstrap: values.map(redactImproveBootstrap),
51
+ bootstrapSha256: values.map(improveBootstrapDigest),
52
+ });
53
+ /**
54
+ * What a resume is told when the kit captured with `--bootstrap` and this run
55
+ * passed none. The record cannot replay it: the live value was never stored.
56
+ */
57
+ export const IMPROVE_BOOTSTRAP_NOT_STORED = 'This kit captured with --bootstrap, and the live'
58
+ + ' bootstrap value is never stored: improve.json keeps only a redacted form and a sha256, so a'
59
+ + ' session token cannot leak through the kit. Nothing was captured or bought.'
60
+ + ' Pass --bootstrap again with the same triple to re-capture this page.';
61
+ //# sourceMappingURL=improve-bootstrap-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-bootstrap-secret.js","sourceRoot":"","sources":["../src/improve-bootstrap-secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAC7D,yBAAyB,EACzB,KAAK,gBAAgB,GAAG,CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7D,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK;KACnE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEzC,uFAAuF;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEvC,yFAAyF;AACzF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,MAAyB,EAGpE,EAAE,CAAC,CAAC;IACJ,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC;CACpD,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,kDAAkD;MAC1F,8FAA8F;MAC9F,6EAA6E;MAC7E,uEAAuE,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { ImproveRecord } from './improve-workspace.js';
2
+ /**
3
+ * Did this run photograph the page it was asked for?
4
+ *
5
+ * Notion's app kit is the whole argument for this module. The lane seated a
6
+ * real session, ran `12ui improve http://127.0.0.1:4300/app`, and capture
7
+ * followed the app's auth redirect to `/signin?next=%2Fapp`. Both URLs were
8
+ * recorded — the requested one in `improve.json`, the captured one in
9
+ * `current.domdoc.json` — and nothing compared them, so the run drafted four
10
+ * redesigns of a sign-in dialog, converted one, anchored a plan to it, passed
11
+ * the coverage gate at 100.0% DOM, and printed "Kit ready". $0.792 against a
12
+ * page nobody asked for, with every signal green.
13
+ *
14
+ * The gate cannot catch this: coverage scores target-vs-capture agreement, and
15
+ * both halves were the sign-in page. Only the two URLs disagree, and the check
16
+ * that reads them is free and deterministic — so it runs before any paid
17
+ * stage, not after.
18
+ */
19
+ export type ImproveCaptureRedirect = {
20
+ requested: string;
21
+ captured: string;
22
+ };
23
+ /** The two URLs when they name different pages, and nothing when they agree. */
24
+ export declare const improveCaptureRedirect: (record: ImproveRecord) => ImproveCaptureRedirect | undefined;
25
+ export declare const IMPROVE_REDIRECT_CAUSE: string;
26
+ /**
27
+ * The `Captured:` line, in one place, so the kit README and the end-of-run
28
+ * summary cannot describe the same redirect in two different ways. Absent when
29
+ * the captured page is the requested one — which is every healthy run, and the
30
+ * reason this line is not printed unconditionally.
31
+ */
32
+ export declare const improveCapturedUrlLine: (record: ImproveRecord) => string | undefined;
33
+ /**
34
+ * Refuse to spend against a page nobody asked for.
35
+ *
36
+ * The capture is already written when this throws, so nothing is lost and the
37
+ * next run replays it; what does not happen is the draft purchase and every
38
+ * paid stage after it. `--allow-redirect` is the opt-in for a redirect that
39
+ * was the point — a bootstrap that deliberately ends somewhere else.
40
+ */
41
+ export declare const assertImproveCaptureNotRedirected: (args: {
42
+ record: ImproveRecord;
43
+ allowRedirect: boolean;
44
+ runDir: string;
45
+ }) => void;
46
+ //# sourceMappingURL=improve-capture-redirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-capture-redirect.d.ts","sourceRoot":"","sources":["../src/improve-capture-redirect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAkB7E,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,aAAa,KACpB,sBAAsB,GAAG,SAS3B,CAAC;AAEF,eAAO,MAAM,sBAAsB,QACiD,CAAC;AAErF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,aAAa,KAAG,MAAM,GAAG,SAMvE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,GAAI,MAAM;IACtD,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,IAaH,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { CliRefusal } from './cli-refusal.js';
2
+ /**
3
+ * Origin plus path, with the hash and a trailing slash dropped.
4
+ *
5
+ * A redirect that only adds a query (`?next=…`, a tracking parameter, a
6
+ * session id) is still the requested page; a redirect that lands on a
7
+ * different path is a different page. `/app` and `/app/` are the same page.
8
+ */
9
+ const urlIdentity = (value) => {
10
+ try {
11
+ const url = new URL(value);
12
+ return `${url.origin}${url.pathname.replace(/\/+$/u, '') || '/'}`;
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ };
18
+ /** The two URLs when they name different pages, and nothing when they agree. */
19
+ export const improveCaptureRedirect = (record) => {
20
+ if (record.input.kind !== 'url')
21
+ return undefined;
22
+ const captured = record.capture?.capturedUrl;
23
+ if (!captured)
24
+ return undefined;
25
+ const requestedIdentity = urlIdentity(record.input.value);
26
+ const capturedIdentity = urlIdentity(captured);
27
+ if (!requestedIdentity || !capturedIdentity)
28
+ return undefined;
29
+ if (requestedIdentity === capturedIdentity)
30
+ return undefined;
31
+ return { requested: record.input.value, captured };
32
+ };
33
+ export const IMPROVE_REDIRECT_CAUSE = 'The page redirected, usually an auth gate:'
34
+ + ' seat the session first (--bootstrap), or pass the page that actually renders.';
35
+ /**
36
+ * The `Captured:` line, in one place, so the kit README and the end-of-run
37
+ * summary cannot describe the same redirect in two different ways. Absent when
38
+ * the captured page is the requested one — which is every healthy run, and the
39
+ * reason this line is not printed unconditionally.
40
+ */
41
+ export const improveCapturedUrlLine = (record) => {
42
+ const redirect = improveCaptureRedirect(record);
43
+ return redirect
44
+ ? `Captured: ${redirect.captured} — NOT the requested ${redirect.requested}.`
45
+ + ` ${IMPROVE_REDIRECT_CAUSE}`
46
+ : undefined;
47
+ };
48
+ /**
49
+ * Refuse to spend against a page nobody asked for.
50
+ *
51
+ * The capture is already written when this throws, so nothing is lost and the
52
+ * next run replays it; what does not happen is the draft purchase and every
53
+ * paid stage after it. `--allow-redirect` is the opt-in for a redirect that
54
+ * was the point — a bootstrap that deliberately ends somewhere else.
55
+ */
56
+ export const assertImproveCaptureNotRedirected = (args) => {
57
+ const redirect = improveCaptureRedirect(args.record);
58
+ if (!redirect || args.allowRedirect)
59
+ return;
60
+ throw new CliRefusal(`Capture landed on ${redirect.captured}, not the requested ${redirect.requested}.`
61
+ + ` ${IMPROVE_REDIRECT_CAUSE}`
62
+ + ' Nothing was bought: improve stops here rather than draft, convert and plan'
63
+ + ' a page you did not ask for — a coverage gate cannot catch it, because it'
64
+ + ' scores the target against the capture and both would be the wrong page.'
65
+ + ` The capture is kept in ${args.runDir} and replays on the next run.`
66
+ + ' Pass --allow-redirect to improve the page the redirect landed on.', 'improve_capture_redirected');
67
+ };
68
+ //# sourceMappingURL=improve-capture-redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-capture-redirect.js","sourceRoot":"","sources":["../src/improve-capture-redirect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuB9C;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,CAAC,KAAa,EAAsB,EAAE;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAAqB,EACe,EAAE;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;IAC7C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,iBAAiB,KAAK,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C;MAC9E,gFAAgF,CAAC;AAErF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAqB,EAAsB,EAAE;IAClF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,QAAQ;QACb,CAAC,CAAC,aAAa,QAAQ,CAAC,QAAQ,wBAAwB,QAAQ,CAAC,SAAS,GAAG;cACzE,IAAI,sBAAsB,EAAE;QAChC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,IAIjD,EAAQ,EAAE;IACT,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO;IAC5C,MAAM,IAAI,UAAU,CAClB,qBAAqB,QAAQ,CAAC,QAAQ,uBAAuB,QAAQ,CAAC,SAAS,GAAG;UAChF,IAAI,sBAAsB,EAAE;UAC5B,6EAA6E;UAC7E,2EAA2E;UAC3E,0EAA0E;UAC1E,2BAA2B,IAAI,CAAC,MAAM,+BAA+B;UACrE,oEAAoE,EACtE,4BAA4B,CAC7B,CAAC;AACJ,CAAC,CAAC"}
@@ -4,7 +4,20 @@
4
4
  * did the opposite: the image model filled it with invented product content.
5
5
  */
6
6
  export declare const IMPROVE_NO_INVENTION_CLAUSE = "Keep all real content, data, and controls; invent nothing.";
7
- /** The real steering limit after reserving room for the mandatory harness. */
7
+ /**
8
+ * The real steering limit after reserving room for the mandatory harness.
9
+ *
10
+ * The SERVICE bound is `MAX_CREATE_CONCEPT_CHARACTERS` — 1200, on the whole
11
+ * concept — and improve does not get to spend all of it: the style preamble,
12
+ * the `Direction: ` prefix and the no-invention clause are part of the concept
13
+ * it sends, so what is left is the flag's budget. Nothing here can be raised to
14
+ * 1200 without dropping the guardrails that keep the draw from inventing UI.
15
+ * The number is therefore stated wherever a caller writes a direction — the
16
+ * usage line, `improve.md`, and the refusal below, which also names the length
17
+ * of what was written (F7).
18
+ */
8
19
  export declare const IMPROVE_DIRECTION_MAX_CHARACTERS: number;
20
+ /** Where cut detail belongs, stated once for the refusal and the skill. */
21
+ export declare const IMPROVE_DIRECTION_TRIM_HINT: string;
9
22
  export declare const buildImproveConcept: (direction?: string) => string;
10
23
  //# sourceMappingURL=improve-concept.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"improve-concept.d.ts","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,+DAA+D,CAAC;AAexG,8EAA8E;AAC9E,eAAO,MAAM,gCAAgC,QAAuD,CAAC;AAIrG,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,KAAG,MA2BxD,CAAC"}
1
+ {"version":3,"file":"improve-concept.d.ts","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,+DAA+D,CAAC;AAexG;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gCAAgC,QAAuD,CAAC;AAErG,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B,QACG,CAAC;AAI5C,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,KAAG,MAkCxD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { CliRefusal } from './cli-refusal.js';
2
- import { MAX_CONCEPT_CHARACTERS, readConceptValue } from './concept-input.js';
2
+ import { conceptCharacterCount, conceptOverLimitMessage, MAX_CONCEPT_CHARACTERS, normalizeConceptText, readConceptValue, } from './concept-input.js';
3
3
  /**
4
4
  * F9 found that detailed, style-anchored direction reliably beats a vague
5
5
  * "make it better" instruction. Naming an empty or thin region as the defect
@@ -17,15 +17,36 @@ const RESERVED_CONCEPT_CHARACTERS = [
17
17
  DIRECTION_PREFIX,
18
18
  IMPROVE_NO_INVENTION_CLAUSE,
19
19
  ].join('\n\n').length;
20
- /** The real steering limit after reserving room for the mandatory harness. */
20
+ /**
21
+ * The real steering limit after reserving room for the mandatory harness.
22
+ *
23
+ * The SERVICE bound is `MAX_CREATE_CONCEPT_CHARACTERS` — 1200, on the whole
24
+ * concept — and improve does not get to spend all of it: the style preamble,
25
+ * the `Direction: ` prefix and the no-invention clause are part of the concept
26
+ * it sends, so what is left is the flag's budget. Nothing here can be raised to
27
+ * 1200 without dropping the guardrails that keep the draw from inventing UI.
28
+ * The number is therefore stated wherever a caller writes a direction — the
29
+ * usage line, `improve.md`, and the refusal below, which also names the length
30
+ * of what was written (F7).
31
+ */
21
32
  export const IMPROVE_DIRECTION_MAX_CHARACTERS = MAX_CONCEPT_CHARACTERS - RESERVED_CONCEPT_CHARACTERS;
33
+ /** Where cut detail belongs, stated once for the refusal and the skill. */
34
+ export const IMPROVE_DIRECTION_TRIM_HINT = 'Keep the intended hierarchy, rhythm, typography,'
35
+ + ' surfaces, color, controls, and mood.';
22
36
  const FABRICATION_TRIGGER = /\b(?:empty|emptiness|underfilled|under-filled|thin[ -]content|lack of content|missing content|dead space|blank (?:area|region|half|section))\b/iu;
23
37
  export const buildImproveConcept = (direction) => {
24
- const steering = direction?.replace(/\s+/gu, ' ').trim() ?? '';
25
- if ([...steering].length > IMPROVE_DIRECTION_MAX_CHARACTERS) {
26
- throw new CliRefusal(`--direction accepts at most ${IMPROVE_DIRECTION_MAX_CHARACTERS} characters because improve`
27
- + ` reserves the rest of the ${MAX_CONCEPT_CHARACTERS}-character concept for its style and`
28
- + ' no-invention guardrails.', 'improve_direction_too_long');
38
+ const steering = normalizeConceptText(direction ?? '');
39
+ if (conceptCharacterCount(steering) > IMPROVE_DIRECTION_MAX_CHARACTERS) {
40
+ throw new CliRefusal(conceptOverLimitMessage({
41
+ flag: '--direction',
42
+ raw: direction ?? '',
43
+ normalized: steering,
44
+ limit: IMPROVE_DIRECTION_MAX_CHARACTERS,
45
+ because: `improve reserves the other ${RESERVED_CONCEPT_CHARACTERS} of the`
46
+ + ` ${MAX_CONCEPT_CHARACTERS}-character concept for its style and no-invention`
47
+ + ' guardrails, so --direction is what is left.',
48
+ trimHint: IMPROVE_DIRECTION_TRIM_HINT,
49
+ }), 'improve_direction_too_long');
29
50
  }
30
51
  if (FABRICATION_TRIGGER.test(steering)) {
31
52
  throw new CliRefusal('--direction must describe the intended style and hierarchy, not emptiness or thin content;'
@@ -39,7 +60,7 @@ export const buildImproveConcept = (direction) => {
39
60
  return readConceptValue({
40
61
  value: concept,
41
62
  flag: '--direction',
42
- trimHint: 'Keep the intended hierarchy, rhythm, typography, surfaces, color, controls, and mood.',
63
+ trimHint: IMPROVE_DIRECTION_TRIM_HINT,
43
64
  });
44
65
  };
45
66
  //# sourceMappingURL=improve-concept.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"improve-concept.js","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,4DAA4D,CAAC;AAExG,MAAM,sBAAsB,GAAG;IAC7B,gJAAgJ;IAChJ,4IAA4I;IAC5I,0JAA0J;CAC3J,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,2BAA2B,GAAG;IAClC,sBAAsB;IACtB,gBAAgB;IAChB,2BAA2B;CAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAEtB,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,GAAG,2BAA2B,CAAC;AAErG,MAAM,mBAAmB,GAAG,kJAAkJ,CAAC;AAE/K,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAkB,EAAU,EAAE;IAChE,MAAM,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,gCAAgC,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAClB,+BAA+B,gCAAgC,6BAA6B;cAC1F,6BAA6B,sBAAsB,sCAAsC;cACzF,2BAA2B,EAC7B,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAClB,4FAA4F;cAC1F,+CAA+C,EACjD,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG;QACd,sBAAsB;QACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,2BAA2B;KAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,gBAAgB,CAAC;QACtB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,uFAAuF;KAClG,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"improve-concept.js","sourceRoot":"","sources":["../src/improve-concept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,4DAA4D,CAAC;AAExG,MAAM,sBAAsB,GAAG;IAC7B,gJAAgJ;IAChJ,4IAA4I;IAC5I,0JAA0J;CAC3J,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,2BAA2B,GAAG;IAClC,sBAAsB;IACtB,gBAAgB;IAChB,2BAA2B;CAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAEtB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,GAAG,2BAA2B,CAAC;AAErG,2EAA2E;AAC3E,MAAM,CAAC,MAAM,2BAA2B,GAAG,kDAAkD;MACzF,uCAAuC,CAAC;AAE5C,MAAM,mBAAmB,GAAG,kJAAkJ,CAAC;AAE/K,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAkB,EAAU,EAAE;IAChE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,qBAAqB,CAAC,QAAQ,CAAC,GAAG,gCAAgC,EAAE,CAAC;QACvE,MAAM,IAAI,UAAU,CAClB,uBAAuB,CAAC;YACtB,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,SAAS,IAAI,EAAE;YACpB,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,gCAAgC;YACvC,OAAO,EAAE,8BAA8B,2BAA2B,SAAS;kBACvE,IAAI,sBAAsB,mDAAmD;kBAC7E,8CAA8C;YAClD,QAAQ,EAAE,2BAA2B;SACtC,CAAC,EACF,4BAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAClB,4FAA4F;cAC1F,+CAA+C,EACjD,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG;QACd,sBAAsB;QACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,2BAA2B;KAC5B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,gBAAgB,CAAC;QACtB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,2BAA2B;KACtC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { ImproveRecord } from './improve-workspace.js';
2
+ /**
3
+ * The kit's ledger of conversions dispatched under a key that is not the base
4
+ * key — written BEFORE the dispatch, so a later invocation can rebuild it.
5
+ *
6
+ * THE MONEY LEAK THIS CLOSES. `--fresh` dispatched under
7
+ * `${baseKey}:fresh:${randomUUID()}` and nothing durable recorded that nonce.
8
+ * A fresh conversion that was stopped or that stalled could therefore never be
9
+ * reached again: `--from convert` rebuilt the BASE key, the server's dedupe
10
+ * attached it to the older recorded conversion, and the fresh one kept running
11
+ * and kept billing with nothing able to collect it. The stall retry had the
12
+ * same shape and was patched by DERIVING its key from the count of stall
13
+ * abandonments (`improveConvertStallCount`), which only becomes true once the
14
+ * stalled conversion has been abandoned — a retry stopped mid-flight was still
15
+ * unreachable, because the conversion it was waiting on had not been abandoned
16
+ * by anything.
17
+ *
18
+ * So both now use ONE mechanism. The exact key goes on the record before the
19
+ * conversion is dispatched, the hosted id joins it as soon as the run reports
20
+ * one, and a resume prefers the newest attempt nothing has abandoned. The
21
+ * derived stall key stays as the fallback for kits written before this ledger.
22
+ *
23
+ * WHY THE BASE-KEY ATTEMPT IS IN HERE TOO (F19). It was left out because it is
24
+ * the deterministic identity every invocation recomputes from the winner, so
25
+ * it needs no record to be rebuilt. But a kit whose ordinary conversion stalled
26
+ * then held no durable trace of it at all: pipedrive's `improve.json` priced
27
+ * nothing for two parent conversions, and the lane could not state its own
28
+ * spend. Every dispatch is recorded, with the price it may cost, before it
29
+ * happens. One extra durable write buys a receipt.
30
+ *
31
+ * WHAT THE STOP PATH OWES. Nothing. Because the key is recorded before the
32
+ * dispatch, a run killed mid-attempt is already resumable from what is on
33
+ * disk, and `improve-stop-handler.ts` still writes no `improve.json` of its
34
+ * own — it reads the durable record after its journal end line and reports it.
35
+ */
36
+ export type ImproveConversionAttempt = NonNullable<ImproveRecord['conversionAttempts']>[number];
37
+ export type ImproveConversionAttemptReason = ImproveConversionAttempt['reason'];
38
+ /** `--fresh`: one conversion of the same winner under a key nothing replays. */
39
+ export declare const improveFreshConversionKey: (baseKey: string, nonce: string) => string;
40
+ /**
41
+ * The attempt a resume rebuilds its key from: the newest one still open.
42
+ *
43
+ * Newest rather than oldest, for the reason the stall retry already states —
44
+ * the newest conversion is the one that is running and billing now, and
45
+ * re-attaching to it is the only way to get anything back for it.
46
+ */
47
+ export declare const openImproveConversionAttempt: (record: ImproveRecord) => ImproveConversionAttempt | undefined;
48
+ /** How many conversions of this winner the ledger says one reason has bought. */
49
+ export declare const improveConversionAttemptCount: (record: ImproveRecord, reason: ImproveConversionAttemptReason) => number;
50
+ /**
51
+ * Walk away from every attempt still open. The ids are returned rather than
52
+ * written to `abandonedConversions` here, because that ledger is owned by
53
+ * `improve-reset.ts` and says its own sentence about billing.
54
+ */
55
+ export declare const abandonImproveConversionAttempts: (record: ImproveRecord, args: {
56
+ reason: string;
57
+ at?: string;
58
+ /** The attempt this invocation is about to dispatch, which is not abandoned. */
59
+ except?: string;
60
+ }) => {
61
+ record: ImproveRecord;
62
+ abandoned: ImproveConversionAttempt[];
63
+ };
64
+ /**
65
+ * Record a dispatch, deduped by key so replaying the same attempt — the
66
+ * temporarily-unavailable retry re-enters the whole stage — is one entry and
67
+ * not two. `supersedes` is the reason written against every OTHER open
68
+ * attempt: `--fresh` replaces whatever this kit was waiting on, and leaving
69
+ * that one open would send the next resume back to it.
70
+ */
71
+ export declare const startImproveConversionAttempt: (record: ImproveRecord, args: {
72
+ key: string;
73
+ reason: ImproveConversionAttemptReason;
74
+ at?: string;
75
+ supersedes?: string;
76
+ /** What this conversion may cost, recorded before it is dispatched (F19). */
77
+ priceCeilingUsd?: number;
78
+ }) => {
79
+ record: ImproveRecord;
80
+ superseded: ImproveConversionAttempt[];
81
+ };
82
+ /**
83
+ * The hosted id, the first time the conversion reports one. First wins: the
84
+ * dispatch names the conversion this key bought, and a fused run's later ids
85
+ * belong to its export half.
86
+ */
87
+ export declare const noteImproveConversionAttemptId: (record: ImproveRecord, args: {
88
+ key: string;
89
+ conversionId: string;
90
+ }) => ImproveRecord;
91
+ /** The attempt delivered. It is no longer what a resume should re-attach to. */
92
+ export declare const settleImproveConversionAttempt: (record: ImproveRecord, args: {
93
+ key?: string;
94
+ at?: string;
95
+ }) => ImproveRecord;
96
+ //# sourceMappingURL=improve-conversion-attempts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-conversion-attempts.d.ts","sourceRoot":"","sources":["../src/improve-conversion-attempts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChG,MAAM,MAAM,8BAA8B,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAEhF,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAE1E,CAAC;AAOF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GACvC,QAAQ,aAAa,KACpB,wBAAwB,GAAG,SAE7B,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,aAAa,EACrB,QAAQ,8BAA8B,KACrC,MAAiG,CAAC;AAErG;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,aAAa,EAAE,MAAM;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,KAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,wBAAwB,EAAE,CAAA;CAWjE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,GAAI,QAAQ,aAAa,EAAE,MAAM;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,8BAA8B,CAAC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,KAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,wBAAwB,EAAE,CAAA;CAqBlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,aAAa,EAAE,MAAM;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB,KAAG,aAaH,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,8BAA8B,GAAI,QAAQ,aAAa,EAAE,MAAM;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,KAAG,aAaH,CAAC"}
@@ -0,0 +1,93 @@
1
+ /** `--fresh`: one conversion of the same winner under a key nothing replays. */
2
+ export const improveFreshConversionKey = (baseKey, nonce) => (`${baseKey}:fresh:${nonce}`);
3
+ /** Still owed a result: dispatched, and neither settled nor walked away from. */
4
+ const isOpen = (attempt) => (attempt.abandonedAt === undefined && attempt.settledAt === undefined);
5
+ /**
6
+ * The attempt a resume rebuilds its key from: the newest one still open.
7
+ *
8
+ * Newest rather than oldest, for the reason the stall retry already states —
9
+ * the newest conversion is the one that is running and billing now, and
10
+ * re-attaching to it is the only way to get anything back for it.
11
+ */
12
+ export const openImproveConversionAttempt = (record) => ([...(record.conversionAttempts ?? [])].reverse().find(isOpen));
13
+ /** How many conversions of this winner the ledger says one reason has bought. */
14
+ export const improveConversionAttemptCount = (record, reason) => (record.conversionAttempts ?? []).filter((attempt) => attempt.reason === reason).length;
15
+ /**
16
+ * Walk away from every attempt still open. The ids are returned rather than
17
+ * written to `abandonedConversions` here, because that ledger is owned by
18
+ * `improve-reset.ts` and says its own sentence about billing.
19
+ */
20
+ export const abandonImproveConversionAttempts = (record, args) => {
21
+ const at = args.at ?? new Date().toISOString();
22
+ const abandoned = [];
23
+ const attempts = (record.conversionAttempts ?? []).map((attempt) => {
24
+ if (!isOpen(attempt) || attempt.key === args.except)
25
+ return attempt;
26
+ const closed = { ...attempt, abandonedAt: at, abandonedReason: args.reason };
27
+ abandoned.push(closed);
28
+ return closed;
29
+ });
30
+ if (abandoned.length === 0)
31
+ return { record, abandoned };
32
+ return { record: { ...record, conversionAttempts: attempts }, abandoned };
33
+ };
34
+ /**
35
+ * Record a dispatch, deduped by key so replaying the same attempt — the
36
+ * temporarily-unavailable retry re-enters the whole stage — is one entry and
37
+ * not two. `supersedes` is the reason written against every OTHER open
38
+ * attempt: `--fresh` replaces whatever this kit was waiting on, and leaving
39
+ * that one open would send the next resume back to it.
40
+ */
41
+ export const startImproveConversionAttempt = (record, args) => {
42
+ const at = args.at ?? new Date().toISOString();
43
+ const rotated = args.supersedes === undefined
44
+ ? { record, abandoned: [] }
45
+ : abandonImproveConversionAttempts(record, { reason: args.supersedes, at, except: args.key });
46
+ const attempts = rotated.record.conversionAttempts ?? [];
47
+ if (attempts.some((attempt) => attempt.key === args.key)) {
48
+ return { record: rotated.record, superseded: rotated.abandoned };
49
+ }
50
+ return {
51
+ record: {
52
+ ...rotated.record,
53
+ conversionAttempts: [...attempts, {
54
+ key: args.key,
55
+ reason: args.reason,
56
+ dispatchedAt: at,
57
+ ...(args.priceCeilingUsd === undefined ? {} : { priceCeilingUsd: args.priceCeilingUsd }),
58
+ }],
59
+ },
60
+ superseded: rotated.abandoned,
61
+ };
62
+ };
63
+ /**
64
+ * The hosted id, the first time the conversion reports one. First wins: the
65
+ * dispatch names the conversion this key bought, and a fused run's later ids
66
+ * belong to its export half.
67
+ */
68
+ export const noteImproveConversionAttemptId = (record, args) => {
69
+ const attempts = record.conversionAttempts ?? [];
70
+ if (!attempts.some((attempt) => attempt.key === args.key && attempt.conversionId === undefined)) {
71
+ return record;
72
+ }
73
+ return {
74
+ ...record,
75
+ conversionAttempts: attempts.map((attempt) => (attempt.key === args.key && attempt.conversionId === undefined
76
+ ? { ...attempt, conversionId: args.conversionId }
77
+ : attempt)),
78
+ };
79
+ };
80
+ /** The attempt delivered. It is no longer what a resume should re-attach to. */
81
+ export const settleImproveConversionAttempt = (record, args) => {
82
+ const key = args.key;
83
+ const attempts = record.conversionAttempts ?? [];
84
+ if (key === undefined || !attempts.some((attempt) => attempt.key === key && isOpen(attempt))) {
85
+ return record;
86
+ }
87
+ const at = args.at ?? new Date().toISOString();
88
+ return {
89
+ ...record,
90
+ conversionAttempts: attempts.map((attempt) => (attempt.key === key && isOpen(attempt) ? { ...attempt, settledAt: at } : attempt)),
91
+ };
92
+ };
93
+ //# sourceMappingURL=improve-conversion-attempts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-conversion-attempts.js","sourceRoot":"","sources":["../src/improve-conversion-attempts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { runConversionCommand } from './cli-convert-command.js';
2
+ import { type ImproveConvertProgress } from './improve-convert-progress.js';
2
3
  import type { ImproveOptions } from './improve-options.js';
3
4
  import { type ImproveCommandDependencies } from './improve-stage-shared.js';
4
5
  import type { RunJournalNotes } from './run-journal.js';
@@ -13,6 +14,19 @@ export declare const runImproveConversion: (args: {
13
14
  key: string;
14
15
  runner: typeof runConversionCommand;
15
16
  journal?: RunJournalNotes;
17
+ /**
18
+ * The hosted id, the first time this conversion reports one. It fires from
19
+ * the dispatch note `cli-convert-command.ts` makes immediately after
20
+ * `createConversion`, which is what lets the attempt ledger join a key to the
21
+ * conversion it bought while that conversion is still running.
22
+ */
23
+ onConversionId?: (id: string) => void;
24
+ /**
25
+ * The visible tick over an otherwise silent wait (F8). The nested convert
26
+ * runs quiet, so without this the terminal shows nothing between dispatch
27
+ * and the terminal line, however long the hosted work takes.
28
+ */
29
+ progress?: ImproveConvertProgress;
16
30
  }) => Promise<{
17
31
  artifacts: string[];
18
32
  purchaseIds: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"improve-conversion-stage.d.ts","sourceRoot":"","sources":["../src/improve-conversion-stage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAahE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnG,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;IAC3C,KAAK,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B,KAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAoC3E,CAAC;AA6CF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,0BAA0B,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,KAAG,OAAO,CAAC,aAAa,CAqIxB,CAAC"}
1
+ {"version":3,"file":"improve-conversion-stage.d.ts","sourceRoot":"","sources":["../src/improve-conversion-stage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AA6BvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAIL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnG,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;IAC3C,KAAK,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,oBAAoB,CAAC;IACpC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,KAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA6C3E,CAAC;AAmCF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,0BAA0B,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,KAAG,OAAO,CAAC,aAAa,CA8TxB,CAAC"}