@dexto/core 1.5.6 → 1.5.8

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 (217) hide show
  1. package/dist/agent/DextoAgent.cjs +189 -30
  2. package/dist/agent/DextoAgent.d.ts +44 -9
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +190 -31
  5. package/dist/agent/schemas.cjs +5 -0
  6. package/dist/agent/schemas.d.ts +456 -66
  7. package/dist/agent/schemas.d.ts.map +1 -1
  8. package/dist/agent/schemas.js +5 -0
  9. package/dist/context/manager.cjs +1 -1
  10. package/dist/context/manager.js +1 -1
  11. package/dist/context/utils.cjs +90 -17
  12. package/dist/context/utils.d.ts.map +1 -1
  13. package/dist/context/utils.js +90 -17
  14. package/dist/errors/types.cjs +2 -1
  15. package/dist/errors/types.d.ts +2 -1
  16. package/dist/errors/types.d.ts.map +1 -1
  17. package/dist/errors/types.js +2 -1
  18. package/dist/events/index.cjs +4 -1
  19. package/dist/events/index.d.ts +37 -2
  20. package/dist/events/index.d.ts.map +1 -1
  21. package/dist/events/index.js +4 -1
  22. package/dist/image/types.d.ts +15 -0
  23. package/dist/image/types.d.ts.map +1 -1
  24. package/dist/index.browser.d.ts +1 -1
  25. package/dist/index.browser.d.ts.map +1 -1
  26. package/dist/llm/curation-config.cjs +82 -0
  27. package/dist/llm/curation-config.d.ts +13 -0
  28. package/dist/llm/curation-config.d.ts.map +1 -0
  29. package/dist/llm/curation-config.js +59 -0
  30. package/dist/llm/curation.cjs +57 -0
  31. package/dist/llm/curation.d.ts +16 -0
  32. package/dist/llm/curation.d.ts.map +1 -0
  33. package/dist/llm/curation.js +34 -0
  34. package/dist/llm/error-codes.cjs +1 -0
  35. package/dist/llm/error-codes.d.ts +1 -0
  36. package/dist/llm/error-codes.d.ts.map +1 -1
  37. package/dist/llm/error-codes.js +1 -0
  38. package/dist/llm/errors.cjs +16 -1
  39. package/dist/llm/errors.d.ts +15 -8
  40. package/dist/llm/errors.d.ts.map +1 -1
  41. package/dist/llm/errors.js +16 -1
  42. package/dist/llm/executor/provider-options.cjs +1 -1
  43. package/dist/llm/executor/provider-options.js +1 -1
  44. package/dist/llm/executor/turn-executor.cjs +35 -2
  45. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  46. package/dist/llm/executor/turn-executor.js +35 -2
  47. package/dist/llm/index.cjs +14 -3
  48. package/dist/llm/index.d.ts +3 -1
  49. package/dist/llm/index.d.ts.map +1 -1
  50. package/dist/llm/index.js +13 -2
  51. package/dist/llm/registry/auto-update.cjs +263 -0
  52. package/dist/llm/registry/auto-update.d.ts +27 -0
  53. package/dist/llm/registry/auto-update.d.ts.map +1 -0
  54. package/dist/llm/registry/auto-update.js +227 -0
  55. package/dist/llm/registry/index.cjs +806 -0
  56. package/dist/llm/{registry.d.ts → registry/index.d.ts} +67 -13
  57. package/dist/llm/registry/index.d.ts.map +1 -0
  58. package/dist/llm/registry/index.js +756 -0
  59. package/dist/llm/registry/models.generated.cjs +4861 -0
  60. package/dist/llm/registry/models.generated.d.ts +431 -0
  61. package/dist/llm/registry/models.generated.d.ts.map +1 -0
  62. package/dist/llm/registry/models.generated.js +4838 -0
  63. package/dist/llm/registry/models.manual.cjs +44 -0
  64. package/dist/llm/registry/models.manual.d.ts +22 -0
  65. package/dist/llm/registry/models.manual.d.ts.map +1 -0
  66. package/dist/llm/registry/models.manual.js +21 -0
  67. package/dist/llm/registry/sync.cjs +354 -0
  68. package/dist/llm/registry/sync.d.ts +41 -0
  69. package/dist/llm/registry/sync.d.ts.map +1 -0
  70. package/dist/llm/registry/sync.js +328 -0
  71. package/dist/llm/resolver.cjs +29 -7
  72. package/dist/llm/resolver.d.ts +1 -1
  73. package/dist/llm/resolver.d.ts.map +1 -1
  74. package/dist/llm/resolver.js +31 -8
  75. package/dist/llm/schemas.cjs +13 -1
  76. package/dist/llm/schemas.d.ts +59 -59
  77. package/dist/llm/schemas.d.ts.map +1 -1
  78. package/dist/llm/schemas.js +14 -1
  79. package/dist/llm/services/factory.cjs +43 -27
  80. package/dist/llm/services/factory.d.ts +20 -1
  81. package/dist/llm/services/factory.d.ts.map +1 -1
  82. package/dist/llm/services/factory.js +44 -28
  83. package/dist/llm/services/test-utils.integration.cjs +5 -1
  84. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  85. package/dist/llm/services/test-utils.integration.js +5 -1
  86. package/dist/llm/services/vercel.cjs +4 -1
  87. package/dist/llm/services/vercel.d.ts +1 -0
  88. package/dist/llm/services/vercel.d.ts.map +1 -1
  89. package/dist/llm/services/vercel.js +4 -1
  90. package/dist/llm/types.cjs +5 -2
  91. package/dist/llm/types.d.ts +1 -1
  92. package/dist/llm/types.d.ts.map +1 -1
  93. package/dist/llm/types.js +5 -2
  94. package/dist/llm/validation.cjs +1 -1
  95. package/dist/llm/validation.js +1 -1
  96. package/dist/logger/v2/dexto-logger.cjs +4 -0
  97. package/dist/logger/v2/dexto-logger.d.ts +3 -0
  98. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  99. package/dist/logger/v2/dexto-logger.js +4 -0
  100. package/dist/logger/v2/types.d.ts +2 -0
  101. package/dist/logger/v2/types.d.ts.map +1 -1
  102. package/dist/mcp/error-codes.cjs +1 -0
  103. package/dist/mcp/error-codes.d.ts +1 -0
  104. package/dist/mcp/error-codes.d.ts.map +1 -1
  105. package/dist/mcp/error-codes.js +1 -0
  106. package/dist/mcp/errors.cjs +13 -0
  107. package/dist/mcp/errors.d.ts +7 -0
  108. package/dist/mcp/errors.d.ts.map +1 -1
  109. package/dist/mcp/errors.js +13 -0
  110. package/dist/mcp/manager.cjs +46 -4
  111. package/dist/mcp/manager.d.ts +10 -2
  112. package/dist/mcp/manager.d.ts.map +1 -1
  113. package/dist/mcp/manager.js +46 -4
  114. package/dist/mcp/mcp-client.cjs +89 -5
  115. package/dist/mcp/mcp-client.d.ts +5 -1
  116. package/dist/mcp/mcp-client.d.ts.map +1 -1
  117. package/dist/mcp/mcp-client.js +89 -5
  118. package/dist/mcp/schemas.cjs +6 -1
  119. package/dist/mcp/schemas.d.ts +1 -1
  120. package/dist/mcp/schemas.d.ts.map +1 -1
  121. package/dist/mcp/schemas.js +6 -1
  122. package/dist/mcp/types.d.ts +5 -0
  123. package/dist/mcp/types.d.ts.map +1 -1
  124. package/dist/prompts/index.d.ts +1 -1
  125. package/dist/prompts/index.d.ts.map +1 -1
  126. package/dist/prompts/prompt-manager.cjs +90 -4
  127. package/dist/prompts/prompt-manager.d.ts +16 -6
  128. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  129. package/dist/prompts/prompt-manager.js +90 -4
  130. package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
  131. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  132. package/dist/prompts/providers/config-prompt-provider.js +105 -11
  133. package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
  134. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  135. package/dist/prompts/providers/custom-prompt-provider.js +1 -0
  136. package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
  137. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  138. package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
  139. package/dist/prompts/schemas.cjs +28 -2
  140. package/dist/prompts/schemas.d.ts +130 -0
  141. package/dist/prompts/schemas.d.ts.map +1 -1
  142. package/dist/prompts/schemas.js +28 -2
  143. package/dist/prompts/types.d.ts +55 -3
  144. package/dist/prompts/types.d.ts.map +1 -1
  145. package/dist/resources/handlers/filesystem-handler.cjs +25 -0
  146. package/dist/resources/handlers/filesystem-handler.d.ts +1 -0
  147. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  148. package/dist/resources/handlers/filesystem-handler.js +25 -0
  149. package/dist/session/chat-session.cjs +1 -1
  150. package/dist/session/chat-session.d.ts +1 -1
  151. package/dist/session/chat-session.d.ts.map +1 -1
  152. package/dist/session/chat-session.js +1 -1
  153. package/dist/session/index.d.ts +1 -1
  154. package/dist/session/index.d.ts.map +1 -1
  155. package/dist/session/message-queue.cjs +29 -5
  156. package/dist/session/message-queue.d.ts +3 -1
  157. package/dist/session/message-queue.d.ts.map +1 -1
  158. package/dist/session/message-queue.js +29 -5
  159. package/dist/session/session-manager.cjs +84 -3
  160. package/dist/session/session-manager.d.ts +12 -0
  161. package/dist/session/session-manager.d.ts.map +1 -1
  162. package/dist/session/session-manager.js +74 -3
  163. package/dist/session/types.d.ts +1 -0
  164. package/dist/session/types.d.ts.map +1 -1
  165. package/dist/systemPrompt/contributors.cjs +42 -0
  166. package/dist/systemPrompt/contributors.d.ts +13 -0
  167. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  168. package/dist/systemPrompt/contributors.js +41 -0
  169. package/dist/tools/errors.cjs +7 -3
  170. package/dist/tools/errors.d.ts +5 -1
  171. package/dist/tools/errors.d.ts.map +1 -1
  172. package/dist/tools/errors.js +7 -3
  173. package/dist/tools/internal-tools/constants.cjs +2 -1
  174. package/dist/tools/internal-tools/constants.d.ts +1 -1
  175. package/dist/tools/internal-tools/constants.d.ts.map +1 -1
  176. package/dist/tools/internal-tools/constants.js +2 -1
  177. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
  178. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
  179. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
  180. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
  181. package/dist/tools/internal-tools/provider.cjs +15 -0
  182. package/dist/tools/internal-tools/provider.d.ts +15 -1
  183. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  184. package/dist/tools/internal-tools/provider.js +15 -0
  185. package/dist/tools/internal-tools/registry.cjs +6 -0
  186. package/dist/tools/internal-tools/registry.d.ts +35 -1
  187. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  188. package/dist/tools/internal-tools/registry.js +6 -0
  189. package/dist/tools/schemas.d.ts +1 -1
  190. package/dist/tools/schemas.d.ts.map +1 -1
  191. package/dist/tools/tool-call-metadata.cjs +75 -0
  192. package/dist/tools/tool-call-metadata.d.ts +16 -0
  193. package/dist/tools/tool-call-metadata.d.ts.map +1 -0
  194. package/dist/tools/tool-call-metadata.js +51 -0
  195. package/dist/tools/tool-manager.cjs +481 -103
  196. package/dist/tools/tool-manager.d.ts +131 -9
  197. package/dist/tools/tool-manager.d.ts.map +1 -1
  198. package/dist/tools/tool-manager.js +482 -104
  199. package/dist/utils/api-key-resolver.cjs +5 -2
  200. package/dist/utils/api-key-resolver.d.ts.map +1 -1
  201. package/dist/utils/api-key-resolver.js +5 -2
  202. package/dist/utils/env.cjs +49 -0
  203. package/dist/utils/env.d.ts +4 -0
  204. package/dist/utils/env.d.ts.map +1 -0
  205. package/dist/utils/env.js +24 -0
  206. package/dist/utils/index.cjs +3 -1
  207. package/dist/utils/index.d.ts +1 -0
  208. package/dist/utils/index.d.ts.map +1 -1
  209. package/dist/utils/index.js +1 -0
  210. package/dist/utils/service-initializer.cjs +25 -7
  211. package/dist/utils/service-initializer.d.ts +24 -1
  212. package/dist/utils/service-initializer.d.ts.map +1 -1
  213. package/dist/utils/service-initializer.js +25 -7
  214. package/package.json +6 -2
  215. package/dist/llm/registry.cjs +0 -1631
  216. package/dist/llm/registry.d.ts.map +0 -1
  217. package/dist/llm/registry.js +0 -1586
@@ -3,11 +3,15 @@ import { randomUUID } from "crypto";
3
3
  import { ChatSession } from "./chat-session.js";
4
4
  import { DextoLogComponent } from "../logger/v2/types.js";
5
5
  import { SessionError } from "./errors.js";
6
+ function defaultSessionLoggerFactory(options) {
7
+ return options.baseLogger.createChild(DextoLogComponent.SESSION);
8
+ }
6
9
  class SessionManager {
7
10
  constructor(services, config = {}, logger) {
8
11
  this.services = services;
9
12
  this.maxSessions = config.maxSessions ?? 100;
10
13
  this.sessionTTL = config.sessionTTL ?? 36e5;
14
+ this.sessionLoggerFactory = config.sessionLoggerFactory ?? defaultSessionLoggerFactory;
11
15
  this.logger = logger.createChild(DextoLogComponent.SESSION);
12
16
  }
13
17
  sessions = /* @__PURE__ */ new Map();
@@ -21,6 +25,7 @@ class SessionManager {
21
25
  // Per-session mutex for token usage updates to prevent lost updates from concurrent calls
22
26
  tokenUsageLocks = /* @__PURE__ */ new Map();
23
27
  logger;
28
+ sessionLoggerFactory;
24
29
  /**
25
30
  * Initialize the SessionManager with persistent storage.
26
31
  * This must be called before using any session operations.
@@ -117,10 +122,34 @@ class SessionManager {
117
122
  const existingMetadata = await this.services.storageManager.getDatabase().get(sessionKey);
118
123
  if (existingMetadata) {
119
124
  await this.updateSessionActivity(id);
125
+ const runtimeConfig = this.services.stateManager.getRuntimeConfig();
126
+ const agentId = runtimeConfig.agentCard?.name ?? runtimeConfig.agentId;
127
+ const sessionLogger = this.sessionLoggerFactory({
128
+ baseLogger: this.logger,
129
+ agentId,
130
+ sessionId: id
131
+ });
132
+ const sessionData2 = await this.services.storageManager.getDatabase().get(sessionKey);
133
+ if (sessionData2?.llmOverride) {
134
+ const { resolveApiKeyForProvider } = await import("../utils/api-key-resolver.js");
135
+ const apiKey = resolveApiKeyForProvider(sessionData2.llmOverride.provider);
136
+ if (!apiKey) {
137
+ this.logger.warn(
138
+ `Skipped LLM override restore for session ${id}: missing API key for provider ${sessionData2.llmOverride.provider}`,
139
+ { sessionId: id, provider: sessionData2.llmOverride.provider }
140
+ );
141
+ } else {
142
+ const restoredConfig = {
143
+ ...sessionData2.llmOverride,
144
+ apiKey
145
+ };
146
+ this.services.stateManager.updateLLM(restoredConfig, id);
147
+ }
148
+ }
120
149
  const session2 = new ChatSession(
121
150
  { ...this.services, sessionManager: this },
122
151
  id,
123
- this.logger
152
+ sessionLogger
124
153
  );
125
154
  await session2.init();
126
155
  this.sessions.set(id, session2);
@@ -147,7 +176,18 @@ class SessionManager {
147
176
  }
148
177
  let session;
149
178
  try {
150
- session = new ChatSession({ ...this.services, sessionManager: this }, id, this.logger);
179
+ const runtimeConfig = this.services.stateManager.getRuntimeConfig();
180
+ const agentId = runtimeConfig.agentCard?.name ?? runtimeConfig.agentId;
181
+ const sessionLogger = this.sessionLoggerFactory({
182
+ baseLogger: this.logger,
183
+ agentId,
184
+ sessionId: id
185
+ });
186
+ session = new ChatSession(
187
+ { ...this.services, sessionManager: this },
188
+ id,
189
+ sessionLogger
190
+ );
151
191
  await session.init();
152
192
  this.sessions.set(id, session);
153
193
  await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
@@ -182,10 +222,33 @@ class SessionManager {
182
222
  const sessionKey = `session:${sessionId}`;
183
223
  const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
184
224
  if (sessionData) {
225
+ const runtimeConfig = this.services.stateManager.getRuntimeConfig();
226
+ const agentId = runtimeConfig.agentCard?.name ?? runtimeConfig.agentId;
227
+ const sessionLogger = this.sessionLoggerFactory({
228
+ baseLogger: this.logger,
229
+ agentId,
230
+ sessionId
231
+ });
232
+ if (sessionData.llmOverride) {
233
+ const { resolveApiKeyForProvider } = await import("../utils/api-key-resolver.js");
234
+ const apiKey = resolveApiKeyForProvider(sessionData.llmOverride.provider);
235
+ if (!apiKey) {
236
+ this.logger.warn(
237
+ `Skipped LLM override restore for session ${sessionId}: missing API key for provider ${sessionData.llmOverride.provider}`,
238
+ { sessionId, provider: sessionData.llmOverride.provider }
239
+ );
240
+ } else {
241
+ const restoredConfig = {
242
+ ...sessionData.llmOverride,
243
+ apiKey
244
+ };
245
+ this.services.stateManager.updateLLM(restoredConfig, sessionId);
246
+ }
247
+ }
185
248
  const session = new ChatSession(
186
249
  { ...this.services, sessionManager: this },
187
250
  sessionId,
188
- this.logger
251
+ sessionLogger
189
252
  );
190
253
  await session.init();
191
254
  this.sessions.set(sessionId, session);
@@ -472,6 +535,14 @@ class SessionManager {
472
535
  throw SessionError.notFound(sessionId);
473
536
  }
474
537
  await session.switchLLM(newLLMConfig);
538
+ const sessionKey = `session:${sessionId}`;
539
+ const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
540
+ if (sessionData) {
541
+ const { apiKey: _apiKey, ...configWithoutApiKey } = newLLMConfig;
542
+ sessionData.llmOverride = configWithoutApiKey;
543
+ await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
544
+ await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
545
+ }
475
546
  this.services.agentEventBus.emit("llm:switched", {
476
547
  newConfig: newLLMConfig,
477
548
  historyRetained: true,
@@ -4,6 +4,7 @@ export interface QueuedMessage {
4
4
  content: ContentPart[];
5
5
  queuedAt: number;
6
6
  metadata?: Record<string, unknown>;
7
+ kind?: 'default' | 'background';
7
8
  }
8
9
  export interface CoalescedMessage {
9
10
  messages: QueuedMessage[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACxB"}
@@ -21,6 +21,7 @@ __export(contributors_exports, {
21
21
  DynamicContributor: () => DynamicContributor,
22
22
  FileContributor: () => FileContributor,
23
23
  MemoryContributor: () => MemoryContributor,
24
+ SkillsContributor: () => SkillsContributor,
24
25
  StaticContributor: () => StaticContributor
25
26
  });
26
27
  module.exports = __toCommonJS(contributors_exports);
@@ -191,10 +192,51 @@ ${memoryList}`;
191
192
  }
192
193
  }
193
194
  }
195
+ class SkillsContributor {
196
+ constructor(id, priority, promptManager, logger) {
197
+ this.id = id;
198
+ this.priority = priority;
199
+ this.promptManager = promptManager;
200
+ this.logger = logger;
201
+ this.logger.debug(`[SkillsContributor] Created "${id}"`);
202
+ }
203
+ logger;
204
+ async getContent(_context) {
205
+ try {
206
+ const skills = await this.promptManager.listAutoInvocablePrompts();
207
+ const skillEntries = Object.entries(skills);
208
+ if (skillEntries.length === 0) {
209
+ return "";
210
+ }
211
+ const skillsList = skillEntries.map(([_key, info]) => {
212
+ const name = info.displayName || info.name;
213
+ const desc = info.description ? ` - ${info.description}` : "";
214
+ return `- ${name}${desc}`;
215
+ }).join("\n");
216
+ const result = `## Available Skills
217
+
218
+ You can invoke the following skills using the \`invoke_skill\` tool when they are relevant to the task:
219
+
220
+ ${skillsList}
221
+
222
+ To use a skill, call invoke_skill with the skill name. The skill will provide specialized instructions for the task.`;
223
+ this.logger.debug(
224
+ `[SkillsContributor] Listed ${skillEntries.length} skills in system prompt`
225
+ );
226
+ return result;
227
+ } catch (error) {
228
+ this.logger.error(
229
+ `[SkillsContributor] Failed to list skills: ${error instanceof Error ? error.message : String(error)}`
230
+ );
231
+ return "";
232
+ }
233
+ }
234
+ }
194
235
  // Annotate the CommonJS export names for ESM import in node:
195
236
  0 && (module.exports = {
196
237
  DynamicContributor,
197
238
  FileContributor,
198
239
  MemoryContributor,
240
+ SkillsContributor,
199
241
  StaticContributor
200
242
  });
@@ -1,6 +1,7 @@
1
1
  import { SystemPromptContributor, DynamicContributorContext } from './types.js';
2
2
  import type { IDextoLogger } from '../logger/v2/types.js';
3
3
  import type { MemoryManager } from '../memory/index.js';
4
+ import type { PromptManager } from '../prompts/prompt-manager.js';
4
5
  export declare class StaticContributor implements SystemPromptContributor {
5
6
  id: string;
6
7
  priority: number;
@@ -58,4 +59,16 @@ export declare class MemoryContributor implements SystemPromptContributor {
58
59
  constructor(id: string, priority: number, memoryManager: MemoryManager, options: MemoryContributorOptions | undefined, logger: IDextoLogger);
59
60
  getContent(_context: DynamicContributorContext): Promise<string>;
60
61
  }
62
+ /**
63
+ * SkillsContributor lists available skills that the LLM can invoke via the invoke_skill tool.
64
+ * This enables the LLM to know what skills are available without hardcoding them.
65
+ */
66
+ export declare class SkillsContributor implements SystemPromptContributor {
67
+ id: string;
68
+ priority: number;
69
+ private promptManager;
70
+ private logger;
71
+ constructor(id: string, priority: number, promptManager: PromptManager, logger: IDextoLogger);
72
+ getContent(_context: DynamicContributorContext): Promise<string>;
73
+ }
61
74
  //# sourceMappingURL=contributors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contributors.d.ts","sourceRoot":"","sources":["../../src/systemPrompt/contributors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,qBAAa,iBAAkB,YAAW,uBAAuB;IAElD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,OAAO;gBAFR,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;IAGrB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGzE;AAED,qBAAa,kBAAmB,YAAW,uBAAuB;IAEnD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,eAAe;gBAFhB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,eAAe,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,MAAM,CAAC;IAG9E,UAAU,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGxE;AAED,MAAM,WAAW,sBAAsB;IACnC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,qBAAa,eAAgB,YAAW,uBAAuB;IAMhD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IAPnB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,MAAM,CAAe;gBAGlB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,sBAAsB,YAAK,EAC5C,MAAM,EAAE,YAAY;IAMlB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6FzE;AAED,MAAM,WAAW,wBAAwB;IACrC,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IAIlD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IANnB,OAAO,CAAC,MAAM,CAAe;gBAGlB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,wBAAwB,YAAK,EAC9C,MAAM,EAAE,YAAY;IAQlB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAmDzE"}
1
+ {"version":3,"file":"contributors.d.ts","sourceRoot":"","sources":["../../src/systemPrompt/contributors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,qBAAa,iBAAkB,YAAW,uBAAuB;IAElD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,OAAO;gBAFR,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;IAGrB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGzE;AAED,qBAAa,kBAAmB,YAAW,uBAAuB;IAEnD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,eAAe;gBAFhB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,eAAe,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,MAAM,CAAC;IAG9E,UAAU,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGxE;AAED,MAAM,WAAW,sBAAsB;IACnC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,qBAAa,eAAgB,YAAW,uBAAuB;IAMhD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IAPnB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,MAAM,CAAe;gBAGlB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,sBAAsB,YAAK,EAC5C,MAAM,EAAE,YAAY;IAMlB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6FzE;AAED,MAAM,WAAW,wBAAwB;IACrC,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IAIlD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IANnB,OAAO,CAAC,MAAM,CAAe;gBAGlB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,wBAAwB,YAAK,EAC9C,MAAM,EAAE,YAAY;IAQlB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAmDzE;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,uBAAuB;IAIlD,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IACvB,OAAO,CAAC,aAAa;IALzB,OAAO,CAAC,MAAM,CAAe;gBAGlB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,EACpC,MAAM,EAAE,YAAY;IAMlB,UAAU,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoCzE"}
@@ -166,9 +166,50 @@ ${memoryList}`;
166
166
  }
167
167
  }
168
168
  }
169
+ class SkillsContributor {
170
+ constructor(id, priority, promptManager, logger) {
171
+ this.id = id;
172
+ this.priority = priority;
173
+ this.promptManager = promptManager;
174
+ this.logger = logger;
175
+ this.logger.debug(`[SkillsContributor] Created "${id}"`);
176
+ }
177
+ logger;
178
+ async getContent(_context) {
179
+ try {
180
+ const skills = await this.promptManager.listAutoInvocablePrompts();
181
+ const skillEntries = Object.entries(skills);
182
+ if (skillEntries.length === 0) {
183
+ return "";
184
+ }
185
+ const skillsList = skillEntries.map(([_key, info]) => {
186
+ const name = info.displayName || info.name;
187
+ const desc = info.description ? ` - ${info.description}` : "";
188
+ return `- ${name}${desc}`;
189
+ }).join("\n");
190
+ const result = `## Available Skills
191
+
192
+ You can invoke the following skills using the \`invoke_skill\` tool when they are relevant to the task:
193
+
194
+ ${skillsList}
195
+
196
+ To use a skill, call invoke_skill with the skill name. The skill will provide specialized instructions for the task.`;
197
+ this.logger.debug(
198
+ `[SkillsContributor] Listed ${skillEntries.length} skills in system prompt`
199
+ );
200
+ return result;
201
+ } catch (error) {
202
+ this.logger.error(
203
+ `[SkillsContributor] Failed to list skills: ${error instanceof Error ? error.message : String(error)}`
204
+ );
205
+ return "";
206
+ }
207
+ }
208
+ }
169
209
  export {
170
210
  DynamicContributor,
171
211
  FileContributor,
172
212
  MemoryContributor,
213
+ SkillsContributor,
173
214
  StaticContributor
174
215
  };
@@ -51,14 +51,18 @@ class ToolError {
51
51
  }
52
52
  /**
53
53
  * Tool execution denied by user/policy
54
+ * @param toolName - Name of the tool that was denied
55
+ * @param sessionId - Optional session ID
56
+ * @param userMessage - Optional message from user (e.g., feedback for plan review)
54
57
  */
55
- static executionDenied(toolName, sessionId) {
58
+ static executionDenied(toolName, sessionId, userMessage) {
59
+ const message = userMessage ? `Tool '${toolName}' was denied. ${userMessage}` : `Tool '${toolName}' execution was denied by the user`;
56
60
  return new import_DextoRuntimeError.DextoRuntimeError(
57
61
  import_error_codes.ToolErrorCode.EXECUTION_DENIED,
58
62
  import_types.ErrorScope.TOOLS,
59
63
  import_types.ErrorType.FORBIDDEN,
60
- `Tool '${toolName}' execution was denied by the user`,
61
- { toolName, sessionId }
64
+ message,
65
+ { toolName, sessionId, userMessage }
62
66
  );
63
67
  }
64
68
  /**
@@ -20,10 +20,14 @@ export declare class ToolError {
20
20
  }>;
21
21
  /**
22
22
  * Tool execution denied by user/policy
23
+ * @param toolName - Name of the tool that was denied
24
+ * @param sessionId - Optional session ID
25
+ * @param userMessage - Optional message from user (e.g., feedback for plan review)
23
26
  */
24
- static executionDenied(toolName: string, sessionId?: string): DextoRuntimeError<{
27
+ static executionDenied(toolName: string, sessionId?: string, userMessage?: string): DextoRuntimeError<{
25
28
  toolName: string;
26
29
  sessionId: string | undefined;
30
+ userMessage: string | undefined;
27
31
  }>;
28
32
  /**
29
33
  * Directory access denied by user
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tools/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE;;;GAGG;AACH,qBAAa,SAAS;IAClB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;IAUhC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU3E;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAU3D;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAWlE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAc/E;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;IAU3F;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;IAelE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAUxD;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM;;;IAUlD;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAUlF;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUnD;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM;;;IAUnD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;IAUpC;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAU7D;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,EACzB,OAAO,EAAE,MAAM,GAChB,iBAAiB,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAcrE;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAW3F;;OAEG;IACH,MAAM,CAAC,mCAAmC,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;CAU9E"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tools/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAItE;;;GAGG;AACH,qBAAa,SAAS;IAClB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;IAUhC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAU3E;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;;IAajF;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAWlE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAc/E;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;IAU3F;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;IAelE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;IAUxD;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM;;;IAUlD;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAUlF;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAUnD;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,MAAM;;;IAUnD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM;IAUpC;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;IAU7D;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,EACzB,OAAO,EAAE,MAAM,GAChB,iBAAiB,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAcrE;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,iBAAiB;IAW3F;;OAEG;IACH,MAAM,CAAC,mCAAmC,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;CAU9E"}
@@ -29,14 +29,18 @@ class ToolError {
29
29
  }
30
30
  /**
31
31
  * Tool execution denied by user/policy
32
+ * @param toolName - Name of the tool that was denied
33
+ * @param sessionId - Optional session ID
34
+ * @param userMessage - Optional message from user (e.g., feedback for plan review)
32
35
  */
33
- static executionDenied(toolName, sessionId) {
36
+ static executionDenied(toolName, sessionId, userMessage) {
37
+ const message = userMessage ? `Tool '${toolName}' was denied. ${userMessage}` : `Tool '${toolName}' execution was denied by the user`;
34
38
  return new DextoRuntimeError(
35
39
  ToolErrorCode.EXECUTION_DENIED,
36
40
  ErrorScope.TOOLS,
37
41
  ErrorType.FORBIDDEN,
38
- `Tool '${toolName}' execution was denied by the user`,
39
- { toolName, sessionId }
42
+ message,
43
+ { toolName, sessionId, userMessage }
40
44
  );
41
45
  }
42
46
  /**
@@ -26,7 +26,8 @@ const INTERNAL_TOOL_NAMES = [
26
26
  "ask_user",
27
27
  "delegate_to_url",
28
28
  "list_resources",
29
- "get_resource"
29
+ "get_resource",
30
+ "invoke_skill"
30
31
  ];
31
32
  // Annotate the CommonJS export names for ESM import in node:
32
33
  0 && (module.exports = {
@@ -7,6 +7,6 @@
7
7
  * Available internal tool names
8
8
  * Must be kept in sync with INTERNAL_TOOL_REGISTRY in registry.ts
9
9
  */
10
- export declare const INTERNAL_TOOL_NAMES: readonly ["search_history", "ask_user", "delegate_to_url", "list_resources", "get_resource"];
10
+ export declare const INTERNAL_TOOL_NAMES: readonly ["search_history", "ask_user", "delegate_to_url", "list_resources", "get_resource", "invoke_skill"];
11
11
  export type KnownInternalTool = (typeof INTERNAL_TOOL_NAMES)[number];
12
12
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/tools/internal-tools/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,8FAMtB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/tools/internal-tools/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,8GAOtB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -4,7 +4,8 @@ const INTERNAL_TOOL_NAMES = [
4
4
  "ask_user",
5
5
  "delegate_to_url",
6
6
  "list_resources",
7
- "get_resource"
7
+ "get_resource",
8
+ "invoke_skill"
8
9
  ];
9
10
  export {
10
11
  INTERNAL_TOOL_NAMES
@@ -0,0 +1,140 @@
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 invoke_skill_tool_exports = {};
20
+ __export(invoke_skill_tool_exports, {
21
+ createInvokeSkillTool: () => createInvokeSkillTool
22
+ });
23
+ module.exports = __toCommonJS(invoke_skill_tool_exports);
24
+ var import_zod = require("zod");
25
+ var import_utils = require("../../../prompts/utils.js");
26
+ const InvokeSkillInputSchema = import_zod.z.object({
27
+ skill: import_zod.z.string().min(1, "Skill name is required").describe(
28
+ 'The name of the skill to invoke (e.g., "plugin-name:skill-name" or "skill-name")'
29
+ ),
30
+ args: import_zod.z.record(import_zod.z.string()).optional().describe("Optional arguments to pass to the skill"),
31
+ taskContext: import_zod.z.string().optional().describe(
32
+ "Context about what task this skill should accomplish. Recommended for forked skills to provide context since they run in isolation without conversation history."
33
+ )
34
+ }).strict();
35
+ function createInvokeSkillTool(services) {
36
+ return {
37
+ id: "invoke_skill",
38
+ description: buildToolDescription(),
39
+ inputSchema: InvokeSkillInputSchema,
40
+ execute: async (input, context) => {
41
+ const { skill, args, taskContext } = input;
42
+ const promptManager = services.promptManager;
43
+ if (!promptManager) {
44
+ return {
45
+ error: "PromptManager not available. This is a configuration error."
46
+ };
47
+ }
48
+ const autoInvocable = await promptManager.listAutoInvocablePrompts();
49
+ let skillKey;
50
+ for (const key of Object.keys(autoInvocable)) {
51
+ const info = autoInvocable[key];
52
+ if (!info) continue;
53
+ if (key === skill || info.displayName === skill || info.commandName === skill || info.name === skill) {
54
+ skillKey = key;
55
+ break;
56
+ }
57
+ }
58
+ if (!skillKey) {
59
+ return {
60
+ error: `Skill '${skill}' not found or not available for model invocation. Use a skill from the available list.`,
61
+ availableSkills: Object.keys(autoInvocable)
62
+ };
63
+ }
64
+ const promptDef = await promptManager.getPromptDefinition(skillKey);
65
+ const promptResult = await promptManager.getPrompt(skillKey, args);
66
+ const flattened = (0, import_utils.flattenPromptResult)(promptResult);
67
+ const content = flattened.text;
68
+ if (promptDef?.context === "fork") {
69
+ const taskForker = services.taskForker;
70
+ if (!taskForker) {
71
+ return {
72
+ error: `Skill '${skill}' requires fork execution (context: fork), but agent spawning is not available. Configure agent-spawner custom tool to enable forked skills.`,
73
+ skill: skillKey
74
+ };
75
+ }
76
+ let instructions;
77
+ if (taskContext) {
78
+ instructions = `## Task Context
79
+ ${taskContext}
80
+
81
+ ## Skill Instructions
82
+ ${content}`;
83
+ } else {
84
+ instructions = content;
85
+ }
86
+ const forkOptions = {
87
+ task: `Skill: ${skill}`,
88
+ instructions,
89
+ // Fork skills auto-approve by default since they run in isolation
90
+ autoApprove: true
91
+ };
92
+ if (promptDef.agent) {
93
+ forkOptions.agentId = promptDef.agent;
94
+ }
95
+ if (context?.toolCallId) {
96
+ forkOptions.toolCallId = context.toolCallId;
97
+ }
98
+ if (context?.sessionId) {
99
+ forkOptions.sessionId = context.sessionId;
100
+ }
101
+ const result = await taskForker.fork(forkOptions);
102
+ if (result.success) {
103
+ return result.response ?? "Task completed successfully.";
104
+ } else {
105
+ return `Error: ${result.error ?? "Unknown error during forked execution"}`;
106
+ }
107
+ }
108
+ return {
109
+ skill: skillKey,
110
+ content,
111
+ instructions: "Follow the instructions in the skill content above to complete the task."
112
+ };
113
+ }
114
+ };
115
+ }
116
+ function buildToolDescription() {
117
+ return `Invoke a skill to load and execute specialized instructions for a task. Skills are predefined prompts that guide how to handle specific scenarios.
118
+
119
+ When to use:
120
+ - When you recognize a task that matches an available skill
121
+ - When you need specialized guidance for a complex operation
122
+ - When the user references a skill by name
123
+
124
+ Parameters:
125
+ - skill: The name of the skill to invoke
126
+ - args: Optional arguments to pass to the skill (e.g., for $ARGUMENTS substitution)
127
+ - taskContext: Context about what you're trying to accomplish (important for forked skills that run in isolation)
128
+
129
+ Execution modes:
130
+ - **Inline skills**: Return instructions for you to follow in the current conversation
131
+ - **Fork skills**: Automatically execute in an isolated subagent and return the result (no additional tool calls needed)
132
+
133
+ Fork skills run in complete isolation without access to conversation history. They're useful for tasks that should run independently.
134
+
135
+ Available skills are listed in your system prompt. Use the skill name exactly as shown.`;
136
+ }
137
+ // Annotate the CommonJS export names for ESM import in node:
138
+ 0 && (module.exports = {
139
+ createInvokeSkillTool
140
+ });
@@ -0,0 +1,24 @@
1
+ import type { InternalTool } from '../../types.js';
2
+ import type { InternalToolsServices } from '../registry.js';
3
+ /**
4
+ * Internal tool for invoking skills/prompts during agent execution.
5
+ *
6
+ * This tool allows the LLM to load and execute skills that are registered
7
+ * with the PromptManager. Skills are prompts that can be auto-invoked by
8
+ * the model (not disabled via `disableModelInvocation`).
9
+ *
10
+ * Execution modes:
11
+ * - **inline** (default): Skill content is returned for the LLM to follow in the current session
12
+ * - **fork**: Skill is executed in an isolated subagent with no conversation history access
13
+ *
14
+ * Usage:
15
+ * - The LLM sees available skills in its system prompt
16
+ * - When a skill is relevant, the LLM calls this tool with the skill name
17
+ * - For inline skills: content is returned for the LLM to follow
18
+ * - For forked skills: execution happens in isolation and result is returned
19
+ *
20
+ * Note: Takes services object (not individual deps) to support late-binding of taskForker.
21
+ * The taskForker may be set after tool creation when agent-spawner custom tool is registered.
22
+ */
23
+ export declare function createInvokeSkillTool(services: InternalToolsServices): InternalTool;
24
+ //# sourceMappingURL=invoke-skill-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke-skill-tool.d.ts","sourceRoot":"","sources":["../../../../src/tools/internal-tools/implementations/invoke-skill-tool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAuB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,YAAY,CAqHnF"}