@12ui/design 0.2.54 → 0.2.56

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 (132) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/cli-arguments.d.ts.map +1 -1
  3. package/dist/cli-arguments.js +2 -0
  4. package/dist/cli-arguments.js.map +1 -1
  5. package/dist/cli-conversion-derivation.d.ts +2 -1
  6. package/dist/cli-conversion-derivation.d.ts.map +1 -1
  7. package/dist/cli-conversion-derivation.js +9 -1
  8. package/dist/cli-conversion-derivation.js.map +1 -1
  9. package/dist/cli-convert-command.js +1 -1
  10. package/dist/cli-convert-command.js.map +1 -1
  11. package/dist/cli-draft-command.d.ts +11 -0
  12. package/dist/cli-draft-command.d.ts.map +1 -1
  13. package/dist/cli-draft-command.js +10 -1
  14. package/dist/cli-draft-command.js.map +1 -1
  15. package/dist/cli-help/design.d.ts +1 -1
  16. package/dist/cli-help/design.d.ts.map +1 -1
  17. package/dist/cli-help/design.js +8 -0
  18. package/dist/cli-help/design.js.map +1 -1
  19. package/dist/cli-help/index.d.ts +1 -1
  20. package/dist/cli-improve-command.d.ts.map +1 -1
  21. package/dist/cli-improve-command.js +257 -57
  22. package/dist/cli-improve-command.js.map +1 -1
  23. package/dist/cli-next-command.d.ts.map +1 -1
  24. package/dist/cli-next-command.js +44 -4
  25. package/dist/cli-next-command.js.map +1 -1
  26. package/dist/cli-usage.js +1 -1
  27. package/dist/improve-conversion-attempts.d.ts +92 -0
  28. package/dist/improve-conversion-attempts.d.ts.map +1 -0
  29. package/dist/improve-conversion-attempts.js +88 -0
  30. package/dist/improve-conversion-attempts.js.map +1 -0
  31. package/dist/improve-conversion-stage.d.ts +35 -0
  32. package/dist/improve-conversion-stage.d.ts.map +1 -0
  33. package/dist/improve-conversion-stage.js +381 -0
  34. package/dist/improve-conversion-stage.js.map +1 -0
  35. package/dist/improve-convert-resilience.d.ts +148 -0
  36. package/dist/improve-convert-resilience.d.ts.map +1 -0
  37. package/dist/improve-convert-resilience.js +266 -0
  38. package/dist/improve-convert-resilience.js.map +1 -0
  39. package/dist/improve-delivery-stages.d.ts +0 -6
  40. package/dist/improve-delivery-stages.d.ts.map +1 -1
  41. package/dist/improve-delivery-stages.js +5 -103
  42. package/dist/improve-delivery-stages.js.map +1 -1
  43. package/dist/improve-dom-diff.d.ts +2 -0
  44. package/dist/improve-dom-diff.d.ts.map +1 -1
  45. package/dist/improve-dom-diff.js +7 -0
  46. package/dist/improve-dom-diff.js.map +1 -1
  47. package/dist/improve-dom-gate.d.ts +7 -0
  48. package/dist/improve-dom-gate.d.ts.map +1 -1
  49. package/dist/improve-dom-gate.js +13 -0
  50. package/dist/improve-dom-gate.js.map +1 -1
  51. package/dist/improve-generation-stages.d.ts +3 -0
  52. package/dist/improve-generation-stages.d.ts.map +1 -1
  53. package/dist/improve-generation-stages.js +24 -7
  54. package/dist/improve-generation-stages.js.map +1 -1
  55. package/dist/improve-kit-assets.d.ts +129 -0
  56. package/dist/improve-kit-assets.d.ts.map +1 -0
  57. package/dist/improve-kit-assets.js +333 -0
  58. package/dist/improve-kit-assets.js.map +1 -0
  59. package/dist/improve-kit-readme.d.ts +11 -2
  60. package/dist/improve-kit-readme.d.ts.map +1 -1
  61. package/dist/improve-kit-readme.js +192 -21
  62. package/dist/improve-kit-readme.js.map +1 -1
  63. package/dist/improve-kit-stall.d.ts +67 -0
  64. package/dist/improve-kit-stall.d.ts.map +1 -0
  65. package/dist/improve-kit-stall.js +159 -0
  66. package/dist/improve-kit-stall.js.map +1 -0
  67. package/dist/improve-kit-status.d.ts +69 -0
  68. package/dist/improve-kit-status.d.ts.map +1 -0
  69. package/dist/improve-kit-status.js +145 -0
  70. package/dist/improve-kit-status.js.map +1 -0
  71. package/dist/improve-options.d.ts +13 -1
  72. package/dist/improve-options.d.ts.map +1 -1
  73. package/dist/improve-options.js +77 -15
  74. package/dist/improve-options.js.map +1 -1
  75. package/dist/improve-plan-annotated-render.d.ts +33 -0
  76. package/dist/improve-plan-annotated-render.d.ts.map +1 -0
  77. package/dist/improve-plan-annotated-render.js +175 -0
  78. package/dist/improve-plan-annotated-render.js.map +1 -0
  79. package/dist/improve-plan-annotator.d.ts +2 -1
  80. package/dist/improve-plan-annotator.d.ts.map +1 -1
  81. package/dist/improve-plan-annotator.js +21 -45
  82. package/dist/improve-plan-annotator.js.map +1 -1
  83. package/dist/improve-raster-layers-section.d.ts +21 -0
  84. package/dist/improve-raster-layers-section.d.ts.map +1 -0
  85. package/dist/improve-raster-layers-section.js +45 -0
  86. package/dist/improve-raster-layers-section.js.map +1 -0
  87. package/dist/improve-reset.d.ts +122 -0
  88. package/dist/improve-reset.d.ts.map +1 -0
  89. package/dist/improve-reset.js +141 -0
  90. package/dist/improve-reset.js.map +1 -0
  91. package/dist/improve-run-summary.d.ts +35 -0
  92. package/dist/improve-run-summary.d.ts.map +1 -0
  93. package/dist/improve-run-summary.js +134 -0
  94. package/dist/improve-run-summary.js.map +1 -0
  95. package/dist/improve-stage-runners.d.ts +2 -1
  96. package/dist/improve-stage-runners.d.ts.map +1 -1
  97. package/dist/improve-stage-runners.js +2 -1
  98. package/dist/improve-stage-runners.js.map +1 -1
  99. package/dist/improve-stage-shared.d.ts +6 -0
  100. package/dist/improve-stage-shared.d.ts.map +1 -1
  101. package/dist/improve-stage-shared.js.map +1 -1
  102. package/dist/improve-stop-handler.d.ts +73 -0
  103. package/dist/improve-stop-handler.d.ts.map +1 -0
  104. package/dist/improve-stop-handler.js +126 -0
  105. package/dist/improve-stop-handler.js.map +1 -0
  106. package/dist/improve-terminal-event.d.ts +118 -0
  107. package/dist/improve-terminal-event.d.ts.map +1 -0
  108. package/dist/improve-terminal-event.js +81 -0
  109. package/dist/improve-terminal-event.js.map +1 -0
  110. package/dist/improve-workspace.d.ts +25 -0
  111. package/dist/improve-workspace.d.ts.map +1 -1
  112. package/dist/improve-workspace.js +14 -0
  113. package/dist/improve-workspace.js.map +1 -1
  114. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  115. package/dist/legacy-skill-catalog.js +23 -3
  116. package/dist/legacy-skill-catalog.js.map +1 -1
  117. package/dist/redesign-capture.d.ts +16 -0
  118. package/dist/redesign-capture.d.ts.map +1 -1
  119. package/dist/redesign-capture.js +49 -3
  120. package/dist/redesign-capture.js.map +1 -1
  121. package/dist/run-journal-unfinished.d.ts +56 -0
  122. package/dist/run-journal-unfinished.d.ts.map +1 -0
  123. package/dist/run-journal-unfinished.js +126 -0
  124. package/dist/run-journal-unfinished.js.map +1 -0
  125. package/dist/run-journal.d.ts +25 -1
  126. package/dist/run-journal.d.ts.map +1 -1
  127. package/dist/run-journal.js +15 -1
  128. package/dist/run-journal.js.map +1 -1
  129. package/open-design.json +2 -2
  130. package/package.json +1 -1
  131. package/skills/12ui-design/SKILL.md +2 -0
  132. package/skills/12ui-design/improve.md +68 -5
@@ -1,9 +1,16 @@
1
- import { createHash } from 'node:crypto';
1
+ import { createHash, randomUUID } from 'node:crypto';
2
2
  import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
3
4
  import { CliRefusal } from './cli-refusal.js';
4
5
  import { prepareOutputDirectory } from './cli-output-paths.js';
5
6
  import { parseImproveOptions } from './improve-options.js';
6
7
  import { buildImprovePricingPlan } from './improve-pricing-plan.js';
8
+ import { improveStalled, retryImproveTemporarilyUnavailable } from './improve-convert-resilience.js';
9
+ import { writeImproveStallReport } from './improve-kit-stall.js';
10
+ import { resetImproveDraw } from './improve-reset.js';
11
+ import { awaitingImprovePick, buildImproveRunSummary, improveStallErrorWithSummary, } from './improve-run-summary.js';
12
+ import { registerImproveStopHandler } from './improve-stop-handler.js';
13
+ import { noteImproveTerminalEvent } from './improve-terminal-event.js';
7
14
  import { runImproveCaptureStage, runImproveConvertStage, runImproveDraftStage, markImproveStageSkipped, runImprovePickStage, runImprovePlanStage, writeImproveReadme, } from './improve-stage-runners.js';
8
15
  import { IMPROVE_STAGES, readImproveRecord, writeImproveRecord, } from './improve-workspace.js';
9
16
  /**
@@ -12,16 +19,40 @@ import { IMPROVE_STAGES, readImproveRecord, writeImproveRecord, } from './improv
12
19
  * modules. No server route or billing path is introduced here.
13
20
  */
14
21
  const same = (left, right) => JSON.stringify(left) === JSON.stringify(right);
22
+ /**
23
+ * A mismatch refusal that names neither value is a dead end: the reader knows
24
+ * the flag disagrees with the record and has to open `improve.json` to find out
25
+ * what it holds. `--bootstrap` is the case that cost a run — its recorded value
26
+ * is a quoted triple nobody remembers typing.
27
+ */
28
+ const describeRecordedValue = (value) => {
29
+ if (value === undefined || value === null)
30
+ return 'nothing';
31
+ if (Array.isArray(value)) {
32
+ return value.length === 0 ? 'nothing' : value.map((entry) => `'${String(entry)}'`).join(', ');
33
+ }
34
+ if (typeof value === 'object')
35
+ return JSON.stringify(value);
36
+ return `'${String(value)}'`;
37
+ };
15
38
  const assertCompatibleRecord = async (args) => {
16
39
  if (!same(args.record.input.kind, args.parsed.input.kind)
17
40
  || !same(args.record.input.value, args.parsed.input.value)) {
18
41
  throw new CliRefusal('This improve directory belongs to a different input', 'improve_record_mismatch');
19
42
  }
43
+ // `--redraw` throws the draw away and buys another one, so the three flags
44
+ // that describe a draw are the ones it is entitled to change. Refusing them
45
+ // made the documented redraw command — the one that passes a new
46
+ // `--direction` — impossible to run, and sent the reader to a fresh
47
+ // `--out-dir`, which re-buys the capture too. Everything else still has to
48
+ // match: a redraw does not license a different model or a different page.
49
+ const drawFlags = new Set(args.parsed.redraw ? ['direction', 'candidates', 'retain'] : []);
20
50
  const explicitChecks = [
21
51
  ['direction', args.record.direction, args.parsed.direction],
22
52
  ['candidates', args.record.candidates, args.parsed.candidates],
23
53
  ['retain', args.record.retain, args.parsed.retain],
24
54
  ['convert-model', args.record.conversionModel, args.parsed.conversionModel],
55
+ ['responsive-quality', args.record.responsiveQuality, args.parsed.responsiveQuality],
25
56
  ['viewport', args.record.viewport, args.parsed.viewport],
26
57
  ['full-page', args.record.fullPage, args.parsed.fullPage],
27
58
  ['bootstrap', args.record.bootstrap, args.parsed.bootstrapValues],
@@ -30,8 +61,14 @@ const assertCompatibleRecord = async (args) => {
30
61
  ['target', args.record.target && { kind: args.record.target.kind, value: args.record.target.value }, args.parsed.target],
31
62
  ];
32
63
  for (const [flag, recorded, requested] of explicitChecks) {
64
+ if (drawFlags.has(flag))
65
+ continue;
33
66
  if (args.flags[flag] !== undefined && !same(recorded, requested)) {
34
- throw new CliRefusal(`--${flag} does not match the durable improve record. Start a new --out-dir for changed inputs.`, 'improve_record_mismatch');
67
+ throw new CliRefusal(`--${flag} does not match the durable improve record.`
68
+ + ` The record holds ${describeRecordedValue(recorded)};`
69
+ + ` this run asked for ${describeRecordedValue(requested)}.`
70
+ + ` Drop --${flag} to reuse what the record already captured,`
71
+ + ' or pass a fresh --out-dir to start over with the changed input.', 'improve_record_mismatch');
35
72
  }
36
73
  }
37
74
  if (args.record.input.kind === 'image' && args.record.input.sha256) {
@@ -75,6 +112,7 @@ export const runImproveCommand = async (command, flags, dependencies = {}) => {
75
112
  candidates: parsed.candidates,
76
113
  retain: parsed.retain,
77
114
  conversionModel: parsed.conversionModel,
115
+ responsiveQuality: parsed.responsiveQuality,
78
116
  ...pricing,
79
117
  note: 'Nothing was captured, read from the network, claimed, dispatched, or bought.',
80
118
  }, null, 2));
@@ -89,6 +127,7 @@ export const runImproveCommand = async (command, flags, dependencies = {}) => {
89
127
  retain: parsed.retain,
90
128
  retainFlag: parsed.retainFlag,
91
129
  conversionModel: parsed.conversionModel,
130
+ responsiveQuality: parsed.responsiveQuality,
92
131
  viewport: parsed.viewport,
93
132
  fullPage: parsed.fullPage,
94
133
  bootstrap: parsed.bootstrapValues,
@@ -115,6 +154,7 @@ export const runImproveCommand = async (command, flags, dependencies = {}) => {
115
154
  retain: parsed.retain,
116
155
  retainFlag: parsed.retainFlag,
117
156
  conversionModel: parsed.conversionModel,
157
+ responsiveQuality: parsed.responsiveQuality,
118
158
  viewport: parsed.viewport,
119
159
  fullPage: parsed.fullPage,
120
160
  bootstrap: parsed.bootstrapValues,
@@ -127,71 +167,231 @@ export const runImproveCommand = async (command, flags, dependencies = {}) => {
127
167
  write(parsed.paths.runDir);
128
168
  dependencies.onRunDirectory?.(parsed.paths.runDir);
129
169
  dependencies.journal?.note({ workspace: parsed.paths.runDir, writes: [parsed.paths.record] });
170
+ // The kit describes itself after every stage, not only at the end. It derives
171
+ // from the record plus what is on disk, so writing it repeatedly is cheap and
172
+ // idempotent — and a run that dies between stages still leaves a front door.
173
+ const refreshReadme = async () => writeImproveReadme(record, { requestedTo: parsed.to });
130
174
  const index = (stage) => IMPROVE_STAGES.indexOf(stage);
131
175
  const within = (stage) => index(stage) >= index(parsed.from) && index(stage) <= index(parsed.to);
132
176
  const needed = (stage) => index(stage) <= index(parsed.to);
133
- if (needed('capture')) {
134
- if (within('capture'))
135
- record = await runImproveCaptureStage({
136
- record, options: parsed, dependencies, price: price.get('capture') ?? 0,
177
+ // The stage this invocation is INSIDE, which is what tells a stop mid-flight
178
+ // apart from a signal after completion. The record cannot: `--fresh` clears
179
+ // convert and plan from the durable record inside the convert stage, and
180
+ // `record` here is only reassigned when that stage returns.
181
+ let liveStage;
182
+ const runStage = async (stage, action) => {
183
+ liveStage = stage;
184
+ try {
185
+ return await retryImproveTemporarilyUnavailable({
186
+ stage,
187
+ action,
188
+ ...(dependencies.sleep ? { sleep: dependencies.sleep } : {}),
189
+ ...(dependencies.warn ? { warn: dependencies.warn } : {}),
137
190
  });
138
- if (!record.capture)
139
- missingStage('capture', parsed.paths.runDir);
140
- }
141
- if (needed('draft')) {
142
- if (record.target) {
143
- record = await markImproveStageSkipped(record, 'draft');
144
191
  }
145
- else {
146
- if (within('draft'))
147
- record = await runImproveDraftStage({
148
- record, options: parsed, flags, dependencies, price: price.get('draft') ?? 0,
149
- });
150
- if (!record.draft)
151
- missingStage('draft', parsed.paths.runDir);
192
+ finally {
193
+ liveStage = undefined;
152
194
  }
153
- }
154
- if (needed('pick')) {
155
- if (record.target) {
156
- record = await markImproveStageSkipped(record, 'pick');
195
+ };
196
+ const freshConversionNonce = parsed.fresh ? randomUUID() : undefined;
197
+ // A stalled or killed stage still owes the reader a kit that says what is
198
+ // missing and how to recover, and owes every other shell a terminal journal
199
+ // line. Without them a lane reads an empty `target/` and hand-authors the
200
+ // design in CSS — which is what happened on the pipedrive landing, and that
201
+ // lane was KILLED, not stalled, so it threw nothing the catch below could
202
+ // have seen. The handler is armed here, before the first stage, because a
203
+ // kill during capture, draft or pick used to leave nothing at all.
204
+ const disarmStop = registerImproveStopHandler({
205
+ getRecord: () => record,
206
+ getLiveStage: () => liveStage,
207
+ write,
208
+ requestedTo: parsed.to,
209
+ ...(dependencies.journal ? { journal: dependencies.journal } : {}),
210
+ ...(dependencies.stopTarget ? { target: dependencies.stopTarget } : {}),
211
+ ...(dependencies.exit ? { exit: dependencies.exit } : {}),
212
+ });
213
+ try {
214
+ // `--redraw` is the flag `--fresh` was being mistaken for. `--fresh` rotates
215
+ // the conversion key and re-buys ONE conversion of the SAME settled winner;
216
+ // it never touches the draw. A caller who wanted different candidates had no
217
+ // flag at all. This one empties draft, pick, convert and plan, renames the
218
+ // old draw aside rather than deleting it, and lets the normal stage order buy
219
+ // a new one — announced, because it is the most expensive thing improve does.
220
+ if (parsed.redraw) {
221
+ const hadDraw = Boolean(record.draft || record.pick);
222
+ // Only the flags this run actually passed reach the record. A redraw that
223
+ // reset `--candidates` to the default because the flag was absent would
224
+ // buy a draw nobody asked for.
225
+ const reset = await resetImproveDraw({
226
+ record,
227
+ draw: {
228
+ ...(flags.direction !== undefined
229
+ ? { direction: parsed.direction, concept: parsed.concept }
230
+ : {}),
231
+ ...(flags.candidates !== undefined ? { candidates: parsed.candidates } : {}),
232
+ ...(flags.retain !== undefined
233
+ ? { retain: parsed.retain, retainFlag: parsed.retainFlag }
234
+ : {}),
235
+ },
236
+ ...(dependencies.warn ? { warn: dependencies.warn } : {}),
237
+ });
238
+ record = reset.record;
239
+ await writeImproveRecord(parsed.paths.record, record);
240
+ if (hadDraw) {
241
+ write(`--redraw: the previous draw moved to ${parsed.paths.candidatesDir}.previous;`
242
+ + ` buying ${record.candidates} new candidates.`);
243
+ dependencies.journal?.note({ degradations: ['improve_draw_discarded'] });
244
+ }
245
+ // A settled conversion the redraw threw away is paid work, and there is
246
+ // no cancel. It belongs in the same ledger `--fresh` and a re-pick write.
247
+ if (reset.abandonedId) {
248
+ dependencies.journal?.note({ degradations: ['improve_redraw_abandoned_conversion'] });
249
+ }
157
250
  }
158
- else {
159
- if (within('pick'))
160
- record = await runImprovePickStage({
161
- record, options: parsed, price: price.get('pick') ?? 0,
162
- });
163
- if (!record.pick)
164
- missingStage('pick', parsed.paths.runDir);
251
+ if (needed('capture')) {
252
+ if (within('capture'))
253
+ record = await runStage('capture', () => runImproveCaptureStage({
254
+ record, options: parsed, dependencies, price: price.get('capture') ?? 0,
255
+ }));
256
+ if (!record.capture)
257
+ missingStage('capture', parsed.paths.runDir);
258
+ await refreshReadme();
165
259
  }
166
- }
167
- if (needed('convert')) {
168
- if (within('convert'))
169
- record = await runImproveConvertStage({
170
- record, options: parsed, dependencies, price: price.get('convert') ?? 0,
260
+ if (needed('draft')) {
261
+ if (record.target) {
262
+ record = await markImproveStageSkipped(record, 'draft');
263
+ }
264
+ else {
265
+ if (within('draft'))
266
+ record = await runStage('draft', () => runImproveDraftStage({
267
+ record, options: parsed, flags, dependencies, price: price.get('draft') ?? 0,
268
+ }));
269
+ if (!record.draft)
270
+ missingStage('draft', parsed.paths.runDir);
271
+ }
272
+ await refreshReadme();
273
+ }
274
+ if (needed('pick')) {
275
+ if (record.target) {
276
+ record = await markImproveStageSkipped(record, 'pick');
277
+ }
278
+ else {
279
+ // DISPATCH DISCIPLINE. A draw is alternatives; converting one of them
280
+ // before anyone has looked spends money on a guess. `--pick` used to
281
+ // default to A and the convert stage ran straight on, so notion bought
282
+ // a conversion of candidate A four milliseconds after the draft
283
+ // settled — and then a second process converted D, the one actually
284
+ // chosen. With no `--pick` and no recorded pick, the run stops here.
285
+ const chosen = parsed.pick ?? record.pick?.slot;
286
+ if (within('pick')) {
287
+ // Nothing to settle and nobody to ask: stop, and print the one
288
+ // command that continues. A range that starts AFTER pick asked to
289
+ // skip this stage, so it falls through to the honest refusal below
290
+ // rather than quietly stopping where it was told not to.
291
+ if (!chosen) {
292
+ await refreshReadme();
293
+ write(awaitingImprovePick({ record, options: parsed }));
294
+ dependencies.journal?.note({
295
+ workspace: parsed.paths.runDir,
296
+ artifacts: [parsed.paths.record, parsed.paths.readme],
297
+ purchased: record.draft ? [record.draft.runId] : [],
298
+ terminal: false,
299
+ });
300
+ console.log(JSON.stringify({ from: parsed.from, to: parsed.to, ...record }, null, 2));
301
+ return record;
302
+ }
303
+ record = await runStage('pick', () => runImprovePickStage({
304
+ record, options: parsed, pick: chosen, dependencies, price: price.get('pick') ?? 0,
305
+ }));
306
+ }
307
+ if (!record.pick)
308
+ missingStage('pick', parsed.paths.runDir);
309
+ }
310
+ await refreshReadme();
311
+ }
312
+ try {
313
+ if (needed('convert')) {
314
+ if (within('convert'))
315
+ record = await runStage('convert', () => runImproveConvertStage({
316
+ record,
317
+ options: parsed,
318
+ dependencies,
319
+ price: price.get('convert') ?? 0,
320
+ ...(freshConversionNonce ? { freshConversionNonce } : {}),
321
+ }));
322
+ if (!record.convert)
323
+ missingStage('convert', parsed.paths.runDir);
324
+ await refreshReadme();
325
+ }
326
+ if (needed('plan')) {
327
+ if (within('plan'))
328
+ record = await runStage('plan', () => runImprovePlanStage({
329
+ record, options: parsed, dependencies, price: price.get('plan') ?? 0,
330
+ }));
331
+ if (!record.plan)
332
+ missingStage('plan', parsed.paths.runDir);
333
+ }
334
+ }
335
+ catch (error) {
336
+ // The durable record is the truth here: a stage that failed still wrote
337
+ // down what it abandoned before it threw, and the in-memory copy this
338
+ // function holds predates that.
339
+ record = await readImproveRecord(parsed.paths.record) ?? record;
340
+ const stalledStage = record.convert ? 'plan' : 'convert';
341
+ // A stall closes the record itself, before the recovery files, so a
342
+ // reader never sees a run whose last line is a progress entry. A stage
343
+ // that failed for a reason the journal can already classify — an auth
344
+ // failure, a refusal — keeps that classification: `withRunJournal` ends
345
+ // it on the way out and the throw below is what gets there.
346
+ const stalled = improveStalled(error);
347
+ if (stalled) {
348
+ // Everything the record is owed goes in HERE. The session refuses to
349
+ // write after its end line, so the note that used to follow this call
350
+ // was dropped in silence and `improve_<stage>_stalled` never reached a
351
+ // single stalled record.
352
+ await noteImproveTerminalEvent({
353
+ record,
354
+ stage: stalledStage,
355
+ kind: 'stalled',
356
+ error,
357
+ writes: [path.join(parsed.paths.planDir, 'STALL.md'), parsed.paths.readme],
358
+ degradations: [`improve_${stalledStage}_stalled`],
359
+ ...(dependencies.journal ? { journal: dependencies.journal } : {}),
360
+ });
361
+ }
362
+ const stall = await writeImproveStallReport({
363
+ record, stage: stalledStage, error, requestedTo: parsed.to,
171
364
  });
172
- if (!record.convert)
173
- missingStage('convert', parsed.paths.runDir);
365
+ const readme = await refreshReadme();
366
+ // A failure the journal can already classify — an auth failure, a refusal
367
+ // — has an open session still, and `withRunJournal` ends it on the way
368
+ // out; this is the last chance to name what it produced.
369
+ if (!stalled) {
370
+ dependencies.journal?.note({
371
+ workspace: parsed.paths.runDir,
372
+ artifacts: [parsed.paths.record, readme, stall],
373
+ degradations: [`improve_${stalledStage}_stalled`],
374
+ });
375
+ }
376
+ throw improveStallErrorWithSummary(error, await buildImproveRunSummary({ record, requestedTo: parsed.to }));
377
+ }
378
+ const readme = await refreshReadme();
379
+ dependencies.journal?.note({
380
+ workspace: parsed.paths.runDir,
381
+ artifacts: [parsed.paths.record, readme, ...(record.plan?.artifacts ?? [])],
382
+ purchased: [
383
+ ...(record.draft ? [record.draft.runId] : []),
384
+ ...(record.convert?.purchaseIds ?? []),
385
+ ...(record.sourceConvert?.purchaseIds ?? []),
386
+ ],
387
+ terminal: parsed.to === 'plan',
388
+ });
389
+ console.log(JSON.stringify({ from: parsed.from, to: parsed.to, ...record }, null, 2));
390
+ write(await buildImproveRunSummary({ record, requestedTo: parsed.to }));
391
+ return record;
174
392
  }
175
- if (needed('plan')) {
176
- if (within('plan'))
177
- record = await runImprovePlanStage({
178
- record, options: parsed, dependencies, price: price.get('plan') ?? 0,
179
- });
180
- if (!record.plan)
181
- missingStage('plan', parsed.paths.runDir);
393
+ finally {
394
+ disarmStop();
182
395
  }
183
- const readme = await writeImproveReadme(record);
184
- dependencies.journal?.note({
185
- workspace: parsed.paths.runDir,
186
- artifacts: [parsed.paths.record, readme, ...(record.plan?.artifacts ?? [])],
187
- purchased: [
188
- ...(record.draft ? [record.draft.runId] : []),
189
- ...(record.convert?.purchaseIds ?? []),
190
- ...(record.sourceConvert?.purchaseIds ?? []),
191
- ],
192
- terminal: parsed.to === 'plan',
193
- });
194
- console.log(JSON.stringify({ from: parsed.from, to: parsed.to, ...record }, null, 2));
195
- return record;
196
396
  };
197
397
  //# sourceMappingURL=cli-improve-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-improve-command.js","sourceRoot":"","sources":["../src/cli-improve-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-improve-command.js","sourceRoot":"","sources":["../src/cli-improve-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-next-command.d.ts","sourceRoot":"","sources":["../src/cli-next-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAQL,KAAK,8BAA8B,EACpC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAc1D,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,mDAAmD;IACnD,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,EAAE,8BAA8B,CAAC;CAC1C,CAAC;AAkaF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,gBAAgB,CAAC,EAAE,OAAO,oBAAoB,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,gBAAgB,MAAM,GAAG,SAAS,EAClC,OAAO,QAAQ,EACf,eAAc,uBAA4B,KACzC,OAAO,CAAC,UAAU,CAwKpB,CAAC"}
1
+ {"version":3,"file":"cli-next-command.d.ts","sourceRoot":"","sources":["../src/cli-next-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAQL,KAAK,8BAA8B,EACpC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAmB1D,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,mDAAmD;IACnD,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,EAAE,8BAA8B,CAAC;CAC1C,CAAC;AAycF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,gBAAgB,CAAC,EAAE,OAAO,oBAAoB,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,gBAAgB,MAAM,GAAG,SAAS,EAClC,OAAO,QAAQ,EACf,eAAc,uBAA4B,KACzC,OAAO,CAAC,UAAU,CAwKpB,CAAC"}
@@ -9,6 +9,7 @@ import { TwelveUiConversionClient } from './conversion-client.js';
9
9
  import { isPendingConversionStatus } from './conversion-status-contract.js';
10
10
  import { describeInFlightRecord, readInFlightRunJournal, } from './run-journal-in-flight.js';
11
11
  import { readRunJournal } from './run-journal.js';
12
+ import { hostedRunAgeSeconds, lastWorkingEnd, unfinishedPaidRun, } from './run-journal-unfinished.js';
12
13
  import { readBranchStatus } from './branch-status.js';
13
14
  import { materializeDraftIfSettled, readDraftStatus, repairDraftDispatch, } from './cli-draft-command.js';
14
15
  import { resolveNextTarget } from './next-target.js';
@@ -302,26 +303,65 @@ const readWorkspace = async (directory, flags, observedAt = Date.now()) => {
302
303
  const others = paid.length > 1
303
304
  ? ` ${paid.length - 1} other paid command(s) here are also still running.`
304
305
  : '';
306
+ // The hosted run outlives the local process that owns it. Reading elapsed
307
+ // from this invocation's start line reported 76s for an 11-minute run after
308
+ // the local caller restarted; the journal's first line for that run id is
309
+ // the honest clock.
310
+ const hostedAge = hostedRunAgeSeconds({ entries, runId: first.runId, now: observedAt });
311
+ const elapsedSeconds = Math.max(first.elapsedSeconds, hostedAge ?? 0);
312
+ const record = elapsedSeconds === first.elapsedSeconds
313
+ ? first
314
+ : { ...first, elapsedSeconds };
305
315
  return {
306
316
  kind: 'workspace',
307
317
  target: directory,
308
318
  state: first.stage ?? 'running',
309
319
  complete: false,
310
320
  typicalSeconds: first.typicalSeconds ?? CONVERSION_DURATION_HINTS.convert,
311
- elapsedSeconds: first.elapsedSeconds,
321
+ elapsedSeconds,
312
322
  what: `\`12ui ${first.cmd}\``,
313
- narrative: `${describeInFlightRecord(first)} Starting another one buys the work twice.${others}`,
323
+ narrative: `${describeInFlightRecord(record)} Starting another one buys the work twice.${others}`,
314
324
  nextCommand: `12ui next ${directory} --wait`,
315
325
  ...(first.runId ? { runId: first.runId } : {}),
316
326
  detail: { inFlight },
317
327
  progress: {
318
328
  stage: first.stage ?? 'running',
319
- ...(first.elapsedSeconds === undefined ? {} : { elapsedSeconds: first.elapsedSeconds }),
329
+ elapsedSeconds,
320
330
  },
321
331
  };
322
332
  }
333
+ // A paid invocation that opened and never closed is not a finished
334
+ // workspace, however cheerful the newest end line is. `next` journals its own
335
+ // end, so on a wedged improve kit the newest end said `next ok` and the
336
+ // reader took the run for done.
337
+ const unfinished = unfinishedPaidRun(entries);
338
+ if (unfinished) {
339
+ const age = hostedRunAgeSeconds({ entries, runId: unfinished.runId, now: observedAt })
340
+ ?? Math.max(0, (observedAt - Date.parse(unfinished.startedAt)) / 1000);
341
+ const stage = unfinished.stage ? stageLabel(unfinished.stage) : 'no stage reported';
342
+ return {
343
+ kind: 'workspace',
344
+ target: directory,
345
+ state: `in progress: ${unfinished.stage ?? 'unknown'}`,
346
+ complete: false,
347
+ recoverable: true,
348
+ typicalSeconds: unfinished.typicalSeconds ?? CONVERSION_DURATION_HINTS.convert,
349
+ elapsedSeconds: age,
350
+ what: `\`12ui ${unfinished.cmd}\``,
351
+ narrative: `\`12ui ${unfinished.cmd}\` never recorded an end here:`
352
+ + ` in progress: ${stage}, ${formatDuration(age)} since the run started.`
353
+ + ' Its local process is gone; the paid run may still be live.'
354
+ + ' Nothing here is finished.',
355
+ nextCommand: unfinished.runId
356
+ ? `12ui next ${unfinished.runId}`
357
+ : `12ui next ${directory} --wait`,
358
+ ...(unfinished.runId ? { runId: unfinished.runId } : {}),
359
+ detail: { unfinished },
360
+ progress: { stage: unfinished.stage ?? 'unknown', elapsedSeconds: age },
361
+ };
362
+ }
323
363
  const ends = entries.filter((entry) => entry.event === 'end');
324
- const last = ends[ends.length - 1];
364
+ const last = lastWorkingEnd(entries);
325
365
  const artifacts = ends.flatMap((entry) => entry.artifacts ?? []);
326
366
  const page = artifacts.find((file) => file.endsWith('.html'));
327
367
  const document = artifacts.find((file) => file.includes('.layerdoc'));