@openweave/weave-tools 1.0.0 → 1.0.1
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/adapters/http-adapter.d.ts +18 -0
- package/dist/cjs/adapters/http-adapter.d.ts.map +1 -0
- package/dist/cjs/adapters/http-adapter.js +99 -0
- package/dist/cjs/adapters/http-adapter.js.map +1 -0
- package/dist/cjs/adapters/mcp-adapter.d.ts +14 -0
- package/dist/cjs/adapters/mcp-adapter.d.ts.map +1 -0
- package/dist/cjs/adapters/mcp-adapter.js +123 -0
- package/dist/cjs/adapters/mcp-adapter.js.map +1 -0
- package/dist/cjs/adapters/script-adapter.d.ts +20 -0
- package/dist/cjs/adapters/script-adapter.d.ts.map +1 -0
- package/dist/cjs/adapters/script-adapter.js +112 -0
- package/dist/cjs/adapters/script-adapter.js.map +1 -0
- package/dist/cjs/index.d.ts +15 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/tool-bridge.d.ts +58 -0
- package/dist/cjs/tool-bridge.d.ts.map +1 -0
- package/dist/cjs/tool-bridge.js +129 -0
- package/dist/cjs/tool-bridge.js.map +1 -0
- package/dist/cjs/tool-loader.d.ts +34 -0
- package/dist/cjs/tool-loader.d.ts.map +1 -0
- package/dist/cjs/tool-loader.js +109 -0
- package/dist/cjs/tool-loader.js.map +1 -0
- package/dist/cjs/tool-store.d.ts +37 -0
- package/dist/cjs/tool-store.d.ts.map +1 -0
- package/dist/cjs/tool-store.js +88 -0
- package/dist/cjs/tool-store.js.map +1 -0
- package/dist/cjs/types.d.ts +75 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +55 -0
- package/dist/cjs/types.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Adapter
|
|
3
|
+
*
|
|
4
|
+
* Routes tool calls to a REST/webhook endpoint.
|
|
5
|
+
* Supports bearer token, api-key, basic, and no-auth strategies.
|
|
6
|
+
* Injectable fetch for test isolation.
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolManifest, ToolHandler, ToolAuth } from '../types.js';
|
|
9
|
+
export declare function buildAuthHeaders(auth: ToolAuth | undefined): Record<string, string>;
|
|
10
|
+
export type FetchFn = typeof fetch;
|
|
11
|
+
export interface HttpAdapterOptions {
|
|
12
|
+
manifest: ToolManifest;
|
|
13
|
+
/** Injectable fetch implementation for tests */
|
|
14
|
+
fetchFn?: FetchFn;
|
|
15
|
+
}
|
|
16
|
+
export declare function createHttpHandler(manifest: ToolManifest, actionName: string, fetchFn?: FetchFn): ToolHandler;
|
|
17
|
+
export declare function createHttpAdapter(opts: HttpAdapterOptions): Map<string, ToolHandler>;
|
|
18
|
+
//# sourceMappingURL=http-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/http-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBnF;AAMD,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAe,GACvB,WAAW,CA0Db;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAOpF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Routes tool calls to a REST/webhook endpoint.
|
|
6
|
+
* Supports bearer token, api-key, basic, and no-auth strategies.
|
|
7
|
+
* Injectable fetch for test isolation.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.buildAuthHeaders = buildAuthHeaders;
|
|
11
|
+
exports.createHttpHandler = createHttpHandler;
|
|
12
|
+
exports.createHttpAdapter = createHttpAdapter;
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Auth header builder
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
function buildAuthHeaders(auth) {
|
|
17
|
+
if (!auth || auth.type === 'none')
|
|
18
|
+
return {};
|
|
19
|
+
const credential = auth.envVar ? (process.env[auth.envVar] ?? '') : '';
|
|
20
|
+
switch (auth.type) {
|
|
21
|
+
case 'bearer':
|
|
22
|
+
return { Authorization: `Bearer ${credential}` };
|
|
23
|
+
case 'api-key': {
|
|
24
|
+
const headerName = auth.headerName ?? 'X-API-Key';
|
|
25
|
+
return { [headerName]: credential };
|
|
26
|
+
}
|
|
27
|
+
case 'basic': {
|
|
28
|
+
const encoded = Buffer.from(credential).toString('base64');
|
|
29
|
+
return { Authorization: `Basic ${encoded}` };
|
|
30
|
+
}
|
|
31
|
+
default:
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function createHttpHandler(manifest, actionName, fetchFn = fetch) {
|
|
36
|
+
const endpoint = manifest.endpoint;
|
|
37
|
+
const timeoutMs = manifest.timeout_ms ?? 10_000;
|
|
38
|
+
return async (args) => {
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
const prefixedName = `${manifest.id}__${actionName}`;
|
|
41
|
+
try {
|
|
42
|
+
const authHeaders = buildAuthHeaders(manifest.auth);
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
45
|
+
let response;
|
|
46
|
+
try {
|
|
47
|
+
response = await fetchFn(`${endpoint}/tools/call`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
...authHeaders,
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({ name: actionName, arguments: args }),
|
|
54
|
+
signal: controller.signal,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
}
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
const text = await response.text().catch(() => '');
|
|
62
|
+
return {
|
|
63
|
+
toolId: manifest.id,
|
|
64
|
+
action: prefixedName,
|
|
65
|
+
success: false,
|
|
66
|
+
error: `HTTP ${response.status}: ${text.slice(0, 200)}`,
|
|
67
|
+
durationMs: Date.now() - start,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
return {
|
|
72
|
+
toolId: manifest.id,
|
|
73
|
+
action: prefixedName,
|
|
74
|
+
success: true,
|
|
75
|
+
data,
|
|
76
|
+
durationMs: Date.now() - start,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
return {
|
|
82
|
+
toolId: manifest.id,
|
|
83
|
+
action: prefixedName,
|
|
84
|
+
success: false,
|
|
85
|
+
error: msg.includes('abort') ? `Timeout after ${timeoutMs}ms` : msg,
|
|
86
|
+
durationMs: Date.now() - start,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function createHttpAdapter(opts) {
|
|
92
|
+
const handlers = new Map();
|
|
93
|
+
for (const action of opts.manifest.tools) {
|
|
94
|
+
const prefixedName = `${opts.manifest.id}__${action.name}`;
|
|
95
|
+
handlers.set(prefixedName, createHttpHandler(opts.manifest, action.name, opts.fetchFn));
|
|
96
|
+
}
|
|
97
|
+
return handlers;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=http-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapter.js","sourceRoot":"","sources":["../../../src/adapters/http-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Adapter
|
|
3
|
+
*
|
|
4
|
+
* Routes tool calls to an external MCP server (HTTP transport).
|
|
5
|
+
* Sends POST /tools/call in MCP JSON-RPC style and reads the result.
|
|
6
|
+
* For stdio MCP servers, users should set endpoint to the HTTP bridge URL.
|
|
7
|
+
*
|
|
8
|
+
* Injectable fetch for test isolation.
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolManifest, ToolHandler } from '../types.js';
|
|
11
|
+
import { type FetchFn } from './http-adapter.js';
|
|
12
|
+
export declare function createMcpHandler(manifest: ToolManifest, actionName: string, fetchFn?: FetchFn): ToolHandler;
|
|
13
|
+
export declare function createMcpAdapter(manifest: ToolManifest, fetchFn?: FetchFn): Map<string, ToolHandler>;
|
|
14
|
+
//# sourceMappingURL=mcp-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/mcp-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA0BnE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAe,GACvB,WAAW,CAuGb;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,OAAe,GACvB,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAO1B"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Adapter
|
|
4
|
+
*
|
|
5
|
+
* Routes tool calls to an external MCP server (HTTP transport).
|
|
6
|
+
* Sends POST /tools/call in MCP JSON-RPC style and reads the result.
|
|
7
|
+
* For stdio MCP servers, users should set endpoint to the HTTP bridge URL.
|
|
8
|
+
*
|
|
9
|
+
* Injectable fetch for test isolation.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createMcpHandler = createMcpHandler;
|
|
13
|
+
exports.createMcpAdapter = createMcpAdapter;
|
|
14
|
+
const http_adapter_js_1 = require("./http-adapter.js");
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// MCP handler factory
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
let _mcpRequestId = 1;
|
|
19
|
+
function createMcpHandler(manifest, actionName, fetchFn = fetch) {
|
|
20
|
+
const endpoint = manifest.endpoint;
|
|
21
|
+
const timeoutMs = manifest.timeout_ms ?? 10_000;
|
|
22
|
+
return async (args) => {
|
|
23
|
+
const start = Date.now();
|
|
24
|
+
const prefixedName = `${manifest.id}__${actionName}`;
|
|
25
|
+
const requestId = _mcpRequestId++;
|
|
26
|
+
const body = {
|
|
27
|
+
jsonrpc: '2.0',
|
|
28
|
+
id: requestId,
|
|
29
|
+
method: 'tools/call',
|
|
30
|
+
params: { name: actionName, arguments: args },
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
const authHeaders = (0, http_adapter_js_1.buildAuthHeaders)(manifest.auth);
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
36
|
+
let response;
|
|
37
|
+
try {
|
|
38
|
+
response = await fetchFn(endpoint, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
Accept: 'application/json',
|
|
43
|
+
...authHeaders,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
signal: controller.signal,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
}
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const text = await response.text().catch(() => '');
|
|
54
|
+
return {
|
|
55
|
+
toolId: manifest.id,
|
|
56
|
+
action: prefixedName,
|
|
57
|
+
success: false,
|
|
58
|
+
error: `MCP HTTP ${response.status}: ${text.slice(0, 200)}`,
|
|
59
|
+
durationMs: Date.now() - start,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const rpc = (await response.json());
|
|
63
|
+
if (rpc.error) {
|
|
64
|
+
return {
|
|
65
|
+
toolId: manifest.id,
|
|
66
|
+
action: prefixedName,
|
|
67
|
+
success: false,
|
|
68
|
+
error: `MCP error ${rpc.error.code}: ${rpc.error.message}`,
|
|
69
|
+
durationMs: Date.now() - start,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const result = rpc.result;
|
|
73
|
+
if (!result) {
|
|
74
|
+
return {
|
|
75
|
+
toolId: manifest.id,
|
|
76
|
+
action: prefixedName,
|
|
77
|
+
success: true,
|
|
78
|
+
data: null,
|
|
79
|
+
durationMs: Date.now() - start,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Extract text content from MCP content array
|
|
83
|
+
const textContent = result.content
|
|
84
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
85
|
+
.map((c) => c.text)
|
|
86
|
+
.join('\n');
|
|
87
|
+
let parsedData = textContent;
|
|
88
|
+
try {
|
|
89
|
+
parsedData = JSON.parse(textContent);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// keep as string
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
toolId: manifest.id,
|
|
96
|
+
action: prefixedName,
|
|
97
|
+
success: !result.isError,
|
|
98
|
+
data: parsedData,
|
|
99
|
+
error: result.isError ? String(parsedData) : undefined,
|
|
100
|
+
durationMs: Date.now() - start,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
105
|
+
return {
|
|
106
|
+
toolId: manifest.id,
|
|
107
|
+
action: prefixedName,
|
|
108
|
+
success: false,
|
|
109
|
+
error: msg.includes('abort') ? `Timeout after ${timeoutMs}ms` : msg,
|
|
110
|
+
durationMs: Date.now() - start,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function createMcpAdapter(manifest, fetchFn = fetch) {
|
|
116
|
+
const handlers = new Map();
|
|
117
|
+
for (const action of manifest.tools) {
|
|
118
|
+
const prefixedName = `${manifest.id}__${action.name}`;
|
|
119
|
+
handlers.set(prefixedName, createMcpHandler(manifest, action.name, fetchFn));
|
|
120
|
+
}
|
|
121
|
+
return handlers;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=mcp-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-adapter.js","sourceRoot":"","sources":["../../../src/adapters/mcp-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script Adapter
|
|
3
|
+
*
|
|
4
|
+
* Executes a local script (bash/python/Node) and reads JSON from stdout.
|
|
5
|
+
* The script receives tool arguments as a JSON string on stdin or via the
|
|
6
|
+
* WEAVE_TOOL_ARGS environment variable.
|
|
7
|
+
*
|
|
8
|
+
* Injectable spawn function for test isolation.
|
|
9
|
+
*/
|
|
10
|
+
import { spawn, type SpawnOptionsWithoutStdio } from 'node:child_process';
|
|
11
|
+
import type { ToolManifest, ToolHandler } from '../types.js';
|
|
12
|
+
export type SpawnFn = (command: string, args: string[], options: SpawnOptionsWithoutStdio) => ReturnType<typeof spawn>;
|
|
13
|
+
export declare function runScript(scriptPath: string, actionName: string, args: Record<string, unknown>, env: Record<string, string>, timeoutMs: number, spawnFn?: SpawnFn): Promise<{
|
|
14
|
+
stdout: string;
|
|
15
|
+
stderr: string;
|
|
16
|
+
exitCode: number;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function createScriptHandler(manifest: ToolManifest, actionName: string, spawnFn?: SpawnFn): ToolHandler;
|
|
19
|
+
export declare function createScriptAdapter(manifest: ToolManifest, spawnFn?: SpawnFn): Map<string, ToolHandler>;
|
|
20
|
+
//# sourceMappingURL=script-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/script-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAkB,WAAW,EAAE,MAAM,aAAa,CAAC;AAM7E,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,wBAAwB,KAC9B,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAM9B,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA2C/D;AAMD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,WAAW,CAuDb;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,OAAO,GAChB,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAO1B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Script Adapter
|
|
4
|
+
*
|
|
5
|
+
* Executes a local script (bash/python/Node) and reads JSON from stdout.
|
|
6
|
+
* The script receives tool arguments as a JSON string on stdin or via the
|
|
7
|
+
* WEAVE_TOOL_ARGS environment variable.
|
|
8
|
+
*
|
|
9
|
+
* Injectable spawn function for test isolation.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.runScript = runScript;
|
|
13
|
+
exports.createScriptHandler = createScriptHandler;
|
|
14
|
+
exports.createScriptAdapter = createScriptAdapter;
|
|
15
|
+
const node_child_process_1 = require("node:child_process");
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Script runner
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
function runScript(scriptPath, actionName, args, env, timeoutMs, spawnFn = node_child_process_1.spawn) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const child = spawnFn(scriptPath, [actionName], {
|
|
22
|
+
env: {
|
|
23
|
+
...process.env,
|
|
24
|
+
WEAVE_TOOL_ACTION: actionName,
|
|
25
|
+
WEAVE_TOOL_ARGS: JSON.stringify(args),
|
|
26
|
+
...env,
|
|
27
|
+
},
|
|
28
|
+
shell: true,
|
|
29
|
+
});
|
|
30
|
+
let stdout = '';
|
|
31
|
+
let stderr = '';
|
|
32
|
+
let timedOut = false;
|
|
33
|
+
const timer = setTimeout(() => {
|
|
34
|
+
timedOut = true;
|
|
35
|
+
child.kill('SIGTERM');
|
|
36
|
+
}, timeoutMs);
|
|
37
|
+
child.stdout?.on('data', (chunk) => {
|
|
38
|
+
stdout += chunk.toString();
|
|
39
|
+
});
|
|
40
|
+
child.stderr?.on('data', (chunk) => {
|
|
41
|
+
stderr += chunk.toString();
|
|
42
|
+
});
|
|
43
|
+
child.on('close', (code) => {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
resolve({
|
|
46
|
+
stdout,
|
|
47
|
+
stderr,
|
|
48
|
+
exitCode: timedOut ? -1 : (code ?? 0),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
child.on('error', (err) => {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
resolve({ stdout: '', stderr: err.message, exitCode: -2 });
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Handler factory
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function createScriptHandler(manifest, actionName, spawnFn) {
|
|
61
|
+
const scriptPath = manifest.scriptPath;
|
|
62
|
+
const timeoutMs = manifest.timeout_ms ?? 10_000;
|
|
63
|
+
const scriptEnv = manifest.scriptEnv ?? {};
|
|
64
|
+
return async (args) => {
|
|
65
|
+
const start = Date.now();
|
|
66
|
+
const prefixedName = `${manifest.id}__${actionName}`;
|
|
67
|
+
const { stdout, stderr, exitCode } = await runScript(scriptPath, actionName, args, scriptEnv, timeoutMs, spawnFn);
|
|
68
|
+
if (exitCode === -1) {
|
|
69
|
+
return {
|
|
70
|
+
toolId: manifest.id,
|
|
71
|
+
action: prefixedName,
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Script timeout after ${timeoutMs}ms`,
|
|
74
|
+
durationMs: Date.now() - start,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (exitCode !== 0) {
|
|
78
|
+
return {
|
|
79
|
+
toolId: manifest.id,
|
|
80
|
+
action: prefixedName,
|
|
81
|
+
success: false,
|
|
82
|
+
error: stderr.trim() || `Script exited with code ${exitCode}`,
|
|
83
|
+
durationMs: Date.now() - start,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Parse JSON from stdout
|
|
87
|
+
const trimmed = stdout.trim();
|
|
88
|
+
let data = trimmed;
|
|
89
|
+
try {
|
|
90
|
+
data = JSON.parse(trimmed);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Return raw string if not valid JSON
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
toolId: manifest.id,
|
|
97
|
+
action: prefixedName,
|
|
98
|
+
success: true,
|
|
99
|
+
data,
|
|
100
|
+
durationMs: Date.now() - start,
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function createScriptAdapter(manifest, spawnFn) {
|
|
105
|
+
const handlers = new Map();
|
|
106
|
+
for (const action of manifest.tools) {
|
|
107
|
+
const prefixedName = `${manifest.id}__${action.name}`;
|
|
108
|
+
handlers.set(prefixedName, createScriptHandler(manifest, action.name, spawnFn));
|
|
109
|
+
}
|
|
110
|
+
return handlers;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=script-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-adapter.js","sourceRoot":"","sources":["../../../src/adapters/script-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openweave/weave-tools
|
|
3
|
+
*
|
|
4
|
+
* External Tool Registry & Adapters — M24
|
|
5
|
+
* Enables users and developers to register any external tool and expose it
|
|
6
|
+
* to the OpenWeave agent as if it were a native tool.
|
|
7
|
+
*/
|
|
8
|
+
export { validateManifest, type AdapterType, type AuthType, type ToolAuth, type ToolInputSchema, type ToolAction, type ToolManifest, type ManifestValidationResult, type ToolCallResult, type ToolHandler, type RegisteredExternalTool, } from './types.js';
|
|
9
|
+
export { buildAuthHeaders, createHttpHandler, createHttpAdapter, type FetchFn, type HttpAdapterOptions, } from './adapters/http-adapter.js';
|
|
10
|
+
export { createMcpHandler, createMcpAdapter, } from './adapters/mcp-adapter.js';
|
|
11
|
+
export { runScript, createScriptHandler, createScriptAdapter, type SpawnFn, } from './adapters/script-adapter.js';
|
|
12
|
+
export { loadManifestFile, loadLocalManifests, loadNpmManifests, loadAllManifests, type LoadResult, type FsAdapter as LoaderFsAdapter, } from './tool-loader.js';
|
|
13
|
+
export { ToolStore, createToolStore, type ToolStoreData, } from './tool-store.js';
|
|
14
|
+
export { ExternalToolBridge, type ToolRegistryLike, } from './tool-bridge.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,OAAO,GACb,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,IAAI,eAAe,GAClC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @openweave/weave-tools
|
|
4
|
+
*
|
|
5
|
+
* External Tool Registry & Adapters — M24
|
|
6
|
+
* Enables users and developers to register any external tool and expose it
|
|
7
|
+
* to the OpenWeave agent as if it were a native tool.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ExternalToolBridge = exports.createToolStore = exports.ToolStore = exports.loadAllManifests = exports.loadNpmManifests = exports.loadLocalManifests = exports.loadManifestFile = exports.createScriptAdapter = exports.createScriptHandler = exports.runScript = exports.createMcpAdapter = exports.createMcpHandler = exports.createHttpAdapter = exports.createHttpHandler = exports.buildAuthHeaders = exports.validateManifest = void 0;
|
|
11
|
+
// Types
|
|
12
|
+
var types_js_1 = require("./types.js");
|
|
13
|
+
Object.defineProperty(exports, "validateManifest", { enumerable: true, get: function () { return types_js_1.validateManifest; } });
|
|
14
|
+
// Adapters
|
|
15
|
+
var http_adapter_js_1 = require("./adapters/http-adapter.js");
|
|
16
|
+
Object.defineProperty(exports, "buildAuthHeaders", { enumerable: true, get: function () { return http_adapter_js_1.buildAuthHeaders; } });
|
|
17
|
+
Object.defineProperty(exports, "createHttpHandler", { enumerable: true, get: function () { return http_adapter_js_1.createHttpHandler; } });
|
|
18
|
+
Object.defineProperty(exports, "createHttpAdapter", { enumerable: true, get: function () { return http_adapter_js_1.createHttpAdapter; } });
|
|
19
|
+
var mcp_adapter_js_1 = require("./adapters/mcp-adapter.js");
|
|
20
|
+
Object.defineProperty(exports, "createMcpHandler", { enumerable: true, get: function () { return mcp_adapter_js_1.createMcpHandler; } });
|
|
21
|
+
Object.defineProperty(exports, "createMcpAdapter", { enumerable: true, get: function () { return mcp_adapter_js_1.createMcpAdapter; } });
|
|
22
|
+
var script_adapter_js_1 = require("./adapters/script-adapter.js");
|
|
23
|
+
Object.defineProperty(exports, "runScript", { enumerable: true, get: function () { return script_adapter_js_1.runScript; } });
|
|
24
|
+
Object.defineProperty(exports, "createScriptHandler", { enumerable: true, get: function () { return script_adapter_js_1.createScriptHandler; } });
|
|
25
|
+
Object.defineProperty(exports, "createScriptAdapter", { enumerable: true, get: function () { return script_adapter_js_1.createScriptAdapter; } });
|
|
26
|
+
// Loader
|
|
27
|
+
var tool_loader_js_1 = require("./tool-loader.js");
|
|
28
|
+
Object.defineProperty(exports, "loadManifestFile", { enumerable: true, get: function () { return tool_loader_js_1.loadManifestFile; } });
|
|
29
|
+
Object.defineProperty(exports, "loadLocalManifests", { enumerable: true, get: function () { return tool_loader_js_1.loadLocalManifests; } });
|
|
30
|
+
Object.defineProperty(exports, "loadNpmManifests", { enumerable: true, get: function () { return tool_loader_js_1.loadNpmManifests; } });
|
|
31
|
+
Object.defineProperty(exports, "loadAllManifests", { enumerable: true, get: function () { return tool_loader_js_1.loadAllManifests; } });
|
|
32
|
+
// Store
|
|
33
|
+
var tool_store_js_1 = require("./tool-store.js");
|
|
34
|
+
Object.defineProperty(exports, "ToolStore", { enumerable: true, get: function () { return tool_store_js_1.ToolStore; } });
|
|
35
|
+
Object.defineProperty(exports, "createToolStore", { enumerable: true, get: function () { return tool_store_js_1.createToolStore; } });
|
|
36
|
+
// Bridge
|
|
37
|
+
var tool_bridge_js_1 = require("./tool-bridge.js");
|
|
38
|
+
Object.defineProperty(exports, "ExternalToolBridge", { enumerable: true, get: function () { return tool_bridge_js_1.ExternalToolBridge; } });
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,QAAQ;AACR,uCAYoB;AAXlB,4GAAA,gBAAgB,OAAA;AAalB,WAAW;AACX,8DAMoC;AALlC,mHAAA,gBAAgB,OAAA;AAChB,oHAAA,iBAAiB,OAAA;AACjB,oHAAA,iBAAiB,OAAA;AAKnB,4DAGmC;AAFjC,kHAAA,gBAAgB,OAAA;AAChB,kHAAA,gBAAgB,OAAA;AAGlB,kEAKsC;AAJpC,8GAAA,SAAS,OAAA;AACT,wHAAA,mBAAmB,OAAA;AACnB,wHAAA,mBAAmB,OAAA;AAIrB,SAAS;AACT,mDAO0B;AANxB,kHAAA,gBAAgB,OAAA;AAChB,oHAAA,kBAAkB,OAAA;AAClB,kHAAA,gBAAgB,OAAA;AAChB,kHAAA,gBAAgB,OAAA;AAKlB,QAAQ;AACR,iDAIyB;AAHvB,0GAAA,SAAS,OAAA;AACT,gHAAA,eAAe,OAAA;AAIjB,SAAS;AACT,mDAG0B;AAFxB,oHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExternalToolBridge
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates tool discovery, manifest loading, adapter creation and
|
|
5
|
+
* registration into any object that exposes a `register(name, handler)` API.
|
|
6
|
+
*
|
|
7
|
+
* This is the main entry point called from `AgentCore.init()`.
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - Loads manifests from ToolLoader (local + npm)
|
|
11
|
+
* - Persists to ToolStore
|
|
12
|
+
* - Creates adapter handlers (HTTP / MCP / Script)
|
|
13
|
+
* - Registers prefixed action names into the provided registry
|
|
14
|
+
*/
|
|
15
|
+
import { type FsAdapter } from './tool-loader.js';
|
|
16
|
+
import { ToolStore } from './tool-store.js';
|
|
17
|
+
import { type ToolManifest, type RegisteredExternalTool, type ToolCallResult } from './types.js';
|
|
18
|
+
export interface ToolRegistryLike {
|
|
19
|
+
/** Register a new tool action */
|
|
20
|
+
register(def: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
parameters?: unknown;
|
|
24
|
+
}, handler: (args: Record<string, unknown>) => Promise<ToolCallResult>): void;
|
|
25
|
+
}
|
|
26
|
+
export declare class ExternalToolBridge {
|
|
27
|
+
private readonly registeredTools;
|
|
28
|
+
private readonly store;
|
|
29
|
+
private readonly projectRoot;
|
|
30
|
+
constructor(projectRoot: string, store?: ToolStore);
|
|
31
|
+
private createHandlers;
|
|
32
|
+
/**
|
|
33
|
+
* Register a single manifest and wire its handlers into the registry.
|
|
34
|
+
*/
|
|
35
|
+
registerManifest(manifest: ToolManifest, registry?: ToolRegistryLike): RegisteredExternalTool;
|
|
36
|
+
/**
|
|
37
|
+
* Load all manifests from disk and register them.
|
|
38
|
+
* Called from AgentCore.init().
|
|
39
|
+
*/
|
|
40
|
+
loadAll(registry?: ToolRegistryLike, fs?: FsAdapter): Promise<{
|
|
41
|
+
loaded: number;
|
|
42
|
+
errors: Array<{
|
|
43
|
+
source: string;
|
|
44
|
+
error: string;
|
|
45
|
+
}>;
|
|
46
|
+
}>;
|
|
47
|
+
get(id: string): RegisteredExternalTool | undefined;
|
|
48
|
+
list(): RegisteredExternalTool[];
|
|
49
|
+
has(id: string): boolean;
|
|
50
|
+
get size(): number;
|
|
51
|
+
/** Remove a tool at runtime */
|
|
52
|
+
unregister(id: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Execute an action directly (useful when calling from the CLI `weave tools test`).
|
|
55
|
+
*/
|
|
56
|
+
execute(prefixedActionName: string, args: Record<string, unknown>): Promise<ToolCallResult>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=tool-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.d.ts","sourceRoot":"","sources":["../../src/tool-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,QAAQ,CACN,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,EAChE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,GAClE,IAAI,CAAC;CACT;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;IAClF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS;IAOlD,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,sBAAsB;IAkCzB;;;OAGG;IACG,OAAO,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;QAClE,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClD,CAAC;IAcF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS;IAInD,IAAI,IAAI,sBAAsB,EAAE;IAIhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+BAA+B;IAC/B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAM/B;;OAEG;IACG,OAAO,CACX,kBAAkB,EAAE,MAAM,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC;CAgB3B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExternalToolBridge
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates tool discovery, manifest loading, adapter creation and
|
|
6
|
+
* registration into any object that exposes a `register(name, handler)` API.
|
|
7
|
+
*
|
|
8
|
+
* This is the main entry point called from `AgentCore.init()`.
|
|
9
|
+
*
|
|
10
|
+
* Design:
|
|
11
|
+
* - Loads manifests from ToolLoader (local + npm)
|
|
12
|
+
* - Persists to ToolStore
|
|
13
|
+
* - Creates adapter handlers (HTTP / MCP / Script)
|
|
14
|
+
* - Registers prefixed action names into the provided registry
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ExternalToolBridge = void 0;
|
|
18
|
+
const http_adapter_js_1 = require("./adapters/http-adapter.js");
|
|
19
|
+
const mcp_adapter_js_1 = require("./adapters/mcp-adapter.js");
|
|
20
|
+
const script_adapter_js_1 = require("./adapters/script-adapter.js");
|
|
21
|
+
const tool_loader_js_1 = require("./tool-loader.js");
|
|
22
|
+
const tool_store_js_1 = require("./tool-store.js");
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// ExternalToolBridge
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
class ExternalToolBridge {
|
|
27
|
+
registeredTools = new Map();
|
|
28
|
+
store;
|
|
29
|
+
projectRoot;
|
|
30
|
+
constructor(projectRoot, store) {
|
|
31
|
+
this.projectRoot = projectRoot;
|
|
32
|
+
this.store = store ?? new tool_store_js_1.ToolStore(projectRoot);
|
|
33
|
+
}
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
createHandlers(manifest) {
|
|
36
|
+
switch (manifest.adapter) {
|
|
37
|
+
case 'http':
|
|
38
|
+
return (0, http_adapter_js_1.createHttpAdapter)({ manifest });
|
|
39
|
+
case 'mcp':
|
|
40
|
+
return (0, mcp_adapter_js_1.createMcpAdapter)(manifest);
|
|
41
|
+
case 'script':
|
|
42
|
+
return (0, script_adapter_js_1.createScriptAdapter)(manifest);
|
|
43
|
+
default:
|
|
44
|
+
return new Map();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register a single manifest and wire its handlers into the registry.
|
|
49
|
+
*/
|
|
50
|
+
registerManifest(manifest, registry) {
|
|
51
|
+
const handlers = this.createHandlers(manifest);
|
|
52
|
+
const actionNames = Array.from(handlers.keys());
|
|
53
|
+
const registered = {
|
|
54
|
+
manifest,
|
|
55
|
+
actionNames,
|
|
56
|
+
handlers,
|
|
57
|
+
registeredAt: new Date().toISOString(),
|
|
58
|
+
};
|
|
59
|
+
this.registeredTools.set(manifest.id, registered);
|
|
60
|
+
this.store.add(manifest);
|
|
61
|
+
// Wire handlers into the registry (if provided)
|
|
62
|
+
if (registry) {
|
|
63
|
+
for (const action of manifest.tools) {
|
|
64
|
+
const prefixedName = `${manifest.id}__${action.name}`;
|
|
65
|
+
const handler = handlers.get(prefixedName);
|
|
66
|
+
if (handler) {
|
|
67
|
+
registry.register({
|
|
68
|
+
name: prefixedName,
|
|
69
|
+
description: `[${manifest.name}] ${action.description}`,
|
|
70
|
+
}, handler);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return registered;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load all manifests from disk and register them.
|
|
78
|
+
* Called from AgentCore.init().
|
|
79
|
+
*/
|
|
80
|
+
async loadAll(registry, fs) {
|
|
81
|
+
const { manifests, errors } = (0, tool_loader_js_1.loadAllManifests)(this.projectRoot, fs);
|
|
82
|
+
for (const manifest of manifests) {
|
|
83
|
+
this.registerManifest(manifest, registry);
|
|
84
|
+
}
|
|
85
|
+
return { loaded: manifests.length, errors };
|
|
86
|
+
}
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
// Query API
|
|
89
|
+
// -------------------------------------------------------------------------
|
|
90
|
+
get(id) {
|
|
91
|
+
return this.registeredTools.get(id);
|
|
92
|
+
}
|
|
93
|
+
list() {
|
|
94
|
+
return Array.from(this.registeredTools.values());
|
|
95
|
+
}
|
|
96
|
+
has(id) {
|
|
97
|
+
return this.registeredTools.has(id);
|
|
98
|
+
}
|
|
99
|
+
get size() {
|
|
100
|
+
return this.registeredTools.size;
|
|
101
|
+
}
|
|
102
|
+
/** Remove a tool at runtime */
|
|
103
|
+
unregister(id) {
|
|
104
|
+
const existed = this.registeredTools.delete(id);
|
|
105
|
+
this.store.remove(id);
|
|
106
|
+
return existed;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Execute an action directly (useful when calling from the CLI `weave tools test`).
|
|
110
|
+
*/
|
|
111
|
+
async execute(prefixedActionName, args) {
|
|
112
|
+
// Find which tool owns this action
|
|
113
|
+
for (const reg of this.registeredTools.values()) {
|
|
114
|
+
const handler = reg.handlers.get(prefixedActionName);
|
|
115
|
+
if (handler) {
|
|
116
|
+
return handler(args);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
toolId: 'unknown',
|
|
121
|
+
action: prefixedActionName,
|
|
122
|
+
success: false,
|
|
123
|
+
error: `Action "${prefixedActionName}" not found in any registered tool`,
|
|
124
|
+
durationMs: 0,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.ExternalToolBridge = ExternalToolBridge;
|
|
129
|
+
//# sourceMappingURL=tool-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../../src/tool-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Loader
|
|
3
|
+
*
|
|
4
|
+
* Discovers ToolManifest descriptors from:
|
|
5
|
+
* 1. `.weave/tools/*.tool.json` — local project manifests
|
|
6
|
+
* 2. npm packages under `node_modules/@openweave-tools/` — community adapters
|
|
7
|
+
*
|
|
8
|
+
* Injectable FS functions for test isolation.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
11
|
+
import { type ToolManifest } from './types.js';
|
|
12
|
+
export interface LoadResult {
|
|
13
|
+
manifests: ToolManifest[];
|
|
14
|
+
errors: Array<{
|
|
15
|
+
source: string;
|
|
16
|
+
error: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface FsAdapter {
|
|
20
|
+
existsSync: typeof existsSync;
|
|
21
|
+
readdirSync: typeof readdirSync;
|
|
22
|
+
readFileSync: typeof readFileSync;
|
|
23
|
+
}
|
|
24
|
+
export declare function loadManifestFile(filePath: string, fs?: FsAdapter): {
|
|
25
|
+
manifest: ToolManifest | null;
|
|
26
|
+
error: string | null;
|
|
27
|
+
};
|
|
28
|
+
/** Scans `.weave/tools/` directory for `*.tool.json` files. */
|
|
29
|
+
export declare function loadLocalManifests(projectRoot: string, fs?: FsAdapter): LoadResult;
|
|
30
|
+
/** Scans `node_modules/@openweave-tools/` for community adapter packages. */
|
|
31
|
+
export declare function loadNpmManifests(projectRoot: string, fs?: FsAdapter): LoadResult;
|
|
32
|
+
/** Load all manifests: local + npm. */
|
|
33
|
+
export declare function loadAllManifests(projectRoot: string, fs?: FsAdapter): LoadResult;
|
|
34
|
+
//# sourceMappingURL=tool-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-loader.d.ts","sourceRoot":"","sources":["../../src/tool-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhE,OAAO,EAAoB,KAAK,YAAY,EAAiC,MAAM,YAAY,CAAC;AAMhG,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC;AAQD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,GAAE,SAAsB,GACzB;IAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAqBzD;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,SAAsB,GACzB,UAAU,CA0BZ;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,SAAsB,GACzB,UAAU,CA2BZ;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,EAAE,GAAE,SAAsB,GACzB,UAAU,CAQZ"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Loader
|
|
4
|
+
*
|
|
5
|
+
* Discovers ToolManifest descriptors from:
|
|
6
|
+
* 1. `.weave/tools/*.tool.json` — local project manifests
|
|
7
|
+
* 2. npm packages under `node_modules/@openweave-tools/` — community adapters
|
|
8
|
+
*
|
|
9
|
+
* Injectable FS functions for test isolation.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.loadManifestFile = loadManifestFile;
|
|
13
|
+
exports.loadLocalManifests = loadLocalManifests;
|
|
14
|
+
exports.loadNpmManifests = loadNpmManifests;
|
|
15
|
+
exports.loadAllManifests = loadAllManifests;
|
|
16
|
+
const node_fs_1 = require("node:fs");
|
|
17
|
+
const node_path_1 = require("node:path");
|
|
18
|
+
const types_js_1 = require("./types.js");
|
|
19
|
+
const DEFAULT_FS = { existsSync: node_fs_1.existsSync, readdirSync: node_fs_1.readdirSync, readFileSync: node_fs_1.readFileSync };
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Loaders
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function loadManifestFile(filePath, fs = DEFAULT_FS) {
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = fs.readFileSync(filePath, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { manifest: null, error: `Cannot read file: ${err instanceof Error ? err.message : String(err)}` };
|
|
30
|
+
}
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return { manifest: null, error: `Invalid JSON in ${filePath}` };
|
|
37
|
+
}
|
|
38
|
+
const validation = (0, types_js_1.validateManifest)(parsed);
|
|
39
|
+
if (!validation.valid) {
|
|
40
|
+
return { manifest: null, error: `Validation failed: ${validation.errors.join('; ')}` };
|
|
41
|
+
}
|
|
42
|
+
return { manifest: parsed, error: null };
|
|
43
|
+
}
|
|
44
|
+
/** Scans `.weave/tools/` directory for `*.tool.json` files. */
|
|
45
|
+
function loadLocalManifests(projectRoot, fs = DEFAULT_FS) {
|
|
46
|
+
const toolsDir = (0, node_path_1.join)(projectRoot, '.weave', 'tools');
|
|
47
|
+
const result = { manifests: [], errors: [] };
|
|
48
|
+
if (!fs.existsSync(toolsDir))
|
|
49
|
+
return result;
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = fs.readdirSync(toolsDir);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
result.errors.push({ source: toolsDir, error: String(err) });
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.endsWith('.tool.json'))
|
|
60
|
+
continue;
|
|
61
|
+
const filePath = (0, node_path_1.join)(toolsDir, entry);
|
|
62
|
+
const { manifest, error } = loadManifestFile(filePath, fs);
|
|
63
|
+
if (error) {
|
|
64
|
+
result.errors.push({ source: filePath, error });
|
|
65
|
+
}
|
|
66
|
+
else if (manifest) {
|
|
67
|
+
result.manifests.push(manifest);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
/** Scans `node_modules/@openweave-tools/` for community adapter packages. */
|
|
73
|
+
function loadNpmManifests(projectRoot, fs = DEFAULT_FS) {
|
|
74
|
+
const nmDir = (0, node_path_1.join)(projectRoot, 'node_modules', '@openweave-tools');
|
|
75
|
+
const result = { manifests: [], errors: [] };
|
|
76
|
+
if (!fs.existsSync(nmDir))
|
|
77
|
+
return result;
|
|
78
|
+
let pkgs;
|
|
79
|
+
try {
|
|
80
|
+
pkgs = fs.readdirSync(nmDir);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
for (const pkg of pkgs) {
|
|
86
|
+
// Each @openweave-tools/<pkg> may have an `openweave.tool.json` at its root
|
|
87
|
+
const manifestPath = (0, node_path_1.join)(nmDir, pkg, 'openweave.tool.json');
|
|
88
|
+
if (!fs.existsSync(manifestPath))
|
|
89
|
+
continue;
|
|
90
|
+
const { manifest, error } = loadManifestFile(manifestPath, fs);
|
|
91
|
+
if (error) {
|
|
92
|
+
result.errors.push({ source: manifestPath, error });
|
|
93
|
+
}
|
|
94
|
+
else if (manifest) {
|
|
95
|
+
result.manifests.push(manifest);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/** Load all manifests: local + npm. */
|
|
101
|
+
function loadAllManifests(projectRoot, fs = DEFAULT_FS) {
|
|
102
|
+
const local = loadLocalManifests(projectRoot, fs);
|
|
103
|
+
const npm = loadNpmManifests(projectRoot, fs);
|
|
104
|
+
return {
|
|
105
|
+
manifests: [...local.manifests, ...npm.manifests],
|
|
106
|
+
errors: [...local.errors, ...npm.errors],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=tool-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-loader.js","sourceRoot":"","sources":["../../src/tool-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Store
|
|
3
|
+
*
|
|
4
|
+
* Persists registered tool manifests to `.weave/tools.json`.
|
|
5
|
+
* Supports add / remove / list / get operations.
|
|
6
|
+
*
|
|
7
|
+
* Injectable FS functions for test isolation.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
10
|
+
import type { ToolManifest } from './types.js';
|
|
11
|
+
export interface ToolStoreData {
|
|
12
|
+
version: 1;
|
|
13
|
+
tools: Record<string, ToolManifest>;
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface FsAdapter {
|
|
17
|
+
existsSync: typeof existsSync;
|
|
18
|
+
readFileSync: typeof readFileSync;
|
|
19
|
+
writeFileSync: typeof writeFileSync;
|
|
20
|
+
mkdirSync: typeof mkdirSync;
|
|
21
|
+
}
|
|
22
|
+
export declare class ToolStore {
|
|
23
|
+
private readonly storePath;
|
|
24
|
+
private readonly fs;
|
|
25
|
+
constructor(projectRoot: string, fs?: FsAdapter);
|
|
26
|
+
private read;
|
|
27
|
+
private write;
|
|
28
|
+
add(manifest: ToolManifest): void;
|
|
29
|
+
remove(id: string): boolean;
|
|
30
|
+
get(id: string): ToolManifest | null;
|
|
31
|
+
list(): ToolManifest[];
|
|
32
|
+
has(id: string): boolean;
|
|
33
|
+
size(): number;
|
|
34
|
+
clear(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function createToolStore(projectRoot: string, fs?: FsAdapter): ToolStore;
|
|
37
|
+
//# sourceMappingURL=tool-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-store.d.ts","sourceRoot":"","sources":["../../src/tool-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,SAAS,EAAE,OAAO,SAAS,CAAC;CAC7B;AAQD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;gBAEnB,WAAW,EAAE,MAAM,EAAE,EAAE,GAAE,SAAsB;IAO3D,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,KAAK;IAUb,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAOjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKpC,IAAI,IAAI,YAAY,EAAE;IAKtB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKxB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AAMD,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,SAAS,GACb,SAAS,CAEX"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Store
|
|
4
|
+
*
|
|
5
|
+
* Persists registered tool manifests to `.weave/tools.json`.
|
|
6
|
+
* Supports add / remove / list / get operations.
|
|
7
|
+
*
|
|
8
|
+
* Injectable FS functions for test isolation.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ToolStore = void 0;
|
|
12
|
+
exports.createToolStore = createToolStore;
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const DEFAULT_FS = { existsSync: node_fs_1.existsSync, readFileSync: node_fs_1.readFileSync, writeFileSync: node_fs_1.writeFileSync, mkdirSync: node_fs_1.mkdirSync };
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// ToolStore
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
class ToolStore {
|
|
20
|
+
storePath;
|
|
21
|
+
fs;
|
|
22
|
+
constructor(projectRoot, fs = DEFAULT_FS) {
|
|
23
|
+
this.storePath = (0, node_path_1.join)(projectRoot, '.weave', 'tools.json');
|
|
24
|
+
this.fs = fs;
|
|
25
|
+
}
|
|
26
|
+
// -------------------------------------------------------------------------
|
|
27
|
+
read() {
|
|
28
|
+
if (!this.fs.existsSync(this.storePath)) {
|
|
29
|
+
return { version: 1, tools: {}, updatedAt: new Date().toISOString() };
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const raw = this.fs.readFileSync(this.storePath, 'utf8');
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return { version: 1, tools: {}, updatedAt: new Date().toISOString() };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
write(data) {
|
|
40
|
+
const dir = (0, node_path_1.dirname)(this.storePath);
|
|
41
|
+
if (!this.fs.existsSync(dir)) {
|
|
42
|
+
this.fs.mkdirSync(dir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
this.fs.writeFileSync(this.storePath, JSON.stringify(data, null, 2), 'utf8');
|
|
45
|
+
}
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
add(manifest) {
|
|
48
|
+
const data = this.read();
|
|
49
|
+
data.tools[manifest.id] = manifest;
|
|
50
|
+
data.updatedAt = new Date().toISOString();
|
|
51
|
+
this.write(data);
|
|
52
|
+
}
|
|
53
|
+
remove(id) {
|
|
54
|
+
const data = this.read();
|
|
55
|
+
if (!(id in data.tools))
|
|
56
|
+
return false;
|
|
57
|
+
delete data.tools[id];
|
|
58
|
+
data.updatedAt = new Date().toISOString();
|
|
59
|
+
this.write(data);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
get(id) {
|
|
63
|
+
const data = this.read();
|
|
64
|
+
return data.tools[id] ?? null;
|
|
65
|
+
}
|
|
66
|
+
list() {
|
|
67
|
+
const data = this.read();
|
|
68
|
+
return Object.values(data.tools);
|
|
69
|
+
}
|
|
70
|
+
has(id) {
|
|
71
|
+
const data = this.read();
|
|
72
|
+
return id in data.tools;
|
|
73
|
+
}
|
|
74
|
+
size() {
|
|
75
|
+
return this.list().length;
|
|
76
|
+
}
|
|
77
|
+
clear() {
|
|
78
|
+
this.write({ version: 1, tools: {}, updatedAt: new Date().toISOString() });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.ToolStore = ToolStore;
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Factory
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function createToolStore(projectRoot, fs) {
|
|
86
|
+
return new ToolStore(projectRoot, fs);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=tool-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-store.js","sourceRoot":"","sources":["../../src/tool-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeaveTools — Type Definitions (M24)
|
|
3
|
+
*
|
|
4
|
+
* Core contracts for the External Tool Registry & Adapters system.
|
|
5
|
+
* A ToolManifest describes any external tool; adapters route calls to the right backend.
|
|
6
|
+
*/
|
|
7
|
+
/** Transport mechanism used to reach the external tool. */
|
|
8
|
+
export type AdapterType = 'http' | 'mcp' | 'script';
|
|
9
|
+
/** Authentication strategies for HTTP/MCP adapters. */
|
|
10
|
+
export type AuthType = 'bearer' | 'api-key' | 'basic' | 'none';
|
|
11
|
+
export interface ToolAuth {
|
|
12
|
+
type: AuthType;
|
|
13
|
+
/** Name of the environment variable holding the credential */
|
|
14
|
+
envVar?: string;
|
|
15
|
+
/** HTTP header name for api-key auth (default: 'X-API-Key') */
|
|
16
|
+
headerName?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ToolInputSchema {
|
|
19
|
+
type: 'object';
|
|
20
|
+
properties: Record<string, {
|
|
21
|
+
type: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
enum?: unknown[];
|
|
24
|
+
}>;
|
|
25
|
+
required?: string[];
|
|
26
|
+
}
|
|
27
|
+
/** A single callable action within an external tool manifest. */
|
|
28
|
+
export interface ToolAction {
|
|
29
|
+
/** Matches the MCP tool name / HTTP action path */
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
inputSchema: ToolInputSchema;
|
|
33
|
+
}
|
|
34
|
+
export interface ToolManifest {
|
|
35
|
+
/** Unique identifier, used as prefix: `<id>__<action>` */
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
version: string;
|
|
40
|
+
adapter: AdapterType;
|
|
41
|
+
endpoint?: string;
|
|
42
|
+
auth?: ToolAuth;
|
|
43
|
+
/** Path to executable script (relative to project root) */
|
|
44
|
+
scriptPath?: string;
|
|
45
|
+
/** Extra environment variables to pass to the script */
|
|
46
|
+
scriptEnv?: Record<string, string>;
|
|
47
|
+
/** Timeout in milliseconds (default: 10 000) */
|
|
48
|
+
timeout_ms?: number;
|
|
49
|
+
tools: ToolAction[];
|
|
50
|
+
}
|
|
51
|
+
export interface ManifestValidationResult {
|
|
52
|
+
valid: boolean;
|
|
53
|
+
errors: string[];
|
|
54
|
+
}
|
|
55
|
+
export declare function validateManifest(manifest: unknown): ManifestValidationResult;
|
|
56
|
+
/** Result of invoking a single tool action. */
|
|
57
|
+
export interface ToolCallResult {
|
|
58
|
+
toolId: string;
|
|
59
|
+
action: string;
|
|
60
|
+
success: boolean;
|
|
61
|
+
data?: unknown;
|
|
62
|
+
error?: string;
|
|
63
|
+
durationMs: number;
|
|
64
|
+
}
|
|
65
|
+
/** Internal handler function registered in the tool registry for each action. */
|
|
66
|
+
export type ToolHandler = (args: Record<string, unknown>) => Promise<ToolCallResult>;
|
|
67
|
+
/** A registered external tool with its resolved handler. */
|
|
68
|
+
export interface RegisteredExternalTool {
|
|
69
|
+
manifest: ToolManifest;
|
|
70
|
+
/** Prefixed action names: `<id>__<action>` */
|
|
71
|
+
actionNames: string[];
|
|
72
|
+
handlers: Map<string, ToolHandler>;
|
|
73
|
+
registeredAt: string;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpD,uDAAuD;AACvD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IACrF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,eAAe,CAAC;CAC9B;AAMD,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IAGrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAGhB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAMD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,wBAAwB,CA4C5E;AAMD,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAErF,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WeaveTools — Type Definitions (M24)
|
|
4
|
+
*
|
|
5
|
+
* Core contracts for the External Tool Registry & Adapters system.
|
|
6
|
+
* A ToolManifest describes any external tool; adapters route calls to the right backend.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.validateManifest = validateManifest;
|
|
10
|
+
function validateManifest(manifest) {
|
|
11
|
+
const errors = [];
|
|
12
|
+
if (!manifest || typeof manifest !== 'object') {
|
|
13
|
+
return { valid: false, errors: ['Manifest must be an object'] };
|
|
14
|
+
}
|
|
15
|
+
const m = manifest;
|
|
16
|
+
if (!m['id'] || typeof m['id'] !== 'string')
|
|
17
|
+
errors.push('Missing required field: id (string)');
|
|
18
|
+
if (!m['name'] || typeof m['name'] !== 'string')
|
|
19
|
+
errors.push('Missing required field: name (string)');
|
|
20
|
+
if (!m['description'] || typeof m['description'] !== 'string')
|
|
21
|
+
errors.push('Missing required field: description (string)');
|
|
22
|
+
if (!m['version'] || typeof m['version'] !== 'string')
|
|
23
|
+
errors.push('Missing required field: version (string)');
|
|
24
|
+
const validAdapters = ['http', 'mcp', 'script'];
|
|
25
|
+
if (!validAdapters.includes(m['adapter'])) {
|
|
26
|
+
errors.push(`Invalid adapter "${m['adapter']}" — must be one of: ${validAdapters.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
if (m['adapter'] === 'http' || m['adapter'] === 'mcp') {
|
|
29
|
+
if (!m['endpoint'] || typeof m['endpoint'] !== 'string') {
|
|
30
|
+
errors.push('HTTP/MCP adapter requires endpoint (string)');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (m['adapter'] === 'script') {
|
|
34
|
+
if (!m['scriptPath'] || typeof m['scriptPath'] !== 'string') {
|
|
35
|
+
errors.push('Script adapter requires scriptPath (string)');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!Array.isArray(m['tools'])) {
|
|
39
|
+
errors.push('Missing required field: tools (array)');
|
|
40
|
+
}
|
|
41
|
+
else if (m['tools'].length === 0) {
|
|
42
|
+
errors.push('tools array must contain at least one action');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
for (const t of m['tools']) {
|
|
46
|
+
const tool = t;
|
|
47
|
+
if (!tool['name'])
|
|
48
|
+
errors.push(`Tool action missing "name" field`);
|
|
49
|
+
if (!tool['description'])
|
|
50
|
+
errors.push(`Tool action "${tool['name']}" missing "description"`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { valid: errors.length === 0, errors };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openweave/weave-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "WeaveTools — External Tool Registry & Adapters for OpenWeave agent extensibility",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
|
-
"main": "./dist/index.js",
|
|
8
|
+
"main": "./dist/cjs/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
9
10
|
"types": "./dist/index.d.ts",
|
|
10
11
|
"files": [
|
|
11
12
|
"dist",
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
],
|
|
14
15
|
"exports": {
|
|
15
16
|
".": {
|
|
17
|
+
"require": "./dist/cjs/index.js",
|
|
16
18
|
"import": "./dist/index.js",
|
|
17
19
|
"types": "./dist/index.d.ts"
|
|
18
20
|
}
|
|
@@ -31,7 +33,7 @@
|
|
|
31
33
|
"vitest": "3.0.0"
|
|
32
34
|
},
|
|
33
35
|
"scripts": {
|
|
34
|
-
"build": "tsc",
|
|
36
|
+
"build": "tsc && tsc -p tsconfig.cjs.json && node -e \"require('fs').writeFileSync('dist/cjs/package.json', '{\\\"type\\\":\\\"commonjs\\\"}')\" ",
|
|
35
37
|
"dev": "tsc --watch",
|
|
36
38
|
"test": "vitest",
|
|
37
39
|
"lint": "eslint src --max-warnings 0",
|