{"_id":"@aperoc/toolkami","_rev":"4-1920bff5dcc6b278817d33921dbfaa2e","name":"@aperoc/toolkami","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@aperoc/toolkami","version":"0.1.0","license":"MIT","_id":"@aperoc/toolkami@0.1.0","maintainers":[{"name":"aperoc-toolkami","email":"admin@aperoc.com"}],"dist":{"shasum":"1bb1f75dfa8ef52768215b38fea72c9247e4a6e7","tarball":"https://registry.npmjs.org/@aperoc/toolkami/-/toolkami-0.1.0.tgz","fileCount":11,"integrity":"sha512-M6MZwMAULfrpDgjMRoo/e9NGaTSr7q0AhPmT3Q/Le6IBI1eUPBTQH8+OQlz0xoWOIiiQEe1eZGO7UCfX5GmGow==","signatures":[{"sig":"MEUCIACC4ohBefT3vMloda8XZ3JW90hUHdDP7XGEnjSsjCIdAiEAwt2bVtFMEJN2L2UUeuKOlXKs/aBKL8vHtV4Wioee5Vw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26648},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a331439454e2cd65cfd14b09ad249812c3a9b80f","scripts":{"build":"npm run proto:generate && npx tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run clean && npm run build","test:e2e":"npm run integration:test","typecheck":"npm run proto:generate && npx tsc --noEmit -p tsconfig.json","proto:generate":"npx buf generate ../../.. --template buf.gen.yaml","integration:test":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx test/e2e.ts","example:roundtrip":"npm run integration:roundtrip","integration:roundtrip":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx examples/roundtrip.ts"},"_npmUser":{"name":"aperoc-toolkami","email":"admin@aperoc.com"},"_npmVersion":"11.9.0","description":"TypeScript client for the local toolkami gRPC daemon","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@grpc/grpc-js":"1.14.3","@bufbuild/protobuf":"2.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.21.0","ts-proto":"2.11.5","typescript":"5.9.3","@types/node":"25.5.0","@bufbuild/buf":"1.66.1"},"_npmOperationalInternal":{"tmp":"tmp/toolkami_0.1.0_1773483660223_0.039512240446039515","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aperoc/toolkami","version":"0.1.2","license":"MIT","_id":"@aperoc/toolkami@0.1.2","maintainers":[{"name":"aperoc-toolkami","email":"admin@aperoc.com"}],"dist":{"shasum":"dd42cb9e8b5795a849993e5fa94f0006e2125483","tarball":"https://registry.npmjs.org/@aperoc/toolkami/-/toolkami-0.1.2.tgz","fileCount":17,"integrity":"sha512-dP1mOEqks/DZPYr7n/p2W1qEv2y8RiY9k9hI3kk1xPt9TxlpwwnwfNEzD0+wucxGhR/+FN2cREXgyrrNwXRmXA==","signatures":[{"sig":"MEUCIGuoUXtJGKbWjL12FbFu5R03x3Zp/v4Z48Rs1EmnzrKDAiEA8kmWmm6AjDHyo1zYXv9ISCjIJtZEJswUy71A6JIxX3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33297},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a331439454e2cd65cfd14b09ad249812c3a9b80f","scripts":{"build":"npm run proto:generate && npx tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run clean && npm run build","test:e2e":"npm run integration:test","typecheck":"npm run proto:generate && npx tsc --noEmit -p tsconfig.json","postinstall":"node --input-type=module --eval \"import('./dist/install.js').catch((error) => { if (error?.code === 'ERR_MODULE_NOT_FOUND') { console.log('toolkami postinstall skipped before build'); return; } throw error; })\"","prepublishOnly":"npm run build && node ./dist/release_check.js","proto:generate":"npx buf generate ../../.. --template buf.gen.yaml","integration:test":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx test/e2e.ts","example:roundtrip":"npm run integration:roundtrip","integration:compose":"docker compose -f ../../../test/integration/sdk/toolkami/compose.yaml up --build --abort-on-container-exit --exit-code-from sdk-smoke","integration:roundtrip":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx examples/roundtrip.ts"},"_npmUser":{"name":"aperoc-toolkami","email":"admin@aperoc.com"},"_npmVersion":"11.9.0","description":"TypeScript client for the local toolkami gRPC daemon","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@grpc/grpc-js":"1.14.3","@bufbuild/protobuf":"2.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.21.0","ts-proto":"2.11.5","typescript":"5.9.3","@types/node":"25.5.0","@bufbuild/buf":"1.66.1"},"_npmOperationalInternal":{"tmp":"tmp/toolkami_0.1.2_1773487351942_0.10067669665802548","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aperoc/toolkami","version":"0.1.3","license":"MIT","_id":"@aperoc/toolkami@0.1.3","maintainers":[{"name":"aperoc-toolkami","email":"admin@aperoc.com"}],"dist":{"shasum":"23d6cd08fb8455375f12e1f3f16187c1ab6c1d7b","tarball":"https://registry.npmjs.org/@aperoc/toolkami/-/toolkami-0.1.3.tgz","fileCount":29,"integrity":"sha512-vH/95mdOB1NwYvRQAMK/ku3jBY1w6P3uIY5C/tt6EFWbdOJlpOk7vXrWNREcpY2ZAGbFYbKrM2CKlQTPJlB3Aw==","signatures":[{"sig":"MEQCIAtaZdtAks7CcrAUGU38Qn3lfX/ZWIH2zCc4sJl70V3iAiBLXRo5AM5RSks6mHYwSlT4aJ1RMdCBtX9H2t3w7Jfc1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97318},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e334d067e61515b4438834be716af342d7c963b2","scripts":{"build":"npm run proto:generate && npx tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run clean && npm run build","test:e2e":"npm run integration:test","typecheck":"npm run proto:generate && npx tsc --noEmit -p tsconfig.json","postinstall":"node --input-type=module --eval \"import('./dist/install.js').catch((error) => { if (error?.code === 'ERR_MODULE_NOT_FOUND') { console.log('toolkami postinstall skipped before build'); return; } throw error; })\"","prepublishOnly":"npm run build && node ./dist/release_check.js","proto:generate":"npx buf generate ../../.. --template buf.gen.yaml","integration:test":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx test/e2e.ts","example:roundtrip":"npm run integration:roundtrip","integration:compose":"docker compose -f ../../../test/integration/sdk/toolkami/typescript/compose.yaml up --build --abort-on-container-exit --exit-code-from sdk-smoke","integration:roundtrip":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx examples/roundtrip.ts","integration:smoke_local":"./scripts/integration_smoke_local.sh","integration:smoke_published":"./scripts/integration_smoke_published.sh"},"_npmUser":{"name":"aperoc-toolkami","email":"admin@aperoc.com"},"_npmVersion":"11.9.0","description":"TypeScript client for the local toolkami gRPC daemon","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@grpc/grpc-js":"1.14.3","@bufbuild/protobuf":"2.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.21.0","ts-proto":"2.11.5","typescript":"5.9.3","@types/node":"25.5.0","@bufbuild/buf":"1.66.1"},"_npmOperationalInternal":{"tmp":"tmp/toolkami_0.1.3_1773550784110_0.24585705885002218","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aperoc/toolkami","version":"0.1.4","description":"TypeScript client for the local toolkami gRPC daemon","license":"MIT","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"engines":{"node":">=20"},"scripts":{"proto:generate":"npx buf generate ../../.. --template buf.gen.yaml","build":"npm run proto:generate && npx tsc -p tsconfig.build.json","clean":"rm -rf dist","prepack":"npm run clean && npm run build","postinstall":"node --input-type=module --eval \"import('./dist/install.js').catch((error) => { if (error?.code === 'ERR_MODULE_NOT_FOUND') { console.log('toolkami postinstall skipped before build'); return; } throw error; })\"","prepublishOnly":"npm run build && node ./dist/release_check.js","typecheck":"npm run proto:generate && npx tsc --noEmit -p tsconfig.json","integration:roundtrip":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx examples/roundtrip.ts","integration:test":"npm run proto:generate && npm --prefix ../../.. run daemon:build && npx tsx test/e2e.ts","integration:compose":"docker compose -f ../../../test/integration/sdk/toolkami/typescript/compose.yaml up --build --abort-on-container-exit --exit-code-from sdk-smoke","integration:smoke_local":"./scripts/integration_smoke_local.sh","integration:smoke_published":"./scripts/integration_smoke_published.sh","example:roundtrip":"npm run integration:roundtrip","test:e2e":"npm run integration:test"},"dependencies":{"@bufbuild/protobuf":"2.11.0","@grpc/grpc-js":"1.14.3"},"devDependencies":{"@bufbuild/buf":"1.66.1","@types/node":"25.5.0","ts-proto":"2.11.5","tsx":"4.21.0","typescript":"5.9.3"},"gitHead":"a86ab84752b7fbe92ced219cbafaf571eb3fd228","_id":"@aperoc/toolkami@0.1.4","_nodeVersion":"25.8.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-YyTidNP6oTZi5MmqoMX/TUOgnCsvUFFmyEWkRUvUGAZtlFxEKglNb9E6Vfghdth1RrT/bZPefP6shCjD7QjJHg==","shasum":"a6dd4bb2b595abec213b1b05b4722e9a8c9ee20c","tarball":"https://registry.npmjs.org/@aperoc/toolkami/-/toolkami-0.1.4.tgz","fileCount":33,"unpackedSize":175132,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCWQnGuU6iTSdbEhBwBFQJIXqMrjGfWOLv8RDR/ZFL/cwIhAIDDcRQjmxOIaQBec0e5Lxps0E/RJIJ5m0bRSK74nyaN"}]},"_npmUser":{"name":"aperoc-toolkami","email":"admin@aperoc.com"},"directories":{},"maintainers":[{"name":"aperoc-toolkami","email":"admin@aperoc.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/toolkami_0.1.4_1773650985362_0.2429181217485996"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-14T10:20:59.818Z","modified":"2026-03-16T08:49:45.631Z","0.1.0":"2026-03-14T10:21:00.411Z","0.1.2":"2026-03-14T11:22:32.087Z","0.1.3":"2026-03-15T04:59:44.263Z","0.1.4":"2026-03-16T08:49:45.495Z"},"license":"MIT","description":"TypeScript client for the local toolkami gRPC daemon","maintainers":[{"name":"aperoc-toolkami","email":"admin@aperoc.com"}],"readme":"# @aperoc/toolkami\n\nTypeScript client for the local `toolkami` gRPC daemon.\n\n## Install\n\n```bash\nnpm install @aperoc/toolkami\n```\n\nThe npm package auto-installs the Linux x64 `toolkami` daemon and `toolkami-guest-agent` during `postinstall`.\nUnsupported platforms fail fast during installation.\n\n## Usage\n\n```ts\nimport { createClient } from \"@aperoc/toolkami\";\n\nconst client = await createClient({\n  tcpAddress: \"127.0.0.1:50061\",\n});\n\nconst versionResponse = await client.getVersion();\nconst pingResponse = await client.ping(\"npm\");\n\nconsole.log({ pingResponse, versionResponse });\nclient.close();\n```\n\nThe client reuses an existing daemon at `tcpAddress` by default and auto-launches the packaged daemon when one is not already running.\n\n## Daemon Launch and NBD Permissions\n\nThe daemon requires read/write access to NBD block devices (`/dev/nbd*`).\n\n- Default behavior: `createClient(...)` reuses existing daemon first, then auto-launches if unavailable.\n- If your user lacks NBD permissions, auto-launch fails with an actionable error.\n- To disable auto-launch and require an already-running daemon:\n\n```ts\nconst client = await createClient({\n  tcpAddress: \"127.0.0.1:50061\",\n  autoLaunch: false,\n});\n```\n\n- To explicitly opt into privileged launch:\n\n```ts\nconst client = await createClient({\n  tcpAddress: \"127.0.0.1:50061\",\n  useSudo: true,\n});\n```\n\n## Spawn/Restore with Folder Mounts\n\n```ts\nimport { createClient } from \"@aperoc/toolkami\";\n\nconst client = await createClient({ tcpAddress: \"127.0.0.1:50061\" });\n\nconst image = await client.build({\n  dockerfileText: \"FROM ubuntu:24.04\\nWORKDIR /workspace\",\n  dockerfileBytesMax: 64_000,\n});\n\nconst spawned = await client.spawn({\n  imageId: image.imageId,\n  mounts: [\n    {\n      sourceHostPath: \"/abs/path/to/repo\",\n      targetPath: \"/workspace/repo\",\n      // default is read-only when omitted\n    },\n  ],\n});\n\nconst snap = await client.snapshot({ instanceId: spawned.instanceId });\n\nconst restored = await client.restore({\n  snapshotId: snap.snapshotId,\n  mounts: [\n    {\n      sourceHostPath: \"/abs/path/to/repo\",\n      targetPath: \"/workspace/repo\",\n    },\n  ],\n});\n\nconsole.log(restored.instanceId);\nclient.close();\n```\n","readmeFilename":"README.md"}