@slashfi/agents-sdk 0.24.2 → 0.24.3
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/cjs/agent-definitions/auth.js +678 -0
- package/dist/cjs/agent-definitions/auth.js.map +1 -0
- package/dist/cjs/agent-definitions/integrations.js +1173 -0
- package/dist/cjs/agent-definitions/integrations.js.map +1 -0
- package/dist/cjs/agent-definitions/remote-registry.js +469 -0
- package/dist/cjs/agent-definitions/remote-registry.js.map +1 -0
- package/dist/cjs/agent-definitions/secrets.js +193 -0
- package/dist/cjs/agent-definitions/secrets.js.map +1 -0
- package/dist/cjs/agent-definitions/users.js +440 -0
- package/dist/cjs/agent-definitions/users.js.map +1 -0
- package/dist/cjs/build.js +162 -0
- package/dist/cjs/build.js.map +1 -0
- package/dist/cjs/callback/index.js +74 -0
- package/dist/cjs/callback/index.js.map +1 -0
- package/dist/cjs/client.js +193 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/codegen.js +1027 -0
- package/dist/cjs/codegen.js.map +1 -0
- package/dist/cjs/crypto.js +44 -0
- package/dist/cjs/crypto.js.map +1 -0
- package/dist/cjs/define-config.js +81 -0
- package/dist/cjs/define-config.js.map +1 -0
- package/dist/cjs/define.js +186 -0
- package/dist/cjs/define.js.map +1 -0
- package/dist/cjs/events.js +60 -0
- package/dist/cjs/events.js.map +1 -0
- package/dist/cjs/index.js +195 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/integration-interface.js +105 -0
- package/dist/cjs/integration-interface.js.map +1 -0
- package/dist/cjs/integrations-store.js +53 -0
- package/dist/cjs/integrations-store.js.map +1 -0
- package/dist/cjs/introspect.js +136 -0
- package/dist/cjs/introspect.js.map +1 -0
- package/dist/cjs/jsonc.js +74 -0
- package/dist/cjs/jsonc.js.map +1 -0
- package/dist/cjs/jwt.js +207 -0
- package/dist/cjs/jwt.js.map +1 -0
- package/dist/cjs/key-manager.js +161 -0
- package/dist/cjs/key-manager.js.map +1 -0
- package/dist/cjs/oidc-signin.js +141 -0
- package/dist/cjs/oidc-signin.js.map +1 -0
- package/dist/cjs/pack.js +256 -0
- package/dist/cjs/pack.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/registry-consumer.js +233 -0
- package/dist/cjs/registry-consumer.js.map +1 -0
- package/dist/cjs/registry.js +512 -0
- package/dist/cjs/registry.js.map +1 -0
- package/dist/cjs/secret-collection.js +42 -0
- package/dist/cjs/secret-collection.js.map +1 -0
- package/dist/cjs/serialized.js +45 -0
- package/dist/cjs/serialized.js.map +1 -0
- package/dist/cjs/server.js +974 -0
- package/dist/cjs/server.js.map +1 -0
- package/dist/cjs/test-utils/mock-oidc-server.js +99 -0
- package/dist/cjs/test-utils/mock-oidc-server.js.map +1 -0
- package/dist/cjs/types.js +8 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/validate.js +84 -0
- package/dist/cjs/validate.js.map +1 -0
- package/package.json +13 -5
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Build Agents
|
|
4
|
+
*
|
|
5
|
+
* Scans a directory for agent definitions and generates a registry file.
|
|
6
|
+
*
|
|
7
|
+
* Convention:
|
|
8
|
+
* - Agent directories start with `@` (e.g., `@my-agent`)
|
|
9
|
+
* - Each agent has:
|
|
10
|
+
* - `entrypoint.md` - System prompt
|
|
11
|
+
* - `agent.config.ts` - Configuration (exports default AgentConfig)
|
|
12
|
+
* - `*.tool.ts` - Tool definitions (exports `{toolName}Tool`)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // scripts/build-agents.ts
|
|
17
|
+
* import { buildAgents } from '@slashfi/agents-sdk';
|
|
18
|
+
*
|
|
19
|
+
* await buildAgents({
|
|
20
|
+
* agentsDir: './src/agents',
|
|
21
|
+
* outFile: './src/agents/_generated-registry.ts',
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.buildAgents = buildAgents;
|
|
27
|
+
const node_fs_1 = require("node:fs");
|
|
28
|
+
const node_path_1 = require("node:path");
|
|
29
|
+
/**
|
|
30
|
+
* Convert kebab-case to camelCase.
|
|
31
|
+
*/
|
|
32
|
+
function toCamelCase(str) {
|
|
33
|
+
return str
|
|
34
|
+
.split("-")
|
|
35
|
+
.map((part, i) => i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1))
|
|
36
|
+
.join("");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Escape a string for use in a JavaScript string literal.
|
|
40
|
+
*/
|
|
41
|
+
function escapeString(str, quote) {
|
|
42
|
+
return str
|
|
43
|
+
.replace(/\\/g, "\\\\")
|
|
44
|
+
.replace(new RegExp(quote, "g"), `\\${quote}`)
|
|
45
|
+
.replace(/\n/g, "\\n")
|
|
46
|
+
.replace(/\r/g, "\\r")
|
|
47
|
+
.replace(/\t/g, "\\t");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build agents from a directory.
|
|
51
|
+
*
|
|
52
|
+
* Scans the given directory for agent folders (starting with `@`) and generates
|
|
53
|
+
* a TypeScript file that creates and populates an agent registry.
|
|
54
|
+
*/
|
|
55
|
+
async function buildAgents(options) {
|
|
56
|
+
const { agentsDir, outFile, sdkImport = "@slashfi/agents-sdk", defaultVisibility = "internal", doubleQuotes = false, } = options;
|
|
57
|
+
const q = doubleQuotes ? '"' : "'";
|
|
58
|
+
const agents = [];
|
|
59
|
+
const skipped = [];
|
|
60
|
+
// Find all agent directories (start with @)
|
|
61
|
+
const agentDirs = (0, node_fs_1.readdirSync)(agentsDir).filter((name) => {
|
|
62
|
+
if (!name.startsWith("@"))
|
|
63
|
+
return false;
|
|
64
|
+
try {
|
|
65
|
+
const stat = (0, node_fs_1.statSync)((0, node_path_1.join)(agentsDir, name));
|
|
66
|
+
return stat.isDirectory();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const imports = [];
|
|
73
|
+
const registrations = [];
|
|
74
|
+
const exportItems = [];
|
|
75
|
+
for (const agentDir of agentDirs) {
|
|
76
|
+
const agentPath = (0, node_path_1.join)(agentsDir, agentDir);
|
|
77
|
+
const entrypointPath = (0, node_path_1.join)(agentPath, "entrypoint.md");
|
|
78
|
+
const configPath = (0, node_path_1.join)(agentPath, "agent.config.ts");
|
|
79
|
+
// Check if required files exist
|
|
80
|
+
try {
|
|
81
|
+
(0, node_fs_1.statSync)(entrypointPath);
|
|
82
|
+
(0, node_fs_1.statSync)(configPath);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
skipped.push(agentDir);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// Read entrypoint content
|
|
89
|
+
const entrypoint = (0, node_fs_1.readFileSync)(entrypointPath, "utf-8");
|
|
90
|
+
// Find tool files
|
|
91
|
+
const toolFiles = (0, node_fs_1.readdirSync)(agentPath).filter((f) => f.endsWith(".tool.ts"));
|
|
92
|
+
// Generate variable name from directory (e.g., @product-applications -> productApplications)
|
|
93
|
+
const varName = toCamelCase(agentDir.slice(1));
|
|
94
|
+
// Add config import
|
|
95
|
+
imports.push(`import ${varName}Config from ${q}./${agentDir}/agent.config.js${q};`);
|
|
96
|
+
// Add tool imports and collect tool info
|
|
97
|
+
const toolEntries = [];
|
|
98
|
+
for (const toolFile of toolFiles) {
|
|
99
|
+
const baseName = toolFile.replace(".tool.ts", "");
|
|
100
|
+
// Convert kebab-case to camelCase for JS variable: get-status -> getStatusTool
|
|
101
|
+
const toolVarName = `${toCamelCase(baseName)}Tool`;
|
|
102
|
+
// Tool name is just the filename (kebab-case): get-status
|
|
103
|
+
const toolName = baseName;
|
|
104
|
+
imports.push(`import { ${toolVarName} } from ${q}./${agentDir}/${toolFile.replace(".ts", ".js")}${q};`);
|
|
105
|
+
toolEntries.push({ varName: toolVarName, name: toolName });
|
|
106
|
+
}
|
|
107
|
+
// Read config to get the path override if specified
|
|
108
|
+
const configContent = (0, node_fs_1.readFileSync)(configPath, "utf-8");
|
|
109
|
+
const pathMatch = configContent.match(/path:\s*['"]([^'"]+)['"]/);
|
|
110
|
+
const registeredPath = pathMatch ? pathMatch[1] : agentDir;
|
|
111
|
+
// Generate tools array with name override
|
|
112
|
+
const toolsArray = toolEntries
|
|
113
|
+
.map((t) => `{ ...${t.varName}, name: ${q}${t.name}${q} }`)
|
|
114
|
+
.join(", ");
|
|
115
|
+
// Generate agent definition
|
|
116
|
+
const entrypointEscaped = escapeString(entrypoint, q);
|
|
117
|
+
registrations.push(`
|
|
118
|
+
const ${varName}Agent = defineAgent({
|
|
119
|
+
path: ${q}${registeredPath}${q},
|
|
120
|
+
entrypoint: ${q}${entrypointEscaped}${q},
|
|
121
|
+
config: ${varName}Config,
|
|
122
|
+
tools: [${toolsArray}],
|
|
123
|
+
visibility: ${q}${defaultVisibility}${q},
|
|
124
|
+
});
|
|
125
|
+
agentRegistry.register(${varName}Agent);`);
|
|
126
|
+
exportItems.push(` ${varName}: ${varName}Agent,`);
|
|
127
|
+
agents.push(registeredPath);
|
|
128
|
+
}
|
|
129
|
+
const output = `/**
|
|
130
|
+
* AUTO-GENERATED FILE - DO NOT EDIT
|
|
131
|
+
* Generated by buildAgents from ${sdkImport}
|
|
132
|
+
*
|
|
133
|
+
* This file bundles agent entrypoints at build time.
|
|
134
|
+
* Tool names are derived from filenames (kebab-case).
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
import { createAgentRegistry, defineAgent } from ${q}${sdkImport}${q};
|
|
138
|
+
|
|
139
|
+
${imports.join("\n")}
|
|
140
|
+
|
|
141
|
+
// Create registry
|
|
142
|
+
export const agentRegistry = createAgentRegistry({
|
|
143
|
+
defaultVisibility: ${q}${defaultVisibility}${q},
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Register agents
|
|
147
|
+
${registrations.join("\n")}
|
|
148
|
+
|
|
149
|
+
// Export agents
|
|
150
|
+
export const agents = {
|
|
151
|
+
${exportItems.join("\n")}
|
|
152
|
+
};
|
|
153
|
+
`;
|
|
154
|
+
(0, node_fs_1.writeFileSync)(outFile, output);
|
|
155
|
+
return {
|
|
156
|
+
agentCount: agents.length,
|
|
157
|
+
agents,
|
|
158
|
+
skipped,
|
|
159
|
+
outFile,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Callback — Deferred call_agent execution with triggers.
|
|
4
|
+
*
|
|
5
|
+
* An agent_callback is a call_agent command with an optional trigger.
|
|
6
|
+
* When the trigger fires (e.g., user submits a form), template references
|
|
7
|
+
* like {{trigger.variable_name}} are resolved with the trigger's values
|
|
8
|
+
* and the call_agent command is executed.
|
|
9
|
+
*
|
|
10
|
+
* This module provides the unopinionated contract:
|
|
11
|
+
* - Trigger schema (extensible discriminated union)
|
|
12
|
+
* - Template resolution
|
|
13
|
+
* - Store interface
|
|
14
|
+
* - Validation utilities
|
|
15
|
+
*
|
|
16
|
+
* No platform-specific code (no Slack, no CockroachDB, no Atlas).
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.resolveCallbackTemplates = resolveCallbackTemplates;
|
|
20
|
+
exports.validateCallbackTemplates = validateCallbackTemplates;
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Template Resolution
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Resolve {{trigger.variable}} references in an object tree.
|
|
26
|
+
* Scans all string values and replaces {{trigger.x}} with the
|
|
27
|
+
* corresponding value from triggerValues.
|
|
28
|
+
*
|
|
29
|
+
* Unresolved references are left as-is.
|
|
30
|
+
*/
|
|
31
|
+
function resolveCallbackTemplates(obj, triggerValues) {
|
|
32
|
+
if (typeof obj === 'string') {
|
|
33
|
+
return obj.replace(/\{\{trigger\.(\w+)\}\}/g, (_match, varName) => {
|
|
34
|
+
return triggerValues[varName] ?? `{{trigger.${varName}}}`;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(obj)) {
|
|
38
|
+
return obj.map((item) => resolveCallbackTemplates(item, triggerValues));
|
|
39
|
+
}
|
|
40
|
+
if (obj !== null && typeof obj === 'object') {
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
43
|
+
result[key] = resolveCallbackTemplates(val, triggerValues);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
return obj;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate that all {{trigger.x}} references in a callback have
|
|
51
|
+
* corresponding variables in the provided set.
|
|
52
|
+
* Returns array of unresolved variable names, or empty if valid.
|
|
53
|
+
*/
|
|
54
|
+
function validateCallbackTemplates(callback, knownVariables) {
|
|
55
|
+
const definedVars = new Set(knownVariables);
|
|
56
|
+
const referencedVars = [];
|
|
57
|
+
const scanForRefs = (obj) => {
|
|
58
|
+
if (typeof obj === 'string') {
|
|
59
|
+
const matches = obj.matchAll(/\{\{trigger\.(\w+)\}\}/g);
|
|
60
|
+
for (const match of matches) {
|
|
61
|
+
referencedVars.push(match[1]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (Array.isArray(obj)) {
|
|
65
|
+
obj.forEach(scanForRefs);
|
|
66
|
+
}
|
|
67
|
+
else if (obj !== null && typeof obj === 'object') {
|
|
68
|
+
Object.values(obj).forEach(scanForRefs);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
scanForRefs(callback);
|
|
72
|
+
return referencedVars.filter((v) => !definedVars.has(v));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/callback/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AA+FH,4DAoBC;AAOD,8DAuBC;AA7DD,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;GAMG;AACH,SAAgB,wBAAwB,CACtC,GAAM,EACN,aAAqC;IAErC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;YACxE,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,OAAO,IAAI,CAAC;QAC5D,CAAC,CAAM,CAAC;IACV,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAM,CAAC;IAC/E,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CACvC,QAAiC,EACjC,cAAwB;IAExB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,MAAM,WAAW,GAAG,CAAC,GAAY,EAAQ,EAAE;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,GAA8B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEtB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Client
|
|
4
|
+
*
|
|
5
|
+
* Creates a typed client from a SerializedAgentDefinition.
|
|
6
|
+
* The client spawns (or connects to) the MCP server and proxies
|
|
7
|
+
* tool calls via JSON-RPC.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { createClient } from '@slashfi/agents-sdk';
|
|
12
|
+
* import definition from './agents/notion/definition.json';
|
|
13
|
+
*
|
|
14
|
+
* const client = createClient(definition, {
|
|
15
|
+
* env: { NOTION_TOKEN: process.env.NOTION_TOKEN },
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* const result = await client.call('API-post-search', { query: 'meeting notes' });
|
|
19
|
+
* await client.close();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.createClient = createClient;
|
|
24
|
+
const node_child_process_1 = require("node:child_process");
|
|
25
|
+
class McpStdioClient {
|
|
26
|
+
definition;
|
|
27
|
+
proc = null;
|
|
28
|
+
messageId = 0;
|
|
29
|
+
buffer = "";
|
|
30
|
+
pending = new Map();
|
|
31
|
+
initialized = false;
|
|
32
|
+
initPromise = null;
|
|
33
|
+
serverCommand;
|
|
34
|
+
env;
|
|
35
|
+
timeout;
|
|
36
|
+
constructor(definition, options = {}) {
|
|
37
|
+
this.definition = definition;
|
|
38
|
+
this.serverCommand = options.serverCommand ?? definition.serverSource ?? "";
|
|
39
|
+
this.env = options.env ?? {};
|
|
40
|
+
this.timeout = options.timeout ?? 30000;
|
|
41
|
+
if (!this.serverCommand) {
|
|
42
|
+
throw new Error(`No server command for agent "${definition.path}". Set serverSource in the definition or pass serverCommand in options.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
tools() {
|
|
46
|
+
return this.definition.tools;
|
|
47
|
+
}
|
|
48
|
+
isConnected() {
|
|
49
|
+
return this.proc !== null && !this.proc.killed;
|
|
50
|
+
}
|
|
51
|
+
async call(toolName, input = {}) {
|
|
52
|
+
// Validate tool exists
|
|
53
|
+
const tool = this.definition.tools.find((t) => t.name === toolName);
|
|
54
|
+
if (!tool) {
|
|
55
|
+
const available = this.definition.tools.map((t) => t.name).join(", ");
|
|
56
|
+
throw new Error(`Tool "${toolName}" not found. Available: ${available}`);
|
|
57
|
+
}
|
|
58
|
+
// Ensure connected + initialized
|
|
59
|
+
await this.ensureInitialized();
|
|
60
|
+
// Send tools/call
|
|
61
|
+
const result = await this.sendRequest("tools/call", {
|
|
62
|
+
name: toolName,
|
|
63
|
+
arguments: input,
|
|
64
|
+
});
|
|
65
|
+
// MCP tools/call returns { content: [{ type, text }] }
|
|
66
|
+
const resultObj = result;
|
|
67
|
+
if (resultObj && typeof resultObj === "object" && "content" in resultObj) {
|
|
68
|
+
const content = resultObj.content;
|
|
69
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
70
|
+
const first = content[0];
|
|
71
|
+
if (first.type === "text") {
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(first.text);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return first.text;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return first;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
close() {
|
|
85
|
+
if (this.proc) {
|
|
86
|
+
this.proc.kill();
|
|
87
|
+
this.proc = null;
|
|
88
|
+
}
|
|
89
|
+
this.initialized = false;
|
|
90
|
+
this.initPromise = null;
|
|
91
|
+
// Reject all pending
|
|
92
|
+
for (const req of Array.from(this.pending.values())) {
|
|
93
|
+
clearTimeout(req.timer);
|
|
94
|
+
req.reject(new Error("Client closed"));
|
|
95
|
+
}
|
|
96
|
+
this.pending.clear();
|
|
97
|
+
}
|
|
98
|
+
// ── Private ──
|
|
99
|
+
async ensureInitialized() {
|
|
100
|
+
if (this.initialized)
|
|
101
|
+
return;
|
|
102
|
+
if (this.initPromise)
|
|
103
|
+
return this.initPromise;
|
|
104
|
+
this.initPromise = this.connect();
|
|
105
|
+
await this.initPromise;
|
|
106
|
+
this.initialized = true;
|
|
107
|
+
}
|
|
108
|
+
async connect() {
|
|
109
|
+
const parts = this.serverCommand.split(/\s+/);
|
|
110
|
+
this.proc = (0, node_child_process_1.spawn)(parts[0], parts.slice(1), {
|
|
111
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
112
|
+
env: { ...process.env, ...this.env },
|
|
113
|
+
});
|
|
114
|
+
this.proc.stdout?.on("data", (chunk) => this.onData(chunk));
|
|
115
|
+
this.proc.on("error", (err) => {
|
|
116
|
+
for (const req of Array.from(this.pending.values())) {
|
|
117
|
+
clearTimeout(req.timer);
|
|
118
|
+
req.reject(err);
|
|
119
|
+
}
|
|
120
|
+
this.pending.clear();
|
|
121
|
+
});
|
|
122
|
+
// Initialize handshake
|
|
123
|
+
await this.sendRequest("initialize", {
|
|
124
|
+
protocolVersion: "2024-11-05",
|
|
125
|
+
capabilities: {},
|
|
126
|
+
clientInfo: { name: "agents-sdk-client", version: "1.0.0" },
|
|
127
|
+
});
|
|
128
|
+
// Send initialized notification
|
|
129
|
+
this.sendNotification("notifications/initialized");
|
|
130
|
+
}
|
|
131
|
+
sendRequest(method, params = {}) {
|
|
132
|
+
return new Promise((resolve, reject) => {
|
|
133
|
+
const id = ++this.messageId;
|
|
134
|
+
const timer = setTimeout(() => {
|
|
135
|
+
this.pending.delete(id);
|
|
136
|
+
reject(new Error(`Timeout after ${this.timeout}ms calling ${method}`));
|
|
137
|
+
}, this.timeout);
|
|
138
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
139
|
+
const msg = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
140
|
+
this.proc?.stdin?.write(`${msg}\n`);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
sendNotification(method, params) {
|
|
144
|
+
const msg = JSON.stringify({
|
|
145
|
+
jsonrpc: "2.0",
|
|
146
|
+
method,
|
|
147
|
+
...(params ? { params } : {}),
|
|
148
|
+
});
|
|
149
|
+
this.proc?.stdin?.write(`${msg}\n`);
|
|
150
|
+
}
|
|
151
|
+
onData(chunk) {
|
|
152
|
+
this.buffer += chunk.toString();
|
|
153
|
+
const lines = this.buffer.split("\n");
|
|
154
|
+
this.buffer = lines.pop() || "";
|
|
155
|
+
for (const line of lines) {
|
|
156
|
+
const trimmed = line.trim();
|
|
157
|
+
if (!trimmed)
|
|
158
|
+
continue;
|
|
159
|
+
try {
|
|
160
|
+
const parsed = JSON.parse(trimmed);
|
|
161
|
+
if (parsed.id != null && this.pending.has(parsed.id)) {
|
|
162
|
+
const req = this.pending.get(parsed.id);
|
|
163
|
+
if (!req)
|
|
164
|
+
continue;
|
|
165
|
+
this.pending.delete(parsed.id);
|
|
166
|
+
clearTimeout(req.timer);
|
|
167
|
+
if (parsed.error) {
|
|
168
|
+
req.reject(new Error(JSON.stringify(parsed.error)));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
req.resolve(parsed.result);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// ignore non-JSON lines (stderr leakage, etc.)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ============================================
|
|
182
|
+
// Factory
|
|
183
|
+
// ============================================
|
|
184
|
+
/**
|
|
185
|
+
* Create an agent client from a serialized definition.
|
|
186
|
+
*
|
|
187
|
+
* The client lazily spawns the MCP server on first call and
|
|
188
|
+
* proxies tool invocations via JSON-RPC over stdio.
|
|
189
|
+
*/
|
|
190
|
+
function createClient(definition, options) {
|
|
191
|
+
return new McpStdioClient(definition, options);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|