@slashfi/agents-sdk 0.62.0 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/cjs/index.js +1 -29
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/index.d.ts +1 -10
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +0 -18
  6. package/dist/index.js.map +1 -1
  7. package/dist/types.d.ts +14 -0
  8. package/dist/types.d.ts.map +1 -1
  9. package/package.json +1 -1
  10. package/src/index.ts +1 -44
  11. package/src/types.ts +8 -0
  12. package/dist/cjs/client.js +0 -193
  13. package/dist/cjs/client.js.map +0 -1
  14. package/dist/cjs/codegen.js +0 -1071
  15. package/dist/cjs/codegen.js.map +0 -1
  16. package/dist/cjs/introspect.js +0 -136
  17. package/dist/cjs/introspect.js.map +0 -1
  18. package/dist/cjs/jsonc.js +0 -74
  19. package/dist/cjs/jsonc.js.map +0 -1
  20. package/dist/cjs/pack.js +0 -256
  21. package/dist/cjs/pack.js.map +0 -1
  22. package/dist/client.d.ts +0 -49
  23. package/dist/client.d.ts.map +0 -1
  24. package/dist/client.js +0 -190
  25. package/dist/client.js.map +0 -1
  26. package/dist/codegen.d.ts +0 -163
  27. package/dist/codegen.d.ts.map +0 -1
  28. package/dist/codegen.js +0 -1059
  29. package/dist/codegen.js.map +0 -1
  30. package/dist/introspect.d.ts +0 -16
  31. package/dist/introspect.d.ts.map +0 -1
  32. package/dist/introspect.js +0 -133
  33. package/dist/introspect.js.map +0 -1
  34. package/dist/jsonc.d.ts +0 -15
  35. package/dist/jsonc.d.ts.map +0 -1
  36. package/dist/jsonc.js +0 -70
  37. package/dist/jsonc.js.map +0 -1
  38. package/dist/pack.d.ts +0 -59
  39. package/dist/pack.d.ts.map +0 -1
  40. package/dist/pack.js +0 -252
  41. package/dist/pack.js.map +0 -1
  42. package/src/client.ts +0 -273
  43. package/src/codegen.test.ts +0 -537
  44. package/src/codegen.ts +0 -1423
  45. package/src/introspect.ts +0 -171
  46. package/src/jsonc.ts +0 -83
  47. package/src/pack.ts +0 -394
package/dist/pack.js DELETED
@@ -1,252 +0,0 @@
1
- /**
2
- * ADK Pack
3
- *
4
- * Generates a publishable npm package from an agent.json file.
5
- *
6
- * Input: agent.json (SerializedAgentDefinition)
7
- * Output: ready-to-publish directory with:
8
- * - package.json
9
- * - agent.json (copy)
10
- * - meta.json (version metadata + diff)
11
- * - index.js + index.d.ts (typed export)
12
- */
13
- import { spawnSync } from "node:child_process";
14
- import { createHash } from "node:crypto";
15
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
- import { resolve } from "node:path";
17
- import { parseJsonc } from "./jsonc.js";
18
- import { assertValidDefinition } from "./validate.js";
19
- // ============================================
20
- // Hash
21
- // ============================================
22
- function contentHash(content) {
23
- return createHash("sha256").update(content).digest("hex").slice(0, 8);
24
- }
25
- // ============================================
26
- // Diff
27
- // ============================================
28
- function diffDefinitions(current, previous, previousRawContent) {
29
- const prevToolNames = new Set(previous.tools.map((t) => t.name));
30
- const currToolNames = new Set(current.tools.map((t) => t.name));
31
- const toolsAdded = current.tools
32
- .filter((t) => !prevToolNames.has(t.name))
33
- .map((t) => t.name);
34
- const toolsRemoved = previous.tools
35
- .filter((t) => !currToolNames.has(t.name))
36
- .map((t) => t.name);
37
- // Find modified tools (same name, different schema)
38
- const toolsModified = [];
39
- const schemaChanges = [];
40
- const prevToolMap = new Map(previous.tools.map((t) => [t.name, t]));
41
- for (const tool of current.tools) {
42
- const prev = prevToolMap.get(tool.name);
43
- if (!prev)
44
- continue;
45
- const currSchema = JSON.stringify(tool.inputSchema);
46
- const prevSchema = JSON.stringify(prev.inputSchema);
47
- if (currSchema !== prevSchema) {
48
- toolsModified.push(tool.name);
49
- // Generate human-readable schema change description
50
- const currProps = Object.keys(tool.inputSchema.properties || {});
51
- const prevProps = Object.keys(prev.inputSchema.properties || {});
52
- const added = currProps.filter((p) => !prevProps.includes(p));
53
- const removed = prevProps.filter((p) => !currProps.includes(p));
54
- if (added.length > 0) {
55
- schemaChanges.push(`${tool.name}: added properties: ${added.join(", ")}`);
56
- }
57
- if (removed.length > 0) {
58
- schemaChanges.push(`${tool.name}: removed properties: ${removed.join(", ")}`);
59
- }
60
- if (added.length === 0 && removed.length === 0) {
61
- schemaChanges.push(`${tool.name}: schema modified`);
62
- }
63
- }
64
- }
65
- return {
66
- previousHash: contentHash(previousRawContent),
67
- toolsAdded,
68
- toolsRemoved,
69
- toolsModified,
70
- schemaChanges,
71
- };
72
- }
73
- // ============================================
74
- // Pack
75
- // ============================================
76
- export function pack(options) {
77
- const { agentFile, outDir = "./dist", scope = "@agentdef" } = options;
78
- // Read agent.json
79
- const agentPath = resolve(agentFile);
80
- if (!existsSync(agentPath)) {
81
- throw new Error(`agent.json not found: ${agentPath}`);
82
- }
83
- const agentContent = readFileSync(agentPath, "utf-8");
84
- const definition = parseJsonc(agentContent);
85
- // Validate the definition schema
86
- assertValidDefinition(definition, agentPath);
87
- // Compute hash + version
88
- const hash = contentHash(agentContent);
89
- const version = `${definition.version || "1.0.0"}`;
90
- const packageName = `${scope}/${definition.path}`;
91
- // Create output directory
92
- const packageDir = resolve(outDir, definition.path);
93
- mkdirSync(packageDir, { recursive: true });
94
- // Generate meta.json
95
- const meta = {
96
- hash,
97
- serverVersion: definition.serverInfo?.version || definition.version || "1.0.0",
98
- npmPackage: definition.serverSource,
99
- toolCount: definition.tools.length,
100
- sizeBytes: Buffer.byteLength(agentContent, "utf-8"),
101
- generatedAt: definition.generatedAt || new Date().toISOString(),
102
- sdkVersion: definition.sdkVersion || "0.21.0",
103
- };
104
- // Diff against previous if provided
105
- if (options.previousAgentFile) {
106
- const prevPath = resolve(options.previousAgentFile);
107
- if (existsSync(prevPath)) {
108
- const prevContent = readFileSync(prevPath, "utf-8");
109
- const prevDef = parseJsonc(prevContent);
110
- meta.changes = diffDefinitions(definition, prevDef, prevContent);
111
- }
112
- }
113
- // Write agent.json
114
- writeFileSync(resolve(packageDir, "agent.json"), agentContent);
115
- // Write meta.json
116
- writeFileSync(resolve(packageDir, "meta.json"), `${JSON.stringify(meta, null, 2)}\n`);
117
- // Write package.json
118
- const pkg = {
119
- name: packageName,
120
- version,
121
- description: definition.description || `Agent definition for ${definition.name}`,
122
- type: "module",
123
- main: "index.js",
124
- types: "index.d.ts",
125
- exports: {
126
- ".": {
127
- import: "./index.js",
128
- types: "./index.d.ts",
129
- },
130
- "./agent.json": "./agent.json",
131
- "./meta.json": "./meta.json",
132
- },
133
- files: ["index.js", "index.d.ts", "agent.json", "meta.json"],
134
- peerDependencies: {
135
- "@slashfi/agents-sdk": ">=0.21.0",
136
- },
137
- keywords: ["agent", "mcp", "agentdef", definition.path],
138
- license: "MIT",
139
- repository: {
140
- type: "git",
141
- url: "https://github.com/slashfi/agents-sdk",
142
- },
143
- };
144
- writeFileSync(resolve(packageDir, "package.json"), `${JSON.stringify(pkg, null, 2)}\n`);
145
- // Write index.js
146
- writeFileSync(resolve(packageDir, "index.js"), [
147
- 'import { readFileSync } from "node:fs";',
148
- 'import { fileURLToPath } from "node:url";',
149
- 'import { dirname, resolve } from "node:path";',
150
- "",
151
- "const __dirname = dirname(fileURLToPath(import.meta.url));",
152
- 'const definition = JSON.parse(readFileSync(resolve(__dirname, "agent.json"), "utf-8"));',
153
- "export default definition;",
154
- "export { definition };",
155
- "",
156
- ].join("\n"));
157
- // Write index.d.ts
158
- writeFileSync(resolve(packageDir, "index.d.ts"), [
159
- 'import type { SerializedAgentDefinition } from "@slashfi/agents-sdk";',
160
- "",
161
- "declare const definition: SerializedAgentDefinition;",
162
- "export default definition;",
163
- "export { definition };",
164
- "",
165
- ].join("\n"));
166
- return { packageDir, packageName, version, hash, meta };
167
- }
168
- /**
169
- * Compare semver: returns true if `a` is older than `b`.
170
- */
171
- function isOlderVersion(a, b) {
172
- const pa = a.split(".").map(Number);
173
- const pb = b.split(".").map(Number);
174
- for (let i = 0; i < 3; i++) {
175
- if ((pa[i] || 0) < (pb[i] || 0))
176
- return true;
177
- if ((pa[i] || 0) > (pb[i] || 0))
178
- return false;
179
- }
180
- return false; // equal
181
- }
182
- export function publish(options) {
183
- const result = pack(options);
184
- // Check if this version already exists in the registry
185
- const registryArgs = options.registry ? ["--registry", options.registry] : [];
186
- const viewProc = spawnSync("npm", ["view", `${result.packageName}`, "versions", "--json", ...registryArgs], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
187
- if (viewProc.status === 0 && viewProc.stdout) {
188
- try {
189
- const raw = JSON.parse(viewProc.stdout);
190
- const existing = Array.isArray(raw) ? raw : [raw];
191
- // E409 prevention: version already exists
192
- if (existing.includes(result.version)) {
193
- const versions = existing.join(", ");
194
- throw new Error(`\x1b[31m\u2717 ${result.packageName}@${result.version} already exists in registry\x1b[0m\n\n Published versions: ${versions}\n Hint: bump the version in agent.json, or use --tag to publish a pre-release`);
195
- }
196
- // Out-of-order protection: warn if publishing older than latest
197
- const latestViewProc = spawnSync("npm", ["view", `${result.packageName}`, "dist-tags.latest", ...registryArgs], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
198
- if (latestViewProc.status === 0 && latestViewProc.stdout) {
199
- const latest = latestViewProc.stdout.trim();
200
- if (latest && !options.tag && isOlderVersion(result.version, latest)) {
201
- console.warn(`\x1b[33m\u26A0 Warning: publishing ${result.version} which is older than latest (${latest})\x1b[0m`);
202
- console.warn(` This will move the "latest" tag from ${latest} to ${result.version}.`);
203
- console.warn(" Use --tag <name> to publish without affecting latest.");
204
- throw new Error(`Refusing to clobber latest tag. Use --tag <name> to publish ${result.version} alongside ${latest}.`);
205
- }
206
- }
207
- }
208
- catch (e) {
209
- if (e instanceof Error && e.message.includes("already exists"))
210
- throw e;
211
- if (e instanceof Error && e.message.includes("Refusing to clobber"))
212
- throw e;
213
- // JSON parse error or other issue — continue with publish
214
- }
215
- }
216
- const npmArgs = ["publish", result.packageDir];
217
- npmArgs.push("--access", options.access || "public");
218
- if (options.tag)
219
- npmArgs.push("--tag", options.tag);
220
- if (options.dryRun)
221
- npmArgs.push("--dry-run");
222
- if (options.registry)
223
- npmArgs.push("--registry", options.registry);
224
- console.log(`Publishing ${result.packageName}@${result.version} (hash: ${result.hash})`);
225
- const proc = spawnSync("npm", npmArgs, {
226
- stdio: ["pipe", "pipe", "pipe"],
227
- encoding: "utf-8",
228
- });
229
- if (proc.status !== 0) {
230
- const stderr = proc.stderr || "";
231
- // Extract npm log path for debug hint
232
- const logMatch = stderr.match(/complete log[^:]*:\s*(.+\.log)/i);
233
- const logHint = logMatch
234
- ? `\n Debug: cat ${logMatch[1].trim()} | tail -40`
235
- : "";
236
- // Parse npm error for better messages
237
- if (stderr.includes("E409") || stderr.includes("already present")) {
238
- throw new Error(`\x1b[31m\u2717 ${result.packageName}@${result.version} already exists in registry\x1b[0m\n\n` +
239
- ` Hint: bump the version in agent.json, or use --tag to publish a pre-release${logHint}`);
240
- }
241
- if (stderr.includes("E401") || stderr.includes("authentication")) {
242
- throw new Error(`\x1b[31m\u2717 Authentication failed\x1b[0m\n\n Run: npm login --scope=@agentdef\n Or set NPM_TOKEN in your environment${logHint}`);
243
- }
244
- if (stderr.includes("E403") || stderr.includes("Forbidden")) {
245
- throw new Error(`\x1b[31m\u2717 Permission denied publishing ${result.packageName}\x1b[0m\n\n Make sure you have publish access to the @agentdef scope.\n Run: npm access ls-packages @agentdef${logHint}`);
246
- }
247
- // Fallback: show raw error
248
- throw new Error(`npm publish failed (exit ${proc.status}):${logHint}\n${stderr}`);
249
- }
250
- return result;
251
- }
252
- //# sourceMappingURL=pack.js.map
package/dist/pack.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
package/src/client.ts DELETED
@@ -1,273 +0,0 @@
1
- /**
2
- * Agent Client
3
- *
4
- * Creates a typed client from a SerializedAgentDefinition.
5
- * The client spawns (or connects to) the MCP server and proxies
6
- * tool calls via JSON-RPC.
7
- *
8
- * @example
9
- * ```typescript
10
- * import { createClient } from '@slashfi/agents-sdk';
11
- * import definition from './agents/notion/definition.json';
12
- *
13
- * const client = createClient(definition, {
14
- * env: { NOTION_TOKEN: process.env.NOTION_TOKEN },
15
- * });
16
- *
17
- * const result = await client.call('API-post-search', { query: 'meeting notes' });
18
- * await client.close();
19
- * ```
20
- */
21
-
22
- import { type ChildProcess, spawn } from "node:child_process";
23
- import type {
24
- SerializedAgentDefinition,
25
- SerializedTool,
26
- } from "./serialized.js";
27
-
28
- // ============================================
29
- // Client Options
30
- // ============================================
31
-
32
- export interface CreateClientOptions {
33
- /** Extra environment variables for the MCP server process */
34
- env?: Record<string, string | undefined>;
35
- /** Override the server command (defaults to definition.serverSource) */
36
- serverCommand?: string;
37
- /** Timeout for tool calls in ms (default: 30000) */
38
- timeout?: number;
39
- }
40
-
41
- // ============================================
42
- // Agent Client
43
- // ============================================
44
-
45
- export interface AgentClient {
46
- /** The definition this client was created from */
47
- readonly definition: SerializedAgentDefinition;
48
-
49
- /** List available tools */
50
- tools(): SerializedTool[];
51
-
52
- /** Call a tool by name */
53
- call(toolName: string, input?: Record<string, unknown>): Promise<unknown>;
54
-
55
- /** Check if connected */
56
- isConnected(): boolean;
57
-
58
- /** Close the MCP server connection */
59
- close(): void;
60
- }
61
-
62
- // ============================================
63
- // MCP Stdio Transport
64
- // ============================================
65
-
66
- interface PendingRequest {
67
- resolve: (value: unknown) => void;
68
- reject: (error: Error) => void;
69
- timer: ReturnType<typeof setTimeout>;
70
- }
71
-
72
- class McpStdioClient implements AgentClient {
73
- readonly definition: SerializedAgentDefinition;
74
- private proc: ChildProcess | null = null;
75
- private messageId = 0;
76
- private buffer = "";
77
- private pending = new Map<number, PendingRequest>();
78
- private initialized = false;
79
- private initPromise: Promise<void> | null = null;
80
- private serverCommand: string;
81
- private env: Record<string, string | undefined>;
82
- private timeout: number;
83
-
84
- constructor(
85
- definition: SerializedAgentDefinition,
86
- options: CreateClientOptions = {},
87
- ) {
88
- this.definition = definition;
89
- this.serverCommand = options.serverCommand ?? definition.serverSource ?? "";
90
- this.env = options.env ?? {};
91
- this.timeout = options.timeout ?? 30000;
92
-
93
- if (!this.serverCommand) {
94
- throw new Error(
95
- `No server command for agent "${definition.path}". Set serverSource in the definition or pass serverCommand in options.`,
96
- );
97
- }
98
- }
99
-
100
- tools(): SerializedTool[] {
101
- return this.definition.tools;
102
- }
103
-
104
- isConnected(): boolean {
105
- return this.proc !== null && !this.proc.killed;
106
- }
107
-
108
- async call(
109
- toolName: string,
110
- input: Record<string, unknown> = {},
111
- ): Promise<unknown> {
112
- // Validate tool exists
113
- const tool = this.definition.tools.find((t) => t.name === toolName);
114
- if (!tool) {
115
- const available = this.definition.tools.map((t) => t.name).join(", ");
116
- throw new Error(`Tool "${toolName}" not found. Available: ${available}`);
117
- }
118
-
119
- // Ensure connected + initialized
120
- await this.ensureInitialized();
121
-
122
- // Send tools/call
123
- const result = await this.sendRequest("tools/call", {
124
- name: toolName,
125
- arguments: input,
126
- });
127
-
128
- // MCP tools/call returns { content: [{ type, text }] }
129
- const resultObj = result as Record<string, unknown> | null;
130
- if (resultObj && typeof resultObj === "object" && "content" in resultObj) {
131
- const content = resultObj.content;
132
- if (Array.isArray(content) && content.length > 0) {
133
- const first = content[0];
134
- if (first.type === "text") {
135
- try {
136
- return JSON.parse(first.text);
137
- } catch {
138
- return first.text;
139
- }
140
- }
141
- return first;
142
- }
143
- }
144
- return result;
145
- }
146
-
147
- close(): void {
148
- if (this.proc) {
149
- this.proc.kill();
150
- this.proc = null;
151
- }
152
- this.initialized = false;
153
- this.initPromise = null;
154
- // Reject all pending
155
- for (const req of Array.from(this.pending.values())) {
156
- clearTimeout(req.timer);
157
- req.reject(new Error("Client closed"));
158
- }
159
- this.pending.clear();
160
- }
161
-
162
- // ── Private ──
163
-
164
- private async ensureInitialized(): Promise<void> {
165
- if (this.initialized) return;
166
- if (this.initPromise) return this.initPromise;
167
-
168
- this.initPromise = this.connect();
169
- await this.initPromise;
170
- this.initialized = true;
171
- }
172
-
173
- private async connect(): Promise<void> {
174
- const parts = this.serverCommand.split(/\s+/);
175
- this.proc = spawn(parts[0], parts.slice(1), {
176
- stdio: ["pipe", "pipe", "pipe"],
177
- env: { ...process.env, ...this.env },
178
- });
179
-
180
- this.proc.stdout?.on("data", (chunk: Buffer) => this.onData(chunk));
181
- this.proc.on("error", (err) => {
182
- for (const req of Array.from(this.pending.values())) {
183
- clearTimeout(req.timer);
184
- req.reject(err);
185
- }
186
- this.pending.clear();
187
- });
188
-
189
- // Initialize handshake
190
- await this.sendRequest("initialize", {
191
- protocolVersion: "2024-11-05",
192
- capabilities: {},
193
- clientInfo: { name: "agents-sdk-client", version: "1.0.0" },
194
- });
195
-
196
- // Send initialized notification
197
- this.sendNotification("notifications/initialized");
198
- }
199
-
200
- private sendRequest(
201
- method: string,
202
- params: Record<string, unknown> = {},
203
- ): Promise<unknown> {
204
- return new Promise((resolve, reject) => {
205
- const id = ++this.messageId;
206
- const timer = setTimeout(() => {
207
- this.pending.delete(id);
208
- reject(new Error(`Timeout after ${this.timeout}ms calling ${method}`));
209
- }, this.timeout);
210
-
211
- this.pending.set(id, { resolve, reject, timer });
212
-
213
- const msg = JSON.stringify({ jsonrpc: "2.0", id, method, params });
214
- this.proc?.stdin?.write(`${msg}\n`);
215
- });
216
- }
217
-
218
- private sendNotification(
219
- method: string,
220
- params?: Record<string, unknown>,
221
- ): void {
222
- const msg = JSON.stringify({
223
- jsonrpc: "2.0",
224
- method,
225
- ...(params ? { params } : {}),
226
- });
227
- this.proc?.stdin?.write(`${msg}\n`);
228
- }
229
-
230
- private onData(chunk: Buffer): void {
231
- this.buffer += chunk.toString();
232
- const lines = this.buffer.split("\n");
233
- this.buffer = lines.pop() || "";
234
-
235
- for (const line of lines) {
236
- const trimmed = line.trim();
237
- if (!trimmed) continue;
238
- try {
239
- const parsed = JSON.parse(trimmed);
240
- if (parsed.id != null && this.pending.has(parsed.id)) {
241
- const req = this.pending.get(parsed.id);
242
- if (!req) continue;
243
- this.pending.delete(parsed.id);
244
- clearTimeout(req.timer);
245
- if (parsed.error) {
246
- req.reject(new Error(JSON.stringify(parsed.error)));
247
- } else {
248
- req.resolve(parsed.result);
249
- }
250
- }
251
- } catch {
252
- // ignore non-JSON lines (stderr leakage, etc.)
253
- }
254
- }
255
- }
256
- }
257
-
258
- // ============================================
259
- // Factory
260
- // ============================================
261
-
262
- /**
263
- * Create an agent client from a serialized definition.
264
- *
265
- * The client lazily spawns the MCP server on first call and
266
- * proxies tool invocations via JSON-RPC over stdio.
267
- */
268
- export function createClient(
269
- definition: SerializedAgentDefinition,
270
- options?: CreateClientOptions,
271
- ): AgentClient {
272
- return new McpStdioClient(definition, options);
273
- }