@promptbook/remote-server 0.112.0-114 → 0.112.0-117

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ import type { BookEditorUploadProgressCallback } from '../book-components/BookEd
12
12
  import type { BookEditorUploadOptions } from '../book-components/BookEditor/BookEditor';
13
13
  import type { BookEditorProps } from '../book-components/BookEditor/BookEditor';
14
14
  import { BookEditor } from '../book-components/BookEditor/BookEditor';
15
+ import { BookEditorForClient } from '../book-components/BookEditor/BookEditorForClient';
15
16
  import { AgentChat } from '../book-components/Chat/AgentChat/AgentChat';
16
17
  import type { AgentChatProps } from '../book-components/Chat/AgentChat/AgentChatProps';
17
18
  import { Chat } from '../book-components/Chat/Chat/Chat';
@@ -95,6 +96,7 @@ export type { BookEditorUploadProgressCallback };
95
96
  export type { BookEditorUploadOptions };
96
97
  export type { BookEditorProps };
97
98
  export { BookEditor };
99
+ export { BookEditorForClient };
98
100
  export { AgentChat };
99
101
  export type { AgentChatProps };
100
102
  export { Chat };
@@ -1,4 +1,9 @@
1
1
  import { BOOK_LANGUAGE_VERSION, PROMPTBOOK_ENGINE_VERSION } from '../version';
2
+ import { AGENT_BOOK_FILE_PATH } from '../book-3.0/agentFolderPaths';
3
+ import { AGENT_MESSAGES_DIRECTORY_PATH } from '../book-3.0/agentFolderPaths';
4
+ import { AGENT_QUEUED_MESSAGES_DIRECTORY_PATH } from '../book-3.0/agentFolderPaths';
5
+ import { AGENT_FINISHED_MESSAGES_DIRECTORY_PATH } from '../book-3.0/agentFolderPaths';
6
+ import { AGENT_FAILED_MESSAGES_DIRECTORY_PATH } from '../book-3.0/agentFolderPaths';
2
7
  import type { BookNodeAgentSource } from '../book-3.0/BookNodeAgentSource';
3
8
  import type { BookNodeAgentSourceOptions } from '../book-3.0/BookNodeAgentSource';
4
9
  import type { CliAgentHarness } from '../book-3.0/CliAgent';
@@ -22,6 +27,11 @@ import { FileCacheStorage } from '../storage/file-cache-storage/FileCacheStorage
22
27
  import { $execCommand } from '../utils/execCommand/$execCommand';
23
28
  import { $execCommands } from '../utils/execCommand/$execCommands';
24
29
  export { BOOK_LANGUAGE_VERSION, PROMPTBOOK_ENGINE_VERSION };
30
+ export { AGENT_BOOK_FILE_PATH };
31
+ export { AGENT_MESSAGES_DIRECTORY_PATH };
32
+ export { AGENT_QUEUED_MESSAGES_DIRECTORY_PATH };
33
+ export { AGENT_FINISHED_MESSAGES_DIRECTORY_PATH };
34
+ export { AGENT_FAILED_MESSAGES_DIRECTORY_PATH };
25
35
  export type { BookNodeAgentSource };
26
36
  export type { BookNodeAgentSourceOptions };
27
37
  export type { CliAgentHarness };
@@ -31,19 +31,12 @@ export type CliAgentRunOptions = {
31
31
  *
32
32
  * @public exported from `@promptbook/node`
33
33
  */
34
- export type CliAgentOptions = BookNodeAgentSourceOptions & CliAgentRunOptions & {
35
- /**
36
- * Executable used for the wrapper command.
37
- *
38
- * @default ptbk
39
- */
40
- readonly command?: string;
41
- };
34
+ export type CliAgentOptions = BookNodeAgentSourceOptions & CliAgentRunOptions;
42
35
  /**
43
- * Lightweight JavaScript wrapper around `ptbk agent exec`.
36
+ * Lightweight JavaScript wrapper around the Promptbook agent execution pipeline.
44
37
  *
45
- * It uses the same CLI harnesses as Promptbook's agent command, making it the most faithful
46
- * way to run a local Book agent from Node.js when you want the CLI execution flow.
38
+ * It uses the same harnesses and execution path as `ptbk agent exec`, running the runner
39
+ * in-process instead of spawning a separate CLI process.
47
40
  *
48
41
  * @public exported from `@promptbook/node`
49
42
  */
@@ -52,15 +45,15 @@ export declare class CliAgent {
52
45
  private temporaryAgentPath;
53
46
  constructor(options: CliAgentOptions);
54
47
  /**
55
- * Runs one non-interactive agent turn through `ptbk agent exec`.
48
+ * Runs one non-interactive agent turn through the selected harness.
56
49
  *
57
50
  * @param message - User message sent to the agent.
58
- * @param options - Optional per-run CLI overrides.
59
- * @returns Raw stdout emitted by the CLI command.
51
+ * @param options - Optional per-run overrides.
52
+ * @returns Final agent answer.
60
53
  */
61
54
  run(message: string, options?: CliAgentRunOptions): Promise<string>;
62
55
  /**
63
- * Resolves the agent path passed to the CLI, materializing one temporary `.book` file when needed.
56
+ * Resolves the agent path passed to the runner, materializing one temporary `.book` file when needed.
64
57
  *
65
58
  * @private internal utility of `CliAgent`
66
59
  */
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Relative path to the local agent source used by the agent folder convention.
3
+ *
4
+ * @public exported from `@promptbook/node`
5
+ */
6
+ export declare const AGENT_BOOK_FILE_PATH = "agent.book";
7
+ /**
8
+ * Relative path to the message queue root used by the agent folder convention.
9
+ *
10
+ * @public exported from `@promptbook/node`
11
+ */
12
+ export declare const AGENT_MESSAGES_DIRECTORY_PATH = "messages";
13
+ /**
14
+ * Relative path to queued user messages consumed by the agent runner.
15
+ *
16
+ * @public exported from `@promptbook/node`
17
+ */
18
+ export declare const AGENT_QUEUED_MESSAGES_DIRECTORY_PATH: string;
19
+ /**
20
+ * Relative path to answered messages written by the agent runner.
21
+ *
22
+ * @public exported from `@promptbook/node`
23
+ */
24
+ export declare const AGENT_FINISHED_MESSAGES_DIRECTORY_PATH: string;
25
+ /**
26
+ * Relative path to messages that the agent runner stopped retrying.
27
+ *
28
+ * @public exported from `@promptbook/node`
29
+ */
30
+ export declare const AGENT_FAILED_MESSAGES_DIRECTORY_PATH: string;
@@ -0,0 +1,2 @@
1
+ export { NAME, CLAIM, PROMPTBOOK_LEGAL_ENTITY, IS_COST_PREVENTED, DEFAULT_IS_VERBOSE, DEFAULT_MAX_CONCURRENT_UPLOADS, PROMPTBOOK_SYNTAX_COLORS, } from '../../config';
2
+ export { PUBLIC_AGENTS_SERVERS } from '../../../servers';
@@ -0,0 +1,7 @@
1
+ import { BookEditorProps } from './BookEditor';
2
+ /**
3
+ * Renders a book editor
4
+ *
5
+ * @public exported from `@promptbook/components`
6
+ */
7
+ export declare function BookEditorForClient(props: BookEditorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Browser-compatible stub for `createDeprecatedCommitmentDiagnostics`.
3
+ *
4
+ * In the browser build the full Node.js implementation is not available,
5
+ * so this stub always returns an empty array to keep the editor functional.
6
+ *
7
+ * @private internal utility of `BookEditorMonaco`
8
+ */
9
+ export declare function createDeprecatedCommitmentDiagnostics(_agentSource?: string): [];
@@ -1,39 +1,11 @@
1
- /**
2
- * Relative path to the local agent source initialized by `ptbk agent-folder init`.
3
- *
4
- * @private internal utility of `ptbk agent-folder`
5
- */
6
- export declare const AGENT_BOOK_FILE_PATH = "agent.book";
1
+ import { AGENT_BOOK_FILE_PATH, AGENT_FAILED_MESSAGES_DIRECTORY_PATH, AGENT_FINISHED_MESSAGES_DIRECTORY_PATH, AGENT_MESSAGES_DIRECTORY_PATH, AGENT_QUEUED_MESSAGES_DIRECTORY_PATH } from '../../../book-3.0/agentFolderPaths';
2
+ export { AGENT_BOOK_FILE_PATH, AGENT_FAILED_MESSAGES_DIRECTORY_PATH, AGENT_FINISHED_MESSAGES_DIRECTORY_PATH, AGENT_MESSAGES_DIRECTORY_PATH, AGENT_QUEUED_MESSAGES_DIRECTORY_PATH, };
7
3
  /**
8
4
  * Relative path to local knowledge files initialized by `ptbk agent-folder init`.
9
5
  *
10
6
  * @private internal utility of `ptbk agent-folder`
11
7
  */
12
8
  export declare const AGENT_KNOWLEDGE_DIRECTORY_PATH = "knowledge";
13
- /**
14
- * Relative path to the message queue root initialized by `ptbk agent-folder init`.
15
- *
16
- * @private internal utility of `ptbk agent-folder`
17
- */
18
- export declare const AGENT_MESSAGES_DIRECTORY_PATH = "messages";
19
- /**
20
- * Relative path to queued user messages consumed by `ptbk agent-folder run-once`.
21
- *
22
- * @private internal utility of `ptbk agent-folder`
23
- */
24
- export declare const AGENT_QUEUED_MESSAGES_DIRECTORY_PATH: string;
25
- /**
26
- * Relative path to answered messages written by `ptbk agent-folder run-once`.
27
- *
28
- * @private internal utility of `ptbk agent-folder`
29
- */
30
- export declare const AGENT_FINISHED_MESSAGES_DIRECTORY_PATH: string;
31
- /**
32
- * Relative path to messages that the agent runner stopped retrying.
33
- *
34
- * @private internal utility of `ptbk agent-folder`
35
- */
36
- export declare const AGENT_FAILED_MESSAGES_DIRECTORY_PATH: string;
37
9
  /**
38
10
  * Relative path to generated local agent documentation initialized by `ptbk agent-folder init`.
39
11
  *
@@ -1,7 +1,7 @@
1
- import { Converter as ShowdownConverter } from 'showdown';
1
+ import showdown from 'showdown';
2
2
  /**
3
3
  * Create a new showdown converter instance
4
4
  *
5
5
  * @private utility of `WebsiteScraper`
6
6
  */
7
- export declare function createShowdownConverter(): ShowdownConverter;
7
+ export declare function createShowdownConverter(): showdown.Converter;
@@ -15,7 +15,7 @@ export declare const BOOK_LANGUAGE_VERSION: string_semantic_version;
15
15
  export declare const PROMPTBOOK_ENGINE_VERSION: string_promptbook_version;
16
16
  /**
17
17
  * Represents the version string of the Promptbook engine.
18
- * It follows semantic versioning (e.g., `0.112.0-113`).
18
+ * It follows semantic versioning (e.g., `0.112.0-116`).
19
19
  *
20
20
  * @generated
21
21
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptbook/remote-server",
3
- "version": "0.112.0-114",
3
+ "version": "0.112.0-117",
4
4
  "description": "Promptbook: Create persistent AI agents that turn your company's scattered knowledge into action",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -99,14 +99,13 @@
99
99
  "types": "./esm/src/_packages/remote-server.index.d.ts",
100
100
  "typings": "./esm/src/_packages/remote-server.index.d.ts",
101
101
  "peerDependencies": {
102
- "@promptbook/core": "0.112.0-114"
102
+ "@promptbook/core": "0.112.0-117"
103
103
  },
104
104
  "dependencies": {
105
105
  "@mozilla/readability": "0.6.0",
106
106
  "@openai/agents": "0.4.15",
107
107
  "bottleneck": "2.19.5",
108
108
  "colors": "1.4.0",
109
- "crypto": "1.0.1",
110
109
  "crypto-js": "4.2.0",
111
110
  "express": "4.21.2",
112
111
  "express-openapi-validator": "5.4.9",
package/umd/index.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('path'), require('child_process'), require('colors'), require('spacetrim'), require('waitasecond'), require('http'), require('express'), require('socket.io'), require('fs/promises'), require('@mozilla/readability'), require('jsdom'), require('crypto-js'), require('crypto-js/enc-hex'), require('showdown'), require('express-openapi-validator'), require('swagger-ui-express'), require('react'), require('react-dom/server'), require('rxjs'), require('crypto'), require('moment'), require('mime-types'), require('crypto-js/sha256'), require('papaparse'), require('@openai/agents'), require('bottleneck'), require('openai')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'path', 'child_process', 'colors', 'spacetrim', 'waitasecond', 'http', 'express', 'socket.io', 'fs/promises', '@mozilla/readability', 'jsdom', 'crypto-js', 'crypto-js/enc-hex', 'showdown', 'express-openapi-validator', 'swagger-ui-express', 'react', 'react-dom/server', 'rxjs', 'crypto', 'moment', 'mime-types', 'crypto-js/sha256', 'papaparse', '@openai/agents', 'bottleneck', 'openai'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-remote-server"] = {}, global.path, global.child_process, global.colors, global._spaceTrim, global.waitasecond, global.http, global.express, global.socket_io, global.promises, global.readability, global.jsdom, global.cryptoJs, global.hexEncoder, global.showdown, global.OpenApiValidator, global.swaggerUi, global.react, global.server, global.rxjs, global.crypto, global.moment, global.mimeTypes, global.sha256, global.papaparse, global.agents, global.Bottleneck, global.OpenAI));
5
- })(this, (function (exports, path, child_process, colors, _spaceTrim, waitasecond, http, express, socket_io, promises, readability, jsdom, cryptoJs, hexEncoder, showdown, OpenApiValidator, swaggerUi, react, server, rxjs, crypto, moment, mimeTypes, sha256, papaparse, agents, Bottleneck, OpenAI) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('path'), require('child_process'), require('colors'), require('spacetrim'), require('waitasecond'), require('http'), require('express'), require('socket.io'), require('fs/promises'), require('@mozilla/readability'), require('jsdom'), require('crypto-js'), require('crypto-js/enc-hex'), require('showdown'), require('express-openapi-validator'), require('swagger-ui-express'), require('react'), require('react-dom/server'), require('rxjs'), require('moment'), require('mime-types'), require('crypto-js/sha256'), require('papaparse'), require('@openai/agents'), require('bottleneck'), require('openai')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'path', 'child_process', 'colors', 'spacetrim', 'waitasecond', 'http', 'express', 'socket.io', 'fs/promises', '@mozilla/readability', 'jsdom', 'crypto-js', 'crypto-js/enc-hex', 'showdown', 'express-openapi-validator', 'swagger-ui-express', 'react', 'react-dom/server', 'rxjs', 'moment', 'mime-types', 'crypto-js/sha256', 'papaparse', '@openai/agents', 'bottleneck', 'openai'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["promptbook-remote-server"] = {}, global.path, global.child_process, global.colors, global._spaceTrim, global.waitasecond, global.http, global.express, global.socket_io, global.promises, global.readability, global.jsdom, global.CryptoJS, global.hexEncoder, global.showdown, global.OpenApiValidator, global.swaggerUi, global.react, global.server, global.rxjs, global.moment, global.mimeTypes, global.sha256, global.papaparse, global.agents, global.Bottleneck, global.OpenAI));
5
+ })(this, (function (exports, path, child_process, colors, _spaceTrim, waitasecond, http, express, socket_io, promises, readability, jsdom, CryptoJS, hexEncoder, showdown, OpenApiValidator, swaggerUi, react, server, rxjs, moment, mimeTypes, sha256, papaparse, agents, Bottleneck, OpenAI) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -28,11 +28,14 @@
28
28
  var _spaceTrim__default = /*#__PURE__*/_interopDefaultLegacy(_spaceTrim);
29
29
  var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
30
30
  var express__default = /*#__PURE__*/_interopDefaultLegacy(express);
31
+ var CryptoJS__default = /*#__PURE__*/_interopDefaultLegacy(CryptoJS);
31
32
  var hexEncoder__default = /*#__PURE__*/_interopDefaultLegacy(hexEncoder);
33
+ var showdown__default = /*#__PURE__*/_interopDefaultLegacy(showdown);
32
34
  var OpenApiValidator__namespace = /*#__PURE__*/_interopNamespace(OpenApiValidator);
33
35
  var swaggerUi__default = /*#__PURE__*/_interopDefaultLegacy(swaggerUi);
34
36
  var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
35
37
  var sha256__default = /*#__PURE__*/_interopDefaultLegacy(sha256);
38
+ var papaparse__default = /*#__PURE__*/_interopDefaultLegacy(papaparse);
36
39
  var Bottleneck__default = /*#__PURE__*/_interopDefaultLegacy(Bottleneck);
37
40
  var OpenAI__default = /*#__PURE__*/_interopDefaultLegacy(OpenAI);
38
41
 
@@ -50,7 +53,7 @@
50
53
  * @generated
51
54
  * @see https://github.com/webgptorg/promptbook
52
55
  */
53
- const PROMPTBOOK_ENGINE_VERSION = '0.112.0-114';
56
+ const PROMPTBOOK_ENGINE_VERSION = '0.112.0-117';
54
57
  /**
55
58
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
56
59
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -1958,7 +1961,7 @@
1958
1961
  * @private internal helper function
1959
1962
  */
1960
1963
  function $randomToken(randomness) {
1961
- return crypto.randomBytes(randomness).toString('hex');
1964
+ return CryptoJS__default["default"].lib.WordArray.random(randomness).toString(CryptoJS__default["default"].enc.Hex);
1962
1965
  }
1963
1966
  // TODO: [🤶] Maybe export through `@promptbook/utils` or `@promptbook/random` package
1964
1967
  // TODO: Maybe use nanoid instead https://github.com/ai/nanoid
@@ -5502,7 +5505,7 @@
5502
5505
  * @public exported from `@promptbook/editable`
5503
5506
  */
5504
5507
  function knowledgeSourceContentToName(knowledgeSourceContent) {
5505
- const hash = cryptoJs.SHA256(hexEncoder__default["default"].parse(JSON.stringify(knowledgeSourceContent)))
5508
+ const hash = CryptoJS__default["default"].SHA256(hexEncoder__default["default"].parse(JSON.stringify(knowledgeSourceContent)))
5506
5509
  // <- TODO: [🥬] Encapsulate sha256 to some private utility function
5507
5510
  .toString( /* hex */)
5508
5511
  .substring(0, 20);
@@ -6496,7 +6499,7 @@
6496
6499
  console.warn('CSV string contains carriage return characters, but in the CSV settings the `newline` setting does not include them. Autohealing the CSV string.');
6497
6500
  value = value.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
6498
6501
  }
6499
- const csv = papaparse.parse(value, settings);
6502
+ const csv = papaparse__default["default"].parse(value, settings);
6500
6503
  return csv;
6501
6504
  }
6502
6505
 
@@ -6581,10 +6584,10 @@
6581
6584
  i > index ? { ...row, [outputParameterName]: PENDING_VALUE_PLACEHOLDER } : row,
6582
6585
  );
6583
6586
  */
6584
- await onProgress(papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
6587
+ await onProgress(papaparse__default["default"].unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS }));
6585
6588
  }
6586
6589
  }
6587
- return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
6590
+ return papaparse__default["default"].unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
6588
6591
  },
6589
6592
  },
6590
6593
  {
@@ -6612,7 +6615,7 @@
6612
6615
  return /* not await */ mapCallback({ [key]: value }, index, array.length);
6613
6616
  }));
6614
6617
  }));
6615
- return papaparse.unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
6618
+ return papaparse__default["default"].unparse(mappedData, { ...settings, ...MANDATORY_CSV_SETTINGS });
6616
6619
  },
6617
6620
  },
6618
6621
  ],
@@ -9541,7 +9544,7 @@
9541
9544
  const { filename: sourceFilename, url } = source;
9542
9545
  const { rootDirname, cacheDirname, intermediateFilesStrategy, extension, isVerbose } = options;
9543
9546
  // TODO: [👬] DRY
9544
- const hash = cryptoJs.SHA256(
9547
+ const hash = CryptoJS__default["default"].SHA256(
9545
9548
  // <- TODO: [🥬] Encapsulate sha256 to some private utility function
9546
9549
  hexEncoder__default["default"].parse(sourceFilename || url || 'untitled'))
9547
9550
  .toString( /* hex */)
@@ -9632,7 +9635,7 @@
9632
9635
  * @private utility of `WebsiteScraper`
9633
9636
  */
9634
9637
  function createShowdownConverter() {
9635
- return new showdown.Converter({
9638
+ return new showdown__default["default"].Converter({
9636
9639
  flavor: 'github',
9637
9640
  /*
9638
9641
  > import showdownHighlight from 'showdown-highlight';
@@ -10824,7 +10827,7 @@
10824
10827
  * @public exported from `@promptbook/utils`
10825
10828
  */
10826
10829
  function computeHash(value) {
10827
- return cryptoJs.SHA256(hexEncoder__default["default"].parse(_spaceTrim.spaceTrim(valueToString(value)))).toString( /* hex */);
10830
+ return CryptoJS__default["default"].SHA256(hexEncoder__default["default"].parse(_spaceTrim.spaceTrim(valueToString(value)))).toString( /* hex */);
10828
10831
  }
10829
10832
  // TODO: [🥬][🥬] Use this ACRY
10830
10833
 
@@ -39679,7 +39682,7 @@
39679
39682
  * Computes one stable hash from a JSON-serializable value.
39680
39683
  */
39681
39684
  function computeJsonHash$1(value) {
39682
- return cryptoJs.SHA256(JSON.stringify(value)).toString();
39685
+ return CryptoJS__default["default"].SHA256(JSON.stringify(value)).toString();
39683
39686
  }
39684
39687
  /**
39685
39688
  * Handles OpenAI AgentKit-backed executions for `AgentLlmExecutionTools`.
@@ -39837,7 +39840,7 @@
39837
39840
  * Computes one stable hash from a JSON-serializable value.
39838
39841
  */
39839
39842
  function computeJsonHash(value) {
39840
- return cryptoJs.SHA256(JSON.stringify(value)).toString();
39843
+ return CryptoJS__default["default"].SHA256(JSON.stringify(value)).toString();
39841
39844
  }
39842
39845
  /**
39843
39846
  * Removes assistant-managed requirements before the prompt is executed via OpenAI Assistants.
@@ -40639,7 +40642,7 @@
40639
40642
  * Returns a virtual model name representing the agent behavior.
40640
40643
  */
40641
40644
  get modelName() {
40642
- const hash = cryptoJs.SHA256(hexEncoder__default["default"].parse(this.options.agentSource)).toString( /* hex */);
40645
+ const hash = CryptoJS__default["default"].SHA256(hexEncoder__default["default"].parse(this.options.agentSource)).toString( /* hex */);
40643
40646
  const agentId = hash.substring(0, 10);
40644
40647
  return (normalizeToKebabCase(this.title) + '-' + agentId);
40645
40648
  }