@cellarnode/ui 0.186.0 → 0.188.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 (129) hide show
  1. package/dist/brand/brand-assets-api.d.ts +58 -0
  2. package/dist/brand/brand-assets-api.d.ts.map +1 -0
  3. package/dist/brand/brand-assets-api.js +160 -0
  4. package/dist/brand/brand-assets-api.js.map +1 -0
  5. package/dist/brand/brand-generation-api.d.ts +44 -0
  6. package/dist/brand/brand-generation-api.d.ts.map +1 -0
  7. package/dist/brand/brand-generation-api.js +2 -0
  8. package/dist/brand/brand-generation-api.js.map +1 -0
  9. package/dist/brand/brand-generation-client.d.ts +36 -0
  10. package/dist/brand/brand-generation-client.d.ts.map +1 -0
  11. package/dist/brand/brand-generation-client.js +107 -0
  12. package/dist/brand/brand-generation-client.js.map +1 -0
  13. package/dist/brand/brand-generation-copy.d.ts +44 -0
  14. package/dist/brand/brand-generation-copy.d.ts.map +1 -0
  15. package/dist/brand/brand-generation-copy.js +70 -0
  16. package/dist/brand/brand-generation-copy.js.map +1 -0
  17. package/dist/brand/brand-generation-fixtures.d.ts +32 -0
  18. package/dist/brand/brand-generation-fixtures.d.ts.map +1 -0
  19. package/dist/brand/brand-generation-fixtures.js +88 -0
  20. package/dist/brand/brand-generation-fixtures.js.map +1 -0
  21. package/dist/brand/brand-generation-flow.d.ts +34 -0
  22. package/dist/brand/brand-generation-flow.d.ts.map +1 -0
  23. package/dist/brand/brand-generation-flow.js +34 -0
  24. package/dist/brand/brand-generation-flow.js.map +1 -0
  25. package/dist/brand/brand-generation-keys.d.ts +16 -0
  26. package/dist/brand/brand-generation-keys.d.ts.map +1 -0
  27. package/dist/brand/brand-generation-keys.js +16 -0
  28. package/dist/brand/brand-generation-keys.js.map +1 -0
  29. package/dist/brand/brand-generation-progress.d.ts +27 -0
  30. package/dist/brand/brand-generation-progress.d.ts.map +1 -0
  31. package/dist/brand/brand-generation-progress.js +61 -0
  32. package/dist/brand/brand-generation-progress.js.map +1 -0
  33. package/dist/brand/brand-generation-recovery-error.d.ts +8 -0
  34. package/dist/brand/brand-generation-recovery-error.d.ts.map +1 -0
  35. package/dist/brand/brand-generation-recovery-error.js +7 -0
  36. package/dist/brand/brand-generation-recovery-error.js.map +1 -0
  37. package/dist/brand/brand-generation-response.d.ts +86 -0
  38. package/dist/brand/brand-generation-response.d.ts.map +1 -0
  39. package/dist/brand/brand-generation-response.js +261 -0
  40. package/dist/brand/brand-generation-response.js.map +1 -0
  41. package/dist/brand/brand-generation-sse-parser.d.ts +14 -0
  42. package/dist/brand/brand-generation-sse-parser.d.ts.map +1 -0
  43. package/dist/brand/brand-generation-sse-parser.js +92 -0
  44. package/dist/brand/brand-generation-sse-parser.js.map +1 -0
  45. package/dist/brand/brand-generation-start.d.ts +49 -0
  46. package/dist/brand/brand-generation-start.d.ts.map +1 -0
  47. package/dist/brand/brand-generation-start.js +48 -0
  48. package/dist/brand/brand-generation-start.js.map +1 -0
  49. package/dist/brand/brand-generation-steps.d.ts +4 -0
  50. package/dist/brand/brand-generation-steps.d.ts.map +1 -0
  51. package/dist/brand/brand-generation-steps.js +29 -0
  52. package/dist/brand/brand-generation-steps.js.map +1 -0
  53. package/dist/brand/brand-generation-surface.d.ts +50 -0
  54. package/dist/brand/brand-generation-surface.d.ts.map +1 -0
  55. package/dist/brand/brand-generation-surface.js +25 -0
  56. package/dist/brand/brand-generation-surface.js.map +1 -0
  57. package/dist/brand/brand-generation-url.d.ts +6 -0
  58. package/dist/brand/brand-generation-url.d.ts.map +1 -0
  59. package/dist/brand/brand-generation-url.js +4 -0
  60. package/dist/brand/brand-generation-url.js.map +1 -0
  61. package/dist/brand/brand-image-chooser.d.ts +3 -1
  62. package/dist/brand/brand-image-chooser.d.ts.map +1 -1
  63. package/dist/brand/brand-image-chooser.js +7 -1
  64. package/dist/brand/brand-image-chooser.js.map +1 -1
  65. package/dist/brand/brand-image-choosers.d.ts +37 -0
  66. package/dist/brand/brand-image-choosers.d.ts.map +1 -0
  67. package/dist/brand/brand-image-choosers.js +76 -0
  68. package/dist/brand/brand-image-choosers.js.map +1 -0
  69. package/dist/brand/brand-workspace-change-notice.d.ts +20 -0
  70. package/dist/brand/brand-workspace-change-notice.d.ts.map +1 -0
  71. package/dist/brand/brand-workspace-change-notice.js +19 -0
  72. package/dist/brand/brand-workspace-change-notice.js.map +1 -0
  73. package/dist/brand/index.d.ts +37 -0
  74. package/dist/brand/index.d.ts.map +1 -1
  75. package/dist/brand/index.js +29 -0
  76. package/dist/brand/index.js.map +1 -1
  77. package/dist/brand/resume-brand-generation.d.ts +17 -0
  78. package/dist/brand/resume-brand-generation.d.ts.map +1 -0
  79. package/dist/brand/resume-brand-generation.js +22 -0
  80. package/dist/brand/resume-brand-generation.js.map +1 -0
  81. package/dist/brand/use-brand-generation-discovery.d.ts +14 -0
  82. package/dist/brand/use-brand-generation-discovery.d.ts.map +1 -0
  83. package/dist/brand/use-brand-generation-discovery.js +61 -0
  84. package/dist/brand/use-brand-generation-discovery.js.map +1 -0
  85. package/dist/brand/use-brand-generation-transport.d.ts +16 -0
  86. package/dist/brand/use-brand-generation-transport.d.ts.map +1 -0
  87. package/dist/brand/use-brand-generation-transport.js +182 -0
  88. package/dist/brand/use-brand-generation-transport.js.map +1 -0
  89. package/dist/brand/use-brand-generation.d.ts +35 -0
  90. package/dist/brand/use-brand-generation.d.ts.map +1 -0
  91. package/dist/brand/use-brand-generation.js +225 -0
  92. package/dist/brand/use-brand-generation.js.map +1 -0
  93. package/dist/brand/use-brand-image-operation-result.d.ts +43 -0
  94. package/dist/brand/use-brand-image-operation-result.d.ts.map +1 -0
  95. package/dist/brand/use-brand-image-operation-result.js +162 -0
  96. package/dist/brand/use-brand-image-operation-result.js.map +1 -0
  97. package/dist/brand/use-brand-profile-acceptance.d.ts +38 -0
  98. package/dist/brand/use-brand-profile-acceptance.d.ts.map +1 -0
  99. package/dist/brand/use-brand-profile-acceptance.js +84 -0
  100. package/dist/brand/use-brand-profile-acceptance.js.map +1 -0
  101. package/dist/brand/use-brand-public-visibility.d.ts +59 -0
  102. package/dist/brand/use-brand-public-visibility.d.ts.map +1 -0
  103. package/dist/brand/use-brand-public-visibility.js +69 -0
  104. package/dist/brand/use-brand-public-visibility.js.map +1 -0
  105. package/dist/brand/use-brand-workspace-concurrency.d.ts +132 -0
  106. package/dist/brand/use-brand-workspace-concurrency.d.ts.map +1 -0
  107. package/dist/brand/use-brand-workspace-concurrency.js +255 -0
  108. package/dist/brand/use-brand-workspace-concurrency.js.map +1 -0
  109. package/dist/brand/use-brand-workspace-image-candidates.d.ts +19 -0
  110. package/dist/brand/use-brand-workspace-image-candidates.d.ts.map +1 -0
  111. package/dist/brand/use-brand-workspace-image-candidates.js +39 -0
  112. package/dist/brand/use-brand-workspace-image-candidates.js.map +1 -0
  113. package/dist/brand/use-org-scoped-state.d.ts +3 -0
  114. package/dist/brand/use-org-scoped-state.d.ts.map +1 -0
  115. package/dist/brand/use-org-scoped-state.js +22 -0
  116. package/dist/brand/use-org-scoped-state.js.map +1 -0
  117. package/dist/components/multi-step-loader.d.ts +4 -0
  118. package/dist/components/multi-step-loader.d.ts.map +1 -1
  119. package/dist/components/multi-step-loader.js +4 -3
  120. package/dist/components/multi-step-loader.js.map +1 -1
  121. package/dist/moderation/moderation-event.d.ts +2 -0
  122. package/dist/moderation/moderation-event.d.ts.map +1 -1
  123. package/dist/moderation/moderation-event.js +7 -0
  124. package/dist/moderation/moderation-event.js.map +1 -1
  125. package/dist/moderation/moderation-store.d.ts.map +1 -1
  126. package/dist/moderation/moderation-store.js +4 -2
  127. package/dist/moderation/moderation-store.js.map +1 -1
  128. package/dist/realtime/job-status/schemas.d.ts +2 -2
  129. package/package.json +1 -1
@@ -0,0 +1,261 @@
1
+ // CEL-1682 confirmed finding: this union previously carried three phases
2
+ // ("scraping", "writing", "reviewing") the backend's real
3
+ // `BrandProfileGenerationPhase` union (contracts §2, generation-service
4
+ // schemas.ts) never emits and never will — `BrandGenerationProgress.tsx`'s
5
+ // own phase-label map only ever had entries for the 5 real phases, so those
6
+ // three were always dead. Kept in sync with the backend union exactly.
7
+ const JOB_PHASES = ["mapping", "selecting", "crawling", "consolidating", "finalizing"];
8
+ const JOB_STATUSES = ["pending", "running", "completed", "failed", "cancelled"];
9
+ const PAGE_STATUSES = ["pending", "active", "done", "failed"];
10
+ const ELIGIBILITY_REASONS = ["cooldown", "active_attempt", "retry_limit"];
11
+ // CEL-1679 contract §2 "Attempt state and outcome" — the semantic result
12
+ // classified at finalisation from the persisted draft, distinct from
13
+ // transport `status`. `null` while running/pending or on any response shape
14
+ // that omits it (cancel/prioritize/accept, SSE updates).
15
+ const OUTCOMES = ["useful_draft", "partial_draft", "no_result", "failed", "cancelled"];
16
+ export class BrandGenerationResponseError extends Error {
17
+ status;
18
+ code = "INVALID_BRAND_GENERATION_RESPONSE";
19
+ constructor(status) {
20
+ super("Invalid brand generation response");
21
+ this.status = status;
22
+ this.name = "BrandGenerationResponseError";
23
+ }
24
+ }
25
+ function isRecord(value) {
26
+ return value !== null && typeof value === "object" && !Array.isArray(value);
27
+ }
28
+ function isOneOf(value, values) {
29
+ return typeof value === "string" && values.some((candidate) => candidate === value);
30
+ }
31
+ function requiredString(record, key) {
32
+ const value = record[key];
33
+ return typeof value === "string" ? value : null;
34
+ }
35
+ function optionalNumber(record, key) {
36
+ const value = record[key];
37
+ return value === undefined
38
+ ? undefined
39
+ : typeof value === "number" && Number.isFinite(value)
40
+ ? value
41
+ : null;
42
+ }
43
+ function isStringOrNull(value) {
44
+ return value === null || typeof value === "string";
45
+ }
46
+ function isIntegerOrNull(value) {
47
+ return value === null || (typeof value === "number" && Number.isInteger(value));
48
+ }
49
+ /** Degrades to `undefined` (absent) rather than failing the whole job parse —
50
+ * same posture as `parseEligibility`: an unrecognised outcome value from a
51
+ * future backend addition must not break polling. */
52
+ function parseOutcome(value) {
53
+ if (value === null)
54
+ return null;
55
+ return isOneOf(value, OUTCOMES) ? value : undefined;
56
+ }
57
+ function isStringArray(value) {
58
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
59
+ }
60
+ function parseContext(value) {
61
+ if (value === null)
62
+ return null;
63
+ if (!isRecord(value))
64
+ return undefined;
65
+ const { businessName, businessType, locale, focusUrls, corrections } = value;
66
+ if ((businessName !== undefined && typeof businessName !== "string") ||
67
+ (businessType !== undefined && typeof businessType !== "string") ||
68
+ (locale !== undefined && typeof locale !== "string") ||
69
+ (corrections !== undefined && typeof corrections !== "string") ||
70
+ (focusUrls !== undefined && !isStringArray(focusUrls)))
71
+ return undefined;
72
+ return {
73
+ ...(businessName === undefined ? {} : { businessName }),
74
+ ...(businessType === undefined ? {} : { businessType }),
75
+ ...(locale === undefined ? {} : { locale }),
76
+ ...(focusUrls === undefined ? {} : { focusUrls }),
77
+ ...(corrections === undefined ? {} : { corrections }),
78
+ };
79
+ }
80
+ export function parseEligibility(value) {
81
+ if (!isRecord(value))
82
+ return null;
83
+ const { canStart, reason, nextEligibleAt, lastUsefulDraftAt, retriesRemainingToday } = value;
84
+ if (typeof canStart !== "boolean" ||
85
+ !isStringOrNull(nextEligibleAt) ||
86
+ !isStringOrNull(lastUsefulDraftAt) ||
87
+ !isIntegerOrNull(retriesRemainingToday))
88
+ return null;
89
+ // An unrecognised `reason` (an additive backend enum value this client does
90
+ // not know yet) must not invalidate the whole snapshot: keep the booleans and
91
+ // dates, and report the reason as unknown (`null`).
92
+ const knownReason = isOneOf(reason, ELIGIBILITY_REASONS)
93
+ ? reason
94
+ : null;
95
+ return {
96
+ canStart,
97
+ reason: knownReason,
98
+ nextEligibleAt,
99
+ lastUsefulDraftAt,
100
+ retriesRemainingToday,
101
+ };
102
+ }
103
+ export function asEnvelope(value) {
104
+ if (!isRecord(value))
105
+ return {};
106
+ const status = isRecord(value.response) && typeof value.response.status === "number"
107
+ ? value.response.status
108
+ : undefined;
109
+ return {
110
+ ...("data" in value ? { data: value.data } : {}),
111
+ ...("error" in value ? { error: value.error } : {}),
112
+ ...(value.response instanceof Response ? { response: value.response } : {}),
113
+ ...(status === undefined ? {} : { status }),
114
+ };
115
+ }
116
+ export function responseStatus(envelope) {
117
+ return envelope.status ?? envelope.response?.status ?? 500;
118
+ }
119
+ function parsePageProgress(value) {
120
+ if (!isRecord(value))
121
+ return null;
122
+ const url = requiredString(value, "url");
123
+ const round = optionalNumber(value, "round");
124
+ return url === null ||
125
+ round === null ||
126
+ round === undefined ||
127
+ !isOneOf(value.status, PAGE_STATUSES)
128
+ ? null
129
+ : { url, round, status: value.status };
130
+ }
131
+ function parseProgress(value) {
132
+ if (!isRecord(value) ||
133
+ (value.phase !== undefined && !isOneOf(value.phase, JOB_PHASES)) ||
134
+ (value.currentUrl !== undefined &&
135
+ value.currentUrl !== null &&
136
+ typeof value.currentUrl !== "string") ||
137
+ (value.message !== undefined && typeof value.message !== "string"))
138
+ return null;
139
+ const numericKeys = [
140
+ "iteration",
141
+ "completenessScore",
142
+ "urlsDiscovered",
143
+ "urlsCrawled",
144
+ "round",
145
+ "pagesTotal",
146
+ "pagesDone",
147
+ ];
148
+ const numbers = numericKeys.map((key) => [key, optionalNumber(value, key)]);
149
+ if (numbers.some(([, number]) => number === null))
150
+ return null;
151
+ let pageProgress;
152
+ if (value.pageProgress !== undefined) {
153
+ if (!Array.isArray(value.pageProgress))
154
+ return null;
155
+ pageProgress = [];
156
+ for (const page of value.pageProgress) {
157
+ const parsed = parsePageProgress(page);
158
+ if (parsed === null)
159
+ return null;
160
+ pageProgress.push(parsed);
161
+ }
162
+ }
163
+ let cost;
164
+ if (value.cost !== undefined) {
165
+ if (!isRecord(value.cost))
166
+ return null;
167
+ const firecrawlCredits = optionalNumber(value.cost, "firecrawlCredits");
168
+ const llmInputTokens = optionalNumber(value.cost, "llmInputTokens");
169
+ const llmOutputTokens = optionalNumber(value.cost, "llmOutputTokens");
170
+ if (firecrawlCredits === null ||
171
+ firecrawlCredits === undefined ||
172
+ llmInputTokens === null ||
173
+ llmInputTokens === undefined ||
174
+ llmOutputTokens === null ||
175
+ llmOutputTokens === undefined)
176
+ return null;
177
+ cost = { firecrawlCredits, llmInputTokens, llmOutputTokens };
178
+ }
179
+ const result = {
180
+ ...(value.phase === undefined ? {} : { phase: value.phase }),
181
+ ...(value.currentUrl === undefined ? {} : { currentUrl: value.currentUrl }),
182
+ ...(value.message === undefined ? {} : { message: value.message }),
183
+ ...(cost === undefined ? {} : { cost }),
184
+ ...(pageProgress === undefined ? {} : { pageProgress }),
185
+ };
186
+ for (const [key, number] of numbers)
187
+ if (number !== undefined)
188
+ Object.assign(result, { [key]: number });
189
+ return result;
190
+ }
191
+ export function parseJob(value, requireHomepageUrl) {
192
+ if (!isRecord(value))
193
+ return null;
194
+ const id = requiredString(value, "id");
195
+ const workflowId = requiredString(value, "workflowId");
196
+ const createdAt = requiredString(value, "createdAt");
197
+ const updatedAt = requiredString(value, "updatedAt");
198
+ const progress = parseProgress(value.progress);
199
+ const homepageUrl = value.homepageUrl;
200
+ // `eligibility` is optional on the wire (present on GET /:jobId and on an
201
+ // active GET /active job; absent on cancel/prioritize/accept and SSE). It is
202
+ // an org-level side-car, not part of the job's identity, so a
203
+ // present-but-unparseable value degrades to ABSENT rather than rejecting the
204
+ // whole job read: an additive backend change to the eligibility shape must
205
+ // never break polling or `resume(jobId)`.
206
+ const eligibility = "eligibility" in value ? (parseEligibility(value.eligibility) ?? undefined) : undefined;
207
+ const outcome = "outcome" in value ? parseOutcome(value.outcome) : undefined;
208
+ const context = "context" in value ? parseContext(value.context) : undefined;
209
+ if (id === null ||
210
+ workflowId === null ||
211
+ createdAt === null ||
212
+ updatedAt === null ||
213
+ progress === null ||
214
+ !isOneOf(value.status, JOB_STATUSES) ||
215
+ (value.error !== null && typeof value.error !== "string") ||
216
+ (homepageUrl !== undefined && typeof homepageUrl !== "string") ||
217
+ (requireHomepageUrl && typeof homepageUrl !== "string"))
218
+ return null;
219
+ return {
220
+ id,
221
+ workflowId,
222
+ createdAt,
223
+ updatedAt,
224
+ status: value.status,
225
+ progress,
226
+ error: value.error,
227
+ ...(typeof homepageUrl === "string" ? { homepageUrl } : {}),
228
+ ...(eligibility ? { eligibility } : {}),
229
+ ...(outcome !== undefined ? { outcome } : {}),
230
+ ...(context !== undefined ? { context } : {}),
231
+ };
232
+ }
233
+ function toActiveJob(rawJob) {
234
+ const job = parseJob(rawJob, true);
235
+ return job === null || job.homepageUrl === undefined
236
+ ? null
237
+ : { ...job, homepageUrl: job.homepageUrl };
238
+ }
239
+ export function parseActiveEnvelope(value) {
240
+ if (isRecord(value) && "job" in value) {
241
+ if (value.job === null)
242
+ return { job: null, eligibility: parseEligibility(value.eligibility) };
243
+ const job = toActiveJob(value.job);
244
+ if (job === null)
245
+ return null;
246
+ return { job, eligibility: parseEligibility(value.eligibility) };
247
+ }
248
+ // Legacy bare-job 200 shape: the whole payload IS the job.
249
+ const job = toActiveJob(value);
250
+ return job === null ? null : { job, eligibility: null };
251
+ }
252
+ export function parseStart(value) {
253
+ if (!isRecord(value))
254
+ return null;
255
+ const jobId = requiredString(value, "jobId");
256
+ const workflowId = requiredString(value, "workflowId");
257
+ return jobId === null || workflowId === null || typeof value.reused !== "boolean"
258
+ ? null
259
+ : { jobId, workflowId, reused: value.reused };
260
+ }
261
+ //# sourceMappingURL=brand-generation-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-response.js","sourceRoot":"","sources":["../../src/brand/brand-generation-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { BrandGenerationJobProgress as JobProgress, BrandGenerationJobStatus as JobStatus } from "./brand-generation-response.js";
2
+ export interface BrandGenerationUpdate {
3
+ jobId?: string;
4
+ id?: string;
5
+ status: JobStatus;
6
+ progress?: JobProgress;
7
+ error?: string | null;
8
+ result?: {
9
+ profileId?: string;
10
+ } | null;
11
+ }
12
+ export declare function parseSseUpdate(payload: string): BrandGenerationUpdate | null;
13
+ export declare function dataPayload(frame: string): string | null;
14
+ //# sourceMappingURL=brand-generation-sse-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-sse-parser.d.ts","sourceRoot":"","sources":["../../src/brand/brand-generation-sse-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,IAAI,WAAW,EACzC,wBAAwB,IAAI,SAAS,EACtC,MAAM,6BAA6B,CAAC;AASrC,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxC;AAoDD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAoB5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD"}
@@ -0,0 +1,92 @@
1
+ const JOB_STATUSES = ["pending", "running", "completed", "failed", "cancelled"];
2
+ // CEL-1682 confirmed finding — kept in sync with brandGenerationResponse.ts's
3
+ // JOB_PHASES: the backend's real `BrandProfileGenerationPhase` union
4
+ // (contracts §2) is mapping/selecting/crawling/consolidating/finalizing;
5
+ // "scraping"/"writing"/"reviewing" never appear on the wire.
6
+ const JOB_PHASES = ["mapping", "selecting", "crawling", "consolidating", "finalizing"];
7
+ function isRecord(value) {
8
+ return value !== null && typeof value === "object";
9
+ }
10
+ function parsePageProgress(value) {
11
+ if (!isRecord(value))
12
+ return null;
13
+ const statuses = ["pending", "active", "done", "failed"];
14
+ const status = statuses.find((candidate) => candidate === value.status);
15
+ if (typeof value.url !== "string" || typeof value.round !== "number" || !status)
16
+ return null;
17
+ return { url: value.url, round: value.round, status };
18
+ }
19
+ function parseProgress(value) {
20
+ if (!isRecord(value))
21
+ return undefined;
22
+ const phase = JOB_PHASES.find((candidate) => candidate === value.phase);
23
+ let pageProgress;
24
+ if (value.pageProgress !== undefined) {
25
+ if (!Array.isArray(value.pageProgress))
26
+ return undefined;
27
+ const pages = value.pageProgress.map(parsePageProgress);
28
+ if (pages.some((page) => page === null))
29
+ return undefined;
30
+ pageProgress = pages.filter((page) => page !== null);
31
+ }
32
+ return {
33
+ ...(phase === undefined ? {} : { phase }),
34
+ ...(typeof value.iteration === "number" ? { iteration: value.iteration } : {}),
35
+ ...(typeof value.currentUrl === "string" || value.currentUrl === null
36
+ ? { currentUrl: value.currentUrl }
37
+ : {}),
38
+ ...(typeof value.message === "string" ? { message: value.message } : {}),
39
+ ...(typeof value.completenessScore === "number"
40
+ ? { completenessScore: value.completenessScore }
41
+ : {}),
42
+ ...(typeof value.urlsDiscovered === "number" ? { urlsDiscovered: value.urlsDiscovered } : {}),
43
+ ...(typeof value.urlsCrawled === "number" ? { urlsCrawled: value.urlsCrawled } : {}),
44
+ ...(typeof value.round === "number" ? { round: value.round } : {}),
45
+ ...(typeof value.pagesTotal === "number" ? { pagesTotal: value.pagesTotal } : {}),
46
+ ...(typeof value.pagesDone === "number" ? { pagesDone: value.pagesDone } : {}),
47
+ ...(pageProgress === undefined ? {} : { pageProgress }),
48
+ };
49
+ }
50
+ function parseResult(value) {
51
+ if (value === null)
52
+ return null;
53
+ if (!isRecord(value))
54
+ return undefined;
55
+ if (value.profileId === undefined)
56
+ return {};
57
+ return typeof value.profileId === "string" ? { profileId: value.profileId } : undefined;
58
+ }
59
+ export function parseSseUpdate(payload) {
60
+ let value;
61
+ try {
62
+ value = JSON.parse(payload);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ if (!isRecord(value))
68
+ return null;
69
+ const status = JOB_STATUSES.find((candidate) => candidate === value.status);
70
+ if (!status)
71
+ return null;
72
+ const progress = parseProgress(value.progress);
73
+ const result = parseResult(value.result);
74
+ return {
75
+ ...(typeof value.jobId === "string" ? { jobId: value.jobId } : {}),
76
+ ...(typeof value.id === "string" ? { id: value.id } : {}),
77
+ status,
78
+ ...(progress === undefined ? {} : { progress }),
79
+ ...(typeof value.error === "string" || value.error === null ? { error: value.error } : {}),
80
+ ...(result === undefined ? {} : { result }),
81
+ };
82
+ }
83
+ export function dataPayload(frame) {
84
+ const lines = frame.split(/\r?\n/);
85
+ const dataLines = lines.flatMap((line) => {
86
+ if (!line.startsWith("data:"))
87
+ return [];
88
+ return [line.slice(5).startsWith(" ") ? line.slice(6) : line.slice(5)];
89
+ });
90
+ return dataLines.length > 0 ? dataLines.join("\n") : null;
91
+ }
92
+ //# sourceMappingURL=brand-generation-sse-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-sse-parser.js","sourceRoot":"","sources":["../../src/brand/brand-generation-sse-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { BrandGenerationRecoveryCopy } from "./brand-generation-recovery-copy.js";
2
+ import type { BrandGenerationEligibility } from "./brand-generation-types.js";
3
+ import type { BrandPersona } from "./types.js";
4
+ export interface BrandGenerationStartCopy {
5
+ readonly websiteUrlLabel: string;
6
+ readonly urlPlaceholder: string;
7
+ readonly generateAction: string;
8
+ readonly orSeparator: string;
9
+ readonly createManuallyAction: string;
10
+ /** Shown when generation is blocked for a reason this client does not recognise. */
11
+ readonly eligibilityUnknownReason: string;
12
+ /**
13
+ * Same, when a retry date is known. A function, not a template: i18n
14
+ * libraries interpolate their own placeholder syntax (`{{date}}`), and string
15
+ * replacement here would leak braces. Receives the already formatted date.
16
+ */
17
+ readonly eligibilityUnknownReasonWithDate: (formattedDate: string) => string;
18
+ }
19
+ export declare const DEFAULT_BRAND_GENERATION_START_COPY: BrandGenerationStartCopy;
20
+ export interface BrandGenerationStartProps {
21
+ readonly persona?: BrandPersona;
22
+ /** Org-level eligibility from discovery; `null` while it is still settling. */
23
+ readonly eligibility: BrandGenerationEligibility | null;
24
+ readonly generationUrl: string;
25
+ readonly onGenerationUrlChange: (url: string) => void;
26
+ /** Called with the trimmed URL on submit; never while generation is blocked. */
27
+ readonly onStart: (url: string) => void;
28
+ readonly onCreateManually: () => void;
29
+ readonly formatDateTime: (iso: string) => string;
30
+ readonly copy?: Partial<BrandGenerationStartCopy>;
31
+ readonly recoveryCopy?: BrandGenerationRecoveryCopy;
32
+ /**
33
+ * Prefix of the generated ids. Producer passes `idPrefix="brand-generation-idle"`
34
+ * (its tests and e2e select on it); omit it for a unique `useId` prefix.
35
+ */
36
+ readonly idPrefix?: string;
37
+ }
38
+ /**
39
+ * CEL-2127 — the idle "no brand profile yet" start form shared by producer and
40
+ * importer: website URL, the brand-coloured "Generate Profile", the "or"
41
+ * separator and "Create manually".
42
+ *
43
+ * Cooldown, active-attempt and retry-limit eligibility block a FRESH start too
44
+ * (it is org-level, not conditioned on a profile existing), so the form is
45
+ * disabled and the reason is shown rather than letting a start 409 unexplained.
46
+ * A blocked state with no known reason still gets a fallback notice.
47
+ */
48
+ export declare function BrandGenerationStart({ persona, eligibility, generationUrl, onGenerationUrlChange, onStart, onCreateManually, formatDateTime, copy, recoveryCopy, idPrefix, }: BrandGenerationStartProps): import("react/jsx-runtime").JSX.Element;
49
+ //# sourceMappingURL=brand-generation-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-start.d.ts","sourceRoot":"","sources":["../../src/brand/brand-generation-start.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,oFAAoF;IACpF,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,gCAAgC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9E;AAED,eAAO,MAAM,mCAAmC,EAAE,wBASjD,CAAC;AAIF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,2BAA2B,CAAC;IACpD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,OAAoB,EACpB,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,QAAQ,GACT,EAAE,yBAAyB,2CAmE3B"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { Button } from "../components/button.js";
4
+ import { Input } from "../components/input.js";
5
+ import { BrandGenerationRecovery } from "./brand-generation-recovery.js";
6
+ export const DEFAULT_BRAND_GENERATION_START_COPY = {
7
+ websiteUrlLabel: "Website URL",
8
+ urlPlaceholder: "https://your-winery.com",
9
+ generateAction: "Generate Profile",
10
+ orSeparator: "or",
11
+ createManuallyAction: "Create manually",
12
+ eligibilityUnknownReason: "Generation is not available right now.",
13
+ eligibilityUnknownReasonWithDate: (formattedDate) => `Generation is not available right now. Try again after ${formattedDate}.`,
14
+ };
15
+ const IMPORTER_PLACEHOLDER = "https://your-company.com";
16
+ /**
17
+ * CEL-2127 — the idle "no brand profile yet" start form shared by producer and
18
+ * importer: website URL, the brand-coloured "Generate Profile", the "or"
19
+ * separator and "Create manually".
20
+ *
21
+ * Cooldown, active-attempt and retry-limit eligibility block a FRESH start too
22
+ * (it is org-level, not conditioned on a profile existing), so the form is
23
+ * disabled and the reason is shown rather than letting a start 409 unexplained.
24
+ * A blocked state with no known reason still gets a fallback notice.
25
+ */
26
+ export function BrandGenerationStart({ persona = "producer", eligibility, generationUrl, onGenerationUrlChange, onStart, onCreateManually, formatDateTime, copy, recoveryCopy, idPrefix, }) {
27
+ const generatedId = useId();
28
+ const prefix = idPrefix ?? `brand-generation-idle-${generatedId}`;
29
+ const defaults = persona === "importer"
30
+ ? { ...DEFAULT_BRAND_GENERATION_START_COPY, urlPlaceholder: IMPORTER_PLACEHOLDER }
31
+ : DEFAULT_BRAND_GENERATION_START_COPY;
32
+ const text = { ...defaults, ...copy };
33
+ const canStart = eligibility?.canStart !== false;
34
+ const trimmedUrl = generationUrl.trim();
35
+ const blockedMessage = eligibility?.nextEligibleAt
36
+ ? text.eligibilityUnknownReasonWithDate(formatDateTime(eligibility.nextEligibleAt))
37
+ : text.eligibilityUnknownReason;
38
+ return (_jsxs("div", { className: "mt-8 flex flex-col items-center gap-4", children: [eligibility && !canStart ? (_jsx("div", { id: `${prefix}-notice`, className: "w-full max-w-md", children: eligibility.reason ? (_jsx(BrandGenerationRecovery, { eligibility: eligibility, formatDateTime: formatDateTime, copy: recoveryCopy, idPrefix: prefix })) : (
39
+ // `BrandGenerationRecovery` renders only for a known `reason`, and
40
+ // an unrecognised one parses to `null`: without this the form would
41
+ // be disabled with nothing explaining why.
42
+ _jsx("div", { role: "status", "data-testid": "brand-generation-idle-unknown-reason", className: "rounded-2xl border border-border bg-card p-5 text-sm/6 text-muted-foreground", children: blockedMessage })) })) : null, _jsxs("form", { className: "flex w-full max-w-md items-center gap-2", onSubmit: (event) => {
43
+ event.preventDefault();
44
+ if (trimmedUrl && canStart)
45
+ onStart(trimmedUrl);
46
+ }, children: [_jsx(Input, { "aria-label": text.websiteUrlLabel, type: "url", placeholder: text.urlPlaceholder, value: generationUrl, onChange: (event) => onGenerationUrlChange(event.target.value), className: "flex-1", disabled: !canStart, "aria-describedby": eligibility && !canStart ? `${prefix}-notice` : undefined, required: true }), _jsx(Button, { type: "submit", color: "brand", disabled: !canStart || !trimmedUrl, children: text.generateAction })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: text.orSeparator }), _jsx(Button, { outline: true, onClick: onCreateManually, children: text.createManuallyAction })] }));
47
+ }
48
+ //# sourceMappingURL=brand-generation-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-start.js","sourceRoot":"","sources":["../../src/brand/brand-generation-start.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MultiStepLoaderStep } from "../components/multi-step-loader.js";
2
+ import type { BrandGenerationJobProgress } from "./brand-generation-response.js";
3
+ export declare function buildBrandGenerationSteps(preset: readonly MultiStepLoaderStep[], progress: BrandGenerationJobProgress | undefined, isFailed: boolean, passLabel?: (iteration: number) => string): MultiStepLoaderStep[];
4
+ //# sourceMappingURL=brand-generation-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-steps.d.ts","sourceRoot":"","sources":["../../src/brand/brand-generation-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,QAAQ,EAAE,0BAA0B,GAAG,SAAS,EAChD,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GACxC,mBAAmB,EAAE,CAuBvB"}
@@ -0,0 +1,29 @@
1
+ export function buildBrandGenerationSteps(preset, progress, isFailed, passLabel) {
2
+ return preset.map((step) => {
3
+ let subLabel = step.subLabel;
4
+ let state = step.state;
5
+ if (progress && step.id === progress.phase) {
6
+ const parts = [];
7
+ if (step.id === "crawling" && progress.currentUrl) {
8
+ try {
9
+ parts.push(new URL(progress.currentUrl).hostname);
10
+ }
11
+ catch {
12
+ parts.length = 0;
13
+ }
14
+ }
15
+ if (step.id === "consolidating" && progress.completenessScore !== undefined) {
16
+ parts.push(`${Math.round(progress.completenessScore * 100)}%`);
17
+ }
18
+ const round = progress.round ?? progress.iteration ?? 0;
19
+ if (passLabel && round >= 2)
20
+ parts.push(passLabel(round));
21
+ if (parts.length > 0)
22
+ subLabel = parts.join(" · ");
23
+ if (isFailed)
24
+ state = "failed";
25
+ }
26
+ return { ...step, subLabel, state };
27
+ });
28
+ }
29
+ //# sourceMappingURL=brand-generation-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-steps.js","sourceRoot":"","sources":["../../src/brand/brand-generation-steps.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,yBAAyB,CACvC,MAAsC,EACtC,QAAgD,EAChD,QAAiB,EACjB,SAAyC;IAEzC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAClD,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACpD,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,EAAE,KAAK,eAAe,IAAI,QAAQ,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC5E,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;YACxD,IAAI,SAAS,IAAI,KAAK,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,QAAQ;gBAAE,KAAK,GAAG,QAAQ,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { ComponentProps, ReactNode } from "react";
2
+ import { type BrandGenerationCopy } from "./brand-generation-copy.js";
3
+ import type { UseBrandGenerationResult } from "./use-brand-generation.js";
4
+ import { BrandProfileWorkspace } from "./brand-profile-workspace.js";
5
+ import type { BrandPublicVisibility } from "./brand-profile-review.js";
6
+ import type { BrandPersona, BrandProfileInput } from "./types.js";
7
+ type WorkspaceProps = ComponentProps<typeof BrandProfileWorkspace>;
8
+ export interface BrandGenerationSurfaceProps {
9
+ /** The `useBrandGeneration` result. */
10
+ readonly brandGeneration: UseBrandGenerationResult;
11
+ readonly persona?: BrandPersona;
12
+ readonly copy?: Partial<BrandGenerationCopy>;
13
+ readonly resolvedGenerationUrl: string;
14
+ readonly reviewProfileData: BrandProfileInput | null;
15
+ readonly reviewVisibility: BrandPublicVisibility | undefined;
16
+ /** Show the draft-review workspace instead of the progress panel. */
17
+ readonly showReview: boolean;
18
+ readonly onSubmit: WorkspaceProps["onSubmit"];
19
+ readonly onVisibilityChange?: WorkspaceProps["onPublicVisibilityChange"];
20
+ readonly saveTarget?: WorkspaceProps["saveTarget"];
21
+ readonly fieldErrors?: WorkspaceProps["fieldErrors"];
22
+ readonly conflict?: WorkspaceProps["conflict"];
23
+ readonly onReloadConflict?: () => void;
24
+ readonly onKeepMineConflict?: () => void;
25
+ readonly allowedImageOrigins?: readonly string[];
26
+ readonly reviewCopy?: WorkspaceProps["reviewCopy"];
27
+ readonly formCopy?: WorkspaceProps["formCopy"];
28
+ readonly workspaceCopy?: WorkspaceProps["copy"];
29
+ readonly statusLabel?: string;
30
+ readonly isAccepting?: boolean;
31
+ /** Default accept button renders only when this is given. */
32
+ readonly onAccept?: () => void;
33
+ /** Default discard button renders only when this is given. */
34
+ readonly onDismiss?: () => void;
35
+ readonly isDismissing?: boolean;
36
+ /** Replaces the default accept / discard buttons (a consumer's own button kit). */
37
+ readonly actions?: ReactNode;
38
+ readonly changeNotice?: ReactNode;
39
+ readonly workspaceKey?: string;
40
+ readonly imageChoosers?: ReactNode;
41
+ readonly formatDateTime: (iso: string) => string;
42
+ }
43
+ /**
44
+ * The generation page body: the draft-review workspace once there is a draft to
45
+ * review, otherwise the progress / recovery panel. The persona flows into the
46
+ * workspace so importer wording and sections match the saved profile page.
47
+ */
48
+ export declare function BrandGenerationSurface({ brandGeneration, persona, copy, resolvedGenerationUrl, reviewProfileData, reviewVisibility, showReview, onSubmit, onVisibilityChange, saveTarget, fieldErrors, conflict, onReloadConflict, onKeepMineConflict, allowedImageOrigins, reviewCopy, formCopy, workspaceCopy, statusLabel, isAccepting, onAccept, onDismiss, isDismissing, actions, changeNotice, workspaceKey, imageChoosers, formatDateTime, }: BrandGenerationSurfaceProps): import("react/jsx-runtime").JSX.Element;
49
+ export {};
50
+ //# sourceMappingURL=brand-generation-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-surface.d.ts","sourceRoot":"","sources":["../../src/brand/brand-generation-surface.tsx"],"names":[],"mappings":"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"}