@promptbook/wizard 0.103.0-55 → 0.103.0-56
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 +837 -413
- package/esm/index.es.js.map +1 -1
- package/esm/typings/src/_packages/core.index.d.ts +6 -8
- package/esm/typings/src/_packages/types.index.d.ts +1 -1
- package/esm/typings/src/book-components/Chat/LlmChat/LlmChatProps.d.ts +5 -0
- package/esm/typings/src/commitments/META_COLOR/META_COLOR.d.ts +6 -0
- package/esm/typings/src/commitments/META_FONT/META_FONT.d.ts +42 -0
- package/esm/typings/src/commitments/USE/USE.d.ts +53 -0
- package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.d.ts +38 -0
- package/esm/typings/src/commitments/USE_BROWSER/USE_BROWSER.test.d.ts +1 -0
- package/esm/typings/src/commitments/{IMPORTANT/IMPORTANT.d.ts → USE_MCP/USE_MCP.d.ts} +16 -5
- package/esm/typings/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +38 -0
- package/esm/typings/src/commitments/index.d.ts +93 -1
- package/esm/typings/src/playground/playground.d.ts +3 -0
- package/esm/typings/src/utils/color/Color.d.ts +8 -0
- package/esm/typings/src/utils/color/css-colors.d.ts +1 -0
- package/esm/typings/src/version.d.ts +1 -1
- package/package.json +2 -2
- package/umd/index.umd.js +850 -426
- package/umd/index.umd.js.map +1 -1
- package/esm/typings/src/commitments/registry.d.ts +0 -68
- package/esm/typings/src/playground/playground1.d.ts +0 -2
package/esm/index.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import spaceTrim, { spaceTrim as spaceTrim$1 } from 'spacetrim';
|
|
1
|
+
import spaceTrim$2, { spaceTrim as spaceTrim$1 } from 'spacetrim';
|
|
2
2
|
import { randomBytes } from 'crypto';
|
|
3
3
|
import { io } from 'socket.io-client';
|
|
4
4
|
import Anthropic from '@anthropic-ai/sdk';
|
|
@@ -36,7 +36,7 @@ const BOOK_LANGUAGE_VERSION = '2.0.0';
|
|
|
36
36
|
* @generated
|
|
37
37
|
* @see https://github.com/webgptorg/promptbook
|
|
38
38
|
*/
|
|
39
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.103.0-
|
|
39
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.103.0-56';
|
|
40
40
|
/**
|
|
41
41
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
|
42
42
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
@@ -90,6 +90,17 @@ const REMOTE_SERVER_URLS = [
|
|
|
90
90
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
91
91
|
*/
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Trims string from all 4 sides
|
|
95
|
+
*
|
|
96
|
+
* Note: This is a re-exported function from the `spacetrim` package which is
|
|
97
|
+
* Developed by same author @hejny as this package
|
|
98
|
+
*
|
|
99
|
+
* @public exported from `@promptbook/utils`
|
|
100
|
+
* @see https://github.com/hejny/spacetrim#usage
|
|
101
|
+
*/
|
|
102
|
+
const spaceTrim = spaceTrim$1;
|
|
103
|
+
|
|
93
104
|
/**
|
|
94
105
|
* Just marks a place of place where should be something implemented
|
|
95
106
|
* No side effects.
|
|
@@ -151,6 +162,7 @@ function take(initialValue) {
|
|
|
151
162
|
* @public exported from `@promptbook/color`
|
|
152
163
|
*/
|
|
153
164
|
const CSS_COLORS = {
|
|
165
|
+
promptbook: '#79EAFD',
|
|
154
166
|
transparent: 'rgba(0,0,0,0)',
|
|
155
167
|
aliceblue: '#f0f8ff',
|
|
156
168
|
antiquewhite: '#faebd7',
|
|
@@ -366,6 +378,28 @@ class Color {
|
|
|
366
378
|
throw new Error(`Can not create color from given object`);
|
|
367
379
|
}
|
|
368
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Creates a new Color instance from miscellaneous formats
|
|
383
|
+
* It just does not throw error when it fails, it returns PROMPTBOOK_COLOR instead
|
|
384
|
+
*
|
|
385
|
+
* @param color
|
|
386
|
+
* @returns Color object
|
|
387
|
+
*/
|
|
388
|
+
static fromSafe(color) {
|
|
389
|
+
try {
|
|
390
|
+
return Color.from(color);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
// <- Note: Can not use `assertsError(error)` here because it causes circular dependency
|
|
394
|
+
console.warn(spaceTrim((block) => `
|
|
395
|
+
Color.fromSafe error:
|
|
396
|
+
${block(error.message)}
|
|
397
|
+
|
|
398
|
+
Returning default PROMPTBOOK_COLOR.
|
|
399
|
+
`));
|
|
400
|
+
return Color.fromString('promptbook');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
369
403
|
/**
|
|
370
404
|
* Creates a new Color instance from miscellaneous string formats
|
|
371
405
|
*
|
|
@@ -975,7 +1009,7 @@ const ADMIN_GITHUB_NAME = 'hejny';
|
|
|
975
1009
|
*
|
|
976
1010
|
* @public exported from `@promptbook/core`
|
|
977
1011
|
*/
|
|
978
|
-
const PROMPTBOOK_COLOR = Color.
|
|
1012
|
+
const PROMPTBOOK_COLOR = Color.fromString('promptbook');
|
|
979
1013
|
// <- TODO: [🧠][🈵] Using `Color` here increases the package size approx 3kb, maybe remove it
|
|
980
1014
|
/**
|
|
981
1015
|
* Colors for syntax highlighting in the `<BookEditor/>`
|
|
@@ -1291,7 +1325,7 @@ function $deepFreeze(objectValue) {
|
|
|
1291
1325
|
function getErrorReportUrl(error) {
|
|
1292
1326
|
const report = {
|
|
1293
1327
|
title: `🐜 Error report from ${NAME}`,
|
|
1294
|
-
body: spaceTrim((block) => `
|
|
1328
|
+
body: spaceTrim$2((block) => `
|
|
1295
1329
|
|
|
1296
1330
|
|
|
1297
1331
|
\`${error.name || 'Error'}\` has occurred in the [${NAME}], please look into it @${ADMIN_GITHUB_NAME}.
|
|
@@ -1449,7 +1483,7 @@ function checkSerializableAsJson(options) {
|
|
|
1449
1483
|
}
|
|
1450
1484
|
else if (typeof value === 'object') {
|
|
1451
1485
|
if (value instanceof Date) {
|
|
1452
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
1486
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
1453
1487
|
\`${name}\` is Date
|
|
1454
1488
|
|
|
1455
1489
|
Use \`string_date_iso8601\` instead
|
|
@@ -1468,7 +1502,7 @@ function checkSerializableAsJson(options) {
|
|
|
1468
1502
|
throw new UnexpectedError(`${name} is RegExp`);
|
|
1469
1503
|
}
|
|
1470
1504
|
else if (value instanceof Error) {
|
|
1471
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
1505
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
1472
1506
|
\`${name}\` is unserialized Error
|
|
1473
1507
|
|
|
1474
1508
|
Use function \`serializeError\`
|
|
@@ -1491,7 +1525,7 @@ function checkSerializableAsJson(options) {
|
|
|
1491
1525
|
}
|
|
1492
1526
|
catch (error) {
|
|
1493
1527
|
assertsError(error);
|
|
1494
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
1528
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
1495
1529
|
\`${name}\` is not serializable
|
|
1496
1530
|
|
|
1497
1531
|
${block(error.stack || error.message)}
|
|
@@ -1523,7 +1557,7 @@ function checkSerializableAsJson(options) {
|
|
|
1523
1557
|
}
|
|
1524
1558
|
}
|
|
1525
1559
|
else {
|
|
1526
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
1560
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
1527
1561
|
\`${name}\` is unknown type
|
|
1528
1562
|
|
|
1529
1563
|
Additional message for \`${name}\`:
|
|
@@ -2254,7 +2288,7 @@ function deserializeError(error) {
|
|
|
2254
2288
|
message = `${name}: ${message}`;
|
|
2255
2289
|
}
|
|
2256
2290
|
if (stack !== undefined && stack !== '') {
|
|
2257
|
-
message = spaceTrim((block) => `
|
|
2291
|
+
message = spaceTrim$2((block) => `
|
|
2258
2292
|
${block(message)}
|
|
2259
2293
|
|
|
2260
2294
|
Original stack trace:
|
|
@@ -2311,7 +2345,7 @@ async function createRemoteClient(options) {
|
|
|
2311
2345
|
const remoteServerUrlParsed = new URL(remoteServerUrl);
|
|
2312
2346
|
if (remoteServerUrlParsed.pathname !== '/' && remoteServerUrlParsed.pathname !== '') {
|
|
2313
2347
|
remoteServerUrlParsed.pathname = '/';
|
|
2314
|
-
throw new Error(spaceTrim((block) => `
|
|
2348
|
+
throw new Error(spaceTrim$2((block) => `
|
|
2315
2349
|
Remote server requires root url \`/\`
|
|
2316
2350
|
|
|
2317
2351
|
You have provided \`remoteServerUrl\`:
|
|
@@ -3538,7 +3572,7 @@ class AnthropicClaudeExecutionTools {
|
|
|
3538
3572
|
getDefaultModel(defaultModelName) {
|
|
3539
3573
|
const model = ANTHROPIC_CLAUDE_MODELS.find(({ modelName }) => modelName.startsWith(defaultModelName));
|
|
3540
3574
|
if (model === undefined) {
|
|
3541
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
3575
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
3542
3576
|
Cannot find model in Anthropic Claude models with name "${defaultModelName}" which should be used as default.
|
|
3543
3577
|
|
|
3544
3578
|
Available models:
|
|
@@ -4778,7 +4812,7 @@ function createExecutionToolsFromVercelProvider(options) {
|
|
|
4778
4812
|
const modelName = modelRequirements.modelName ||
|
|
4779
4813
|
((_a = availableModels.find(({ modelVariant }) => modelVariant === 'CHAT')) === null || _a === void 0 ? void 0 : _a.modelName);
|
|
4780
4814
|
if (!modelName) {
|
|
4781
|
-
throw new PipelineExecutionError(spaceTrim(`
|
|
4815
|
+
throw new PipelineExecutionError(spaceTrim$2(`
|
|
4782
4816
|
Can not determine which model to use.
|
|
4783
4817
|
|
|
4784
4818
|
You need to provide at least one of:
|
|
@@ -6156,7 +6190,7 @@ class OpenAiCompatibleExecutionTools {
|
|
|
6156
6190
|
// Note: Match exact or prefix for model families
|
|
6157
6191
|
const model = this.HARDCODED_MODELS.find(({ modelName }) => modelName === defaultModelName || modelName.startsWith(defaultModelName));
|
|
6158
6192
|
if (model === undefined) {
|
|
6159
|
-
throw new PipelineExecutionError(spaceTrim((block) => `
|
|
6193
|
+
throw new PipelineExecutionError(spaceTrim$2((block) => `
|
|
6160
6194
|
Cannot find model in ${this.title} models with name "${defaultModelName}" which should be used as default.
|
|
6161
6195
|
|
|
6162
6196
|
Available models:
|
|
@@ -6900,18 +6934,26 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
|
|
|
6900
6934
|
modelName: 'assistant',
|
|
6901
6935
|
// <- [🧠] What is the best value here
|
|
6902
6936
|
});
|
|
6937
|
+
// Build thread messages: include previous thread messages + current user message
|
|
6938
|
+
const threadMessages = [];
|
|
6939
|
+
// TODO: [🈹] Maybe this should not be here but in other place, look at commit 39d705e75e5bcf7a818c3af36bc13e1c8475c30c
|
|
6940
|
+
// Add previous messages from thread (if any)
|
|
6941
|
+
if ('thread' in prompt &&
|
|
6942
|
+
Array.isArray(prompt.thread)) {
|
|
6943
|
+
const previousMessages = prompt.thread.map((msg) => ({
|
|
6944
|
+
role: (msg.role === 'assistant' ? 'assistant' : 'user'),
|
|
6945
|
+
content: msg.content,
|
|
6946
|
+
}));
|
|
6947
|
+
threadMessages.push(...previousMessages);
|
|
6948
|
+
}
|
|
6949
|
+
// Always add the current user message
|
|
6950
|
+
threadMessages.push({ role: 'user', content: rawPromptContent });
|
|
6903
6951
|
const rawRequest = {
|
|
6904
6952
|
// TODO: [👨👨👧👧] ...modelSettings,
|
|
6905
6953
|
// TODO: [👨👨👧👧][🧠] What about system message for assistants, does it make sense - combination of OpenAI assistants with Promptbook Personas
|
|
6906
6954
|
assistant_id: this.assistantId,
|
|
6907
6955
|
thread: {
|
|
6908
|
-
messages:
|
|
6909
|
-
Array.isArray(prompt.thread)
|
|
6910
|
-
? prompt.thread.map((msg) => ({
|
|
6911
|
-
role: msg.role === 'assistant' ? 'assistant' : 'user',
|
|
6912
|
-
content: msg.content,
|
|
6913
|
-
}))
|
|
6914
|
-
: [{ role: 'user', content: rawPromptContent }],
|
|
6956
|
+
messages: threadMessages,
|
|
6915
6957
|
},
|
|
6916
6958
|
// <- TODO: Add user identification here> user: this.options.user,
|
|
6917
6959
|
};
|
|
@@ -6931,7 +6973,7 @@ class OpenAiAssistantExecutionTools extends OpenAiExecutionTools {
|
|
|
6931
6973
|
console.info('textDelta', textDelta.value);
|
|
6932
6974
|
}
|
|
6933
6975
|
const chunk = {
|
|
6934
|
-
content:
|
|
6976
|
+
content: snapshot.value,
|
|
6935
6977
|
modelName: 'assistant',
|
|
6936
6978
|
timing: {
|
|
6937
6979
|
start,
|
|
@@ -8103,7 +8145,7 @@ function pipelineJsonToString(pipelineJson) {
|
|
|
8103
8145
|
pipelineString += '\n\n';
|
|
8104
8146
|
pipelineString += '```' + contentLanguage;
|
|
8105
8147
|
pipelineString += '\n';
|
|
8106
|
-
pipelineString += spaceTrim(content);
|
|
8148
|
+
pipelineString += spaceTrim$2(content);
|
|
8107
8149
|
// <- TODO: [main] !!3 Escape
|
|
8108
8150
|
// <- TODO: [🧠] Some clear strategy how to spaceTrim the blocks
|
|
8109
8151
|
pipelineString += '\n';
|
|
@@ -8718,7 +8760,7 @@ function serializeError(error) {
|
|
|
8718
8760
|
const { name, message, stack } = error;
|
|
8719
8761
|
const { id } = error;
|
|
8720
8762
|
if (!Object.keys(ALL_ERRORS).includes(name)) {
|
|
8721
|
-
console.error(spaceTrim((block) => `
|
|
8763
|
+
console.error(spaceTrim$2((block) => `
|
|
8722
8764
|
|
|
8723
8765
|
Cannot serialize error with name "${name}"
|
|
8724
8766
|
|
|
@@ -8751,7 +8793,7 @@ function jsonParse(value) {
|
|
|
8751
8793
|
}
|
|
8752
8794
|
else if (typeof value !== 'string') {
|
|
8753
8795
|
console.error('Can not parse JSON from non-string value.', { text: value });
|
|
8754
|
-
throw new Error(spaceTrim(`
|
|
8796
|
+
throw new Error(spaceTrim$2(`
|
|
8755
8797
|
Can not parse JSON from non-string value.
|
|
8756
8798
|
|
|
8757
8799
|
The value type: ${typeof value}
|
|
@@ -8765,7 +8807,7 @@ function jsonParse(value) {
|
|
|
8765
8807
|
if (!(error instanceof Error)) {
|
|
8766
8808
|
throw error;
|
|
8767
8809
|
}
|
|
8768
|
-
throw new Error(spaceTrim((block) => `
|
|
8810
|
+
throw new Error(spaceTrim$2((block) => `
|
|
8769
8811
|
${block(error.message)}
|
|
8770
8812
|
|
|
8771
8813
|
The expected JSON text:
|
|
@@ -9236,14 +9278,14 @@ class MultipleLlmExecutionTools {
|
|
|
9236
9278
|
if (description === undefined) {
|
|
9237
9279
|
return headLine;
|
|
9238
9280
|
}
|
|
9239
|
-
return spaceTrim((block) => `
|
|
9281
|
+
return spaceTrim$2((block) => `
|
|
9240
9282
|
${headLine}
|
|
9241
9283
|
|
|
9242
9284
|
${ /* <- Note: Indenting the description: */block(description)}
|
|
9243
9285
|
`);
|
|
9244
9286
|
})
|
|
9245
9287
|
.join('\n\n');
|
|
9246
|
-
return spaceTrim((block) => `
|
|
9288
|
+
return spaceTrim$2((block) => `
|
|
9247
9289
|
Multiple LLM Providers:
|
|
9248
9290
|
|
|
9249
9291
|
${block(innerModelsTitlesAndDescriptions)}
|
|
@@ -9334,7 +9376,7 @@ class MultipleLlmExecutionTools {
|
|
|
9334
9376
|
// 1) OpenAI throw PipelineExecutionError: Parameter `{knowledge}` is not defined
|
|
9335
9377
|
// 2) AnthropicClaude throw PipelineExecutionError: Parameter `{knowledge}` is not defined
|
|
9336
9378
|
// 3) ...
|
|
9337
|
-
spaceTrim((block) => `
|
|
9379
|
+
spaceTrim$2((block) => `
|
|
9338
9380
|
All execution tools of ${this.title} failed:
|
|
9339
9381
|
|
|
9340
9382
|
${block(errors
|
|
@@ -9347,7 +9389,7 @@ class MultipleLlmExecutionTools {
|
|
|
9347
9389
|
throw new PipelineExecutionError(`You have not provided any \`LlmExecutionTools\` into ${this.title}`);
|
|
9348
9390
|
}
|
|
9349
9391
|
else {
|
|
9350
|
-
throw new PipelineExecutionError(spaceTrim((block) => `
|
|
9392
|
+
throw new PipelineExecutionError(spaceTrim$2((block) => `
|
|
9351
9393
|
You have not provided any \`LlmExecutionTools\` that support model variant "${prompt.modelRequirements.modelVariant}" into ${this.title}
|
|
9352
9394
|
|
|
9353
9395
|
Available \`LlmExecutionTools\`:
|
|
@@ -9380,7 +9422,7 @@ class MultipleLlmExecutionTools {
|
|
|
9380
9422
|
*/
|
|
9381
9423
|
function joinLlmExecutionTools(title, ...llmExecutionTools) {
|
|
9382
9424
|
if (llmExecutionTools.length === 0) {
|
|
9383
|
-
const warningMessage = spaceTrim(`
|
|
9425
|
+
const warningMessage = spaceTrim$2(`
|
|
9384
9426
|
You have not provided any \`LlmExecutionTools\`
|
|
9385
9427
|
This means that you won't be able to execute any prompts that require large language models like GPT-4 or Anthropic's Claude.
|
|
9386
9428
|
|
|
@@ -9552,14 +9594,14 @@ function $registeredScrapersMessage(availableScrapers) {
|
|
|
9552
9594
|
return { ...metadata, isMetadataAviailable, isInstalled, isAvailableInTools };
|
|
9553
9595
|
});
|
|
9554
9596
|
if (metadata.length === 0) {
|
|
9555
|
-
return spaceTrim(`
|
|
9597
|
+
return spaceTrim$2(`
|
|
9556
9598
|
**No scrapers are available**
|
|
9557
9599
|
|
|
9558
9600
|
This is a unexpected behavior, you are probably using some broken version of Promptbook
|
|
9559
9601
|
At least there should be available the metadata of the scrapers
|
|
9560
9602
|
`);
|
|
9561
9603
|
}
|
|
9562
|
-
return spaceTrim((block) => `
|
|
9604
|
+
return spaceTrim$2((block) => `
|
|
9563
9605
|
Available scrapers are:
|
|
9564
9606
|
${block(metadata
|
|
9565
9607
|
.map(({ packageName, className, isMetadataAviailable, isInstalled, mimeTypes, isAvailableInBrowser, isAvailableInTools, }, i) => {
|
|
@@ -9660,7 +9702,7 @@ const promptbookFetch = async (urlOrRequest, init) => {
|
|
|
9660
9702
|
else if (urlOrRequest instanceof Request) {
|
|
9661
9703
|
url = urlOrRequest.url;
|
|
9662
9704
|
}
|
|
9663
|
-
throw new PromptbookFetchError(spaceTrim((block) => `
|
|
9705
|
+
throw new PromptbookFetchError(spaceTrim$2((block) => `
|
|
9664
9706
|
Can not fetch "${url}"
|
|
9665
9707
|
|
|
9666
9708
|
Fetch error:
|
|
@@ -9821,7 +9863,7 @@ async function makeKnowledgeSourceHandler(knowledgeSource, tools, options) {
|
|
|
9821
9863
|
const fileExtension = getFileExtension(filename);
|
|
9822
9864
|
const mimeType = extensionToMimeType(fileExtension || '');
|
|
9823
9865
|
if (!(await isFileExisting(filename, tools.fs))) {
|
|
9824
|
-
throw new NotFoundError(spaceTrim((block) => `
|
|
9866
|
+
throw new NotFoundError(spaceTrim$2((block) => `
|
|
9825
9867
|
Can not make source handler for file which does not exist:
|
|
9826
9868
|
|
|
9827
9869
|
File:
|
|
@@ -9914,7 +9956,7 @@ async function prepareKnowledgePieces(knowledgeSources, tools, options) {
|
|
|
9914
9956
|
// <- TODO: [🪓] Here should be no need for spreading new array, just `partialPieces = partialPiecesUnchecked`
|
|
9915
9957
|
break;
|
|
9916
9958
|
}
|
|
9917
|
-
console.warn(spaceTrim((block) => `
|
|
9959
|
+
console.warn(spaceTrim$2((block) => `
|
|
9918
9960
|
Cannot scrape knowledge from source despite the scraper \`${scraper.metadata.className}\` supports the mime type "${sourceHandler.mimeType}".
|
|
9919
9961
|
|
|
9920
9962
|
The source:
|
|
@@ -9930,7 +9972,7 @@ async function prepareKnowledgePieces(knowledgeSources, tools, options) {
|
|
|
9930
9972
|
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
9931
9973
|
}
|
|
9932
9974
|
if (partialPieces === null) {
|
|
9933
|
-
throw new KnowledgeScrapeError(spaceTrim((block) => `
|
|
9975
|
+
throw new KnowledgeScrapeError(spaceTrim$2((block) => `
|
|
9934
9976
|
Cannot scrape knowledge
|
|
9935
9977
|
|
|
9936
9978
|
The source:
|
|
@@ -10424,7 +10466,7 @@ const CsvFormatParser = {
|
|
|
10424
10466
|
const { value, outputParameterName, settings, mapCallback, onProgress } = options;
|
|
10425
10467
|
const csv = csvParse(value, settings);
|
|
10426
10468
|
if (csv.errors.length !== 0) {
|
|
10427
|
-
throw new CsvFormatError(spaceTrim((block) => `
|
|
10469
|
+
throw new CsvFormatError(spaceTrim$2((block) => `
|
|
10428
10470
|
CSV parsing error
|
|
10429
10471
|
|
|
10430
10472
|
Error(s) from CSV parsing:
|
|
@@ -10469,7 +10511,7 @@ const CsvFormatParser = {
|
|
|
10469
10511
|
const { value, settings, mapCallback, onProgress } = options;
|
|
10470
10512
|
const csv = csvParse(value, settings);
|
|
10471
10513
|
if (csv.errors.length !== 0) {
|
|
10472
|
-
throw new CsvFormatError(spaceTrim((block) => `
|
|
10514
|
+
throw new CsvFormatError(spaceTrim$2((block) => `
|
|
10473
10515
|
CSV parsing error
|
|
10474
10516
|
|
|
10475
10517
|
Error(s) from CSV parsing:
|
|
@@ -10679,7 +10721,7 @@ function mapAvailableToExpectedParameters(options) {
|
|
|
10679
10721
|
}
|
|
10680
10722
|
// Phase 2️⃣: Non-matching mapping
|
|
10681
10723
|
if (expectedParameterNames.size !== availableParametersNames.size) {
|
|
10682
|
-
throw new PipelineExecutionError(spaceTrim((block) => `
|
|
10724
|
+
throw new PipelineExecutionError(spaceTrim$2((block) => `
|
|
10683
10725
|
Can not map available parameters to expected parameters
|
|
10684
10726
|
|
|
10685
10727
|
Mapped parameters:
|
|
@@ -11269,7 +11311,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11269
11311
|
return /* not await */ executeAttempts({ ...options, logLlmCall });
|
|
11270
11312
|
}
|
|
11271
11313
|
if (jokerParameterNames.length !== 0) {
|
|
11272
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
11314
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
11273
11315
|
JOKER parameters are not supported together with FOREACH command
|
|
11274
11316
|
|
|
11275
11317
|
[🧞♀️] This should be prevented in \`validatePipeline\`
|
|
@@ -11282,7 +11324,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11282
11324
|
if (formatDefinition === undefined) {
|
|
11283
11325
|
throw new UnexpectedError(
|
|
11284
11326
|
// <- TODO: [🧠][🧐] Should be formats fixed per promptbook version or behave as plugins (=> change UnexpectedError)
|
|
11285
|
-
spaceTrim((block) => `
|
|
11327
|
+
spaceTrim$2((block) => `
|
|
11286
11328
|
Unsupported format "${task.foreach.formatName}"
|
|
11287
11329
|
|
|
11288
11330
|
Available formats:
|
|
@@ -11299,7 +11341,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11299
11341
|
if (subvalueParser === undefined) {
|
|
11300
11342
|
throw new UnexpectedError(
|
|
11301
11343
|
// <- TODO: [🧠][🧐] Should be formats fixed per promptbook version or behave as plugins (=> change UnexpectedError)
|
|
11302
|
-
spaceTrim((block) => `
|
|
11344
|
+
spaceTrim$2((block) => `
|
|
11303
11345
|
Unsupported subformat name "${task.foreach.subformatName}" for format "${task.foreach.formatName}"
|
|
11304
11346
|
|
|
11305
11347
|
Available subformat names for format "${formatDefinition.formatName}":
|
|
@@ -11339,7 +11381,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11339
11381
|
if (!(error instanceof PipelineExecutionError)) {
|
|
11340
11382
|
throw error;
|
|
11341
11383
|
}
|
|
11342
|
-
const highLevelError = new PipelineExecutionError(spaceTrim((block) => `
|
|
11384
|
+
const highLevelError = new PipelineExecutionError(spaceTrim$2((block) => `
|
|
11343
11385
|
${error.message}
|
|
11344
11386
|
|
|
11345
11387
|
This is error in FOREACH command when mapping ${formatDefinition.formatName} ${subvalueParser.subvalueName} data (${index + 1}/${length})
|
|
@@ -11363,7 +11405,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11363
11405
|
...options,
|
|
11364
11406
|
priority: priority + index,
|
|
11365
11407
|
parameters: allSubparameters,
|
|
11366
|
-
pipelineIdentification: spaceTrim((block) => `
|
|
11408
|
+
pipelineIdentification: spaceTrim$2((block) => `
|
|
11367
11409
|
${block(pipelineIdentification)}
|
|
11368
11410
|
Subparameter index: ${index}
|
|
11369
11411
|
`),
|
|
@@ -11372,7 +11414,7 @@ async function executeFormatSubvalues(options) {
|
|
|
11372
11414
|
}
|
|
11373
11415
|
catch (error) {
|
|
11374
11416
|
if (length > BIG_DATASET_TRESHOLD) {
|
|
11375
|
-
console.error(spaceTrim((block) => `
|
|
11417
|
+
console.error(spaceTrim$2((block) => `
|
|
11376
11418
|
${error.message}
|
|
11377
11419
|
|
|
11378
11420
|
This is error in FOREACH command when processing ${formatDefinition.formatName} ${subvalueParser.subvalueName} data (${index + 1}/${length})
|
|
@@ -12244,8 +12286,8 @@ class MarkdownScraper {
|
|
|
12244
12286
|
knowledgeTextPieces.map(async (knowledgeTextPiece, i) => {
|
|
12245
12287
|
// Note: These are just default values, they will be overwritten by the actual values:
|
|
12246
12288
|
let name = `piece-${i}`;
|
|
12247
|
-
let title = spaceTrim(knowledgeTextPiece.substring(0, 100));
|
|
12248
|
-
const knowledgePieceContent = spaceTrim(knowledgeTextPiece);
|
|
12289
|
+
let title = spaceTrim$2(knowledgeTextPiece.substring(0, 100));
|
|
12290
|
+
const knowledgePieceContent = spaceTrim$2(knowledgeTextPiece);
|
|
12249
12291
|
let keywords = [];
|
|
12250
12292
|
const index = [];
|
|
12251
12293
|
/*
|
|
@@ -12258,7 +12300,7 @@ class MarkdownScraper {
|
|
|
12258
12300
|
isCrashedOnError: true,
|
|
12259
12301
|
});
|
|
12260
12302
|
const { title: titleRaw = 'Untitled' } = titleResult.outputParameters;
|
|
12261
|
-
title = spaceTrim(titleRaw) /* <- TODO: Maybe do in pipeline */;
|
|
12303
|
+
title = spaceTrim$2(titleRaw) /* <- TODO: Maybe do in pipeline */;
|
|
12262
12304
|
name = titleToName(title);
|
|
12263
12305
|
// --- Keywords
|
|
12264
12306
|
const keywordsResult = await prepareKeywordsExecutor({ knowledgePieceContent }).asPromise({
|
|
@@ -12413,7 +12455,7 @@ class BoilerplateScraper {
|
|
|
12413
12455
|
await $execCommand(command);
|
|
12414
12456
|
// Note: [0]
|
|
12415
12457
|
if (!(await isFileExisting(cacheFilehandler.filename, this.tools.fs))) {
|
|
12416
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
12458
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
12417
12459
|
File that was supposed to be created by Pandoc does not exist for unknown reason
|
|
12418
12460
|
|
|
12419
12461
|
Expected file:
|
|
@@ -12577,7 +12619,7 @@ class DocumentScraper {
|
|
|
12577
12619
|
await $execCommand(command);
|
|
12578
12620
|
// Note: [0]
|
|
12579
12621
|
if (!(await isFileExisting(cacheFilehandler.filename, this.tools.fs))) {
|
|
12580
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
12622
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
12581
12623
|
File that was supposed to be created by Pandoc does not exist for unknown reason
|
|
12582
12624
|
|
|
12583
12625
|
Expected file:
|
|
@@ -12728,7 +12770,7 @@ class LegacyDocumentScraper {
|
|
|
12728
12770
|
await $execCommand(command);
|
|
12729
12771
|
const files = await readdir(documentSourceOutdirPathForLibreOffice);
|
|
12730
12772
|
if (files.length !== 1) {
|
|
12731
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
12773
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
12732
12774
|
Expected exactly 1 file in the LibreOffice output directory, got ${files.length}
|
|
12733
12775
|
|
|
12734
12776
|
The temporary folder:
|
|
@@ -12742,7 +12784,7 @@ class LegacyDocumentScraper {
|
|
|
12742
12784
|
await rename(join(documentSourceOutdirPathForLibreOffice, file), cacheFilehandler.filename);
|
|
12743
12785
|
await rmdir(documentSourceOutdirPathForLibreOffice);
|
|
12744
12786
|
if (!(await isFileExisting(cacheFilehandler.filename, this.tools.fs))) {
|
|
12745
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
12787
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
12746
12788
|
File that was supposed to be created by LibreOffice does not exist for unknown reason
|
|
12747
12789
|
|
|
12748
12790
|
Expected file:
|
|
@@ -14120,227 +14162,6 @@ class GoalCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
14120
14162
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
14121
14163
|
*/
|
|
14122
14164
|
|
|
14123
|
-
/**
|
|
14124
|
-
* Placeholder commitment definition for commitments that are not yet implemented
|
|
14125
|
-
*
|
|
14126
|
-
* This commitment simply adds its content 1:1 into the system message,
|
|
14127
|
-
* preserving the original behavior until proper implementation is added.
|
|
14128
|
-
*
|
|
14129
|
-
* @public exported from `@promptbook/core`
|
|
14130
|
-
*/
|
|
14131
|
-
class NotYetImplementedCommitmentDefinition extends BaseCommitmentDefinition {
|
|
14132
|
-
constructor(type) {
|
|
14133
|
-
super(type);
|
|
14134
|
-
}
|
|
14135
|
-
/**
|
|
14136
|
-
* Short one-line description of a placeholder commitment.
|
|
14137
|
-
*/
|
|
14138
|
-
get description() {
|
|
14139
|
-
return 'Placeholder commitment that appends content verbatim to the system message.';
|
|
14140
|
-
}
|
|
14141
|
-
/**
|
|
14142
|
-
* Icon for this commitment.
|
|
14143
|
-
*/
|
|
14144
|
-
get icon() {
|
|
14145
|
-
return '🚧';
|
|
14146
|
-
}
|
|
14147
|
-
/**
|
|
14148
|
-
* Markdown documentation available at runtime.
|
|
14149
|
-
*/
|
|
14150
|
-
get documentation() {
|
|
14151
|
-
return spaceTrim$1(`
|
|
14152
|
-
# ${this.type}
|
|
14153
|
-
|
|
14154
|
-
This commitment is not yet fully implemented.
|
|
14155
|
-
|
|
14156
|
-
## Key aspects
|
|
14157
|
-
|
|
14158
|
-
- Content is appended directly to the system message.
|
|
14159
|
-
- No special processing or validation is performed.
|
|
14160
|
-
- Behavior preserved until proper implementation is added.
|
|
14161
|
-
|
|
14162
|
-
## Status
|
|
14163
|
-
|
|
14164
|
-
- **Status:** Placeholder implementation
|
|
14165
|
-
- **Effect:** Appends content prefixed by commitment type
|
|
14166
|
-
- **Future:** Will be replaced with specialized logic
|
|
14167
|
-
|
|
14168
|
-
## Examples
|
|
14169
|
-
|
|
14170
|
-
\`\`\`book
|
|
14171
|
-
Example Agent
|
|
14172
|
-
|
|
14173
|
-
PERSONA You are a helpful assistant
|
|
14174
|
-
${this.type} Your content here
|
|
14175
|
-
RULE Always be helpful
|
|
14176
|
-
\`\`\`
|
|
14177
|
-
`);
|
|
14178
|
-
}
|
|
14179
|
-
applyToAgentModelRequirements(requirements, content) {
|
|
14180
|
-
const trimmedContent = content.trim();
|
|
14181
|
-
if (!trimmedContent) {
|
|
14182
|
-
return requirements;
|
|
14183
|
-
}
|
|
14184
|
-
// Add the commitment content 1:1 to the system message
|
|
14185
|
-
const commitmentLine = `${this.type} ${trimmedContent}`;
|
|
14186
|
-
return this.appendToSystemMessage(requirements, commitmentLine, '\n\n');
|
|
14187
|
-
}
|
|
14188
|
-
}
|
|
14189
|
-
|
|
14190
|
-
/**
|
|
14191
|
-
* Registry of all available commitment definitions
|
|
14192
|
-
* This array contains instances of all commitment definitions
|
|
14193
|
-
* This is the single source of truth for all commitments in the system
|
|
14194
|
-
*
|
|
14195
|
-
* @private Use functions to access commitments instead of this array directly
|
|
14196
|
-
*/
|
|
14197
|
-
const COMMITMENT_REGISTRY = [];
|
|
14198
|
-
/**
|
|
14199
|
-
* Registers a new commitment definition
|
|
14200
|
-
* @param definition The commitment definition to register
|
|
14201
|
-
*
|
|
14202
|
-
* @public exported from `@promptbook/core`
|
|
14203
|
-
*/
|
|
14204
|
-
function registerCommitment(definition) {
|
|
14205
|
-
COMMITMENT_REGISTRY.push(definition);
|
|
14206
|
-
}
|
|
14207
|
-
/**
|
|
14208
|
-
* Gets a commitment definition by its type
|
|
14209
|
-
* @param type The commitment type to look up
|
|
14210
|
-
* @returns The commitment definition or null if not found
|
|
14211
|
-
*
|
|
14212
|
-
* @public exported from `@promptbook/core`
|
|
14213
|
-
*/
|
|
14214
|
-
function getCommitmentDefinition(type) {
|
|
14215
|
-
return COMMITMENT_REGISTRY.find((commitmentDefinition) => commitmentDefinition.type === type) || null;
|
|
14216
|
-
}
|
|
14217
|
-
/**
|
|
14218
|
-
* Gets all available commitment definitions
|
|
14219
|
-
* @returns Array of all commitment definitions
|
|
14220
|
-
*
|
|
14221
|
-
* @public exported from `@promptbook/core`
|
|
14222
|
-
*/
|
|
14223
|
-
function getAllCommitmentDefinitions() {
|
|
14224
|
-
return $deepFreeze([...COMMITMENT_REGISTRY]);
|
|
14225
|
-
}
|
|
14226
|
-
/**
|
|
14227
|
-
* TODO: !!!! Proofread this file
|
|
14228
|
-
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
14229
|
-
*/
|
|
14230
|
-
|
|
14231
|
-
/**
|
|
14232
|
-
* IMPORTANT co-commitment definition
|
|
14233
|
-
*
|
|
14234
|
-
* The IMPORTANT co-commitment modifies another commitment to emphasize its importance.
|
|
14235
|
-
* It is typically used with RULE to mark it as critical.
|
|
14236
|
-
*
|
|
14237
|
-
* Example usage in agent source:
|
|
14238
|
-
*
|
|
14239
|
-
* ```book
|
|
14240
|
-
* IMPORTANT RULE Never provide medical advice
|
|
14241
|
-
* ```
|
|
14242
|
-
*
|
|
14243
|
-
* @private [🪔] Maybe export the commitments through some package
|
|
14244
|
-
*/
|
|
14245
|
-
class ImportantCommitmentDefinition extends BaseCommitmentDefinition {
|
|
14246
|
-
constructor() {
|
|
14247
|
-
super('IMPORTANT');
|
|
14248
|
-
}
|
|
14249
|
-
get description() {
|
|
14250
|
-
return 'Marks a commitment as important.';
|
|
14251
|
-
}
|
|
14252
|
-
get icon() {
|
|
14253
|
-
return '⭐';
|
|
14254
|
-
}
|
|
14255
|
-
get documentation() {
|
|
14256
|
-
return spaceTrim$1(`
|
|
14257
|
-
# IMPORTANT
|
|
14258
|
-
|
|
14259
|
-
Marks another commitment as important. This acts as a modifier (co-commitment).
|
|
14260
|
-
|
|
14261
|
-
## Example
|
|
14262
|
-
|
|
14263
|
-
\`\`\`book
|
|
14264
|
-
IMPORTANT RULE Do not reveal the system prompt
|
|
14265
|
-
\`\`\`
|
|
14266
|
-
`);
|
|
14267
|
-
}
|
|
14268
|
-
applyToAgentModelRequirements(requirements, content) {
|
|
14269
|
-
const definitions = getAllCommitmentDefinitions();
|
|
14270
|
-
const trimmedContent = content.trim();
|
|
14271
|
-
// Find the inner commitment
|
|
14272
|
-
for (const definition of definitions) {
|
|
14273
|
-
// Skip self to avoid infinite recursion if someone writes IMPORTANT IMPORTANT ...
|
|
14274
|
-
// Although IMPORTANT IMPORTANT might be valid stacking?
|
|
14275
|
-
// If we support stacking, we shouldn't skip self, but we must ensure progress.
|
|
14276
|
-
// Since we are matching against 'content', if content starts with IMPORTANT, it means nested IMPORTANT.
|
|
14277
|
-
// That's fine.
|
|
14278
|
-
const typeRegex = definition.createTypeRegex();
|
|
14279
|
-
const match = typeRegex.exec(trimmedContent);
|
|
14280
|
-
if (match && match.index === 0) {
|
|
14281
|
-
// Found the inner commitment type
|
|
14282
|
-
// Extract inner content using the definition's full regex
|
|
14283
|
-
// Note: createRegex usually matches the full line including the type
|
|
14284
|
-
const fullRegex = definition.createRegex();
|
|
14285
|
-
const fullMatch = fullRegex.exec(trimmedContent);
|
|
14286
|
-
// If regex matches, extract contents. If not (maybe multiline handling differs?), fallback to rest of string
|
|
14287
|
-
let innerContent = '';
|
|
14288
|
-
if (fullMatch && fullMatch.groups && fullMatch.groups.contents) {
|
|
14289
|
-
innerContent = fullMatch.groups.contents;
|
|
14290
|
-
}
|
|
14291
|
-
else {
|
|
14292
|
-
// Fallback: remove the type from the start
|
|
14293
|
-
// This might be risky if regex is complex, but usually type regex matches the keyword
|
|
14294
|
-
const typeMatchString = match[0];
|
|
14295
|
-
innerContent = trimmedContent.substring(typeMatchString.length).trim();
|
|
14296
|
-
}
|
|
14297
|
-
// Apply the inner commitment
|
|
14298
|
-
const modifiedRequirements = definition.applyToAgentModelRequirements(requirements, innerContent);
|
|
14299
|
-
// Now modify the result to reflect "IMPORTANT" status
|
|
14300
|
-
// We compare the system message
|
|
14301
|
-
if (modifiedRequirements.systemMessage !== requirements.systemMessage) {
|
|
14302
|
-
const originalMsg = requirements.systemMessage;
|
|
14303
|
-
const newMsg = modifiedRequirements.systemMessage;
|
|
14304
|
-
// If the inner commitment appended something
|
|
14305
|
-
if (newMsg.startsWith(originalMsg)) {
|
|
14306
|
-
const appended = newMsg.substring(originalMsg.length);
|
|
14307
|
-
// Add "IMPORTANT: " prefix to the appended part
|
|
14308
|
-
// We need to be careful about newlines
|
|
14309
|
-
// Heuristic: If appended starts with separator (newlines), preserve them
|
|
14310
|
-
const matchSep = appended.match(/^(\s*)(.*)/s);
|
|
14311
|
-
if (matchSep) {
|
|
14312
|
-
const [, separator, text] = matchSep;
|
|
14313
|
-
// Check if it already has "Rule:" prefix or similar
|
|
14314
|
-
// We want "IMPORTANT Rule: ..."
|
|
14315
|
-
// Let's just prepend IMPORTANT to the text
|
|
14316
|
-
// But formatted nicely
|
|
14317
|
-
// If it's a rule: "\n\nRule: content"
|
|
14318
|
-
// We want "\n\nIMPORTANT Rule: content"
|
|
14319
|
-
const importantText = `IMPORTANT ${text}`;
|
|
14320
|
-
return {
|
|
14321
|
-
...modifiedRequirements,
|
|
14322
|
-
systemMessage: originalMsg + separator + importantText
|
|
14323
|
-
};
|
|
14324
|
-
}
|
|
14325
|
-
}
|
|
14326
|
-
}
|
|
14327
|
-
// If no system message change or we couldn't detect how to modify it, just return the modified requirements
|
|
14328
|
-
// Maybe the inner commitment modified metadata?
|
|
14329
|
-
return modifiedRequirements;
|
|
14330
|
-
}
|
|
14331
|
-
}
|
|
14332
|
-
// If no inner commitment found, treat as a standalone note?
|
|
14333
|
-
// Or warn?
|
|
14334
|
-
// For now, treat as no-op or maybe just append as text?
|
|
14335
|
-
// Let's treat as Note if fallback? No, explicit is better.
|
|
14336
|
-
console.warn(`IMPORTANT commitment used without a valid inner commitment: ${content}`);
|
|
14337
|
-
return requirements;
|
|
14338
|
-
}
|
|
14339
|
-
}
|
|
14340
|
-
/**
|
|
14341
|
-
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
14342
|
-
*/
|
|
14343
|
-
|
|
14344
14165
|
/**
|
|
14345
14166
|
* KNOWLEDGE commitment definition
|
|
14346
14167
|
*
|
|
@@ -15104,6 +14925,12 @@ class MetaCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15104
14925
|
* META COLOR #00ff00
|
|
15105
14926
|
* ```
|
|
15106
14927
|
*
|
|
14928
|
+
* You can also specify multiple colors separated by comma:
|
|
14929
|
+
*
|
|
14930
|
+
* ```book
|
|
14931
|
+
* META COLOR #ff0000, #00ff00, #0000ff
|
|
14932
|
+
* ```
|
|
14933
|
+
*
|
|
15107
14934
|
* @private [🪔] Maybe export the commitments through some package
|
|
15108
14935
|
*/
|
|
15109
14936
|
class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
@@ -15114,7 +14941,7 @@ class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15114
14941
|
* Short one-line description of META COLOR.
|
|
15115
14942
|
*/
|
|
15116
14943
|
get description() {
|
|
15117
|
-
return "Set the agent's accent color.";
|
|
14944
|
+
return "Set the agent's accent color or gradient.";
|
|
15118
14945
|
}
|
|
15119
14946
|
/**
|
|
15120
14947
|
* Icon for this commitment.
|
|
@@ -15129,7 +14956,7 @@ class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15129
14956
|
return spaceTrim$1(`
|
|
15130
14957
|
# META COLOR
|
|
15131
14958
|
|
|
15132
|
-
Sets the agent's accent color.
|
|
14959
|
+
Sets the agent's accent color or gradient.
|
|
15133
14960
|
|
|
15134
14961
|
## Key aspects
|
|
15135
14962
|
|
|
@@ -15137,6 +14964,7 @@ class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15137
14964
|
- Only one \`META COLOR\` should be used per agent.
|
|
15138
14965
|
- If multiple are specified, the last one takes precedence.
|
|
15139
14966
|
- Used for visual representation in user interfaces.
|
|
14967
|
+
- Can specify multiple colors separated by comma to create a gradient.
|
|
15140
14968
|
|
|
15141
14969
|
## Examples
|
|
15142
14970
|
|
|
@@ -15153,6 +14981,13 @@ class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15153
14981
|
META COLOR #e74c3c
|
|
15154
14982
|
PERSONA You are a creative and inspiring assistant
|
|
15155
14983
|
\`\`\`
|
|
14984
|
+
|
|
14985
|
+
\`\`\`book
|
|
14986
|
+
Gradient Agent
|
|
14987
|
+
|
|
14988
|
+
META COLOR #ff0000, #00ff00, #0000ff
|
|
14989
|
+
PERSONA You are a colorful agent
|
|
14990
|
+
\`\`\`
|
|
15156
14991
|
`);
|
|
15157
14992
|
}
|
|
15158
14993
|
applyToAgentModelRequirements(requirements, content) {
|
|
@@ -15174,6 +15009,91 @@ class MetaColorCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
15174
15009
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
15175
15010
|
*/
|
|
15176
15011
|
|
|
15012
|
+
/**
|
|
15013
|
+
* META FONT commitment definition
|
|
15014
|
+
*
|
|
15015
|
+
* The META FONT commitment sets the agent's font.
|
|
15016
|
+
* This commitment is special because it doesn't affect the system message,
|
|
15017
|
+
* but is handled separately in the parsing logic.
|
|
15018
|
+
*
|
|
15019
|
+
* Example usage in agent source:
|
|
15020
|
+
*
|
|
15021
|
+
* ```book
|
|
15022
|
+
* META FONT Poppins, Arial, sans-serif
|
|
15023
|
+
* META FONT Roboto
|
|
15024
|
+
* ```
|
|
15025
|
+
*
|
|
15026
|
+
* @private [🪔] Maybe export the commitments through some package
|
|
15027
|
+
*/
|
|
15028
|
+
class MetaFontCommitmentDefinition extends BaseCommitmentDefinition {
|
|
15029
|
+
constructor() {
|
|
15030
|
+
super('META FONT', ['FONT']);
|
|
15031
|
+
}
|
|
15032
|
+
/**
|
|
15033
|
+
* Short one-line description of META FONT.
|
|
15034
|
+
*/
|
|
15035
|
+
get description() {
|
|
15036
|
+
return "Set the agent's font.";
|
|
15037
|
+
}
|
|
15038
|
+
/**
|
|
15039
|
+
* Icon for this commitment.
|
|
15040
|
+
*/
|
|
15041
|
+
get icon() {
|
|
15042
|
+
return '🔤';
|
|
15043
|
+
}
|
|
15044
|
+
/**
|
|
15045
|
+
* Markdown documentation for META FONT commitment.
|
|
15046
|
+
*/
|
|
15047
|
+
get documentation() {
|
|
15048
|
+
return spaceTrim$1(`
|
|
15049
|
+
# META FONT
|
|
15050
|
+
|
|
15051
|
+
Sets the agent's font.
|
|
15052
|
+
|
|
15053
|
+
## Key aspects
|
|
15054
|
+
|
|
15055
|
+
- Does not modify the agent's behavior or responses.
|
|
15056
|
+
- Only one \`META FONT\` should be used per agent.
|
|
15057
|
+
- If multiple are specified, the last one takes precedence.
|
|
15058
|
+
- Used for visual representation in user interfaces.
|
|
15059
|
+
- Supports Google Fonts.
|
|
15060
|
+
|
|
15061
|
+
## Examples
|
|
15062
|
+
|
|
15063
|
+
\`\`\`book
|
|
15064
|
+
Modern Assistant
|
|
15065
|
+
|
|
15066
|
+
META FONT Poppins, Arial, sans-serif
|
|
15067
|
+
PERSONA You are a modern assistant
|
|
15068
|
+
\`\`\`
|
|
15069
|
+
|
|
15070
|
+
\`\`\`book
|
|
15071
|
+
Classic Helper
|
|
15072
|
+
|
|
15073
|
+
META FONT Times New Roman
|
|
15074
|
+
PERSONA You are a classic helper
|
|
15075
|
+
\`\`\`
|
|
15076
|
+
`);
|
|
15077
|
+
}
|
|
15078
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
15079
|
+
// META FONT doesn't modify the system message or model requirements
|
|
15080
|
+
// It's handled separately in the parsing logic
|
|
15081
|
+
// This method exists for consistency with the CommitmentDefinition interface
|
|
15082
|
+
return requirements;
|
|
15083
|
+
}
|
|
15084
|
+
/**
|
|
15085
|
+
* Extracts the font from the content
|
|
15086
|
+
* This is used by the parsing logic
|
|
15087
|
+
*/
|
|
15088
|
+
extractProfileFont(content) {
|
|
15089
|
+
const trimmedContent = content.trim();
|
|
15090
|
+
return trimmedContent || null;
|
|
15091
|
+
}
|
|
15092
|
+
}
|
|
15093
|
+
/**
|
|
15094
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
15095
|
+
*/
|
|
15096
|
+
|
|
15177
15097
|
/**
|
|
15178
15098
|
* META IMAGE commitment definition
|
|
15179
15099
|
*
|
|
@@ -16299,83 +16219,560 @@ class StyleCommitmentDefinition extends BaseCommitmentDefinition {
|
|
|
16299
16219
|
* [💞] Ignore a discrepancy between file name and entity name
|
|
16300
16220
|
*/
|
|
16301
16221
|
|
|
16302
|
-
// Import all commitment definition classes
|
|
16303
|
-
// Register fully implemented commitments
|
|
16304
|
-
registerCommitment(new PersonaCommitmentDefinition('PERSONA'));
|
|
16305
|
-
registerCommitment(new PersonaCommitmentDefinition('PERSONAE'));
|
|
16306
|
-
registerCommitment(new KnowledgeCommitmentDefinition());
|
|
16307
|
-
registerCommitment(new MemoryCommitmentDefinition('MEMORY'));
|
|
16308
|
-
registerCommitment(new MemoryCommitmentDefinition('MEMORIES'));
|
|
16309
|
-
registerCommitment(new StyleCommitmentDefinition('STYLE'));
|
|
16310
|
-
registerCommitment(new StyleCommitmentDefinition('STYLES'));
|
|
16311
|
-
registerCommitment(new RuleCommitmentDefinition('RULE'));
|
|
16312
|
-
registerCommitment(new RuleCommitmentDefinition('RULES'));
|
|
16313
|
-
registerCommitment(new LanguageCommitmentDefinition('LANGUAGE'));
|
|
16314
|
-
registerCommitment(new LanguageCommitmentDefinition('LANGUAGES'));
|
|
16315
|
-
registerCommitment(new SampleCommitmentDefinition('SAMPLE'));
|
|
16316
|
-
registerCommitment(new SampleCommitmentDefinition('EXAMPLE'));
|
|
16317
|
-
registerCommitment(new FormatCommitmentDefinition('FORMAT'));
|
|
16318
|
-
registerCommitment(new FormatCommitmentDefinition('FORMATS'));
|
|
16319
|
-
registerCommitment(new FromCommitmentDefinition('FROM'));
|
|
16320
|
-
registerCommitment(new ModelCommitmentDefinition('MODEL'));
|
|
16321
|
-
registerCommitment(new ModelCommitmentDefinition('MODELS'));
|
|
16322
|
-
registerCommitment(new ActionCommitmentDefinition('ACTION'));
|
|
16323
|
-
registerCommitment(new ActionCommitmentDefinition('ACTIONS'));
|
|
16324
|
-
registerCommitment(new ComponentCommitmentDefinition());
|
|
16325
|
-
registerCommitment(new MetaImageCommitmentDefinition());
|
|
16326
|
-
registerCommitment(new MetaColorCommitmentDefinition());
|
|
16327
|
-
registerCommitment(new MetaLinkCommitmentDefinition());
|
|
16328
|
-
registerCommitment(new MetaCommitmentDefinition());
|
|
16329
|
-
registerCommitment(new NoteCommitmentDefinition('NOTE'));
|
|
16330
|
-
registerCommitment(new NoteCommitmentDefinition('NOTES'));
|
|
16331
|
-
registerCommitment(new NoteCommitmentDefinition('COMMENT'));
|
|
16332
|
-
registerCommitment(new NoteCommitmentDefinition('NONCE'));
|
|
16333
|
-
registerCommitment(new GoalCommitmentDefinition('GOAL'));
|
|
16334
|
-
registerCommitment(new GoalCommitmentDefinition('GOALS'));
|
|
16335
|
-
registerCommitment(new ImportantCommitmentDefinition());
|
|
16336
|
-
registerCommitment(new InitialMessageCommitmentDefinition());
|
|
16337
|
-
registerCommitment(new UserMessageCommitmentDefinition());
|
|
16338
|
-
registerCommitment(new AgentMessageCommitmentDefinition());
|
|
16339
|
-
registerCommitment(new MessageCommitmentDefinition('MESSAGE'));
|
|
16340
|
-
registerCommitment(new MessageCommitmentDefinition('MESSAGES'));
|
|
16341
|
-
registerCommitment(new ScenarioCommitmentDefinition('SCENARIO'));
|
|
16342
|
-
registerCommitment(new ScenarioCommitmentDefinition('SCENARIOS'));
|
|
16343
|
-
registerCommitment(new DeleteCommitmentDefinition('DELETE'));
|
|
16344
|
-
registerCommitment(new DeleteCommitmentDefinition('CANCEL'));
|
|
16345
|
-
registerCommitment(new DeleteCommitmentDefinition('DISCARD'));
|
|
16346
|
-
registerCommitment(new DeleteCommitmentDefinition('REMOVE'));
|
|
16347
|
-
registerCommitment(new OpenCommitmentDefinition());
|
|
16348
|
-
registerCommitment(new ClosedCommitmentDefinition());
|
|
16349
|
-
// Register not yet implemented commitments
|
|
16350
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('EXPECT'));
|
|
16351
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('BEHAVIOUR'));
|
|
16352
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('BEHAVIOURS'));
|
|
16353
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('AVOID'));
|
|
16354
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('AVOIDANCE'));
|
|
16355
|
-
registerCommitment(new NotYetImplementedCommitmentDefinition('CONTEXT'));
|
|
16356
|
-
|
|
16357
16222
|
/**
|
|
16358
|
-
*
|
|
16359
|
-
* This serves as the starting point for the reduce-like pattern
|
|
16360
|
-
* where each commitment applies its changes to build the final requirements
|
|
16223
|
+
* USE commitment definition
|
|
16361
16224
|
*
|
|
16362
|
-
*
|
|
16363
|
-
|
|
16364
|
-
function createEmptyAgentModelRequirements() {
|
|
16365
|
-
return {
|
|
16366
|
-
systemMessage: '',
|
|
16367
|
-
// modelName: 'gpt-5',
|
|
16368
|
-
modelName: 'gemini-2.5-flash-lite',
|
|
16369
|
-
temperature: 0.7,
|
|
16370
|
-
topP: 0.9,
|
|
16371
|
-
topK: 50,
|
|
16372
|
-
};
|
|
16373
|
-
}
|
|
16374
|
-
/**
|
|
16375
|
-
* Creates a basic agent model requirements with just the agent name
|
|
16376
|
-
* This is used when we have an agent name but no commitments
|
|
16225
|
+
* The USE commitment indicates that the agent should utilize specific tools or capabilities
|
|
16226
|
+
* to access and interact with external systems when necessary.
|
|
16377
16227
|
*
|
|
16378
|
-
*
|
|
16228
|
+
* Supported USE types:
|
|
16229
|
+
* - USE BROWSER: Enables the agent to use a web browser tool
|
|
16230
|
+
* - USE SEARCH ENGINE (future): Enables search engine access
|
|
16231
|
+
* - USE FILE SYSTEM (future): Enables file system operations
|
|
16232
|
+
* - USE MCP (future): Enables MCP server connections
|
|
16233
|
+
*
|
|
16234
|
+
* The content following the USE commitment is ignored (similar to NOTE).
|
|
16235
|
+
*
|
|
16236
|
+
* Example usage in agent source:
|
|
16237
|
+
*
|
|
16238
|
+
* ```book
|
|
16239
|
+
* USE BROWSER
|
|
16240
|
+
* USE SEARCH ENGINE
|
|
16241
|
+
* ```
|
|
16242
|
+
*
|
|
16243
|
+
* @private [🪔] Maybe export the commitments through some package
|
|
16244
|
+
*/
|
|
16245
|
+
class UseCommitmentDefinition extends BaseCommitmentDefinition {
|
|
16246
|
+
constructor() {
|
|
16247
|
+
super('USE');
|
|
16248
|
+
}
|
|
16249
|
+
/**
|
|
16250
|
+
* Short one-line description of USE commitments.
|
|
16251
|
+
*/
|
|
16252
|
+
get description() {
|
|
16253
|
+
return 'Enable the agent to use specific tools or capabilities (BROWSER, SEARCH ENGINE, etc.).';
|
|
16254
|
+
}
|
|
16255
|
+
/**
|
|
16256
|
+
* Icon for this commitment.
|
|
16257
|
+
*/
|
|
16258
|
+
get icon() {
|
|
16259
|
+
return '🔧';
|
|
16260
|
+
}
|
|
16261
|
+
/**
|
|
16262
|
+
* Markdown documentation for USE commitment.
|
|
16263
|
+
*/
|
|
16264
|
+
get documentation() {
|
|
16265
|
+
return spaceTrim$1(`
|
|
16266
|
+
# USE
|
|
16267
|
+
|
|
16268
|
+
Enables the agent to use specific tools or capabilities for interacting with external systems.
|
|
16269
|
+
|
|
16270
|
+
## Supported USE types
|
|
16271
|
+
|
|
16272
|
+
- **USE BROWSER** - Enables the agent to use a web browser tool to access and retrieve information from the internet
|
|
16273
|
+
- **USE SEARCH ENGINE** (future) - Enables search engine access
|
|
16274
|
+
- **USE FILE SYSTEM** (future) - Enables file system operations
|
|
16275
|
+
- **USE MCP** (future) - Enables MCP server connections
|
|
16276
|
+
|
|
16277
|
+
## Key aspects
|
|
16278
|
+
|
|
16279
|
+
- The content following the USE commitment is ignored (similar to NOTE)
|
|
16280
|
+
- Multiple USE commitments can be specified to enable multiple capabilities
|
|
16281
|
+
- The actual tool usage is handled by the agent runtime
|
|
16282
|
+
|
|
16283
|
+
## Examples
|
|
16284
|
+
|
|
16285
|
+
### Basic browser usage
|
|
16286
|
+
|
|
16287
|
+
\`\`\`book
|
|
16288
|
+
Research Assistant
|
|
16289
|
+
|
|
16290
|
+
PERSONA You are a helpful research assistant
|
|
16291
|
+
USE BROWSER
|
|
16292
|
+
KNOWLEDGE Can search the web for up-to-date information
|
|
16293
|
+
\`\`\`
|
|
16294
|
+
|
|
16295
|
+
### Multiple tools
|
|
16296
|
+
|
|
16297
|
+
\`\`\`book
|
|
16298
|
+
Data Analyst
|
|
16299
|
+
|
|
16300
|
+
PERSONA You are a data analyst assistant
|
|
16301
|
+
USE BROWSER
|
|
16302
|
+
USE FILE SYSTEM
|
|
16303
|
+
ACTION Can analyze data from various sources
|
|
16304
|
+
\`\`\`
|
|
16305
|
+
`);
|
|
16306
|
+
}
|
|
16307
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
16308
|
+
// USE commitments don't modify the system message or model requirements directly
|
|
16309
|
+
// They are handled separately in the parsing logic for capability extraction
|
|
16310
|
+
// This method exists for consistency with the CommitmentDefinition interface
|
|
16311
|
+
return requirements;
|
|
16312
|
+
}
|
|
16313
|
+
/**
|
|
16314
|
+
* Extracts the tool type from the USE commitment
|
|
16315
|
+
* This is used by the parsing logic
|
|
16316
|
+
*/
|
|
16317
|
+
extractToolType(content) {
|
|
16318
|
+
var _a, _b;
|
|
16319
|
+
const trimmedContent = content.trim();
|
|
16320
|
+
// The tool type is the first word after USE (already stripped)
|
|
16321
|
+
const match = trimmedContent.match(/^(\w+)/);
|
|
16322
|
+
return (_b = (_a = match === null || match === void 0 ? void 0 : match[1]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== null && _b !== void 0 ? _b : null;
|
|
16323
|
+
}
|
|
16324
|
+
/**
|
|
16325
|
+
* Checks if this is a known USE type
|
|
16326
|
+
*/
|
|
16327
|
+
isKnownUseType(useType) {
|
|
16328
|
+
const knownTypes = ['BROWSER', 'SEARCH ENGINE', 'FILE SYSTEM', 'MCP'];
|
|
16329
|
+
return knownTypes.includes(useType.toUpperCase());
|
|
16330
|
+
}
|
|
16331
|
+
}
|
|
16332
|
+
/**
|
|
16333
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
16334
|
+
*/
|
|
16335
|
+
|
|
16336
|
+
/**
|
|
16337
|
+
* USE BROWSER commitment definition
|
|
16338
|
+
*
|
|
16339
|
+
* The `USE BROWSER` commitment indicates that the agent should utilize a web browser tool
|
|
16340
|
+
* to access and retrieve up-to-date information from the internet when necessary.
|
|
16341
|
+
*
|
|
16342
|
+
* The content following `USE BROWSER` is ignored (similar to NOTE).
|
|
16343
|
+
*
|
|
16344
|
+
* Example usage in agent source:
|
|
16345
|
+
*
|
|
16346
|
+
* ```book
|
|
16347
|
+
* USE BROWSER
|
|
16348
|
+
* USE BROWSER This will be ignored
|
|
16349
|
+
* ```
|
|
16350
|
+
*
|
|
16351
|
+
* @private [🪔] Maybe export the commitments through some package
|
|
16352
|
+
*/
|
|
16353
|
+
class UseBrowserCommitmentDefinition extends BaseCommitmentDefinition {
|
|
16354
|
+
constructor() {
|
|
16355
|
+
super('USE BROWSER', ['BROWSER']);
|
|
16356
|
+
}
|
|
16357
|
+
/**
|
|
16358
|
+
* Short one-line description of USE BROWSER.
|
|
16359
|
+
*/
|
|
16360
|
+
get description() {
|
|
16361
|
+
return 'Enable the agent to use a web browser tool for accessing internet information.';
|
|
16362
|
+
}
|
|
16363
|
+
/**
|
|
16364
|
+
* Icon for this commitment.
|
|
16365
|
+
*/
|
|
16366
|
+
get icon() {
|
|
16367
|
+
return '🌐';
|
|
16368
|
+
}
|
|
16369
|
+
/**
|
|
16370
|
+
* Markdown documentation for USE BROWSER commitment.
|
|
16371
|
+
*/
|
|
16372
|
+
get documentation() {
|
|
16373
|
+
return spaceTrim$1(`
|
|
16374
|
+
# USE BROWSER
|
|
16375
|
+
|
|
16376
|
+
Enables the agent to use a web browser tool to access and retrieve up-to-date information from the internet.
|
|
16377
|
+
|
|
16378
|
+
## Key aspects
|
|
16379
|
+
|
|
16380
|
+
- The content following \`USE BROWSER\` is ignored (similar to NOTE)
|
|
16381
|
+
- The actual browser tool usage is handled by the agent runtime
|
|
16382
|
+
- Allows the agent to fetch current information from websites
|
|
16383
|
+
- Useful for research tasks, fact-checking, and accessing dynamic content
|
|
16384
|
+
|
|
16385
|
+
## Examples
|
|
16386
|
+
|
|
16387
|
+
\`\`\`book
|
|
16388
|
+
Research Assistant
|
|
16389
|
+
|
|
16390
|
+
PERSONA You are a helpful research assistant specialized in finding current information
|
|
16391
|
+
USE BROWSER
|
|
16392
|
+
RULE Always cite your sources when providing information from the web
|
|
16393
|
+
\`\`\`
|
|
16394
|
+
|
|
16395
|
+
\`\`\`book
|
|
16396
|
+
News Analyst
|
|
16397
|
+
|
|
16398
|
+
PERSONA You are a news analyst who stays up-to-date with current events
|
|
16399
|
+
USE BROWSER
|
|
16400
|
+
STYLE Present news in a balanced and objective manner
|
|
16401
|
+
ACTION Can search for and summarize news articles
|
|
16402
|
+
\`\`\`
|
|
16403
|
+
|
|
16404
|
+
\`\`\`book
|
|
16405
|
+
Company Lawyer
|
|
16406
|
+
|
|
16407
|
+
PERSONA You are a company lawyer providing legal advice
|
|
16408
|
+
USE BROWSER
|
|
16409
|
+
KNOWLEDGE Corporate law and legal procedures
|
|
16410
|
+
RULE Always recommend consulting with a licensed attorney for specific legal matters
|
|
16411
|
+
\`\`\`
|
|
16412
|
+
`);
|
|
16413
|
+
}
|
|
16414
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
16415
|
+
// We simply mark that browser capability is enabled in metadata
|
|
16416
|
+
// Get existing metadata
|
|
16417
|
+
const existingMetadata = requirements.metadata || {};
|
|
16418
|
+
// Get existing tools array or create new one
|
|
16419
|
+
const existingTools = existingMetadata.tools || [];
|
|
16420
|
+
// Add 'browser' to tools if not already present
|
|
16421
|
+
const updatedTools = existingTools.includes('browser') ? existingTools : [...existingTools, 'browser'];
|
|
16422
|
+
// Return requirements with updated metadata
|
|
16423
|
+
return {
|
|
16424
|
+
...requirements,
|
|
16425
|
+
metadata: {
|
|
16426
|
+
...existingMetadata,
|
|
16427
|
+
tools: updatedTools,
|
|
16428
|
+
useBrowser: true,
|
|
16429
|
+
},
|
|
16430
|
+
};
|
|
16431
|
+
}
|
|
16432
|
+
}
|
|
16433
|
+
/**
|
|
16434
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
16435
|
+
*/
|
|
16436
|
+
|
|
16437
|
+
/**
|
|
16438
|
+
* USE MCP commitment definition
|
|
16439
|
+
*
|
|
16440
|
+
* The `USE MCP` commitment allows to specify an MCP server URL which the agent will connect to
|
|
16441
|
+
* for retrieving additional instructions and actions.
|
|
16442
|
+
*
|
|
16443
|
+
* The content following `USE MCP` is the URL of the MCP server.
|
|
16444
|
+
*
|
|
16445
|
+
* Example usage in agent source:
|
|
16446
|
+
*
|
|
16447
|
+
* ```book
|
|
16448
|
+
* USE MCP http://mcp-server-url.com
|
|
16449
|
+
* ```
|
|
16450
|
+
*
|
|
16451
|
+
* @private [🪔] Maybe export the commitments through some package
|
|
16452
|
+
*/
|
|
16453
|
+
class UseMcpCommitmentDefinition extends BaseCommitmentDefinition {
|
|
16454
|
+
constructor() {
|
|
16455
|
+
super('USE MCP', ['MCP']);
|
|
16456
|
+
}
|
|
16457
|
+
/**
|
|
16458
|
+
* Short one-line description of USE MCP.
|
|
16459
|
+
*/
|
|
16460
|
+
get description() {
|
|
16461
|
+
return 'Connects the agent to an external MCP server for additional capabilities.';
|
|
16462
|
+
}
|
|
16463
|
+
/**
|
|
16464
|
+
* Icon for this commitment.
|
|
16465
|
+
*/
|
|
16466
|
+
get icon() {
|
|
16467
|
+
return '🔌';
|
|
16468
|
+
}
|
|
16469
|
+
/**
|
|
16470
|
+
* Markdown documentation for USE MCP commitment.
|
|
16471
|
+
*/
|
|
16472
|
+
get documentation() {
|
|
16473
|
+
return spaceTrim$1(`
|
|
16474
|
+
# USE MCP
|
|
16475
|
+
|
|
16476
|
+
Connects the agent to an external Model Context Protocol (MCP) server.
|
|
16477
|
+
|
|
16478
|
+
## Key aspects
|
|
16479
|
+
|
|
16480
|
+
- The content following \`USE MCP\` must be a valid URL
|
|
16481
|
+
- Multiple MCP servers can be connected by using multiple \`USE MCP\` commitments
|
|
16482
|
+
- The agent will have access to tools and resources provided by the MCP server
|
|
16483
|
+
|
|
16484
|
+
## Example
|
|
16485
|
+
|
|
16486
|
+
\`\`\`book
|
|
16487
|
+
Company Lawyer
|
|
16488
|
+
|
|
16489
|
+
PERSONA You are a company lawyer.
|
|
16490
|
+
USE MCP http://legal-db.example.com
|
|
16491
|
+
\`\`\`
|
|
16492
|
+
`);
|
|
16493
|
+
}
|
|
16494
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
16495
|
+
const mcpServerUrl = content.trim();
|
|
16496
|
+
if (!mcpServerUrl) {
|
|
16497
|
+
return requirements;
|
|
16498
|
+
}
|
|
16499
|
+
const existingMcpServers = requirements.mcpServers || [];
|
|
16500
|
+
// Avoid duplicates
|
|
16501
|
+
if (existingMcpServers.includes(mcpServerUrl)) {
|
|
16502
|
+
return requirements;
|
|
16503
|
+
}
|
|
16504
|
+
return {
|
|
16505
|
+
...requirements,
|
|
16506
|
+
mcpServers: [...existingMcpServers, mcpServerUrl],
|
|
16507
|
+
};
|
|
16508
|
+
}
|
|
16509
|
+
}
|
|
16510
|
+
/**
|
|
16511
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
16512
|
+
*/
|
|
16513
|
+
|
|
16514
|
+
/**
|
|
16515
|
+
* USE SEARCH ENGINE commitment definition
|
|
16516
|
+
*
|
|
16517
|
+
* The `USE SEARCH ENGINE` commitment indicates that the agent should utilize a search engine tool
|
|
16518
|
+
* to access and retrieve up-to-date information from the internet when necessary.
|
|
16519
|
+
*
|
|
16520
|
+
* The content following `USE SEARCH ENGINE` is ignored (similar to NOTE).
|
|
16521
|
+
*
|
|
16522
|
+
* Example usage in agent source:
|
|
16523
|
+
*
|
|
16524
|
+
* ```book
|
|
16525
|
+
* USE SEARCH ENGINE
|
|
16526
|
+
* USE SEARCH ENGINE This will be ignored
|
|
16527
|
+
* ```
|
|
16528
|
+
*
|
|
16529
|
+
* @private [🪔] Maybe export the commitments through some package
|
|
16530
|
+
*/
|
|
16531
|
+
class UseSearchEngineCommitmentDefinition extends BaseCommitmentDefinition {
|
|
16532
|
+
constructor() {
|
|
16533
|
+
super('USE SEARCH ENGINE', ['SEARCH ENGINE', 'SEARCH']);
|
|
16534
|
+
}
|
|
16535
|
+
/**
|
|
16536
|
+
* Short one-line description of USE SEARCH ENGINE.
|
|
16537
|
+
*/
|
|
16538
|
+
get description() {
|
|
16539
|
+
return 'Enable the agent to use a search engine tool for accessing internet information.';
|
|
16540
|
+
}
|
|
16541
|
+
/**
|
|
16542
|
+
* Icon for this commitment.
|
|
16543
|
+
*/
|
|
16544
|
+
get icon() {
|
|
16545
|
+
return '🔍';
|
|
16546
|
+
}
|
|
16547
|
+
/**
|
|
16548
|
+
* Markdown documentation for USE SEARCH ENGINE commitment.
|
|
16549
|
+
*/
|
|
16550
|
+
get documentation() {
|
|
16551
|
+
return spaceTrim$1(`
|
|
16552
|
+
# USE SEARCH ENGINE
|
|
16553
|
+
|
|
16554
|
+
Enables the agent to use a search engine tool to access and retrieve up-to-date information from the internet.
|
|
16555
|
+
|
|
16556
|
+
## Key aspects
|
|
16557
|
+
|
|
16558
|
+
- The content following \`USE SEARCH ENGINE\` is ignored (similar to NOTE)
|
|
16559
|
+
- The actual search engine tool usage is handled by the agent runtime
|
|
16560
|
+
- Allows the agent to search for current information from the web
|
|
16561
|
+
- Useful for research tasks, finding facts, and accessing dynamic content
|
|
16562
|
+
|
|
16563
|
+
## Examples
|
|
16564
|
+
|
|
16565
|
+
\`\`\`book
|
|
16566
|
+
Research Assistant
|
|
16567
|
+
|
|
16568
|
+
PERSONA You are a helpful research assistant specialized in finding current information
|
|
16569
|
+
USE SEARCH ENGINE
|
|
16570
|
+
RULE Always cite your sources when providing information from the web
|
|
16571
|
+
\`\`\`
|
|
16572
|
+
|
|
16573
|
+
\`\`\`book
|
|
16574
|
+
Fact Checker
|
|
16575
|
+
|
|
16576
|
+
PERSONA You are a fact checker
|
|
16577
|
+
USE SEARCH ENGINE
|
|
16578
|
+
ACTION Search for claims and verify them against reliable sources
|
|
16579
|
+
\`\`\`
|
|
16580
|
+
`);
|
|
16581
|
+
}
|
|
16582
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
16583
|
+
// We simply mark that search engine capability is enabled in metadata
|
|
16584
|
+
// Get existing metadata
|
|
16585
|
+
const existingMetadata = requirements.metadata || {};
|
|
16586
|
+
// Get existing tools array or create new one
|
|
16587
|
+
const existingTools = existingMetadata.tools || [];
|
|
16588
|
+
// Add 'search-engine' to tools if not already present
|
|
16589
|
+
const updatedTools = existingTools.includes('search-engine') ? existingTools : [...existingTools, 'search-engine'];
|
|
16590
|
+
// Return requirements with updated metadata
|
|
16591
|
+
return {
|
|
16592
|
+
...requirements,
|
|
16593
|
+
metadata: {
|
|
16594
|
+
...existingMetadata,
|
|
16595
|
+
tools: updatedTools,
|
|
16596
|
+
useSearchEngine: true,
|
|
16597
|
+
},
|
|
16598
|
+
};
|
|
16599
|
+
}
|
|
16600
|
+
}
|
|
16601
|
+
/**
|
|
16602
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
16603
|
+
*/
|
|
16604
|
+
|
|
16605
|
+
/**
|
|
16606
|
+
* Placeholder commitment definition for commitments that are not yet implemented
|
|
16607
|
+
*
|
|
16608
|
+
* This commitment simply adds its content 1:1 into the system message,
|
|
16609
|
+
* preserving the original behavior until proper implementation is added.
|
|
16610
|
+
*
|
|
16611
|
+
* @public exported from `@promptbook/core`
|
|
16612
|
+
*/
|
|
16613
|
+
class NotYetImplementedCommitmentDefinition extends BaseCommitmentDefinition {
|
|
16614
|
+
constructor(type) {
|
|
16615
|
+
super(type);
|
|
16616
|
+
}
|
|
16617
|
+
/**
|
|
16618
|
+
* Short one-line description of a placeholder commitment.
|
|
16619
|
+
*/
|
|
16620
|
+
get description() {
|
|
16621
|
+
return 'Placeholder commitment that appends content verbatim to the system message.';
|
|
16622
|
+
}
|
|
16623
|
+
/**
|
|
16624
|
+
* Icon for this commitment.
|
|
16625
|
+
*/
|
|
16626
|
+
get icon() {
|
|
16627
|
+
return '🚧';
|
|
16628
|
+
}
|
|
16629
|
+
/**
|
|
16630
|
+
* Markdown documentation available at runtime.
|
|
16631
|
+
*/
|
|
16632
|
+
get documentation() {
|
|
16633
|
+
return spaceTrim$1(`
|
|
16634
|
+
# ${this.type}
|
|
16635
|
+
|
|
16636
|
+
This commitment is not yet fully implemented.
|
|
16637
|
+
|
|
16638
|
+
## Key aspects
|
|
16639
|
+
|
|
16640
|
+
- Content is appended directly to the system message.
|
|
16641
|
+
- No special processing or validation is performed.
|
|
16642
|
+
- Behavior preserved until proper implementation is added.
|
|
16643
|
+
|
|
16644
|
+
## Status
|
|
16645
|
+
|
|
16646
|
+
- **Status:** Placeholder implementation
|
|
16647
|
+
- **Effect:** Appends content prefixed by commitment type
|
|
16648
|
+
- **Future:** Will be replaced with specialized logic
|
|
16649
|
+
|
|
16650
|
+
## Examples
|
|
16651
|
+
|
|
16652
|
+
\`\`\`book
|
|
16653
|
+
Example Agent
|
|
16654
|
+
|
|
16655
|
+
PERSONA You are a helpful assistant
|
|
16656
|
+
${this.type} Your content here
|
|
16657
|
+
RULE Always be helpful
|
|
16658
|
+
\`\`\`
|
|
16659
|
+
`);
|
|
16660
|
+
}
|
|
16661
|
+
applyToAgentModelRequirements(requirements, content) {
|
|
16662
|
+
const trimmedContent = content.trim();
|
|
16663
|
+
if (!trimmedContent) {
|
|
16664
|
+
return requirements;
|
|
16665
|
+
}
|
|
16666
|
+
// Add the commitment content 1:1 to the system message
|
|
16667
|
+
const commitmentLine = `${this.type} ${trimmedContent}`;
|
|
16668
|
+
return this.appendToSystemMessage(requirements, commitmentLine, '\n\n');
|
|
16669
|
+
}
|
|
16670
|
+
}
|
|
16671
|
+
|
|
16672
|
+
// Import all commitment definition classes
|
|
16673
|
+
/**
|
|
16674
|
+
* Registry of all available commitment definitions
|
|
16675
|
+
* This array contains instances of all commitment definitions
|
|
16676
|
+
* This is the single source of truth for all commitments in the system
|
|
16677
|
+
*
|
|
16678
|
+
* @private Use functions to access commitments instead of this array directly
|
|
16679
|
+
*/
|
|
16680
|
+
const COMMITMENT_REGISTRY = [
|
|
16681
|
+
// Fully implemented commitments
|
|
16682
|
+
new PersonaCommitmentDefinition('PERSONA'),
|
|
16683
|
+
new PersonaCommitmentDefinition('PERSONAE'),
|
|
16684
|
+
new KnowledgeCommitmentDefinition(),
|
|
16685
|
+
new MemoryCommitmentDefinition('MEMORY'),
|
|
16686
|
+
new MemoryCommitmentDefinition('MEMORIES'),
|
|
16687
|
+
new StyleCommitmentDefinition('STYLE'),
|
|
16688
|
+
new StyleCommitmentDefinition('STYLES'),
|
|
16689
|
+
new RuleCommitmentDefinition('RULE'),
|
|
16690
|
+
new RuleCommitmentDefinition('RULES'),
|
|
16691
|
+
new LanguageCommitmentDefinition('LANGUAGE'),
|
|
16692
|
+
new LanguageCommitmentDefinition('LANGUAGES'),
|
|
16693
|
+
new SampleCommitmentDefinition('SAMPLE'),
|
|
16694
|
+
new SampleCommitmentDefinition('EXAMPLE'),
|
|
16695
|
+
new FormatCommitmentDefinition('FORMAT'),
|
|
16696
|
+
new FormatCommitmentDefinition('FORMATS'),
|
|
16697
|
+
new FromCommitmentDefinition('FROM'),
|
|
16698
|
+
new ModelCommitmentDefinition('MODEL'),
|
|
16699
|
+
new ModelCommitmentDefinition('MODELS'),
|
|
16700
|
+
new ActionCommitmentDefinition('ACTION'),
|
|
16701
|
+
new ActionCommitmentDefinition('ACTIONS'),
|
|
16702
|
+
new ComponentCommitmentDefinition(),
|
|
16703
|
+
new MetaImageCommitmentDefinition(),
|
|
16704
|
+
new MetaColorCommitmentDefinition(),
|
|
16705
|
+
new MetaFontCommitmentDefinition(),
|
|
16706
|
+
new MetaLinkCommitmentDefinition(),
|
|
16707
|
+
new MetaCommitmentDefinition(),
|
|
16708
|
+
new NoteCommitmentDefinition('NOTE'),
|
|
16709
|
+
new NoteCommitmentDefinition('NOTES'),
|
|
16710
|
+
new NoteCommitmentDefinition('COMMENT'),
|
|
16711
|
+
new NoteCommitmentDefinition('NONCE'),
|
|
16712
|
+
new GoalCommitmentDefinition('GOAL'),
|
|
16713
|
+
new GoalCommitmentDefinition('GOALS'),
|
|
16714
|
+
new InitialMessageCommitmentDefinition(),
|
|
16715
|
+
new UserMessageCommitmentDefinition(),
|
|
16716
|
+
new AgentMessageCommitmentDefinition(),
|
|
16717
|
+
new MessageCommitmentDefinition('MESSAGE'),
|
|
16718
|
+
new MessageCommitmentDefinition('MESSAGES'),
|
|
16719
|
+
new ScenarioCommitmentDefinition('SCENARIO'),
|
|
16720
|
+
new ScenarioCommitmentDefinition('SCENARIOS'),
|
|
16721
|
+
new DeleteCommitmentDefinition('DELETE'),
|
|
16722
|
+
new DeleteCommitmentDefinition('CANCEL'),
|
|
16723
|
+
new DeleteCommitmentDefinition('DISCARD'),
|
|
16724
|
+
new DeleteCommitmentDefinition('REMOVE'),
|
|
16725
|
+
new OpenCommitmentDefinition(),
|
|
16726
|
+
new ClosedCommitmentDefinition(),
|
|
16727
|
+
new UseBrowserCommitmentDefinition(),
|
|
16728
|
+
new UseSearchEngineCommitmentDefinition(),
|
|
16729
|
+
new UseMcpCommitmentDefinition(),
|
|
16730
|
+
new UseCommitmentDefinition(),
|
|
16731
|
+
// Not yet implemented commitments (using placeholder)
|
|
16732
|
+
new NotYetImplementedCommitmentDefinition('EXPECT'),
|
|
16733
|
+
new NotYetImplementedCommitmentDefinition('BEHAVIOUR'),
|
|
16734
|
+
new NotYetImplementedCommitmentDefinition('BEHAVIOURS'),
|
|
16735
|
+
new NotYetImplementedCommitmentDefinition('AVOID'),
|
|
16736
|
+
new NotYetImplementedCommitmentDefinition('AVOIDANCE'),
|
|
16737
|
+
new NotYetImplementedCommitmentDefinition('CONTEXT'),
|
|
16738
|
+
];
|
|
16739
|
+
/**
|
|
16740
|
+
* Gets a commitment definition by its type
|
|
16741
|
+
* @param type The commitment type to look up
|
|
16742
|
+
* @returns The commitment definition or null if not found
|
|
16743
|
+
*
|
|
16744
|
+
* @public exported from `@promptbook/core`
|
|
16745
|
+
*/
|
|
16746
|
+
function getCommitmentDefinition(type) {
|
|
16747
|
+
return COMMITMENT_REGISTRY.find((commitmentDefinition) => commitmentDefinition.type === type) || null;
|
|
16748
|
+
}
|
|
16749
|
+
/**
|
|
16750
|
+
* TODO: [🧠] Maybe create through standardized $register
|
|
16751
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
16752
|
+
*/
|
|
16753
|
+
|
|
16754
|
+
/**
|
|
16755
|
+
* Creates an empty/basic agent model requirements object
|
|
16756
|
+
* This serves as the starting point for the reduce-like pattern
|
|
16757
|
+
* where each commitment applies its changes to build the final requirements
|
|
16758
|
+
*
|
|
16759
|
+
* @public exported from `@promptbook/core`
|
|
16760
|
+
*/
|
|
16761
|
+
function createEmptyAgentModelRequirements() {
|
|
16762
|
+
return {
|
|
16763
|
+
systemMessage: '',
|
|
16764
|
+
// modelName: 'gpt-5',
|
|
16765
|
+
modelName: 'gemini-2.5-flash-lite',
|
|
16766
|
+
temperature: 0.7,
|
|
16767
|
+
topP: 0.9,
|
|
16768
|
+
topK: 50,
|
|
16769
|
+
};
|
|
16770
|
+
}
|
|
16771
|
+
/**
|
|
16772
|
+
* Creates a basic agent model requirements with just the agent name
|
|
16773
|
+
* This is used when we have an agent name but no commitments
|
|
16774
|
+
*
|
|
16775
|
+
* @public exported from `@promptbook/core`
|
|
16379
16776
|
*/
|
|
16380
16777
|
function createBasicAgentModelRequirements(agentName) {
|
|
16381
16778
|
const empty = createEmptyAgentModelRequirements();
|
|
@@ -16388,6 +16785,11 @@ function createBasicAgentModelRequirements(agentName) {
|
|
|
16388
16785
|
* TODO: [🐤] Deduplicate `AgentModelRequirements` and `ModelRequirements` model requirements
|
|
16389
16786
|
*/
|
|
16390
16787
|
|
|
16788
|
+
/**
|
|
16789
|
+
* Regex pattern to match horizontal lines (markdown thematic breaks)
|
|
16790
|
+
* Matches 3 or more hyphens, underscores, or asterisks (with optional spaces between)
|
|
16791
|
+
*/
|
|
16792
|
+
const HORIZONTAL_LINE_PATTERN = /^[\s]*[-_*][\s]*[-_*][\s]*[-_*][\s]*[-_*]*[\s]*$/;
|
|
16391
16793
|
/**
|
|
16392
16794
|
* Parses agent source using the new commitment system with multiline support
|
|
16393
16795
|
* This function replaces the hardcoded commitment parsing in the original parseAgentSource
|
|
@@ -16450,6 +16852,24 @@ function parseAgentSourceWithCommitments(agentSource) {
|
|
|
16450
16852
|
break;
|
|
16451
16853
|
}
|
|
16452
16854
|
}
|
|
16855
|
+
// Check if this is a horizontal line (ends any current commitment)
|
|
16856
|
+
const isHorizontalLine = HORIZONTAL_LINE_PATTERN.test(line);
|
|
16857
|
+
if (isHorizontalLine) {
|
|
16858
|
+
// Save the current commitment if it exists
|
|
16859
|
+
if (currentCommitment) {
|
|
16860
|
+
const fullContent = currentCommitment.contentLines.join('\n');
|
|
16861
|
+
commitments.push({
|
|
16862
|
+
type: currentCommitment.type,
|
|
16863
|
+
content: spaceTrim$1(fullContent),
|
|
16864
|
+
originalLine: currentCommitment.originalStartLine,
|
|
16865
|
+
lineNumber: currentCommitment.startLineNumber,
|
|
16866
|
+
});
|
|
16867
|
+
currentCommitment = null;
|
|
16868
|
+
}
|
|
16869
|
+
// Add horizontal line to non-commitment lines
|
|
16870
|
+
nonCommitmentLines.push(line);
|
|
16871
|
+
continue;
|
|
16872
|
+
}
|
|
16453
16873
|
if (!foundNewCommitment) {
|
|
16454
16874
|
if (currentCommitment) {
|
|
16455
16875
|
// This line belongs to the current commitment
|
|
@@ -16755,7 +17175,7 @@ function generatePlaceholderAgentProfileImageUrl(agentName) {
|
|
|
16755
17175
|
* @public exported from `@promptbook/utils`
|
|
16756
17176
|
*/
|
|
16757
17177
|
function computeHash(value) {
|
|
16758
|
-
return SHA256(hexEncoder.parse(spaceTrim(valueToString(value)))).toString( /* hex */);
|
|
17178
|
+
return SHA256(hexEncoder.parse(spaceTrim$2(valueToString(value)))).toString( /* hex */);
|
|
16759
17179
|
}
|
|
16760
17180
|
/**
|
|
16761
17181
|
* TODO: [🥬][🥬] Use this ACRY
|
|
@@ -17093,7 +17513,7 @@ function isValidJavascriptName(javascriptName) {
|
|
|
17093
17513
|
* @public exported from `@promptbook/core`
|
|
17094
17514
|
*/
|
|
17095
17515
|
function normalizeAgentName(rawAgentName) {
|
|
17096
|
-
return titleToName(spaceTrim(rawAgentName));
|
|
17516
|
+
return titleToName(spaceTrim$2(rawAgentName));
|
|
17097
17517
|
}
|
|
17098
17518
|
|
|
17099
17519
|
/**
|
|
@@ -17145,17 +17565,21 @@ function parseAgentSource(agentSource) {
|
|
|
17145
17565
|
const links = [];
|
|
17146
17566
|
for (const commitment of parseResult.commitments) {
|
|
17147
17567
|
if (commitment.type === 'META LINK') {
|
|
17148
|
-
const linkValue = spaceTrim(commitment.content);
|
|
17568
|
+
const linkValue = spaceTrim$2(commitment.content);
|
|
17149
17569
|
links.push(linkValue);
|
|
17150
17570
|
meta.link = linkValue;
|
|
17151
17571
|
continue;
|
|
17152
17572
|
}
|
|
17153
17573
|
if (commitment.type === 'META IMAGE') {
|
|
17154
|
-
meta.image = spaceTrim(commitment.content);
|
|
17574
|
+
meta.image = spaceTrim$2(commitment.content);
|
|
17155
17575
|
continue;
|
|
17156
17576
|
}
|
|
17157
17577
|
if (commitment.type === 'META COLOR') {
|
|
17158
|
-
meta.color = spaceTrim(commitment.content);
|
|
17578
|
+
meta.color = spaceTrim$2(commitment.content);
|
|
17579
|
+
continue;
|
|
17580
|
+
}
|
|
17581
|
+
if (commitment.type === 'META FONT') {
|
|
17582
|
+
meta.font = spaceTrim$2(commitment.content);
|
|
17159
17583
|
continue;
|
|
17160
17584
|
}
|
|
17161
17585
|
if (commitment.type !== 'META') {
|
|
@@ -17164,10 +17588,10 @@ function parseAgentSource(agentSource) {
|
|
|
17164
17588
|
// Parse META commitments - format is "META TYPE content"
|
|
17165
17589
|
const metaTypeRaw = commitment.content.split(' ')[0] || 'NONE';
|
|
17166
17590
|
if (metaTypeRaw === 'LINK') {
|
|
17167
|
-
links.push(spaceTrim(commitment.content.substring(metaTypeRaw.length)));
|
|
17591
|
+
links.push(spaceTrim$2(commitment.content.substring(metaTypeRaw.length)));
|
|
17168
17592
|
}
|
|
17169
17593
|
const metaType = normalizeTo_camelCase(metaTypeRaw);
|
|
17170
|
-
meta[metaType] = spaceTrim(commitment.content.substring(metaTypeRaw.length));
|
|
17594
|
+
meta[metaType] = spaceTrim$2(commitment.content.substring(metaTypeRaw.length));
|
|
17171
17595
|
}
|
|
17172
17596
|
// Generate gravatar fallback if no meta image specified
|
|
17173
17597
|
if (!meta.image) {
|
|
@@ -17319,7 +17743,7 @@ const OpenAiSdkTranspiler = {
|
|
|
17319
17743
|
});
|
|
17320
17744
|
const KNOWLEDGE_THRESHOLD = 1000;
|
|
17321
17745
|
if (directKnowledge.join('\n').length > KNOWLEDGE_THRESHOLD || knowledgeSources.length > 0) {
|
|
17322
|
-
return spaceTrim((block) => `
|
|
17746
|
+
return spaceTrim$2((block) => `
|
|
17323
17747
|
#!/usr/bin/env node
|
|
17324
17748
|
|
|
17325
17749
|
import * as dotenv from 'dotenv';
|
|
@@ -17384,7 +17808,7 @@ const OpenAiSdkTranspiler = {
|
|
|
17384
17808
|
}
|
|
17385
17809
|
|
|
17386
17810
|
const userMessage = spaceTrim(\`
|
|
17387
|
-
${block(spaceTrim(`
|
|
17811
|
+
${block(spaceTrim$2(`
|
|
17388
17812
|
Here is some additional context to help you answer the question:
|
|
17389
17813
|
\${context}
|
|
17390
17814
|
|
|
@@ -17429,7 +17853,7 @@ const OpenAiSdkTranspiler = {
|
|
|
17429
17853
|
})();
|
|
17430
17854
|
`);
|
|
17431
17855
|
}
|
|
17432
|
-
const source = spaceTrim((block) => `
|
|
17856
|
+
const source = spaceTrim$2((block) => `
|
|
17433
17857
|
|
|
17434
17858
|
#!/usr/bin/env node
|
|
17435
17859
|
|
|
@@ -17840,13 +18264,13 @@ function $registeredLlmToolsMessage() {
|
|
|
17840
18264
|
});
|
|
17841
18265
|
const usedEnvMessage = $usedEnvFilename === null ? `Unknown \`.env\` file` : `Used \`.env\` file:\n${$usedEnvFilename}`;
|
|
17842
18266
|
if (metadata.length === 0) {
|
|
17843
|
-
return spaceTrim((block) => `
|
|
18267
|
+
return spaceTrim$2((block) => `
|
|
17844
18268
|
No LLM providers are available.
|
|
17845
18269
|
|
|
17846
18270
|
${block(usedEnvMessage)}
|
|
17847
18271
|
`);
|
|
17848
18272
|
}
|
|
17849
|
-
return spaceTrim((block) => `
|
|
18273
|
+
return spaceTrim$2((block) => `
|
|
17850
18274
|
|
|
17851
18275
|
${block(usedEnvMessage)}
|
|
17852
18276
|
|
|
@@ -17892,7 +18316,7 @@ function $registeredLlmToolsMessage() {
|
|
|
17892
18316
|
morePieces.push(`Not configured`); // <- Note: Can not be configured via environment variables
|
|
17893
18317
|
}
|
|
17894
18318
|
}
|
|
17895
|
-
let providerMessage = spaceTrim(`
|
|
18319
|
+
let providerMessage = spaceTrim$2(`
|
|
17896
18320
|
${i + 1}) **${title}** \`${className}\` from \`${packageName}\`
|
|
17897
18321
|
${morePieces.join('; ')}
|
|
17898
18322
|
`);
|
|
@@ -18026,7 +18450,7 @@ class $EnvStorage {
|
|
|
18026
18450
|
.filter((line) => !line.startsWith(`# ${GENERATOR_WARNING_IN_ENV}`)) // Remove GENERATOR_WARNING_IN_ENV
|
|
18027
18451
|
.filter((line) => !line.startsWith(`${transformedKey}=`)) // Remove existing key if present
|
|
18028
18452
|
.join('\n');
|
|
18029
|
-
const newEnvContent = spaceTrim((block) => `
|
|
18453
|
+
const newEnvContent = spaceTrim$2((block) => `
|
|
18030
18454
|
${block(updatedEnvContent)}
|
|
18031
18455
|
|
|
18032
18456
|
# ${GENERATOR_WARNING_IN_ENV}
|
|
@@ -18055,7 +18479,7 @@ class $EnvStorage {
|
|
|
18055
18479
|
*/
|
|
18056
18480
|
function stringifyPipelineJson(pipeline) {
|
|
18057
18481
|
if (!isSerializableAsJson(pipeline)) {
|
|
18058
|
-
throw new UnexpectedError(spaceTrim(`
|
|
18482
|
+
throw new UnexpectedError(spaceTrim$2(`
|
|
18059
18483
|
Cannot stringify the pipeline, because it is not serializable as JSON
|
|
18060
18484
|
|
|
18061
18485
|
There can be multiple reasons:
|
|
@@ -18255,7 +18679,7 @@ function cacheLlmTools(llmTools, options = {}) {
|
|
|
18255
18679
|
let normalizedContent = content;
|
|
18256
18680
|
normalizedContent = normalizedContent.replace(/\s+/g, ' ');
|
|
18257
18681
|
normalizedContent = normalizedContent.split('\r\n').join('\n');
|
|
18258
|
-
normalizedContent = spaceTrim(normalizedContent);
|
|
18682
|
+
normalizedContent = spaceTrim$2(normalizedContent);
|
|
18259
18683
|
// Note: Do not need to save everything in the cache, just the relevant parameters
|
|
18260
18684
|
const relevantParameterNames = extractParameterNames(content);
|
|
18261
18685
|
const relevantParameters = Object.fromEntries(Object.entries(parameters).filter(([key]) => relevantParameterNames.has(key)));
|
|
@@ -18444,7 +18868,7 @@ function createLlmToolsFromConfiguration(configuration, options = {}) {
|
|
|
18444
18868
|
.find(({ packageName, className }) => llmConfiguration.packageName === packageName && llmConfiguration.className === className);
|
|
18445
18869
|
if (registeredItem === undefined) {
|
|
18446
18870
|
// console.log('$llmToolsRegister.list()', $llmToolsRegister.list());
|
|
18447
|
-
throw new Error(spaceTrim((block) => `
|
|
18871
|
+
throw new Error(spaceTrim$2((block) => `
|
|
18448
18872
|
There is no constructor for LLM provider \`${llmConfiguration.className}\` from \`${llmConfiguration.packageName}\`
|
|
18449
18873
|
Running in ${!$isRunningInBrowser() ? '' : 'browser environment'}${!$isRunningInNode() ? '' : 'node environment'}${!$isRunningInWebWorker() ? '' : 'worker environment'}
|
|
18450
18874
|
|
|
@@ -18512,14 +18936,14 @@ async function $provideLlmToolsFromEnv(options = {}) {
|
|
|
18512
18936
|
const configuration = await $provideLlmToolsConfigurationFromEnv();
|
|
18513
18937
|
if (configuration.length === 0) {
|
|
18514
18938
|
if ($llmToolsMetadataRegister.list().length === 0) {
|
|
18515
|
-
throw new UnexpectedError(spaceTrim((block) => `
|
|
18939
|
+
throw new UnexpectedError(spaceTrim$2((block) => `
|
|
18516
18940
|
No LLM tools registered, this is probably a bug in the Promptbook library
|
|
18517
18941
|
|
|
18518
18942
|
${block($registeredLlmToolsMessage())}}
|
|
18519
18943
|
`));
|
|
18520
18944
|
}
|
|
18521
18945
|
// TODO: [🥃]
|
|
18522
|
-
throw new Error(spaceTrim((block) => `
|
|
18946
|
+
throw new Error(spaceTrim$2((block) => `
|
|
18523
18947
|
No LLM tools found in the environment
|
|
18524
18948
|
|
|
18525
18949
|
${block($registeredLlmToolsMessage())}}
|
|
@@ -18657,7 +19081,7 @@ async function $provideScrapersForNode(tools, options) {
|
|
|
18657
19081
|
function extractOneBlockFromMarkdown(markdown) {
|
|
18658
19082
|
const codeBlocks = extractAllBlocksFromMarkdown(markdown);
|
|
18659
19083
|
if (codeBlocks.length !== 1) {
|
|
18660
|
-
throw new ParseError(spaceTrim((block) => `
|
|
19084
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
18661
19085
|
There should be exactly 1 code block in task section, found ${codeBlocks.length} code blocks
|
|
18662
19086
|
|
|
18663
19087
|
${block(codeBlocks.map((block, i) => `Block ${i + 1}:\n${block.content}`).join('\n\n\n'))}
|
|
@@ -18766,8 +19190,8 @@ class JavascriptEvalExecutionTools {
|
|
|
18766
19190
|
}
|
|
18767
19191
|
// Note: [💎]
|
|
18768
19192
|
// Note: Using direct eval, following variables are in same scope as eval call so they are accessible from inside the evaluated script:
|
|
18769
|
-
const spaceTrim
|
|
18770
|
-
$preserve(spaceTrim
|
|
19193
|
+
const spaceTrim = (_) => spaceTrim$2(_);
|
|
19194
|
+
$preserve(spaceTrim);
|
|
18771
19195
|
const removeQuotes$1 = removeQuotes;
|
|
18772
19196
|
$preserve(removeQuotes$1);
|
|
18773
19197
|
const unwrapResult$1 = unwrapResult;
|
|
@@ -18820,7 +19244,7 @@ class JavascriptEvalExecutionTools {
|
|
|
18820
19244
|
// TODO: DRY [🍯]
|
|
18821
19245
|
const buildinFunctions = {
|
|
18822
19246
|
// TODO: [🍯] DRY all these functions across the file
|
|
18823
|
-
spaceTrim
|
|
19247
|
+
spaceTrim,
|
|
18824
19248
|
removeQuotes: removeQuotes$1,
|
|
18825
19249
|
unwrapResult: unwrapResult$1,
|
|
18826
19250
|
trimEndOfCodeBlock: trimEndOfCodeBlock$1,
|
|
@@ -18857,7 +19281,7 @@ class JavascriptEvalExecutionTools {
|
|
|
18857
19281
|
.join('\n');
|
|
18858
19282
|
// script = templateParameters(script, parameters);
|
|
18859
19283
|
// <- TODO: [🧠][🥳] Should be this is one of two variants how to use parameters in script
|
|
18860
|
-
const statementToEvaluate = spaceTrim((block) => `
|
|
19284
|
+
const statementToEvaluate = spaceTrim$2((block) => `
|
|
18861
19285
|
|
|
18862
19286
|
// Build-in functions:
|
|
18863
19287
|
${block(buildinFunctionsStatement)}
|
|
@@ -18872,7 +19296,7 @@ class JavascriptEvalExecutionTools {
|
|
|
18872
19296
|
(()=>{ ${script} })()
|
|
18873
19297
|
`);
|
|
18874
19298
|
if (this.options.isVerbose) {
|
|
18875
|
-
console.info(spaceTrim((block) => `
|
|
19299
|
+
console.info(spaceTrim$2((block) => `
|
|
18876
19300
|
🚀 Evaluating ${scriptLanguage} script:
|
|
18877
19301
|
|
|
18878
19302
|
${block(statementToEvaluate)}`));
|
|
@@ -18894,7 +19318,7 @@ class JavascriptEvalExecutionTools {
|
|
|
18894
19318
|
To: [PipelineExecutionError: Parameter `{thing}` is not defined],
|
|
18895
19319
|
*/
|
|
18896
19320
|
if (!statementToEvaluate.includes(undefinedName + '(')) {
|
|
18897
|
-
throw new PipelineExecutionError(spaceTrim((block) => `
|
|
19321
|
+
throw new PipelineExecutionError(spaceTrim$2((block) => `
|
|
18898
19322
|
|
|
18899
19323
|
Parameter \`{${undefinedName}}\` is not defined
|
|
18900
19324
|
|
|
@@ -18916,7 +19340,7 @@ class JavascriptEvalExecutionTools {
|
|
|
18916
19340
|
`));
|
|
18917
19341
|
}
|
|
18918
19342
|
else {
|
|
18919
|
-
throw new PipelineExecutionError(spaceTrim((block) => `
|
|
19343
|
+
throw new PipelineExecutionError(spaceTrim$2((block) => `
|
|
18920
19344
|
Function ${undefinedName}() is not defined
|
|
18921
19345
|
|
|
18922
19346
|
- Make sure that the function is one of built-in functions
|
|
@@ -19055,7 +19479,7 @@ const knowledgeCommandParser = {
|
|
|
19055
19479
|
*/
|
|
19056
19480
|
parse(input) {
|
|
19057
19481
|
const { args } = input;
|
|
19058
|
-
const knowledgeSourceContent = spaceTrim(args[0] || '');
|
|
19482
|
+
const knowledgeSourceContent = spaceTrim$2(args[0] || '');
|
|
19059
19483
|
if (knowledgeSourceContent === '') {
|
|
19060
19484
|
throw new ParseError(`Source is not defined`);
|
|
19061
19485
|
}
|
|
@@ -19199,7 +19623,7 @@ const sectionCommandParser = {
|
|
|
19199
19623
|
normalized = normalized.split('DIALOGUE').join('DIALOG');
|
|
19200
19624
|
const taskTypes = SectionTypes.filter((sectionType) => normalized.includes(sectionType.split('_TASK').join('')));
|
|
19201
19625
|
if (taskTypes.length !== 1) {
|
|
19202
|
-
throw new ParseError(spaceTrim((block) => `
|
|
19626
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
19203
19627
|
Unknown section type "${normalized}"
|
|
19204
19628
|
|
|
19205
19629
|
Supported section types are:
|
|
@@ -19219,7 +19643,7 @@ const sectionCommandParser = {
|
|
|
19219
19643
|
*/
|
|
19220
19644
|
$applyToTaskJson(command, $taskJson, $pipelineJson) {
|
|
19221
19645
|
if ($taskJson.isSectionTypeSet === true) {
|
|
19222
|
-
throw new ParseError(spaceTrim(`
|
|
19646
|
+
throw new ParseError(spaceTrim$2(`
|
|
19223
19647
|
Section type is already defined in the section.
|
|
19224
19648
|
It can be defined only once.
|
|
19225
19649
|
`));
|
|
@@ -19499,7 +19923,7 @@ const expectCommandParser = {
|
|
|
19499
19923
|
/**
|
|
19500
19924
|
* Description of the FORMAT command
|
|
19501
19925
|
*/
|
|
19502
|
-
description: spaceTrim(`
|
|
19926
|
+
description: spaceTrim$2(`
|
|
19503
19927
|
Expect command describes the desired output of the task *(after post-processing)*
|
|
19504
19928
|
It can set limits for the maximum/minimum length of the output, measured in characters, words, sentences, paragraphs or some other shape of the output.
|
|
19505
19929
|
`),
|
|
@@ -19573,7 +19997,7 @@ const expectCommandParser = {
|
|
|
19573
19997
|
}
|
|
19574
19998
|
catch (error) {
|
|
19575
19999
|
assertsError(error);
|
|
19576
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20000
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
19577
20001
|
Invalid FORMAT command
|
|
19578
20002
|
${block(error.message)}:
|
|
19579
20003
|
`));
|
|
@@ -19685,7 +20109,7 @@ function validateParameterName(parameterName) {
|
|
|
19685
20109
|
if (!(error instanceof ParseError)) {
|
|
19686
20110
|
throw error;
|
|
19687
20111
|
}
|
|
19688
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20112
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
19689
20113
|
${block(error.message)}
|
|
19690
20114
|
|
|
19691
20115
|
Tried to validate parameter name:
|
|
@@ -19744,7 +20168,7 @@ const foreachCommandParser = {
|
|
|
19744
20168
|
const assignSign = args[3];
|
|
19745
20169
|
const formatDefinition = FORMAT_DEFINITIONS.find((formatDefinition) => [formatDefinition.formatName, ...(formatDefinition.aliases || [])].includes(formatName));
|
|
19746
20170
|
if (formatDefinition === undefined) {
|
|
19747
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20171
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
19748
20172
|
Unsupported format "${formatName}"
|
|
19749
20173
|
|
|
19750
20174
|
Available formats:
|
|
@@ -19756,7 +20180,7 @@ const foreachCommandParser = {
|
|
|
19756
20180
|
}
|
|
19757
20181
|
const subvalueParser = formatDefinition.subvalueParsers.find((subvalueParser) => [subvalueParser.subvalueName, ...(subvalueParser.aliases || [])].includes(subformatName));
|
|
19758
20182
|
if (subvalueParser === undefined) {
|
|
19759
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20183
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
19760
20184
|
Unsupported subformat name "${subformatName}" for format "${formatName}"
|
|
19761
20185
|
|
|
19762
20186
|
Available subformat names for format "${formatDefinition.formatName}":
|
|
@@ -19804,7 +20228,7 @@ const foreachCommandParser = {
|
|
|
19804
20228
|
outputSubparameterName = 'newLine';
|
|
19805
20229
|
}
|
|
19806
20230
|
else {
|
|
19807
|
-
throw new ParseError(spaceTrim(`
|
|
20231
|
+
throw new ParseError(spaceTrim$2(`
|
|
19808
20232
|
FOREACH ${formatName} ${subformatName} must specify output subparameter
|
|
19809
20233
|
|
|
19810
20234
|
Correct example:
|
|
@@ -19880,7 +20304,7 @@ const formatCommandParser = {
|
|
|
19880
20304
|
/**
|
|
19881
20305
|
* Description of the FORMAT command
|
|
19882
20306
|
*/
|
|
19883
|
-
description: spaceTrim(`
|
|
20307
|
+
description: spaceTrim$2(`
|
|
19884
20308
|
Format command describes the desired output of the task (after post-processing)
|
|
19885
20309
|
It can set limits for the maximum/minimum length of the output, measured in characters, words, sentences, paragraphs or some other shape of the output.
|
|
19886
20310
|
`),
|
|
@@ -20252,7 +20676,7 @@ const formfactorCommandParser = {
|
|
|
20252
20676
|
const formfactorNameCandidate = args[0].toUpperCase();
|
|
20253
20677
|
const formfactor = FORMFACTOR_DEFINITIONS.find((definition) => [definition.name, ...{ aliasNames: [], ...definition }.aliasNames].includes(formfactorNameCandidate));
|
|
20254
20678
|
if (formfactor === undefined) {
|
|
20255
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20679
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
20256
20680
|
Unknown formfactor name "${formfactorNameCandidate}"
|
|
20257
20681
|
|
|
20258
20682
|
Available formfactors:
|
|
@@ -20271,7 +20695,7 @@ const formfactorCommandParser = {
|
|
|
20271
20695
|
*/
|
|
20272
20696
|
$applyToPipelineJson(command, $pipelineJson) {
|
|
20273
20697
|
if ($pipelineJson.formfactorName !== undefined && $pipelineJson.formfactorName !== command.formfactorName) {
|
|
20274
|
-
throw new ParseError(spaceTrim(`
|
|
20698
|
+
throw new ParseError(spaceTrim$2(`
|
|
20275
20699
|
Redefinition of \`FORMFACTOR\` in the pipeline head
|
|
20276
20700
|
|
|
20277
20701
|
You have used:
|
|
@@ -20414,7 +20838,7 @@ const modelCommandParser = {
|
|
|
20414
20838
|
*/
|
|
20415
20839
|
parse(input) {
|
|
20416
20840
|
const { args, normalized } = input;
|
|
20417
|
-
const availableVariantsMessage = spaceTrim((block) => `
|
|
20841
|
+
const availableVariantsMessage = spaceTrim$2((block) => `
|
|
20418
20842
|
Available variants are:
|
|
20419
20843
|
${block(MODEL_VARIANTS.map((variantName) => `- ${variantName}${variantName !== 'EMBEDDING' ? '' : ' (Not available in pipeline)'}`).join('\n'))}
|
|
20420
20844
|
`);
|
|
@@ -20436,14 +20860,14 @@ const modelCommandParser = {
|
|
|
20436
20860
|
// <- Note: [🤖]
|
|
20437
20861
|
}
|
|
20438
20862
|
else if (normalized.startsWith('MODEL_VARIANT_EMBED')) {
|
|
20439
|
-
spaceTrim((block) => `
|
|
20863
|
+
spaceTrim$2((block) => `
|
|
20440
20864
|
Embedding model can not be used in pipeline
|
|
20441
20865
|
|
|
20442
20866
|
${block(availableVariantsMessage)}
|
|
20443
20867
|
`);
|
|
20444
20868
|
}
|
|
20445
20869
|
else {
|
|
20446
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20870
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
20447
20871
|
Unknown model variant in command:
|
|
20448
20872
|
|
|
20449
20873
|
${block(availableVariantsMessage)}
|
|
@@ -20458,7 +20882,7 @@ const modelCommandParser = {
|
|
|
20458
20882
|
};
|
|
20459
20883
|
}
|
|
20460
20884
|
else {
|
|
20461
|
-
throw new ParseError(spaceTrim((block) => `
|
|
20885
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
20462
20886
|
Unknown model key in command.
|
|
20463
20887
|
|
|
20464
20888
|
Supported model keys are:
|
|
@@ -20485,7 +20909,7 @@ const modelCommandParser = {
|
|
|
20485
20909
|
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
20486
20910
|
}
|
|
20487
20911
|
else {
|
|
20488
|
-
throw new ParseError(spaceTrim(`
|
|
20912
|
+
throw new ParseError(spaceTrim$2(`
|
|
20489
20913
|
Redefinition of \`MODEL ${command.key}\` in the pipeline head
|
|
20490
20914
|
|
|
20491
20915
|
You have used:
|
|
@@ -20517,7 +20941,7 @@ const modelCommandParser = {
|
|
|
20517
20941
|
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
20518
20942
|
}
|
|
20519
20943
|
else {
|
|
20520
|
-
throw new ParseError(spaceTrim(`
|
|
20944
|
+
throw new ParseError(spaceTrim$2(`
|
|
20521
20945
|
Redefinition of MODEL \`${command.key}\` in the task "${$taskJson.title || $taskJson.name}"
|
|
20522
20946
|
|
|
20523
20947
|
You have used:
|
|
@@ -20527,7 +20951,7 @@ const modelCommandParser = {
|
|
|
20527
20951
|
}
|
|
20528
20952
|
}
|
|
20529
20953
|
if (command.value === ($pipelineJson.defaultModelRequirements || {})[command.key]) {
|
|
20530
|
-
console.log(spaceTrim(`
|
|
20954
|
+
console.log(spaceTrim$2(`
|
|
20531
20955
|
Setting MODEL \`${command.key}\` in the task "${$taskJson.title || $taskJson.name}" to the same value as in the pipeline head
|
|
20532
20956
|
|
|
20533
20957
|
In pipeline head:
|
|
@@ -20610,7 +21034,7 @@ const parameterCommandParser = {
|
|
|
20610
21034
|
// <- TODO: When [🥶] fixed, change to:
|
|
20611
21035
|
// > const parameterDescriptionRaw = rawArgs.split(parameterNameRaw).join('').trim();
|
|
20612
21036
|
if (parameterDescriptionRaw && parameterDescriptionRaw.match(/\{(?<embeddedParameterName>[a-z0-9_]+)\}/im)) {
|
|
20613
|
-
throw new ParseError(spaceTrim((block) => `
|
|
21037
|
+
throw new ParseError(spaceTrim$2((block) => `
|
|
20614
21038
|
Parameter \`{${parameterNameRaw}}\` can not contain another parameter in description
|
|
20615
21039
|
|
|
20616
21040
|
The description:
|
|
@@ -20792,7 +21216,7 @@ function $applyToTaskJson(command, $taskJson, $pipelineJson) {
|
|
|
20792
21216
|
persona.description = personaDescription;
|
|
20793
21217
|
return;
|
|
20794
21218
|
}
|
|
20795
|
-
console.warn(spaceTrim(`
|
|
21219
|
+
console.warn(spaceTrim$2(`
|
|
20796
21220
|
|
|
20797
21221
|
Persona "${personaName}" is defined multiple times with different description:
|
|
20798
21222
|
|
|
@@ -20803,7 +21227,7 @@ function $applyToTaskJson(command, $taskJson, $pipelineJson) {
|
|
|
20803
21227
|
${personaDescription}
|
|
20804
21228
|
|
|
20805
21229
|
`));
|
|
20806
|
-
persona.description += spaceTrim('\n\n' + personaDescription);
|
|
21230
|
+
persona.description += spaceTrim$2('\n\n' + personaDescription);
|
|
20807
21231
|
}
|
|
20808
21232
|
|
|
20809
21233
|
/**
|
|
@@ -21644,7 +22068,7 @@ function removeMarkdownComments(content) {
|
|
|
21644
22068
|
*/
|
|
21645
22069
|
function isFlatPipeline(pipelineString) {
|
|
21646
22070
|
pipelineString = removeMarkdownComments(pipelineString);
|
|
21647
|
-
pipelineString = spaceTrim(pipelineString);
|
|
22071
|
+
pipelineString = spaceTrim$2(pipelineString);
|
|
21648
22072
|
const isMarkdownBeginningWithHeadline = pipelineString.startsWith('# ');
|
|
21649
22073
|
//const isLastLineReturnStatement = pipelineString.split('\n').pop()!.split('`').join('').startsWith('->');
|
|
21650
22074
|
const isBacktickBlockUsed = pipelineString.includes('```');
|
|
@@ -21670,7 +22094,7 @@ function deflatePipeline(pipelineString) {
|
|
|
21670
22094
|
if (!isFlatPipeline(pipelineString)) {
|
|
21671
22095
|
return pipelineString;
|
|
21672
22096
|
}
|
|
21673
|
-
pipelineString = spaceTrim(pipelineString);
|
|
22097
|
+
pipelineString = spaceTrim$2(pipelineString);
|
|
21674
22098
|
const pipelineStringLines = pipelineString.split('\n');
|
|
21675
22099
|
const potentialReturnStatement = pipelineStringLines.pop();
|
|
21676
22100
|
let returnStatement;
|
|
@@ -21683,19 +22107,19 @@ function deflatePipeline(pipelineString) {
|
|
|
21683
22107
|
returnStatement = `-> {${DEFAULT_BOOK_OUTPUT_PARAMETER_NAME}}`;
|
|
21684
22108
|
pipelineStringLines.push(potentialReturnStatement);
|
|
21685
22109
|
}
|
|
21686
|
-
const prompt = spaceTrim(pipelineStringLines.join('\n'));
|
|
22110
|
+
const prompt = spaceTrim$2(pipelineStringLines.join('\n'));
|
|
21687
22111
|
let quotedPrompt;
|
|
21688
22112
|
if (prompt.split('\n').length <= 1) {
|
|
21689
22113
|
quotedPrompt = `> ${prompt}`;
|
|
21690
22114
|
}
|
|
21691
22115
|
else {
|
|
21692
|
-
quotedPrompt = spaceTrim((block) => `
|
|
22116
|
+
quotedPrompt = spaceTrim$2((block) => `
|
|
21693
22117
|
\`\`\`
|
|
21694
22118
|
${block(prompt.split('`').join('\\`'))}
|
|
21695
22119
|
\`\`\`
|
|
21696
22120
|
`);
|
|
21697
22121
|
}
|
|
21698
|
-
pipelineString = validatePipelineString(spaceTrim((block) => `
|
|
22122
|
+
pipelineString = validatePipelineString(spaceTrim$2((block) => `
|
|
21699
22123
|
# ${DEFAULT_BOOK_TITLE}
|
|
21700
22124
|
|
|
21701
22125
|
## Prompt
|
|
@@ -21753,7 +22177,7 @@ function parseMarkdownSection(value) {
|
|
|
21753
22177
|
}
|
|
21754
22178
|
const title = lines[0].replace(/^#+\s*/, '');
|
|
21755
22179
|
const level = (_b = (_a = lines[0].match(/^#+/)) === null || _a === void 0 ? void 0 : _a[0].length) !== null && _b !== void 0 ? _b : 0;
|
|
21756
|
-
const content = spaceTrim(lines.slice(1).join('\n'));
|
|
22180
|
+
const content = spaceTrim$2(lines.slice(1).join('\n'));
|
|
21757
22181
|
if (level < 1 || level > 6) {
|
|
21758
22182
|
throw new ParseError('Markdown section must have heading level between 1 and 6');
|
|
21759
22183
|
}
|
|
@@ -21781,7 +22205,7 @@ function splitMarkdownIntoSections(markdown) {
|
|
|
21781
22205
|
if (buffer.length === 0) {
|
|
21782
22206
|
return;
|
|
21783
22207
|
}
|
|
21784
|
-
let section = spaceTrim(buffer.join('\n'));
|
|
22208
|
+
let section = spaceTrim$2(buffer.join('\n'));
|
|
21785
22209
|
if (section === '') {
|
|
21786
22210
|
return;
|
|
21787
22211
|
}
|
|
@@ -21856,7 +22280,7 @@ function flattenMarkdown(markdown) {
|
|
|
21856
22280
|
flattenedMarkdown += `## ${title}` + `\n\n`;
|
|
21857
22281
|
flattenedMarkdown += content + `\n\n`; // <- [🧠] Maybe 3 new lines?
|
|
21858
22282
|
}
|
|
21859
|
-
return spaceTrim(flattenedMarkdown);
|
|
22283
|
+
return spaceTrim$2(flattenedMarkdown);
|
|
21860
22284
|
}
|
|
21861
22285
|
/**
|
|
21862
22286
|
* TODO: [🏛] This can be part of markdown builder
|
|
@@ -22557,7 +22981,7 @@ async function createPipelineCollectionFromDirectory(rootPath, tools, options) {
|
|
|
22557
22981
|
catch (error) {
|
|
22558
22982
|
assertsError(error);
|
|
22559
22983
|
// TODO: [7] DRY
|
|
22560
|
-
const wrappedErrorMessage = spaceTrim((block) => `
|
|
22984
|
+
const wrappedErrorMessage = spaceTrim$2((block) => `
|
|
22561
22985
|
${error.name} in pipeline ${fileName.split('\\').join('/')}:
|
|
22562
22986
|
|
|
22563
22987
|
Original error message:
|
|
@@ -22592,7 +23016,7 @@ async function createPipelineCollectionFromDirectory(rootPath, tools, options) {
|
|
|
22592
23016
|
pipeline = { ...pipeline, pipelineUrl };
|
|
22593
23017
|
}
|
|
22594
23018
|
else if (!pipeline.pipelineUrl.startsWith(rootUrl)) {
|
|
22595
|
-
throw new PipelineUrlError(spaceTrim(`
|
|
23019
|
+
throw new PipelineUrlError(spaceTrim$2(`
|
|
22596
23020
|
Pipeline with URL ${pipeline.pipelineUrl} is not a child of the root URL ${rootUrl} 🍏
|
|
22597
23021
|
|
|
22598
23022
|
File:
|
|
@@ -22630,7 +23054,7 @@ async function createPipelineCollectionFromDirectory(rootPath, tools, options) {
|
|
|
22630
23054
|
}
|
|
22631
23055
|
else {
|
|
22632
23056
|
const existing = collection.get(pipeline.pipelineUrl);
|
|
22633
|
-
throw new PipelineUrlError(spaceTrim(`
|
|
23057
|
+
throw new PipelineUrlError(spaceTrim$2(`
|
|
22634
23058
|
Pipeline with URL ${pipeline.pipelineUrl} is already in the collection 🍏
|
|
22635
23059
|
|
|
22636
23060
|
Conflicting files:
|
|
@@ -22648,7 +23072,7 @@ async function createPipelineCollectionFromDirectory(rootPath, tools, options) {
|
|
|
22648
23072
|
catch (error) {
|
|
22649
23073
|
assertsError(error);
|
|
22650
23074
|
// TODO: [7] DRY
|
|
22651
|
-
const wrappedErrorMessage = spaceTrim((block) => `
|
|
23075
|
+
const wrappedErrorMessage = spaceTrim$2((block) => `
|
|
22652
23076
|
${error.name} in pipeline ${fileName.split('\\').join('/')}:
|
|
22653
23077
|
|
|
22654
23078
|
Original error message:
|
|
@@ -22824,7 +23248,7 @@ async function $getCompiledBook(tools, pipelineSource, options) {
|
|
|
22824
23248
|
// console.log(`Strategy 3️⃣`);
|
|
22825
23249
|
const response = await fetch(pipelineSource);
|
|
22826
23250
|
if (response.status >= 300) {
|
|
22827
|
-
throw new NotFoundError(spaceTrim((block) => `
|
|
23251
|
+
throw new NotFoundError(spaceTrim$2((block) => `
|
|
22828
23252
|
Book not found on URL:
|
|
22829
23253
|
${block(pipelineSource)}
|
|
22830
23254
|
|
|
@@ -22834,7 +23258,7 @@ async function $getCompiledBook(tools, pipelineSource, options) {
|
|
|
22834
23258
|
const pipelineString = await response.text();
|
|
22835
23259
|
// console.log({ pipelineString });
|
|
22836
23260
|
if (!isValidPipelineString(pipelineString)) {
|
|
22837
|
-
throw new NotFoundError(spaceTrim((block) => `
|
|
23261
|
+
throw new NotFoundError(spaceTrim$2((block) => `
|
|
22838
23262
|
Book not found on URL:
|
|
22839
23263
|
${block(pipelineSource)}
|
|
22840
23264
|
|
|
@@ -22856,7 +23280,7 @@ async function $getCompiledBook(tools, pipelineSource, options) {
|
|
|
22856
23280
|
});
|
|
22857
23281
|
return pipelineJson;
|
|
22858
23282
|
} /* not else */
|
|
22859
|
-
throw new NotFoundError(spaceTrim((block) => `
|
|
23283
|
+
throw new NotFoundError(spaceTrim$2((block) => `
|
|
22860
23284
|
Book not found:
|
|
22861
23285
|
${block(pipelineSource)}
|
|
22862
23286
|
|