@cellarnode/ui 0.185.1 → 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 (106) 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/profile/business-details.d.ts +3 -1
  82. package/dist/profile/business-details.d.ts.map +1 -1
  83. package/dist/profile/business-details.js +2 -2
  84. package/dist/profile/business-details.js.map +1 -1
  85. package/dist/profile/certifications-card.d.ts +3 -1
  86. package/dist/profile/certifications-card.d.ts.map +1 -1
  87. package/dist/profile/certifications-card.js +2 -2
  88. package/dist/profile/certifications-card.js.map +1 -1
  89. package/dist/profile/importer-profile-view.d.ts +88 -0
  90. package/dist/profile/importer-profile-view.d.ts.map +1 -0
  91. package/dist/profile/importer-profile-view.js +87 -0
  92. package/dist/profile/importer-profile-view.js.map +1 -0
  93. package/dist/profile/index.d.ts +1 -0
  94. package/dist/profile/index.d.ts.map +1 -1
  95. package/dist/profile/index.js +1 -0
  96. package/dist/profile/index.js.map +1 -1
  97. package/dist/profile/market-reach.d.ts +3 -1
  98. package/dist/profile/market-reach.d.ts.map +1 -1
  99. package/dist/profile/market-reach.js +2 -2
  100. package/dist/profile/market-reach.js.map +1 -1
  101. package/dist/profile/profile-hero.d.ts +3 -1
  102. package/dist/profile/profile-hero.d.ts.map +1 -1
  103. package/dist/profile/profile-hero.js +3 -2
  104. package/dist/profile/profile-hero.js.map +1 -1
  105. package/dist/realtime/job-status/schemas.d.ts +2 -2
  106. 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"}