@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.
- package/SKILL.md +1 -1
- package/dist/branch-client.d.ts +2 -0
- package/dist/branch-client.d.ts.map +1 -1
- package/dist/branch-client.js +1 -0
- package/dist/branch-client.js.map +1 -1
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +2 -0
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-conversion-derivation.d.ts +2 -1
- package/dist/cli-conversion-derivation.d.ts.map +1 -1
- package/dist/cli-conversion-derivation.js +9 -1
- package/dist/cli-conversion-derivation.js.map +1 -1
- package/dist/cli-convert-command.d.ts.map +1 -1
- package/dist/cli-convert-command.js +111 -16
- package/dist/cli-convert-command.js.map +1 -1
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +5 -2
- package/dist/cli-corpus-command.js.map +1 -1
- package/dist/cli-corpus-evidence.d.ts.map +1 -1
- package/dist/cli-corpus-evidence.js +2 -1
- package/dist/cli-corpus-evidence.js.map +1 -1
- package/dist/cli-corpus-reference-downloads.d.ts +1 -0
- package/dist/cli-corpus-reference-downloads.d.ts.map +1 -1
- package/dist/cli-corpus-reference-downloads.js +13 -3
- package/dist/cli-corpus-reference-downloads.js.map +1 -1
- package/dist/cli-corpus-types.d.ts +2 -0
- package/dist/cli-corpus-types.d.ts.map +1 -1
- package/dist/cli-draft-command.d.ts +11 -0
- package/dist/cli-draft-command.d.ts.map +1 -1
- package/dist/cli-draft-command.js +10 -1
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-help/design.d.ts +2 -2
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +12 -2
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +2 -2
- package/dist/cli-improve-command.d.ts.map +1 -1
- package/dist/cli-improve-command.js +317 -70
- package/dist/cli-improve-command.js.map +1 -1
- package/dist/cli-next-command.d.ts.map +1 -1
- package/dist/cli-next-command.js +44 -4
- package/dist/cli-next-command.js.map +1 -1
- package/dist/cli-usage.js +2 -2
- package/dist/concept-input.d.ts +21 -0
- package/dist/concept-input.d.ts.map +1 -1
- package/dist/concept-input.js +32 -10
- package/dist/concept-input.js.map +1 -1
- package/dist/conversion-client.d.ts +39 -1
- package/dist/conversion-client.d.ts.map +1 -1
- package/dist/conversion-client.js +205 -3
- package/dist/conversion-client.js.map +1 -1
- package/dist/corpus-client.d.ts +7 -1
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +6 -2
- package/dist/corpus-client.js.map +1 -1
- package/dist/corpus-reference-download-retry.d.ts +68 -0
- package/dist/corpus-reference-download-retry.d.ts.map +1 -0
- package/dist/corpus-reference-download-retry.js +123 -0
- package/dist/corpus-reference-download-retry.js.map +1 -0
- package/dist/corpus-request-error.d.ts +17 -0
- package/dist/corpus-request-error.d.ts.map +1 -0
- package/dist/corpus-request-error.js +21 -0
- package/dist/corpus-request-error.js.map +1 -0
- package/dist/draft-run.d.ts +9 -0
- package/dist/draft-run.d.ts.map +1 -1
- package/dist/draft-run.js +22 -5
- package/dist/draft-run.js.map +1 -1
- package/dist/draft-workspace.d.ts +2 -1
- package/dist/draft-workspace.d.ts.map +1 -1
- package/dist/draft-workspace.js.map +1 -1
- package/dist/hosted-draft-identity.d.ts +1 -0
- package/dist/hosted-draft-identity.d.ts.map +1 -1
- package/dist/hosted-draft-identity.js +1 -0
- package/dist/hosted-draft-identity.js.map +1 -1
- package/dist/improve-added-specs.d.ts +9 -0
- package/dist/improve-added-specs.d.ts.map +1 -1
- package/dist/improve-added-specs.js +28 -7
- package/dist/improve-added-specs.js.map +1 -1
- package/dist/improve-bootstrap-secret.d.ts +35 -0
- package/dist/improve-bootstrap-secret.d.ts.map +1 -0
- package/dist/improve-bootstrap-secret.js +61 -0
- package/dist/improve-bootstrap-secret.js.map +1 -0
- package/dist/improve-capture-redirect.d.ts +46 -0
- package/dist/improve-capture-redirect.d.ts.map +1 -0
- package/dist/improve-capture-redirect.js +68 -0
- package/dist/improve-capture-redirect.js.map +1 -0
- package/dist/improve-concept.d.ts +14 -1
- package/dist/improve-concept.d.ts.map +1 -1
- package/dist/improve-concept.js +29 -8
- package/dist/improve-concept.js.map +1 -1
- package/dist/improve-conversion-attempts.d.ts +96 -0
- package/dist/improve-conversion-attempts.d.ts.map +1 -0
- package/dist/improve-conversion-attempts.js +93 -0
- package/dist/improve-conversion-attempts.js.map +1 -0
- package/dist/improve-conversion-stage.d.ts +14 -0
- package/dist/improve-conversion-stage.d.ts.map +1 -1
- package/dist/improve-conversion-stage.js +254 -70
- package/dist/improve-conversion-stage.js.map +1 -1
- package/dist/improve-convert-progress.d.ts +36 -0
- package/dist/improve-convert-progress.d.ts.map +1 -0
- package/dist/improve-convert-progress.js +43 -0
- package/dist/improve-convert-progress.js.map +1 -0
- package/dist/improve-convert-resilience.d.ts +116 -0
- package/dist/improve-convert-resilience.d.ts.map +1 -1
- package/dist/improve-convert-resilience.js +158 -1
- package/dist/improve-convert-resilience.js.map +1 -1
- package/dist/improve-delivery-stages.d.ts.map +1 -1
- package/dist/improve-delivery-stages.js +5 -0
- package/dist/improve-delivery-stages.js.map +1 -1
- package/dist/improve-dom-diff.d.ts +2 -0
- package/dist/improve-dom-diff.d.ts.map +1 -1
- package/dist/improve-dom-diff.js +7 -0
- package/dist/improve-dom-diff.js.map +1 -1
- package/dist/improve-dom-gate.d.ts +7 -0
- package/dist/improve-dom-gate.d.ts.map +1 -1
- package/dist/improve-dom-gate.js +13 -0
- package/dist/improve-dom-gate.js.map +1 -1
- package/dist/improve-generation-stages.d.ts +3 -0
- package/dist/improve-generation-stages.d.ts.map +1 -1
- package/dist/improve-generation-stages.js +56 -10
- package/dist/improve-generation-stages.js.map +1 -1
- package/dist/improve-icon-svg.d.ts +47 -0
- package/dist/improve-icon-svg.d.ts.map +1 -0
- package/dist/improve-icon-svg.js +83 -0
- package/dist/improve-icon-svg.js.map +1 -0
- package/dist/improve-kit-assets.d.ts +129 -0
- package/dist/improve-kit-assets.d.ts.map +1 -0
- package/dist/improve-kit-assets.js +333 -0
- package/dist/improve-kit-assets.js.map +1 -0
- package/dist/improve-kit-ignore.d.ts +32 -0
- package/dist/improve-kit-ignore.d.ts.map +1 -0
- package/dist/improve-kit-ignore.js +111 -0
- package/dist/improve-kit-ignore.js.map +1 -0
- package/dist/improve-kit-readme.d.ts +11 -2
- package/dist/improve-kit-readme.d.ts.map +1 -1
- package/dist/improve-kit-readme.js +282 -26
- package/dist/improve-kit-readme.js.map +1 -1
- package/dist/improve-kit-stall.d.ts +113 -0
- package/dist/improve-kit-stall.d.ts.map +1 -0
- package/dist/improve-kit-stall.js +311 -0
- package/dist/improve-kit-stall.js.map +1 -0
- package/dist/improve-kit-status.d.ts +105 -0
- package/dist/improve-kit-status.d.ts.map +1 -0
- package/dist/improve-kit-status.js +215 -0
- package/dist/improve-kit-status.js.map +1 -0
- package/dist/improve-options.d.ts +16 -1
- package/dist/improve-options.d.ts.map +1 -1
- package/dist/improve-options.js +65 -15
- package/dist/improve-options.js.map +1 -1
- package/dist/improve-plan-annotated-render.d.ts +45 -0
- package/dist/improve-plan-annotated-render.d.ts.map +1 -0
- package/dist/improve-plan-annotated-render.js +196 -0
- package/dist/improve-plan-annotated-render.js.map +1 -0
- package/dist/improve-plan-annotator.d.ts +7 -1
- package/dist/improve-plan-annotator.d.ts.map +1 -1
- package/dist/improve-plan-annotator.js +22 -45
- package/dist/improve-plan-annotator.js.map +1 -1
- package/dist/improve-raster-layers-section.d.ts +21 -0
- package/dist/improve-raster-layers-section.d.ts.map +1 -0
- package/dist/improve-raster-layers-section.js +45 -0
- package/dist/improve-raster-layers-section.js.map +1 -0
- package/dist/improve-reset.d.ts +122 -0
- package/dist/improve-reset.d.ts.map +1 -0
- package/dist/improve-reset.js +141 -0
- package/dist/improve-reset.js.map +1 -0
- package/dist/improve-run-summary.d.ts +35 -0
- package/dist/improve-run-summary.d.ts.map +1 -0
- package/dist/improve-run-summary.js +180 -0
- package/dist/improve-run-summary.js.map +1 -0
- package/dist/improve-stage-shared.d.ts +44 -1
- package/dist/improve-stage-shared.d.ts.map +1 -1
- package/dist/improve-stage-shared.js +80 -3
- package/dist/improve-stage-shared.js.map +1 -1
- package/dist/improve-stop-handler.d.ts +73 -0
- package/dist/improve-stop-handler.d.ts.map +1 -0
- package/dist/improve-stop-handler.js +126 -0
- package/dist/improve-stop-handler.js.map +1 -0
- package/dist/improve-terminal-event.d.ts +118 -0
- package/dist/improve-terminal-event.d.ts.map +1 -0
- package/dist/improve-terminal-event.js +87 -0
- package/dist/improve-terminal-event.js.map +1 -0
- package/dist/improve-token-patch.d.ts +2 -0
- package/dist/improve-token-patch.d.ts.map +1 -1
- package/dist/improve-token-patch.js +23 -5
- package/dist/improve-token-patch.js.map +1 -1
- package/dist/improve-workspace.d.ts +94 -2
- package/dist/improve-workspace.d.ts.map +1 -1
- package/dist/improve-workspace.js +19 -1
- package/dist/improve-workspace.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +143 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-tool-definitions.js +1 -1
- package/dist/mcp-tool-definitions.js.map +1 -1
- package/dist/mcp-tool-handler.d.ts.map +1 -1
- package/dist/mcp-tool-handler.js +3 -0
- package/dist/mcp-tool-handler.js.map +1 -1
- package/dist/redesign-capture.d.ts +17 -0
- package/dist/redesign-capture.d.ts.map +1 -1
- package/dist/redesign-capture.js +55 -3
- package/dist/redesign-capture.js.map +1 -1
- package/dist/responsive-alternative-materializer.d.ts +19 -0
- package/dist/responsive-alternative-materializer.d.ts.map +1 -0
- package/dist/responsive-alternative-materializer.js +76 -0
- package/dist/responsive-alternative-materializer.js.map +1 -0
- package/dist/run-journal-unfinished.d.ts +56 -0
- package/dist/run-journal-unfinished.d.ts.map +1 -0
- package/dist/run-journal-unfinished.js +126 -0
- package/dist/run-journal-unfinished.js.map +1 -0
- package/dist/run-journal.d.ts +25 -1
- package/dist/run-journal.d.ts.map +1 -1
- package/dist/run-journal.js +15 -1
- package/dist/run-journal.js.map +1 -1
- package/open-design.json +2 -2
- package/package.json +1 -1
- package/skills/12ui-design/SKILL.md +9 -1
- package/skills/12ui-design/improve.md +83 -6
- 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
|
-
/**
|
|
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":"
|
|
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"}
|
package/dist/improve-concept.js
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
25
|
-
if (
|
|
26
|
-
throw new CliRefusal(
|
|
27
|
-
|
|
28
|
-
|
|
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:
|
|
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,
|
|
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;
|
|
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"}
|