@a5c-ai/tool-mux 5.0.1-staging.016f0b0e8119
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/README.md +57 -0
- package/dist/__tests__/dispatch.test.d.ts +2 -0
- package/dist/__tests__/dispatch.test.d.ts.map +1 -0
- package/dist/__tests__/dispatch.test.js +209 -0
- package/dist/__tests__/dispatch.test.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +2 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +100 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/mcp-bridge.test.d.ts +2 -0
- package/dist/__tests__/mcp-bridge.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-bridge.test.js +129 -0
- package/dist/__tests__/mcp-bridge.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +162 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/schema-translation.test.d.ts +2 -0
- package/dist/__tests__/schema-translation.test.d.ts.map +1 -0
- package/dist/__tests__/schema-translation.test.js +126 -0
- package/dist/__tests__/schema-translation.test.js.map +1 -0
- package/dist/dispatch.d.ts +40 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +117 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/hooks.d.ts +42 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +25 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-bridge.d.ts +54 -0
- package/dist/mcp-bridge.d.ts.map +1 -0
- package/dist/mcp-bridge.js +77 -0
- package/dist/mcp-bridge.js.map +1 -0
- package/dist/registry.d.ts +40 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +83 -0
- package/dist/registry.js.map +1 -0
- package/dist/schema-translation.d.ts +38 -0
- package/dist/schema-translation.d.ts.map +1 -0
- package/dist/schema-translation.js +61 -0
- package/dist/schema-translation.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
2
|
+
import { ToolRegistry } from '../registry.js';
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
/* Helpers */
|
|
5
|
+
/* -------------------------------------------------------------------------- */
|
|
6
|
+
function makeTool(overrides = {}) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'test_tool',
|
|
9
|
+
description: 'A test tool',
|
|
10
|
+
parameters: { type: 'object', properties: {} },
|
|
11
|
+
source: 'builtin',
|
|
12
|
+
...overrides,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function makeServer(id, tools, overrides = {}) {
|
|
16
|
+
return {
|
|
17
|
+
id,
|
|
18
|
+
name: `Server ${id}`,
|
|
19
|
+
type: 'native',
|
|
20
|
+
tools,
|
|
21
|
+
...overrides,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/* ========================================================================== */
|
|
25
|
+
/* ToolRegistry */
|
|
26
|
+
/* ========================================================================== */
|
|
27
|
+
describe('ToolRegistry', () => {
|
|
28
|
+
let registry;
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
registry = new ToolRegistry();
|
|
31
|
+
});
|
|
32
|
+
/* ---------------------------------------------------------------------- */
|
|
33
|
+
/* Tool-level operations */
|
|
34
|
+
/* ---------------------------------------------------------------------- */
|
|
35
|
+
it('registers a tool and retrieves it by name', () => {
|
|
36
|
+
const tool = makeTool({ name: 'file_read' });
|
|
37
|
+
registry.register(tool);
|
|
38
|
+
const result = registry.get('file_read');
|
|
39
|
+
expect(result).toBeDefined();
|
|
40
|
+
expect(result.name).toBe('file_read');
|
|
41
|
+
expect(result.source).toBe('builtin');
|
|
42
|
+
});
|
|
43
|
+
it('registers multiple tools and lists all of them', () => {
|
|
44
|
+
registry.register(makeTool({ name: 'tool_a' }));
|
|
45
|
+
registry.register(makeTool({ name: 'tool_b' }));
|
|
46
|
+
registry.register(makeTool({ name: 'tool_c' }));
|
|
47
|
+
const all = registry.list();
|
|
48
|
+
expect(all).toHaveLength(3);
|
|
49
|
+
expect(all.map((t) => t.name).sort()).toEqual(['tool_a', 'tool_b', 'tool_c']);
|
|
50
|
+
});
|
|
51
|
+
it('registerAll registers an array of tools at once', () => {
|
|
52
|
+
registry.registerAll([
|
|
53
|
+
makeTool({ name: 'batch_a' }),
|
|
54
|
+
makeTool({ name: 'batch_b' }),
|
|
55
|
+
]);
|
|
56
|
+
expect(registry.size).toBe(2);
|
|
57
|
+
expect(registry.has('batch_a')).toBe(true);
|
|
58
|
+
expect(registry.has('batch_b')).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('unregisters a tool and returns true when it existed', () => {
|
|
61
|
+
registry.register(makeTool({ name: 'doomed' }));
|
|
62
|
+
expect(registry.has('doomed')).toBe(true);
|
|
63
|
+
const removed = registry.unregister('doomed');
|
|
64
|
+
expect(removed).toBe(true);
|
|
65
|
+
expect(registry.has('doomed')).toBe(false);
|
|
66
|
+
expect(registry.get('doomed')).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
it('unregister returns false for a non-existent tool', () => {
|
|
69
|
+
expect(registry.unregister('ghost')).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
it('returns undefined for an unknown tool name', () => {
|
|
72
|
+
expect(registry.get('does_not_exist')).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
it('has() returns false for missing tools', () => {
|
|
75
|
+
expect(registry.has('missing')).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
it('listByServer filters tools by server id', () => {
|
|
78
|
+
registry.register(makeTool({ name: 'mcp_a', server: 'srv-1', source: 'mcp' }));
|
|
79
|
+
registry.register(makeTool({ name: 'mcp_b', server: 'srv-1', source: 'mcp' }));
|
|
80
|
+
registry.register(makeTool({ name: 'local_a', server: 'srv-2', source: 'builtin' }));
|
|
81
|
+
registry.register(makeTool({ name: 'no_server', source: 'custom' }));
|
|
82
|
+
const srv1Tools = registry.listByServer('srv-1');
|
|
83
|
+
expect(srv1Tools).toHaveLength(2);
|
|
84
|
+
expect(srv1Tools.map((t) => t.name).sort()).toEqual(['mcp_a', 'mcp_b']);
|
|
85
|
+
const srv2Tools = registry.listByServer('srv-2');
|
|
86
|
+
expect(srv2Tools).toHaveLength(1);
|
|
87
|
+
expect(srv2Tools[0].name).toBe('local_a');
|
|
88
|
+
expect(registry.listByServer('unknown')).toHaveLength(0);
|
|
89
|
+
});
|
|
90
|
+
it('duplicate name overwrites the previous descriptor', () => {
|
|
91
|
+
registry.register(makeTool({ name: 'dup', description: 'original' }));
|
|
92
|
+
expect(registry.get('dup').description).toBe('original');
|
|
93
|
+
registry.register(makeTool({ name: 'dup', description: 'replaced' }));
|
|
94
|
+
expect(registry.get('dup').description).toBe('replaced');
|
|
95
|
+
expect(registry.size).toBe(1);
|
|
96
|
+
});
|
|
97
|
+
it('size reflects the current tool count', () => {
|
|
98
|
+
expect(registry.size).toBe(0);
|
|
99
|
+
registry.register(makeTool({ name: 'a' }));
|
|
100
|
+
expect(registry.size).toBe(1);
|
|
101
|
+
registry.register(makeTool({ name: 'b' }));
|
|
102
|
+
expect(registry.size).toBe(2);
|
|
103
|
+
registry.unregister('a');
|
|
104
|
+
expect(registry.size).toBe(1);
|
|
105
|
+
});
|
|
106
|
+
/* ---------------------------------------------------------------------- */
|
|
107
|
+
/* Server-level operations */
|
|
108
|
+
/* ---------------------------------------------------------------------- */
|
|
109
|
+
it('registerServer adds server entry and all its tools', () => {
|
|
110
|
+
const tools = [
|
|
111
|
+
makeTool({ name: 'srv_tool_a', source: 'mcp' }),
|
|
112
|
+
makeTool({ name: 'srv_tool_b', source: 'mcp' }),
|
|
113
|
+
];
|
|
114
|
+
const server = makeServer('s1', tools);
|
|
115
|
+
registry.registerServer(server);
|
|
116
|
+
// Server is retrievable
|
|
117
|
+
expect(registry.getServer('s1')).toBeDefined();
|
|
118
|
+
expect(registry.getServer('s1').name).toBe('Server s1');
|
|
119
|
+
// All tools are registered with server association
|
|
120
|
+
expect(registry.has('srv_tool_a')).toBe(true);
|
|
121
|
+
expect(registry.has('srv_tool_b')).toBe(true);
|
|
122
|
+
expect(registry.get('srv_tool_a').server).toBe('s1');
|
|
123
|
+
expect(registry.get('srv_tool_b').server).toBe('s1');
|
|
124
|
+
});
|
|
125
|
+
it('unregisterServer removes server and all its tools by default', () => {
|
|
126
|
+
const tools = [
|
|
127
|
+
makeTool({ name: 'remove_a', source: 'mcp' }),
|
|
128
|
+
makeTool({ name: 'remove_b', source: 'mcp' }),
|
|
129
|
+
];
|
|
130
|
+
registry.registerServer(makeServer('s2', tools));
|
|
131
|
+
expect(registry.has('remove_a')).toBe(true);
|
|
132
|
+
expect(registry.has('remove_b')).toBe(true);
|
|
133
|
+
const removed = registry.unregisterServer('s2');
|
|
134
|
+
expect(removed).toBe(true);
|
|
135
|
+
expect(registry.getServer('s2')).toBeUndefined();
|
|
136
|
+
expect(registry.has('remove_a')).toBe(false);
|
|
137
|
+
expect(registry.has('remove_b')).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('unregisterServer with removeTools=false keeps tools', () => {
|
|
140
|
+
const tools = [makeTool({ name: 'keep_me', source: 'mcp' })];
|
|
141
|
+
registry.registerServer(makeServer('s3', tools));
|
|
142
|
+
registry.unregisterServer('s3', false);
|
|
143
|
+
expect(registry.getServer('s3')).toBeUndefined();
|
|
144
|
+
expect(registry.has('keep_me')).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
it('listServers returns all registered servers', () => {
|
|
147
|
+
registry.registerServer(makeServer('a', []));
|
|
148
|
+
registry.registerServer(makeServer('b', []));
|
|
149
|
+
const servers = registry.listServers();
|
|
150
|
+
expect(servers).toHaveLength(2);
|
|
151
|
+
expect(servers.map((s) => s.id).sort()).toEqual(['a', 'b']);
|
|
152
|
+
});
|
|
153
|
+
it('clear removes all tools and servers', () => {
|
|
154
|
+
registry.register(makeTool({ name: 'solo' }));
|
|
155
|
+
registry.registerServer(makeServer('x', [makeTool({ name: 'grouped' })]));
|
|
156
|
+
registry.clear();
|
|
157
|
+
expect(registry.size).toBe(0);
|
|
158
|
+
expect(registry.list()).toHaveLength(0);
|
|
159
|
+
expect(registry.listServers()).toHaveLength(0);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-translation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema-translation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { toToolDescriptor, fromToolDescriptor, translateTools, } from '../schema-translation.js';
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
/* Helpers */
|
|
5
|
+
/* -------------------------------------------------------------------------- */
|
|
6
|
+
function makeNormalized(overrides = {}) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'test_tool',
|
|
9
|
+
description: 'A test tool',
|
|
10
|
+
parameters: { type: 'object', properties: { x: { type: 'string' } } },
|
|
11
|
+
...overrides,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function makeDescriptor(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
name: 'test_tool',
|
|
17
|
+
description: 'A test tool',
|
|
18
|
+
parameters: { type: 'object', properties: { x: { type: 'string' } } },
|
|
19
|
+
source: 'builtin',
|
|
20
|
+
...overrides,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/* ========================================================================== */
|
|
24
|
+
/* Schema Translation */
|
|
25
|
+
/* ========================================================================== */
|
|
26
|
+
describe('schema-translation', () => {
|
|
27
|
+
/* ---------------------------------------------------------------------- */
|
|
28
|
+
/* toToolDescriptor */
|
|
29
|
+
/* ---------------------------------------------------------------------- */
|
|
30
|
+
describe('toToolDescriptor', () => {
|
|
31
|
+
it('creates a ToolDescriptor from a NormalizedToolDefinition', () => {
|
|
32
|
+
const normalized = makeNormalized({ name: 'my_fn', description: 'Does stuff' });
|
|
33
|
+
const descriptor = toToolDescriptor(normalized, 'mcp');
|
|
34
|
+
expect(descriptor.name).toBe('my_fn');
|
|
35
|
+
expect(descriptor.description).toBe('Does stuff');
|
|
36
|
+
expect(descriptor.source).toBe('mcp');
|
|
37
|
+
expect(descriptor.parameters).toEqual(normalized.parameters);
|
|
38
|
+
});
|
|
39
|
+
it('attaches optional server, permissions, and metadata', () => {
|
|
40
|
+
const normalized = makeNormalized();
|
|
41
|
+
const descriptor = toToolDescriptor(normalized, 'plugin', {
|
|
42
|
+
server: 'srv-1',
|
|
43
|
+
permissions: ['read', 'write'],
|
|
44
|
+
metadata: { version: 2 },
|
|
45
|
+
});
|
|
46
|
+
expect(descriptor.server).toBe('srv-1');
|
|
47
|
+
expect(descriptor.permissions).toEqual(['read', 'write']);
|
|
48
|
+
expect(descriptor.metadata).toEqual({ version: 2 });
|
|
49
|
+
});
|
|
50
|
+
it('omits optional fields when extras are not provided', () => {
|
|
51
|
+
const descriptor = toToolDescriptor(makeNormalized(), 'builtin');
|
|
52
|
+
expect(descriptor.server).toBeUndefined();
|
|
53
|
+
expect(descriptor.permissions).toBeUndefined();
|
|
54
|
+
expect(descriptor.metadata).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
/* ---------------------------------------------------------------------- */
|
|
58
|
+
/* fromToolDescriptor */
|
|
59
|
+
/* ---------------------------------------------------------------------- */
|
|
60
|
+
describe('fromToolDescriptor', () => {
|
|
61
|
+
it('strips lifecycle metadata and returns NormalizedToolDefinition', () => {
|
|
62
|
+
const descriptor = makeDescriptor({
|
|
63
|
+
name: 'stripped',
|
|
64
|
+
description: 'keep me',
|
|
65
|
+
server: 'srv-x',
|
|
66
|
+
permissions: ['admin'],
|
|
67
|
+
metadata: { extra: true },
|
|
68
|
+
});
|
|
69
|
+
const normalized = fromToolDescriptor(descriptor);
|
|
70
|
+
expect(normalized.name).toBe('stripped');
|
|
71
|
+
expect(normalized.description).toBe('keep me');
|
|
72
|
+
expect(normalized.parameters).toEqual(descriptor.parameters);
|
|
73
|
+
// Lifecycle fields should not be present
|
|
74
|
+
expect(normalized.source).toBeUndefined();
|
|
75
|
+
expect(normalized.server).toBeUndefined();
|
|
76
|
+
expect(normalized.permissions).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
it('omits description when not present on descriptor', () => {
|
|
79
|
+
const descriptor = makeDescriptor({ description: undefined });
|
|
80
|
+
const normalized = fromToolDescriptor(descriptor);
|
|
81
|
+
expect(normalized).not.toHaveProperty('description');
|
|
82
|
+
});
|
|
83
|
+
it('omits parameters when not present on descriptor', () => {
|
|
84
|
+
const descriptor = makeDescriptor({ parameters: undefined });
|
|
85
|
+
const normalized = fromToolDescriptor(descriptor);
|
|
86
|
+
expect(normalized).not.toHaveProperty('parameters');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
/* ---------------------------------------------------------------------- */
|
|
90
|
+
/* Round-trip */
|
|
91
|
+
/* ---------------------------------------------------------------------- */
|
|
92
|
+
describe('round-trip', () => {
|
|
93
|
+
it('toToolDescriptor -> fromToolDescriptor preserves core data', () => {
|
|
94
|
+
const original = makeNormalized({
|
|
95
|
+
name: 'round_trip',
|
|
96
|
+
description: 'survives the trip',
|
|
97
|
+
parameters: { type: 'object', properties: { q: { type: 'number' } } },
|
|
98
|
+
});
|
|
99
|
+
const descriptor = toToolDescriptor(original, 'custom', { server: 'srv' });
|
|
100
|
+
const backToNormalized = fromToolDescriptor(descriptor);
|
|
101
|
+
expect(backToNormalized.name).toBe(original.name);
|
|
102
|
+
expect(backToNormalized.description).toBe(original.description);
|
|
103
|
+
expect(backToNormalized.parameters).toEqual(original.parameters);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
/* ---------------------------------------------------------------------- */
|
|
107
|
+
/* translateTools */
|
|
108
|
+
/* ---------------------------------------------------------------------- */
|
|
109
|
+
describe('translateTools', () => {
|
|
110
|
+
it('produces an array for a valid target format', () => {
|
|
111
|
+
const descriptors = [
|
|
112
|
+
makeDescriptor({ name: 'tool_a' }),
|
|
113
|
+
makeDescriptor({ name: 'tool_b' }),
|
|
114
|
+
];
|
|
115
|
+
const result = translateTools(descriptors, 'anthropic');
|
|
116
|
+
expect(Array.isArray(result)).toBe(true);
|
|
117
|
+
expect(result.length).toBeGreaterThan(0);
|
|
118
|
+
});
|
|
119
|
+
it('returns empty array for target format "none"', () => {
|
|
120
|
+
const descriptors = [makeDescriptor({ name: 'tool_a' })];
|
|
121
|
+
const result = translateTools(descriptors, 'none');
|
|
122
|
+
expect(result).toEqual([]);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=schema-translation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-translation.test.js","sourceRoot":"","sources":["../../src/__tests__/schema-translation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ToolCallContext, ToolCallResult, ToolDescriptor, ToolDispatchPolicy, ToolDispatchRule } from './types.js';
|
|
2
|
+
import type { ToolHookBridge } from './hooks.js';
|
|
3
|
+
import type { ToolRegistry } from './registry.js';
|
|
4
|
+
export type ToolExecutor = (tool: ToolDescriptor, context: ToolCallContext) => Promise<unknown>;
|
|
5
|
+
export interface ToolDispatcherOptions {
|
|
6
|
+
registry: ToolRegistry;
|
|
7
|
+
policy?: ToolDispatchPolicy;
|
|
8
|
+
hooks?: ToolHookBridge;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolves a tool call to the correct server using policy rules,
|
|
12
|
+
* runs before/after hooks, and delegates actual execution to a
|
|
13
|
+
* caller-supplied executor.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ToolDispatcher {
|
|
16
|
+
private readonly registry;
|
|
17
|
+
private readonly policy;
|
|
18
|
+
private readonly hooks;
|
|
19
|
+
constructor(options: ToolDispatcherOptions);
|
|
20
|
+
/** Set or replace the full dispatch policy. */
|
|
21
|
+
setPolicy(policy: ToolDispatchPolicy): void;
|
|
22
|
+
/** Add a single dispatch rule. */
|
|
23
|
+
addRule(rule: ToolDispatchRule): void;
|
|
24
|
+
/**
|
|
25
|
+
* Walk the policy rules (already sorted by priority) and return the
|
|
26
|
+
* first matching server id, falling back to the tool's own server
|
|
27
|
+
* field, then the policy default.
|
|
28
|
+
*/
|
|
29
|
+
resolveServer(toolName: string): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Full dispatch lifecycle:
|
|
32
|
+
* 1. Resolve descriptor + server
|
|
33
|
+
* 2. beforeToolUse hook
|
|
34
|
+
* 3. Execute via supplied executor
|
|
35
|
+
* 4. afterToolUse hook
|
|
36
|
+
* 5. Return result
|
|
37
|
+
*/
|
|
38
|
+
dispatch(context: ToolCallContext, executor: ToolExecutor): Promise<ToolCallResult>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAyBlD,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,eAAe,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;gBAEvC,OAAO,EAAE,qBAAqB;IAU1C,+CAA+C;IAC/C,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAK3C,kCAAkC;IAClC,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAUrC;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAoBnD;;;;;;;OAOG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,cAAc,CAAC;CA2C3B"}
|
package/dist/dispatch.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* Minimal glob matcher (no external deps) */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
/**
|
|
5
|
+
* Convert a simple glob pattern (supporting `*` and `?`) into a RegExp.
|
|
6
|
+
*
|
|
7
|
+
* This intentionally does NOT support `**`, brace expansion, or
|
|
8
|
+
* character classes — tool names are flat identifiers, so `*` for
|
|
9
|
+
* "any chars" and `?` for "single char" is sufficient.
|
|
10
|
+
*/
|
|
11
|
+
function globToRegex(pattern) {
|
|
12
|
+
const escaped = pattern
|
|
13
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
14
|
+
.replace(/\*/g, '.*')
|
|
15
|
+
.replace(/\?/g, '.');
|
|
16
|
+
return new RegExp(`^${escaped}$`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a tool call to the correct server using policy rules,
|
|
20
|
+
* runs before/after hooks, and delegates actual execution to a
|
|
21
|
+
* caller-supplied executor.
|
|
22
|
+
*/
|
|
23
|
+
export class ToolDispatcher {
|
|
24
|
+
registry;
|
|
25
|
+
policy;
|
|
26
|
+
hooks;
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.registry = options.registry;
|
|
29
|
+
this.policy = options.policy ?? { rules: [] };
|
|
30
|
+
this.hooks = options.hooks;
|
|
31
|
+
}
|
|
32
|
+
/* ---------------------------------------------------------------- */
|
|
33
|
+
/* Policy helpers */
|
|
34
|
+
/* ---------------------------------------------------------------- */
|
|
35
|
+
/** Set or replace the full dispatch policy. */
|
|
36
|
+
setPolicy(policy) {
|
|
37
|
+
this.policy.rules = policy.rules;
|
|
38
|
+
this.policy.defaultServer = policy.defaultServer;
|
|
39
|
+
}
|
|
40
|
+
/** Add a single dispatch rule. */
|
|
41
|
+
addRule(rule) {
|
|
42
|
+
this.policy.rules.push(rule);
|
|
43
|
+
// Keep rules sorted by descending priority so resolution is stable.
|
|
44
|
+
this.policy.rules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
45
|
+
}
|
|
46
|
+
/* ---------------------------------------------------------------- */
|
|
47
|
+
/* Resolution */
|
|
48
|
+
/* ---------------------------------------------------------------- */
|
|
49
|
+
/**
|
|
50
|
+
* Walk the policy rules (already sorted by priority) and return the
|
|
51
|
+
* first matching server id, falling back to the tool's own server
|
|
52
|
+
* field, then the policy default.
|
|
53
|
+
*/
|
|
54
|
+
resolveServer(toolName) {
|
|
55
|
+
for (const rule of this.policy.rules) {
|
|
56
|
+
if (globToRegex(rule.match).test(toolName)) {
|
|
57
|
+
return rule.server;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Fall back to the descriptor's own server association.
|
|
61
|
+
const descriptor = this.registry.get(toolName);
|
|
62
|
+
if (descriptor?.server) {
|
|
63
|
+
return descriptor.server;
|
|
64
|
+
}
|
|
65
|
+
return this.policy.defaultServer;
|
|
66
|
+
}
|
|
67
|
+
/* ---------------------------------------------------------------- */
|
|
68
|
+
/* Dispatch */
|
|
69
|
+
/* ---------------------------------------------------------------- */
|
|
70
|
+
/**
|
|
71
|
+
* Full dispatch lifecycle:
|
|
72
|
+
* 1. Resolve descriptor + server
|
|
73
|
+
* 2. beforeToolUse hook
|
|
74
|
+
* 3. Execute via supplied executor
|
|
75
|
+
* 4. afterToolUse hook
|
|
76
|
+
* 5. Return result
|
|
77
|
+
*/
|
|
78
|
+
async dispatch(context, executor) {
|
|
79
|
+
const descriptor = this.registry.get(context.toolName);
|
|
80
|
+
if (!descriptor) {
|
|
81
|
+
return {
|
|
82
|
+
output: null,
|
|
83
|
+
durationMs: 0,
|
|
84
|
+
error: `Tool not found: ${context.toolName}`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// --- before hook ---
|
|
88
|
+
if (this.hooks) {
|
|
89
|
+
const hookResult = await this.hooks.beforeToolUse(context, descriptor);
|
|
90
|
+
if (hookResult?.decision === 'deny') {
|
|
91
|
+
return {
|
|
92
|
+
output: null,
|
|
93
|
+
durationMs: 0,
|
|
94
|
+
error: hookResult.reason ?? 'Tool use denied by hook',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// --- execute ---
|
|
99
|
+
const start = Date.now();
|
|
100
|
+
let output;
|
|
101
|
+
let error;
|
|
102
|
+
try {
|
|
103
|
+
output = await executor(descriptor, context);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
error = err instanceof Error ? err.message : String(err);
|
|
107
|
+
}
|
|
108
|
+
const durationMs = Date.now() - start;
|
|
109
|
+
const result = { output, durationMs, error };
|
|
110
|
+
// --- after hook ---
|
|
111
|
+
if (this.hooks) {
|
|
112
|
+
await this.hooks.afterToolUse(context, descriptor, result);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool hook bridge — interface and no-op implementation.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the contract that integrates tool-mux dispatch
|
|
5
|
+
* with the hooks-mux lifecycle (PreToolUse / PostToolUse). The
|
|
6
|
+
* production implementation will delegate to the hooks-mux engine;
|
|
7
|
+
* for now a no-op bridge is provided so the rest of tool-mux can
|
|
8
|
+
* develop and test without a hard runtime dependency on hooks-mux.
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolCallContext, ToolCallResult, ToolDescriptor } from './types.js';
|
|
11
|
+
export interface ToolHookResult {
|
|
12
|
+
decision?: 'allow' | 'deny' | 'ask' | 'continue' | 'noop';
|
|
13
|
+
reason?: string;
|
|
14
|
+
toolMutation?: {
|
|
15
|
+
mode: 'replace' | 'patch';
|
|
16
|
+
value: unknown;
|
|
17
|
+
};
|
|
18
|
+
metadata?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolHookBridge {
|
|
21
|
+
/**
|
|
22
|
+
* Invoked immediately before a tool is executed.
|
|
23
|
+
* Returning a result with `decision: 'deny'` will short-circuit
|
|
24
|
+
* execution and surface the denial reason to the caller.
|
|
25
|
+
*/
|
|
26
|
+
beforeToolUse(context: ToolCallContext, descriptor: ToolDescriptor): Promise<ToolHookResult | undefined>;
|
|
27
|
+
/**
|
|
28
|
+
* Invoked immediately after a tool finishes (success or failure).
|
|
29
|
+
* The result is informational — the hook cannot retroactively
|
|
30
|
+
* block the call, but it can record telemetry, mutate state, etc.
|
|
31
|
+
*/
|
|
32
|
+
afterToolUse(context: ToolCallContext, descriptor: ToolDescriptor, result: ToolCallResult): Promise<ToolHookResult | undefined>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A bridge that does nothing — hooks are allowed to be absent.
|
|
36
|
+
* Swap this out for a real hooks-mux adapter when integrating.
|
|
37
|
+
*/
|
|
38
|
+
export declare class NoopToolHookBridge implements ToolHookBridge {
|
|
39
|
+
beforeToolUse(_context: ToolCallContext, _descriptor: ToolDescriptor): Promise<ToolHookResult | undefined>;
|
|
40
|
+
afterToolUse(_context: ToolCallContext, _descriptor: ToolDescriptor, _result: ToolCallResult): Promise<ToolHookResult | undefined>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMlF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,aAAa,CACX,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAEvC;;;;OAIG;IACH,YAAY,CACV,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;CACxC;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACjD,aAAa,CACjB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,cAAc,GAC1B,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAIhC,YAAY,CAChB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;CAGvC"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool hook bridge — interface and no-op implementation.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the contract that integrates tool-mux dispatch
|
|
5
|
+
* with the hooks-mux lifecycle (PreToolUse / PostToolUse). The
|
|
6
|
+
* production implementation will delegate to the hooks-mux engine;
|
|
7
|
+
* for now a no-op bridge is provided so the rest of tool-mux can
|
|
8
|
+
* develop and test without a hard runtime dependency on hooks-mux.
|
|
9
|
+
*/
|
|
10
|
+
/* ------------------------------------------------------------------ */
|
|
11
|
+
/* No-op implementation */
|
|
12
|
+
/* ------------------------------------------------------------------ */
|
|
13
|
+
/**
|
|
14
|
+
* A bridge that does nothing — hooks are allowed to be absent.
|
|
15
|
+
* Swap this out for a real hooks-mux adapter when integrating.
|
|
16
|
+
*/
|
|
17
|
+
export class NoopToolHookBridge {
|
|
18
|
+
async beforeToolUse(_context, _descriptor) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
async afterToolUse(_context, _descriptor, _result) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6CH,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,aAAa,CACjB,QAAyB,EACzB,WAA2B;QAE3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,QAAyB,EACzB,WAA2B,EAC3B,OAAuB;QAEvB,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { ToolSource, ToolDescriptor, ToolServer, ToolDispatchRule, ToolDispatchPolicy, ToolCallContext, ToolCallResult, } from './types.js';
|
|
2
|
+
export { ToolRegistry } from './registry.js';
|
|
3
|
+
export { ToolDispatcher } from './dispatch.js';
|
|
4
|
+
export type { ToolExecutor, ToolDispatcherOptions } from './dispatch.js';
|
|
5
|
+
export { convertTools, toToolDescriptor, fromToolDescriptor, translateTools, } from './schema-translation.js';
|
|
6
|
+
export type { NormalizedToolDefinition, CodecCapabilities } from './schema-translation.js';
|
|
7
|
+
export { NoopToolHookBridge } from './hooks.js';
|
|
8
|
+
export type { ToolHookBridge, ToolHookResult } from './hooks.js';
|
|
9
|
+
export { McpBridge } from './mcp-bridge.js';
|
|
10
|
+
export type { McpTransport, McpServerConfig, McpToolDefinition } from './mcp-bridge.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAMzE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAM3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* Types */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
/* ------------------------------------------------------------------ */
|
|
5
|
+
/* Registry */
|
|
6
|
+
/* ------------------------------------------------------------------ */
|
|
7
|
+
export { ToolRegistry } from './registry.js';
|
|
8
|
+
/* ------------------------------------------------------------------ */
|
|
9
|
+
/* Dispatch */
|
|
10
|
+
/* ------------------------------------------------------------------ */
|
|
11
|
+
export { ToolDispatcher } from './dispatch.js';
|
|
12
|
+
/* ------------------------------------------------------------------ */
|
|
13
|
+
/* Schema translation (re-exports from transport-mux + adapters) */
|
|
14
|
+
/* ------------------------------------------------------------------ */
|
|
15
|
+
export { convertTools, toToolDescriptor, fromToolDescriptor, translateTools, } from './schema-translation.js';
|
|
16
|
+
/* ------------------------------------------------------------------ */
|
|
17
|
+
/* Hooks bridge */
|
|
18
|
+
/* ------------------------------------------------------------------ */
|
|
19
|
+
export { NoopToolHookBridge } from './hooks.js';
|
|
20
|
+
/* ------------------------------------------------------------------ */
|
|
21
|
+
/* MCP bridge */
|
|
22
|
+
/* ------------------------------------------------------------------ */
|
|
23
|
+
export { McpBridge } from './mcp-bridge.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAYxE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,yBAAyB,CAAC;AAGjC,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|