{"_id":"@carloscortezcloud/tinkuy-agent","_rev":"11-a03cc0ee05bb5deb0e49c278b87dddfb","name":"@carloscortezcloud/tinkuy-agent","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.1.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.1.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"c873afbe88b03e3bee2f9c2bb3eae2b1fa49440f","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.1.0.tgz","fileCount":22,"integrity":"sha512-sTCpZQG2j3Y7wXhDr3qmF6ifKEvm/EwXYLPXFQ5lM+yfgFzT0+8Q3l9qQeu3S0OF3m4JafZjMo6pGg/ynn6g9A==","signatures":[{"sig":"MEUCIDAhAY7nMIDqjNawDaS9gAQhlf24uQuedeLzGgi07AbsAiEA//2Phlw7Y6HXBTtmQ4+x8gIU9lGjPYL6A6aEklZGuyU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36209},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"}},"gitHead":"e534b488ac232a322ca85c543d2122cd8a87e308","scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"sayay":"github:breakingthecloud/sayay","styrr":"github:breakingthecloud/styrr","vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"sayay":">=0.1.0","styrr":">=0.1.0"},"peerDependenciesMeta":{"sayay":{"optional":true},"styrr":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.1.0_1784763133725_0.526578315195507","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.1.1","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.1.1","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"0cb9dcdb96d144f89a9dc89d3a9135e5efc65e7c","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.1.1.tgz","fileCount":22,"integrity":"sha512-ggGRUXJElww0/N4RaQJJMJ9zcJndiwv1pam+3E0k7r4MGTVpCkNlhBXQBYf+AT0vdX9WLOp3wsEjtPO54DPy5Q==","signatures":[{"sig":"MEUCIDDHklzLgn6QfggEbqpGzFvQT+kpZz9ppaDHf/defNk/AiEAgjHSK5YMo1qCLru4c/W6ei6jn2/DuiMIcxsY98GAyes=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36229},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"}},"gitHead":"e534b488ac232a322ca85c543d2122cd8a87e308","scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"sayay":"github:breakingthecloud/sayay","styrr":"github:breakingthecloud/styrr","vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"sayay":">=0.1.0","styrr":">=0.1.0"},"peerDependenciesMeta":{"sayay":{"optional":true},"styrr":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.1.1_1784763383127_0.12776697157508954","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.2.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.2.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"8b88bf032a86441f16c8b5f8d3488c22537aef0e","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.2.0.tgz","fileCount":26,"integrity":"sha512-bRulT3KEf0bfb/JgaULA4CTYGinZKMXcxR7LMLM492+r6L6kmWnlmtD/P5y4/xAybQzkPS/eb8KanC5riwMHmg==","signatures":[{"sig":"MEYCIQCwAbW1GLHPE1Qkd/C7eMXMKSln8rsv454kqriNtiWbVwIhAMHpD9Bq7hvngL9U73ijTT71H12C862YceX5E/86QUqp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48830},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"}},"gitHead":"5c830f8b84d2b703fb75f37f8131733966fe279c","scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"sayay":"github:breakingthecloud/sayay","styrr":"github:breakingthecloud/styrr","vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"sayay":">=0.1.0","styrr":">=0.1.0"},"peerDependenciesMeta":{"sayay":{"optional":true},"styrr":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.2.0_1784931109272_0.15914675218460705","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.3.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.3.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"ea8a50afaf20d98591a856dc5bef5c3d664031bc","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.3.0.tgz","fileCount":30,"integrity":"sha512-Rkr3tXJ3lG7O7bAYh808beNBKYQwoWA6JCA398MmDHw+V4iYeoMcjBZDyGQ+U1cgc4YHhI6AKrWgfY3+l0WwDg==","signatures":[{"sig":"MEUCIQD6i/sy6GTPpLcanWqifjRiVNUKolo4ZABIbIkvBd9OzgIgZgDqeOPXf93ZQ9/ptMAK4sBH2+vSMWhqKIzN3KXxWQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58398},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"gitHead":"fa99db689ae73e3081f99b0dc32ca7417898533f","scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"sayay":"github:breakingthecloud/sayay","styrr":"github:breakingthecloud/styrr","vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"sayay":">=0.1.0","styrr":">=0.1.0"},"peerDependenciesMeta":{"sayay":{"optional":true},"styrr":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.3.0_1784932117632_0.6236952229124584","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.4.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.4.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"7978536f22ed928f6be800a9ca0591dd9c631652","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.4.0.tgz","fileCount":38,"integrity":"sha512-QSyfObfEgIlxOu79tB84lJwmzSQULwGkgeKJP9F8HE2RPyuOKOuF05CQt9QkwkqDVYKMF4uL5xfwX3SmTsWE/w==","signatures":[{"sig":"MEQCIHM1WKSyDjbZExF+ifW+x08Nl9wGb12zk1acw2OUo+K1AiBr74c/t6ES5Z+X2r7E3H5ugr1HEBmLZepywnwZfXD0Hw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97653},"main":"dist/index.js","type":"module","_from":"file:carloscortezcloud-tinkuy-agent-0.4.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"_resolved":"/private/var/folders/jx/prn_hb0s40j1w4pdtx5nhlh40000gn/T/0bc828f88da50b72eb73fe80ab739435/carloscortezcloud-tinkuy-agent-0.4.0.tgz","_integrity":"sha512-QSyfObfEgIlxOu79tB84lJwmzSQULwGkgeKJP9F8HE2RPyuOKOuF05CQt9QkwkqDVYKMF4uL5xfwX3SmTsWE/w==","repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"sayay":"github:breakingthecloud/sayay","styrr":"github:breakingthecloud/styrr","vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"sayay":">=0.1.0","styrr":">=0.1.0"},"peerDependenciesMeta":{"sayay":{"optional":true},"styrr":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.4.0_1785292044391_0.7787090082922588","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.4.1","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":{"name":"Carlos Cortez","email":"carlos@finoptix.dev"},"license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.4.1","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"homepage":"https://github.com/breakingthecloud/tinkuy#readme","bugs":{"url":"https://github.com/breakingthecloud/tinkuy/issues"},"dist":{"shasum":"6fd461429fe185ca81c1044bc44210a01d19d2e7","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.4.1.tgz","fileCount":38,"integrity":"sha512-PpXDG20J8k7Z5xSgzTwxRPFykKNGSm0SbYsV6rJETzR7bB590ApMzEmQV1Cw7sjm6On+JZRhYSryfBeMMWeVzw==","signatures":[{"sig":"MEUCIQCjsX75i0tEHC+TCrNDBhST4WF9/jo+AjrvKIEAQzAx4QIgIGsAdp3rWqZsZqR+RBXcqkI2ypVZmemHleISc+e31l4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102084},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"gitHead":"d54aafd3e03fee0aade14cd64ab1381f9be0513c","scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"git+https://github.com/breakingthecloud/tinkuy.git","type":"git"},"_npmVersion":"10.9.8","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@carloscortezcloud/styrr-llm":"^0.4.0","@carloscortezcloud/sayay-guard":"^0.1.1"},"peerDependencies":{"@carloscortezcloud/styrr-llm":">=0.1.0","@carloscortezcloud/sayay-guard":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.4.1_1785367698883_0.5742654121606563","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.5.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.5.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"dist":{"shasum":"9359d73af7b565b85f8a502b68604c05b9c0e21d","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.5.0.tgz","fileCount":58,"integrity":"sha512-3mKcqvZDowvrO876+5RE59Xn6/cVy8y7kn28LV7uQE+InWJPUupb9X2XNT1gkOs65tEcFY5pBR6UmwdvXiVM/Q==","signatures":[{"sig":"MEYCIQDwpAL8FbVVOkXo5232GzZHDmwCjKvKRwNWHZRwHKbzQgIhAJAVu06A6Xj5Y6D0hD5gPLFmxeaWkz8ygfOaBWivpJMq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140311},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./ontology":{"types":"./dist/ontology/index.d.ts","import":"./dist/ontology/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"https://github.com/breakingthecloud/tinkuy","type":"git"},"description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^26.1.2","@carloscortezcloud/styrr-llm":"^0.4.0","@carloscortezcloud/sayay-guard":"^0.1.1"},"peerDependencies":{"@carloscortezcloud/styrr-llm":">=0.1.0","@carloscortezcloud/sayay-guard":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.5.0_1785700166763_0.1677324479299176","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.6.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.6.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"dist":{"shasum":"064db91e535c2c00fbd41126c619656957d9f874","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.6.0.tgz","fileCount":58,"integrity":"sha512-WH33NsGwGW068z4oUzlH0jPY/Soev/t8pU2p9EkH4sNwqCOCoqNmN9qTQS3eGVGKjJdOihyxHg77QPm91FfUOA==","signatures":[{"sig":"MEUCIB1vTR8RdnkNuazvMnE/IHOMcaumdl7a5QsRDkyBlm4tAiEAneHOuyGUpvGmEQYjbBWTML+y9vkY+NzegPcVG/KZtgs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163225},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./ontology":{"types":"./dist/ontology/index.d.ts","import":"./dist/ontology/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"https://github.com/breakingthecloud/tinkuy","type":"git"},"description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^26.1.2","@carloscortezcloud/styrr-llm":"^0.4.0","@carloscortezcloud/sayay-guard":"^0.1.1"},"peerDependencies":{"@carloscortezcloud/styrr-llm":">=0.1.0","@carloscortezcloud/sayay-guard":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.6.0_1785704960509_0.24724566867976883","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.7.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.7.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"dist":{"shasum":"452d391a6df45168a1b603517d79684348185644","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.7.0.tgz","fileCount":62,"integrity":"sha512-vJ1I6V2N3BOf6+OzEcouIJbC1oVoGG2d/jgZq17/Oo9LbND/vvz1fWmEtSUgKq/YOmUGdABKrwSwF2GuR9pZSg==","signatures":[{"sig":"MEUCIQClRrxHJvImsKBFK8/D3YLxBHfekWu0uxuOBTmjUKxoHgIgM5ySSaqUWtgcGpdwNSWm4AfxKdAsKscc9Gq3QYdvHsY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173533},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./ontology":{"types":"./dist/ontology/index.d.ts","import":"./dist/ontology/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"https://github.com/breakingthecloud/tinkuy","type":"git"},"description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^26.1.2","@carloscortezcloud/styrr-llm":"^0.4.0","@carloscortezcloud/sayay-guard":"^0.1.1"},"peerDependencies":{"@carloscortezcloud/styrr-llm":">=0.1.0","@carloscortezcloud/sayay-guard":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.7.0_1786197930462_0.8640865471877572","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.8.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","_id":"@carloscortezcloud/tinkuy-agent@0.8.0","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"dist":{"shasum":"baa32947dd634e858a6c89c8a0efedf8d4f84737","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.8.0.tgz","fileCount":62,"integrity":"sha512-JVkV6jazta0dMKKf6zPdQTlP9orviP8oiD44NtqCiX1IYUYHZ1P6z8hQOSoZlq6aGpYw1wYzgScgrMjTJMDmYw==","signatures":[{"sig":"MEQCIC/7GYdTTUZR27VfaA1PcpHSJpbjBIE9BOSH4xqLbmTJAiABlDhL0Gaoj1eOgg82XdaluGIuO1okbGAlZkMhTn2upA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178608},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./ontology":{"types":"./dist/ontology/index.d.ts","import":"./dist/ontology/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"}},"scripts":{"lint":"tsc --noEmit","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"repository":{"url":"https://github.com/breakingthecloud/tinkuy","type":"git"},"description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^26.1.2","@carloscortezcloud/styrr-llm":"^0.4.0","@carloscortezcloud/sayay-guard":"^0.1.1"},"peerDependencies":{"@carloscortezcloud/styrr-llm":">=0.1.0","@carloscortezcloud/sayay-guard":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/tinkuy-agent_0.8.0_1786755490185_0.13936743560497522","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@carloscortezcloud/tinkuy-agent","version":"0.9.0","description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./agent":{"types":"./dist/core/agent.d.ts","import":"./dist/core/agent.js"},"./tools":{"types":"./dist/tools/index.d.ts","import":"./dist/tools/index.js"},"./state":{"types":"./dist/state/index.d.ts","import":"./dist/state/index.js"},"./registry":{"types":"./dist/registry/index.d.ts","import":"./dist/registry/index.js"},"./conversation":{"types":"./dist/conversation/index.d.ts","import":"./dist/conversation/index.js"},"./ontology":{"types":"./dist/ontology/index.d.ts","import":"./dist/ontology/index.js"}},"keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","repository":{"type":"git","url":"https://github.com/breakingthecloud/tinkuy"},"peerDependencies":{"@carloscortezcloud/sayay-guard":">=0.1.0","@carloscortezcloud/styrr-llm":">=0.1.0"},"peerDependenciesMeta":{"@carloscortezcloud/styrr-llm":{"optional":true},"@carloscortezcloud/sayay-guard":{"optional":true}},"devDependencies":{"@carloscortezcloud/sayay-guard":"^0.1.1","@carloscortezcloud/styrr-llm":"^0.4.0","@types/node":"^26.1.2","typescript":"^5.5.0","vitest":"^2.0.0"},"type":"module","dependencies":{"yaml":"^2.9.0"},"scripts":{"build":"tsc","test":"vitest run","test:watch":"vitest","lint":"tsc --noEmit"},"_nodeVersion":"22.23.2","_id":"@carloscortezcloud/tinkuy-agent@0.9.0","dist":{"integrity":"sha512-YmCIpH3vh9eFOUjtHmjVKSslHIAu2jYbmAxwpijr4SGuFUMGGsiBeEbIvpAfRu55nyzEIC2hDcbldpRc4uEBMw==","shasum":"822cff693763850bc244dad10c8b58dda1a1116e","tarball":"https://registry.npmjs.org/@carloscortezcloud/tinkuy-agent/-/tinkuy-agent-0.9.0.tgz","fileCount":66,"unpackedSize":203582,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD6vGyOC94CeJ+zZgLoeUKWGNNy6v5AzoMX2vsBMbkg6AIhAKl1WWV+DgH3bOeZjSoytpGhDLDxFunEJ+tovjzncH6p"}]},"_npmUser":{"name":"carloscortezcloud","email":"carlos@cortez.cloud"},"directories":{},"maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tinkuy-agent_0.9.0_1789347103145_0.7630169721330686"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-22T23:32:13.596Z","modified":"2026-09-14T00:51:43.422Z","0.1.0":"2026-07-22T23:32:13.858Z","0.1.1":"2026-07-22T23:36:23.271Z","0.2.0":"2026-07-24T22:11:49.433Z","0.3.0":"2026-07-24T22:28:37.777Z","0.4.0":"2026-07-29T02:27:24.538Z","0.4.1":"2026-07-29T23:28:19.050Z","0.5.0":"2026-08-02T19:49:26.896Z","0.6.0":"2026-08-02T21:09:20.644Z","0.7.0":"2026-08-08T14:05:30.635Z","0.8.0":"2026-08-15T00:58:10.334Z","0.9.0":"2026-09-14T00:51:43.289Z"},"author":"Carlos Cortez <carlos@finoptix.dev>","license":"Apache-2.0","keywords":["ai","agent","framework","llm","tool-use","multi-model","minimal","agentic","function-calling"],"repository":{"type":"git","url":"https://github.com/breakingthecloud/tinkuy"},"description":"Minimal provider-agnostic AI agent framework. Tool loops, budget control, multi-model routing — in 200 lines.","maintainers":[{"name":"carloscortezcloud","email":"carlos@cortez.cloud"}],"readme":"<p align=\"center\">\n  <img alt=\"Tinkuy\" src=\"https://img.shields.io/badge/🌊-Tinkuy-3B82F6?style=for-the-badge\" height=\"50\">\n</p>\n\n<p align=\"center\">\n  <b>Minimal Provider-Agnostic AI Agent Framework</b><br>\n  Tool loops, budget control, multi-model routing — in ~200 lines of core logic.\n</p>\n\n<p align=\"center\">\n  <a href=\"#quick-start\">Quick Start</a>\n  ·\n  <a href=\"#features\">Features</a>\n  ·\n  <a href=\"#streaming\">Streaming</a>\n  ·\n  <a href=\"#deterministic-ontology-validation\">Ontology</a>\n  ·\n  <a href=\"#ecosystem\">Ecosystem</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/npm/v/@carloscortezcloud/tinkuy-agent?style=flat-square&logo=npm&color=3B82F6\" alt=\"npm\">\n  <img src=\"https://img.shields.io/badge/license-Apache_2.0-3B82F6?style=flat-square\" alt=\"License\">\n  <img src=\"https://img.shields.io/badge/TypeScript-5.5%2B-3178C6?style=flat-square&logo=typescript\" alt=\"TypeScript\">\n  <img src=\"https://img.shields.io/badge/dependencies-1-yellow?style=flat-square\" alt=\"Deps\">\n  <img src=\"https://img.shields.io/badge/size-%3E5KB-3B82F6?style=flat-square\" alt=\"Size\">\n  <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square\" alt=\"PRs\">\n</p>\n\n---\n\n## What Is Tinkuy?\n\nTinkuy (Quechua: \"where rivers meet\") is where your tools, models, and budgets converge into one agent loop. Call LLM → parse tool_calls → execute → feed back → repeat. No vendor lock-in, no heavy dependencies, no framework opinions.\n\n```typescript\nimport { Agent, defineTool } from '@carloscortezcloud/tinkuy-agent';\nimport { StyrRouter } from '@carloscortezcloud/styrr-llm';\nimport { SayayGuard, MemoryStorage } from '@carloscortezcloud/sayay-guard';\n\nconst getWeather = defineTool({\n  name: 'get_weather',\n  description: 'Get current weather for a city',\n  parameters: { type: 'object', properties: { city: { type: 'string' } }, required: ['city'] },\n  execute: async ({ city }) => ({ temp: 22, condition: 'sunny', city }),\n});\n\nconst agent = new Agent({\n  router: new StyrRouter({\n    apiKey: process.env.OPENROUTER_API_KEY!,\n    models: [{ id: 'meta-llama/llama-3.3-70b-instruct:free' }],\n  }),\n  guard: new SayayGuard({\n    storage: new MemoryStorage(),\n    budget: { dailyUsd: 5.0 },\n  }),\n  tools: [getWeather],\n  systemPrompt: 'You are a helpful assistant. Use tools when needed.',\n});\n\nconst result = await agent.run('What is the weather in Lima?');\nconsole.log(result.text);           // \"The weather in Lima is 22°C and sunny.\"\nconsole.log(result.iterations);     // 2\nconsole.log(result.totalLatencyMs); // ~3500\n```\n\n## Install\n\n```bash\nnpm install @carloscortezcloud/tinkuy-agent\n```\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install @carloscortezcloud/tinkuy-agent @carloscortezcloud/styrr-llm @carloscortezcloud/sayay-guard\n```\n\n### 2. Run your first agent\n\n```typescript\nimport { Agent, defineTool } from '@carloscortezcloud/tinkuy-agent';\n\nconst agent = new Agent({\n  router: { call: async () => ({ text: 'Hello!', modelUsed: 'mock', latencyMs: 0 }) },\n  tools: [],\n  systemPrompt: 'You are a helpful assistant.',\n});\n\nconst result = await agent.run('Say hello');\nconsole.log(result.text);\n```\n\n## How It Works\n\n```\nUser: \"What's the weather?\"\n  │\n  ▼ iteration 1\nAgent → LLM: \"Here are my tools: [get_weather]. User asks about weather.\"\nLLM → Agent: tool_call { name: \"get_weather\", args: { city: \"Lima\" } }\nAgent → Tool: execute get_weather({ city: \"Lima\" })\nTool → Agent: { temp: 22, condition: \"sunny\" }\n  │\n  ▼ iteration 2\nAgent → LLM: \"Tool returned: {temp: 22, sunny}. Answer the user.\"\nLLM → Agent: \"The weather in Lima is 22°C and sunny.\"\n  │\n  ▼ done\nAgent → User: { text, iterations, toolsUsed, totalLatencyMs }\n```\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| **Tool loop** | Call LLM → parse tool_calls → execute → feed back → repeat |\n| **Budget guard** | Sayay integration — block/degrade/warn before each call |\n| **Multi-model** | Styrr integration — fallback chain, cheapest, fastest |\n| **Streaming** | `Agent.stream()` yields AG-UI events (`text_delta`, `tool_call_result`, `done`, `blocked`) |\n| **SSE helper** | `agentToSSE()` converts stream to Cloudflare Worker `Response` |\n| **Observable** | `onIteration` + `onToolCall` + `onComplete` + `onFeedback` hooks |\n| **Deterministic grounding** | `ontology` module — validate output vs strict graph, zero-token cost (TokenOps) |\n| **Conversation state** | `MemoryConversationStore` / `KVConversationStore` with sliding windows |\n| **Max iterations** | Infinite loop protection (default 10) |\n| **Error resilient** | Tool errors fed back to LLM — it recovers |\n| **Zero deps (core)** | Core agent loop is dependency-free; only `yaml` for the optional ontology module |\n| **Tiny** | ~200 lines core logic, ~5KB bundled |\n\n## Streaming\n\n```typescript\nimport { Agent, agentToSSE } from '@carloscortezcloud/tinkuy-agent';\n\nconst stream = agent.stream(message, { sessionId });\n\n// In a Cloudflare Worker:\nreturn new Response(agentToSSE(stream), {\n  headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache' },\n});\n```\n\nStream events follow the AG-UI format:\n```\n{ type: 'iteration_start', iteration: 1, modelUsed: '...' }\n{ type: 'text_delta', text: 'The weather' }\n{ type: 'tool_call_result', tool: 'get_weather', toolResult: {...} }\n{ type: 'done', iterations: 2, toolsUsed: ['get_weather'], totalLatencyMs: 3500 }\n```\n\n## Observability\n\n```typescript\nconst agent = new Agent({\n  router,\n  tools,\n  onIteration: (event) => console.log('iteration', event.iteration),\n  onToolCall: (event) => console.log('tool', event.tool, event.durationMs),\n  onComplete: (event) => {\n    console.log('run done', event.result);\n    // Push to Qhaway for cost/latency observability\n  },\n});\n```\n\n## Feedback (Thumbs Up / Down)\n\nLet users rate a response and correlate satisfaction with cost and latency (Qhaway-010). The UI calls `agent.feedback()`; the emitted AG-UI `feedback` event is SSE-compatible, and the `onFeedback` hook receives a `FeedbackEvent` whose `session_id` + `rating` are the keys to write onto the `QhawaySpan`.\n\n```typescript\nimport { Agent } from '@carloscortezcloud/tinkuy-agent';\n\nconst agent = new Agent({\n  router,\n  tools,\n  onFeedback: ({ session_id, rating, message, timestamp }) => {\n    // Wire → QhawayStorage / QhawaySpan { session_id, rating }\n    writeRatingToSpan({ session_id, rating });\n  },\n});\n\n// UI event handler (👍 = 1, 👎 = -1, neutral = 0)\nconst event = agent.feedback('session-abc', 1);\n// → { type: 'feedback', sessionId: 'session-abc', rating: 1, timestamp: 1786... }\n// The event is AG-UI compatible — forward it through the same SSE path as\n// streaming by yielding it through `agentToSSE`.\n```\n\nRatings are `1 | -1 | 0` (up / down / neutral) and the hook can receive optional free-text `message`. See [`examples/08-feedback-ui.mjs`](examples/08-feedback-ui.mjs) for the full wiring.\n\n## Reasoning Loop (Reflection + Re-loop on Violation)\n\nThe default loop is single-pass: `LLM → tools → done`. For harder questions, enable the **reasoning loop** — a reflection pass that re-calls the router on the reasoning tier (`reasoning: { effort: 'high' }`) and lets it critique + improve the draft. **Off by default** (`maxReflections: 0` → zero extra calls, behavior unchanged).\n\n```typescript\nconst agent = new Agent({\n  router,\n  tools,\n  maxReflections: 1,          // one reasoning-tier pass after the draft\n  maxRetriesOnViolation: 1,   // re-loop when the ontology validator rejects a response\n});\n\nconst result = await agent.run('Explain my AWS bill');\nconsole.log(result.text);              // improved answer\nconsole.log(result.reflectionsUsed);   // 1\n```\n\n- **Reflection pass**: after the final draft, Tinkuy asks the model to improve it. If the model replies with `{{NO_CHANGE}}` (or returns the draft unchanged), the draft is kept. Customize via `reflectionPrompt` (`{draft}` / `{noChangeToken}` placeholders).\n- **Re-loop on violation**: with `maxRetriesOnViolation > 0`, an `OntologyViolationException` feeds the violations back and re-calls on the reasoning tier — the `fail_on_unknown_relation` kill switch stays intact once retries are exhausted.\n- **Reasoning content**: providers that expose chain-of-thought (`Nemotron`/`Qwen3` `reasoning_content`, o1-style) stream it as `reasoning_delta` AG-UI events, so Qhaway can trace the reasoning alongside cost/latency.\n\n```typescript\n// Streaming: reasoning + reflection events\nfor await (const event of agent.stream('...')) {\n  if (event.type === 'reasoning_delta') console.log('thinking:', event.text);\n  if (event.type === 'reflection_start') console.log('reflecting…');\n  if (event.type === 'violation_retry') console.log('ontology violation, re-looping');\n}\n```\n\nThis is the **loop executor** of the Tinkuy/Sayay/SOFE governance trio: Tinkuy runs the reasoning loop, [Sayay](https://github.com/breakingthecloud/sayay) `loopDetection` cuts it when it repeats, and the SOFE AI savings agent consumes both (parse cheap → reasoning premium → cut on repeat).\n\n## BYO Router (No Styrr/Sayay Required)\n\n```typescript\nimport { Agent } from '@carloscortezcloud/tinkuy-agent';\nimport type { Router, RouterResponse, Message } from '@carloscortezcloud/tinkuy-agent';\n\nconst myRouter: Router = {\n  async call(messages: Message[]): Promise<RouterResponse> {\n    const res = await fetch('https://api.openai.com/v1/chat/completions', { ... });\n    return { text: '...', modelUsed: 'gpt-4o', latencyMs: 1200 };\n  }\n};\n\nconst agent = new Agent({ router: myRouter, tools: [...], systemPrompt: '...' });\n```\n\n## Architecture\n\n```\n┌─────────────────────────────────────┐\n│ Tinkuy Agent                        │\n│                                     │\n│  ┌─────────┐  ┌───────┐  ┌──────┐  │\n│  │ Router  │  │ Guard │  │Tools │  │\n│  │ (Styrr) │  │(Sayay)│  │(yours)│  │\n│  └────┬────┘  └───┬───┘  └──┬───┘  │\n│       │            │         │      │\n│       ▼            ▼         ▼      │\n│  ┌──────────────────────────────┐   │\n│  │     Agent Loop (core)        │   │\n│  │  for each iteration:         │   │\n│  │    guard.check() → allow?    │   │\n│  │    router.call() → response  │   │\n│  │    guard.record() → track    │   │\n│  │    if tool_calls → execute   │   │\n│  │    if text → return          │   │\n│  └──────────────────────────────┘   │\n└─────────────────────────────────────┘\n```\n\n## Ecosystem\n\n| Package | Role | npm |\n|---------|------|-----|\n| **Tinkuy** | Agent framework (this) | `@carloscortezcloud/tinkuy-agent` |\n| **Styrr** | LLM router | `styrr` |\n| **Sayay** | Cost guardrails | GitHub |\n| **Qhaway** | Agent observability | `@carloscortezcloud/qhaway` |\n| **TideRAG** | Edge RAG pipeline | `@carloscortezcloud/tiderag` |\n\n## Deterministic Ontology Validation\n\nValidate LLM output against a strict T-Box schema (entities + allowed relations + property types) in pure CPU/memory — **zero token cost**. This replaces LLM-as-a-judge for grounding decisions, per the TokenOps research. New to ontologies? Start with the [Ontologies 101 guide](docs/ONTOLOGIES-101.md).\n\n```typescript\nimport { Agent } from '@carloscortezcloud/tinkuy-agent';\nimport { loadOntology } from '@carloscortezcloud/tinkuy-agent/ontology';\n\nconst ontology = await loadOntology('schema/tokenops_ontology.yaml');\n\nconst agent = new Agent({\n  router,\n  tools,\n  ontology,                 // optional — without it, behavior is unchanged\n  onOntologyValidated: ({ validation }) => console.log('grounded', validation.relations),\n});\n```\n\nWith `fail_on_unknown_relation: true` in the schema, a hallucinated entity/relation throws `OntologyViolationException` and the response is **not** persisted or billed. The validator also compresses the payload to pure data relations, feeding prompt caching.\n\nSchema v1.1 adds deterministic grounding depth beyond type checking: **required properties**, **enum constraints**, **relation cardinality** (`1:1`/`1:N`/`N:1`/`N:M`), **min/max instance counts**, and a governance `meta` block. Property shorthand (`id: \"UUID\"`) still works — full specs are optional.\n\n```yaml\n# schema/tokenops_ontology.yaml (v1.1)\nmeta:\n  description: \"Dominio de operaciones de clientes\"\n  owner: \"finops-platform\"\nontology:\n  entities:\n    - name: \"Client\"\n      min_instances: 1\n      properties:\n        id: { type: \"UUID\", required: true }\n        status:\n          type: \"STRING\"\n          enum: [\"ACTIVE\", \"INACTIVE\", \"BLOCKED\"]\n          required: true\n    - name: \"Invoice\"\n      properties:\n        id: { type: \"UUID\", required: true }\n        amount: { type: \"FLOAT\", required: true }\n        currency:\n          type: \"STRING\"\n          enum: [\"USD\", \"EUR\", \"PEN\"]\n          required: true\n  allowed_relations:\n    - origin: \"Client\"\n      relation: \"HAS_BILLING_DISPUTE\"\n      target: \"Invoice\"\n      cardinality: \"1:N\"   # un Client, muchas disputas\n    - origin: \"Invoice\"\n      relation: \"BELONGS_TO\"\n      target: \"Client\"\n      cardinality: \"1:1\"   # una factura, un único cliente\nharness_constraints:\n  enforce_json_schema: true\n  fail_on_unknown_relation: true   # KILL SWITCH on hallucination\n```\n\nViolations are surfaced with structured kinds for observability (Qhaway/Phoenix): `unknown_entity`, `unknown_relation`, `invalid_target`, `invalid_property_type`, `missing_required_property`, `invalid_enum_value`, `cardinality_exceeded`, `min_instances_not_met`.\n\n## License\n\nApache 2.0 — see [LICENSE](LICENSE).\n\n---\n\n<p align=\"center\">\n  Built by engineers who got tired of vendor lock-in.<br>\n  <a href=\"https://github.com/breakingthecloud/tinkuylabs\">Tinkuy Labs</a> · <a href=\"https://finoptix.dev\">finoptix.dev</a>\n</p>\n<p align=\"center\">\n  <sub>Tinkuy runs on free models. Your agent framework shouldn't cost you.</sub>\n</p>\n","readmeFilename":""}