{"_id":"@visorcraft/idlehands","_rev":"140-0ac61329c0ba59fd5121b406c0f52174","name":"@visorcraft/idlehands","dist-tags":{"latest":"4.4.4"},"versions":{"0.9.1":{"name":"@visorcraft/idlehands","version":"0.9.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@0.9.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"f4c8fc01e713905dc5bb1c47888f54df704a98ee","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-0.9.1.tgz","fileCount":197,"integrity":"sha512-xjGIUNHgLKX8q2tBE2fOLNDeK8lMT22r3aZasKXe2eqSzqMQFeomiau4YfsOvY0mvtUBtSD8oCgIHboJeprXqg==","signatures":[{"sig":"MEYCIQCFeUvHTHQgMUGbsR2mdYVMUP2+CAqZ0+6o+6kgLR2vWQIhAMUFtY+lZEzdPd5GQu61OjN1uV49R8dvRt2knkkCA0oD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2020502},"type":"module","engines":{"node":">=24"},"gitHead":"b8953c6a05dc406194843c930ef84946ad00357a","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"visorcraft","email":"thomas@visorcraft.com"},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.10.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_0.9.1_1771452062675_0.34901254431489215","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@visorcraft/idlehands","version":"1.0.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"a029ea221218dd49bf715ec43d5545f41e99748f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.0.tgz","fileCount":197,"integrity":"sha512-7Ve4ZmWyvfYAp1mkB7kLh+jfx1tOFBuSbRiIiey4//VIiEcdqo66hsZj0t1UUCvMOlLR76BHwM6piLbI2LHR1g==","signatures":[{"sig":"MEQCIGZDgfRyzWFPDtZVDoXIIyd9R881oAX8VNmv04jdApk+AiB8tKeIxSyk+CwKZ/4fISFJNxjlH9iHF2COZctYw+OSXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2020487},"type":"module","engines":{"node":">=24"},"gitHead":"5c03ec32f1285a9a80829bff340fb1112589bdaa","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.0_1771453077270_0.8306610325086048","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@visorcraft/idlehands","version":"1.0.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"b0be3518d92664e6e980f04b7eb8333980ea5862","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.1.tgz","fileCount":197,"integrity":"sha512-xzMbxZbcbLfqJfXLifsMCNcwrQL7AXwWZzH3vbJyWe2nN84TGkUhZC64XJWIWv6forEVv/LOJTFEbQLGJgdReA==","signatures":[{"sig":"MEUCIQDTLmQiVIk9UjKCj2cSqtLRDooPRHE89AGZ6BZCJJgbgwIgasxGRiq7GgZH22HdDJUyMi9UMMFbSssCj9vtTaHustI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2037414},"type":"module","engines":{"node":">=24"},"gitHead":"7176fdf47736ba41085db4bdb5000d032f8879b0","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.1_1771459617415_0.8106022204742516","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@visorcraft/idlehands","version":"1.0.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"9d8290f5ed0a390bc64be327624e0eb0473cf9fd","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.2.tgz","fileCount":197,"integrity":"sha512-fItUWczs7i2rh+EZlTZU9HrIwrn0IrXxEgokIYJH0P3gk+qnYG/xiiIJUE51TgCinUexxP4maYyClDKkx6aUEA==","signatures":[{"sig":"MEUCIHjV9rVThbg6G0+jJctEezOBhVkI2v5eJ8VaJ0+GBpTuAiEAj8o1Zp/a79iwa37WBkFiqS01sLYg5uqPyW5ZpqDr+Xo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2046550},"type":"module","engines":{"node":">=24"},"gitHead":"4a0c36959d292fbb4714bf8cdd8686041b5108ee","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.2_1771465832381_0.042900440255133176","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@visorcraft/idlehands","version":"1.0.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"8ed58e6711a76cc5d5827ab8c86a1c8d00e213d7","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.3.tgz","fileCount":197,"integrity":"sha512-uQsGtz19ltJcnOmd470JCEcT9dHO8nLCF5h+P2fIVr1QghWpJQWiFAk8flMRVARh7ZdGySSje78pavgSaEnfRQ==","signatures":[{"sig":"MEUCICM9VF8fQhky2OIBHYJU5Qf3iTh/mltU2M7q3ouJZH9WAiEApbcj9ia8J4PKhWK2L5XYUFB+qIGy4yCqfkdydvBFOyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2046470},"type":"module","engines":{"node":">=24"},"gitHead":"9c431ba7c0b29bed593d7451007c130094a56314","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.3_1771466831288_0.827416665087892","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@visorcraft/idlehands","version":"1.0.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"ed9a7b65b14bf7c46592d94374a530369d248fcb","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.4.tgz","fileCount":197,"integrity":"sha512-cYE4TEGfMp3ncdTJ5f3h9bi7vs3P3h0pe23Cd5HfJKPeVyoedvE//kubklapruSLpDF5PdP0Y4kffjdmgDwktg==","signatures":[{"sig":"MEUCIQDEwRtS5A25/VbHjnwls9Lz2BKiiCNHZcAYvJSPxqxXHQIgMcsKiV3UX5m41fHe5dSLV9WNkbtlhwBfabnIl/D7yEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2060566},"type":"module","engines":{"node":">=24"},"gitHead":"7a5e00614cb4f798f1366be7d675a61daea71c59","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.4_1771473795867_0.9021755912031129","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@visorcraft/idlehands","version":"1.0.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"5896dcce2711f4d5125b2b925209dac3b15c3fce","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.5.tgz","fileCount":197,"integrity":"sha512-g0/HvsDKLGSIlMhqBQazqjaNjtFKI6KZCaFzSDO1HtTabSLEDIery5JBDrOEp8tzobKSyR5s6K4qyPApytAkSw==","signatures":[{"sig":"MEUCICSOvSH5lQOO4twEiwXwARvZlQfCXB+Io06exhUh/cNBAiEAkJOswIBEIzM6VHPDpGk6g0gbZNl6i3Iys9EzYL/e0Q4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2060584},"type":"module","engines":{"node":">=24"},"gitHead":"80abb62625bb3d5e9fb29e4b3afa42c378f7f3cc","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.5_1771474698620_0.6293157333367567","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@visorcraft/idlehands","version":"1.0.7","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"593d6efa99a60c9c903f376ff748a412f9625d6c","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.7.tgz","fileCount":197,"integrity":"sha512-vVFq8FhXC+s9RSG3GPNlAjKt7eTDPQrNCoi2MvjN68pJJqQZ3gVaa0MC293JESmE2BEE5FD/XC9iv64DndqOhw==","signatures":[{"sig":"MEYCIQCeroD1/VJqCaO1+sFzoDxGmJpLd369hqNBCXw0mXvtVAIhAN5sLFS+LQ0E4uNKYzErxdnw9OPlkZFD4H+JbQsomZJv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2068381},"type":"module","engines":{"node":">=24"},"gitHead":"7a7237e62239f3fbb4ef86504fbb492558485444","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.7_1771477866053_0.5639412833989457","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@visorcraft/idlehands","version":"1.0.8","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"266715732e941e3969709d0c54f58e74c731085b","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.8.tgz","fileCount":197,"integrity":"sha512-WW9DrxJ9LiXPS+B1pa+amYgMAMbSL/NO3AZQhF+5nN1F2w7pTT7Fb4DxNgOl2n+rYd91VOwdaFt4YvxR/hGdfg==","signatures":[{"sig":"MEUCIQDsVhhNgw9ciuK1e9FMbwMOgrA5SxACQU/omTchWvcphgIgRVHzTKhwZtWcJ7nxy4OM5nsdkJaYrK/JOzRoskFSCDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2173328},"type":"module","engines":{"node":">=24"},"gitHead":"c1cac804a33998c48b0401a5201f310b7b46e345","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.8_1771524508334_0.15100633629474314","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@visorcraft/idlehands","version":"1.0.9","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.0.9","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d79c1858724cc42f015f0a4e32371e92206f997f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.0.9.tgz","fileCount":197,"integrity":"sha512-YOjTw38YHLag4C87Vmwf+UrL6UTow3hJQlg1LBM3wKts+PjH+T6y1nso/6qW3oKk1Ftsx4p/DfhHDhXHVMfKpQ==","signatures":[{"sig":"MEUCIFEx3WjNoW0Va/qf7vB4zbhIWNLZbBzr/2Eqfm4Ud3ktAiEAmGpIg52ufrth5ug9k0Ri79oE+v0Bevpbm5Y1LoNFJFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2183239},"type":"module","engines":{"node":">=24"},"gitHead":"385170d3b15984b79c34a02ff2d0d96ffe2cbcef","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.0.9_1771548697953_0.701462279568388","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@visorcraft/idlehands","version":"1.1.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"8738b1acc814d7c93933bd02077b71e9b0f4027a","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.0.tgz","fileCount":197,"integrity":"sha512-B5GZfpctw4jmftaPoLZbeCnrM7CO4inQuZsR8DThN9g+/7s6DijJz7BnJz0oJhAIH91wSoBvtc+ARaXuIwby7g==","signatures":[{"sig":"MEQCIHK8LdqfqMNvcSWqLuntf9bXHCFMKC4sTzLQ9lXmVqvzAiBGSW8rYO9D58M/3OYhu9R+a9eErBmKXcWiiJvyo7SaOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2227893},"type":"module","engines":{"node":">=24"},"gitHead":"af13433ff2b3fbe3209473699c0c9c4d8cfa9912","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.0_1771604547160_0.2560890572818053","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@visorcraft/idlehands","version":"1.1.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c25cb0f06f95a48a8fc838be164023c7601605e0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.2.tgz","fileCount":197,"integrity":"sha512-T55p/79newy0zXN3jjPBYld3X1/UPPf6Q+kShYuL0VRyECZB6+SNfQAw6b/Wg+wSOrTT9hYVXRSOF7PRxgQy9A==","signatures":[{"sig":"MEQCIHVBv5z5EJVfGsGEGVLqxf3jzjzWHBN5ffzEPGPieOCcAiAepqdpgi+PQekUBwtgKE3MUF4NRvMlatif3eAaiPBxsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2246901},"type":"module","engines":{"node":">=24"},"gitHead":"73f4e14662b41c19df390824cf506cbdb03f04fb","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.2_1771625320282_0.38019703410051076","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@visorcraft/idlehands","version":"1.1.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"05a236d5e62a867b920b00148cf43739707e1818","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.3.tgz","fileCount":197,"integrity":"sha512-G2LnLd20HEwfvI/vjDY8XdUA2ezizWYEMc6g+p0JchHZRxJTRG7hw1zrLKWrZSqNG6OXrCjFVIS0gkDBtaKT8g==","signatures":[{"sig":"MEQCIBfO8iTnukJosIid2dBpeB2qKwt/Hr3uyGsAu/2aie4OAiAfOQnp8ejigQuJkfpusPn1cotcGq2gVTwtDKe/5crS8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2249146},"type":"module","engines":{"node":">=24"},"gitHead":"96ca5dd4bab110842f019e107cac920dfc5cbf57","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.3_1771629577402_0.4318394723247616","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@visorcraft/idlehands","version":"1.1.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"601ce8128daebe200ed8475d9ee1de5a5f7b1470","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.4.tgz","fileCount":197,"integrity":"sha512-siAdAD7h6doV1GTHY46d5kPYqEksRmYVKIggPZbgiaTY8XiGrRohlZD48vQFfN9+/IvGOK/1W+Zn9/Ompbq73g==","signatures":[{"sig":"MEUCIHvz7z7hSDG1GACUWOjAwOXLoAgmCsexTzStKQ6iW/lrAiEArLcf+31qIIX8MHbxD4zrXXh7zGMTemB0i7oPt8xrS4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2310977},"type":"module","engines":{"node":">=24"},"gitHead":"4be14ea2e6eae969e3fa309f7596ca87e10bc486","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.4_1771636366704_0.09184577851007991","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@visorcraft/idlehands","version":"1.1.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"b210f6e64c71d5ab9606c838443f9c115289e89e","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.5.tgz","fileCount":199,"integrity":"sha512-qrCQ9PoyZptvJZl+7QGUGgIcQhJwK62sdgGYKinsQsNGAosWpN582G84TM8I487YJfqqQtmPIdk0LoP7+6r78g==","signatures":[{"sig":"MEUCIQCMGlbSWkRjmIiOoLBKOpP1Ze4PPIP4jeqkKKc2UXRp/AIgQGN9tjbZHGtlFNf+iVIH/MWU+yJVRv2XS/obATTOg04=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2311147},"type":"module","engines":{"node":">=24"},"gitHead":"326fbba012162b8fdf96a0ab0a42a6e161cf29f3","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.5_1771644542770_0.3305545400436478","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@visorcraft/idlehands","version":"1.1.6","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"2f2731fe85feaff7880c08ebd9b280ff2d9b60af","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.6.tgz","fileCount":201,"integrity":"sha512-1QlDo5rm4aRe9nBx0VB3/UdWDzFwxr07aFIPqlvsChYOWMz8F3v1ZLQYg3godhd8Kt4g5Y8PDCYEL5u6B7C1AA==","signatures":[{"sig":"MEYCIQCQ8OW0uZkfp9j+gPkeQ9Hy7Dl4RaksM6+4UZ9nJHn9YwIhALZO62Ww3afmKB9gih9XLsiJZ9Vhu2bOH/s0S21ncDAy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2312309},"type":"module","engines":{"node":">=24"},"gitHead":"688b96f3c448567d462a0304a7af5fea0a8d4318","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.6_1771650202932_0.13340889779116338","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@visorcraft/idlehands","version":"1.1.7","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"167975dc082dfe5a133d17b1b48eb65df57098d9","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.7.tgz","fileCount":213,"integrity":"sha512-OKH4mLbFbM8j1LhdUGa54JRh9pSx6TVBgriR+6GwwvnMKoIVY6e384Ze+O9fRdR7tDsrFDPjSc4GHo+dRh9B8Q==","signatures":[{"sig":"MEUCIQDy35unDmRYTSGBl7U2XbCLx0NUWZ8biP/AtrzFZYPGMQIgaeqA/K5ZUkza0u6UxwvXMZamFt4WcsPgmPVfP7MjVdk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2413057},"type":"module","engines":{"node":">=24"},"gitHead":"2c08f8fcd65ec61389d0b64503c538f419447dde","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.7_1771682314558_0.20325554160691994","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@visorcraft/idlehands","version":"1.1.8","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"bd1f10c973c18b2bdf09741ba8a577582c7ee6df","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.8.tgz","fileCount":245,"integrity":"sha512-4f01VkxJlHhJyWOb4PO+7P0XSimCsV3qyKrn6xxlsG84sk/b9sLAODeqdO7eoZFT807tkhNx/NREQi2dmIEYCA==","signatures":[{"sig":"MEUCIDayMfWpKdNiA2pPSsgLECRKAc9JzBAZdR93OcPZFHNfAiEA6wH1Ig6kRptRwqrbgCWtMyOEzUajOmGQOz6mgt9HlP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2543510},"type":"module","engines":{"node":">=24"},"gitHead":"954d225f2848722df0da88d9a265a972b83efa8c","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.8_1771707214469_0.9892098241938532","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@visorcraft/idlehands","version":"1.1.9","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.9","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"f9bb662b336cb2472a80838d9454ba6f7cd8381d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.9.tgz","fileCount":251,"integrity":"sha512-5y5Y7iX6T+z05T2bClJqTBQjxs+SCA7ZpZvTqu9XWbni3OeP9+0xMoSRs9hF9yJSg/7KBCUzC6JoI0SkBhVAnA==","signatures":[{"sig":"MEUCIQCN85QqAk1Xez86G4mdjPzwUkNGmbmNEvilOAXCozsVOQIgZtm8EKWGY1kQBNWQtpobNtL29KYDylzhdL1wokh3Rt4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2619814},"type":"module","engines":{"node":">=24"},"gitHead":"5acf6e72250b87834916262d0002e600642f31da","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.9_1771717496677_0.4590176991873345","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"@visorcraft/idlehands","version":"1.1.10","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.10","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"dd322eb8b7b635f7e0d135ea424207f02c53dbfd","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.10.tgz","fileCount":251,"integrity":"sha512-7G3xd+ogrEh609L45zQOacdQC78uNZ2l+YCsMkiXI0rNvYFQ1PIsnRHT0vLzahI/tjONURTAo6YscAcXC5oKzA==","signatures":[{"sig":"MEYCIQCceuKzeaOB8oImvzbg20+5N2zZHL+tG7uFDp5bHhEzigIhAI1pxsQsktXOSfPAcTksuY6K5OaawhrtqVNZRU2dpGhF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2624629},"type":"module","engines":{"node":">=24"},"gitHead":"9b5f2850b559df57ab9663e5330d59dc48832b25","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.10_1771721797887_0.3029131423141207","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"@visorcraft/idlehands","version":"1.1.11","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.11","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"caa7c3e11369a569d9ea208e386bc77fe4ba02fc","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.11.tgz","fileCount":253,"integrity":"sha512-FrofEe2v3849BjWhG2a+phElbE+aXfdAy4GoRHYYOFszXuWgUIAx0bF2jnSyyQqSRSbGfxqGQIZGoKUxYgXXyw==","signatures":[{"sig":"MEYCIQDHU16onyYq2AUvCTFGdDWEW2MKgFVHE3ChLk/H6iJScgIhAOMccRlA26sBdLa2Lxlyl1sA6tACT69EOhDAN9u0YzaU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2653488},"type":"module","engines":{"node":">=24"},"gitHead":"bc3170ad1b63ad5cd812e7597e153b4196bce094","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.11_1771724904319_0.46827562165461845","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"@visorcraft/idlehands","version":"1.1.12","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.12","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c745232599c63a9019b9b04cec9959cf02d151c4","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.12.tgz","fileCount":255,"integrity":"sha512-PdZnl2wvVoCCpebN0PGJJW6gfN9q7nZL5n/7Z4tyer9c3fj6GARYV/nNi14lOQ1PdG5QxeUW591aTtfwegLyPw==","signatures":[{"sig":"MEYCIQDR3s9Tgtw0ql0eezGApjdSkBoPOL/TowC0EVmoDZysXwIhAOjrOk6VoDmoiJrjZApO9l7ntjP5BgT5zvHq+Rk1uTY6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2676550},"type":"module","engines":{"node":">=24"},"gitHead":"c091e364e924e99a3d3c8e0b543cce2ea7d4951f","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.12_1771732991137_0.37232750492522526","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"@visorcraft/idlehands","version":"1.1.14","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.14","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"23d9c04d453fae965aa2a9c2e5658c8ae2e727cb","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.14.tgz","fileCount":255,"integrity":"sha512-BqiWFjNPd6SulCvuC64I0wsGCyKzRkkxCsgioICDVUZbYqYctMZQQ1AdYyXdSMKrroYugh44JL/JrwqTmEI4jQ==","signatures":[{"sig":"MEUCIQDB5klltVtAwrdLT+ujHzEp5o76tETviN23YgRfL7qmSgIgcfHxL8/sSZly9hYesFA/vjnIi1fqj5812iuroGWHn0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2684342},"type":"module","engines":{"node":">=24"},"gitHead":"6ef2713e94046623c14f49d4e539e353f5fc88e3","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.14_1771739368214_0.29174729471850847","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"@visorcraft/idlehands","version":"1.1.15","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.15","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"2eea444c1c488a180dc07c554eccdfcc66ffe677","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.15.tgz","fileCount":255,"integrity":"sha512-KIUGmkHIBE/pus2aTXflvplnpo2smhEchSTrwz7cvARtWryejRg01C/VwQKGyap9NYlMM4LaQ9rV3lLKmwtJyQ==","signatures":[{"sig":"MEUCIQCn449oBWtyun1jRKESLi02hp/rtTmIb8pa13FAuVo/NwIgf5aDDdYdjbQvIMzUPzNKvUFq3kJ1Z2h1KZoihbJmSsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2688723},"type":"module","engines":{"node":">=24"},"gitHead":"cdb178416a8c6aba34813f4d245b1f18ef4dbe25","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.15_1771740843145_0.5823229808937584","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"@visorcraft/idlehands","version":"1.1.16","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.16","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"5ca9465ebfe5484d46e3db64e393aed4e08d65e4","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.16.tgz","fileCount":255,"integrity":"sha512-cXc5/m1Ne7Wm4eMSDlMhQrVsx0BncaVxO3R/dAz9xjMqFNQtTRT9k2CW5TmacZimfl7b610S1WV7QfSUHM2y/A==","signatures":[{"sig":"MEQCICdsPUImUo3P/n2eftFMYiRpmU6tH3hDWyPPPZwhPrwHAiAt/IulA8hwbMjlp4i3K6/4vN/3bWuPL1Lru7I8HwI2GQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2700118},"type":"module","engines":{"node":">=24"},"gitHead":"7f3fe9560bff367c27c1524ceb9bf9ff31c02e5a","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.16_1771747710218_0.41678703360243063","host":"s3://npm-registry-packages-npm-production"}},"1.1.17":{"name":"@visorcraft/idlehands","version":"1.1.17","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.1.17","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"f078ee18f2eb68fbae1b3a4f6bde124278b879ca","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.1.17.tgz","fileCount":255,"integrity":"sha512-Iok86ZAGLDJnbmsZB6JS4txZ4u1Mesjph5N0fEbK3Pkz77Hf1XiCptlPCrrTB2Oc7rXKsotKg9/JXXARIFVg1A==","signatures":[{"sig":"MEUCIEH4iVoP5V9Xbf5oHdhQLtAABOckKWwRLqEiNLWWjQ4aAiEA25207z7AadAACnTKvshRyLlFwezOxUkmw/hoMqjKGkA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.1.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2717602},"type":"module","engines":{"node":">=24"},"gitHead":"d2a2fd8e5ffd87b500c5b49e11118a5edfee4c11","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"node -e \"console.log('no lint configured yet')\"","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","prepack":"npm run build --silent","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.9","typescript":"^5.9.3","@types/node":"^24.0.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.1.17_1771750985957_0.43698922407285345","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@visorcraft/idlehands","version":"1.2.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"9aad112068717e902a7c2889f0846e71a9b1685f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.0.tgz","fileCount":267,"integrity":"sha512-27oNofKqZ7VIQwlD5oaPptvoJqb71LBsGGY7KyImVSkJAW200q66Mol2MGDJpqtDvXRVOHJbn1hQ+eva2umbuQ==","signatures":[{"sig":"MEUCICz3aNrgU+C4dfgdCw5c6EiPhVbLZ+EceLYVJEq8bP5eAiEAhI//GL9OP5ypk+BQCMHSeo930TBZDrLJLjEDRmBXgMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2876926},"type":"module","engines":{"node":">=24"},"gitHead":"fa8e4ee16a0de5a00b69f5caffbf240c131bcb59","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.0_1771789400964_0.9436465188065197","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@visorcraft/idlehands","version":"1.2.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"1253d1332eda423bc4cf793d003155e6967a0b02","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.1.tgz","fileCount":267,"integrity":"sha512-he5R2Kiw2yATdZlHROafJawY7ogYhnlOcuJHBRC9UHXZe9dQ3Nzq7lRpES6Sw8ygetLX+1BXmLeD4ZtXm5Xi0Q==","signatures":[{"sig":"MEYCIQDKMzjSLlVOnYOF2ZwqyPYX8HQOTHAKUA1gqK6IqCeH0gIhAMhqgsUWMWSsxo/2HS7rNnVe/TlSV0Ac5GKNOC7ZGV0I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2880608},"type":"module","engines":{"node":">=24"},"gitHead":"bdd6c6c1c528ebfa8a3da7a6be439bc283acbc61","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.1_1771793793947_0.08408281081479241","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@visorcraft/idlehands","version":"1.2.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"580fc129f6828561347eeb41acf3d7e129f0beb8","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.2.tgz","fileCount":267,"integrity":"sha512-8xBXuty2QRoFXscpqyEazNRAaYeWCs4SyxBzm1zH0EmXmQuhdVlfRX9uSMtd/DNi0/f1NtTP7+ZsBHKoFV3xdA==","signatures":[{"sig":"MEUCIHmQy1048K3xtscsxCKO1YYoUhKeTYlS0zKjOiW46NaOAiEAtJ5UZSw9hZ1tB7aCtagT1/y10WM3n0d22+F7e0k83n8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2885137},"type":"module","engines":{"node":">=24"},"gitHead":"59c0f4bfbceba03aef85d46274c530a567617fe2","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.2_1771796968522_0.308928380976798","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@visorcraft/idlehands","version":"1.2.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"bb655343da4048ed46222313b0d77dd2b5f04cd8","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.3.tgz","fileCount":267,"integrity":"sha512-8vPYJ0yGHqqcLX77Jcq9et+gqhqVg1cMU1MXhyuWBHdDNkrjkZucr9+EtlWPBJsVKhiPR9AdN0Oqe3ufYmAIJg==","signatures":[{"sig":"MEUCIA0LbHmmdZNxXdrE8vb6eje1og67wCYOvKPzGIX4gaj1AiEAxztsrWh9Ax9OvAFfE0+LzOrWZSaWWZ/rKn+3c3VWp/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2887881},"type":"module","engines":{"node":">=24"},"gitHead":"dedb81e3bbc1d1af95fee9f8208e75c1619de29c","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.3_1771799484834_0.7456688853906597","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@visorcraft/idlehands","version":"1.2.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"ef3f3c2fda56a9cf3c458437184c3da4d0312971","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.4.tgz","fileCount":267,"integrity":"sha512-6okxWb5dAmzyKB5uCodbB0O/pkSQLOiTIi4y/uCWWLXg94Mlx134YgD4wHmMFe35uJ11utstGOZnl7EMApHe2g==","signatures":[{"sig":"MEQCIGqYMlSSXCfkDRV7LhL9h6gqG4sbEHgCilacED3YFgE7AiAC3IwaDbC/0xKJkbmdeG1LYkRXSn/mwEtgc4riMDZ0SA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2890458},"type":"module","engines":{"node":">=24"},"gitHead":"447b6615df02143d67b7b19ed2c5d736b91d7e61","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.4_1771801336491_0.8491272618319481","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@visorcraft/idlehands","version":"1.2.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"79c2a15b4ebdb32065846898d15263018c03599f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.5.tgz","fileCount":267,"integrity":"sha512-3FBIXFbQVq5AdyvY6VsrEKbZmGn4fOv1BPw22F32MVmKZVTbh9LhvSyYp2fG50nGrSgcwMij+fgBIylu4i1rGw==","signatures":[{"sig":"MEYCIQDE5exbOGUll7hOssMsmLZ3hyKwRCceV/98xO73H8J5TgIhAJCZybi/Yzrk4CRhEMJcD5Avsx4CFr2BTYdyCPhYOD2D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2892368},"type":"module","engines":{"node":">=24"},"gitHead":"d272404d6c29fcc5b1c26e70d6644237ffe925f0","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.5_1771804076590_0.35583683208738415","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@visorcraft/idlehands","version":"1.2.6","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"79a1dad3a0fd84ada7ebe5c9e59e88c07334cdb3","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.6.tgz","fileCount":267,"integrity":"sha512-zTN2VuSKIFxkFpxpDVPnbIoGjiWC2HHDo6twjfvDMsRaSVt23zDODPgBO6ET4r5FhBdNAffHC1kyFlvhO/FZ2g==","signatures":[{"sig":"MEUCIQC5VAqAh9yhA2SZnHTm/gDdoJkBC2xkBGeJ18anBYbq+gIgNOAvdkJGy5UcF4NooVs2j+gyUbp/INlCfANSL90//cM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2896903},"type":"module","engines":{"node":">=24"},"gitHead":"e1f40f8656ef33444f67be0c37e4896fb21cecb9","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.6_1771806007812_0.6209107658488455","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"@visorcraft/idlehands","version":"1.2.7","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"bfba7aed67386fabb9b2e3c1c9cbaf09fa7bb236","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.7.tgz","fileCount":267,"integrity":"sha512-91dElYJdBVnZNO38PM7DTAvCcWq6QA87Mpy6au4snYMoxxujjB5l60aTuqcpTz+/B8T15D3ahc7DPAFLbfUqUg==","signatures":[{"sig":"MEUCIQCacL3vYKmXR+Dy2t1epPGSB5By5gF3Vo5RlsOoEbvDmwIgM+J3ptGUV6R1rZ+WqdoIzsZHZsZ8UkimR0EG16gClAo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2896903},"type":"module","engines":{"node":">=24"},"gitHead":"b2955826c53bd40840e2eb1edef63eea985e954a","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && chmod +x dist/index.js && cp src/sys/snapshot.sh dist/sys/snapshot.sh 2>/dev/null || true","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.7_1771806469156_0.295506023742248","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"@visorcraft/idlehands","version":"1.2.8","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.2.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c46e1b624a0be9ad2a0cbabeeb9b33e1b6f4c42d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.2.8.tgz","fileCount":267,"integrity":"sha512-YTVR//tuz29oiwx2zBd5MOE/7IAm7FBIfyr/FwBqIVJQIn0F9VKDu+NeLIGung0RoqokK6gCfMmtk+zY4fHVIQ==","signatures":[{"sig":"MEUCIQDI9rc3UEgNcxxDbH0DiHKZC/TB1gYfHXyDqzTQY/AYSQIgRaWfpnm2dxqv88zMjRwZ7lJSfiXRBzggq5x196FAg0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.2.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2899015},"type":"module","engines":{"node":">=24"},"gitHead":"074990b6e5b22cea936a8271e49602b5d93cffa7","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea89f0c8-e81b-4467-b66c-40e391cbfa01"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.2.8_1771809603042_0.6291476585898181","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@visorcraft/idlehands","version":"1.3.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c0bb17582b2fda84d3bcc09135eb54fc0742f6f8","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.1.tgz","fileCount":267,"integrity":"sha512-YStOa+fjmD/WyNboju2EqbVQAawTTAC76NkF+7X+1y5JX7B5efYR7W8eBwD7NqjsV7sMcGpFOUNo6cXJTdbWxw==","signatures":[{"sig":"MEQCIEi2CLPw0FIY3PIp2K2K4pSjReDXvpBpMzsdX+UiOosyAiB2DV0o46uFIbAqtOF/hlmB96GptHJTfeRnN01aeSx2Ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2933659},"type":"module","engines":{"node":">=24"},"gitHead":"b3250db64ec1f4a6f8f2cd27d97d79c30f6d3555","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.1_1771822705936_0.1904113754901018","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@visorcraft/idlehands","version":"1.3.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0f762abd36e2f7e826d13b883d3c65f092c79455","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.2.tgz","fileCount":267,"integrity":"sha512-1iuqex5NXWHeyYvO6ae4G8f6sXtnmX+ZG0r0UytAqKEsBdTBD+WwHyP9w+wfvoevwi4A/rM7RbfcBjshUoc+Jw==","signatures":[{"sig":"MEYCIQDbfocm/VkhpUjXz3mlGogRZjNzFcQFzfZyHv3BzFbx7wIhAJ+Vl5lvbC0FwgJyam8Esv5PpuPA+7PhFRpyKU1Obb55","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2944753},"type":"module","engines":{"node":">=24"},"gitHead":"87406a6f33abbcc0fb71455cdfca782468f876a2","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.2_1771824683773_0.8285863664585533","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@visorcraft/idlehands","version":"1.3.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"a7d09da9c89aeeb8c07f70d41fe1b8e8eacafb5a","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.3.tgz","fileCount":267,"integrity":"sha512-/Igpd50fTH+DEElQmwsWvxyQgjOz6RTFInXE0e8Vnc0nqVUq/Xk7y1LLGI9q99znehP+9m3Wj9lmQRQWaZplEw==","signatures":[{"sig":"MEUCIQCjX9LPGEd5MByHGLRdmJU+95FpdkSQu/E1zZF8LAAZnwIgMe8PoyavR2gPRBMHxQssTHxqOqN1eO5i/0Kd+O8VHnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3009316},"type":"module","engines":{"node":">=24"},"gitHead":"f28e5780edd83adb62006bbf8921faed1539ae43","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.3_1771859476569_0.8053053689656233","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@visorcraft/idlehands","version":"1.3.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"e0e52187f7389e307b565dcf08776523e74745af","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.4.tgz","fileCount":271,"integrity":"sha512-1cDpyEgT5kUiX8u5TnCyOYQ2IHeh2scjmOgxiLYc8AtqvvKeLGX/UNbctrub1KUE3+fBPsb7wdCI13/YsCQ1KQ==","signatures":[{"sig":"MEUCIC851QSj+E51v2/mPg3ehPz7MhUD4vYEi5OFnVVP9OamAiEAwz7yApHzGGE+CGPirBh1HFKewtXRUqc7JdoHfB39y4c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3036622},"type":"module","engines":{"node":">=24"},"gitHead":"c1503b82ee3cf74b987846a8235cc3673df9b49d","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.4_1771864966667_0.8975100245122953","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@visorcraft/idlehands","version":"1.3.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"409d42a0e1445c3914287a45d5ba17b41e2f5647","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.5.tgz","fileCount":291,"integrity":"sha512-nBTej5OmLvsqRfzMskIhMFSu4iSaWE8q/OCz75OIe4AFJU0n9fgaP41MtJ+wTR1AXC9Jhgkd4B3vvb59tWW08A==","signatures":[{"sig":"MEUCIH4pZgjHWm+PFYZ6Pdl/bDoKsqjqFMyXarWUSTpLVWD6AiEAz4MG3MoPvm5f8gCIqPVDcAAAcKwxhXeak8bzi8tcJRA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3051700},"type":"module","engines":{"node":">=24"},"gitHead":"cfa91175074301505ce63f5688aa338a06453f5d","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.5_1771876640552_0.7842841163355274","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@visorcraft/idlehands","version":"1.3.6","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"73563d524f5b2c0b91c80a26d6c2e1a365abad37","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.6.tgz","fileCount":297,"integrity":"sha512-WxPFeCMAZNx1cifXXuD/Sc6emxVOV39DVGUvn/ChNpd8ovxPvyi/IMlwDHadgcokbb4YJ9jIb2D/7IlLH1dbJA==","signatures":[{"sig":"MEUCIQCwep6g/91vgXpcpBFxk76Il1y41Hd7YCDWXafKkPO0HwIgKfP3+swvA/ujyKHvBkc6t8rjjVobDzJCidzUJ+QjQ3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3027019},"type":"module","engines":{"node":">=24"},"gitHead":"5354223ebf307603aceb5af8eecdbc1aee1be629","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.6_1771880235789_0.4729467595009482","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@visorcraft/idlehands","version":"1.3.7","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"fe1476d6f0584df1f5a4527e461e085bd7755093","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.7.tgz","fileCount":297,"integrity":"sha512-MIf6MRJTbz29R4ins613QrnsMMp5jl3cKyiLefDM50fGt4gHaApru5aeL1+gES70A63VxArhfXPPKXUWBn72wA==","signatures":[{"sig":"MEQCIEkNdq1jyQSMtSndcS2QUXdVU4zcE/Jp/whxeeKeUMqxAiAWVfS9R7+8QQZNJ2mXvdMO4GgO2lYzFHskA3VL9oGq9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3027953},"type":"module","engines":{"node":">=24"},"gitHead":"e6af0b06f352259b7ca16312690d42161452e746","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.7_1771883287928_0.6623900326829861","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"name":"@visorcraft/idlehands","version":"1.3.8","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"2ca328889c2f57ddb26ad5a377b89e4391835a9b","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.8.tgz","fileCount":297,"integrity":"sha512-KwvqiG/+O6hrIFwWYOD6HkgulAl6DLTSDIKDljXeu1ocmiCJFx8+ws5owly4b14vT8XQ9CAPEmGxY5GSj1Epqg==","signatures":[{"sig":"MEQCIDs+SB/Gpg1to8sjfGPHdv6JTOBVB0UxTehYjbUylRmmAiByn4WQEEXjRtTUpxZHQC2hBMALAK5cAxg2sJVzz29BOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3031901},"type":"module","engines":{"node":">=24"},"gitHead":"8b43c897b1f7b5a6525e2467273e1571a2c8128d","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.8_1771885168024_0.11784948620112878","host":"s3://npm-registry-packages-npm-production"}},"1.3.9":{"name":"@visorcraft/idlehands","version":"1.3.9","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.9","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"018ebcb59c6c02c819486ec71a32712cbdc05bb4","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.9.tgz","fileCount":297,"integrity":"sha512-7kaGT3Dl6k2e6UpVvMKyYcd2IyV+X5dvE9mBgNUBb5ssD108eNFMbcl98cfUhiz9JuRCYXzMPGOJ/5JaRTU1Ow==","signatures":[{"sig":"MEUCIDmflECEZlyBM2mSo9I37rRGZtogYk9gPkA43zDKb9NPAiEA14b/tmogyoHVlC3bFwoKlcD5hNARxTClcjKLdDp5CcE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3045457},"type":"module","engines":{"node":">=24"},"gitHead":"67428ef99c421a08d9e6fb98877ea9269d3d515e","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.9_1771888833015_0.34086888159800566","host":"s3://npm-registry-packages-npm-production"}},"1.3.10":{"name":"@visorcraft/idlehands","version":"1.3.10","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.10","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"adeecca3f3620677732d2631812464eb1201c8e3","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.10.tgz","fileCount":297,"integrity":"sha512-wCa7OwuSfGZwxp8ZacCZBMec1bFXYr2cmilCusJoTFkjtjj+J7yx+S3dONBYom3NT2N8r7zV+CqrGgmTvBMlvQ==","signatures":[{"sig":"MEUCICmHGF5sCJR9JDSCYMwM9Ajn6PenTPxqftKqEJDAOkNsAiEAyvT1+0PxVJwkrA/0ac+ky5V0NabIUlRJ/fo6p1m5exA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3049158},"type":"module","engines":{"node":">=24"},"gitHead":"f4616a7162825c21ccb4c6cd649680d19d255483","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.10_1771891625715_0.8117831695288","host":"s3://npm-registry-packages-npm-production"}},"1.3.11":{"name":"@visorcraft/idlehands","version":"1.3.11","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.11","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"fcd36966157d20fdfd5338a6fd52c01504cc61c0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.11.tgz","fileCount":305,"integrity":"sha512-MW5G7JCQPzL0Unm70akFVqiUQ4Iwe67NWEnxeBBbSc2QZW91PHnQ11PxcAvj96uPUwfijBcn8zU4Cm02BrR50g==","signatures":[{"sig":"MEYCIQCMi0uqdtEl1Wlsfh8PYQP6/6R6pR1KBw9/jaxXxWixYwIhAJGK6i9YB7odQE9h5NRzRdIO+m/Ql5zaZUpcnlBdRENp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3121798},"type":"module","engines":{"node":">=24"},"gitHead":"07a04be7a37281de0b2213fc6b3d4d741e11b131","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.11_1771898205851_0.19617563320931763","host":"s3://npm-registry-packages-npm-production"}},"1.3.12":{"name":"@visorcraft/idlehands","version":"1.3.12","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.3.12","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"111cd3379a8bdff84e01f76889fde61a2d938999","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.3.12.tgz","fileCount":305,"integrity":"sha512-VUbGrjsTVbeIFR6wPnXObDt2Hr8gO5WBbxlVi4zz4RLeS7Gpt4H/6bDA5gK5Dx6kXEFLlaAbwdNUMLKo08F+tQ==","signatures":[{"sig":"MEUCIQCpBx1PLlTl88w6pd/olhpnYtz+/+1f1j+iVxXRdRXCugIgPWfmLFno9/8ft6jKufIgTv9Yb82YAvqWqIlrCPv54to=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.3.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3126082},"type":"module","engines":{"node":">=24"},"gitHead":"dc41217b16c1ca72e6396c9f54c58b92bac9b664","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.3.12_1771900267065_0.6237583663878148","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@visorcraft/idlehands","version":"1.4.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"93a615099ccee0c09dc7131ab73f6b04fd578abe","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.0.tgz","fileCount":307,"integrity":"sha512-CVoAaGMFkkClYoTw1fCKnvxYxQCWpV8vpLAlehBnHvlverrRkaHcUVBPPaq6pFol2lr19uXN8pl20gnvlhiEGw==","signatures":[{"sig":"MEUCIDL0YRjBmsZeogOJ5QNlK403Ua7wHXjmdITZt7+rdTTmAiEAis044dLNGQGcGB+QgIh0jjMFHxwO+v+618EGHJa24b0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3157564},"type":"module","engines":{"node":">=24"},"gitHead":"558034c72c5f9170cdad7793642291661f06ff90","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.0_1771902138359_0.11106847715124823","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@visorcraft/idlehands","version":"1.4.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"863e78223b2fcfe492fa91dd78b763e341e77e40","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.1.tgz","fileCount":313,"integrity":"sha512-0LjBLXp+anvNekXxyM/XmsVU19PSVvLSDTxlGQj/we2wAr1R8KN2uClSUB4R79ykWj306hEJmZlhcv9CKPc4YA==","signatures":[{"sig":"MEQCIEjIZMWJ2C3WbsYFp5ITTtSMnae/pz9mlosymBPD+LKWAiBHpC40PsYvCVOFRDmq3NX5swU7O9XBemQQd9navHTkGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3194383},"type":"module","engines":{"node":">=24"},"gitHead":"98ff220d9d7ce13b698334a8401a8761c7e0f09e","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.1_1771907503914_0.5977698389085895","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@visorcraft/idlehands","version":"1.4.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"4e92d9faeb4c46fee5334bb184b5b215a9c84e23","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.2.tgz","fileCount":313,"integrity":"sha512-HG/4rcp7nXWyl8EP58Jc3+ggmVGedVS17yPGCqt93kxwkoySvPzrk3lgXrjbzVteuOvm6DOCXLqvwQT3S/U8oA==","signatures":[{"sig":"MEYCIQCKgRyoYcJr0XrpztwCnxvKhZoK0cSjZQl0bOj2DxvJCAIhAJRoKaFti9VF2hO5vnD7Ls29RJTkRvL77IdWmV0RpE6V","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3199523},"type":"module","engines":{"node":">=24"},"gitHead":"f86b6c0519a18d361a596ed64618e79342de108c","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.2_1771909662419_0.4743396495672638","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"@visorcraft/idlehands","version":"1.4.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"5f6f00e35913985d13c2e6aadbb297677e6f40a9","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.4.tgz","fileCount":313,"integrity":"sha512-rdjyppXum9IU91nrnQuM4c8uMp+PbPB3TnZ8WbcquwcOSi3HvIFkyStIVJrlAca2/b+ud7j6riaJe9e6CLY+rw==","signatures":[{"sig":"MEYCIQDxQyIUOjEVlQ7OOGAwSYjmHcK67JnahYET0d21bQCOKQIhAOa6W7O0v1FsmYbtLy+Ojh6k9U2/FELreQ1gtnwXLcx3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3202060},"type":"module","engines":{"node":">=24"},"gitHead":"ce3016ca394004bab071af619840ffba9498f269","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.4_1771912437698_0.9457469116195505","host":"s3://npm-registry-packages-npm-production"}},"1.4.5":{"name":"@visorcraft/idlehands","version":"1.4.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c3a1430db3e5e4794737160f667d2207a71255a0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.5.tgz","fileCount":313,"integrity":"sha512-wrQlHYgslZdFOStpmpvlM+WJOSOgJh/gfRbpCAIP/w17rkdYkzcAl2AGZEDzGmTY79cG6OkJgvuUllGDaswMNw==","signatures":[{"sig":"MEQCIAQKIDI9qVOWsBNbykLTs2P+Xjphx50HVZ46zbZFy4ggAiB87YehyrJC88geCfFsztUomvljPF9TEH3xF9JCGCM1Hg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3206867},"type":"module","engines":{"node":">=24"},"gitHead":"28848779d450bbe33bc4ad7521615734738203c8","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.5_1771914157882_0.2651110432545343","host":"s3://npm-registry-packages-npm-production"}},"1.4.6":{"name":"@visorcraft/idlehands","version":"1.4.6","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@1.4.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d3b413497ac3c37ee12339cf589e2db7e92e1f0e","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-1.4.6.tgz","fileCount":313,"integrity":"sha512-J1iNqbEe4xlKhIo68QCDQXpZRjmDlImnNN1VpvJuisXBIIMbhJxBbn9G64THGR5A5FfYksdlMhKt3N2OGyzHmQ==","signatures":[{"sig":"MEQCIAw+uFlqz93pntkbOEYXaWFgypAh3zZek415UoLESEZ5AiA8r1KYy+bs7ZFeZh/mwMATlAGJnuPHqY2pX6jK9tCl8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@1.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3209748},"type":"module","engines":{"node":">=24"},"gitHead":"b374fe0211bad3d6c6ac6b45e638fb096b9df196","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_1.4.6_1771939644070_0.7840861129780139","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@visorcraft/idlehands","version":"2.0.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.0.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c1d424de1a741fc14100fce334d740a4edf4ad91","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.0.0.tgz","fileCount":409,"integrity":"sha512-CxTw9iSS2G7yhD7BZTyoNCs2PuzaiDU11sZ1I0kh0z3uXRzy9kAkoU0p4YnIkd8B2h/kfbMkMBh/bx5b1toxzg==","signatures":[{"sig":"MEUCIQDNsMDJqIBmrPKQfVLjnHFAxx+lRjaHNrquU22ZZR4SjwIgAXwi4tWF8G3gN0F/dFXqyI12+qTcYCZZVQhShGoImdo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3241773},"type":"module","engines":{"node":">=24"},"gitHead":"249460d235a85180dfc027a83b7d9af158d8b34e","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.0.0_1771958886813_0.567051073043638","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@visorcraft/idlehands","version":"2.0.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.0.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d014c728120dfb2e48893276e1506f6b9dfda9f0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.0.1.tgz","fileCount":411,"integrity":"sha512-37Bx3BxoTXTf1NYjx01f8tFxmeJ+r1YKs6F1OE19/J0oE5mClCgKB2gwatEW/jXxHNdlN2qyWFne0VxbiNJi8g==","signatures":[{"sig":"MEUCIQD6h8m61LKUycHTPbMwpp42244PFjlBnoJ8JUHG9m0gdAIgbo2nicNXzFsXvux7o6Mk3Hrq+2Nl5g+lntGab79BQ6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3314746},"type":"module","engines":{"node":">=24"},"gitHead":"41eee9757c7a8933407a15da3b91726ae7535085","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.0.1_1771974798213_0.14321854342646945","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@visorcraft/idlehands","version":"2.0.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.0.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"a0f3a714f66b291efd612f5b66837cce54416d28","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.0.2.tgz","fileCount":417,"integrity":"sha512-wnHypxYg18SYLYmH5gSp0HqUy8d9EqathP3CfyvQCtcljHPoKjSP/zgffH8//3EJ3HUi0zwBxigIXXbNEnFnqQ==","signatures":[{"sig":"MEUCIEEcaafkuzXF8lxWBszzcJLyehiER1jyxMRh2UhV8b3VAiEApyaqJb+Ptkll1hfVdmKGB/dbEXPgR/AVA/nl4UYNzAw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3366488},"type":"module","engines":{"node":">=24"},"gitHead":"a14216d5577bf22fcbd9507136749d676b5ddc58","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.0.2_1771982786737_0.5749952800970393","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@visorcraft/idlehands","version":"2.1.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.1.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"a85b2517d96659a4b7476aab5c65bc218e0253d1","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.1.0.tgz","fileCount":435,"integrity":"sha512-A4GGwe02I4PUAQi1/uLGOZOF0kyTXa63cOikA1FeBuIZTaUV7QtUuPIt4Ha5VcAMQGrW99F62wcpPAwD3gwj6A==","signatures":[{"sig":"MEUCIQDez1B9bUzFr1dsq8jNMldMen8t3r1RheRjqmpgcIkBqgIgJXkSvGG3ZMNjOmA1YFVjBP8BOFPKAmM9oWfTudchQ20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3494441},"type":"module","engines":{"node":">=24"},"gitHead":"3a48e8b8f3dffbbc2245193d2352483c1d30ec9f","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.1.0_1771996188472_0.18234160397741195","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@visorcraft/idlehands","version":"2.1.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.1.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"92ecd380184359e54263d92b6103d1528c841554","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.1.1.tgz","fileCount":435,"integrity":"sha512-ggTVfrKuvd9W84Nc+517rIvE2yO04gponCIsOZM3OyFTuYW5LsN+FWauISJOKoOL79erpeMXZFSDE08rkNVcXQ==","signatures":[{"sig":"MEQCIF85Jvbo1Glx1EO2UO/eGstaQ/dVO256XgpmFrCy/pmLAiBU1EJ3VGSYYJVA4DT/TMgJLfRjK6tDIvYHUHfYHYXFDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3495223},"type":"module","engines":{"node":">=24"},"gitHead":"81ca97d05c5c09d163b7847a768b10ec01278048","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.1.1_1771996680700_0.30027988853071075","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@visorcraft/idlehands","version":"2.1.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.1.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0721818ef1ab81471a7990b077cc2416edf4964f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.1.2.tgz","fileCount":435,"integrity":"sha512-ng1U/wJBTmGUXgIMU1I9qqBsX+E+YYXPasg9KQmnybFk4EYFd7oEFB85LqLXS/8hJHFhg25brj/AJpue125CwQ==","signatures":[{"sig":"MEUCIQCl8WeyhsBV7RN0KzOy9RFGgdbOie9VY86nkdvetH0S/AIgO8eWk0oxO0y1hZ1A8AJT/33pkSk/eYnH681nazH+UvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3496176},"type":"module","engines":{"node":">=24"},"gitHead":"034055a39263b3abc37afb9eb97075a80e8b4c10","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.1.2_1772018009897_0.7869460304090521","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"@visorcraft/idlehands","version":"2.1.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.1.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"5d16aadcba5cd7c18cc4d5b9030811d1a483f2dc","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.1.3.tgz","fileCount":435,"integrity":"sha512-Qz86MyweA3EhTFcbhWlMFFe/7IErrDhBcwIKvLr7uKUvOIqqBDMzMxkXA/OzP9IrAjoyI2FbDujFuSbGQ0xnDQ==","signatures":[{"sig":"MEUCIQDQllYpeYMCmzkoBEL4txYvE7P0FgTOTO5m1N/dX5+iUwIgA3rSi2wXBBP1YEzbpA3rZbwgny5kZ7c0Z8IdF7koOZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3496522},"type":"module","engines":{"node":">=24"},"gitHead":"286a9a91e28e20c2a697b5d7aece08987bf85d1b","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.1.3_1772019186596_0.8144678417851317","host":"s3://npm-registry-packages-npm-production"}},"2.1.4":{"name":"@visorcraft/idlehands","version":"2.1.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.1.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"9841406ce32996229d0469ee5ea403dc0c1011d2","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.1.4.tgz","fileCount":435,"integrity":"sha512-gCRuDEfgvJIVvv7/Kwkfxgpn+0pLSzpa2dwsGMdqThCOOsoHQX0ch5GudTX7xczpyApI9qDT2GrC+dEfRcWFXg==","signatures":[{"sig":"MEUCIBAnziq0l2gX3zfGiFKVb5kIkyGxdO59EhVSbG3TbwyRAiEAzJwpIQNtmVHeylgv7ka4yBXcyDuHgGEATa3Phqi++yo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3499786},"type":"module","engines":{"node":">=24"},"gitHead":"a5979b66fbeb9722105ee13503c1fb9fa2b3cdf3","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.1.4_1772019712908_0.20307957264639964","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@visorcraft/idlehands","version":"2.2.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"ac699b6b13cd4848e15597188e99201b0fa390ab","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.0.tgz","fileCount":437,"integrity":"sha512-lLEcTh+9IvVe0u8+O7UZ1gdBwDc+4W1Ygfr7Y9ld4VQrDCoMLA9pJ06OFzZzH/E+4MsitDOCYaKUXvQaI2tI3w==","signatures":[{"sig":"MEUCIBXuclKRyvOUPSCiP9g3sVTnMUVvv5lWrdPaGk7BBJd0AiEA9865YxjbCV3g1p3gAp1kW7bgGuocAPT+ZJmVaiUkOe8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3531608},"type":"module","engines":{"node":">=24"},"gitHead":"8fdccb40a2f41a11e78fefbc4055f3db81929ba3","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.0_1772028003916_0.3448105058826427","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@visorcraft/idlehands","version":"2.2.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"1e0f0088f960222c4c51a2b941414db2bdfacb48","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.1.tgz","fileCount":439,"integrity":"sha512-38/CMna0XFtO+jryBkCh5ThybVsqyaawjTl71x+aN8EQH5QRgxRgd26VQ3NAMNM2xolLujb7ZlGiE5mUtbA1Ng==","signatures":[{"sig":"MEUCIBQoBvPpcDcPfmzsY3pii4+ESk51fYVa1LXsWqsMhMd9AiEAzKtguOZzatHoz7IzN1qzI08kQSpE2bTncKH4uhKjh7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3554284},"type":"module","engines":{"node":">=24"},"gitHead":"9ebb2720cd41f3500bf9ba7b030d43a0c043a312","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.1_1772031866473_0.3189308461556426","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@visorcraft/idlehands","version":"2.2.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"f7cf28f4c7151cc85cc62aa7fab448ff75ddec98","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.2.tgz","fileCount":439,"integrity":"sha512-oVChbfVLSN1TOP53ZIHLJ8902D++8o5qGGdP3/aHinZcgO5UrIzkQzL/kWGZzQqhUymn+rEMC1SNScwWpCcZQg==","signatures":[{"sig":"MEUCIFGytygxIc5yq/LbjT+RdVyN8H0B9KLvi0TZhzOc5qTqAiEA1htCH3BcNeqKxdArWhZFkiBwP4ZcT5+fZbgsKA7rNWo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3557021},"type":"module","engines":{"node":">=24"},"gitHead":"3376cf777395e24a514cbd664106a9cd86c8abc2","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.2_1772034226651_0.13932439222737236","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"@visorcraft/idlehands","version":"2.2.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0ea40cabe1cec68ab180f08e9c741a2df7c74737","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.3.tgz","fileCount":439,"integrity":"sha512-wBJoGYdIoJSB3uqlDA0xEFROSihPhdWkiVrW6cPT3Kt2578NVMmX8oJkWfPynuZ2Ojf6G/R4MsRuVX0WEP7TfA==","signatures":[{"sig":"MEUCIQC8sr4rPZUY4XvjUiIJqeDdORTjKXJ1idc4ZmIsr9kXrwIgJHo5uoup29bwE2IwVHP8pdFvK/A6VvpEcB3u2p64rkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3564254},"type":"module","engines":{"node":">=24"},"gitHead":"162766fd1c5e7e93897fe8c9bf3931b52c5db5a8","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.6.2","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.0","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.3_1772035444846_0.14978300680411505","host":"s3://npm-registry-packages-npm-production"}},"2.2.4":{"name":"@visorcraft/idlehands","version":"2.2.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"6e82a496f7dbeeb0320d3d7064c52b639a953ff3","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.4.tgz","fileCount":439,"integrity":"sha512-cHd+EgNB3dWtyr41l/YGtLS4b1VJW3Bul4cSqw0wdHLHUgXBRA/NsCIGr+8GY18C0JrJ/uvPzHE76+aYU43ArQ==","signatures":[{"sig":"MEUCIHt8vm3gZL0JLJskT3JAgZ73K7UaoEoxzMoefIypdIlcAiEAy2Isq/yxqFu9a6cPyhxasQ90MoY1OYUK5SVCPYy6ct0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3566328},"type":"module","engines":{"node":">=24"},"gitHead":"edaa0b273c332efff00288004c2ed4aaea883ff5","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.4_1772036709905_0.19871175281281261","host":"s3://npm-registry-packages-npm-production"}},"2.2.5":{"name":"@visorcraft/idlehands","version":"2.2.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"34983fb125c6e2d6a7098d3731d32b0f7a6118b5","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.5.tgz","fileCount":445,"integrity":"sha512-wMl80bLbGsBEQEKJH5d2fbhNQzD7V+eQxiHaOhxSmxPy/LY+YUWZgVeu7ifxMfggCGNBusTo6Z88SiCYgBp6yg==","signatures":[{"sig":"MEUCIBNy7G9Zqcx6o8aYKGh+xmmaCQSaGDE/oT1FFMCx8kQgAiEA27E86ZghfWohaDg5UK/OhdC/2xtJBoU1+7ewWxpHr1w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3661992},"type":"module","engines":{"node":">=24"},"gitHead":"b7fff06cd49340ea1960b0c41b40cf55cd43443c","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.5_1772051650141_0.8164030788052363","host":"s3://npm-registry-packages-npm-production"}},"2.2.7":{"name":"@visorcraft/idlehands","version":"2.2.7","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"3eed57840acaf4b8b380aa8b3c1fa677b949c703","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.7.tgz","fileCount":463,"integrity":"sha512-5+1v5e8J19Q+DjQqPipoOcQeuryv2HCBHZEkFfYFhfPRtVUCTaSHu7QyqSsWsrP9VdiprfBIofe6MXfp/GVAFQ==","signatures":[{"sig":"MEUCIEqc9P4TqhF+zo+yj595buRbl8vBfAOOrkkwH+2+Aa8BAiEAlpyndIp44pwsgVCAhHfgpqbxXZMkDIH4hAxp08ha4jU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3745456},"type":"module","engines":{"node":">=24"},"gitHead":"4daafc321a613d0a76de0643ae0c01c556480c4d","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.7_1772071410022_0.19777796023871597","host":"s3://npm-registry-packages-npm-production"}},"2.2.8":{"name":"@visorcraft/idlehands","version":"2.2.8","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"3b69ec3722bf1f1e61b77eb0383ec58ff4d2dc37","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.8.tgz","fileCount":467,"integrity":"sha512-2dQWLsSUqRapo9yJ7WP8NSCtfktFxVg5hYUZZvitFUuh2Ne/e90o4G6ORw1NcODX2T5iVQRqg3a96AwF+VaFxA==","signatures":[{"sig":"MEYCIQCo68EsTOlj7dFvm3eB3LWoT3f5qnSZd7TwwGJwcKruFQIhANW2wcPWiWtgE4O6kwwMKRtd4XXQQyjbqAJJcbShRTK5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3757762},"type":"module","engines":{"node":">=24"},"gitHead":"4a3a85af29a5c052f761d88c4c9a7f4ae600491b","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.8_1772071776201_0.07297702698647601","host":"s3://npm-registry-packages-npm-production"}},"2.2.9":{"name":"@visorcraft/idlehands","version":"2.2.9","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.9","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"cdc96114afdd7051f0524d6d34ea61a837a0b719","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.9.tgz","fileCount":473,"integrity":"sha512-vNd9tuO4tWE3GWk+i0UgdAo8OLAUlcwc1rtVX3a984wnZfEl1bwJoFPo5BcUZ7uBxyC2dyChkHdTVFeRHeaNZQ==","signatures":[{"sig":"MEQCIHi7nAoz6noC+xRXLCgA0j91Kw+RPPLlpa/RjEmMlHrWAiAiLhiNvUm3joZGRGaCJWKARpZUaTKbDqBLyWdYvAm9bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3775227},"type":"module","engines":{"node":">=24"},"gitHead":"d8ba7e6a852b029b396fe896f63de86924b8e43e","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.9_1772073064024_0.026577937818272","host":"s3://npm-registry-packages-npm-production"}},"2.2.10":{"name":"@visorcraft/idlehands","version":"2.2.10","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.10","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"999f08fade67759e465f62c508dc19f3d4b18dc6","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.10.tgz","fileCount":473,"integrity":"sha512-KErFak8f99hEaOSpvLXZUGbvBbQQyZdi4SjqtVAmAT/B1ztkCQ68yxeBtatT7ZqfKrJhhc2ErfNgxbbinXI+DA==","signatures":[{"sig":"MEUCIErI2TyoISSgDj3ernPK9Pv2mrjOigANMaCscLknB7tmAiEA4M4xpefVcfPsqBMnHLSzLdWkpTD3pfoKjbnqPc7bdVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3788018},"type":"module","engines":{"node":">=24"},"gitHead":"ad7033a8a704612009f393eff28dd2e31bf230ea","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.10_1772073502528_0.405132957835016","host":"s3://npm-registry-packages-npm-production"}},"2.2.11":{"name":"@visorcraft/idlehands","version":"2.2.11","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.11","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c7794ec67359a3fb583e9e104e72f17877581b3b","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.11.tgz","fileCount":475,"integrity":"sha512-chgIOCbu+dYYjYC+b0SYVW7BVTBXhaOV7QqCEUcYblr64XdhULG5LZt4apZo+iMX3sOQzm0JJfm9OcxJuV59xg==","signatures":[{"sig":"MEYCIQCcOJcTKo6/ulNw+K25nXg0WIS6POn0p3L0Qdkd7Ka1KQIhALood1Oi2ev7pSMF/FkvsEmHxinQdAqh3OX0XgwUZoG5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3798455},"type":"module","engines":{"node":">=24"},"gitHead":"af8f535e730948e93ee97380b4657939f9726daa","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.11_1772074178568_0.7547975990424565","host":"s3://npm-registry-packages-npm-production"}},"2.2.12":{"name":"@visorcraft/idlehands","version":"2.2.12","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.12","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"a176cbacacfd21f3eaca63d2ee9d22210566f7f0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.12.tgz","fileCount":475,"integrity":"sha512-qCZe+ExaDc4LL+2tiyPWD0LZYcCCe0nrO41FtVx6LcuDw8kqkkHRVEiOua7LQzD2tiAzQ8Sn0Pf+XgXXrCkCEQ==","signatures":[{"sig":"MEUCIQDI+Rx5vrxZlUzLutLPPB+ysuebTRalyEQDQeE0zeqRSgIgV50M28mHfSl+BfzA1/7opTVFSblLKz/ePQEOVth1UMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3804826},"type":"module","engines":{"node":">=24"},"gitHead":"746b8d4e3d9ed964f15dc8b8829484651ce901bf","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.12_1772076391922_0.015222047663232985","host":"s3://npm-registry-packages-npm-production"}},"2.2.13":{"name":"@visorcraft/idlehands","version":"2.2.13","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.13","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"88b57323f1b516bbf5b0d3b907fbd31fd085e1a5","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.13.tgz","fileCount":475,"integrity":"sha512-+4hZQhA3N7J2R5jZIbCpItpimvmSImIq+VdzXH2eTjPFV7YbxP8pRBhgqf/Kp1wvjkZVQdIeWm6tsDGW4oN2mw==","signatures":[{"sig":"MEYCIQCicRLZzTIhV6HyBxa64d6sGl8J/TLbrVe+da3/CjDAwAIhALUZ0QvpVw6bnqf2llhHXiOI5PGGZWVvCpUTvgKA72qE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3814530},"type":"module","engines":{"node":">=24"},"gitHead":"b54b18f8b9f11d1635bf5a7db4819bc650277bf8","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.13_1772076909482_0.2913355111126781","host":"s3://npm-registry-packages-npm-production"}},"2.2.14":{"name":"@visorcraft/idlehands","version":"2.2.14","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.14","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"922e6b80d339dc109f66d5ea805425b39f963d24","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.14.tgz","fileCount":475,"integrity":"sha512-CVt7qKOd1wz7GMucWv/1uM9/Doz9zIezhUqRkuaTO2a4iV011EXUx9fw/B+Oh7ViGPFahYbmq+1AL4gFjIgR0A==","signatures":[{"sig":"MEUCIQCgzzmJGsOJVyBys/duTysaWRRnD0LW1jFh8aMCKv9rrwIgOKzGrmn7vbE9mHlyaxi1JuzSAC9VdCLTc58Z2qQBiSs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3824193},"type":"module","engines":{"node":">=24"},"gitHead":"f61714443e6b9c67adb0cb965596153219761db5","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.14_1772077520530_0.3468382102185317","host":"s3://npm-registry-packages-npm-production"}},"2.2.15":{"name":"@visorcraft/idlehands","version":"2.2.15","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.15","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"641380961807aa8086aa7260eabb62ca2b8defd2","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.15.tgz","fileCount":475,"integrity":"sha512-LSjqYNirSgI783/+Sp0Wl808CJ7XBZOM+CKyadpg/4PS33BXi9XBNefOF4lx78ljCCIN33nOBFOMGz5JcbmjSg==","signatures":[{"sig":"MEQCIE/v4X4ht3bbnnRqJSIa5kUO/cjMBbagNFEIB19Z1uRUAiAdqbNvzofpWU1wHWnvrexUuIzNV8wpkPDH7TMCVys/IQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3826147},"type":"module","engines":{"node":">=24"},"gitHead":"6b8adc00917162f1c9e34d3c800d9cc608d31bba","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.15_1772077868161_0.7543384079191304","host":"s3://npm-registry-packages-npm-production"}},"2.2.16":{"name":"@visorcraft/idlehands","version":"2.2.16","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.16","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0676823ce04feac341050ec9ebcabae9c16d511d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.16.tgz","fileCount":475,"integrity":"sha512-zlCcAaGG1/XzLJe4r7k9nSEiLwOSwjr1+BnUljdzk7rwMcy/NB0NDA3If/izIe51h1Ga8aM5XU9vXh3tjlo2Dw==","signatures":[{"sig":"MEUCIQDrASBZWFmJsyRinaafFpTvlpeBI64/bRPOBrkZH13+WAIgVVX8jsq68E0KskSH3Mc0xf2N9W2eFK90m1DpJcIxY34=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3827132},"type":"module","engines":{"node":">=24"},"gitHead":"b69498758b601ea7c77aa4fa82c806789eb47eaa","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.16_1772078162939_0.5582276076354973","host":"s3://npm-registry-packages-npm-production"}},"2.2.17":{"name":"@visorcraft/idlehands","version":"2.2.17","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.17","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"77a9b60df37251067cef20412b7594873fa8ede7","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.17.tgz","fileCount":475,"integrity":"sha512-6nheqqFeXSEISchgj+RTsb3xwJn9AqThymERTa+h/DwjA4M4rs4WLMoh+2AyQ4nQ33gK5UOc7LFVvF8mH01Jzg==","signatures":[{"sig":"MEUCIG7Z87I5VjaziCRpmfDKeu3DRe0BQ0lVnELUubcvucYIAiEA0s4qKdTXfDFg/Qjpawo21BLm+eczjZVa0XgjU6aF9Mk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3827569},"type":"module","engines":{"node":">=24"},"gitHead":"13b5b016db7e7d5b4e0add1195dfc557917ffcf7","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.17_1772078974283_0.6052609537997593","host":"s3://npm-registry-packages-npm-production"}},"2.2.18":{"name":"@visorcraft/idlehands","version":"2.2.18","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.18","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"977138a0ff96cb255b26fd22d2f5e1dae5328476","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.18.tgz","fileCount":475,"integrity":"sha512-Fqncjto8E1ar3dKZW0P+uTS9z0RTW70lfcJqoHhmNYDFhUQP8qSR2FwDc8fFlYvA2pfxq46AUd2SISPHI2sJMg==","signatures":[{"sig":"MEYCIQDQGBJV9qdlMpkUO2oc6yc9TBxSHNzXhPxGU5SK1qjvqgIhANv9ntmDmsHz0/5E2wl8ZFYnyFkDlMTpL3n1PfMxR7DP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3828133},"type":"module","engines":{"node":">=24"},"gitHead":"ce32cc575bf92ba4b5b7c4d04caa7885f7518940","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.18_1772079956903_0.137632234315735","host":"s3://npm-registry-packages-npm-production"}},"2.2.19":{"name":"@visorcraft/idlehands","version":"2.2.19","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.19","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"2966068cc3fcdb2c81f8c6099573e429743bb1dd","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.19.tgz","fileCount":475,"integrity":"sha512-BfeEU2Jmz35D2j0nrPr0w6UzDm9qtfIKKlOIbXUQ/+xHjPXdOZOGOiC5aGQarwb3ee7bNymhxZtlok4FVYedcQ==","signatures":[{"sig":"MEQCIFgft5NCU9G34y9NMdp/C4+Wqcc73qIZ0dannLWwBd8UAiANv2v3JEmzyqfZavQ1LkcexIvQ9R06LH+xSXnv5yclWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3828744},"type":"module","engines":{"node":">=24"},"gitHead":"2bbc5101e93714f20c742dacfaa75c0dbe2afe56","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.19_1772080196505_0.6791973233593109","host":"s3://npm-registry-packages-npm-production"}},"2.2.20":{"name":"@visorcraft/idlehands","version":"2.2.20","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.20","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"f066219a002bac626c594c271d5d4bb6f65bb80e","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.20.tgz","fileCount":475,"integrity":"sha512-mAdoepGlE55WnSsYcrAlbWJQ37wWb6Nnm4ZJ9m3fVdBAR1+cd7Z5fj2r0FuvCokkvQh5IB10GODI1tj1KftVqw==","signatures":[{"sig":"MEUCIG2of4nH3xODVzN4/71PTNHowXHkJxMXfrdwG/0oNYYlAiEAsIXrGCIcV79cu70VawBXNxjtV039rVHGwSAdwdokBWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3830231},"type":"module","engines":{"node":">=24"},"gitHead":"7683c827249ca567fa122f4e15f6bd989139e12f","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.20_1772084952003_0.6375093518534487","host":"s3://npm-registry-packages-npm-production"}},"2.2.21":{"name":"@visorcraft/idlehands","version":"2.2.21","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.21","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"cfd4b5f46877f022d690947523ee0376b40c6f38","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.21.tgz","fileCount":475,"integrity":"sha512-c4ysX3g8/8zKSOot4iqQZTMkaMvjyACqHKTOU01WlHori8wGYeQa+3SUw5U0MtYpkyiz4rEak/ZwJHOnK2Wrmg==","signatures":[{"sig":"MEYCIQDBTnYvyrX/aPeDjSCJeONBOi3S1CKpaWfM5l1gleqDjgIhAIyX8tHoBHa+maPlTdq1hVudGG/8hrspXcuHbizi3o1A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3831040},"type":"module","engines":{"node":">=24"},"gitHead":"ccfe554b79058a934b0227d014f9cc0b2b322331","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.21_1772085369757_0.2981792982924798","host":"s3://npm-registry-packages-npm-production"}},"2.2.22":{"name":"@visorcraft/idlehands","version":"2.2.22","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.22","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"63550b73ada1144dc6a980b42f93dab906db5d8f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.22.tgz","fileCount":475,"integrity":"sha512-SEd1ZnDFsNyaE8h6SqZjhbRSHaEkCReBbS8Joz+2tdUgoDrl0ehD1FJkJVf5ULZsX3bfuliMwNKXnRcilcF1ZQ==","signatures":[{"sig":"MEQCIC1iPRt8QGsyqU0NyCCf7xX3v+/qLm8gw9o1TjQDI1/fAiALDp1P3Fac8CzG/sxtCMaK/Pl8/kEuo/Jp6hNFPNFOXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3836080},"type":"module","engines":{"node":">=24"},"gitHead":"051a527235782939985f89634dace1da197bfdb7","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.22_1772086605186_0.9714350927888145","host":"s3://npm-registry-packages-npm-production"}},"2.2.23":{"name":"@visorcraft/idlehands","version":"2.2.23","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.23","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"ed8e1527f9fc50138c35390b1f4c7275ee1418ff","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.23.tgz","fileCount":475,"integrity":"sha512-5oxCCwEZO/lM31vKDFgPOa+QgQpGCGLG4q5dqmUOMWtX3e1UdpVkCJfD54pNb6aPVHmyRDYWxedHfaVFudv4YA==","signatures":[{"sig":"MEYCIQD/D2uNTTuIUOe7nGKDYvbK+kMutfPB8N1zuwuliAzrvwIhALdFAJeBziD2CYHgmhRCQHtwZatywtYE8MTra24ZfjBL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3836175},"type":"module","engines":{"node":">=24"},"gitHead":"93cc1bbae1ee645aaac097d10aaf8768ed9f627a","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.23_1772111322517_0.3255687734073167","host":"s3://npm-registry-packages-npm-production"}},"2.2.24":{"name":"@visorcraft/idlehands","version":"2.2.24","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.24","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"cc5a36d8c6d12798c745fb364eb17d8e7fb9155f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.24.tgz","fileCount":475,"integrity":"sha512-k/ORbADBCxTQa9pDGG1EymRc9TOoQHYwKn+F+vJ0K7DYAk5eDMh5XqG/lyC9qLFfDr3tcj83TeuUixMVDhjOFw==","signatures":[{"sig":"MEUCIFzG2bGHa1vt1o1VXdz7xezimnA909novVDMDVU90mtmAiEA16XRxCb30lnsE93qva6Jp34t2qSqLYJBPudVfgmL0MY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3836291},"type":"module","engines":{"node":">=24"},"gitHead":"e5f59f580019a02a202787fc3cb7496f8d4370a9","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.24_1772111726382_0.696958272731278","host":"s3://npm-registry-packages-npm-production"}},"2.2.25":{"name":"@visorcraft/idlehands","version":"2.2.25","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.25","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"e9c084f4026aa14d14956e71bcd2bbcf7a6b9502","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.25.tgz","fileCount":475,"integrity":"sha512-1/Su0XGcASkUKUX50EMKDfZJvDcZG5axZjyohOrze/NIYiJnXJcR6iIBFAySegHi573AsX3MgnbtmEowkI3aPQ==","signatures":[{"sig":"MEUCIQC3u0o1eN7382G61P2Lw0TzdFlCFrsKmJ3+F6RFOY75yAIgHc9RA/c2/ECysh3hkOxj7gErs5NJDdFH9mLIlwhuxwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3840932},"type":"module","engines":{"node":">=24"},"gitHead":"a0d442ac6aac9e798a28f382085fc4ca4c0f83d3","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.25_1772113815588_0.9292212199009289","host":"s3://npm-registry-packages-npm-production"}},"2.2.26":{"name":"@visorcraft/idlehands","version":"2.2.26","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.2.26","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d0701563626ee513cfbeae584f2baaeda82a5524","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.2.26.tgz","fileCount":475,"integrity":"sha512-OtUu4vpLeQpSFNThTNBpIXzTBmP6UuWLwc/MynpgOZabAjc0BkaH7X7pv59is8tkQgqcFvUU3omOMtdD+rU6mg==","signatures":[{"sig":"MEYCIQCRPPB/atn6ab/tQq4RWNGuW7cEIVPWC0NKOLfFDcd0oAIhAKTD7dxQLHNCD11E7ziyGbMbQKgmm1QVOt0OelUnkmcK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.2.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3861535},"type":"module","engines":{"node":">=24"},"gitHead":"cc50dbe5881a2c3beaf0a23d01af47b03a2b627f","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.2.26_1772119467457_0.27496428549993546","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@visorcraft/idlehands","version":"2.3.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"b796f88e3012ace42717bb0d9660193eadba7f53","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.0.tgz","fileCount":475,"integrity":"sha512-Fuzq6SgexEwBIDC9lFHw++UPIA0EHbG00hyvk7yrwAq0nrNAzRt3J3VLBkMY6z6ZeonwmU6/bTG9E7Bo5k+mUg==","signatures":[{"sig":"MEQCICwjaBu9zQ1/F+1Zt7w/1hsZTGW5C0KdZeO+3qRJf8f3AiBmz85P0X1mjAXZYXKkUoKmlrojSeGv2tcpDTTzMJfuWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3883827},"type":"module","engines":{"node":">=24"},"gitHead":"240baef7c9f98d91e6f032bf787aac7d4e1c8ef7","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.0_1772128168972_0.04445408759272307","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@visorcraft/idlehands","version":"2.3.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"fc5bf1f4ad37c4983fdf0efd8d0971f01d693d6f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.1.tgz","fileCount":475,"integrity":"sha512-ZbKT05GBAl7CcoMKXXxF+TtqbnOuUt7yEU6c69cCoIdndVrKt5dI8iV3/UANYZ2/P8jUMmOQ0rJUdvaYh7ohHA==","signatures":[{"sig":"MEUCIFV6MCfGlbYSXsQzKwRKcCnkNofx+EOtYyDpiZ/jX76bAiEAsBzXmFBbkPq4na34ndkGTy62HAh24bYqE4Qi95rMeck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3885530},"type":"module","engines":{"node":">=24"},"gitHead":"24b8c967a33dddc86fb848ddb6259729e9ee77b7","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.1_1772133610985_0.27308838415452974","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"@visorcraft/idlehands","version":"2.3.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"c5ce062126d76a226e19a4e2766411919f6d5895","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.2.tgz","fileCount":475,"integrity":"sha512-b8EGtohb2pq69S05pbxdqtiGWZ2ehIVNBC+ir7hgxnbR4JaZKc9xzifWopZp/GxdANkfUXB6iiYRTArTNI/OFw==","signatures":[{"sig":"MEUCIGr0uuUTcSxDYQL/9VMecxqNR6WGkadsKSgsUub6s6Q1AiEAzzr5RR7O9uoUGrYkUSE5QfIG7egp/8OPxwARL4INv5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3893485},"type":"module","engines":{"node":">=24"},"gitHead":"604a0bf073c09cb6476dd7b3ea2792ea4df0a5b0","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.2_1772141067734_0.007759963822086435","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"@visorcraft/idlehands","version":"2.3.3","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"6c378f024efdea3a096b858005c51978fae1f507","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.3.tgz","fileCount":475,"integrity":"sha512-N9+p4pwcfumMwIBwU/OMP2Ec2T5Rf1NWfotEwrJcFtApgf8xbygRmbbsLwLJ+7qUv+axxqOgUVnuB/fda5cEAQ==","signatures":[{"sig":"MEYCIQDK09BkkDbam5zh4BR+ZfjGWpcHx7AHEIsk801ihIiQZgIhAIHu1Na0RQ09MzNJtpKJ5DWngH4rzEX92zuPB9dtN+Jq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3894877},"type":"module","engines":{"node":">=24"},"gitHead":"18de9a155e55fb84be9f2e38a0bcdf1db9027185","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.3_1772142918428_0.49581487285241077","host":"s3://npm-registry-packages-npm-production"}},"2.3.4":{"name":"@visorcraft/idlehands","version":"2.3.4","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0a0f15f797c906394943634f6259f70e4f446d65","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.4.tgz","fileCount":477,"integrity":"sha512-gsgoi8ccPaohZkIeqALI013wP9YoB4Dyo7bApjOga835+n0j33648PoCppkdg2QmLYfMuQ+7KTjFEaw0ijs4Pg==","signatures":[{"sig":"MEUCIAfnCP7E8HKsHFNuXiuJNI175R02FrKHr6tDztCaboecAiEA395AREmqGcxWkwj12Nsyna7SitejCNGJqMgjSBWR6EM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3946243},"type":"module","engines":{"node":">=24"},"gitHead":"c7c703122f73aaa17666a50294d03f69a5854e4c","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.4_1772161198109_0.3957825605202778","host":"s3://npm-registry-packages-npm-production"}},"2.3.5":{"name":"@visorcraft/idlehands","version":"2.3.5","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@2.3.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d1511d51a52a18cb5f7e4f70fa8f0ec4cd2eefc7","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-2.3.5.tgz","fileCount":489,"integrity":"sha512-29t1rnLjeycRZQTbu3bq1RI1YA1ljOJKy/+ygsZBeAzwmdTPwdW2xHNu4Sgcd+QXdGk1FJE0dRel9LNsXlIWvA==","signatures":[{"sig":"MEUCIHTrAD3n43BVH9jc0yx4ZwEMsskvX/jJhYNJwLNjwR3sAiEA9ZP6xdZsmdzdP8zx00fFSwSlqSaL7+4ou2K+tIZunb8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@2.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4014794},"type":"module","engines":{"node":">=24"},"gitHead":"4d2cee970dfe757a758fc6fbc2c56bd40aa4171b","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_2.3.5_1772161725377_0.7487712083703562","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@visorcraft/idlehands","version":"3.0.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.0.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"d8fc07d8174b348464b8ad58507c09220fe90f25","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.0.0.tgz","fileCount":489,"integrity":"sha512-AVCT0srOMqDOneI/rxHdrU40d6nOxpMla4Nrb5IxviKc1ahtdx7ohngjxD7CZJ+HukY5iXtGeIHQYx5krK47qA==","signatures":[{"sig":"MEUCIEygQzaWcTxGSHKf5JnzEW96JaaHp+yYgJiaKDi3bCJLAiEA7lJLPr7WpRRECmtDx+HobWAbVKH8UxbjHnmT9TRHs40=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4021184},"type":"module","engines":{"node":">=24"},"gitHead":"7e73e3857d0b58a51c2bd42512099fabc30a7cb4","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.0.0_1772199692662_0.7125249915724892","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@visorcraft/idlehands","version":"3.0.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.0.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"eb9da40c9a512ce66b41d6a259631a551aaa0490","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.0.1.tgz","fileCount":489,"integrity":"sha512-h9J3fJxg83sPtKYuMLPf0NRUHKgxarSROAv18n5599+Cl+wH5qrBqhzvssVNJwO3TOEfLRlfXWyukUJaCZBwOg==","signatures":[{"sig":"MEYCIQCkG7WLV2pa3SIaau/Fvb/KsTectbK8ABE+5j71QDZWkwIhAO5IOYkPUOxh7yE0wBLHJYyqPP/957o58fvBWkt7zwPE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4032519},"type":"module","engines":{"node":">=24"},"gitHead":"976fc3efdfab38f500f81dce879fcc6ff0deed56","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.0.1_1772205117970_0.579298745225705","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@visorcraft/idlehands","version":"3.0.2","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.0.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"699453812bc1294fcd42a9a71d21f66b34cd6f6b","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.0.2.tgz","fileCount":489,"integrity":"sha512-o1OAy4vtHiI054/wN4/acui0//WD+pkt7psPo1Db5W2Cfd4sC2/RoVDsPx/KBwIDDjyba/jxpN9ExWuRClEaWg==","signatures":[{"sig":"MEUCIQCVVcUypGsgSpb8RuQ2WWXRH6SepCvDyeGSI2g3K6I9zwIgSczzF8Wx6WfxxIXWUMAacHGrborfQf9PpjXXBCb3664=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4035139},"type":"module","engines":{"node":">=24"},"gitHead":"6c02497aae2c7153ecc63216d7ba8c557b2b85fb","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.0.2_1772211333486_0.4944617232034445","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@visorcraft/idlehands","version":"3.1.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.1.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"0188f00f6366a12f1511e2bed38fefd36f762422","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.1.0.tgz","fileCount":491,"integrity":"sha512-L4W3HWvC1qtn2VTtfk7NDs/BOOVMA657aSdrtNVrEsoJQnJ2se0O/T42zS94zMvoMUbT0MEpxNgP2sxtVbQCYQ==","signatures":[{"sig":"MEYCIQDhmLzQIQMj6P+Z/rKNI0SXueazNx6SxeFlC16jHdxJMAIhAOgSQePbX3uFVfU9/skHOgETx5jHaZxOcVd37D0Zr0eT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4069343},"type":"module","engines":{"node":">=24"},"gitHead":"5ae54dd069d13c9f83099516f95aa75c9c1803db","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.1.0_1772296592355_0.5780316628928672","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@visorcraft/idlehands","version":"3.1.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.1.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"cdd849eaeb16e267e627950014df1c69b8ba776c","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.1.1.tgz","fileCount":491,"integrity":"sha512-qhw+gTH9dZ/fPyCRjA0KZ48RcwLCnPgTujEajeG0rgS8JGWQx1aECe/hNcz+wH5G+mPJo41E6RicwiNSju1/OA==","signatures":[{"sig":"MEYCIQCv+zT2Xmf1USk1xF3FCap5tBFQhac9wrEYh/brmSQ+mgIhAMWbHj69u4Bhd8IB5dQD6a9x1dnEF23ALQuLExJnRxW6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4069679},"type":"module","engines":{"node":">=24"},"gitHead":"d0eeb18e5cf08facc2b6b24b441f0fb4b4115180","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.1.1_1772333259648_0.2842261040016296","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@visorcraft/idlehands","version":"3.2.0","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.2.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"fc278fab0c5088a6920cb0935070ebf54f71bf05","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.2.0.tgz","fileCount":491,"integrity":"sha512-ZjUqoFcx/e+zcnxcBkkdFsawMB0zaO+vP3moWoKfVLHfwyiIIhmbvifT2skXqaVfWHMfKYFWS1via1VIkLfubA==","signatures":[{"sig":"MEYCIQDnLrmWSXVO6fkvWrT9cQ6IJvLpVWBP7kNb1nzOHc5ZJgIhAOZFf/BNrbhdiCQnKyt0oIzNFz8387YukjkXDmJaI12t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4069686},"type":"module","engines":{"node":">=24"},"gitHead":"5c6805ecadb820c2c597ac345b044ed89b800264","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.2.0_1772333697094_0.11752526033602417","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@visorcraft/idlehands","version":"3.2.1","keywords":["llm","agent","cli","openai","local-llm","tool-calling"],"license":"MIT","_id":"@visorcraft/idlehands@3.2.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/idlehands#readme","bugs":{"url":"https://github.com/visorcraft/idlehands/issues"},"bin":{"idlehands":"dist/index.js"},"dist":{"shasum":"ae506c91d4ec5f2002efd01d617a3f2db4713171","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-3.2.1.tgz","fileCount":491,"integrity":"sha512-MbaB6upQTqy7QPkAqcdhr/WbQx5VyDXn0JqXpNLHKQaMXBm72acuNk82/ZBW8yWm7vxuvrsDXEg3ilDCNf+lbg==","signatures":[{"sig":"MEUCICAhjyn830rkBZ1WL8M53c+lZpGVTiZhQJBPrM7uUMCJAiEAiXfRlnxS3tVUkWT0Jgr1XFzD2d6cwigMWJctpT2+xK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@3.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4071461},"type":"module","engines":{"node":">=24"},"gitHead":"bf3aa2cfbefde1e7acdc9084ec14443c4c65dbeb","scripts":{"dev":"tsc -p tsconfig.json -w","lint":"eslint src/ tests/ --config eslint.config.mjs","test":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/*.test.ts tests/tui/*.test.ts","build":"tsc -p tsconfig.json && node -e \"try { require('fs').chmodSync('dist/index.js', 0o755) } catch(e) {}\" && node -e \"try { require('fs').mkdirSync('dist/sys', {recursive:true}); require('fs').copyFileSync('src/sys/snapshot.sh', 'dist/sys/snapshot.sh') } catch(e) {}\"","start":"node --enable-source-maps dist/index.js","format":"prettier --write src/ tests/","prepack":"npm run build --silent","lint:fix":"eslint src/ tests/ --config eslint.config.mjs --fix","bench:run":"node dist/bench/runner.js","typecheck":"tsc -p tsconfig.json --noEmit","bundle:mjs":"node scripts/bundle-mjs.mjs","perf:agent":"bash scripts/perf-agent.sh","test:smoke":"cross-env IDLEHANDS_QUIET_WARNINGS=1 npm run build --silent && cross-env IDLEHANDS_QUIET_WARNINGS=1 node --test --test-concurrency=1 tests/config.test.ts tests/runtime-planner.test.ts tests/bot-ux-renderer.test.ts tests/bot-ux-throttle.test.ts","bench:build":"tsc -p tsconfig.json","bench:report":"node dist/bench/report.js","format:check":"prettier --check src/ tests/","bench:compare":"node dist/bench/compare.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"overrides":{"undici":"^6.23.0"},"repository":{"url":"git+https://github.com/visorcraft/idlehands.git","type":"git"},"_npmVersion":"11.8.0","description":"Local-first coding agent CLI for OpenAI-compatible endpoints","directories":{},"_nodeVersion":"24.13.1","dependencies":{"grammy":"^1.40.0","discord.js":"^14.23.2","picocolors":"^1.1.1","web-tree-sitter":"^0.26.5","tree-sitter-wasms":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","esbuild":"^0.25.9","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.9.3","@types/node":"^24.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"optionalDependencies":{"node-pty":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_3.2.1_1772334580407_0.3056750955850005","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@visorcraft/idlehands","version":"4.0.0","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"9970b5fc9cb4642b97d4a12f27e17fb2e8c0fe2c","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.0.tgz","fileCount":4092,"integrity":"sha512-lXQepeSZkPAtlzPfpmJkJxxiyClCQoAJ7vPuJSZWnI66J8h1OMZQFzVmGBQLlgbdqJQxlQ0DK0fc+jW5EdcBjA==","signatures":[{"sig":"MEUCIQCNIh4Ind6Ac4f2fPLqDxoQT5QUNBEY5yx3EGhTZzw1tAIgX9gEQ6yJ/sHjCVc9cby5Vy8dHElxfef5ML6ZnfY/J4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60755128},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.0.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","moltbot:rpc":"node scripts/run-node.mjs agent --mode rpc --json","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/4c332eff747c681089fcfb5f341bd3ec/visorcraft-idlehands-4.0.0.tgz","_integrity":"sha512-lXQepeSZkPAtlzPfpmJkJxxiyClCQoAJ7vPuJSZWnI66J8h1OMZQFzVmGBQLlgbdqJQxlQ0DK0fc+jW5EdcBjA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.0_1772379575007_0.06389151189570486","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@visorcraft/idlehands","version":"4.0.1","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"4b9f4338b392317f6acf42a3c3cbfeb23a9373ae","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.1.tgz","fileCount":4092,"integrity":"sha512-En6NGfCf2BDmuRZMRj9SHTAk+LYdDn4QZqM5qeuIlh9DvKKlkn66ZjqgHJDmopoiJ/VEtSe5ZcCW8bHOWzSlOg==","signatures":[{"sig":"MEYCIQCWGIVlKpMhA3iZhrbj8nHPwPce0vGoeqBvGya4kWPoPQIhAMtz642SbgnA28weK8RQOj2qI6QrspXq8EKX9VlGk2R/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60753198},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.1.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/d5900835b5a9d673422e763431a2d6f2/visorcraft-idlehands-4.0.1.tgz","_integrity":"sha512-En6NGfCf2BDmuRZMRj9SHTAk+LYdDn4QZqM5qeuIlh9DvKKlkn66ZjqgHJDmopoiJ/VEtSe5ZcCW8bHOWzSlOg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.1_1772380588246_0.38256002270280787","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@visorcraft/idlehands","version":"4.0.2","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"ed346735212bf3bad4c293e547449deaec1f5294","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.2.tgz","fileCount":4092,"integrity":"sha512-skzA16havBN6frxzdoDuU4mVuUg4Y8Oe1f3BDrJzyW2pSnJqmSceOJVtL0IQfYYZs8T3eVtYK5XoYrV/+MbMhA==","signatures":[{"sig":"MEQCICyeRsP4kqrXm9offLMNUJsra0OTZQw7mRnaCJXN2PeGAiA1J0wmyvbgr5Kyp5VB29Kv06kMo/ftnb4r65XvldyaMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60754058},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.2.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/bab5be0e85bcaebfd9d9eccb36c36291/visorcraft-idlehands-4.0.2.tgz","_integrity":"sha512-skzA16havBN6frxzdoDuU4mVuUg4Y8Oe1f3BDrJzyW2pSnJqmSceOJVtL0IQfYYZs8T3eVtYK5XoYrV/+MbMhA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.2_1772384244083_0.6885536933980492","host":"s3://npm-registry-packages-npm-production"}},"4.0.3":{"name":"@visorcraft/idlehands","version":"4.0.3","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"477877435e9437b345c0f33c2504afd22ac27819","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.3.tgz","fileCount":4092,"integrity":"sha512-ln/mJUEXnmt8ok/zyERYxgDCyXMp0F1rMc04iowwbVzpK+EOZKhJ61H3LuU1jn2o+6I5HMwwmqIcgi/Ud5v4nQ==","signatures":[{"sig":"MEQCIFrGs3K7ecjMZa8t9ENSs3hEvABo1e0DMey/weqIV+gIAiAmql73skDZO6+xHFwPVl2stVJYiO5VThyZiWXtmhs9dQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60756036},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.3.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/2baff5b70eec5a73948921076bdcc504/visorcraft-idlehands-4.0.3.tgz","_integrity":"sha512-ln/mJUEXnmt8ok/zyERYxgDCyXMp0F1rMc04iowwbVzpK+EOZKhJ61H3LuU1jn2o+6I5HMwwmqIcgi/Ud5v4nQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.3_1772384943990_0.8863863402644503","host":"s3://npm-registry-packages-npm-production"}},"4.0.4":{"name":"@visorcraft/idlehands","version":"4.0.4","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"3d629827ba315382261e9a113d8c84f249f306d2","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.4.tgz","fileCount":4092,"integrity":"sha512-D28psxKbaApfgKfGjvq806D1G4zW6Xj47Y3p05+aeqEIssDYpqq1mapIKjQLCMQ4vJEyGDB0skAeF5KJhrE9Ag==","signatures":[{"sig":"MEUCIHzw/SPID81FQ0p9G8awwRiG1bBkGY2mkS2+lLNX5qQbAiEApYuXTPa12wbqnepoAYGP58rgtAzRsg7QjqyLzPCZJOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60756846},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.4.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/1b1068230017bd57a2945aec76deafcd/visorcraft-idlehands-4.0.4.tgz","_integrity":"sha512-D28psxKbaApfgKfGjvq806D1G4zW6Xj47Y3p05+aeqEIssDYpqq1mapIKjQLCMQ4vJEyGDB0skAeF5KJhrE9Ag==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.4_1772386175688_0.6261522909499708","host":"s3://npm-registry-packages-npm-production"}},"4.0.5":{"name":"@visorcraft/idlehands","version":"4.0.5","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"c38c70e2ba8aab44de077c88762f6bdcb3765fd8","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.5.tgz","fileCount":4092,"integrity":"sha512-8iCsKSjL+Ll80rbU0EUK8rqRPQfLWRJGTFiVdxKiegCNM6cUgicDlYgVz8K7tTnwTtp7rBhmNCEutiikcRub1Q==","signatures":[{"sig":"MEUCICdskq1KmSys8m+2kT37AeXuTjp9SzqmTe8BkqnlyeEsAiEA8IgFLUbvsCVI8Jx0O620LMq1ek7Wh9vdFzu2PtPE+40=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60757274},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.5.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/9e92e61f3dd50154e76eb2f77c259da8/visorcraft-idlehands-4.0.5.tgz","_integrity":"sha512-8iCsKSjL+Ll80rbU0EUK8rqRPQfLWRJGTFiVdxKiegCNM6cUgicDlYgVz8K7tTnwTtp7rBhmNCEutiikcRub1Q==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.5_1772386874444_0.545354504906225","host":"s3://npm-registry-packages-npm-production"}},"4.0.6":{"name":"@visorcraft/idlehands","version":"4.0.6","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"da8a3ac2699a294466d583c9161f951509e4e6b6","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.6.tgz","fileCount":4092,"integrity":"sha512-4y3MwsRwO5954en3BXHOGziwFmc5JRUXhHNB14MvFJlQteimdMLBxQbIwjk7RMEoqvn0NcjV6n3cnk6XATe8CQ==","signatures":[{"sig":"MEUCIBVr80tFX/kRhd6y539dvscZ2p3tEsUqIumXu2QQFmUiAiEAl8b9IEc/5qwXNJNZHAvtjw6wTgTGwbGJZQs+95uywXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60759656},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.6.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/740be564316955657dba8490e7dde236/visorcraft-idlehands-4.0.6.tgz","_integrity":"sha512-4y3MwsRwO5954en3BXHOGziwFmc5JRUXhHNB14MvFJlQteimdMLBxQbIwjk7RMEoqvn0NcjV6n3cnk6XATe8CQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.6_1772388874460_0.2627570627823843","host":"s3://npm-registry-packages-npm-production"}},"4.0.7":{"name":"@visorcraft/idlehands","version":"4.0.7","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"19c1575e2cb2b72866856afcccfdbab7030c3536","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.7.tgz","fileCount":4092,"integrity":"sha512-lWeQs618lvOJzzWneBDylA7KzQ68E0XKSP1A28MzwHXSnRYhPBv1VjyhrPbUW5xpFunE0gpwfUZJL2pLHBSRfw==","signatures":[{"sig":"MEQCIC+3aRQCGyG+yRnZCIpOf678ZUSBmWIc9KUGuzBFrqYIAiBkTJ3ZK5ylxe0r05Yl0GeDZVO7qIsO/rNdVt5jR59PnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60761437},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.7.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/8d0ff2bc3c95a1488b90ab947a118fce/visorcraft-idlehands-4.0.7.tgz","_integrity":"sha512-lWeQs618lvOJzzWneBDylA7KzQ68E0XKSP1A28MzwHXSnRYhPBv1VjyhrPbUW5xpFunE0gpwfUZJL2pLHBSRfw==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.7_1772389505047_0.5444091429113793","host":"s3://npm-registry-packages-npm-production"}},"4.0.8":{"name":"@visorcraft/idlehands","version":"4.0.8","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.8","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"7c61297bd861781b7f72531ca73759fb3752517c","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.8.tgz","fileCount":4092,"integrity":"sha512-2cz1fuN79FkITOURuZpkdf6Aego5ha218fZGWcSiopAs1SKkxmkv0V5BkjOa53cgOekazMu/9E7HTEeol6c/VQ==","signatures":[{"sig":"MEUCIEkvRTAuwSVZ//a4vrq62S7vJubGQBkP6tvvwxRa+FW6AiEAx7MFMedr9WoVAnVcYleSJvWPDpEZmtxIPu366cE/BY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60763461},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.8.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/fad1b8c7540afa1dd80d5aa273c0f388/visorcraft-idlehands-4.0.8.tgz","_integrity":"sha512-2cz1fuN79FkITOURuZpkdf6Aego5ha218fZGWcSiopAs1SKkxmkv0V5BkjOa53cgOekazMu/9E7HTEeol6c/VQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.8_1772390344152_0.2119377224234411","host":"s3://npm-registry-packages-npm-production"}},"4.0.9":{"name":"@visorcraft/idlehands","version":"4.0.9","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.9","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"357317973971a0ccdaca8457c38fbfe041048ec7","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.9.tgz","fileCount":4092,"integrity":"sha512-6Cn5WcdCLOLr29jkdnz2FGhnxOb+/DWAD6aMKxfE2aibDm0MYG9JgdbPdK/XF2gVGTsyy6yI8kqDZ4ttMhbONQ==","signatures":[{"sig":"MEUCIQCHZWwpmensXkW7UJ34xsBxBv9dx+h86nq83TZfsV/ZCQIgVtiwOerUDkLLadPCK5NgqIhp8JUOMZuk0KoSaBdR4kQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60764082},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.9.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/1ae1a1628d168fd304d4acccd7167ba9/visorcraft-idlehands-4.0.9.tgz","_integrity":"sha512-6Cn5WcdCLOLr29jkdnz2FGhnxOb+/DWAD6aMKxfE2aibDm0MYG9JgdbPdK/XF2gVGTsyy6yI8kqDZ4ttMhbONQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.9_1772391669974_0.46612601239233964","host":"s3://npm-registry-packages-npm-production"}},"4.0.10":{"name":"@visorcraft/idlehands","version":"4.0.10","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.10","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"1bcfa7980b9123ba08cc1e3d9d36758b31918dfe","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.10.tgz","fileCount":4092,"integrity":"sha512-XeVg/+rPj3XzuQyBBrn47gSIFKErjfp8j03R4i//HOfd16QN4e7PklU2v8HY0Og/hyRCKp2V0khuWnkQWMpjCg==","signatures":[{"sig":"MEYCIQDEClc/VnXghsQ97k+/bSwaiPAoxMOxIoMAKfEIUicK+AIhAMYM9gxUg5LElypENoLx4dyQJQTMHIhBFzUGeuVDRGCk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60764385},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.10.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/e53cde5e10ac333c20f47ce4e5374edf/visorcraft-idlehands-4.0.10.tgz","_integrity":"sha512-XeVg/+rPj3XzuQyBBrn47gSIFKErjfp8j03R4i//HOfd16QN4e7PklU2v8HY0Og/hyRCKp2V0khuWnkQWMpjCg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.10_1772392522292_0.3895749249476408","host":"s3://npm-registry-packages-npm-production"}},"4.0.11":{"name":"@visorcraft/idlehands","version":"4.0.11","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.11","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"2afa2c4ea279c60f40109471d468d99a99c8b070","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.11.tgz","fileCount":4092,"integrity":"sha512-AwPhbtbs2xrpZaD8RpC5AI6YFLa7BMLzGuqkk8CgE1fWtP0kv4xEoZicv7zyJTq1wO8kEJrMUFLsCR4x/rPtPg==","signatures":[{"sig":"MEUCICxyQybUXlOhglBUwQIMqdhfBoxcv96tEOuf2Sq+RmHcAiEAu1hIYCHyJyojCMVK//FORsVl62R81SM/lOLgVUkYPDw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60766043},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.11.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/63c09456bc4454da7c4cb8302aa79ef9/visorcraft-idlehands-4.0.11.tgz","_integrity":"sha512-AwPhbtbs2xrpZaD8RpC5AI6YFLa7BMLzGuqkk8CgE1fWtP0kv4xEoZicv7zyJTq1wO8kEJrMUFLsCR4x/rPtPg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.11_1772393563401_0.27443842507082916","host":"s3://npm-registry-packages-npm-production"}},"4.0.12":{"name":"@visorcraft/idlehands","version":"4.0.12","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.12","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"60c2267d70b6641e433a32ce6603352ee8e1e996","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.12.tgz","fileCount":4092,"integrity":"sha512-kgwfalGroig0+E4GfOGzc/hodySbP5HibIilNAwQ51zR9bnzugA728w/W3YCpp++F/3CsR9CXocsAGrGhn4qIA==","signatures":[{"sig":"MEUCIQDSNS1F0xhvoo3dCCYn1qhHlBDVcq0CkOPeiYD27EDh+gIgMiDRRr9KSgViNjNeLcSvAI9nXku1Mib/5oULo3JXxuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60771355},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.12.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/c15f957673697f4e2f11559358fabd50/visorcraft-idlehands-4.0.12.tgz","_integrity":"sha512-kgwfalGroig0+E4GfOGzc/hodySbP5HibIilNAwQ51zR9bnzugA728w/W3YCpp++F/3CsR9CXocsAGrGhn4qIA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.12_1772396459956_0.899966432122159","host":"s3://npm-registry-packages-npm-production"}},"4.0.13":{"name":"@visorcraft/idlehands","version":"4.0.13","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.13","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"d8202a18d631590a079891c1d977c373c94f193d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.13.tgz","fileCount":4092,"integrity":"sha512-1HedzM2tYcm6/wy9i/Wi6xJ8pyKrKY19E/ieNGIKTGPQCiHZnqXRDZV3qRRPdQVxZUt8s9ZuiQm1GU835pPrPw==","signatures":[{"sig":"MEUCIQDOHgn5W9yWGokZYd5guOjKQ0yR+zEuIrJ9l1jY+hCglQIgY+zk4iGPyqkMH8IzXn65oxLgY3HAP3XwW+1fqyzDBXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60772440},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.13.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/8270e57dae83ee2e08a26d67078ed682/visorcraft-idlehands-4.0.13.tgz","_integrity":"sha512-1HedzM2tYcm6/wy9i/Wi6xJ8pyKrKY19E/ieNGIKTGPQCiHZnqXRDZV3qRRPdQVxZUt8s9ZuiQm1GU835pPrPw==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.13_1772398204896_0.4261418089883868","host":"s3://npm-registry-packages-npm-production"}},"4.0.14":{"name":"@visorcraft/idlehands","version":"4.0.14","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.14","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"cdfb45b2b4ebd3fd046bff15120fb751455f226d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.14.tgz","fileCount":4092,"integrity":"sha512-gEtb2FtKuFkB/H8sEwmGMwcpdNhJGoe1uwQqJ2IFIrnr5r4ccbAK5YQ3wbN01uX37LTGlgYLOVFAdKTkl5NG2Q==","signatures":[{"sig":"MEQCIFvW8gaWJutNwnl5BjQlv0kGZNGvNTat+Iy774+SK+tcAiAcBugYnVnl480U+ZEWJ2KMbcJFV+z6Gf4/2Uq/BjQsbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60796725},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.14.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/20fc8279773b59beecfc2c25ee9370b9/visorcraft-idlehands-4.0.14.tgz","_integrity":"sha512-gEtb2FtKuFkB/H8sEwmGMwcpdNhJGoe1uwQqJ2IFIrnr5r4ccbAK5YQ3wbN01uX37LTGlgYLOVFAdKTkl5NG2Q==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.14_1772399428075_0.5494238359921586","host":"s3://npm-registry-packages-npm-production"}},"4.0.15":{"name":"@visorcraft/idlehands","version":"4.0.15","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.15","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"2bfb5e4dc6349956e521fc3d580c8fea062069f3","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.15.tgz","fileCount":4092,"integrity":"sha512-G5CpqWjaOOEfND/g3PS7jnp+Tjl+3ugZf6G7TNzWsRDnMmyO36V6bJX/rqMWjtnq6s9a9O0Sh0fdYRknu5Lsvw==","signatures":[{"sig":"MEUCIEQsSWZPdf6Xvun1ZU83g+37y2TccyyWEy84ZNI9/iCyAiEAo+fjmgykXD8VM/+CQYS3vd5+i3ahn8ReDLlkCu5G2eY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60802583},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.15.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/9ad7f304868043796950602c00816e7a/visorcraft-idlehands-4.0.15.tgz","_integrity":"sha512-G5CpqWjaOOEfND/g3PS7jnp+Tjl+3ugZf6G7TNzWsRDnMmyO36V6bJX/rqMWjtnq6s9a9O0Sh0fdYRknu5Lsvw==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.15_1772399595088_0.08973917356377892","host":"s3://npm-registry-packages-npm-production"}},"4.0.16":{"name":"@visorcraft/idlehands","version":"4.0.16","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.16","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"c43a15bb64cc4d85a8aba609cd3cfcdd25a207df","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.16.tgz","fileCount":4092,"integrity":"sha512-Im5cpuD2rmuphc4Px67i9X/8h0m3oA3wI93WB/hgH6/Xg7YqqlvFy++7nS2PG4BXWvDnekukbiaw/axOXsc+NQ==","signatures":[{"sig":"MEUCICBTYQAALtxwEVAQICFv+EN0/ybij4an0KNh6GojYYTTAiEAq3iAymbuIOgxT0eaPPrcW4EDJyXnvGag/DEMkAWCF7g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60804639},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.16.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/d3352f7611fed152f921d3a62f3be4a9/visorcraft-idlehands-4.0.16.tgz","_integrity":"sha512-Im5cpuD2rmuphc4Px67i9X/8h0m3oA3wI93WB/hgH6/Xg7YqqlvFy++7nS2PG4BXWvDnekukbiaw/axOXsc+NQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.16_1772400182015_0.019543107120949754","host":"s3://npm-registry-packages-npm-production"}},"4.0.17":{"name":"@visorcraft/idlehands","version":"4.0.17","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.17","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"45ef1dc38634c45f74a753f036d3a7fc65960b74","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.17.tgz","fileCount":4092,"integrity":"sha512-E8chuYX971yj7ni+TjaJ8xDp1Ck1pTbuvrXzgfDmolJyKG5isuGYVdRAoPF5Noc9zLEn9yg7AkN7FhsG+Y+LWw==","signatures":[{"sig":"MEUCIQCRwZM+T+L2jyo0ZMESqWhMRegKoUNh2bnR0Ki0WQggqwIgbSVwVNnvZwTao2ViC9gbhbEUIn5vPkwCdQwn7b7g8sk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60813059},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.17.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/4ba233f911b665b74dc99d023b3f6a26/visorcraft-idlehands-4.0.17.tgz","_integrity":"sha512-E8chuYX971yj7ni+TjaJ8xDp1Ck1pTbuvrXzgfDmolJyKG5isuGYVdRAoPF5Noc9zLEn9yg7AkN7FhsG+Y+LWw==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.17_1772400448855_0.6158014844604354","host":"s3://npm-registry-packages-npm-production"}},"4.0.18":{"name":"@visorcraft/idlehands","version":"4.0.18","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.18","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"81cc23c6ce7efbc9410149a3530aca61b3f02613","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.18.tgz","fileCount":4092,"integrity":"sha512-5QFV/DooCzXI94Pp9UjbTSX8c5tW4bYT8KtEIGTaSwigErWSRl+uBbjRYpc9BEXmVJA3KkrPv1i3JOv3EVpKyQ==","signatures":[{"sig":"MEYCIQDch9cLxthZI5vM5rVJKQ/pGfpv+LQSZMZDLrMfVGdyCAIhAMc49jFWaWZx2AJ2hspIznz8ixwlGHFU0djw/0ukqnQ8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60815192},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.18.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/660cd554703c540319e4f096864bc3cf/visorcraft-idlehands-4.0.18.tgz","_integrity":"sha512-5QFV/DooCzXI94Pp9UjbTSX8c5tW4bYT8KtEIGTaSwigErWSRl+uBbjRYpc9BEXmVJA3KkrPv1i3JOv3EVpKyQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.18_1772401559741_0.2938122846849418","host":"s3://npm-registry-packages-npm-production"}},"4.0.19":{"name":"@visorcraft/idlehands","version":"4.0.19","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.19","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"05c5ced997c74982aba794a30dd4fe654ac20c21","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.19.tgz","fileCount":4092,"integrity":"sha512-HyoVVlgEcb0kEW9ItE1Op3PqhGIIe9aSKBniHzjJj+c8A+isHqtDFuJyDFLWj6Ae03xYFNu66fs1lCEQMDVDOg==","signatures":[{"sig":"MEQCICBcDCClveVjhhHtSqM76amIEP6sR4rntybywrS60m69AiBlXT+dC3Kw+EAYdTUwj1aBsRtRlvoIKeLoxI4ShkGG3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60820056},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.19.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/7cfb31ce3e1e99c1c0f9675be6898e1d/visorcraft-idlehands-4.0.19.tgz","_integrity":"sha512-HyoVVlgEcb0kEW9ItE1Op3PqhGIIe9aSKBniHzjJj+c8A+isHqtDFuJyDFLWj6Ae03xYFNu66fs1lCEQMDVDOg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.19_1772405185852_0.8463106507062887","host":"s3://npm-registry-packages-npm-production"}},"4.0.20":{"name":"@visorcraft/idlehands","version":"4.0.20","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.20","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"23e07480cee17b72a24796b2ab84b9ec75438e6d","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.20.tgz","fileCount":4092,"integrity":"sha512-Kp/It0Na/BF6nyft3WEUla7XXUskfreAOs7M4Pal7oDWaQ8y2EV4USgOHebnLO13zAItw3vfQtd61qUcPYYKVA==","signatures":[{"sig":"MEUCIQCSMgi4tRXnLqft2ePIn0Z7QoBtA0NJKvP77UVquBWLKQIgSBhfu+FDYJ+VREJVq3CMcHe6CFNMOvL5MiqGA7LsqUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60820632},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.20.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/a2476bfa6356d54fb510066222a604f1/visorcraft-idlehands-4.0.20.tgz","_integrity":"sha512-Kp/It0Na/BF6nyft3WEUla7XXUskfreAOs7M4Pal7oDWaQ8y2EV4USgOHebnLO13zAItw3vfQtd61qUcPYYKVA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.20_1772405580491_0.8949030365780135","host":"s3://npm-registry-packages-npm-production"}},"4.0.21":{"name":"@visorcraft/idlehands","version":"4.0.21","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.0.21","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"91966f74f41314c5b20d5a20dc375af4d4f229f9","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.0.21.tgz","fileCount":4092,"integrity":"sha512-E3f+GmWNDSonoQ/+1JikuXQ79zlAKNu9dloRdjatJazBkI/1570yUCmqgl7ftWmgiGj8Df5K7lvhas9hb1Pj3g==","signatures":[{"sig":"MEYCIQCpDlwTRfhTUyY1Pr8GC+iQZFhisBWD4ATHgDH73YVkfQIhALWdQfAMAYGlIPpDKQwydYQpfFJeljztjOF09YbARWz6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.0.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60820470},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.0.21.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/8158f6745a09f82322562f7bdbd769d1/visorcraft-idlehands-4.0.21.tgz","_integrity":"sha512-E3f+GmWNDSonoQ/+1JikuXQ79zlAKNu9dloRdjatJazBkI/1570yUCmqgl7ftWmgiGj8Df5K7lvhas9hb1Pj3g==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.0.21_1772406002618_0.628899463988726","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@visorcraft/idlehands","version":"4.1.0","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.1.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"f0a47635b9b153cf5891de16126e864b3c7a663f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.1.0.tgz","fileCount":4092,"integrity":"sha512-lCdp0GTmBmwYVlZhEBB9+6kWtoKs4ShLX2GScd2zkIg9iyOM8OcKY6omevCMz7hw6E12fnyNOdjOK3aPaBjZSA==","signatures":[{"sig":"MEYCIQCjKDo6i5ixvc7PghVu/xZ8e8jAlARR208CUJ/Usphz2QIhAIvrM7WIb7QTNzGJRJfphaiwHv7EkTlitcKxTEK8mevn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60828439},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.1.0.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/b8d15d985805d9b02748582f6b1390db/visorcraft-idlehands-4.1.0.tgz","_integrity":"sha512-lCdp0GTmBmwYVlZhEBB9+6kWtoKs4ShLX2GScd2zkIg9iyOM8OcKY6omevCMz7hw6E12fnyNOdjOK3aPaBjZSA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.1.0_1772409895371_0.25399332415245524","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@visorcraft/idlehands","version":"4.2.0","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"f9d4dbf771d0f15feee30143af9b53ba40c411be","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.0.tgz","fileCount":4092,"integrity":"sha512-IpIIdhN/IYx+b1eHPD4JKWpHyKgkEVbhJ67vgSIAIbkQgYaK9bbGafH0WmkFXd2m7kaigf5Ot8VyAMyQbUTs2w==","signatures":[{"sig":"MEUCIDoGeddBGkWr3jdZ0extno2nIwf0hhQlng2S5jJCIr4IAiEAz0VAO1NNrVxcGTg8UmMFacuNx4ps9mEcJ75qKFEWLVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60832495},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.0.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/67a5682c70fefbfe1405acfc3ccf11e0/visorcraft-idlehands-4.2.0.tgz","_integrity":"sha512-IpIIdhN/IYx+b1eHPD4JKWpHyKgkEVbhJ67vgSIAIbkQgYaK9bbGafH0WmkFXd2m7kaigf5Ot8VyAMyQbUTs2w==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.0_1772415498029_0.4091483381052643","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@visorcraft/idlehands","version":"4.2.1","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"f6cf54298f48e508b8a81e909980f334a2bc6398","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.1.tgz","fileCount":4092,"integrity":"sha512-f2KDxrT4ueQuNgfo54ojVydOWPpy8514o4biuZ0Rmz2QG2ORn4et4E/L1FykxM26ZD1d9SZY8xGmA3dF7xAjzA==","signatures":[{"sig":"MEQCID1xnn65UP80R7LjcnRGOBdqoXjdQ8gy0ylwPNHqhoXJAiBBwmIAL6rCJXkmRIpH3viS3LViSlTCRJKmIUh9EZWEew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60833062},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.1.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/7aeeed9d8108079182b8bd4daa54815f/visorcraft-idlehands-4.2.1.tgz","_integrity":"sha512-f2KDxrT4ueQuNgfo54ojVydOWPpy8514o4biuZ0Rmz2QG2ORn4et4E/L1FykxM26ZD1d9SZY8xGmA3dF7xAjzA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.1_1772416248512_0.8815978223883014","host":"s3://npm-registry-packages-npm-production"}},"4.2.2":{"name":"@visorcraft/idlehands","version":"4.2.2","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"b55eb05c885266c3f6531265245ffb7ba0cc9458","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.2.tgz","fileCount":4092,"integrity":"sha512-MIca8Xn+AMUFLu/NLyH8OdYgvpHtfbCez1Mih7cxYeKcC1hExSIpmWUUizw8gYwGJVPGu/BtKvO8fMfea1bYzQ==","signatures":[{"sig":"MEQCIBjMEaBCA6drSjlot1PZHxa7rqxCNKu3hyr0qci3iQ/WAiBk8Z2+B3mabachI6/d+BJ+41TbnLn2LI/P5uKEcF6awQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60833633},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.2.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/cf4f9aff61df2fcfd57fabf33b92c386/visorcraft-idlehands-4.2.2.tgz","_integrity":"sha512-MIca8Xn+AMUFLu/NLyH8OdYgvpHtfbCez1Mih7cxYeKcC1hExSIpmWUUizw8gYwGJVPGu/BtKvO8fMfea1bYzQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.2_1772417884688_0.2391787716624283","host":"s3://npm-registry-packages-npm-production"}},"4.2.3":{"name":"@visorcraft/idlehands","version":"4.2.3","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"080e7006858cdb1f6c5d37d9aef3336a11863f45","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.3.tgz","fileCount":4092,"integrity":"sha512-wT5o5VLrfdr/ldrNFFMOg0c1uPCKA/2Jf5V8RgcHnPLHMZERq9BHAbBebgKNJCGjOMXmN5hfr1aT1Z25Loys9w==","signatures":[{"sig":"MEYCIQCGoQxn/M8vhvyrmx9Sm2+77gsuALeC4kDuXGKwG+6CHwIhAM5EACmC3Bt7ypV4zwB57Xx4kCdH9cBlVF1bTkHcfQuP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60842054},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.3.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/94b0cd3af5d188642ef735b73ca9dc4d/visorcraft-idlehands-4.2.3.tgz","_integrity":"sha512-wT5o5VLrfdr/ldrNFFMOg0c1uPCKA/2Jf5V8RgcHnPLHMZERq9BHAbBebgKNJCGjOMXmN5hfr1aT1Z25Loys9w==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.3_1772428904781_0.9496549252814483","host":"s3://npm-registry-packages-npm-production"}},"4.2.4":{"name":"@visorcraft/idlehands","version":"4.2.4","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"bf8880158a1fc86f821ad499cb5c729f7aefbbcf","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.4.tgz","fileCount":4092,"integrity":"sha512-zkK6kHsKWxaZD5034vWOHg59ddKifwZVqJLac60GEjFf8WZgdCx3qkH3Mg6WUAmzxivCwz7xoQbspo/vhmFUnQ==","signatures":[{"sig":"MEQCIGiphahGE3MUM/oKU2b67kD9b3MKn09IXAGcpM3D25YuAiAaaPiRoazzg/czKIPFGCJmgCrG+WK2JTJZs1dniHLNew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60848062},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.4.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/674fb2e5ff986f54b196a9b5b8112088/visorcraft-idlehands-4.2.4.tgz","_integrity":"sha512-zkK6kHsKWxaZD5034vWOHg59ddKifwZVqJLac60GEjFf8WZgdCx3qkH3Mg6WUAmzxivCwz7xoQbspo/vhmFUnQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.4_1772454579382_0.9301319642057064","host":"s3://npm-registry-packages-npm-production"}},"4.2.5":{"name":"@visorcraft/idlehands","version":"4.2.5","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.5","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"af4facd44b6a29ddc61099b34e3d1728df3a756f","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.5.tgz","fileCount":4092,"integrity":"sha512-1JItLSmffk/p81kRvONWUBw1nf0ESVStWUhIVNxo91EnZil1kjGkDzTHp0WvpdLS5wEmzvyAksh++WZjgYN58w==","signatures":[{"sig":"MEQCIE1Idm3j/n5QaNvQe2CgtC77cDoRCGjjtVA7ZG31ELIEAiBsIewkjN4xSFxoN1I3ChQT6+B31Su1mckegCSTv060BQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60881054},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.5.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/f364c889fcd05409cedc19b77392d796/visorcraft-idlehands-4.2.5.tgz","_integrity":"sha512-1JItLSmffk/p81kRvONWUBw1nf0ESVStWUhIVNxo91EnZil1kjGkDzTHp0WvpdLS5wEmzvyAksh++WZjgYN58w==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.5_1772464164963_0.1832040592125943","host":"s3://npm-registry-packages-npm-production"}},"4.2.6":{"name":"@visorcraft/idlehands","version":"4.2.6","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.6","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"460eee187bbced94f8da4bcc35aa5cbe20f0f8d9","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.6.tgz","fileCount":4092,"integrity":"sha512-BNwVZhnv5nPCzcHm6LrN8I6kblNfBvYm7EMykEmfkWxslfhh5cNzOehoNlCJG97pfUBbRRTRLgzpNrxYouno9A==","signatures":[{"sig":"MEQCID3g0rJHxO3zZBh8Rfhhbe30tiwVe4DARbMoXaoZM7paAiBM/V3y2D00hWfNJQbfwcHqYQqRvlY3+FbGxdDFJogjQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60893111},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.6.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/0bff80bd7060e36b51acb6ea31f7964e/visorcraft-idlehands-4.2.6.tgz","_integrity":"sha512-BNwVZhnv5nPCzcHm6LrN8I6kblNfBvYm7EMykEmfkWxslfhh5cNzOehoNlCJG97pfUBbRRTRLgzpNrxYouno9A==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.6_1772475303906_0.0022954767174396817","host":"s3://npm-registry-packages-npm-production"}},"4.2.7":{"name":"@visorcraft/idlehands","version":"4.2.7","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.2.7","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"8a72891718e1511dcb0d6bf3aa8505fd699d6295","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.2.7.tgz","fileCount":4092,"integrity":"sha512-Jbq56cHmNx0xtOPFxXW3ySqUORRNnKITtpgSWgurXcuNd7H3bvU7R653HQ4A9g8EwVNudI8u3sk+QYd1KeVR2w==","signatures":[{"sig":"MEUCIFoo4zF1STwqz4OQRe5TxIjKIijnfqm4CwzWrD3sTL1bAiEAgO1/c/ZxYbbM+57NmJ8gdzDg0Se+gb6wqy/e+njhEK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60893847},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.2.7.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/2df5f228ad6008057a9ebe2736bdf10a/visorcraft-idlehands-4.2.7.tgz","_integrity":"sha512-Jbq56cHmNx0xtOPFxXW3ySqUORRNnKITtpgSWgurXcuNd7H3bvU7R653HQ4A9g8EwVNudI8u3sk+QYd1KeVR2w==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.2.7_1772476927379_0.3890980474189911","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@visorcraft/idlehands","version":"4.3.0","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.3.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"0709977a643e11e072a165b01f755614266b8e20","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.3.0.tgz","fileCount":4092,"integrity":"sha512-yvCrDzMtFNZ7A4MXv3XGr8RtDWR50zd7e8HujA4DCD44n6adlYNfKZ6hFTx9m9oqTLmNDOziQQee+UT95Xia3A==","signatures":[{"sig":"MEQCIDqrqIYAqf/DoeyZG5P28XeWs3+43oWE+CFl/V1XTORHAiA76sVARVRWqJ4N+9G6TlNnXkR7PhZRmyca180Cww9xNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60894708},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.3.0.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/39e533ed4c1e5861142026ed2db79287/visorcraft-idlehands-4.3.0.tgz","_integrity":"sha512-yvCrDzMtFNZ7A4MXv3XGr8RtDWR50zd7e8HujA4DCD44n6adlYNfKZ6hFTx9m9oqTLmNDOziQQee+UT95Xia3A==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.3.0_1772477227365_0.6059813853616267","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@visorcraft/idlehands","version":"4.4.0","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.4.0","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"8ecd6dc1cd52801f7002e5412ef6eb1d0f9ee363","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.4.0.tgz","fileCount":4092,"integrity":"sha512-Q1ULnGkOTxJrRF7mxVvY6GxkJ3J+g8VblINPvSjEf9r1k8uvc3pzLXf6FbOVtJtp4bEpeLoTPDrr6WKuZWZcjQ==","signatures":[{"sig":"MEQCIHpYVyOHeDFcW9p5F61NyDw5VOTn41cT7/9XqmJ5+IlqAiBMsSMIQugIk+W3Q6OsDikXCYQ25kzQuFGFbAfFYksMtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60936758},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.4.0.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/0600d9aae469ea41dc0b61231ff300f9/visorcraft-idlehands-4.4.0.tgz","_integrity":"sha512-Q1ULnGkOTxJrRF7mxVvY6GxkJ3J+g8VblINPvSjEf9r1k8uvc3pzLXf6FbOVtJtp4bEpeLoTPDrr6WKuZWZcjQ==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.4.0_1772517761689_0.9737962423335305","host":"s3://npm-registry-packages-npm-production"}},"4.4.1":{"name":"@visorcraft/idlehands","version":"4.4.1","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.4.1","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"ad2b0d7a1bd7a3b7a204502ad91dd2d27d50ffc4","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.4.1.tgz","fileCount":4092,"integrity":"sha512-m46vRAVCipZr29a73Nm36IV0MHfJzvwvxboBH9dHSoIrRwjrBe0KaYkTBHaW/PAdJV+38RWnk5SP3XNtYVtqXg==","signatures":[{"sig":"MEUCIQCH7oeGahcUaCekSJ0zJ4hUihuyCg2776kuJaCYUvY/RgIgEh/mwEPT3DHjPxn7aKYnnY9yUjDa/la5Fuy9vmgPugE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60940729},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.4.1.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/2d13f1d5c11ad1e8d17d8a26932606f1/visorcraft-idlehands-4.4.1.tgz","_integrity":"sha512-m46vRAVCipZr29a73Nm36IV0MHfJzvwvxboBH9dHSoIrRwjrBe0KaYkTBHaW/PAdJV+38RWnk5SP3XNtYVtqXg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.4.1_1772520376203_0.4694449981905231","host":"s3://npm-registry-packages-npm-production"}},"4.4.2":{"name":"@visorcraft/idlehands","version":"4.4.2","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.4.2","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"e3e13f1721c645c3c7a91e3c7ac866770e2a66b0","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.4.2.tgz","fileCount":4092,"integrity":"sha512-lnQcM86eXKfN7YHa51fdwv0GM0LEs+eTSxUx4S7N1ZE6xETNa6gUT4PgREDNUapaIGS54/gFSueSV0wvkTgBCg==","signatures":[{"sig":"MEQCIBF2nTxKJY61oUoDmGoU4jq/ESirKI24TEKM+H828b7pAiBTl0XfL+skMwITYpxG6GthfsKSzaksveKhhrwjmzV1dQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60942576},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.4.2.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/32e7c632e6b4b5a91c74cff49769b9b1/visorcraft-idlehands-4.4.2.tgz","_integrity":"sha512-lnQcM86eXKfN7YHa51fdwv0GM0LEs+eTSxUx4S7N1ZE6xETNa6gUT4PgREDNUapaIGS54/gFSueSV0wvkTgBCg==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.4.2_1772553320468_0.6368192593375759","host":"s3://npm-registry-packages-npm-production"}},"4.4.3":{"name":"@visorcraft/idlehands","version":"4.4.3","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.4.3","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"bb27ff4fe24b7b73f361a7ed99f70c6fb67be5f1","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.4.3.tgz","fileCount":4094,"integrity":"sha512-U3Q4Vx/89Q2lAyyAQuZ2WdLAIkz77OUetb6r955wf5bgt/hETAR1vfRtkw9xNTPsjhYve2AF8laBQTFCtkE2FA==","signatures":[{"sig":"MEUCIQCH7o2wMRP5TnJp/jTZUdavgV3ejk5NN42l8g5CnsarcgIgNu9fDy7svIDzQgnAivChAazveKZ5DPxIEWXcbKDD2PQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60953923},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.4.3.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/02e6523435b98b60214de521f8765925/visorcraft-idlehands-4.4.3.tgz","_integrity":"sha512-U3Q4Vx/89Q2lAyyAQuZ2WdLAIkz77OUetb6r955wf5bgt/hETAR1vfRtkw9xNTPsjhYve2AF8laBQTFCtkE2FA==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.4.3_1772559576602_0.9789288313954163","host":"s3://npm-registry-packages-npm-production"}},"4.4.4":{"name":"@visorcraft/idlehands","version":"4.4.4","keywords":[],"author":"","license":"MIT","_id":"@visorcraft/idlehands@4.4.4","maintainers":[{"name":"visorcraft","email":"thomas@visorcraft.com"}],"homepage":"https://github.com/visorcraft/IdleHands#readme","bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"bin":{"idlehands":"idlehands.mjs"},"dist":{"shasum":"bbaada8587c9a300860f52b5b5023c421b81020b","tarball":"https://registry.npmjs.org/@visorcraft/idlehands/-/idlehands-4.4.4.tgz","fileCount":4094,"integrity":"sha512-1QBK4vtuoRQ0b/mhsNlYIdAHhMiMblvQ1bP3rx/mYua4fc83hBdeGgpMcyvjUi5NWmymgpHv4d8Ouk4/PGtCng==","signatures":[{"sig":"MEUCIHlU05a/v2vm5ZqZy2/WoXMjMQNFG5b3FdLBnT+RnBH9AiEAsLAnV2rCz+z1K2fcF7ouFV1l7WThw4+zm+0/V+kMHUg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@visorcraft%2fidlehands@4.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60961078},"main":"dist/index.js","type":"module","_from":"file:visorcraft-idlehands-4.4.4.tgz","engines":{"node":">=22.12.0"},"exports":{".":"./dist/index.js","./cli-entry":"./idlehands.mjs","./plugin-sdk":{"types":"./dist/plugin-sdk/index.d.ts","default":"./dist/plugin-sdk/index.js"},"./plugin-sdk/account-id":{"types":"./dist/plugin-sdk/account-id.d.ts","default":"./dist/plugin-sdk/account-id.js"}},"scripts":{"dev":"node scripts/run-node.mjs","tui":"node scripts/run-node.mjs tui","lint":"oxlint --type-aware","test":"node scripts/test-parallel.mjs","build":"pnpm canvas:a2ui:bundle && tsdown && pnpm build:plugin-sdk:dts && node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-compat.ts","check":"pnpm format:check && pnpm tsgo && pnpm lint && pnpm lint:tmp:no-random-messaging && pnpm lint:tmp:channel-agnostic-boundaries && pnpm lint:tmp:no-raw-channel-fetch && pnpm lint:auth:no-pairing-store-group && pnpm lint:auth:pairing-account-scope && pnpm check:host-env-policy:swift","start":"node scripts/run-node.mjs","format":"oxfmt --write","ui:dev":"node scripts/ui.js dev","ios:gen":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate'","ios:run":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build && xcrun simctl boot \"${IOS_SIM:-iPhone 17}\" || true && xcrun simctl launch booted ai.idlehands.ios'","test:ui":"pnpm lint:ui:no-raw-window-open && pnpm --dir ui test","tui:dev":"IDLEHANDS_PROFILE=dev CLAWDBOT_PROFILE=dev node scripts/run-node.mjs --dev tui","docs:bin":"node scripts/build-docs-list.mjs","docs:dev":"cd docs && mint dev","ios:open":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && open IdleHands.xcodeproj'","lint:all":"pnpm lint && pnpm lint:swift","lint:fix":"oxlint --type-aware --fix && pnpm format","mac:open":"open dist/IdleHands.app","test:all":"pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all","test:e2e":"vitest run --config vitest.e2e.config.ts","ui:build":"node scripts/ui.js build","check:loc":"node --import tsx scripts/check-ts-max-loc.ts --max 500","docs:list":"node scripts/docs-list.js","idlehands":"node scripts/run-node.mjs","ios:build":"bash -lc './scripts/ios-configure-signing.sh && cd apps/ios && xcodegen generate && xcodebuild -project IdleHands.xcodeproj -scheme IdleHands -destination \"${IOS_DEST:-platform=iOS Simulator,name=iPhone 17}\" -configuration Debug build'","lint:docs":"pnpm dlx markdownlint-cli2","test:fast":"vitest run --config vitest.unit.config.ts","test:live":"IDLEHANDS_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts","check:docs":"pnpm format:docs:check && pnpm lint:docs && pnpm docs:check-links","format:all":"pnpm format && pnpm format:swift","format:fix":"oxfmt --write","ghsa:patch":"node scripts/ghsa-patch.mjs","lint:swift":"swiftlint lint --config .swiftlint.yml && (cd apps/ios && swiftlint lint --config .swiftlint.yml)","test:ci:pr":"IDLEHANDS_TEST_PROFILE=low pnpm test:impacted","test:force":"node --import tsx scripts/test-force.ts","test:watch":"vitest","ui:install":"node scripts/ui.js install","android:run":"cd apps/android && ./gradlew :app:installDebug && adb shell am start -n ai.idlehands.android/.MainActivity","deadcode:ci":"pnpm deadcode:report:ci:knip && pnpm deadcode:report:ci:ts-prune && pnpm deadcode:report:ci:ts-unused","format:diff":"oxfmt --write && git --no-pager diff","format:docs":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --write","gateway:dev":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway","mac:package":"bash scripts/package-mac-app.sh","mac:restart":"bash scripts/restart-mac.sh","android:test":"cd apps/android && ./gradlew :app:testDebugUnitTest","format:check":"oxfmt --check","format:swift":"swiftformat --lint --config .swiftformat apps/macos/Sources apps/ios/Sources apps/shared/IdleHandsKit/Sources","plugins:sync":"node --import tsx scripts/sync-plugin-versions.ts","protocol:gen":"node --import tsx scripts/protocol-gen.ts","test:ci:full":"IDLEHANDS_TEST_PROFILE=low pnpm test","test:macmini":"IDLEHANDS_TEST_VM_FORKS=0 IDLEHANDS_TEST_PROFILE=serial node scripts/test-parallel.mjs","deadcode:knip":"pnpm dlx knip --no-progress","gateway:watch":"node scripts/watch-node.mjs gateway --force","idlehands:rpc":"node scripts/run-node.mjs agent --mode rpc --json","lint:docs:fix":"pnpm dlx markdownlint-cli2 --fix","release:check":"node --import tsx scripts/release-check.ts","test:coverage":"vitest run --config vitest.unit.config.ts --coverage","test:impacted":"node scripts/test-impacted.mjs","protocol:check":"pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/IdleHandsProtocol/GatewayModels.swift","test:docker:qr":"bash scripts/e2e/qr-import-docker.sh","test:sectriage":"pnpm exec vitest run --config vitest.gateway.config.ts && vitest run --config vitest.unit.config.ts --exclude src/daemon/launchd.integration.test.ts --exclude src/process/exec.test.ts","android:install":"cd apps/android && ./gradlew :app:installDebug","deadcode:report":"pnpm deadcode:knip; pnpm deadcode:ts-prune; pnpm deadcode:ts-unused","docs:spellcheck":"bash scripts/docs-spellcheck.sh","test:docker:all":"pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup","android:assemble":"cd apps/android && ./gradlew :app:assembleDebug","docs:check-links":"node scripts/docs-link-audit.mjs","test:install:e2e":"bash scripts/test-install-sh-e2e-docker.sh","deadcode:ts-prune":"pnpm dlx ts-prune src extensions scripts","format:docs:check":"git ls-files 'docs/**/*.md' 'docs/**/*.mdx' 'README.md' | xargs oxfmt --check","gateway:dev:reset":"IDLEHANDS_SKIP_CHANNELS=1 CLAWDBOT_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset","canvas:a2ui:bundle":"bash scripts/bundle-a2ui.sh","deadcode:ts-unused":"pnpm dlx ts-unused-exports tsconfig.json --ignoreTestFiles --exitWithCount","protocol:gen:swift":"node --import tsx scripts/protocol-gen-swift.ts","test:install:smoke":"bash scripts/test-install-sh-docker.sh","docs:spellcheck:fix":"bash scripts/docs-spellcheck.sh --write","test:docker:cleanup":"bash scripts/test-cleanup-docker.sh","test:docker:onboard":"bash scripts/e2e/onboard-docker.sh","test:docker:plugins":"bash scripts/e2e/plugins-docker.sh","build:plugin-sdk:dts":"tsc -p tsconfig.plugin-sdk.dts.json","deadcode:report:ci:knip":"mkdir -p .artifacts/deadcode && pnpm deadcode:knip > .artifacts/deadcode/knip.txt 2>&1 || true","test:docker:live-models":"bash scripts/test-live-models-docker.sh","test:install:e2e:openai":"IDLEHANDS_E2E_MODELS=openai CLAWDBOT_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh","android:test:integration":"IDLEHANDS_LIVE_TEST=1 IDLEHANDS_LIVE_ANDROID_NODE=1 vitest run --config vitest.live.config.ts src/gateway/android-node.capabilities.live.test.ts","test:docker:live-gateway":"bash scripts/test-live-gateway-models-docker.sh","gen:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --write","test:docker:doctor-switch":"bash scripts/e2e/doctor-install-switch-docker.sh","test:voicecall:closedloop":"vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1","lint:ui:no-raw-window-open":"node scripts/check-no-raw-window-open.mjs","test:install:e2e:anthropic":"IDLEHANDS_E2E_MODELS=anthropic CLAWDBOT_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh","check:host-env-policy:swift":"node scripts/generate-host-env-security-policy-swift.mjs --check","deadcode:report:ci:ts-prune":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-prune > .artifacts/deadcode/ts-prune.txt 2>&1 || true","test:docker:gateway-network":"bash scripts/e2e/gateway-network-docker.sh","deadcode:report:ci:ts-unused":"mkdir -p .artifacts/deadcode && pnpm deadcode:ts-unused > .artifacts/deadcode/ts-unused-exports.txt 2>&1 || true","lint:tmp:no-random-messaging":"node scripts/check-no-random-messaging-tmp.mjs","lint:tmp:no-raw-channel-fetch":"node scripts/check-no-raw-channel-fetch.mjs","lint:auth:pairing-account-scope":"node scripts/check-pairing-account-scope.mjs","lint:auth:no-pairing-store-group":"node scripts/check-no-pairing-store-group-auth.mjs","lint:tmp:channel-agnostic-boundaries":"node scripts/check-channel-agnostic-boundaries.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2c4d2b3a-0884-47f7-a008-27f865c347bd"}},"_resolved":"/tmp/bdf21e192848c3f24306271fef9cc328/visorcraft-idlehands-4.4.4.tgz","_integrity":"sha512-1QBK4vtuoRQ0b/mhsNlYIdAHhMiMblvQ1bP3rx/mYua4fc83hBdeGgpMcyvjUi5NWmymgpHv4d8Ouk4/PGtCng==","repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"_npmVersion":"11.8.0","description":"Multi-channel AI gateway with extensible messaging integrations","directories":{"doc":"docs","test":"test"},"_nodeVersion":"24.13.1","dependencies":{"ws":"^8.19.0","ajv":"^8.18.0","tar":"7.5.9","zod":"^4.3.6","jiti":"^2.6.1","long":"^5.3.2","yaml":"^2.8.2","chalk":"^5.6.2","json5":"^2.2.3","jszip":"^3.10.1","sharp":"^0.34.5","tslog":"^4.10.2","croner":"^10.0.1","dotenv":"^17.3.1","grammy":"^1.40.1","undici":"^7.22.0","express":"^5.2.1","chokidar":"^5.0.0","linkedom":"^0.18.12","commander":"^14.0.3","file-type":"^21.3.0","ipaddr.js":"^2.3.0","opusscript":"^0.1.1","pdfjs-dist":"^5.4.624","sqlite-vec":"0.1.7-alpha.2","@slack/bolt":"^4.6.0","markdown-it":"^14.1.1","osc-progress":"^0.3.0","@buape/carbon":"0.0.0-beta-20260216184201","@line/bot-sdk":"^10.6.0","cli-highlight":"^2.1.11","node-edge-tts":"^1.2.10","@clack/prompts":"^1.0.1","@slack/web-api":"^7.14.1","@snazzah/davey":"^0.1.9","playwright-core":"1.58.2","qrcode-terminal":"^0.12.0","@discordjs/voice":"^0.19.0","@grammyjs/runner":"^2.0.3","@homebridge/ciao":"^1.3.5","@lydell/node-pty":"1.2.0-beta.3","@sinclair/typebox":"0.34.48","discord-api-types":"^0.38.40","https-proxy-agent":"^7.0.6","@mariozechner/pi-ai":"0.55.1","@mariozechner/pi-tui":"0.55.1","@mozilla/readability":"^0.6.0","@larksuiteoapi/node-sdk":"^1.59.0","@whiskeysockets/baileys":"7.0.0-rc.9","@agentclientprotocol/sdk":"0.14.1","@mariozechner/pi-agent-core":"0.55.1","@mariozechner/pi-coding-agent":"0.55.1","@grammyjs/transformer-throttler":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lit":"^3.3.2","tsx":"^4.21.0","oxfmt":"0.35.0","oxlint":"^1.50.0","tsdown":"^0.20.3","vitest":"^4.0.18","@types/ws":"^8.18.1","typescript":"^5.9.3","@types/node":"^25.3.1","@lit/context":"^1.1.6","signal-utils":"0.21.1","@types/express":"^5.0.6","@grammyjs/types":"^3.24.0","oxlint-tsgolint":"^0.15.0","@lit-labs/signals":"^0.2.0","@types/markdown-it":"^14.1.2","@vitest/coverage-v8":"^4.0.18","@types/qrcode-terminal":"^0.12.2","@typescript/native-preview":"7.0.0-dev.20260225.1"},"peerDependencies":{"node-llama-cpp":"3.15.1","@napi-rs/canvas":"^0.1.89"},"optionalDependencies":{"@discordjs/opus":"^0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/idlehands_4.4.4_1772636101650_0.7679146241643053","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-02-18T22:01:02.525Z","modified":"2026-07-01T17:57:09.501Z","0.9.0":"2026-02-18T21:50:27.175Z","0.9.1":"2026-02-18T22:01:02.897Z","1.0.0":"2026-02-18T22:17:57.514Z","1.0.1":"2026-02-19T00:06:57.612Z","1.0.2":"2026-02-19T01:50:32.716Z","1.0.3":"2026-02-19T02:07:11.549Z","1.0.4":"2026-02-19T04:03:16.090Z","1.0.5":"2026-02-19T04:18:18.882Z","1.0.7":"2026-02-19T05:11:06.260Z","1.0.8":"2026-02-19T18:08:28.575Z","1.0.9":"2026-02-20T00:51:38.200Z","1.1.0":"2026-02-20T16:22:27.356Z","1.1.2":"2026-02-20T22:08:40.528Z","1.1.3":"2026-02-20T23:19:37.582Z","1.1.4":"2026-02-21T01:12:46.898Z","1.1.5":"2026-02-21T03:29:02.941Z","1.1.6":"2026-02-21T05:03:23.175Z","1.1.7":"2026-02-21T13:58:34.762Z","1.1.8":"2026-02-21T20:53:34.685Z","1.1.9":"2026-02-21T23:44:56.924Z","1.1.10":"2026-02-22T00:56:38.070Z","1.1.11":"2026-02-22T01:48:24.542Z","1.1.12":"2026-02-22T04:03:11.350Z","1.1.14":"2026-02-22T05:49:28.428Z","1.1.15":"2026-02-22T06:14:03.348Z","1.1.16":"2026-02-22T08:08:30.440Z","1.1.17":"2026-02-22T09:03:06.229Z","1.2.0":"2026-02-22T19:43:21.142Z","1.2.1":"2026-02-22T20:56:34.143Z","1.2.2":"2026-02-22T21:49:28.705Z","1.2.3":"2026-02-22T22:31:25.028Z","1.2.4":"2026-02-22T23:02:16.681Z","1.2.5":"2026-02-22T23:47:56.791Z","1.2.6":"2026-02-23T00:20:08.014Z","1.2.7":"2026-02-23T00:27:49.357Z","1.2.8":"2026-02-23T01:20:03.258Z","1.3.1":"2026-02-23T04:58:26.150Z","1.3.2":"2026-02-23T05:31:24.016Z","1.3.3":"2026-02-23T15:11:16.755Z","1.3.4":"2026-02-23T16:42:46.883Z","1.3.5":"2026-02-23T19:57:20.774Z","1.3.6":"2026-02-23T20:57:16.002Z","1.3.7":"2026-02-23T21:48:08.122Z","1.3.8":"2026-02-23T22:19:28.217Z","1.3.9":"2026-02-23T23:20:33.186Z","1.3.10":"2026-02-24T00:07:05.993Z","1.3.11":"2026-02-24T01:56:46.128Z","1.3.12":"2026-02-24T02:31:07.300Z","1.4.0":"2026-02-24T03:02:18.568Z","1.4.1":"2026-02-24T04:31:44.167Z","1.4.2":"2026-02-24T05:07:42.672Z","1.4.4":"2026-02-24T05:53:57.930Z","1.4.5":"2026-02-24T06:22:38.147Z","1.4.6":"2026-02-24T13:27:24.353Z","2.0.0":"2026-02-24T18:48:07.063Z","2.0.1":"2026-02-24T23:13:18.412Z","2.0.2":"2026-02-25T01:26:26.933Z","2.1.0":"2026-02-25T05:09:48.681Z","2.1.1":"2026-02-25T05:18:00.971Z","2.1.2":"2026-02-25T11:13:30.151Z","2.1.3":"2026-02-25T11:33:06.796Z","2.1.4":"2026-02-25T11:41:53.091Z","2.2.0":"2026-02-25T14:00:04.131Z","2.2.1":"2026-02-25T15:04:26.772Z","2.2.2":"2026-02-25T15:43:46.901Z","2.2.3":"2026-02-25T16:04:05.017Z","2.2.4":"2026-02-25T16:25:10.134Z","2.2.5":"2026-02-25T20:34:10.367Z","2.2.7":"2026-02-26T02:03:30.217Z","2.2.8":"2026-02-26T02:09:36.390Z","2.2.9":"2026-02-26T02:31:04.298Z","2.2.10":"2026-02-26T02:38:22.716Z","2.2.11":"2026-02-26T02:49:38.777Z","2.2.12":"2026-02-26T03:26:32.154Z","2.2.13":"2026-02-26T03:35:09.854Z","2.2.14":"2026-02-26T03:45:20.755Z","2.2.15":"2026-02-26T03:51:08.442Z","2.2.16":"2026-02-26T03:56:03.157Z","2.2.17":"2026-02-26T04:09:34.498Z","2.2.18":"2026-02-26T04:25:57.140Z","2.2.19":"2026-02-26T04:29:56.777Z","2.2.20":"2026-02-26T05:49:12.181Z","2.2.21":"2026-02-26T05:56:10.042Z","2.2.22":"2026-02-26T06:16:45.382Z","2.2.23":"2026-02-26T13:08:42.758Z","2.2.24":"2026-02-26T13:15:26.608Z","2.2.25":"2026-02-26T13:50:15.866Z","2.2.26":"2026-02-26T15:24:27.662Z","2.3.0":"2026-02-26T17:49:29.211Z","2.3.1":"2026-02-26T19:20:11.254Z","2.3.2":"2026-02-26T21:24:28.027Z","2.3.3":"2026-02-26T21:55:18.751Z","2.3.4":"2026-02-27T02:59:58.355Z","2.3.5":"2026-02-27T03:08:45.592Z","3.0.0":"2026-02-27T13:41:32.847Z","3.0.1":"2026-02-27T15:11:58.164Z","3.0.2":"2026-02-27T16:55:33.716Z","3.1.0":"2026-02-28T16:36:32.560Z","3.1.1":"2026-03-01T02:47:39.856Z","3.2.0":"2026-03-01T02:54:57.318Z","3.2.1":"2026-03-01T03:09:40.631Z","4.0.0":"2026-03-01T15:39:35.728Z","4.0.1":"2026-03-01T15:56:29.014Z","4.0.2":"2026-03-01T16:57:24.898Z","4.0.3":"2026-03-01T17:09:04.910Z","4.0.4":"2026-03-01T17:29:36.451Z","4.0.5":"2026-03-01T17:41:15.155Z","4.0.6":"2026-03-01T18:14:35.230Z","4.0.7":"2026-03-01T18:25:05.803Z","4.0.8":"2026-03-01T18:39:04.931Z","4.0.9":"2026-03-01T19:01:10.770Z","4.0.10":"2026-03-01T19:15:23.119Z","4.0.11":"2026-03-01T19:32:44.310Z","4.0.12":"2026-03-01T20:21:00.711Z","4.0.13":"2026-03-01T20:50:06.141Z","4.0.14":"2026-03-01T21:10:28.831Z","4.0.15":"2026-03-01T21:13:15.861Z","4.0.16":"2026-03-01T21:23:02.795Z","4.0.17":"2026-03-01T21:27:29.611Z","4.0.18":"2026-03-01T21:46:00.476Z","4.0.19":"2026-03-01T22:46:26.663Z","4.0.20":"2026-03-01T22:53:01.262Z","4.0.21":"2026-03-01T23:00:03.477Z","4.1.0":"2026-03-02T00:04:56.110Z","4.2.0":"2026-03-02T01:38:18.754Z","4.2.1":"2026-03-02T01:50:49.327Z","4.2.2":"2026-03-02T02:18:05.450Z","4.2.3":"2026-03-02T05:21:45.538Z","4.2.4":"2026-03-02T12:29:40.188Z","4.2.5":"2026-03-02T15:09:25.828Z","4.2.6":"2026-03-02T18:15:04.669Z","4.2.7":"2026-03-02T18:42:08.183Z","4.3.0":"2026-03-02T18:47:08.258Z","4.4.0":"2026-03-03T06:02:42.434Z","4.4.1":"2026-03-03T06:46:16.986Z","4.4.2":"2026-03-03T15:55:21.155Z","4.4.3":"2026-03-03T17:39:37.350Z","4.4.4":"2026-03-04T14:55:02.389Z"},"bugs":{"url":"https://github.com/visorcraft/IdleHands/issues"},"license":"MIT","homepage":"https://github.com/visorcraft/IdleHands#readme","keywords":[],"repository":{"url":"git+https://github.com/visorcraft/IdleHands.git","type":"git"},"description":"Multi-channel AI gateway with extensible messaging integrations","maintainers":[{"email":"thomas@visorcraft.com","name":"visorcraft-thomas"}],"readme":"# 🤚 Idle Hands\n\n> _\"The devil finds work for idle hands.\"_\n\n**Idle Hands** is an autonomous AI coding agent built for running **local LLMs**. It connects your self-hosted model to your codebase and lets it loose — reading files, writing code, running tests, executing commands — all without touching the cloud.\n\nNamed after the 1999 cult classic where Anton's possessed hand develops a mind of its own, Idle Hands gives your local model a hand that **acts autonomously on your codebase**. You define the work. The hand does the rest.\n\n---\n\n## ✋ What Makes Idle Hands Different\n\n**Your model. Your hardware. Your rules.**\n\nIdle Hands is purpose-built for local inference. No API keys to OpenAI. No token metering. No data leaving your network. Just your GPU, your model, and a codebase that needs work done.\n\n- **Local-first**: Designed around `llama-server`, `ollama`, `lmstudio`, and any OpenAI-compatible local endpoint\n- **Agent autonomy**: The model reads your code, edits files, runs tests, and iterates — hands-free\n- **Multi-surface**: Control it from **Telegram**, **Discord**, **CLI**, **TUI**, or any supported chat platform\n- **Self-upgrading**: `/upgrade` checks GitHub for the latest release, installs it, and restarts — from any chat surface\n\n---\n\n## 🔪 /anton — The Possessed Hand\n\nThis is the flagship feature. Inspired by the movie, `/anton` is what happens when you chop the hand off and let it go.\n\n### How It Works\n\nYou write a task document — a simple markdown checklist:\n\n```markdown\n# TASKS.md\n\n## Phase 1: Core refactor\n\n- [ ] Extract shared dispatcher from telegram callback handler\n- [ ] Wire retry_fast, retry_heavy, cancel through shared dispatcher\n- [ ] Add unit tests for all 3 dispatch actions\n\n## Phase 2: Bot commands\n\n- [ ] Add /upgrade command to all bot surfaces\n- [ ] Add /dir command to view and set workspace\n- [x] Set up CI pipeline (already done)\n```\n\nThen invoke it:\n\n```\n/anton TASKS.md\n```\n\n**The Idle Hands Orchestrator takes over:**\n\n1. Parses the task document and finds the **first incomplete task** (`- [ ]`)\n2. Spawns a **fresh, isolated agent session** for that single task\n3. The agent reads your codebase, makes targeted edits, runs tests\n4. On success: marks the task `- [x]` in the document and moves to the next\n5. On failure: skips the task, logs the error, continues to the next\n6. **Each task gets its own clean agent** — no context bleed, no accumulated confusion\n7. When no incomplete tasks remain, the orchestrator completes and returns **final run stats**\n\nThe task document is the **single source of truth**. You can check it mid-run to see exactly where things stand. Every `[x]` was earned by a real agent execution with real test results.\n\n### Live Progress\n\nAnton pushes real-time updates to whatever surface you invoked it from:\n\n```\n🤚 Anton activated\n📄 Task file: TASKS.md\n📋 5 tasks pending\n\n🔪 Task 1/5: Extract shared dispatcher from telegram callback handler\n🤖 Agent spawned (session: anton-impl-1740829200000-1)\n✅ Task 1/5 complete: Extract shared dispatcher\n\n🔪 Task 2/5: Wire retry_fast, retry_heavy, cancel through shared dispatcher\n🤖 Agent spawned (session: anton-impl-1740829260000-2)\n❌ Task 2/5 failed: Wire retry_fast...\n└ Agent timed out after 1200s\n\n🏁 Anton finished\n✅ Completed: 4/5\n⏭️ Skipped: 1\n⏱️ Duration: 42m 15s\n```\n\n### Two Execution Modes\n\nAnton supports two modes, configurable per-deployment:\n\n#### Direct Mode (default)\n\nSingle agent per task. Fast, simple, good for straightforward changes:\n\n```\nTask → Agent → Done\n```\n\n#### Preflight Mode\n\nTwo-phase pipeline inspired by how senior engineers work — **plan first, then execute**:\n\n```\nTask → Discovery Agent (writes spec) → Review Agent (refines spec) → Implementation Agent (follows spec) → Done\n```\n\n**Phase 1: Discovery.** A planning agent reads your codebase and writes a detailed implementation spec to `.agents/tasks/`. It identifies what files need to change, what the approach should be, and how to verify the result. The discovery agent is **restricted from modifying source files** — it can only write the plan.\n\n**Phase 1.5: Requirements Review** _(optional)_. A review agent reads the plan, tightens it, catches edge cases, and improves it in-place. Think of it as an automated code review of the spec before any code is written.\n\n**Phase 2: Implementation.** A fresh agent receives the task _and_ the spec file. It follows the plan to write code, run tests, and verify the result. Because it has a clear spec to follow, it's far less likely to drift or loop.\n\nIf discovery fails after retries, Anton automatically falls back to direct execution — the hand keeps moving.\n\n#### Configuration\n\nIn your config file:\n\n```json\n{\n  \"anton\": {\n    \"mode\": \"preflight\",\n    \"requirementsReview\": true,\n    \"taskTimeoutSec\": 1200,\n    \"discoveryTimeoutSec\": 600,\n    \"reviewTimeoutSec\": 300,\n    \"preflightMaxRetries\": 2,\n    \"planDir\": \".agents/tasks\"\n  }\n}\n```\n\nOr override per-run from CLI:\n\n```bash\nidlehands anton run TASKS.md --mode preflight\n```\n\n#### Preflight Progress in Chat\n\nWhen running in preflight mode, you get granular updates for every phase:\n\n```\n🔪 Task 1/3: Refactor session manager\n🔎 Discovery: analyzing codebase for task 1/3...\n🤖 Agent spawned (session: anton-discovery-1740829200000-1-0)\n📝 Plan written: task-1-1740829200000.md\n🧪 Reviewing plan: task-1-1740829200000.md...\n🤖 Agent spawned (session: anton-review-1740829215000-1)\n✅ Plan reviewed and refined\n🛠️ Implementation: following spec task-1-1740829200000.md\n🤖 Agent spawned (session: anton-impl-1740829230000-1)\n✅ Task 1/3 complete: Refactor session manager\n```\n\n### Why This Matters\n\nMost AI coding tools give you a chat window and hope for the best. `/anton` gives you:\n\n- **Structured autonomy** — the model works through a defined plan, not freestyle\n- **Task isolation** — each task starts with a fresh context, preventing the drift and confusion that kills long agent sessions\n- **Plan-then-execute** — preflight mode means the implementation agent has a clear spec to follow, dramatically reducing read-loops and aimless exploration\n- **Persistent progress** — if the process stops, your task document shows exactly what's done and what's left\n- **Graceful failure** — failed tasks are skipped, not fatal; the hand keeps moving\n- **Observable execution** — live progress updates to your chat surface; `/anton status` for on-demand checks; `/anton stop` to halt gracefully\n\n### Commands\n\n| Command                                         | Surface                | Description                                  |\n| ----------------------------------------------- | ---------------------- | -------------------------------------------- |\n| `/anton TASKS.md`                               | Telegram, Discord, TUI | Start the orchestrator on a task document    |\n| `/anton status`                                 | All                    | Show current task progress                   |\n| `/anton stop`                                   | All                    | Stop after current task completes            |\n| `idlehands anton run TASKS.md`                  | CLI                    | Run from terminal                            |\n| `idlehands anton run TASKS.md --mode preflight` | CLI                    | Run with discovery → implementation pipeline |\n| `idlehands anton run TASKS.md --dry-run`        | CLI                    | Preview tasks without executing              |\n\n---\n\n## 🎛️ Runtime Orchestrator\n\nFor those running multiple models across multiple machines, the **Runtime Orchestrator** manages your inference infrastructure:\n\n```bash\n# Initialize runtime config\nidlehands orchestrator init\n\n# Plan a model switch (dry run)\nidlehands orchestrator plan --model qwen3-coder-next --json\n\n# Apply — stops current server, switches backend, starts model, probes health\nidlehands orchestrator apply --model qwen3-coder-next\n\n# Check what's running\nidlehands orchestrator status\n```\n\nSupports:\n\n- **Local and remote hosts** (SSH transport)\n- **Backend switching** (Vulkan, ROCm, CPU)\n- **Health probing** with configurable timeouts\n- **Lock-based safety** — no concurrent applies\n- **Deterministic plans** — preview every step before execution\n\n---\n\n## ⚡ Quick Start\n\n### 1. Install\n\n```bash\nnpm install -g @visorcraft/idlehands\n```\n\n### 2. Configure\n\n```bash\nidlehands configure\n```\n\nPoint it at your local model endpoint (e.g., `http://localhost:8082/v1`).\n\n### 3. Set workspace\n\n```bash\n# From CLI\nidlehands agents add --workspace /path/to/your/repo\n\n# Or from any chat surface\n/dir /path/to/your/repo\n```\n\n### 4. Start the bot\n\n```bash\nidlehands bot\n```\n\n### 5. Start coding\n\nSend a message from Telegram, Discord, or the TUI:\n\n```\nRead the codebase and fix the failing tests in src/utils.ts\n```\n\nOr go autonomous with `/anton`:\n\n```\n/anton TASKS.md\n```\n\n---\n\n## 🛠️ Local LLM Setup (Recommended)\n\nIdle Hands works best with `llama-server` from the [visorcraft/llama.cpp](https://github.com/visorcraft/llama.cpp) fork, which includes fixes for hybrid Mamba-Transformer models.\n\n### Recommended flags\n\n```bash\nllama-server \\\n  -m /path/to/model.gguf \\\n  --port 8082 \\\n  --host 0.0.0.0 \\\n  --chat-template-file /path/to/qwen3.jinja \\\n  --jinja \\\n  -ngl 99 \\\n  -fa on \\\n  -dio \\\n  --no-warmup \\\n  -ctk q4_0 \\\n  -ctv q4_0 \\\n  -np 4 \\\n  -c 800000 \\\n  -cb \\\n  --ctx-checkpoints 0 \\\n  --cache-reuse 64 \\\n  --slots\n```\n\n### Key notes\n\n- **Template matters**: `qwen3.jinja` is critical for proper tool-call generation with Qwen3-Coder models\n- **KV cache quantization** (`-ctk q4_0 -ctv q4_0`): Keeps VRAM usage manageable for large contexts\n- **Flash attention** (`-fa on`): Required for performance\n- **Direct I/O** (`-dio`): Recommended for the visorcraft fork\n\nSee [`docs/SETUP_LOCAL_QWEN3_CODER_NEXT.md`](docs/SETUP_LOCAL_QWEN3_CODER_NEXT.md) for the complete setup guide.\n\n---\n\n## 💬 Bot Commands (All Surfaces)\n\nThese work in **Telegram, Discord, TUI**, and every other connected chat surface:\n\n| Command         | Description                     |\n| --------------- | ------------------------------- |\n| `/anton <file>` | Start autonomous task execution |\n| `/anton status` | Check orchestrator progress     |\n| `/anton stop`   | Stop after current task         |\n| `/dir`          | Show current workspace          |\n| `/dir /path`    | Set workspace directory         |\n| `/upgrade`      | Self-upgrade to latest version  |\n| `/update`       | Update dependencies and CLI     |\n| `/status`       | Show session info               |\n| `/model`        | View/change active model        |\n| `/new`          | Start fresh session             |\n| `/compact`      | Compress context                |\n| `/stop`         | Cancel current operation        |\n\n---\n\n## 📂 Project Structure\n\n```\nsrc/\n├── commands/\n│   ├── anton.ts              # /anton orchestrator core (direct + preflight modes)\n│   ├── orchestrator.ts       # Runtime orchestrator (host/backend/model)\n│   └── ...\n├── auto-reply/reply/\n│   ├── commands-anton.ts     # /anton bot command handler + progress routing\n│   ├── commands-dir.ts       # /dir command handler\n│   ├── commands-upgrade.ts   # /upgrade command handler\n│   └── commands-core.ts      # Universal command dispatch\n├── bot/\n│   └── upgrade-command.ts    # Self-upgrade engine\n└── cli/program/\n    └── register.orchestrator-anton.ts  # CLI registration\n```\n\n---\n\n## 🔒 Security\n\n- **No telemetry**. No analytics. No call-home behavior.\n- **No cloud dependency**. Your model, your data, your network.\n- Diagnostic events are local in-process only.\n- Agent tool execution is sandboxed with configurable safety profiles.\n- Anti-obfuscation detection blocks suspicious commands from the AI.\n\n---\n\n## 📜 Attribution\n\nIdle Hands is a fork of [OpenClaw](https://github.com/openclaw/openclaw), licensed under the MIT License. See [LICENSE](LICENSE) for details.\n\n---\n\n## 🎬\n\n> _\"I'm not possessed! My hand is!\"_\n> — Anton Tobias, _Idle Hands_ (1999)\n\nYour hand. Your model. Let it loose. 🤚\n","readmeFilename":"README.md"}