{"_id":"@adam91holt/grokbot-sdk","_rev":"9-6c6eab6f5d71d9721d30a9a37eaf2725","name":"@adam91holt/grokbot-sdk","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@adam91holt/grokbot-sdk","version":"0.1.0","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.0","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"b8ef0efa26f2c906f8200e64df1073c838d91a04","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.0.tgz","fileCount":149,"integrity":"sha512-Nq2/NzpSwQGjddTyG17BNeMHzPT7SwFuQmoUzLPWSS/C0rfdSnYGfOCRD5CvoGWXt0uwhn+q/k9l73EbUAriqw==","signatures":[{"sig":"MEQCIAqsqKFeOrY+pnyWSYvXfRnrfMN3Q7N+Mv4dkneRksW0AiAZ4hd3y6TUm9SlsSMMhRlnoJg8th9HQ+JETxZMeBozmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":913385},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"73d40a83961534715e04ec3839b35b394bb5a425","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git"},"_npmVersion":"11.4.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.0_1786932390332_0.7758696010853507","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adam91holt/grokbot-sdk","version":"0.1.1","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.1","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"b2b296d66d7e26b0f3332f0faf8a504dc7669fa6","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.1.tgz","fileCount":149,"integrity":"sha512-HuCOynCZLIbTvZLPAHt1tipZT/UuSCheLXcUgBdrSTQveZmJ3cjZx3o9hh6i4do3p4UvRY5Mw1FiP31HyDhW0g==","signatures":[{"sig":"MEUCIFgduHPK48aybwA2G0dVHe6TZn74APPDQoNPSMnHs+1pAiEA2sjkYAuCqrBmPViFVICPnEf1qarMSwwlAw6bx32mtUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":913383},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"3ed9f50a39c278efb68463b3780125360fc895fe","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:05e716cf-0bba-4a3e-ae44-d632520220ed"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.1_1786933376300_0.2743692112550773","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adam91holt/grokbot-sdk","version":"0.1.2","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.2","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"b169780fc42df8ad76e8584ffa905fa454289e8b","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.2.tgz","fileCount":149,"integrity":"sha512-gJS4WrM2A2h3R4PhPnLxa8w7ESD4886qy9nuHR4rMQ4T1QOFVKRr3wfgDL8FIIi1N2Jh/JAg1UIRU1p87UAMgQ==","signatures":[{"sig":"MEYCIQCXlleDQ8iJ9NPiHdyXk4lNqYYEOvvZ4BidxoRkMzECVwIhAPp0GhkU5R5z3Sxz5jHVMSaA15iFCf5M0bOSjDdHiRHm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":913383},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d7a25035975fece1aae95912b448a258c1ff2ad3","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:05e716cf-0bba-4a3e-ae44-d632520220ed"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.2_1786933813025_0.9292181712452499","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@adam91holt/grokbot-sdk","version":"0.1.3","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.3","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"4154d53afc67609f91519a625d4b4108daa65f1f","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.3.tgz","fileCount":149,"integrity":"sha512-na4aiCeHXaBZHL91IofnqmIMqSRm7AtJfW8b/ekzbmQYg7IhyI0+mVOVxmflkq5R3EbZiQrGMiMJm3k2JdKFcA==","signatures":[{"sig":"MEQCIHosX7gjaLAGSD8zdrIPgDaseQYqVYx/tli4BoyY5xsJAiAB1Z59cCio3EMXXZOIvWJm6Cj5UD0D4enCSZzM+uRYIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":913654},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1b323beb977cb06cb94aef9dbdc348c0e65e09bb","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:05e716cf-0bba-4a3e-ae44-d632520220ed"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git","directory":"sdk"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.3_1786934422435_0.6837901565724416","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@adam91holt/grokbot-sdk","version":"0.1.5","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.5","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"a511f94754b64ad714df6f8e2c8932cb1335886e","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.5.tgz","fileCount":149,"integrity":"sha512-xVxszAq1pVHY3s22syfomuppCizTkOSZ4bQ5SJWGf+WJ7eIsWKVY4tZX7i/j/nEpEiylxFqbj/PKwZDyIXlyFw==","signatures":[{"sig":"MEUCIQCeCUI+nI4ujj0rTpT1CSv8KYflja+GA0aIi69x1JmrDwIgVp9NRLkJj68EZ6bM+0hX/qSmSKiApNA0NW59r5Cpm0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":913654},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c94f59d950c4f6676644444674109e03e811f29f","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:175d2976-ec71-402b-912c-46991faa3892"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git","directory":"sdk"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.5_1786958855440_0.5034066632648544","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@adam91holt/grokbot-sdk","version":"0.1.6","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.6","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"2dcc73c28e605be3742663fc270a0956d8094e32","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.6.tgz","fileCount":154,"integrity":"sha512-gc6vrV3GnCMWCC1HiQPcpM74j0+TpzmMa/Kj1te4JwNjBCIdFN4MWnnyPyv0OcffWB41iixFimlw+2xriRR9Fg==","signatures":[{"sig":"MEQCIBymnzy5RHnWo4kaPY+J+vtDb7kbXHl6rVPVsxbCSOhpAiA3RjEgKScj6l0hohqtUSq2kKanxNTNL80jUxChIJXOvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":944422},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"0f7a6504dcd64bbf5a8b77812d800865492b6ca6","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:175d2976-ec71-402b-912c-46991faa3892"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git","directory":"sdk"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.6_1787047388214_0.8963506816893021","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@adam91holt/grokbot-sdk","version":"0.1.7","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.7","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"a48e3df5af715bb1753e91452ccb7e803d2325c5","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.7.tgz","fileCount":154,"integrity":"sha512-ByK8pHoOvLk6TQANMK7tuGJ0sPD96XZ786VoRBHIF3ICM/Hv5UWv1CAQhtqHrcbHwEIHQDKteW0KhP1MqGlTUg==","signatures":[{"sig":"MEQCIG2CYLuXBgyVARZz1Ws7RXtO5sk11tG8DZ7K/G1CImVPAiBL6oX3kurZFiWkh3iu4WGW19sDyxvxeAOADEHQ/NN3aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":948820},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"7057206c638c710c7db90f048b2b16d21476e42d","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:175d2976-ec71-402b-912c-46991faa3892"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git","directory":"sdk"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.7_1787047935485_0.977387573811024","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@adam91holt/grokbot-sdk","version":"0.1.8","keywords":["grok-bot","sand","gateway"],"license":"MIT","_id":"@adam91holt/grokbot-sdk@0.1.8","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"bin":{"grokbot":"dist/cli.js"},"dist":{"shasum":"7db61cee97de0fd2024602648973445124822c7d","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.1.8.tgz","fileCount":159,"integrity":"sha512-nuhpzqbKUJ68TGMfGkmqK3i8ApF8UmNJ1MAZX/B/jI++zuYD07ZyB8/v+buDDQEyPbaZLYVLvEpzpqwyQbh3Yw==","signatures":[{"sig":"MEQCIHe+BO2L0lVfaxbIEzGiQrcibs7/HQUvUVMRKd5X/tluAiAyqnQLDzXzLu+lE1bwh8lwFeY0DcZwBkh0xlmYQhzJKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":952028},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8867a8f38f782327573e824f6478f2adc367f179","scripts":{"cli":"node dist/cli.js","test":"node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.json","prepublishOnly":"npm run build && npm test","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:175d2976-ec71-402b-912c-46991faa3892"}},"repository":{"url":"git+https://github.com/adam91holt/grokbot-sdk.git","type":"git","directory":"sdk"},"_npmVersion":"12.0.2","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.12","typescript":"^7.0.2","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/grokbot-sdk_0.1.8_1787085684742_0.4130826138083634","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adam91holt/grokbot-sdk","version":"0.2.0","description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","type":"module","engines":{"node":">=22"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"bin":{"grokbot":"dist/cli.js"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","extract-manifest":"node --import tsx scripts/extract-host-manifest.ts","test":"node --import tsx --test test/*.test.ts","cli":"node dist/cli.js","prepublishOnly":"npm run build && npm test"},"keywords":["grok-bot","sand","gateway"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/adam91holt/grokbot-sdk.git","directory":"sdk"},"homepage":"https://github.com/adam91holt/grokbot-sdk#readme","bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"devDependencies":{"@types/node":"^26.2.0","tsx":"^4.23.12","typescript":"^7.0.2"},"gitHead":"c14347fa82d167b9a5984ec1baff56b2f074485a","_id":"@adam91holt/grokbot-sdk@0.2.0","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-8tYt4uhshVJXrBWIaStPyLI3yL5geFWAYgQApnreg0En5ogHEpNYMylxHITgsG7OVkCqoY7G+6yhZqMTyajWSQ==","shasum":"73a8ba1f6c53bad17d27c692bdce387a547719c3","tarball":"https://registry.npmjs.org/@adam91holt/grokbot-sdk/-/grokbot-sdk-0.2.0.tgz","fileCount":164,"unpackedSize":982225,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adam91holt%2fgrokbot-sdk@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBPTLHnNYrIsRhfVXM6tpvozoi4DdTLChOH/B2sRk9OiAiA6QmHn/ar5QW4sPZIz9ryiCF4eiofK8kj759lAyedtzA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:175d2976-ec71-402b-912c-46991faa3892"}},"directories":{},"maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/grokbot-sdk_0.2.0_1787104285529_0.43893201186459185"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T02:06:30.192Z","modified":"2026-08-19T01:51:26.051Z","0.1.0":"2026-08-17T02:06:30.499Z","0.1.1":"2026-08-17T02:22:56.490Z","0.1.2":"2026-08-17T02:30:13.176Z","0.1.3":"2026-08-17T02:40:22.602Z","0.1.5":"2026-08-17T09:27:35.604Z","0.1.6":"2026-08-18T10:03:08.392Z","0.1.7":"2026-08-18T10:12:15.632Z","0.1.8":"2026-08-18T20:41:24.893Z","0.2.0":"2026-08-19T01:51:25.679Z"},"bugs":{"url":"https://github.com/adam91holt/grokbot-sdk/issues"},"license":"MIT","homepage":"https://github.com/adam91holt/grokbot-sdk#readme","keywords":["grok-bot","sand","gateway"],"repository":{"type":"git","url":"git+https://github.com/adam91holt/grokbot-sdk.git","directory":"sdk"},"description":"TypeScript SDK for the live Grok Bot host gateway and sand-data disk stores","maintainers":[{"name":"adam91holt","email":"mail+npm@adamholt.co.nz"}],"readme":"# @adam91holt/grokbot-sdk\n\nTypeScript client for a Grok Bot host. Not a made-up HTTP API.\n\nTwo surfaces:\n\n1. Gateway (`GrokBot`) — live HTTP: `GET /health`, `GET /events`, `GET /avatars/<id>`, `POST /api/<command>`.\n   Command names come from `SAND_GATEWAY_COMMANDS` (checked in as an extracted manifest).\n   A small extracted manifest (`hostVersion`, command table, typed-wrapper input keys) is checked in so snapshot drift is visible; `bot.compat()` / `grokbot compat` compare live `getHostStatus()` to that manifest.\n2. Disk (`GrokBotDisk`) — readers for `sand-data` (default `/home/box/sand-data`, alias `/home/box/agent-data`; override with `SAND_DATA_ROOT`).\n\nPrefer the gateway whenever the host is running — it is the live, authoritative view, and the host owns watchers, dreaming metadata, and cross-shard memory merge. Disk readers work at any time (same computer, no token, no host process needed); use them to grep or bulk-scan files, to reach transcript JSONL / `store.db` / `search-index.db`, or when the gateway is unreachable.\n\nDisk memory writes match the host fact-line format, but they bypass the host. Prefer `getAgentMemories` or the host `update_state` tool when the host is running.\n\n`npm test` is dummy-only. Set `GROKBOT_LIVE=1` to add a live gateway smoke (health, host status, roster/MCP/listener counts — no tokens or chat text). CI runs `npm test` in `sdk/` without that env.\n\nThe public-facing overview lives in the\n[root README](https://github.com/adam91holt/grokbot-sdk#readme). This file is\nthe deeper API reference.\n\n<!-- Links in this file must be absolute. It ships as the npm page, and npm\n     rewrites relative paths against the repo root — `../README.md` became\n     /tree/README.md (a 404) before this was fixed. -->\n\n\n## Install\n\nRequires Node 22+ (CI uses Node 24).\n\n```bash\nnpm i @adam91holt/grokbot-sdk\n```\n\nIn this directory: `npm ci`, then `npm run build`, then `npm test`.\nCLI after build: `npx grokbot` or `node dist/cli.js`.\n\n```ts\nimport { GrokBot, GrokBotDisk } from \"@adam91holt/grokbot-sdk\";\n\nconst bot = new GrokBot();\nconst disk = new GrokBotDisk();\nconst health = await bot.health();\nconst agents = await bot.listAgents();\nconst id = agents[0] != null ? await bot.resolveAgent(agents[0].name) : undefined;\nconst memories = id != null ? await bot.getAgentMemories({ id }) : [];\nconsole.log(health.ok, agents.length, memories.length);\n```\n\nSend a prompt after listing:\n\n```ts\nif (id != null) {\n  const result = await bot.sendPrompt({ agentId: id, prompt: \"status only\" });\n  console.log(result.accepted);\n  const waited = await bot.sendPrompt({\n    agentId: id,\n    prompt: \"status only\",\n    wait: true,\n    timeoutMs: 60_000,\n  });\n  console.log(waited.status, waited.reply);\n}\n```\n\nHost `sendPrompt` is still `{ accepted: true }` — there is no host `wait` field or `waitForCompletion`. SDK `wait: true` (default false) polls the same `waitForIdle` signals after accept, then reads `getAgentTranscriptTail` for `reply`. `awaitingUserResponse` is status `awaiting-user`, not a finished reply. You can also call `waitForIdle({ id, timeoutMs, clientNonce? })` yourself.\n\nOne-shot helpers (create/clone → send → wait → `deleteAgent` in `finally`):\n\n```ts\nconst fresh = await bot.runOnce({ prompt: \"status only\" });\nconst cloned = await bot.runOnceFrom({ id: \"Ada\", prompt: \"status only\" });\nconst room = await bot.discussOnce({\n  agents: [\"Ada\", \"Bea\"],\n  prompt: \"status only\",\n});\nconst peer = await bot.sendAsAgent({ to: \"Ada\", message: \"status only\" });\n```\n\nReceipts include `reply` by default: the last assistant / `send-message` text from host `getAgentTranscriptTail` (or `getAgentTranscript`), captured before `deleteAgent`. That is not roster `lastMessagePreview`. Pass `includeReply: false` (alias `includeTranscript: false`) for metadata-only. No token counts. `runOnce` / `createAgent` always POST a non-empty `name` and a string `description` (mint `throwaway-<uuid>` and `\"\"` when omitted) so host `materializeSession` does not call `name.trim()` / `description.trim()` on undefined. `runOnceFrom` is host `duplicateAgent` → `manager.cloneAgent`: a full clone of `store.db`, profile (`\"<name> copy\"`), settings (`hiddenFromSidebar: false`), workflow enablement, avatar, and automations. Conversation is then cleared (`rewriteClonedAgentIdentity(..., false)`). `memory/` files are not copied. Groups cannot be duplicated. `runOnceLike` is a separate profile-only path (`createAgent` with copied name/description/title/purpose) — not a host clone.\n\n`discussOnce` clones each named agent (never the live roster rows), `createGroup`s those clones, `sendPrompt`s the group (the host runs the group orchestrator), waits until the group and every clone are idle, then returns the **full room** as `turns` / `transcript` — not `sendPrompt({ wait: true }).reply`. Snapshot happens before delete. Host `createGroup` reuses a room with the same member set; the helper treats that as an error. When `name` is omitted, the helper mints a unique throwaway group name so host `createGroup` does not call `name.trim()` on undefined. `awaiting-user` snapshots and keeps the room so a widget can be answered. Otherwise it `deleteAgent`s the group, then each clone. It does not `broadcastToAgents` or message the source agents.\n\n`sendAsAgent` is SDK-only inter-agent send. There is no host `sendToAgent` command (`POST /api/sendToAgent` is unknown). The helper mints a throwaway **bus** seat (`createAgent` with `isIntroductionSuppressed`, a `bus-<uuid>` name, and `description: \"\"`), `sendPrompt`s that seat to call the **SendToAgent tool** once toward `to` (name or id, resolved first), waits until the bus is idle (`waitForIdle` / the same signals as `sendPrompt({ wait: true })`), then `deleteAgent`s the bus unless `keepBus` is set. Pass `bus` or `from` to reuse an existing seat — that path does not create or delete. Default isolation is throwaway; live roster seats are touched only when those ids/names are passed as `to` / `from` / `bus`. Never `to: \"all\"`. Never `broadcastToAgents`. Receipt: `busId`, `targetId`, `accepted`, `status`, `elapsedMs`, `deleted`, optional bus `reply`. No tokens. No `waitForCompletion`. This survives Computer Update because it uses existing host commands only.\n\nRoutine automations on the live host are `{ type: \"cron\", schedule }` or event listeners (`slack`, `github`, …). A dated cron (`43 18 18 8 *`) is the host path that actually fires for a calendar time; host cron is Pacific/Auckland local (unless the host has `CRON_TZ=`). It annual-repeats and there is no disable-after-fire contract. `{ type: \"once\", at }` is an SDK helper only (`onceToDatedCron` / create-update translation to that dated cron in host-local fields). Create/update also append a short prompt footer telling the agent to delete the routine after it executes so it does not fire again next year. Cron-only and event-listener specs are not rewritten. Prefer ISO-8601 with a time and timezone; epoch ms must be `> 1e12`. Date-only and whitespace `at` are rejected. Do not put `once` in a group — the host would drop it and keep slack/etc. Unrelated to `runOnce` / `discussOnce`. The host must add `once` to its trigger allowlist before a true one-shot will exist.\n\n## Jobs (decide-only)\n\nA job JSON file is the contract. `submitJob` / `runJob` (also `grokbot job submit <file.json>`) clones the named seats, waits until idle, and writes a packet (status + recommendation + turns) under `GROKBOT_JOBS_DIR` (default `$TMPDIR/grokbot-jobs`). It does not write into sand-data agent folders. There is no host job API and no `waitForCompletion`.\n\n```ts\nimport { submitJob, validateJob } from \"@adam91holt/grokbot-sdk\";\n\nconst job = validateJob({\n  schema_version: 1,\n  job_id: \"job-recommend-sample\",\n  idempotency_key: \"sample-recommend-1\",\n  goal: \"Recommend whether to add a job file.\",\n  done_when: \"The packet has a one-sentence recommendation.\",\n  seats: [\"Ada\"],\n  on_awaiting_user: \"stop\",\n});\nconst record = await submitJob(bot, job);\nconsole.log(record.packet.status, record.packet.recommendation);\n```\n\n- `isolation=clone` (default) + one seat → existing `runOnceFrom`. Several seats → existing `discussOnce` (throwaway room of clones). `isolation=room` always uses `discussOnce`. The room path always sends a non-empty group name derived from `job_id` (host `createGroup` crashes when `name` is omitted). Live source ids are never put in the group.\n- `compat()` runs first when the client has it. A mismatch is recorded on the packet; the run continues. No negotiate API.\n- `mode=implement` is accepted and stored. v1 does not apply, open PRs, run `test_command`, or write memories. `actions_allowed` empty means no implement, ever. Packet `apply` is allowed only when mode is implement and `actions_allowed` is non-empty — v1 still does not fill or execute it.\n- Reserved `actions_forbidden` defaults: message people, publish, spend, delete, force-push, read/write secrets. Actions are free strings (no allowlist enum).\n- Same `idempotency_key` + same `goal` does not spawn a second live run when a job is already queued, running, awaiting-user, or done.\n- `on_awaiting_user` is `stop`. The packet is persisted; throwaway rooms stay if `discussOnce` already keeps them.\n- Schema: `sdk/src/job/job.schema.json`. Sample: `examples/sample-job.json`.\n\n```bash\ngrokbot job submit examples/sample-job.json\ngrokbot job show job-recommend-sample\ngrokbot job list\n```\n\nPrints packet metadata + turns (speaker + text) unless `--no-reply`. Never tokens or gateway secrets.\n\n## Cards\n\n`SendMessage` takes a `type` that decides what the user sees. An unknown type,\nor a shape the host rejects, is **discarded without an error** — the model is\ntold the call was queued and the user simply sees nothing. These builders emit\nthe exact payload the host expects and throw on the constraints it enforces, so\na mistake surfaces where it was made.\n\n```ts\nimport { choice, confirm, cursorAgent, secretRequest } from \"@adam91holt/grokbot-sdk\";\n\n// Multiple choice. The picked option's `value` comes back as the user's reply,\n// so it replaces asking in prose and parsing the answer.\nchoice({\n  prompt: \"Enable the remaining tools?\",\n  helpText: \"CreateAgent lets an agent sign on a new crewmate.\",\n  options: [\n    { label: \"Enable\", value: \"Enable all three\", style: \"primary\" },\n    { label: \"Leave blocked\", style: \"danger\" },\n  ],\n  allowCustom: true,\n});\n\nchoice({ prompt: \"Ship it?\", options: [\"Ship\", \"Hold\"] }); // bare strings are fine\nconfirm(\"Restart the host?\");                              // yes/no shorthand\ncursorAgent(\"bc-…\");                                       // Cursor run card\n\n// Ask for a credential through a masked input.\nsecretRequest({\n  label: \"Slack bot token\",\n  connector: \"slack\",\n  field: \"token\",\n  description: \"Starts with xoxb-\",\n});\n```\n\nConstraints, all enforced at build time rather than lost at delivery: `prompt`\nand at least one `label` are required, there is a hard ceiling of\n`MAX_CHOICE_OPTIONS` (6), and `style` is `default` / `primary` / `danger`.\n\n`dismissOnMoveOn` auto-dismisses the card once the user sends a newer message\nwithout answering — use it only for questions that go moot, never for a decision\nyou still need. A dismissal is reported as a decline: treat it as no, and do not\nre-ask.\n\n`secretRequest` is how you ask for a token. The value goes straight to the\nconnector's per-agent credential file and never reaches the agent, the\ntranscript, or the chat — you only learn that it was provided. There is\ndeliberately no parameter for the value itself, so this builder cannot carry a\nsecret even by mistake. Never ask for a credential in a normal message: a token\npasted into chat is stored in the transcript and cannot be un-sent.\n\nA Cursor run does **not** render its card automatically. Send `cursorAgent(bcId)`\nonce the launch returns an id, or the user is left with a bare URL.\n\n## Security\n\n- Gateway token lives in `sand-data/gateway.json` (or `SAND_GATEWAY_TOKEN`). Loaded at runtime, kept in memory.\n- Never log, print, commit, or embed the token, host-secrets, or connector credentials.\n- `gateway.json`, `.env`, and `host-secrets.json` are gitignored. The token must never land in git.\n- Transcripts and `store.db` entries are sensitive. CLI prints metadata unless `--raw` (then it warns). `run-once` prints `reply` unless `--no-reply`. `discuss` prints the turn list (speaker + text) unless `--no-reply`.\n- `grokbot discovery` / `bot.discovery()` expose `hasToken` (boolean) only — never the token.\n\n## Disk vs gateway\n\n- Live list / prompt / interrupt: `GrokBot`\n- Health / host status / egress: `health()` / `getHostStatus()` / `isEgressTunnelAvailable()`\n- MCP / listeners / box store: `listBoxMcpServers()` (default lists every box server) / `getListenerIntegrations()` / `getBoxStoreStatus()`\n- Name or id: `bot.resolveAgent(\"Ada\")` and typed methods that take `{ id }` accept a roster name or id. The host still receives `{ id }`. `sendPrompt` keeps the host field name `agentId`.\n- Bounded open (also switches the active agent): `openAgentWindowed()` / `openAgentTail()`\n- Memories while host is up: `getAgentMemories`\n- Memories / profiles without a running host or token: `GrokBotDisk` (same computer only)\n- JSONL scan: `GrokBotDisk.readTranscript` (skip `sand-subagent-*`)\n- `store.db` / blobs: `openStore(id)`, `getBlob` only\n\nEnv: `SAND_DATA_ROOT`, `SAND_USER_DATA_DIR`, `SAND_GATEWAY_TOKEN`, `SAND_HOST_PORT`, `SAND_GATEWAY_BIND_HOST`, `GROKBOT_GATEWAY_URL` (alias `SAND_GATEWAY_URL`), `GROKBOT_JOBS_DIR` (job JSON store; default `$TMPDIR/grokbot-jobs`).\n\nUnary gateway calls time out after 30s unless you pass `timeoutMs` or an `AbortSignal`. SSE `events()` stays open unless you pass one of those explicitly.\n\n## Local vs remote\n\n**Local** (this computer, the Grok Bot host): omit the URL. The SDK reads `sand-data/gateway.json` and rewrites wildcard bind hosts (`0.0.0.0` / `::`) to `127.0.0.1`.\n\n```ts\nconst bot = new GrokBot();\n// or, if you want to be explicit:\n// GROKBOT_GATEWAY_URL=http://127.0.0.1:1340\n```\n\n```bash\ngrokbot health\ngrokbot discovery\n```\n\n**Remote** (any reachable host): there is no local `gateway.json`. Point at the host and pass the token in the environment — never commit it, never log it.\n\n```bash\nGROKBOT_GATEWAY_URL=http://your-host:1340\nSAND_GATEWAY_TOKEN=...   # copy from the host's gateway.json; do not git this\n```\n\n```ts\nconst bot = new GrokBot({ gatewayUrl: \"http://your-host:1340\" });\n```\n\n```bash\ngrokbot discovery   # public fields only; hasToken is a boolean\n```\n\n`SAND_GATEWAY_BIND_HOST` + `SAND_HOST_PORT` still swap host/port without a full URL.\nThe URL wins over `gateway.json` host/port/scheme. Token still comes from `SAND_GATEWAY_TOKEN` or `gateway.json`.\n\n## Destructive commands are not sugared\n\n`resetForeverBox`, `clearBoxStoreNow`, `deleteAgents`, `updateHostNow`, plus channel / secrets / webauthn commands, exist on the host table but not as first-class methods.\nThey require `allowUnsafeCommands: true` or `bot.commandUnsafe(...)`. `command()` does not turn a missing body into `{}`. Unknown non-unsafe host names are still allowed.\n\n## CLI\n\nThe CLI uses the same discovery as `new GrokBot()`. If `GROKBOT_GATEWAY_URL` is set, it wins.\n\n```bash\ngrokbot health\ngrokbot discovery\ngrokbot status\ngrokbot compat\ngrokbot agents\ngrokbot memories <agentIdOrName>\ngrokbot workflows\n```\n\n`health` prints `baseUrl`, `ok`, `busy`, `activeAgentId` — never the token. `discovery` prints the public discovery view (`baseUrl`, `connectHost`, `hasToken`, …) and never the token. `status` adds `hostVersion`, `capabilities`, and `egressTunnel`. `compat` prints a host-contract verdict (pinned vs live `hostVersion`, known capabilities, typed wrappers still in the extracted command table) and never tokens. If discovery fails (no `gateway.json` and no URL/port), they print the local vs remote env vars to set. `agents` prints name + id only. `workflows` lists disk workflow slugs / names / descriptions — not SKILL.md bodies.\n\n```bash\ngrokbot send <agentIdOrName> <prompt...>\ngrokbot run-once [--from <idOrName>] [--no-reply] <prompt...>\ngrokbot discuss --from <idOrName> --from <idOrName> [--no-reply] <prompt...>\ngrokbot send-as --to <name-or-id> [--from <name-or-id>] [--keep-bus] [--no-reply] <message...>\ngrokbot transcript <agentIdOrName> [--tail N] [--raw]\ngrokbot automations [--all]\ngrokbot tasks <agentIdOrName>\ngrokbot interrupt <agentIdOrName>\ngrokbot mcp\ngrokbot listeners\ngrokbot digest\ngrokbot job submit <file.json>\ngrokbot job show <job_id>\ngrokbot job list\n```\n\n`tasks` / `mcp` / `listeners` print metadata only (ids, status, counts) — no prompts, no connect URLs.\n\n`run-once` prints a receipt with `reply` (last assistant / send-message text from the host tail, not roster `lastMessagePreview`). `--no-reply` is metadata-only. Never tokens. Without `--from` it `createAgent`s with `isIntroductionSuppressed`, a minted name when `--name` is omitted, and `description: \"\"`. `--from` uses host `duplicateAgent` (full clone, not persona-only; `memory/` is not copied). The clone/temp agent is `deleteAgent`d afterwards unless `--keep-on-failure`.\n\n`discuss` clones each `--from`, creates a throwaway group, sends the prompt to that group, and prints the full turn list (speaker + text) before deleting the group then the clones. `--no-reply` hides bodies. `awaiting-user` keeps the room. Never tokens. Never messages the source agents.\n\n`send-as` mints a throwaway bus seat (or reuses `--from` / `--bus`), prompts that seat to call the SendToAgent tool once toward `--to`, waits until idle, then deletes the throwaway unless `--keep-bus`. There is no host `sendToAgent` command. `--no-reply` is metadata-only. Never tokens. Never `to=all`.\n\n`digest` is a read-only summary: health, host status/settings, roster (no chat previews), memory / store.db / transcript counts, automations (name, schedule, lastRun — not prompts), listeners, box store, and outline thinking `durationMs` when the host sent one. It never prints tokens, `gateway.json` secrets, chat bodies, or memory dumps. One line notes that the host API does not expose token usage.\n\n`job submit` validates a job file, clones seats via `runOnceFrom` / `discussOnce`, and writes the packet under `GROKBOT_JOBS_DIR`. Decide-only: it does not implement, even when `mode` is `implement`. `job show` / `job list` read those files. `--no-reply` hides turn bodies. Never tokens.\n\nAgent arguments accept a name or id (`grokbot send Ada \"status only\"`).\n\n## Layout\n\n```\nsrc/gateway/  client, discovery, command names, extracted host-manifest\nscripts/      extract-host-manifest (optional; needs a local host snapshot, not in this repo)\nsrc/disk/     agents, memory, transcripts, store, automations, workflows, search-index\nsrc/job/      versioned job schema + decide-only disk runner\nsrc/cli.ts\nexamples/     list-agents, send-prompt, dream-scan, sample-job.json\n```\n\n`npm test` is dummy-only. Host-bundle citation tests skip when `host/host-main.cjs` is not present (this public repo does not ship the host). `npm run extract-manifest` can refresh the checked-in manifest if you have a local host snapshot.\n","readmeFilename":"README.md"}