@12ui/design 0.2.0

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 (157) hide show
  1. package/README.md +484 -0
  2. package/dist/artifact-materializer.d.ts +17 -0
  3. package/dist/artifact-materializer.d.ts.map +1 -0
  4. package/dist/artifact-materializer.js +66 -0
  5. package/dist/artifact-materializer.js.map +1 -0
  6. package/dist/cli-arguments.d.ts +8 -0
  7. package/dist/cli-arguments.d.ts.map +1 -0
  8. package/dist/cli-arguments.js +39 -0
  9. package/dist/cli-arguments.js.map +1 -0
  10. package/dist/cli-auth-command.d.ts +3 -0
  11. package/dist/cli-auth-command.d.ts.map +1 -0
  12. package/dist/cli-auth-command.js +100 -0
  13. package/dist/cli-auth-command.js.map +1 -0
  14. package/dist/cli-corpus-command.d.ts +12 -0
  15. package/dist/cli-corpus-command.d.ts.map +1 -0
  16. package/dist/cli-corpus-command.js +120 -0
  17. package/dist/cli-corpus-command.js.map +1 -0
  18. package/dist/cli-corpus-evidence.d.ts +17 -0
  19. package/dist/cli-corpus-evidence.d.ts.map +1 -0
  20. package/dist/cli-corpus-evidence.js +150 -0
  21. package/dist/cli-corpus-evidence.js.map +1 -0
  22. package/dist/cli-corpus-reference-downloads.d.ts +8 -0
  23. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -0
  24. package/dist/cli-corpus-reference-downloads.js +111 -0
  25. package/dist/cli-corpus-reference-downloads.js.map +1 -0
  26. package/dist/cli-corpus-reference-receipts.d.ts +36 -0
  27. package/dist/cli-corpus-reference-receipts.d.ts.map +1 -0
  28. package/dist/cli-corpus-reference-receipts.js +137 -0
  29. package/dist/cli-corpus-reference-receipts.js.map +1 -0
  30. package/dist/cli-corpus-run.d.ts +17 -0
  31. package/dist/cli-corpus-run.d.ts.map +1 -0
  32. package/dist/cli-corpus-run.js +94 -0
  33. package/dist/cli-corpus-run.js.map +1 -0
  34. package/dist/cli-corpus-types.d.ts +52 -0
  35. package/dist/cli-corpus-types.d.ts.map +1 -0
  36. package/dist/cli-corpus-types.js +6 -0
  37. package/dist/cli-corpus-types.js.map +1 -0
  38. package/dist/cli-export-command.d.ts +3 -0
  39. package/dist/cli-export-command.d.ts.map +1 -0
  40. package/dist/cli-export-command.js +234 -0
  41. package/dist/cli-export-command.js.map +1 -0
  42. package/dist/cli-image-command.d.ts +8 -0
  43. package/dist/cli-image-command.d.ts.map +1 -0
  44. package/dist/cli-image-command.js +193 -0
  45. package/dist/cli-image-command.js.map +1 -0
  46. package/dist/cli-persistence.d.ts +25 -0
  47. package/dist/cli-persistence.d.ts.map +1 -0
  48. package/dist/cli-persistence.js +253 -0
  49. package/dist/cli-persistence.js.map +1 -0
  50. package/dist/cli-skill-command.d.ts +9 -0
  51. package/dist/cli-skill-command.d.ts.map +1 -0
  52. package/dist/cli-skill-command.js +215 -0
  53. package/dist/cli-skill-command.js.map +1 -0
  54. package/dist/cli.d.ts +3 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +272 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/codex-skill-config.d.ts +3 -0
  59. package/dist/codex-skill-config.d.ts.map +1 -0
  60. package/dist/codex-skill-config.js +83 -0
  61. package/dist/codex-skill-config.js.map +1 -0
  62. package/dist/config.d.ts +7 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +34 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/conversion-client.d.ts +264 -0
  67. package/dist/conversion-client.d.ts.map +1 -0
  68. package/dist/conversion-client.js +445 -0
  69. package/dist/conversion-client.js.map +1 -0
  70. package/dist/conversion-models.d.ts +4 -0
  71. package/dist/conversion-models.d.ts.map +1 -0
  72. package/dist/conversion-models.js +3 -0
  73. package/dist/conversion-models.js.map +1 -0
  74. package/dist/conversion-outputs.d.ts +118 -0
  75. package/dist/conversion-outputs.d.ts.map +1 -0
  76. package/dist/conversion-outputs.js +84 -0
  77. package/dist/conversion-outputs.js.map +1 -0
  78. package/dist/conversion-problems.d.ts +3 -0
  79. package/dist/conversion-problems.d.ts.map +1 -0
  80. package/dist/conversion-problems.js +21 -0
  81. package/dist/conversion-problems.js.map +1 -0
  82. package/dist/corpus-client.d.ts +171 -0
  83. package/dist/corpus-client.d.ts.map +1 -0
  84. package/dist/corpus-client.js +85 -0
  85. package/dist/corpus-client.js.map +1 -0
  86. package/dist/credential-setup.d.ts +27 -0
  87. package/dist/credential-setup.d.ts.map +1 -0
  88. package/dist/credential-setup.js +242 -0
  89. package/dist/credential-setup.js.map +1 -0
  90. package/dist/credential-store.d.ts +12 -0
  91. package/dist/credential-store.d.ts.map +1 -0
  92. package/dist/credential-store.js +103 -0
  93. package/dist/credential-store.js.map +1 -0
  94. package/dist/idempotency-key.d.ts +2 -0
  95. package/dist/idempotency-key.d.ts.map +1 -0
  96. package/dist/idempotency-key.js +19 -0
  97. package/dist/idempotency-key.js.map +1 -0
  98. package/dist/image-generation-evidence.d.ts +26 -0
  99. package/dist/image-generation-evidence.d.ts.map +1 -0
  100. package/dist/image-generation-evidence.js +28 -0
  101. package/dist/image-generation-evidence.js.map +1 -0
  102. package/dist/image-output-width.d.ts +11 -0
  103. package/dist/image-output-width.d.ts.map +1 -0
  104. package/dist/image-output-width.js +55 -0
  105. package/dist/image-output-width.js.map +1 -0
  106. package/dist/image-provider-preflight.d.ts +21 -0
  107. package/dist/image-provider-preflight.d.ts.map +1 -0
  108. package/dist/image-provider-preflight.js +184 -0
  109. package/dist/image-provider-preflight.js.map +1 -0
  110. package/dist/index.d.ts +13 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +13 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/legacy-codex-cleanup.d.ts +11 -0
  115. package/dist/legacy-codex-cleanup.d.ts.map +1 -0
  116. package/dist/legacy-codex-cleanup.js +147 -0
  117. package/dist/legacy-codex-cleanup.js.map +1 -0
  118. package/dist/legacy-skill-catalog.d.ts +5 -0
  119. package/dist/legacy-skill-catalog.d.ts.map +1 -0
  120. package/dist/legacy-skill-catalog.js +123 -0
  121. package/dist/legacy-skill-catalog.js.map +1 -0
  122. package/dist/local-conversion-input.d.ts +21 -0
  123. package/dist/local-conversion-input.d.ts.map +1 -0
  124. package/dist/local-conversion-input.js +54 -0
  125. package/dist/local-conversion-input.js.map +1 -0
  126. package/dist/login-auth.d.ts +63 -0
  127. package/dist/login-auth.d.ts.map +1 -0
  128. package/dist/login-auth.js +282 -0
  129. package/dist/login-auth.js.map +1 -0
  130. package/dist/package-client.d.ts +147 -0
  131. package/dist/package-client.d.ts.map +1 -0
  132. package/dist/package-client.js +119 -0
  133. package/dist/package-client.js.map +1 -0
  134. package/dist/project-profiles.d.ts +45 -0
  135. package/dist/project-profiles.d.ts.map +1 -0
  136. package/dist/project-profiles.js +162 -0
  137. package/dist/project-profiles.js.map +1 -0
  138. package/dist/responsive-quality.d.ts +26 -0
  139. package/dist/responsive-quality.d.ts.map +1 -0
  140. package/dist/responsive-quality.js +68 -0
  141. package/dist/responsive-quality.js.map +1 -0
  142. package/dist/server.d.ts +6 -0
  143. package/dist/server.d.ts.map +1 -0
  144. package/dist/server.js +173 -0
  145. package/dist/server.js.map +1 -0
  146. package/dist/skill-installer.d.ts +51 -0
  147. package/dist/skill-installer.d.ts.map +1 -0
  148. package/dist/skill-installer.js +328 -0
  149. package/dist/skill-installer.js.map +1 -0
  150. package/package.json +53 -0
  151. package/skills/design/SKILL.md +156 -0
  152. package/skills/design/agents/openai.yaml +6 -0
  153. package/skills/design/references/selection-contract.md +44 -0
  154. package/skills/design-convert/SKILL.md +118 -0
  155. package/skills/design-convert/agents/openai.yaml +6 -0
  156. package/skills/design-search/SKILL.md +86 -0
  157. package/skills/design-search/agents/openai.yaml +6 -0
@@ -0,0 +1,242 @@
1
+ import { normalizeConversionOrigin } from './config.js';
2
+ import { readStoredConversionCredentials, resolveCredentialFile, resolveLegacyCredentialFile, removeStoredConversionCredentials, writeStoredConversionCredentials, } from './credential-store.js';
3
+ import { authenticateTwelveUiDevice, normalizeLoginOrigin, revokeTwelveUiCredential, TWELVE_UI_DEVICE_SCOPES, verifyTwelveUiCredential, } from './login-auth.js';
4
+ const errorValue = (value) => (value instanceof Error ? value : new Error(String(value)));
5
+ const isCredentialRejection = (error) => (error instanceof Error
6
+ && /required scopes?|credential|invalid[_ ](?:api[_ ])?key|unauthori[sz]ed|forbidden|HTTP (?:401|403)/iu
7
+ .test(error.message));
8
+ const throwAfterReplacementCleanup = async (args) => {
9
+ try {
10
+ await revokeTwelveUiCredential({
11
+ apiKey: args.apiKey,
12
+ loginOrigin: args.loginOrigin,
13
+ fetch: args.fetch,
14
+ });
15
+ }
16
+ catch (cleanupError) {
17
+ throw new AggregateError([errorValue(args.error), errorValue(cleanupError)], `${args.message}; the replacement credential could not be revoked`);
18
+ }
19
+ throw args.error;
20
+ };
21
+ export const prepareConversionCredentials = async (args) => {
22
+ const credentialFile = resolveCredentialFile();
23
+ const legacyCredentialFile = resolveLegacyCredentialFile();
24
+ const [canonicalStored, legacyStored] = await Promise.all([
25
+ readStoredConversionCredentials(credentialFile),
26
+ legacyCredentialFile
27
+ ? readStoredConversionCredentials(legacyCredentialFile)
28
+ : Promise.resolve(null),
29
+ ]);
30
+ if (canonicalStored
31
+ && legacyStored
32
+ && (canonicalStored.origin !== legacyStored.origin
33
+ || canonicalStored.apiKey !== legacyStored.apiKey)) {
34
+ throw new Error(`Conflicting 12ui credential files exist at ${credentialFile} and ${legacyCredentialFile}.`
35
+ + ' Resolve the conflict explicitly before installing; neither file was changed.');
36
+ }
37
+ const stored = canonicalStored ?? legacyStored;
38
+ const removeMigratedLegacy = async () => {
39
+ if (legacyCredentialFile && legacyStored) {
40
+ await removeStoredConversionCredentials(legacyCredentialFile);
41
+ }
42
+ };
43
+ const prepared = (options) => {
44
+ let state = 'pending';
45
+ const restoreCanonical = async () => {
46
+ if (canonicalStored) {
47
+ await writeStoredConversionCredentials(canonicalStored, credentialFile);
48
+ }
49
+ else {
50
+ await removeStoredConversionCredentials(credentialFile);
51
+ }
52
+ };
53
+ const revokeReplacement = async () => {
54
+ if (!options.replacementIsRemote)
55
+ return;
56
+ await revokeTwelveUiCredential({
57
+ apiKey: options.replacement.apiKey,
58
+ loginOrigin,
59
+ fetch: args.fetch,
60
+ });
61
+ };
62
+ return {
63
+ result: options.result,
64
+ commit: async () => {
65
+ if (state === 'committed')
66
+ return options.result;
67
+ if (state === 'rolled_back') {
68
+ throw new Error('Cannot commit rolled-back 12UI credentials');
69
+ }
70
+ try {
71
+ await writeStoredConversionCredentials(options.replacement, credentialFile);
72
+ }
73
+ catch (error) {
74
+ state = 'rolled_back';
75
+ if (!options.replacementIsRemote)
76
+ throw error;
77
+ return throwAfterReplacementCleanup({
78
+ apiKey: options.replacement.apiKey,
79
+ error,
80
+ fetch: args.fetch,
81
+ loginOrigin,
82
+ message: 'The replacement credential could not be stored',
83
+ });
84
+ }
85
+ try {
86
+ await removeMigratedLegacy();
87
+ }
88
+ catch (migrationError) {
89
+ state = 'rolled_back';
90
+ try {
91
+ await restoreCanonical();
92
+ }
93
+ catch (rollbackError) {
94
+ throw new AggregateError([errorValue(migrationError), errorValue(rollbackError)], 'Credential migration failed and the canonical credential file could not be restored');
95
+ }
96
+ if (options.replacementIsRemote) {
97
+ try {
98
+ await revokeReplacement();
99
+ }
100
+ catch (cleanupError) {
101
+ throw new AggregateError([errorValue(migrationError), errorValue(cleanupError)], 'Credential migration failed; prior files were restored, but the replacement'
102
+ + ' credential could not be revoked');
103
+ }
104
+ }
105
+ throw migrationError;
106
+ }
107
+ if (options.credentialToUpgrade) {
108
+ try {
109
+ await revokeTwelveUiCredential({
110
+ apiKey: options.credentialToUpgrade.apiKey,
111
+ loginOrigin,
112
+ fetch: args.fetch,
113
+ });
114
+ }
115
+ catch (retirementError) {
116
+ state = 'rolled_back';
117
+ try {
118
+ await writeStoredConversionCredentials(options.credentialToUpgrade, credentialFile);
119
+ }
120
+ catch (rollbackError) {
121
+ throw new AggregateError([errorValue(retirementError), errorValue(rollbackError)], 'The replacement credential remains stored and usable, but the previous credential'
122
+ + ' could not be revoked and the credential file could not be rolled back');
123
+ }
124
+ try {
125
+ await revokeReplacement();
126
+ }
127
+ catch (cleanupError) {
128
+ throw new AggregateError([errorValue(retirementError), errorValue(cleanupError)], 'Credential scope upgrade failed; the previous credential was restored, but the'
129
+ + ' replacement credential could not be revoked');
130
+ }
131
+ throw new Error('Credential scope upgrade failed while retiring the previous credential;'
132
+ + ' the previous credential was restored and the replacement was revoked', { cause: retirementError });
133
+ }
134
+ }
135
+ state = 'committed';
136
+ return options.result;
137
+ },
138
+ rollback: async () => {
139
+ if (state !== 'pending')
140
+ return;
141
+ state = 'rolled_back';
142
+ await revokeReplacement();
143
+ },
144
+ };
145
+ };
146
+ const fromFlag = args.apiKey?.trim();
147
+ const fromEnvironment = process.env.TWELVE_UI_API_KEY?.trim();
148
+ const supplied = fromFlag || fromEnvironment;
149
+ const origin = normalizeConversionOrigin(args.origin
150
+ ?? process.env.TWELVE_UI_ORIGIN
151
+ ?? stored?.origin
152
+ ?? 'https://12ui.com');
153
+ const loginOrigin = normalizeLoginOrigin(args.loginOrigin);
154
+ const requiredScopes = args.requiredScopes ?? ['design.convert'];
155
+ const verify = (apiKey, scopes = requiredScopes) => verifyTwelveUiCredential({
156
+ apiKey,
157
+ loginOrigin,
158
+ requiredScopes: scopes,
159
+ fetch: args.fetch,
160
+ });
161
+ const verifyStored = async (apiKey) => {
162
+ const preferred = [
163
+ ...requiredScopes,
164
+ ...TWELVE_UI_DEVICE_SCOPES,
165
+ ].filter((scope, index, scopes) => scopes.indexOf(scope) === index);
166
+ for (const scope of preferred) {
167
+ try {
168
+ return await verify(apiKey, [scope]);
169
+ }
170
+ catch (error) {
171
+ if (!isCredentialRejection(error))
172
+ throw error;
173
+ // A valid credential can have only the other supported scope. Try each
174
+ // scope before treating the stored key as stale and reconnecting.
175
+ }
176
+ }
177
+ return null;
178
+ };
179
+ if (supplied) {
180
+ await verify(supplied);
181
+ const result = {
182
+ credentialFile,
183
+ origin,
184
+ source: fromFlag ? 'flag' : 'environment',
185
+ };
186
+ return prepared({
187
+ replacement: { version: 1, origin, apiKey: supplied },
188
+ result,
189
+ });
190
+ }
191
+ let credentialToUpgrade = null;
192
+ if (stored && !args.forceAuthentication) {
193
+ const verification = await verifyStored(stored.apiKey);
194
+ if (verification && requiredScopes.every((scope) => verification.scopes.includes(scope))) {
195
+ return prepared({
196
+ // Rewriting on commit also normalizes an accepted canonical file back
197
+ // to mode 0600 instead of trusting permissions that may have drifted.
198
+ replacement: { ...stored, origin },
199
+ result: { credentialFile, origin, source: 'stored' },
200
+ });
201
+ }
202
+ if (verification)
203
+ credentialToUpgrade = stored;
204
+ }
205
+ const credential = await authenticateTwelveUiDevice({
206
+ loginOrigin,
207
+ clientName: '12ui CLI',
208
+ deviceName: args.keyName,
209
+ scopes: requiredScopes,
210
+ onApprovalUrl: args.onApprovalUrl,
211
+ openApproval: args.openApproval,
212
+ fetch: args.fetch,
213
+ });
214
+ try {
215
+ await verify(credential.apiKey);
216
+ }
217
+ catch (error) {
218
+ return throwAfterReplacementCleanup({
219
+ apiKey: credential.apiKey,
220
+ error,
221
+ fetch: args.fetch,
222
+ loginOrigin,
223
+ message: 'The replacement credential failed verification',
224
+ });
225
+ }
226
+ const replacement = {
227
+ version: 1,
228
+ origin,
229
+ apiKey: credential.apiKey,
230
+ };
231
+ return prepared({
232
+ replacement,
233
+ result: { credentialFile, origin, source: 'browser' },
234
+ replacementIsRemote: true,
235
+ credentialToUpgrade,
236
+ });
237
+ };
238
+ export const setUpConversionCredentials = async (args) => {
239
+ const transaction = await prepareConversionCredentials(args);
240
+ return transaction.commit();
241
+ };
242
+ //# sourceMappingURL=credential-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-setup.js","sourceRoot":"","sources":["../src/credential-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type StoredConversionCredentials = {
2
+ version: 1;
3
+ origin: string;
4
+ apiKey: string;
5
+ };
6
+ export declare const resolveCredentialFile: (environment?: NodeJS.ProcessEnv, homeDirectory?: string) => string;
7
+ export declare const resolveLegacyCredentialFile: (environment?: NodeJS.ProcessEnv, homeDirectory?: string) => string | null;
8
+ export declare const readStoredConversionCredentialsSync: (filePath?: string) => StoredConversionCredentials | null;
9
+ export declare const readStoredConversionCredentials: (filePath?: string) => Promise<StoredConversionCredentials | null>;
10
+ export declare const writeStoredConversionCredentials: (credentials: StoredConversionCredentials, filePath?: string) => Promise<void>;
11
+ export declare const removeStoredConversionCredentials: (filePath?: string) => Promise<boolean>;
12
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAgCF,eAAO,MAAM,qBAAqB,GAChC,cAAa,MAAM,CAAC,UAAwB,EAC5C,sBAA4B,KAC3B,MAOF,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,cAAa,MAAM,CAAC,UAAwB,EAC5C,sBAA4B,KAC3B,MAAM,GAAG,IAMX,CAAC;AAEF,eAAO,MAAM,mCAAmC,GAC9C,iBAAkC,KACjC,2BAA2B,GAAG,IAShC,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,iBAAkC,KACjC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAS5C,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,aAAa,2BAA2B,EACxC,iBAAkC,KACjC,OAAO,CAAC,IAAI,CAiBd,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,iBAAkC,KACjC,OAAO,CAAC,OAAO,CAQjB,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { chmod, mkdir, readFile, rename, rm, writeFile, } from 'node:fs/promises';
3
+ import { readFileSync } from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ const parseStoredCredentials = (source, filePath) => {
7
+ let value;
8
+ try {
9
+ value = JSON.parse(source);
10
+ }
11
+ catch (error) {
12
+ throw new Error(`Invalid 12ui credential file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
13
+ }
14
+ if (value === null
15
+ || typeof value !== 'object'
16
+ || Array.isArray(value)
17
+ || value.version !== 1
18
+ || typeof value.origin !== 'string'
19
+ || typeof value.apiKey !== 'string') {
20
+ throw new Error(`Invalid 12ui credential file ${filePath}`);
21
+ }
22
+ const credentials = value;
23
+ if (!credentials.origin.trim() || !credentials.apiKey.trim()) {
24
+ throw new Error(`Invalid 12ui credential file ${filePath}`);
25
+ }
26
+ return {
27
+ version: 1,
28
+ origin: credentials.origin.trim(),
29
+ apiKey: credentials.apiKey.trim(),
30
+ };
31
+ };
32
+ export const resolveCredentialFile = (environment = process.env, homeDirectory = os.homedir()) => {
33
+ const explicit = environment.TWELVE_UI_CONFIG?.trim();
34
+ if (explicit)
35
+ return path.resolve(explicit);
36
+ const configRoot = environment.XDG_CONFIG_HOME?.trim()
37
+ ? path.resolve(environment.XDG_CONFIG_HOME)
38
+ : path.join(homeDirectory, '.config');
39
+ return path.join(configRoot, '12ui', 'credentials.json');
40
+ };
41
+ export const resolveLegacyCredentialFile = (environment = process.env, homeDirectory = os.homedir()) => {
42
+ if (environment.TWELVE_UI_CONFIG?.trim())
43
+ return null;
44
+ const configRoot = environment.XDG_CONFIG_HOME?.trim()
45
+ ? path.resolve(environment.XDG_CONFIG_HOME)
46
+ : path.join(homeDirectory, '.config');
47
+ return path.join(configRoot, 'just-every', '12ui', 'credentials.json');
48
+ };
49
+ export const readStoredConversionCredentialsSync = (filePath = resolveCredentialFile()) => {
50
+ let source;
51
+ try {
52
+ source = readFileSync(filePath, 'utf8');
53
+ }
54
+ catch (error) {
55
+ if (error.code === 'ENOENT')
56
+ return null;
57
+ throw error;
58
+ }
59
+ return parseStoredCredentials(source, filePath);
60
+ };
61
+ export const readStoredConversionCredentials = async (filePath = resolveCredentialFile()) => {
62
+ let source;
63
+ try {
64
+ source = await readFile(filePath, 'utf8');
65
+ }
66
+ catch (error) {
67
+ if (error.code === 'ENOENT')
68
+ return null;
69
+ throw error;
70
+ }
71
+ return parseStoredCredentials(source, filePath);
72
+ };
73
+ export const writeStoredConversionCredentials = async (credentials, filePath = resolveCredentialFile()) => {
74
+ const parent = path.dirname(filePath);
75
+ await mkdir(parent, { recursive: true, mode: 0o700 });
76
+ await chmod(parent, 0o700);
77
+ const temporary = path.join(parent, `.credentials-${randomUUID()}.tmp`);
78
+ try {
79
+ await writeFile(temporary, `${JSON.stringify(credentials, null, 2)}\n`, {
80
+ encoding: 'utf8',
81
+ flag: 'wx',
82
+ mode: 0o600,
83
+ });
84
+ await rename(temporary, filePath);
85
+ await chmod(filePath, 0o600);
86
+ }
87
+ catch (error) {
88
+ await rm(temporary, { force: true });
89
+ throw error;
90
+ }
91
+ };
92
+ export const removeStoredConversionCredentials = async (filePath = resolveCredentialFile()) => {
93
+ try {
94
+ await rm(filePath);
95
+ return true;
96
+ }
97
+ catch (error) {
98
+ if (error.code === 'ENOENT')
99
+ return false;
100
+ throw error;
101
+ }
102
+ };
103
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const normalizeOptionalIdempotencyKey: (value: unknown, label?: string) => string | undefined;
2
+ //# sourceMappingURL=idempotency-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency-key.d.ts","sourceRoot":"","sources":["../src/idempotency-key.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,+BAA+B,GAC1C,OAAO,OAAO,EACd,cAAwB,KACvB,MAAM,GAAG,SAiBX,CAAC"}
@@ -0,0 +1,19 @@
1
+ const MAX_IDEMPOTENCY_KEY_LENGTH = 128;
2
+ const CONTROL_CHARACTER = /[\u0000-\u001f\u007f]/;
3
+ export const normalizeOptionalIdempotencyKey = (value, label = 'idempotencyKey') => {
4
+ if (value === undefined)
5
+ return undefined;
6
+ if (typeof value !== 'string') {
7
+ throw new Error(`${label} must be a string`);
8
+ }
9
+ const normalized = value.trim();
10
+ if (!normalized) {
11
+ throw new Error(`${label} must not be empty`);
12
+ }
13
+ if (normalized.length > MAX_IDEMPOTENCY_KEY_LENGTH
14
+ || CONTROL_CHARACTER.test(normalized)) {
15
+ throw new Error(`${label} must be at most 128 printable characters`);
16
+ }
17
+ return normalized;
18
+ };
19
+ //# sourceMappingURL=idempotency-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency-key.js","sourceRoot":"","sources":["../src/idempotency-key.ts"],"names":[],"mappings":"AAAA,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAElD,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,KAAc,EACd,KAAK,GAAG,gBAAgB,EACJ,EAAE;IACtB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAChD,CAAC;IACD,IACE,UAAU,CAAC,MAAM,GAAG,0BAA0B;WAC3C,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,2CAA2C,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ export type ImageGenerationAttempt = {
2
+ schemaVersion: 1;
3
+ status: 'prepared' | 'dispatched' | 'succeeded' | 'failed';
4
+ idempotencyKey: string;
5
+ provider: 'codex' | 'openai';
6
+ model: 'codex-gpt-image-2' | 'gpt-image-2';
7
+ providerEvidence: {
8
+ codexVersion?: string;
9
+ keySource?: 'process' | 'project-env';
10
+ };
11
+ promptFile: string;
12
+ promptSha256: string;
13
+ references: Array<{
14
+ path: string;
15
+ sha256: string;
16
+ }>;
17
+ outputPath: string;
18
+ preparedAt: string;
19
+ dispatchedAt?: string;
20
+ completedAt?: string;
21
+ outputSha256?: string;
22
+ error?: string;
23
+ };
24
+ export declare const imageAttemptPath: (outputPath: string) => string;
25
+ export declare const writeImageGenerationAttempt: (filePath: string, attempt: ImageGenerationAttempt, exclusive?: boolean) => Promise<void>;
26
+ //# sourceMappingURL=image-generation-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-evidence.d.ts","sourceRoot":"","sources":["../src/image-generation-evidence.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,EAAE,mBAAmB,GAAG,aAAa,CAAC;IAC3C,gBAAgB,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;KACvC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,KAAG,MAAsC,CAAC;AAE7F,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,SAAS,sBAAsB,EAC/B,mBAAiB,KAChB,OAAO,CAAC,IAAI,CAqBd,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ export const imageAttemptPath = (outputPath) => `${outputPath}.attempt.json`;
5
+ export const writeImageGenerationAttempt = async (filePath, attempt, exclusive = false) => {
6
+ await mkdir(path.dirname(filePath), { recursive: true });
7
+ if (exclusive) {
8
+ await writeFile(filePath, `${JSON.stringify(attempt, null, 2)}\n`, {
9
+ encoding: 'utf8',
10
+ flag: 'wx',
11
+ mode: 0o600,
12
+ });
13
+ return;
14
+ }
15
+ const temporary = `${filePath}.${randomUUID()}.tmp`;
16
+ try {
17
+ await writeFile(temporary, `${JSON.stringify(attempt, null, 2)}\n`, {
18
+ encoding: 'utf8',
19
+ flag: 'wx',
20
+ mode: 0o600,
21
+ });
22
+ await rename(temporary, filePath);
23
+ }
24
+ finally {
25
+ await rm(temporary, { force: true });
26
+ }
27
+ };
28
+ //# sourceMappingURL=image-generation-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-evidence.js","sourceRoot":"","sources":["../src/image-generation-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAuB7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAU,EAAE,CAAC,GAAG,UAAU,eAAe,CAAC;AAE7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAC9C,QAAgB,EAChB,OAA+B,EAC/B,SAAS,GAAG,KAAK,EACF,EAAE;IACjB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACjE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,UAAU,EAAE,MAAM,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAClE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const MAX_IMAGE_OUTPUT_WIDTH = 8192;
2
+ export declare const MAX_IMAGE_OUTPUT_PIXELS = 8000000;
3
+ type ImageMediaType = 'image/png' | 'image/jpeg' | 'image/webp';
4
+ export declare const parseImageOutputWidth: (value?: string) => number | undefined;
5
+ export declare const normalizeImageOutputWidth: (args: {
6
+ bytes: Uint8Array;
7
+ mediaType: ImageMediaType;
8
+ width: number;
9
+ }) => Promise<Uint8Array>;
10
+ export {};
11
+ //# sourceMappingURL=image-output-width.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-output-width.d.ts","sourceRoot":"","sources":["../src/image-output-width.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAC5C,eAAO,MAAM,uBAAuB,UAAY,CAAC;AAEjD,KAAK,cAAc,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;AAkBhE,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAO/D,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,UAAU,CAiCrB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import sharp from 'sharp';
2
+ export const MAX_IMAGE_OUTPUT_WIDTH = 8_192;
3
+ export const MAX_IMAGE_OUTPUT_PIXELS = 8_000_000;
4
+ const orientedDimensions = (metadata) => {
5
+ if (!metadata.width || !metadata.height) {
6
+ throw new Error('The input image dimensions could not be read');
7
+ }
8
+ const swapsAxes = metadata.orientation !== undefined
9
+ && metadata.orientation >= 5
10
+ && metadata.orientation <= 8;
11
+ return swapsAxes
12
+ ? { width: metadata.height, height: metadata.width }
13
+ : { width: metadata.width, height: metadata.height };
14
+ };
15
+ export const parseImageOutputWidth = (value) => {
16
+ if (value === undefined)
17
+ return undefined;
18
+ const width = Number(value);
19
+ if (!Number.isSafeInteger(width) || width < 1 || width > MAX_IMAGE_OUTPUT_WIDTH) {
20
+ throw new Error(`--width must be an integer between 1 and ${MAX_IMAGE_OUTPUT_WIDTH}`);
21
+ }
22
+ return width;
23
+ };
24
+ export const normalizeImageOutputWidth = async (args) => {
25
+ const source = sharp(args.bytes, { animated: false, failOn: 'warning' });
26
+ const metadata = await source.metadata();
27
+ if ((metadata.pages ?? 1) !== 1) {
28
+ throw new Error('--width accepts only a static image');
29
+ }
30
+ const dimensions = orientedDimensions(metadata);
31
+ const height = Math.max(1, Math.round(dimensions.height * args.width / dimensions.width));
32
+ if (height > MAX_IMAGE_OUTPUT_WIDTH || args.width * height > MAX_IMAGE_OUTPUT_PIXELS) {
33
+ throw new Error(`--width ${args.width} would produce a ${args.width}x${height} canvas, `
34
+ + `which exceeds the upload limit of ${MAX_IMAGE_OUTPUT_WIDTH}px per side or `
35
+ + `${MAX_IMAGE_OUTPUT_PIXELS.toLocaleString('en-US')} pixels`);
36
+ }
37
+ if (args.width === dimensions.width && (metadata.orientation ?? 1) === 1) {
38
+ return args.bytes;
39
+ }
40
+ const resized = sharp(args.bytes, { animated: false, failOn: 'warning' })
41
+ .autoOrient()
42
+ .resize({ width: args.width, height, fit: 'fill', kernel: sharp.kernel.lanczos3 });
43
+ const encoded = args.mediaType === 'image/png'
44
+ ? resized.png()
45
+ : args.mediaType === 'image/jpeg'
46
+ ? resized.jpeg({ quality: 95 })
47
+ : resized.webp({ quality: 95 });
48
+ const result = await encoded.toBuffer();
49
+ const output = await sharp(result).metadata();
50
+ if (output.width !== args.width || output.height !== height) {
51
+ throw new Error(`The input image could not be normalized to ${args.width}x${height}`);
52
+ }
53
+ return new Uint8Array(result);
54
+ };
55
+ //# sourceMappingURL=image-output-width.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-output-width.js","sourceRoot":"","sources":["../src/image-output-width.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const IMAGE_GENERATION_PROVIDERS: readonly ["auto", "codex", "openai"];
2
+ export type ImageGenerationProvider = typeof IMAGE_GENERATION_PROVIDERS[number];
3
+ export type ImageProviderPreflight = {
4
+ provider: 'codex';
5
+ model: 'codex-gpt-image-2';
6
+ codexVersion: string;
7
+ } | {
8
+ provider: 'openai';
9
+ model: 'gpt-image-2';
10
+ keySource: 'process' | 'project-env';
11
+ apiKey: string;
12
+ };
13
+ export declare const isImageGenerationProvider: (value: unknown) => value is ImageGenerationProvider;
14
+ export declare const preflightImageProvider: (args: {
15
+ provider: ImageGenerationProvider;
16
+ projectRoot: string;
17
+ environment?: NodeJS.ProcessEnv;
18
+ runCodex?: (args: string[]) => Promise<string>;
19
+ isTrackedProjectEnv?: (projectRoot: string) => Promise<boolean>;
20
+ }) => Promise<ImageProviderPreflight>;
21
+ //# sourceMappingURL=image-provider-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-provider-preflight.d.ts","sourceRoot":"","sources":["../src/image-provider-preflight.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,0BAA0B,sCAAuC,CAAC;AAC/E,MAAM,MAAM,uBAAuB,GAAG,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,MAAM,sBAAsB,GAC9B;IACE,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,SAAS,GAAG,aAAa,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,eAAO,MAAM,yBAAyB,GACpC,OAAO,OAAO,KACb,KAAK,IAAI,uBAGX,CAAC;AA0KF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,QAAQ,EAAE,uBAAuB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE,KAAG,OAAO,CAAC,sBAAsB,CA+BjC,CAAC"}