@promptbook/components 0.112.0-114 → 0.112.0-117

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/index.es.js CHANGED
@@ -1,19 +1,17 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { spaceTrim as spaceTrim$1 } from 'spacetrim';
3
3
  import { useMemo, useState, createContext, useContext, useEffect, useRef, useCallback, useId, memo, forwardRef } from 'react';
4
- import { SHA256 } from 'crypto-js';
4
+ import CryptoJS from 'crypto-js';
5
5
  import hexEncoder from 'crypto-js/enc-hex';
6
6
  import { basename, join, dirname, isAbsolute } from 'path';
7
7
  import moment from 'moment';
8
8
  import { lookup, extension } from 'mime-types';
9
- import { randomBytes } from 'crypto';
10
9
  import { createPortal } from 'react-dom';
11
10
  import MonacoEditor, { useMonaco } from '@monaco-editor/react';
12
- import { Registration } from 'destroyable';
13
11
  import { BehaviorSubject, Subject } from 'rxjs';
14
12
  import createDOMPurify from 'dompurify';
15
13
  import katex from 'katex';
16
- import { Converter } from 'showdown';
14
+ import showdown from 'showdown';
17
15
  import { toCanvas } from 'html-to-image';
18
16
  import { jsPDF } from 'jspdf';
19
17
  import { createRoot } from 'react-dom/client';
@@ -21,7 +19,7 @@ import { Maximize2, X, Reply, Pause, Play, Volume2Icon, VolumeXIcon, VibrateIcon
21
19
  import 'moment/locale/cs';
22
20
  import { forTime } from 'waitasecond';
23
21
  import sha256 from 'crypto-js/sha256';
24
- import { parse, unparse } from 'papaparse';
22
+ import papaparse from 'papaparse';
25
23
  import { fileSearchTool, tool, Agent as Agent$1, webSearchTool, run, setDefaultOpenAIClient, setDefaultOpenAIKey } from '@openai/agents';
26
24
  import colors from 'colors';
27
25
  import Bottleneck from 'bottleneck';
@@ -42,7 +40,7 @@ const BOOK_LANGUAGE_VERSION = '2.0.0';
42
40
  * @generated
43
41
  * @see https://github.com/webgptorg/promptbook
44
42
  */
45
- const PROMPTBOOK_ENGINE_VERSION = '0.112.0-114';
43
+ const PROMPTBOOK_ENGINE_VERSION = '0.112.0-117';
46
44
  /**
47
45
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
48
46
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -7073,7 +7071,7 @@ function valueToString(value) {
7073
7071
  * @public exported from `@promptbook/utils`
7074
7072
  */
7075
7073
  function computeHash(value) {
7076
- return SHA256(hexEncoder.parse(spaceTrim$1(valueToString(value)))).toString( /* hex */);
7074
+ return CryptoJS.SHA256(hexEncoder.parse(spaceTrim$1(valueToString(value)))).toString( /* hex */);
7077
7075
  }
7078
7076
  // TODO: [🥬][🥬] Use this ACRY
7079
7077
 
@@ -18467,7 +18465,7 @@ function getTimeoutToolRuntimeAdapterOrDisabledResult(action, runtimeContext) {
18467
18465
  * @private internal helper function
18468
18466
  */
18469
18467
  function $randomToken(randomness) {
18470
- return randomBytes(randomness).toString('hex');
18468
+ return CryptoJS.lib.WordArray.random(randomness).toString(CryptoJS.enc.Hex);
18471
18469
  }
18472
18470
  // TODO: [🤶] Maybe export through `@promptbook/utils` or `@promptbook/random` package
18473
18471
  // TODO: Maybe use nanoid instead https://github.com/ai/nanoid
@@ -20588,7 +20586,7 @@ function parseAgentSourcePrelude(agentSource) {
20588
20586
  * Regex pattern to match horizontal lines (markdown thematic breaks)
20589
20587
  * Matches 3 or more hyphens, underscores, or asterisks (with optional spaces between)
20590
20588
  */
20591
- const HORIZONTAL_LINE_PATTERN$1 = /^[\s]*[-_*][\s]*[-_*][\s]*[-_*][\s]*[-_*]*[\s]*$/;
20589
+ const HORIZONTAL_LINE_PATTERN$2 = /^[\s]*[-_*][\s]*[-_*][\s]*[-_*][\s]*[-_*]*[\s]*$/;
20592
20590
  /**
20593
20591
  * Parses agent source using the new commitment system with multiline support
20594
20592
  * This function replaces the hardcoded commitment parsing in the original parseAgentSource
@@ -20677,7 +20675,7 @@ function parseAgentSourceWithCommitments(agentSource) {
20677
20675
  }
20678
20676
  }
20679
20677
  // Check if this is a horizontal line (ends any current commitment)
20680
- const isHorizontalLine = HORIZONTAL_LINE_PATTERN$1.test(line);
20678
+ const isHorizontalLine = HORIZONTAL_LINE_PATTERN$2.test(line);
20681
20679
  if (isHorizontalLine) {
20682
20680
  // Save the current commitment if it exists
20683
20681
  if (currentCommitment) {
@@ -21622,6 +21620,56 @@ function countLines(text) {
21622
21620
  // TODO: [🥴] Implement counting in formats - like JSON, CSV, XML,...
21623
21621
  // TODO: [🧠][✌️] Make some Promptbook-native token system
21624
21622
 
21623
+ /**
21624
+ * Core Promptbook server configuration
21625
+ *
21626
+ * Used for "Adam" agent which is built in as default ancestor for new agents and other well known agents
21627
+ *
21628
+ * @public exported from `@promptbook/core`
21629
+ */
21630
+ const CORE_AGENTS_SERVER = {
21631
+ title: 'Promptbook Core',
21632
+ description: `Core Promptbook server used for Adam agent which is built in as default ancestor for new agents and other well known agents.`,
21633
+ owner: PROMPTBOOK_LEGAL_ENTITY,
21634
+ url: 'https://core.ptbk.io/',
21635
+ };
21636
+ // <- TODO: [🆎] Allow to override (set) well-known agent names via Metadata
21637
+ /**
21638
+ * Available agents servers for the Promptbook
21639
+ *
21640
+ * Tip: 💡 If you are running your own server, you can add it to this list by creating a pull request!
21641
+ *
21642
+ * @public exported from `@promptbook/core`
21643
+ */
21644
+ const PUBLIC_AGENTS_SERVERS = [
21645
+ CORE_AGENTS_SERVER,
21646
+ {
21647
+ title: 'Promptbook Gallery',
21648
+ description: `Gallery of ideas, AI professions,... like AI Agenta photobank.`,
21649
+ owner: PROMPTBOOK_LEGAL_ENTITY,
21650
+ url: 'https://gallery.ptbk.io/',
21651
+ },
21652
+ {
21653
+ title: 'Promptbook Testing server 6',
21654
+ description: `General-purpose testing server.`,
21655
+ owner: PROMPTBOOK_LEGAL_ENTITY,
21656
+ url: 'https://s6.ptbk.io/',
21657
+ },
21658
+ {
21659
+ title: 'Promptbook Testing server 7',
21660
+ description: `General-purpose testing server.`,
21661
+ owner: PROMPTBOOK_LEGAL_ENTITY,
21662
+ url: 'https://s7.ptbk.io/',
21663
+ },
21664
+ {
21665
+ title: 'Promptbook Testing server 8',
21666
+ description: `General-purpose testing server.`,
21667
+ owner: PROMPTBOOK_LEGAL_ENTITY,
21668
+ url: 'https://s8.ptbk.io/',
21669
+ },
21670
+ ];
21671
+ // Note: [💞] Ignore a discrepancy between file name and entity name
21672
+
21625
21673
  var css_248z$d = ".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_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_bookEditorWrapper__twppD{background:linear-gradient(180deg,rgba(15,23,42,.98),rgba(8,15,28,.98));border-color:rgba(51,65,85,.92);box-shadow:0 20px 45px rgba(2,6,23,.4)}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_bookEditorWrapper__twppD:hover{box-shadow:0 24px 50px rgba(2,6,23,.48)}.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)}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_button__hS390{background-color:rgba(15,23,42,.92);border-color:rgba(71,85,105,.9);box-shadow:0 1px 2px 0 rgba(2,6,23,.35);color:#e2e8f0}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_button__hS390:hover{background-color:rgba(30,41,59,.98);border-color:rgba(125,211,252,.5);box-shadow:0 10px 24px rgba(2,6,23,.35)}.BookEditor-module_savedNotification__OiX9L{align-items:center;animation:BookEditor-module_fadeOut__q8JnR 2s forwards;background-color:rgba(0,0,0,.7);border-radius:.5rem;color:#fff;display:flex;font-size:1.25rem;gap:.5rem;left:50%;padding:1rem 2rem;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1000}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_savedNotification__OiX9L{background-color:rgba(2,6,23,.86);border:1px solid rgba(51,65,85,.9);color:#e2e8f0}.BookEditor-module_uploadPanel__2JJtD{background:hsla(0,0%,100%,.98);border:1px solid rgba(209,213,219,.9);border-radius:12px;bottom:20px;box-shadow:0 12px 30px rgba(15,23,42,.15);display:flex;flex-direction:column;gap:10px;max-width:calc(100% - 40px);padding:12px;position:absolute;right:20px;width:420px;z-index:220}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadPanel__2JJtD{background:rgba(8,15,28,.96);border-color:rgba(51,65,85,.9);box-shadow:0 18px 40px rgba(2,6,23,.45)}.BookEditor-module_uploadPanelHeader__pdJd2{align-items:center;display:flex;gap:12px;justify-content:space-between}.BookEditor-module_uploadPanelTitle__TJIVF{color:#111827;font-size:.95rem;font-weight:600}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadPanelTitle__TJIVF{color:#f8fafc}.BookEditor-module_uploadPanelHeaderMeta__Xw0uI{color:#6b7280;font-size:.75rem}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadPanelHeaderMeta__Xw0uI,.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadPanelSummary__rwSbG,.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadRowMeta__1lz9h,.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadRowStatus__jsUb-{color:#94a3b8}.BookEditor-module_uploadPanelSummary__rwSbG{color:#6b7280;display:grid;font-size:.75rem;gap:4px 12px;grid-template-columns:1fr 1fr}.BookEditor-module_uploadPanelProgressBar__a6pjf{background:#e5e7eb;border-radius:999px;height:6px;overflow:hidden}.BookEditor-module_uploadPanelProgressFill__l-TKR{background:linear-gradient(90deg,#2563eb,#10b981);height:100%;transition:width .2s ease}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadPanelProgressBar__a6pjf,.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadRowProgressBar__NoBA7{background:#1e293b}.BookEditor-module_uploadPanelList__VxEd5{display:flex;flex-direction:column;gap:8px;max-height:220px;overflow-y:auto;padding-right:4px}.BookEditor-module_uploadRow__QiSFg{background:#fff;border:1px solid #e5e7eb;border-radius:10px;display:flex;flex-direction:column;gap:6px;padding:8px}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadRow__QiSFg{background:rgba(15,23,42,.92);border-color:#334155}.BookEditor-module_uploadRowHeader__po0j5{align-items:center;display:flex;gap:8px;justify-content:space-between}.BookEditor-module_uploadRowName__doQRO{color:#111827;font-size:.8rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadRowName__doQRO{color:#f8fafc}.BookEditor-module_uploadRowStatus__jsUb-{color:#6b7280;font-size:.7rem}.BookEditor-module_uploadRowMeta__1lz9h{color:#6b7280;display:flex;font-size:.7rem;justify-content:space-between}.BookEditor-module_uploadRowProgressBar__NoBA7{background:#e5e7eb;border-radius:999px;height:4px;overflow:hidden}.BookEditor-module_uploadRowProgressFill__TrP7e{background:#3b82f6;height:100%;transition:width .2s ease}.BookEditor-module_uploadRowActions__5Y1Mq{display:flex;gap:6px}.BookEditor-module_uploadActionButton__CqJrr{background:#f9fafb;border:1px solid #d1d5db;border-radius:6px;color:#374151;cursor:pointer;font-size:.7rem;padding:2px 8px;transition:all .15s ease-in-out}.BookEditor-module_uploadActionButton__CqJrr:hover{background:#eef2f7;border-color:#cbd5f5}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadActionButton__CqJrr{background:#0f172a;border-color:#475569;color:#e2e8f0}.BookEditor-module_BookEditor__s-0PU[data-book-editor-theme=dark] .BookEditor-module_uploadActionButton__CqJrr:hover{background:#1e293b;border-color:#7dd3fc}.BookEditor-module_uploadRowError__eEHWw{color:#b91c1c;font-size:.7rem}.BookEditor-module_aboutPromptbookInformation__eiBL0{color:#111827;font-family:var(--font-poppins,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif);font-size:.95rem;line-height:1.6;max-width:680px}.BookEditor-module_aboutPromptbookInformation__eiBL0>:first-child{margin-top:0}.BookEditor-module_aboutPromptbookInformation__eiBL0>:last-child{margin-bottom:0}.BookEditor-module_aboutPromptbookInformation__eiBL0 h1,.BookEditor-module_aboutPromptbookInformation__eiBL0 h2{color:#0f172a;font-weight:650;line-height:1.25}.BookEditor-module_aboutPromptbookInformation__eiBL0 h1{font-size:1.5rem;margin:0 0 .75rem}.BookEditor-module_aboutPromptbookInformation__eiBL0 h2{font-size:1.15rem;margin:1.35rem 0 .55rem}.BookEditor-module_aboutPromptbookInformation__eiBL0 p{margin:0 0 .9rem}.BookEditor-module_aboutPromptbookInformation__eiBL0 ol,.BookEditor-module_aboutPromptbookInformation__eiBL0 ul{display:grid;gap:.35rem;margin:.55rem 0 1rem;padding-left:1.35rem}.BookEditor-module_aboutPromptbookInformation__eiBL0 a{color:#2563eb;text-decoration:underline;text-underline-offset:.16em}.BookEditor-module_aboutPromptbookInformation__eiBL0 code{background:rgba(15,23,42,.06);border:1px solid rgba(15,23,42,.12);border-radius:6px;color:#111827;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:.9em;padding:.12em .34em}@keyframes BookEditor-module_fadeOut__q8JnR{0%{opacity:0}10%{opacity:1}70%{opacity:1}to{opacity:0}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJvb2tFZGl0b3IubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FFSSxVQUNKLENBRUEsOENBS0kscUJBQXNCLENBSHRCLFdBQVksQ0FFWixtQkFBb0IsQ0FEcEIsaUJBQWtCLENBRmxCLFVBS0osQ0FFQSxpRkFFSSxnQ0FBcUMsQ0FDckMsaUNBRUosQ0FFQSxvQ0FDSSwwQkFDSixDQUVBLDRDQUtJLHFCQUF1QixDQUR2QixxQ0FBMEMsQ0FGMUMsa0JBQW1CLENBSW5CLHNDQUEyQyxDQUwzQyxlQUFnQixDQUVoQixnQkFBaUIsQ0FJakIscUNBQ0osQ0FDQSxnRkFFSSxnQkFFSixDQUVBLGtEQUNJLHVFQUNKLENBRUEsOEdBRUksdUVBQWtGLENBRGxGLCtCQUFvQyxDQUVwQyxzQ0FDSixDQUVBLG9IQUNJLHVDQUNKLENBVUEsNEZBQ0ksZUFDSixDQUVBLHNDQVNJLGtCQUFtQixDQUhuQiwrQkFBb0MsQ0FEcEMsUUFBUyxDQUVULFVBQVksQ0FDWixZQUFhLENBR2IsZ0JBQWlCLENBRGpCLHNCQUF1QixDQVB2QixNQUFPLENBVVAsbUJBQW9CLENBWnBCLGlCQUFrQixDQUdsQixPQUFRLENBRlIsS0FBTSxDQVVOLFdBRUosQ0FRQSw4Q0FDSSxpQkFBa0IsQ0FFbEIsVUFBVyxDQURYLFFBQVMsQ0FFVCxXQUNKLENBRUEscUNBV0ksV0FBWSxDQUZaLGVBQWdCLENBSmhCLFFBQVMsQ0FPVCxlQUFnQixDQUxoQixXQUFZLENBSlosTUFBTyxDQU9QLGdCQUFpQixDQVRqQixjQUFlLENBR2YsT0FBUSxDQUZSLEtBQU0sQ0FJTixVQUFXLENBRVgsWUFLSixDQUVBLGlDQU9JLGtCQUFtQixDQU5uQixxQkFBc0IsQ0FDdEIsd0JBQXlCLENBQ3pCLHFCQUF1QixDQU92QixzQ0FBMkMsQ0FEM0MsYUFBYyxDQUpkLGNBQWUsQ0FDZixtQkFBb0IsQ0FFcEIsU0FBVyxDQUpYLGtCQUFvQixDQU9wQiw4QkFDSixDQUVBLHVDQUNJLHdCQUF5QixDQUN6QixvQkFBcUIsQ0FDckIsaUVBQ0osQ0FFQSxtR0FDSSxtQ0FBd0MsQ0FDeEMsK0JBQW9DLENBRXBDLHVDQUE0QyxDQUQ1QyxhQUVKLENBRUEseUdBQ0ksbUNBQXdDLENBQ3hDLGlDQUFzQyxDQUN0Qyx1Q0FDSixDQUVBLDRDQWFJLGtCQUFtQixDQUVuQixzREFBOEIsQ0FWOUIsK0JBQW9DLENBR3BDLG1CQUFxQixDQUZyQixVQUFZLENBTVosWUFBYSxDQUhiLGlCQUFrQixDQUtsQixTQUFXLENBWFgsUUFBUyxDQUlULGlCQUFrQixDQUlsQixtQkFBb0IsQ0FWcEIsaUJBQWtCLENBQ2xCLE9BQVEsQ0FFUiw4QkFBZ0MsQ0FNaEMsWUFNSixDQUVBLDhHQUNJLGlDQUFzQyxDQUV0QyxrQ0FBdUMsQ0FEdkMsYUFFSixDQUVBLHNDQU1JLDhCQUFxQyxDQUNyQyxxQ0FBMEMsQ0FDMUMsa0JBQW1CLENBTG5CLFdBQVksQ0FNWix5Q0FBOEMsQ0FFOUMsWUFBYSxDQUNiLHFCQUFzQixDQUN0QixRQUFTLENBUlQsMkJBQTRCLENBSzVCLFlBQWEsQ0FUYixpQkFBa0IsQ0FDbEIsVUFBVyxDQUVYLFdBQVksQ0FVWixXQUNKLENBRUEsd0dBQ0ksNEJBQWlDLENBQ2pDLDhCQUFtQyxDQUNuQyx1Q0FDSixDQUVBLDRDQUVJLGtCQUFtQixDQURuQixZQUFhLENBR2IsUUFBUyxDQURULDZCQUVKLENBRUEsMkNBR0ksYUFBYyxDQURkLGdCQUFrQixDQURsQixlQUdKLENBRUEsNkdBQ0ksYUFDSixDQUVBLGdEQUVJLGFBQWMsQ0FEZCxnQkFFSixDQUVBLHViQUlJLGFBQ0osQ0FFQSw2Q0FLSSxhQUFjLENBSmQsWUFBYSxDQUdiLGdCQUFrQixDQURsQixZQUFhLENBRGIsNkJBSUosQ0FFQSxpREFFSSxrQkFBbUIsQ0FDbkIsbUJBQW9CLENBRnBCLFVBQVcsQ0FHWCxlQUNKLENBRUEsa0RBRUksaURBQW9ELENBRHBELFdBQVksQ0FFWix5QkFDSixDQUVBLG9PQUVJLGtCQUNKLENBRUEsMENBQ0ksWUFBYSxDQUNiLHFCQUFzQixDQUN0QixPQUFRLENBQ1IsZ0JBQWlCLENBQ2pCLGVBQWdCLENBQ2hCLGlCQUNKLENBRUEsb0NBT0ksZUFBZ0IsQ0FOaEIsd0JBQXlCLENBQ3pCLGtCQUFtQixDQUVuQixZQUFhLENBQ2IscUJBQXNCLENBQ3RCLE9BQVEsQ0FIUixXQUtKLENBRUEsc0dBRUksNkJBQWtDLENBRGxDLG9CQUVKLENBRUEsMENBRUksa0JBQW1CLENBRG5CLFlBQWEsQ0FHYixPQUFRLENBRFIsNkJBRUosQ0FFQSx3Q0FHSSxhQUFjLENBRmQsZUFBaUIsQ0FDakIsZUFBZ0IsQ0FFaEIsZUFBZ0IsQ0FDaEIsc0JBQXVCLENBQ3ZCLGtCQUNKLENBRUEsMEdBQ0ksYUFDSixDQUVBLDBDQUVJLGFBQWMsQ0FEZCxlQUVKLENBRUEsd0NBSUksYUFBYyxDQUhkLFlBQWEsQ0FFYixlQUFpQixDQURqQiw2QkFHSixDQUVBLCtDQUVJLGtCQUFtQixDQUNuQixtQkFBb0IsQ0FGcEIsVUFBVyxDQUdYLGVBQ0osQ0FFQSxnREFFSSxrQkFBbUIsQ0FEbkIsV0FBWSxDQUVaLHlCQUNKLENBRUEsMkNBQ0ksWUFBYSxDQUNiLE9BQ0osQ0FFQSw2Q0FFSSxrQkFBbUIsQ0FEbkIsd0JBQXlCLENBS3pCLGlCQUFrQixDQUhsQixhQUFjLENBSWQsY0FBZSxDQUhmLGVBQWlCLENBQ2pCLGVBQWdCLENBR2hCLCtCQUNKLENBRUEsbURBQ0ksa0JBQW1CLENBQ25CLG9CQUNKLENBRUEsK0dBRUksa0JBQW1CLENBRG5CLG9CQUFxQixDQUVyQixhQUNKLENBRUEscUhBQ0ksa0JBQW1CLENBQ25CLG9CQUNKLENBRUEseUNBRUksYUFBYyxDQURkLGVBRUosQ0FFQSxxREFFSSxhQUFjLENBQ2QsZ0dBQXNHLENBQ3RHLGdCQUFrQixDQUNsQixlQUFnQixDQUpoQixlQUtKLENBRUEsa0VBQ0ksWUFDSixDQUVBLGlFQUNJLGVBQ0osQ0FFQSxnSEFFSSxhQUFjLENBQ2QsZUFBZ0IsQ0FDaEIsZ0JBQ0osQ0FFQSx3REFFSSxnQkFBaUIsQ0FEakIsaUJBRUosQ0FFQSx3REFFSSxpQkFBa0IsQ0FEbEIsdUJBRUosQ0FFQSx1REFDSSxnQkFDSixDQUVBLGdIQUVJLFlBQWEsQ0FDYixVQUFZLENBQ1osb0JBQXNCLENBQ3RCLG9CQUNKLENBRUEsdURBQ0ksYUFBYyxDQUNkLHlCQUEwQixDQUMxQiwyQkFDSixDQUVBLDBEQUlJLDZCQUFrQyxDQUZsQyxtQ0FBd0MsQ0FDeEMsaUJBQWtCLENBRWxCLGFBQWMsQ0FDZCx1RkFBZ0csQ0FDaEcsY0FBZ0IsQ0FOaEIsbUJBT0osQ0FFQSw0Q0FDSSxHQUNJLFNBQ0osQ0FDQSxJQUNJLFNBQ0osQ0FDQSxJQUNJLFNBQ0osQ0FDQSxHQUNJLFNBQ0osQ0FDSiIsImZpbGUiOiJCb29rRWRpdG9yLm1vZHVsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuQm9va0VkaXRvciB7XG4gICAgLyogaGVpZ2h0OiA0NTBweDsgKi9cbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMTBweCAyNXB4IDA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmJvb2tFZGl0b3JDb250YWluZXIuaXNWZXJib3NlIHtcbiAgICAvKiovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICBvdXRsaW5lOiAxcHggZG90dGVkIHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICAvKiovXG59XG5cbi5pc1ZlcmJvc2Uge1xuICAgIG91dGxpbmU6IDJweCBkb3R0ZWQgcmdiKDI1NSAxMTcgMzgpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogMXJlbTtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIwOSwgMjEzLCAyMTksIDAuOCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMnMgZWFzZS1pbi1vdXQ7XG59XG4uaXNWZXJib3NlIC5ib29rRWRpdG9yV3JhcHBlciB7XG4gICAgLyoqL1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIC8qKi9cbn1cblxuLmJvb2tFZGl0b3JXcmFwcGVyOmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAuYm9va0VkaXRvcldyYXBwZXIge1xuICAgIGJvcmRlci1jb2xvcjogcmdiYSg1MSwgNjUsIDg1LCAwLjkyKTtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE1LCAyMywgNDIsIDAuOTgpLCByZ2JhKDgsIDE1LCAyOCwgMC45OCkpO1xuICAgIGJveC1zaGFkb3c6IDAgMjBweCA0NXB4IHJnYmEoMiwgNiwgMjMsIDAuNCk7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAuYm9va0VkaXRvcldyYXBwZXI6aG92ZXIge1xuICAgIGJveC1zaGFkb3c6IDAgMjRweCA1MHB4IHJnYmEoMiwgNiwgMjMsIDAuNDgpO1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAvKlxuICAgIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDk5LCAxMDIsIDI0MSwgMC40KTtcbiAgICAqL1xufVxuXG4uYm9va0VkaXRvcldyYXBwZXIuaXNCb3JkZXJSYWRpdXNEaXNhYmxlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLmRyb3BPdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLypcbi5ib29rRWRpdG9yQ29udGFpbmVyIDpnbG9iYWwoLnZpZXctbGluZSkge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyAvKiA8LSBOb3RlOiBgUFJPTVBUQk9PS19TWU5UQVhfQ09MT1JTLkxJTkVgICogL1xufVxuKi9cblxuLmJvb2tFZGl0b3JBY3Rpb25iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwcHg7XG4gICAgcmlnaHQ6IDU1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4uZnVsbHNjcmVlbiB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogOTk5OTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIHBhZGRpbmctdG9wOiA1MHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XG4gICAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG4gICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgY29sb3I6ICMzNzQxNTE7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlLWluLW91dDtcbn1cblxuLmJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcbiAgICBib3JkZXItY29sb3I6ICNiN2JjY2U7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuXG4uQm9va0VkaXRvcltkYXRhLWJvb2stZWRpdG9yLXRoZW1lPSdkYXJrJ10gLmJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNSwgMjMsIDQyLCAwLjkyKTtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoNzEsIDg1LCAxMDUsIDAuOSk7XG4gICAgY29sb3I6ICNlMmU4ZjA7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgyLCA2LCAyMywgMC4zNSk7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAuYnV0dG9uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDMwLCA0MSwgNTksIDAuOTgpO1xuICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjUsIDIxMSwgMjUyLCAwLjUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IHJnYmEoMiwgNiwgMjMsIDAuMzUpO1xufVxuXG4uc2F2ZWROb3RpZmljYXRpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAxcmVtIDJyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNXJlbTtcbiAgICBhbmltYXRpb246IGZhZGVPdXQgMnMgZm9yd2FyZHM7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAuc2F2ZWROb3RpZmljYXRpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMiwgNiwgMjMsIDAuODYpO1xuICAgIGNvbG9yOiAjZTJlOGYwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTEsIDY1LCA4NSwgMC45KTtcbn1cblxuLnVwbG9hZFBhbmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDIwcHg7XG4gICAgYm90dG9tOiAyMHB4O1xuICAgIHdpZHRoOiA0MjBweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDQwcHgpO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMDksIDIxMywgMjE5LCAwLjkpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgYm94LXNoYWRvdzogMCAxMnB4IDMwcHggcmdiYSgxNSwgMjMsIDQyLCAwLjE1KTtcbiAgICBwYWRkaW5nOiAxMnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDEwcHg7XG4gICAgei1pbmRleDogMjIwO1xufVxuXG4uQm9va0VkaXRvcltkYXRhLWJvb2stZWRpdG9yLXRoZW1lPSdkYXJrJ10gLnVwbG9hZFBhbmVsIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDE1LCAyOCwgMC45Nik7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDUxLCA2NSwgODUsIDAuOSk7XG4gICAgYm94LXNoYWRvdzogMCAxOHB4IDQwcHggcmdiYSgyLCA2LCAyMywgMC40NSk7XG59XG5cbi51cGxvYWRQYW5lbEhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBnYXA6IDEycHg7XG59XG5cbi51cGxvYWRQYW5lbFRpdGxlIHtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICBjb2xvcjogIzExMTgyNztcbn1cblxuLkJvb2tFZGl0b3JbZGF0YS1ib29rLWVkaXRvci10aGVtZT0nZGFyayddIC51cGxvYWRQYW5lbFRpdGxlIHtcbiAgICBjb2xvcjogI2Y4ZmFmYztcbn1cblxuLnVwbG9hZFBhbmVsSGVhZGVyTWV0YSB7XG4gICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgIGNvbG9yOiAjNmI3MjgwO1xufVxuXG4uQm9va0VkaXRvcltkYXRhLWJvb2stZWRpdG9yLXRoZW1lPSdkYXJrJ10gLnVwbG9hZFBhbmVsSGVhZGVyTWV0YSxcbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAudXBsb2FkUGFuZWxTdW1tYXJ5LFxuLkJvb2tFZGl0b3JbZGF0YS1ib29rLWVkaXRvci10aGVtZT0nZGFyayddIC51cGxvYWRSb3dTdGF0dXMsXG4uQm9va0VkaXRvcltkYXRhLWJvb2stZWRpdG9yLXRoZW1lPSdkYXJrJ10gLnVwbG9hZFJvd01ldGEge1xuICAgIGNvbG9yOiAjOTRhM2I4O1xufVxuXG4udXBsb2FkUGFuZWxTdW1tYXJ5IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcbiAgICBnYXA6IDRweCAxMnB4O1xuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICBjb2xvcjogIzZiNzI4MDtcbn1cblxuLnVwbG9hZFBhbmVsUHJvZ3Jlc3NCYXIge1xuICAgIGhlaWdodDogNnB4O1xuICAgIGJhY2tncm91bmQ6ICNlNWU3ZWI7XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnVwbG9hZFBhbmVsUHJvZ3Jlc3NGaWxsIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMjU2M2ViLCAjMTBiOTgxKTtcbiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjJzIGVhc2U7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAudXBsb2FkUGFuZWxQcm9ncmVzc0Jhcixcbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAudXBsb2FkUm93UHJvZ3Jlc3NCYXIge1xuICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XG59XG5cbi51cGxvYWRQYW5lbExpc3Qge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDhweDtcbiAgICBtYXgtaGVpZ2h0OiAyMjBweDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cblxuLnVwbG9hZFJvdyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiA2cHg7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbn1cblxuLkJvb2tFZGl0b3JbZGF0YS1ib29rLWVkaXRvci10aGVtZT0nZGFyayddIC51cGxvYWRSb3cge1xuICAgIGJvcmRlci1jb2xvcjogIzMzNDE1NTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuOTIpO1xufVxuXG4udXBsb2FkUm93SGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogOHB4O1xufVxuXG4udXBsb2FkUm93TmFtZSB7XG4gICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBjb2xvcjogIzExMTgyNztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAudXBsb2FkUm93TmFtZSB7XG4gICAgY29sb3I6ICNmOGZhZmM7XG59XG5cbi51cGxvYWRSb3dTdGF0dXMge1xuICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgIGNvbG9yOiAjNmI3MjgwO1xufVxuXG4udXBsb2FkUm93TWV0YSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgY29sb3I6ICM2YjcyODA7XG59XG5cbi51cGxvYWRSb3dQcm9ncmVzc0JhciB7XG4gICAgaGVpZ2h0OiA0cHg7XG4gICAgYmFja2dyb3VuZDogI2U1ZTdlYjtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udXBsb2FkUm93UHJvZ3Jlc3NGaWxsIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogIzNiODJmNjtcbiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjJzIGVhc2U7XG59XG5cbi51cGxvYWRSb3dBY3Rpb25zIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogNnB4O1xufVxuXG4udXBsb2FkQWN0aW9uQnV0dG9uIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDFkNWRiO1xuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgY29sb3I6ICMzNzQxNTE7XG4gICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgcGFkZGluZzogMnB4IDhweDtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlLWluLW91dDtcbn1cblxuLnVwbG9hZEFjdGlvbkJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogI2VlZjJmNztcbiAgICBib3JkZXItY29sb3I6ICNjYmQ1ZjU7XG59XG5cbi5Cb29rRWRpdG9yW2RhdGEtYm9vay1lZGl0b3ItdGhlbWU9J2RhcmsnXSAudXBsb2FkQWN0aW9uQnV0dG9uIHtcbiAgICBib3JkZXItY29sb3I6ICM0NzU1Njk7XG4gICAgYmFja2dyb3VuZDogIzBmMTcyYTtcbiAgICBjb2xvcjogI2UyZThmMDtcbn1cblxuLkJvb2tFZGl0b3JbZGF0YS1ib29rLWVkaXRvci10aGVtZT0nZGFyayddIC51cGxvYWRBY3Rpb25CdXR0b246aG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XG4gICAgYm9yZGVyLWNvbG9yOiAjN2RkM2ZjO1xufVxuXG4udXBsb2FkUm93RXJyb3Ige1xuICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgIGNvbG9yOiAjYjkxYzFjO1xufVxuXG4uYWJvdXRQcm9tcHRib29rSW5mb3JtYXRpb24ge1xuICAgIG1heC13aWR0aDogNjgwcHg7XG4gICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtcG9wcGlucywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWYpO1xuICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS42O1xufVxuXG4uYWJvdXRQcm9tcHRib29rSW5mb3JtYXRpb24gPiA6Zmlyc3QtY2hpbGQge1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5hYm91dFByb21wdGJvb2tJbmZvcm1hdGlvbiA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYWJvdXRQcm9tcHRib29rSW5mb3JtYXRpb24gaDEsXG4uYWJvdXRQcm9tcHRib29rSW5mb3JtYXRpb24gaDIge1xuICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIGZvbnQtd2VpZ2h0OiA2NTA7XG4gICAgbGluZS1oZWlnaHQ6IDEuMjU7XG59XG5cbi5hYm91dFByb21wdGJvb2tJbmZvcm1hdGlvbiBoMSB7XG4gICAgbWFyZ2luOiAwIDAgMC43NXJlbTtcbiAgICBmb250LXNpemU6IDEuNXJlbTtcbn1cblxuLmFib3V0UHJvbXB0Ym9va0luZm9ybWF0aW9uIGgyIHtcbiAgICBtYXJnaW46IDEuMzVyZW0gMCAwLjU1cmVtO1xuICAgIGZvbnQtc2l6ZTogMS4xNXJlbTtcbn1cblxuLmFib3V0UHJvbXB0Ym9va0luZm9ybWF0aW9uIHAge1xuICAgIG1hcmdpbjogMCAwIDAuOXJlbTtcbn1cblxuLmFib3V0UHJvbXB0Ym9va0luZm9ybWF0aW9uIHVsLFxuLmFib3V0UHJvbXB0Ym9va0luZm9ybWF0aW9uIG9sIHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdhcDogMC4zNXJlbTtcbiAgICBtYXJnaW46IDAuNTVyZW0gMCAxcmVtO1xuICAgIHBhZGRpbmctbGVmdDogMS4zNXJlbTtcbn1cblxuLmFib3V0UHJvbXB0Ym9va0luZm9ybWF0aW9uIGEge1xuICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMC4xNmVtO1xufVxuXG4uYWJvdXRQcm9tcHRib29rSW5mb3JtYXRpb24gY29kZSB7XG4gICAgcGFkZGluZzogMC4xMmVtIDAuMzRlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE1LCAyMywgNDIsIDAuMTIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuMDYpO1xuICAgIGNvbG9yOiAjMTExODI3O1xuICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsIG1vbm9zcGFjZTtcbiAgICBmb250LXNpemU6IDAuOWVtO1xufVxuXG5Aa2V5ZnJhbWVzIGZhZGVPdXQge1xuICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgMTAlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgNzAlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuIl19 */";
21626
21674
  var styles$d = {"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","savedNotification":"BookEditor-module_savedNotification__OiX9L","fadeOut":"BookEditor-module_fadeOut__q8JnR","uploadPanel":"BookEditor-module_uploadPanel__2JJtD","uploadPanelHeader":"BookEditor-module_uploadPanelHeader__pdJd2","uploadPanelTitle":"BookEditor-module_uploadPanelTitle__TJIVF","uploadPanelHeaderMeta":"BookEditor-module_uploadPanelHeaderMeta__Xw0uI","uploadPanelSummary":"BookEditor-module_uploadPanelSummary__rwSbG","uploadRowStatus":"BookEditor-module_uploadRowStatus__jsUb-","uploadRowMeta":"BookEditor-module_uploadRowMeta__1lz9h","uploadPanelProgressBar":"BookEditor-module_uploadPanelProgressBar__a6pjf","uploadPanelProgressFill":"BookEditor-module_uploadPanelProgressFill__l-TKR","uploadRowProgressBar":"BookEditor-module_uploadRowProgressBar__NoBA7","uploadPanelList":"BookEditor-module_uploadPanelList__VxEd5","uploadRow":"BookEditor-module_uploadRow__QiSFg","uploadRowHeader":"BookEditor-module_uploadRowHeader__po0j5","uploadRowName":"BookEditor-module_uploadRowName__doQRO","uploadRowProgressFill":"BookEditor-module_uploadRowProgressFill__TrP7e","uploadRowActions":"BookEditor-module_uploadRowActions__5Y1Mq","uploadActionButton":"BookEditor-module_uploadActionButton__CqJrr","uploadRowError":"BookEditor-module_uploadRowError__eEHWw","aboutPromptbookInformation":"BookEditor-module_aboutPromptbookInformation__eiBL0"};
21627
21675
  styleInject(css_248z$d);
@@ -21653,135 +21701,6 @@ function SaveIcon({ size = 20, color = 'currentColor', ...props }) {
21653
21701
  return (jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", ...props, children: [jsx("path", { d: "M4 17V7a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3H7l-3 3z", fill: color, fillOpacity: "0.08", stroke: color }), jsx("path", { d: "M12 9v5", stroke: color }), jsx("path", { d: "M9.5 12.5L12 15l2.5-2.5", stroke: color })] }));
21654
21702
  }
21655
21703
 
21656
- /**
21657
- * Detects if the code is running in a browser environment in main thread (Not in a web worker)
21658
- *
21659
- * Note: `$` is used to indicate that this function is not a pure function - it looks at the global object to determine the environment
21660
- *
21661
- * @public exported from `@promptbook/utils`
21662
- */
21663
- function $isRunningInBrowser() {
21664
- try {
21665
- return typeof window !== 'undefined' && typeof window.document !== 'undefined';
21666
- }
21667
- catch (e) {
21668
- return false;
21669
- }
21670
- }
21671
- // TODO: [🎺]
21672
-
21673
- /**
21674
- * Converts Blob, File or MediaSource to url using URL.createObjectURL
21675
- *
21676
- * @public exported from `@promptbook/browser`
21677
- */
21678
- class ObjectUrl extends Registration {
21679
- constructor(teardownLogic, src) {
21680
- super(teardownLogic);
21681
- this.src = src;
21682
- }
21683
- /**
21684
- * Creates ObjectUrl from multiple input types
21685
- * Note: DO NOT forget to call destroy() when you are done with it
21686
- */
21687
- static from(source, mimeType) {
21688
- if (typeof source === 'string') {
21689
- return ObjectUrl.fromString(source, mimeType);
21690
- }
21691
- if ((source instanceof Blob || source instanceof File) && source.type !== mimeType) {
21692
- throw new Error(`Source type ${source.type} does not match given mimeType ${mimeType}`);
21693
- }
21694
- return ObjectUrl.fromBlob(source);
21695
- }
21696
- /**
21697
- * Creates ObjectUrl from string
21698
- * Note: DO NOT forget to call destroy() when you are done with it
21699
- */
21700
- static fromString(source, mimeType) {
21701
- return ObjectUrl.fromBlob(new Blob([source], { type: mimeType }));
21702
- }
21703
- /**
21704
- * Creates ObjectUrl
21705
- * DO NOT forget to call destroy() when you are done with it
21706
- */
21707
- static fromBlob(source) {
21708
- const src = URL.createObjectURL(source);
21709
- return new ObjectUrl(() => {
21710
- URL.revokeObjectURL(src);
21711
- }, src);
21712
- }
21713
- /**
21714
- * Creates ObjectUrl:
21715
- * 1) With functionality for Blobs, Files or MediaSources
21716
- * 2) Just a wrapper for string urls
21717
- *
21718
- * DO NOT forget to call destroy() when you are done with it
21719
- */
21720
- static fromBlobOrUrl(source) {
21721
- if (typeof source === 'string' || source instanceof URL /* <- TODO: Probably check isValidUrl */) {
21722
- return new ObjectUrl(() => {
21723
- // Note: Nothing to do here
21724
- }, source.toString());
21725
- }
21726
- else {
21727
- return ObjectUrl.fromBlob(source);
21728
- }
21729
- }
21730
- /**
21731
- * Gets object url as string
21732
- * @alias src
21733
- */
21734
- get href() {
21735
- return this.src;
21736
- }
21737
- /**
21738
- * Gets object url as URL object
21739
- */
21740
- get url() {
21741
- return new URL(this.src);
21742
- }
21743
- }
21744
- // Note: [🔵] Code for browser file helper [ObjectUrl](src/utils/files/ObjectUrl.ts) should never be published outside of `@promptbook/browser`
21745
-
21746
- /**
21747
- * Download a File in a browser
21748
- *
21749
- * Note: `$` is used to indicate that this function is not a pure function - its purpose is to cause a side effect (download a file)
21750
- *
21751
- * @public exported from `@promptbook/browser`
21752
- */
21753
- async function $induceFileDownload(fileOrBlobOrUrl) {
21754
- if (!$isRunningInBrowser()) {
21755
- throw new Error('Function `$induceFileDownload` is available ONLY in browser');
21756
- }
21757
- const objectUrl = ObjectUrl.fromBlobOrUrl(fileOrBlobOrUrl);
21758
- const link = window.document.createElement('a');
21759
- link.href = objectUrl.href;
21760
- link.download = fileOrBlobOrUrl.name || 'untitled' /* <- TODO: Add proper extension according to url */;
21761
- link.click();
21762
- await objectUrl.destroy();
21763
- }
21764
- // Note: [🔵] Code for browser file helper [$induceFileDownload](src/utils/files/$induceFileDownload.ts) should never be published outside of `@promptbook/browser`
21765
-
21766
- /**
21767
- * Download a Book in a browser
21768
- *
21769
- * Note: `$` is used to indicate that this function is not a pure function - its purpose is to cause a side effect (download a file)
21770
- *
21771
- * @public exported from `@promptbook/browser`
21772
- */
21773
- async function $induceBookDownload(book) {
21774
- if (!$isRunningInBrowser()) {
21775
- throw new Error('Function `$induceBookDownload` is available ONLY in browser');
21776
- }
21777
- const { agentName } = parseAgentSource(book);
21778
- const bookFile = new File([book], `${titleToName(agentName || 'AI Avatar')}.book`, {
21779
- type: 'application/json',
21780
- });
21781
- return /* not await */ $induceFileDownload(bookFile);
21782
- }
21783
- // Note: [🔵] Code for browser file helper [$induceBookDownload](src/utils/files/$induceBookDownload.ts) should never be published outside of `@promptbook/browser`
21784
-
21785
21704
  /**
21786
21705
  * Renders an information/about icon.
21787
21706
  *
@@ -21998,54 +21917,21 @@ function Modal({ children, onClose, className, }) {
21998
21917
  }
21999
21918
 
22000
21919
  /**
22001
- * Core Promptbook server configuration
22002
- *
22003
- * Used for "Adam" agent which is built in as default ancestor for new agents and other well known agents
22004
- *
22005
- * @public exported from `@promptbook/core`
22006
- */
22007
- const CORE_AGENTS_SERVER = {
22008
- title: 'Promptbook Core',
22009
- description: `Core Promptbook server used for Adam agent which is built in as default ancestor for new agents and other well known agents.`,
22010
- owner: PROMPTBOOK_LEGAL_ENTITY,
22011
- url: 'https://core.ptbk.io/',
22012
- };
22013
- // <- TODO: [🆎] Allow to override (set) well-known agent names via Metadata
22014
- /**
22015
- * Available agents servers for the Promptbook
21920
+ * Detects if the code is running in a browser environment in main thread (Not in a web worker)
22016
21921
  *
22017
- * Tip: 💡 If you are running your own server, you can add it to this list by creating a pull request!
21922
+ * Note: `$` is used to indicate that this function is not a pure function - it looks at the global object to determine the environment
22018
21923
  *
22019
- * @public exported from `@promptbook/core`
21924
+ * @public exported from `@promptbook/utils`
22020
21925
  */
22021
- const PUBLIC_AGENTS_SERVERS = [
22022
- CORE_AGENTS_SERVER,
22023
- {
22024
- title: 'Promptbook Gallery',
22025
- description: `Gallery of ideas, AI professions,... like AI Agenta photobank.`,
22026
- owner: PROMPTBOOK_LEGAL_ENTITY,
22027
- url: 'https://gallery.ptbk.io/',
22028
- },
22029
- {
22030
- title: 'Promptbook Testing server 6',
22031
- description: `General-purpose testing server.`,
22032
- owner: PROMPTBOOK_LEGAL_ENTITY,
22033
- url: 'https://s6.ptbk.io/',
22034
- },
22035
- {
22036
- title: 'Promptbook Testing server 7',
22037
- description: `General-purpose testing server.`,
22038
- owner: PROMPTBOOK_LEGAL_ENTITY,
22039
- url: 'https://s7.ptbk.io/',
22040
- },
22041
- {
22042
- title: 'Promptbook Testing server 8',
22043
- description: `General-purpose testing server.`,
22044
- owner: PROMPTBOOK_LEGAL_ENTITY,
22045
- url: 'https://s8.ptbk.io/',
22046
- },
22047
- ];
22048
- // Note: [💞] Ignore a discrepancy between file name and entity name
21926
+ function $isRunningInBrowser() {
21927
+ try {
21928
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
21929
+ }
21930
+ catch (e) {
21931
+ return false;
21932
+ }
21933
+ }
21934
+ // TODO: [🎺]
22049
21935
 
22050
21936
  /**
22051
21937
  * Detects if the code is running in jest environment
@@ -22135,9 +22021,32 @@ function BookEditorAboutPromptbookInformation(props = {}) {
22135
22021
  ...$detectRuntimeEnvironment(),
22136
22022
  isCostPrevented: IS_COST_PREVENTED,
22137
22023
  };
22138
- return (jsxs("div", { className: styles$d.aboutPromptbookInformation, children: [jsx("h1", { children: NAME }), jsx("p", { children: CLAIM }), jsxs("ul", { children: [jsx("li", { children: jsxs("a", { href: "https://github.com/webgptorg/promptbook", target: "_blank", rel: "noopener noreferrer", children: ["Promptbook engine version ", jsx("code", { children: PROMPTBOOK_ENGINE_VERSION })] }) }), jsx("li", { children: jsxs("a", { href: "https://github.com/webgptorg/book", target: "_blank", rel: "noopener noreferrer", children: ["Book language version ", jsx("code", { children: BOOK_LANGUAGE_VERSION })] }) })] }), isServersInfoIncluded && (jsxs(Fragment, { children: [jsx("h2", { children: "Servers" }), jsx("ol", { children: PUBLIC_AGENTS_SERVERS.map(({ title, description, url }) => (jsxs("li", { children: [jsx("strong", { children: title }), " ", description, ' ', jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", children: url })] }, url))) })] })), isRuntimeEnvironmentInfoIncluded && (jsxs(Fragment, { children: [jsx("h2", { children: "Environment" }), jsx("ul", { children: Object.entries(runtimeEnvironmentInfo).map(([key, value]) => (jsxs("li", { children: [jsxs("strong", { children: [key, ":"] }), " ", valueToString(value)] }, key))) })] }))] }));
22024
+ return (jsxs("div", { className: styles$d.aboutPromptbookInformation, children: [jsx("h1", { children: NAME }), jsx("p", { children: CLAIM }), jsxs("ul", { children: [jsx("li", { children: jsxs("a", { href: "https://github.com/webgptorg/promptbook", target: "_blank", rel: "noopener noreferrer", children: ["Promptbook engine version ", jsx("code", { children: PROMPTBOOK_ENGINE_VERSION })] }) }), jsx("li", { children: jsxs("a", { href: "https://github.com/webgptorg/book", target: "_blank", rel: "noopener noreferrer", children: ["Book language version ", jsx("code", { children: BOOK_LANGUAGE_VERSION })] }) })] }), isServersInfoIncluded && (jsxs(Fragment, { children: [jsx("h2", { children: "Servers" }), jsx("ol", { children: PUBLIC_AGENTS_SERVERS.map(({ title, description, url }) => (jsxs("li", { children: [jsx("strong", { children: title }), " ", description, ' ', jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", children: url })] }, url))) })] })), isRuntimeEnvironmentInfoIncluded && (jsxs(Fragment, { children: [jsx("h2", { children: "Environment" }), jsx("ul", { children: Object.entries(runtimeEnvironmentInfo).map(([key, value]) => (jsxs("li", { children: [jsxs("strong", { children: [key, ":"] }), " ", String(value)] }, key))) })] }))] }));
22139
22025
  }
22140
22026
 
22027
+ function induceBookDownloadInBrowser(book) {
22028
+ const filename = `${normalizeBookDownloadName(extractBookTitle(book) || 'AI Avatar')}.book`;
22029
+ const objectUrl = URL.createObjectURL(new Blob([book], { type: 'application/json' }));
22030
+ const link = window.document.createElement('a');
22031
+ link.href = objectUrl;
22032
+ link.download = filename;
22033
+ link.click();
22034
+ URL.revokeObjectURL(objectUrl);
22035
+ }
22036
+ function extractBookTitle(book) {
22037
+ return (book
22038
+ .split(/\r?\n/)
22039
+ .map((line) => line.trim())
22040
+ .find(Boolean) || null);
22041
+ }
22042
+ function normalizeBookDownloadName(value) {
22043
+ return (value
22044
+ .normalize('NFD')
22045
+ .replace(/[\u0300-\u036f]/g, '')
22046
+ .replace(/[^\dA-Za-z]+/g, '-')
22047
+ .replace(/^-+|-+$/g, '')
22048
+ .toLowerCase() || 'ai-avatar');
22049
+ }
22141
22050
  /**
22142
22051
  * Handles book editor actionbar.
22143
22052
  *
@@ -22154,7 +22063,7 @@ function BookEditorActionbar(props) {
22154
22063
  }, [value]);
22155
22064
  const handleDownload = useCallback(() => {
22156
22065
  const book = validateBook(valueRef.current || DEFAULT_BOOK);
22157
- /* not await */ $induceBookDownload(book);
22066
+ induceBookDownloadInBrowser(book);
22158
22067
  }, []);
22159
22068
  const actions = useMemo(() => {
22160
22069
  const _actions = [...(hoistedMenuItems || [])];
@@ -22269,144 +22178,15 @@ function resolveBookEditorRenderTheme(hostTheme = BOOK_EDITOR_RENDER_THEME) {
22269
22178
  }
22270
22179
 
22271
22180
  /**
22272
- * Gets a commitment definition by its type
22181
+ * Browser-compatible stub for `createDeprecatedCommitmentDiagnostics`.
22273
22182
  *
22274
- * @param type The commitment type to look up
22275
- * @returns The commitment definition or null if not found
22276
- *
22277
- * @public exported from `@promptbook/core`
22278
- */
22279
- function getCommitmentDefinition(type) {
22280
- return COMMITMENT_REGISTRY.find((commitmentDefinition) => commitmentDefinition.type === type) || null;
22281
- }
22282
-
22283
- /**
22284
- * Warning message used for unfinished commitments.
22285
- */
22286
- const UNFINISHED_COMMITMENT_MESSAGE = 'This commitment is unfinished and not ready to use. Be careful when using it.';
22287
- /**
22288
- * Low-level warning message used for low-level commitments.
22289
- */
22290
- const LOW_LEVEL_COMMITMENT_MESSAGE = 'This commitment is low-level and not used by most of the users. Be careful when using it.';
22291
- /**
22292
- * Short badge text used for deprecated commitments.
22293
- */
22294
- const DEPRECATED_COMMITMENT_BADGE_LABEL = 'Deprecated';
22295
- /**
22296
- * Short badge text used for unfinished and low-level commitments.
22297
- */
22298
- const LOW_LEVEL_COMMITMENT_BADGE_LABEL = 'Low-level';
22299
- /**
22300
- * Longer label used for deprecated commitments.
22301
- */
22302
- const DEPRECATED_COMMITMENT_DETAIL_LABEL = 'Deprecated commitment';
22303
- /**
22304
- * Longer label used for unfinished and low-level commitments.
22305
- */
22306
- const LOW_LEVEL_COMMITMENT_DETAIL_LABEL = 'Low-level commitment';
22307
- /**
22308
- * Prefix used when formatting replacement guidance.
22309
- */
22310
- const PREFERRED_REPLACEMENT_LABEL = 'Preferred replacement';
22311
- /**
22312
- * Formats preferred replacement guidance for deprecated commitments.
22313
- *
22314
- * @param replacedBy - Preferred replacement commitment keywords.
22315
- * @returns Optional replacement guidance sentence with leading space.
22316
- *
22317
- * @private internal utility of commitment catalog notices
22318
- */
22319
- function formatCommitmentReplacementText(replacedBy) {
22320
- if (!replacedBy || replacedBy.length === 0) {
22321
- return '';
22322
- }
22323
- return ` ${PREFERRED_REPLACEMENT_LABEL}: ${replacedBy.map((type) => `\`${type}\``).join(', ')}.`;
22324
- }
22325
- /**
22326
- * Resolves the notice metadata for deprecated, unfinished, or low-level commitments.
22327
- *
22328
- * @param definition - Commitment definition to inspect.
22329
- * @returns Notice metadata when the commitment should be surfaced with caution.
22330
- *
22331
- * @private internal utility of commitment catalog notices
22332
- */
22333
- function getCommitmentNoticeMetadata(definition) {
22334
- if (definition.isUnfinished) {
22335
- return {
22336
- kind: 'unfinished',
22337
- badgeLabel: LOW_LEVEL_COMMITMENT_BADGE_LABEL,
22338
- detailLabel: LOW_LEVEL_COMMITMENT_DETAIL_LABEL,
22339
- message: UNFINISHED_COMMITMENT_MESSAGE,
22340
- };
22341
- }
22342
- if (definition.isLowLevel) {
22343
- return {
22344
- kind: 'lowLevel',
22345
- badgeLabel: LOW_LEVEL_COMMITMENT_BADGE_LABEL,
22346
- detailLabel: LOW_LEVEL_COMMITMENT_DETAIL_LABEL,
22347
- message: LOW_LEVEL_COMMITMENT_MESSAGE,
22348
- };
22349
- }
22350
- if (definition.deprecation) {
22351
- return {
22352
- kind: 'deprecated',
22353
- badgeLabel: DEPRECATED_COMMITMENT_BADGE_LABEL,
22354
- detailLabel: DEPRECATED_COMMITMENT_DETAIL_LABEL,
22355
- message: definition.deprecation.message,
22356
- };
22357
- }
22358
- return null;
22359
- }
22360
-
22361
- /**
22362
- * Creates Book editor diagnostics for deprecated, unfinished, and low-level commitment keywords.
22363
- *
22364
- * The notice metadata is UI-only. This helper surfaces it in Monaco so legacy,
22365
- * unfinished, and low-level commitments remain functional while still guiding
22366
- * authors toward preferred replacements or cautioning them about low-level
22367
- * usage.
22368
- *
22369
- * @param agentSource - Current editor content.
22370
- * @returns Warning markers for deprecated, unfinished, and low-level commitment keywords.
22183
+ * In the browser build the full Node.js implementation is not available,
22184
+ * so this stub always returns an empty array to keep the editor functional.
22371
22185
  *
22372
22186
  * @private internal utility of `BookEditorMonaco`
22373
22187
  */
22374
- function createDeprecatedCommitmentDiagnostics(agentSource) {
22375
- var _a;
22376
- if (!(agentSource === null || agentSource === void 0 ? void 0 : agentSource.trim())) {
22377
- return [];
22378
- }
22379
- const parsed = parseAgentSourceWithCommitments(agentSource);
22380
- const diagnostics = [];
22381
- for (const commitment of parsed.commitments) {
22382
- const definition = getCommitmentDefinition(commitment.type);
22383
- const notice = definition ? getCommitmentNoticeMetadata(definition) : null;
22384
- if (!definition || !notice) {
22385
- continue;
22386
- }
22387
- const typeMatch = definition.createTypeRegex().exec(commitment.originalLine);
22388
- if (!((_a = typeMatch === null || typeMatch === void 0 ? void 0 : typeMatch.groups) === null || _a === void 0 ? void 0 : _a.type)) {
22389
- continue;
22390
- }
22391
- const matchedType = typeMatch.groups.type;
22392
- const leadingCharactersCount = typeMatch[0].length - matchedType.length;
22393
- const startColumn = leadingCharactersCount + 1;
22394
- const endColumn = startColumn + matchedType.length;
22395
- // Keep the diagnostic sentence compact while reusing the shared notice copy.
22396
- const message = notice.kind === 'deprecated'
22397
- ? `\`${commitment.type}\` is deprecated. ${notice.message}`
22398
- : `\`${commitment.type}\` is ${notice.message.replace(/^This commitment is\s+/u, '')}`;
22399
- diagnostics.push({
22400
- startLineNumber: commitment.lineNumber,
22401
- startColumn,
22402
- endLineNumber: commitment.lineNumber,
22403
- endColumn,
22404
- message,
22405
- source: 'Promptbook',
22406
- severity: 'warning',
22407
- });
22408
- }
22409
- return diagnostics;
22188
+ function createDeprecatedCommitmentDiagnostics(_agentSource) {
22189
+ return [];
22410
22190
  }
22411
22191
 
22412
22192
  /**
@@ -22765,103 +22545,6 @@ function useBookEditorMonacoInteractions({ editor, handleFiles, }) {
22765
22545
  };
22766
22546
  }
22767
22547
 
22768
- /**
22769
- * Priority order for the important commitments shown first in catalogues and intellisense.
22770
- *
22771
- * Canonical singular names stay ahead of their plural aliases so the most important
22772
- * commitments remain easy to scan.
22773
- *
22774
- * @private internal constant of commitment catalog sorting
22775
- */
22776
- const IMPORTANT_COMMITMENT_TYPE_SORT_ORDER = new Map([
22777
- ['GOAL', 0],
22778
- ['RULE', 1],
22779
- ['KNOWLEDGE', 2],
22780
- ['TEAM', 3],
22781
- ['GOALS', 4],
22782
- ['RULES', 5],
22783
- ]);
22784
- /**
22785
- * Sort rank used when unfinished, low-level, and deprecated commitments should be grouped last.
22786
- *
22787
- * @private internal constant of commitment catalog sorting
22788
- */
22789
- const COMMITMENT_STATUS_SORT_ORDER = {
22790
- normal: 0,
22791
- deprecated: 1,
22792
- unfinished: 2,
22793
- lowLevel: 3,
22794
- };
22795
- /**
22796
- * Resolves the relative sort rank of one commitment status.
22797
- *
22798
- * @param definition - Commitment definition to rank.
22799
- * @param options - Sorting options.
22800
- * @returns Relative sort rank for the definition.
22801
- *
22802
- * @private internal helper of commitment catalog sorting
22803
- */
22804
- function resolveCommitmentStatusSortRank(definition, options) {
22805
- let statusSortRank = COMMITMENT_STATUS_SORT_ORDER.normal;
22806
- if (options.isDeprecatedLast && definition.deprecation) {
22807
- statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.deprecated);
22808
- }
22809
- if (options.isUnfinishedLast && definition.isUnfinished) {
22810
- statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.unfinished);
22811
- }
22812
- if (options.isLowLevelLast && definition.isLowLevel) {
22813
- statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.lowLevel);
22814
- }
22815
- return statusSortRank;
22816
- }
22817
- /**
22818
- * Sorts commitment definitions so the important ones stay at the top.
22819
- *
22820
- * @param commitmentDefinitions - Definitions to sort.
22821
- * @param options - Sorting options.
22822
- * @returns Sorted commitment definitions.
22823
- *
22824
- * @private internal helper of commitment catalog sorting
22825
- */
22826
- function sortCommitmentDefinitions(commitmentDefinitions, options = {}) {
22827
- return [...commitmentDefinitions]
22828
- .map((definition, index) => ({
22829
- definition,
22830
- index,
22831
- }))
22832
- .sort((left, right) => {
22833
- var _a, _b;
22834
- if (left.definition.isImportant !== right.definition.isImportant) {
22835
- return left.definition.isImportant ? -1 : 1;
22836
- }
22837
- if (left.definition.isImportant && right.definition.isImportant) {
22838
- const leftPriority = (_a = IMPORTANT_COMMITMENT_TYPE_SORT_ORDER.get(left.definition.type)) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER;
22839
- const rightPriority = (_b = IMPORTANT_COMMITMENT_TYPE_SORT_ORDER.get(right.definition.type)) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
22840
- if (leftPriority !== rightPriority) {
22841
- return leftPriority - rightPriority;
22842
- }
22843
- }
22844
- const leftStatusSortRank = resolveCommitmentStatusSortRank(left.definition, options);
22845
- const rightStatusSortRank = resolveCommitmentStatusSortRank(right.definition, options);
22846
- if (leftStatusSortRank !== rightStatusSortRank) {
22847
- return leftStatusSortRank - rightStatusSortRank;
22848
- }
22849
- return left.index - right.index;
22850
- })
22851
- .map(({ definition }) => definition);
22852
- }
22853
-
22854
- /**
22855
- * Gets all available commitment definitions
22856
- *
22857
- * @returns Array of all commitment definitions
22858
- *
22859
- * @public exported from `@promptbook/core`
22860
- */
22861
- function getAllCommitmentDefinitions() {
22862
- return $deepFreeze(sortCommitmentDefinitions(COMMITMENT_REGISTRY, { isUnfinishedLast: true, isLowLevelLast: true }));
22863
- }
22864
-
22865
22548
  /**
22866
22549
  * Regex source for absolute URL references inside TEAM/FROM/IMPORT commitments.
22867
22550
  *
@@ -22885,12 +22568,38 @@ const AGENT_REFERENCE_BRACED_PATTERN = '\\{[^{}\\r\\n]+\\}';
22885
22568
  *
22886
22569
  * @private function of BookEditorMonaco
22887
22570
  */
22888
- const AGENT_REFERENCE_COMMITMENT_TYPES = new Set([
22571
+ const AGENT_REFERENCE_COMMITMENT_TYPES = ['FROM', 'IMPORT', 'IMPORTS', 'TEAM'];
22572
+ /**
22573
+ * Commitment types known to the browser editor tokenizer.
22574
+ *
22575
+ * @private function of BookEditorMonaco
22576
+ */
22577
+ const BOOK_EDITOR_COMMITMENT_TYPES = [
22578
+ 'PERSONA',
22579
+ 'KNOWLEDGE',
22580
+ 'TASK',
22581
+ 'PROMPT',
22582
+ 'EXPECT',
22583
+ 'FORMAT',
22584
+ 'MODEL',
22585
+ 'SAMPLE',
22889
22586
  'FROM',
22890
22587
  'IMPORT',
22891
22588
  'IMPORTS',
22892
22589
  'TEAM',
22893
- ]);
22590
+ 'TODO',
22591
+ 'NOTE',
22592
+ 'NOTES',
22593
+ 'NONCE',
22594
+ ];
22595
+ /**
22596
+ * Regex pattern to match horizontal lines.
22597
+ *
22598
+ * @private function of BookEditorMonaco
22599
+ */
22600
+ const HORIZONTAL_LINE_PATTERN$1 = /^[\s]*[-_*][\s]*[-_*][\s]*[-_*][\s]*[-_*]*[\s]*$/;
22601
+ const BOOK_EDITOR_COMMITMENT_LINE_REGEX = createCommitmentLineRegex(BOOK_EDITOR_COMMITMENT_TYPES);
22602
+ const AGENT_REFERENCE_COMMITMENT_LINE_REGEX = createCommitmentLineRegex(AGENT_REFERENCE_COMMITMENT_TYPES);
22894
22603
  /**
22895
22604
  * Agent reference helpers for `BookEditorMonaco`.
22896
22605
  *
@@ -23045,26 +22754,60 @@ function collectLineStartOffsets(content, sourceLines) {
23045
22754
  * @private function of BookEditorMonaco
23046
22755
  */
23047
22756
  function collectAgentReferenceCommitmentLineRanges(content, sourceLines) {
23048
- var _a, _b;
23049
- const parsed = parseAgentSourceWithCommitments(content);
23050
22757
  const ranges = [];
23051
- for (let index = 0; index < parsed.commitments.length; index++) {
23052
- const commitment = parsed.commitments[index];
23053
- if (!commitment || !AGENT_REFERENCE_COMMITMENT_TYPES.has(commitment.type)) {
22758
+ let activeRangeStartLineNumber = null;
22759
+ let isInsideCodeBlock = false;
22760
+ const startLineIndex = findBookBodyStartLineIndex(sourceLines);
22761
+ for (let lineIndex = startLineIndex; lineIndex < sourceLines.length; lineIndex++) {
22762
+ const line = sourceLines[lineIndex] || '';
22763
+ const trimmedLine = line.trim();
22764
+ if (trimmedLine.startsWith('```')) {
22765
+ isInsideCodeBlock = !isInsideCodeBlock;
22766
+ continue;
22767
+ }
22768
+ if (isInsideCodeBlock) {
22769
+ continue;
22770
+ }
22771
+ if (HORIZONTAL_LINE_PATTERN$1.test(line)) {
22772
+ if (activeRangeStartLineNumber !== null) {
22773
+ ranges.push({
22774
+ startLineNumber: activeRangeStartLineNumber,
22775
+ endLineNumber: lineIndex,
22776
+ });
22777
+ activeRangeStartLineNumber = null;
22778
+ }
23054
22779
  continue;
23055
22780
  }
23056
- const nextCommitmentStartLine = (_b = (_a = parsed.commitments[index + 1]) === null || _a === void 0 ? void 0 : _a.lineNumber) !== null && _b !== void 0 ? _b : sourceLines.length + 1;
23057
- const endLineNumber = Math.min(nextCommitmentStartLine - 1, sourceLines.length);
23058
- if (commitment.lineNumber > endLineNumber) {
22781
+ if (!BOOK_EDITOR_COMMITMENT_LINE_REGEX.test(trimmedLine)) {
23059
22782
  continue;
23060
22783
  }
22784
+ if (activeRangeStartLineNumber !== null) {
22785
+ ranges.push({
22786
+ startLineNumber: activeRangeStartLineNumber,
22787
+ endLineNumber: lineIndex,
22788
+ });
22789
+ }
22790
+ activeRangeStartLineNumber = AGENT_REFERENCE_COMMITMENT_LINE_REGEX.test(trimmedLine) ? lineIndex + 1 : null;
22791
+ }
22792
+ if (activeRangeStartLineNumber !== null) {
23061
22793
  ranges.push({
23062
- startLineNumber: commitment.lineNumber,
23063
- endLineNumber,
22794
+ startLineNumber: activeRangeStartLineNumber,
22795
+ endLineNumber: sourceLines.length,
23064
22796
  });
23065
22797
  }
23066
22798
  return ranges;
23067
22799
  }
22800
+ function createCommitmentLineRegex(commitmentTypes) {
22801
+ const commitmentPattern = [...commitmentTypes]
22802
+ .sort((a, b) => b.length - a.length)
22803
+ .map((type) => type.replace(/\s+/, '\\s+'))
22804
+ .join('|');
22805
+ return new RegExp(`^\\s*(${commitmentPattern})(?=\\s|$)`, 'i');
22806
+ }
22807
+ function findBookBodyStartLineIndex(sourceLines) {
22808
+ const titleLineIndex = sourceLines.findIndex((line) => line.trim().length > 0);
22809
+ return titleLineIndex === -1 ? 0 : titleLineIndex + 1;
22810
+ }
23068
22811
  /**
23069
22812
  * Agent reference helpers for `BookEditorMonaco`.
23070
22813
  *
@@ -23292,19 +23035,26 @@ function ensureBookEditorMonacoLanguage(monaco, theme = BOOK_EDITOR_RENDER_THEME
23292
23035
  monacoWithLanguageState[BOOK_EDITOR_LANGUAGE_INITIALIZED_FLAG] = true;
23293
23036
  monacoWithLanguageState[BOOK_EDITOR_THEME_MODE_FLAG] = renderedTheme;
23294
23037
  monaco.languages.register({ id: BookEditorMonacoConstants.BOOK_LANGUAGE_ID });
23295
- const commitmentDefinitions = getAllCommitmentDefinitions();
23296
- const commitmentTypes = [...new Set(commitmentDefinitions.map(({ type }) => type))];
23297
- const commitmentDefinitionByType = new Map(commitmentDefinitions.map((definition) => [definition.type, definition]));
23298
- const completionCommitmentTypes = [...commitmentTypes].sort((leftType, rightType) => {
23299
- const leftDefinition = commitmentDefinitionByType.get(leftType);
23300
- const rightDefinition = commitmentDefinitionByType.get(rightType);
23301
- const leftRank = (leftDefinition === null || leftDefinition === void 0 ? void 0 : leftDefinition.isUnfinished) ? 1 : 0;
23302
- const rightRank = (rightDefinition === null || rightDefinition === void 0 ? void 0 : rightDefinition.isUnfinished) ? 1 : 0;
23303
- if (leftRank !== rightRank) {
23304
- return leftRank - rightRank;
23305
- }
23306
- return commitmentTypes.indexOf(leftType) - commitmentTypes.indexOf(rightType);
23307
- });
23038
+ const commitmentTypes = [
23039
+ 'GOAL',
23040
+ 'RULE',
23041
+ 'PERSONA',
23042
+ 'KNOWLEDGE',
23043
+ 'TASK',
23044
+ 'PROMPT',
23045
+ 'EXPECT',
23046
+ 'FORMAT',
23047
+ 'MODEL',
23048
+ 'SAMPLE',
23049
+ 'FROM',
23050
+ 'IMPORT',
23051
+ 'IMPORTS',
23052
+ 'TEAM',
23053
+ ...TODO_COMMITMENT_TYPES,
23054
+ ...NOTE_COMMITMENT_TYPES,
23055
+ 'REMOVE',
23056
+ ];
23057
+ const completionCommitmentTypes = [...commitmentTypes];
23308
23058
  const noteLikeCommitmentTypeSet = new Set([...TODO_COMMITMENT_TYPES, ...NOTE_COMMITMENT_TYPES]);
23309
23059
  const noteLikeCommitmentStates = createNoteLikeCommitmentStates(commitmentTypes);
23310
23060
  const executableCommitmentTypes = commitmentTypes.filter((type) => !noteLikeCommitmentTypeSet.has(type.toUpperCase()));
@@ -23361,27 +23111,17 @@ function ensureBookEditorMonacoLanguage(monaco, theme = BOOK_EDITOR_RENDER_THEME
23361
23111
  startColumn: word.startColumn,
23362
23112
  endColumn: word.endColumn,
23363
23113
  };
23364
- const suggestions = completionCommitmentTypes.map((type, index) => {
23365
- var _a;
23366
- const definition = commitmentDefinitionByType.get(type);
23367
- const notice = definition ? getCommitmentNoticeMetadata(definition) : null;
23368
- const completionDocumentation = notice
23369
- ? `${notice.detailLabel}. ${notice.message}${notice.kind === 'deprecated'
23370
- ? formatCommitmentReplacementText((_a = definition === null || definition === void 0 ? void 0 : definition.deprecation) === null || _a === void 0 ? void 0 : _a.replacedBy)
23371
- : ''}`
23372
- : (definition === null || definition === void 0 ? void 0 : definition.description) || 'Commitment';
23373
- return {
23374
- label: type,
23375
- kind: monaco.languages.CompletionItemKind.Keyword,
23376
- insertText: type,
23377
- range,
23378
- sortText: index.toString().padStart(4, '0'),
23379
- detail: (notice === null || notice === void 0 ? void 0 : notice.detailLabel) || 'Commitment',
23380
- documentation: {
23381
- value: completionDocumentation,
23382
- },
23383
- };
23384
- });
23114
+ const suggestions = completionCommitmentTypes.map((type, index) => ({
23115
+ label: type,
23116
+ kind: monaco.languages.CompletionItemKind.Keyword,
23117
+ insertText: type,
23118
+ range,
23119
+ sortText: index.toString().padStart(4, '0'),
23120
+ detail: 'Commitment',
23121
+ documentation: {
23122
+ value: 'Book commitment',
23123
+ },
23124
+ }));
23385
23125
  return { suggestions };
23386
23126
  },
23387
23127
  });
@@ -24667,7 +24407,7 @@ function BookEditorMonaco(props) {
24667
24407
  editor,
24668
24408
  handleFiles,
24669
24409
  });
24670
- const combinedDiagnostics = [...(diagnostics || []), ...createDeprecatedCommitmentDiagnostics(value)];
24410
+ const combinedDiagnostics = [...(diagnostics || []), ...createDeprecatedCommitmentDiagnostics()];
24671
24411
  const isActionBarVisible = isBookEditorMonacoActionbarVisible({
24672
24412
  hoistedMenuItems,
24673
24413
  isUploadButtonShown,
@@ -24761,6 +24501,36 @@ function BookEditor(props) {
24761
24501
  return isFullscreen && typeof document !== 'undefined' ? createPortal(editorContent, document.body) : editorContent;
24762
24502
  }
24763
24503
 
24504
+ var BookEditor$1 = /*#__PURE__*/Object.freeze({
24505
+ __proto__: null,
24506
+ DEFAULT_BOOK_EDITOR_HEIGHT: DEFAULT_BOOK_EDITOR_HEIGHT,
24507
+ BookEditor: BookEditor
24508
+ });
24509
+
24510
+ /**
24511
+ * Renders a book editor
24512
+ *
24513
+ * @public exported from `@promptbook/components`
24514
+ */
24515
+ function BookEditorForClient(props) {
24516
+ const [BookEditorComponent, setBookEditorComponent] = useState(null);
24517
+ useEffect(() => {
24518
+ let isCancelled = false;
24519
+ void Promise.resolve().then(function () { return BookEditor$1; }).then(({ BookEditor }) => {
24520
+ if (!isCancelled) {
24521
+ setBookEditorComponent(() => BookEditor);
24522
+ }
24523
+ });
24524
+ return () => {
24525
+ isCancelled = true;
24526
+ };
24527
+ }, []);
24528
+ if (!BookEditorComponent) {
24529
+ return jsx("div", { style: { minHeight: 260 } });
24530
+ }
24531
+ return jsx(BookEditorComponent, { ...props });
24532
+ }
24533
+
24764
24534
  /**
24765
24535
  * Restricts an Updatable to a (2) BehaviorSubject variant
24766
24536
  *
@@ -26515,7 +26285,7 @@ function normalizeMarkdownSublists(markdown) {
26515
26285
  function createChatMarkdownConverter(options) {
26516
26286
  var _a;
26517
26287
  const citationReferenceClassName = (_a = options === null || options === void 0 ? void 0 : options.citationReferenceClassName) !== null && _a !== void 0 ? _a : DEFAULT_CITATION_REFERENCE_CLASS_NAME;
26518
- return new Converter({
26288
+ return new showdown.Converter({
26519
26289
  flavor: 'github',
26520
26290
  tables: true,
26521
26291
  strikethrough: true,
@@ -42689,6 +42459,103 @@ function deduplicatePreparationToolCalls(toolCalls) {
42689
42459
  return toolCalls;
42690
42460
  }
42691
42461
 
42462
+ /**
42463
+ * Priority order for the important commitments shown first in catalogues and intellisense.
42464
+ *
42465
+ * Canonical singular names stay ahead of their plural aliases so the most important
42466
+ * commitments remain easy to scan.
42467
+ *
42468
+ * @private internal constant of commitment catalog sorting
42469
+ */
42470
+ const IMPORTANT_COMMITMENT_TYPE_SORT_ORDER = new Map([
42471
+ ['GOAL', 0],
42472
+ ['RULE', 1],
42473
+ ['KNOWLEDGE', 2],
42474
+ ['TEAM', 3],
42475
+ ['GOALS', 4],
42476
+ ['RULES', 5],
42477
+ ]);
42478
+ /**
42479
+ * Sort rank used when unfinished, low-level, and deprecated commitments should be grouped last.
42480
+ *
42481
+ * @private internal constant of commitment catalog sorting
42482
+ */
42483
+ const COMMITMENT_STATUS_SORT_ORDER = {
42484
+ normal: 0,
42485
+ deprecated: 1,
42486
+ unfinished: 2,
42487
+ lowLevel: 3,
42488
+ };
42489
+ /**
42490
+ * Resolves the relative sort rank of one commitment status.
42491
+ *
42492
+ * @param definition - Commitment definition to rank.
42493
+ * @param options - Sorting options.
42494
+ * @returns Relative sort rank for the definition.
42495
+ *
42496
+ * @private internal helper of commitment catalog sorting
42497
+ */
42498
+ function resolveCommitmentStatusSortRank(definition, options) {
42499
+ let statusSortRank = COMMITMENT_STATUS_SORT_ORDER.normal;
42500
+ if (options.isDeprecatedLast && definition.deprecation) {
42501
+ statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.deprecated);
42502
+ }
42503
+ if (options.isUnfinishedLast && definition.isUnfinished) {
42504
+ statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.unfinished);
42505
+ }
42506
+ if (options.isLowLevelLast && definition.isLowLevel) {
42507
+ statusSortRank = Math.max(statusSortRank, COMMITMENT_STATUS_SORT_ORDER.lowLevel);
42508
+ }
42509
+ return statusSortRank;
42510
+ }
42511
+ /**
42512
+ * Sorts commitment definitions so the important ones stay at the top.
42513
+ *
42514
+ * @param commitmentDefinitions - Definitions to sort.
42515
+ * @param options - Sorting options.
42516
+ * @returns Sorted commitment definitions.
42517
+ *
42518
+ * @private internal helper of commitment catalog sorting
42519
+ */
42520
+ function sortCommitmentDefinitions(commitmentDefinitions, options = {}) {
42521
+ return [...commitmentDefinitions]
42522
+ .map((definition, index) => ({
42523
+ definition,
42524
+ index,
42525
+ }))
42526
+ .sort((left, right) => {
42527
+ var _a, _b;
42528
+ if (left.definition.isImportant !== right.definition.isImportant) {
42529
+ return left.definition.isImportant ? -1 : 1;
42530
+ }
42531
+ if (left.definition.isImportant && right.definition.isImportant) {
42532
+ const leftPriority = (_a = IMPORTANT_COMMITMENT_TYPE_SORT_ORDER.get(left.definition.type)) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER;
42533
+ const rightPriority = (_b = IMPORTANT_COMMITMENT_TYPE_SORT_ORDER.get(right.definition.type)) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
42534
+ if (leftPriority !== rightPriority) {
42535
+ return leftPriority - rightPriority;
42536
+ }
42537
+ }
42538
+ const leftStatusSortRank = resolveCommitmentStatusSortRank(left.definition, options);
42539
+ const rightStatusSortRank = resolveCommitmentStatusSortRank(right.definition, options);
42540
+ if (leftStatusSortRank !== rightStatusSortRank) {
42541
+ return leftStatusSortRank - rightStatusSortRank;
42542
+ }
42543
+ return left.index - right.index;
42544
+ })
42545
+ .map(({ definition }) => definition);
42546
+ }
42547
+
42548
+ /**
42549
+ * Gets all available commitment definitions
42550
+ *
42551
+ * @returns Array of all commitment definitions
42552
+ *
42553
+ * @public exported from `@promptbook/core`
42554
+ */
42555
+ function getAllCommitmentDefinitions() {
42556
+ return $deepFreeze(sortCommitmentDefinitions(COMMITMENT_REGISTRY, { isUnfinishedLast: true, isLowLevelLast: true }));
42557
+ }
42558
+
42692
42559
  /**
42693
42560
  * Gets all tool titles provided by all commitments
42694
42561
  *
@@ -45363,7 +45230,7 @@ function $registeredScrapersMessage(availableScrapers) {
45363
45230
  * @public exported from `@promptbook/editable`
45364
45231
  */
45365
45232
  function knowledgeSourceContentToName(knowledgeSourceContent) {
45366
- const hash = SHA256(hexEncoder.parse(JSON.stringify(knowledgeSourceContent)))
45233
+ const hash = CryptoJS.SHA256(hexEncoder.parse(JSON.stringify(knowledgeSourceContent)))
45367
45234
  // <- TODO: [🥬] Encapsulate sha256 to some private utility function
45368
45235
  .toString( /* hex */)
45369
45236
  .substring(0, 20);
@@ -46211,7 +46078,7 @@ function csvParse(value /* <- TODO: string_csv */, settings, schema /* <- TODO:
46211
46078
  console.warn('CSV string contains carriage return characters, but in the CSV settings the `newline` setting does not include them. Autohealing the CSV string.');
46212
46079
  value = value.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
46213
46080
  }
46214
- const csv = parse(value, settings);
46081
+ const csv = papaparse.parse(value, settings);
46215
46082
  return csv;
46216
46083
  }
46217
46084
 
@@ -46296,10 +46163,10 @@ const CsvFormatParser = {
46296
46163
  i > index ? { ...row, [outputParameterName]: PENDING_VALUE_PLACEHOLDER } : row,
46297
46164
  );
46298
46165
  */
46299
- await onProgress(unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
46166
+ await onProgress(papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
46300
46167
  }
46301
46168
  }
46302
- return unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
46169
+ return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
46303
46170
  },
46304
46171
  },
46305
46172
  {
@@ -46327,7 +46194,7 @@ const CsvFormatParser = {
46327
46194
  return /* not await */ mapCallback({ [key]: value }, index, array.length);
46328
46195
  }));
46329
46196
  }));
46330
- return unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
46197
+ return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
46331
46198
  },
46332
46199
  },
46333
46200
  ],
@@ -48344,6 +48211,18 @@ function createBasicAgentModelRequirements(agentName) {
48344
48211
  }
48345
48212
  // TODO: [🐤] Deduplicate `AgentModelRequirements` and `ModelRequirements` model requirements
48346
48213
 
48214
+ /**
48215
+ * Gets a commitment definition by its type
48216
+ *
48217
+ * @param type The commitment type to look up
48218
+ * @returns The commitment definition or null if not found
48219
+ *
48220
+ * @public exported from `@promptbook/core`
48221
+ */
48222
+ function getCommitmentDefinition(type) {
48223
+ return COMMITMENT_REGISTRY.find((commitmentDefinition) => commitmentDefinition.type === type) || null;
48224
+ }
48225
+
48347
48226
  /**
48348
48227
  * Commitment types whose content may contain compact agent references that must be resolved before applying the commitment.
48349
48228
  *
@@ -54837,7 +54716,7 @@ function emitAgentLlmExecutionToolsAssistantPreparationProgress(options) {
54837
54716
  * Computes one stable hash from a JSON-serializable value.
54838
54717
  */
54839
54718
  function computeJsonHash$1(value) {
54840
- return SHA256(JSON.stringify(value)).toString();
54719
+ return CryptoJS.SHA256(JSON.stringify(value)).toString();
54841
54720
  }
54842
54721
  /**
54843
54722
  * Handles OpenAI AgentKit-backed executions for `AgentLlmExecutionTools`.
@@ -54995,7 +54874,7 @@ AgentLlmExecutionToolsAgentKitRunner.vectorStoreCache = new Map();
54995
54874
  * Computes one stable hash from a JSON-serializable value.
54996
54875
  */
54997
54876
  function computeJsonHash(value) {
54998
- return SHA256(JSON.stringify(value)).toString();
54877
+ return CryptoJS.SHA256(JSON.stringify(value)).toString();
54999
54878
  }
55000
54879
  /**
55001
54880
  * Removes assistant-managed requirements before the prompt is executed via OpenAI Assistants.
@@ -55851,7 +55730,7 @@ class AgentLlmExecutionTools {
55851
55730
  * Returns a virtual model name representing the agent behavior.
55852
55731
  */
55853
55732
  get modelName() {
55854
- const hash = SHA256(hexEncoder.parse(this.options.agentSource)).toString( /* hex */);
55733
+ const hash = CryptoJS.SHA256(hexEncoder.parse(this.options.agentSource)).toString( /* hex */);
55855
55734
  const agentId = hash.substring(0, 10);
55856
55735
  return (normalizeToKebabCase(this.title) + '-' + agentId);
55857
55736
  }
@@ -59260,5 +59139,5 @@ function AboutPromptbookInformation(props) {
59260
59139
  return (jsx(Fragment, { children: jsx(MarkdownContent, { content: aboutPromptbookInformation(props) }) }));
59261
59140
  }
59262
59141
 
59263
- export { AboutPromptbookInformation, AgentChat, ArrowIcon, AvatarChip, AvatarChipFromSource, AvatarProfile, AvatarProfileFromSource, BLOCKY_FLOW, BOOK_LANGUAGE_VERSION, BookEditor, BrandedQrCode, CHAT_SAVE_FORMATS, Chat, ChatEffectsSystem, ChatSoundAndVibrationPanel, ChatSoundToggle, ChatVibrationToggle, ConfettiEffect, DEFAULT_BOOK_EDITOR_HEIGHT, FAST_FLOW, GenericQrCode, HeartsEffect, LlmChat, MOCKED_CHAT_DELAY_CONFIGS, MarkdownContent, MicIcon, MockedChat, NORMAL_FLOW, PROMPTBOOK_ENGINE_VERSION, PauseIcon, PlayIcon, PromptbookAgentIntegration, PromptbookQrCode, RANDOM_FLOW, ResetIcon, SLOW_FLOW, SendIcon, StopIcon, TemplateIcon, defaultEffectConfigs, getChatSaveFormatDefinitions, htmlSaveFormatDefinition, injectCssModuleIntoShadowRoot, jsonSaveFormatDefinition, mdSaveFormatDefinition, parseMessageButtons, pdfSaveFormatDefinition, reactSaveFormatDefinition, txtSaveFormatDefinition, useChatAutoScroll, useSendMessageToLlmChat };
59142
+ export { AboutPromptbookInformation, AgentChat, ArrowIcon, AvatarChip, AvatarChipFromSource, AvatarProfile, AvatarProfileFromSource, BLOCKY_FLOW, BOOK_LANGUAGE_VERSION, BookEditor, BookEditorForClient, BrandedQrCode, CHAT_SAVE_FORMATS, Chat, ChatEffectsSystem, ChatSoundAndVibrationPanel, ChatSoundToggle, ChatVibrationToggle, ConfettiEffect, DEFAULT_BOOK_EDITOR_HEIGHT, FAST_FLOW, GenericQrCode, HeartsEffect, LlmChat, MOCKED_CHAT_DELAY_CONFIGS, MarkdownContent, MicIcon, MockedChat, NORMAL_FLOW, PROMPTBOOK_ENGINE_VERSION, PauseIcon, PlayIcon, PromptbookAgentIntegration, PromptbookQrCode, RANDOM_FLOW, ResetIcon, SLOW_FLOW, SendIcon, StopIcon, TemplateIcon, defaultEffectConfigs, getChatSaveFormatDefinitions, htmlSaveFormatDefinition, injectCssModuleIntoShadowRoot, jsonSaveFormatDefinition, mdSaveFormatDefinition, parseMessageButtons, pdfSaveFormatDefinition, reactSaveFormatDefinition, txtSaveFormatDefinition, useChatAutoScroll, useSendMessageToLlmChat };
59264
59143
  //# sourceMappingURL=index.es.js.map