@a5c-ai/tools-adapter 5.1.1-staging.0c6199708314
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 +251 -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 +172 -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 +196 -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/__tests__/unified-contract.test.d.ts +2 -0
- package/dist/__tests__/unified-contract.test.d.ts.map +1 -0
- package/dist/__tests__/unified-contract.test.js +98 -0
- package/dist/__tests__/unified-contract.test.js.map +1 -0
- package/dist/dispatch.d.ts +43 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +157 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/hooks.d.ts +99 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +110 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -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 +78 -0
- package/dist/mcp-bridge.js.map +1 -0
- package/dist/registry.d.ts +70 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +221 -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 +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ToolCallContext, ToolCallResult, ToolDescriptor, ToolDispatchPolicy, ToolDispatchRule, ToolExecutionPolicy, ToolExecutionLimits } 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
|
+
executionPolicy?: ToolExecutionPolicy;
|
|
9
|
+
hooks?: ToolHookBridge;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a tool call to the correct server using policy rules,
|
|
13
|
+
* runs before/after hooks, and delegates actual execution to a
|
|
14
|
+
* caller-supplied executor.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ToolDispatcher {
|
|
17
|
+
private readonly registry;
|
|
18
|
+
private readonly policy;
|
|
19
|
+
private readonly executionPolicy;
|
|
20
|
+
private readonly hooks;
|
|
21
|
+
constructor(options: ToolDispatcherOptions);
|
|
22
|
+
/** Set or replace the full dispatch policy. */
|
|
23
|
+
setPolicy(policy: ToolDispatchPolicy): void;
|
|
24
|
+
/** Add a single dispatch rule. */
|
|
25
|
+
addRule(rule: ToolDispatchRule): void;
|
|
26
|
+
/**
|
|
27
|
+
* Walk the policy rules (already sorted by priority) and return the
|
|
28
|
+
* first matching server id, falling back to the tool's own server
|
|
29
|
+
* field, then the policy default.
|
|
30
|
+
*/
|
|
31
|
+
resolveServer(toolName: string): string | undefined;
|
|
32
|
+
getExecutionLimits(toolName: string): ToolExecutionLimits;
|
|
33
|
+
/**
|
|
34
|
+
* Full dispatch lifecycle:
|
|
35
|
+
* 1. Resolve descriptor + server
|
|
36
|
+
* 2. beforeToolUse hook
|
|
37
|
+
* 3. Execute via supplied executor
|
|
38
|
+
* 4. afterToolUse hook
|
|
39
|
+
* 5. Return result
|
|
40
|
+
*/
|
|
41
|
+
dispatch(context: ToolCallContext, executor: ToolExecutor): Promise<ToolCallResult>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,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,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,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,eAAe,CAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;gBAEvC,OAAO,EAAE,qBAAqB;IAc1C,+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;IAgBnD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAazD;;;;;;;OAOG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,cAAc,CAAC;CAqD3B"}
|
package/dist/dispatch.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { ToolExecutionError, serializeToolError } from './types.js';
|
|
2
|
+
/* ------------------------------------------------------------------ */
|
|
3
|
+
/* Minimal glob matcher (no external deps) */
|
|
4
|
+
/* ------------------------------------------------------------------ */
|
|
5
|
+
/**
|
|
6
|
+
* Convert a simple glob pattern (supporting `*` and `?`) into a RegExp.
|
|
7
|
+
*
|
|
8
|
+
* This intentionally does NOT support `**`, brace expansion, or
|
|
9
|
+
* character classes — tool names are flat identifiers, so `*` for
|
|
10
|
+
* "any chars" and `?` for "single char" is sufficient.
|
|
11
|
+
*/
|
|
12
|
+
function globToRegex(pattern) {
|
|
13
|
+
const escaped = pattern
|
|
14
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
15
|
+
.replace(/\*/g, '.*')
|
|
16
|
+
.replace(/\?/g, '.');
|
|
17
|
+
return new RegExp(`^${escaped}$`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolves a tool call to the correct server using policy rules,
|
|
21
|
+
* runs before/after hooks, and delegates actual execution to a
|
|
22
|
+
* caller-supplied executor.
|
|
23
|
+
*/
|
|
24
|
+
export class ToolDispatcher {
|
|
25
|
+
registry;
|
|
26
|
+
policy;
|
|
27
|
+
executionPolicy;
|
|
28
|
+
hooks;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.registry = options.registry;
|
|
31
|
+
this.policy = options.policy ?? { rules: [] };
|
|
32
|
+
this.executionPolicy = options.executionPolicy ?? {
|
|
33
|
+
defaultTimeoutMs: 120_000,
|
|
34
|
+
defaultMaxOutputBytes: 50 * 1024 * 1024,
|
|
35
|
+
};
|
|
36
|
+
this.hooks = options.hooks;
|
|
37
|
+
}
|
|
38
|
+
/* ---------------------------------------------------------------- */
|
|
39
|
+
/* Policy helpers */
|
|
40
|
+
/* ---------------------------------------------------------------- */
|
|
41
|
+
/** Set or replace the full dispatch policy. */
|
|
42
|
+
setPolicy(policy) {
|
|
43
|
+
this.policy.rules = policy.rules;
|
|
44
|
+
this.policy.defaultServer = policy.defaultServer;
|
|
45
|
+
}
|
|
46
|
+
/** Add a single dispatch rule. */
|
|
47
|
+
addRule(rule) {
|
|
48
|
+
this.policy.rules.push(rule);
|
|
49
|
+
// Keep rules sorted by descending priority so resolution is stable.
|
|
50
|
+
this.policy.rules.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
51
|
+
}
|
|
52
|
+
/* ---------------------------------------------------------------- */
|
|
53
|
+
/* Resolution */
|
|
54
|
+
/* ---------------------------------------------------------------- */
|
|
55
|
+
/**
|
|
56
|
+
* Walk the policy rules (already sorted by priority) and return the
|
|
57
|
+
* first matching server id, falling back to the tool's own server
|
|
58
|
+
* field, then the policy default.
|
|
59
|
+
*/
|
|
60
|
+
resolveServer(toolName) {
|
|
61
|
+
for (const rule of this.policy.rules) {
|
|
62
|
+
if (globToRegex(rule.match).test(toolName)) {
|
|
63
|
+
return rule.server;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Fall back to the descriptor's own server association.
|
|
67
|
+
const descriptor = this.registry.get(toolName);
|
|
68
|
+
if (descriptor?.server) {
|
|
69
|
+
return descriptor.server;
|
|
70
|
+
}
|
|
71
|
+
return this.policy.defaultServer;
|
|
72
|
+
}
|
|
73
|
+
getExecutionLimits(toolName) {
|
|
74
|
+
const perTool = this.executionPolicy.perTool?.[toolName] ?? {};
|
|
75
|
+
return {
|
|
76
|
+
timeoutMs: perTool.timeoutMs ?? this.executionPolicy.defaultTimeoutMs,
|
|
77
|
+
maxOutputBytes: perTool.maxOutputBytes ?? this.executionPolicy.defaultMaxOutputBytes,
|
|
78
|
+
...(perTool.maxEvents !== undefined ? { maxEvents: perTool.maxEvents } : {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/* ---------------------------------------------------------------- */
|
|
82
|
+
/* Dispatch */
|
|
83
|
+
/* ---------------------------------------------------------------- */
|
|
84
|
+
/**
|
|
85
|
+
* Full dispatch lifecycle:
|
|
86
|
+
* 1. Resolve descriptor + server
|
|
87
|
+
* 2. beforeToolUse hook
|
|
88
|
+
* 3. Execute via supplied executor
|
|
89
|
+
* 4. afterToolUse hook
|
|
90
|
+
* 5. Return result
|
|
91
|
+
*/
|
|
92
|
+
async dispatch(context, executor) {
|
|
93
|
+
const descriptor = this.registry.get(context.toolName);
|
|
94
|
+
if (!descriptor) {
|
|
95
|
+
return {
|
|
96
|
+
output: null,
|
|
97
|
+
durationMs: 0,
|
|
98
|
+
error: `Tool not found: ${context.toolName}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
let effectiveContext = context;
|
|
102
|
+
// --- before hook ---
|
|
103
|
+
if (this.hooks) {
|
|
104
|
+
const hookResult = await this.hooks.beforeToolUse(context, descriptor);
|
|
105
|
+
if (hookResult?.decision === 'deny') {
|
|
106
|
+
return {
|
|
107
|
+
output: null,
|
|
108
|
+
durationMs: 0,
|
|
109
|
+
error: hookResult.reason ?? 'Tool use denied by hook',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (hookResult?.toolMutation) {
|
|
113
|
+
effectiveContext = {
|
|
114
|
+
...context,
|
|
115
|
+
input: applyToolMutation(context.input, hookResult.toolMutation),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// --- execute ---
|
|
120
|
+
const start = Date.now();
|
|
121
|
+
let output;
|
|
122
|
+
let error;
|
|
123
|
+
try {
|
|
124
|
+
output = await executor(descriptor, effectiveContext);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
error = err instanceof ToolExecutionError
|
|
128
|
+
? serializeToolError(err)
|
|
129
|
+
: err instanceof Error ? err.message : String(err);
|
|
130
|
+
}
|
|
131
|
+
const durationMs = Date.now() - start;
|
|
132
|
+
const result = { output, durationMs, error };
|
|
133
|
+
// --- after hook ---
|
|
134
|
+
if (this.hooks) {
|
|
135
|
+
await this.hooks.afterToolUse(effectiveContext, descriptor, result);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function applyToolMutation(input, mutation) {
|
|
141
|
+
if (mutation.mode === 'replace') {
|
|
142
|
+
return mutation.value;
|
|
143
|
+
}
|
|
144
|
+
if (input &&
|
|
145
|
+
typeof input === 'object' &&
|
|
146
|
+
!Array.isArray(input) &&
|
|
147
|
+
mutation.value &&
|
|
148
|
+
typeof mutation.value === 'object' &&
|
|
149
|
+
!Array.isArray(mutation.value)) {
|
|
150
|
+
return {
|
|
151
|
+
...input,
|
|
152
|
+
...mutation.value,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return mutation.value;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAapE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvB,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;AACpC,CAAC;AAkBD;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACR,QAAQ,CAAe;IACvB,MAAM,CAAqB;IAC3B,eAAe,CAAsB;IACrC,KAAK,CAA6B;IAEnD,YAAY,OAA8B;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI;YAChD,gBAAgB,EAAE,OAAO;YACzB,qBAAqB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SACxC,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE,+CAA+C;IAC/C,SAAS,CAAC,MAA0B;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IACnD,CAAC;IAED,kCAAkC;IAClC,OAAO,CAAC,IAAsB;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE;;;;OAIG;IACH,aAAa,CAAC,QAAgB;QAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;IAED,kBAAkB,CAAC,QAAgB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/D,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB;YACrE,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,CAAC,qBAAqB;YACpF,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACZ,OAAwB,EACxB,QAAsB;QAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,mBAAmB,OAAO,CAAC,QAAQ,EAAE;aAC7C,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,GAAG,OAAO,CAAC;QAE/B,sBAAsB;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACvE,IAAI,UAAU,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE,UAAU,CAAC,MAAM,IAAI,yBAAyB;iBACtD,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,EAAE,YAAY,EAAE,CAAC;gBAC7B,gBAAgB,GAAG;oBACjB,GAAG,OAAO;oBACV,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC;iBACjE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,MAAe,CAAC;QACpB,IAAI,KAA8B,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,KAAK,GAAG,GAAG,YAAY,kBAAkB;gBACvC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;gBACzB,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACtC,MAAM,MAAM,GAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAE7D,qBAAqB;QACrB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,iBAAiB,CACxB,KAAc,EACd,QAAuD;IAEvD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IACD,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,QAAQ,CAAC,KAAK;QACd,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;QAClC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC9B,CAAC;QACD,OAAO;YACL,GAAI,KAAiC;YACrC,GAAI,QAAQ,CAAC,KAAiC;SAC/C,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool hook bridge implementations.
|
|
3
|
+
*
|
|
4
|
+
* The bridge contract keeps tools-adapter independent from a concrete hooks-adapter
|
|
5
|
+
* package instance while allowing callers to pass a hooks-adapter-compatible engine.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolCallContext, ToolCallResult, ToolDescriptor } from './types.js';
|
|
8
|
+
export interface ToolHookResult {
|
|
9
|
+
decision?: 'allow' | 'deny' | 'ask' | 'continue' | 'noop';
|
|
10
|
+
reason?: string;
|
|
11
|
+
toolMutation?: {
|
|
12
|
+
mode: 'replace' | 'patch';
|
|
13
|
+
value: unknown;
|
|
14
|
+
};
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolHookBridge {
|
|
18
|
+
/**
|
|
19
|
+
* Invoked immediately before a tool is executed.
|
|
20
|
+
* Returning a result with `decision: 'deny'` will short-circuit
|
|
21
|
+
* execution and surface the denial reason to the caller.
|
|
22
|
+
*/
|
|
23
|
+
beforeToolUse(context: ToolCallContext, descriptor: ToolDescriptor): Promise<ToolHookResult | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Invoked immediately after a tool finishes (success or failure).
|
|
26
|
+
* The result is informational — the hook cannot retroactively
|
|
27
|
+
* block the call, but it can record telemetry, mutate state, etc.
|
|
28
|
+
*/
|
|
29
|
+
afterToolUse(context: ToolCallContext, descriptor: ToolDescriptor, result: ToolCallResult): Promise<ToolHookResult | undefined>;
|
|
30
|
+
}
|
|
31
|
+
export interface HooksMuxLikeResult {
|
|
32
|
+
decision?: 'allow' | 'deny' | 'block' | 'retry' | 'ask' | 'defer' | 'continue' | 'noop';
|
|
33
|
+
reason?: string;
|
|
34
|
+
toolMutation?: {
|
|
35
|
+
mode: 'replace' | 'patch';
|
|
36
|
+
value: unknown;
|
|
37
|
+
};
|
|
38
|
+
metadata?: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface HooksMuxLikeEngineResult {
|
|
41
|
+
mergedResult?: HooksMuxLikeResult;
|
|
42
|
+
result?: HooksMuxLikeResult;
|
|
43
|
+
}
|
|
44
|
+
export interface HooksMuxLikeEngine {
|
|
45
|
+
processNormalizedEvent(event: HooksMuxToolEvent): Promise<HooksMuxLikeEngineResult> | HooksMuxLikeEngineResult;
|
|
46
|
+
}
|
|
47
|
+
export interface HooksMuxToolHookBridgeOptions {
|
|
48
|
+
engine: HooksMuxLikeEngine;
|
|
49
|
+
adapter?: string;
|
|
50
|
+
env?: {
|
|
51
|
+
input?: Record<string, string>;
|
|
52
|
+
persisted?: Record<string, string>;
|
|
53
|
+
};
|
|
54
|
+
metadata?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
export interface HooksMuxToolEvent {
|
|
57
|
+
version: 'a5c.hooks.v1';
|
|
58
|
+
adapter: string;
|
|
59
|
+
phase: 'tool.before' | 'tool.after';
|
|
60
|
+
rawEventName: 'PreToolUse' | 'PostToolUse';
|
|
61
|
+
supportLevel: 'native';
|
|
62
|
+
execution: {
|
|
63
|
+
sessionId: string | null;
|
|
64
|
+
nativeEventName: 'PreToolUse' | 'PostToolUse';
|
|
65
|
+
adapter: string;
|
|
66
|
+
toolName: string;
|
|
67
|
+
toolCallId?: string | null;
|
|
68
|
+
source?: string | null;
|
|
69
|
+
metadata: Record<string, unknown>;
|
|
70
|
+
persistedEnv: Record<string, string>;
|
|
71
|
+
contextVars: Record<string, string>;
|
|
72
|
+
};
|
|
73
|
+
payload: Record<string, unknown>;
|
|
74
|
+
env: {
|
|
75
|
+
input: Record<string, string>;
|
|
76
|
+
persisted: Record<string, string>;
|
|
77
|
+
};
|
|
78
|
+
raw: unknown;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A bridge that does nothing — hooks are allowed to be absent.
|
|
82
|
+
* Swap this out for a real hooks-adapter adapter when integrating.
|
|
83
|
+
*/
|
|
84
|
+
export declare class NoopToolHookBridge implements ToolHookBridge {
|
|
85
|
+
beforeToolUse(_context: ToolCallContext, _descriptor: ToolDescriptor): Promise<ToolHookResult | undefined>;
|
|
86
|
+
afterToolUse(_context: ToolCallContext, _descriptor: ToolDescriptor, _result: ToolCallResult): Promise<ToolHookResult | undefined>;
|
|
87
|
+
}
|
|
88
|
+
export declare class HooksMuxToolHookBridge implements ToolHookBridge {
|
|
89
|
+
private readonly engine;
|
|
90
|
+
private readonly adapter;
|
|
91
|
+
private readonly env;
|
|
92
|
+
private readonly metadata;
|
|
93
|
+
constructor(options: HooksMuxToolHookBridgeOptions);
|
|
94
|
+
beforeToolUse(context: ToolCallContext, descriptor: ToolDescriptor): Promise<ToolHookResult | undefined>;
|
|
95
|
+
afterToolUse(context: ToolCallContext, descriptor: ToolDescriptor, result: ToolCallResult): Promise<ToolHookResult | undefined>;
|
|
96
|
+
private processToolEvent;
|
|
97
|
+
private buildEvent;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;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;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACxF,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;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAC;CAChH;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,GAAG,YAAY,CAAC;IACpC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC;IAC3C,YAAY,EAAE,QAAQ,CAAC;IACvB,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,eAAe,EAAE,YAAY,GAAG,aAAa,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,GAAG,EAAE,OAAO,CAAC;CACd;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;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAGlB;IACF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAEvC,OAAO,EAAE,6BAA6B;IAU5C,aAAa,CACjB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAIhC,YAAY,CAChB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;YAIxB,gBAAgB;IAY9B,OAAO,CAAC,UAAU;CA8CnB"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool hook bridge implementations.
|
|
3
|
+
*
|
|
4
|
+
* The bridge contract keeps tools-adapter independent from a concrete hooks-adapter
|
|
5
|
+
* package instance while allowing callers to pass a hooks-adapter-compatible engine.
|
|
6
|
+
*/
|
|
7
|
+
/* ------------------------------------------------------------------ */
|
|
8
|
+
/* No-op implementation */
|
|
9
|
+
/* ------------------------------------------------------------------ */
|
|
10
|
+
/**
|
|
11
|
+
* A bridge that does nothing — hooks are allowed to be absent.
|
|
12
|
+
* Swap this out for a real hooks-adapter adapter when integrating.
|
|
13
|
+
*/
|
|
14
|
+
export class NoopToolHookBridge {
|
|
15
|
+
async beforeToolUse(_context, _descriptor) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
async afterToolUse(_context, _descriptor, _result) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class HooksMuxToolHookBridge {
|
|
23
|
+
engine;
|
|
24
|
+
adapter;
|
|
25
|
+
env;
|
|
26
|
+
metadata;
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.engine = options.engine;
|
|
29
|
+
this.adapter = options.adapter ?? 'tools-adapter';
|
|
30
|
+
this.env = {
|
|
31
|
+
input: options.env?.input ?? {},
|
|
32
|
+
persisted: options.env?.persisted ?? {},
|
|
33
|
+
};
|
|
34
|
+
this.metadata = options.metadata ?? {};
|
|
35
|
+
}
|
|
36
|
+
async beforeToolUse(context, descriptor) {
|
|
37
|
+
return this.processToolEvent('tool.before', 'PreToolUse', context, descriptor);
|
|
38
|
+
}
|
|
39
|
+
async afterToolUse(context, descriptor, result) {
|
|
40
|
+
return this.processToolEvent('tool.after', 'PostToolUse', context, descriptor, result);
|
|
41
|
+
}
|
|
42
|
+
async processToolEvent(phase, rawEventName, context, descriptor, result) {
|
|
43
|
+
const event = this.buildEvent(phase, rawEventName, context, descriptor, result);
|
|
44
|
+
const engineResult = await this.engine.processNormalizedEvent(event);
|
|
45
|
+
return normalizeHookResult(engineResult.mergedResult ?? engineResult.result);
|
|
46
|
+
}
|
|
47
|
+
buildEvent(phase, rawEventName, context, descriptor, result) {
|
|
48
|
+
const payload = {
|
|
49
|
+
toolName: context.toolName,
|
|
50
|
+
input: context.input,
|
|
51
|
+
descriptor,
|
|
52
|
+
caller: context.caller,
|
|
53
|
+
runId: context.runId,
|
|
54
|
+
sessionId: context.sessionId,
|
|
55
|
+
};
|
|
56
|
+
if (result) {
|
|
57
|
+
payload.result = result;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
version: 'a5c.hooks.v1',
|
|
61
|
+
adapter: this.adapter,
|
|
62
|
+
phase,
|
|
63
|
+
rawEventName,
|
|
64
|
+
supportLevel: 'native',
|
|
65
|
+
execution: {
|
|
66
|
+
sessionId: context.sessionId ?? null,
|
|
67
|
+
nativeEventName: rawEventName,
|
|
68
|
+
adapter: this.adapter,
|
|
69
|
+
toolName: context.toolName,
|
|
70
|
+
toolCallId: context.runId ?? null,
|
|
71
|
+
source: descriptor.source,
|
|
72
|
+
metadata: {
|
|
73
|
+
...this.metadata,
|
|
74
|
+
caller: context.caller,
|
|
75
|
+
runId: context.runId,
|
|
76
|
+
server: descriptor.server,
|
|
77
|
+
},
|
|
78
|
+
persistedEnv: this.env.persisted,
|
|
79
|
+
contextVars: {},
|
|
80
|
+
},
|
|
81
|
+
payload,
|
|
82
|
+
env: this.env,
|
|
83
|
+
raw: payload,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function normalizeHookResult(result) {
|
|
88
|
+
if (!result)
|
|
89
|
+
return undefined;
|
|
90
|
+
const decision = result.decision === 'block' ? 'deny' : result.decision;
|
|
91
|
+
if (decision !== 'allow' &&
|
|
92
|
+
decision !== 'deny' &&
|
|
93
|
+
decision !== 'ask' &&
|
|
94
|
+
decision !== 'continue' &&
|
|
95
|
+
decision !== 'noop' &&
|
|
96
|
+
decision !== undefined) {
|
|
97
|
+
return {
|
|
98
|
+
decision: 'deny',
|
|
99
|
+
reason: result.reason ?? `Unsupported tool hook decision: ${result.decision}`,
|
|
100
|
+
metadata: result.metadata,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
decision,
|
|
105
|
+
reason: result.reason,
|
|
106
|
+
toolMutation: result.toolMutation,
|
|
107
|
+
metadata: result.metadata,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type { ToolSource, ToolDescriptor, ToolServer, ToolDispatchRule, ToolDispatchPolicy, ToolCallContext, ToolCallResult, ToolApprovalPolicy, ToolCacheCapability, ToolCategory, ToolCostHint, ToolErrorCode, ToolExecutionLimits, ToolExecutionPolicy, ToolRateLimitHint, SerializedToolError, UnifiedToolEvent, UnifiedToolMetadata, } from './types.js';
|
|
2
|
+
export { ToolExecutionError, serializeToolError } from './types.js';
|
|
3
|
+
export { ToolRegistry } from './registry.js';
|
|
4
|
+
export type { DeferredToolEntry, ResolvedToolEntry, SchemaLoader, ToolSchema, } from './registry.js';
|
|
5
|
+
export { ToolDispatcher } from './dispatch.js';
|
|
6
|
+
export type { ToolExecutor, ToolDispatcherOptions } from './dispatch.js';
|
|
7
|
+
export { convertTools, toToolDescriptor, fromToolDescriptor, translateTools, } from './schema-translation.js';
|
|
8
|
+
export type { NormalizedToolDefinition, CodecCapabilities } from './schema-translation.js';
|
|
9
|
+
export { HooksMuxToolHookBridge, NoopToolHookBridge } from './hooks.js';
|
|
10
|
+
export type { HooksMuxLikeEngine, HooksMuxLikeEngineResult, HooksMuxLikeResult, HooksMuxToolEvent, HooksMuxToolHookBridgeOptions, ToolHookBridge, ToolHookResult, } from './hooks.js';
|
|
11
|
+
export { McpBridge } from './mcp-bridge.js';
|
|
12
|
+
export type { McpTransport, McpServerConfig, McpToolDefinition } from './mcp-bridge.js';
|
|
13
|
+
//# 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,EACd,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMpE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,UAAU,GACX,MAAM,eAAe,CAAC;AAMvB,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,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxE,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,6BAA6B,EAC7B,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AAMpB,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,25 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* Types */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
export { ToolExecutionError, serializeToolError } from './types.js';
|
|
5
|
+
/* ------------------------------------------------------------------ */
|
|
6
|
+
/* Registry */
|
|
7
|
+
/* ------------------------------------------------------------------ */
|
|
8
|
+
export { ToolRegistry } from './registry.js';
|
|
9
|
+
/* ------------------------------------------------------------------ */
|
|
10
|
+
/* Dispatch */
|
|
11
|
+
/* ------------------------------------------------------------------ */
|
|
12
|
+
export { ToolDispatcher } from './dispatch.js';
|
|
13
|
+
/* ------------------------------------------------------------------ */
|
|
14
|
+
/* Schema translation (re-exports from transport-adapter + adapters) */
|
|
15
|
+
/* ------------------------------------------------------------------ */
|
|
16
|
+
export { convertTools, toToolDescriptor, fromToolDescriptor, translateTools, } from './schema-translation.js';
|
|
17
|
+
/* ------------------------------------------------------------------ */
|
|
18
|
+
/* Hooks bridge */
|
|
19
|
+
/* ------------------------------------------------------------------ */
|
|
20
|
+
export { HooksMuxToolHookBridge, NoopToolHookBridge } from './hooks.js';
|
|
21
|
+
/* ------------------------------------------------------------------ */
|
|
22
|
+
/* MCP bridge */
|
|
23
|
+
/* ------------------------------------------------------------------ */
|
|
24
|
+
export { McpBridge } from './mcp-bridge.js';
|
|
25
|
+
//# 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;AAsBxE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEpE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,wEAAwE;AACxE,6EAA6E;AAC7E,wEAAwE;AAExE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,yBAAyB,CAAC;AAGjC,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAWxE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ToolRegistry } from './registry.js';
|
|
2
|
+
import type { ToolDescriptor } from './types.js';
|
|
3
|
+
export type McpTransport = 'stdio' | 'sse' | 'http' | 'streamable-http';
|
|
4
|
+
export interface McpServerConfig {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
transport: McpTransport;
|
|
8
|
+
command?: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
url?: string;
|
|
11
|
+
env?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export interface McpToolDefinition {
|
|
14
|
+
name: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
inputSchema?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Translates MCP tool definitions into ToolDescriptors and registers
|
|
20
|
+
* them in a ToolRegistry.
|
|
21
|
+
*
|
|
22
|
+
* This bridge is purely declarative — it does NOT start MCP processes
|
|
23
|
+
* or connect to servers. Actual MCP execution is handled elsewhere
|
|
24
|
+
* (e.g. babysitter-sdk).
|
|
25
|
+
*/
|
|
26
|
+
export declare class McpBridge {
|
|
27
|
+
private readonly registry;
|
|
28
|
+
private readonly servers;
|
|
29
|
+
constructor(registry: ToolRegistry);
|
|
30
|
+
/**
|
|
31
|
+
* Register an MCP server and all of its advertised tools.
|
|
32
|
+
*
|
|
33
|
+
* Each tool is converted to a {@link ToolDescriptor} with
|
|
34
|
+
* `source: 'mcp'` and `server` set to the config's `id`, then
|
|
35
|
+
* inserted into the shared {@link ToolRegistry}.
|
|
36
|
+
*/
|
|
37
|
+
registerServer(config: McpServerConfig, tools: McpToolDefinition[]): void;
|
|
38
|
+
/**
|
|
39
|
+
* Remove an MCP server and all tools that belong to it.
|
|
40
|
+
*/
|
|
41
|
+
unregisterServer(serverId: string): void;
|
|
42
|
+
/** Return all currently-registered MCP server configs. */
|
|
43
|
+
listServers(): McpServerConfig[];
|
|
44
|
+
/** Return the tools currently registered for a specific server. */
|
|
45
|
+
getServerTools(serverId: string): ToolDescriptor[];
|
|
46
|
+
/**
|
|
47
|
+
* Convert a single MCP tool definition into a ToolDescriptor.
|
|
48
|
+
*
|
|
49
|
+
* The MCP `inputSchema` is stored as the descriptor's `parameters`
|
|
50
|
+
* field (both are JSON Schema objects).
|
|
51
|
+
*/
|
|
52
|
+
static mcpToolToDescriptor(tool: McpToolDefinition, serverId: string): ToolDescriptor;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mcp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAMD;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,QAAQ,EAAE,YAAY;IAQlC;;;;;;OAMG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAiBzE;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASxC,0DAA0D;IAC1D,WAAW,IAAI,eAAe,EAAE;IAIhC,mEAAmE;IACnE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAQlD;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CACxB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,GACf,cAAc;CAUlB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* McpBridge */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
/**
|
|
5
|
+
* Translates MCP tool definitions into ToolDescriptors and registers
|
|
6
|
+
* them in a ToolRegistry.
|
|
7
|
+
*
|
|
8
|
+
* This bridge is purely declarative — it does NOT start MCP processes
|
|
9
|
+
* or connect to servers. Actual MCP execution is handled elsewhere
|
|
10
|
+
* (e.g. babysitter-sdk).
|
|
11
|
+
*/
|
|
12
|
+
export class McpBridge {
|
|
13
|
+
registry;
|
|
14
|
+
servers = new Map();
|
|
15
|
+
constructor(registry) {
|
|
16
|
+
this.registry = registry;
|
|
17
|
+
}
|
|
18
|
+
/* ---------------------------------------------------------------- */
|
|
19
|
+
/* Server lifecycle */
|
|
20
|
+
/* ---------------------------------------------------------------- */
|
|
21
|
+
/**
|
|
22
|
+
* Register an MCP server and all of its advertised tools.
|
|
23
|
+
*
|
|
24
|
+
* Each tool is converted to a {@link ToolDescriptor} with
|
|
25
|
+
* `source: 'mcp'` and `server` set to the config's `id`, then
|
|
26
|
+
* inserted into the shared {@link ToolRegistry}.
|
|
27
|
+
*/
|
|
28
|
+
registerServer(config, tools) {
|
|
29
|
+
this.servers.set(config.id, config);
|
|
30
|
+
const descriptors = tools.map((t) => McpBridge.mcpToolToDescriptor(t, config.id));
|
|
31
|
+
// Use the registry's own server-level registration so the
|
|
32
|
+
// ToolServer entry is also tracked.
|
|
33
|
+
this.registry.registerServer({
|
|
34
|
+
id: config.id,
|
|
35
|
+
name: config.name,
|
|
36
|
+
type: 'mcp',
|
|
37
|
+
tools: descriptors,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Remove an MCP server and all tools that belong to it.
|
|
42
|
+
*/
|
|
43
|
+
unregisterServer(serverId) {
|
|
44
|
+
this.servers.delete(serverId);
|
|
45
|
+
this.registry.unregisterServer(serverId, /* removeTools */ true);
|
|
46
|
+
}
|
|
47
|
+
/* ---------------------------------------------------------------- */
|
|
48
|
+
/* Queries */
|
|
49
|
+
/* ---------------------------------------------------------------- */
|
|
50
|
+
/** Return all currently-registered MCP server configs. */
|
|
51
|
+
listServers() {
|
|
52
|
+
return [...this.servers.values()];
|
|
53
|
+
}
|
|
54
|
+
/** Return the tools currently registered for a specific server. */
|
|
55
|
+
getServerTools(serverId) {
|
|
56
|
+
return this.registry.listByServer(serverId);
|
|
57
|
+
}
|
|
58
|
+
/* ---------------------------------------------------------------- */
|
|
59
|
+
/* Static conversion helper */
|
|
60
|
+
/* ---------------------------------------------------------------- */
|
|
61
|
+
/**
|
|
62
|
+
* Convert a single MCP tool definition into a ToolDescriptor.
|
|
63
|
+
*
|
|
64
|
+
* The MCP `inputSchema` is stored as the descriptor's `parameters`
|
|
65
|
+
* field (both are JSON Schema objects).
|
|
66
|
+
*/
|
|
67
|
+
static mcpToolToDescriptor(tool, serverId) {
|
|
68
|
+
return {
|
|
69
|
+
name: tool.name,
|
|
70
|
+
description: tool.description,
|
|
71
|
+
parameters: tool.inputSchema,
|
|
72
|
+
source: 'mcp',
|
|
73
|
+
sourceQualifier: serverId,
|
|
74
|
+
server: serverId,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=mcp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"AAyBA,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;;;;;GAOG;AACH,MAAM,OAAO,SAAS;IACH,QAAQ,CAAe;IACvB,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,YAAY,QAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE;;;;;;OAMG;IACH,cAAc,CAAC,MAAuB,EAAE,KAA0B;QAChE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,SAAS,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAC5C,CAAC;QAEF,0DAA0D;QAC1D,oCAAoC;QACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC3B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE,0DAA0D;IAC1D,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,mEAAmE;IACnE,cAAc,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,sEAAsE;IAEtE;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CACxB,IAAuB,EACvB,QAAgB;QAEhB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,MAAM,EAAE,KAAK;YACb,eAAe,EAAE,QAAQ;YACzB,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;CACF"}
|