@promptbook/components 0.103.0-66 → 0.103.0-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.
package/esm/index.es.js CHANGED
@@ -35,7 +35,7 @@ const BOOK_LANGUAGE_VERSION = '2.0.0';
35
35
  * @generated
36
36
  * @see https://github.com/webgptorg/promptbook
37
37
  */
38
- const PROMPTBOOK_ENGINE_VERSION = '0.103.0-66';
38
+ const PROMPTBOOK_ENGINE_VERSION = '0.103.0-68';
39
39
  /**
40
40
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
41
41
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -7784,6 +7784,24 @@ function AboutIcon(props) {
7784
7784
  return (jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size || 24, height: size || 24, viewBox: "0 0 24 24", fill: "currentColor", ...rest, children: jsx("path", { d: "M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" }) }));
7785
7785
  }
7786
7786
 
7787
+ /**
7788
+ * @@@
7789
+ *
7790
+ * @public exported from `@promptbook/components`
7791
+ */
7792
+ function AttachmentIcon({ size = 24, color = 'currentColor' }) {
7793
+ return (jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66L9.64 16.2a2 2 0 01-2.83-2.83l8.49-8.49", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
7794
+ }
7795
+
7796
+ /**
7797
+ * @@@
7798
+ *
7799
+ * @public exported from `@promptbook/components`
7800
+ */
7801
+ function CameraIcon({ size = 24, color = 'currentColor' }) {
7802
+ return (jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("path", { d: "M23 19C23 19.5304 22.7893 20.0391 22.4142 20.4142C22.0391 20.7893 21.5304 21 21 21H3C2.46957 21 1.96086 20.7893 1.58579 20.4142C1.21071 20.0391 1 19.5304 1 19V8C1 7.46957 1.21071 6.96086 1.58579 6.58579C1.96086 6.21071 2.46957 6 3 6H7L9 3H15L17 6H21C21.5304 6 22.0391 6.21071 22.4142 6.58579C22.7893 6.96086 23 7.46957 23 8V19Z", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), jsx("path", { d: "M12 17C14.2091 17 16 15.2091 16 13C16 10.7909 14.2091 9 12 9C9.79086 9 8 10.7909 8 13C8 15.2091 9.79086 17 12 17Z", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] }));
7803
+ }
7804
+
7787
7805
  /**
7788
7806
  * @@@
7789
7807
  *
@@ -7909,13 +7927,27 @@ function Dropdown({ actions }) {
7909
7927
  * @private Internal component used by `BookEditor`
7910
7928
  */
7911
7929
  function BookEditorActionbar(props) {
7912
- const { value, isDownloadButtonShown, isAboutButtonShown, isFullscreenButtonShown, onFullscreenClick, isFullscreen, } = props;
7930
+ const { value, isDownloadButtonShown, isUploadButtonShown, isCameraButtonShown, isAboutButtonShown, isFullscreenButtonShown, onFullscreenClick, onUploadDocument, onTakePhoto, isFullscreen, } = props;
7913
7931
  const [isAboutModalOpen, setIsAboutModalOpen] = useState(false);
7914
7932
  const handleDownload = () => {
7915
7933
  const book = validateBook(value || DEFAULT_BOOK);
7916
7934
  /* not await */ $induceBookDownload(book);
7917
7935
  };
7918
7936
  const actions = [];
7937
+ if (isUploadButtonShown && onUploadDocument) {
7938
+ actions.push({
7939
+ icon: jsx(AttachmentIcon, {}),
7940
+ name: 'Upload document',
7941
+ onClick: onUploadDocument,
7942
+ });
7943
+ }
7944
+ if (isCameraButtonShown && onTakePhoto) {
7945
+ actions.push({
7946
+ icon: jsx(CameraIcon, {}),
7947
+ name: 'Take photo',
7948
+ onClick: onTakePhoto,
7949
+ });
7950
+ }
7919
7951
  if (isDownloadButtonShown) {
7920
7952
  actions.push({
7921
7953
  icon: jsx(DownloadIcon, {}),
@@ -7957,7 +7989,7 @@ let notebookStyleCounter = 0;
7957
7989
  * @private Internal component used by `BookEditor`
7958
7990
  */
7959
7991
  function BookEditorMonaco(props) {
7960
- const { value, onChange, isReadonly, translations, onFileUpload, isDownloadButtonShown, isAboutButtonShown = true, isFullscreenButtonShown = true, onFullscreenClick, isFullscreen, zoom = 1,
7992
+ const { value, onChange, isReadonly, translations, onFileUpload, isUploadButtonShown, isCameraButtonShown, isDownloadButtonShown, isAboutButtonShown = true, isFullscreenButtonShown = true, onFullscreenClick, isFullscreen, zoom = 1,
7961
7993
  // [🚱]> sync,
7962
7994
  } = props;
7963
7995
  const zoomLevel = zoom;
@@ -7977,6 +8009,8 @@ function BookEditorMonaco(props) {
7977
8009
  const instanceClass = `book-editor-instance-${instanceIdRef.current}`;
7978
8010
  // [1] Track touch start position to differentiate tap from drag
7979
8011
  const touchStartRef = useRef(null);
8012
+ const fileUploadInputRef = useRef(null);
8013
+ const cameraInputRef = useRef(null);
7980
8014
  /*
7981
8015
  Note+TODO: [🚱] Yjs logic is commented out because it causes errors in the build of Next.js projects:
7982
8016
  > ▲ Next.js 15.4.5
@@ -8200,12 +8234,9 @@ function BookEditorMonaco(props) {
8200
8234
  changeListener.dispose();
8201
8235
  };
8202
8236
  }, [editor, monaco]);
8203
- const handleDrop = useCallback(async (event) => {
8204
- event.preventDefault();
8205
- setIsDragOver(false);
8237
+ const handleFiles = useCallback(async (files) => {
8206
8238
  if (!onFileUpload)
8207
8239
  return;
8208
- const files = Array.from(event.dataTransfer.files);
8209
8240
  if (files.length === 0)
8210
8241
  return;
8211
8242
  // [1] Inject placeholders
@@ -8245,6 +8276,28 @@ function BookEditorMonaco(props) {
8245
8276
  console.error('File upload failed:', error);
8246
8277
  }
8247
8278
  }, [onFileUpload, value, onChange, editor]);
8279
+ const handleDrop = useCallback(async (event) => {
8280
+ event.preventDefault();
8281
+ setIsDragOver(false);
8282
+ const files = Array.from(event.dataTransfer.files);
8283
+ await handleFiles(files);
8284
+ }, [handleFiles]);
8285
+ const handleUploadDocument = useCallback(() => {
8286
+ if (fileUploadInputRef.current) {
8287
+ fileUploadInputRef.current.click();
8288
+ }
8289
+ }, []);
8290
+ const handleTakePhoto = useCallback(() => {
8291
+ if (cameraInputRef.current) {
8292
+ cameraInputRef.current.click();
8293
+ }
8294
+ }, []);
8295
+ const handleFileInputChange = useCallback((event) => {
8296
+ const files = Array.from(event.target.files || []);
8297
+ handleFiles(files);
8298
+ // Reset the input value so the same file can be selected again
8299
+ event.target.value = '';
8300
+ }, [handleFiles]);
8248
8301
  const handleDragOver = useCallback((event) => {
8249
8302
  event.preventDefault();
8250
8303
  setIsDragOver(true);
@@ -8257,12 +8310,20 @@ function BookEditorMonaco(props) {
8257
8310
  event.preventDefault();
8258
8311
  setIsDragOver(false);
8259
8312
  }, []);
8260
- return (jsxs("div", { className: classNames(styles$6.bookEditorContainer, instanceClass), onDrop: handleDrop, onDragOver: handleDragOver, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, children: [(isDownloadButtonShown || isAboutButtonShown || isFullscreenButtonShown) && (jsx(BookEditorActionbar, { value,
8313
+ return (jsxs("div", { className: classNames(styles$6.bookEditorContainer, instanceClass), onDrop: handleDrop, onDragOver: handleDragOver, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, children: [(isUploadButtonShown ||
8314
+ isCameraButtonShown ||
8315
+ isDownloadButtonShown ||
8316
+ isAboutButtonShown ||
8317
+ isFullscreenButtonShown) && (jsx(BookEditorActionbar, { value,
8318
+ isUploadButtonShown,
8319
+ isCameraButtonShown: isCameraButtonShown !== null && isCameraButtonShown !== void 0 ? isCameraButtonShown : isTouchDevice,
8261
8320
  isDownloadButtonShown,
8262
8321
  isAboutButtonShown,
8263
8322
  isFullscreenButtonShown,
8264
8323
  onFullscreenClick,
8265
- isFullscreen })), isDragOver && jsx("div", { className: styles$6.dropOverlay, children: "Drop files to upload" }), jsxs("div", { style: {
8324
+ onUploadDocument: handleUploadDocument,
8325
+ onTakePhoto: handleTakePhoto,
8326
+ isFullscreen })), jsx("input", { type: "file", ref: fileUploadInputRef, style: { display: 'none' }, onChange: handleFileInputChange, multiple: true }), jsx("input", { type: "file", ref: cameraInputRef, style: { display: 'none' }, accept: "image/*", capture: "environment", onChange: handleFileInputChange }), isDragOver && jsx("div", { className: styles$6.dropOverlay, children: "Drop files to upload" }), jsxs("div", { style: {
8266
8327
  position: 'relative',
8267
8328
  flex: 1,
8268
8329
  height: '100%',
@@ -8344,7 +8405,7 @@ const DEFAULT_BOOK_EDITOR_HEIGHT = countLines(DEFAULT_BOOK) * 30 + 20;
8344
8405
  * @public exported from `@promptbook/components`
8345
8406
  */
8346
8407
  function BookEditor(props) {
8347
- const { agentSource, className, style, zoom = 1, value, onChange, onFileUpload, isVerbose = DEFAULT_IS_VERBOSE, isBorderRadiusDisabled = false, isReadonly = false, translations, isDownloadButtonShown = true, isAboutButtonShown = true, isFullscreenButtonShown = true, sync, } = props;
8408
+ const { agentSource, className, style, zoom = 1, value, onChange, onFileUpload, isVerbose = DEFAULT_IS_VERBOSE, isBorderRadiusDisabled = false, isReadonly = false, translations, isUploadButtonShown = true, isCameraButtonShown, isDownloadButtonShown = true, isAboutButtonShown = true, isFullscreenButtonShown = true, sync, } = props;
8348
8409
  const [isFullscreen, setIsFullscreen] = useState(false);
8349
8410
  const handleFullscreenToggle = () => {
8350
8411
  setIsFullscreen(!isFullscreen);
@@ -8360,7 +8421,7 @@ function BookEditor(props) {
8360
8421
  ? `${props.height}px`
8361
8422
  : props.height || `${DEFAULT_BOOK_EDITOR_HEIGHT}px`,
8362
8423
  }),
8363
- }, children: jsx(BookEditorMonaco, { value: agentSource || value, onChange: onChange, onFileUpload: onFileUpload, isVerbose: isVerbose, isBorderRadiusDisabled: isBorderRadiusDisabled, isReadonly: isReadonly, translations: translations, isDownloadButtonShown: isDownloadButtonShown, isAboutButtonShown: isAboutButtonShown, isFullscreenButtonShown: isFullscreenButtonShown, onFullscreenClick: handleFullscreenToggle, isFullscreen: isFullscreen, sync: sync, zoom: zoom }) }));
8424
+ }, children: jsx(BookEditorMonaco, { value: agentSource || value, onChange: onChange, onFileUpload: onFileUpload, isVerbose: isVerbose, isBorderRadiusDisabled: isBorderRadiusDisabled, isReadonly: isReadonly, translations: translations, isUploadButtonShown: isUploadButtonShown, isCameraButtonShown: isCameraButtonShown, isDownloadButtonShown: isDownloadButtonShown, isAboutButtonShown: isAboutButtonShown, isFullscreenButtonShown: isFullscreenButtonShown, onFullscreenClick: handleFullscreenToggle, isFullscreen: isFullscreen, sync: sync, zoom: zoom }) }));
8364
8425
  return isFullscreen && typeof document !== 'undefined' ? createPortal(editorContent, document.body) : editorContent;
8365
8426
  }
8366
8427
 
@@ -8653,15 +8714,6 @@ function promptbookifyAiText(text) {
8653
8714
  */
8654
8715
  const ArrowIcon = ({ direction, size }) => (jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "currentColor", children: jsx("path", { d: direction === 'DOWN' ? 'M7 10l5 5 5-5z' : 'M7 14l5-5 5 5z' }) }));
8655
8716
 
8656
- /**
8657
- * @@@
8658
- *
8659
- * @public exported from `@promptbook/components`
8660
- */
8661
- function AttachmentIcon({ size = 24, color = 'currentColor' }) {
8662
- return (jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66L9.64 16.2a2 2 0 01-2.83-2.83l8.49-8.49", stroke: color, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
8663
- }
8664
-
8665
8717
  /**
8666
8718
  * Renders an icon that represents the close action
8667
8719
  *
@@ -15269,12 +15321,18 @@ const OPENAI_MODELS = exportJson({
15269
15321
  },
15270
15322
  },
15271
15323
  /**/
15272
- /*/
15273
- {
15274
- modelTitle: 'dall-e-3',
15275
- modelName: 'dall-e-3',
15276
- },
15277
- /**/
15324
+ /**/
15325
+ {
15326
+ modelVariant: 'IMAGE_GENERATION',
15327
+ modelTitle: 'dall-e-3',
15328
+ modelName: 'dall-e-3',
15329
+ modelDescription: 'DALL·E 3 is the latest version of the DALL·E art generation model. It understands significantly more nuance and detail than our previous systems, allowing you to easily translate your ideas into exceptionally accurate images.',
15330
+ pricing: {
15331
+ prompt: 0,
15332
+ output: 0.04,
15333
+ },
15334
+ },
15335
+ /**/
15278
15336
  /*/
15279
15337
  {
15280
15338
  modelTitle: 'whisper-1',
@@ -15293,12 +15351,18 @@ const OPENAI_MODELS = exportJson({
15293
15351
  },
15294
15352
  },
15295
15353
  /**/
15296
- /*/
15297
- {
15298
- modelTitle: 'dall-e-2',
15299
- modelName: 'dall-e-2',
15300
- },
15301
- /**/
15354
+ /**/
15355
+ {
15356
+ modelVariant: 'IMAGE_GENERATION',
15357
+ modelTitle: 'dall-e-2',
15358
+ modelName: 'dall-e-2',
15359
+ modelDescription: 'DALL·E 2 is an AI system that can create realistic images and art from a description in natural language.',
15360
+ pricing: {
15361
+ prompt: 0,
15362
+ output: 0.02,
15363
+ },
15364
+ },
15365
+ /**/
15302
15366
  /**/
15303
15367
  {
15304
15368
  modelVariant: 'CHAT',
@@ -16332,6 +16396,151 @@ class OpenAiCompatibleExecutionTools {
16332
16396
  return this.callEmbeddingModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
16333
16397
  }
16334
16398
  }
16399
+ /**
16400
+ * Calls OpenAI compatible API to use a image generation model
16401
+ */
16402
+ async callImageGenerationModel(prompt) {
16403
+ // Deep clone prompt and modelRequirements to avoid mutation across calls
16404
+ const clonedPrompt = JSON.parse(JSON.stringify(prompt));
16405
+ const retriedUnsupportedParameters = new Set();
16406
+ return this.callImageGenerationModelWithRetry(clonedPrompt, clonedPrompt.modelRequirements, [], retriedUnsupportedParameters);
16407
+ }
16408
+ /**
16409
+ * Internal method that handles parameter retry for image generation model calls
16410
+ */
16411
+ async callImageGenerationModelWithRetry(prompt, currentModelRequirements, attemptStack = [], retriedUnsupportedParameters = new Set()) {
16412
+ var _a, _b;
16413
+ if (this.options.isVerbose) {
16414
+ console.info(`🎨 ${this.title} callImageGenerationModel call`, { prompt, currentModelRequirements });
16415
+ }
16416
+ const { content, parameters } = prompt;
16417
+ const client = await this.getClient();
16418
+ // TODO: [☂] Use here more modelRequirements
16419
+ if (currentModelRequirements.modelVariant !== 'IMAGE_GENERATION') {
16420
+ throw new PipelineExecutionError('Use callImageGenerationModel only for IMAGE_GENERATION variant');
16421
+ }
16422
+ const modelName = currentModelRequirements.modelName || this.getDefaultImageGenerationModel().modelName;
16423
+ const modelSettings = {
16424
+ model: modelName,
16425
+ // size: currentModelRequirements.size,
16426
+ // quality: currentModelRequirements.quality,
16427
+ // style: currentModelRequirements.style,
16428
+ };
16429
+ const rawPromptContent = templateParameters(content, { ...parameters, modelName });
16430
+ const rawRequest = {
16431
+ ...modelSettings,
16432
+ prompt: rawPromptContent,
16433
+ user: (_a = this.options.userId) === null || _a === void 0 ? void 0 : _a.toString(),
16434
+ response_format: 'url', // TODO: [🧠] Maybe allow b64_json
16435
+ };
16436
+ const start = $getCurrentDate();
16437
+ if (this.options.isVerbose) {
16438
+ console.info(colors.bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
16439
+ }
16440
+ try {
16441
+ const rawResponse = await this.limiter
16442
+ .schedule(() => this.makeRequestWithNetworkRetry(() => client.images.generate(rawRequest)))
16443
+ .catch((error) => {
16444
+ assertsError(error);
16445
+ if (this.options.isVerbose) {
16446
+ console.info(colors.bgRed('error'), error);
16447
+ }
16448
+ throw error;
16449
+ });
16450
+ if (this.options.isVerbose) {
16451
+ console.info(colors.bgWhite('rawResponse'), JSON.stringify(rawResponse, null, 4));
16452
+ }
16453
+ const complete = $getCurrentDate();
16454
+ if (!rawResponse.data[0]) {
16455
+ throw new PipelineExecutionError(`No choises from ${this.title}`);
16456
+ }
16457
+ if (rawResponse.data.length > 1) {
16458
+ throw new PipelineExecutionError(`More than one choise from ${this.title}`);
16459
+ }
16460
+ const resultContent = rawResponse.data[0].url;
16461
+ const modelInfo = this.HARDCODED_MODELS.find((model) => model.modelName === modelName);
16462
+ const price = ((_b = modelInfo === null || modelInfo === void 0 ? void 0 : modelInfo.pricing) === null || _b === void 0 ? void 0 : _b.output) ? uncertainNumber(modelInfo.pricing.output) : uncertainNumber();
16463
+ return exportJson({
16464
+ name: 'promptResult',
16465
+ message: `Result of \`OpenAiCompatibleExecutionTools.callImageGenerationModel\``,
16466
+ order: [],
16467
+ value: {
16468
+ content: resultContent,
16469
+ modelName: modelName,
16470
+ timing: {
16471
+ start,
16472
+ complete,
16473
+ },
16474
+ usage: {
16475
+ price,
16476
+ input: {
16477
+ tokensCount: uncertainNumber(0),
16478
+ ...computeUsageCounts(rawPromptContent),
16479
+ },
16480
+ output: {
16481
+ tokensCount: uncertainNumber(0),
16482
+ ...computeUsageCounts(''),
16483
+ },
16484
+ },
16485
+ rawPromptContent,
16486
+ rawRequest,
16487
+ rawResponse,
16488
+ },
16489
+ });
16490
+ }
16491
+ catch (error) {
16492
+ assertsError(error);
16493
+ if (!isUnsupportedParameterError(error)) {
16494
+ if (attemptStack.length > 0) {
16495
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
16496
+ attemptStack
16497
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
16498
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
16499
+ `, Error: ${a.errorMessage}` +
16500
+ (a.stripped ? ' (stripped and retried)' : ''))
16501
+ .join('\n') +
16502
+ `\nFinal error: ${error.message}`);
16503
+ }
16504
+ throw error;
16505
+ }
16506
+ const unsupportedParameter = parseUnsupportedParameterError(error.message);
16507
+ if (!unsupportedParameter) {
16508
+ if (this.options.isVerbose) {
16509
+ console.warn(colors.bgYellow('Warning'), 'Could not parse unsupported parameter from error:', error.message);
16510
+ }
16511
+ throw error;
16512
+ }
16513
+ const retryKey = `${modelName}-${unsupportedParameter}`;
16514
+ if (retriedUnsupportedParameters.has(retryKey)) {
16515
+ attemptStack.push({
16516
+ modelName,
16517
+ unsupportedParameter,
16518
+ errorMessage: error.message,
16519
+ stripped: true,
16520
+ });
16521
+ throw new PipelineExecutionError(`All attempts failed. Attempt history:\n` +
16522
+ attemptStack
16523
+ .map((a, i) => ` ${i + 1}. Model: ${a.modelName}` +
16524
+ (a.unsupportedParameter ? `, Stripped: ${a.unsupportedParameter}` : '') +
16525
+ `, Error: ${a.errorMessage}` +
16526
+ (a.stripped ? ' (stripped and retried)' : ''))
16527
+ .join('\n') +
16528
+ `\nFinal error: ${error.message}`);
16529
+ }
16530
+ retriedUnsupportedParameters.add(retryKey);
16531
+ if (this.options.isVerbose) {
16532
+ console.warn(colors.bgYellow('Warning'), `Removing unsupported parameter '${unsupportedParameter}' for model '${modelName}' and retrying request`);
16533
+ }
16534
+ attemptStack.push({
16535
+ modelName,
16536
+ unsupportedParameter,
16537
+ errorMessage: error.message,
16538
+ stripped: true,
16539
+ });
16540
+ const modifiedModelRequirements = removeUnsupportedModelRequirement(currentModelRequirements, unsupportedParameter);
16541
+ return this.callImageGenerationModelWithRetry(prompt, modifiedModelRequirements, attemptStack, retriedUnsupportedParameters);
16542
+ }
16543
+ }
16335
16544
  // <- Note: [🤖] callXxxModel
16336
16545
  /**
16337
16546
  * Get the model that should be used as default
@@ -16501,6 +16710,12 @@ class OpenAiExecutionTools extends OpenAiCompatibleExecutionTools {
16501
16710
  getDefaultEmbeddingModel() {
16502
16711
  return this.getDefaultModel('text-embedding-3-large');
16503
16712
  }
16713
+ /**
16714
+ * Default model for image generation variant.
16715
+ */
16716
+ getDefaultImageGenerationModel() {
16717
+ return this.getDefaultModel('dall-e-3');
16718
+ }
16504
16719
  }
16505
16720
 
16506
16721
  /**
@@ -17906,5 +18121,5 @@ function injectCssModuleIntoShadowRoot(options) {
17906
18121
  }
17907
18122
  }
17908
18123
 
17909
- export { AboutPromptbookInformation, AgentChat, ArrowIcon, AttachmentIcon, AvatarChip, AvatarChipFromSource, AvatarProfile, AvatarProfileFromSource, BLOCKY_FLOW, BOOK_LANGUAGE_VERSION, BookEditor, BrandedQrCode, CHAT_SAVE_FORMATS, Chat, DEFAULT_BOOK_EDITOR_HEIGHT, FAST_FLOW, GenericQrCode, LlmChat, MOCKED_CHAT_DELAY_CONFIGS, MarkdownContent, MicIcon, MockedChat, NORMAL_FLOW, PROMPTBOOK_ENGINE_VERSION, PauseIcon, PlayIcon, PromptbookAgentIntegration, PromptbookQrCode, RANDOM_FLOW, ResetIcon, SLOW_FLOW, SaveIcon, SendIcon, TemplateIcon, getChatSaveFormatDefinitions, htmlSaveFormatDefinition, injectCssModuleIntoShadowRoot, jsonSaveFormatDefinition, mdSaveFormatDefinition, parseMessageButtons, pdfSaveFormatDefinition, reactSaveFormatDefinition, txtSaveFormatDefinition, useChatAutoScroll, useSendMessageToLlmChat };
18124
+ export { AboutPromptbookInformation, AgentChat, ArrowIcon, AttachmentIcon, AvatarChip, AvatarChipFromSource, AvatarProfile, AvatarProfileFromSource, BLOCKY_FLOW, BOOK_LANGUAGE_VERSION, BookEditor, BrandedQrCode, CHAT_SAVE_FORMATS, CameraIcon, Chat, DEFAULT_BOOK_EDITOR_HEIGHT, FAST_FLOW, GenericQrCode, LlmChat, MOCKED_CHAT_DELAY_CONFIGS, MarkdownContent, MicIcon, MockedChat, NORMAL_FLOW, PROMPTBOOK_ENGINE_VERSION, PauseIcon, PlayIcon, PromptbookAgentIntegration, PromptbookQrCode, RANDOM_FLOW, ResetIcon, SLOW_FLOW, SaveIcon, SendIcon, TemplateIcon, getChatSaveFormatDefinitions, htmlSaveFormatDefinition, injectCssModuleIntoShadowRoot, jsonSaveFormatDefinition, mdSaveFormatDefinition, parseMessageButtons, pdfSaveFormatDefinition, reactSaveFormatDefinition, txtSaveFormatDefinition, useChatAutoScroll, useSendMessageToLlmChat };
17910
18125
  //# sourceMappingURL=index.es.js.map