{"_id":"@dreamtree-org/dhruthi","_rev":"10-fe66ddce82de844fc14a02f51a6698d8","name":"@dreamtree-org/dhruthi","dist-tags":{"latest":"0.3.9"},"versions":{"0.3.0":{"name":"@dreamtree-org/dhruthi","version":"0.3.0","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.0","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"do-infer":"dist/bin/do-infer.js"},"dist":{"shasum":"1ad7ca7f7319f314fed15319a01c712fdc7c7d08","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.0.tgz","fileCount":249,"integrity":"sha512-XDgXCjyj/l8bufPk/Nffyy+KybB2rnBluKtlPvRL0kEfXpV4Klt/QrzcUJ5QXqimA6EOEaHXOTgLmS+Vrz42xg==","signatures":[{"sig":"MEYCIQCIN6iCyN3XxhduGoqsflfvPymtvXvlpGccsMv7Ms/pIgIhAN2euA0URSdFjqOk9ELTWEWmSQ/TPp4+kbI/BZI15ETm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":799514},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"c53693c364ecfb8b4afda0e31862084e59c22e84","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs"},"_npmUser":{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"10.9.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.15.0","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.0_1786160706030_0.6469658020310136","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@dreamtree-org/dhruthi","version":"0.3.1","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.1","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"do-infer":"dist/bin/do-infer.js"},"dist":{"shasum":"5749b54a0608eb02cbba9d0fd6eb9ce7b3364b8d","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.1.tgz","fileCount":249,"integrity":"sha512-1dSqx7wyP1Vr+03TMPufj4zTONvmrYPUwaGnnrMGeXAsGuWQEdBMKeqPYKxz3l1yBoCx1KjBZFuSN5Am3qDEuQ==","signatures":[{"sig":"MEUCICps321/SPXP0g4YAVMzmccCKZFUtU+mrSkMYfZPGgKrAiEAnlloMg8VUgYr+qJTXfwIRqblM2L01GoOISGC0FQNIQs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806813},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"8b11b76b4f888a078c9ea70a1b28c697ae376a43","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.1_1786162630496_0.09134215795956879","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@dreamtree-org/dhruthi","version":"0.3.2","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.2","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"do-infer":"dist/bin/do-infer.js"},"dist":{"shasum":"27f72d79db667b5b3410481377522a2eb820dcde","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.2.tgz","fileCount":249,"integrity":"sha512-SL6dfjc181g/Lqvug3P/gNenjL65tFbHxgQ+gv9FnWrauZR+W0PwVoVHcY+GjhncrA/9jOBqxMJwO12tG9wRyw==","signatures":[{"sig":"MEUCIHpQsry1Xh49YvsHA4Wfds3Vcm7IqBrpgt41+okt9CnaAiEArCvqOWlQrrZVWY58khK5SLs77uS5uIcY4w6LZTNvvc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806813},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"8bc54448fa595b111f9fbc58e5c7398b3bf0081b","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.2_1786174547946_0.6415394561917005","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@dreamtree-org/dhruthi","version":"0.3.3","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.3","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"do-infer":"dist/bin/do-infer.js"},"dist":{"shasum":"05d45dc81ca9a2dd901d1400d3f51d68c99507f9","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.3.tgz","fileCount":249,"integrity":"sha512-gVe4RdpJTB4Zj+fDDjYv7M7AJX+uNHlhfWGiiTP5M3l609cjJRxaVZMHMLywzbfPq75csC21dhp4DUD4ds9X0A==","signatures":[{"sig":"MEYCIQC/L5cHoItTIA9CcsV8ndRG8GpVcXdJ3MeudndvkGIzVwIhAM/7GDFdMMmpUvKxfC2VL3a+foMmhZeXBwPMhUsQbaVq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806813},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"1411a3fbbd47a35bf49172c008145ae2fe82c730","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.3_1786175552958_0.38743245552245353","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@dreamtree-org/dhruthi","version":"0.3.4","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.4","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"dhruthi":"dist/bin/dhruthi.js"},"dist":{"shasum":"47f371f25240039fa66c59b829ee9d2317ec8076","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.4.tgz","fileCount":249,"integrity":"sha512-fHUGDCciEM8Lg/6/1RK8Lsk+E/kjEKvmYZUQ5dsieyfvN7isJq7jVRsJJ/AbX1HHta7F51+VIhNRVuzLXFjvwQ==","signatures":[{"sig":"MEYCIQDQyZujpOz/5Sc7UEzaPX/R0fjnqF1e+2CK6XzylRtp8wIhAIef1ww2ytDsw/yGWBt+a1aPRFiPrVKGq6dYxo/Lh+A6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806574},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"b2d7ab8fd1c107890d7c15580e31cb377e237af8","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.4_1786295051390_0.6645383961005324","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@dreamtree-org/dhruthi","version":"0.3.5","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.5","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"dhruthi":"dist/bin/dhruthi.js"},"dist":{"shasum":"bde6caaa27e7222cce9ac22c8736f7e9ceea3dd9","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.5.tgz","fileCount":306,"integrity":"sha512-QWi5GE4Z95iCY3MwJsh9MCw8eYUpPTkNh0pPsz6a8uvjVYonVoxdhzCx3M4XQY3zKbLkL7YYmHlo2uZ6szaBpw==","signatures":[{"sig":"MEUCICVKAs2yMb34MS4Jzij0H0MI9xVwPRCOeP6+xOQnxtaQAiEA24C5jEcG0OyqAMiVkQJxRzK551gN1KYkq4Lcj7feyQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1154239},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"c48bf8cb01735ddc5ad60e6a99af9934bbd36676","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs","verify:providers":"npm run build && node scripts/verify-providers.mjs"},"_npmUser":{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"10.9.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.15.0","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.5_1786376733569_0.83798186901063","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@dreamtree-org/dhruthi","version":"0.3.6","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.6","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"dhruthi":"dist/bin/dhruthi.js"},"dist":{"shasum":"4390014f88ffd53579b85b97f49c30a7af0f2171","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.6.tgz","fileCount":303,"integrity":"sha512-TVPkDRnhWsqeqWS+BETbs4wMjcrqv4EuJ1rcCUfHbW3ZhQfAcs6/GtbuEURj1LBH11SN4j6VfOaDqhBB5eVgIg==","signatures":[{"sig":"MEYCIQDZj2uH71DcsYQDeLYFFb1FYiyQV12tuic7xF1EG3oAAAIhAIVy41gMQc7v3T2QWp3nro2NHl4XrH8tfvBB6R8KvXP0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1148119},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"3a748e316cf86bca9480f789406787de56651a09","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs","verify:providers":"npm run build && node scripts/verify-providers.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.6_1786377098535_0.48730230591652557","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@dreamtree-org/dhruthi","version":"0.3.7","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.7","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"dhruthi":"dist/bin/dhruthi.js"},"dist":{"shasum":"dfb612384a23a0e28989ff0561e554786edb37ba","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.7.tgz","fileCount":318,"integrity":"sha512-k6xaxMK5F+ld2HRPr6Zx9JiX87Uc7q7IALKcfc2McV+Hz2IGqJvB69R4ndATAVscTI4hgDWd4fhi54znhaPhCQ==","signatures":[{"sig":"MEUCICbKdz0czb3K36rf/lDETPwDHBHY8DVkBnwLER+vscGNAiEA2nkEMKvdozECTGASGKe4WnoHKZ5IUtl7BbdV1JvqGlw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1243167},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"0eb3004ebadfcf3658a56812754fe9e8e1d819fa","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs","verify:providers":"npm run build && node scripts/verify-providers.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0","better-sqlite3":"^13.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7","@types/better-sqlite3":"^9.6.0"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.7_1786382606623_0.44539333013935556","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@dreamtree-org/dhruthi","version":"0.3.8","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","_id":"@dreamtree-org/dhruthi@0.3.8","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"bin":{"dhruthi":"dist/bin/dhruthi.js"},"dist":{"shasum":"61c105b3f480387c1146c86612dc22de98b056fe","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.8.tgz","fileCount":318,"integrity":"sha512-FDZ00QN7fsZpqlYPmBBTmKBKZvpqtRM+or02Cfc5LzinFC8Q+hQ5ssi5MrsmnWmH/CTZga0t1mFL89pq/iUsbQ==","signatures":[{"sig":"MEYCIQClnq/k2I+VZyfZ+JV/7C6nN8lwZ6HwWleQcNmzy76bGQIhALAtbrMfx6t67utppYp9BVTDSCSDHrjGpH/xvM4mr5Ix","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1257421},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"c076b6386a22cb477497d308f70d464fac25c885","scripts":{"dev":"tsc -w -p tsconfig.build.json","lint":"biome check .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","build":"tsc -p tsconfig.build.json","prepack":"npm run build","lint:fix":"biome check --write .","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","version:ci":"node scripts/version-bump.mjs","verify:providers":"npm run build && node scripts/verify-providers.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"repository":{"url":"git+https://github.com/DreamtreeTech/agentic-cli.git","type":"git"},"_npmVersion":"12.0.2","description":"CLI for DigitalOcean Serverless Inference and Inference Router","directories":{},"_nodeVersion":"22.23.1","dependencies":{"commander":"^15.0.0","better-sqlite3":"^13.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^22.15.0","@biomejs/biome":"^2.5.7","@types/better-sqlite3":"^9.6.0"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dhruthi_0.3.8_1786384121879_0.46451547831884543","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@dreamtree-org/dhruthi","version":"0.3.9","description":"CLI for DigitalOcean Serverless Inference and Inference Router","type":"module","bin":{"dhruthi":"dist/bin/dhruthi.js"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"types":"./dist/index.d.ts","engines":{"node":">=22.12.0"},"repository":{"type":"git","url":"git+https://github.com/DreamtreeTech/agentic-cli.git"},"bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.build.json","dev":"tsc -w -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json","lint":"biome check .","lint:fix":"biome check --write .","test":"npm run build && node --experimental-strip-types --test \"test/**/*.test.ts\"","test:unit":"node --experimental-strip-types --test \"test/*.test.ts\"","test:e2e":"npm run build && node --experimental-strip-types --test \"test/e2e/**/*.test.ts\"","prepack":"npm run build","version:ci":"node scripts/version-bump.mjs","verify:providers":"npm run build && node scripts/verify-providers.mjs"},"keywords":["digitalocean","inference","llm","cli","gradient","ai"],"license":"MIT","dependencies":{"better-sqlite3":"^13.0.3","commander":"^15.0.0"},"peerDependencies":{"@digitalocean/dots":"^1.19.0"},"peerDependenciesMeta":{"@digitalocean/dots":{"optional":true}},"devDependencies":{"@biomejs/biome":"^2.5.7","@types/better-sqlite3":"^9.6.0","@types/node":"^22.15.0","typescript":"^5.9.0"},"gitHead":"c88e098cfc005a9a42ee84af28005d0153e53e42","_id":"@dreamtree-org/dhruthi@0.3.9","_nodeVersion":"22.23.1","_npmVersion":"12.0.2","dist":{"integrity":"sha512-koQ363wFUPfbseO7lUO35nbE76KWQc+tORiPdPdgpEVFqcpR8X7iHMo2QGy2c2jHqTwnCov0iz8TDulfB9S5QQ==","shasum":"51276497bc59b3aa26eb380ffbf92c3108144623","tarball":"https://registry.npmjs.org/@dreamtree-org/dhruthi/-/dhruthi-0.3.9.tgz","fileCount":357,"unpackedSize":1440763,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICS+IAh6oEeD6Rol7qDGnzraqQQDYItRIkvaiZT82qBPAiEAtY5+lBwvHeL3ShV3T6Dn0l0lHsFyDKPSMAJPTaf+hIM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:da402204-fbdd-4597-b6f7-bc6a422059c9"}},"directories":{},"maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dhruthi_0.3.9_1786424752263_0.6648629873905392"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-08T03:45:05.872Z","modified":"2026-08-11T05:05:52.573Z","0.3.0":"2026-08-08T03:45:06.248Z","0.3.1":"2026-08-08T04:17:10.665Z","0.3.2":"2026-08-08T07:35:48.087Z","0.3.3":"2026-08-08T07:52:33.116Z","0.3.4":"2026-08-09T17:04:11.555Z","0.3.5":"2026-08-10T15:45:33.775Z","0.3.6":"2026-08-10T15:51:38.698Z","0.3.7":"2026-08-10T17:23:26.790Z","0.3.8":"2026-08-10T17:48:42.030Z","0.3.9":"2026-08-11T05:05:52.402Z"},"bugs":{"url":"https://github.com/DreamtreeTech/agentic-cli/issues"},"license":"MIT","homepage":"https://github.com/DreamtreeTech/agentic-cli#readme","keywords":["digitalocean","inference","llm","cli","gradient","ai"],"repository":{"type":"git","url":"git+https://github.com/DreamtreeTech/agentic-cli.git"},"description":"CLI for DigitalOcean Serverless Inference and Inference Router","maintainers":[{"name":"preethamkrishna","email":"preetham.krishna.dev@gmail.com"}],"readme":"# dhruthi (`dhruthi`)\n\n**A multi-provider AI CLI that works instantly with free models — no key, no setup, no friction.**\n\n```bash\nnpm install -g @dreamtree-org/dhruthi\ndhruthi                                    # starts instantly, uses free Pollinations model\ndhruthi \"Explain closures in TypeScript\"   # one-shot\n```\n\n`dhruthi` started as a DigitalOcean inference CLI and is now a provider-agnostic tool that talks to OpenAI, Anthropic, Google Gemini, Groq, DeepSeek, Ollama, OpenRouter, and [25+ more](#providers) — with automatic wire-protocol translation so `--format json` and sessions behave the same regardless of which provider answered.\n\n---\n\n## Why dhruthi?\n\n| | dhruthi | opencode | aider | Claude Code |\n|---|---|---|---|---|\n| **Zero-config start** | ✅ free Pollinations | ✅ via Copilot | ❌ needs key | ❌ needs key |\n| **Built-in providers** | 33 + gateways | 75+ via models.dev | many via litellm | 1 (Anthropic) |\n| **Wire translation** | OpenAI / Anthropic / Gemini | OpenAI shape | via litellm | Anthropic |\n| **Multi-model routing** | 6 strategy kinds, fallback, round-robin | multi-session | ❌ | ❌ |\n| **Parallel agents** | ✅ `/parallel` | multi-session | ❌ | ❌ |\n| **Goal & plan tracking** | ✅ `/goal` + `/plan` | ❌ | ❌ | `/todo` |\n| **Hybrid context recall** | SQLite graph + vector | linear history | repomap | project context |\n| **Hooks / plugins** | JS/TS at 5 lifecycle pts | skills + MCP | ❌ | hooks |\n| **Dev commands** | 11 built-in (`/exec`, `/grep`, `/diff`, …) | via shell tool | via `/run` | via bash |\n| **Image input** | ✅ all 3 wire standards | ✅ | ✅ | ✅ |\n| **Auto-slash** | detects intent, injects context | ❌ | ❌ | auto-tools |\n| **Dependencies** | 2 (commander + better-sqlite3) | 100+ | 30+ | N/A (binary) |\n\n---\n\n## Quick start\n\n### Zero configuration (free, no key)\n\n```bash\nnpm install -g @dreamtree-org/dhruthi\ndhruthi                           # interactive REPL, uses free Pollinations model\ndhruthi \"What is a monad?\"        # one-shot\n```\n\nThat's it. Pollinations' `openai-fast` model (GPT-OSS 20B) serves every prompt for free, rate-limited. No account, no key, no setup.\n\n### With a provider key\n\nAlready have a key in your environment? No configuration needed:\n\n```bash\nexport OPENAI_API_KEY=sk-…\ndhruthi --provider openai \"explain closures\"\n\nexport GROQ_API_KEY=gsk_…\ndhruthi --provider groq \"write a haiku about SQL\"\n```\n\nOr add one interactively:\n\n```bash\ndhruthi provider add anthropic   # pastes key, auto-activates\ndhruthi provider use groq        # switch between configured providers\n```\n\n### No model configured?\n\nThe CLI picks one, tells you, and remembers it:\n\n```console\n$ dhruthi \"Bonjour, ça va?\"\nauto-selected model: openai-gpt-oss-20b  (tier gpt-oss, smallest ≥20B)\nsaved as default_model — change it with: dhruthi config set default_model <id>\nÇa va bien, merci !\n```\n\nIt chooses the *cheapest capable* model rather than the largest — this is spending money on a decision you did not make. The choice is deterministic, announced on stderr, and persisted. For CI: `--no-auto-model` or `DHRUTHI_NO_AUTO_MODEL=1`.\n\n---\n\n## Interactive REPL\n\n```console\n$ dhruthi\ndhruthi 0.3.5 — interactive. /help for commands, /exit or Ctrl-D to leave.\nprovider pollinations · model (auto) · session repl · 0 turns\n›\n```\n\n### All slash commands\n\n**Session & model:**\n\n| command | |\n|---|---|\n| `/model [id]` | show or switch model (`/model auto` to clear) |\n| `/router [name]` | route through DO inference router |\n| `/session [name]` | show, switch, or start a conversation |\n| `/sessions` | list saved conversations |\n| `/clear` | forget conversation history |\n| `/system <text>` | set the system prompt |\n| `/strategy [name]` | route turns across several models |\n| `/switch <model>` | hand conversation to another model |\n| `/compact [n]` | compress older turns, keeping last n exchanges |\n| `/retry` | re-send the last message |\n| `/parallel [on\\|off]` | query all strategy candidates simultaneously |\n| `/goal [text]` | set or show the high-level objective |\n| `/plan [cmd]` | step-by-step plan (generate\\|add\\|done\\|undo\\|edit\\|clear) |\n| `/recall` | search past context across all sessions |\n\n**Development:**\n\n| command | |\n|---|---|\n| `/file <path>` | read a file into the conversation context |\n| `/dir [path]` | list directory tree |\n| `/grep <pattern>` | search codebase (requires ripgrep) |\n| `/exec <cmd>` | run a shell command, capture output |\n| `/diff [--staged]` | show git diff |\n| `/log [-n 5]` | show recent git log |\n| `/lint` | run the project linter |\n| `/test [name]` | run tests (filters by test name) |\n| `/review [file]` | ask the model to review code |\n| `/explain <code>` | ask the model to explain code |\n| `/undo` | revert all unstaged file changes |\n| `/save [file]` | write transcript to a file |\n\n**Meta:**\n\n| command | |\n|---|---|\n| `/help`, `/exit` | |\n\nCtrl-C cancels the reply and returns to the prompt. Ctrl-D exits. All chrome goes to stderr.\n\n### Goal-driven execution\n\ndhruthi supports structured, goal-oriented workflows — set an objective and let the model build a step-by-step plan:\n\n```console\n› /goal Build a REST API for user management\n  Goal set.\n\n› /plan generate\n  Generating plan…\n  ⤷ openai-fast\n  Plan generated (5 items):\n    1. Set up Express project structure\n    2. Define user model and database schema\n    3. Implement CRUD endpoints\n    4. Add input validation and error handling\n    5. Write integration tests\n\n  Mark complete with /plan done <n>\n\n› /plan done 1\n  ✓ 1. Set up Express project structure\n```\n\nThe goal and plan are composed into the system prompt so the model always sees them. The status line updates: `goal \"Build a REST API\" · plan 1/5`.\n\n### Parallel agents\n\nWith an active strategy, `/parallel on` fires all candidates at once and displays every reply:\n\n```console\n› /strategy code-review\n› /parallel on\n  Parallel mode on — all strategy candidates will be queried simultaneously.\n› Review this diff for bugs.\n  ⤷ groq/llama-3.3-70b …\n  ⤷ cerebras/llama3.1-8b …\n  ⤷ openai/gpt-4o-mini …\n  … all three replies stream simultaneously …\n```\n\nSequential fallback (`/parallel off`) is the default — one candidate at a time, falling back on failure.\n\n### Auto-slash\n\ndhruthi detects intent from your prompt and automatically injects context before the model sees it:\n\n| Prompt pattern | Auto-injected context |\n|---|---|\n| \"the tests are failing\" | `npm test` output |\n| \"refactor the auth module\" | project file listing |\n| \"where is the login handler?\" | ripgrep search results |\n| \"commit and push\" | `git diff --stat` |\n| \"how does the token validation work?\" | relevant source file contents |\n| long prompt referencing multiple files | auto-goal + plan suggestion |\n\nToggle: `dhruthi config set auto_slash off`\n\n---\n\n## Providers\n\nOne profile is one connection — base URL, wire standard, credential, and defaults. 33 presets built in.\n\n```bash\ndhruthi provider catalog        # show all 33 built-in presets\ndhruthi provider list           # what you have configured\ndhruthi provider add openai     # paste key, auto-activates\ndhruthi provider use groq       # switch active\ndhruthi provider status         # active provider details\ndhruthi provider test           # GET /models + 1-token smoke test\ndhruthi provider remove groq\n```\n\n### Three wire protocols\n\nTranslation is transparent — `--format json`, streaming, sessions, and `AGENTS.md` behave the same regardless of which standard answered:\n\n| Standard | Endpoint | System prompt | Auth header |\n|---|---|---|---|\n| `openai` | `/v1/chat/completions` | `system` message role | `Authorization: Bearer` |\n| `anthropic` | `/v1/messages` | top-level `system` field | `x-api-key` + `anthropic-version` |\n| `gemini` | `:generateContent` | `systemInstruction` | `x-goog-api-key` |\n\n### Image input (multimodal)\n\n`--attach` works across all three standards — base64 data URLs and HTTP URLs are auto-translated to each provider's native image format:\n\n```bash\ndhruthi --attach screenshot.png \"describe this UI\"\ndhruthi --provider anthropic --attach photo.jpg \"what's in this image?\"\ndhruthi --provider gemini --attach diagram.png \"explain this architecture\"\n```\n\n### Environment keys\n\nEach preset knows its provider's conventional variable, so an exported key needs no config:\n\n```bash\nexport OPENAI_API_KEY=sk-…\nexport GROQ_API_KEY=gsk_…\nexport ANTHROPIC_API_KEY=sk-ant-…\ndhruthi --provider openai \"hello\"   # picks up OPENAI_API_KEY automatically\n```\n\nPrecedence: `--api-key` → `DHRUTHI_API_KEY` → provider's own env var → stored profile key.\n\n### Gateways\n\nThree gateway presets reach hundreds of upstreams through one endpoint:\n\n```bash\nnpx omniroute@latest              # local, 290+ providers\ndhruthi provider add omniroute\n\ndhruthi provider add openrouter   # 400+ models, :free suffix for free ones\ndhruthi provider add litellm      # local proxy, any provider\n```\n\n---\n\n## Free models (zero cost)\n\ndhruthi works with free models across multiple providers. Pick your level:\n\n### Zero configuration — start instantly\n\n```bash\ndhruthi                           # uses Pollinations' openai-fast (GPT-OSS 20B), no key\n```\n\n### Free API key — no payment required\n\n| Provider | Models | Key env var | Setup |\n|----------|--------|-------------|-------|\n| **Groq** | llama-3.3-70b, qwen-coder, gemma, deepseek, mixtral | `GROQ_API_KEY` | [console.groq.com](https://console.groq.com) |\n| **Cerebras** | llama3.1-8b, llama-4, mixtral | `CEREBRAS_API_KEY` | [cloud.cerebras.ai](https://cloud.cerebras.ai) |\n| **Google Gemini** | gemini-2.0-flash, gemini-2.5-pro, gemini-3.5-flash | `GEMINI_API_KEY` | [aistudio.google.com](https://aistudio.google.com) |\n| **NVIDIA NIM** | nemotron-3, llama variants | `NVIDIA_API_KEY` | [build.nvidia.com](https://build.nvidia.com) |\n| **DeepSeek** | deepseek-chat, deepseek-reasoner, deepseek-v4 | `DEEPSEEK_API_KEY` | [platform.deepseek.com](https://platform.deepseek.com) |\n| **DeepInfra** | llama, qwen, mistral, gemma | `DEEPINFRA_API_KEY` | [deepinfra.com](https://deepinfra.com) |\n| **OpenRouter** | 400+ models, 30+ `:free` suffix (zero billing) | `OPENROUTER_API_KEY` | [openrouter.ai](https://openrouter.ai) |\n| **IO.NET** | 17 models, free tier | `IONET_API_KEY` | [ai.io.net](https://ai.io.net) |\n| **Cloudflare AI** | llama, gemma, mistral on global edge | `CLOUDFLARE_API_KEY` | [developers.cloudflare.com](https://developers.cloudflare.com/workers-ai) |\n\n```bash\n# One key, one provider — instant setup\nexport GROQ_API_KEY=gsk_…\ndhruthi --provider groq \"hello\"\n\n# OpenRouter :free models — zero billing\nexport OPENROUTER_API_KEY=sk-or-…\ndhruthi --provider openrouter --model google/gemini-2.0-flash-001:free \"explain TypeScript generics\"\ndhruthi --provider openrouter --model deepseek/deepseek-chat:free \"write a haiku about Rust\"\n```\n\n### OpenCode Zen — subscription, 87 models, many free\n\nOpenCode Zen exposes an OpenAI-compatible API at `https://opencode.ai/zen/v1` with 87 models including Claude, GPT, Gemini, DeepSeek, Kimi, GLM, Qwen, and many with `-free` suffix:\n\n```bash\ndhruthi provider add opencode-zen\n# Paste your OpenCode Zen API key from https://opencode.ai/auth\n\n# Free suffix models — zero additional cost:\ndhruthi --provider opencode-zen --model deepseek-v4-flash-free \"hello\"\ndhruthi --provider opencode-zen --model glm-5-free \"explain this\"\ndhruthi --provider opencode-zen --model qwen3.6-plus-free \"write a function\"\ndhruthi --provider opencode-zen --model kimi-k2.5-free \"review this code\"\ndhruthi --provider opencode-zen --model hy3-free \"summarize this\"\ndhruthi --provider opencode-zen --model minimax-m3-free \"translate\"\n```\n\n**All OpenCode Zen free models:** `deepseek-v4-flash-free`, `glm-5-free`, `glm-4.7-free`, `hy3-free`, `hy3-preview-free`, `kimi-k2.5-free`, `ling-2.6-flash-free`, `ling-3.0-flash-free`, `ling-3.0-tiny-free`, `longcat-2.0-free`, `mimo-v2-flash-free`, `mimo-v2-omni-free`, `mimo-v2-pro-free`, `mimo-v2.5-free`, `minimax-m2.1-free`, `minimax-m2.5-free`, `minimax-m3-free`, `nemotron-3-super-free`, `nemotron-3-ultra-free`, `north-mini-code-free`, `qwen3.6-plus-free`, `ring-2.6-1t-free`, `trinity-large-preview-free`, `laguna-s-2.1-free`\n\n### OpenCode Go — subscription, 24 curated models\n\n```bash\ndhruthi provider add opencode-go\n# Paste your OpenCode API key\ndhruthi --provider opencode-go --model qwen3.7-max \"explain this architecture\"\n```\n\n### Local models — always free\n\n```bash\ndhruthi provider add ollama       # Ollama: localhost:11434/v1\ndhruthi provider add lmstudio     # LM Studio: localhost:1234/v1\ndhruthi provider add vllm         # vLLM: localhost:8000/v1\ndhruthi provider add llamacpp     # llama.cpp: localhost:8080/v1\n```\n\n### Free model strategies — combine for resilience\n\n```bash\n# Fire-and-forget across 3 free providers\ndhruthi strategy add resilient --preset resilient\n\n# OpenRouter :free only — 100% free, zero billing\ndhruthi strategy add oss --preset oss-champion\n\n# OpenCode Zen free models only\ndhruthi strategy add zen-free -k cost-optimized \\\n  -c opencode-zen/deepseek-v4-flash-free \\\n  -c opencode-zen/glm-5-free \\\n  -c opencode-zen/qwen3.6-plus-free\n\n# Activate and use\ndhruthi strategy use oss\ndhruthi \"refactor this function\"\n# Automatic fallback if any model rate-limits\n```\n\n---\n\n## Strategies — multi-model routing\n\nA strategy is a named set of candidate models plus a rule for ordering them. It makes free tiers usable: try the free one, and when it rate-limits, continue elsewhere.\n\n```bash\ndhruthi strategy add resilient -c groq/llama-3.3-70b -c cerebras/llama3.1-8b\ndhruthi strategy use resilient\ndhruthi \"explain closures\"\n```\n\n```\n⤷ groq/llama-3.3-70b failed (429); continuing on cerebras/llama3.1-8b\n→ strategy \"resilient\" → cerebras/llama3.1-8b (attempt 2 of 2)\n```\n\n| kind | ordering |\n|---|---|\n| `priority` | as declared; fall back only on failure |\n| `cost-optimized` | free → free-tier → paid |\n| `round-robin` | rotate per turn — stretches several free tiers past rate limits |\n| `least-used` | fewest recent requests first |\n| `weighted` | proportional, `-c groq/model:7` |\n| `random` | shuffled |\n\n**Two billing protections:** fallback never re-issues a request that may already have run, and automatic fallback will not escalate to a paid provider unless `--allow-paid` is set.\n\n### Built-in strategy presets\n\nSix presets ship with dhruthi, each optimized for a specific coding workflow with free models:\n\n```bash\ndhruthi strategy add review --preset redundant   # install a built-in preset\ndhruthi strategy use review                       # activate it\n# or in the REPL:\n/strategies redundant                             # list, then activate\n```\n\n| Preset | Kind | Candidates | Use case |\n|--------|------|-----------|----------|\n| `resilient` | cost-optimized | groq/llama-3.3-70b → cerebras/llama3.1-8b → openrouter :free | Never fail — rotate through 3 free providers |\n| `redundant` | priority | groq/llama + cerebras/llama + gemini-flash | Code review: fire multiple models, compare results |\n| `fast-first` | least-used | groq/llama + cerebras/llama | Stretches two free tier quotas across turns |\n| `heavy-code` | priority | gemini-2.5-pro → groq/llama → cerebras/llama | Complex tasks: strongest free models first |\n| `oss-champion` | cost-optimized | openrouter :free models only | 100% free — no API key needed on any provider |\n| `multi-review` | priority | groq/llama + cerebras/llama + gemini-flash | `/parallel on` — all three models review simultaneously |\n\n```bash\n# Redundant code review workflow\ndhruthi strategy add review --preset redundant\ndhruthi strategy use review\n/parallel on\n/diff\n\"Review this diff for bugs, style, and security\"\n→ groq, cerebras, and gemini review simultaneously\n\n# Zero-key development (just OpenRouter API key)\ndhruthi strategy add oss --preset oss-champion\ndhruthi strategy use oss\n→ All models are :free — no billing on any provider\n```\n\n---\n\n## Hybrid context recall\n\ndhruthi uses a SQLite database with entity graphs and vector embeddings to retrieve relevant context from **all past sessions** — not just the current one.\n\n```\nUser: \"fix the JWT expiry bug in auth.ts\"\n  → Entity extraction: \"JWT\", \"auth.ts\", \"bug\"\n  → Graph traversal: find turns referencing \"auth.ts\" across sessions\n  → Vector search: cosine similarity on prompt embedding\n  → Hybrid score: 0.5×vector + 0.3×graph + 0.2×freshness\n  → Inject \"Relevant past context\" into system prompt\n```\n\nEmbeddings are generated via the active provider's embedding API (`text-embedding-3-small`) and stored in the SQLite DB at `~/.local/state/dhruthi/context.db`. Entity extraction is regex-based (file paths, function names, error codes, URLs, tech terms). The DB survives across REPL sessions and grows automatically.\n\nManual recall: `/recall \"JWT authentication\"`\n\n---\n\n## Hook injection system\n\nExtend dhruthi with plugins at five lifecycle points. Create a file in `~/.config/dhruthi/hooks/` and enable it:\n\n```bash\ndhruthi config set hooks my-hook,slack-notify\n```\n\n**Hook types:**\n- `.ts` / `.js` — ESM modules exporting lifecycle handlers\n- `.sh` — spawned shell scripts (simpler, no JS needed)\n\n**Lifecycle events:**\n\n```typescript\n// ~/.config/dhruthi/hooks/my-hook.ts\nexport function onStartup(ctx: HookContext) { ctx.log(\"REPL started\"); }\nexport function onPreTurn(ctx: HookContext) {\n  // modify context, inject data, run external tools before model call\n}\nexport function onPostTurn(ctx: HookContext) {\n  // post-process reply, send notifications, log metrics\n}\nexport function onSlashCommand(ctx: HookContext) {\n  // intercept or extend any slash command\n  if (ctx.slashCommand === \"/review\") { /* custom logic */ }\n}\nexport function onShutdown(ctx: HookContext) { /* cleanup */ }\n```\n\nHook failures never crash the REPL — each handler is wrapped in try/catch.\n\n---\n\n## Switching models mid-conversation\n\nWhen a conversation moves to a different model (by fallback or `/switch`), the new model would otherwise read the previous model's replies as its own. The handoff system prevents this:\n\n```console\n› /switch claude-haiku-4\nSwitched to claude-haiku-4 (from llama-3.3-70b). 12 message(s) handed over.\n```\n\nThe incoming model sees attributed history — previous assistant turns are marked `[assistant · llama-3.3-70b]` — and a handoff preamble that prevents claiming work it didn't do. User turns are never rewritten, code is never summarized.\n\n---\n\n## Authentication (DigitalOcean)\n\nDigitalOcean issues two credentials that are not interchangeable. Commands that only exist on DO (`routers`, `auth`, `setup`) gate on the active provider:\n\n| Credential | Format | Works on |\n|---|---|---|\n| Model access key | `doo_v1_…` or `sk-do-…` | inference.do-ai.run |\n| Personal access token | `dop_v1_…` | api.digitalocean.com |\n\n```bash\nexport MODEL_ACCESS_KEY=doo_v1_…\nexport DIGITALOCEAN_TOKEN=dop_v1_…\ndhruthi auth login --type pat      # stores in config (mode 0600)\n```\n\nCredentials are never in argv, never in output — including under `--debug-http`.\n\n---\n\n## Project awareness\n\n### `AGENTS.md` becomes the system prompt\n\nAny `AGENTS.md` from the repo root down to your working directory is concatenated into the system prompt. The cross-tool convention — a repo with an `AGENTS.md` for another tool needs nothing new.\n\n```bash\ndhruthi context print      # exactly what would be sent\ndhruthi context files      # which files were found\ndhruthi --no-context \"…\"   # ignore for one call\n```\n\n### Prompt templates\n\nMarkdown files in `.dhruthi/prompts/` become commands:\n\n```markdown\n---\ndescription: Review code for bugs\nmodel: openai-gpt-oss-20b\n---\nReview the following for correctness bugs. Focus areas: $ARGUMENTS\n```\n\n```bash\ndhruthi review null checks\ndhruthi template list\ndhruthi template render review null checks\n```\n\n### Project settings\n\n`.dhruthi/config.json` (committed) and `.dhruthi/config.local.json` (personal) layer under your user profile. Only `default_model`, `default_router`, and `format` are allowed — endpoints, transport, and credentials are refused outright in shared files.\n\n---\n\n## Commands\n\n```\nsetup                          one-time onboarding (DigitalOcean)\nrepl (shell)                   interactive chat\ndoctor (check)                 diagnose configuration\ncontext (ctx) show·files·print what applies here\ntemplate(s) list·show·render·trust·untrust\nprovider(s) catalog·add·list·use·status·test·remove\nstrategy(s) list·show·add·use·remove\nauth login·logout·status·whoami (DigitalOcean only)\nconfig get·set·unset·list·path·fix-permissions\nmodels (m) list·get          GET /v1/models\nchat (c) create              POST /v1/chat/completions\nresponses create             POST /v1/responses\nmessages create              POST /v1/messages\nembeddings create            POST /v1/embeddings\nimages generate              POST /v1/images/generations\naudio (tts) speech           POST /v1/audio/speech\nasync submit·status·get·wait\nvideo create·get·wait·download (experimental)\nbatch files·create·list·get·results·cancel\nrouters list·get·create·update·delete·presets (DigitalOcean only)\nsession list·show·rm·path\n```\n\n---\n\n## Output\n\n`--format json|jsonl|table|text`. `--format json` always emits exactly one valid JSON document. Streaming happens over the wire for fast first byte, but output is assembled before printing.\n\n| Code | | Code | |\n|---|---|---|---|\n| 0 | success | 5 | rate limited |\n| 1 | unexpected | 6 | server error |\n| 2 | usage / validation | 7 | network / timeout |\n| 3 | auth | 8 | job failed |\n| 4 | not found | 130 | interrupted |\n\n---\n\n## Reliability\n\n- **Retries** on transient errors with exponential backoff and jitter; `Retry-After` honored up to 60s.\n- **Billable POSTs are not blindly retried.** An inference request returning 500 may have executed and been charged — only retried when the server confirms it wasn't processed.\n- **Config files** written atomically, mode 0600. Credentials never in argv or output.\n- **Session transcripts** at `~/.local/state/dhruthi/sessions/`, mode 0600, JSONL format.\n\n---\n\n## Development\n\n```bash\nnpm install\nnpm run build          # tsc → dist/\nnpm run typecheck      # src + test\nnpm run lint           # biome\nnpm test               # builds, then unit + e2e (549 + 210 tests)\nnpm run verify:providers  # sweep the catalog against live hosts\n```\n\nRequires Node ≥ 22.12. Two conventions: relative imports carry `.js` extensions (NodeNext module resolution), and unit tests import from `dist/` (type-stripping doesn't map `.js` to `.ts`).\n\n### Architecture\n\n```\nsrc/core/context-store.ts     SQLite DB: turns, entities, embeddings, hybrid search\nsrc/core/context-graph.ts     Entity extraction (regex) + graph edge insertion\nsrc/core/context-retrieve.ts  Hybrid retrieval: graph + vector with combined scoring\nsrc/core/hooks.ts             Plugin system: 5 lifecycle events, JS/TS/sh hooks\nsrc/repl/auto-slash.ts        Intent detection: auto-runs context commands before turns\nsrc/repl/commands.ts          All 30 slash commands: dev, goal/plan, session, recall\nsrc/repl/engine.ts            Conversation loop with hooks, auto-slash, recall\nsrc/repl/turn.ts              Turn dispatch: single, strategy-fallback, parallel agents\nsrc/api/chat.ts               Standard-aware dispatch + image translation for 3 protocols\nsrc/providers/catalog.ts      33 provider presets with base URLs, env vars, costs\n```\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}