@dexto/core 1.2.5 → 1.3.0

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.
Files changed (136) hide show
  1. package/README.md +47 -13
  2. package/dist/agent/DextoAgent.cjs +92 -34
  3. package/dist/agent/DextoAgent.d.ts +3 -3
  4. package/dist/agent/DextoAgent.d.ts.map +1 -1
  5. package/dist/agent/DextoAgent.js +93 -36
  6. package/dist/agent/schemas.cjs +24 -20
  7. package/dist/agent/schemas.d.ts +111 -107
  8. package/dist/agent/schemas.d.ts.map +1 -1
  9. package/dist/agent/schemas.js +8 -4
  10. package/dist/agent/types.d.ts +0 -1
  11. package/dist/agent/types.d.ts.map +1 -1
  12. package/dist/approval/schemas.cjs +2 -1
  13. package/dist/approval/schemas.d.ts +21 -20
  14. package/dist/approval/schemas.d.ts.map +1 -1
  15. package/dist/approval/schemas.js +2 -1
  16. package/dist/context/manager.cjs +7 -0
  17. package/dist/context/manager.d.ts.map +1 -1
  18. package/dist/context/manager.js +7 -0
  19. package/dist/context/types.d.ts +6 -2
  20. package/dist/context/types.d.ts.map +1 -1
  21. package/dist/errors/types.cjs +1 -0
  22. package/dist/errors/types.d.ts +4 -2
  23. package/dist/errors/types.d.ts.map +1 -1
  24. package/dist/errors/types.js +1 -0
  25. package/dist/events/index.cjs +4 -1
  26. package/dist/events/index.d.ts +23 -52
  27. package/dist/events/index.d.ts.map +1 -1
  28. package/dist/events/index.js +4 -1
  29. package/dist/llm/formatters/openai.cjs +8 -1
  30. package/dist/llm/formatters/openai.d.ts.map +1 -1
  31. package/dist/llm/formatters/openai.js +8 -1
  32. package/dist/llm/tokenizer/openai.d.ts +8 -0
  33. package/dist/llm/tokenizer/openai.d.ts.map +1 -1
  34. package/dist/logger/v2/schemas.cjs +1 -1
  35. package/dist/logger/v2/schemas.js +1 -1
  36. package/dist/memory/index.cjs +2 -0
  37. package/dist/memory/index.d.ts +1 -1
  38. package/dist/memory/index.d.ts.map +1 -1
  39. package/dist/memory/index.js +3 -1
  40. package/dist/memory/schemas.cjs +10 -0
  41. package/dist/memory/schemas.d.ts +33 -4
  42. package/dist/memory/schemas.d.ts.map +1 -1
  43. package/dist/memory/schemas.js +9 -0
  44. package/dist/plugins/error-codes.cjs +1 -0
  45. package/dist/plugins/error-codes.d.ts +3 -1
  46. package/dist/plugins/error-codes.d.ts.map +1 -1
  47. package/dist/plugins/error-codes.js +1 -0
  48. package/dist/plugins/loader.cjs +25 -5
  49. package/dist/plugins/loader.d.ts.map +1 -1
  50. package/dist/plugins/loader.js +25 -5
  51. package/dist/prompts/index.cjs +6 -8
  52. package/dist/prompts/index.d.ts +2 -4
  53. package/dist/prompts/index.d.ts.map +1 -1
  54. package/dist/prompts/index.js +4 -6
  55. package/dist/prompts/prompt-manager.cjs +2 -4
  56. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  57. package/dist/prompts/prompt-manager.js +2 -4
  58. package/dist/prompts/providers/config-prompt-provider.cjs +331 -0
  59. package/dist/prompts/providers/config-prompt-provider.d.ts +34 -0
  60. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -0
  61. package/dist/prompts/providers/config-prompt-provider.js +308 -0
  62. package/dist/prompts/providers/custom-prompt-provider.cjs +2 -2
  63. package/dist/prompts/providers/custom-prompt-provider.d.ts +1 -1
  64. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  65. package/dist/prompts/providers/custom-prompt-provider.js +2 -2
  66. package/dist/prompts/schemas.cjs +42 -23
  67. package/dist/prompts/schemas.d.ts +121 -12
  68. package/dist/prompts/schemas.d.ts.map +1 -1
  69. package/dist/prompts/schemas.js +39 -22
  70. package/dist/prompts/types.d.ts +1 -1
  71. package/dist/prompts/types.d.ts.map +1 -1
  72. package/dist/storage/cache/factory.cjs +6 -2
  73. package/dist/storage/cache/factory.d.ts +2 -1
  74. package/dist/storage/cache/factory.d.ts.map +1 -1
  75. package/dist/storage/cache/factory.js +6 -2
  76. package/dist/storage/database/factory.cjs +11 -17
  77. package/dist/storage/database/factory.d.ts +2 -1
  78. package/dist/storage/database/factory.d.ts.map +1 -1
  79. package/dist/storage/database/factory.js +11 -17
  80. package/dist/storage/database/sqlite-store.cjs +8 -0
  81. package/dist/storage/database/sqlite-store.d.ts.map +1 -1
  82. package/dist/storage/database/sqlite-store.js +8 -0
  83. package/dist/storage/error-codes.cjs +1 -0
  84. package/dist/storage/error-codes.d.ts +1 -0
  85. package/dist/storage/error-codes.d.ts.map +1 -1
  86. package/dist/storage/error-codes.js +1 -0
  87. package/dist/storage/errors.cjs +17 -0
  88. package/dist/storage/errors.d.ts +9 -0
  89. package/dist/storage/errors.d.ts.map +1 -1
  90. package/dist/storage/errors.js +17 -0
  91. package/dist/systemPrompt/in-built-prompts.cjs +0 -5
  92. package/dist/systemPrompt/in-built-prompts.d.ts +1 -2
  93. package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
  94. package/dist/systemPrompt/in-built-prompts.js +0 -4
  95. package/dist/systemPrompt/manager.cjs +24 -19
  96. package/dist/systemPrompt/manager.d.ts +2 -2
  97. package/dist/systemPrompt/manager.d.ts.map +1 -1
  98. package/dist/systemPrompt/manager.js +24 -19
  99. package/dist/systemPrompt/registry.cjs +1 -2
  100. package/dist/systemPrompt/registry.d.ts +1 -1
  101. package/dist/systemPrompt/registry.d.ts.map +1 -1
  102. package/dist/systemPrompt/registry.js +1 -2
  103. package/dist/systemPrompt/schemas.cjs +3 -17
  104. package/dist/systemPrompt/schemas.d.ts +13 -189
  105. package/dist/systemPrompt/schemas.d.ts.map +1 -1
  106. package/dist/systemPrompt/schemas.js +3 -17
  107. package/dist/telemetry/error-codes.cjs +36 -0
  108. package/dist/telemetry/error-codes.d.ts +13 -0
  109. package/dist/telemetry/error-codes.d.ts.map +1 -0
  110. package/dist/telemetry/error-codes.js +13 -0
  111. package/dist/telemetry/errors.cjs +105 -0
  112. package/dist/telemetry/errors.d.ts +28 -0
  113. package/dist/telemetry/errors.d.ts.map +1 -0
  114. package/dist/telemetry/errors.js +82 -0
  115. package/dist/telemetry/telemetry.cjs +92 -26
  116. package/dist/telemetry/telemetry.d.ts +1 -1
  117. package/dist/telemetry/telemetry.d.ts.map +1 -1
  118. package/dist/telemetry/telemetry.js +74 -18
  119. package/dist/tools/schemas.cjs +1 -1
  120. package/dist/tools/schemas.js +1 -1
  121. package/dist/tools/types.d.ts +0 -11
  122. package/dist/tools/types.d.ts.map +1 -1
  123. package/dist/utils/schema.d.ts +6 -0
  124. package/dist/utils/schema.d.ts.map +1 -1
  125. package/dist/utils/service-initializer.cjs +1 -0
  126. package/dist/utils/service-initializer.d.ts.map +1 -1
  127. package/dist/utils/service-initializer.js +1 -0
  128. package/package.json +52 -14
  129. package/dist/prompts/providers/file-prompt-provider.cjs +0 -401
  130. package/dist/prompts/providers/file-prompt-provider.d.ts +0 -49
  131. package/dist/prompts/providers/file-prompt-provider.d.ts.map +0 -1
  132. package/dist/prompts/providers/file-prompt-provider.js +0 -378
  133. package/dist/prompts/providers/starter-prompt-provider.cjs +0 -172
  134. package/dist/prompts/providers/starter-prompt-provider.d.ts +0 -47
  135. package/dist/prompts/providers/starter-prompt-provider.d.ts.map +0 -1
  136. package/dist/prompts/providers/starter-prompt-provider.js +0 -149
@@ -1,378 +0,0 @@
1
- import "../../chunk-C6A6W6XS.js";
2
- import { expandPlaceholders } from "../utils.js";
3
- import { assertValidPromptName } from "../name-validation.js";
4
- import { DextoLogComponent } from "../../logger/v2/types.js";
5
- import { PromptError } from "../errors.js";
6
- import { readFile, readdir, realpath } from "fs/promises";
7
- import { join, extname, resolve, relative, sep } from "path";
8
- import { existsSync } from "fs";
9
- import { homedir } from "os";
10
- import { findDextoProjectRoot, findDextoSourceRoot } from "../../utils/execution-context.js";
11
- class FilePromptProvider {
12
- // Multiple command directories (local project/repo and global user dir)
13
- commandDirs;
14
- resourceManager;
15
- promptsCache = [];
16
- cacheValid = false;
17
- promptResources = /* @__PURE__ */ new Map();
18
- inlineContent = /* @__PURE__ */ new Map();
19
- logger;
20
- constructor(options, logger) {
21
- this.logger = logger.createChild(DextoLogComponent.PROMPT);
22
- this.commandDirs = this.resolveDefaultCommandDirs();
23
- this.resourceManager = options.resourceManager;
24
- }
25
- getSource() {
26
- return "file";
27
- }
28
- invalidateCache() {
29
- this.cacheValid = false;
30
- this.promptsCache = [];
31
- this.promptResources.clear();
32
- this.inlineContent.clear();
33
- this.logger.debug("FilePromptProvider cache invalidated");
34
- }
35
- async getPrompt(name, args) {
36
- if (!this.cacheValid) {
37
- await this.buildPromptsCache();
38
- }
39
- const prompt = this.promptsCache.find((p) => p.name === name);
40
- if (!prompt) {
41
- throw PromptError.notFound(name);
42
- }
43
- const resourceUri = this.promptResources.get(name);
44
- let text = this.inlineContent.get(name) ?? "";
45
- if (resourceUri) {
46
- try {
47
- const result = await this.resourceManager.read(resourceUri);
48
- const first = result.contents[0];
49
- if (first?.text && typeof first.text === "string") {
50
- text = first.text;
51
- } else if (first?.blob && typeof first.blob === "string") {
52
- text = Buffer.from(first.blob, "base64").toString("utf-8");
53
- } else {
54
- this.logger.warn(`Prompt ${name} resource ${resourceUri} did not contain text`);
55
- }
56
- } catch (error) {
57
- this.logger.warn(
58
- `Failed to load prompt resource ${resourceUri}: ${error instanceof Error ? error.message : String(error)}`
59
- );
60
- }
61
- }
62
- if (!text) {
63
- throw PromptError.missingText();
64
- }
65
- const resolved = this.applyArguments(text, args);
66
- return {
67
- description: prompt.description,
68
- messages: [
69
- {
70
- role: "user",
71
- content: {
72
- type: "text",
73
- text: resolved
74
- }
75
- }
76
- ]
77
- };
78
- }
79
- async listPrompts(_cursor) {
80
- if (!this.cacheValid) {
81
- await this.buildPromptsCache();
82
- }
83
- return {
84
- prompts: this.promptsCache
85
- };
86
- }
87
- async getPromptDefinition(name) {
88
- if (!this.cacheValid) {
89
- await this.buildPromptsCache();
90
- }
91
- const promptInfo = this.promptsCache.find((p) => p.name === name);
92
- if (!promptInfo) {
93
- return null;
94
- }
95
- return {
96
- name: promptInfo.name,
97
- ...promptInfo.title && { title: promptInfo.title },
98
- ...promptInfo.description && { description: promptInfo.description },
99
- ...promptInfo.arguments && { arguments: promptInfo.arguments }
100
- };
101
- }
102
- async buildPromptsCache() {
103
- const cache = [];
104
- const resourceMap = /* @__PURE__ */ new Map();
105
- const inlineMap = /* @__PURE__ */ new Map();
106
- const seenNames = /* @__PURE__ */ new Set();
107
- const scannedDirs = [];
108
- for (const dir of this.commandDirs) {
109
- if (!existsSync(dir)) {
110
- continue;
111
- }
112
- try {
113
- scannedDirs.push(dir);
114
- const files = await readdir(dir);
115
- const markdownFiles = files.filter((file) => extname(file).toLowerCase() === ".md");
116
- for (const file of markdownFiles) {
117
- try {
118
- try {
119
- const candidate = join(dir, file);
120
- const resolvedDir = await realpath(dir);
121
- const resolvedFile = await realpath(candidate);
122
- const rel = relative(resolvedDir, resolvedFile);
123
- if (rel.startsWith(".." + sep) || rel === "..") {
124
- this.logger.warn(
125
- `Skipping file '${file}' in '${dir}': path traversal attempt detected (resolved outside directory)`
126
- );
127
- continue;
128
- }
129
- } catch (realpathError) {
130
- this.logger.warn(
131
- `Skipping file '${file}' in '${dir}': unable to resolve path (${realpathError instanceof Error ? realpathError.message : String(realpathError)})`
132
- );
133
- continue;
134
- }
135
- const parsed = await this.parsePromptFile(file, dir);
136
- if (seenNames.has(parsed.info.name)) {
137
- this.logger.debug(
138
- `Skipping duplicate prompt name '${parsed.info.name}' from ${join(
139
- dir,
140
- file
141
- )}`
142
- );
143
- continue;
144
- }
145
- const storage = await this.storePromptContent(parsed.content, file);
146
- if (storage.resourceUri) {
147
- resourceMap.set(parsed.info.name, storage.resourceUri);
148
- }
149
- if (storage.inlineContent) {
150
- inlineMap.set(parsed.info.name, storage.inlineContent);
151
- }
152
- if (storage.resourceUri || storage.inlineContent) {
153
- const metadata = {
154
- ...parsed.info.metadata ?? {},
155
- ...storage.resourceUri && { resourceUri: storage.resourceUri }
156
- // Security: Don't expose absolute sourceDir path
157
- // The relative filePath in parsed.info.metadata is sufficient
158
- };
159
- if (Object.keys(metadata).length > 0) {
160
- parsed.info = { ...parsed.info, metadata };
161
- } else {
162
- parsed.info = { ...parsed.info };
163
- delete parsed.info.metadata;
164
- }
165
- }
166
- cache.push(parsed.info);
167
- seenNames.add(parsed.info.name);
168
- } catch (error) {
169
- this.logger.warn(
170
- `Failed to process prompt file '${file}' in '${dir}': ${error instanceof Error ? error.message : String(error)}`
171
- );
172
- }
173
- }
174
- } catch (error) {
175
- this.logger.debug(
176
- `Commands directory '${dir}' not accessible: ${error instanceof Error ? error.message : String(error)}`
177
- );
178
- }
179
- }
180
- this.logger.debug(
181
- `\u{1F4DD} Cached ${cache.length} file prompts from directories: ${scannedDirs.join(", ")}`
182
- );
183
- this.promptsCache = cache;
184
- this.promptResources = resourceMap;
185
- this.inlineContent = inlineMap;
186
- this.cacheValid = true;
187
- }
188
- async parsePromptFile(fileName, baseDir) {
189
- const promptName = fileName.replace(/\.md$/, "");
190
- const filePath = join(baseDir, fileName);
191
- const content = await readFile(filePath, "utf-8");
192
- const lines = content.trim().split("\n");
193
- let description = `File prompt: ${promptName}`;
194
- let title = promptName;
195
- let category;
196
- let id;
197
- let nameOverride;
198
- let argumentHint;
199
- let contentBody;
200
- if (lines[0]?.trim() === "---") {
201
- let inFrontmatter = false;
202
- let frontmatterEnd = 0;
203
- for (let i = 0; i < lines.length; i++) {
204
- if (lines[i]?.trim() === "---") {
205
- if (!inFrontmatter) {
206
- inFrontmatter = true;
207
- } else {
208
- frontmatterEnd = i;
209
- break;
210
- }
211
- }
212
- }
213
- if (frontmatterEnd > 0) {
214
- const frontmatterLines = lines.slice(1, frontmatterEnd);
215
- contentBody = lines.slice(frontmatterEnd + 1).join("\n");
216
- for (const line of frontmatterLines) {
217
- if (line.includes("description:")) {
218
- const descMatch = line.match(/description:\s*(?:['"](.+)['"]|(.+))/);
219
- if (descMatch) {
220
- description = (descMatch[1] || descMatch[2] || "").trim();
221
- }
222
- } else if (line.includes("id:")) {
223
- const idMatch = line.match(/id:\s*(?:['"](.+)['"]|(.+))/);
224
- if (idMatch) {
225
- id = (idMatch[1] || idMatch[2] || "").trim();
226
- }
227
- } else if (line.includes("name:")) {
228
- const nameMatch = line.match(/name:\s*(?:['"](.+)['"]|(.+))/);
229
- if (nameMatch) {
230
- nameOverride = (nameMatch[1] || nameMatch[2] || "").trim();
231
- }
232
- } else if (line.includes("category:")) {
233
- const categoryMatch = line.match(/category:\s*(?:['"](.+)['"]|(.+))/);
234
- if (categoryMatch) {
235
- category = (categoryMatch[1] || categoryMatch[2] || "").trim();
236
- }
237
- } else if (line.includes("argument-hint:")) {
238
- const hintMatch = line.match(/argument-hint:\s*(?:['"](.+)['"]|(.+))/);
239
- if (hintMatch) {
240
- argumentHint = (hintMatch[1] || hintMatch[2] || "").trim();
241
- }
242
- }
243
- }
244
- }
245
- }
246
- if (!contentBody) {
247
- contentBody = content;
248
- }
249
- const bodyLines = contentBody.trim().split("\n");
250
- for (const line of bodyLines) {
251
- if (line.trim().startsWith("#")) {
252
- title = line.trim().replace(/^#+\s*/, "");
253
- break;
254
- }
255
- }
256
- const finalName = (nameOverride ?? promptName).trim();
257
- assertValidPromptName(finalName, {
258
- hint: "Use kebab-case in the 'name:' field or file name."
259
- });
260
- const parsedArguments = argumentHint ? this.parseArgumentHint(argumentHint) : void 0;
261
- const relativePath = relative(baseDir, filePath);
262
- const promptInfo = {
263
- name: finalName,
264
- title,
265
- description,
266
- source: "file",
267
- ...parsedArguments && { arguments: parsedArguments },
268
- metadata: {
269
- originalName: promptName,
270
- fileName,
271
- // Only include relative path within the commands directory (e.g., "my-command.md")
272
- // not the full path which could expose ~/.dexto or project structure
273
- ...relativePath && { filePath: relativePath },
274
- ...id && { id },
275
- ...category && { category }
276
- }
277
- };
278
- return { info: promptInfo, content: contentBody };
279
- }
280
- /**
281
- * Parse argument-hint string into structured argument definitions
282
- * Format: "[style] [length?]" → [{name: "style", required: true}, {name: "length", required: false}]
283
- */
284
- parseArgumentHint(hint) {
285
- const args = [];
286
- const argPattern = /\[([^\]]+)\]/g;
287
- let match;
288
- while ((match = argPattern.exec(hint)) !== null) {
289
- const argText = match[1];
290
- if (!argText) continue;
291
- const isOptional = argText.endsWith("?");
292
- const name = isOptional ? argText.slice(0, -1).trim() : argText.trim();
293
- if (name) {
294
- args.push({
295
- name,
296
- required: !isOptional
297
- });
298
- }
299
- }
300
- return args;
301
- }
302
- async storePromptContent(content, fileName) {
303
- const blobService = this.resourceManager.getBlobStore();
304
- if (!blobService) {
305
- this.logger.warn("BlobService not available; storing prompt content in memory");
306
- return { inlineContent: content };
307
- }
308
- const blobInput = Buffer.from(content, "utf-8");
309
- const blob = await blobService.store(blobInput, {
310
- mimeType: "text/markdown",
311
- originalName: fileName,
312
- source: "system"
313
- });
314
- return { resourceUri: blob.uri };
315
- }
316
- /**
317
- * Apply arguments to a file prompt's content.
318
- *
319
- * Behavior mirrors Claude Code-style file prompts:
320
- * - Positional placeholders ($1..$9 and $ARGUMENTS) are expanded first.
321
- * - If and only if the template contains explicit placeholders ($1..$9 or $ARGUMENTS),
322
- * then we consider arguments "deconstructed in-template" and DO NOT append them again.
323
- * - If the template contains no such placeholders, we append either:
324
- * - `Context: <_context>` above the content when `_context` is provided, or
325
- * - `Arguments: key: value, ...` below the content for plain named args.
326
- *
327
- * Notes:
328
- * - The `$$` sequence is an escape for a literal dollar sign. It MUST NOT be
329
- * treated as a placeholder indicator and should not suppress argument appending.
330
- */
331
- applyArguments(content, args) {
332
- const detectionTarget = content.replaceAll("$$", "");
333
- const usesPositionalPlaceholders = /\$[1-9](?!\d)/.test(detectionTarget) || detectionTarget.includes("$ARGUMENTS");
334
- const expanded = expandPlaceholders(content, args).trim();
335
- if (!args || typeof args !== "object" || Object.keys(args).length === 0) {
336
- return expanded;
337
- }
338
- if (!usesPositionalPlaceholders) {
339
- if (args._context) {
340
- const contextString = String(args._context);
341
- return `${expanded}
342
-
343
- Context: ${contextString}`;
344
- }
345
- const argEntries = Object.entries(args).filter(([key]) => !key.startsWith("_"));
346
- if (argEntries.length > 0) {
347
- const formattedArgs = argEntries.map(([key, value]) => `${key}: ${value}`).join(", ");
348
- return `${expanded}
349
-
350
- Arguments: ${formattedArgs}`;
351
- }
352
- }
353
- return expanded;
354
- }
355
- // Determine default command/prompt directories based on execution context
356
- resolveDefaultCommandDirs() {
357
- const dirs = [];
358
- const sourceRoot = findDextoSourceRoot();
359
- const projectRoot = findDextoProjectRoot();
360
- const localRoot = sourceRoot ?? projectRoot ?? null;
361
- if (localRoot) {
362
- const commandsDir = resolve(localRoot, "commands");
363
- if (existsSync(commandsDir)) dirs.push(commandsDir);
364
- }
365
- const globalCommands = resolve(homedir(), ".dexto", "commands");
366
- if (existsSync(globalCommands)) dirs.push(globalCommands);
367
- if (dirs.length === 0) {
368
- if (localRoot) {
369
- dirs.push(resolve(localRoot, "commands"));
370
- }
371
- dirs.push(globalCommands);
372
- }
373
- return dirs;
374
- }
375
- }
376
- export {
377
- FilePromptProvider
378
- };
@@ -1,172 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var starter_prompt_provider_exports = {};
20
- __export(starter_prompt_provider_exports, {
21
- StarterPromptProvider: () => StarterPromptProvider
22
- });
23
- module.exports = __toCommonJS(starter_prompt_provider_exports);
24
- var import_types = require("../../logger/v2/types.js");
25
- var import_errors = require("../errors.js");
26
- class StarterPromptProvider {
27
- // Sourced from validated AgentConfig schema's starterPrompts
28
- starterPrompts = [];
29
- promptsCache = [];
30
- cacheValid = false;
31
- logger;
32
- constructor(agentConfig, logger) {
33
- this.logger = logger.createChild(import_types.DextoLogComponent.PROMPT);
34
- this.starterPrompts = agentConfig.starterPrompts;
35
- this.buildPromptsCache();
36
- }
37
- /**
38
- * Get the source identifier for this provider
39
- */
40
- getSource() {
41
- return "starter";
42
- }
43
- /**
44
- * Invalidate the prompts cache
45
- */
46
- invalidateCache() {
47
- this.cacheValid = false;
48
- this.promptsCache = [];
49
- this.logger.debug("StarterPromptProvider cache invalidated");
50
- }
51
- /**
52
- * Update starter prompts configuration
53
- */
54
- updateConfig(agentConfig) {
55
- this.starterPrompts = agentConfig.starterPrompts;
56
- this.invalidateCache();
57
- this.buildPromptsCache();
58
- }
59
- /**
60
- * Build the prompts cache from starter prompts configuration
61
- */
62
- buildPromptsCache() {
63
- const allPrompts = [];
64
- this.starterPrompts.forEach((starterPrompt) => {
65
- const promptName = `starter:${starterPrompt.id}`;
66
- const promptInfo = {
67
- name: promptName,
68
- title: starterPrompt.title,
69
- description: starterPrompt.description,
70
- source: "starter",
71
- metadata: {
72
- prompt: starterPrompt.prompt,
73
- category: starterPrompt.category,
74
- priority: starterPrompt.priority,
75
- originalId: starterPrompt.id
76
- }
77
- };
78
- allPrompts.push(promptInfo);
79
- });
80
- const getPriority = (p) => {
81
- const val = p.metadata?.priority;
82
- return typeof val === "number" ? val : 0;
83
- };
84
- allPrompts.sort((a, b) => getPriority(b) - getPriority(a));
85
- this.promptsCache = allPrompts;
86
- this.cacheValid = true;
87
- this.logger.debug(`\u{1F4DD} Cached ${allPrompts.length} starter prompts`);
88
- }
89
- /**
90
- * List all available starter prompts
91
- */
92
- async listPrompts(_cursor) {
93
- if (!this.cacheValid) {
94
- this.buildPromptsCache();
95
- }
96
- return {
97
- prompts: this.promptsCache
98
- };
99
- }
100
- /**
101
- * Get a specific starter prompt by name
102
- */
103
- async getPrompt(name, args) {
104
- if (!this.cacheValid) {
105
- this.buildPromptsCache();
106
- }
107
- const promptInfo = this.promptsCache.find((p) => p.name === name);
108
- if (!promptInfo) {
109
- throw import_errors.PromptError.notFound(name);
110
- }
111
- const rawPrompt = promptInfo.metadata?.prompt;
112
- if (typeof rawPrompt !== "string" || rawPrompt.trim().length === 0) {
113
- throw import_errors.PromptError.missingText();
114
- }
115
- const promptText = rawPrompt;
116
- this.logger.debug(`\u{1F4DD} Reading starter prompt: ${name}`);
117
- let content = promptText;
118
- if (args && typeof args === "object") {
119
- const hasPositionalPlaceholders = /\$[1-9]/.test(content) || content.includes("$ARGUMENTS");
120
- if (!hasPositionalPlaceholders) {
121
- if (args._context) {
122
- const contextString = String(args._context);
123
- content = `${content}
124
-
125
- Context: ${contextString}`;
126
- } else {
127
- const argEntries = Object.entries(args).filter(([k]) => !k.startsWith("_"));
128
- if (argEntries.length > 0) {
129
- const argContext = argEntries.map(([k, v]) => `${k}: ${v}`).join(", ");
130
- content = `${content}
131
-
132
- Arguments: ${argContext}`;
133
- }
134
- }
135
- }
136
- }
137
- return {
138
- description: promptInfo.description,
139
- messages: [
140
- {
141
- role: "user",
142
- content: {
143
- type: "text",
144
- text: content
145
- }
146
- }
147
- ]
148
- };
149
- }
150
- /**
151
- * Get prompt definition (metadata only)
152
- */
153
- async getPromptDefinition(name) {
154
- if (!this.cacheValid) {
155
- this.buildPromptsCache();
156
- }
157
- const promptInfo = this.promptsCache.find((p) => p.name === name);
158
- if (!promptInfo) {
159
- return null;
160
- }
161
- return {
162
- name: promptInfo.name,
163
- ...promptInfo.title && { title: promptInfo.title },
164
- ...promptInfo.description && { description: promptInfo.description },
165
- ...promptInfo.arguments && { arguments: promptInfo.arguments }
166
- };
167
- }
168
- }
169
- // Annotate the CommonJS export names for ESM import in node:
170
- 0 && (module.exports = {
171
- StarterPromptProvider
172
- });
@@ -1,47 +0,0 @@
1
- import type { PromptProvider, PromptDefinition, PromptListResult } from '../types.js';
2
- import type { GetPromptResult } from '@modelcontextprotocol/sdk/types.js';
3
- import type { ValidatedAgentConfig } from '../../agent/schemas.js';
4
- import type { IDextoLogger } from '../../logger/v2/types.js';
5
- /**
6
- * Starter Prompt Provider - Provides prompts from agent configuration starter prompts
7
- *
8
- * This provider exposes starter prompts defined in the agent configuration as regular prompts.
9
- * Starter prompts are intended for quick access to common user workflows and are typically
10
- * displayed prominently in the UI.
11
- */
12
- export declare class StarterPromptProvider implements PromptProvider {
13
- private starterPrompts;
14
- private promptsCache;
15
- private cacheValid;
16
- private logger;
17
- constructor(agentConfig: ValidatedAgentConfig, logger: IDextoLogger);
18
- /**
19
- * Get the source identifier for this provider
20
- */
21
- getSource(): string;
22
- /**
23
- * Invalidate the prompts cache
24
- */
25
- invalidateCache(): void;
26
- /**
27
- * Update starter prompts configuration
28
- */
29
- updateConfig(agentConfig: ValidatedAgentConfig): void;
30
- /**
31
- * Build the prompts cache from starter prompts configuration
32
- */
33
- private buildPromptsCache;
34
- /**
35
- * List all available starter prompts
36
- */
37
- listPrompts(_cursor?: string): Promise<PromptListResult>;
38
- /**
39
- * Get a specific starter prompt by name
40
- */
41
- getPrompt(name: string, args?: Record<string, unknown>): Promise<GetPromptResult>;
42
- /**
43
- * Get prompt definition (metadata only)
44
- */
45
- getPromptDefinition(name: string): Promise<PromptDefinition | null>;
46
- }
47
- //# sourceMappingURL=starter-prompt-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"starter-prompt-provider.d.ts","sourceRoot":"","sources":["../../../src/prompts/providers/starter-prompt-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAM7D;;;;;;GAMG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAExD,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAe;gBAEjB,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,YAAY;IAOnE;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,eAAe,IAAI,IAAI;IAMvB;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,oBAAoB,GAAG,IAAI;IAMrD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU9D;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAmDvF;;OAEG;IACG,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAiB5E"}