@dexto/server 1.5.7 → 1.6.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.
- package/dist/events/a2a-sse-subscriber.d.ts +1 -1
- package/dist/hono/__tests__/test-fixtures.cjs +27 -6
- package/dist/hono/__tests__/test-fixtures.d.ts +2 -1
- package/dist/hono/__tests__/test-fixtures.d.ts.map +1 -1
- package/dist/hono/__tests__/test-fixtures.js +31 -6
- package/dist/hono/index.cjs +17 -2
- package/dist/hono/index.d.ts +897 -76
- package/dist/hono/index.d.ts.map +1 -1
- package/dist/hono/index.js +17 -2
- package/dist/hono/routes/a2a-tasks.d.ts +6 -6
- package/dist/hono/routes/agents.cjs +38 -27
- package/dist/hono/routes/agents.d.ts +2 -1
- package/dist/hono/routes/agents.d.ts.map +1 -1
- package/dist/hono/routes/agents.js +37 -31
- package/dist/hono/routes/discovery.cjs +99 -22
- package/dist/hono/routes/discovery.d.ts +14 -12
- package/dist/hono/routes/discovery.d.ts.map +1 -1
- package/dist/hono/routes/discovery.js +89 -22
- package/dist/hono/routes/key.d.ts +4 -4
- package/dist/hono/routes/llm.cjs +21 -7
- package/dist/hono/routes/llm.d.ts +12 -10
- package/dist/hono/routes/llm.d.ts.map +1 -1
- package/dist/hono/routes/llm.js +22 -7
- package/dist/hono/routes/mcp.cjs +96 -14
- package/dist/hono/routes/mcp.d.ts +138 -3
- package/dist/hono/routes/mcp.d.ts.map +1 -1
- package/dist/hono/routes/mcp.js +97 -15
- package/dist/hono/routes/memory.d.ts +4 -4
- package/dist/hono/routes/messages.d.ts +1 -1
- package/dist/hono/routes/models.d.ts +1 -1
- package/dist/hono/routes/queue.cjs +9 -3
- package/dist/hono/routes/queue.d.ts +3 -0
- package/dist/hono/routes/queue.d.ts.map +1 -1
- package/dist/hono/routes/queue.js +9 -3
- package/dist/hono/routes/resources.d.ts +1 -1
- package/dist/hono/routes/schedules.cjs +455 -0
- package/dist/hono/routes/schedules.d.ts +472 -0
- package/dist/hono/routes/schedules.d.ts.map +1 -0
- package/dist/hono/routes/schedules.js +439 -0
- package/dist/hono/routes/search.d.ts +3 -3
- package/dist/hono/routes/sessions.cjs +10 -4
- package/dist/hono/routes/sessions.d.ts +136 -6
- package/dist/hono/routes/sessions.d.ts.map +1 -1
- package/dist/hono/routes/sessions.js +10 -4
- package/dist/hono/routes/tools.cjs +12 -19
- package/dist/hono/routes/tools.d.ts +5 -3
- package/dist/hono/routes/tools.d.ts.map +1 -1
- package/dist/hono/routes/tools.js +12 -19
- package/dist/hono/routes/workspaces.cjs +136 -0
- package/dist/hono/routes/workspaces.d.ts +77 -0
- package/dist/hono/routes/workspaces.d.ts.map +1 -0
- package/dist/hono/routes/workspaces.js +112 -0
- package/dist/hono/schemas/responses.cjs +82 -7
- package/dist/hono/schemas/responses.d.ts +403 -53
- package/dist/hono/schemas/responses.d.ts.map +1 -1
- package/dist/hono/schemas/responses.js +75 -6
- package/dist/hono/start-server.cjs +4 -3
- package/dist/hono/start-server.d.ts +15 -6
- package/dist/hono/start-server.d.ts.map +1 -1
- package/dist/hono/start-server.js +5 -4
- package/dist/index.cjs +9 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/mcp/mcp-handler.d.ts +2 -2
- package/dist/mcp/mcp-handler.d.ts.map +1 -1
- package/package.json +8 -5
|
@@ -18,7 +18,7 @@ import { AgentEventBus } from '@dexto/core';
|
|
|
18
18
|
* Usage:
|
|
19
19
|
* ```typescript
|
|
20
20
|
* const sseSubscriber = new A2ASseEventSubscriber();
|
|
21
|
-
*
|
|
21
|
+
* agent.registerSubscriber(sseSubscriber);
|
|
22
22
|
*
|
|
23
23
|
* // In route handler
|
|
24
24
|
* const stream = sseSubscriber.createStream(taskId);
|
|
@@ -36,9 +36,16 @@ __export(test_fixtures_exports, {
|
|
|
36
36
|
validators: () => validators
|
|
37
37
|
});
|
|
38
38
|
module.exports = __toCommonJS(test_fixtures_exports);
|
|
39
|
+
var import_agent_config = require("@dexto/agent-config");
|
|
40
|
+
var import_image_local = __toESM(require("@dexto/image-local"), 1);
|
|
39
41
|
var import_core = require("@dexto/core");
|
|
42
|
+
var import_node_crypto = require("node:crypto");
|
|
43
|
+
var import_node_fs = require("node:fs");
|
|
44
|
+
var import_node_os = __toESM(require("node:os"), 1);
|
|
45
|
+
var import_node_path = __toESM(require("node:path"), 1);
|
|
40
46
|
var import__ = require("../index.js");
|
|
41
47
|
var import_node = require("../node/index.js");
|
|
48
|
+
var import_yaml = require("yaml");
|
|
42
49
|
function createTestAgentConfig() {
|
|
43
50
|
return {
|
|
44
51
|
systemPrompt: "You are a test assistant.",
|
|
@@ -60,7 +67,10 @@ function createTestAgentConfig() {
|
|
|
60
67
|
// Increased to accommodate all integration tests
|
|
61
68
|
sessionTTL: 3600
|
|
62
69
|
},
|
|
63
|
-
|
|
70
|
+
tools: [],
|
|
71
|
+
hooks: [],
|
|
72
|
+
compaction: { type: "noop", enabled: false },
|
|
73
|
+
permissions: {
|
|
64
74
|
mode: "auto-approve",
|
|
65
75
|
timeout: 12e4
|
|
66
76
|
},
|
|
@@ -72,7 +82,14 @@ function createTestAgentConfig() {
|
|
|
72
82
|
}
|
|
73
83
|
async function createTestAgent(config) {
|
|
74
84
|
const agentConfig = config ?? createTestAgentConfig();
|
|
75
|
-
const
|
|
85
|
+
const validatedConfig = import_agent_config.AgentConfigSchema.parse(agentConfig);
|
|
86
|
+
const services = await (0, import_agent_config.resolveServicesFromConfig)(validatedConfig, import_image_local.default);
|
|
87
|
+
const agent = new import_core.DextoAgent(
|
|
88
|
+
(0, import_agent_config.toDextoAgentOptions)({
|
|
89
|
+
config: validatedConfig,
|
|
90
|
+
services
|
|
91
|
+
})
|
|
92
|
+
);
|
|
76
93
|
await agent.start();
|
|
77
94
|
return agent;
|
|
78
95
|
}
|
|
@@ -85,16 +102,19 @@ async function startTestServer(agent, port, agentsContext) {
|
|
|
85
102
|
});
|
|
86
103
|
const getAgent = (_ctx) => agent;
|
|
87
104
|
const getAgentCard = () => agentCard;
|
|
105
|
+
const agentConfigPath = import_node_path.default.join(import_node_os.default.tmpdir(), `dexto-test-agent-${(0, import_node_crypto.randomUUID)()}.yml`);
|
|
106
|
+
await import_node_fs.promises.writeFile(agentConfigPath, (0, import_yaml.stringify)(createTestAgentConfig()), "utf-8");
|
|
88
107
|
const { WebhookEventSubscriber } = await import("../../events/webhook-subscriber.js");
|
|
89
108
|
const { A2ASseEventSubscriber } = await import("../../events/a2a-sse-subscriber.js");
|
|
90
109
|
const { ApprovalCoordinator } = await import("../../approval/approval-coordinator.js");
|
|
91
110
|
const webhookSubscriber = new WebhookEventSubscriber();
|
|
92
111
|
const sseSubscriber = new A2ASseEventSubscriber();
|
|
93
112
|
const approvalCoordinator = new ApprovalCoordinator();
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
agent.registerSubscriber(webhookSubscriber);
|
|
114
|
+
agent.registerSubscriber(sseSubscriber);
|
|
96
115
|
const app = (0, import__.createDextoApp)({
|
|
97
116
|
getAgent,
|
|
117
|
+
getAgentConfigPath: (_ctx) => agentConfigPath,
|
|
98
118
|
getAgentCard,
|
|
99
119
|
approvalCoordinator,
|
|
100
120
|
webhookSubscriber,
|
|
@@ -136,6 +156,7 @@ async function startTestServer(agent, port, agentsContext) {
|
|
|
136
156
|
else resolve();
|
|
137
157
|
});
|
|
138
158
|
});
|
|
159
|
+
await import_node_fs.promises.unlink(agentConfigPath).catch(() => void 0);
|
|
139
160
|
if (agent.isStarted()) {
|
|
140
161
|
await agent.stop();
|
|
141
162
|
}
|
|
@@ -167,8 +188,8 @@ async function findAvailablePort() {
|
|
|
167
188
|
}
|
|
168
189
|
throw new Error(`Could not find an available port starting from ${startPort}`);
|
|
169
190
|
}
|
|
170
|
-
async function httpRequest(baseUrl, method,
|
|
171
|
-
const url = `${baseUrl}${
|
|
191
|
+
async function httpRequest(baseUrl, method, path2, body, headers) {
|
|
192
|
+
const url = `${baseUrl}${path2}`;
|
|
172
193
|
const options = {
|
|
173
194
|
method,
|
|
174
195
|
headers: {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type AgentConfig } from '@dexto/agent-config';
|
|
1
2
|
import { DextoAgent } from '@dexto/core';
|
|
2
|
-
import type {
|
|
3
|
+
import type { AgentCard } from '@dexto/core';
|
|
3
4
|
import type { Server as HttpServer } from 'node:http';
|
|
4
5
|
import type { DextoApp } from '../types.js';
|
|
5
6
|
import { type NodeBridgeResult } from '../node/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-fixtures.d.ts","sourceRoot":"","sources":["../../../src/hono/__tests__/test-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"test-fixtures.d.ts","sourceRoot":"","sources":["../../../src/hono/__tests__/test-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,WAAW,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAKtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CA+BnD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAY/E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,GACvD,OAAO,CAAC,UAAU,CAAC,CA+FrB;AAmCD;;GAEG;AACH,wBAAsB,WAAW,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC,CAmCD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GACpD,IAAI,CAgBN;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;oBACH,OAAO,KAAG,OAAO;oBACjB,OAAO,KAAG,OAAO;qBAChB,OAAO,KAAG,OAAO;mBACnB,OAAO,KAAG,OAAO;oBAChB,OAAO,KAAG,OAAO;4BAET,OAAO,KAAG,OAAO;4BACjB,OAAO,KAAG,OAAO;2BAClB,OAAO,KAAG,OAAO;4BAChB,OAAO,KAAG,OAAO;CAG5C,CAAC"}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AgentConfigSchema,
|
|
3
|
+
resolveServicesFromConfig,
|
|
4
|
+
toDextoAgentOptions
|
|
5
|
+
} from "@dexto/agent-config";
|
|
6
|
+
import imageLocal from "@dexto/image-local";
|
|
1
7
|
import { DextoAgent, createAgentCard } from "@dexto/core";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { promises as fs } from "node:fs";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
2
12
|
import { createDextoApp } from "../index.js";
|
|
3
13
|
import { createNodeServer } from "../node/index.js";
|
|
14
|
+
import { stringify as yamlStringify } from "yaml";
|
|
4
15
|
function createTestAgentConfig() {
|
|
5
16
|
return {
|
|
6
17
|
systemPrompt: "You are a test assistant.",
|
|
@@ -22,7 +33,10 @@ function createTestAgentConfig() {
|
|
|
22
33
|
// Increased to accommodate all integration tests
|
|
23
34
|
sessionTTL: 3600
|
|
24
35
|
},
|
|
25
|
-
|
|
36
|
+
tools: [],
|
|
37
|
+
hooks: [],
|
|
38
|
+
compaction: { type: "noop", enabled: false },
|
|
39
|
+
permissions: {
|
|
26
40
|
mode: "auto-approve",
|
|
27
41
|
timeout: 12e4
|
|
28
42
|
},
|
|
@@ -34,7 +48,14 @@ function createTestAgentConfig() {
|
|
|
34
48
|
}
|
|
35
49
|
async function createTestAgent(config) {
|
|
36
50
|
const agentConfig = config ?? createTestAgentConfig();
|
|
37
|
-
const
|
|
51
|
+
const validatedConfig = AgentConfigSchema.parse(agentConfig);
|
|
52
|
+
const services = await resolveServicesFromConfig(validatedConfig, imageLocal);
|
|
53
|
+
const agent = new DextoAgent(
|
|
54
|
+
toDextoAgentOptions({
|
|
55
|
+
config: validatedConfig,
|
|
56
|
+
services
|
|
57
|
+
})
|
|
58
|
+
);
|
|
38
59
|
await agent.start();
|
|
39
60
|
return agent;
|
|
40
61
|
}
|
|
@@ -47,16 +68,19 @@ async function startTestServer(agent, port, agentsContext) {
|
|
|
47
68
|
});
|
|
48
69
|
const getAgent = (_ctx) => agent;
|
|
49
70
|
const getAgentCard = () => agentCard;
|
|
71
|
+
const agentConfigPath = path.join(os.tmpdir(), `dexto-test-agent-${randomUUID()}.yml`);
|
|
72
|
+
await fs.writeFile(agentConfigPath, yamlStringify(createTestAgentConfig()), "utf-8");
|
|
50
73
|
const { WebhookEventSubscriber } = await import("../../events/webhook-subscriber.js");
|
|
51
74
|
const { A2ASseEventSubscriber } = await import("../../events/a2a-sse-subscriber.js");
|
|
52
75
|
const { ApprovalCoordinator } = await import("../../approval/approval-coordinator.js");
|
|
53
76
|
const webhookSubscriber = new WebhookEventSubscriber();
|
|
54
77
|
const sseSubscriber = new A2ASseEventSubscriber();
|
|
55
78
|
const approvalCoordinator = new ApprovalCoordinator();
|
|
56
|
-
|
|
57
|
-
|
|
79
|
+
agent.registerSubscriber(webhookSubscriber);
|
|
80
|
+
agent.registerSubscriber(sseSubscriber);
|
|
58
81
|
const app = createDextoApp({
|
|
59
82
|
getAgent,
|
|
83
|
+
getAgentConfigPath: (_ctx) => agentConfigPath,
|
|
60
84
|
getAgentCard,
|
|
61
85
|
approvalCoordinator,
|
|
62
86
|
webhookSubscriber,
|
|
@@ -98,6 +122,7 @@ async function startTestServer(agent, port, agentsContext) {
|
|
|
98
122
|
else resolve();
|
|
99
123
|
});
|
|
100
124
|
});
|
|
125
|
+
await fs.unlink(agentConfigPath).catch(() => void 0);
|
|
101
126
|
if (agent.isStarted()) {
|
|
102
127
|
await agent.stop();
|
|
103
128
|
}
|
|
@@ -129,8 +154,8 @@ async function findAvailablePort() {
|
|
|
129
154
|
}
|
|
130
155
|
throw new Error(`Could not find an available port starting from ${startPort}`);
|
|
131
156
|
}
|
|
132
|
-
async function httpRequest(baseUrl, method,
|
|
133
|
-
const url = `${baseUrl}${
|
|
157
|
+
async function httpRequest(baseUrl, method, path2, body, headers) {
|
|
158
|
+
const url = `${baseUrl}${path2}`;
|
|
134
159
|
const options = {
|
|
135
160
|
method,
|
|
136
161
|
headers: {
|
package/dist/hono/index.cjs
CHANGED
|
@@ -37,6 +37,8 @@ var import_webhooks = require("./routes/webhooks.js");
|
|
|
37
37
|
var import_prompts = require("./routes/prompts.js");
|
|
38
38
|
var import_resources = require("./routes/resources.js");
|
|
39
39
|
var import_memory = require("./routes/memory.js");
|
|
40
|
+
var import_workspaces = require("./routes/workspaces.js");
|
|
41
|
+
var import_schedules = require("./routes/schedules.js");
|
|
40
42
|
var import_agents = require("./routes/agents.js");
|
|
41
43
|
var import_approvals = require("./routes/approvals.js");
|
|
42
44
|
var import_queue = require("./routes/queue.js");
|
|
@@ -77,6 +79,7 @@ function createDextoApp(options) {
|
|
|
77
79
|
const {
|
|
78
80
|
apiPrefix,
|
|
79
81
|
getAgent,
|
|
82
|
+
getAgentConfigPath,
|
|
80
83
|
getAgentCard,
|
|
81
84
|
approvalCoordinator,
|
|
82
85
|
webhookSubscriber,
|
|
@@ -103,7 +106,15 @@ function createDextoApp(options) {
|
|
|
103
106
|
app.use(middlewarePattern, import_redaction.prettyJsonMiddleware);
|
|
104
107
|
app.use(middlewarePattern, import_redaction.redactionMiddleware);
|
|
105
108
|
const routePrefix = normalizedPrefix;
|
|
106
|
-
const
|
|
109
|
+
const resolvedGetAgentConfigPath = getAgentConfigPath ?? ((_ctx) => void 0);
|
|
110
|
+
const fullApp = app.route("/health", (0, import_health.createHealthRouter)(getAgent)).route("/", (0, import_a2a.createA2aRouter)(getAgentCard)).route("/", (0, import_a2a_jsonrpc.createA2AJsonRpcRouter)(getAgent, sseSubscriber)).route("/", (0, import_a2a_tasks.createA2ATasksRouter)(getAgent, sseSubscriber)).route(routePrefix, (0, import_greeting.createGreetingRouter)(getAgent)).route(routePrefix, (0, import_messages.createMessagesRouter)(getAgent, approvalCoordinator)).route(routePrefix, (0, import_llm.createLlmRouter)(getAgent)).route(routePrefix, (0, import_sessions.createSessionsRouter)(getAgent)).route(routePrefix, (0, import_search.createSearchRouter)(getAgent)).route(routePrefix, (0, import_mcp.createMcpRouter)(getAgent, resolvedGetAgentConfigPath)).route(routePrefix, (0, import_webhooks.createWebhooksRouter)(getAgent, webhookSubscriber)).route(routePrefix, (0, import_prompts.createPromptsRouter)(getAgent)).route(routePrefix, (0, import_resources.createResourcesRouter)(getAgent)).route(routePrefix, (0, import_memory.createMemoryRouter)(getAgent)).route(routePrefix, (0, import_workspaces.createWorkspacesRouter)(getAgent)).route(routePrefix, (0, import_schedules.createSchedulesRouter)(getAgent)).route(routePrefix, (0, import_approvals.createApprovalsRouter)(getAgent, approvalCoordinator)).route(
|
|
111
|
+
routePrefix,
|
|
112
|
+
(0, import_agents.createAgentsRouter)(
|
|
113
|
+
getAgent,
|
|
114
|
+
agentsContext || dummyAgentsContext,
|
|
115
|
+
resolvedGetAgentConfigPath
|
|
116
|
+
)
|
|
117
|
+
).route(routePrefix, (0, import_queue.createQueueRouter)(getAgent)).route(routePrefix, (0, import_openrouter.createOpenRouterRouter)()).route(routePrefix, (0, import_key.createKeyRouter)()).route(routePrefix, (0, import_tools.createToolsRouter)(getAgent)).route(routePrefix, (0, import_discovery.createDiscoveryRouter)(resolvedGetAgentConfigPath)).route(routePrefix, (0, import_models.createModelsRouter)()).route(routePrefix, (0, import_dexto_auth.createDextoAuthRouter)(getAgent));
|
|
107
118
|
fullApp.doc("/openapi.json", {
|
|
108
119
|
openapi: "3.0.0",
|
|
109
120
|
info: {
|
|
@@ -144,6 +155,10 @@ function createDextoApp(options) {
|
|
|
144
155
|
name: "sessions",
|
|
145
156
|
description: "Create and manage conversation sessions"
|
|
146
157
|
},
|
|
158
|
+
{
|
|
159
|
+
name: "schedules",
|
|
160
|
+
description: "Create and manage automation schedules"
|
|
161
|
+
},
|
|
147
162
|
{
|
|
148
163
|
name: "llm",
|
|
149
164
|
description: "Configure and switch between LLM providers and models"
|
|
@@ -194,7 +209,7 @@ function createDextoApp(options) {
|
|
|
194
209
|
},
|
|
195
210
|
{
|
|
196
211
|
name: "tools",
|
|
197
|
-
description: "List and inspect available tools from
|
|
212
|
+
description: "List and inspect available tools from local and MCP sources"
|
|
198
213
|
},
|
|
199
214
|
{
|
|
200
215
|
name: "models",
|