@drawnagency/primitives 0.1.67 → 0.1.68

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 (44) hide show
  1. package/dist/chunk-4YEOTFVU.js +14 -0
  2. package/dist/{chunk-VU3XR362.js → chunk-6UDYJQL6.js} +1 -1
  3. package/dist/{chunk-7IMQVDDJ.js → chunk-EWKCEPMW.js} +1 -1
  4. package/dist/{chunk-XNGG5AGI.js → chunk-KWBM27UR.js} +1 -1
  5. package/dist/{chunk-TEYTLQVH.js → chunk-QKOIEWZ4.js} +33 -1
  6. package/dist/{chunk-4VMAZZXT.js → chunk-TYYCKVAW.js} +4 -4
  7. package/dist/{chunk-KM6HOW4H.js → chunk-VVK6ZRCN.js} +2 -2
  8. package/dist/{chunk-AFK45HX2.js → chunk-WNPMBFD6.js} +1 -1
  9. package/dist/{chunk-WJ7RZ6CC.js → chunk-WXVKX6PY.js} +1 -1
  10. package/dist/components/chat/ChatPanel.d.ts +31 -0
  11. package/dist/components/chat/ChatPanel.d.ts.map +1 -0
  12. package/dist/components/chat/ChatWidget.d.ts +11 -0
  13. package/dist/components/chat/ChatWidget.d.ts.map +1 -0
  14. package/dist/components/primitives/index.js +5 -5
  15. package/dist/components/sections/brand-guide.js +5 -5
  16. package/dist/components/sections/register-schemas.js +7 -7
  17. package/dist/components/sections/register.js +7 -7
  18. package/dist/components/shell/ChatbotConfigModal.d.ts +13 -0
  19. package/dist/components/shell/ChatbotConfigModal.d.ts.map +1 -0
  20. package/dist/components/shell/EditorShell.d.ts +2 -1
  21. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  22. package/dist/index.js +12 -5
  23. package/dist/lib/index.d.ts +1 -0
  24. package/dist/lib/index.d.ts.map +1 -1
  25. package/dist/lib/index.js +6 -3
  26. package/dist/lib/platform-broker.d.ts +7 -0
  27. package/dist/lib/platform-broker.d.ts.map +1 -1
  28. package/dist/lib/platform-broker.js +27 -1
  29. package/dist/media/index.js +3 -3
  30. package/dist/schemas/index.js +6 -2
  31. package/dist/schemas/site-config.d.ts +30 -0
  32. package/dist/schemas/site-config.d.ts.map +1 -1
  33. package/dist/types/database.d.ts +48 -0
  34. package/dist/types/database.d.ts.map +1 -1
  35. package/package.json +1 -1
  36. package/src/components/chat/ChatPanel.tsx +152 -0
  37. package/src/components/chat/ChatWidget.tsx +38 -0
  38. package/src/components/shell/ChatbotConfigModal.tsx +152 -0
  39. package/src/components/shell/EditorShell.tsx +28 -1
  40. package/src/lib/index.ts +1 -0
  41. package/src/lib/platform-broker.ts +36 -0
  42. package/src/schemas/site-config.ts +36 -0
  43. package/src/types/database.ts +48 -0
  44. package/dist/chunk-ZGFAYZWB.js +0 -8
@@ -0,0 +1,14 @@
1
+ // src/lib/pages.ts
2
+ function slugifyPageSlug(input) {
3
+ return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
4
+ }
5
+ function audiencePasses(access, audience) {
6
+ if (access.length === 0) return true;
7
+ if (!audience) return true;
8
+ return access.includes(audience);
9
+ }
10
+
11
+ export {
12
+ slugifyPageSlug,
13
+ audiencePasses
14
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  slugifyPageSlug
3
- } from "./chunk-ZGFAYZWB.js";
3
+ } from "./chunk-4YEOTFVU.js";
4
4
 
5
5
  // src/media/utils.ts
6
6
  async function hashFileBuffer(buffer) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HexColorSchema
3
- } from "./chunk-TEYTLQVH.js";
3
+ } from "./chunk-QKOIEWZ4.js";
4
4
 
5
5
  // src/schemas/audience.ts
6
6
  import { z } from "zod";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-I5737FJY.js";
8
8
  import {
9
9
  getMediaProvider
10
- } from "./chunk-VU3XR362.js";
10
+ } from "./chunk-6UDYJQL6.js";
11
11
  import {
12
12
  cn
13
13
  } from "./chunk-7EOSDFS3.js";
@@ -194,6 +194,32 @@ var IndexSchema = RawIndexSchema.transform(normalizeRawIndex).pipe(CanonicalInde
194
194
  function normalizeSiteIndex(raw) {
195
195
  return IndexSchema.parse(raw);
196
196
  }
197
+ var ChatbotTaskIdSchema = z3.string().min(1).max(32).regex(
198
+ /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/,
199
+ "Task id must be lowercase letters, numbers, dashes, or underscores"
200
+ );
201
+ var ChatbotTaskSchema = z3.object({
202
+ id: ChatbotTaskIdSchema,
203
+ label: z3.string().min(1).max(60),
204
+ prompt: z3.string().max(4e3),
205
+ // Audience names allowed to see this task; [] = all — same semantics as SectionMeta.access.
206
+ access: z3.array(z3.string()).default([])
207
+ });
208
+ var ChatbotConfigSchema = z3.object({
209
+ enabled: z3.boolean().default(false),
210
+ systemPrompt: z3.string().max(8e3).default(""),
211
+ // Audience names the widget is shown to; [] = all audiences.
212
+ audiences: z3.array(z3.string()).default([]),
213
+ tasks: z3.array(ChatbotTaskSchema).max(20).default([])
214
+ }).superRefine((cfg, ctx) => {
215
+ const seen = /* @__PURE__ */ new Set();
216
+ for (const t of cfg.tasks) {
217
+ if (seen.has(t.id)) {
218
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: `Duplicate task id "${t.id}"` });
219
+ }
220
+ seen.add(t.id);
221
+ }
222
+ });
197
223
  var SiteConfigSchema = z3.object({
198
224
  siteName: z3.string().default("Brand Portal"),
199
225
  primaryColor: HexColorSchema.default("#009ca6"),
@@ -208,7 +234,11 @@ var SiteConfigSchema = z3.object({
208
234
  // Favicon stored as a data URL (SVG/PNG, small) so it travels with
209
235
  // site-config.json — no media manifest or CDN round-trip needed.
210
236
  favicon: z3.string().refine((v) => v.startsWith("data:image/"), "Favicon must be an image data URL").nullable().default(null),
211
- media: MediaConfigSchema.default(MediaConfigSchema.parse({}))
237
+ media: MediaConfigSchema.default(MediaConfigSchema.parse({})),
238
+ // Brand chatbot config (editor-owned; the platform kill switch lives in the
239
+ // sites table, not here). Every field defaults so pre-existing
240
+ // site-config.json files keep parsing.
241
+ chatbot: ChatbotConfigSchema.default({ enabled: false, systemPrompt: "", audiences: [], tasks: [] })
212
242
  });
213
243
 
214
244
  export {
@@ -227,5 +257,7 @@ export {
227
257
  PageSchema,
228
258
  IndexSchema,
229
259
  normalizeSiteIndex,
260
+ ChatbotTaskSchema,
261
+ ChatbotConfigSchema,
230
262
  SiteConfigSchema
231
263
  };
@@ -3,7 +3,7 @@ import {
3
3
  pluralize,
4
4
  stripHtmlToPlainText,
5
5
  truncate
6
- } from "./chunk-KM6HOW4H.js";
6
+ } from "./chunk-VVK6ZRCN.js";
7
7
  import {
8
8
  DeleteButton,
9
9
  DragHandle,
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  EditableRichText,
21
21
  defineHeadingSection
22
- } from "./chunk-WJ7RZ6CC.js";
22
+ } from "./chunk-WXVKX6PY.js";
23
23
  import {
24
24
  EditablePlainText,
25
25
  MAX_CONTAINER_COLUMNS,
@@ -27,7 +27,7 @@ import {
27
27
  colSpanClass,
28
28
  containerGridClass,
29
29
  spacerHiddenClass
30
- } from "./chunk-XNGG5AGI.js";
30
+ } from "./chunk-KWBM27UR.js";
31
31
  import {
32
32
  DEFAULT_LINK,
33
33
  LinkValueSchema
@@ -43,7 +43,7 @@ import {
43
43
  } from "./chunk-TZQPOR5A.js";
44
44
  import {
45
45
  SingleMediaReferenceSchema
46
- } from "./chunk-TEYTLQVH.js";
46
+ } from "./chunk-QKOIEWZ4.js";
47
47
  import {
48
48
  defineSection,
49
49
  getSection
@@ -9,7 +9,7 @@ import {
9
9
  MediaBlock,
10
10
  containerGridClass,
11
11
  useEditableCollection
12
- } from "./chunk-XNGG5AGI.js";
12
+ } from "./chunk-KWBM27UR.js";
13
13
  import {
14
14
  AddIcon,
15
15
  DeleteIcon,
@@ -30,7 +30,7 @@ import {
30
30
  import {
31
31
  HexColorSchema,
32
32
  SingleMediaReferenceSchema
33
- } from "./chunk-TEYTLQVH.js";
33
+ } from "./chunk-QKOIEWZ4.js";
34
34
  import {
35
35
  defineSection
36
36
  } from "./chunk-VKAGMEKE.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-TZQPOR5A.js";
10
10
  import {
11
11
  IndexSchema
12
- } from "./chunk-TEYTLQVH.js";
12
+ } from "./chunk-QKOIEWZ4.js";
13
13
  import {
14
14
  getAllSchemas
15
15
  } from "./chunk-VKAGMEKE.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EditablePlainText
3
- } from "./chunk-XNGG5AGI.js";
3
+ } from "./chunk-KWBM27UR.js";
4
4
  import {
5
5
  usePages
6
6
  } from "./chunk-4E66N6UV.js";
@@ -0,0 +1,31 @@
1
+ export interface ChatMessage {
2
+ role: "user" | "assistant";
3
+ content: string;
4
+ }
5
+ /** Parse our /api/chat SSE frames out of a fetch body. Exported for tests. */
6
+ export declare function streamChat(body: {
7
+ messages: ChatMessage[];
8
+ sessionId: string;
9
+ taskId?: string;
10
+ draftChatbot?: unknown;
11
+ }, onText: (text: string) => void): Promise<{
12
+ ok: true;
13
+ truncated: boolean;
14
+ } | {
15
+ ok: false;
16
+ error: string;
17
+ retryAfterMs?: number;
18
+ }>;
19
+ export default function ChatPanel({ open, onClose, siteName, tasks, isEditor, draftChatbot }: {
20
+ open: boolean;
21
+ onClose: () => void;
22
+ siteName: string;
23
+ tasks: {
24
+ id: string;
25
+ label: string;
26
+ }[];
27
+ isEditor?: boolean;
28
+ /** Set only by the configurator's test panel. */
29
+ draftChatbot?: unknown;
30
+ }): import("react/jsx-runtime").JSX.Element | null;
31
+ //# sourceMappingURL=ChatPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatPanel.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAoB5E,8EAA8E;AAC9E,wBAAsB,UAAU,CAC9B,IAAI,EAAE;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCjG;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;IAC5F,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,kDAyEA"}
@@ -0,0 +1,11 @@
1
+ export interface ChatWidgetProps {
2
+ siteName: string;
3
+ /** Already audience-filtered server-side — never pass unfiltered config tasks. */
4
+ tasks: {
5
+ id: string;
6
+ label: string;
7
+ }[];
8
+ isEditor?: boolean;
9
+ }
10
+ export default function ChatWidget({ siteName, tasks, isEditor }: ChatWidgetProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=ChatWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatWidget.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAuBhF"}
@@ -2,7 +2,7 @@ import {
2
2
  EditableRichText,
3
3
  LinkPopover,
4
4
  defineHeadingSection
5
- } from "../../chunk-WJ7RZ6CC.js";
5
+ } from "../../chunk-WXVKX6PY.js";
6
6
  import {
7
7
  EditableGrid,
8
8
  EditablePlainText,
@@ -10,20 +10,20 @@ import {
10
10
  MediaBlock,
11
11
  ResolvedMedia,
12
12
  useEditableCollection
13
- } from "../../chunk-XNGG5AGI.js";
13
+ } from "../../chunk-KWBM27UR.js";
14
14
  import "../../chunk-4E66N6UV.js";
15
15
  import {
16
16
  DeleteIcon,
17
17
  DragHandle,
18
18
  IconButton
19
19
  } from "../../chunk-I5737FJY.js";
20
- import "../../chunk-VU3XR362.js";
20
+ import "../../chunk-6UDYJQL6.js";
21
21
  import "../../chunk-53DKVAB6.js";
22
- import "../../chunk-ZGFAYZWB.js";
22
+ import "../../chunk-4YEOTFVU.js";
23
23
  import {
24
24
  cn
25
25
  } from "../../chunk-7EOSDFS3.js";
26
- import "../../chunk-TEYTLQVH.js";
26
+ import "../../chunk-QKOIEWZ4.js";
27
27
  import "../../chunk-VKAGMEKE.js";
28
28
  import "../../chunk-JSBRDJBE.js";
29
29
 
@@ -2,16 +2,16 @@ import {
2
2
  ColorItemSchema,
3
3
  ColorSpaceSchema,
4
4
  brandGuideSectionDefs
5
- } from "../../chunk-KM6HOW4H.js";
5
+ } from "../../chunk-VVK6ZRCN.js";
6
6
  import "../../chunk-5THS4K5D.js";
7
- import "../../chunk-XNGG5AGI.js";
7
+ import "../../chunk-KWBM27UR.js";
8
8
  import "../../chunk-I5737FJY.js";
9
- import "../../chunk-VU3XR362.js";
9
+ import "../../chunk-6UDYJQL6.js";
10
10
  import "../../chunk-3DCG4DNU.js";
11
11
  import "../../chunk-WDSVHKAH.js";
12
- import "../../chunk-ZGFAYZWB.js";
12
+ import "../../chunk-4YEOTFVU.js";
13
13
  import "../../chunk-7EOSDFS3.js";
14
- import "../../chunk-TEYTLQVH.js";
14
+ import "../../chunk-QKOIEWZ4.js";
15
15
  import "../../chunk-VKAGMEKE.js";
16
16
  import "../../chunk-JSBRDJBE.js";
17
17
  export {
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  allSectionDefs
3
- } from "../../chunk-4VMAZZXT.js";
4
- import "../../chunk-KM6HOW4H.js";
3
+ } from "../../chunk-TYYCKVAW.js";
4
+ import "../../chunk-VVK6ZRCN.js";
5
5
  import "../../chunk-2BHPWO7M.js";
6
6
  import "../../chunk-5THS4K5D.js";
7
- import "../../chunk-WJ7RZ6CC.js";
8
- import "../../chunk-XNGG5AGI.js";
7
+ import "../../chunk-WXVKX6PY.js";
8
+ import "../../chunk-KWBM27UR.js";
9
9
  import "../../chunk-4E66N6UV.js";
10
10
  import "../../chunk-I5737FJY.js";
11
- import "../../chunk-VU3XR362.js";
11
+ import "../../chunk-6UDYJQL6.js";
12
12
  import "../../chunk-3DCG4DNU.js";
13
13
  import "../../chunk-WDSVHKAH.js";
14
14
  import "../../chunk-53DKVAB6.js";
15
- import "../../chunk-ZGFAYZWB.js";
15
+ import "../../chunk-4YEOTFVU.js";
16
16
  import "../../chunk-7EOSDFS3.js";
17
17
  import "../../chunk-TZQPOR5A.js";
18
- import "../../chunk-TEYTLQVH.js";
18
+ import "../../chunk-QKOIEWZ4.js";
19
19
  import {
20
20
  registerRichText,
21
21
  registerSchema
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  allSectionDefs
3
- } from "../../chunk-4VMAZZXT.js";
4
- import "../../chunk-KM6HOW4H.js";
3
+ } from "../../chunk-TYYCKVAW.js";
4
+ import "../../chunk-VVK6ZRCN.js";
5
5
  import "../../chunk-2BHPWO7M.js";
6
6
  import "../../chunk-5THS4K5D.js";
7
- import "../../chunk-WJ7RZ6CC.js";
8
- import "../../chunk-XNGG5AGI.js";
7
+ import "../../chunk-WXVKX6PY.js";
8
+ import "../../chunk-KWBM27UR.js";
9
9
  import "../../chunk-4E66N6UV.js";
10
10
  import "../../chunk-I5737FJY.js";
11
- import "../../chunk-VU3XR362.js";
11
+ import "../../chunk-6UDYJQL6.js";
12
12
  import "../../chunk-3DCG4DNU.js";
13
13
  import "../../chunk-WDSVHKAH.js";
14
14
  import "../../chunk-53DKVAB6.js";
15
- import "../../chunk-ZGFAYZWB.js";
15
+ import "../../chunk-4YEOTFVU.js";
16
16
  import "../../chunk-7EOSDFS3.js";
17
17
  import "../../chunk-TZQPOR5A.js";
18
- import "../../chunk-TEYTLQVH.js";
18
+ import "../../chunk-QKOIEWZ4.js";
19
19
  import {
20
20
  registerSection
21
21
  } from "../../chunk-VKAGMEKE.js";
@@ -0,0 +1,13 @@
1
+ import type { SiteConfig } from "../../schemas/site-config";
2
+ import type { Audience } from "../../auth/types";
3
+ interface Props {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ siteConfig: SiteConfig;
7
+ onSiteConfigChange: (config: SiteConfig) => void;
8
+ audiences: Audience[];
9
+ platformEnabled: boolean;
10
+ }
11
+ export declare function ChatbotConfigModal({ isOpen, onClose, siteConfig, onSiteConfigChange, audiences, platformEnabled }: Props): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=ChatbotConfigModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatbotConfigModal.d.ts","sourceRoot":"","sources":["../../../src/components/shell/ChatbotConfigModal.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAA8B,MAAM,2BAA2B,CAAC;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,UAAU,KAAK;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAsBD,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,KAAK,2CAkHxH"}
@@ -17,6 +17,7 @@ interface Props {
17
17
  email: string;
18
18
  role: "owner" | "editor";
19
19
  } | null;
20
+ chatbotPlatformEnabled?: boolean;
20
21
  }
21
- export default function EditorShell({ headSha, draftHeadSha, siteId, audiences: initialAudiences, capabilities, currentUser, }: Props): import("react/jsx-runtime").JSX.Element;
22
+ export default function EditorShell({ headSha, draftHeadSha, siteId, audiences: initialAudiences, capabilities, currentUser, chatbotPlatformEnabled, }: Props): import("react/jsx-runtime").JSX.Element;
22
23
  //# sourceMappingURL=EditorShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAwEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,GACZ,EAAE,KAAK,2CAu6BP"}
1
+ {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAyEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAIhE,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,sBAA8B,GAC/B,EAAE,KAAK,2CAm7BP"}
package/dist/index.js CHANGED
@@ -27,13 +27,13 @@ import {
27
27
  resolveMedia,
28
28
  sanitizeMediaName,
29
29
  setMediaProvider
30
- } from "./chunk-VU3XR362.js";
30
+ } from "./chunk-6UDYJQL6.js";
31
31
  import {
32
32
  AudienceColorSchema,
33
33
  AudienceNameSchema,
34
34
  MediaGridOptionsSchema,
35
35
  slugifyAudienceName
36
- } from "./chunk-7IMQVDDJ.js";
36
+ } from "./chunk-EWKCEPMW.js";
37
37
  import {
38
38
  AudienceSchema,
39
39
  RoleSchema,
@@ -55,7 +55,7 @@ import {
55
55
  loadStaticSiteContent,
56
56
  mergeSiteContent,
57
57
  safeRedirect
58
- } from "./chunk-AFK45HX2.js";
58
+ } from "./chunk-WNPMBFD6.js";
59
59
  import {
60
60
  isSameOriginRequest,
61
61
  requireSessionSecret,
@@ -78,7 +78,9 @@ import {
78
78
  sanitizeHtml,
79
79
  toSectionId
80
80
  } from "./chunk-53DKVAB6.js";
81
- import "./chunk-ZGFAYZWB.js";
81
+ import {
82
+ audiencePasses
83
+ } from "./chunk-4YEOTFVU.js";
82
84
  import {
83
85
  cn
84
86
  } from "./chunk-7EOSDFS3.js";
@@ -87,6 +89,8 @@ import {
87
89
  getSectionSchema
88
90
  } from "./chunk-TZQPOR5A.js";
89
91
  import {
92
+ ChatbotConfigSchema,
93
+ ChatbotTaskSchema,
90
94
  FontNameSchema,
91
95
  HexColorSchema,
92
96
  ImageManifestSchema,
@@ -103,7 +107,7 @@ import {
103
107
  TextLineSchema,
104
108
  VariantSchema,
105
109
  normalizeSiteIndex
106
- } from "./chunk-TEYTLQVH.js";
110
+ } from "./chunk-QKOIEWZ4.js";
107
111
  import {
108
112
  clearRegistry,
109
113
  createRegistry,
@@ -136,6 +140,8 @@ export {
136
140
  AudienceColorSchema,
137
141
  AudienceNameSchema,
138
142
  AudienceSchema,
143
+ ChatbotConfigSchema,
144
+ ChatbotTaskSchema,
139
145
  DEFAULT_LINK,
140
146
  EXT_TO_MIME,
141
147
  FontNameSchema,
@@ -166,6 +172,7 @@ export {
166
172
  StorageConflictError,
167
173
  TextLineSchema,
168
174
  VariantSchema,
175
+ audiencePasses,
169
176
  buildGoogleFontsUrl,
170
177
  clearRegistry,
171
178
  cn,
@@ -1,5 +1,6 @@
1
1
  export { env } from "./env";
2
2
  export { cn } from "./cn";
3
+ export { audiencePasses } from "./pages";
3
4
  export { generateNavLinks, toSectionId, type NavItem } from "./nav";
4
5
  export { deriveContrast } from "./contrast";
5
6
  export { sanitizeHtml, ensureSanitizer } from "./sanitize";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
package/dist/lib/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  loadStaticSiteContent,
8
8
  mergeSiteContent,
9
9
  safeRedirect
10
- } from "../chunk-AFK45HX2.js";
10
+ } from "../chunk-WNPMBFD6.js";
11
11
  import "../chunk-S2L3BPLS.js";
12
12
  import "../chunk-75P6HWPN.js";
13
13
  import {
@@ -26,12 +26,14 @@ import {
26
26
  sanitizeHtml,
27
27
  toSectionId
28
28
  } from "../chunk-53DKVAB6.js";
29
- import "../chunk-ZGFAYZWB.js";
29
+ import {
30
+ audiencePasses
31
+ } from "../chunk-4YEOTFVU.js";
30
32
  import {
31
33
  cn
32
34
  } from "../chunk-7EOSDFS3.js";
33
35
  import "../chunk-TZQPOR5A.js";
34
- import "../chunk-TEYTLQVH.js";
36
+ import "../chunk-QKOIEWZ4.js";
35
37
  import {
36
38
  clearRegistry,
37
39
  createRegistry,
@@ -49,6 +51,7 @@ import {
49
51
  } from "../chunk-WKZ7OENC.js";
50
52
  import "../chunk-JSBRDJBE.js";
51
53
  export {
54
+ audiencePasses,
52
55
  buildGoogleFontsUrl,
53
56
  clearRegistry,
54
57
  cn,
@@ -11,4 +11,11 @@ export declare function platformBroker<T = unknown>(path: string, opts?: {
11
11
  body?: unknown;
12
12
  query?: Record<string, string>;
13
13
  }): Promise<T>;
14
+ /**
15
+ * Streaming variant of platformBroker for SSE endpoints (the LLM broker).
16
+ * Same auth headers; retries only pre-stream connection failures — once bytes
17
+ * are flowing there is no safe retry. Non-2xx throws with the status ONLY
18
+ * (never the body: stream endpoints may proxy provider errors).
19
+ */
20
+ export declare function platformBrokerStream(path: string, body: unknown): Promise<ReadableStream<Uint8Array>>;
14
21
  //# sourceMappingURL=platform-broker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform-broker.d.ts","sourceRoot":"","sources":["../../src/lib/platform-broker.ts"],"names":[],"mappings":"AASA,gFAAgF;AAChF,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC7E,OAAO,CAAC,CAAC,CAAC,CAgDZ"}
1
+ {"version":3,"file":"platform-broker.d.ts","sourceRoot":"","sources":["../../src/lib/platform-broker.ts"],"names":[],"mappings":"AASA,gFAAgF;AAChF,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC7E,OAAO,CAAC,CAAC,CAAC,CAgDZ;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAyBrC"}
@@ -54,7 +54,33 @@ async function platformBroker(path, opts = {}) {
54
54
  }
55
55
  throw lastError instanceof Error ? lastError : new Error("Platform broker unreachable");
56
56
  }
57
+ async function platformBrokerStream(path, body) {
58
+ const apiUrl = env("PLATFORM_API_URL");
59
+ const apiKey = env("PLATFORM_API_KEY");
60
+ const siteId = env("PORTAL_SITE_ID");
61
+ const url = `${apiUrl}${path}`;
62
+ let lastError;
63
+ for (let attempt = 0; attempt < ATTEMPTS; attempt++) {
64
+ let res;
65
+ try {
66
+ res = await fetch(url, {
67
+ method: "POST",
68
+ headers: { "x-api-key": apiKey, "x-site-id": siteId, "Content-Type": "application/json" },
69
+ body: JSON.stringify(body)
70
+ });
71
+ } catch (err) {
72
+ lastError = err;
73
+ if (attempt === ATTEMPTS - 1) throw err;
74
+ await sleep(RETRY_BASE_MS * 2 ** attempt);
75
+ continue;
76
+ }
77
+ if (!res.ok || !res.body) throw new Error(`Platform broker error (${res.status})`);
78
+ return res.body;
79
+ }
80
+ throw lastError instanceof Error ? lastError : new Error("Platform broker unreachable");
81
+ }
57
82
  export {
58
83
  isPlatformMode,
59
- platformBroker
84
+ platformBroker,
85
+ platformBrokerStream
60
86
  };
@@ -13,14 +13,14 @@ import {
13
13
  resolveMedia,
14
14
  sanitizeMediaName,
15
15
  setMediaProvider
16
- } from "../chunk-VU3XR362.js";
17
- import "../chunk-ZGFAYZWB.js";
16
+ } from "../chunk-6UDYJQL6.js";
17
+ import "../chunk-4YEOTFVU.js";
18
18
  import {
19
19
  ImageManifestSchema,
20
20
  MediaConfigSchema,
21
21
  MediaItemSchema,
22
22
  VariantSchema
23
- } from "../chunk-TEYTLQVH.js";
23
+ } from "../chunk-QKOIEWZ4.js";
24
24
  import "../chunk-JSBRDJBE.js";
25
25
  export {
26
26
  EXT_TO_MIME,
@@ -3,7 +3,7 @@ import {
3
3
  AudienceNameSchema,
4
4
  MediaGridOptionsSchema,
5
5
  slugifyAudienceName
6
- } from "../chunk-7IMQVDDJ.js";
6
+ } from "../chunk-EWKCEPMW.js";
7
7
  import {
8
8
  AudienceSchema,
9
9
  RoleSchema,
@@ -21,6 +21,8 @@ import {
21
21
  getSectionSchema
22
22
  } from "../chunk-TZQPOR5A.js";
23
23
  import {
24
+ ChatbotConfigSchema,
25
+ ChatbotTaskSchema,
24
26
  FontNameSchema,
25
27
  HexColorSchema,
26
28
  ImageManifestSchema,
@@ -37,7 +39,7 @@ import {
37
39
  TextLineSchema,
38
40
  VariantSchema,
39
41
  normalizeSiteIndex
40
- } from "../chunk-TEYTLQVH.js";
42
+ } from "../chunk-QKOIEWZ4.js";
41
43
  import "../chunk-VKAGMEKE.js";
42
44
  import "../chunk-NSCT3AMV.js";
43
45
  import "../chunk-JSBRDJBE.js";
@@ -45,6 +47,8 @@ export {
45
47
  AudienceColorSchema,
46
48
  AudienceNameSchema,
47
49
  AudienceSchema,
50
+ ChatbotConfigSchema,
51
+ ChatbotTaskSchema,
48
52
  DEFAULT_LINK,
49
53
  FontNameSchema,
50
54
  HexColorSchema,
@@ -150,6 +150,25 @@ export declare const IndexSchema: z.ZodPipe<z.ZodPipe<z.ZodObject<{
150
150
  export type SiteIndex = z.infer<typeof CanonicalIndexSchema>;
151
151
  /** Parse + normalize any raw index (legacy or canonical) to the canonical shape. */
152
152
  export declare function normalizeSiteIndex(raw: unknown): SiteIndex;
153
+ export declare const ChatbotTaskSchema: z.ZodObject<{
154
+ id: z.ZodString;
155
+ label: z.ZodString;
156
+ prompt: z.ZodString;
157
+ access: z.ZodDefault<z.ZodArray<z.ZodString>>;
158
+ }, z.core.$strip>;
159
+ export type ChatbotTask = z.infer<typeof ChatbotTaskSchema>;
160
+ export declare const ChatbotConfigSchema: z.ZodObject<{
161
+ enabled: z.ZodDefault<z.ZodBoolean>;
162
+ systemPrompt: z.ZodDefault<z.ZodString>;
163
+ audiences: z.ZodDefault<z.ZodArray<z.ZodString>>;
164
+ tasks: z.ZodDefault<z.ZodArray<z.ZodObject<{
165
+ id: z.ZodString;
166
+ label: z.ZodString;
167
+ prompt: z.ZodString;
168
+ access: z.ZodDefault<z.ZodArray<z.ZodString>>;
169
+ }, z.core.$strip>>>;
170
+ }, z.core.$strip>;
171
+ export type ChatbotConfig = z.infer<typeof ChatbotConfigSchema>;
153
172
  export declare const SiteConfigSchema: z.ZodObject<{
154
173
  siteName: z.ZodDefault<z.ZodString>;
155
174
  primaryColor: z.ZodDefault<z.ZodString>;
@@ -171,6 +190,17 @@ export declare const SiteConfigSchema: z.ZodObject<{
171
190
  maxFileSize: z.ZodDefault<z.ZodNumber>;
172
191
  quality: z.ZodDefault<z.ZodNumber>;
173
192
  }, z.core.$strip>>;
193
+ chatbot: z.ZodDefault<z.ZodObject<{
194
+ enabled: z.ZodDefault<z.ZodBoolean>;
195
+ systemPrompt: z.ZodDefault<z.ZodString>;
196
+ audiences: z.ZodDefault<z.ZodArray<z.ZodString>>;
197
+ tasks: z.ZodDefault<z.ZodArray<z.ZodObject<{
198
+ id: z.ZodString;
199
+ label: z.ZodString;
200
+ prompt: z.ZodString;
201
+ access: z.ZodDefault<z.ZodArray<z.ZodString>>;
202
+ }, z.core.$strip>>>;
203
+ }, z.core.$strip>>;
174
204
  }, z.core.$strip>;
175
205
  export type SiteConfig = z.infer<typeof SiteConfigSchema>;
176
206
  export {};