{"_id":"@stirrup/stirrup","_rev":"8-fc7765c300a5dfa258822f720d94626b","name":"@stirrup/stirrup","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.0":{"name":"@stirrup/stirrup","version":"1.0.0","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.0","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"d2cd62ab80192fc36b9a110e73bfe8a01ff5444b","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.0.tgz","fileCount":151,"integrity":"sha512-6QCmUMaarzGdKG6sBP4K1OvTQREJnjHuro+lE5GnPSmyVMV4MVcWycKowEcHPC49kIWgIMzEmkE2tdKUqQ6IOg==","signatures":[{"sig":"MEUCIFiwjXgj4wObhHSu3oMoUfoYjsLQ0gt14VTW/TN0l5fGAiEAstqqJV9J/nwP5tmCyDm7bnO3kgg8wBpf6AefwrcErO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":398659},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"}},"gitHead":"8854e4f19deb09460dff4250bcf8606dfb8ff8ef","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.4.1","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","jsdom":"^25.0.1","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@mozilla/readability":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/jsdom":"^27.0.0","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.0_1768348204951_0.7961873791859826","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@stirrup/stirrup","version":"1.0.1","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.1","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"13030d8732d0d97cc1508edf67bf65a96092ea20","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.1.tgz","fileCount":151,"integrity":"sha512-YqwI/k6W7cpty/x4LbRZtIf8eIXnutz+w37EwQpGyXICHkCbkbKpHLmfxB16b4qIivSvn+ts3JE/hxvPoQ1GWA==","signatures":[{"sig":"MEYCIQCzMgWqiVip/QA5WH77IRCx/N4ryK8tH9KfUejdwWNmAAIhANaDgFkNiXs/Bxg4g5J/4jExyGOiq5jTQa+ON4fCiaOF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":398512},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"}},"gitHead":"1a509444bf1bbfd4c94d4e2bcc4919fd866b9674","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.4.1","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.1_1768590002427_0.21163088117786244","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@stirrup/stirrup","version":"1.0.2","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.2","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"be1dcb7b2da0b6e7c1922901ae9d31b5ef986ad0","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.2.tgz","fileCount":159,"integrity":"sha512-czXG79Xnpijr8dEL1Lpncc6Z9x/epP0bzC4KLvOvACFMrW2ueaVTK3h9ZvyzVpQpNgaCJIELDiCibZg+rB3vVw==","signatures":[{"sig":"MEUCIAR+1HjyaAshJOJQW5go7RdPN2+cYYWtzuaumk7ftwMCAiEA+rMlTWzmXfLgkwy9jorMuSnMOStFBN2Qkg0Td3xCBfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":452192},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"gitHead":"39b914d1e04cd28fce44287b6ba13d8dd7e21489","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.9.0","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.2_1774745553879_0.1829118565927026","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@stirrup/stirrup","version":"1.0.3","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.3","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"8a0f65c4b95227ec55eb4fd56d283bd895249470","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.3.tgz","fileCount":159,"integrity":"sha512-ytgukS3wgVlyPvxsvkT0/zyZqyhQrwNkYnnDW4/Hq5kpsaF42Nd/67488gi1LHZe86/vmHzRCCXMeJw5qCE/ZQ==","signatures":[{"sig":"MEQCIDZX8hpVO40e1Ov+tnjN1yyk1I6y7uQNDq31/a3s0xHuAiB6lxStnClMmMl60kod14CeaalxFWVefJqzUG9NK+kQ4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":452164},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"gitHead":"5cbccfc19a47b4e986aaabb2b711884879e27012","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.9.0","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.3_1774745954027_0.6825564521045264","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@stirrup/stirrup","version":"1.0.4","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.4","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"eec162b2883b61403689707684ced3d70bd14dd1","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.4.tgz","fileCount":159,"integrity":"sha512-3j1wl1wgG3NHG5NhxQPSc/0V8rPKe9meID7EEqfr0o3VbYbRi+LP/FY+9I02OgAP+EMt+hMH1By0GRYdyfuWIw==","signatures":[{"sig":"MEUCIQDoqmvPmnMczP536lIX6di02X34zmF5UsA0204ih+Ju4gIgePjhLcbbsLHRtQ4k/0DPdoByGaE/190fd4LSovKk3N4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":452869},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"gitHead":"3450206b9fa0d5129ca5792f21220cce48c70d51","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.9.0","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.4_1774748643896_0.8534627866033289","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@stirrup/stirrup","version":"1.0.5","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.5","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"c504fea82a6e2fa5877e019096344ad8a5f0d0c9","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.5.tgz","fileCount":159,"integrity":"sha512-CVRB9uyUoVWSsISI7ZCuBf19FYm2AaUVEm3XZpYbs9V+4MEogjVzgaixS/foC26bWoZ71q4eyZi+Zhoho39UAQ==","signatures":[{"sig":"MEUCIQDd9eukI3hGwmquHXZ7Vv9LevJlYby3ckY9+pBbuhNxMgIgZZS5M6sFvadwAxJwuddIdr/+hSMhAu7rHiBZEvGAzpI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":454175},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"gitHead":"1c97cd712e33686f65b701b85f54781fb6294197","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.9.0","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.5_1774750465059_0.09346859042118782","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@stirrup/stirrup","version":"1.0.6","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","_id":"@stirrup/stirrup@1.0.6","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"dist":{"shasum":"9628a5cce039a64ce4a04db3b8707915b70c7558","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.6.tgz","fileCount":159,"integrity":"sha512-TRPgyBSNTEbwwpgVEXAMW+vg2uLXAdbyiWyuSVy+pUJYN9pC/TrKIdwS7vlAGj1gE0oD0HeQbT+45epgs2UweQ==","signatures":[{"sig":"MEUCIBrNoQ49wQ/lC7Hq0GtmK1YuEjJS6gNRfh/ZLJch0opXAiEAoTBWdLkbh50Zd0J2Pk24CcpQT1M9EfsxWynvd8EXqVU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459686},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"gitHead":"b6847fb21c71f2cd280892d746c3b84e39332f6b","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest","build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","format":"prettier --write \"src/**/*.ts\"","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest --coverage"},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"_npmVersion":"11.9.0","description":"The lightweight foundation for building agents in TypeScript","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^8.1.0","zod":"^3.23.8","pino":"^9.6.0","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","execa":"^9.4.0","sharp":"^0.33.5","dotenv":"^16.4.5","openai":"^4.68.4","cheerio":"^1.1.2","turndown":"^7.2.0","file-type":"^19.5.0","cli-table3":"^0.6.5","async-retry":"^1.3.3","pino-pretty":"^13.0.0","ffmpeg-static":"^5.2.0","fluent-ffmpeg":"^2.1.3","@types/cheerio":"^0.22.35"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.1","eslint":"^8.57.1","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.6.3","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@types/async-retry":"^1.4.9","@vitest/coverage-v8":"^4.0.16","@types/fluent-ffmpeg":"^2.1.27","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"optionalDependencies":{"ai":"^6.0.3","dockerode":"^4.0.2","@ai-sdk/openai":"^1.0.5","@types/dockerode":"^3.3.31","@ai-sdk/anthropic":"^3.0.2","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/stirrup_1.0.6_1774761713287_0.3740452213462744","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@stirrup/stirrup","version":"1.0.7","description":"The lightweight foundation for building agents in TypeScript","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./clients/openai":{"types":"./dist/clients/openai-client.d.ts","import":"./dist/clients/openai-client.js"},"./clients/anthropic":{"types":"./dist/clients/anthropic-client.d.ts","import":"./dist/clients/anthropic-client.js"},"./clients/vercel-ai":{"types":"./dist/clients/vercel-ai-client.d.ts","import":"./dist/clients/vercel-ai-client.js"},"./clients/open-responses":{"types":"./dist/clients/open-responses-client.d.ts","import":"./dist/clients/open-responses-client.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist',{ recursive:true, force:true });\" && tsc","dev":"tsc --watch","test":"vitest","test:ui":"vitest --ui","test:coverage":"vitest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\"","typecheck":"tsc --noEmit"},"keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","engines":{"node":">=20.0.0"},"dependencies":{"@types/cheerio":"^0.22.35","async-retry":"^1.3.3","axios":"^1.7.7","boxen":"^8.0.1","chalk":"^5.3.0","cheerio":"^1.1.2","cli-table3":"^0.6.5","dotenv":"^16.4.5","execa":"^9.4.0","ffmpeg-static":"^5.2.0","file-type":"^19.5.0","fluent-ffmpeg":"^2.1.3","openai":"^4.68.4","ora":"^8.1.0","pino":"^9.6.0","pino-pretty":"^13.0.0","sharp":"^0.33.5","turndown":"^7.2.0","zod":"^3.23.8"},"optionalDependencies":{"@ai-sdk/anthropic":"^3.0.2","@ai-sdk/openai":"^1.0.5","@anthropic-ai/sdk":"^0.32.1","@e2b/code-interpreter":"^1.0.1","@modelcontextprotocol/sdk":"^1.0.4","@types/dockerode":"^3.3.31","ai":"^6.0.3","dockerode":"^4.0.2"},"devDependencies":{"@types/async-retry":"^1.4.9","@types/fluent-ffmpeg":"^2.1.27","@types/node":"^22.7.7","@types/turndown":"^5.0.5","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0","@vitest/coverage-v8":"^4.0.16","@vitest/ui":"^4.0.16","eslint":"^8.57.1","prettier":"^3.3.3","tsx":"^4.19.1","typescript":"^5.6.3","vitest":"^4.0.16"},"gitHead":"9a247e68bb4468f38ae31450d22e70c2ad3408fd","_id":"@stirrup/stirrup@1.0.7","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-UBxxLVAYWTIGAJtlwZdsKwDZyahRIoLwJtpS2Co8vH6XkJKpV10gW4wST1oH32Wad5/gpxV6xuyWtyGpcUbBWg==","shasum":"ba25a28cfff17b071e9602a1dea78b0e43947daa","tarball":"https://registry.npmjs.org/@stirrup/stirrup/-/stirrup-1.0.7.tgz","fileCount":159,"unpackedSize":459916,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCpjXCGcHdBja9YzoHDsTlf+RKn01l0Z6BYkJQqBhSSswIhANwwptaQehd9mAHrKZwa1c2ha8kCQDjNoEpqRX/RPLOG"}]},"_npmUser":{"name":"georgecameron","email":"grmcameron@gmail.com"},"directories":{},"maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/stirrup_1.0.7_1782076986233_0.11345628337289182"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-13T23:50:04.876Z","modified":"2026-06-21T21:23:06.496Z","1.0.0":"2026-01-13T23:50:05.102Z","1.0.1":"2026-01-16T19:00:02.599Z","1.0.2":"2026-03-29T00:52:34.051Z","1.0.3":"2026-03-29T00:59:14.189Z","1.0.4":"2026-03-29T01:44:04.125Z","1.0.5":"2026-03-29T02:14:25.222Z","1.0.6":"2026-03-29T05:21:53.441Z","1.0.7":"2026-06-21T21:23:06.375Z"},"author":{"name":"Artificial Analysis, Inc."},"license":"MIT","keywords":["ai","agent","llm","openai","anthropic","tools","framework","typescript"],"description":"The lightweight foundation for building agents in TypeScript","maintainers":[{"name":"georgecameron","email":"grmcameron@gmail.com"},{"name":"louii","email":"louiscflin@gmail.com"}],"readme":"![stirrup-banner](https://github.com/user-attachments/assets/f38df9e4-8c92-43f4-a159-c3c7534381f1)<div align=\"center\">\n  <a href=\"https://stirrup.artificialanalysis.ai\">\n  </a>\n  <h1>The lightweight foundation for building agents (TypeScript implementation)</h1>\n<br>\n</div>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@stirrup/stirrup\"><img src=\"https://img.shields.io/npm/v/@stirrup%2Fstirrup\" alt=\"NPM version\" /></a>&nbsp;<!--\n  --><a href=\"https://github.com/ArtificialAnalysis/Stirrup/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/ArtificialAnalysis/Stirrup\" alt=\"License\" /></a>&nbsp;<!--\n  --><a href=\"https://stirrup.artificialanalysis.ai\"><img src=\"https://img.shields.io/badge/MkDocs-4F46E5?logo=materialformkdocs&logoColor=fff\" alt=\"MkDocs\" /></a>\n</p>\n\nStirrup is a lightweight framework, or starting point template, for building agents in TypeScript/JavaScript. It differs from other agent frameworks by:\n\n- **Working with the model, not against it:** Stirrup gets out of the way and lets the model choose its own approach to completing tasks. Many frameworks impose rigid workflows that can degrade results.\n- **Best practices and tools built-in:** We analyzed the leading agents (Claude Code, Codex, and others) to understand and incorporate best practices relating to topics like context management and foundational tools (e.g., code execution).\n- **Fully customizable:** Use Stirrup as a package or as a starting template to build your own fully customized agents.\n\n> **Note:** This is the TypeScript implementation of the [Python Stirrup framework](https://github.com/ArtificialAnalysis/Stirrup).\n\n## Features\n\n- 🔎 **Online search / web browsing:** Search and fetch web pages\n- 🧪 **Code execution:** Run code locally, in Docker, or in an E2B sandbox\n- 🔌 **MCP client support:** Connect to MCP servers and use their tools/resources\n- 📄 **Document input and output:** Import files into context and produce file outputs\n- 🧩 **Skills system:** Extend agents with modular, domain-specific instruction packages\n- 🛠️ **Flexible tool execution:** A generic `Tool` interface allows easy tool definition and extension with Zod validation\n- 👤 **Human-in-the-loop:** Includes a built-in user input tool that enables human feedback or clarification during agent execution\n- 🧠 **Context management:** Automatically summarizes conversation history when approaching context limits, with deduplication to prevent summary accumulation\n- 🔁 **Flexible provider support:** Pre-built support for OpenAI-compatible APIs (Chat Completions + Responses API), Anthropic, and Vercel AI SDK\n- 🖼️ **Multimodal support:** Process images, video, and audio with automatic format conversion\n- 📊 **Speed metrics:** Track output tokens per second (OTPS), generation time, and per-tool execution durations\n- 💾 **Agent run cache:** Cache and resume interrupted agent runs from where they left off\n- ✅ **Output file validation:** Finish tool validates that reported output files actually exist before completing\n- ✅ **Type-safe:** Built from the ground up with TypeScript\n\n\n\n## Installation\n\n```bash\nnpm install @stirrup/stirrup\n# or\npnpm add @stirrup/stirrup\n# or\nyarn add @stirrup/stirrup\n```\n\n## Quick Start\n\n```typescript\nimport { Agent, DEFAULT_TOOLS, SIMPLE_FINISH_TOOL } from '@stirrup/stirrup';\nimport { ChatCompletionsClient } from '@stirrup/stirrup/clients/openai';\n\nasync function main() {\n  // Create client using ChatCompletionsClient\n  // Automatically uses OPENROUTER_API_KEY environment variable\n  const client = new ChatCompletionsClient({\n    baseURL: 'https://openrouter.ai/api/v1',\n    model: 'anthropic/claude-4.5-sonnet',\n  });\n\n  // As no tools are provided, the agent will use the default tools, which consist of:\n  // - Web tools (web search and web fetching, note web search requires BRAVE_API_KEY)\n  // - Local code execution tool (to execute shell commands)\n  const agent = new Agent({\n    client, \n    name: 'agent', \n    maxTurns: 15,\n    tools: DEFAULT_TOOLS,\n    finishTool: SIMPLE_FINISH_TOOL,\n  });\n\n  // Run with session context - handles tool lifecycle, logging and file outputs\n  // Structured logging is enabled by default\n  await using session = agent.session({ outputDir: './output/getting_started_example' });\n  \n  const result = await session.run(\n    `What is the population of Australia over the last 3 years? Search the web to find out and create a\n    simple chart using python and matplotlib showing the current population per year.`\n  );\n\n  console.log(\"Result:\", result.finishParams);\n}\n\nmain().catch(console.error);\n```\n\n> **Note:** This example uses OpenRouter. Set `OPENROUTER_API_KEY` in your environment before running. Web search requires a `BRAVE_API_KEY`. The agent will still work without it, but web search will be unavailable.\n\n## Full Customization\n\nFor using Stirrup as a foundation for your own fully customized agent, you can clone and import Stirrup locally:\n\n```bash\n# Clone the repository\ngit clone https://github.com/ArtificialAnalysis/StirrupJS.git\ncd StirrupJS\n\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n```\n\n## How It Works\n\n- **`Agent`** - Configures and runs the agent loop until a finish tool is called or max turns reached\n- **`session()`** - Context manager that sets up tools, manages files, handles logging, and ensures cleanup\n- **`Tool`** - Define tools with Zod parameters for full type safety\n- **`ToolProvider`** - Manage tools that require lifecycle (connections, temp directories, etc.)\n- **`DEFAULT_TOOLS`** - Standard tools included by default: code execution and web tools\n\n## Using Other LLM Providers\n\nStirrup supports multiple providers out of the box.\n\n### OpenAI-Compatible APIs\n\n```typescript\nimport { ChatCompletionsClient } from '@stirrup/stirrup/clients/openai';\n\n// Create client using Deepseek's OpenAI-compatible endpoint\nconst client = new ChatCompletionsClient({\n  baseURL: 'https://api.deepseek.com',\n  model: 'deepseek-chat',\n  apiKey: process.env.DEEPSEEK_API_KEY,\n});\n\nconst agent = new Agent({ client, name: 'deepseek_agent', ... });\n```\n\n### Anthropic\n\n```typescript\nimport { AnthropicClient } from '@stirrup/stirrup/clients/anthropic';\n\nconst client = new AnthropicClient({\n  model: 'claude-sonnet-4-5',\n  apiKey: process.env.ANTHROPIC_API_KEY,\n});\n\nconst agent = new Agent({ client, name: 'claude_agent', ... });\n```\n\n### OpenAI Responses API\n\nFor models that support the newer Responses API (e.g., o3, o4-mini):\n\n```typescript\nimport { OpenResponsesClient } from '@stirrup/stirrup/clients/open-responses';\n\nconst client = new OpenResponsesClient({\n  model: 'o3-mini',\n  reasoningEffort: 'medium',\n});\n\nconst agent = new Agent({ client, name: 'responses_agent', ... });\n```\n\n### Vercel AI SDK\n\nStirrup integrates seamlessly with the Vercel AI SDK, giving you access to any provider supported by their ecosystem.\n\n```typescript\nimport { VercelAIClient } from '@stirrup/stirrup/clients/vercel-ai';\nimport { anthropic } from '@ai-sdk/anthropic';\n\nconst client = new VercelAIClient({\n  model: anthropic('claude-sonnet-4-5'),\n});\n\nconst agent = new Agent({ client, name: 'vercel_agent', ... });\n```\n\n## Default Tools\n\nWhen you use `DEFAULT_TOOLS`, you get:\n\n| Tool Provider | Tools Provided | Description |\n| ------------- | -------------- | ----------- |\n| `LocalCodeExecToolProvider` | `code_exec` | Execute shell commands in an isolated temp directory |\n| `WebToolProvider` | `web_fetch`, `web_search` | Fetch web pages and search (search requires `BRAVE_API_KEY`) |\n\n## Extending with Pre-Built Tools\n\n```typescript\nimport { Agent, DEFAULT_TOOLS, CALCULATOR_TOOL, SIMPLE_FINISH_TOOL } from '@stirrup/stirrup';\nimport { ChatCompletionsClient } from '@stirrup/stirrup/clients/openai';\n\n// Create client\nconst client = new ChatCompletionsClient({ ... });\n\n// Create agent with default tools + calculator tool\nconst agent = new Agent({\n  client,\n  name: 'web_calculator_agent',\n  tools: [...DEFAULT_TOOLS, CALCULATOR_TOOL],\n  finishTool: SIMPLE_FINISH_TOOL,\n});\n```\n\n## Defining Custom Tools\n\nStirrup uses Zod for type-safe tool definitions:\n\n```typescript\nimport { z } from 'zod';\nimport { Agent, Tool, ToolUseCountMetadata, DEFAULT_TOOLS } from '@stirrup/stirrup';\n\n// Define parameters schema\nconst GreetParamsSchema = z.object({\n  name: z.string().describe('Name of the person to greet'),\n  formal: z.boolean().default(false).describe('Use formal greeting'),\n});\n\n// Create the tool\nconst GreetTool: Tool<typeof GreetParamsSchema, ToolUseCountMetadata> = {\n  name: 'greet',\n  description: 'Greet someone by name',\n  parameters: GreetParamsSchema,\n  executor: async (params) => {\n    const greeting = params.formal ? `Good day, ${params.name}.` : `Hey ${params.name}!`;\n    \n    return {\n      content: greeting,\n      metadata: new ToolUseCountMetadata(1),\n    };\n  },\n};\n\n// Add to agent\nconst agent = new Agent({\n  client,\n  name: 'greeting_agent',\n  tools: [...DEFAULT_TOOLS, GreetTool],\n  ...\n});\n```\n\n## Advanced Features\n\n### Structured Logging\n\nStirrup JS includes a powerful structured logging system powered by Pino. It's enabled by default when using `agent.session()`:\n\n```typescript\n// Defaults to pretty-printed debug logs\nawait using session = agent.session();\n\n// Customize logging\nawait using session = agent.session({\n  loggerOptions: {\n    level: 'info',  // 'trace' | 'debug' | 'info' | 'warn' | 'error'\n    pretty: false,  // Set to false for JSON output (production)\n  }\n});\n\n// Disable default logger\nawait using session = agent.session({ noLogger: true });\n```\n\n### Speed Metrics\n\nEvery agent run tracks performance metrics including output tokens per second (OTPS), generation time, and per-tool durations. These are available in the run result and displayed automatically by the structured logger:\n\n```typescript\nconst result = await session.run('Create a chart');\n\nconsole.log(result.speedStats);\n// {\n//   modelSlug: 'claude-sonnet-4-5',\n//   totalGenerationMs: 5200,\n//   totalOutputTokens: 1200,\n//   totalToolMs: 3100,\n//   generationCount: 4,\n//   toolBreakdown: { code_exec: 2800, web_fetch: 300 }\n// }\n```\n\n### Agent Run Cache\n\nWhen an agent run is interrupted (max turns reached, errors), the conversation state is automatically cached to `~/.cache/stirrup/`. Resume from where you left off:\n\n```typescript\n// First run - gets interrupted at max turns\nawait using session = agent.session({ outputDir: './output' });\nawait session.run('Complex multi-step task');\n\n// Resume from cache\nawait using session2 = agent.session({ outputDir: './output', resume: true });\nawait session2.run('Complex multi-step task');  // Picks up where it left off\n```\n\n### Message Alternation\n\nSome LLM providers require strict user/assistant message alternation. Enable automatic continuation prompts:\n\n```typescript\nconst agent = new Agent({\n  client,\n  name: 'strict-agent',\n  blockSuccessiveAssistantMessages: true,  // Inject \"Please continue\" when needed\n  ...\n});\n```\n\n### Shared Execution Environment\n\nSub-agents can share the parent's code execution sandbox to avoid file transfer overhead:\n\n```typescript\nconst subAgent = new Agent({\n  client,\n  name: 'worker',\n  shareParentExecEnv: true,  // Reuse parent's sandbox\n  ...\n});\n```\n\n### Event Monitoring\n\nMonitor agent progress in real-time with typed events:\n\n```typescript\nagent.on('turn:start', ({ turn, maxTurns }) => {\n  console.log(`Turn ${turn}/${maxTurns}`);\n});\n\nagent.on('tool:start', ({ name }) => {\n  console.log(`Executing ${name}...`);\n});\n```\n\n## Development\n\n```bash\n# Install\nnpm install\n\n# Build\nnpm run build\n\n# Run examples\nnpx tsx examples/getting-started.ts\n\n# Test\nnpm test\n\n# Type check\nnpm run typecheck\n\n# Run documentation\nuv run mkdocs serve\n```\n\n## License\n\nLicensed under the [MIT LICENSE](LICENSE).\n","readmeFilename":"README.md"}