@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,100 @@
1
+ import { readStoredConversionCredentials, removeStoredConversionCredentials, resolveCredentialFile, } from './credential-store.js';
2
+ import { setUpConversionCredentials } from './credential-setup.js';
3
+ import { booleanFlag, stringFlag } from './cli-arguments.js';
4
+ import { revokeConvertApiKey, TWELVE_UI_DEVICE_SCOPES, verifyTwelveUiCredential, } from './login-auth.js';
5
+ const readQuota = async (origin, apiKey) => {
6
+ const response = await fetch(`${origin}/api/v1/convert/quota`, {
7
+ headers: {
8
+ Accept: 'application/json',
9
+ Authorization: `Bearer ${apiKey}`,
10
+ },
11
+ });
12
+ const value = await response.json().catch(() => null);
13
+ if (!response.ok) {
14
+ const detail = value !== null && typeof value === 'object'
15
+ && typeof value.detail === 'string'
16
+ ? value.detail
17
+ : `HTTP ${response.status}`;
18
+ throw new Error(`Unable to read 12ui quota: ${detail}`);
19
+ }
20
+ return value;
21
+ };
22
+ const verifyAvailableCredentialScope = async (apiKey, loginOrigin) => {
23
+ const failures = [];
24
+ for (const scope of TWELVE_UI_DEVICE_SCOPES) {
25
+ try {
26
+ return await verifyTwelveUiCredential({
27
+ apiKey,
28
+ loginOrigin,
29
+ requiredScopes: [scope],
30
+ });
31
+ }
32
+ catch (error) {
33
+ failures.push(error);
34
+ }
35
+ }
36
+ throw new AggregateError(failures, 'The stored 12ui credential could not be verified for any supported design scope');
37
+ };
38
+ export const runAuthCommand = async (action, flags) => {
39
+ const loginOrigin = stringFlag(flags, 'login-origin');
40
+ if (action === 'login') {
41
+ const credentials = await setUpConversionCredentials({
42
+ apiKey: stringFlag(flags, 'api-key'),
43
+ origin: stringFlag(flags, 'origin'),
44
+ loginOrigin,
45
+ keyName: stringFlag(flags, 'key-name'),
46
+ forceAuthentication: stringFlag(flags, 'api-key') === undefined,
47
+ onApprovalUrl: (url) => {
48
+ console.log('Authenticate your personal Login account for 12ui Convert:');
49
+ console.log(url);
50
+ },
51
+ });
52
+ console.log(`Personal Convert credentials ${credentials.source === 'browser' ? 'created' : 'imported'}`
53
+ + ` and verified at ${credentials.credentialFile}.`);
54
+ return;
55
+ }
56
+ const stored = await readStoredConversionCredentials();
57
+ if (!stored) {
58
+ throw new Error(`12ui credentials are not configured at ${resolveCredentialFile()}`);
59
+ }
60
+ if (action === 'status') {
61
+ const verification = await verifyAvailableCredentialScope(stored.apiKey, loginOrigin);
62
+ const hasConvertScope = verification.scopes.includes('design.convert');
63
+ const quota = hasConvertScope
64
+ ? await readQuota(stored.origin, stored.apiKey)
65
+ : undefined;
66
+ const result = {
67
+ status: 'authenticated',
68
+ accountType: verification.subjectType,
69
+ accountId: verification.subjectId,
70
+ credentialId: verification.credentialId,
71
+ scopes: verification.scopes,
72
+ credentialFile: resolveCredentialFile(),
73
+ origin: stored.origin,
74
+ ...(hasConvertScope ? { quota } : {}),
75
+ };
76
+ if (booleanFlag(flags, 'json'))
77
+ console.log(JSON.stringify(result, null, 2));
78
+ else {
79
+ console.log(`Authenticated personal account: ${verification.subjectId}`);
80
+ console.log(`Credential: ${verification.credentialId}`);
81
+ console.log(`Scopes: ${verification.scopes.join(', ')}`);
82
+ console.log(`Origin: ${stored.origin}`);
83
+ console.log(hasConvertScope
84
+ ? JSON.stringify(quota, null, 2)
85
+ : 'Convert quota unavailable: credential does not include design.convert.');
86
+ }
87
+ return;
88
+ }
89
+ if (action === 'logout') {
90
+ await revokeConvertApiKey({
91
+ apiKey: stored.apiKey,
92
+ loginOrigin,
93
+ });
94
+ await removeStoredConversionCredentials();
95
+ console.log('The personal 12ui credential was revoked and removed from this device.');
96
+ return;
97
+ }
98
+ throw new Error('Usage: 12ui auth <login|status|logout>');
99
+ };
100
+ //# sourceMappingURL=cli-auth-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-auth-command.js","sourceRoot":"","sources":["../src/cli-auth-command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAAE,MAAc,EAAoB,EAAE;IAC3E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,uBAAuB,EAAE;QAC7D,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;KACF,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;eACrD,OAAQ,KAAiC,CAAC,MAAM,KAAK,QAAQ;YAChE,CAAC,CAAE,KAAiC,CAAC,MAAM;YAC3C,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,KAAK,EAC1C,MAAc,EACd,WAA+B,EACM,EAAE;IACvC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,MAAM,wBAAwB,CAAC;gBACpC,MAAM;gBACN,WAAW;gBACX,cAAc,EAAE,CAAC,KAAK,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,cAAc,CACtB,QAAQ,EACR,iFAAiF,CAClF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,MAA0B,EAC1B,KAAe,EACA,EAAE;IACjB,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC;YACnD,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;YACpC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;YACnC,WAAW;YACX,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC;YACtC,mBAAmB,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,SAAS;YAC/D,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CACT,gCAAgC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE;cACzF,oBAAoB,WAAW,CAAC,cAAc,GAAG,CACpD,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,+BAA+B,EAAE,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,MAAM,8BAA8B,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACtF,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,eAAe;YAC3B,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,eAAe;YACvB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,cAAc,EAAE,qBAAqB,EAAE;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACxE,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,mCAAmC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAe;gBACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChC,CAAC,CAAC,wEAAwE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,mBAAmB,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,iCAAiC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type CliFlags } from './cli-arguments.js';
2
+ import { type InspirationClient } from './cli-corpus-types.js';
3
+ import { readConversionConfig } from './config.js';
4
+ export { downloadCorpusInspiration, resumeCorpusInspiration, } from './cli-corpus-run.js';
5
+ export { CORPUS_USAGE_NOTICE, } from './cli-corpus-types.js';
6
+ export type { CorpusInspirationManifest, DownloadedCorpusReference, } from './cli-corpus-types.js';
7
+ type CorpusCommandDependencies = {
8
+ readConfig: typeof readConversionConfig;
9
+ createClient: (config: ReturnType<typeof readConversionConfig>) => InspirationClient;
10
+ };
11
+ export declare const runCorpusCommand: (action: string | undefined, flags: CliFlags, dependencies?: CorpusCommandDependencies) => Promise<void>;
12
+ //# sourceMappingURL=cli-corpus-command.d.ts.map
@@ -0,0 +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;AAM/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,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;AAoDF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc,yBAGb,KACA,OAAO,CAAC,IAAI,CA+Dd,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { stringFlag } from './cli-arguments.js';
4
+ import { downloadCorpusInspiration, resumeCorpusInspiration, } from './cli-corpus-run.js';
5
+ import { INSPIRATION_MANIFEST_FILE, } from './cli-corpus-types.js';
6
+ import { TwelveUiCorpusClient, } from './corpus-client.js';
7
+ import { readConversionConfig } from './config.js';
8
+ export { downloadCorpusInspiration, resumeCorpusInspiration, } from './cli-corpus-run.js';
9
+ export { CORPUS_USAGE_NOTICE, } from './cli-corpus-types.js';
10
+ const positiveInteger = (value, fallback, name) => {
11
+ if (value === undefined)
12
+ return fallback;
13
+ const parsed = Number(value);
14
+ if (!Number.isSafeInteger(parsed) || parsed < 1) {
15
+ throw new Error(`--${name} must be a positive integer`);
16
+ }
17
+ return parsed;
18
+ };
19
+ const boundedNumber = (value, fallback, name, minimum, maximum) => {
20
+ if (value === undefined)
21
+ return fallback;
22
+ const parsed = Number(value);
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')
41
+ return value;
42
+ throw new Error('--aspect must be one of: landscape, square, portrait');
43
+ };
44
+ const readQuery = async (flags) => {
45
+ const query = stringFlag(flags, 'query')?.trim();
46
+ const queryFile = stringFlag(flags, 'query-file')?.trim();
47
+ if (Boolean(query) === Boolean(queryFile)) {
48
+ throw new Error('Provide exactly one --query or --query-file');
49
+ }
50
+ const value = query ?? (await readFile(path.resolve(queryFile), 'utf8')).trim();
51
+ if (!value)
52
+ throw new Error('The corpus inspiration query must not be empty');
53
+ return value;
54
+ };
55
+ export const runCorpusCommand = async (action, flags, dependencies = {
56
+ readConfig: readConversionConfig,
57
+ createClient: (config) => new TwelveUiCorpusClient(config),
58
+ }) => {
59
+ if (action !== 'inspire' && action !== 'resume') {
60
+ throw new Error('Usage: 12ui corpus inspire --query <text>|--query-file <file>'
61
+ + ' --out-dir <directory> [--count <1-48>] [--wildness <0-0.6>]'
62
+ + ' [--seed <integer>] [--aspect landscape|square|portrait]'
63
+ + ' [--idempotency-key <key>]'
64
+ + '\n 12ui corpus resume --out-dir <directory>');
65
+ }
66
+ if (action === 'inspire' && stringFlag(flags, 'kind') !== undefined) {
67
+ throw new Error('--kind is not supported by the corpus CLI because unverified values can produce an'
68
+ + ' empty metered set. Use the SDK only when the exact corpus kind is verified.');
69
+ }
70
+ const outDir = stringFlag(flags, 'out-dir')?.trim();
71
+ if (!outDir)
72
+ throw new Error('--out-dir is required');
73
+ const config = dependencies.readConfig({
74
+ origin: stringFlag(flags, 'origin'),
75
+ apiKey: stringFlag(flags, 'api-key'),
76
+ });
77
+ const client = dependencies.createClient(config);
78
+ if (action === 'resume') {
79
+ const manifest = await resumeCorpusInspiration({ client, outDir, origin: config.origin });
80
+ console.log(JSON.stringify({
81
+ setId: manifest.response.setId,
82
+ seed: manifest.response.seed,
83
+ outDir: path.resolve(outDir),
84
+ manifest: path.join(path.resolve(outDir), INSPIRATION_MANIFEST_FILE),
85
+ references: manifest.references,
86
+ }, null, 2));
87
+ return;
88
+ }
89
+ const count = positiveInteger(stringFlag(flags, 'count'), 4, 'count');
90
+ if (count > 48)
91
+ throw new Error('--count must be at most 48');
92
+ const wildness = boundedNumber(stringFlag(flags, 'wildness'), 0.6, 'wildness', 0, 0.6);
93
+ const seed = optionalSeed(stringFlag(flags, 'seed'));
94
+ const aspect = optionalAspect(stringFlag(flags, 'aspect'));
95
+ const query = await readQuery(flags);
96
+ const request = {
97
+ q: query,
98
+ k: count,
99
+ tau: wildness,
100
+ ...(aspect ? { filters: {
101
+ ...(aspect ? { aspect } : {}),
102
+ } } : {}),
103
+ ...(seed !== undefined ? { seed } : {}),
104
+ };
105
+ const manifest = await downloadCorpusInspiration({
106
+ client,
107
+ request,
108
+ outDir,
109
+ origin: config.origin,
110
+ idempotencyKey: stringFlag(flags, 'idempotency-key'),
111
+ });
112
+ console.log(JSON.stringify({
113
+ setId: manifest.response.setId,
114
+ seed: manifest.response.seed,
115
+ outDir: path.resolve(outDir),
116
+ manifest: path.join(path.resolve(outDir), INSPIRATION_MANIFEST_FILE),
117
+ references: manifest.references,
118
+ }, null, 2));
119
+ };
120
+ //# sourceMappingURL=cli-corpus-command.js.map
@@ -0,0 +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;AAEnD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAW/B,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAE,IAAY,EAAU,EAAE;IAC5F,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,KAAyB,EACzB,QAAgB,EAChB,IAAY,EACZ,OAAe,EACf,OAAe,EACP,EAAE;IACV,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,OAAO,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,oBAAoB,OAAO,QAAQ,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAsB,EAAE;IACrE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,WAAW,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAyB,EAA4B,EAAE;IAC7E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,KAAe,EAAmB,EAAE;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,MAA0B,EAC1B,KAAe,EACf,eAA0C;IACxC,UAAU,EAAE,oBAAoB;IAChC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC;CAC3D,EACc,EAAE;IACjB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,+DAA+D;cAC7D,8DAA8D;cAC9D,0DAA0D;cAC1D,4BAA4B;cAC5B,mDAAmD,CACtD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,oFAAoF;cAClF,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC;QACrC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;QACnC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;YAC9B,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;YAC5B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC;YACpE,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,KAAK,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAA6B;QACxC,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;QACR,GAAG,EAAE,QAAQ;QACb,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;gBACtB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACT,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC;KACrD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;QAC9B,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;QAC5B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC;QACpE,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type CorpusInspirationAttempt, type CorpusInspirationEvidence, type CorpusInspirationManifest, type DownloadedCorpusReference } from './cli-corpus-types.js';
2
+ export declare const validateInspirationSet: (evidence: CorpusInspirationEvidence, outDir: string) => void;
3
+ export declare const writeInspirationAttempt: (outDir: string, attempt: CorpusInspirationAttempt) => Promise<void>;
4
+ export declare const readInspirationAttempt: (outDir: string) => Promise<CorpusInspirationAttempt>;
5
+ export declare const writeInspirationEvidence: (outDir: string, evidence: CorpusInspirationEvidence) => Promise<void>;
6
+ export declare const readInspirationEvidence: (outDir: string) => Promise<CorpusInspirationEvidence>;
7
+ export declare const readOptionalInspirationEvidence: (outDir: string) => Promise<CorpusInspirationEvidence | null>;
8
+ export declare const assertAttemptMatchesEvidence: (attempt: CorpusInspirationAttempt, evidence: CorpusInspirationEvidence) => void;
9
+ export declare const assertInspirationRunIncomplete: (outDir: string) => Promise<void>;
10
+ export declare const writeInspirationManifest: (args: {
11
+ attempt: CorpusInspirationAttempt;
12
+ evidence: CorpusInspirationEvidence;
13
+ references: DownloadedCorpusReference[];
14
+ outDir: string;
15
+ now?: () => Date;
16
+ }) => Promise<CorpusInspirationManifest>;
17
+ //# sourceMappingURL=cli-corpus-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-evidence.d.ts","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AA4F/B,eAAO,MAAM,sBAAsB,GACjC,UAAU,yBAAyB,EACnC,QAAQ,MAAM,KACb,IAmBF,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,IAIF,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,CA2BpC,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { CORPUS_USAGE_NOTICE, INSPIRATION_ATTEMPT_FILE, INSPIRATION_EVIDENCE_FILE, INSPIRATION_MANIFEST_FILE, } from './cli-corpus-types.js';
4
+ const isRecord = (value) => (typeof value === 'object' && value !== null && !Array.isArray(value));
5
+ const isErrno = (error, code) => (error instanceof Error && 'code' in error && error.code === code);
6
+ const isCorpusAspect = (value) => (value === 'portrait' || value === 'landscape' || value === 'square');
7
+ const validInspirationRequest = (request) => (typeof request.q === 'string'
8
+ && Boolean(request.q.trim())
9
+ && (request.k === undefined
10
+ || (typeof request.k === 'number'
11
+ && Number.isSafeInteger(request.k)
12
+ && request.k >= 1)));
13
+ const parseInspirationAttempt = (value) => {
14
+ if (!isRecord(value)
15
+ || value.version !== 1
16
+ || typeof value.createdAt !== 'string'
17
+ || !Number.isFinite(Date.parse(value.createdAt))
18
+ || typeof value.origin !== 'string'
19
+ || !/^https?:\/\//u.test(value.origin)
20
+ || typeof value.idempotencyKey !== 'string'
21
+ || !value.idempotencyKey.trim()
22
+ || value.idempotencyKey.length > 128
23
+ || /[\u0000-\u001f\u007f]/u.test(value.idempotencyKey)
24
+ || !isRecord(value.request)
25
+ || !validInspirationRequest(value.request)) {
26
+ throw new Error('Corpus inspiration attempt evidence is invalid');
27
+ }
28
+ return value;
29
+ };
30
+ const parseInspirationEvidence = (value) => {
31
+ if (!isRecord(value) || value.version !== 1 || !isRecord(value.request) || !isRecord(value.response)) {
32
+ throw new Error('Corpus inspiration evidence is invalid');
33
+ }
34
+ const request = value.request;
35
+ const response = value.response;
36
+ if (!validInspirationRequest(request)) {
37
+ throw new Error('Corpus inspiration request evidence is invalid');
38
+ }
39
+ if (typeof response.setId !== 'string'
40
+ || typeof response.query !== 'string'
41
+ || typeof response.seed !== 'number'
42
+ || !Number.isSafeInteger(response.seed)
43
+ || typeof response.k !== 'number'
44
+ || !Number.isSafeInteger(response.k)
45
+ || typeof response.poolSize !== 'number'
46
+ || !Number.isSafeInteger(response.poolSize)
47
+ || typeof response.coverage !== 'number'
48
+ || !Number.isFinite(response.coverage)
49
+ || typeof response.truncated !== 'boolean'
50
+ || response.weightsSource !== 'default:owner-elite12'
51
+ || !Array.isArray(response.items)) {
52
+ throw new Error('Corpus inspiration response evidence is invalid');
53
+ }
54
+ const validItems = response.items.every((item) => (isRecord(item)
55
+ && typeof item.id === 'string'
56
+ && /^(?:gen|logo-gen)-[A-Za-z0-9._-]{1,120}$/u.test(item.id)
57
+ && (item.role === 'core' || item.role === 'stretch')
58
+ && typeof item.arm === 'string'
59
+ && (item.cell === null || typeof item.cell === 'string')
60
+ && isCorpusAspect(item.aspect)
61
+ && typeof item.relevance === 'number'
62
+ && Number.isFinite(item.relevance)
63
+ && typeof item.relevancePercentile === 'number'
64
+ && Number.isFinite(item.relevancePercentile)
65
+ && typeof item.qualityPercentile === 'number'
66
+ && Number.isFinite(item.qualityPercentile)));
67
+ if (!validItems)
68
+ throw new Error('Corpus inspiration item evidence is invalid');
69
+ return value;
70
+ };
71
+ export const validateInspirationSet = (evidence, outDir) => {
72
+ const expectedCount = evidence.request.k ?? 24;
73
+ const { response } = evidence;
74
+ if (response.k !== expectedCount) {
75
+ throw new Error(`Corpus inspiration response expected ${response.k} references but request expected`
76
+ + ` ${expectedCount}; evidence is in ${outDir}`);
77
+ }
78
+ if (response.truncated || response.items.length !== expectedCount) {
79
+ throw new Error(`Corpus inspiration returned ${response.items.length} of ${expectedCount} references`
80
+ + `${response.truncated ? ' (truncated)' : ''}; evidence is in ${outDir}`);
81
+ }
82
+ const ids = response.items.map((item) => item.id);
83
+ if (new Set(ids).size !== ids.length) {
84
+ throw new Error(`Corpus inspiration returned duplicate reference ids; evidence is in ${outDir}`);
85
+ }
86
+ };
87
+ export const writeInspirationAttempt = async (outDir, attempt) => {
88
+ await writeFile(path.join(outDir, INSPIRATION_ATTEMPT_FILE), `${JSON.stringify(attempt, null, 2)}\n`, { flag: 'wx' });
89
+ };
90
+ export const readInspirationAttempt = async (outDir) => {
91
+ const raw = JSON.parse(await readFile(path.join(outDir, INSPIRATION_ATTEMPT_FILE), 'utf8'));
92
+ return parseInspirationAttempt(raw);
93
+ };
94
+ export const writeInspirationEvidence = async (outDir, evidence) => {
95
+ await writeFile(path.join(outDir, INSPIRATION_EVIDENCE_FILE), `${JSON.stringify(evidence, null, 2)}\n`, { flag: 'wx' });
96
+ };
97
+ export const readInspirationEvidence = async (outDir) => {
98
+ const rawEvidence = JSON.parse(await readFile(path.join(outDir, INSPIRATION_EVIDENCE_FILE), 'utf8'));
99
+ return parseInspirationEvidence(rawEvidence);
100
+ };
101
+ export const readOptionalInspirationEvidence = async (outDir) => {
102
+ try {
103
+ return await readInspirationEvidence(outDir);
104
+ }
105
+ catch (error) {
106
+ if (isErrno(error, 'ENOENT'))
107
+ return null;
108
+ throw error;
109
+ }
110
+ };
111
+ export const assertAttemptMatchesEvidence = (attempt, evidence) => {
112
+ if (JSON.stringify(attempt.request) !== JSON.stringify(evidence.request)) {
113
+ throw new Error('Corpus inspiration attempt and response evidence requests do not match');
114
+ }
115
+ };
116
+ export const assertInspirationRunIncomplete = async (outDir) => {
117
+ try {
118
+ await readFile(path.join(outDir, INSPIRATION_MANIFEST_FILE));
119
+ throw new Error(`Corpus inspiration run is already complete: ${outDir}`);
120
+ }
121
+ catch (error) {
122
+ if (!isErrno(error, 'ENOENT'))
123
+ throw error;
124
+ }
125
+ };
126
+ export const writeInspirationManifest = async (args) => {
127
+ const { request, response } = args.evidence;
128
+ const manifest = {
129
+ version: 1,
130
+ createdAt: (args.now ?? (() => new Date()))().toISOString(),
131
+ origin: args.attempt.origin,
132
+ idempotencyKey: args.attempt.idempotencyKey,
133
+ notice: CORPUS_USAGE_NOTICE,
134
+ request,
135
+ response: {
136
+ setId: response.setId,
137
+ query: response.query,
138
+ seed: response.seed,
139
+ k: response.k,
140
+ poolSize: response.poolSize,
141
+ coverage: response.coverage,
142
+ truncated: response.truncated,
143
+ weightsSource: response.weightsSource,
144
+ },
145
+ references: args.references,
146
+ };
147
+ await writeFile(path.join(args.outDir, INSPIRATION_MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\n`, { flag: 'wx' });
148
+ return manifest;
149
+ };
150
+ //# sourceMappingURL=cli-corpus-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-evidence.js","sourceRoot":"","sources":["../src/cli-corpus-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type CorpusInspirationEvidence, type DownloadedCorpusReference, type ReferenceClient } from './cli-corpus-types.js';
2
+ export declare const completeReferenceDownloads: (args: {
3
+ client: ReferenceClient;
4
+ evidence: CorpusInspirationEvidence;
5
+ outDir: string;
6
+ origin: string;
7
+ }) => Promise<DownloadedCorpusReference[]>;
8
+ //# sourceMappingURL=cli-corpus-reference-downloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-reference-downloads.d.ts","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAmH/B,eAAO,MAAM,0BAA0B,GAAU,MAAM;IACrD,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,OAAO,CAAC,yBAAyB,EAAE,CA4CtC,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import sharp from 'sharp';
5
+ import { ensureReferenceDownloadIntent, loadReferenceProvenance, publishReferenceImage, receiptMatchesReference, referenceReceiptPaths, writeReferenceReceipt, } from './cli-corpus-reference-receipts.js';
6
+ import { REFERENCE_RECEIPT_DIRECTORY, } from './cli-corpus-types.js';
7
+ const sha256 = (bytes) => (createHash('sha256').update(bytes).digest('hex'));
8
+ const isErrno = (error, code) => (error instanceof Error && 'code' in error && error.code === code);
9
+ const readOptionalFile = async (file) => {
10
+ try {
11
+ return await readFile(file);
12
+ }
13
+ catch (error) {
14
+ if (isErrno(error, 'ENOENT'))
15
+ return null;
16
+ throw error;
17
+ }
18
+ };
19
+ const referenceFromBytes = async (args) => {
20
+ let metadata;
21
+ try {
22
+ metadata = await sharp(args.bytes, { animated: false, failOn: 'warning' }).metadata();
23
+ }
24
+ catch (error) {
25
+ throw new Error(`${args.source === 'existing' ? 'Existing' : 'Downloaded'} corpus reference`
26
+ + ` ${args.item.id} is not a decodable WebP image`
27
+ + `${args.source === 'existing' ? '; refusing to overwrite it' : ''}`, { cause: error });
28
+ }
29
+ if (metadata.format !== 'webp' || !metadata.width || !metadata.height) {
30
+ throw new Error(`${args.source === 'existing' ? 'Existing' : 'Downloaded'} corpus reference`
31
+ + ` ${args.item.id} is not a decodable WebP image`
32
+ + `${args.source === 'existing' ? '; refusing to overwrite it' : ''}`);
33
+ }
34
+ return {
35
+ ordinal: args.index + 1,
36
+ id: args.item.id,
37
+ role: args.item.role,
38
+ arm: args.item.arm,
39
+ aspect: args.item.aspect,
40
+ file: args.file,
41
+ sha256: sha256(args.bytes),
42
+ bytes: args.bytes.byteLength,
43
+ width: metadata.width,
44
+ height: metadata.height,
45
+ };
46
+ };
47
+ const readExistingReference = async (paths, item, index, receipt) => {
48
+ const bytes = await readOptionalFile(paths.image);
49
+ if (!bytes)
50
+ return null;
51
+ if (!receipt) {
52
+ throw new Error(`Existing corpus reference ${item.id} has no durable digest receipt;`
53
+ + ' its origin is ambiguous and it will not be overwritten');
54
+ }
55
+ const reference = await referenceFromBytes({
56
+ bytes,
57
+ file: paths.image,
58
+ item,
59
+ index,
60
+ source: 'existing',
61
+ });
62
+ if (!receiptMatchesReference(receipt, reference)) {
63
+ throw new Error(`Existing corpus reference ${item.id} does not match its durable digest receipt;`
64
+ + ' refusing to overwrite ambiguous evidence');
65
+ }
66
+ return reference;
67
+ };
68
+ const downloadReference = async (client, paths, item, index, intent, expectedReceipt) => {
69
+ const bytes = await client.download(item.id, 'ref');
70
+ const reference = await referenceFromBytes({
71
+ bytes,
72
+ file: paths.image,
73
+ item,
74
+ index,
75
+ source: 'downloaded',
76
+ });
77
+ if (expectedReceipt && !receiptMatchesReference(expectedReceipt, reference)) {
78
+ throw new Error(`Downloaded corpus reference ${item.id} does not match its durable digest receipt;`
79
+ + ' refusing changed source bytes');
80
+ }
81
+ if (!expectedReceipt)
82
+ await writeReferenceReceipt(paths, intent, reference);
83
+ await publishReferenceImage(paths, bytes);
84
+ return reference;
85
+ };
86
+ export const completeReferenceDownloads = async (args) => {
87
+ await mkdir(path.join(args.outDir, REFERENCE_RECEIPT_DIRECTORY), { recursive: true });
88
+ const settled = await Promise.allSettled(args.evidence.response.items.map(async (item, index) => {
89
+ const paths = referenceReceiptPaths(args.outDir, item, index);
90
+ const provenance = await loadReferenceProvenance(paths, item, index);
91
+ const existing = await readExistingReference(paths, item, index, provenance.receipt);
92
+ if (existing)
93
+ return existing;
94
+ const intent = await ensureReferenceDownloadIntent(paths, item, index, provenance.intent);
95
+ return await downloadReference(args.client, paths, item, index, intent, provenance.receipt);
96
+ }));
97
+ const failures = settled.flatMap((result) => (result.status === 'rejected' ? [result.reason] : []));
98
+ if (failures.length > 0) {
99
+ const details = failures.map((failure) => (failure instanceof Error ? failure.message : String(failure))).join('; ');
100
+ throw new AggregateError(failures, `Failed to complete ${failures.length} corpus reference download`
101
+ + `${failures.length === 1 ? '' : 's'}: ${details}; resume with`
102
+ + ` "12ui corpus resume --out-dir ${args.outDir} --origin ${args.origin}"`);
103
+ }
104
+ return settled.map((result) => {
105
+ if (result.status === 'rejected') {
106
+ throw new Error('Unreachable rejected corpus reference result');
107
+ }
108
+ return result.value;
109
+ });
110
+ };
111
+ //# sourceMappingURL=cli-corpus-reference-downloads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-reference-downloads.js","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { CorpusInspirationItem } from './corpus-client.js';
2
+ import { type DownloadedCorpusReference } from './cli-corpus-types.js';
3
+ type ReferenceDownloadIntent = {
4
+ version: 1;
5
+ ordinal: number;
6
+ id: string;
7
+ file: string;
8
+ nonce: string;
9
+ };
10
+ export type CorpusReferenceReceipt = {
11
+ version: 1;
12
+ ordinal: number;
13
+ id: string;
14
+ file: string;
15
+ intentNonce: string;
16
+ sha256: string;
17
+ bytes: number;
18
+ width: number;
19
+ height: number;
20
+ };
21
+ export type ReferenceReceiptPaths = {
22
+ image: string;
23
+ intent: string;
24
+ receipt: string;
25
+ };
26
+ export declare const referenceReceiptPaths: (outDir: string, item: CorpusInspirationItem, index: number) => ReferenceReceiptPaths;
27
+ export declare const loadReferenceProvenance: (paths: ReferenceReceiptPaths, item: CorpusInspirationItem, index: number) => Promise<{
28
+ intent: ReferenceDownloadIntent | null;
29
+ receipt: CorpusReferenceReceipt | null;
30
+ }>;
31
+ export declare const ensureReferenceDownloadIntent: (paths: ReferenceReceiptPaths, item: CorpusInspirationItem, index: number, existing: ReferenceDownloadIntent | null) => Promise<ReferenceDownloadIntent>;
32
+ export declare const writeReferenceReceipt: (paths: ReferenceReceiptPaths, intent: ReferenceDownloadIntent, reference: DownloadedCorpusReference) => Promise<CorpusReferenceReceipt>;
33
+ export declare const publishReferenceImage: (paths: ReferenceReceiptPaths, bytes: Uint8Array) => Promise<void>;
34
+ export declare const receiptMatchesReference: (receipt: CorpusReferenceReceipt, reference: DownloadedCorpusReference) => boolean;
35
+ export {};
36
+ //# sourceMappingURL=cli-corpus-reference-receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-reference-receipts.d.ts","sourceRoot":"","sources":["../src/cli-corpus-reference-receipts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA8CF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,MAAM,EACd,MAAM,qBAAqB,EAC3B,OAAO,MAAM,KACZ,qBAOF,CAAC;AAsDF,eAAO,MAAM,uBAAuB,GAClC,OAAO,qBAAqB,EAC5B,MAAM,qBAAqB,EAC3B,OAAO,MAAM,KACZ,OAAO,CAAC;IACT,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACvC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACxC,CAkBA,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,qBAAqB,EAC5B,MAAM,qBAAqB,EAC3B,OAAO,MAAM,EACb,UAAU,uBAAuB,GAAG,IAAI,KACvC,OAAO,CAAC,uBAAuB,CASjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,OAAO,qBAAqB,EAC5B,QAAQ,uBAAuB,EAC/B,WAAW,yBAAyB,KACnC,OAAO,CAAC,sBAAsB,CAchC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,OAAO,qBAAqB,EAC5B,OAAO,UAAU,KAChB,OAAO,CAAC,IAAI,CAAmD,CAAC;AAEnE,eAAO,MAAM,uBAAuB,GAClC,SAAS,sBAAsB,EAC/B,WAAW,yBAAyB,KACnC,OAQF,CAAC"}