@ax-llm/ax-tools 16.1.9 → 16.1.11

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,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 _class2;var _child_process = require('child_process');var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);var i= (_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",t=>{try{let r=JSON.parse(t),s=this.pendingResponses.get(r.id);s&&(s(r),this.pendingResponses.delete(r.id))}catch (e2){console.warn("Non-JSON output from MCP server:",t)}})}async send(e){return new Promise(t=>{this.pendingResponses.set(e.id,r=>{t(r)}),this.process.stdin.write(`${JSON.stringify(e)}
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 s= (_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",t=>{try{let r=JSON.parse(t),p=this.pendingResponses.get(r.id);p&&(p(r),this.pendingResponses.delete(r.id))}catch (e2){console.warn("Non-JSON output from MCP server:",t)}})}async send(e){return new Promise(t=>{this.pendingResponses.set(e.id,r=>{t(r)}),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 u(n){return new i(n)}var _fs = require('fs'); var P = _interopRequireWildcard(_fs);var _http = require('http'); var f = _interopRequireWildcard(_http);var _https = require('https'); var S = _interopRequireWildcard(_https);var _os = require('os'); var h = _interopRequireWildcard(_os);var _process = require('process'); var y = _interopRequireWildcard(_process);var _vm = require('vm');function w(){if(globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function")return globalThis.crypto;throw new Error("Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.")}var m=(o=>(o.FS="node:fs",o.NET="net",o.OS="os",o.CRYPTO="crypto",o.PROCESS="process",o))(m||{}),a= exports.AxJSInterpreter =class{constructor({permissions:e=[],timeout:t=3e4}={}){this.permissions=_nullishCoalesce(e, () => ([])),this.timeout=t}codeInterpreterJavascript(e,t){if(_optionalChain([t, 'optionalAccess', _ => _.aborted]))throw new Error(`Aborted: ${_nullishCoalesce(t.reason, () => ("Interpreter execution aborted"))}`);let r={console};return this.permissions.includes("node:fs")&&(r.fs=P),this.permissions.includes("net")&&(r.http=f,r.https=S),this.permissions.includes("os")&&(r.os=h),this.permissions.includes("crypto")&&(r.crypto=w()),this.permissions.includes("process")&&(r.process=y),_vm.runInNewContext.call(void 0, `(function() { ${e} })()`,r,{timeout:this.timeout})}toFunction(){return{name:"javascriptInterpreter",description:"Use this function to run Javascript code and get any expected return value",parameters:{type:"object",properties:{code:{type:"string",description:"JS code with a return value in the end."}},required:["code"]},func:({code:e},t)=>this.codeInterpreterJavascript(e,_optionalChain([t, 'optionalAccess', _2 => _2.abortSignal]))}}};function A(n){return new a(n)}function v(n,e){return e.aborted?Promise.reject(new Error(`Aborted: ${_nullishCoalesce(e.reason, () => ("VM execution aborted"))}`)):new Promise((t,r)=>{let s=()=>r(new Error(`Aborted: ${_nullishCoalesce(e.reason, () => ("VM execution aborted"))}`));e.addEventListener("abort",s,{once:!0}),n.then(o=>{e.removeEventListener("abort",s),t(o)},o=>{e.removeEventListener("abort",s),r(o)})})}var p= (_class2 =class{__init2() {this.language="JavaScript"}constructor(e){;_class2.prototype.__init2.call(this);this.timeout=_nullishCoalesce(_optionalChain([e, 'optionalAccess', _3 => _3.timeout]), () => (3e4))}createSession(e){let t=_vm.createContext.call(void 0, {console,setTimeout,clearTimeout,setInterval,clearInterval,...e}),r=this.timeout;return{async execute(s,o){if(_optionalChain([o, 'optionalAccess', _4 => _4.signal, 'optionalAccess', _5 => _5.aborted]))throw new Error(`Aborted: ${_nullishCoalesce(o.signal.reason, () => ("VM execution aborted"))}`);if(/\bawait\b/.test(s)){let l=`(async () => { ${s} })()`,c=_vm.runInContext.call(void 0, l,t,{timeout:r});return _optionalChain([o, 'optionalAccess', _6 => _6.signal])?await v(c,o.signal):await c}return _vm.runInContext.call(void 0, s,t,{timeout:r})},close(){}}}}, _class2);function J(n){return new p(n)}exports.AxJSInterpreter = a; exports.AxJSInterpreterPermission = m; exports.AxMCPStdioTransport = i; exports.AxRLMJSInterpreter = p; exports.axCreateJSInterpreter = A; exports.axCreateMCPStdioTransport = u; exports.axCreateRLMJSInterpreter = J;
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 a(o){return new s(o)}var _fs = require('fs'); var u = _interopRequireWildcard(_fs);var _http = require('http'); var l = _interopRequireWildcard(_http);var _https = require('https'); var x = _interopRequireWildcard(_https);var _os = require('os'); var C = _interopRequireWildcard(_os);var _process = require('process'); var P = _interopRequireWildcard(_process);var _vm = require('vm');function S(){if(globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function")return globalThis.crypto;throw new Error("Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.")}var c=(n=>(n.FS="node:fs",n.NET="net",n.OS="os",n.CRYPTO="crypto",n.PROCESS="process",n))(c||{}),i= exports.AxJSInterpreter =class{constructor({permissions:e=[],timeout:t=3e4}={}){this.permissions=_nullishCoalesce(e, () => ([])),this.timeout=t}codeInterpreterJavascript(e,t){if(_optionalChain([t, 'optionalAccess', _ => _.aborted]))throw new Error(`Aborted: ${_nullishCoalesce(t.reason, () => ("Interpreter execution aborted"))}`);let r={console};return this.permissions.includes("node:fs")&&(r.fs=u),this.permissions.includes("net")&&(r.http=l,r.https=x),this.permissions.includes("os")&&(r.os=C),this.permissions.includes("crypto")&&(r.crypto=S()),this.permissions.includes("process")&&(r.process=P),_vm.runInNewContext.call(void 0, `(function() { ${e} })()`,r,{timeout:this.timeout})}toFunction(){return{name:"javascriptInterpreter",description:"Use this function to run Javascript code and get any expected return value",parameters:{type:"object",properties:{code:{type:"string",description:"JS code with a return value in the end."}},required:["code"]},func:({code:e},t)=>this.codeInterpreterJavascript(e,_optionalChain([t, 'optionalAccess', _2 => _2.abortSignal]))}}};function h(o){return new i(o)}var _ax = require('@ax-llm/ax');exports.AxJSInterpreter = i; exports.AxJSInterpreterPermission = c; exports.AxMCPStdioTransport = s; exports.AxRLMJSInterpreter = _ax.AxRLMJSInterpreter; exports.AxRLMJSInterpreterPermission = _ax.AxRLMJSInterpreterPermission; exports.axCreateJSInterpreter = h; exports.axCreateMCPStdioTransport = a; exports.axCreateRLMJSInterpreter = _ax.axCreateRLMJSInterpreter;
4
4
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../mcp/stdioTransport.ts","../functions/jsInterpreter.ts"],"names":["AxMCPStdioTransport","config","spawn","readline","line","response","resolver","message","resolve","res"],"mappings":"AAAA,0mCAA2D,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;AC5CnD","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","import * as _fs from 'node:fs';\nimport * as _http from 'node:http';\nimport * as _https from 'node:https';\nimport * as _os from 'node:os';\nimport * as _process from 'node:process';\nimport { runInNewContext } from 'node:vm';\nimport type { AxFunction } from '@ax-llm/ax';\n\n// Local implementation of getCrypto since it's not exported from main package\nfunction getCrypto() {\n if (globalThis.crypto && typeof globalThis.crypto.randomUUID === 'function') {\n return globalThis.crypto;\n }\n throw new Error(\n 'Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.'\n );\n}\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console;\n fs: unknown;\n http: unknown;\n https: unknown;\n os: unknown;\n crypto: unknown;\n process: unknown;\n};\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[];\n private timeout: number;\n\n constructor({\n permissions = [],\n timeout = 30_000,\n }:\n | Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n | undefined = {}) {\n this.permissions = permissions ?? [];\n this.timeout = timeout;\n }\n\n private codeInterpreterJavascript(\n code: string,\n abortSignal?: AbortSignal\n ): unknown {\n if (abortSignal?.aborted) {\n throw new Error(\n `Aborted: ${abortSignal.reason ?? 'Interpreter execution aborted'}`\n );\n }\n\n const context: Partial<Context> = { console };\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http;\n context.https = _https;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = getCrypto();\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process;\n }\n\n return runInNewContext(`(function() { ${code} })()`, context, {\n timeout: this.timeout,\n });\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: (\n { code }: Readonly<{ code: string }>,\n extra?: Parameters<AxFunction['func']>[1]\n ) => this.codeInterpreterJavascript(code, extra?.abortSignal),\n };\n }\n}\n\n// Factory function following the same pattern as MCP\nexport function axCreateJSInterpreter(\n options?: Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n): AxJSInterpreter {\n return new AxJSInterpreter(options);\n}\n"]}
1
+ {"version":3,"sources":["../mcp/stdioTransport.ts","../functions/jsInterpreter.ts"],"names":["AxMCPStdioTransport","config","spawn","readline","line","response","resolver","message","resolve","res"],"mappings":"AAAA,6lCAA2D,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;AC5CnD","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","import * as _fs from 'node:fs';\nimport * as _http from 'node:http';\nimport * as _https from 'node:https';\nimport * as _os from 'node:os';\nimport * as _process from 'node:process';\nimport { runInNewContext } from 'node:vm';\nimport type { AxFunction } from '@ax-llm/ax';\n\n// Local implementation of getCrypto since it's not exported from main package\nfunction getCrypto() {\n if (globalThis.crypto && typeof globalThis.crypto.randomUUID === 'function') {\n return globalThis.crypto;\n }\n throw new Error(\n 'Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.'\n );\n}\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console;\n fs: unknown;\n http: unknown;\n https: unknown;\n os: unknown;\n crypto: unknown;\n process: unknown;\n};\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[];\n private timeout: number;\n\n constructor({\n permissions = [],\n timeout = 30_000,\n }:\n | Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n | undefined = {}) {\n this.permissions = permissions ?? [];\n this.timeout = timeout;\n }\n\n private codeInterpreterJavascript(\n code: string,\n abortSignal?: AbortSignal\n ): unknown {\n if (abortSignal?.aborted) {\n throw new Error(\n `Aborted: ${abortSignal.reason ?? 'Interpreter execution aborted'}`\n );\n }\n\n const context: Partial<Context> = { console };\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http;\n context.https = _https;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = getCrypto();\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process;\n }\n\n return runInNewContext(`(function() { ${code} })()`, context, {\n timeout: this.timeout,\n });\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: (\n { code }: Readonly<{ code: string }>,\n extra?: Parameters<AxFunction['func']>[1]\n ) => this.codeInterpreterJavascript(code, extra?.abortSignal),\n };\n }\n}\n\n// Factory function following the same pattern as MCP\nexport function axCreateJSInterpreter(\n options?: Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n): AxJSInterpreter {\n return new AxJSInterpreter(options);\n}\n"]}
package/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxFunction, AxCodeInterpreter, AxCodeSession } from '@ax-llm/ax';
1
+ import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxFunction } from '@ax-llm/ax';
2
+ export { AxRLMJSInterpreter, AxRLMJSInterpreterPermission, axCreateRLMJSInterpreter } from '@ax-llm/ax';
2
3
 
3
4
  interface StdioTransportConfig {
4
5
  command: string;
@@ -47,23 +48,4 @@ declare function axCreateJSInterpreter(options?: Readonly<{
47
48
  timeout?: number;
48
49
  }>): AxJSInterpreter;
49
50
 
50
- /**
51
- * Node.js JavaScript interpreter for RLM using `node:vm`.
52
- * Creates persistent sessions where variables survive across `execute()` calls.
53
- */
54
- declare class AxRLMJSInterpreter implements AxCodeInterpreter {
55
- readonly language = "JavaScript";
56
- private readonly timeout;
57
- constructor(options?: Readonly<{
58
- timeout?: number;
59
- }>);
60
- createSession(globals?: Record<string, unknown>): AxCodeSession;
61
- }
62
- /**
63
- * Factory function for creating an AxRLMJSInterpreter.
64
- */
65
- declare function axCreateRLMJSInterpreter(options?: Readonly<{
66
- timeout?: number;
67
- }>): AxRLMJSInterpreter;
68
-
69
- export { AxJSInterpreter, AxJSInterpreterPermission, AxMCPStdioTransport, AxRLMJSInterpreter, type StdioTransportConfig, axCreateJSInterpreter, axCreateMCPStdioTransport, axCreateRLMJSInterpreter };
51
+ export { AxJSInterpreter, AxJSInterpreterPermission, AxMCPStdioTransport, type StdioTransportConfig, axCreateJSInterpreter, axCreateMCPStdioTransport };
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxFunction, AxCodeInterpreter, AxCodeSession } from '@ax-llm/ax';
1
+ import { AxMCPTransport, AxMCPJSONRPCRequest, AxMCPJSONRPCResponse, AxMCPJSONRPCNotification, AxFunction } from '@ax-llm/ax';
2
+ export { AxRLMJSInterpreter, AxRLMJSInterpreterPermission, axCreateRLMJSInterpreter } from '@ax-llm/ax';
2
3
 
3
4
  interface StdioTransportConfig {
4
5
  command: string;
@@ -47,23 +48,4 @@ declare function axCreateJSInterpreter(options?: Readonly<{
47
48
  timeout?: number;
48
49
  }>): AxJSInterpreter;
49
50
 
50
- /**
51
- * Node.js JavaScript interpreter for RLM using `node:vm`.
52
- * Creates persistent sessions where variables survive across `execute()` calls.
53
- */
54
- declare class AxRLMJSInterpreter implements AxCodeInterpreter {
55
- readonly language = "JavaScript";
56
- private readonly timeout;
57
- constructor(options?: Readonly<{
58
- timeout?: number;
59
- }>);
60
- createSession(globals?: Record<string, unknown>): AxCodeSession;
61
- }
62
- /**
63
- * Factory function for creating an AxRLMJSInterpreter.
64
- */
65
- declare function axCreateRLMJSInterpreter(options?: Readonly<{
66
- timeout?: number;
67
- }>): AxRLMJSInterpreter;
68
-
69
- export { AxJSInterpreter, AxJSInterpreterPermission, AxMCPStdioTransport, AxRLMJSInterpreter, type StdioTransportConfig, axCreateJSInterpreter, axCreateMCPStdioTransport, axCreateRLMJSInterpreter };
51
+ export { AxJSInterpreter, AxJSInterpreterPermission, AxMCPStdioTransport, type StdioTransportConfig, axCreateJSInterpreter, axCreateMCPStdioTransport };
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{spawn as x}from"child_process";import C from"readline";var i=class{process;rl;pendingResponses=new Map;constructor(e){this.process=x(e.command,e.args??[],{env:e.env?{...process.env,...e.env}:process.env}),this.rl=C.createInterface({input:this.process.stdout}),this.rl.on("line",t=>{try{let r=JSON.parse(t),s=this.pendingResponses.get(r.id);s&&(s(r),this.pendingResponses.delete(r.id))}catch{console.warn("Non-JSON output from MCP server:",t)}})}async send(e){return new Promise(t=>{this.pendingResponses.set(e.id,r=>{t(r)}),this.process.stdin.write(`${JSON.stringify(e)}
1
+ import{spawn as m}from"child_process";import d from"readline";var s=class{process;rl;pendingResponses=new Map;constructor(e){this.process=m(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",t=>{try{let r=JSON.parse(t),p=this.pendingResponses.get(r.id);p&&(p(r),this.pendingResponses.delete(r.id))}catch{console.warn("Non-JSON output from MCP server:",t)}})}async send(e){return new Promise(t=>{this.pendingResponses.set(e.id,r=>{t(r)}),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 u(n){return new i(n)}import*as P from"fs";import*as f from"http";import*as S from"https";import*as h from"os";import*as y from"process";import{runInNewContext as R}from"vm";function w(){if(globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function")return globalThis.crypto;throw new Error("Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.")}var m=(o=>(o.FS="node:fs",o.NET="net",o.OS="os",o.CRYPTO="crypto",o.PROCESS="process",o))(m||{}),a=class{permissions;timeout;constructor({permissions:e=[],timeout:t=3e4}={}){this.permissions=e??[],this.timeout=t}codeInterpreterJavascript(e,t){if(t?.aborted)throw new Error(`Aborted: ${t.reason??"Interpreter execution aborted"}`);let r={console};return this.permissions.includes("node:fs")&&(r.fs=P),this.permissions.includes("net")&&(r.http=f,r.https=S),this.permissions.includes("os")&&(r.os=h),this.permissions.includes("crypto")&&(r.crypto=w()),this.permissions.includes("process")&&(r.process=y),R(`(function() { ${e} })()`,r,{timeout:this.timeout})}toFunction(){return{name:"javascriptInterpreter",description:"Use this function to run Javascript code and get any expected return value",parameters:{type:"object",properties:{code:{type:"string",description:"JS code with a return value in the end."}},required:["code"]},func:({code:e},t)=>this.codeInterpreterJavascript(e,t?.abortSignal)}}};function A(n){return new a(n)}import{createContext as b,runInContext as d}from"vm";function v(n,e){return e.aborted?Promise.reject(new Error(`Aborted: ${e.reason??"VM execution aborted"}`)):new Promise((t,r)=>{let s=()=>r(new Error(`Aborted: ${e.reason??"VM execution aborted"}`));e.addEventListener("abort",s,{once:!0}),n.then(o=>{e.removeEventListener("abort",s),t(o)},o=>{e.removeEventListener("abort",s),r(o)})})}var p=class{language="JavaScript";timeout;constructor(e){this.timeout=e?.timeout??3e4}createSession(e){let t=b({console,setTimeout,clearTimeout,setInterval,clearInterval,...e}),r=this.timeout;return{async execute(s,o){if(o?.signal?.aborted)throw new Error(`Aborted: ${o.signal.reason??"VM execution aborted"}`);if(/\bawait\b/.test(s)){let l=`(async () => { ${s} })()`,c=d(l,t,{timeout:r});return o?.signal?await v(c,o.signal):await c}return d(s,t,{timeout:r})},close(){}}}};function J(n){return new p(n)}export{a as AxJSInterpreter,m as AxJSInterpreterPermission,i as AxMCPStdioTransport,p as AxRLMJSInterpreter,A as axCreateJSInterpreter,u as axCreateMCPStdioTransport,J as axCreateRLMJSInterpreter};
3
+ `)}async connect(){return Promise.resolve()}async terminate(){return this.rl.close(),this.process.kill(),new Promise(e=>{this.process.on("exit",()=>e())})}};function a(o){return new s(o)}import*as u from"fs";import*as l from"http";import*as x from"https";import*as C from"os";import*as P from"process";import{runInNewContext as f}from"vm";function S(){if(globalThis.crypto&&typeof globalThis.crypto.randomUUID=="function")return globalThis.crypto;throw new Error("Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.")}var c=(n=>(n.FS="node:fs",n.NET="net",n.OS="os",n.CRYPTO="crypto",n.PROCESS="process",n))(c||{}),i=class{permissions;timeout;constructor({permissions:e=[],timeout:t=3e4}={}){this.permissions=e??[],this.timeout=t}codeInterpreterJavascript(e,t){if(t?.aborted)throw new Error(`Aborted: ${t.reason??"Interpreter execution aborted"}`);let r={console};return this.permissions.includes("node:fs")&&(r.fs=u),this.permissions.includes("net")&&(r.http=l,r.https=x),this.permissions.includes("os")&&(r.os=C),this.permissions.includes("crypto")&&(r.crypto=S()),this.permissions.includes("process")&&(r.process=P),f(`(function() { ${e} })()`,r,{timeout:this.timeout})}toFunction(){return{name:"javascriptInterpreter",description:"Use this function to run Javascript code and get any expected return value",parameters:{type:"object",properties:{code:{type:"string",description:"JS code with a return value in the end."}},required:["code"]},func:({code:e},t)=>this.codeInterpreterJavascript(e,t?.abortSignal)}}};function h(o){return new i(o)}import{AxRLMJSInterpreter as I,AxRLMJSInterpreterPermission as T,axCreateRLMJSInterpreter as b}from"@ax-llm/ax";export{i as AxJSInterpreter,c as AxJSInterpreterPermission,s as AxMCPStdioTransport,I as AxRLMJSInterpreter,T as AxRLMJSInterpreterPermission,h as axCreateJSInterpreter,a as axCreateMCPStdioTransport,b as axCreateRLMJSInterpreter};
4
4
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../mcp/stdioTransport.ts","../functions/jsInterpreter.ts","../functions/rlmInterpreter.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","import * as _fs from 'node:fs';\nimport * as _http from 'node:http';\nimport * as _https from 'node:https';\nimport * as _os from 'node:os';\nimport * as _process from 'node:process';\nimport { runInNewContext } from 'node:vm';\nimport type { AxFunction } from '@ax-llm/ax';\n\n// Local implementation of getCrypto since it's not exported from main package\nfunction getCrypto() {\n if (globalThis.crypto && typeof globalThis.crypto.randomUUID === 'function') {\n return globalThis.crypto;\n }\n throw new Error(\n 'Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.'\n );\n}\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console;\n fs: unknown;\n http: unknown;\n https: unknown;\n os: unknown;\n crypto: unknown;\n process: unknown;\n};\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[];\n private timeout: number;\n\n constructor({\n permissions = [],\n timeout = 30_000,\n }:\n | Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n | undefined = {}) {\n this.permissions = permissions ?? [];\n this.timeout = timeout;\n }\n\n private codeInterpreterJavascript(\n code: string,\n abortSignal?: AbortSignal\n ): unknown {\n if (abortSignal?.aborted) {\n throw new Error(\n `Aborted: ${abortSignal.reason ?? 'Interpreter execution aborted'}`\n );\n }\n\n const context: Partial<Context> = { console };\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http;\n context.https = _https;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = getCrypto();\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process;\n }\n\n return runInNewContext(`(function() { ${code} })()`, context, {\n timeout: this.timeout,\n });\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: (\n { code }: Readonly<{ code: string }>,\n extra?: Parameters<AxFunction['func']>[1]\n ) => this.codeInterpreterJavascript(code, extra?.abortSignal),\n };\n }\n}\n\n// Factory function following the same pattern as MCP\nexport function axCreateJSInterpreter(\n options?: Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n): AxJSInterpreter {\n return new AxJSInterpreter(options);\n}\n","import { createContext, runInContext } from 'node:vm';\n\nimport type { AxCodeInterpreter, AxCodeSession } from '@ax-llm/ax';\n\nfunction raceAbortSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal\n): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(\n new Error(`Aborted: ${signal.reason ?? 'VM execution aborted'}`)\n );\n }\n return new Promise<T>((resolve, reject) => {\n const onAbort = () =>\n reject(new Error(`Aborted: ${signal.reason ?? 'VM execution aborted'}`));\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', onAbort);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', onAbort);\n reject(e);\n }\n );\n });\n}\n\n/**\n * Node.js JavaScript interpreter for RLM using `node:vm`.\n * Creates persistent sessions where variables survive across `execute()` calls.\n */\nexport class AxRLMJSInterpreter implements AxCodeInterpreter {\n readonly language = 'JavaScript';\n private readonly timeout: number;\n\n constructor(options?: Readonly<{ timeout?: number }>) {\n this.timeout = options?.timeout ?? 30_000;\n }\n\n createSession(globals?: Record<string, unknown>): AxCodeSession {\n const context = createContext({\n console,\n setTimeout,\n clearTimeout,\n setInterval,\n clearInterval,\n ...globals,\n });\n const timeout = this.timeout;\n\n return {\n async execute(\n code: string,\n options?: { signal?: AbortSignal }\n ): Promise<unknown> {\n if (options?.signal?.aborted) {\n throw new Error(\n `Aborted: ${options.signal.reason ?? 'VM execution aborted'}`\n );\n }\n if (/\\bawait\\b/.test(code)) {\n // Wrap in async IIFE so top-level await works.\n // Only bare assignments (no var/const/let) persist across calls.\n const wrapped = `(async () => { ${code} })()`;\n const execPromise = runInContext(wrapped, context, { timeout });\n\n if (options?.signal) {\n return await raceAbortSignal(execPromise, options.signal);\n }\n return await execPromise;\n }\n // Direct execution: var declarations persist on the context,\n // and the last expression value is auto-returned.\n return runInContext(code, context, { timeout });\n },\n close() {\n // No cleanup needed for vm contexts\n },\n };\n }\n}\n\n/**\n * Factory function for creating an AxRLMJSInterpreter.\n */\nexport function axCreateRLMJSInterpreter(\n options?: Readonly<{ timeout?: number }>\n): AxRLMJSInterpreter {\n return new AxRLMJSInterpreter(options);\n}\n"],"mappings":"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","names":["spawn","readline","AxMCPStdioTransport","config","line","response","resolver","message","resolve","res","axCreateMCPStdioTransport","_fs","_http","_https","_os","_process","runInNewContext","getCrypto","AxJSInterpreterPermission","AxJSInterpreter","permissions","timeout","code","abortSignal","context","extra","axCreateJSInterpreter","options","createContext","runInContext","raceAbortSignal","promise","signal","resolve","reject","onAbort","v","e","AxRLMJSInterpreter","options","globals","context","timeout","code","wrapped","execPromise","axCreateRLMJSInterpreter"]}
1
+ {"version":3,"sources":["../mcp/stdioTransport.ts","../functions/jsInterpreter.ts","../functions/index.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","import * as _fs from 'node:fs';\nimport * as _http from 'node:http';\nimport * as _https from 'node:https';\nimport * as _os from 'node:os';\nimport * as _process from 'node:process';\nimport { runInNewContext } from 'node:vm';\nimport type { AxFunction } from '@ax-llm/ax';\n\n// Local implementation of getCrypto since it's not exported from main package\nfunction getCrypto() {\n if (globalThis.crypto && typeof globalThis.crypto.randomUUID === 'function') {\n return globalThis.crypto;\n }\n throw new Error(\n 'Web Crypto API with randomUUID support not available. Requires Node.js 16+ or modern browser.'\n );\n}\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console;\n fs: unknown;\n http: unknown;\n https: unknown;\n os: unknown;\n crypto: unknown;\n process: unknown;\n};\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[];\n private timeout: number;\n\n constructor({\n permissions = [],\n timeout = 30_000,\n }:\n | Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n | undefined = {}) {\n this.permissions = permissions ?? [];\n this.timeout = timeout;\n }\n\n private codeInterpreterJavascript(\n code: string,\n abortSignal?: AbortSignal\n ): unknown {\n if (abortSignal?.aborted) {\n throw new Error(\n `Aborted: ${abortSignal.reason ?? 'Interpreter execution aborted'}`\n );\n }\n\n const context: Partial<Context> = { console };\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http;\n context.https = _https;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os;\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = getCrypto();\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process;\n }\n\n return runInNewContext(`(function() { ${code} })()`, context, {\n timeout: this.timeout,\n });\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: (\n { code }: Readonly<{ code: string }>,\n extra?: Parameters<AxFunction['func']>[1]\n ) => this.codeInterpreterJavascript(code, extra?.abortSignal),\n };\n }\n}\n\n// Factory function following the same pattern as MCP\nexport function axCreateJSInterpreter(\n options?: Readonly<{\n permissions?: readonly AxJSInterpreterPermission[];\n timeout?: number;\n }>\n): AxJSInterpreter {\n return new AxJSInterpreter(options);\n}\n","// Function tools for Node.js environments\nexport {\n AxJSInterpreter,\n AxJSInterpreterPermission,\n axCreateJSInterpreter,\n} from './jsInterpreter.js';\n\n// AxRLMJSInterpreter moved to @ax-llm/ax (browser-compatible Web Worker implementation)\nexport {\n AxRLMJSInterpreter,\n AxRLMJSInterpreterPermission,\n axCreateRLMJSInterpreter,\n} from '@ax-llm/ax';\n"],"mappings":"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","names":["spawn","readline","AxMCPStdioTransport","config","line","response","resolver","message","resolve","res","axCreateMCPStdioTransport","_fs","_http","_https","_os","_process","runInNewContext","getCrypto","AxJSInterpreterPermission","AxJSInterpreter","permissions","timeout","code","abortSignal","context","extra","axCreateJSInterpreter","options","AxRLMJSInterpreter","AxRLMJSInterpreterPermission","axCreateRLMJSInterpreter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ax-llm/ax-tools",
3
- "version": "16.1.9",
3
+ "version": "16.1.11",
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": "16.1.9"
16
+ "@ax-llm/ax": "16.1.11"
17
17
  },
18
18
  "files": [
19
19
  "**/*"