@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.
- package/dist/agent/DextoAgent.cjs +189 -30
- package/dist/agent/DextoAgent.d.ts +44 -9
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +190 -31
- package/dist/agent/schemas.cjs +5 -0
- package/dist/agent/schemas.d.ts +456 -66
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/agent/schemas.js +5 -0
- package/dist/context/manager.cjs +1 -1
- package/dist/context/manager.js +1 -1
- package/dist/context/utils.cjs +90 -17
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +90 -17
- package/dist/errors/types.cjs +2 -1
- package/dist/errors/types.d.ts +2 -1
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/errors/types.js +2 -1
- package/dist/events/index.cjs +4 -1
- package/dist/events/index.d.ts +37 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +4 -1
- package/dist/image/types.d.ts +15 -0
- package/dist/image/types.d.ts.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/llm/curation-config.cjs +82 -0
- package/dist/llm/curation-config.d.ts +13 -0
- package/dist/llm/curation-config.d.ts.map +1 -0
- package/dist/llm/curation-config.js +59 -0
- package/dist/llm/curation.cjs +57 -0
- package/dist/llm/curation.d.ts +16 -0
- package/dist/llm/curation.d.ts.map +1 -0
- package/dist/llm/curation.js +34 -0
- package/dist/llm/error-codes.cjs +1 -0
- package/dist/llm/error-codes.d.ts +1 -0
- package/dist/llm/error-codes.d.ts.map +1 -1
- package/dist/llm/error-codes.js +1 -0
- package/dist/llm/errors.cjs +16 -1
- package/dist/llm/errors.d.ts +15 -8
- package/dist/llm/errors.d.ts.map +1 -1
- package/dist/llm/errors.js +16 -1
- package/dist/llm/executor/provider-options.cjs +1 -1
- package/dist/llm/executor/provider-options.js +1 -1
- package/dist/llm/executor/turn-executor.cjs +35 -2
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +35 -2
- package/dist/llm/index.cjs +14 -3
- package/dist/llm/index.d.ts +3 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +13 -2
- package/dist/llm/registry/auto-update.cjs +263 -0
- package/dist/llm/registry/auto-update.d.ts +27 -0
- package/dist/llm/registry/auto-update.d.ts.map +1 -0
- package/dist/llm/registry/auto-update.js +227 -0
- package/dist/llm/registry/index.cjs +806 -0
- package/dist/llm/{registry.d.ts → registry/index.d.ts} +67 -13
- package/dist/llm/registry/index.d.ts.map +1 -0
- package/dist/llm/registry/index.js +756 -0
- package/dist/llm/registry/models.generated.cjs +4861 -0
- package/dist/llm/registry/models.generated.d.ts +431 -0
- package/dist/llm/registry/models.generated.d.ts.map +1 -0
- package/dist/llm/registry/models.generated.js +4838 -0
- package/dist/llm/registry/models.manual.cjs +44 -0
- package/dist/llm/registry/models.manual.d.ts +22 -0
- package/dist/llm/registry/models.manual.d.ts.map +1 -0
- package/dist/llm/registry/models.manual.js +21 -0
- package/dist/llm/registry/sync.cjs +354 -0
- package/dist/llm/registry/sync.d.ts +41 -0
- package/dist/llm/registry/sync.d.ts.map +1 -0
- package/dist/llm/registry/sync.js +328 -0
- package/dist/llm/resolver.cjs +29 -7
- package/dist/llm/resolver.d.ts +1 -1
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +31 -8
- package/dist/llm/schemas.cjs +13 -1
- package/dist/llm/schemas.d.ts +59 -59
- package/dist/llm/schemas.d.ts.map +1 -1
- package/dist/llm/schemas.js +14 -1
- package/dist/llm/services/factory.cjs +43 -27
- package/dist/llm/services/factory.d.ts +20 -1
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +44 -28
- package/dist/llm/services/test-utils.integration.cjs +5 -1
- package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
- package/dist/llm/services/test-utils.integration.js +5 -1
- package/dist/llm/services/vercel.cjs +4 -1
- package/dist/llm/services/vercel.d.ts +1 -0
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +4 -1
- package/dist/llm/types.cjs +5 -2
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +5 -2
- package/dist/llm/validation.cjs +1 -1
- package/dist/llm/validation.js +1 -1
- package/dist/logger/v2/dexto-logger.cjs +4 -0
- package/dist/logger/v2/dexto-logger.d.ts +3 -0
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/dexto-logger.js +4 -0
- package/dist/logger/v2/types.d.ts +2 -0
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/mcp/error-codes.cjs +1 -0
- package/dist/mcp/error-codes.d.ts +1 -0
- package/dist/mcp/error-codes.d.ts.map +1 -1
- package/dist/mcp/error-codes.js +1 -0
- package/dist/mcp/errors.cjs +13 -0
- package/dist/mcp/errors.d.ts +7 -0
- package/dist/mcp/errors.d.ts.map +1 -1
- package/dist/mcp/errors.js +13 -0
- package/dist/mcp/manager.cjs +46 -4
- package/dist/mcp/manager.d.ts +10 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +46 -4
- package/dist/mcp/mcp-client.cjs +89 -5
- package/dist/mcp/mcp-client.d.ts +5 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +89 -5
- package/dist/mcp/schemas.cjs +6 -1
- package/dist/mcp/schemas.d.ts +1 -1
- package/dist/mcp/schemas.d.ts.map +1 -1
- package/dist/mcp/schemas.js +6 -1
- package/dist/mcp/types.d.ts +5 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.cjs +90 -4
- package/dist/prompts/prompt-manager.d.ts +16 -6
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.js +90 -4
- package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +105 -11
- package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/custom-prompt-provider.js +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
- package/dist/prompts/schemas.cjs +28 -2
- package/dist/prompts/schemas.d.ts +130 -0
- package/dist/prompts/schemas.d.ts.map +1 -1
- package/dist/prompts/schemas.js +28 -2
- package/dist/prompts/types.d.ts +55 -3
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.cjs +25 -0
- package/dist/resources/handlers/filesystem-handler.d.ts +1 -0
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.js +25 -0
- package/dist/session/chat-session.cjs +1 -1
- package/dist/session/chat-session.d.ts +1 -1
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/message-queue.cjs +29 -5
- package/dist/session/message-queue.d.ts +3 -1
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +29 -5
- package/dist/session/session-manager.cjs +84 -3
- package/dist/session/session-manager.d.ts +12 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +74 -3
- package/dist/session/types.d.ts +1 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.cjs +42 -0
- package/dist/systemPrompt/contributors.d.ts +13 -0
- package/dist/systemPrompt/contributors.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.js +41 -0
- package/dist/tools/errors.cjs +7 -3
- package/dist/tools/errors.d.ts +5 -1
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +7 -3
- package/dist/tools/internal-tools/constants.cjs +2 -1
- package/dist/tools/internal-tools/constants.d.ts +1 -1
- package/dist/tools/internal-tools/constants.d.ts.map +1 -1
- package/dist/tools/internal-tools/constants.js +2 -1
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
- package/dist/tools/internal-tools/provider.cjs +15 -0
- package/dist/tools/internal-tools/provider.d.ts +15 -1
- package/dist/tools/internal-tools/provider.d.ts.map +1 -1
- package/dist/tools/internal-tools/provider.js +15 -0
- package/dist/tools/internal-tools/registry.cjs +6 -0
- package/dist/tools/internal-tools/registry.d.ts +35 -1
- package/dist/tools/internal-tools/registry.d.ts.map +1 -1
- package/dist/tools/internal-tools/registry.js +6 -0
- package/dist/tools/schemas.d.ts +1 -1
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/tool-call-metadata.cjs +75 -0
- package/dist/tools/tool-call-metadata.d.ts +16 -0
- package/dist/tools/tool-call-metadata.d.ts.map +1 -0
- package/dist/tools/tool-call-metadata.js +51 -0
- package/dist/tools/tool-manager.cjs +481 -103
- package/dist/tools/tool-manager.d.ts +131 -9
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +482 -104
- package/dist/utils/api-key-resolver.cjs +5 -2
- package/dist/utils/api-key-resolver.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.js +5 -2
- package/dist/utils/env.cjs +49 -0
- package/dist/utils/env.d.ts +4 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +24 -0
- package/dist/utils/index.cjs +3 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/service-initializer.cjs +25 -7
- package/dist/utils/service-initializer.d.ts +24 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +25 -7
- package/package.json +6 -2
- package/dist/llm/registry.cjs +0 -1631
- package/dist/llm/registry.d.ts.map +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/dist/session/types.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
1
|
+
{"version":3,"file":"contributors.d.ts","sourceRoot":"","sources":["../../src/systemPrompt/contributors.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
};
|
package/dist/tools/errors.cjs
CHANGED
|
@@ -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
|
-
|
|
61
|
-
{ toolName, sessionId }
|
|
64
|
+
message,
|
|
65
|
+
{ toolName, sessionId, userMessage }
|
|
62
66
|
);
|
|
63
67
|
}
|
|
64
68
|
/**
|
package/dist/tools/errors.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/tools/errors.js
CHANGED
|
@@ -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
|
-
|
|
39
|
-
{ toolName, sessionId }
|
|
42
|
+
message,
|
|
43
|
+
{ toolName, sessionId, userMessage }
|
|
40
44
|
);
|
|
41
45
|
}
|
|
42
46
|
/**
|
|
@@ -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,
|
|
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"}
|
|
@@ -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"}
|