@12ui/design 0.2.7 → 0.2.9
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/README.md +29 -29
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +26 -35
- 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 +34 -4
- package/dist/cli-corpus-evidence.js.map +1 -1
- package/dist/cli-corpus-reference-image.d.ts +13 -0
- package/dist/cli-corpus-reference-image.d.ts.map +1 -0
- package/dist/cli-corpus-reference-image.js +54 -0
- package/dist/cli-corpus-reference-image.js.map +1 -0
- package/dist/cli-corpus-run.d.ts +6 -0
- package/dist/cli-corpus-run.d.ts.map +1 -1
- package/dist/cli-corpus-run.js +15 -2
- package/dist/cli-corpus-run.js.map +1 -1
- package/dist/cli-corpus-types.d.ts +6 -1
- package/dist/cli-corpus-types.d.ts.map +1 -1
- package/dist/cli-corpus-types.js.map +1 -1
- package/dist/cli-image-batch-command.d.ts.map +1 -1
- package/dist/cli-image-batch-command.js +2 -1
- package/dist/cli-image-batch-command.js.map +1 -1
- package/dist/cli-image-command.d.ts.map +1 -1
- package/dist/cli-image-command.js +7 -1
- package/dist/cli-image-command.js.map +1 -1
- package/dist/cli-persistence.d.ts.map +1 -1
- package/dist/cli-persistence.js +8 -1
- package/dist/cli-persistence.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/corpus-client.d.ts +15 -85
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +32 -10
- package/dist/corpus-client.js.map +1 -1
- package/dist/image-generation-batch-manifest.d.ts +2 -1
- package/dist/image-generation-batch-manifest.d.ts.map +1 -1
- package/dist/image-generation-batch-manifest.js +7 -1
- package/dist/image-generation-batch-manifest.js.map +1 -1
- package/dist/image-generation-error.d.ts +3 -0
- package/dist/image-generation-error.d.ts.map +1 -0
- package/dist/image-generation-error.js +30 -0
- package/dist/image-generation-error.js.map +1 -0
- package/dist/image-generation-evidence.d.ts +3 -1
- package/dist/image-generation-evidence.d.ts.map +1 -1
- package/dist/image-generation-evidence.js.map +1 -1
- package/dist/image-generation-request.d.ts +4 -0
- package/dist/image-generation-request.d.ts.map +1 -1
- package/dist/image-generation-request.js +3 -0
- package/dist/image-generation-request.js.map +1 -1
- package/dist/image-generation-run.d.ts.map +1 -1
- package/dist/image-generation-run.js +14 -4
- package/dist/image-generation-run.js.map +1 -1
- package/dist/image-generation-usage.d.ts +4 -0
- package/dist/image-generation-usage.d.ts.map +1 -1
- package/dist/image-generation-usage.js +37 -10
- package/dist/image-generation-usage.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +20 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/package.json +2 -2
- package/skills/design/SKILL.md +119 -20
- package/skills/design/references/continuation-contract.md +60 -0
- package/skills/design/references/selection-contract.md +49 -15
- package/skills/design-search/SKILL.md +42 -12
package/README.md
CHANGED
|
@@ -55,6 +55,7 @@ manual recreation.
|
|
|
55
55
|
12ui skill status --json
|
|
56
56
|
12ui corpus inspire \
|
|
57
57
|
--query "Editorial architecture homepage with warm materiality" \
|
|
58
|
+
--reference-image ./current-homepage.png \
|
|
58
59
|
--out-dir ./references \
|
|
59
60
|
--count 4
|
|
60
61
|
12ui image generate-batch --manifest ./generation.json
|
|
@@ -88,12 +89,11 @@ request when a selected output, its asset directory, or
|
|
|
88
89
|
required fields and `version: 1` constraint, beside the supported
|
|
89
90
|
`projectProfiles` combinations.
|
|
90
91
|
|
|
91
|
-
## Design Corpus
|
|
92
|
+
## Design Corpus inspiration
|
|
92
93
|
|
|
93
94
|
`TwelveUiCorpusClient` uses an API key with the `design.corpus.retrieve` scope.
|
|
94
|
-
|
|
95
|
-
the
|
|
96
|
-
operator diagnostics and search inspection.
|
|
95
|
+
The API-key scope name is retained for compatibility even though `/inspire` is
|
|
96
|
+
the single SDK query surface.
|
|
97
97
|
|
|
98
98
|
```ts
|
|
99
99
|
import { TwelveUiCorpusClient } from '@12ui/design';
|
|
@@ -104,30 +104,20 @@ const corpus = new TwelveUiCorpusClient({
|
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
const status = await corpus.status();
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
targetCount: 6,
|
|
114
|
-
}],
|
|
115
|
-
context: {
|
|
116
|
-
mode: 'record',
|
|
117
|
-
purpose: 'run',
|
|
118
|
-
exposureScope: 'project:example',
|
|
119
|
-
allocationKey: 'example-home-v1',
|
|
120
|
-
},
|
|
107
|
+
const inspiration = await corpus.inspire({
|
|
108
|
+
q: 'Editorial architecture home page with warm materiality and asymmetric typography',
|
|
109
|
+
mode: 'balanced',
|
|
110
|
+
k: 4,
|
|
111
|
+
}, {
|
|
112
|
+
idempotencyKey: 'example-home-v1',
|
|
121
113
|
});
|
|
122
114
|
|
|
123
|
-
const first =
|
|
124
|
-
const metadata = await corpus.reference(first.
|
|
125
|
-
const image = await corpus.download(first.
|
|
115
|
+
const first = inspiration.items[0]!;
|
|
116
|
+
const metadata = await corpus.reference(first.id);
|
|
117
|
+
const image = await corpus.download(first.id, 'ref');
|
|
126
118
|
```
|
|
127
119
|
|
|
128
|
-
|
|
129
|
-
supports `logo-track`, batched queries, exclusions, preselected references, and
|
|
130
|
-
minimum quality thresholds. See
|
|
120
|
+
Every paid inspiration request requires a stable idempotency key. See
|
|
131
121
|
[`docs/corpus-v1.openapi.yaml`](https://github.com/just-every/12ui/blob/main/docs/corpus-v1.openapi.yaml).
|
|
132
122
|
|
|
133
123
|
For agent workflows that need four fresh, budget-metered inspiration images,
|
|
@@ -138,11 +128,22 @@ parallel, verifies each WebP, and writes a content-hashed manifest:
|
|
|
138
128
|
node "$TWELVE_UI_REPO/packages/12ui/dist/cli.js" corpus inspire \
|
|
139
129
|
--query "Editorial architecture home page with warm materiality and asymmetric type" \
|
|
140
130
|
--count 4 \
|
|
141
|
-
--
|
|
131
|
+
--mode balanced \
|
|
142
132
|
--idempotency-key design-run:home-v1 \
|
|
143
133
|
--out-dir ./references
|
|
144
134
|
```
|
|
145
135
|
|
|
136
|
+
`balanced` is the recommended default. `direct` stays close to the literal
|
|
137
|
+
query, while `adventurer` follows its most distinctive directions toward less
|
|
138
|
+
expected references. The modes are locked server-side; callers cannot tune
|
|
139
|
+
their internal ranking weights.
|
|
140
|
+
|
|
141
|
+
For a redesign, add `--reference-image <png|jpeg|webp>`. The CLI hashes the
|
|
142
|
+
private source into stable idempotency and local evidence, while Design Corpus
|
|
143
|
+
uses one aggregated image-and-text embedding to retrieve visually relevant
|
|
144
|
+
directions. The source bytes are forwarded ephemerally and are not persisted
|
|
145
|
+
by 12UI.
|
|
146
|
+
|
|
146
147
|
The output directory must not already exist. Before dispatch, the CLI writes
|
|
147
148
|
`inspire-attempt.json` with the exact request and stable idempotency key. A
|
|
148
149
|
successful run also contains `manifest.json`, `inspire-evidence.json` with the
|
|
@@ -163,10 +164,9 @@ dispatches a second embedding for that identity. Reusing a key with a different
|
|
|
163
164
|
validated request returns `409 idempotency_conflict`. A reference already on
|
|
164
165
|
disk is accepted only when its bytes match its exclusive digest receipt.
|
|
165
166
|
|
|
166
|
-
The CLI
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
corpus kind value.
|
|
167
|
+
The CLI and SDK deliberately expose only the three locked inspiration modes.
|
|
168
|
+
Free-form ranking weights, random seeds, and corpus filters are not part of the
|
|
169
|
+
public inspiration contract.
|
|
170
170
|
|
|
171
171
|
## Multi-page packages
|
|
172
172
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-command.d.ts","sourceRoot":"","sources":["../src/cli-corpus-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK/D,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-corpus-command.d.ts","sourceRoot":"","sources":["../src/cli-corpus-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK/D,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,KAAK,yBAAyB,GAAG;IAC/B,UAAU,EAAE,OAAO,oBAAoB,CAAC;IACxC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,iBAAiB,CAAC;CACtF,CAAC;AA8BF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc,yBAGb,KACA,OAAO,CAAC,IAAI,CA4Ed,CAAC"}
|
|
@@ -3,8 +3,9 @@ import path from 'node:path';
|
|
|
3
3
|
import { stringFlag } from './cli-arguments.js';
|
|
4
4
|
import { downloadCorpusInspiration, resumeCorpusInspiration, } from './cli-corpus-run.js';
|
|
5
5
|
import { INSPIRATION_MANIFEST_FILE, } from './cli-corpus-types.js';
|
|
6
|
-
import { TwelveUiCorpusClient, } from './corpus-client.js';
|
|
6
|
+
import { INSPIRATION_MODES, TwelveUiCorpusClient, } from './corpus-client.js';
|
|
7
7
|
import { readConversionConfig } from './config.js';
|
|
8
|
+
import { loadCorpusReferenceImage } from './cli-corpus-reference-image.js';
|
|
8
9
|
export { downloadCorpusInspiration, resumeCorpusInspiration, } from './cli-corpus-run.js';
|
|
9
10
|
export { CORPUS_USAGE_NOTICE, } from './cli-corpus-types.js';
|
|
10
11
|
const positiveInteger = (value, fallback, name) => {
|
|
@@ -16,30 +17,13 @@ const positiveInteger = (value, fallback, name) => {
|
|
|
16
17
|
}
|
|
17
18
|
return parsed;
|
|
18
19
|
};
|
|
19
|
-
const
|
|
20
|
+
const inspirationMode = (value) => {
|
|
20
21
|
if (value === undefined)
|
|
21
|
-
return
|
|
22
|
-
|
|
23
|
-
if (!Number.isFinite(parsed) || parsed < minimum || parsed > maximum) {
|
|
24
|
-
throw new Error(`--${name} must be between ${minimum} and ${maximum}`);
|
|
25
|
-
}
|
|
26
|
-
return parsed;
|
|
27
|
-
};
|
|
28
|
-
const optionalSeed = (value) => {
|
|
29
|
-
if (value === undefined)
|
|
30
|
-
return undefined;
|
|
31
|
-
const parsed = Number(value);
|
|
32
|
-
if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > 0xffff_ffff) {
|
|
33
|
-
throw new Error('--seed must be an integer between 0 and 4294967295');
|
|
34
|
-
}
|
|
35
|
-
return parsed;
|
|
36
|
-
};
|
|
37
|
-
const optionalAspect = (value) => {
|
|
38
|
-
if (value === undefined)
|
|
39
|
-
return undefined;
|
|
40
|
-
if (value === 'portrait' || value === 'landscape' || value === 'square')
|
|
22
|
+
return 'balanced';
|
|
23
|
+
if (INSPIRATION_MODES.includes(value)) {
|
|
41
24
|
return value;
|
|
42
|
-
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`--mode must be one of: ${INSPIRATION_MODES.join(', ')}`);
|
|
43
27
|
};
|
|
44
28
|
const readQuery = async (flags) => {
|
|
45
29
|
const query = stringFlag(flags, 'query')?.trim();
|
|
@@ -58,14 +42,20 @@ export const runCorpusCommand = async (action, flags, dependencies = {
|
|
|
58
42
|
}) => {
|
|
59
43
|
if (action !== 'inspire' && action !== 'resume') {
|
|
60
44
|
throw new Error('Usage: 12ui corpus inspire --query <text>|--query-file <file>'
|
|
61
|
-
+ ' --out-dir <directory> [--
|
|
62
|
-
+ ' [--
|
|
45
|
+
+ ' --out-dir <directory> [--mode direct|balanced|adventurer]'
|
|
46
|
+
+ ' [--count <1-48>]'
|
|
47
|
+
+ ' [--reference-image <png|jpeg|webp>]'
|
|
63
48
|
+ ' [--idempotency-key <key>]'
|
|
64
49
|
+ '\n 12ui corpus resume --out-dir <directory>');
|
|
65
50
|
}
|
|
66
51
|
if (action === 'inspire' && stringFlag(flags, 'kind') !== undefined) {
|
|
67
|
-
throw new Error('--kind
|
|
68
|
-
|
|
52
|
+
throw new Error('--kind was removed. Use --mode direct, balanced, or adventurer.');
|
|
53
|
+
}
|
|
54
|
+
if (action === 'inspire'
|
|
55
|
+
&& (stringFlag(flags, 'wildness') !== undefined
|
|
56
|
+
|| stringFlag(flags, 'seed') !== undefined
|
|
57
|
+
|| stringFlag(flags, 'aspect') !== undefined)) {
|
|
58
|
+
throw new Error('--wildness, --seed, and --aspect were removed. Use --mode direct, balanced, or adventurer.');
|
|
69
59
|
}
|
|
70
60
|
const outDir = stringFlag(flags, 'out-dir')?.trim();
|
|
71
61
|
if (!outDir)
|
|
@@ -79,6 +69,7 @@ export const runCorpusCommand = async (action, flags, dependencies = {
|
|
|
79
69
|
const manifest = await resumeCorpusInspiration({ client, outDir, origin: config.origin });
|
|
80
70
|
console.log(JSON.stringify({
|
|
81
71
|
setId: manifest.response.setId,
|
|
72
|
+
mode: manifest.response.mode,
|
|
82
73
|
seed: manifest.response.seed,
|
|
83
74
|
outDir: path.resolve(outDir),
|
|
84
75
|
manifest: path.join(path.resolve(outDir), INSPIRATION_MANIFEST_FILE),
|
|
@@ -89,28 +80,28 @@ export const runCorpusCommand = async (action, flags, dependencies = {
|
|
|
89
80
|
const count = positiveInteger(stringFlag(flags, 'count'), 4, 'count');
|
|
90
81
|
if (count > 48)
|
|
91
82
|
throw new Error('--count must be at most 48');
|
|
92
|
-
const
|
|
93
|
-
const seed = optionalSeed(stringFlag(flags, 'seed'));
|
|
94
|
-
const aspect = optionalAspect(stringFlag(flags, 'aspect'));
|
|
83
|
+
const mode = inspirationMode(stringFlag(flags, 'mode'));
|
|
95
84
|
const query = await readQuery(flags);
|
|
96
85
|
const request = {
|
|
97
86
|
q: query,
|
|
87
|
+
mode,
|
|
98
88
|
k: count,
|
|
99
|
-
tau: wildness,
|
|
100
|
-
...(aspect ? { filters: {
|
|
101
|
-
...(aspect ? { aspect } : {}),
|
|
102
|
-
} } : {}),
|
|
103
|
-
...(seed !== undefined ? { seed } : {}),
|
|
104
89
|
};
|
|
90
|
+
const referenceImagePath = stringFlag(flags, 'reference-image')?.trim();
|
|
91
|
+
const referenceImage = referenceImagePath
|
|
92
|
+
? await loadCorpusReferenceImage(referenceImagePath)
|
|
93
|
+
: undefined;
|
|
105
94
|
const manifest = await downloadCorpusInspiration({
|
|
106
95
|
client,
|
|
107
96
|
request,
|
|
108
97
|
outDir,
|
|
109
98
|
origin: config.origin,
|
|
110
99
|
idempotencyKey: stringFlag(flags, 'idempotency-key'),
|
|
100
|
+
...(referenceImage ? { referenceImage } : {}),
|
|
111
101
|
});
|
|
112
102
|
console.log(JSON.stringify({
|
|
113
103
|
setId: manifest.response.setId,
|
|
104
|
+
mode: manifest.response.mode,
|
|
114
105
|
seed: manifest.response.seed,
|
|
115
106
|
outDir: path.resolve(outDir),
|
|
116
107
|
manifest: path.join(path.resolve(outDir), INSPIRATION_MANIFEST_FILE),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-command.js","sourceRoot":"","sources":["../src/cli-corpus-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,GAGrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-corpus-command.js","sourceRoot":"","sources":["../src/cli-corpus-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-evidence.d.ts","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-corpus-evidence.d.ts","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AA2H/B,eAAO,MAAM,sBAAsB,GACjC,UAAU,yBAAyB,EACnC,QAAQ,MAAM,KACb,IA0BF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,MAAM,EACd,SAAS,wBAAwB,KAChC,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,KACb,OAAO,CAAC,wBAAwB,CAKlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,UAAU,yBAAyB,KAClC,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,MAAM,KACb,OAAO,CAAC,yBAAyB,CAKnC,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,QAAQ,MAAM,KACb,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAO1C,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,SAAS,wBAAwB,EACjC,UAAU,yBAAyB,KAClC,IAOF,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAOjF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM;IACnD,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,UAAU,EAAE,yBAAyB,EAAE,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CA6BpC,CAAC"}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { INSPIRATION_MODES } from './corpus-client.js';
|
|
3
4
|
import { CORPUS_USAGE_NOTICE, INSPIRATION_ATTEMPT_FILE, INSPIRATION_EVIDENCE_FILE, INSPIRATION_MANIFEST_FILE, } from './cli-corpus-types.js';
|
|
4
5
|
const isRecord = (value) => (typeof value === 'object' && value !== null && !Array.isArray(value));
|
|
5
6
|
const isErrno = (error, code) => (error instanceof Error && 'code' in error && error.code === code);
|
|
6
7
|
const isCorpusAspect = (value) => (value === 'portrait' || value === 'landscape' || value === 'square');
|
|
8
|
+
const isInspirationMode = (value) => (INSPIRATION_MODES.includes(value));
|
|
7
9
|
const validInspirationRequest = (request) => (typeof request.q === 'string'
|
|
8
10
|
&& Boolean(request.q.trim())
|
|
11
|
+
&& (request.mode === undefined || isInspirationMode(request.mode))
|
|
9
12
|
&& (request.k === undefined
|
|
10
13
|
|| (typeof request.k === 'number'
|
|
11
14
|
&& Number.isSafeInteger(request.k)
|
|
12
15
|
&& request.k >= 1)));
|
|
16
|
+
const validReferenceImageEvidence = (value) => (value === undefined || (isRecord(value)
|
|
17
|
+
&& typeof value.sourcePath === 'string'
|
|
18
|
+
&& path.isAbsolute(value.sourcePath)
|
|
19
|
+
&& (value.mediaType === 'image/png' || value.mediaType === 'image/jpeg' || value.mediaType === 'image/webp')
|
|
20
|
+
&& typeof value.sha256 === 'string'
|
|
21
|
+
&& /^[a-f0-9]{64}$/u.test(value.sha256)
|
|
22
|
+
&& typeof value.bytes === 'number'
|
|
23
|
+
&& Number.isSafeInteger(value.bytes)
|
|
24
|
+
&& value.bytes > 0));
|
|
13
25
|
const parseInspirationAttempt = (value) => {
|
|
14
26
|
if (!isRecord(value)
|
|
15
27
|
|| value.version !== 1
|
|
@@ -22,13 +34,18 @@ const parseInspirationAttempt = (value) => {
|
|
|
22
34
|
|| value.idempotencyKey.length > 128
|
|
23
35
|
|| /[\u0000-\u001f\u007f]/u.test(value.idempotencyKey)
|
|
24
36
|
|| !isRecord(value.request)
|
|
25
|
-
|| !validInspirationRequest(value.request)
|
|
37
|
+
|| !validInspirationRequest(value.request)
|
|
38
|
+
|| !validReferenceImageEvidence(value.referenceImage)) {
|
|
26
39
|
throw new Error('Corpus inspiration attempt evidence is invalid');
|
|
27
40
|
}
|
|
28
41
|
return value;
|
|
29
42
|
};
|
|
30
43
|
const parseInspirationEvidence = (value) => {
|
|
31
|
-
if (!isRecord(value)
|
|
44
|
+
if (!isRecord(value)
|
|
45
|
+
|| value.version !== 1
|
|
46
|
+
|| !isRecord(value.request)
|
|
47
|
+
|| !isRecord(value.response)
|
|
48
|
+
|| !validReferenceImageEvidence(value.referenceImage)) {
|
|
32
49
|
throw new Error('Corpus inspiration evidence is invalid');
|
|
33
50
|
}
|
|
34
51
|
const request = value.request;
|
|
@@ -38,6 +55,7 @@ const parseInspirationEvidence = (value) => {
|
|
|
38
55
|
}
|
|
39
56
|
if (typeof response.setId !== 'string'
|
|
40
57
|
|| typeof response.query !== 'string'
|
|
58
|
+
|| !isInspirationMode(response.mode)
|
|
41
59
|
|| typeof response.seed !== 'number'
|
|
42
60
|
|| !Number.isSafeInteger(response.seed)
|
|
43
61
|
|| typeof response.k !== 'number'
|
|
@@ -47,7 +65,9 @@ const parseInspirationEvidence = (value) => {
|
|
|
47
65
|
|| typeof response.coverage !== 'number'
|
|
48
66
|
|| !Number.isFinite(response.coverage)
|
|
49
67
|
|| typeof response.truncated !== 'boolean'
|
|
50
|
-
|| response.
|
|
68
|
+
|| (response.designType !== undefined
|
|
69
|
+
&& response.designType !== null
|
|
70
|
+
&& !isRecord(response.designType))
|
|
51
71
|
|| !Array.isArray(response.items)) {
|
|
52
72
|
throw new Error('Corpus inspiration response evidence is invalid');
|
|
53
73
|
}
|
|
@@ -70,7 +90,12 @@ const parseInspirationEvidence = (value) => {
|
|
|
70
90
|
};
|
|
71
91
|
export const validateInspirationSet = (evidence, outDir) => {
|
|
72
92
|
const expectedCount = evidence.request.k ?? 24;
|
|
93
|
+
const expectedMode = evidence.request.mode ?? 'balanced';
|
|
73
94
|
const { response } = evidence;
|
|
95
|
+
if (response.mode !== expectedMode) {
|
|
96
|
+
throw new Error(`Corpus inspiration response ran ${response.mode} but request expected ${expectedMode};`
|
|
97
|
+
+ ` evidence is in ${outDir}`);
|
|
98
|
+
}
|
|
74
99
|
if (response.k !== expectedCount) {
|
|
75
100
|
throw new Error(`Corpus inspiration response expected ${response.k} references but request expected`
|
|
76
101
|
+ ` ${expectedCount}; evidence is in ${outDir}`);
|
|
@@ -112,6 +137,9 @@ export const assertAttemptMatchesEvidence = (attempt, evidence) => {
|
|
|
112
137
|
if (JSON.stringify(attempt.request) !== JSON.stringify(evidence.request)) {
|
|
113
138
|
throw new Error('Corpus inspiration attempt and response evidence requests do not match');
|
|
114
139
|
}
|
|
140
|
+
if (JSON.stringify(attempt.referenceImage) !== JSON.stringify(evidence.referenceImage)) {
|
|
141
|
+
throw new Error('Corpus inspiration attempt and response evidence source images do not match');
|
|
142
|
+
}
|
|
115
143
|
};
|
|
116
144
|
export const assertInspirationRunIncomplete = async (outDir) => {
|
|
117
145
|
try {
|
|
@@ -132,15 +160,17 @@ export const writeInspirationManifest = async (args) => {
|
|
|
132
160
|
idempotencyKey: args.attempt.idempotencyKey,
|
|
133
161
|
notice: CORPUS_USAGE_NOTICE,
|
|
134
162
|
request,
|
|
163
|
+
...(args.evidence.referenceImage ? { referenceImage: args.evidence.referenceImage } : {}),
|
|
135
164
|
response: {
|
|
136
165
|
setId: response.setId,
|
|
137
166
|
query: response.query,
|
|
167
|
+
mode: response.mode,
|
|
138
168
|
seed: response.seed,
|
|
139
169
|
k: response.k,
|
|
140
170
|
poolSize: response.poolSize,
|
|
141
171
|
coverage: response.coverage,
|
|
142
172
|
truncated: response.truncated,
|
|
143
|
-
|
|
173
|
+
...(response.designType !== undefined ? { designType: response.designType } : {}),
|
|
144
174
|
},
|
|
145
175
|
references: args.references,
|
|
146
176
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-evidence.js","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,GAK1B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,CACrE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CACrE,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,IAAY,EAAkC,EAAE,CAAC,CAChF,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CACjE,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE,CAAC,CAChE,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ,CACpE,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,OAAgC,EAAW,EAAE,CAAC,CAC7E,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ;OAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;OACzB,CACD,OAAO,CAAC,CAAC,KAAK,SAAS;WACpB,CACD,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ;eAC1B,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;eAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,CAClB,CACF,CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAA4B,EAAE;IAC3E,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;WACb,KAAK,CAAC,OAAO,KAAK,CAAC;WACnB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;WACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;WAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;WAChC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;WACnC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;WACxC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE;WAC5B,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,GAAG;WACjC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;WACnD,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;WACxB,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"cli-corpus-evidence.js","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAwB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,GAK1B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,CACrE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CACrE,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,IAAY,EAAkC,EAAE,CAAC,CAChF,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CACjE,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE,CAAC,CAChE,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ,CACpE,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA4B,EAAE,CAAC,CACtE,iBAAiB,CAAC,QAAQ,CAAC,KAAwB,CAAC,CACrD,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,OAAgC,EAAW,EAAE,CAAC,CAC7E,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ;OAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;OACzB,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;OAC/D,CACD,OAAO,CAAC,CAAC,KAAK,SAAS;WACpB,CACD,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ;eAC1B,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;eAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,CAClB,CACF,CACF,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,CAC/D,KAAK,KAAK,SAAS,IAAI,CACrB,QAAQ,CAAC,KAAK,CAAC;OACZ,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;OACpC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;OACjC,CAAC,KAAK,CAAC,SAAS,KAAK,WAAW,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,CAAC;OACzG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;OAChC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;OACpC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;OAC/B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;OACjC,KAAK,CAAC,KAAK,GAAG,CAAC,CACnB,CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAA4B,EAAE;IAC3E,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;WACb,KAAK,CAAC,OAAO,KAAK,CAAC;WACnB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;WACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;WAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;WAChC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;WACnC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;WACxC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE;WAC5B,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,GAAG;WACjC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;WACnD,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;WACxB,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC;WACvC,CAAC,2BAA2B,CAAC,KAAK,CAAC,cAAc,CAAC,EACrD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAA4C,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,KAAc,EAA6B,EAAE;IAC7E,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;WACb,KAAK,CAAC,OAAO,KAAK,CAAC;WACnB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;WACxB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;WACzB,CAAC,2BAA2B,CAAC,KAAK,CAAC,cAAc,CAAC,EACrD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IACE,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;WAC/B,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;WAClC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;WACjC,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;WACjC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;WACpC,OAAO,QAAQ,CAAC,CAAC,KAAK,QAAQ;WAC9B,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;WACjC,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;WACrC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;WACxC,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;WACrC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;WACnC,OAAO,QAAQ,CAAC,SAAS,KAAK,SAAS;WACvC,CACD,QAAQ,CAAC,UAAU,KAAK,SAAS;eAC9B,QAAQ,CAAC,UAAU,KAAK,IAAI;eAC5B,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAClC;WACE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAChD,QAAQ,CAAC,IAAI,CAAC;WACX,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;WAC3B,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;WACzD,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;WACjD,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ;WAC5B,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;WACrD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;WAC3B,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;WAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;WAC/B,OAAO,IAAI,CAAC,mBAAmB,KAAK,QAAQ;WAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC;WACzC,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;WAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC3C,CAAC,CAAC;IACH,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChF,OAAO,KAA6C,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAmC,EACnC,MAAc,EACR,EAAE;IACR,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAC9B,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,mCAAmC,QAAQ,CAAC,IAAI,yBAAyB,YAAY,GAAG;cACtF,mBAAmB,MAAM,EAAE,CAC9B,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,CAAC,CAAC,kCAAkC;cAClF,IAAI,aAAa,oBAAoB,MAAM,EAAE,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,KAAK,CAAC,MAAM,OAAO,aAAa,aAAa;cACnF,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,oBAAoB,MAAM,EAAE,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,uEAAuE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC1C,MAAc,EACd,OAAiC,EAClB,EAAE;IACjB,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAC3C,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACvC,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACzC,MAAc,EACqB,EAAE;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAAE,MAAM,CAAC,CACzD,CAAC;IACb,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,MAAc,EACd,QAAmC,EACpB,EAAE;IACjB,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAC5C,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACxC,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC1C,MAAc,EACsB,EAAE;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAC1D,CAAC;IACb,OAAO,wBAAwB,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,EAClD,MAAc,EAC6B,EAAE;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAAiC,EACjC,QAAmC,EAC7B,EAAE;IACR,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;IACpF,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;IAC7C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,IAM9C,EAAsC,EAAE;IACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5C,MAAM,QAAQ,GAA8B;QAC1C,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QAC3D,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;QAC3B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;QAC3C,MAAM,EAAE,mBAAmB;QAC3B,OAAO;QACP,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,QAAQ,EAAE;YACR,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClF;QACD,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;IACF,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,EACjD,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACxC,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CorpusReferenceImageInput, type CorpusReferenceImageMediaType } from './corpus-client.js';
|
|
2
|
+
export type CorpusReferenceImageEvidence = {
|
|
3
|
+
sourcePath: string;
|
|
4
|
+
mediaType: CorpusReferenceImageMediaType;
|
|
5
|
+
sha256: string;
|
|
6
|
+
bytes: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const loadCorpusReferenceImage: (source: string, expected?: CorpusReferenceImageEvidence) => Promise<{
|
|
9
|
+
evidence: CorpusReferenceImageEvidence;
|
|
10
|
+
input: CorpusReferenceImageInput;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const stableReferenceImageIdempotencyKey: (request: unknown, referenceImage: CorpusReferenceImageEvidence) => string;
|
|
13
|
+
//# sourceMappingURL=cli-corpus-reference-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-reference-image.d.ts","sourceRoot":"","sources":["../src/cli-corpus-reference-image.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EACnC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,6BAA6B,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAyBF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,WAAW,4BAA4B,KACtC,OAAO,CAAC;IAAE,QAAQ,EAAE,4BAA4B,CAAC;IAAC,KAAK,EAAE,yBAAyB,CAAA;CAAE,CAkBtF,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,SAAS,OAAO,EAChB,gBAAgB,4BAA4B,KAC3C,MASF,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { MAX_CORPUS_REFERENCE_IMAGE_BYTES, } from './corpus-client.js';
|
|
5
|
+
const mediaTypeFor = (bytes) => {
|
|
6
|
+
if (bytes.length >= 8
|
|
7
|
+
&& bytes[0] === 0x89
|
|
8
|
+
&& bytes[1] === 0x50
|
|
9
|
+
&& bytes[2] === 0x4e
|
|
10
|
+
&& bytes[3] === 0x47
|
|
11
|
+
&& bytes[4] === 0x0d
|
|
12
|
+
&& bytes[5] === 0x0a
|
|
13
|
+
&& bytes[6] === 0x1a
|
|
14
|
+
&& bytes[7] === 0x0a)
|
|
15
|
+
return 'image/png';
|
|
16
|
+
if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
|
|
17
|
+
return 'image/jpeg';
|
|
18
|
+
}
|
|
19
|
+
if (bytes.length >= 12
|
|
20
|
+
&& String.fromCharCode(...bytes.subarray(0, 4)) === 'RIFF'
|
|
21
|
+
&& String.fromCharCode(...bytes.subarray(8, 12)) === 'WEBP')
|
|
22
|
+
return 'image/webp';
|
|
23
|
+
return null;
|
|
24
|
+
};
|
|
25
|
+
export const loadCorpusReferenceImage = async (source, expected) => {
|
|
26
|
+
const sourcePath = path.resolve(source);
|
|
27
|
+
const file = await stat(sourcePath);
|
|
28
|
+
if (!file.isFile())
|
|
29
|
+
throw new Error('--reference-image must identify a regular file');
|
|
30
|
+
if (file.size < 1 || file.size > MAX_CORPUS_REFERENCE_IMAGE_BYTES) {
|
|
31
|
+
throw new Error(`--reference-image must be between 1 and ${MAX_CORPUS_REFERENCE_IMAGE_BYTES} bytes`);
|
|
32
|
+
}
|
|
33
|
+
const bytes = new Uint8Array(await readFile(sourcePath));
|
|
34
|
+
const mediaType = mediaTypeFor(bytes);
|
|
35
|
+
if (!mediaType)
|
|
36
|
+
throw new Error('--reference-image must be a valid PNG, JPEG, or WebP file');
|
|
37
|
+
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
38
|
+
const evidence = { sourcePath, mediaType, sha256, bytes: bytes.byteLength };
|
|
39
|
+
if (expected && JSON.stringify(evidence) !== JSON.stringify(expected)) {
|
|
40
|
+
throw new Error('The redesign source changed since the corpus attempt was recorded');
|
|
41
|
+
}
|
|
42
|
+
return { evidence, input: { bytes, mediaType, sha256 } };
|
|
43
|
+
};
|
|
44
|
+
export const stableReferenceImageIdempotencyKey = (request, referenceImage) => {
|
|
45
|
+
const digest = createHash('sha256')
|
|
46
|
+
.update(JSON.stringify({ request, referenceImage: {
|
|
47
|
+
mediaType: referenceImage.mediaType,
|
|
48
|
+
sha256: referenceImage.sha256,
|
|
49
|
+
bytes: referenceImage.bytes,
|
|
50
|
+
} }))
|
|
51
|
+
.digest('hex');
|
|
52
|
+
return `corpus-inspire:image:${digest}`;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=cli-corpus-reference-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-reference-image.js","sourceRoot":"","sources":["../src/cli-corpus-reference-image.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-corpus-run.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import type { CorpusInspirationRequest } from './corpus-client.js';
|
|
2
2
|
import type { CorpusInspirationManifest, InspirationClient } from './cli-corpus-types.js';
|
|
3
|
+
import { type CorpusReferenceImageEvidence } from './cli-corpus-reference-image.js';
|
|
4
|
+
import type { CorpusReferenceImageInput } from './corpus-client.js';
|
|
3
5
|
export declare const downloadCorpusInspiration: (args: {
|
|
4
6
|
client: InspirationClient;
|
|
5
7
|
request: CorpusInspirationRequest;
|
|
6
8
|
outDir: string;
|
|
7
9
|
origin: string;
|
|
8
10
|
idempotencyKey?: string;
|
|
11
|
+
referenceImage?: {
|
|
12
|
+
evidence: CorpusReferenceImageEvidence;
|
|
13
|
+
input: CorpusReferenceImageInput;
|
|
14
|
+
};
|
|
9
15
|
now?: () => Date;
|
|
10
16
|
}) => Promise<CorpusInspirationManifest>;
|
|
11
17
|
export declare const resumeCorpusInspiration: (args: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-run.d.ts","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-corpus-run.d.ts","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,4BAA4B,CAAC;QACvC,KAAK,EAAE,yBAAyB,CAAC;KAClC,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CA0DpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM;IAClD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CAoDpC,CAAC"}
|
package/dist/cli-corpus-run.js
CHANGED
|
@@ -5,6 +5,7 @@ import { CORPUS_QUERY_IDEMPOTENCY_REVISION } from './corpus-client.js';
|
|
|
5
5
|
import { assertAttemptMatchesEvidence, assertInspirationRunIncomplete, readInspirationAttempt, readOptionalInspirationEvidence, validateInspirationSet, writeInspirationAttempt, writeInspirationEvidence, writeInspirationManifest, } from './cli-corpus-evidence.js';
|
|
6
6
|
import { completeReferenceDownloads } from './cli-corpus-reference-downloads.js';
|
|
7
7
|
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
8
|
+
import { loadCorpusReferenceImage, stableReferenceImageIdempotencyKey, } from './cli-corpus-reference-image.js';
|
|
8
9
|
export const downloadCorpusInspiration = async (args) => {
|
|
9
10
|
const outDir = path.resolve(args.outDir);
|
|
10
11
|
const origin = new URL(args.origin).origin;
|
|
@@ -15,7 +16,9 @@ export const downloadCorpusInspiration = async (args) => {
|
|
|
15
16
|
}
|
|
16
17
|
await mkdir(path.dirname(outDir), { recursive: true });
|
|
17
18
|
await mkdir(outDir);
|
|
18
|
-
const idempotencyKey = normalizeOptionalIdempotencyKey(args.idempotencyKey ??
|
|
19
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(args.idempotencyKey ?? (args.referenceImage
|
|
20
|
+
? stableReferenceImageIdempotencyKey(args.request, args.referenceImage.evidence)
|
|
21
|
+
: `corpus-inspire:${randomUUID()}`), 'idempotencyKey');
|
|
19
22
|
if (!idempotencyKey)
|
|
20
23
|
throw new TypeError('idempotencyKey is required');
|
|
21
24
|
const attempt = {
|
|
@@ -24,11 +27,15 @@ export const downloadCorpusInspiration = async (args) => {
|
|
|
24
27
|
origin,
|
|
25
28
|
idempotencyKey,
|
|
26
29
|
request: args.request,
|
|
30
|
+
...(args.referenceImage ? { referenceImage: args.referenceImage.evidence } : {}),
|
|
27
31
|
};
|
|
28
32
|
await writeInspirationAttempt(outDir, attempt);
|
|
29
33
|
let response;
|
|
30
34
|
try {
|
|
31
|
-
response = await args.client.inspire(args.request, {
|
|
35
|
+
response = await args.client.inspire(args.request, {
|
|
36
|
+
idempotencyKey,
|
|
37
|
+
...(args.referenceImage ? { referenceImage: args.referenceImage.input } : {}),
|
|
38
|
+
});
|
|
32
39
|
}
|
|
33
40
|
catch (error) {
|
|
34
41
|
throw new Error(`Corpus inspiration response is ambiguous; the stable attempt is in ${outDir}.`
|
|
@@ -37,6 +44,7 @@ export const downloadCorpusInspiration = async (args) => {
|
|
|
37
44
|
const evidence = {
|
|
38
45
|
version: 1,
|
|
39
46
|
request: args.request,
|
|
47
|
+
...(args.referenceImage ? { referenceImage: args.referenceImage.evidence } : {}),
|
|
40
48
|
response,
|
|
41
49
|
};
|
|
42
50
|
await writeInspirationEvidence(outDir, evidence);
|
|
@@ -64,10 +72,14 @@ export const resumeCorpusInspiration = async (args) => {
|
|
|
64
72
|
}
|
|
65
73
|
let evidence = await readOptionalInspirationEvidence(outDir);
|
|
66
74
|
if (!evidence) {
|
|
75
|
+
const referenceImage = attempt.referenceImage
|
|
76
|
+
? await loadCorpusReferenceImage(attempt.referenceImage.sourcePath, attempt.referenceImage)
|
|
77
|
+
: undefined;
|
|
67
78
|
let response;
|
|
68
79
|
try {
|
|
69
80
|
response = await args.client.inspire(attempt.request, {
|
|
70
81
|
idempotencyKey: attempt.idempotencyKey,
|
|
82
|
+
...(referenceImage ? { referenceImage: referenceImage.input } : {}),
|
|
71
83
|
});
|
|
72
84
|
}
|
|
73
85
|
catch (error) {
|
|
@@ -77,6 +89,7 @@ export const resumeCorpusInspiration = async (args) => {
|
|
|
77
89
|
evidence = {
|
|
78
90
|
version: 1,
|
|
79
91
|
request: attempt.request,
|
|
92
|
+
...(attempt.referenceImage ? { referenceImage: attempt.referenceImage } : {}),
|
|
80
93
|
response,
|
|
81
94
|
};
|
|
82
95
|
await writeInspirationEvidence(outDir, evidence);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-corpus-run.js","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAOjF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-corpus-run.js","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"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"}
|