@promptbook/components 0.104.0-0 โ†’ 0.104.0-10

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 (42) hide show
  1. package/esm/index.es.js +626 -237
  2. package/esm/index.es.js.map +1 -1
  3. package/esm/typings/servers.d.ts +8 -0
  4. package/esm/typings/src/_packages/core.index.d.ts +2 -0
  5. package/esm/typings/src/_packages/types.index.d.ts +10 -2
  6. package/esm/typings/src/book-2.0/agent-source/AgentBasicInformation.d.ts +6 -1
  7. package/esm/typings/src/book-2.0/agent-source/createAgentModelRequirements.d.ts +6 -6
  8. package/esm/typings/src/book-2.0/agent-source/createAgentModelRequirementsWithCommitments.closed.test.d.ts +1 -0
  9. package/esm/typings/src/book-2.0/utils/generatePlaceholderAgentProfileImageUrl.d.ts +3 -3
  10. package/esm/typings/src/book-components/Chat/Chat/ChatMessageItem.d.ts +5 -1
  11. package/esm/typings/src/book-components/Chat/Chat/ChatProps.d.ts +5 -0
  12. package/esm/typings/src/book-components/Chat/CodeBlock/CodeBlock.d.ts +13 -0
  13. package/esm/typings/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  14. package/esm/typings/src/book-components/Chat/types/ChatMessage.d.ts +7 -11
  15. package/esm/typings/src/book-components/_common/Dropdown/Dropdown.d.ts +2 -2
  16. package/esm/typings/src/book-components/_common/MenuHoisting/MenuHoistingContext.d.ts +56 -0
  17. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentCollectionInSupabase.d.ts +21 -11
  18. package/esm/typings/src/collection/agent-collection/constructors/agent-collection-in-supabase/AgentsDatabaseSchema.d.ts +80 -14
  19. package/esm/typings/src/commitments/DICTIONARY/DICTIONARY.d.ts +46 -0
  20. package/esm/typings/src/commitments/index.d.ts +2 -1
  21. package/esm/typings/src/llm-providers/_multiple/MultipleLlmExecutionTools.d.ts +6 -2
  22. package/esm/typings/src/llm-providers/agent/AgentLlmExecutionTools.d.ts +1 -1
  23. package/esm/typings/src/llm-providers/ollama/OllamaExecutionTools.d.ts +1 -1
  24. package/esm/typings/src/llm-providers/openai/createOpenAiCompatibleExecutionTools.d.ts +1 -1
  25. package/esm/typings/src/llm-providers/remote/RemoteLlmExecutionTools.d.ts +1 -0
  26. package/esm/typings/src/types/Message.d.ts +49 -0
  27. package/esm/typings/src/types/ModelRequirements.d.ts +38 -14
  28. package/esm/typings/src/types/typeAliases.d.ts +23 -1
  29. package/esm/typings/src/utils/color/utils/colorToDataUrl.d.ts +2 -1
  30. package/esm/typings/src/utils/environment/$detectRuntimeEnvironment.d.ts +4 -4
  31. package/esm/typings/src/utils/environment/$isRunningInBrowser.d.ts +1 -1
  32. package/esm/typings/src/utils/environment/$isRunningInJest.d.ts +1 -1
  33. package/esm/typings/src/utils/environment/$isRunningInNode.d.ts +1 -1
  34. package/esm/typings/src/utils/environment/$isRunningInWebWorker.d.ts +1 -1
  35. package/esm/typings/src/utils/markdown/extractAllBlocksFromMarkdown.d.ts +2 -2
  36. package/esm/typings/src/utils/markdown/extractOneBlockFromMarkdown.d.ts +2 -2
  37. package/esm/typings/src/utils/random/$randomBase58.d.ts +12 -0
  38. package/esm/typings/src/version.d.ts +1 -1
  39. package/package.json +1 -2
  40. package/umd/index.umd.js +634 -246
  41. package/umd/index.umd.js.map +1 -1
  42. package/esm/typings/src/book-2.0/utils/generateGravatarUrl.d.ts +0 -10
package/umd/index.umd.js CHANGED
@@ -1,15 +1,14 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('spacetrim'), require('crypto-js'), require('crypto-js/enc-hex'), require('path'), require('crypto'), require('react-dom'), require('@monaco-editor/react'), require('destroyable'), require('highlight.js'), require('katex'), require('showdown'), require('rxjs'), require('waitasecond'), require('crypto-js/sha256'), require('mime-types'), require('papaparse'), require('colors'), require('bottleneck'), require('openai'), require('qrcode')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'spacetrim', 'crypto-js', 'crypto-js/enc-hex', 'path', 'crypto', 'react-dom', '@monaco-editor/react', 'destroyable', 'highlight.js', 'katex', 'showdown', 'rxjs', 'waitasecond', 'crypto-js/sha256', 'mime-types', 'papaparse', 'colors', 'bottleneck', 'openai', 'qrcode'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.react, global.spaceTrim$1, global.cryptoJs, global.hexEncoder, global.path, global.crypto, global.reactDom, global.Editor, global.destroyable, global.hljs, global.katex, global.showdown, global.rxjs, global.waitasecond, global.sha256, global.mimeTypes, global.papaparse, global.colors, global.Bottleneck, global.OpenAI, global.QRCode));
5
- })(this, (function (exports, jsxRuntime, react, spaceTrim$1, cryptoJs, hexEncoder, path, crypto, reactDom, Editor, destroyable, hljs, katex, showdown, rxjs, waitasecond, sha256, mimeTypes, papaparse, colors, Bottleneck, OpenAI, QRCode) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('spacetrim'), require('crypto-js'), require('crypto-js/enc-hex'), require('path'), require('crypto'), require('react-dom'), require('@monaco-editor/react'), require('destroyable'), require('katex'), require('react-dom/client'), require('showdown'), require('rxjs'), require('waitasecond'), require('crypto-js/sha256'), require('mime-types'), require('papaparse'), require('colors'), require('bottleneck'), require('openai'), require('qrcode')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'spacetrim', 'crypto-js', 'crypto-js/enc-hex', 'path', 'crypto', 'react-dom', '@monaco-editor/react', 'destroyable', 'katex', 'react-dom/client', 'showdown', 'rxjs', 'waitasecond', 'crypto-js/sha256', 'mime-types', 'papaparse', 'colors', 'bottleneck', 'openai', 'qrcode'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-components"] = {}, global.jsxRuntime, global.react, global.spaceTrim$1, global.cryptoJs, global.hexEncoder, global.path, global.crypto, global.reactDom, global.Editor, global.destroyable, global.katex, global.client, global.showdown, global.rxjs, global.waitasecond, global.sha256, global.mimeTypes, global.papaparse, global.colors, global.Bottleneck, global.OpenAI, global.QRCode));
5
+ })(this, (function (exports, jsxRuntime, react, spaceTrim$1, cryptoJs, hexEncoder, path, crypto, reactDom, Editor, destroyable, katex, client, showdown, rxjs, waitasecond, sha256, mimeTypes, papaparse, colors, Bottleneck, OpenAI, QRCode) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
9
9
  var spaceTrim__default = /*#__PURE__*/_interopDefaultLegacy(spaceTrim$1);
10
10
  var hexEncoder__default = /*#__PURE__*/_interopDefaultLegacy(hexEncoder);
11
11
  var Editor__default = /*#__PURE__*/_interopDefaultLegacy(Editor);
12
- var hljs__default = /*#__PURE__*/_interopDefaultLegacy(hljs);
13
12
  var katex__default = /*#__PURE__*/_interopDefaultLegacy(katex);
14
13
  var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256);
15
14
  var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
@@ -31,7 +30,7 @@
31
30
  * @generated
32
31
  * @see https://github.com/webgptorg/promptbook
33
32
  */
34
- const PROMPTBOOK_ENGINE_VERSION = '0.104.0-0';
33
+ const PROMPTBOOK_ENGINE_VERSION = '0.104.0-10';
35
34
  /**
36
35
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
37
36
  * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
@@ -80,9 +79,9 @@
80
79
  }
81
80
  }
82
81
 
83
- var css_248z$9 = ".AvatarChip-module_AvatarChip__4sA0u{align-items:center;background:#e0e7ef;border:1px solid #b3c2d1;border-radius:16px;color:#2a3b4d;cursor:pointer;display:inline-flex;font-size:.95em;font-weight:500;margin:2px;padding:4px 12px}.AvatarChip-module_Avatar__mN2sc{border-radius:50%;height:24px;margin-right:8px;object-fit:cover;width:24px}.AvatarChip-module_TemplateLabel__-7vVI{background:#f0f4f8;border-radius:12px;color:#3a4752;font-size:.8em;margin-left:8px;margin-right:0;padding:2px 6px;text-transform:uppercase}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkF2YXRhckNoaXAubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxrQkFBbUIsQ0FHbkIsa0JBQW1CLENBS25CLHdCQUF5QixDQU56QixrQkFBbUIsQ0FFbkIsYUFBYyxDQU1kLGNBQWUsQ0FYZixtQkFBb0IsQ0FPcEIsZUFBaUIsQ0FEakIsZUFBZ0IsQ0FFaEIsVUFBVyxDQU5YLGdCQVVKLENBRUEsaUNBR0ksaUJBQWtCLENBRGxCLFdBQVksQ0FHWixnQkFBaUIsQ0FEakIsZ0JBQWlCLENBSGpCLFVBS0osQ0FFQSx3Q0FDSSxrQkFBbUIsQ0FJbkIsa0JBQW1CLENBSG5CLGFBQWMsQ0FDZCxjQUFnQixDQUdoQixlQUFnQixDQUNoQixjQUFlLENBSGYsZUFBZ0IsQ0FJaEIsd0JBQ0oiLCJmaWxlIjoiQXZhdGFyQ2hpcC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkF2YXRhckNoaXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogNHB4IDEycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZTBlN2VmO1xuICAgIGNvbG9yOiAjMmEzYjRkO1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAwLjk1ZW07XG4gICAgbWFyZ2luOiAycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2IzYzJkMTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLkF2YXRhciB7XG4gICAgd2lkdGg6IDI0cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbn1cblxuLlRlbXBsYXRlTGFiZWwge1xuICAgIGJhY2tncm91bmQ6ICNmMGY0Zjg7XG4gICAgY29sb3I6ICMzYTQ3NTI7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cbiJdfQ== */";
84
- var styles$8 = {"AvatarChip":"AvatarChip-module_AvatarChip__4sA0u","Avatar":"AvatarChip-module_Avatar__mN2sc","TemplateLabel":"AvatarChip-module_TemplateLabel__-7vVI"};
85
- styleInject(css_248z$9);
82
+ var css_248z$a = ".AvatarChip-module_AvatarChip__4sA0u{align-items:center;background:#e0e7ef;border:1px solid #b3c2d1;border-radius:16px;color:#2a3b4d;cursor:pointer;display:inline-flex;font-size:.95em;font-weight:500;margin:2px;padding:4px 12px}.AvatarChip-module_Avatar__mN2sc{border-radius:50%;height:24px;margin-right:8px;object-fit:cover;width:24px}.AvatarChip-module_TemplateLabel__-7vVI{background:#f0f4f8;border-radius:12px;color:#3a4752;font-size:.8em;margin-left:8px;margin-right:0;padding:2px 6px;text-transform:uppercase}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkF2YXRhckNoaXAubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxrQkFBbUIsQ0FHbkIsa0JBQW1CLENBS25CLHdCQUF5QixDQU56QixrQkFBbUIsQ0FFbkIsYUFBYyxDQU1kLGNBQWUsQ0FYZixtQkFBb0IsQ0FPcEIsZUFBaUIsQ0FEakIsZUFBZ0IsQ0FFaEIsVUFBVyxDQU5YLGdCQVVKLENBRUEsaUNBR0ksaUJBQWtCLENBRGxCLFdBQVksQ0FHWixnQkFBaUIsQ0FEakIsZ0JBQWlCLENBSGpCLFVBS0osQ0FFQSx3Q0FDSSxrQkFBbUIsQ0FJbkIsa0JBQW1CLENBSG5CLGFBQWMsQ0FDZCxjQUFnQixDQUdoQixlQUFnQixDQUNoQixjQUFlLENBSGYsZUFBZ0IsQ0FJaEIsd0JBQ0oiLCJmaWxlIjoiQXZhdGFyQ2hpcC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkF2YXRhckNoaXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogNHB4IDEycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZTBlN2VmO1xuICAgIGNvbG9yOiAjMmEzYjRkO1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAwLjk1ZW07XG4gICAgbWFyZ2luOiAycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2IzYzJkMTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLkF2YXRhciB7XG4gICAgd2lkdGg6IDI0cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbn1cblxuLlRlbXBsYXRlTGFiZWwge1xuICAgIGJhY2tncm91bmQ6ICNmMGY0Zjg7XG4gICAgY29sb3I6ICMzYTQ3NTI7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cbiJdfQ== */";
83
+ var styles$9 = {"AvatarChip":"AvatarChip-module_AvatarChip__4sA0u","Avatar":"AvatarChip-module_Avatar__mN2sc","TemplateLabel":"AvatarChip-module_TemplateLabel__-7vVI"};
84
+ styleInject(css_248z$a);
86
85
 
87
86
  /**
88
87
  * Shows a chip with avatar's avatar and name
@@ -92,7 +91,7 @@
92
91
  function AvatarChip(props) {
93
92
  const { avatarBasicInformation, className, onSelect, isSelected, isTemplate } = props;
94
93
  const { agentName, meta } = avatarBasicInformation;
95
- return (jsxRuntime.jsxs("div", { className: classNames(styles$8.AvatarChip, className, isSelected ? styles$8.Selected : undefined), onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect(avatarBasicInformation), style: { cursor: onSelect ? 'pointer' : undefined }, children: [jsxRuntime.jsx("img", { src: meta.image, alt: agentName || '', className: styles$8.Avatar }), meta.fullname || agentName, isTemplate && jsxRuntime.jsx("span", { className: styles$8.TemplateLabel, children: "Template" })] }));
94
+ return (jsxRuntime.jsxs("div", { className: classNames(styles$9.AvatarChip, className, isSelected ? styles$9.Selected : undefined), onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect(avatarBasicInformation), style: { cursor: onSelect ? 'pointer' : undefined }, children: [jsxRuntime.jsx("img", { src: meta.image, alt: agentName || '', className: styles$9.Avatar }), meta.fullname || agentName, isTemplate && jsxRuntime.jsx("span", { className: styles$9.TemplateLabel, children: "Template" })] }));
96
95
  }
97
96
 
98
97
  /**
@@ -149,48 +148,12 @@
149
148
  * TODO: [๐ŸŒบ] Use some intermediate util splitWords
150
149
  */
151
150
 
152
- /**
153
- * Generates a gravatar URL based on agent name for fallback avatar
154
- *
155
- * @param agentName The agent name to generate avatar for
156
- * @returns Gravatar URL
157
- *
158
- * @private - [๐Ÿคน] The fact that profile image is Gravatar is just implementation detail which should be hidden for consumer
159
- */
160
- function generateGravatarUrl(agentName) {
161
- // Use a default name if none provided
162
- const safeName = agentName || 'Anonymous Agent';
163
- // Create a simple hash from the name for consistent avatar
164
- let hash = 0;
165
- for (let i = 0; i < safeName.length; i++) {
166
- const char = safeName.charCodeAt(i);
167
- hash = (hash << 5) - hash + char;
168
- hash = hash & hash; // Convert to 32bit integer
169
- }
170
- const avatarId = Math.abs(hash).toString();
171
- return `https://www.gravatar.com/avatar/${avatarId}?default=robohash&size=200&rating=x`;
172
- }
173
-
174
- /**
175
- * Generates an image for the agent to use as profile image
176
- *
177
- * @param agentName The agent name to generate avatar for
178
- * @returns The placeholder profile image URL for the agent
179
- *
180
- * @public exported from `@promptbook/core`
181
- */
182
- function generatePlaceholderAgentProfileImageUrl(agentName) {
183
- // Note: [๐Ÿคน] The fact that profile image is Gravatar is just implementation detail which should be hidden for consumer
184
- return generateGravatarUrl(agentName);
185
- }
186
- /**
187
- * TODO: [๐Ÿคน] Figure out best placeholder image generator https://i.pravatar.cc/1000?u=568
188
- */
189
-
190
151
  /**
191
152
  * Core Promptbook server configuration.
192
153
  *
193
154
  * This server is also used for auto-federation in the Agents Server.
155
+ *
156
+ * @public exported from `@promptbook/core`
194
157
  */
195
158
  const CORE_SERVER = {
196
159
  title: 'Promptbook Core',
@@ -3043,13 +3006,14 @@
3043
3006
  *
3044
3007
  * @public exported from `@promptbook/utils`
3045
3008
  */
3046
- const $isRunningInBrowser = new Function(`
3047
- try {
3048
- return this === window;
3049
- } catch (e) {
3050
- return false;
3009
+ function $isRunningInBrowser() {
3010
+ try {
3011
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
3012
+ }
3013
+ catch (e) {
3014
+ return false;
3015
+ }
3051
3016
  }
3052
- `);
3053
3017
  /**
3054
3018
  * TODO: [๐ŸŽบ]
3055
3019
  */
@@ -3061,13 +3025,15 @@
3061
3025
  *
3062
3026
  * @public exported from `@promptbook/utils`
3063
3027
  */
3064
- const $isRunningInJest = new Function(`
3065
- try {
3066
- return process.env.JEST_WORKER_ID !== undefined;
3067
- } catch (e) {
3068
- return false;
3028
+ function $isRunningInJest() {
3029
+ var _a;
3030
+ try {
3031
+ return typeof process !== 'undefined' && ((_a = process.env) === null || _a === void 0 ? void 0 : _a.JEST_WORKER_ID) !== undefined;
3032
+ }
3033
+ catch (e) {
3034
+ return false;
3035
+ }
3069
3036
  }
3070
- `);
3071
3037
  /**
3072
3038
  * TODO: [๐ŸŽบ]
3073
3039
  */
@@ -3079,13 +3045,14 @@
3079
3045
  *
3080
3046
  * @public exported from `@promptbook/utils`
3081
3047
  */
3082
- const $isRunningInNode = new Function(`
3083
- try {
3084
- return this === global;
3085
- } catch (e) {
3086
- return false;
3048
+ function $isRunningInNode() {
3049
+ try {
3050
+ return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
3051
+ }
3052
+ catch (e) {
3053
+ return false;
3054
+ }
3087
3055
  }
3088
- `);
3089
3056
  /**
3090
3057
  * TODO: [๐ŸŽบ]
3091
3058
  */
@@ -3097,17 +3064,17 @@
3097
3064
  *
3098
3065
  * @public exported from `@promptbook/utils`
3099
3066
  */
3100
- const $isRunningInWebWorker = new Function(`
3101
- try {
3102
- if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
3103
- return true;
3104
- } else {
3067
+ function $isRunningInWebWorker() {
3068
+ try {
3069
+ // Note: Check for importScripts which is specific to workers
3070
+ // and not available in the main browser thread
3071
+ return (typeof self !== 'undefined' &&
3072
+ typeof self.importScripts === 'function');
3073
+ }
3074
+ catch (e) {
3105
3075
  return false;
3106
3076
  }
3107
- } catch (e) {
3108
- return false;
3109
3077
  }
3110
- `);
3111
3078
  /**
3112
3079
  * TODO: [๐ŸŽบ]
3113
3080
  */
@@ -4123,6 +4090,114 @@
4123
4090
  * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
4124
4091
  */
4125
4092
 
4093
+ /**
4094
+ * DICTIONARY commitment definition
4095
+ *
4096
+ * The DICTIONARY commitment defines specific terms and their meanings that the agent should use correctly
4097
+ * in its reasoning and responses. This ensures consistent terminology usage.
4098
+ *
4099
+ * Key features:
4100
+ * - Multiple DICTIONARY commitments are automatically merged into one
4101
+ * - Content is placed in a dedicated section of the system message
4102
+ * - Terms and definitions are stored in metadata.DICTIONARY for debugging
4103
+ * - Agent should use the defined terms correctly in responses
4104
+ *
4105
+ * Example usage in agent source:
4106
+ *
4107
+ * ```book
4108
+ * Legal Assistant
4109
+ *
4110
+ * PERSONA You are a knowledgeable legal assistant
4111
+ * DICTIONARY Misdemeanor is a minor wrongdoing or criminal offense
4112
+ * DICTIONARY Felony is a serious crime usually punishable by imprisonment for more than one year
4113
+ * DICTIONARY Tort is a civil wrong that causes harm or loss to another person, leading to legal liability
4114
+ * ```
4115
+ *
4116
+ * @private [๐Ÿช”] Maybe export the commitments through some package
4117
+ */
4118
+ class DictionaryCommitmentDefinition extends BaseCommitmentDefinition {
4119
+ constructor() {
4120
+ super('DICTIONARY');
4121
+ }
4122
+ /**
4123
+ * Short one-line description of DICTIONARY.
4124
+ */
4125
+ get description() {
4126
+ return 'Define terms and their meanings for consistent terminology usage.';
4127
+ }
4128
+ /**
4129
+ * Icon for this commitment.
4130
+ */
4131
+ get icon() {
4132
+ return '๐Ÿ“š';
4133
+ }
4134
+ /**
4135
+ * Markdown documentation for DICTIONARY commitment.
4136
+ */
4137
+ get documentation() {
4138
+ return spaceTrim$1.spaceTrim(`
4139
+ # DICTIONARY
4140
+
4141
+ Defines specific terms and their meanings that the agent should use correctly in reasoning and responses.
4142
+
4143
+ ## Key aspects
4144
+
4145
+ - Multiple \`DICTIONARY\` commitments are merged together.
4146
+ - Terms are defined in the format: "Term is definition"
4147
+ - The agent should use these terms consistently in responses.
4148
+ - Definitions help ensure accurate and consistent terminology.
4149
+
4150
+ ## Examples
4151
+
4152
+ \`\`\`book
4153
+ Legal Assistant
4154
+
4155
+ PERSONA You are a knowledgeable legal assistant specializing in criminal law
4156
+ DICTIONARY Misdemeanor is a minor wrongdoing or criminal offense
4157
+ DICTIONARY Felony is a serious crime usually punishable by imprisonment for more than one year
4158
+ DICTIONARY Tort is a civil wrong that causes harm or loss to another person, leading to legal liability
4159
+ \`\`\`
4160
+
4161
+ \`\`\`book
4162
+ Medical Assistant
4163
+
4164
+ PERSONA You are a helpful medical assistant
4165
+ DICTIONARY Hypertension is persistently high blood pressure
4166
+ DICTIONARY Diabetes is a chronic condition that affects how the body processes blood sugar
4167
+ DICTIONARY Vaccine is a biological preparation that provides active immunity to a particular disease
4168
+ \`\`\`
4169
+ `);
4170
+ }
4171
+ applyToAgentModelRequirements(requirements, content) {
4172
+ var _a;
4173
+ const trimmedContent = content.trim();
4174
+ if (!trimmedContent) {
4175
+ return requirements;
4176
+ }
4177
+ // Get existing dictionary entries from metadata
4178
+ const existingDictionary = ((_a = requirements.metadata) === null || _a === void 0 ? void 0 : _a.DICTIONARY) || '';
4179
+ // Merge the new dictionary entry with existing entries
4180
+ const mergedDictionary = existingDictionary
4181
+ ? `${existingDictionary}\n${trimmedContent}`
4182
+ : trimmedContent;
4183
+ // Store the merged dictionary in metadata for debugging and inspection
4184
+ const updatedMetadata = {
4185
+ ...requirements.metadata,
4186
+ DICTIONARY: mergedDictionary,
4187
+ };
4188
+ // Create the dictionary section for the system message
4189
+ // Format: "# DICTIONARY\nTerm: definition\nTerm: definition..."
4190
+ const dictionarySection = `# DICTIONARY\n${mergedDictionary}`;
4191
+ return {
4192
+ ...this.appendToSystemMessage(requirements, dictionarySection),
4193
+ metadata: updatedMetadata,
4194
+ };
4195
+ }
4196
+ }
4197
+ /**
4198
+ * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
4199
+ */
4200
+
4126
4201
  /**
4127
4202
  * FORMAT commitment definition
4128
4203
  *
@@ -6943,6 +7018,7 @@
6943
7018
  new DeleteCommitmentDefinition('CANCEL'),
6944
7019
  new DeleteCommitmentDefinition('DISCARD'),
6945
7020
  new DeleteCommitmentDefinition('REMOVE'),
7021
+ new DictionaryCommitmentDefinition(),
6946
7022
  new OpenCommitmentDefinition(),
6947
7023
  new ClosedCommitmentDefinition(),
6948
7024
  new UseBrowserCommitmentDefinition(),
@@ -7002,17 +7078,64 @@
7002
7078
  };
7003
7079
  }
7004
7080
  const lines = agentSource.split('\n');
7005
- const agentName = (((_a = lines[0]) === null || _a === void 0 ? void 0 : _a.trim()) || null);
7081
+ let agentName = null;
7082
+ let agentNameLineIndex = -1;
7083
+ // Find the agent name: first non-empty line that is not a commitment and not a horizontal line
7084
+ for (let i = 0; i < lines.length; i++) {
7085
+ const line = lines[i];
7086
+ if (line === undefined) {
7087
+ continue;
7088
+ }
7089
+ const trimmed = line.trim();
7090
+ if (!trimmed) {
7091
+ continue;
7092
+ }
7093
+ const isHorizontal = HORIZONTAL_LINE_PATTERN.test(line);
7094
+ if (isHorizontal) {
7095
+ continue;
7096
+ }
7097
+ let isCommitment = false;
7098
+ for (const definition of COMMITMENT_REGISTRY) {
7099
+ const typeRegex = definition.createTypeRegex();
7100
+ const match = typeRegex.exec(trimmed);
7101
+ if (match && ((_a = match.groups) === null || _a === void 0 ? void 0 : _a.type)) {
7102
+ isCommitment = true;
7103
+ break;
7104
+ }
7105
+ }
7106
+ if (!isCommitment) {
7107
+ agentName = trimmed;
7108
+ agentNameLineIndex = i;
7109
+ break;
7110
+ }
7111
+ }
7006
7112
  const commitments = [];
7007
7113
  const nonCommitmentLines = [];
7008
- // Always add the first line (agent name) to non-commitment lines
7009
- if (lines[0] !== undefined) {
7010
- nonCommitmentLines.push(lines[0]);
7114
+ // Add lines before agentName that are horizontal lines (they are non-commitment)
7115
+ for (let i = 0; i < agentNameLineIndex; i++) {
7116
+ const line = lines[i];
7117
+ if (line === undefined) {
7118
+ continue;
7119
+ }
7120
+ const trimmed = line.trim();
7121
+ if (!trimmed) {
7122
+ continue;
7123
+ }
7124
+ const isHorizontal = HORIZONTAL_LINE_PATTERN.test(line);
7125
+ if (isHorizontal) {
7126
+ nonCommitmentLines.push(line);
7127
+ }
7128
+ // Note: Commitments before agentName are not added to nonCommitmentLines
7129
+ }
7130
+ // Add the agent name line to non-commitment lines
7131
+ if (agentNameLineIndex >= 0) {
7132
+ nonCommitmentLines.push(lines[agentNameLineIndex]);
7011
7133
  }
7012
7134
  // Parse commitments with multiline support
7013
7135
  let currentCommitment = null;
7014
- // Process lines starting from the second line (skip agent name)
7015
- for (let i = 1; i < lines.length; i++) {
7136
+ // Process lines starting from after the agent name line
7137
+ const startIndex = agentNameLineIndex >= 0 ? agentNameLineIndex + 1 : 0;
7138
+ for (let i = startIndex; i < lines.length; i++) {
7016
7139
  const line = lines[i];
7017
7140
  if (line === undefined) {
7018
7141
  continue;
@@ -7219,10 +7342,6 @@
7219
7342
  const metaType = normalizeTo_camelCase(metaTypeRaw);
7220
7343
  meta[metaType] = spaceTrim__default["default"](commitment.content.substring(metaTypeRaw.length));
7221
7344
  }
7222
- // Generate gravatar fallback if no meta image specified
7223
- if (!meta.image) {
7224
- meta.image = generatePlaceholderAgentProfileImageUrl(parseResult.agentName || '!!');
7225
- }
7226
7345
  // Generate fullname fallback if no meta fullname specified
7227
7346
  if (!meta.fullname) {
7228
7347
  meta.fullname = parseResult.agentName || createDefaultAgentName(agentSource);
@@ -7234,6 +7353,7 @@
7234
7353
  return {
7235
7354
  agentName: normalizeAgentName(parseResult.agentName || createDefaultAgentName(agentSource)),
7236
7355
  agentHash,
7356
+ permanentId: meta.id,
7237
7357
  personaDescription,
7238
7358
  initialMessage,
7239
7359
  meta,
@@ -7273,9 +7393,9 @@
7273
7393
  return jsxRuntime.jsx(AvatarChip, { avatarBasicInformation: avatarBasicInformation, ...props });
7274
7394
  }
7275
7395
 
7276
- var css_248z$8 = ".Modal-module_scrim__jKO-A{align-items:center;background-color:rgba(0,0,0,.5);display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:9000000}.Modal-module_Modal__k49dY{background:#fff;border-radius:8px;max-height:90%;max-width:90%;min-height:30vh;min-width:50vw;overflow:auto;padding:20px;position:relative}.Modal-module_closeButton__dzf6l{background:transparent;border:none;cursor:pointer;font-size:24px;position:absolute;right:10px;top:10px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1vZGFsLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBU0ksa0JBQW1CLENBSG5CLCtCQUFvQyxDQUNwQyxZQUFhLENBRmIsV0FBWSxDQUdaLHNCQUF1QixDQUx2QixNQUFPLENBRlAsY0FBZSxDQUNmLEtBQU0sQ0FFTixVQUFXLENBTVgsZUFDSixDQUVBLDJCQUNJLGVBQWlCLENBRWpCLGlCQUFrQixDQUdsQixjQUFlLENBRGYsYUFBYyxDQUdkLGVBQWdCLENBRGhCLGNBQWUsQ0FFZixhQUFjLENBUGQsWUFBYSxDQUViLGlCQU1KLENBRUEsaUNBSUksc0JBQXVCLENBQ3ZCLFdBQVksQ0FFWixjQUFlLENBRGYsY0FBZSxDQUxmLGlCQUFrQixDQUVsQixVQUFXLENBRFgsUUFNSiIsImZpbGUiOiJNb2RhbC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNjcmltIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgei1pbmRleDogOTAwMDAwMDtcbn1cblxuLk1vZGFsIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiA5MCU7XG4gICAgbWF4LWhlaWdodDogOTAlO1xuICAgIG1pbi13aWR0aDogNTB2dztcbiAgICBtaW4taGVpZ2h0OiAzMHZoO1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4uY2xvc2VCdXR0b24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDEwcHg7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG4iXX0= */";
7277
- var styles$7 = {"scrim":"Modal-module_scrim__jKO-A","Modal":"Modal-module_Modal__k49dY","closeButton":"Modal-module_closeButton__dzf6l"};
7278
- styleInject(css_248z$8);
7396
+ var css_248z$9 = ".Modal-module_scrim__jKO-A{align-items:center;background-color:rgba(0,0,0,.5);display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:9000000}.Modal-module_Modal__k49dY{background:#fff;border-radius:8px;max-height:90%;max-width:90%;min-height:30vh;min-width:50vw;overflow:auto;padding:20px;position:relative}.Modal-module_closeButton__dzf6l{background:transparent;border:none;cursor:pointer;font-size:24px;position:absolute;right:10px;top:10px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1vZGFsLm1vZHVsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBU0ksa0JBQW1CLENBSG5CLCtCQUFvQyxDQUNwQyxZQUFhLENBRmIsV0FBWSxDQUdaLHNCQUF1QixDQUx2QixNQUFPLENBRlAsY0FBZSxDQUNmLEtBQU0sQ0FFTixVQUFXLENBTVgsZUFDSixDQUVBLDJCQUNJLGVBQWlCLENBRWpCLGlCQUFrQixDQUdsQixjQUFlLENBRGYsYUFBYyxDQUdkLGVBQWdCLENBRGhCLGNBQWUsQ0FFZixhQUFjLENBUGQsWUFBYSxDQUViLGlCQU1KLENBRUEsaUNBSUksc0JBQXVCLENBQ3ZCLFdBQVksQ0FFWixjQUFlLENBRGYsY0FBZSxDQUxmLGlCQUFrQixDQUVsQixVQUFXLENBRFgsUUFNSiIsImZpbGUiOiJNb2RhbC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNjcmltIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgei1pbmRleDogOTAwMDAwMDtcbn1cblxuLk1vZGFsIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LXdpZHRoOiA5MCU7XG4gICAgbWF4LWhlaWdodDogOTAlO1xuICAgIG1pbi13aWR0aDogNTB2dztcbiAgICBtaW4taGVpZ2h0OiAzMHZoO1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4uY2xvc2VCdXR0b24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDEwcHg7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG4iXX0= */";
7397
+ var styles$8 = {"scrim":"Modal-module_scrim__jKO-A","Modal":"Modal-module_Modal__k49dY","closeButton":"Modal-module_closeButton__dzf6l"};
7398
+ styleInject(css_248z$9);
7279
7399
 
7280
7400
  /**
7281
7401
  *
@@ -7293,7 +7413,7 @@
7293
7413
  window.removeEventListener('keydown', handleKeyDown);
7294
7414
  };
7295
7415
  }, [onClose]);
7296
- return reactDom.createPortal(jsxRuntime.jsx("div", { className: styles$7.scrim, onClick: onClose, children: jsxRuntime.jsxs("div", { className: classNames(styles$7.Modal, className), onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsx("button", { className: styles$7.closeButton, onClick: onClose, children: "\u00D7" }), children] }) }), document.body);
7416
+ return reactDom.createPortal(jsxRuntime.jsx("div", { className: styles$8.scrim, onClick: onClose, children: jsxRuntime.jsxs("div", { className: classNames(styles$8.Modal, className), onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsx("button", { className: styles$8.closeButton, onClick: onClose, children: "\u00D7" }), children] }) }), document.body);
7297
7417
  }
7298
7418
 
7299
7419
  /**
@@ -7378,9 +7498,9 @@
7378
7498
  // <- [๐Ÿฑโ€๐Ÿš€] Buttons into genesis book
7379
7499
  // <- TODO: [๐Ÿฑโ€๐Ÿš€] generateBookBoilerplate and deprecate `DEFAULT_BOOK`
7380
7500
 
7381
- var css_248z$7 = ".BookEditor-module_BookEditor__s-0PU{width:100%}.BookEditor-module_bookEditorContainer__wLMwM{box-sizing:border-box;height:100%;padding:10px 25px 0;position:relative;width:100%}.BookEditor-module_bookEditorContainer__wLMwM.BookEditor-module_isVerbose__VQ6iL{background-color:rgba(0,0,0,.05);outline:1px dotted rgba(0,0,0,.5)}.BookEditor-module_isVerbose__VQ6iL{outline:2px dotted #ff7526}.BookEditor-module_bookEditorWrapper__twppD{background-color:#fff;border:1px solid rgba(209,213,219,.8);border-radius:1rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);overflow:hidden;padding-top:10px;transition:box-shadow .2s ease-in-out}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorWrapper__twppD{overflow:visible}.BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.BookEditor-module_bookEditorWrapper__twppD.BookEditor-module_isBorderRadiusDisabled__h1I3v{border-radius:0}.BookEditor-module_dropOverlay__xWWoX{align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:#fff;display:flex;font-size:1.5rem;justify-content:center;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:100}.BookEditor-module_bookEditorActionbar__KW6dc{position:absolute;right:55px;top:10px;z-index:100}.BookEditor-module_fullscreen__rktsl{border:none;border-radius:0;bottom:0;box-shadow:none;height:100%;left:0;padding-top:50px;position:fixed;right:0;top:0;width:100%;z-index:9999}.BookEditor-module_button__hS390{align-items:center;background-color:#fff;border:1px solid #d1d5db;border-radius:.375rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);color:#374151;cursor:pointer;display:inline-flex;gap:.5rem;padding:.5rem 1rem;transition:all .2s ease-in-out}.BookEditor-module_button__hS390:hover{background-color:#f9fafb;border-color:#b7bcce;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxVQUNKLENBRUEsOENBS0kscUJBQXNCLENBSHRCLFdBQVksQ0FFWixtQkFBb0IsQ0FEcEIsaUJBQWtCLENBRmxCLFVBS0osQ0FFQSxpRkFFSSxnQ0FBcUMsQ0FDckMsaUNBRUosQ0FFQSxvQ0FDSSwwQkFDSixDQUVBLDRDQUtJLHFCQUF1QixDQUR2QixxQ0FBMEMsQ0FGMUMsa0JBQW1CLENBSW5CLHNDQUEyQyxDQUwzQyxlQUFnQixDQUVoQixnQkFBaUIsQ0FJakIscUNBQ0osQ0FDQSxnRkFFSSxnQkFFSixDQUVBLGtEQUNJLHVFQUNKLENBVUEsNEZBQ0ksZUFDSixDQUVBLHNDQVNJLGtCQUFtQixDQUhuQiwrQkFBb0MsQ0FEcEMsUUFBUyxDQUVULFVBQVksQ0FDWixZQUFhLENBR2IsZ0JBQWlCLENBRGpCLHNCQUF1QixDQVB2QixNQUFPLENBVVAsbUJBQW9CLENBWnBCLGlCQUFrQixDQUdsQixPQUFRLENBRlIsS0FBTSxDQVVOLFdBRUosQ0FRQSw4Q0FDSSxpQkFBa0IsQ0FFbEIsVUFBVyxDQURYLFFBQVMsQ0FFVCxXQUNKLENBRUEscUNBV0ksV0FBWSxDQUZaLGVBQWdCLENBSmhCLFFBQVMsQ0FPVCxlQUFnQixDQUxoQixXQUFZLENBSlosTUFBTyxDQU9QLGdCQUFpQixDQVRqQixjQUFlLENBR2YsT0FBUSxDQUZSLEtBQU0sQ0FJTixVQUFXLENBRVgsWUFLSixDQUVBLGlDQU9JLGtCQUFtQixDQU5uQixxQkFBc0IsQ0FDdEIsd0JBQXlCLENBQ3pCLHFCQUF1QixDQU92QixzQ0FBMkMsQ0FEM0MsYUFBYyxDQUpkLGNBQWUsQ0FDZixtQkFBb0IsQ0FFcEIsU0FBVyxDQUpYLGtCQUFvQixDQU9wQiw4QkFDSixDQUVBLHVDQUNJLHdCQUF5QixDQUN6QixvQkFBcUIsQ0FDckIsaUVBQ0oiLCJmaWxlIjoiQm9va0VkaXRvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkJvb2tFZGl0b3Ige1xuICAgIC8qIGhlaWdodDogNDUwcHg7ICovXG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDEwcHggMjVweCAwO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyLmlzVmVyYm9zZSB7XG4gICAgLyoqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgLyoqL1xufVxuXG4uaXNWZXJib3NlIHtcbiAgICBvdXRsaW5lOiAycHggZG90dGVkIHJnYigyNTUgMTE3IDM4KTtcbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMDksIDIxMywgMjE5LCAwLjgpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzIGVhc2UtaW4tb3V0O1xufVxuLmlzVmVyYm9zZSAuYm9va0VkaXRvcldyYXBwZXIge1xuICAgIC8qKi9cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAvKiovXG59XG5cbi5ib29rRWRpdG9yV3JhcHBlcjpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAvKlxuICAgIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDk5LCAxMDIsIDI0MSwgMC40KTtcbiAgICAqL1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIuaXNCb3JkZXJSYWRpdXNEaXNhYmxlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmRyb3BPdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLypcbi5ib29rRWRpdG9yQ29udGFpbmVyIDpnbG9iYWwoLnZpZXctbGluZSkge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyAvKiA8LSBOb3RlOiBgUFJPTVBUQk9PS19TWU5UQVhfQ09MT1JTLkxJTkVgICogL1xufVxuKi9cblxuLmJvb2tFZGl0b3JBY3Rpb25iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDU1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4uZnVsbHNjcmVlbiB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIHBhZGRpbmctdG9wOiA1MHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XG4gICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgY29sb3I6ICMzNzQxNTE7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbn1cblxuLmJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcbiAgICBib3JkZXItY29sb3I6ICNiN2JjY2U7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuIl19 */";
7382
- var styles$6 = {"BookEditor":"BookEditor-module_BookEditor__s-0PU","bookEditorContainer":"BookEditor-module_bookEditorContainer__wLMwM","isVerbose":"BookEditor-module_isVerbose__VQ6iL","bookEditorWrapper":"BookEditor-module_bookEditorWrapper__twppD","isBorderRadiusDisabled":"BookEditor-module_isBorderRadiusDisabled__h1I3v","dropOverlay":"BookEditor-module_dropOverlay__xWWoX","bookEditorActionbar":"BookEditor-module_bookEditorActionbar__KW6dc","fullscreen":"BookEditor-module_fullscreen__rktsl","button":"BookEditor-module_button__hS390"};
7383
- styleInject(css_248z$7);
7501
+ var css_248z$8 = ".BookEditor-module_BookEditor__s-0PU{width:100%}.BookEditor-module_bookEditorContainer__wLMwM{box-sizing:border-box;height:100%;padding:10px 25px 0;position:relative;width:100%}.BookEditor-module_bookEditorContainer__wLMwM.BookEditor-module_isVerbose__VQ6iL{background-color:rgba(0,0,0,.05);outline:1px dotted rgba(0,0,0,.5)}.BookEditor-module_isVerbose__VQ6iL{outline:2px dotted #ff7526}.BookEditor-module_bookEditorWrapper__twppD{background-color:#fff;border:1px solid rgba(209,213,219,.8);border-radius:1rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);overflow:hidden;padding-top:10px;transition:box-shadow .2s ease-in-out}.BookEditor-module_isVerbose__VQ6iL .BookEditor-module_bookEditorWrapper__twppD{overflow:visible}.BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.BookEditor-module_bookEditorWrapper__twppD.BookEditor-module_isBorderRadiusDisabled__h1I3v{border-radius:0}.BookEditor-module_dropOverlay__xWWoX{align-items:center;background-color:rgba(0,0,0,.5);bottom:0;color:#fff;display:flex;font-size:1.5rem;justify-content:center;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:100}.BookEditor-module_bookEditorActionbar__KW6dc{position:absolute;right:55px;top:10px;z-index:100}.BookEditor-module_fullscreen__rktsl{border:none;border-radius:0;bottom:0;box-shadow:none;height:100%;left:0;padding-top:50px;position:fixed;right:0;top:0;width:100%;z-index:9999}.BookEditor-module_button__hS390{align-items:center;background-color:#fff;border:1px solid #d1d5db;border-radius:.375rem;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);color:#374151;cursor:pointer;display:inline-flex;gap:.5rem;padding:.5rem 1rem;transition:all .2s ease-in-out}.BookEditor-module_button__hS390:hover{background-color:#f9fafb;border-color:#b7bcce;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxVQUNKLENBRUEsOENBS0kscUJBQXNCLENBSHRCLFdBQVksQ0FFWixtQkFBb0IsQ0FEcEIsaUJBQWtCLENBRmxCLFVBS0osQ0FFQSxpRkFFSSxnQ0FBcUMsQ0FDckMsaUNBRUosQ0FFQSxvQ0FDSSwwQkFDSixDQUVBLDRDQUtJLHFCQUF1QixDQUR2QixxQ0FBMEMsQ0FGMUMsa0JBQW1CLENBSW5CLHNDQUEyQyxDQUwzQyxlQUFnQixDQUVoQixnQkFBaUIsQ0FJakIscUNBQ0osQ0FDQSxnRkFFSSxnQkFFSixDQUVBLGtEQUNJLHVFQUNKLENBVUEsNEZBQ0ksZUFDSixDQUVBLHNDQVNJLGtCQUFtQixDQUhuQiwrQkFBb0MsQ0FEcEMsUUFBUyxDQUVULFVBQVksQ0FDWixZQUFhLENBR2IsZ0JBQWlCLENBRGpCLHNCQUF1QixDQVB2QixNQUFPLENBVVAsbUJBQW9CLENBWnBCLGlCQUFrQixDQUdsQixPQUFRLENBRlIsS0FBTSxDQVVOLFdBRUosQ0FRQSw4Q0FDSSxpQkFBa0IsQ0FFbEIsVUFBVyxDQURYLFFBQVMsQ0FFVCxXQUNKLENBRUEscUNBV0ksV0FBWSxDQUZaLGVBQWdCLENBSmhCLFFBQVMsQ0FPVCxlQUFnQixDQUxoQixXQUFZLENBSlosTUFBTyxDQU9QLGdCQUFpQixDQVRqQixjQUFlLENBR2YsT0FBUSxDQUZSLEtBQU0sQ0FJTixVQUFXLENBRVgsWUFLSixDQUVBLGlDQU9JLGtCQUFtQixDQU5uQixxQkFBc0IsQ0FDdEIsd0JBQXlCLENBQ3pCLHFCQUF1QixDQU92QixzQ0FBMkMsQ0FEM0MsYUFBYyxDQUpkLGNBQWUsQ0FDZixtQkFBb0IsQ0FFcEIsU0FBVyxDQUpYLGtCQUFvQixDQU9wQiw4QkFDSixDQUVBLHVDQUNJLHdCQUF5QixDQUN6QixvQkFBcUIsQ0FDckIsaUVBQ0oiLCJmaWxlIjoiQm9va0VkaXRvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkJvb2tFZGl0b3Ige1xuICAgIC8qIGhlaWdodDogNDUwcHg7ICovXG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDEwcHggMjVweCAwO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5ib29rRWRpdG9yQ29udGFpbmVyLmlzVmVyYm9zZSB7XG4gICAgLyoqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgLyoqL1xufVxuXG4uaXNWZXJib3NlIHtcbiAgICBvdXRsaW5lOiAycHggZG90dGVkIHJnYigyNTUgMTE3IDM4KTtcbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMDksIDIxMywgMjE5LCAwLjgpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzIGVhc2UtaW4tb3V0O1xufVxuLmlzVmVyYm9zZSAuYm9va0VkaXRvcldyYXBwZXIge1xuICAgIC8qKi9cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAvKiovXG59XG5cbi5ib29rRWRpdG9yV3JhcHBlcjpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAvKlxuICAgIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDk5LCAxMDIsIDI0MSwgMC40KTtcbiAgICAqL1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIuaXNCb3JkZXJSYWRpdXNEaXNhYmxlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmRyb3BPdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLypcbi5ib29rRWRpdG9yQ29udGFpbmVyIDpnbG9iYWwoLnZpZXctbGluZSkge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyAvKiA8LSBOb3RlOiBgUFJPTVBUQk9PS19TWU5UQVhfQ09MT1JTLkxJTkVgICogL1xufVxuKi9cblxuLmJvb2tFZGl0b3JBY3Rpb25iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDU1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4uZnVsbHNjcmVlbiB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIHBhZGRpbmctdG9wOiA1MHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XG4gICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgY29sb3I6ICMzNzQxNTE7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbn1cblxuLmJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcbiAgICBib3JkZXItY29sb3I6ICNiN2JjY2U7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuIl19 */";
7502
+ var styles$7 = {"BookEditor":"BookEditor-module_BookEditor__s-0PU","bookEditorContainer":"BookEditor-module_bookEditorContainer__wLMwM","isVerbose":"BookEditor-module_isVerbose__VQ6iL","bookEditorWrapper":"BookEditor-module_bookEditorWrapper__twppD","isBorderRadiusDisabled":"BookEditor-module_isBorderRadiusDisabled__h1I3v","dropOverlay":"BookEditor-module_dropOverlay__xWWoX","bookEditorActionbar":"BookEditor-module_bookEditorActionbar__KW6dc","fullscreen":"BookEditor-module_fullscreen__rktsl","button":"BookEditor-module_button__hS390"};
7503
+ styleInject(css_248z$8);
7384
7504
 
7385
7505
  /**
7386
7506
  * Converts Blob, File or MediaSource to url using URL.createObjectURL
@@ -7500,6 +7620,101 @@
7500
7620
  * Note: [๐Ÿ”ต] Code in this file should never be published outside of `@promptbook/browser`
7501
7621
  */
7502
7622
 
7623
+ /**
7624
+ * Downloads a file with the given content and filename
7625
+ *
7626
+ * @private utility of `<Chat/>` component
7627
+ */
7628
+ function downloadFile(content, filename, mimeType) {
7629
+ const blob = new Blob([content], { type: mimeType });
7630
+ const url = URL.createObjectURL(blob);
7631
+ const link = document.createElement('a');
7632
+ link.href = url;
7633
+ link.download = filename;
7634
+ document.body.appendChild(link);
7635
+ link.click();
7636
+ document.body.removeChild(link);
7637
+ // Clean up the URL object
7638
+ setTimeout(() => URL.revokeObjectURL(url), 100);
7639
+ }
7640
+
7641
+ var css_248z$7 = ".CodeBlock-module_CodeBlock__6K33Z{border:1px solid #444;border-radius:5px;margin:10px 0;overflow:hidden}.CodeBlock-module_CodeBlockHeader__tfOwl{align-items:center;background-color:#2d2d2d;border-bottom:1px solid #444;color:#ccc;display:flex;font-size:.8em;justify-content:space-between;padding:5px 10px}.CodeBlock-module_CodeBlockButtons__rz1VO{display:flex;gap:8px}.CodeBlock-module_CopyButton__M07tp,.CodeBlock-module_CreateAgentButton__kUEnp,.CodeBlock-module_DownloadButton__ZTrzQ{align-items:center;background:transparent;border:none;color:#aaa;cursor:pointer;display:flex;font-size:inherit;gap:5px;padding:0;transition:color .2s}.CodeBlock-module_CopyButton__M07tp:hover,.CodeBlock-module_CreateAgentButton__kUEnp:hover,.CodeBlock-module_DownloadButton__ZTrzQ:hover{color:#fff}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvZGVCbG9jay5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUlJLHFCQUFzQixDQUZ0QixpQkFBa0IsQ0FEbEIsYUFBYyxDQUVkLGVBRUosQ0FFQSx5Q0FRSSxrQkFBbUIsQ0FQbkIsd0JBQXlCLENBSXpCLDRCQUE2QixDQUg3QixVQUFXLENBSVgsWUFBYSxDQUZiLGNBQWdCLENBR2hCLDZCQUE4QixDQUo5QixnQkFNSixDQUVBLDBDQUNJLFlBQWEsQ0FDYixPQUNKLENBRUEsdUhBVUksa0JBQW1CLENBUG5CLHNCQUF1QixDQUN2QixXQUFZLENBQ1osVUFBVyxDQUNYLGNBQWUsQ0FHZixZQUFhLENBRmIsaUJBQWtCLENBSWxCLE9BQVEsQ0FIUixTQUFVLENBSVYsb0JBQ0osQ0FFQSx5SUFHSSxVQUNKIiwiZmlsZSI6IkNvZGVCbG9jay5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLkNvZGVCbG9jayB7XG4gICAgbWFyZ2luOiAxMHB4IDA7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsgLyogRGFyayBtb2RlIGJvcmRlciAqL1xufVxuXG4uQ29kZUJsb2NrSGVhZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmQyZDJkO1xuICAgIGNvbG9yOiAjY2NjO1xuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMC44ZW07XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM0NDQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLkNvZGVCbG9ja0J1dHRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiA4cHg7XG59XG5cbi5Db3B5QnV0dG9uLFxuLkRvd25sb2FkQnV0dG9uLFxuLkNyZWF0ZUFnZW50QnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICNhYWE7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDVweDtcbiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xufVxuXG4uQ29weUJ1dHRvbjpob3Zlcixcbi5Eb3dubG9hZEJ1dHRvbjpob3Zlcixcbi5DcmVhdGVBZ2VudEJ1dHRvbjpob3ZlciB7XG4gICAgY29sb3I6ICNmZmY7XG59XG4iXX0= */";
7642
+ var styles$6 = {"CodeBlock":"CodeBlock-module_CodeBlock__6K33Z","CodeBlockHeader":"CodeBlock-module_CodeBlockHeader__tfOwl","CodeBlockButtons":"CodeBlock-module_CodeBlockButtons__rz1VO","CopyButton":"CodeBlock-module_CopyButton__M07tp","DownloadButton":"CodeBlock-module_DownloadButton__ZTrzQ","CreateAgentButton":"CodeBlock-module_CreateAgentButton__kUEnp"};
7643
+ styleInject(css_248z$7);
7644
+
7645
+ const LANGUAGE_EXTENSIONS = {
7646
+ python: 'py',
7647
+ javascript: 'js',
7648
+ typescript: 'ts',
7649
+ json: 'json',
7650
+ html: 'html',
7651
+ css: 'css',
7652
+ markdown: 'md',
7653
+ text: 'txt',
7654
+ xml: 'xml',
7655
+ sql: 'sql',
7656
+ sh: 'sh',
7657
+ bash: 'sh',
7658
+ zsh: 'sh',
7659
+ yaml: 'yaml',
7660
+ yml: 'yaml',
7661
+ book: 'book',
7662
+ };
7663
+ /**
7664
+ * Component to render a code block with syntax highlighting, copy, download, and create agent options.
7665
+ *
7666
+ * @private Internal utility of `<ChatMessage />` component
7667
+ */
7668
+ function CodeBlock({ code, language, className, onCreateAgent }) {
7669
+ const lines = react.useMemo(() => code.split('\n').length, [code]);
7670
+ // Note: 19px is approx line height for fontSize 14. +20 for padding.
7671
+ // We cap at 400px to avoid taking too much space, allowing scroll.
7672
+ const height = Math.min(Math.max(lines * 19, 19), 400);
7673
+ const [copied, setCopied] = react.useState(false);
7674
+ const handleDownload = () => {
7675
+ const lang = (language === null || language === void 0 ? void 0 : language.trim().toLowerCase()) || 'text';
7676
+ const extension = LANGUAGE_EXTENSIONS[lang] || lang;
7677
+ const filename = `file.${extension}`;
7678
+ downloadFile(code, filename, 'text/plain');
7679
+ };
7680
+ const handleCopy = async () => {
7681
+ try {
7682
+ await navigator.clipboard.writeText(code);
7683
+ setCopied(true);
7684
+ setTimeout(() => setCopied(false), 2000);
7685
+ }
7686
+ catch (error) {
7687
+ console.error('Failed to copy code to clipboard:', error);
7688
+ }
7689
+ };
7690
+ const header = language ? (jsxRuntime.jsxs("div", { className: styles$6.CodeBlockHeader, children: [jsxRuntime.jsx("span", { children: language }), jsxRuntime.jsxs("div", { className: styles$6.CodeBlockButtons, children: [jsxRuntime.jsx("button", { onClick: handleCopy, className: styles$6.CopyButton, title: "Copy to clipboard", children: copied ? 'Copied!' : 'Copy' }), jsxRuntime.jsx("button", { onClick: handleDownload, className: styles$6.DownloadButton, title: "Download code", children: "Download" }), (language === null || language === void 0 ? void 0 : language.trim().toLowerCase()) === 'book' && onCreateAgent && (jsxRuntime.jsx("button", { onClick: () => onCreateAgent(code), className: styles$6.CreateAgentButton, title: "Create agent from this book", children: "Create Agent" }))] })] })) : null;
7691
+ if ((language === null || language === void 0 ? void 0 : language.trim().toLowerCase()) === 'book') {
7692
+ return (jsxRuntime.jsxs("div", { className: classNames(styles$6.CodeBlock, className), children: [header, jsxRuntime.jsx(BookEditor, { value: code, isReadonly: true, height: lines * 25 /* <- [๐Ÿง ] A bit more than 19px to accommodate BookEditor lines */ })] }));
7693
+ }
7694
+ return (jsxRuntime.jsxs("div", { className: classNames(styles$6.CodeBlock, className), children: [header, jsxRuntime.jsx(Editor__default["default"], { height: `${height}px`, language: language || 'plaintext', value: code, theme: "vs-dark", options: {
7695
+ readOnly: true,
7696
+ minimap: { enabled: false },
7697
+ scrollBeyondLastLine: false,
7698
+ lineNumbers: 'on',
7699
+ folding: false,
7700
+ glyphMargin: false,
7701
+ fontFamily: 'Consolas, "Courier New", monospace',
7702
+ fontSize: 14,
7703
+ lineHeight: 19,
7704
+ overviewRulerLanes: 0,
7705
+ hideCursorInOverviewRuler: true,
7706
+ renderLineHighlight: 'none',
7707
+ contextmenu: false,
7708
+ scrollbar: {
7709
+ vertical: 'auto',
7710
+ horizontal: 'auto',
7711
+ useShadows: false,
7712
+ },
7713
+ domReadOnly: true,
7714
+ wordWrap: 'off',
7715
+ } })] }));
7716
+ }
7717
+
7503
7718
  var css_248z$6 = ".MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:2em}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.75em}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.5em}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.25em}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.1em}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:auto}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal;margin-left:20px}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX img,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:8px;margin-bottom:10px;margin-top:10px}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:#000;border:none;box-shadow:none;color:#fff;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:#ffffffcc;border:none;box-shadow:none;color:#000;display:block;font-size:inherit;line-height:inherit;padding:1em}.MarkdownContent-module_MarkdownContent__2JuyX code{background:#cccccc55;border:none;box-shadow:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;margin:0;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background-color:#000000cc;border-radius:8px}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border-color:#23272f;box-shadow:0 2px 8px rgba(0,0,0,.12);color:#f8fafc;font-family:Fira Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX table{background:#f8fafc;border-collapse:separate;border-spacing:0;box-shadow:0 2px 8px rgba(0,0,0,.08);color:#17223b;font-size:14px;margin:16px 0;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid #d1dbe8;color:#17223b;padding:10px 16px;text-align:left}.MarkdownContent-module_MarkdownContent__2JuyX th{background:linear-gradient(90deg,#eaf3fa 80%,#d1e3f8);border-bottom:2px solid #b5c7de;color:#17223b;font-weight:700}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:#eaf3fa}.MarkdownContent-module_MarkdownContent__2JuyX tr:hover td{background:#cbe0f7;transition:background .2s}.MarkdownContent-module_MarkdownContent__2JuyX table{border-radius:12px;overflow:hidden}.MarkdownContent-module_MarkdownContent__2JuyX td:first-child,.MarkdownContent-module_MarkdownContent__2JuyX th:first-child{border-top-left-radius:12px}.MarkdownContent-module_MarkdownContent__2JuyX td:last-child,.MarkdownContent-module_MarkdownContent__2JuyX th:last-child{border-top-right-radius:12px}.MarkdownContent-module_citation__11SMw{background:#e7f1ff;border-radius:4px;color:#007bff;cursor:default;display:inline-block;font-size:.7em;font-weight:700;margin:0 2px;padding:0 4px;user-select:none;vertical-align:super}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUNJLGFBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGVBQ0osQ0FFQSxpREFDSSxjQUNKLENBRUEsa0RBQ0ksZUFBZ0IsQ0FDaEIsZ0JBQ0osQ0FFQSxrREFDSSxrQkFBbUIsQ0FDbkIsZ0JBQ0osQ0FFQSxxTkFNSSxpQkFBa0IsQ0FEbEIsa0JBQW1CLENBRG5CLGVBR0osQ0FFQSxtREFJSSxlQUFxQixDQUZyQixXQUFZLENBQ1osZUFBZ0IsQ0FJaEIsVUFBVyxDQU5YLGFBQWMsQ0FJZCxpQkFBa0IsQ0FDbEIsbUJBQW9CLENBRXBCLFdBQ0osQ0FFQSwwREFJSSxvQkFBcUIsQ0FGckIsV0FBWSxDQUNaLGVBQWdCLENBSWhCLFVBQVcsQ0FOWCxhQUFjLENBSWQsaUJBQWtCLENBQ2xCLG1CQUFvQixDQUVwQixXQUNKLENBRUEsb0RBTUksb0JBQXFCLENBRnJCLFdBQVksQ0FDWixlQUFnQixDQUloQixhQUFjLENBUmQsb0JBQXFCLENBTXJCLGlCQUFrQixDQUNsQixtQkFBb0IsQ0FOcEIsUUFBUyxDQUNULFNBT0osQ0FFQSx3REFDSSwwQkFBMkIsQ0FDM0IsaUJBQ0osQ0FFQSw4RkFDSSxrQkFBbUIsQ0FLbkIsb0JBQXFCLENBQ3JCLG9DQUF5QyxDQUx6QyxhQUFjLENBTWQsOERBQTJFLENBTDNFLGNBQWUsQ0FDZixlQUFnQixDQUNoQixlQUlKLENBQ0EsbUdBQ0kseUJBQTJCLENBSzNCLHFCQUF1QixDQUN2Qix5QkFBMkIsQ0FMM0IsdUJBQXlCLENBU3pCLGFBQWMsQ0FSZCw2QkFBK0IsQ0FDL0IsMkJBQTZCLENBTTdCLGVBQWdCLENBTGhCLG1CQUFxQixDQUdyQixlQUFnQixDQUNoQixxQkFHSixDQUNBLHFEQUtJLGtCQUFtQixDQUhuQix3QkFBeUIsQ0FDekIsZ0JBQWlCLENBS2pCLG9DQUF5QyxDQUV6QyxhQUFjLENBRGQsY0FBZSxDQUxmLGFBQWMsQ0FIZCxVQVVKLENBQ0Esb0dBTUksZUFBZ0IsQ0FIaEIsK0JBQWdDLENBRWhDLGFBQWMsQ0FIZCxpQkFBa0IsQ0FFbEIsZUFHSixDQUNBLGtEQUNJLHFEQUE2RCxDQUc3RCwrQkFBZ0MsQ0FEaEMsYUFBYyxDQURkLGVBR0osQ0FDQSxnRUFDSSxrQkFDSixDQUNBLG1FQUNJLGtCQUNKLENBQ0EsMkRBQ0ksa0JBQW1CLENBQ25CLHlCQUNKLENBQ0EscURBQ0ksa0JBQW1CLENBQ25CLGVBQ0osQ0FDQSw0SEFFSSwyQkFDSixDQUNBLDBIQUVJLDRCQUNKLENBRUEsd0NBTUksa0JBQW1CLENBRW5CLGlCQUFrQixDQUhsQixhQUFjLENBS2QsY0FBZSxDQVRmLG9CQUFxQixDQUVyQixjQUFnQixDQUNoQixlQUFpQixDQUtqQixZQUFhLENBRmIsYUFBYyxDQUlkLGdCQUFpQixDQVRqQixvQkFVSiIsImZpbGUiOiJNYXJrZG93bkNvbnRlbnQubW9kdWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5NYXJrZG93bkNvbnRlbnQgaDEge1xuICAgIGZvbnQtc2l6ZTogMmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgyIHtcbiAgICBmb250LXNpemU6IDEuNzVlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMyB7XG4gICAgZm9udC1zaXplOiAxLjVlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNCB7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDUge1xuICAgIGZvbnQtc2l6ZTogMS4xZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcCB7XG4gICAgdGV4dC13cmFwOiBhdXRvO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IG9sIHtcbiAgICBsaXN0LXN0eWxlOiBkZWNpbWFsO1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyxcbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBwcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6ICMwMDAwMDBmZjtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgcGFkZGluZzogMWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGJsb2NrcXVvdGUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6ICNmZmZmZmZjYztcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICMwMDA7XG4gICAgcGFkZGluZzogMWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiAjY2NjY2NjNTU7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwY2M7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sge1xuICAgIGJhY2tncm91bmQ6ICMxODFjMjM7XG4gICAgY29sb3I6ICNmOGZhZmM7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjY7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBib3JkZXItY29sb3I6ICMyMzI3MmY7XG4gICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgZm9udC1mYW1pbHk6ICdGaXJhIE1vbm8nLCAnTWVubG8nLCAnQ29uc29sYXMnLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xufVxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIGNvZGUge1xuICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgbWFyZ2luOiAxNnB4IDA7XG4gICAgYmFja2dyb3VuZDogI2Y4ZmFmYzsgLyogU3Ryb25nZXIgbGlnaHQgYmFja2dyb3VuZCBmb3IgY29udHJhc3QgKi9cbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGNvbG9yOiAjMTcyMjNiOyAvKiBEYXJrIHRleHQgZm9yIGNvbnRyYXN0ICovXG59XG4uTWFya2Rvd25Db250ZW50IHRoLFxuLk1hcmtkb3duQ29udGVudCB0ZCB7XG4gICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDFkYmU4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgY29sb3I6ICMxNzIyM2I7IC8qIEVuc3VyZSBzdHJvbmcgdGV4dCBjb2xvciBmb3IgYWxsIGNlbGxzICovXG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdGgge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgI2VhZjNmYSA4MCUsICNkMWUzZjggMTAwJSk7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBjb2xvcjogIzE3MjIzYjsgLyogU3Ryb25nIGhlYWRlciB0ZXh0ICovXG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNiNWM3ZGU7XG59XG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG4uTWFya2Rvd25Db250ZW50IHRyOm50aC1jaGlsZChldmVuKSB0ZCB7XG4gICAgYmFja2dyb3VuZDogI2VhZjNmYTtcbn1cbi5NYXJrZG93bkNvbnRlbnQgdHI6aG92ZXIgdGQge1xuICAgIGJhY2tncm91bmQ6ICNjYmUwZjc7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xufVxuLk1hcmtkb3duQ29udGVudCB0YWJsZSB7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLk1hcmtkb3duQ29udGVudCB0aDpmaXJzdC1jaGlsZCxcbi5NYXJrZG93bkNvbnRlbnQgdGQ6Zmlyc3QtY2hpbGQge1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDEycHg7XG59XG4uTWFya2Rvd25Db250ZW50IHRoOmxhc3QtY2hpbGQsXG4uTWFya2Rvd25Db250ZW50IHRkOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMnB4O1xufVxuXG4uY2l0YXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgZm9udC1zaXplOiAwLjdlbTtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBjb2xvcjogIzAwN2JmZjtcbiAgICBiYWNrZ3JvdW5kOiAjZTdmMWZmO1xuICAgIHBhZGRpbmc6IDAgNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLyoqXG4gKiBUT0RPOiBb8J+MiV0gRFJZIE1hcmtkb3duIHByaW1pdGl2ZXMgc3R5bGluZ1xuICovXG4iXX0= */";
7504
7719
  var styles$5 = {"MarkdownContent":"MarkdownContent-module_MarkdownContent__2JuyX","chat-code-block":"MarkdownContent-module_chat-code-block__ZffFg","citation":"MarkdownContent-module_citation__11SMw"};
7505
7720
  styleInject(css_248z$6);
@@ -7602,32 +7817,8 @@
7602
7817
  }
7603
7818
  try {
7604
7819
  const processedMarkdown = renderMathInMarkdown(markdown);
7605
- let html = chatMarkdownConverter.makeHtml(processedMarkdown);
7606
- if (typeof window === 'undefined') {
7607
- html = html.replace(/<pre><code( class="language-([^"]+)")?>([\s\S]*?)<\/code><\/pre>/g, (match, _langClass, lang, code) => {
7608
- const decoded = code
7609
- .replace(/&/g, '&')
7610
- .replace(/</g, '<')
7611
- .replace(/>/g, '>')
7612
- .replace(/"/g, '"')
7613
- .replace(/&#39;/g, "'");
7614
- const highlighted = lang
7615
- ? hljs__default["default"].highlight(decoded, { language: lang }).value
7616
- : hljs__default["default"].highlightAuto(decoded).value;
7617
- return `<pre class="chat-code-block"><code class="hljs${lang ? ' language-' + lang : ''}">${highlighted}</code></pre>`;
7618
- });
7619
- }
7620
- else {
7621
- if (html.match(/<pre><code/)) {
7622
- const cssId = 'hljs-github-dark-css';
7623
- if (!window.document.getElementById(cssId)) {
7624
- const link = window.document.createElement('link');
7625
- link.id = cssId;
7626
- link.rel = 'stylesheet';
7627
- link.href = 'https://book-components.ptbk.io/cdn/highlightjs/github-dark.css';
7628
- window.document.head.appendChild(link);
7629
- }
7630
- }
7820
+ const html = chatMarkdownConverter.makeHtml(processedMarkdown);
7821
+ if (typeof window !== 'undefined') {
7631
7822
  if (html.match(/class="katex/)) {
7632
7823
  const katexCssId = 'katex-css';
7633
7824
  if (!window.document.getElementById(katexCssId)) {
@@ -7638,38 +7829,6 @@
7638
7829
  window.document.head.appendChild(link);
7639
7830
  }
7640
7831
  }
7641
- const parser = new window.DOMParser();
7642
- const doc = parser.parseFromString(html, 'text/html');
7643
- doc.querySelectorAll('pre > code').forEach((codeEl) => {
7644
- var _a;
7645
- const preEl = codeEl.parentElement;
7646
- if (!preEl)
7647
- return;
7648
- const lang = (_a = Array.from(codeEl.classList)
7649
- .find((cls) => cls.startsWith('language-'))) === null || _a === void 0 ? void 0 : _a.replace('language-', '');
7650
- const code = codeEl.innerHTML;
7651
- let highlighted = '';
7652
- try {
7653
- const decoded = code
7654
- .replace(/&/g, '&')
7655
- .replace(/</g, '<')
7656
- .replace(/>/g, '>')
7657
- .replace(/"/g, '"')
7658
- .replace(/&#39;/g, "'");
7659
- highlighted = lang
7660
- ? hljs__default["default"].highlight(decoded, { language: lang }).value
7661
- : hljs__default["default"].highlightAuto(decoded).value;
7662
- }
7663
- catch (_b) {
7664
- highlighted = code;
7665
- }
7666
- codeEl.innerHTML = highlighted;
7667
- codeEl.classList.add('hljs');
7668
- if (lang)
7669
- codeEl.classList.add(`language-${lang}`);
7670
- preEl.classList.add('chat-code-block');
7671
- });
7672
- html = doc.body.innerHTML;
7673
7832
  }
7674
7833
  const sanitizedHtml = html
7675
7834
  .replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
@@ -7699,9 +7858,50 @@
7699
7858
  * @public exported from `@promptbook/components`
7700
7859
  */
7701
7860
  function MarkdownContent(props) {
7702
- const { content, className } = props;
7861
+ const { content, className, onCreateAgent } = props;
7703
7862
  const htmlContent = react.useMemo(() => renderMarkdown(content), [content]);
7704
- return (jsxRuntime.jsx("div", { className: classNames(styles$5.MarkdownContent, className), dangerouslySetInnerHTML: {
7863
+ const containerRef = react.useRef(null);
7864
+ const rootsRef = react.useRef([]);
7865
+ react.useEffect(() => {
7866
+ // Cleanup previous roots
7867
+ rootsRef.current.forEach((root) => root.unmount());
7868
+ rootsRef.current = [];
7869
+ if (!containerRef.current) {
7870
+ return;
7871
+ }
7872
+ const preElements = containerRef.current.querySelectorAll('pre');
7873
+ preElements.forEach((pre) => {
7874
+ // Check if it is a code block (has code element)
7875
+ const codeElement = pre.querySelector('code');
7876
+ if (!codeElement) {
7877
+ return;
7878
+ }
7879
+ // Get language and code
7880
+ const className = codeElement.className; // e.g. language-python
7881
+ const match = className.match(/language-([^\s]+)/);
7882
+ const language = match ? match[1] : undefined;
7883
+ const code = codeElement.textContent || '';
7884
+ // Clear the pre element content
7885
+ pre.innerHTML = '';
7886
+ pre.className = ''; // remove existing classes if any
7887
+ pre.style.background = 'none'; // reset styles
7888
+ pre.style.padding = '0';
7889
+ pre.style.margin = '0';
7890
+ pre.style.overflow = 'visible';
7891
+ // Create a container for the CodeBlock
7892
+ const mountPoint = document.createElement('div');
7893
+ pre.appendChild(mountPoint);
7894
+ // Render CodeBlock
7895
+ const root = client.createRoot(mountPoint);
7896
+ root.render(jsxRuntime.jsx(CodeBlock, { code: code, language: language, onCreateAgent: onCreateAgent }));
7897
+ rootsRef.current.push(root);
7898
+ });
7899
+ return () => {
7900
+ rootsRef.current.forEach((root) => root.unmount());
7901
+ rootsRef.current = [];
7902
+ };
7903
+ }, [htmlContent, onCreateAgent]);
7904
+ return (jsxRuntime.jsx("div", { ref: containerRef, className: classNames(styles$5.MarkdownContent, className), dangerouslySetInnerHTML: {
7705
7905
  __html: htmlContent,
7706
7906
  } }));
7707
7907
  }
@@ -7918,6 +8118,16 @@
7918
8118
  }, children: [icon, jsxRuntime.jsx("span", { children: name })] }, name))) }))] }));
7919
8119
  }
7920
8120
 
8121
+ const MenuHoistingContext = react.createContext(null);
8122
+ /**
8123
+ * Hook to use the menu hoisting system
8124
+ *
8125
+ * @private mechanism inside Promptbook
8126
+ */
8127
+ function useMenuHoisting() {
8128
+ return react.useContext(MenuHoistingContext);
8129
+ }
8130
+
7921
8131
  /**
7922
8132
  *
7923
8133
  * @private Internal component used by `BookEditor`
@@ -7925,50 +8135,83 @@
7925
8135
  function BookEditorActionbar(props) {
7926
8136
  const { value, isDownloadButtonShown, isUploadButtonShown, isCameraButtonShown, isAboutButtonShown, isFullscreenButtonShown, onFullscreenClick, onUploadDocument, onTakePhoto, isFullscreen, } = props;
7927
8137
  const [isAboutModalOpen, setIsAboutModalOpen] = react.useState(false);
7928
- const handleDownload = () => {
7929
- const book = validateBook(value || DEFAULT_BOOK);
8138
+ const menuHoisting = useMenuHoisting();
8139
+ // Note: [1] We use ref to avoid re-creating the handleDownload function (and thus the actions array) on every value change
8140
+ const valueRef = react.useRef(value);
8141
+ react.useEffect(() => {
8142
+ valueRef.current = value;
8143
+ }, [value]);
8144
+ const handleDownload = react.useCallback(() => {
8145
+ const book = validateBook(valueRef.current || DEFAULT_BOOK);
7930
8146
  /* not await */ $induceBookDownload(book);
7931
- };
7932
- const actions = [];
7933
- if (isUploadButtonShown && onUploadDocument) {
7934
- actions.push({
7935
- icon: jsxRuntime.jsx(AttachmentIcon, {}),
7936
- name: 'Upload document',
7937
- onClick: onUploadDocument,
7938
- });
7939
- }
7940
- if (isCameraButtonShown && onTakePhoto) {
7941
- actions.push({
7942
- icon: jsxRuntime.jsx(CameraIcon, {}),
7943
- name: 'Take photo',
7944
- onClick: onTakePhoto,
7945
- });
7946
- }
7947
- if (isDownloadButtonShown) {
7948
- actions.push({
7949
- icon: jsxRuntime.jsx(DownloadIcon, {}),
7950
- name: 'Download',
7951
- onClick: handleDownload,
7952
- });
7953
- }
7954
- if (isAboutButtonShown) {
7955
- actions.push({
7956
- icon: jsxRuntime.jsx(AboutIcon, {}),
7957
- name: 'About',
7958
- onClick: () => setIsAboutModalOpen(true),
7959
- });
7960
- }
7961
- if (isFullscreenButtonShown && onFullscreenClick) {
7962
- actions.push({
7963
- icon: jsxRuntime.jsx(FullscreenIcon, {}),
7964
- name: 'Fullscreen',
7965
- onClick: onFullscreenClick,
7966
- });
7967
- }
8147
+ }, []);
8148
+ const actions = react.useMemo(() => {
8149
+ const _actions = [];
8150
+ if (isUploadButtonShown && onUploadDocument) {
8151
+ _actions.push({
8152
+ icon: jsxRuntime.jsx(AttachmentIcon, {}),
8153
+ name: 'Upload document',
8154
+ onClick: onUploadDocument,
8155
+ });
8156
+ }
8157
+ if (isCameraButtonShown && onTakePhoto) {
8158
+ _actions.push({
8159
+ icon: jsxRuntime.jsx(CameraIcon, {}),
8160
+ name: 'Take photo',
8161
+ onClick: onTakePhoto,
8162
+ });
8163
+ }
8164
+ if (isDownloadButtonShown) {
8165
+ _actions.push({
8166
+ icon: jsxRuntime.jsx(DownloadIcon, {}),
8167
+ name: 'Download',
8168
+ onClick: handleDownload,
8169
+ });
8170
+ }
8171
+ if (isAboutButtonShown) {
8172
+ _actions.push({
8173
+ icon: jsxRuntime.jsx(AboutIcon, {}),
8174
+ name: 'About',
8175
+ onClick: () => setIsAboutModalOpen(true),
8176
+ });
8177
+ }
8178
+ if (isFullscreenButtonShown && onFullscreenClick) {
8179
+ _actions.push({
8180
+ icon: jsxRuntime.jsx(FullscreenIcon, {}),
8181
+ name: 'Fullscreen',
8182
+ onClick: onFullscreenClick,
8183
+ });
8184
+ }
8185
+ return _actions;
8186
+ }, [
8187
+ isUploadButtonShown,
8188
+ onUploadDocument,
8189
+ isCameraButtonShown,
8190
+ onTakePhoto,
8191
+ isDownloadButtonShown,
8192
+ handleDownload,
8193
+ isAboutButtonShown,
8194
+ isFullscreenButtonShown,
8195
+ onFullscreenClick,
8196
+ ]);
8197
+ react.useEffect(() => {
8198
+ if (!menuHoisting || isFullscreen) {
8199
+ return;
8200
+ }
8201
+ menuHoisting.setMenu(actions);
8202
+ return () => {
8203
+ menuHoisting.setMenu([]);
8204
+ };
8205
+ }, [menuHoisting, actions, isFullscreen]);
7968
8206
  if (isFullscreen) {
7969
- return (jsxRuntime.jsx("div", { className: styles$6.bookEditorActionbar, children: jsxRuntime.jsx("button", { className: styles$6.button, onClick: onFullscreenClick, children: jsxRuntime.jsx(ExitFullscreenIcon, {}) }) }));
8207
+ return (jsxRuntime.jsx("div", { className: styles$7.bookEditorActionbar, children: jsxRuntime.jsx("button", { className: styles$7.button, onClick: onFullscreenClick, children: jsxRuntime.jsx(ExitFullscreenIcon, {}) }) }));
7970
8208
  }
7971
- return (jsxRuntime.jsxs("div", { className: styles$6.bookEditorActionbar, children: [actions.length >= 2 ? (jsxRuntime.jsx(Dropdown, { actions: actions })) : (actions.map(({ icon, name, onClick }) => (jsxRuntime.jsx("button", { className: styles$6.button, onClick: onClick, children: icon }, name)))), isAboutModalOpen && (jsxRuntime.jsx(Modal, { onClose: () => {
8209
+ if (menuHoisting && !isFullscreen) {
8210
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: isAboutModalOpen && (jsxRuntime.jsx(Modal, { onClose: () => {
8211
+ setIsAboutModalOpen(false);
8212
+ }, children: jsxRuntime.jsx(AboutPromptbookInformation, {}) })) }));
8213
+ }
8214
+ return (jsxRuntime.jsxs("div", { className: styles$7.bookEditorActionbar, children: [actions.length >= 2 ? (jsxRuntime.jsx(Dropdown, { actions: actions })) : (actions.map(({ icon, name, onClick }) => (jsxRuntime.jsx("button", { className: styles$7.button, onClick: onClick, children: icon }, name)))), isAboutModalOpen && (jsxRuntime.jsx(Modal, { onClose: () => {
7972
8215
  setIsAboutModalOpen(false);
7973
8216
  }, children: jsxRuntime.jsx(AboutPromptbookInformation, {}) }))] }));
7974
8217
  }
@@ -8080,6 +8323,7 @@
8080
8323
  const parameterRegex = /@([a-zA-Z0-9_รก-ลพร-ลฝฤ-ล™ฤŒ-ล˜ลก-ลพล -ลฝะฐ-ัะ-ะฏั‘ะ]+)/;
8081
8324
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
8082
8325
  const bookRules = [
8326
+ [/^---[-]*$/, ''],
8083
8327
  [parameterRegex, 'parameter'],
8084
8328
  [/\{[^}]+\}/, 'parameter'],
8085
8329
  [commitmentRegex, 'commitment'],
@@ -8088,7 +8332,12 @@
8088
8332
  const tokenProvider = monaco.languages.setMonarchTokensProvider(BOOK_LANGUAGE_ID, {
8089
8333
  ignoreCase: true,
8090
8334
  tokenizer: {
8091
- root: [[/^.*$/, 'title', '@body']],
8335
+ root: [
8336
+ [/^\s*$/, 'empty'],
8337
+ [/^-*$/, 'line'],
8338
+ [/^.*$/, 'title', '@body'],
8339
+ [commitmentRegex, 'commitment'],
8340
+ ],
8092
8341
  body: bookRules,
8093
8342
  },
8094
8343
  });
@@ -8306,7 +8555,7 @@
8306
8555
  event.preventDefault();
8307
8556
  setIsDragOver(false);
8308
8557
  }, []);
8309
- return (jsxRuntime.jsxs("div", { className: classNames(styles$6.bookEditorContainer, instanceClass), onDrop: handleDrop, onDragOver: handleDragOver, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, children: [(isUploadButtonShown ||
8558
+ return (jsxRuntime.jsxs("div", { className: classNames(styles$7.bookEditorContainer, instanceClass), onDrop: handleDrop, onDragOver: handleDragOver, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, children: [(isUploadButtonShown ||
8310
8559
  isCameraButtonShown ||
8311
8560
  isDownloadButtonShown ||
8312
8561
  isAboutButtonShown ||
@@ -8319,7 +8568,7 @@
8319
8568
  onFullscreenClick,
8320
8569
  onUploadDocument: handleUploadDocument,
8321
8570
  onTakePhoto: handleTakePhoto,
8322
- isFullscreen })), jsxRuntime.jsx("input", { type: "file", ref: fileUploadInputRef, style: { display: 'none' }, onChange: handleFileInputChange, multiple: true }), jsxRuntime.jsx("input", { type: "file", ref: cameraInputRef, style: { display: 'none' }, accept: "image/*", capture: "environment", onChange: handleFileInputChange }), isDragOver && jsxRuntime.jsx("div", { className: styles$6.dropOverlay, children: "Drop files to upload" }), jsxRuntime.jsxs("div", { style: {
8571
+ isFullscreen })), jsxRuntime.jsx("input", { type: "file", ref: fileUploadInputRef, style: { display: 'none' }, onChange: handleFileInputChange, multiple: true }), jsxRuntime.jsx("input", { type: "file", ref: cameraInputRef, style: { display: 'none' }, accept: "image/*", capture: "environment", onChange: handleFileInputChange }), isDragOver && jsxRuntime.jsx("div", { className: styles$7.dropOverlay, children: "Drop files to upload" }), jsxRuntime.jsxs("div", { style: {
8323
8572
  position: 'relative',
8324
8573
  flex: 1,
8325
8574
  height: '100%',
@@ -8384,7 +8633,7 @@
8384
8633
  arrowSize: 0,
8385
8634
  useShadows: false,
8386
8635
  },
8387
- }, loading: jsxRuntime.jsx("div", { className: styles$6.loading, children: "\uD83D\uDCD6" }) })] })] }));
8636
+ }, loading: jsxRuntime.jsx("div", { className: styles$7.loading, children: "\uD83D\uDCD6" }) })] })] }));
8388
8637
  }
8389
8638
 
8390
8639
  /**
@@ -8406,7 +8655,7 @@
8406
8655
  const handleFullscreenToggle = () => {
8407
8656
  setIsFullscreen(!isFullscreen);
8408
8657
  };
8409
- const editorContent = (jsxRuntime.jsx("div", { "data-book-component": "BookEditor", className: classNames(styles$6.BookEditor, isVerbose && styles$6.isVerbose, styles$6.bookEditorWrapper, isBorderRadiusDisabled && styles$6.isBorderRadiusDisabled, isFullscreen && styles$6.fullscreen, className), style: isFullscreen
8658
+ const editorContent = (jsxRuntime.jsx("div", { "data-book-component": "BookEditor", className: classNames(styles$7.BookEditor, isVerbose && styles$7.isVerbose, styles$7.bookEditorWrapper, isBorderRadiusDisabled && styles$7.isBorderRadiusDisabled, isFullscreen && styles$7.fullscreen, className), style: isFullscreen
8410
8659
  ? style
8411
8660
  : {
8412
8661
  ...(style || {}),
@@ -8532,6 +8781,52 @@
8532
8781
  */
8533
8782
  const textColor = furthest(Color.get('white'), Color.from('black'));
8534
8783
 
8784
+ /**
8785
+ * Makes data url from color
8786
+ *
8787
+ * @public exported from `@promptbook/color`
8788
+ */
8789
+ function colorToDataUrl(color) {
8790
+ if (typeof color === 'string') {
8791
+ color = Color.fromHex(color);
8792
+ }
8793
+ return rgbDataURL(color.red, color.green, color.blue);
8794
+ }
8795
+ /**
8796
+ * Pixel GIF code adapted from https://stackoverflow.com/a/33919020/266535
8797
+ *
8798
+ * @private util of `colorToDataUrl`
8799
+ */
8800
+ const keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
8801
+ /**
8802
+ * Generates a base64-encoded triplet string
8803
+ *
8804
+ * @param e1 - The first element in the triplet.
8805
+ * @param e2 - The second element in the triplet.
8806
+ * @param e3 - The third element in the triplet.
8807
+ * @returns The base64-encoded triplet string.
8808
+ *
8809
+ * @private util of `colorToDataUrl`
8810
+ */
8811
+ const triplet = (e1, e2, e3) => keyStr.charAt(e1 >> 2) +
8812
+ keyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +
8813
+ keyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +
8814
+ keyStr.charAt(e3 & 63);
8815
+ /**
8816
+ * Converts RGB values to a data URL string
8817
+ *
8818
+ * @param r - The red channel value.
8819
+ * @param g - The green channel value.
8820
+ * @param b - The blue channel value.
8821
+ * @returns The RGB data URL string.
8822
+ *
8823
+ * @private util of `colorToDataUrl`
8824
+ */
8825
+ const rgbDataURL = (r, g, b) => `data:image/gif;base64,R0lGODlhAQABAPAA${triplet(0, r, g) + triplet(b, 255, 255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;
8826
+ /**
8827
+ * TODO: Make as functions NOT const
8828
+ */
8829
+
8535
8830
  /**
8536
8831
  * Restricts an Updatable to a (2) BehaviorSubject variant
8537
8832
  *
@@ -9014,15 +9309,15 @@
9014
9309
  ASSISTANT: '#ffb300',
9015
9310
  SYSTEM: '#888',
9016
9311
  };
9017
- const bgColor = participantColors[String(message.from)] || '#2b7cff';
9312
+ const bgColor = participantColors[String(message.sender)] || '#2b7cff';
9018
9313
  const textColor = getTextColor(bgColor);
9019
9314
  return spaceTrim__default["default"](`
9020
9315
  <div class="chat-message">
9021
9316
  <div class="avatar" style="background:${bgColor};color:${getTextColor(bgColor)};">
9022
- ${String(message.from)[0] || '?'}
9317
+ ${String(message.sender)[0] || '?'}
9023
9318
  </div>
9024
9319
  <div class="bubble" style="background:${bgColor};color:${textColor};">
9025
- <span class="from-label">${String(message.from)}:</span>
9320
+ <span class="from-label">${String(message.sender)}:</span>
9026
9321
  ${message.content}
9027
9322
  </div>
9028
9323
  </div>
@@ -9068,7 +9363,7 @@
9068
9363
  getContent: ({ messages }) => spaceTrim$1.spaceTrim(`
9069
9364
  ${messages
9070
9365
  .map((message) => spaceTrim$1.spaceTrim(`
9071
- **${message.from}:**
9366
+ **${message.sender}:**
9072
9367
 
9073
9368
  > ${message.content.replace(/\n/g, '\n> ')}
9074
9369
  `))
@@ -9258,8 +9553,8 @@
9258
9553
  *
9259
9554
  * @private internal subcomponent of `<Chat>` component
9260
9555
  */
9261
- const ChatMessageItem = react.memo(({ message, participant, participants, isLastMessage, onMessage, setExpandedMessageId, isExpanded, currentRating, handleRating, mode, isCopyButtonEnabled, isFeedbackEnabled, onCopy, }) => {
9262
- const avatarSrc = (participant === null || participant === void 0 ? void 0 : participant.avatarSrc) || '';
9556
+ const ChatMessageItem = react.memo(({ message, participant, participants, isLastMessage, onMessage, setExpandedMessageId, isExpanded, currentRating, handleRating, mode, isCopyButtonEnabled, isFeedbackEnabled, onCopy, onCreateAgent, }) => {
9557
+ const avatarSrc = (participant === null || participant === void 0 ? void 0 : participant.avatarSrc) || null;
9263
9558
  const [isAvatarTooltipVisible, setIsAvatarTooltipVisible] = react.useState(false);
9264
9559
  const [avatarTooltipPosition, setAvatarTooltipPosition] = react.useState(null);
9265
9560
  const hoverTimeoutRef = react.useRef(null);
@@ -9350,9 +9645,14 @@
9350
9645
  console.info('participant avatarSrc', avatarSrc);
9351
9646
  console.info('participant color', { color, colorOfText });
9352
9647
  console.groupEnd();
9353
- }, children: [avatarSrc && (jsxRuntime.jsxs("div", { ref: avatarRef, className: chatStyles.avatar, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onClick: showTooltip, children: [jsxRuntime.jsx("img", { width: AVATAR_SIZE, src: avatarSrc, alt: `Avatar of ${message.from.toString().toLocaleLowerCase()}`, style: {
9648
+ }, children: [avatarSrc && (jsxRuntime.jsxs("div", { ref: avatarRef, className: chatStyles.avatar, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onClick: showTooltip, children: [jsxRuntime.jsx("img", { width: AVATAR_SIZE, src: avatarSrc, alt: `Avatar of ${message.sender.toString().toLocaleLowerCase()}`, style: {
9354
9649
  '--avatar-bg-color': color.toHex(),
9650
+ objectFit: 'cover',
9651
+ objectPosition: '50% 20%',
9355
9652
  width: AVATAR_SIZE,
9653
+ height: AVATAR_SIZE,
9654
+ aspectRatio: '1 / 1',
9655
+ backgroundImage: `url(${colorToDataUrl(color)})`,
9356
9656
  } }), isAvatarTooltipVisible && (participant === null || participant === void 0 ? void 0 : participant.agentSource) && avatarTooltipPosition && (jsxRuntime.jsx(AvatarProfileTooltip, { ref: tooltipRef, agentSource: participant.agentSource, position: avatarTooltipPosition }))] })), jsxRuntime.jsxs("div", { className: chatStyles.messageText, style: {
9357
9657
  '--message-bg-color': color.toHex(),
9358
9658
  '--message-text-color': colorOfText.toHex(),
@@ -9401,7 +9701,7 @@
9401
9701
  ? ' ' + chatStyles.copiedTooltipLeft
9402
9702
  : tooltipAlign === 'right'
9403
9703
  ? ' ' + chatStyles.copiedTooltipRight
9404
- : ''), children: "Copied!" }))] }) })), message.isVoiceCall && (jsxRuntime.jsx("div", { className: chatStyles.voiceCallIndicator, children: jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsxRuntime.jsx("path", { d: "M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z" }) }) })), message.content === LOADING_INTERACTIVE_IMAGE ? (jsxRuntime.jsx(jsxRuntime.Fragment, {})) : (jsxRuntime.jsx("div", { ref: contentWithoutButtonsRef, children: jsxRuntime.jsx(MarkdownContent, { content: contentWithoutButtons }) })), !message.isComplete && jsxRuntime.jsx("span", { className: chatStyles.NonCompleteMessageFiller, children: '_'.repeat(70) }), shouldShowButtons && (jsxRuntime.jsx("div", { className: chatStyles.messageButtons, children: buttons.map((button, buttonIndex) => (jsxRuntime.jsx("button", { className: chatStyles.messageButton, onClick: (event) => {
9704
+ : ''), children: "Copied!" }))] }) })), message.isVoiceCall && (jsxRuntime.jsx("div", { className: chatStyles.voiceCallIndicator, children: jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsxRuntime.jsx("path", { d: "M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z" }) }) })), message.content === LOADING_INTERACTIVE_IMAGE ? (jsxRuntime.jsx(jsxRuntime.Fragment, {})) : (jsxRuntime.jsx("div", { ref: contentWithoutButtonsRef, children: jsxRuntime.jsx(MarkdownContent, { content: contentWithoutButtons, onCreateAgent: onCreateAgent }) })), !message.isComplete && jsxRuntime.jsx("span", { className: chatStyles.NonCompleteMessageFiller, children: '_'.repeat(70) }), shouldShowButtons && (jsxRuntime.jsx("div", { className: chatStyles.messageButtons, children: buttons.map((button, buttonIndex) => (jsxRuntime.jsx("button", { className: chatStyles.messageButton, onClick: (event) => {
9405
9705
  event.stopPropagation();
9406
9706
  if (onMessage) {
9407
9707
  onMessage(button.message);
@@ -9484,7 +9784,7 @@
9484
9784
  // isExperimental = false,
9485
9785
  // TODO: [๐Ÿ˜…]> isSaveButtonEnabled = false,
9486
9786
  // exportHeaderMarkdown,
9487
- participants = [], extraActions, actionsContainer, saveFormats, isSaveButtonEnabled = true, isCopyButtonEnabled = true, buttonColor: buttonColorRaw, onUseTemplate, } = props;
9787
+ participants = [], extraActions, actionsContainer, saveFormats, isSaveButtonEnabled = true, isCopyButtonEnabled = true, buttonColor: buttonColorRaw, onUseTemplate, onCreateAgent, } = props;
9488
9788
  const buttonColor = react.useMemo(() => Color.from(buttonColorRaw || '#0066cc'), [buttonColorRaw]);
9489
9789
  // Use the auto-scroll hook
9490
9790
  const { isAutoScrolling, chatMessagesRef, handleScroll, handleMessagesChange, scrollToBottom, isMobile: isMobileFromHook, } = useChatAutoScroll();
@@ -9699,7 +9999,7 @@
9699
9999
  }
9700
10000
  }, [ratingModalOpen, isMobile]);
9701
10001
  // Determine alignment for actions (Reset button) based on the first message
9702
- const firstMessageFromUser = ((_a = messages[0]) === null || _a === void 0 ? void 0 : _a.from) === 'USER';
10002
+ const firstMessageFromUser = ((_a = messages[0]) === null || _a === void 0 ? void 0 : _a.sender) === 'USER';
9703
10003
  const actionsAlignmentClass = firstMessageFromUser
9704
10004
  ? chatStyles.actions + ' ' + chatStyles.left
9705
10005
  : chatStyles.actions + ' ' + chatStyles.right;
@@ -9776,11 +10076,11 @@
9776
10076
  }
9777
10077
  return true;
9778
10078
  })() && chatStyles.hasActionsAndFirstMessageIsLong), ref: chatMessagesRef, onScroll: handleScroll, children: [postprocessedMessages.map((message, i) => {
9779
- const participant = participants.find((participant) => participant.name === message.from);
10079
+ const participant = participants.find((participant) => participant.name === message.sender);
9780
10080
  const isLastMessage = i === postprocessedMessages.length - 1;
9781
10081
  const isExpanded = expandedMessageId === message.id;
9782
10082
  const currentRating = messageRatings.get(message.id || message.content /* <-[๐Ÿ’ƒ] */) || 0;
9783
- return (jsxRuntime.jsx(ChatMessageItem, { message: message, participant: participant, participants: participants, isLastMessage: isLastMessage, onMessage: onMessage, setExpandedMessageId: setExpandedMessageId, isExpanded: isExpanded, currentRating: currentRating, handleRating: handleRating, mode: mode, isCopyButtonEnabled: isCopyButtonEnabled, isFeedbackEnabled: isFeedbackEnabled, onCopy: handleCopy }, message.id));
10083
+ return (jsxRuntime.jsx(ChatMessageItem, { message: message, participant: participant, participants: participants, isLastMessage: isLastMessage, onMessage: onMessage, setExpandedMessageId: setExpandedMessageId, isExpanded: isExpanded, currentRating: currentRating, handleRating: handleRating, mode: mode, isCopyButtonEnabled: isCopyButtonEnabled, isFeedbackEnabled: isFeedbackEnabled, onCopy: handleCopy, onCreateAgent: onCreateAgent }, message.id));
9784
10084
  }), jsxRuntime.jsx("div", {
9785
10085
  // Note: Extra space at bottom for input area
9786
10086
  style: { height: 100 } })] }), onMessage && (jsxRuntime.jsxs("div", { className: classNames(chatStyles.chatInput, useChatCssClassName('chatInput'), isDragOver && chatStyles.dragOver), ...(onFileUpload
@@ -9868,13 +10168,13 @@
9868
10168
  const idx = postprocessedMessages.findIndex((m) => m.id === selectedMessage.id);
9869
10169
  if (idx > 0) {
9870
10170
  const prev = postprocessedMessages[idx - 1];
9871
- if (prev.from === 'USER') {
10171
+ if (prev.sender === 'USER') {
9872
10172
  return prev.content;
9873
10173
  }
9874
10174
  }
9875
10175
  // fallback: find last USER message before selectedMessage
9876
10176
  for (let i = messages.findIndex((m) => m.id === selectedMessage.id) - 1; i >= 0; i--) {
9877
- if (messages[i].from === 'USER') {
10177
+ if (messages[i].sender === 'USER') {
9878
10178
  return messages[i].content;
9879
10179
  }
9880
10180
  }
@@ -9901,7 +10201,9 @@
9901
10201
  try {
9902
10202
  const serializableMessages = messages.map((message) => ({
9903
10203
  ...message,
9904
- date: (message.date || new Date()).toISOString(),
10204
+ createdAt: (typeof message.createdAt === 'string'
10205
+ ? new Date(message.createdAt)
10206
+ : message.createdAt || new Date()).toISOString(),
9905
10207
  }));
9906
10208
  const storageKey = this.STORAGE_PREFIX + persistenceKey;
9907
10209
  localStorage.setItem(storageKey, JSON.stringify(serializableMessages));
@@ -9924,7 +10226,7 @@
9924
10226
  // Convert date strings back to Date objects
9925
10227
  return serializableMessages.map((message) => ({
9926
10228
  ...message,
9927
- date: new Date(message.date),
10229
+ createdAt: new Date(message.createdAt),
9928
10230
  }));
9929
10231
  }
9930
10232
  catch (error) {
@@ -9977,7 +10279,7 @@
9977
10279
  const { llmTools, persistenceKey, onChange, onReset, initialMessages, sendMessage, userParticipantName = 'USER', llmParticipantName = 'ASSISTANT', autoExecuteMessage, buttonColor, ...restProps } = props;
9978
10280
  // Internal state management
9979
10281
  // DRY: Single factory for seeding initial messages (used on mount and after reset)
9980
- const buildInitialMessages = react.useCallback(() => (initialMessages ? [...initialMessages] : []), [initialMessages]);
10282
+ const buildInitialMessages = react.useCallback(() => initialMessages ? ([...initialMessages]) : ([]), [initialMessages]);
9981
10283
  const [messages, setMessages] = react.useState(() => buildInitialMessages());
9982
10284
  const [tasksProgress, setTasksProgress] = react.useState([]);
9983
10285
  const [isVoiceCalling, setIsVoiceCalling] = react.useState(false);
@@ -10070,17 +10372,19 @@
10070
10372
  setTasksProgress([{ id: taskId, name: 'Playing response...', progress: 100 }]);
10071
10373
  const now = Date.now();
10072
10374
  const userMessage = {
10375
+ // channel: 'PROMPTBOOK_CHAT',
10073
10376
  id: `user_${now}`,
10074
- date: new Date(),
10075
- from: userParticipantName,
10377
+ createdAt: new Date(),
10378
+ sender: userParticipantName,
10076
10379
  content: (result.userMessage || '(Voice message)'),
10077
10380
  isComplete: true,
10078
10381
  isVoiceCall: true,
10079
10382
  };
10080
10383
  const agentMessage = {
10384
+ // channel: 'PROMPTBOOK_CHAT',
10081
10385
  id: `agent_${now}`,
10082
- date: new Date(),
10083
- from: llmParticipantName,
10386
+ createdAt: new Date(),
10387
+ sender: llmParticipantName,
10084
10388
  content: (result.agentMessage || result.text),
10085
10389
  isComplete: true,
10086
10390
  isVoiceCall: true,
@@ -10177,9 +10481,10 @@
10177
10481
  hasUserInteractedRef.current = true;
10178
10482
  // Add user message
10179
10483
  const userMessage = {
10484
+ // channel: 'PROMPTBOOK_CHAT',
10180
10485
  id: `user_${Date.now()}`,
10181
- date: new Date(),
10182
- from: userParticipantName,
10486
+ createdAt: new Date(),
10487
+ sender: userParticipantName,
10183
10488
  content: messageContent,
10184
10489
  isComplete: true,
10185
10490
  };
@@ -10191,9 +10496,10 @@
10191
10496
  }
10192
10497
  // Add loading message for assistant
10193
10498
  const loadingMessage = {
10499
+ // channel: 'PROMPTBOOK_CHAT',
10194
10500
  id: `assistant_${Date.now()}`,
10195
- date: new Date(),
10196
- from: llmParticipantName,
10501
+ createdAt: new Date(),
10502
+ sender: llmParticipantName,
10197
10503
  content: 'Thinking...',
10198
10504
  isComplete: false,
10199
10505
  };
@@ -10224,9 +10530,10 @@
10224
10530
  if (llmTools.callChatModelStream) {
10225
10531
  result = await llmTools.callChatModelStream(prompt, (chunk) => {
10226
10532
  const assistantMessage = {
10533
+ // channel: 'PROMPTBOOK_CHAT',
10227
10534
  id: loadingMessage.id,
10228
- date: new Date(),
10229
- from: llmParticipantName,
10535
+ createdAt: new Date(),
10536
+ sender: llmParticipantName,
10230
10537
  content: chunk.content,
10231
10538
  isComplete: false,
10232
10539
  };
@@ -10247,9 +10554,10 @@
10247
10554
  setTasksProgress([{ id: taskId, name: 'Response generated', progress: 100 }]);
10248
10555
  // Replace loading message with actual response
10249
10556
  const assistantMessage = {
10557
+ // channel: 'PROMPTBOOK_CHAT',
10250
10558
  id: loadingMessage.id,
10251
- date: new Date(),
10252
- from: llmParticipantName,
10559
+ createdAt: new Date(),
10560
+ sender: llmParticipantName,
10253
10561
  content: result.content,
10254
10562
  isComplete: true,
10255
10563
  };
@@ -10268,9 +10576,10 @@
10268
10576
  console.error('Error calling LLM:', error);
10269
10577
  // Replace loading message with error message
10270
10578
  const errorMessage = {
10579
+ // channel: 'PROMPTBOOK_CHAT',
10271
10580
  id: loadingMessage.id,
10272
- date: new Date(),
10273
- from: llmParticipantName,
10581
+ createdAt: new Date(),
10582
+ sender: llmParticipantName,
10274
10583
  content: `Sorry, I encountered an error: ${error instanceof Error ? error.message : 'Unknown error'}`,
10275
10584
  isComplete: true,
10276
10585
  };
@@ -10337,7 +10646,8 @@
10337
10646
  return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(LlmChat, { title: title || `Chat with ${agent.meta.fullname || agent.agentName || 'Agent'}`, persistenceKey: persistenceKey || `agent-chat-${agent.agentName}`, userParticipantName: "USER", llmParticipantName: "AGENT" // <- TODO: [๐Ÿง ] Maybe dynamic agent id
10338
10647
  , initialMessages: [
10339
10648
  {
10340
- from: 'AGENT',
10649
+ // channel: 'PROMPTBOOK_CHAT',
10650
+ sender: 'AGENT',
10341
10651
  content: agent.initialMessage ||
10342
10652
  spaceTrim__default["default"](`
10343
10653
 
@@ -10615,7 +10925,7 @@
10615
10925
  if (delays.longPauseChance &&
10616
10926
  Math.random() < delays.longPauseChance &&
10617
10927
  i > 0 &&
10618
- originalMessages[i].from !== originalMessages[i - 1].from) {
10928
+ originalMessages[i].sender !== originalMessages[i - 1].sender) {
10619
10929
  await waitasecond.forTime(getDelay(delays.longPauseDuration, 2000));
10620
10930
  didLongPause = true;
10621
10931
  if (isCancelled)
@@ -10636,9 +10946,10 @@
10636
10946
  }
10637
10947
  // Show incomplete message first (for typing effect)
10638
10948
  const incompleteMessage = {
10949
+ // channel: 'PROMPTBOOK_CHAT',
10639
10950
  id: currentMessage.id,
10640
- date: currentMessage.date,
10641
- from: currentMessage.from,
10951
+ createdAt: currentMessage.createdAt,
10952
+ sender: currentMessage.sender,
10642
10953
  content: '',
10643
10954
  isComplete: false,
10644
10955
  expectedAnswer: currentMessage.expectedAnswer,
@@ -10656,9 +10967,10 @@
10656
10967
  currentContent += (wordIndex > 0 ? ' ' : '') + word;
10657
10968
  // Update the message with current content
10658
10969
  const updatingMessage = {
10970
+ // channel: 'PROMPTBOOK_CHAT',
10659
10971
  id: currentMessage.id,
10660
- date: currentMessage.date,
10661
- from: currentMessage.from,
10972
+ createdAt: currentMessage.createdAt,
10973
+ sender: currentMessage.sender,
10662
10974
  content: currentContent,
10663
10975
  isComplete: false,
10664
10976
  expectedAnswer: currentMessage.expectedAnswer,
@@ -10676,9 +10988,10 @@
10676
10988
  }
10677
10989
  // Mark message as complete
10678
10990
  const completeMessage = {
10991
+ // channel: 'PROMPTBOOK_CHAT',
10679
10992
  id: currentMessage.id,
10680
- date: currentMessage.date,
10681
- from: currentMessage.from,
10993
+ createdAt: currentMessage.createdAt,
10994
+ sender: currentMessage.sender,
10682
10995
  content: currentMessage.content,
10683
10996
  isComplete: true,
10684
10997
  expectedAnswer: currentMessage.expectedAnswer,
@@ -10930,6 +11243,12 @@
10930
11243
  callEmbeddingModel(prompt) {
10931
11244
  return this.callCommonModel(prompt);
10932
11245
  }
11246
+ /**
11247
+ * Calls the best available embedding model
11248
+ */
11249
+ callImageGenerationModel(prompt) {
11250
+ return this.callCommonModel(prompt);
11251
+ }
10933
11252
  // <- Note: [๐Ÿค–]
10934
11253
  /**
10935
11254
  * Calls the best available model
@@ -10956,6 +11275,11 @@
10956
11275
  continue llm;
10957
11276
  }
10958
11277
  return await llmExecutionTools.callEmbeddingModel(prompt);
11278
+ case 'IMAGE_GENERATION':
11279
+ if (llmExecutionTools.callImageGenerationModel === undefined) {
11280
+ continue llm;
11281
+ }
11282
+ return await llmExecutionTools.callImageGenerationModel(prompt);
10959
11283
  // <- case [๐Ÿค–]:
10960
11284
  default:
10961
11285
  throw new UnexpectedError(`Unknown model variant "${prompt.modelRequirements.modelVariant}" in ${llmExecutionTools.title}`);
@@ -12130,6 +12454,15 @@
12130
12454
  return promptResult;
12131
12455
  };
12132
12456
  }
12457
+ if (llmTools.callImageGenerationModel !== undefined) {
12458
+ proxyTools.callImageGenerationModel = async (prompt) => {
12459
+ // console.info('[๐Ÿš•] callImageGenerationModel through countTotalUsage');
12460
+ const promptResult = await llmTools.callImageGenerationModel(prompt);
12461
+ totalUsage = addUsage(totalUsage, promptResult.usage);
12462
+ spending.next(promptResult.usage);
12463
+ return promptResult;
12464
+ };
12465
+ }
12133
12466
  // <- Note: [๐Ÿค–]
12134
12467
  return proxyTools;
12135
12468
  }
@@ -13673,8 +14006,9 @@
13673
14006
  $ongoingTaskResult.$resultString = $ongoingTaskResult.$completionResult.content;
13674
14007
  break variant;
13675
14008
  case 'EMBEDDING':
14009
+ case 'IMAGE_GENERATION':
13676
14010
  throw new PipelineExecutionError(spaceTrim$1.spaceTrim((block) => `
13677
- Embedding model can not be used in pipeline
14011
+ ${modelRequirements.modelVariant} model can not be used in pipeline
13678
14012
 
13679
14013
  This should be catched during parsing
13680
14014
 
@@ -14990,7 +15324,12 @@
14990
15324
  };
14991
15325
  }
14992
15326
  // Apply each commitment in order using reduce-like pattern
14993
- for (const commitment of filteredCommitments) {
15327
+ for (let i = 0; i < filteredCommitments.length; i++) {
15328
+ const commitment = filteredCommitments[i];
15329
+ // CLOSED commitment should work only if its the last commitment in the book
15330
+ if (commitment.type === 'CLOSED' && i !== filteredCommitments.length - 1) {
15331
+ continue;
15332
+ }
14994
15333
  const definition = getCommitmentDefinition(commitment.type);
14995
15334
  if (definition) {
14996
15335
  try {
@@ -16005,7 +16344,7 @@
16005
16344
  let threadMessages = [];
16006
16345
  if ('thread' in prompt && Array.isArray(prompt.thread)) {
16007
16346
  threadMessages = prompt.thread.map((msg) => ({
16008
- role: msg.role === 'assistant' ? 'assistant' : 'user',
16347
+ role: msg.sender === 'assistant' ? 'assistant' : 'user',
16009
16348
  content: msg.content,
16010
16349
  }));
16011
16350
  }
@@ -16418,13 +16757,14 @@
16418
16757
  const modelName = currentModelRequirements.modelName || this.getDefaultImageGenerationModel().modelName;
16419
16758
  const modelSettings = {
16420
16759
  model: modelName,
16421
- // size: currentModelRequirements.size,
16422
- // quality: currentModelRequirements.quality,
16423
- // style: currentModelRequirements.style,
16760
+ size: currentModelRequirements.size,
16761
+ quality: currentModelRequirements.quality,
16762
+ style: currentModelRequirements.style,
16424
16763
  };
16425
16764
  const rawPromptContent = templateParameters(content, { ...parameters, modelName });
16426
16765
  const rawRequest = {
16427
16766
  ...modelSettings,
16767
+ size: modelSettings.size || '1024x1024',
16428
16768
  prompt: rawPromptContent,
16429
16769
  user: (_a = this.options.userId) === null || _a === void 0 ? void 0 : _a.toString(),
16430
16770
  response_format: 'url', // TODO: [๐Ÿง ] Maybe allow b64_json
@@ -17530,9 +17870,52 @@
17530
17870
  ${block(result.content)}
17531
17871
 
17532
17872
  `);
17873
+ // Extract knowledge
17874
+ let knowledgeBlock = '';
17875
+ try {
17876
+ const extractionPrompt = {
17877
+ title: 'Knowledge Extraction',
17878
+ modelRequirements: {
17879
+ modelVariant: 'CHAT',
17880
+ },
17881
+ content: spaceTrim__default["default"]((block) => `
17882
+ You are an AI agent that is learning from a conversation.
17883
+
17884
+ Here is the conversation so far:
17885
+
17886
+ User: ${block(prompt.content)}
17887
+ Agent: ${block(result.content)}
17888
+
17889
+ Extract any new knowledge, facts, or important information that should be remembered for future interactions.
17890
+ Format the output as a list of KNOWLEDGE blocks.
17891
+ If there is no new knowledge, return nothing.
17892
+
17893
+ Example output:
17894
+ KNOWLEDGE The user's name is Alice.
17895
+ KNOWLEDGE The project deadline is next Friday.
17896
+ `),
17897
+ pipelineUrl: 'https://github.com/webgptorg/promptbook/blob/main/prompts/knowledge-extraction.ptbk.md',
17898
+ parameters: {},
17899
+ };
17900
+ if (this.options.llmTools.callChatModel) {
17901
+ const extractionResult = await this.options.llmTools.callChatModel(extractionPrompt);
17902
+ const extractedContent = extractionResult.content;
17903
+ if (extractedContent.includes('KNOWLEDGE')) {
17904
+ knowledgeBlock = '\n\n' + spaceTrim__default["default"](extractedContent);
17905
+ }
17906
+ }
17907
+ else {
17908
+ // TODO: [๐Ÿง ] Fallback to callChatModelStream if callChatModel is not available
17909
+ }
17910
+ }
17911
+ catch (error) {
17912
+ if (this.options.isVerbose) {
17913
+ console.warn('Failed to extract knowledge', error);
17914
+ }
17915
+ }
17533
17916
  // Append to the current source
17534
17917
  const currentSource = this.agentSource.value;
17535
- const newSource = padBook(validateBook(spaceTrim__default["default"](currentSource) + '\n\n' + learningExample));
17918
+ const newSource = padBook(validateBook(spaceTrim__default["default"](currentSource) + '\n\n' + learningExample + knowledgeBlock));
17536
17919
  // Update the source (which will trigger the subscription and update the underlying tools)
17537
17920
  this.agentSource.next(newSource);
17538
17921
  return result;
@@ -17742,7 +18125,7 @@
17742
18125
  * TODO: !!! Agent on remote server
17743
18126
  */
17744
18127
 
17745
- var css_248z = ".PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl{bottom:20px;font-family:sans-serif;position:fixed;right:20px;z-index:10000}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa{align-items:center;background-color:#007bff;border-radius:30px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:#fff;cursor:pointer;display:flex;padding:10px 20px;position:relative;transition:transform .2s,box-shadow .2s}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa:hover{box-shadow:0 6px 16px rgba(0,0,0,.2);transform:translateY(-2px)}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationAvatar__OrK-R{background-color:#eee;border-radius:50%;height:32px;margin-right:10px;overflow:hidden;transform:translate(-10px) scale(1.3);width:32px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationAvatar__OrK-R img{height:100%;object-fit:cover;width:100%}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLabel__gvgCn{font-weight:700}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatus__QBwnt{border:2px solid #fff;border-radius:50%;bottom:12px;height:12px;left:40px;position:absolute;width:12px;z-index:10}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusConnected__w15ZJ{background-color:#57b660}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusPending__vtVxc{background-color:#9e9e9e}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusError__nu02u{background-color:#f44336}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl.PromptbookAgentSeamlessIntegration-module_open__rt5ey .PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa{display:none}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationWindow__6sxeZ{animation:PromptbookAgentSeamlessIntegration-module_promptbook-agent-slide-up__0dGVe .3s ease-out;background-color:#fff;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.2);display:flex;flex-direction:column;height:600px;max-height:80vh;overflow:hidden;width:380px}@keyframes PromptbookAgentSeamlessIntegration-module_promptbook-agent-slide-up__0dGVe{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B{align-items:center;background-color:#007bff;color:#fff;display:flex;justify-content:space-between;padding:15px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button{align-items:center!important;background:transparent!important;border:none!important;border-radius:50%!important;box-shadow:none!important;color:inherit!important;cursor:pointer;display:flex!important;height:32px!important;justify-content:center!important;margin:0 2px!important;min-width:32px!important;opacity:.8;padding:5px!important;transition:opacity .2s}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button:hover{background-color:hsla(0,0%,100%,.2)!important;opacity:1}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button span{display:none!important}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button svg{height:20px;width:20px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationTitle__D6p2j{font-size:1.1em;font-weight:700}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationClose__Ot41T{font-size:1.2em}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationContent__xqAns{display:flex;flex:1;flex-direction:column;overflow-y:auto;position:relative}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationError__RaBDa,.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLoading__OAqgE{align-items:center;color:#666;display:flex;flex:1;justify-content:center;padding:20px;text-align:center}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationError__RaBDa{color:#d32f2f}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationIframe__KX5iC{border:none;flex:1;height:100%;width:100%}@media (max-width:480px){.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl.PromptbookAgentSeamlessIntegration-module_open__rt5ey{bottom:0;left:0;right:0}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationWindow__6sxeZ{border-radius:0;height:100vh;max-height:100vh;width:100%}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRkFFSSxXQUFZLENBR1osc0JBQXVCLENBSnZCLGNBQWUsQ0FFZixVQUFXLENBQ1gsYUFFSixDQUVBLDJGQUVJLGtCQUFtQixDQUNuQix3QkFBeUIsQ0FFekIsa0JBQW1CLENBR25CLHFDQUEwQyxDQUoxQyxVQUFZLENBR1osY0FBZSxDQU5mLFlBQWEsQ0FLYixpQkFBa0IsQ0FJbEIsaUJBQWtCLENBRGxCLHVDQUVKLENBRUEsaUdBRUksb0NBQXlDLENBRHpDLDBCQUVKLENBRUEsMkZBTUkscUJBQXNCLENBSHRCLGlCQUFrQixDQURsQixXQUFZLENBR1osaUJBQWtCLENBRGxCLGVBQWdCLENBSWhCLHFDQUF5QyxDQVB6QyxVQVFKLENBRUEsK0ZBRUksV0FBWSxDQUNaLGdCQUFpQixDQUZqQixVQUdKLENBRUEsMEZBQ0ksZUFDSixDQUVBLDJGQUtJLHFCQUF1QixDQUR2QixpQkFBa0IsQ0FHbEIsV0FBWSxDQUpaLFdBQVksQ0FHWixTQUFVLENBTFYsaUJBQWtCLENBQ2xCLFVBQVcsQ0FNWCxVQUNKLENBRUEsb0dBQ0ksd0JBQ0osQ0FFQSxrR0FDSSx3QkFDSixDQUVBLGdHQUNJLHdCQUNKLENBUUEsc09BQ0ksWUFDSixDQUVBLDJGQVVJLGlHQUFrRCxDQU5sRCxxQkFBdUIsQ0FDdkIsa0JBQW1CLENBQ25CLG9DQUF5QyxDQUN6QyxZQUFhLENBQ2IscUJBQXNCLENBTnRCLFlBQWEsQ0FDYixlQUFnQixDQU1oQixlQUFnQixDQVJoQixXQVVKLENBRUEsc0ZBQ0ksR0FDSSxTQUFVLENBQ1YsMEJBQ0osQ0FDQSxHQUNJLFNBQVUsQ0FDVix1QkFDSixDQUNKLENBRUEsMkZBTUksa0JBQW1CLENBTG5CLHdCQUF5QixDQUN6QixVQUFZLENBRVosWUFBYSxDQUNiLDZCQUE4QixDQUY5QixZQUlKLENBTUEsa0dBV0ksNEJBQThCLENBVjlCLGdDQUFrQyxDQUNsQyxxQkFBdUIsQ0FhdkIsMkJBQTZCLENBWjdCLHlCQUEyQixDQUMzQix1QkFBeUIsQ0FDekIsY0FBZSxDQUtmLHNCQUF3QixDQUl4QixxQkFBdUIsQ0FGdkIsZ0NBQWtDLENBSGxDLHNCQUF3QixDQUl4Qix3QkFBMEIsQ0FQMUIsVUFBWSxDQUVaLHFCQUF1QixDQUR2QixzQkFTSixDQUVBLHdHQUVJLDZDQUFxRCxDQURyRCxTQUVKLENBR0EsdUdBQ0ksc0JBQ0osQ0FHQSxzR0FFSSxXQUFZLENBRFosVUFFSixDQUVBLDBGQUVJLGVBQWdCLENBRGhCLGVBRUosQ0FFQSwwRkFFSSxlQUNKLENBRUEsNEZBSUksWUFBYSxDQUhiLE1BQU8sQ0FJUCxxQkFBc0IsQ0FIdEIsZUFBZ0IsQ0FDaEIsaUJBR0osQ0FFQSxzTEFLSSxrQkFBbUIsQ0FHbkIsVUFBVyxDQUxYLFlBQWEsQ0FEYixNQUFPLENBRVAsc0JBQXVCLENBRXZCLFlBQWEsQ0FDYixpQkFFSixDQUVBLDBGQUNJLGFBQ0osQ0FFQSwyRkFHSSxXQUFZLENBQ1osTUFBTyxDQUZQLFdBQVksQ0FEWixVQUlKLENBRUEseUJBQ0ksMklBQ0ksUUFBUyxDQUVULE1BQU8sQ0FEUCxPQUVKLENBRUEsMkZBSUksZUFBZ0IsQ0FGaEIsWUFBYSxDQUNiLGdCQUFpQixDQUZqQixVQUlKLENBQ0oiLCJmaWxlIjoiUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbi5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDIwcHg7XG4gICAgcmlnaHQ6IDIwcHg7XG4gICAgei1pbmRleDogMTAwMDA7XG4gICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uQnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN2JmZjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMzBweDtcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycywgYm94LXNoYWRvdyAwLjJzO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25CdXR0b246aG92ZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25BdmF0YXIge1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcblxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMHB4LCAwKSBzY2FsZSgxLjMpO1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkF2YXRhciBpbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25MYWJlbCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uU3RhdHVzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICBsZWZ0OiA0MHB4O1xuICAgIGJvdHRvbTogMTJweDtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25TdGF0dXNDb25uZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1N2I2NjA7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uU3RhdHVzUGVuZGluZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25TdGF0dXNFcnJvciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcbn1cblxuLyogU3RhdGUgY2xhc3NlcyAoZW1wdHkgdG8gYWxsb3cgbW9kdWxlIG1hcHBpbmcpICovXG4ub3BlbiB7XG59XG4uY2xvc2VkIHtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ub3BlbiAuUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkJ1dHRvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25XaW5kb3cge1xuICAgIHdpZHRoOiAzODBweDtcbiAgICBoZWlnaHQ6IDYwMHB4O1xuICAgIG1heC1oZWlnaHQ6IDgwdmg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBhbmltYXRpb246IHByb21wdGJvb2stYWdlbnQtc2xpZGUtdXAgMC4zcyBlYXNlLW91dDtcbn1cblxuQGtleWZyYW1lcyBwcm9tcHRib29rLWFnZW50LXNsaWRlLXVwIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICB9XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3YmZmO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi8qIFxuICAgT3ZlcnJpZGUgY2hhdCBhY3Rpb24gYnV0dG9ucyB0byBsb29rIGxpa2UgdGhlIGNsb3NlIGJ1dHRvbiBcbiAgIHdoZW4gcmVuZGVyZWQgaW5zaWRlIHRoZSBoZWFkZXIgdmlhIHBvcnRhbFxuKi9cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIGJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMC44O1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcbiAgICBwYWRkaW5nOiA1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAgMnB4ICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIG1pbi13aWR0aDogMzJweCAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogMzJweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJSAhaW1wb3J0YW50O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkhlYWRlciBidXR0b246aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7XG59XG5cbi8qIEhpZGUgdGV4dCBsYWJlbHMgaW5zaWRlIGJ1dHRvbnMgaW4gaGVhZGVyIChOZXcgQ2hhdCwgU2F2ZSkgKi9cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi8qIEVuc3VyZSBTVkcgaWNvbnMgYXJlIHZpc2libGUgYW5kIHNpemVkIGNvcnJlY3RseSAqL1xuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25IZWFkZXIgYnV0dG9uIHN2ZyB7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvblRpdGxlIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBmb250LXNpemU6IDEuMWVtO1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkNsb3NlIHtcbiAgICAvKiBVc2Ugc2FtZSBzdHlsZXMgYXMgYWJvdmUgb3ZlcnJpZGUsIGJ1dCBrZWVwIHNwZWNpZmljIGlmIG5lZWRlZCAqL1xuICAgIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uQ29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uTG9hZGluZyxcbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uRXJyb3Ige1xuICAgIGZsZXg6IDE7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGNvbG9yOiAjNjY2O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkVycm9yIHtcbiAgICBjb2xvcjogI2QzMmYyZjtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25JZnJhbWUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZmxleDogMTtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7XG4gICAgLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ub3BlbiB7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25XaW5kb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxufVxuIl19 */";
18128
+ var css_248z = ".PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl{bottom:20px;font-family:sans-serif;position:fixed;right:20px;z-index:10000}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa{align-items:center;background-color:#007bff;border-radius:30px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:#fff;cursor:pointer;display:flex;padding:10px 20px;position:relative;transition:transform .2s,box-shadow .2s}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa:hover{box-shadow:0 6px 16px rgba(0,0,0,.2);transform:translateY(-2px)}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationAvatar__OrK-R{background-color:#eee;border-radius:50%;height:32px;margin-right:10px;overflow:hidden;transform:translate(-10px) scale(1.3);width:32px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationAvatar__OrK-R img{height:100%;object-fit:cover;width:100%}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLabel__gvgCn{font-weight:700}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatus__QBwnt{border:2px solid #fff;border-radius:50%;bottom:12px;height:12px;left:40px;position:absolute;width:12px;z-index:10}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusConnected__w15ZJ{background-color:#57b660}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusPending__vtVxc{background-color:#9e9e9e}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusError__nu02u{background-color:#f44336}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl.PromptbookAgentSeamlessIntegration-module_open__rt5ey .PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa{display:none}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationWindow__6sxeZ{animation:PromptbookAgentSeamlessIntegration-module_promptbook-agent-slide-up__0dGVe .3s ease-out;background-color:#fff;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.2);display:flex;flex-direction:column;height:600px;max-height:80vh;overflow:hidden;width:380px}@keyframes PromptbookAgentSeamlessIntegration-module_promptbook-agent-slide-up__0dGVe{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B{align-items:center;background-color:#007bff;color:#fff;display:flex;justify-content:space-between;padding:15px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button{align-items:center!important;background:transparent!important;border:none!important;border-radius:50%!important;box-shadow:none!important;color:inherit!important;cursor:pointer;display:flex!important;height:32px!important;justify-content:center!important;margin:0 2px!important;min-width:32px!important;opacity:.8;padding:5px!important;transition:opacity .2s}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button:hover{background-color:hsla(0,0%,100%,.2)!important;opacity:1}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button span{display:none!important}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B button svg{height:20px;width:20px}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationTitle__D6p2j{font-size:1.1em;font-weight:700}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationClose__Ot41T{font-size:1.2em}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationContent__xqAns{display:flex;flex:1;flex-direction:column;overflow-y:auto;position:relative}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationError__RaBDa,.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLoading__OAqgE{align-items:center;color:#666;display:flex;flex:1;justify-content:center;padding:20px;text-align:center}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationError__RaBDa{color:#d32f2f}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationIframe__KX5iC{border:none;height:100%;left:0;position:absolute;top:0;transition:opacity .2s ease-in-out;width:100%}@media (max-width:480px){.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl.PromptbookAgentSeamlessIntegration-module_open__rt5ey{bottom:0;left:0;right:0}.PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationWindow__6sxeZ{border-radius:0;height:100vh;max-height:100vh;width:100%}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRkFFSSxXQUFZLENBR1osc0JBQXVCLENBSnZCLGNBQWUsQ0FFZixVQUFXLENBQ1gsYUFFSixDQUVBLDJGQUVJLGtCQUFtQixDQUNuQix3QkFBeUIsQ0FFekIsa0JBQW1CLENBR25CLHFDQUEwQyxDQUoxQyxVQUFZLENBR1osY0FBZSxDQU5mLFlBQWEsQ0FLYixpQkFBa0IsQ0FJbEIsaUJBQWtCLENBRGxCLHVDQUVKLENBRUEsaUdBRUksb0NBQXlDLENBRHpDLDBCQUVKLENBRUEsMkZBTUkscUJBQXNCLENBSHRCLGlCQUFrQixDQURsQixXQUFZLENBR1osaUJBQWtCLENBRGxCLGVBQWdCLENBSWhCLHFDQUF5QyxDQVB6QyxVQVFKLENBRUEsK0ZBRUksV0FBWSxDQUNaLGdCQUFpQixDQUZqQixVQUdKLENBRUEsMEZBQ0ksZUFDSixDQUVBLDJGQUtJLHFCQUF1QixDQUR2QixpQkFBa0IsQ0FHbEIsV0FBWSxDQUpaLFdBQVksQ0FHWixTQUFVLENBTFYsaUJBQWtCLENBQ2xCLFVBQVcsQ0FNWCxVQUNKLENBRUEsb0dBQ0ksd0JBQ0osQ0FFQSxrR0FDSSx3QkFDSixDQUVBLGdHQUNJLHdCQUNKLENBUUEsc09BQ0ksWUFDSixDQUVBLDJGQVVJLGlHQUFrRCxDQU5sRCxxQkFBdUIsQ0FDdkIsa0JBQW1CLENBQ25CLG9DQUF5QyxDQUN6QyxZQUFhLENBQ2IscUJBQXNCLENBTnRCLFlBQWEsQ0FDYixlQUFnQixDQU1oQixlQUFnQixDQVJoQixXQVVKLENBRUEsc0ZBQ0ksR0FDSSxTQUFVLENBQ1YsMEJBQ0osQ0FDQSxHQUNJLFNBQVUsQ0FDVix1QkFDSixDQUNKLENBRUEsMkZBTUksa0JBQW1CLENBTG5CLHdCQUF5QixDQUN6QixVQUFZLENBRVosWUFBYSxDQUNiLDZCQUE4QixDQUY5QixZQUlKLENBTUEsa0dBV0ksNEJBQThCLENBVjlCLGdDQUFrQyxDQUNsQyxxQkFBdUIsQ0FhdkIsMkJBQTZCLENBWjdCLHlCQUEyQixDQUMzQix1QkFBeUIsQ0FDekIsY0FBZSxDQUtmLHNCQUF3QixDQUl4QixxQkFBdUIsQ0FGdkIsZ0NBQWtDLENBSGxDLHNCQUF3QixDQUl4Qix3QkFBMEIsQ0FQMUIsVUFBWSxDQUVaLHFCQUF1QixDQUR2QixzQkFTSixDQUVBLHdHQUVJLDZDQUFxRCxDQURyRCxTQUVKLENBR0EsdUdBQ0ksc0JBQ0osQ0FHQSxzR0FFSSxXQUFZLENBRFosVUFFSixDQUVBLDBGQUVJLGVBQWdCLENBRGhCLGVBRUosQ0FFQSwwRkFFSSxlQUNKLENBRUEsNEZBSUksWUFBYSxDQUhiLE1BQU8sQ0FJUCxxQkFBc0IsQ0FIdEIsZUFBZ0IsQ0FDaEIsaUJBR0osQ0FFQSxzTEFLSSxrQkFBbUIsQ0FHbkIsVUFBVyxDQUxYLFlBQWEsQ0FEYixNQUFPLENBRVAsc0JBQXVCLENBRXZCLFlBQWEsQ0FDYixpQkFFSixDQUVBLDBGQUNJLGFBQ0osQ0FFQSwyRkFNSSxXQUFZLENBRFosV0FBWSxDQUZaLE1BQU8sQ0FGUCxpQkFBa0IsQ0FDbEIsS0FBTSxDQUtOLGtDQUFvQyxDQUhwQyxVQUlKLENBRUEseUJBQ0ksMklBQ0ksUUFBUyxDQUVULE1BQU8sQ0FEUCxPQUVKLENBRUEsMkZBSUksZUFBZ0IsQ0FGaEIsWUFBYSxDQUNiLGdCQUFpQixDQUZqQixVQUlKLENBQ0oiLCJmaWxlIjoiUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbi5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDIwcHg7XG4gICAgcmlnaHQ6IDIwcHg7XG4gICAgei1pbmRleDogMTAwMDA7XG4gICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uQnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN2JmZjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMzBweDtcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycywgYm94LXNoYWRvdyAwLjJzO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25CdXR0b246aG92ZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25BdmF0YXIge1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcblxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMHB4LCAwKSBzY2FsZSgxLjMpO1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkF2YXRhciBpbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvYmplY3QtZml0OiBjb3Zlcjtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25MYWJlbCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uU3RhdHVzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICBsZWZ0OiA0MHB4O1xuICAgIGJvdHRvbTogMTJweDtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25TdGF0dXNDb25uZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1N2I2NjA7XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uU3RhdHVzUGVuZGluZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25TdGF0dXNFcnJvciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcbn1cblxuLyogU3RhdGUgY2xhc3NlcyAoZW1wdHkgdG8gYWxsb3cgbW9kdWxlIG1hcHBpbmcpICovXG4ub3BlbiB7XG59XG4uY2xvc2VkIHtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ub3BlbiAuUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkJ1dHRvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25XaW5kb3cge1xuICAgIHdpZHRoOiAzODBweDtcbiAgICBoZWlnaHQ6IDYwMHB4O1xuICAgIG1heC1oZWlnaHQ6IDgwdmg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBhbmltYXRpb246IHByb21wdGJvb2stYWdlbnQtc2xpZGUtdXAgMC4zcyBlYXNlLW91dDtcbn1cblxuQGtleWZyYW1lcyBwcm9tcHRib29rLWFnZW50LXNsaWRlLXVwIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICB9XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3YmZmO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi8qIFxuICAgT3ZlcnJpZGUgY2hhdCBhY3Rpb24gYnV0dG9ucyB0byBsb29rIGxpa2UgdGhlIGNsb3NlIGJ1dHRvbiBcbiAgIHdoZW4gcmVuZGVyZWQgaW5zaWRlIHRoZSBoZWFkZXIgdmlhIHBvcnRhbFxuKi9cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIGJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMC44O1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcbiAgICBwYWRkaW5nOiA1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAgMnB4ICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIG1pbi13aWR0aDogMzJweCAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogMzJweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJSAhaW1wb3J0YW50O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkhlYWRlciBidXR0b246aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7XG59XG5cbi8qIEhpZGUgdGV4dCBsYWJlbHMgaW5zaWRlIGJ1dHRvbnMgaW4gaGVhZGVyIChOZXcgQ2hhdCwgU2F2ZSkgKi9cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uSGVhZGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi8qIEVuc3VyZSBTVkcgaWNvbnMgYXJlIHZpc2libGUgYW5kIHNpemVkIGNvcnJlY3RseSAqL1xuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25IZWFkZXIgYnV0dG9uIHN2ZyB7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvblRpdGxlIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBmb250LXNpemU6IDEuMWVtO1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkNsb3NlIHtcbiAgICAvKiBVc2Ugc2FtZSBzdHlsZXMgYXMgYWJvdmUgb3ZlcnJpZGUsIGJ1dCBrZWVwIHNwZWNpZmljIGlmIG5lZWRlZCAqL1xuICAgIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uQ29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uTG9hZGluZyxcbi5Qcm9tcHRib29rQWdlbnRTZWFtbGVzc0ludGVncmF0aW9uRXJyb3Ige1xuICAgIGZsZXg6IDE7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGNvbG9yOiAjNjY2O1xufVxuXG4uUHJvbXB0Ym9va0FnZW50U2VhbWxlc3NJbnRlZ3JhdGlvbkVycm9yIHtcbiAgICBjb2xvcjogI2QzMmYyZjtcbn1cblxuLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25JZnJhbWUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLWluLW91dDtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7XG4gICAgLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb24ub3BlbiB7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLlByb21wdGJvb2tBZ2VudFNlYW1sZXNzSW50ZWdyYXRpb25XaW5kb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxufVxuIl19 */";
17746
18129
  var styles = {"PromptbookAgentSeamlessIntegration":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegration__KTAQl","PromptbookAgentSeamlessIntegrationButton":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationButton__beMWa","PromptbookAgentSeamlessIntegrationAvatar":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationAvatar__OrK-R","PromptbookAgentSeamlessIntegrationLabel":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLabel__gvgCn","PromptbookAgentSeamlessIntegrationStatus":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatus__QBwnt","PromptbookAgentSeamlessIntegrationStatusConnected":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusConnected__w15ZJ","PromptbookAgentSeamlessIntegrationStatusPending":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusPending__vtVxc","PromptbookAgentSeamlessIntegrationStatusError":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationStatusError__nu02u","open":"PromptbookAgentSeamlessIntegration-module_open__rt5ey","closed":"PromptbookAgentSeamlessIntegration-module_closed__VPHQ-","PromptbookAgentSeamlessIntegrationWindow":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationWindow__6sxeZ","promptbook-agent-slide-up":"PromptbookAgentSeamlessIntegration-module_promptbook-agent-slide-up__0dGVe","PromptbookAgentSeamlessIntegrationHeader":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationHeader__9ae8B","PromptbookAgentSeamlessIntegrationTitle":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationTitle__D6p2j","PromptbookAgentSeamlessIntegrationClose":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationClose__Ot41T","PromptbookAgentSeamlessIntegrationContent":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationContent__xqAns","PromptbookAgentSeamlessIntegrationLoading":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationLoading__OAqgE","PromptbookAgentSeamlessIntegrationError":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationError__RaBDa","PromptbookAgentSeamlessIntegrationIframe":"PromptbookAgentSeamlessIntegration-module_PromptbookAgentSeamlessIntegrationIframe__KX5iC"};
17747
18130
  styleInject(css_248z);
17748
18131
 
@@ -17756,10 +18139,14 @@
17756
18139
  const { agentUrl, meta, onOpenChange, className, style, isFocusedOnLoad, isIframeUsed = false } = props;
17757
18140
  const [isOpen, setIsOpen] = react.useState(false);
17758
18141
  const [headerElement, setHeaderElement] = react.useState(null);
18142
+ const [isIframeLoaded, setIsIframeLoaded] = react.useState(false);
17759
18143
  react.useEffect(() => {
17760
18144
  if (onOpenChange) {
17761
18145
  onOpenChange(isOpen);
17762
18146
  }
18147
+ if (!isOpen) {
18148
+ setIsIframeLoaded(false);
18149
+ }
17763
18150
  }, [isOpen, onOpenChange]);
17764
18151
  const [agent, setAgent] = react.useState(null);
17765
18152
  const [error, setError] = react.useState(null);
@@ -17802,7 +18189,8 @@
17802
18189
  // TODO: [๐Ÿง ] Handle error state (show error message in the chat window)
17803
18190
  const image = ((_a = agent === null || agent === void 0 ? void 0 : agent.meta) === null || _a === void 0 ? void 0 : _a.image) ||
17804
18191
  (meta === null || meta === void 0 ? void 0 : meta.image) ||
17805
- 'https://www.gravatar.com/avatar/00000000000000000000000000000000?d=mp&f=y';
18192
+ // Note: [๐Ÿคน] Using default avatar from the agent server
18193
+ `${agentUrl}/images/default-avatar.png`;
17806
18194
  const color = ((_b = agent === null || agent === void 0 ? void 0 : agent.meta) === null || _b === void 0 ? void 0 : _b.color) || (meta === null || meta === void 0 ? void 0 : meta.color);
17807
18195
  let connectionStatus = 'pending';
17808
18196
  if (agent) {
@@ -17815,7 +18203,7 @@
17815
18203
  ? styles.PromptbookAgentSeamlessIntegrationStatusConnected
17816
18204
  : connectionStatus === 'error'
17817
18205
  ? styles.PromptbookAgentSeamlessIntegrationStatusError
17818
- : styles.PromptbookAgentSeamlessIntegrationStatusPending}` }), jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationLabel, children: "CHAT" })] }), isOpen && (jsxRuntime.jsxs("div", { className: styles.PromptbookAgentSeamlessIntegrationWindow, children: [jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationHeader, style: { backgroundColor: color }, ref: setHeaderElement, children: jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationTitle, children: (agent === null || agent === void 0 ? void 0 : agent.meta.fullname) || (meta === null || meta === void 0 ? void 0 : meta.fullname) || (agent === null || agent === void 0 ? void 0 : agent.agentName) || 'Chat with Agent' }) }), jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationContent, children: isIframeUsed ? (jsxRuntime.jsx("iframe", { src: agentUrl + '/chat?headless', className: styles.PromptbookAgentSeamlessIntegrationIframe, tabIndex: -1 })) : agent ? (jsxRuntime.jsx(AgentChat, { agent: agent, actionsContainer: headerElement, isFocusedOnLoad: isFocusedOnLoad, extraActions: jsxRuntime.jsx("button", { className: styles.PromptbookAgentSeamlessIntegrationClose, onClick: () => setIsOpen(false), title: "Close", children: jsxRuntime.jsx(CloseIcon, {}) }) })) : error ? (jsxRuntime.jsxs("div", { className: styles.PromptbookAgentSeamlessIntegrationError, children: ["Failed to connect to agent: ", error.message] })) : (jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationLoading, children: "Connecting to agent..." })) })] }))] }));
18206
+ : styles.PromptbookAgentSeamlessIntegrationStatusPending}` }), jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationLabel, children: "CHAT" })] }), isOpen && (jsxRuntime.jsxs("div", { className: styles.PromptbookAgentSeamlessIntegrationWindow, children: [jsxRuntime.jsxs("div", { className: styles.PromptbookAgentSeamlessIntegrationHeader, style: { backgroundColor: color }, ref: setHeaderElement, children: [jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationTitle, children: (agent === null || agent === void 0 ? void 0 : agent.meta.fullname) || (meta === null || meta === void 0 ? void 0 : meta.fullname) || (agent === null || agent === void 0 ? void 0 : agent.agentName) || 'Chat with Agent' }), isIframeUsed && (jsxRuntime.jsx("button", { className: styles.PromptbookAgentSeamlessIntegrationClose, onClick: () => setIsOpen(false), title: "Close", children: jsxRuntime.jsx(CloseIcon, {}) }))] }), jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationContent, children: isIframeUsed ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!isIframeLoaded && (jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationLoading, children: "Loading chat..." })), jsxRuntime.jsx("iframe", { src: agentUrl + '/chat?headless', className: styles.PromptbookAgentSeamlessIntegrationIframe, style: { opacity: isIframeLoaded ? 1 : 0 }, tabIndex: -1, onLoad: () => setIsIframeLoaded(true) })] })) : agent ? (jsxRuntime.jsx(AgentChat, { agent: agent, actionsContainer: headerElement, isFocusedOnLoad: isFocusedOnLoad, extraActions: jsxRuntime.jsx("button", { className: styles.PromptbookAgentSeamlessIntegrationClose, onClick: () => setIsOpen(false), title: "Close", children: jsxRuntime.jsx(CloseIcon, {}) }) })) : error ? (jsxRuntime.jsxs("div", { className: styles.PromptbookAgentSeamlessIntegrationError, children: ["Failed to connect to agent: ", error.message] })) : (jsxRuntime.jsx("div", { className: styles.PromptbookAgentSeamlessIntegrationLoading, children: "Connecting to agent..." })) })] }))] }));
17819
18207
  }
17820
18208
 
17821
18209
  /**