{"_id":"@acruxcoreai/sdk","_rev":"16-e945ad9fcf6dd556058b6d140d958757","name":"@acruxcoreai/sdk","dist-tags":{"latest":"0.15.0"},"versions":{"0.4.0":{"name":"@acruxcoreai/sdk","version":"0.4.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.4.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://github.com/talhaanwarch/agenticprompthub/tree/main/packages/sdk#readme","bugs":{"url":"https://github.com/talhaanwarch/agenticprompthub/issues"},"dist":{"shasum":"c07f4c2c602cf4a0dd556739492ab759e65938d4","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.4.0.tgz","fileCount":9,"integrity":"sha512-d1L5JFi39YHK0lemOISsZsKvg/7K2zllafJi/omXwyxt2zP0XrmjI7awbVr7PpBtRnWKQUeikzj9V39D+1QZQg==","signatures":[{"sig":"MEUCIH0cPC8I+HGkeGnD0Pmrubgm73YuDJbtpxXuwfDhG634AiEA3tgRKOsT3uqoHaeAjC2hB/6h33MbZDO5G1z4qThkD7U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190179},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"2f1c7deef659114a2b7306fd7cdd002bb1dcb132","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/talhaanwarch/agenticprompthub.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.0_1783958159623_0.44724033126583884","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@acruxcoreai/sdk","version":"0.5.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.5.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://docs.acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"6aafc92dafff0cc196772e2ad7bd956e7816e276","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.5.0.tgz","fileCount":9,"integrity":"sha512-c0fHgGQmQEmKSAu3UMGHvsSASD47DwZ9jPrFnEwTgXb60FVyeD/cKoeWkdXXWCDD+YavVfAlzcVOvOnu8qhczA==","signatures":[{"sig":"MEYCIQDg4IBreAMv5iEVleuJwYv1m/J9ktdyb42LrzJkzh8IPgIhANtHqJFYFss9SiZFJv08Fb94VVjG/tH+zV5NSgo1ZOZX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347182},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"2ab76554e69a61f139a1a739247345991d3b271f","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/talhaanwarch/agenticprompthub.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.0_1785218936581_0.9688918293997366","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@acruxcoreai/sdk","version":"0.6.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.6.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://docs.acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"1d4239c18d8f02cb4086d88a90da6b8c7cab867c","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.6.0.tgz","fileCount":10,"integrity":"sha512-z9Quo5aaqKhBJcT8g4TA0da+tZ4TSjYb8wAWvC0fksf+E6J4s70Dv/34sobRtGoB3ce/6EuzlKmia6pnT3dE5Q==","signatures":[{"sig":"MEQCIGmipZC5wBWTNMsgwKmiAuU5P5TTHLoXmUzT72q0YvgBAiB4XJMXT8+F0CdQInNZyhRlPQcwvY2tCeO4hItizddO8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":464508},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d721e0f569a95f46ab98bd6e8af87aeb1dd62aa1","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=byo.integration --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/talhaanwarch/agenticprompthub.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.6.0_1785430325426_0.6008707230195378","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"@acruxcoreai/sdk","version":"0.6.5","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.6.5","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://docs.acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"b5829b9bfa302e5e5b92030241e90f59a9ec7545","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.6.5.tgz","fileCount":10,"integrity":"sha512-Hed7i9tDmh6kve7eR1Axag5yGaL6PeQ0RgQO/Y7K7MoGe/ZHuSLfEHSAxDYfGCFmdJVkA8xeLuLjDV4w41O/wQ==","signatures":[{"sig":"MEUCIQDvI8RcSYgfaoKLrL3l+6LEhNregUYxOuyExZxDYClQRQIgOn2Oz7vkGVr8fBiPDMA/KPyjA3qD38F/T/QsihJYj9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":546327},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"f04373e0ed3577e6b39ba2b75f995c9343b9e220","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=byo.integration --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/talhaanwarch/agenticprompthub.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.6.5_1785445372900_0.3439451700145171","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"@acruxcoreai/sdk","version":"0.6.6","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.6.6","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"a2678fd01b7a67db2e056ad523d014c6026f4793","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.6.6.tgz","fileCount":10,"integrity":"sha512-s6RB6C88qIrSjm4uk1LR6keJ0ixkRqtFiP+o2BZkydOI8WxRTLk9aTcBjhDwhuNXxK4GCEwL0jb1mJ4Seh1J3w==","signatures":[{"sig":"MEUCIQChW6WuhtDH9o7vtFiXxB/TvdAx6Kei/unSYcNhQEPWYAIgRV3QmPn/KkG944tE3fcSXKEduZ4Fw8Ta/B9dDsu9s2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":569119},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"9751b09c4a2d7c54a0b35eb4f8d0ea96e20ebd7a","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=byo.integration --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.6.6_1785678602926_0.18827370094688","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"@acruxcoreai/sdk","version":"0.6.7","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.6.7","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"d83d9bd97bcb733c525fe2a1dcbd0973942f8fcc","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.6.7.tgz","fileCount":10,"integrity":"sha512-iaahsuzD8auwKJqfWmH8M/KrH0ZSHED6Q6yME5zwbA03Y0H1maxxj5pjeL5MF3EAftjqOApc4CyzA7L2k3ud6A==","signatures":[{"sig":"MEYCIQCJahJU4lvce+8lhmMGL+hnwHuQ6YyujOjtNC8kopM5mAIhAO24V1QeZuMScSitfQ4lfy0wXLO+Lg+PCmQFJsesvTbP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":574262},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"60e05e799e38281b304f2947e9efff4ab4a0eaab","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=byo.integration --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.6.7_1785786142034_0.7535573712532906","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@acruxcoreai/sdk","version":"0.7.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.7.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"a303bb17522ac6feff8655fde1cadba8995264f5","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.7.0.tgz","fileCount":10,"integrity":"sha512-XiZUzKeFR7I7fHolUEjcvxJ3CIzV7UTDnB6O2cZH+wkU8iyVwnN6Q0vo2R5r3ZrB2znve7ht0KmdMhkLF0seOw==","signatures":[{"sig":"MEYCIQDFEXpSnO8mQF7EpGrMk/mZkby1ZCj3EgkpC+3GHaA/bgIhAP7iT4Z9E/i4FePpAPjVKKZVtwHxf/dLsX932yAKOQcA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":816370},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"1698a055dba4f9b8454f1d1b51156383ada9cf15","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Acrux Core — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.7.0_1785923033781_0.8933386035393922","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@acruxcoreai/sdk","version":"0.7.1","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.7.1","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"410a5bc29f8ae9fb8f8827852902e0bd8ac40389","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.7.1.tgz","fileCount":10,"integrity":"sha512-ffdfRNE1bUID6lpTERtal7wtKwIUps6f9BBiKMjAL80SVbDlQWv039hWXeo8BrHMDSHf1NDp+NaCVfUWsDRgSg==","signatures":[{"sig":"MEUCIQDeBgsrqnOAw/tnOuHvLhxhiUL8n920ntsacZFNvCH3UwIgEycjth1CwwiDqwAeig1aw+5cD0iFUD5C6lo/CRPP8hs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":816598},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"94bacfee49bb27fd1e3ead0cdd4f5a394be20a42","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.22.2","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2"},"peerDependencies":{"zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.7.1_1786112973892_0.16218952111411067","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@acruxcoreai/sdk","version":"0.8.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.8.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"ffcc7a52fc88068f131abf68b597423acfb2ee63","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.8.0.tgz","fileCount":16,"integrity":"sha512-uaNRxLBPkBHOhwvyBpkLkIJZWPjtRghE05i8lx+J77PeXUoNjXB4ogDtVUQ2i+6l+OxpYpzwmKhXCwuETW4zcQ==","signatures":[{"sig":"MEUCIQCOYcKdoxNKG3ZSBkMs6O4b/T9YVIPidoCKc0HNp+LlggIgVVEopIEe9aK3nJIlFapIBC4P90S99PRBn1/0Sqo5VNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":868868},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.8.0_1786403595188_0.009786989987510708","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@acruxcoreai/sdk","version":"0.9.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.9.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"fbf62c874ae86e94c58f7409b4d9cc03ce557cfa","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.9.0.tgz","fileCount":16,"integrity":"sha512-YK8YoXBP6D6E3DAZM97PPuZCgze64IwZXtgdK/i82YHTARSPgFmgSlLQyLxPEmxJk97ms8WyDNMisEl1XFFykg==","signatures":[{"sig":"MEUCIEv02ImqGphOCtqYBeOQMoJC0D2D9FyFGMmdjtWTITabAiEA892SIoxNTFX19g1lJ1nfwkAk02LNouDj8Ma2dkXla4Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1056878},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"gitHead":"919ce9bdbd25e05983b88ea54949feed7d94dedc","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.9.0_1787242237145_0.7282062747154663","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@acruxcoreai/sdk","version":"0.10.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.10.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"b65933ba05e7db858e09a85413783b863d501cf3","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.10.0.tgz","fileCount":16,"integrity":"sha512-ndGI1b9oSKzfal0vamgzjJJZVTlrjaJ2ytwO+C93kmxyEMpWhiQGr7jIA3LzGlhyZJSFVm0xkpArsAGc89S6GA==","signatures":[{"sig":"MEUCIQCfMBsQBv1eDqH8mHY5r/GwWwn0CFgbYrPDxYq6cOUzOQIgfrerQyjquUTzpYwyZMSOur8O5fNknVZhH3XDqKtnqDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1090753},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"gitHead":"fad8577c2adc03c12e2c22731f6b2edd4b1a3b41","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.10.0_1787343398543_0.7171260875033449","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@acruxcoreai/sdk","version":"0.11.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.11.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"f99f56caf9a49e0108f9faf37e4e18ac0316b7f7","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.11.0.tgz","fileCount":16,"integrity":"sha512-iJ+vy6GZ0ZrsVcvo1pD+9fEzhIjYv1CF6YoJzHB0cqV0uMNkkWqQ7i6WkjRzvLfxybL9WYwPs75pCtOkYruDhw==","signatures":[{"sig":"MEQCIDY+YwoKxcNEhLNGDgeI1U48WIbUeN3c7Jhpn6QZ6fmjAiADKITznte+eAxGW63oUbKoCWnGczzcGeY8pwBmnmFC0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1111048},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.11.0_1788700979183_0.14202164350021484","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@acruxcoreai/sdk","version":"0.12.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.12.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"c89a8a1b4a7537e0e365e7f2382cd01456b93214","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.12.0.tgz","fileCount":16,"integrity":"sha512-xP3FKX+C+0+Pfswe0IIsweqe0pceCfPyNeuuzCz2Z7DnnMDBDlZzqJ1qVrnH0z3zJWFRkHw1VLbtpy6pi0i4NA==","signatures":[{"sig":"MEUCIHMgW3mh5Musft7hIsihXO96boIZezNyyH9Yhr+i1hVQAiEA6zF3y4KIRQbcYIr2LTs0+f5gtWzg6TSiicEZBJo/nyM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1114171},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"gitHead":"6cf8658ae1eccace54a55cee82c98fc4bae13ddc","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.12.0_1788795161826_0.9798060863003426","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@acruxcoreai/sdk","version":"0.13.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.13.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"be0fb8e70a3addefc4521a43a1a7b8e401bde6fe","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.13.0.tgz","fileCount":16,"integrity":"sha512-ygO2nhFp/bhrd4+Z23Gtpzp/L3b8EyA8ro6mqZelK7XD8YlS/eYIjPmbKXp7Qg5vVeH9mm1J2xmtjvvzvBvxGw==","signatures":[{"sig":"MEUCIQDgj2b7mQEEZ3rPzSCaa1xH7tAbTsOXHTQOdMhRRsTyqQIgD3dtNM9B/OPiH3dzuLqc392eaJkwokvr2ipsVUMmHOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1144409},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"gitHead":"cc673e4eec967651797f3583a694e12182ace4d1","scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.13.0_1789305702964_0.5168353596699307","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@acruxcoreai/sdk","version":"0.14.0","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"license":"MIT","_id":"@acruxcoreai/sdk@0.14.0","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"homepage":"https://acruxcore.com","bugs":{"email":"support@acruxcore.com"},"dist":{"shasum":"43ffb6644ce4939b9d489f8fbff8a4089e3d108b","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.14.0.tgz","fileCount":16,"integrity":"sha512-jZ8vazi4r++2CdJwzYgSdm/DHuAlE2oHawRATJzpe7Z2U/SG3HiZZP0SkCzTG98CxC4C86+mN3fR7bQl5XhN9w==","signatures":[{"sig":"MEYCIQDGMlcHI1P5qsao1BW7ztpPOMurEG8n9EMaxHMf/llRHQIhAN0v1l2cAKAVj6cYGXjRn5hH63OLwCWyPIspBHIWGRTN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1200410},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"scripts":{"dev":"tsup --watch","test":"npm run test:unit && npm run test:integration","build":"tsup","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test:unit":"vitest run","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck && npm run test:unit && npm run build","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit"},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"repository":{"url":"git+https://github.com/AcruxCore/AcruxCore.git","type":"git","directory":"packages/sdk"},"_npmVersion":"10.9.8","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","directories":{},"_nodeVersion":"22.23.1","dependencies":{"lru-cache":"^10.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.25.76","jest":"^29.7.0","tsup":"^8.1.0","dotenv":"^16.4.5","vitest":"^1.6.0","ts-jest":"^29.1.4","@swc/jest":"^0.2.39","supertest":"^7.0.0","typescript":"^5.5.0","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","@opentelemetry/api":"^1.9.1","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@opentelemetry/exporter-trace-otlp-http":"^0.221.0"},"peerDependencies":{"zod":">=3.25.0","@opentelemetry/api":">=1.9.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.14.0_1789330674033_0.46322431747188264","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@acruxcoreai/sdk","version":"0.15.0","description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","license":"MIT","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"homepage":"https://acruxcore.com","repository":{"type":"git","url":"git+https://github.com/AcruxCore/AcruxCore.git","directory":"packages/sdk"},"bugs":{"email":"support@acruxcore.com"},"publishConfig":{"access":"public"},"engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./otel":{"types":"./dist/otel.d.ts","import":"./dist/otel.mjs","require":"./dist/otel.js"}},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","scripts":{"build":"tsup","dev":"tsup --watch","test:unit":"vitest run","test:integration":"jest --runInBand --testPathPattern=integration --testPathIgnorePatterns=/node_modules/ --testPathIgnorePatterns=byo.integration --testPathIgnorePatterns=eval-live --forceExit","test:live":"jest --runInBand --testPathPattern=\"(byo|eval-live).integration\" --forceExit","test":"npm run test:unit && npm run test:integration","typecheck":"tsc --noEmit","typecheck:test":"tsc --noEmit -p tsconfig.test.json","prepublishOnly":"npm run typecheck && npm run typecheck:test && npm run test:unit && npm run build"},"dependencies":{"lru-cache":"^10.2.2"},"devDependencies":{"@opentelemetry/api":"^1.9.1","@opentelemetry/exporter-trace-otlp-http":"^0.221.0","@opentelemetry/resources":"^2.10.0","@opentelemetry/sdk-trace-base":"^2.10.0","@opentelemetry/sdk-trace-node":"^2.10.0","@opentelemetry/semantic-conventions":"^1.43.0","@swc/jest":"^0.2.39","@types/jest":"^29.5.12","@types/node":"^20.14.0","@types/supertest":"^6.0.2","dotenv":"^16.4.5","jest":"^29.7.0","supertest":"^7.0.0","ts-jest":"^29.1.4","tsup":"^8.1.0","typescript":"^5.5.0","vitest":"^1.6.0","zod":"^3.25.76"},"peerDependencies":{"@opentelemetry/api":">=1.9.0","@opentelemetry/exporter-trace-otlp-http":">=0.200.0","@opentelemetry/resources":">=2.0.0","@opentelemetry/sdk-trace-base":">=2.0.0","@opentelemetry/sdk-trace-node":">=2.0.0","@opentelemetry/semantic-conventions":">=1.30.0","zod":">=3.25.0"},"peerDependenciesMeta":{"zod":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/exporter-trace-otlp-http":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/sdk-trace-base":{"optional":true},"@opentelemetry/sdk-trace-node":{"optional":true}},"_id":"@acruxcoreai/sdk@0.15.0","gitHead":"9f04d6a24a3bc92bb6430c9e066b75ec181065a9","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-aq5GvYQWYDWnAcO0hDhNuwEjB/Knw38A1qj07b9iW4B9abJEgExJmOaEbn5YbSlB+8gSNOLBUAYJ7ytwXcVkJQ==","shasum":"ba8bb50e515c9edfb605aa8155443ceef38b9f9a","tarball":"https://registry.npmjs.org/@acruxcoreai/sdk/-/sdk-0.15.0.tgz","fileCount":16,"unpackedSize":1221047,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCoQ/1pW9z4MyGQc4PiIN3G7npsA4QrAMvo+CLQv5B5MgIgBfAy7zk6P1yOvcvo1zKpS90bFz+wdWGFAxDEzdCrjW8="}]},"_npmUser":{"name":"acruxcore","email":"aiengr.talha@gmail.com"},"directories":{},"maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.15.0_1789389402572_0.7373148970649355"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-13T15:55:59.362Z","modified":"2026-09-14T12:36:42.881Z","0.4.0":"2026-07-13T15:55:59.747Z","0.5.0":"2026-07-28T06:08:56.718Z","0.6.0":"2026-07-30T16:52:05.569Z","0.6.5":"2026-07-30T21:02:53.066Z","0.6.6":"2026-08-02T13:50:03.121Z","0.6.7":"2026-08-03T19:42:22.198Z","0.7.0":"2026-08-05T09:43:53.956Z","0.7.1":"2026-08-07T14:29:34.037Z","0.8.0":"2026-08-10T23:13:15.438Z","0.9.0":"2026-08-20T16:10:37.330Z","0.10.0":"2026-08-21T20:16:38.695Z","0.11.0":"2026-09-06T13:22:59.346Z","0.12.0":"2026-09-07T15:32:41.959Z","0.13.0":"2026-09-13T13:21:43.150Z","0.14.0":"2026-09-13T20:17:54.178Z","0.15.0":"2026-09-14T12:36:42.727Z"},"bugs":{"email":"support@acruxcore.com"},"license":"MIT","homepage":"https://acruxcore.com","keywords":["acruxcore","prompt-management","llm","ai-gateway","observability","tracing","sdk"],"repository":{"type":"git","url":"git+https://github.com/AcruxCore/AcruxCore.git","directory":"packages/sdk"},"description":"TypeScript SDK for AcruxCore — runtime prompt render, gateway chat, tool loops, traces, and feedback","maintainers":[{"name":"acruxcore","email":"aiengr.talha@gmail.com"}],"readme":"# @acruxcoreai/sdk\n\nTypeScript SDK for acruxcore. Fetch rendered prompts at runtime without touching your database or managing version numbers.\n\nSee [CHANGELOG.md](./CHANGELOG.md) for release notes.\n\n## Installation\n\n```bash\nnpm install @acruxcoreai/sdk\n```\n\n## Quickstart\n\n```typescript\nimport acruxcore from '@acruxcoreai/sdk';\nimport OpenAI from 'openai';\n\nconst hub = new acruxcore({\n  apiKey: process.env.ACRUXCORE_API_KEY,\n  baseUrl: process.env.ACRUXCORE_BASE_URL,\n});\n\nconst openai = new OpenAI();\n\nasync function runAgent(userMessage: string) {\n  // Fetch the latest production prompt — no deploy needed to update it\n  const { messages } = await hub.prompts.render('summarise-article', 'production', {\n    article: userMessage,\n  });\n\n  const response = await openai.chat.completions.create({\n    model: 'gpt-4o',\n    messages,\n  });\n\n  return response.choices[0].message.content;\n}\n```\n\n## Chat\n\nA single-request wrapper over acruxcore's gateway (`POST /gateway/chat/completions`)\n— the OpenAI-compatible endpoint that routes to the right provider, prices the\ncall, and traces it server-side. Use it for one completion, not a tool loop:\n\n```typescript\nconst result = await hub.gateway.chat({\n  model: 'gpt-4o-mini',\n  messages: [{ role: 'user', content: 'Say hi in one word.' }],\n});\n\nconsole.log(result.content);        // 'Hello!'\nconsole.log(result.finishReason);   // 'stop'\nconsole.log(result.usage);          // { promptTokens, completionTokens, totalTokens }\nconsole.log(result.gateway);        // { requestId, provider, model, costUsd, cache }\n```\n\nPass `tools`/`toolRefs`/`toolChoice` the same way you would to the raw gateway\nendpoint. If the model calls a tool, `chat()` hands `tool_calls` back raw —\nit never auto-dispatches; use `runToolLoop` below for that.\n\n`chat()` isn't auto-traced: the gateway already records a trace for every\ncompletion it serves, and `result.gateway.requestId` correlates the call with\nit. Opt in anyway with `trace: true` or `trace: { traceId, sessionId }` to\nthread several manual `chat()` calls into one trace — this always adds a\n**second** `llm` span for the same completion, so it shows up twice: once in\nthe gateway's trace, once in yours.\n\n## Streaming\n\nUse `hub.gateway.stream()` to get an async iterable of chunks instead of a single\nresult:\n\n```typescript\nfor await (const chunk of await hub.gateway.stream({\n  model: 'gpt-4o-mini',\n  messages: [{ role: 'user', content: 'Count to three.' }],\n})) {\n  process.stdout.write(chunk.delta.content ?? '');\n  if (chunk.finishReason) console.log('\\n(done:', chunk.finishReason, ')');\n}\n```\n\nEach `chunk` mirrors one `chat.completion.chunk` SSE frame from the gateway\n(`id`, `model`, `delta.content`, `finishReason`); the generator ends when the\ngateway sends `data: [DONE]`.\n\n## Tools\n\nThree calls run a model, and which one you want depends on what you are holding:\n\n| You have | Call |\n|---|---|\n| Messages you wrote, no tools | `gateway.chat` |\n| Messages you wrote, and the tools named on the call | `gateway.runToolLoop` |\n| A prompt from the catalog | `prompts.render`, then `gateway.runPromptWithTools` |\n\n`chat` takes `tools` too, but only *offers* them: it returns `finishReason:\n'tool_calls'` with the request on `message.tool_calls` and runs nothing. Inside the\nloop, what you pass depends on where the tool is defined and whose process runs it:\n\n| Definition lives in | Runs in | Pass |\n|---|---|---|\n| Your code, declared with `acrux.tool` | Your process | `tools: [getWeather]` |\n| The catalog, `http` executor | AcruxCore | Nothing — the binding is enough, or `toolRefs` |\n| The catalog, `client` executor | Your process | `clientTools: { get_weather: getWeather }` |\n| Nowhere — inline for this call | Your process | `toolDefs` and `dispatch` |\n\nDeclare a tool once with `acrux.tool` — name, description, parameter schema,\nand handler together, nothing to keep in sync by hand — and hand it to the loop:\n\n```typescript\nimport AcruxCore, { acrux } from '@acruxcoreai/sdk';\nimport { z } from 'zod/v4';\n\nconst getWeather = acrux.tool(\n  {\n    name: 'get_weather',\n    description: 'Get the current weather for a city.',\n    parameters: z.object({ city: z.string().describe(\"City name, e.g. 'London'\") }),\n  },\n  async ({ city }) => {\n    const res = await fetch(`https://wttr.in/${encodeURIComponent(city)}?format=j1`);\n    const data = (await res.json()) as { current_condition: { temp_C: string }[] };\n    return { city, tempC: Number(data.current_condition[0].temp_C) };\n  },\n);\n\nconst hub = new AcruxCore();\nconst result = await hub.gateway.runToolLoop({\n  model: 'gpt-4o-mini',\n  messages: [{ role: 'user', content: 'What is the weather in London?' }],\n  tools: [getWeather],\n});\n\nconsole.log(result.content);     // final assistant text\nconsole.log(result.messages);    // full transcript, including tool calls/results\nconsole.log(result.iterations);  // number of model round-trips taken\nconsole.log(result.traceId);     // trace covering every round-trip + tool call\n```\n\nThe handler's argument is typed from the schema — `{ city }` is a `string`,\nnot `unknown` — so renaming a field in the zod object breaks the build instead\nof the model and your code silently drifting apart.\n\nOn first call, `runToolLoop` **syncs** each declared tool into the Tool\nCatalog and passes it to the model as a `toolRefs` entry instead of an inline\ndefinition — so the dashboard shows a version history, and every `tool` span\nrecords the exact version that ran. The sync is idempotent and cached per\nprocess (one request per unchanged tool; a changed one commits a new version\nand moves its alias). Pass `sync: false` when a deploy step already synced them.\n\n`parameters` also accepts a plain JSON Schema object, so zod is an **optional**\npeer dependency — install it only if you want to use it:\n\n```typescript\nconst countRows = acrux.tool(\n  {\n    name: 'count_rows',\n    parameters: {\n      type: 'object',\n      properties: { table: { type: 'string' } },\n      required: ['table'],\n      additionalProperties: false,\n    },\n  },\n  async (args) => ({ rows: await countIn(String(args.table)) }),\n);\n```\n\nOmitting `description` leaves whatever your team wrote in the dashboard in\nplace; supplying one makes code own it — every sync overwrites the dashboard's\ntext. Pick per tool which side owns the wording.\n\n### Catalog tools you didn't declare\n\nA tool whose catalog version has an **`http` executor** needs no local code at\nall. Name it in `toolRefs` and the platform calls the endpoint, writes the\n`tool` span with the real payloads, and hands the result back to the loop:\n\n```typescript\nconst result = await hub.gateway.runToolLoop({\n  model: 'gpt-4o-mini',\n  messages,\n  toolRefs: [{ name: 'search_orders', alias: 'production' }],\n});\n```\n\n`dispatch` still exists for two cases: raw OpenAI-shaped definitions passed as\n`toolDefs`, and a `toolRefs` entry with a `client` executor you haven't\ndeclared. If neither a declared tool nor `dispatch` can run it, the loop throws\n`MISSING_DISPATCH` **before** the first model call — no tokens spent.\n\n```typescript\nconst result = await hub.gateway.runToolLoop({\n  model: 'gpt-4o-mini',\n  messages,\n  toolDefs: rawOpenAiToolDefinitions,\n  dispatch: async (name, args) => runMyTool(name, args),\n});\n```\n\nPrompt-bound tools need none of this plumbing: hand the whole render result to\n`gateway.runPromptWithTools` and the refs, the model and the prompt lineage all\ncome from it — see [Running a prompt with its bound\ntools](#running-a-prompt-with-its-bound-tools) below.\n\n### Connecting a tool to a prompt\n\nWhich tools a prompt calls is decided per prompt alias, not per version — a\ncommit changes the template only. `setToolBinding` writes the default every\nalias inherits; `setAliasToolBinding` gives one alias a binding of its own\n(`{ off: true }` means \"this alias deliberately has no such tool\"):\n\n```typescript\nawait hub.prompts.setToolBinding(promptId, toolId, { toolAlias: 'production' });\nawait hub.prompts.setAliasToolBinding(promptId, 'staging', toolId, { toolAlias: 'staging' });\n\nconst { default: defaults, aliases } = await hub.prompts.listToolBindings(promptId);\n```\n\n`removeToolBinding` disconnects the default, `removeAliasToolBinding` returns one\nalias to it, and `resetAliasToolBindings` returns a whole alias to it.\n\n### Running a prompt with its bound tools\n\n`runPromptWithTools` takes a render result and derives the model, the messages,\nthe tool refs and the prompt version id from it — so nothing is restated at the\ncall site, and the trace keeps its link back to the prompt:\n\n```typescript\nconst r = await hub.prompts.render('weather-brief', 'production', { city: 'Lisbon' });\nconst result = await hub.gateway.runPromptWithTools(r);\n\nconsole.log(result.content);\n```\n\nAnything `runToolLoop` takes still works and wins over the derived value —\n`{ model: 'gpt-4o' }` overrides the bound model, `{ toolRefs: [] }` runs the\nprompt with no tools. A binding pinned to an exact tool version travels as a pin,\nso a pinned prompt keeps running the build it was pinned to. A prompt with no\ntools bound runs as a plain completion rather than erroring.\n\nIf the version has no bound model and you pass none, the call throws\n`VALIDATION_ERROR` naming both fixes.\n\n### Streaming a tool loop\n\n`stream: true` turns either loop into an async iterable of typed events, so a UI\ncan show text as it arrives and render a running tool as its own state:\n\n```typescript\nfor await (const event of await hub.gateway.runPromptWithTools(r, { stream: true })) {\n  if (event.type === 'content') process.stdout.write(event.delta);\n  else if (event.type === 'tool_call') console.log(`\\n[calling ${event.name}]`);\n  else if (event.type === 'tool_result') console.log(`[${event.name} done]`);\n  else if (event.type === 'done') console.log(`\\ntrace: ${event.result.traceId}`);\n}\n```\n\nThe `done` event carries the same `RunToolLoopResult` the unstreamed call\nreturns, and the trace is identical: one `llm` span per round with the round's\ntool spans nested under it. `content` events arrive from every round, each\ncarrying `round` — whether a round is the last is only knowable once its\n`finish_reason` arrives, so holding one back would delay the final answer.\n\nThere is no `dispatch` above, and none is needed: a tool whose version has an\n`http` executor runs on the platform. Pass `dispatch` only for a\n`client`-executor tool, whose code lives in your process — ask for one without an\nimplementation and the loop stops before calling the model, naming the tool.\n\n### A complete streaming script\n\nCopy-paste runnable, against a local API. Change `baseUrl` to\n`https://api.acruxcore.com/api/v1` for the hosted platform:\n\n```typescript\nimport { acruxcore } from '@acruxcoreai/sdk';\n\nconst hub = new acruxcore({\n  apiKey: process.env.ACRUXCORE_API_KEY,\n  baseUrl: 'http://localhost:3001/api/v1',\n});\n\nconst rendered = await hub.prompts.render('weather-brief', 'production', { city: 'Lisbon' });\n\nconst stream = await hub.gateway.runPromptWithTools(rendered, { stream: true });\nfor await (const event of stream) {\n  console.log(event);\n}\n\n// The trace is written in a background task. In a script that exits right away,\n// close the gateway or the write may not land.\nawait hub.gateway.close();\n```\n\n```text\n{ type: 'tool_call', id: 'call_jhL5Qe…', name: 'get_weather', arguments: { city: 'Lisbon' }, round: 0 }\n{ type: 'tool_result', id: 'call_jhL5Qe…', name: 'get_weather', round: 0, result: { location: 'Lisbon, Portugal', temperature_c: 26 } }\n{ type: 'content', delta: 'The', round: 1 }\n{ type: 'content', delta: ' weather', round: 1 }\n…\n{ type: 'done', result: { content: 'The weather in Lisbon right now is 26°C with patchy rain nearby.', iterations: 2, stoppedAtLimit: false, traceId: '7deb9f08-…' } }\n```\n\n### Overriding one prompt-bound tool's alias for a single call\n\nEvery prompt-bound tool follows its own tool alias — usually `production` —\nwhatever the prompt's own alias happens to be. `render()` also returns\n`toolResolutions`, reporting which alias (or pin) each tool actually resolved\nthrough and whether the prompt alias's own binding or the prompt default decided\nit, so you can see that before overriding it. `withToolOverride` does the\noverride safely — sending the same tool in both `tools` and `toolRefs` is a 400,\nso it removes it from `tools` and adds it to `toolRefs` for you:\n\n```typescript\nimport { withToolOverride } from '@acruxcoreai/sdk';\n\nconst rendered = await hub.prompts.render('weather-brief', 'production', { city: 'Paris' });\nconst { tools, toolRefs } = withToolOverride(rendered, { name: 'get_weather', alias: 'staging' });\n\nconst result = await hub.gateway.chat({ model: rendered.model ?? 'gpt-4o-mini', messages: rendered.messages, tools, toolRefs });\n```\n\nThis only affects this one call. If `get_weather` was already bound, it logs\na warning naming what the prompt currently has it set to — so the override\ndoesn't get mistaken for the prompt's own configuration.\n\n### The loop's behaviour\n\nThe loop stops when the model responds without calling a tool, or after\n`maxIterations` round-trips (default 10, `result.stoppedAtLimit` is `true`\nthen). Several tools requested in one turn run **concurrently**, appended in\ncall order regardless of which finishes first — so a handler must be safe to\nrun in parallel. A handler that throws propagates out of `runToolLoop`\nuncaught; wrap it yourself to report a tool failure back to the model instead.\n\nThe loop auto-reports one trace: an `llm` span per round-trip (with the\ngateway's usage/cost metadata) plus a `tool` span per client-side call.\nPlatform-run tools get their span from the platform, so nothing is reported\ntwice. Turn tracing off with `trace: false`, or attach to a trace you already\nhave with `trace: { traceId }`:\n\n```typescript\nconst result = await hub.gateway.runToolLoop({ model: 'gpt-4o-mini', messages, tools: [getWeather], trace: false });\n```\n\n### Catalog access without the loop\n\n`hub.tools` reaches the catalog directly — useful in a deploy step, or when you\ndrive the model yourself:\n\n```typescript\nawait hub.tools.sync([getWeather], { onConflict: 'error' });  // reconcile at deploy time\nconst resolved = await hub.tools.resolve([{ name: 'search_orders' }]);\nconst out = await hub.tools.execute(resolved[0].toolId, { query: 'refunds' });\n```\n\n`sync` returns, per tool, the version it landed on and whether this call\ncommitted it. `onConflict: 'error'` throws when a commit would supersede a\ndashboard-edited version; the default just warns, so a dashboard experiment\nnever blocks a deploy.\n\n## Bring your own provider (BYO)\n\nSkip our gateway and call your model provider's OpenAI-compatible endpoint\ndirectly — pass a `provider` option (or set one as a client-level default):\n\n```typescript\nconst result = await hub.gateway.chat({\n  model: 'llama-3.1-70b-versatile',\n  messages: [{ role: 'user', content: 'Hello!' }],\n  provider: { baseUrl: 'https://api.groq.com/openai/v1', apiKey: process.env.GROQ_API_KEY! },\n});\n```\n\n`provider.apiKey` goes only to `provider.baseUrl` — never to acruxcore's servers.\nTracing and prompt lineage still work: a BYO call auto-reports its own `llm`\nspan (tokens, latency, model, payloads — no dollar cost yet) plus any `tool`\nspans, and `promptVersionId` (from `prompts.render()`) still links the trace to\nthe prompt version that produced it.\n\n## Reporting traces\n\nReport your own traces — LLM calls, tool calls, retrieval, custom steps — so a\nwhole agent run shows up as one trace. Omit `traceId` to start a new trace; pass\none you already have (from a previous `traces.ingest()` call, or minted by the gateway)\nto add more spans to it.\n\n```typescript\nconst { traceId } = await hub.traces.ingest({\n  name: 'support-agent-run',\n  spans: [\n    {\n      spanId: 's1',\n      name: 'gpt-4o-mini',\n      kind: 'llm',\n      startTime: new Date().toISOString(),\n      endTime: new Date().toISOString(),\n      model: 'gpt-4o-mini',\n      usage: { promptTokens: 120, completionTokens: 40, totalTokens: 160 },\n    },\n    {\n      spanId: 's2',\n      parentSpanId: 's1',\n      name: 'search_docs',\n      kind: 'tool',\n      startTime: new Date().toISOString(),\n      attributes: { query: 'refunds' },\n    },\n  ],\n});\n\n// Later, add another span to the same trace:\nawait hub.traces.ingest({ traceId, spans: [{ spanId: 's3', parentSpanId: 's1', name: 'finalize', kind: 'chain', startTime: new Date().toISOString() }] });\n```\n\n`kind` is one of `llm | tool | retrieval | embedding | agent | chain | other`;\n`status` is one of `ok | error | unset`. `input`/`output` are stored only when\nyour team has payload capture enabled (or you pass `capturePayloads: true` on the\ntrace). Up to 200 spans per call.\n\n### When automatic traces are sent\n\n`traces.ingest()` above is awaited — you get the `traceId` back. The **automatic**\nreports from `gateway.chat()`, `gateway.stream()`, and `gateway.runToolLoop()` aren't: they go\nonto a background queue so a model call never waits on telemetry. There's no\nbatching timer either — an idle client sends each span as soon as it's\nrecorded, grouping into one request only while another is already in flight.\n\nTwo situations need one extra line:\n\n```typescript\n// Reading the traces API back straight after a call\nconst result = await hub.gateway.chat({ model, messages });\nawait hub.gateway.flush();                       // wait for the spans to be written\nconst { trace } = await hub.traces.get(result.gateway.traceId!);\n\n// A long-running server, in the shutdown path you already have\nawait hub.gateway.close();                       // flush, then stop accepting spans\n```\n\n`close()` is idempotent, and `await using hub = new AcruxCore(...)` does the same on\nNode 20.4+. A script that finishes and exits needs neither: the SDK flushes as the\nprocess winds down. It installs **no** `SIGINT`/`SIGTERM` handlers, because doing so\nsuppresses Node's default terminate behaviour and would break Ctrl-C in your\napplication — so a process killed by a signal drops whatever spans were buffered.\n\n## Feedback\n\nAttach a rating, a label, and/or a comment to a trace (or to one span within\nit) — the same feedback your team can leave from the dashboard's trace detail\npage, but from code (e.g. surfacing an end-user's thumbs-up/down):\n\n```typescript\nconst feedback = await hub.traces.submitFeedback({\n  traceId,\n  rating: -1,               // -1..5\n  label: 'wrong_answer',\n  comment: 'The tool call missed relevant docs.',\n  source: 'end_user',       // 'user' | 'developer' | 'end_user' | 'api', defaults to 'user'\n});\n\n// Scope feedback to one span instead of the whole trace:\nawait hub.traces.submitFeedback({ traceId, spanId: 's1', rating: 5 });\n\n// Edit it later — only the original author's feedback can be edited;\n// omitted fields keep their existing value:\nawait hub.traces.updateFeedback({ traceId, feedbackId: feedback.id, rating: 1 });\n```\n\nAt least one of `rating`/`label`/`comment` is required per call.\n\n## Reading traces back\n\n`traces.ingest()` only writes. To read a trace back — e.g. to show a user their own\nagent run, or to pull usage/cost after the fact — use `traces.get()` (one trace,\nfull span tree) or `traces.list()` (a filtered, paginated list):\n\n```typescript\nconst { trace, spans } = await hub.traces.get(traceId);\nconsole.log(trace.status, trace.totalCostUsd, trace.totalTokens);\nconsole.log(spans[0].model, spans[0].latencyMs);\n\nconst { data } = await hub.traces.list({ sessionId: 'tokyo-trip-plan-01', limit: 10 });\n```\n\n## Configuration\n\n| Option | Environment Variable | Default | Description |\n|--------|---------------------|---------|-------------|\n| `apiKey` | `ACRUXCORE_API_KEY` | **required** | Your acruxcore API key |\n| `baseUrl` | `ACRUXCORE_BASE_URL` | **required** | API base URL (e.g. `http://localhost:3001/api/v1`) |\n| `cacheTtl` | — | `60000` (60s) | Milliseconds before a cached result is considered stale. `0` disables caching |\n| `maxCacheSize` | — | `500` | Maximum number of prompt entries in the in-process LRU cache |\n| `maxRetries` | — | `1` | Retry attempts on transient failure (2 total attempts) |\n| `retryInterval` | — | `500` | Milliseconds between retries |\n\n**Create one instance at process startup and reuse it.** The cache is a module-level singleton; `maxCacheSize` is set by the first constructor call.\n\n## Error Handling\n\n```typescript\nimport { acruxcoreError } from '@acruxcoreai/sdk';\n\ntry {\n  const messages = await hub.prompts.render('my-prompt', 'production', vars);\n} catch (err) {\n  if (err instanceof acruxcoreError) {\n    switch (err.code) {\n      case 'MISSING_VARIABLES':\n        // Template requires variables you didn't supply\n        console.error('Missing template variables:', (err.body as { error: { missing: string[] } }).error.missing);\n        break;\n      case 'NETWORK_ERROR':\n        // API unreachable — no stale cache entry available\n        console.error('acruxcore API unreachable. Check ACRUXCORE_BASE_URL.');\n        break;\n      case 'API_ERROR':\n        // Non-retryable HTTP error (401 invalid key, 404 prompt not found, etc.)\n        console.error(`acruxcore API error ${err.statusCode}`);\n        break;\n    }\n  }\n  throw err;\n}\n```\n\n## Caching\n\nThe SDK maintains an in-process LRU cache:\n\n- **Cache key:** `${apiKey}:${promptName}:${alias}:${variablesHash}` — scoped per team, per prompt, per alias, per set of variables. Rendering the same prompt with new variables always re-renders; the variable hash is independent of key order, so `{ a, b }` and `{ b, a }` share one entry.\n- **Turning it off:** `cacheTtl: 0` disables caching completely — every `prompts.render` call goes to the API and nothing is stored (so the serve-stale-while-offline behaviour below no longer applies).\n- **Stale-while-revalidate:** On a stale hit, the cached value is returned immediately and a background refresh fires in the background.\n- **API unreachable + stale entry:** Serves the stale value and logs: `[acruxcore] Background refresh failed for \"name/alias\" — continuing to serve stale`.\n- **API unreachable + cold cache:** Throws `acruxcoreError` with `code: 'NETWORK_ERROR'` after exhausting retries.\n\n## Requirements\n\n- Node.js 18+ (uses native `fetch`)\n","readmeFilename":"README.md"}