@a5c-ai/tools-adapter 5.1.1-staging.0ad6ac75ae4a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/dispatch.test.d.ts +2 -0
  3. package/dist/__tests__/dispatch.test.d.ts.map +1 -0
  4. package/dist/__tests__/dispatch.test.js +251 -0
  5. package/dist/__tests__/dispatch.test.js.map +1 -0
  6. package/dist/__tests__/hooks.test.d.ts +2 -0
  7. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  8. package/dist/__tests__/hooks.test.js +172 -0
  9. package/dist/__tests__/hooks.test.js.map +1 -0
  10. package/dist/__tests__/mcp-bridge.test.d.ts +2 -0
  11. package/dist/__tests__/mcp-bridge.test.d.ts.map +1 -0
  12. package/dist/__tests__/mcp-bridge.test.js +129 -0
  13. package/dist/__tests__/mcp-bridge.test.js.map +1 -0
  14. package/dist/__tests__/registry.test.d.ts +2 -0
  15. package/dist/__tests__/registry.test.d.ts.map +1 -0
  16. package/dist/__tests__/registry.test.js +196 -0
  17. package/dist/__tests__/registry.test.js.map +1 -0
  18. package/dist/__tests__/schema-translation.test.d.ts +2 -0
  19. package/dist/__tests__/schema-translation.test.d.ts.map +1 -0
  20. package/dist/__tests__/schema-translation.test.js +126 -0
  21. package/dist/__tests__/schema-translation.test.js.map +1 -0
  22. package/dist/__tests__/unified-contract.test.d.ts +2 -0
  23. package/dist/__tests__/unified-contract.test.d.ts.map +1 -0
  24. package/dist/__tests__/unified-contract.test.js +98 -0
  25. package/dist/__tests__/unified-contract.test.js.map +1 -0
  26. package/dist/dispatch.d.ts +43 -0
  27. package/dist/dispatch.d.ts.map +1 -0
  28. package/dist/dispatch.js +157 -0
  29. package/dist/dispatch.js.map +1 -0
  30. package/dist/hooks.d.ts +99 -0
  31. package/dist/hooks.d.ts.map +1 -0
  32. package/dist/hooks.js +110 -0
  33. package/dist/hooks.js.map +1 -0
  34. package/dist/index.d.ts +13 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +25 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp-bridge.d.ts +54 -0
  39. package/dist/mcp-bridge.d.ts.map +1 -0
  40. package/dist/mcp-bridge.js +78 -0
  41. package/dist/mcp-bridge.js.map +1 -0
  42. package/dist/registry.d.ts +70 -0
  43. package/dist/registry.d.ts.map +1 -0
  44. package/dist/registry.js +221 -0
  45. package/dist/registry.js.map +1 -0
  46. package/dist/schema-translation.d.ts +38 -0
  47. package/dist/schema-translation.d.ts.map +1 -0
  48. package/dist/schema-translation.js +61 -0
  49. package/dist/schema-translation.js.map +1 -0
  50. package/dist/types.d.ts +159 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +39 -0
  53. package/dist/types.js.map +1 -0
  54. 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"}
@@ -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":"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"}
@@ -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":"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"}
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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"}
@@ -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"}