{"_id":"@aeye/core","_rev":"19-43ced722bde40c7390b4385da23547c1","name":"@aeye/core","dist-tags":{"latest":"0.5.4"},"versions":{"0.1.0":{"name":"@aeye/core","version":"0.1.0","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"MIT","_id":"@aeye/core@0.1.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"c0b7d5137f6ace23f6b21c74735f1909baacd0bb","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.1.0.tgz","fileCount":26,"integrity":"sha512-2N+nlC1ppd57Hz07lYLJkP1jEYwcF/CgDrchNENXbhXgeuRiesE0/RxXF4b+8KlWl6uIgtKd/SXoyGjYnZEbow==","signatures":[{"sig":"MEQCIH8+GsUyha51xr6MzQ+6Qsj1rKHL1zUa20hzHw8mnhyNAiBb2kpWsgb3/cBRdQkO0NqFho3q3jnpu02TlK5oCDWR5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220404},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"7e1a90cc8ba4f871aaa577977959317604a10b08","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1763393626059_0.8237901764231323","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aeye/core","version":"0.1.1","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.1.1","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"37a48796e913f0029459a34d07f8917d7669cf50","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.1.1.tgz","fileCount":30,"integrity":"sha512-JNM+uTebEHzzVrDIfBOsbujjw1j+DD/WKPqPw3QaKaUo+MdzwHz2ged7jkwcR74duIuHZFo4raprx7pD8HOlOw==","signatures":[{"sig":"MEQCIHbub9sSiRgU/sf/p1r9ctDsHNPKc9+nqCjjYbPD3tfpAiAuIWNMSuhAFDHSq/f6czCcyeoZlRhO0Bz//af1tI+c/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235734},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"2515fffb0b757b7460c813024d78f3481ba58d10","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1763671238156_0.8003850535097903","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aeye/core","version":"0.1.2","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.1.2","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"e0f38eded5b631c3bf47b7bf535606347d62b1c3","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.1.2.tgz","fileCount":30,"integrity":"sha512-xVBzsklE9WEYmouvT4sA5rGoBStZ1/+pnhZJLAMfAe4E2G8mmlfFBx92dBnX9BpAMoapp37wQnIP5xQfek4hWQ==","signatures":[{"sig":"MEUCIGbQBwxTA2R3rfYW4t7nAnOku5WFejgdHCn1xNzfnM8RAiEA0r7hmb6M8XM4PGg+iy3OsBY6EqEsux3d2d0cknP7fp4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235734},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"8a92575b59ebe75691033648d66b390bdda22aef","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1763675210108_0.6004870876130888","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aeye/core","version":"0.2.0","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.2.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"5bb7269d827ad2d565776865591487b3a8a22cc4","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.2.0.tgz","fileCount":30,"integrity":"sha512-4Me1JF1G/RGYhwvwmdUxT1FJaaAAqiFSthjcGBvOnMemG/YDeEFhfwAdVI497lceAf08P4gHfF9/gfNUkY7rCQ==","signatures":[{"sig":"MEYCIQCGXKsYKBZxhUfNzsbixQT1E2J9v310BnOHD/dsyG/oLwIhAM5RUYpGATk2XCO17BETHxadm+ur5yxy6zc4CBLbtuvz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":297555},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"25679e42025ba167faec33e98d702939cc22f2c0","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1764260293157_0.39663025007686525","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aeye/core","version":"0.3.0","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"d1f18525a1a29d09deeae44f1763e79e5c7f0c31","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.0.tgz","fileCount":30,"integrity":"sha512-4Ep6G9fANP4godW3SUyReALG89CMNhSWr/JJ9pyUK0zE3TBdmg06bOEu9nLp012nHPd2vCfL5J4WEG8Z/ggfQg==","signatures":[{"sig":"MEQCICIlm7xecyHf/l/4YgAlDMf+vqHPJCLDrIgp2WMn45fiAiA6Oy5bU1a04JxWTbcnm0CQacaQSoUnl0CFU6+L4LtE8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301030},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"fe6afb5adb096a8de1dfc9a115bba1d48193612d","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.0_1764993447679_0.34090494814652383","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aeye/core","version":"0.3.1","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.1","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"183cd3af88640f5328f7896ff8db5da9be48be1f","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.1.tgz","fileCount":30,"integrity":"sha512-Fia+kNk0WIT6VMEZy+JVpue7C/HBdA67AUCshRFhEd4wa+rvylHGVGlaqM2qxSPEMCe4dhfyEf44GjieaBNMTA==","signatures":[{"sig":"MEUCIBkEQMiUsClhWU0+A8N6jzvOw01SVrWza95Ro7s/Tss3AiEAjeCJJ34g9g0KBPuyANuT0nVQVQivOHRmUrSafEsJ8NU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301030},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"cabd7c1d28f8048b51cb89b40efa8d07cead332d","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.1_1765363621010_0.42152249057153734","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@aeye/core","version":"0.3.2","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.2","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"655885ce924381511e573a48b582701c4f15cf83","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.2.tgz","fileCount":30,"integrity":"sha512-wpY5/5nn5XAF4GeDD+9S5yZ2HQ8vVO4SALT6pIfG8HrVN9uPrdss3GAMGY+5gjsCKlj/lfFNMa+SgeFD6EOpJA==","signatures":[{"sig":"MEYCIQDtR606RUM+vgeHsX8FG5THGk6bbBHFsY9y7Xz3W3sqDAIhAKT5WCvj9Urq8abxyjDBIzNgA/1gl3vzHzIGu8Ytkr5k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301030},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"ae51c2a8249a968b210a64efc7c8bedb35fad70b","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.2_1766336254549_0.05956833070779366","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@aeye/core","version":"0.3.4","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.4","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"269af3466f43fa523fe4cd08929efcdfaacb427d","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.4.tgz","fileCount":38,"integrity":"sha512-iUJ/awrzdz0m5Soyq40YMn9/HGKiSC08CrY0d6b2iODrWdbtRLTxHlYdlrGw7dRS9/asSe/+tLG11Ps72OBwlA==","signatures":[{"sig":"MEQCIBiZnYZaEYF3Ci604ty5I7kRNbXu12Uc78yM2YrzTgu0AiB+DTGakV5XUVmELRtuKYURGbwZSXziyIS4jZQUR/1xTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323438},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":{"types":"./dist/index.d.ts","import":"./dist/index.js"}}},"gitHead":"3f4fe5f9da6cad0851958297b5dd34b2c795d6d2","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.4_1770754887754_0.6841110999214715","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@aeye/core","version":"0.3.5","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.5","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"270c97c81cb3df52ae8b5f7e395f3622342fe45a","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.5.tgz","fileCount":38,"integrity":"sha512-go0chKR4BTCnb6tanoPeqKy38Xno6tLNuwC0oSPg/cBUlE9j9tBfqfM1fi+nTVIfc2v3Uyo4UmngkMtKjoIFSg==","signatures":[{"sig":"MEUCIQDg4EVkl/g3oGKkNffd8156Q2zkRvzmqTF4mp3zMCEYAAIgAUTfkdpfaSlgvn4x4e6mC7eLZZOkY+bCXe4si6lEaF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323438},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":{"types":"./dist/index.d.ts","import":"./dist/index.js"}}},"gitHead":"1ca1832163262906c1ae12624a107c0652daeb68","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.5_1770757030912_0.23852885083017727","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@aeye/core","version":"0.3.6","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.6","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"bb1a4ba0d8aeccbd567e25f3c380458c4eee1657","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.6.tgz","fileCount":38,"integrity":"sha512-GbvZNEghUleN7Fg1GL5eO5yYlgJ0WfPPi/eYphA1rNO6hpFKYE7/VIXzU0nJLtoCuP76NZG5Zhj7jWRAeAWA+g==","signatures":[{"sig":"MEYCIQDUQ0c6YpjLJzlUt8k5bS1bISe0UcdEbdcVKyCe+Ltx6AIhAICV3cyjCSvRkmjmBXKUE2CpSCX9IgJSISVagOqW8K3o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323577},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"1ca1832163262906c1ae12624a107c0652daeb68","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.6_1772640915194_0.49947479756177726","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@aeye/core","version":"0.3.7","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.7","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"5d6570f5834f15abefeb9e5d58de1c89a2db889d","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.7.tgz","fileCount":38,"integrity":"sha512-yZ6E8K/6uto5fGTl193G7vB7jeB2bYdBhVeLDgXujm7ufFlqse7L8wg8iF6jMIwN9Npka6ReMT+8IrPRqHtteA==","signatures":[{"sig":"MEUCIQC0MK7UTTvouQq6ZwnbB4Q8lMrkfP4ZqmN6ygGYKv79xQIgUT5kzQ72ebS1/IZNUdcaG0wl7pmBDcGnQtbooKtUiDw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323577},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"a3490a88105713496870fbcf0a8d5ff9d85a3e6c","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.7_1772642467187_0.8046612104282078","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@aeye/core","version":"0.3.8","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.8","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"1a773572c35824af41af8a913800ab7193e71e5b","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.8.tgz","fileCount":38,"integrity":"sha512-ItiNTkz8algKOAWHRgvFsXL8Oj6LPMeJDsXuwIheyIY7EeUN4uQmC6m6sXWjuCk7tn/6jFymmHD3Wfbl1UtAlA==","signatures":[{"sig":"MEQCIG7tI+fDodzrEVOO6YpAwMZXpHI+ap6wJrU/LKY/8CSUAiBc20wi0Tv7a1gpQitoJ2GhExQ/ydbEF8f1cDbdq3vWIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336609},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"04319fa907b4c219f0843292baa1bcd313a97c74","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.8_1775335837451_0.3537707622183466","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@aeye/core","version":"0.3.9","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.3.9","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"c2b790649838869f4e36eb0c6197fb7735fc113b","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.3.9.tgz","fileCount":43,"integrity":"sha512-bUeMSnrSSIhPQt4FNxxqM5VzD+dm02IvvAO7QZpGFV7gQTIFjICr3hOBi7ul9XS1/+A+NAT2VabzLmUikAB32w==","signatures":[{"sig":"MEUCIG61VUkIo9yuwdFOYJzrgXBqH6ieEkY5p1BKzkFXwqGnAiEAw+VUGJ7WhBeAMPw9QQPlW6jWhdxR1+RRuxuv3PfBE5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":565393},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"7df3bae899c5a30cf17f4925fb7057e9a61e7332","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.9_1783858080635_0.11184691674119307","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aeye/core","version":"0.4.0","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.4.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"d2b29e39a10ba29a650324b53a7a90cae02020f9","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.4.0.tgz","fileCount":43,"integrity":"sha512-IGBAi/kJHKmqwU2MZbleFKl5WnkIYDRvU6p5jiOWa1ehYAT8sp5eic9O0XQZQtS3LgKfWtyFZwoDpKrDktnGqg==","signatures":[{"sig":"MEQCIDrUKMfGWw4GaN49BQDnKuSDHkvoKqpHqLRvVCAgdBsFAiBXF1Mxd1SLkpirQ+udk8xF+dC7IEwnj4AW0b2K65XV7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":570864},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"8d39cc6d01b96cb02a06f610f245b69c7fdaf177","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.0_1784640326130_0.32793813364596747","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aeye/core","version":"0.5.0","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.5.0","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"017f2202299b862f3b31bd2f59dd4f3bc426428c","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.5.0.tgz","fileCount":43,"integrity":"sha512-QYe2O71DI+zVkBWFjmhhBIFcH6zKqephCOkNFYPd8dOU0wJWsl28fJwpaVhsn0Q/ZkeDoa8forh6U09a+qv8yQ==","signatures":[{"sig":"MEYCIQCUwKiaKv+eVH8Un0X5t91sHk7JLqzoJm5DuFi4Mbd0GgIhANmMRW1pBjStHOXaUBv89VORT69veYLo0zr8MTdCRZdr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":574251},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"4ad1dab1c6ee79a2d325b2b94c3fe1975741ea43","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.0_1787434688385_0.8922154656445","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@aeye/core","version":"0.5.1","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.5.1","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"5fd01a33f5c4cce0c08a75e1a5e28e5ec0d26c89","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.5.1.tgz","fileCount":43,"integrity":"sha512-7iM86FoT3bVUcw5Gh12baFUxHDoJLIXRPVhdwFRhfQZqe0jCfUphV/vjyVbozwc/6V0MBlSWKrUUsteZzK4MJg==","signatures":[{"sig":"MEYCIQChWChEoC71j1ugVTsKxT7xHmKSINGH9qJEVo/RPfL61gIhAPWLeXvH3cyBaW74YfrDAZtDNNGEpGP7AIf4WvBCutrQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":588178},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"40fd8e900a5946b0741a2e24d715b9fc455f8c2c","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.1_1787440712254_0.5231934913984098","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@aeye/core","version":"0.5.2","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.5.2","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"da939d42813c413063aaef19cc134f64b5ee6bdf","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.5.2.tgz","fileCount":43,"integrity":"sha512-sSAvLxGJTLyUYofCvkIB/wpcIwKsDkQpFB4YBOzjunjCoY74126Pus0ECsn0lEffkl1ZdnsN62DgoeYPnVoQ+g==","signatures":[{"sig":"MEUCIBt+zj+ByBothicJJqAQaxBCOb0Mg3nfytiMjuVjzGVxAiEAijVUPKIOR2XFeFU2X9LyhjenhWuKSLCQqEvOAISfa5Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":599701},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"60a42c4dc4babf07d69e22a1b31c4add563d15b7","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.2_1787458882209_0.5825526960111902","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@aeye/core","version":"0.5.3","keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","_id":"@aeye/core@0.5.3","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"dist":{"shasum":"0b3ce984b3051f2f551ce0a346e35ddd82d3b5a1","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.5.3.tgz","fileCount":43,"integrity":"sha512-uKLgPc55fW8hepQbLmLs68lgGiD/pwBAbpuy3bndL45UhUjMf/rPn+eOqFK9OAgVuY0ZLYtRkva9UMHxTp6VMw==","signatures":[{"sig":"MEUCIAxoRv7+UOsjy9pQPsugc6FPX3K53If+cURYAsVTCUdqAiEAwSJD2l5vREUsPsEJtJRAr2CYBvYJtygjj+gQLCCvqI8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":651353},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"browser":{"types":"./dist/browser.d.ts","import":"./dist/browser.js"},"default":"./dist/index.js","require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"4e1a5bb4297db40b22888589f7a28ad032004d7b","scripts":{"test":"jest","build":"tsc","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"repository":{"url":"git+https://github.com/ClickerMonkey/aeye.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.1.12","handlebars":"^4.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3","@types/jest":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.3_1787498063790_0.613994294505638","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@aeye/core","version":"0.5.4","description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"browser":{"import":"./dist/browser.js","types":"./dist/browser.d.ts"},"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"default":"./dist/index.js"}},"scripts":{"build":"tsc","test":"jest","test:coverage":"jest --coverage","test:watch":"jest --watch","clean":"rimraf dist tsconfig.tsbuildinfo","typecheck":"tsc --noEmit"},"keywords":["ai","typescript","core","primitives"],"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","repository":{"type":"git","url":"git+https://github.com/ClickerMonkey/aeye.git","directory":"packages/core"},"dependencies":{"handlebars":"^4.7.0","zod":"^4.1.12"},"devDependencies":{"@types/jest":"^30.0.0","jest":"^30.2.0","ts-jest":"^29.4.5","typescript":"^5.9.3"},"publishConfig":{"access":"public"},"engines":{"node":">=16.0.0"},"homepage":"https://github.com/ClickerMonkey/aeye#readme","bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"_id":"@aeye/core@0.5.4","gitHead":"b0ed5208c254099b5a59c5e168aa3f439c6fe6a4","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-2uRZ2kAHbOom/Ex886uv6llBJlalD/qDt/Io6weP4++JnV1C0MZl/UR5qYc9Q5LfuN9gNOmaa26vTwChJXaQ1Q==","shasum":"8362ccb28c19b077eab76a7f3777532044a17460","tarball":"https://registry.npmjs.org/@aeye/core/-/core-0.5.4.tgz","fileCount":43,"unpackedSize":652094,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDRGandGsoha/wB7LyImzBz/lQjwpac36wF46KviOXEDwIhAJ4l+B6yaMq0KCAWMdAw9rza3E164w+EvYqgQLHIlMms"}]},"_npmUser":{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"},"directories":{},"maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.5.4_1787505301295_0.09904182634935976"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-17T15:33:45.979Z","modified":"2026-08-23T17:15:01.675Z","0.1.0":"2025-11-17T15:33:46.255Z","0.1.1":"2025-11-20T20:40:38.364Z","0.1.2":"2025-11-20T21:46:50.295Z","0.2.0":"2025-11-27T16:18:13.327Z","0.3.0":"2025-12-06T03:57:27.840Z","0.3.1":"2025-12-10T10:47:01.162Z","0.3.2":"2025-12-21T16:57:34.719Z","0.3.4":"2026-02-10T20:21:27.915Z","0.3.5":"2026-02-10T20:57:11.111Z","0.3.6":"2026-03-04T16:15:15.386Z","0.3.7":"2026-03-04T16:41:07.364Z","0.3.8":"2026-04-04T20:50:37.589Z","0.3.9":"2026-07-12T12:08:00.772Z","0.4.0":"2026-07-21T13:25:26.328Z","0.5.0":"2026-08-22T21:38:08.531Z","0.5.1":"2026-08-22T23:18:32.418Z","0.5.2":"2026-08-23T04:21:22.365Z","0.5.3":"2026-08-23T15:14:23.985Z","0.5.4":"2026-08-23T17:15:01.518Z"},"bugs":{"url":"https://github.com/ClickerMonkey/aeye/issues"},"author":{"name":"ClickerMonkey"},"license":"GPL-3.0","homepage":"https://github.com/ClickerMonkey/aeye#readme","keywords":["ai","typescript","core","primitives"],"repository":{"type":"git","url":"git+https://github.com/ClickerMonkey/aeye.git","directory":"packages/core"},"description":"@aeye Core - Core primitives for AI components (agents, tools, prompts)","maintainers":[{"name":"philip.diffenderfer","email":"pdiffenderfer@gmail.com"}],"readme":"# @aeye/core\r\n\r\nCore primitives for building AI agents, tools, and prompts with TypeScript. Provides a type-safe, composable framework for creating sophisticated AI applications with structured inputs/outputs, tool calling, and context management.\r\n\r\n## Features\r\n\r\n- **🎯 Type-Safe Components** - Prompts, Tools, and Agents with full TypeScript support\r\n- **🔧 Tool Calling** - Native support for function/tool calling with schema validation\r\n- **📝 Template-Based Prompts** - Handlebars templates for dynamic prompt generation\r\n- **✅ Schema Validation** - Zod integration for structured inputs and outputs\r\n- **🌊 Streaming Support** - First-class streaming for real-time AI responses\r\n- **🔄 Composable Architecture** - Tools can use other tools, prompts can use tools, agents orchestrate everything\r\n- **📊 Context Management** - Type-safe context threading and automatic token window management\r\n- **🎛️ Flexible Execution** - Sequential, parallel, or immediate tool execution modes\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @aeye/core zod handlebars\r\n```\r\n\r\n> **Note:** `@aeye/core` defines the primitives — you need an executor/streamer to run prompts. These are provided by `@aeye/ai` via `ai.buildCoreContext()`, or you can supply your own `execute` / `stream` functions.\r\n\r\n## Core Concepts\r\n\r\n### Components\r\n\r\nAll AI primitives implement the `Component` interface:\r\n\r\n- **Prompt** - Generates AI responses with optional tool usage and structured outputs\r\n- **Tool** - Extends AI capabilities with custom functions and external integrations\r\n- **Agent** - Orchestrates complex workflows combining prompts and tools\r\n\r\n### Context & Metadata\r\n\r\n- **Context (`TContext`)** - Application-specific data threaded through operations (user, db, etc.)\r\n- **Metadata (`TMetadata`)** - Execution settings for AI requests (model, temperature, etc.)\r\n\r\n## Quick Start\r\n\r\n### Basic Prompt\r\n\r\n```typescript\r\nimport { Prompt } from '@aeye/core';\r\nimport z from 'zod';\r\n\r\nconst summarizer = new Prompt({\r\n  name: 'summarize',\r\n  description: 'Summarizes text concisely',\r\n  content: 'Summarize the following text:\\n\\n{{text}}',\r\n\r\n  // Transform raw input into template variables\r\n  input: (input: { text: string }) => ({ text: input.text }),\r\n\r\n  // Define output schema (structured JSON)\r\n  schema: z.object({\r\n    summary: z.string().describe('A concise summary'),\r\n    keyPoints: z.array(z.string()).describe('Main points'),\r\n  }),\r\n});\r\n\r\n// Execute — ctx must provide execute or stream (from @aeye/ai or custom)\r\nconst result = await summarizer.get(\r\n  'result',\r\n  { text: 'Long article text...' },\r\n  {\r\n    execute: yourAIExecutor,  // (request, ctx, metadata?, signal?) => Promise<Response>\r\n    messages: [],\r\n  }\r\n);\r\n\r\nconsole.log(result?.summary);\r\nconsole.log(result?.keyPoints);\r\n```\r\n\r\n### Creating Tools\r\n\r\n```typescript\r\nimport { Tool } from '@aeye/core';\r\nimport z from 'zod';\r\n\r\nconst getWeather = new Tool({\r\n  name: 'getWeather',\r\n  description: 'Get current weather for a location',\r\n  instructions: 'Use this tool to get weather data for {{location}}.',\r\n\r\n  schema: z.object({\r\n    location: z.string().describe('City name or coordinates'),\r\n    units: z.enum(['celsius', 'fahrenheit']).default('celsius'),\r\n  }),\r\n\r\n  call: async (input, _refs, _ctx) => {\r\n    const response = await fetch(\r\n      `https://api.weather.com/v1/${encodeURIComponent(input.location)}`\r\n    );\r\n    const data = await response.json();\r\n    return {\r\n      temperature: data.temp,\r\n      condition: data.condition,\r\n      humidity: data.humidity,\r\n    };\r\n  },\r\n});\r\n```\r\n\r\n### Prompts with Tools\r\n\r\n```typescript\r\nimport { Prompt } from '@aeye/core';\r\nimport z from 'zod';\r\n\r\nconst travelAdvisor = new Prompt({\r\n  name: 'travelAdvisor',\r\n  description: 'Provides travel advice based on weather',\r\n  content: `You are a travel advisor. Help plan a trip to {{destination}}.\r\n\r\nUse the getWeather tool to check current conditions, then provide:\r\n- What to pack\r\n- Recommended activities\r\n- Best times to visit`,\r\n\r\n  input: (input: { destination: string }) => ({\r\n    destination: input.destination,\r\n  }),\r\n\r\n  tools: [getWeather],\r\n\r\n  schema: z.object({\r\n    recommendations: z.array(z.string()),\r\n    packingList: z.array(z.string()),\r\n    weatherNotes: z.string(),\r\n  }),\r\n});\r\n\r\n// The AI will automatically call getWeather if needed\r\nconst advice = await travelAdvisor.get(\r\n  'result',\r\n  { destination: 'Paris' },\r\n  { execute: yourAIExecutor, messages: [] }\r\n);\r\n\r\nconsole.log(advice?.recommendations);\r\n```\r\n\r\n### Streaming Responses\r\n\r\n```typescript\r\n// Stream text content only\r\nfor await (const chunk of summarizer.get(\r\n  'streamContent',\r\n  { text: 'Long text...' },\r\n  { stream: yourAIStreamer, messages: [] }\r\n)) {\r\n  process.stdout.write(chunk);\r\n}\r\n\r\n// Stream all events (including tool calls)\r\nfor await (const event of summarizer.get(\r\n  'stream',\r\n  { text: 'Long text...' },\r\n  { stream: yourAIStreamer, messages: [] }\r\n)) {\r\n  if (event.type === 'textPartial') {\r\n    process.stdout.write(event.content);\r\n  } else if (event.type === 'toolStart') {\r\n    console.log('Tool started:', event.tool.name);\r\n  } else if (event.type === 'toolOutput') {\r\n    console.log('Tool result:', event.result);\r\n  } else if (event.type === 'complete') {\r\n    console.log('Final output:', event.output);\r\n  }\r\n}\r\n```\r\n\r\n### Building Agents\r\n\r\n```typescript\r\nimport { Agent } from '@aeye/core';\r\nimport z from 'zod';\r\n\r\n// Assume searchTool, summarizePrompt, and analyzePrompt are defined elsewhere\r\nconst researchAgent = new Agent({\r\n  name: 'researcher',\r\n  description: 'Conducts research on a topic',\r\n\r\n  refs: [searchTool, summarizePrompt, analyzePrompt] as const,\r\n\r\n  call: async (\r\n    input: { topic: string },\r\n    [search, summarize, analyze],\r\n    ctx\r\n  ) => {\r\n    // Step 1: Search for information\r\n    const searchResults = await search.run({ query: input.topic, limit: 5 }, ctx);\r\n\r\n    // Step 2: Summarize each result\r\n    const summaries: string[] = [];\r\n    for (const result of searchResults.items) {\r\n      const summary = await summarize.get('result', { text: result.content }, ctx);\r\n      summaries.push(summary?.summary ?? '');\r\n    }\r\n\r\n    // Step 3: Synthesize into a final analysis\r\n    const analysis = await analyze.get(\r\n      'result',\r\n      { topic: input.topic, sources: summaries },\r\n      ctx\r\n    );\r\n\r\n    return analysis;\r\n  },\r\n});\r\n\r\nconst research = await researchAgent.run(\r\n  { topic: 'Quantum Computing' },\r\n  { execute: yourAIExecutor, messages: [] }\r\n);\r\n```\r\n\r\n## Prompt Modes\r\n\r\nThe `get(mode, input?, ctx?)` method supports different execution modes:\r\n\r\n| Mode | Description | Returns |\r\n|------|-------------|---------|\r\n| `'result'` | Await the final structured output | `Promise<TOutput \\| undefined>` |\r\n| `'tools'` | Await all tool call results | `Promise<PromptToolOutput[] \\| undefined>` |\r\n| `'stream'` | Stream all events | `AsyncGenerator<PromptEvent<TOutput, TTools>, TOutput \\| undefined>` |\r\n| `'streamTools'` | Stream tool output events | `AsyncGenerator<PromptToolOutput<TTools>, TOutput \\| undefined>` |\r\n| `'streamContent'` | Stream text content only | `AsyncGenerator<string, TOutput \\| undefined>` |\r\n\r\n```typescript\r\n// Get structured result\r\nconst result = await prompt.get('result', input, ctx);\r\n\r\n// Get tool outputs only\r\nconst tools = await prompt.get('tools', input, ctx);\r\n\r\n// Stream everything\r\nfor await (const event of prompt.get('stream', input, ctx)) {\r\n  // event.type is one of: 'request', 'textPartial', 'text', 'toolStart',\r\n  //   'toolOutput', 'toolError', 'message', 'complete', 'usage', ...\r\n}\r\n\r\n// Stream text only\r\nfor await (const text of prompt.get('streamContent', input, ctx)) {\r\n  process.stdout.write(text);\r\n}\r\n```\r\n\r\n## Tool Execution Modes\r\n\r\nControl how tools are executed by the prompt:\r\n\r\n```typescript\r\nconst prompt = new Prompt({\r\n  name: 'multi-tool',\r\n  description: 'Uses multiple tools',\r\n  content: 'Analyze this data using the available tools.',\r\n  tools: [tool1, tool2, tool3],\r\n\r\n  // 'sequential' | 'parallel' | 'immediate' (default: 'immediate')\r\n  toolExecution: 'parallel',\r\n\r\n  // Number of times to retry a failed tool call (default: 2)\r\n  toolRetries: 2,\r\n  // Max tool-calling iterations per request (default: 3)\r\n  toolIterations: 3,\r\n  // Max total successful tool calls before stopping (no strict limit by default)\r\n  toolsMax: 5,\r\n});\r\n```\r\n\r\n- **`sequential`** - Wait for each tool to complete before starting the next\r\n- **`parallel`** - Start all pending tools at once and wait for all to complete\r\n- **`immediate`** - Start each tool as soon as its call is received (default)\r\n\r\n## Advanced Features\r\n\r\n### Context-Aware Tools\r\n\r\nTool schemas and applicability can depend on the current context:\r\n\r\n```typescript\r\ninterface MyContext {\r\n  userRole: 'admin' | 'viewer';\r\n  isAuthenticated: boolean;\r\n}\r\n\r\nconst contextTool = new Tool({\r\n  name: 'manageData',\r\n  description: 'Manage data records',\r\n  instructions: 'Use this tool to read or write data.',\r\n\r\n  // Schema varies based on the caller's role\r\n  schema: (ctx: Context<MyContext, {}>) => {\r\n    if (ctx.userRole === 'admin') {\r\n      return z.object({ action: z.enum(['read', 'write', 'delete']) });\r\n    }\r\n    return z.object({ action: z.enum(['read']) });\r\n  },\r\n\r\n  // Tool is only available to authenticated users\r\n  applicable: (ctx: Context<MyContext, {}>) => ctx.isAuthenticated,\r\n\r\n  call: async (input, _refs, ctx) => {\r\n    return { action: input.action, executedBy: ctx.userRole };\r\n  },\r\n});\r\n```\r\n\r\n### Custom Validation\r\n\r\nAdd business-logic validation beyond Zod schema checks:\r\n\r\n```typescript\r\nconst placeOrder = new Tool({\r\n  name: 'placeOrder',\r\n  description: 'Place a product order',\r\n\r\n  schema: z.object({\r\n    itemId: z.string(),\r\n    quantity: z.number().int().min(1),\r\n  }),\r\n\r\n  // Runs after schema parsing succeeds; throw to trigger re-prompting\r\n  validate: async (input, ctx) => {\r\n    const inventory = await checkInventory(input.itemId);\r\n    if (inventory < input.quantity) {\r\n      throw new Error(`Only ${inventory} units of ${input.itemId} are available.`);\r\n    }\r\n  },\r\n\r\n  call: async (input, _refs, _ctx) => {\r\n    return { orderId: crypto.randomUUID(), ...input };\r\n  },\r\n});\r\n```\r\n\r\n### Event Tracking with `withEvents`\r\n\r\n```typescript\r\nimport { withEvents } from '@aeye/core';\r\n\r\nconst runner = withEvents({\r\n  onStatus: (instance) => {\r\n    console.log(`${instance.component.name}: ${instance.status}`);\r\n    if (instance.status === 'completed' && instance.completed && instance.running) {\r\n      console.log(`  Took ${instance.completed - instance.running}ms`);\r\n    }\r\n  },\r\n\r\n  onPromptEvent: (_instance, event) => {\r\n    if (event.type === 'usage') {\r\n      console.log('Tokens used:', event.usage);\r\n    }\r\n  },\r\n});\r\n\r\nconst result = await prompt.get(\r\n  'result',\r\n  { text: 'Hello' },\r\n  { execute: yourAIExecutor, messages: [], runner }\r\n);\r\n```\r\n\r\n### Token Management\r\n\r\nThe prompt automatically trims old messages when the context window is full:\r\n\r\n```typescript\r\nconst result = await prompt.get(\r\n  'result',\r\n  { text: 'Query' },\r\n  {\r\n    execute: yourAIExecutor,\r\n    messages: conversationHistory,  // Will be trimmed if needed\r\n\r\n    // Reserve this many tokens for the model's response\r\n    maxOutputTokens: 2048,\r\n\r\n    // Custom per-message token estimator\r\n    estimateUsage: (message) => ({\r\n      text: { input: Math.ceil((message.content as string).length / 4) }\r\n    }),\r\n  }\r\n);\r\n```\r\n\r\n### Dynamic Reconfiguration\r\n\r\nUse `reconfig` to adapt the prompt based on runtime statistics:\r\n\r\n```typescript\r\nconst adaptivePrompt = new Prompt({\r\n  name: 'adaptive',\r\n  description: 'Adapts based on runtime stats',\r\n  content: 'Solve: {{problem}}',\r\n  schema: z.object({ solution: z.string() }),\r\n\r\n  reconfig: (stats, _ctx) => {\r\n    // If many tool errors occurred, switch to one-at-a-time mode\r\n    if (stats.toolCallErrors > 3) {\r\n      return { config: { toolsOneAtATime: true } };\r\n    }\r\n    return {};\r\n  },\r\n});\r\n```\r\n\r\n## Model Capabilities\r\n\r\n@aeye uses a capability system for automatic model selection. Models advertise their capabilities and the library selects the best match for each request:\r\n\r\n| Capability | Description |\r\n|------------|-------------|\r\n| `chat` | Basic text completion |\r\n| `streaming` | Real-time response streaming |\r\n| `image` | Image generation |\r\n| `vision` | Image understanding |\r\n| `audio` | Text-to-speech |\r\n| `hearing` | Speech-to-text |\r\n| `embedding` | Text embeddings |\r\n| `tools` | Function/tool calling |\r\n| `json` | JSON output mode |\r\n| `structured` | Structured outputs with schemas |\r\n| `toolsStrict` | Strict-mode tool input schemas (auto-derived; see [Strict Mode](#strict-mode)) |\r\n| `reasoning` | Extended chain-of-thought reasoning |\r\n| `zdr` | Zero data retention |\r\n\r\n## Strict Mode\r\n\r\nEach LLM provider that supports strict mode does so with its own JSON Schema dialect. `@aeye/core` reconciles them under a single `FormatDescriptor` so a Zod schema authored once works against any of them.\r\n\r\n### `strict` on Tool / Prompt\r\n\r\n`Tool.strict` and `Prompt.strict` are `boolean | number`:\r\n\r\n| Value | Meaning |\r\n|---|---|\r\n| `true` | **Require** strict. `@aeye/ai` filters selection down to models that declare strict support; the request fails if none qualify. |\r\n| `false` | **Force** lenient. Standard JSON Schema; no `strict: true` on the wire. |\r\n| `number > 0` (default `1`) | **Prefer** strict, accept fallback. Higher numbers win when there are more strict-requesting items than the chosen model's per-request budget allows. |\r\n| omitted | Treated as `1`. |\r\n\r\n```typescript\r\nnew Tool({ name: 'must',     /* default 1 */                schema: z.object({...}) }); // best-effort\r\nnew Tool({ name: 'critical', strict: true,                  schema: z.object({...}) }); // hard require\r\nnew Tool({ name: 'meh',      strict: false,                 schema: z.object({...}) }); // never strict\r\nnew Tool({ name: 'top',      strict: 100,                   schema: z.object({...}) }); // high priority\r\n```\r\n\r\nDefault `1` keeps \"it just works\" against unannotated models — strict where the chosen model supports it, lenient elsewhere. Set `true` only when strict is non-negotiable.\r\n\r\n### Native format descriptors\r\n\r\nSeven descriptors ship out of the box:\r\n\r\n| Descriptor | Family / Strict | Notes |\r\n|---|---|---|\r\n| `OPENAI_STRICT` | openai / strict | Records → array-of-pairs, tuples → numeric-key objects, `optional → T \\| null`, closed objects, restricted format whitelist. |\r\n| `ANTHROPIC_STRICT` | anthropic / strict | Closed objects, no recursion, no length / numeric range constraints, per-request slot budgets (20 strict tools / 24 optional params / 16 union types). |\r\n| `GOOGLE_STRICT` | google / strict | `prefixItems`, `$ref: '#'` recursion, `propertyOrdering` emitted, restricted format whitelist. |\r\n| `LENIENT` | lenient / non-strict | No rewrites, all features pass through. Default for unannotated models. |\r\n| `OPENAI_NON_STRICT`, `ANTHROPIC_NON_STRICT`, `GOOGLE_NON_STRICT` | family / non-strict | Aliased to `LENIENT` but tagged with the family for diagnostics. |\r\n\r\n```typescript\r\nimport { OPENAI_STRICT, ANTHROPIC_STRICT, getDescriptor, toJSONSchema } from '@aeye/core';\r\n\r\nconst schema = z.object({\r\n  name: z.string(),\r\n  tags: z.record(z.string(), z.string()),\r\n});\r\n\r\n// Same Zod, different wire shapes:\r\ntoJSONSchema(schema, OPENAI_STRICT);                    // tags → array of {key, value}\r\ntoJSONSchema(schema, ANTHROPIC_STRICT);                 // tags → array of {key, value} (open records unsupported)\r\ntoJSONSchema(schema, getDescriptor('google', true));    // tags → standard additionalProperties\r\n\r\n// Backward-compat overloads still work:\r\ntoJSONSchema(schema, true);   // === OPENAI_STRICT\r\ntoJSONSchema(schema, false);  // === LENIENT\r\n```\r\n\r\n### Registering a custom descriptor\r\n\r\nYou can ship your own descriptor for a provider or dialect that isn't supported natively. Define it as a `FormatDescriptor` value and register it with `registerDescriptor(descriptor)`:\r\n\r\n```typescript\r\nimport { registerDescriptor, type FormatDescriptor, OPENAI_STRICT } from '@aeye/core';\r\n\r\nconst MY_PROVIDER_STRICT: FormatDescriptor = {\r\n  ...OPENAI_STRICT,                   // start from a known good baseline\r\n  id: 'my-provider-strict',\r\n  family: 'openai',                   // or 'anthropic' | 'google' | 'lenient'\r\n  // Override only the fields that differ from the baseline:\r\n  recordEncoding: 'open-record',      // your provider supports additionalProperties: <schema>\r\n  tupleEncoding: 'prefix-items',\r\n  supportsRecursion: true,\r\n};\r\n\r\nregisterDescriptor(MY_PROVIDER_STRICT);\r\n```\r\n\r\nOnce registered:\r\n\r\n- Provider code can pass the descriptor to `toJSONSchema(schema, MY_PROVIDER_STRICT)` and `strictify(schema, MY_PROVIDER_STRICT)`.\r\n- The Prompt's validation roundtrip (which looks up descriptors by id from the request) will resolve `'my-provider-strict'` correctly.\r\n- A custom `Provider` implementation can return this descriptor from its `getStrictFormat`-equivalent helper.\r\n\r\nThe descriptor's full field list is exported as the `FormatDescriptor` interface — every flag is documented inline. Common adjustments:\r\n\r\n| Field | Controls |\r\n|---|---|\r\n| `objectAllFieldsRequired` | Whether every property must appear in `required[]`. |\r\n| `objectClosedByDefault` | Whether every object emits `additionalProperties: false`. |\r\n| `recordEncoding` | `'array-of-pairs'` vs `'open-record'`. |\r\n| `tupleEncoding` | `'object-numeric-keys'` vs `'prefix-items'` vs `'items-union'`. |\r\n| `allowAllOf` / `allowAnyOf` / `allowOneOf` | JSON-Schema combinator support. |\r\n| `supportedStringFormats` | `'all'` or a `Set<string>` whitelist (`'date-time'`, `'email'`, etc.). |\r\n| `optionalAsNullable` | Whether `optional` fields are emitted as `T \\| null` (OpenAI strict) vs omitted from `required[]`. |\r\n| `supportsRecursion` | Whether `$ref` self-reference works under this dialect. |\r\n| `maxStrictTools` / `maxStrictOptionalParams` / `maxStrictUnionTypes` | Per-request budget caps; `undefined` means no documented limit. |\r\n| `schemaSizeLimits` | Per-SCHEMA size ceilings (properties, nesting, total string characters, enum values); `undefined` means no documented limit. An over-size schema degrades on its own, even when it asked for `strict: true`. |\r\n\r\nYou don't need to set every field — spread an existing descriptor and override deltas. Tested via `analyzeSchema` + the schema test suite; see the strict-mode guide in `@aeye/docs` for end-to-end examples.\r\n\r\n## API Reference\r\n\r\n### Prompt\r\n\r\n```typescript\r\nclass Prompt<TContext, TMetadata, TName extends string, TInput extends object, TOutput extends object | string, TTools extends Tuple<ToolCompatible<TContext, TMetadata>>, TDecoded extends unknown = TOutput>\r\n```\r\n\r\n`TDecoded` is the type a custom `parse` produces from the model's structured output (e.g. a built AST/class instance); it types `validate` and the decoded output. It defaults to `TOutput` (the wire type) when no custom `parse` is supplied — `schema` always stays the wire type.\r\n\r\n**Constructor Options (`PromptInput`):**\r\n- `name: string` - Unique identifier\r\n- `description: string` - Purpose description\r\n- `content: string` - Handlebars template for the system/user message\r\n- `input?: (input: TInput, ctx: Context<TContext, TMetadata>) => Record<string, any>` - Maps raw input to template variables\r\n- `schema?: ZodType<TOutput> | ((input: TInput | undefined, ctx: Context<TContext, TMetadata>) => ZodType<TOutput> | false)` - Output schema; `false` disables structured output\r\n- `strict?: boolean` - Enforce strict Zod schema (default: `true`)\r\n- `config?: Partial<Request> | ((input: TInput | undefined, ctx: Context<TContext, TMetadata>) => Partial<Request> | false)` - AI request overrides\r\n- `tools?: TTools` - Tools the prompt may call\r\n- `toolExecution?: 'sequential' | 'parallel' | 'immediate'` - Tool execution mode\r\n- `toolRetries?: number` - Retry count for failed tools (default: 2)\r\n- `toolIterations?: number` - Max tool-calling iterations (default: 3)\r\n- `toolsMax?: number` - Max successful tool calls\r\n- `outputRetries?: number` - Retry count for invalid structured outputs\r\n- `metadata?: TMetadata` - Static metadata for this prompt\r\n- `validate?: (output: TOutput, ctx: Context<TContext, TMetadata>) => void | Promise<void>` - Post-parse validation\r\n- `applicable?: (ctx: Context<TContext, TMetadata>) => boolean | Promise<boolean>` - Availability check\r\n\r\n**Methods:**\r\n- `get(mode: PromptGetType, input?: TInput, ctx?: Context<TContext, TMetadata>): PromptGet<...>` - Execute and return output in the specified mode\r\n- `run(input?: TInput, ctx?: Context<TContext, TMetadata>): AsyncGenerator<PromptEvent<TOutput, TTools>, TOutput | undefined>` - Full streaming generator\r\n- `applicable(ctx?: Context<TContext, TMetadata>): Promise<boolean>` - Check if prompt is usable\r\n\r\n### Tool\r\n\r\n```typescript\r\nclass Tool<TContext, TMetadata, TName extends string, TParams extends object, TOutput, TRefs extends Tuple<ComponentCompatible<TContext, TMetadata>>, TDecoded extends unknown = TParams>\r\n```\r\n\r\n`TDecoded` is the type a custom `parse` produces from the raw wire args (e.g. a built class instance); it types `call`, `validate`, and `metadataFn`. It defaults to `TParams` (the wire type) when no custom `parse` is supplied — `schema` always stays the wire type.\r\n\r\n**Constructor Options (`ToolInput`):**\r\n- `name: string` - Unique identifier (shown to the AI model)\r\n- `description: string` - What the tool does (shown to the AI model)\r\n- `instructions?: string` - Handlebars template for usage instructions\r\n- `schema: ZodType<TParams> | ((ctx: Context<TContext, TMetadata>) => ZodType<TParams> | undefined)` - Input parameter schema\r\n- `strict?: boolean` - Enforce strict Zod schema (default: `true`)\r\n- `refs?: TRefs` - Referenced components\r\n- `call: (input: TParams, refs: TRefs, ctx: Context<TContext, TMetadata>) => TOutput` - Implementation\r\n- `validate?: (input: TParams, ctx: Context<TContext, TMetadata>) => void | Promise<void>` - Post-parse validation\r\n- `applicable?: (ctx: Context<TContext, TMetadata>) => boolean | Promise<boolean>` - Availability check\r\n\r\n**Methods:**\r\n- `run(input?: TParams, ctx?: Context<TContext, TMetadata>): TOutput` - Execute the tool directly\r\n- `compile(ctx: Context<TContext, TMetadata>): Promise<readonly [string, ToolDefinition] | undefined>` - Generate AI tool definition\r\n- `applicable(ctx?: Context<TContext, TMetadata>): Promise<boolean>` - Check if tool is usable\r\n\r\n### Agent\r\n\r\n```typescript\r\nclass Agent<TContext, TMetadata, TName extends string, TInput extends object, TOutput, TRefs extends Tuple<ComponentCompatible<TContext, TMetadata>>>\r\n```\r\n\r\n**Constructor Options (`AgentInput`):**\r\n- `name: string` - Unique identifier\r\n- `description: string` - Purpose description\r\n- `refs: TRefs` - Components this agent uses\r\n- `call: (input: TInput, refs: TRefs, ctx: Context<TContext, TMetadata>) => TOutput` - Implementation\r\n- `applicable?: (ctx: Context<TContext, TMetadata>) => boolean | Promise<boolean>` - Availability check\r\n\r\n**Methods:**\r\n- `run(input?: TInput, ctx?: Context<TContext, TMetadata>): TOutput` - Execute the agent\r\n- `applicable(ctx?: Context<TContext, TMetadata>): Promise<boolean>` - Check if agent is usable\r\n\r\n## Context Structure\r\n\r\nThe `Context<TContext, TMetadata>` type combines your custom context with the core execution context:\r\n\r\n```typescript\r\n// Core fields available in every context\r\ninterface CoreContextFields {\r\n  // AI executor for non-streaming requests\r\n  execute?: (request: Request, ctx: TContext, metadata?: TMetadata, signal?: AbortSignal) => Promise<Response>;\r\n  // AI streamer for streaming requests\r\n  stream?: (request: Request, ctx: TContext, metadata?: TMetadata, signal?: AbortSignal) => AsyncGenerator<Chunk, Response>;\r\n\r\n  // Conversation history passed to the model\r\n  messages?: Message[];\r\n\r\n  // Reserve N tokens for the model's output (used for context trimming)\r\n  maxOutputTokens?: number;\r\n  // Override context window size (used for context trimming)\r\n  contextWindow?: number;\r\n\r\n  // Custom per-message usage estimator\r\n  estimateUsage?: (message: Message) => Usage | undefined;\r\n\r\n  // Number of output-format retries (default: 2)\r\n  outputRetries?: number;\r\n  // Number of context-trimming retries (default: 1)\r\n  forgetRetries?: number;\r\n\r\n  // Abort signal for cancellation\r\n  signal?: AbortSignal;\r\n  // Event runner for tracking component lifecycle\r\n  runner?: Events;\r\n}\r\n```\r\n\r\n## Request Configuration\r\n\r\n```typescript\r\ninterface Request {\r\n  messages: Message[];\r\n  temperature?: number;       // 0.0–2.0\r\n  topP?: number;              // 0.0–1.0\r\n  maxTokens?: number;\r\n  stop?: string | string[];\r\n  tools?: ToolDefinition[];\r\n  toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\r\n  responseFormat?: 'text' | 'json' | { type: 'json_schema'; schema: object; name: string; strict?: boolean };\r\n  reason?: { effort?: 'low' | 'medium' | 'high'; maxTokens?: number };\r\n  frequencyPenalty?: number;\r\n  presencePenalty?: number;\r\n  seed?: number;\r\n  // ... more options\r\n}\r\n```\r\n\r\n## Best Practices\r\n\r\n1. **Type Safety** - Use TypeScript generics for context and metadata\r\n2. **Schema Validation** - Use Zod for robust input/output validation\r\n3. **Token Management** - Supply `estimateUsage` for accurate context trimming\r\n4. **Tool Organization** - Group related tools and use agents to orchestrate them\r\n5. **Testing** - Unit test tools and prompts independently\r\n6. **Context Minimization** - Pass only necessary data in context\r\n7. **Streaming** - Use streaming for better UX with long responses\r\n8. **Validation** - Use `validate` hooks for business-logic checks after schema parsing\r\n\r\n## Examples\r\n\r\nSee the `src/__tests__` directory for comprehensive examples:\r\n\r\n- **prompt-core-features.test.ts** - Basic prompt usage\r\n- **prompt-streaming-tool-events.test.ts** - Streaming and events\r\n- **tool.test.ts** - Tool creation and usage\r\n- **agent.test.ts** - Agent orchestration\r\n- **context-propagation.test.ts** - Context handling\r\n\r\n## TypeScript Support\r\n\r\nFull type inference across component hierarchies:\r\n\r\n```typescript\r\nimport { Prompt, Tool } from '@aeye/core';\r\nimport z from 'zod';\r\n\r\n// Output type is inferred from the schema\r\nconst prompt = new Prompt({\r\n  name: 'example',\r\n  description: 'Example prompt',\r\n  content: 'Say hello to {{name}}.',\r\n  input: (input: { name: string }) => ({ name: input.name }),\r\n  schema: z.object({ greeting: z.string() }),\r\n});\r\n\r\n// result is typed as { greeting: string } | undefined\r\nconst result = await prompt.get('result', { name: 'World' }, ctx);\r\nconsole.log(result?.greeting);\r\n\r\n// Tool call parameters are type-safe\r\nconst mathTool = new Tool({\r\n  name: 'add',\r\n  description: 'Adds two numbers',\r\n  schema: z.object({ a: z.number(), b: z.number() }),\r\n  call: (input, _refs, _ctx) => {\r\n    // input is typed as { a: number; b: number }\r\n    return input.a + input.b;\r\n  },\r\n});\r\n```\r\n\r\n## Contributing\r\n\r\nContributions are welcome! See the main [@aeye repository](https://github.com/ClickerMonkey/aeye) for contribution guidelines.\r\n\r\n## License\r\n\r\nGPL-3.0 © [ClickerMonkey](https://github.com/ClickerMonkey)\r\n\r\n## Links\r\n\r\n- [Root README](../../README.md)\r\n- [@aeye/ai README](../ai/README.md)\r\n- [GitHub Repository](https://github.com/ClickerMonkey/aeye)\r\n- [Issue Tracker](https://github.com/ClickerMonkey/aeye/issues)\r\n","readmeFilename":"README.md"}