@cellarnode/ui 0.186.0 → 0.187.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 (82) hide show
  1. package/dist/brand/brand-generation-api.d.ts +44 -0
  2. package/dist/brand/brand-generation-api.d.ts.map +1 -0
  3. package/dist/brand/brand-generation-api.js +2 -0
  4. package/dist/brand/brand-generation-api.js.map +1 -0
  5. package/dist/brand/brand-generation-client.d.ts +28 -0
  6. package/dist/brand/brand-generation-client.d.ts.map +1 -0
  7. package/dist/brand/brand-generation-client.js +107 -0
  8. package/dist/brand/brand-generation-client.js.map +1 -0
  9. package/dist/brand/brand-generation-copy.d.ts +44 -0
  10. package/dist/brand/brand-generation-copy.d.ts.map +1 -0
  11. package/dist/brand/brand-generation-copy.js +70 -0
  12. package/dist/brand/brand-generation-copy.js.map +1 -0
  13. package/dist/brand/brand-generation-fixtures.d.ts +32 -0
  14. package/dist/brand/brand-generation-fixtures.d.ts.map +1 -0
  15. package/dist/brand/brand-generation-fixtures.js +88 -0
  16. package/dist/brand/brand-generation-fixtures.js.map +1 -0
  17. package/dist/brand/brand-generation-flow.d.ts +34 -0
  18. package/dist/brand/brand-generation-flow.d.ts.map +1 -0
  19. package/dist/brand/brand-generation-flow.js +34 -0
  20. package/dist/brand/brand-generation-flow.js.map +1 -0
  21. package/dist/brand/brand-generation-keys.d.ts +16 -0
  22. package/dist/brand/brand-generation-keys.d.ts.map +1 -0
  23. package/dist/brand/brand-generation-keys.js +16 -0
  24. package/dist/brand/brand-generation-keys.js.map +1 -0
  25. package/dist/brand/brand-generation-progress.d.ts +27 -0
  26. package/dist/brand/brand-generation-progress.d.ts.map +1 -0
  27. package/dist/brand/brand-generation-progress.js +61 -0
  28. package/dist/brand/brand-generation-progress.js.map +1 -0
  29. package/dist/brand/brand-generation-recovery-error.d.ts +8 -0
  30. package/dist/brand/brand-generation-recovery-error.d.ts.map +1 -0
  31. package/dist/brand/brand-generation-recovery-error.js +7 -0
  32. package/dist/brand/brand-generation-recovery-error.js.map +1 -0
  33. package/dist/brand/brand-generation-response.d.ts +86 -0
  34. package/dist/brand/brand-generation-response.d.ts.map +1 -0
  35. package/dist/brand/brand-generation-response.js +261 -0
  36. package/dist/brand/brand-generation-response.js.map +1 -0
  37. package/dist/brand/brand-generation-sse-parser.d.ts +14 -0
  38. package/dist/brand/brand-generation-sse-parser.d.ts.map +1 -0
  39. package/dist/brand/brand-generation-sse-parser.js +92 -0
  40. package/dist/brand/brand-generation-sse-parser.js.map +1 -0
  41. package/dist/brand/brand-generation-steps.d.ts +4 -0
  42. package/dist/brand/brand-generation-steps.d.ts.map +1 -0
  43. package/dist/brand/brand-generation-steps.js +29 -0
  44. package/dist/brand/brand-generation-steps.js.map +1 -0
  45. package/dist/brand/brand-generation-surface.d.ts +50 -0
  46. package/dist/brand/brand-generation-surface.d.ts.map +1 -0
  47. package/dist/brand/brand-generation-surface.js +25 -0
  48. package/dist/brand/brand-generation-surface.js.map +1 -0
  49. package/dist/brand/brand-generation-url.d.ts +6 -0
  50. package/dist/brand/brand-generation-url.d.ts.map +1 -0
  51. package/dist/brand/brand-generation-url.js +4 -0
  52. package/dist/brand/brand-generation-url.js.map +1 -0
  53. package/dist/brand/index.d.ts +20 -0
  54. package/dist/brand/index.d.ts.map +1 -1
  55. package/dist/brand/index.js +15 -0
  56. package/dist/brand/index.js.map +1 -1
  57. package/dist/brand/resume-brand-generation.d.ts +17 -0
  58. package/dist/brand/resume-brand-generation.d.ts.map +1 -0
  59. package/dist/brand/resume-brand-generation.js +22 -0
  60. package/dist/brand/resume-brand-generation.js.map +1 -0
  61. package/dist/brand/use-brand-generation-discovery.d.ts +14 -0
  62. package/dist/brand/use-brand-generation-discovery.d.ts.map +1 -0
  63. package/dist/brand/use-brand-generation-discovery.js +61 -0
  64. package/dist/brand/use-brand-generation-discovery.js.map +1 -0
  65. package/dist/brand/use-brand-generation-transport.d.ts +16 -0
  66. package/dist/brand/use-brand-generation-transport.d.ts.map +1 -0
  67. package/dist/brand/use-brand-generation-transport.js +182 -0
  68. package/dist/brand/use-brand-generation-transport.js.map +1 -0
  69. package/dist/brand/use-brand-generation.d.ts +35 -0
  70. package/dist/brand/use-brand-generation.d.ts.map +1 -0
  71. package/dist/brand/use-brand-generation.js +225 -0
  72. package/dist/brand/use-brand-generation.js.map +1 -0
  73. package/dist/brand/use-org-scoped-state.d.ts +3 -0
  74. package/dist/brand/use-org-scoped-state.d.ts.map +1 -0
  75. package/dist/brand/use-org-scoped-state.js +22 -0
  76. package/dist/brand/use-org-scoped-state.js.map +1 -0
  77. package/dist/components/multi-step-loader.d.ts +4 -0
  78. package/dist/components/multi-step-loader.d.ts.map +1 -1
  79. package/dist/components/multi-step-loader.js +4 -3
  80. package/dist/components/multi-step-loader.js.map +1 -1
  81. package/dist/realtime/job-status/schemas.d.ts +2 -2
  82. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,25 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../components/button.js";
3
+ import { resolveBrandGenerationCopy } from "./brand-generation-copy.js";
4
+ import { BrandGenerationProgress } from "./brand-generation-progress.js";
5
+ import { BrandProfileWorkspace } from "./brand-profile-workspace.js";
6
+ // CJK text wraps at phrase boundaries inside the workspace's textareas.
7
+ const workspaceCjkTextClassName = "[&_textarea]:[word-break:auto-phrase]";
8
+ /**
9
+ * The generation page body: the draft-review workspace once there is a draft to
10
+ * review, otherwise the progress / recovery panel. The persona flows into the
11
+ * workspace so importer wording and sections match the saved profile page.
12
+ */
13
+ export function BrandGenerationSurface({ brandGeneration, persona = "producer", 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, }) {
14
+ const text = resolveBrandGenerationCopy(persona, copy);
15
+ if (showReview && reviewProfileData) {
16
+ return (_jsxs("div", { className: "flex flex-col gap-6", children: [changeNotice, _jsx(BrandProfileWorkspace, { className: workspaceCjkTextClassName, persona: persona, profile: reviewProfileData, onSubmit: onSubmit, status: "draft", statusLabel: statusLabel, reviewCopy: reviewCopy, formCopy: formCopy, copy: workspaceCopy, saveTarget: saveTarget, fieldErrors: fieldErrors, conflict: conflict, onReloadConflict: onReloadConflict, onKeepMineConflict: onKeepMineConflict, allowedImageOrigins: allowedImageOrigins, publicVisibility: reviewVisibility, onPublicVisibilityChange: onVisibilityChange,
17
+ // CEL-1862 workaround: the contact and key-people editors are not
18
+ // part of the generated-draft review.
19
+ contactEditor: _jsx(_Fragment, {}), keyPeopleEditor: _jsx(_Fragment, {}), actions: actions ?? (_jsxs(_Fragment, { children: [onAccept ? (_jsx(Button, { color: "brand", onClick: onAccept, disabled: isAccepting, children: isAccepting ? text.acceptingAction : text.acceptAction })) : null, onDismiss ? (_jsx(Button, { outline: true, onClick: onDismiss, disabled: isDismissing, children: text.dismissAction })) : null] })) }, workspaceKey), imageChoosers] }));
20
+ }
21
+ return (_jsx(BrandGenerationProgress, { job: brandGeneration.job, eligibility: brandGeneration.eligibility, transportDegraded: brandGeneration.transportDegraded, error: brandGeneration.error, resolvedUrl: resolvedGenerationUrl, persona: persona, copy: copy, formatDateTime: formatDateTime, onStart: (url, context) => void (context === undefined
22
+ ? brandGeneration.start(url)
23
+ : brandGeneration.start(url, context)), onCancel: () => void brandGeneration.cancel(), onReset: brandGeneration.reset }));
24
+ }
25
+ //# sourceMappingURL=brand-generation-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-surface.js","sourceRoot":"","sources":["../../src/brand/brand-generation-surface.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function resolveGenerationUrl({ enteredUrl, profileSourceUrl, recoveredHomepageUrl, }: {
2
+ readonly enteredUrl: string;
3
+ readonly profileSourceUrl: string | null | undefined;
4
+ readonly recoveredHomepageUrl: string | undefined;
5
+ }): string;
6
+ //# sourceMappingURL=brand-generation-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-url.d.ts","sourceRoot":"","sources":["../../src/brand/brand-generation-url.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,gBAAgB,EAChB,oBAAoB,GACrB,EAAE;IACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;CACnD,GAAG,MAAM,CAET"}
@@ -0,0 +1,4 @@
1
+ export function resolveGenerationUrl({ enteredUrl, profileSourceUrl, recoveredHomepageUrl, }) {
2
+ return enteredUrl.trim() || recoveredHomepageUrl?.trim() || profileSourceUrl?.trim() || "";
3
+ }
4
+ //# sourceMappingURL=brand-generation-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-generation-url.js","sourceRoot":"","sources":["../../src/brand/brand-generation-url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,EACnC,UAAU,EACV,gBAAgB,EAChB,oBAAoB,GAKrB;IACC,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,oBAAoB,EAAE,IAAI,EAAE,IAAI,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7F,CAAC"}
@@ -30,6 +30,26 @@ export { DEFAULT_BRAND_GENERATION_RECOVERY_COPY } from "./brand-generation-recov
30
30
  export type { BrandGenerationRecoveryCopy } from "./brand-generation-recovery-copy.js";
31
31
  export { emptyBrandGenerationContext } from "./brand-generation-types.js";
32
32
  export type { BrandGenerationContextInput, BrandGenerationEligibility, BrandGenerationIneligibleReason, BrandGenerationMissingAssetAction, BrandGenerationOutcome, } from "./brand-generation-types.js";
33
+ export { useBrandGeneration } from "./use-brand-generation.js";
34
+ export type { UseBrandGenerationOptions, UseBrandGenerationResult } from "./use-brand-generation.js";
35
+ export { brandGenerationKeys, isTerminalStatus } from "./brand-generation-keys.js";
36
+ export type { BrandGenerationErrorKind } from "./brand-generation-keys.js";
37
+ export type { BrandGenerationApi, BrandGenerationStreamConfig } from "./brand-generation-api.js";
38
+ export { BrandGenerationRequestError, createBrandGenerationClient, } from "./brand-generation-client.js";
39
+ export type { BrandGenerationClientOptions } from "./brand-generation-client.js";
40
+ export { BrandGenerationResponseError } from "./brand-generation-response.js";
41
+ export type { BrandGenerationActiveJob, BrandGenerationActiveResult, BrandGenerationContext, BrandGenerationJob, BrandGenerationJobOutcome, BrandGenerationJobProgress, BrandGenerationJobStatus, BrandGenerationPageProgress, BrandGenerationPageStatus, BrandGenerationPhase, BrandGenerationStartResponse, } from "./brand-generation-response.js";
42
+ export type { BrandGenerationUpdate } from "./brand-generation-sse-parser.js";
43
+ export { deriveBrandGenerationFlow } from "./brand-generation-flow.js";
44
+ export { resolveGenerationUrl } from "./brand-generation-url.js";
45
+ export { buildBrandGenerationSteps } from "./brand-generation-steps.js";
46
+ export { BrandGenerationProgress } from "./brand-generation-progress.js";
47
+ export type { BrandGenerationProgressProps } from "./brand-generation-progress.js";
48
+ export { BrandGenerationSurface } from "./brand-generation-surface.js";
49
+ export type { BrandGenerationSurfaceProps } from "./brand-generation-surface.js";
50
+ export { BrandGenerationRecoveryError } from "./brand-generation-recovery-error.js";
51
+ export { defaultBrandGenerationCopy, resolveBrandGenerationCopy } from "./brand-generation-copy.js";
52
+ export type { BrandGenerationCopy } from "./brand-generation-copy.js";
33
53
  export { BrandImageChooser } from "./brand-image-chooser.js";
34
54
  export type { BrandImageChooserApplyResult, BrandImageChooserCopy, BrandImageChooserProps, BrandImageChooserSource, } from "./brand-image-chooser.js";
35
55
  export { isBrandImageOperationFailed, isBrandImageOperationIndeterminate, isBrandImageOperationSettled, } from "./brand-image-chooser-types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"AAGA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,YAAY,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAK9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,kCAAkC,EAClC,0BAA0B,EAC1B,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,YAAY,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,sCAAsC,EAAE,MAAM,kCAAkC,CAAC;AAC1F,YAAY,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,+BAA+B,EAC/B,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EACV,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,21 @@ export { BrandGenerationRecovery } from "./brand-generation-recovery.js";
26
26
  export { BrandGenerationContextForm } from "./brand-generation-context-form.js";
27
27
  export { DEFAULT_BRAND_GENERATION_RECOVERY_COPY } from "./brand-generation-recovery-copy.js";
28
28
  export { emptyBrandGenerationContext } from "./brand-generation-types.js";
29
+ // CEL-2127: the shared AI brand-generation flow (hook, SSE transport, HTTP
30
+ // client, parsers, progress and surface), lifted from producer so importer runs
31
+ // the identical pipeline. Transport-agnostic: the consumer injects the API and
32
+ // stream auth.
33
+ export { useBrandGeneration } from "./use-brand-generation.js";
34
+ export { brandGenerationKeys, isTerminalStatus } from "./brand-generation-keys.js";
35
+ export { BrandGenerationRequestError, createBrandGenerationClient, } from "./brand-generation-client.js";
36
+ export { BrandGenerationResponseError } from "./brand-generation-response.js";
37
+ export { deriveBrandGenerationFlow } from "./brand-generation-flow.js";
38
+ export { resolveGenerationUrl } from "./brand-generation-url.js";
39
+ export { buildBrandGenerationSteps } from "./brand-generation-steps.js";
40
+ export { BrandGenerationProgress } from "./brand-generation-progress.js";
41
+ export { BrandGenerationSurface } from "./brand-generation-surface.js";
42
+ export { BrandGenerationRecoveryError } from "./brand-generation-recovery-error.js";
43
+ export { defaultBrandGenerationCopy, resolveBrandGenerationCopy } from "./brand-generation-copy.js";
29
44
  // CEL-1680 slice 2: the unified image chooser (logo, banner, favicon, OG),
30
45
  // its operation-result presentation contract, and the extended candidate
31
46
  // resolver (favicon/ogImage targets, dedup by asset id/content hash,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,qCAAqC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,wEAAwE;AACxE,0EAA0E;AAC1E,gBAAgB;AAChB,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAanF,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,sCAAsC,EAAE,MAAM,kCAAkC,CAAC;AAE1F,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AASvE,2EAA2E;AAC3E,yEAAyE;AACzE,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brand/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,qCAAqC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,wEAAwE;AACxE,0EAA0E;AAC1E,gBAAgB;AAChB,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAanF,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,sCAAsC,EAAE,MAAM,kCAAkC,CAAC;AAE1F,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AASvE,2EAA2E;AAC3E,gFAAgF;AAChF,+EAA+E;AAC/E,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhF,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAe3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAGjG,2EAA2E;AAC3E,yEAAyE;AACzE,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { BrandGenerationApi } from "./brand-generation-api.js";
2
+ import { type BrandGenerationErrorKind } from "./brand-generation-keys.js";
3
+ import type { BrandGenerationJob } from "./brand-generation-response.js";
4
+ import type { BrandGenerationUpdate } from "./brand-generation-sse-parser.js";
5
+ interface ResumeBrandGenerationOptions {
6
+ readonly api: Pick<BrandGenerationApi, "getStatus">;
7
+ readonly isCurrent: () => boolean;
8
+ readonly setError: (error: BrandGenerationErrorKind | null) => void;
9
+ readonly setIsGenerating: (isGenerating: boolean) => void;
10
+ readonly setTransportDegraded: (transportDegraded: boolean) => void;
11
+ readonly setJob: (job: BrandGenerationJob) => void;
12
+ readonly handleUpdate: (update: BrandGenerationUpdate) => void;
13
+ readonly connect: (jobId: string) => void;
14
+ }
15
+ export declare function resumeBrandGeneration(jobId: string, options: ResumeBrandGenerationOptions): Promise<void>;
16
+ export {};
17
+ //# sourceMappingURL=resume-brand-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-brand-generation.d.ts","sourceRoot":"","sources":["../../src/brand/resume-brand-generation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAoB,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,UAAU,4BAA4B;IACpC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,oBAAoB,EAAE,CAAC,iBAAiB,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,22 @@
1
+ import { isTerminalStatus } from "./brand-generation-keys.js";
2
+ export async function resumeBrandGeneration(jobId, options) {
3
+ try {
4
+ options.setError(null);
5
+ options.setTransportDegraded(false);
6
+ options.setIsGenerating(true);
7
+ const status = await options.api.getStatus(jobId);
8
+ if (!options.isCurrent())
9
+ return;
10
+ options.setJob(status);
11
+ options.handleUpdate(status);
12
+ if (!isTerminalStatus(status.status))
13
+ options.connect(jobId);
14
+ }
15
+ catch {
16
+ if (!options.isCurrent())
17
+ return;
18
+ options.setIsGenerating(false);
19
+ options.setError("resume");
20
+ }
21
+ }
22
+ //# sourceMappingURL=resume-brand-generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-brand-generation.js","sourceRoot":"","sources":["../../src/brand/resume-brand-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAiC,MAAM,yBAAyB,CAAC;AAe1F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,OAAqC;IAErC,IAAI,CAAC;QACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAAE,OAAO;QACjC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAAE,OAAO;QACjC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { QueryKey } from "@tanstack/react-query";
2
+ import type { RefObject } from "react";
3
+ import type { BrandGenerationApi } from "./brand-generation-api.js";
4
+ export declare function useBrandGenerationDiscovery(orgId: string, api: Pick<BrandGenerationApi, "getActive">, profileKeyRef: RefObject<QueryKey>): {
5
+ activeQuery: import("@tanstack/react-query").UseQueryResult<import("./brand-generation-response.js").BrandGenerationActiveResult, Error>;
6
+ activeJob: import("./brand-generation-response.js").BrandGenerationActiveJob | null;
7
+ terminalQuery: import("@tanstack/react-query").UseQueryResult<import("./brand-generation-response.js").BrandGenerationActiveResult, Error>;
8
+ terminalJob: import("./brand-generation-response.js").BrandGenerationActiveJob | null;
9
+ eligibility: import("./brand-generation-types.js").BrandGenerationEligibility | null;
10
+ needsTerminalHandoff: boolean;
11
+ isDiscoveringActive: boolean;
12
+ discoveryError: Error | null;
13
+ };
14
+ //# sourceMappingURL=use-brand-generation-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-brand-generation-discovery.d.ts","sourceRoot":"","sources":["../../src/brand/use-brand-generation-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAC1C,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC;;;;;;;;;EA0DnC"}
@@ -0,0 +1,61 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { isTerminalStatus, brandGenerationKeys } from "./brand-generation-keys.js";
4
+ export function useBrandGenerationDiscovery(orgId, api, profileKeyRef) {
5
+ const queryClient = useQueryClient();
6
+ const terminalProfileRefreshesRef = useRef(new Set());
7
+ const activeQuery = useQuery({
8
+ queryKey: brandGenerationKeys.active(orgId),
9
+ queryFn: () => api.getActive(),
10
+ enabled: Boolean(orgId),
11
+ staleTime: 0,
12
+ refetchOnMount: "always",
13
+ });
14
+ // CEL-1682 (contracts §2, carry-over from PR #761) — `activeQuery`/
15
+ // `terminalQuery` now resolve to `{ job, eligibility }` always (never
16
+ // collapsed to `null`), so the discovery-level eligibility snapshot stays
17
+ // reachable even when nothing is running — the motivating case for #688's
18
+ // envelope change (an org sitting in cooldown with no active job).
19
+ const activeJob = activeQuery.data?.job ?? null;
20
+ const terminalQuery = useQuery({
21
+ queryKey: brandGenerationKeys.latestTerminal(orgId),
22
+ queryFn: () => api.getActive(true),
23
+ enabled: Boolean(orgId) && activeQuery.isSuccess && activeJob === null,
24
+ staleTime: 0,
25
+ refetchOnMount: "always",
26
+ });
27
+ const terminalJob = terminalQuery.data?.job ?? null;
28
+ const needsTerminalHandoff = activeQuery.isSuccess && activeJob === null;
29
+ const isDiscoveringActive = (Boolean(orgId) && activeQuery.isPending) ||
30
+ (needsTerminalHandoff && (terminalQuery.isPending || terminalQuery.isFetching)) ||
31
+ (activeQuery.isFetching && activeQuery.data === undefined);
32
+ const discoveryError = activeQuery.isError
33
+ ? activeQuery.error
34
+ : needsTerminalHandoff && terminalQuery.isError
35
+ ? terminalQuery.error
36
+ : null;
37
+ // Prefer the active read's eligibility (always fetched, most current); the
38
+ // terminal read's is the same org-level snapshot and only serves as a
39
+ // fallback while `activeQuery` is still settling.
40
+ const eligibility = activeQuery.data?.eligibility ?? terminalQuery.data?.eligibility ?? null;
41
+ useEffect(() => {
42
+ if (!orgId || !terminalJob || !isTerminalStatus(terminalJob.status))
43
+ return;
44
+ const refreshKey = `${orgId}:${terminalJob.id}`;
45
+ if (terminalProfileRefreshesRef.current.has(refreshKey))
46
+ return;
47
+ terminalProfileRefreshesRef.current.add(refreshKey);
48
+ void queryClient.invalidateQueries({ queryKey: profileKeyRef.current });
49
+ }, [orgId, profileKeyRef, queryClient, terminalJob]);
50
+ return {
51
+ activeQuery,
52
+ activeJob,
53
+ terminalQuery,
54
+ terminalJob,
55
+ eligibility,
56
+ needsTerminalHandoff,
57
+ isDiscoveringActive,
58
+ discoveryError,
59
+ };
60
+ }
61
+ //# sourceMappingURL=use-brand-generation-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-brand-generation-discovery.js","sourceRoot":"","sources":["../../src/brand/use-brand-generation-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { BrandGenerationApi, BrandGenerationStreamConfig } from "./brand-generation-api.js";
2
+ import type { BrandGenerationJobStatus as JobStatus } from "./brand-generation-response.js";
3
+ import { type BrandGenerationUpdate } from "./brand-generation-sse-parser.js";
4
+ export type { BrandGenerationUpdate } from "./brand-generation-sse-parser.js";
5
+ interface TransportOptions {
6
+ api: Pick<BrandGenerationApi, "getStatus">;
7
+ stream: BrandGenerationStreamConfig;
8
+ onUpdate: (data: BrandGenerationUpdate) => void;
9
+ onDegraded: () => void;
10
+ isTerminal: (status: JobStatus | undefined) => boolean;
11
+ }
12
+ export declare function useBrandGenerationTransport({ api, stream, onUpdate, onDegraded, isTerminal, }: TransportOptions): {
13
+ cleanup: () => void;
14
+ connect: (jobId: string) => Promise<void>;
15
+ };
16
+ //# sourceMappingURL=use-brand-generation-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-brand-generation-transport.d.ts","sourceRoot":"","sources":["../../src/brand/use-brand-generation-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,IAAI,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAS3E,UAAU,gBAAgB;IACxB,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,GAAG,EACH,MAAM,EACN,QAAQ,EACR,UAAU,EACV,UAAU,GACX,EAAE,gBAAgB;;qBA8DD,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAwHvC"}
@@ -0,0 +1,182 @@
1
+ import { useCallback, useRef } from "react";
2
+ import { dataPayload, parseSseUpdate, } from "./brand-generation-sse-parser.js";
3
+ const DEFAULT_SSE_IDLE_TIMEOUT_MS = 15_000;
4
+ const DEFAULT_POLL_INTERVAL_MS = 2000;
5
+ function errorType(error) {
6
+ return error instanceof Error ? error.name : "UnknownError";
7
+ }
8
+ export function useBrandGenerationTransport({ api, stream, onUpdate, onDegraded, isTerminal, }) {
9
+ // `api`/`stream` are read through refs so `connect`/`cleanup` keep a stable
10
+ // identity even when a consumer passes fresh object literals each render.
11
+ const apiRef = useRef(api);
12
+ apiRef.current = api;
13
+ const streamRef = useRef(stream);
14
+ streamRef.current = stream;
15
+ const pollIntervalRef = useRef(null);
16
+ const idleTimeoutRef = useRef(null);
17
+ const abortControllerRef = useRef(null);
18
+ const connectionGenerationRef = useRef(0);
19
+ const cleanup = useCallback(() => {
20
+ connectionGenerationRef.current += 1;
21
+ abortControllerRef.current?.abort();
22
+ abortControllerRef.current = null;
23
+ if (idleTimeoutRef.current !== null) {
24
+ window.clearTimeout(idleTimeoutRef.current.timerId);
25
+ idleTimeoutRef.current = null;
26
+ }
27
+ if (pollIntervalRef.current !== null) {
28
+ window.clearInterval(pollIntervalRef.current);
29
+ pollIntervalRef.current = null;
30
+ }
31
+ }, []);
32
+ const emitUpdate = useCallback((data) => {
33
+ if (isTerminal(data.status))
34
+ cleanup();
35
+ onUpdate(data);
36
+ }, [cleanup, isTerminal, onUpdate]);
37
+ const startPolling = useCallback((jobId) => {
38
+ cleanup();
39
+ const generation = connectionGenerationRef.current;
40
+ onDegraded();
41
+ const poll = async () => {
42
+ try {
43
+ const update = await apiRef.current.getStatus(jobId);
44
+ if (connectionGenerationRef.current === generation)
45
+ emitUpdate(update);
46
+ }
47
+ catch (error) {
48
+ console.warn("[brand-generation] status poll failed; retrying", {
49
+ errorType: errorType(error),
50
+ });
51
+ }
52
+ };
53
+ void poll();
54
+ pollIntervalRef.current = window.setInterval(() => void poll(), streamRef.current.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS);
55
+ }, [cleanup, emitUpdate, onDegraded]);
56
+ const connect = useCallback(async (jobId) => {
57
+ cleanup();
58
+ const generation = connectionGenerationRef.current;
59
+ const isCurrent = () => connectionGenerationRef.current === generation;
60
+ try {
61
+ const config = streamRef.current;
62
+ const token = config.getAccessToken ? await config.getAccessToken() : undefined;
63
+ if (!isCurrent())
64
+ return;
65
+ // Bearer mode with no usable token (null or empty) degrades to polling,
66
+ // like producer; cookie mode (no `getAccessToken`) streams with
67
+ // credentials instead.
68
+ if (config.getAccessToken && !token) {
69
+ startPolling(jobId);
70
+ return;
71
+ }
72
+ const controller = new AbortController();
73
+ abortControllerRef.current = controller;
74
+ const clearIdleTimeout = () => {
75
+ const idleTimeout = idleTimeoutRef.current;
76
+ if (idleTimeout?.generation !== generation)
77
+ return;
78
+ window.clearTimeout(idleTimeout.timerId);
79
+ idleTimeoutRef.current = null;
80
+ };
81
+ const armIdleTimeout = () => {
82
+ clearIdleTimeout();
83
+ const timerId = window.setTimeout(() => {
84
+ const idleTimeout = idleTimeoutRef.current;
85
+ if (idleTimeout?.generation !== generation || idleTimeout.timerId !== timerId)
86
+ return;
87
+ idleTimeoutRef.current = null;
88
+ if (!isCurrent())
89
+ return;
90
+ controller.abort();
91
+ startPolling(jobId);
92
+ }, config.idleTimeoutMs ?? DEFAULT_SSE_IDLE_TIMEOUT_MS);
93
+ idleTimeoutRef.current = { generation, timerId };
94
+ };
95
+ armIdleTimeout();
96
+ const doFetch = config.fetch ?? fetch;
97
+ const response = await doFetch(`${config.baseUrl.replace(/\/+$/, "")}/brand-profiles/generate/${encodeURIComponent(jobId)}/stream`, {
98
+ headers: {
99
+ Accept: "text/event-stream",
100
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
101
+ },
102
+ ...(token ? {} : { credentials: "include" }),
103
+ signal: controller.signal,
104
+ });
105
+ if (!isCurrent()) {
106
+ controller.abort();
107
+ return;
108
+ }
109
+ if (!response.ok) {
110
+ startPolling(jobId);
111
+ return;
112
+ }
113
+ const reader = response.body?.getReader();
114
+ if (!reader) {
115
+ startPolling(jobId);
116
+ return;
117
+ }
118
+ const decoder = new TextDecoder();
119
+ let buffer = "";
120
+ let terminalSeen = false;
121
+ try {
122
+ while (true) {
123
+ const { done, value } = await reader.read();
124
+ clearIdleTimeout();
125
+ if (!isCurrent())
126
+ return;
127
+ if (done) {
128
+ if (!terminalSeen)
129
+ startPolling(jobId);
130
+ return;
131
+ }
132
+ armIdleTimeout();
133
+ buffer += decoder.decode(value, { stream: true });
134
+ let boundary = buffer.search(/\r?\n\r?\n/);
135
+ while (boundary !== -1) {
136
+ const chunk = buffer.slice(0, boundary);
137
+ const separator = buffer.slice(boundary).match(/^\r?\n\r?\n/)?.[0] ?? "\n\n";
138
+ buffer = buffer.slice(boundary + separator.length);
139
+ const payload = dataPayload(chunk);
140
+ if (payload !== null) {
141
+ const data = parseSseUpdate(payload);
142
+ if (data) {
143
+ const terminal = isTerminal(data.status);
144
+ if (terminal)
145
+ terminalSeen = true;
146
+ emitUpdate(data);
147
+ if (terminal)
148
+ return;
149
+ }
150
+ }
151
+ boundary = buffer.search(/\r?\n\r?\n/);
152
+ }
153
+ }
154
+ }
155
+ catch (error) {
156
+ if (!isCurrent())
157
+ return;
158
+ if (error instanceof Error && error.name === "AbortError")
159
+ return;
160
+ console.warn("[brand-generation] SSE read failed; polling", {
161
+ errorType: errorType(error),
162
+ });
163
+ startPolling(jobId);
164
+ }
165
+ finally {
166
+ clearIdleTimeout();
167
+ }
168
+ }
169
+ catch (error) {
170
+ if (!isCurrent())
171
+ return;
172
+ if (error instanceof Error && error.name === "AbortError")
173
+ return;
174
+ console.warn("[brand-generation] SSE connection failed; polling", {
175
+ errorType: errorType(error),
176
+ });
177
+ startPolling(jobId);
178
+ }
179
+ }, [cleanup, emitUpdate, isTerminal, startPolling]);
180
+ return { cleanup, connect };
181
+ }
182
+ //# sourceMappingURL=use-brand-generation-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-brand-generation-transport.js","sourceRoot":"","sources":["../../src/brand/use-brand-generation-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type QueryKey } from "@tanstack/react-query";
2
+ import type { BrandGenerationApi, BrandGenerationStreamConfig } from "./brand-generation-api.js";
3
+ import type { BrandGenerationContext, BrandGenerationJob } from "./brand-generation-response.js";
4
+ export interface UseBrandGenerationOptions {
5
+ /** Active org id. Every piece of generation state resets when it changes. */
6
+ readonly orgId: string;
7
+ /** The endpoint seam. See {@link BrandGenerationApi}. */
8
+ readonly api: BrandGenerationApi;
9
+ /** How the SSE stream authenticates. See {@link BrandGenerationStreamConfig}. */
10
+ readonly stream: BrandGenerationStreamConfig;
11
+ /**
12
+ * The consumer's brand-profile query key (prefix) for this org. It is
13
+ * invalidated when a job reaches a terminal state or is accepted, so the
14
+ * consumer's profile/draft queries refetch. Must not live under the
15
+ * `"brand-generation"` namespace.
16
+ */
17
+ readonly profileQueryKey: QueryKey;
18
+ }
19
+ export type UseBrandGenerationResult = ReturnType<typeof useBrandGeneration>;
20
+ export declare function useBrandGeneration({ orgId, api, stream, profileQueryKey, }: UseBrandGenerationOptions): {
21
+ job: BrandGenerationJob | null;
22
+ isGenerating: boolean;
23
+ isDiscoveringActive: boolean;
24
+ discoveryError: Error | null;
25
+ error: "start" | "resume" | "accept" | "cancel" | "prioritize" | null;
26
+ transportDegraded: boolean;
27
+ eligibility: import("./brand-generation-types.js").BrandGenerationEligibility | null;
28
+ start: (homepageUrl: string, context?: BrandGenerationContext) => Promise<void>;
29
+ resume: (jobId: string) => Promise<void>;
30
+ cancel: () => Promise<void>;
31
+ prioritizeUrl: (url: string) => Promise<void>;
32
+ accept: () => Promise<boolean>;
33
+ reset: () => void;
34
+ };
35
+ //# sourceMappingURL=use-brand-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-brand-generation.d.ts","sourceRoot":"","sources":["../../src/brand/use-brand-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAM9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAS9F,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE7E,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,GAAG,EACH,MAAM,EACN,eAAe,GAChB,EAAE,yBAAyB;;;;;;;;yBAwEQ,MAAM,YAAY,sBAAsB;oBAkHnD,MAAM;;yBA1EK,MAAM;;;EA8GzC"}