@promptbook/wizard 0.100.0-45 → 0.100.0-47
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 +204 -107
- package/esm/index.es.js.map +1 -1
- package/esm/typings/src/_packages/components.index.d.ts +4 -0
- package/esm/typings/src/_packages/core.index.d.ts +2 -0
- package/esm/typings/src/_packages/types.index.d.ts +2 -6
- package/esm/typings/src/book-2.0/commitments/_misc/AgentModelRequirements.d.ts +1 -1
- package/esm/typings/src/book-components/Chat/Chat/Chat.d.ts +4 -10
- package/esm/typings/src/book-components/Chat/interfaces/ChatMessage.d.ts +12 -26
- package/esm/typings/src/book-components/Chat/interfaces/ChatParticipant.d.ts +30 -0
- package/esm/typings/src/book-components/Chat/utils/exportChatHistory.d.ts +2 -4
- package/esm/typings/src/book-components/Chat/utils/generatePdfContent.d.ts +2 -4
- package/esm/typings/src/book-components/Chat/utils/messagesToHtml.d.ts +2 -4
- package/esm/typings/src/book-components/Chat/utils/messagesToMarkdown.d.ts +2 -4
- package/esm/typings/src/book-components/Chat/utils/messagesToText.d.ts +2 -4
- package/esm/typings/src/config.d.ts +7 -0
- package/esm/typings/src/execution/ExecutionTask.d.ts +8 -0
- package/esm/typings/src/llm-providers/openai/OpenAiCompatibleExecutionTools.d.ts +8 -0
- package/esm/typings/src/playground/permanent/error-handling-playground.d.ts +5 -0
- package/esm/typings/src/utils/organization/preserve.d.ts +21 -0
- package/esm/typings/src/version.d.ts +1 -1
- package/package.json +2 -3
- package/umd/index.umd.js +208 -111
- package/umd/index.umd.js.map +1 -1
- package/esm/typings/src/scripting/javascript/utils/preserve.d.ts +0 -14
package/esm/index.es.js
CHANGED
@@ -12,8 +12,9 @@ import { forTime } from 'waitasecond';
|
|
12
12
|
import { SHA256 } from 'crypto-js';
|
13
13
|
import hexEncoder from 'crypto-js/enc-hex';
|
14
14
|
import { basename, join, dirname, relative } from 'path';
|
15
|
-
import { format } from 'prettier';
|
16
15
|
import parserHtml from 'prettier/parser-html';
|
16
|
+
import parserMarkdown from 'prettier/parser-markdown';
|
17
|
+
import { format } from 'prettier/standalone';
|
17
18
|
import { Subject } from 'rxjs';
|
18
19
|
import sha256 from 'crypto-js/sha256';
|
19
20
|
import { lookup, extension } from 'mime-types';
|
@@ -38,7 +39,7 @@ const BOOK_LANGUAGE_VERSION = '1.0.0';
|
|
38
39
|
* @generated
|
39
40
|
* @see https://github.com/webgptorg/promptbook
|
40
41
|
*/
|
41
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.100.0-
|
42
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.100.0-47';
|
42
43
|
/**
|
43
44
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
44
45
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
@@ -326,6 +327,13 @@ const DEFAULT_TASK_SIMULATED_DURATION_MS = 5 * 60 * 1000; // 5 minutes
|
|
326
327
|
* @public exported from `@promptbook/core`
|
327
328
|
*/
|
328
329
|
const DEFAULT_MAX_REQUESTS_PER_MINUTE = 60;
|
330
|
+
/**
|
331
|
+
* API request timeout in milliseconds
|
332
|
+
* Can be overridden via API_REQUEST_TIMEOUT environment variable
|
333
|
+
*
|
334
|
+
* @public exported from `@promptbook/core`
|
335
|
+
*/
|
336
|
+
const API_REQUEST_TIMEOUT = parseInt(process.env.API_REQUEST_TIMEOUT || '90000');
|
329
337
|
/**
|
330
338
|
* Indicates whether pipeline logic validation is enabled. When true, the pipeline logic is checked for consistency.
|
331
339
|
*
|
@@ -4554,7 +4562,18 @@ class OpenAiCompatibleExecutionTools {
|
|
4554
4562
|
const openAiOptions = { ...this.options };
|
4555
4563
|
delete openAiOptions.isVerbose;
|
4556
4564
|
delete openAiOptions.userId;
|
4557
|
-
|
4565
|
+
// Enhanced configuration for better ECONNRESET handling
|
4566
|
+
const enhancedOptions = {
|
4567
|
+
...openAiOptions,
|
4568
|
+
timeout: API_REQUEST_TIMEOUT,
|
4569
|
+
maxRetries: CONNECTION_RETRIES_LIMIT,
|
4570
|
+
defaultHeaders: {
|
4571
|
+
Connection: 'keep-alive',
|
4572
|
+
'Keep-Alive': 'timeout=30, max=100',
|
4573
|
+
...openAiOptions.defaultHeaders,
|
4574
|
+
},
|
4575
|
+
};
|
4576
|
+
this.client = new OpenAI(enhancedOptions);
|
4558
4577
|
}
|
4559
4578
|
return this.client;
|
4560
4579
|
}
|
@@ -4642,7 +4661,7 @@ class OpenAiCompatibleExecutionTools {
|
|
4642
4661
|
console.info(colors.bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
|
4643
4662
|
}
|
4644
4663
|
const rawResponse = await this.limiter
|
4645
|
-
.schedule(() => client.chat.completions.create(rawRequest))
|
4664
|
+
.schedule(() => this.makeRequestWithRetry(() => client.chat.completions.create(rawRequest)))
|
4646
4665
|
.catch((error) => {
|
4647
4666
|
assertsError(error);
|
4648
4667
|
if (this.options.isVerbose) {
|
@@ -4718,7 +4737,7 @@ class OpenAiCompatibleExecutionTools {
|
|
4718
4737
|
console.info(colors.bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
|
4719
4738
|
}
|
4720
4739
|
const rawResponse = await this.limiter
|
4721
|
-
.schedule(() => client.completions.create(rawRequest))
|
4740
|
+
.schedule(() => this.makeRequestWithRetry(() => client.completions.create(rawRequest)))
|
4722
4741
|
.catch((error) => {
|
4723
4742
|
assertsError(error);
|
4724
4743
|
if (this.options.isVerbose) {
|
@@ -4782,7 +4801,7 @@ class OpenAiCompatibleExecutionTools {
|
|
4782
4801
|
console.info(colors.bgWhite('rawRequest'), JSON.stringify(rawRequest, null, 4));
|
4783
4802
|
}
|
4784
4803
|
const rawResponse = await this.limiter
|
4785
|
-
.schedule(() => client.embeddings.create(rawRequest))
|
4804
|
+
.schedule(() => this.makeRequestWithRetry(() => client.embeddings.create(rawRequest)))
|
4786
4805
|
.catch((error) => {
|
4787
4806
|
assertsError(error);
|
4788
4807
|
if (this.options.isVerbose) {
|
@@ -4840,6 +4859,76 @@ class OpenAiCompatibleExecutionTools {
|
|
4840
4859
|
}
|
4841
4860
|
return model;
|
4842
4861
|
}
|
4862
|
+
// <- Note: [🤖] getDefaultXxxModel
|
4863
|
+
/**
|
4864
|
+
* Makes a request with retry logic for network errors like ECONNRESET
|
4865
|
+
*/
|
4866
|
+
async makeRequestWithRetry(requestFn) {
|
4867
|
+
let lastError;
|
4868
|
+
for (let attempt = 1; attempt <= CONNECTION_RETRIES_LIMIT; attempt++) {
|
4869
|
+
try {
|
4870
|
+
return await requestFn();
|
4871
|
+
}
|
4872
|
+
catch (error) {
|
4873
|
+
assertsError(error);
|
4874
|
+
lastError = error;
|
4875
|
+
// Check if this is a retryable network error
|
4876
|
+
const isRetryableError = this.isRetryableNetworkError(error);
|
4877
|
+
if (!isRetryableError || attempt === CONNECTION_RETRIES_LIMIT) {
|
4878
|
+
if (this.options.isVerbose) {
|
4879
|
+
console.info(colors.bgRed('Final error after retries'), `Attempt ${attempt}/${CONNECTION_RETRIES_LIMIT}:`, error);
|
4880
|
+
}
|
4881
|
+
throw error;
|
4882
|
+
}
|
4883
|
+
// Calculate exponential backoff delay
|
4884
|
+
const baseDelay = 1000; // 1 second
|
4885
|
+
const backoffDelay = baseDelay * Math.pow(2, attempt - 1);
|
4886
|
+
const jitterDelay = Math.random() * 500; // Add some randomness
|
4887
|
+
const totalDelay = backoffDelay + jitterDelay;
|
4888
|
+
if (this.options.isVerbose) {
|
4889
|
+
console.info(colors.bgYellow('Retrying request'), `Attempt ${attempt}/${CONNECTION_RETRIES_LIMIT}, waiting ${Math.round(totalDelay)}ms:`, error.message);
|
4890
|
+
}
|
4891
|
+
// Wait before retrying
|
4892
|
+
await new Promise((resolve) => setTimeout(resolve, totalDelay));
|
4893
|
+
}
|
4894
|
+
}
|
4895
|
+
throw lastError;
|
4896
|
+
}
|
4897
|
+
/**
|
4898
|
+
* Determines if an error is retryable (network-related errors)
|
4899
|
+
*/
|
4900
|
+
isRetryableNetworkError(error) {
|
4901
|
+
const errorMessage = error.message.toLowerCase();
|
4902
|
+
const errorCode = error.code;
|
4903
|
+
// Network connection errors that should be retried
|
4904
|
+
const retryableErrors = [
|
4905
|
+
'econnreset',
|
4906
|
+
'enotfound',
|
4907
|
+
'econnrefused',
|
4908
|
+
'etimedout',
|
4909
|
+
'socket hang up',
|
4910
|
+
'network error',
|
4911
|
+
'fetch failed',
|
4912
|
+
'connection reset',
|
4913
|
+
'connection refused',
|
4914
|
+
'timeout',
|
4915
|
+
];
|
4916
|
+
// Check error message
|
4917
|
+
if (retryableErrors.some((retryableError) => errorMessage.includes(retryableError))) {
|
4918
|
+
return true;
|
4919
|
+
}
|
4920
|
+
// Check error code
|
4921
|
+
if (errorCode && retryableErrors.includes(errorCode.toLowerCase())) {
|
4922
|
+
return true;
|
4923
|
+
}
|
4924
|
+
// Check for specific HTTP status codes that are retryable
|
4925
|
+
const errorWithStatus = error;
|
4926
|
+
const httpStatus = errorWithStatus.status || errorWithStatus.statusCode;
|
4927
|
+
if (httpStatus && [429, 500, 502, 503, 504].includes(httpStatus)) {
|
4928
|
+
return true;
|
4929
|
+
}
|
4930
|
+
return false;
|
4931
|
+
}
|
4843
4932
|
}
|
4844
4933
|
/**
|
4845
4934
|
* TODO: [🛄] Some way how to re-wrap the errors from `OpenAiCompatibleExecutionTools`
|
@@ -6282,7 +6371,7 @@ function prettifyMarkdown(content) {
|
|
6282
6371
|
try {
|
6283
6372
|
return format(content, {
|
6284
6373
|
parser: 'markdown',
|
6285
|
-
plugins: [parserHtml],
|
6374
|
+
plugins: [parserMarkdown, parserHtml],
|
6286
6375
|
// TODO: DRY - make some import or auto-copy of .prettierrc
|
6287
6376
|
endOfLine: 'lf',
|
6288
6377
|
tabWidth: 4,
|
@@ -7751,7 +7840,7 @@ async function preparePersona(personaDescription, tools, options) {
|
|
7751
7840
|
const result = await preparePersonaExecutor({
|
7752
7841
|
availableModels /* <- Note: Passing as JSON */,
|
7753
7842
|
personaDescription,
|
7754
|
-
}).asPromise();
|
7843
|
+
}).asPromise({ isCrashedOnError: true });
|
7755
7844
|
const { outputParameters } = result;
|
7756
7845
|
const { modelsRequirements: modelsRequirementsJson } = outputParameters;
|
7757
7846
|
let modelsRequirementsUnchecked = jsonParse(modelsRequirementsJson);
|
@@ -8364,7 +8453,7 @@ async function preparePipeline(pipeline, tools, options) {
|
|
8364
8453
|
});
|
8365
8454
|
const result = await prepareTitleExecutor({
|
8366
8455
|
book: sources.map(({ content }) => content).join('\n\n'),
|
8367
|
-
}).asPromise();
|
8456
|
+
}).asPromise({ isCrashedOnError: true });
|
8368
8457
|
const { outputParameters } = result;
|
8369
8458
|
const { title: titleRaw } = outputParameters;
|
8370
8459
|
if (isVerbose) {
|
@@ -10313,64 +10402,74 @@ function createPipelineExecutor(options) {
|
|
10313
10402
|
});
|
10314
10403
|
});
|
10315
10404
|
};
|
10316
|
-
const pipelineExecutor = (inputParameters) =>
|
10317
|
-
|
10318
|
-
|
10319
|
-
|
10320
|
-
|
10321
|
-
|
10322
|
-
|
10323
|
-
|
10324
|
-
|
10325
|
-
|
10326
|
-
|
10327
|
-
|
10328
|
-
|
10329
|
-
|
10330
|
-
|
10331
|
-
|
10332
|
-
|
10333
|
-
|
10334
|
-
|
10335
|
-
// Find current task being executed (first task not yet completed)
|
10336
|
-
const remainingTasks = pipeline.tasks.filter((task) => !executedTaskTitles.has(task.title));
|
10337
|
-
if (remainingTasks.length > 0) {
|
10338
|
-
currentTaskName = remainingTasks[0].name;
|
10405
|
+
const pipelineExecutor = (inputParameters) => {
|
10406
|
+
const startTime = new Date().getTime();
|
10407
|
+
return createTask({
|
10408
|
+
taskType: 'EXECUTION',
|
10409
|
+
title: pipeline.title,
|
10410
|
+
taskProcessCallback(updateOngoingResult, updateTldr) {
|
10411
|
+
return pipelineExecutorWithCallback(inputParameters, async (newOngoingResult) => {
|
10412
|
+
var _a, _b;
|
10413
|
+
updateOngoingResult(newOngoingResult);
|
10414
|
+
// Calculate and update tldr based on pipeline progress
|
10415
|
+
const cv = newOngoingResult;
|
10416
|
+
// Calculate progress based on parameters resolved vs total parameters
|
10417
|
+
const totalParameters = pipeline.parameters.filter(p => !p.isInput).length;
|
10418
|
+
let resolvedParameters = 0;
|
10419
|
+
let currentTaskTitle = '';
|
10420
|
+
// Get the resolved parameters from output parameters
|
10421
|
+
if (cv === null || cv === void 0 ? void 0 : cv.outputParameters) {
|
10422
|
+
// Count how many output parameters have non-empty values
|
10423
|
+
resolvedParameters = Object.values(cv.outputParameters).filter(value => value !== undefined && value !== null && String(value).trim() !== '').length;
|
10339
10424
|
}
|
10340
|
-
|
10341
|
-
|
10342
|
-
|
10343
|
-
|
10344
|
-
|
10345
|
-
|
10346
|
-
|
10347
|
-
|
10348
|
-
|
10349
|
-
|
10350
|
-
|
10351
|
-
|
10352
|
-
|
10353
|
-
|
10354
|
-
|
10355
|
-
|
10356
|
-
|
10357
|
-
|
10358
|
-
|
10359
|
-
|
10360
|
-
|
10361
|
-
|
10362
|
-
|
10363
|
-
|
10364
|
-
|
10365
|
-
|
10366
|
-
|
10367
|
-
|
10368
|
-
|
10369
|
-
|
10425
|
+
// Try to determine current task from execution report
|
10426
|
+
if (((_a = cv === null || cv === void 0 ? void 0 : cv.executionReport) === null || _a === void 0 ? void 0 : _a.promptExecutions) && cv.executionReport.promptExecutions.length > 0) {
|
10427
|
+
const lastExecution = cv.executionReport.promptExecutions[cv.executionReport.promptExecutions.length - 1];
|
10428
|
+
if ((_b = lastExecution === null || lastExecution === void 0 ? void 0 : lastExecution.prompt) === null || _b === void 0 ? void 0 : _b.title) {
|
10429
|
+
currentTaskTitle = lastExecution.prompt.title;
|
10430
|
+
}
|
10431
|
+
}
|
10432
|
+
// Calculate base progress percentage
|
10433
|
+
let percent = totalParameters > 0 ? resolvedParameters / totalParameters : 0;
|
10434
|
+
// Add time-based progress for current task if we haven't completed all parameters
|
10435
|
+
if (resolvedParameters < totalParameters) {
|
10436
|
+
const elapsedMs = new Date().getTime() - startTime;
|
10437
|
+
const estimatedTotalMs = totalParameters * 30 * 1000; // Estimate 30 seconds per parameter
|
10438
|
+
const timeProgress = Math.min(elapsedMs / estimatedTotalMs, 0.9); // Cap at 90% for time-based progress
|
10439
|
+
// If we have time progress but no parameter progress, show time progress
|
10440
|
+
if (percent === 0 && timeProgress > 0) {
|
10441
|
+
percent = Math.min(timeProgress, 0.1); // Show some progress but not more than 10%
|
10442
|
+
}
|
10443
|
+
else if (percent < 1) {
|
10444
|
+
// Add partial progress for current task
|
10445
|
+
const taskProgress = totalParameters > 0 ? (1 / totalParameters) * 0.5 : 0; // 50% of task progress
|
10446
|
+
percent = Math.min(percent + taskProgress, 0.95); // Cap at 95% until fully complete
|
10447
|
+
}
|
10448
|
+
}
|
10449
|
+
// Clamp to [0,1]
|
10450
|
+
percent = Math.min(Math.max(percent, 0), 1);
|
10451
|
+
// Generate message
|
10452
|
+
let message = '';
|
10453
|
+
if (currentTaskTitle) {
|
10454
|
+
message = `Executing: ${currentTaskTitle}`;
|
10455
|
+
}
|
10456
|
+
else if (resolvedParameters === 0) {
|
10457
|
+
message = 'Starting pipeline execution';
|
10458
|
+
}
|
10459
|
+
else if (resolvedParameters < totalParameters) {
|
10460
|
+
message = `Processing pipeline (${resolvedParameters}/${totalParameters} parameters resolved)`;
|
10461
|
+
}
|
10462
|
+
else {
|
10463
|
+
message = 'Completing pipeline execution';
|
10464
|
+
}
|
10465
|
+
updateTldr({
|
10466
|
+
percent: percent,
|
10467
|
+
message,
|
10468
|
+
});
|
10370
10469
|
});
|
10371
|
-
}
|
10372
|
-
}
|
10373
|
-
}
|
10470
|
+
},
|
10471
|
+
});
|
10472
|
+
};
|
10374
10473
|
// <- TODO: Make types such as there is no need to do `as` for `createTask`
|
10375
10474
|
return pipelineExecutor;
|
10376
10475
|
}
|
@@ -10455,7 +10554,9 @@ class MarkdownScraper {
|
|
10455
10554
|
},
|
10456
10555
|
});
|
10457
10556
|
const knowledgeContent = await source.asText();
|
10458
|
-
const result = await prepareKnowledgeFromMarkdownExecutor({ knowledgeContent }).asPromise(
|
10557
|
+
const result = await prepareKnowledgeFromMarkdownExecutor({ knowledgeContent }).asPromise({
|
10558
|
+
isCrashedOnError: true,
|
10559
|
+
});
|
10459
10560
|
const { outputParameters } = result;
|
10460
10561
|
const { knowledgePieces: knowledgePiecesRaw } = outputParameters;
|
10461
10562
|
const knowledgeTextPieces = (knowledgePiecesRaw || '').split('\n---\n');
|
@@ -10479,12 +10580,16 @@ class MarkdownScraper {
|
|
10479
10580
|
];
|
10480
10581
|
*/
|
10481
10582
|
try {
|
10482
|
-
const titleResult = await prepareTitleExecutor({ knowledgePieceContent }).asPromise(
|
10583
|
+
const titleResult = await prepareTitleExecutor({ knowledgePieceContent }).asPromise({
|
10584
|
+
isCrashedOnError: true,
|
10585
|
+
});
|
10483
10586
|
const { title: titleRaw = 'Untitled' } = titleResult.outputParameters;
|
10484
10587
|
title = spaceTrim(titleRaw) /* <- TODO: Maybe do in pipeline */;
|
10485
10588
|
name = titleToName(title);
|
10486
10589
|
// --- Keywords
|
10487
|
-
const keywordsResult = await prepareKeywordsExecutor({ knowledgePieceContent }).asPromise(
|
10590
|
+
const keywordsResult = await prepareKeywordsExecutor({ knowledgePieceContent }).asPromise({
|
10591
|
+
isCrashedOnError: true,
|
10592
|
+
});
|
10488
10593
|
const { keywords: keywordsRaw = '' } = keywordsResult.outputParameters;
|
10489
10594
|
keywords = (keywordsRaw || '')
|
10490
10595
|
.split(',')
|
@@ -13151,31 +13256,23 @@ function extractBlock(markdown) {
|
|
13151
13256
|
return content;
|
13152
13257
|
}
|
13153
13258
|
|
13259
|
+
/**
|
13260
|
+
* @private internal for `preserve`
|
13261
|
+
*/
|
13262
|
+
const _preserved = [];
|
13154
13263
|
/**
|
13155
13264
|
* Does nothing, but preserves the function in the bundle
|
13156
13265
|
* Compiler is tricked into thinking the function is used
|
13157
13266
|
*
|
13158
13267
|
* @param value any function to preserve
|
13159
13268
|
* @returns nothing
|
13160
|
-
* @private
|
13161
|
-
*/
|
13162
|
-
function preserve(
|
13163
|
-
|
13164
|
-
(async () => {
|
13165
|
-
// TODO: [💩] Change to `await forEver` or `forTime(Infinity)`
|
13166
|
-
await forTime(100000000);
|
13167
|
-
// [1]
|
13168
|
-
try {
|
13169
|
-
await func();
|
13170
|
-
}
|
13171
|
-
finally {
|
13172
|
-
// do nothing
|
13173
|
-
}
|
13174
|
-
})();
|
13269
|
+
* @private within the repository
|
13270
|
+
*/
|
13271
|
+
function $preserve(...value) {
|
13272
|
+
_preserved.push(...value);
|
13175
13273
|
}
|
13176
13274
|
/**
|
13177
|
-
*
|
13178
|
-
* TODO: [1] This maybe does memory leak
|
13275
|
+
* Note: [💞] Ignore a discrepancy between file name and entity name
|
13179
13276
|
*/
|
13180
13277
|
|
13181
13278
|
// Note: [💎]
|
@@ -13203,25 +13300,25 @@ class JavascriptEvalExecutionTools {
|
|
13203
13300
|
// Note: [💎]
|
13204
13301
|
// Note: Using direct eval, following variables are in same scope as eval call so they are accessible from inside the evaluated script:
|
13205
13302
|
const spaceTrim$1 = (_) => spaceTrim(_);
|
13206
|
-
preserve(spaceTrim$1);
|
13303
|
+
$preserve(spaceTrim$1);
|
13207
13304
|
const removeQuotes$1 = removeQuotes;
|
13208
|
-
preserve(removeQuotes$1);
|
13305
|
+
$preserve(removeQuotes$1);
|
13209
13306
|
const unwrapResult$1 = unwrapResult;
|
13210
|
-
preserve(unwrapResult$1);
|
13307
|
+
$preserve(unwrapResult$1);
|
13211
13308
|
const trimEndOfCodeBlock$1 = trimEndOfCodeBlock;
|
13212
|
-
preserve(trimEndOfCodeBlock$1);
|
13309
|
+
$preserve(trimEndOfCodeBlock$1);
|
13213
13310
|
const trimCodeBlock$1 = trimCodeBlock;
|
13214
|
-
preserve(trimCodeBlock$1);
|
13311
|
+
$preserve(trimCodeBlock$1);
|
13215
13312
|
// TODO: DRY [🍯]
|
13216
13313
|
const trim = (str) => str.trim();
|
13217
|
-
preserve(trim);
|
13314
|
+
$preserve(trim);
|
13218
13315
|
// TODO: DRY [🍯]
|
13219
13316
|
const reverse = (str) => str.split('').reverse().join('');
|
13220
|
-
preserve(reverse);
|
13317
|
+
$preserve(reverse);
|
13221
13318
|
const removeEmojis$1 = removeEmojis;
|
13222
|
-
preserve(removeEmojis$1);
|
13319
|
+
$preserve(removeEmojis$1);
|
13223
13320
|
const prettifyMarkdown$1 = prettifyMarkdown;
|
13224
|
-
preserve(prettifyMarkdown$1);
|
13321
|
+
$preserve(prettifyMarkdown$1);
|
13225
13322
|
//-------[n12:]---
|
13226
13323
|
const capitalize$1 = capitalize;
|
13227
13324
|
const decapitalize$1 = decapitalize;
|
@@ -13237,18 +13334,18 @@ class JavascriptEvalExecutionTools {
|
|
13237
13334
|
// TODO: DRY [🍯]
|
13238
13335
|
Array.from(parseKeywordsFromString(input)).join(', '); /* <- TODO: [🧠] What is the best format comma list, bullet list,...? */
|
13239
13336
|
const normalizeTo_SCREAMING_CASE$1 = normalizeTo_SCREAMING_CASE;
|
13240
|
-
preserve(capitalize$1);
|
13241
|
-
preserve(decapitalize$1);
|
13242
|
-
preserve(nameToUriPart$1);
|
13243
|
-
preserve(nameToUriParts$1);
|
13244
|
-
preserve(removeDiacritics$1);
|
13245
|
-
preserve(normalizeWhitespaces$1);
|
13246
|
-
preserve(normalizeToKebabCase$1);
|
13247
|
-
preserve(normalizeTo_camelCase$1);
|
13248
|
-
preserve(normalizeTo_snake_case$1);
|
13249
|
-
preserve(normalizeTo_PascalCase$1);
|
13250
|
-
preserve(parseKeywords);
|
13251
|
-
preserve(normalizeTo_SCREAMING_CASE$1);
|
13337
|
+
$preserve(capitalize$1);
|
13338
|
+
$preserve(decapitalize$1);
|
13339
|
+
$preserve(nameToUriPart$1);
|
13340
|
+
$preserve(nameToUriParts$1);
|
13341
|
+
$preserve(removeDiacritics$1);
|
13342
|
+
$preserve(normalizeWhitespaces$1);
|
13343
|
+
$preserve(normalizeToKebabCase$1);
|
13344
|
+
$preserve(normalizeTo_camelCase$1);
|
13345
|
+
$preserve(normalizeTo_snake_case$1);
|
13346
|
+
$preserve(normalizeTo_PascalCase$1);
|
13347
|
+
$preserve(parseKeywords);
|
13348
|
+
$preserve(normalizeTo_SCREAMING_CASE$1);
|
13252
13349
|
//-------[/n12]---
|
13253
13350
|
if (!script.includes('return')) {
|
13254
13351
|
script = `return ${script}`;
|
@@ -17297,7 +17394,7 @@ class Wizard {
|
|
17297
17394
|
// ▶ Create executor - the function that will execute the Pipeline
|
17298
17395
|
const pipelineExecutor = createPipelineExecutor({ pipeline, tools });
|
17299
17396
|
// 🚀▶ Execute the Pipeline
|
17300
|
-
const result = await pipelineExecutor(inputParameters).asPromise();
|
17397
|
+
const result = await pipelineExecutor(inputParameters).asPromise({ isCrashedOnError: true });
|
17301
17398
|
const { outputParameters } = result;
|
17302
17399
|
const outputParametersLength = Object.keys(outputParameters).length;
|
17303
17400
|
let resultString;
|