@promptbook/markdown-utils 0.88.0 → 0.89.0-2
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/README.md +4 -0
- package/esm/index.es.js +116 -83
- package/esm/index.es.js.map +1 -1
- package/esm/typings/src/_packages/core.index.d.ts +6 -2
- package/esm/typings/src/_packages/types.index.d.ts +16 -4
- package/esm/typings/src/cli/cli-commands/login.d.ts +15 -0
- package/esm/typings/src/execution/PipelineExecutorResult.d.ts +2 -2
- package/esm/typings/src/execution/PromptResult.d.ts +2 -2
- package/esm/typings/src/execution/{PromptResultUsage.d.ts → Usage.d.ts} +5 -5
- package/esm/typings/src/execution/utils/addUsage.d.ts +2 -2
- package/esm/typings/src/execution/utils/computeUsageCounts.d.ts +3 -3
- package/esm/typings/src/execution/utils/usage-constants.d.ts +77 -60
- package/esm/typings/src/execution/utils/usageToHuman.d.ts +5 -5
- package/esm/typings/src/execution/utils/usageToWorktime.d.ts +5 -5
- package/esm/typings/src/llm-providers/_common/utils/count-total-usage/LlmExecutionToolsWithTotalUsage.d.ts +9 -2
- package/esm/typings/src/llm-providers/_common/utils/count-total-usage/{countTotalUsage.d.ts → countUsage.d.ts} +1 -1
- package/esm/typings/src/llm-providers/_common/utils/count-total-usage/limitTotalUsage.d.ts +2 -2
- package/esm/typings/src/llm-providers/anthropic-claude/computeAnthropicClaudeUsage.d.ts +2 -2
- package/esm/typings/src/llm-providers/openai/OpenAiExecutionTools.d.ts +0 -9
- package/esm/typings/src/llm-providers/openai/computeOpenAiUsage.d.ts +2 -2
- package/esm/typings/src/pipeline/PipelineJson/PreparationJson.d.ts +2 -2
- package/esm/typings/src/playground/BrjappConnector.d.ts +67 -0
- package/esm/typings/src/playground/brjapp-api-schema.d.ts +12879 -0
- package/esm/typings/src/playground/playground.d.ts +5 -0
- package/esm/typings/src/remote-server/socket-types/_subtypes/PromptbookServer_Identification.d.ts +2 -1
- package/esm/typings/src/remote-server/types/RemoteServerOptions.d.ts +15 -3
- package/esm/typings/src/types/typeAliases.d.ts +8 -2
- package/package.json +1 -1
- package/umd/index.umd.js +116 -83
- package/umd/index.umd.js.map +1 -1
package/esm/typings/src/remote-server/socket-types/_subtypes/PromptbookServer_Identification.d.ts
CHANGED
|
@@ -37,7 +37,8 @@ export type PromptbookServer_AnonymousIdentification = {
|
|
|
37
37
|
/**
|
|
38
38
|
* Identifier of the end user
|
|
39
39
|
*
|
|
40
|
-
* Note:
|
|
40
|
+
* Note: This can be either some id or email or any other identifier
|
|
41
|
+
* Note: In anonymous mode, this is passed to the certain model providers to identify misuse
|
|
41
42
|
* Note: In anonymous mode, there is no need to identify yourself, nor does it change the actual configuration of LLM Tools (unlike in application mode)
|
|
42
43
|
*/
|
|
43
44
|
readonly userId?: string_user_id;
|
|
@@ -58,15 +58,27 @@ export type ApplicationRemoteServerOptions<TCustomOptions> = {
|
|
|
58
58
|
};
|
|
59
59
|
export type ApplicationRemoteServerClientOptions<TCustomOptions> = {
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* Identifier of the application
|
|
62
|
+
*
|
|
63
|
+
* Note: This is usefull when you use Promptbook remote server for multiple apps/frontends, if its used just for single app, use here just "app" or "your-app-name"
|
|
64
|
+
* Note: This can be some id or some semantic name like "email-agent"
|
|
62
65
|
*/
|
|
63
66
|
readonly appId: string_app_id | null;
|
|
64
67
|
/**
|
|
65
|
-
*
|
|
68
|
+
* Identifier of the end user
|
|
69
|
+
*
|
|
70
|
+
* Note: This can be either some id or email or any other identifier
|
|
71
|
+
* Note: This is also passed to the certain model providers to identify misuse
|
|
66
72
|
*/
|
|
67
73
|
readonly userId?: string_user_id;
|
|
68
74
|
/**
|
|
69
|
-
*
|
|
75
|
+
* Token of the user to verify its identity
|
|
76
|
+
*
|
|
77
|
+
* Note: This is passed for example to `createLlmExecutionTools`
|
|
78
|
+
*/
|
|
79
|
+
readonly userToken?: string_user_id;
|
|
80
|
+
/**
|
|
81
|
+
* Additional arbitrary options to identify the client or to pass custom metadata
|
|
70
82
|
*/
|
|
71
83
|
readonly customOptions?: TCustomOptions;
|
|
72
84
|
};
|
|
@@ -242,6 +242,12 @@ export type string_promptbook_documentation_url = `https://github.com/webgptorg/
|
|
|
242
242
|
* For example `"towns.cz"`
|
|
243
243
|
*/
|
|
244
244
|
export type string_domain = string;
|
|
245
|
+
/**
|
|
246
|
+
* Semantic helper
|
|
247
|
+
*
|
|
248
|
+
* For example `"https://*.pavolhejny.com/*"`
|
|
249
|
+
*/
|
|
250
|
+
export type string_origin = string;
|
|
245
251
|
/**
|
|
246
252
|
* Semantic helper
|
|
247
253
|
*
|
|
@@ -433,13 +439,13 @@ export type string_uuid = string & {
|
|
|
433
439
|
*
|
|
434
440
|
* @@@
|
|
435
441
|
*/
|
|
436
|
-
export type string_app_id = id;
|
|
442
|
+
export type string_app_id = id | 'app';
|
|
437
443
|
/**
|
|
438
444
|
* End user identifier
|
|
439
445
|
*
|
|
440
446
|
* @@@
|
|
441
447
|
*/
|
|
442
|
-
export type string_user_id = id;
|
|
448
|
+
export type string_user_id = id | string_email;
|
|
443
449
|
/**
|
|
444
450
|
* Semantic helper
|
|
445
451
|
*
|
package/package.json
CHANGED
package/umd/index.umd.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* @generated
|
|
26
26
|
* @see https://github.com/webgptorg/promptbook
|
|
27
27
|
*/
|
|
28
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.
|
|
28
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.89.0-2';
|
|
29
29
|
/**
|
|
30
30
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
|
31
31
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
@@ -1996,6 +1996,7 @@
|
|
|
1996
1996
|
const { isSuccessful, errors, warnings } = executionResult;
|
|
1997
1997
|
for (const warning of warnings) {
|
|
1998
1998
|
console.warn(warning.message);
|
|
1999
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
1999
2000
|
}
|
|
2000
2001
|
if (isSuccessful === true) {
|
|
2001
2002
|
return;
|
|
@@ -2174,30 +2175,42 @@
|
|
|
2174
2175
|
await Promise.all(tasks);
|
|
2175
2176
|
}
|
|
2176
2177
|
|
|
2178
|
+
/**
|
|
2179
|
+
* Represents the uncertain value
|
|
2180
|
+
*
|
|
2181
|
+
* @public exported from `@promptbook/core`
|
|
2182
|
+
*/
|
|
2183
|
+
const ZERO_VALUE = $deepFreeze({ value: 0 });
|
|
2184
|
+
/**
|
|
2185
|
+
* Represents the uncertain value
|
|
2186
|
+
*
|
|
2187
|
+
* @public exported from `@promptbook/core`
|
|
2188
|
+
*/
|
|
2189
|
+
const UNCERTAIN_ZERO_VALUE = $deepFreeze({ value: 0, isUncertain: true });
|
|
2177
2190
|
/**
|
|
2178
2191
|
* Represents the usage with no resources consumed
|
|
2179
2192
|
*
|
|
2180
2193
|
* @public exported from `@promptbook/core`
|
|
2181
2194
|
*/
|
|
2182
2195
|
const ZERO_USAGE = $deepFreeze({
|
|
2183
|
-
price:
|
|
2196
|
+
price: ZERO_VALUE,
|
|
2184
2197
|
input: {
|
|
2185
|
-
tokensCount:
|
|
2186
|
-
charactersCount:
|
|
2187
|
-
wordsCount:
|
|
2188
|
-
sentencesCount:
|
|
2189
|
-
linesCount:
|
|
2190
|
-
paragraphsCount:
|
|
2191
|
-
pagesCount:
|
|
2198
|
+
tokensCount: ZERO_VALUE,
|
|
2199
|
+
charactersCount: ZERO_VALUE,
|
|
2200
|
+
wordsCount: ZERO_VALUE,
|
|
2201
|
+
sentencesCount: ZERO_VALUE,
|
|
2202
|
+
linesCount: ZERO_VALUE,
|
|
2203
|
+
paragraphsCount: ZERO_VALUE,
|
|
2204
|
+
pagesCount: ZERO_VALUE,
|
|
2192
2205
|
},
|
|
2193
2206
|
output: {
|
|
2194
|
-
tokensCount:
|
|
2195
|
-
charactersCount:
|
|
2196
|
-
wordsCount:
|
|
2197
|
-
sentencesCount:
|
|
2198
|
-
linesCount:
|
|
2199
|
-
paragraphsCount:
|
|
2200
|
-
pagesCount:
|
|
2207
|
+
tokensCount: ZERO_VALUE,
|
|
2208
|
+
charactersCount: ZERO_VALUE,
|
|
2209
|
+
wordsCount: ZERO_VALUE,
|
|
2210
|
+
sentencesCount: ZERO_VALUE,
|
|
2211
|
+
linesCount: ZERO_VALUE,
|
|
2212
|
+
paragraphsCount: ZERO_VALUE,
|
|
2213
|
+
pagesCount: ZERO_VALUE,
|
|
2201
2214
|
},
|
|
2202
2215
|
});
|
|
2203
2216
|
/**
|
|
@@ -2206,24 +2219,24 @@
|
|
|
2206
2219
|
* @public exported from `@promptbook/core`
|
|
2207
2220
|
*/
|
|
2208
2221
|
$deepFreeze({
|
|
2209
|
-
price:
|
|
2222
|
+
price: UNCERTAIN_ZERO_VALUE,
|
|
2210
2223
|
input: {
|
|
2211
|
-
tokensCount:
|
|
2212
|
-
charactersCount:
|
|
2213
|
-
wordsCount:
|
|
2214
|
-
sentencesCount:
|
|
2215
|
-
linesCount:
|
|
2216
|
-
paragraphsCount:
|
|
2217
|
-
pagesCount:
|
|
2224
|
+
tokensCount: UNCERTAIN_ZERO_VALUE,
|
|
2225
|
+
charactersCount: UNCERTAIN_ZERO_VALUE,
|
|
2226
|
+
wordsCount: UNCERTAIN_ZERO_VALUE,
|
|
2227
|
+
sentencesCount: UNCERTAIN_ZERO_VALUE,
|
|
2228
|
+
linesCount: UNCERTAIN_ZERO_VALUE,
|
|
2229
|
+
paragraphsCount: UNCERTAIN_ZERO_VALUE,
|
|
2230
|
+
pagesCount: UNCERTAIN_ZERO_VALUE,
|
|
2218
2231
|
},
|
|
2219
2232
|
output: {
|
|
2220
|
-
tokensCount:
|
|
2221
|
-
charactersCount:
|
|
2222
|
-
wordsCount:
|
|
2223
|
-
sentencesCount:
|
|
2224
|
-
linesCount:
|
|
2225
|
-
paragraphsCount:
|
|
2226
|
-
pagesCount:
|
|
2233
|
+
tokensCount: UNCERTAIN_ZERO_VALUE,
|
|
2234
|
+
charactersCount: UNCERTAIN_ZERO_VALUE,
|
|
2235
|
+
wordsCount: UNCERTAIN_ZERO_VALUE,
|
|
2236
|
+
sentencesCount: UNCERTAIN_ZERO_VALUE,
|
|
2237
|
+
linesCount: UNCERTAIN_ZERO_VALUE,
|
|
2238
|
+
paragraphsCount: UNCERTAIN_ZERO_VALUE,
|
|
2239
|
+
pagesCount: UNCERTAIN_ZERO_VALUE,
|
|
2227
2240
|
},
|
|
2228
2241
|
});
|
|
2229
2242
|
/**
|
|
@@ -2284,8 +2297,9 @@
|
|
|
2284
2297
|
* @returns LLM tools with same functionality with added total cost counting
|
|
2285
2298
|
* @public exported from `@promptbook/core`
|
|
2286
2299
|
*/
|
|
2287
|
-
function
|
|
2300
|
+
function countUsage(llmTools) {
|
|
2288
2301
|
let totalUsage = ZERO_USAGE;
|
|
2302
|
+
const spending = new rxjs.Subject();
|
|
2289
2303
|
const proxyTools = {
|
|
2290
2304
|
get title() {
|
|
2291
2305
|
// TODO: [🧠] Maybe put here some suffix
|
|
@@ -2295,12 +2309,15 @@
|
|
|
2295
2309
|
// TODO: [🧠] Maybe put here some suffix
|
|
2296
2310
|
return llmTools.description;
|
|
2297
2311
|
},
|
|
2298
|
-
|
|
2312
|
+
checkConfiguration() {
|
|
2299
2313
|
return /* not await */ llmTools.checkConfiguration();
|
|
2300
2314
|
},
|
|
2301
2315
|
listModels() {
|
|
2302
2316
|
return /* not await */ llmTools.listModels();
|
|
2303
2317
|
},
|
|
2318
|
+
spending() {
|
|
2319
|
+
return spending.asObservable();
|
|
2320
|
+
},
|
|
2304
2321
|
getTotalUsage() {
|
|
2305
2322
|
// <- Note: [🥫] Not using getter `get totalUsage` but `getTotalUsage` to allow this object to be proxied
|
|
2306
2323
|
return totalUsage;
|
|
@@ -2311,6 +2328,7 @@
|
|
|
2311
2328
|
// console.info('[🚕] callChatModel through countTotalUsage');
|
|
2312
2329
|
const promptResult = await llmTools.callChatModel(prompt);
|
|
2313
2330
|
totalUsage = addUsage(totalUsage, promptResult.usage);
|
|
2331
|
+
spending.next(promptResult.usage);
|
|
2314
2332
|
return promptResult;
|
|
2315
2333
|
};
|
|
2316
2334
|
}
|
|
@@ -2319,6 +2337,7 @@
|
|
|
2319
2337
|
// console.info('[🚕] callCompletionModel through countTotalUsage');
|
|
2320
2338
|
const promptResult = await llmTools.callCompletionModel(prompt);
|
|
2321
2339
|
totalUsage = addUsage(totalUsage, promptResult.usage);
|
|
2340
|
+
spending.next(promptResult.usage);
|
|
2322
2341
|
return promptResult;
|
|
2323
2342
|
};
|
|
2324
2343
|
}
|
|
@@ -2327,6 +2346,7 @@
|
|
|
2327
2346
|
// console.info('[🚕] callEmbeddingModel through countTotalUsage');
|
|
2328
2347
|
const promptResult = await llmTools.callEmbeddingModel(prompt);
|
|
2329
2348
|
totalUsage = addUsage(totalUsage, promptResult.usage);
|
|
2349
|
+
spending.next(promptResult.usage);
|
|
2330
2350
|
return promptResult;
|
|
2331
2351
|
};
|
|
2332
2352
|
}
|
|
@@ -2504,6 +2524,7 @@
|
|
|
2504
2524
|
`);
|
|
2505
2525
|
// TODO: [🟥] Detect browser / node and make it colorfull
|
|
2506
2526
|
console.warn(warningMessage);
|
|
2527
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
2507
2528
|
/*
|
|
2508
2529
|
return {
|
|
2509
2530
|
async listModels() {
|
|
@@ -3447,63 +3468,73 @@
|
|
|
3447
3468
|
const { maxParallelCount = DEFAULT_MAX_PARALLEL_COUNT, rootDirname, isVerbose = DEFAULT_IS_VERBOSE } = options;
|
|
3448
3469
|
const knowledgePreparedUnflatten = new Array(knowledgeSources.length);
|
|
3449
3470
|
await forEachAsync(knowledgeSources, { maxParallelCount }, async (knowledgeSource, index) => {
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3471
|
+
try {
|
|
3472
|
+
let partialPieces = null;
|
|
3473
|
+
const sourceHandler = await makeKnowledgeSourceHandler(knowledgeSource, tools, { rootDirname, isVerbose });
|
|
3474
|
+
const scrapers = arrayableToArray(tools.scrapers);
|
|
3475
|
+
for (const scraper of scrapers) {
|
|
3476
|
+
if (!scraper.metadata.mimeTypes.includes(sourceHandler.mimeType)
|
|
3477
|
+
// <- TODO: [🦔] Implement mime-type wildcards
|
|
3478
|
+
) {
|
|
3479
|
+
continue;
|
|
3480
|
+
}
|
|
3481
|
+
const partialPiecesUnchecked = await scraper.scrape(sourceHandler);
|
|
3482
|
+
if (partialPiecesUnchecked !== null) {
|
|
3483
|
+
partialPieces = [...partialPiecesUnchecked];
|
|
3484
|
+
// <- TODO: [🪓] Here should be no need for spreading new array, just `partialPieces = partialPiecesUnchecked`
|
|
3485
|
+
break;
|
|
3486
|
+
}
|
|
3487
|
+
console.warn(spaceTrim__default["default"]((block) => `
|
|
3488
|
+
Cannot scrape knowledge from source despite the scraper \`${scraper.metadata.className}\` supports the mime type "${sourceHandler.mimeType}".
|
|
3467
3489
|
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3490
|
+
The source:
|
|
3491
|
+
${block(knowledgeSource.knowledgeSourceContent
|
|
3492
|
+
.split('\n')
|
|
3493
|
+
.map((line) => `> ${line}`)
|
|
3494
|
+
.join('\n'))}
|
|
3473
3495
|
|
|
3474
|
-
|
|
3496
|
+
${block($registeredScrapersMessage(scrapers))}
|
|
3475
3497
|
|
|
3476
3498
|
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3499
|
+
`));
|
|
3500
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
3501
|
+
}
|
|
3502
|
+
if (partialPieces === null) {
|
|
3503
|
+
throw new KnowledgeScrapeError(spaceTrim__default["default"]((block) => `
|
|
3504
|
+
Cannot scrape knowledge
|
|
3482
3505
|
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3506
|
+
The source:
|
|
3507
|
+
> ${block(knowledgeSource.knowledgeSourceContent
|
|
3508
|
+
.split('\n')
|
|
3509
|
+
.map((line) => `> ${line}`)
|
|
3510
|
+
.join('\n'))}
|
|
3488
3511
|
|
|
3489
|
-
|
|
3512
|
+
No scraper found for the mime type "${sourceHandler.mimeType}"
|
|
3490
3513
|
|
|
3491
|
-
|
|
3514
|
+
${block($registeredScrapersMessage(scrapers))}
|
|
3492
3515
|
|
|
3493
3516
|
|
|
3494
|
-
|
|
3517
|
+
`));
|
|
3518
|
+
}
|
|
3519
|
+
const pieces = partialPieces.map((partialPiece) => ({
|
|
3520
|
+
...partialPiece,
|
|
3521
|
+
sources: [
|
|
3522
|
+
{
|
|
3523
|
+
name: knowledgeSource.name,
|
|
3524
|
+
// line, column <- TODO: [☀]
|
|
3525
|
+
// <- TODO: [❎]
|
|
3526
|
+
},
|
|
3527
|
+
],
|
|
3528
|
+
}));
|
|
3529
|
+
knowledgePreparedUnflatten[index] = pieces;
|
|
3530
|
+
}
|
|
3531
|
+
catch (error) {
|
|
3532
|
+
if (!(error instanceof Error)) {
|
|
3533
|
+
throw error;
|
|
3534
|
+
}
|
|
3535
|
+
console.warn(error);
|
|
3536
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
3495
3537
|
}
|
|
3496
|
-
const pieces = partialPieces.map((partialPiece) => ({
|
|
3497
|
-
...partialPiece,
|
|
3498
|
-
sources: [
|
|
3499
|
-
{
|
|
3500
|
-
name: knowledgeSource.name,
|
|
3501
|
-
// line, column <- TODO: [☀]
|
|
3502
|
-
// <- TODO: [❎]
|
|
3503
|
-
},
|
|
3504
|
-
],
|
|
3505
|
-
}));
|
|
3506
|
-
knowledgePreparedUnflatten[index] = pieces;
|
|
3507
3538
|
});
|
|
3508
3539
|
const knowledgePrepared = knowledgePreparedUnflatten.flat();
|
|
3509
3540
|
return knowledgePrepared;
|
|
@@ -3609,7 +3640,7 @@
|
|
|
3609
3640
|
// TODO: [🚐] Make arrayable LLMs -> single LLM DRY
|
|
3610
3641
|
const _llms = arrayableToArray(tools.llm);
|
|
3611
3642
|
const llmTools = _llms.length === 1 ? _llms[0] : joinLlmExecutionTools(..._llms);
|
|
3612
|
-
const llmToolsWithUsage =
|
|
3643
|
+
const llmToolsWithUsage = countUsage(llmTools);
|
|
3613
3644
|
// <- TODO: [🌯]
|
|
3614
3645
|
/*
|
|
3615
3646
|
TODO: [🧠][🪑][🔃] Should this be done or not
|
|
@@ -3921,7 +3952,7 @@
|
|
|
3921
3952
|
if (parameterNames.has(subparameterName)) {
|
|
3922
3953
|
parameterNames.delete(subparameterName);
|
|
3923
3954
|
parameterNames.add(foreach.parameterName);
|
|
3924
|
-
// <- TODO: [
|
|
3955
|
+
// <- TODO: [🏮] Warn/logic error when `subparameterName` not used
|
|
3925
3956
|
}
|
|
3926
3957
|
}
|
|
3927
3958
|
}
|
|
@@ -5415,6 +5446,7 @@
|
|
|
5415
5446
|
|
|
5416
5447
|
@see more at https://ptbk.io/prepare-pipeline
|
|
5417
5448
|
`));
|
|
5449
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
5418
5450
|
}
|
|
5419
5451
|
let runCount = 0;
|
|
5420
5452
|
const pipelineExecutorWithCallback = async (inputParameters, onProgress) => {
|
|
@@ -5689,7 +5721,8 @@
|
|
|
5689
5721
|
`));
|
|
5690
5722
|
}
|
|
5691
5723
|
console.warn(`No place where to put the section <!--${sectionName}-->, using the end of the file`);
|
|
5692
|
-
// <- TODO: [
|
|
5724
|
+
// <- TODO: [🏮] Some standard way how to transform errors into warnings and how to handle non-critical fails during the tasks
|
|
5725
|
+
// <- TODO: [🏮] Some better way how to get warnings from pipeline parsing / logic
|
|
5693
5726
|
return spaceTrim.spaceTrim((block) => `
|
|
5694
5727
|
${block(content)}
|
|
5695
5728
|
|