@ax-llm/ax-tools 22.0.2 → 22.0.4

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/index.cjs CHANGED
@@ -1,4 +1,5 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class;var _child_process = require('child_process');var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);var o= (_class =class{__init() {this.pendingResponses=new Map}constructor(e){;_class.prototype.__init.call(this);this.process=_child_process.spawn.call(void 0, e.command,_nullishCoalesce(e.args, () => ([])),{env:e.env?{...process.env,...e.env}:process.env}),this.rl=_readline2.default.createInterface({input:this.process.stdout}),this.rl.on("line",r=>{try{let s=JSON.parse(r),t=this.pendingResponses.get(s.id);t&&(t(s),this.pendingResponses.delete(s.id))}catch (e2){console.warn("Non-JSON output from MCP server:",r)}})}async send(e){return new Promise(r=>{this.pendingResponses.set(e.id,s=>{r(s)}),this.process.stdin.write(`${JSON.stringify(e)}
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;var _child_process = require('child_process');var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);var o= (_class =class{__init() {this.pendingResponses=new Map}constructor(e){;_class.prototype.__init.call(this);this.process=_child_process.spawn.call(void 0, e.command,_nullishCoalesce(e.args, () => ([])),{env:e.env?{...process.env,...e.env}:process.env}),this.rl=_readline2.default.createInterface({input:this.process.stdout}),this.rl.on("line",r=>{try{let s=JSON.parse(r);if("method"in s){_optionalChain([this, 'access', _ => _.messageHandler, 'optionalCall', _2 => _2(s)]);return}let n=s,i=n.id===null?void 0:this.pendingResponses.get(n.id);i?(i(n),n.id!==null&&this.pendingResponses.delete(n.id)):_optionalChain([this, 'access', _3 => _3.messageHandler, 'optionalCall', _4 => _4(s)])}catch (e2){console.warn("Non-JSON output from MCP server:",r)}})}async send(e){return new Promise(r=>{this.pendingResponses.set(e.id,s=>{r(s)}),this.process.stdin.write(`${JSON.stringify(e)}
2
2
  `)})}async sendNotification(e){this.process.stdin.write(`${JSON.stringify(e)}
3
- `)}async connect(){return Promise.resolve()}async terminate(){return this.rl.close(),this.process.kill(),new Promise(e=>{this.process.on("exit",()=>e())})}}, _class);function i(n){return new o(n)}exports.AxMCPStdioTransport = o; exports.axCreateMCPStdioTransport = i;
3
+ `)}async sendResponse(e){this.process.stdin.write(`${JSON.stringify(e)}
4
+ `)}setMessageHandler(e){this.messageHandler=e}async connect(){return Promise.resolve()}async terminate(){return this.rl.close(),this.process.kill(),new Promise(e=>{this.process.on("exit",()=>e())})}}, _class);function a(t){return new o(t)}exports.AxMCPStdioTransport = o; exports.axCreateMCPStdioTransport = a;
4
5
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../mcp/stdioTransport.ts"],"names":["AxMCPStdioTransport","config","spawn","readline","line","response","resolver","message","resolve","res"],"mappings":"AAAA,uUAA2D,wFACtC,IAeRA,CAAAA,WAAN,KAAoD,CACjD,eAEA,gBAAA,CAAmB,IAAI,IAAA,WAK/B,CAAYC,CAAAA,CAAwC,qCAClD,IAAA,CAAK,OAAA,CAAUC,kCAAAA,CAAMD,CAAO,OAAA,kBAASA,CAAAA,CAAO,IAAA,SAAQ,CAAC,GAAA,CAAG,CACtD,GAAA,CAAKA,CAAAA,CAAO,GAAA,CAAM,CAAE,GAAG,OAAA,CAAQ,GAAA,CAAK,GAAGA,CAAAA,CAAO,GAAI,CAAA,CAAI,OAAA,CAAQ,GAChE,CAAC,CAAA,CACD,IAAA,CAAK,EAAA,CAAKE,kBAAAA,CAAS,eAAA,CAAgB,CAAE,KAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAO,CAAC,CAAA,CACjE,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,MAAA,CAASC,CAAAA,EAAS,CAC3B,GAAI,CACF,IAAMC,CAAAA,CAAiC,IAAA,CAAK,KAAA,CAAMD,CAAI,CAAA,CAChDE,CAAAA,CAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAID,CAAAA,CAAS,EAAE,CAAA,CAClDC,CAAAA,EAAAA,CACFA,CAAAA,CAASD,CAAQ,CAAA,CACjB,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAOA,CAAAA,CAAS,EAAE,CAAA,CAE5C,CAAA,UAAiB,CAEf,OAAA,CAAQ,IAAA,CAAK,kCAAA,CAAoCD,CAAI,CACvD,CACF,CAAC,CACH,CAEA,MAAM,IAAA,CACJG,CAAAA,CACwC,CACxC,OAAO,IAAI,OAAA,CAAwCC,CAAAA,EAAY,CAC7D,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAID,CAAAA,CAAQ,EAAA,CAAKE,CAAAA,EAA8B,CACnED,CAAAA,CAAQC,CAAoC,CAC9C,CAAC,CAAA,CACD,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA;AAOwB;AA6BvD","file":"/home/runner/work/ax/ax/src/tools/dist/index.cjs","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport readline from 'node:readline';\n\nimport type {\n AxMCPJSONRPCNotification,\n AxMCPJSONRPCRequest,\n AxMCPJSONRPCResponse,\n AxMCPTransport,\n} from '@ax-llm/ax';\n\nexport interface StdioTransportConfig {\n command: string;\n args?: string[];\n env?: NodeJS.ProcessEnv;\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams;\n private rl: readline.Interface;\n private pendingResponses = new Map<\n string | number,\n (res: AxMCPJSONRPCResponse) => void\n >();\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n });\n this.rl = readline.createInterface({ input: this.process.stdout });\n this.rl.on('line', (line) => {\n try {\n const response: AxMCPJSONRPCResponse = JSON.parse(line);\n const resolver = this.pendingResponses.get(response.id);\n if (resolver) {\n resolver(response);\n this.pendingResponses.delete(response.id);\n }\n } catch (_error) {\n // Skip non-JSON lines (might be debug output from the MCP server)\n console.warn('Non-JSON output from MCP server:', line);\n }\n });\n }\n\n async send(\n message: Readonly<AxMCPJSONRPCRequest<unknown>>\n ): Promise<AxMCPJSONRPCResponse<unknown>> {\n return new Promise<AxMCPJSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: AxMCPJSONRPCResponse) => {\n resolve(res as AxMCPJSONRPCResponse<unknown>);\n });\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n async sendNotification(\n message: Readonly<AxMCPJSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async connect(): Promise<void> {\n // Connection is implicit when the process is spawned\n return Promise.resolve();\n }\n\n /**\n * Terminate the child process and clean up resources\n */\n async terminate(): Promise<void> {\n this.rl.close();\n this.process.kill();\n return new Promise((resolve) => {\n this.process.on('exit', () => resolve());\n });\n }\n}\n\n/**\n * Create a new AxMCPStdioTransport instance\n * @param config Configuration for the stdio transport\n * @returns A new AxMCPStdioTransport instance\n */\nexport function axCreateMCPStdioTransport(\n config: Readonly<StdioTransportConfig>\n): AxMCPStdioTransport {\n return new AxMCPStdioTransport(config);\n}\n"]}
1
+ {"version":3,"sources":["../mcp/stdioTransport.ts"],"names":["AxMCPStdioTransport","config","spawn","readline","line","message","response","resolver","resolve","res"],"mappings":"AAAA,20BAA2D,wFACtC,IAgBRA,CAAAA,WAAN,KAAoD,CACjD,eAEA,gBAAA,CAAmB,IAAI,IAAA,WAQ/B,CAAYC,CAAAA,CAAwC,qCAClD,IAAA,CAAK,OAAA,CAAUC,kCAAAA,CAAMD,CAAO,OAAA,kBAASA,CAAAA,CAAO,IAAA,SAAQ,CAAC,GAAA,CAAG,CACtD,GAAA,CAAKA,CAAAA,CAAO,GAAA,CAAM,CAAE,GAAG,OAAA,CAAQ,GAAA,CAAK,GAAGA,CAAAA,CAAO,GAAI,CAAA,CAAI,OAAA,CAAQ,GAChE,CAAC,CAAA,CACD,IAAA,CAAK,EAAA,CAAKE,kBAAAA,CAAS,eAAA,CAAgB,CAAE,KAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAO,CAAC,CAAA,CACjE,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,MAAA,CAASC,CAAAA,EAAS,CAC3B,GAAI,CACF,IAAMC,CAAAA,CAA+B,IAAA,CAAK,KAAA,CAAMD,CAAI,CAAA,CACpD,EAAA,CAAI,QAAA,GAAYC,CAAAA,CAAS,iBAClB,IAAA,mBAAK,cAAA,0BAAA,CAAiBA,CAAO,GAAA,CAClC,MACF,CACA,IAAMC,CAAAA,CAAWD,CAAAA,CACXE,CAAAA,CACJD,CAAAA,CAAS,EAAA,GAAO,IAAA,CACZ,KAAA,CAAA,CACA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAIA,CAAAA,CAAS,EAAE,CAAA,CACvCC,CAAAA,CAAAA,CACFA,CAAAA,CAASD,CAAQ,CAAA,CACbA,CAAAA,CAAS,EAAA,GAAO,IAAA,EAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAOA,CAAAA,CAAS,EAAE,CAAA,CAAA,iBAE7D,IAAA,qBAAK,cAAA,0BAAA,CAAiBD,CAAO,GAEtC,CAAA,UAAiB,CAEf,OAAA,CAAQ,IAAA,CAAK,kCAAA,CAAoCD,CAAI,CACvD,CACF,CAAC,CACH,CAEA,MAAM,IAAA,CACJC,CAAAA,CACwC,CACxC,OAAO,IAAI,OAAA,CAAwCG,CAAAA,EAAY,CAC7D,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAIH,CAAAA,CAAQ,EAAA,CAAKI,CAAAA,EAA8B,CACnED,CAAAA,CAAQC,CAAoC,CAC9C,CAAC,CAAA,CACD,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA;AAOwB;AAIA;AAmCvD","file":"/home/runner/work/ax/ax/src/tools/dist/index.cjs","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport readline from 'node:readline';\n\nimport type {\n AxMCPJSONRPCMessage,\n AxMCPJSONRPCNotification,\n AxMCPJSONRPCRequest,\n AxMCPJSONRPCResponse,\n AxMCPTransport,\n} from '@ax-llm/ax';\n\nexport interface StdioTransportConfig {\n command: string;\n args?: string[];\n env?: NodeJS.ProcessEnv;\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams;\n private rl: readline.Interface;\n private pendingResponses = new Map<\n string | number,\n (res: AxMCPJSONRPCResponse) => void\n >();\n private messageHandler?: (\n message: Readonly<AxMCPJSONRPCMessage>\n ) => void | Promise<void>;\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n });\n this.rl = readline.createInterface({ input: this.process.stdout });\n this.rl.on('line', (line) => {\n try {\n const message: AxMCPJSONRPCMessage = JSON.parse(line);\n if ('method' in message) {\n void this.messageHandler?.(message);\n return;\n }\n const response = message as AxMCPJSONRPCResponse;\n const resolver =\n response.id === null\n ? undefined\n : this.pendingResponses.get(response.id);\n if (resolver) {\n resolver(response);\n if (response.id !== null) this.pendingResponses.delete(response.id);\n } else {\n void this.messageHandler?.(message);\n }\n } catch (_error) {\n // Skip non-JSON lines (might be debug output from the MCP server)\n console.warn('Non-JSON output from MCP server:', line);\n }\n });\n }\n\n async send(\n message: Readonly<AxMCPJSONRPCRequest<unknown>>\n ): Promise<AxMCPJSONRPCResponse<unknown>> {\n return new Promise<AxMCPJSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: AxMCPJSONRPCResponse) => {\n resolve(res as AxMCPJSONRPCResponse<unknown>);\n });\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n async sendNotification(\n message: Readonly<AxMCPJSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async sendResponse(message: Readonly<AxMCPJSONRPCResponse>): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n setMessageHandler(\n handler: (message: Readonly<AxMCPJSONRPCMessage>) => void | Promise<void>\n ): void {\n this.messageHandler = handler;\n }\n\n async connect(): Promise<void> {\n // Connection is implicit when the process is spawned\n return Promise.resolve();\n }\n\n /**\n * Terminate the child process and clean up resources\n */\n async terminate(): Promise<void> {\n this.rl.close();\n this.process.kill();\n return new Promise((resolve) => {\n this.process.on('exit', () => resolve());\n });\n }\n}\n\n/**\n * Create a new AxMCPStdioTransport instance\n * @param config Configuration for the stdio transport\n * @returns A new AxMCPStdioTransport instance\n */\nexport function axCreateMCPStdioTransport(\n config: Readonly<StdioTransportConfig>\n): AxMCPStdioTransport {\n return new AxMCPStdioTransport(config);\n}\n"]}
package/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification } from '@ax-llm/ax';
1
+ import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxMCPJSONRPCMessage } from '@ax-llm/ax';
2
2
 
3
3
  interface StdioTransportConfig {
4
4
  command: string;
@@ -9,9 +9,12 @@ declare class AxMCPStdioTransport implements AxMCPTransport {
9
9
  private process;
10
10
  private rl;
11
11
  private pendingResponses;
12
+ private messageHandler?;
12
13
  constructor(config: Readonly<StdioTransportConfig>);
13
14
  send(message: Readonly<AxMCPJSONRPCRequest<unknown>>): Promise<AxMCPJSONRPCResponse<unknown>>;
14
15
  sendNotification(message: Readonly<AxMCPJSONRPCNotification>): Promise<void>;
16
+ sendResponse(message: Readonly<AxMCPJSONRPCResponse>): Promise<void>;
17
+ setMessageHandler(handler: (message: Readonly<AxMCPJSONRPCMessage>) => void | Promise<void>): void;
15
18
  connect(): Promise<void>;
16
19
  /**
17
20
  * Terminate the child process and clean up resources
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification } from '@ax-llm/ax';
1
+ import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxMCPJSONRPCMessage } from '@ax-llm/ax';
2
2
 
3
3
  interface StdioTransportConfig {
4
4
  command: string;
@@ -9,9 +9,12 @@ declare class AxMCPStdioTransport implements AxMCPTransport {
9
9
  private process;
10
10
  private rl;
11
11
  private pendingResponses;
12
+ private messageHandler?;
12
13
  constructor(config: Readonly<StdioTransportConfig>);
13
14
  send(message: Readonly<AxMCPJSONRPCRequest<unknown>>): Promise<AxMCPJSONRPCResponse<unknown>>;
14
15
  sendNotification(message: Readonly<AxMCPJSONRPCNotification>): Promise<void>;
16
+ sendResponse(message: Readonly<AxMCPJSONRPCResponse>): Promise<void>;
17
+ setMessageHandler(handler: (message: Readonly<AxMCPJSONRPCMessage>) => void | Promise<void>): void;
15
18
  connect(): Promise<void>;
16
19
  /**
17
20
  * Terminate the child process and clean up resources
package/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import{spawn as p}from"child_process";import a from"readline";var o=class{process;rl;pendingResponses=new Map;constructor(e){this.process=p(e.command,e.args??[],{env:e.env?{...process.env,...e.env}:process.env}),this.rl=a.createInterface({input:this.process.stdout}),this.rl.on("line",r=>{try{let s=JSON.parse(r),t=this.pendingResponses.get(s.id);t&&(t(s),this.pendingResponses.delete(s.id))}catch{console.warn("Non-JSON output from MCP server:",r)}})}async send(e){return new Promise(r=>{this.pendingResponses.set(e.id,s=>{r(s)}),this.process.stdin.write(`${JSON.stringify(e)}
1
+ import{spawn as p}from"child_process";import d from"readline";var o=class{process;rl;pendingResponses=new Map;messageHandler;constructor(e){this.process=p(e.command,e.args??[],{env:e.env?{...process.env,...e.env}:process.env}),this.rl=d.createInterface({input:this.process.stdout}),this.rl.on("line",r=>{try{let s=JSON.parse(r);if("method"in s){this.messageHandler?.(s);return}let n=s,i=n.id===null?void 0:this.pendingResponses.get(n.id);i?(i(n),n.id!==null&&this.pendingResponses.delete(n.id)):this.messageHandler?.(s)}catch{console.warn("Non-JSON output from MCP server:",r)}})}async send(e){return new Promise(r=>{this.pendingResponses.set(e.id,s=>{r(s)}),this.process.stdin.write(`${JSON.stringify(e)}
2
2
  `)})}async sendNotification(e){this.process.stdin.write(`${JSON.stringify(e)}
3
- `)}async connect(){return Promise.resolve()}async terminate(){return this.rl.close(),this.process.kill(),new Promise(e=>{this.process.on("exit",()=>e())})}};function i(n){return new o(n)}export{o as AxMCPStdioTransport,i as axCreateMCPStdioTransport};
3
+ `)}async sendResponse(e){this.process.stdin.write(`${JSON.stringify(e)}
4
+ `)}setMessageHandler(e){this.messageHandler=e}async connect(){return Promise.resolve()}async terminate(){return this.rl.close(),this.process.kill(),new Promise(e=>{this.process.on("exit",()=>e())})}};function a(t){return new o(t)}export{o as AxMCPStdioTransport,a as axCreateMCPStdioTransport};
4
5
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../mcp/stdioTransport.ts"],"sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport readline from 'node:readline';\n\nimport type {\n AxMCPJSONRPCNotification,\n AxMCPJSONRPCRequest,\n AxMCPJSONRPCResponse,\n AxMCPTransport,\n} from '@ax-llm/ax';\n\nexport interface StdioTransportConfig {\n command: string;\n args?: string[];\n env?: NodeJS.ProcessEnv;\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams;\n private rl: readline.Interface;\n private pendingResponses = new Map<\n string | number,\n (res: AxMCPJSONRPCResponse) => void\n >();\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n });\n this.rl = readline.createInterface({ input: this.process.stdout });\n this.rl.on('line', (line) => {\n try {\n const response: AxMCPJSONRPCResponse = JSON.parse(line);\n const resolver = this.pendingResponses.get(response.id);\n if (resolver) {\n resolver(response);\n this.pendingResponses.delete(response.id);\n }\n } catch (_error) {\n // Skip non-JSON lines (might be debug output from the MCP server)\n console.warn('Non-JSON output from MCP server:', line);\n }\n });\n }\n\n async send(\n message: Readonly<AxMCPJSONRPCRequest<unknown>>\n ): Promise<AxMCPJSONRPCResponse<unknown>> {\n return new Promise<AxMCPJSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: AxMCPJSONRPCResponse) => {\n resolve(res as AxMCPJSONRPCResponse<unknown>);\n });\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n async sendNotification(\n message: Readonly<AxMCPJSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async connect(): Promise<void> {\n // Connection is implicit when the process is spawned\n return Promise.resolve();\n }\n\n /**\n * Terminate the child process and clean up resources\n */\n async terminate(): Promise<void> {\n this.rl.close();\n this.process.kill();\n return new Promise((resolve) => {\n this.process.on('exit', () => resolve());\n });\n }\n}\n\n/**\n * Create a new AxMCPStdioTransport instance\n * @param config Configuration for the stdio transport\n * @returns A new AxMCPStdioTransport instance\n */\nexport function axCreateMCPStdioTransport(\n config: Readonly<StdioTransportConfig>\n): AxMCPStdioTransport {\n return new AxMCPStdioTransport(config);\n}\n"],"mappings":"AAAA,OAA8C,SAAAA,MAAa,gBAC3D,OAAOC,MAAc,WAed,IAAMC,EAAN,KAAoD,CACjD,QACA,GACA,iBAAmB,IAAI,IAK/B,YAAYC,EAAwC,CAClD,KAAK,QAAUH,EAAMG,EAAO,QAASA,EAAO,MAAQ,CAAC,EAAG,CACtD,IAAKA,EAAO,IAAM,CAAE,GAAG,QAAQ,IAAK,GAAGA,EAAO,GAAI,EAAI,QAAQ,GAChE,CAAC,EACD,KAAK,GAAKF,EAAS,gBAAgB,CAAE,MAAO,KAAK,QAAQ,MAAO,CAAC,EACjE,KAAK,GAAG,GAAG,OAASG,GAAS,CAC3B,GAAI,CACF,IAAMC,EAAiC,KAAK,MAAMD,CAAI,EAChDE,EAAW,KAAK,iBAAiB,IAAID,EAAS,EAAE,EAClDC,IACFA,EAASD,CAAQ,EACjB,KAAK,iBAAiB,OAAOA,EAAS,EAAE,EAE5C,MAAiB,CAEf,QAAQ,KAAK,mCAAoCD,CAAI,CACvD,CACF,CAAC,CACH,CAEA,MAAM,KACJG,EACwC,CACxC,OAAO,IAAI,QAAwCC,GAAY,CAC7D,KAAK,iBAAiB,IAAID,EAAQ,GAAKE,GAA8B,CACnED,EAAQC,CAAoC,CAC9C,CAAC,EACD,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAUF,CAAO,CAAC;AAAA,CAAI,CACzD,CAAC,CACH,CAEA,MAAM,iBACJA,EACe,CACf,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAUA,CAAO,CAAC;AAAA,CAAI,CACzD,CAEA,MAAM,SAAyB,CAE7B,OAAO,QAAQ,QAAQ,CACzB,CAKA,MAAM,WAA2B,CAC/B,YAAK,GAAG,MAAM,EACd,KAAK,QAAQ,KAAK,EACX,IAAI,QAASC,GAAY,CAC9B,KAAK,QAAQ,GAAG,OAAQ,IAAMA,EAAQ,CAAC,CACzC,CAAC,CACH,CACF,EAOO,SAASE,EACdP,EACqB,CACrB,OAAO,IAAID,EAAoBC,CAAM,CACvC","names":["spawn","readline","AxMCPStdioTransport","config","line","response","resolver","message","resolve","res","axCreateMCPStdioTransport"]}
1
+ {"version":3,"sources":["../mcp/stdioTransport.ts"],"sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport readline from 'node:readline';\n\nimport type {\n AxMCPJSONRPCMessage,\n AxMCPJSONRPCNotification,\n AxMCPJSONRPCRequest,\n AxMCPJSONRPCResponse,\n AxMCPTransport,\n} from '@ax-llm/ax';\n\nexport interface StdioTransportConfig {\n command: string;\n args?: string[];\n env?: NodeJS.ProcessEnv;\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams;\n private rl: readline.Interface;\n private pendingResponses = new Map<\n string | number,\n (res: AxMCPJSONRPCResponse) => void\n >();\n private messageHandler?: (\n message: Readonly<AxMCPJSONRPCMessage>\n ) => void | Promise<void>;\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n });\n this.rl = readline.createInterface({ input: this.process.stdout });\n this.rl.on('line', (line) => {\n try {\n const message: AxMCPJSONRPCMessage = JSON.parse(line);\n if ('method' in message) {\n void this.messageHandler?.(message);\n return;\n }\n const response = message as AxMCPJSONRPCResponse;\n const resolver =\n response.id === null\n ? undefined\n : this.pendingResponses.get(response.id);\n if (resolver) {\n resolver(response);\n if (response.id !== null) this.pendingResponses.delete(response.id);\n } else {\n void this.messageHandler?.(message);\n }\n } catch (_error) {\n // Skip non-JSON lines (might be debug output from the MCP server)\n console.warn('Non-JSON output from MCP server:', line);\n }\n });\n }\n\n async send(\n message: Readonly<AxMCPJSONRPCRequest<unknown>>\n ): Promise<AxMCPJSONRPCResponse<unknown>> {\n return new Promise<AxMCPJSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: AxMCPJSONRPCResponse) => {\n resolve(res as AxMCPJSONRPCResponse<unknown>);\n });\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n });\n }\n\n async sendNotification(\n message: Readonly<AxMCPJSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async sendResponse(message: Readonly<AxMCPJSONRPCResponse>): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n setMessageHandler(\n handler: (message: Readonly<AxMCPJSONRPCMessage>) => void | Promise<void>\n ): void {\n this.messageHandler = handler;\n }\n\n async connect(): Promise<void> {\n // Connection is implicit when the process is spawned\n return Promise.resolve();\n }\n\n /**\n * Terminate the child process and clean up resources\n */\n async terminate(): Promise<void> {\n this.rl.close();\n this.process.kill();\n return new Promise((resolve) => {\n this.process.on('exit', () => resolve());\n });\n }\n}\n\n/**\n * Create a new AxMCPStdioTransport instance\n * @param config Configuration for the stdio transport\n * @returns A new AxMCPStdioTransport instance\n */\nexport function axCreateMCPStdioTransport(\n config: Readonly<StdioTransportConfig>\n): AxMCPStdioTransport {\n return new AxMCPStdioTransport(config);\n}\n"],"mappings":"AAAA,OAA8C,SAAAA,MAAa,gBAC3D,OAAOC,MAAc,WAgBd,IAAMC,EAAN,KAAoD,CACjD,QACA,GACA,iBAAmB,IAAI,IAIvB,eAIR,YAAYC,EAAwC,CAClD,KAAK,QAAUH,EAAMG,EAAO,QAASA,EAAO,MAAQ,CAAC,EAAG,CACtD,IAAKA,EAAO,IAAM,CAAE,GAAG,QAAQ,IAAK,GAAGA,EAAO,GAAI,EAAI,QAAQ,GAChE,CAAC,EACD,KAAK,GAAKF,EAAS,gBAAgB,CAAE,MAAO,KAAK,QAAQ,MAAO,CAAC,EACjE,KAAK,GAAG,GAAG,OAASG,GAAS,CAC3B,GAAI,CACF,IAAMC,EAA+B,KAAK,MAAMD,CAAI,EACpD,GAAI,WAAYC,EAAS,CAClB,KAAK,iBAAiBA,CAAO,EAClC,MACF,CACA,IAAMC,EAAWD,EACXE,EACJD,EAAS,KAAO,KACZ,OACA,KAAK,iBAAiB,IAAIA,EAAS,EAAE,EACvCC,GACFA,EAASD,CAAQ,EACbA,EAAS,KAAO,MAAM,KAAK,iBAAiB,OAAOA,EAAS,EAAE,GAE7D,KAAK,iBAAiBD,CAAO,CAEtC,MAAiB,CAEf,QAAQ,KAAK,mCAAoCD,CAAI,CACvD,CACF,CAAC,CACH,CAEA,MAAM,KACJC,EACwC,CACxC,OAAO,IAAI,QAAwCG,GAAY,CAC7D,KAAK,iBAAiB,IAAIH,EAAQ,GAAKI,GAA8B,CACnED,EAAQC,CAAoC,CAC9C,CAAC,EACD,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAUJ,CAAO,CAAC;AAAA,CAAI,CACzD,CAAC,CACH,CAEA,MAAM,iBACJA,EACe,CACf,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAUA,CAAO,CAAC;AAAA,CAAI,CACzD,CAEA,MAAM,aAAaA,EAAwD,CACzE,KAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAUA,CAAO,CAAC;AAAA,CAAI,CACzD,CAEA,kBACEK,EACM,CACN,KAAK,eAAiBA,CACxB,CAEA,MAAM,SAAyB,CAE7B,OAAO,QAAQ,QAAQ,CACzB,CAKA,MAAM,WAA2B,CAC/B,YAAK,GAAG,MAAM,EACd,KAAK,QAAQ,KAAK,EACX,IAAI,QAASF,GAAY,CAC9B,KAAK,QAAQ,GAAG,OAAQ,IAAMA,EAAQ,CAAC,CACzC,CAAC,CACH,CACF,EAOO,SAASG,EACdR,EACqB,CACrB,OAAO,IAAID,EAAoBC,CAAM,CACvC","names":["spawn","readline","AxMCPStdioTransport","config","line","message","response","resolver","resolve","res","handler","axCreateMCPStdioTransport"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ax-llm/ax-tools",
3
- "version": "22.0.2",
3
+ "version": "22.0.4",
4
4
  "type": "module",
5
5
  "description": "Ax tools package",
6
6
  "repository": {
@@ -13,7 +13,7 @@
13
13
  "license": "Apache-2.0",
14
14
  "keywords": [],
15
15
  "dependencies": {
16
- "@ax-llm/ax": "22.0.2"
16
+ "@ax-llm/ax": "22.0.4"
17
17
  },
18
18
  "files": [
19
19
  "**/*"