{"_id":"@aisnitch/client","_rev":"19-8e20b2081f315f5116f51c13c9eddc39","name":"@aisnitch/client","dist-tags":{"latest":"0.2.26"},"versions":{"0.1.0":{"name":"@aisnitch/client","version":"0.1.0","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.1.0","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"c253e78cc9dbba1bbb61189d43c9f26236183482","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.1.0.tgz","fileCount":9,"integrity":"sha512-wv0j/LJf4d3jlzz9TrJ3WAkea+RjFbsj6wZ8OSFkipa/HdEHSigasOxd1ISYW2Val6Oq58cE0NMlXEv/9YT9CA==","signatures":[{"sig":"MEUCIQCWO3qhMEpWltxSXtCbTUueGbdKLnszBvCHOliUNut6DAIgVVAUASnaP53bKDJc4tc2wDMqAsrUiIxUm5oaXW3S8M8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176958},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"5323b177c1b85ce7740c077e6e441214aa440b1c","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"11.11.1","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"25.8.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.1.0_1774816768210_0.9501666625118153","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aisnitch/client","version":"0.1.1","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.1.1","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"146b3030b6c602e31fdd6438ab1fb148bd10fcc9","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.1.1.tgz","fileCount":9,"integrity":"sha512-BkDbjR1IGljgiNYmHdCe7IBsMYjn8t57+/ssVqmJW5W1LmWwdvcnLqi3VmxaOTTcLB3/lK+dpZr1/PznLamjQA==","signatures":[{"sig":"MEYCIQDRK5xjlCDXKgEAtHzw34sislNsrrGBD2Vcn3HuYA3oqgIhAMsmIxE+b3FGyXHvFjmRPYf71sZ1Ir7i6/yWUs3Ih60b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200514},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"35b2589cb569e7b5b334d50ddc218245d8ae16e2","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"11.11.1","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"25.8.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.1.1_1774818035112_0.36281644166070226","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aisnitch/client","version":"0.1.2","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.1.2","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"c349899aa36f29e50a16a7609a4d6946048824b9","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.1.2.tgz","fileCount":9,"integrity":"sha512-hNLTuid4QBWh7c9d2/uDZ0BiUzcP7Fn2gHppvMHy8rVN0M+/GmKRwoypE/t6KVf7tDLFBlZvzyQiqQNCYIIxIw==","signatures":[{"sig":"MEYCIQDLzGpDcMu5SVEaJimb+tzOOKP6drYm/hyCNkMaIjJkfQIhANWKod6znM2NkYulPhQVgrSrpHsmMfKMR1lcuzS4lCbK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203788},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"5675e7cea807ebf639f83336dc610e8971dc8d02","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.1.2_1774825297387_0.4697093854253156","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@aisnitch/client","version":"0.2.4","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.4","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"8d14fd1200214205b73da3303d8cb37a4c9d84ed","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.4.tgz","fileCount":9,"integrity":"sha512-mPvZLj6c8+zkDUBhuNGiuAv0Kgz2Js3fQAZQaClOjAfMmQm9wdSpTnSzpLedkt/CAezfNYLdyfBZj53xzXkoGw==","signatures":[{"sig":"MEUCIQD4kzvWx97mCceAlDHn/beybZh+gbAQOvSmT+V/wLbaKgIgGfCNBOqSocKHJEm+elJVI9o6npYT1o7Bk9X2G+dH3JU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203788},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"8cd49e12f05a89a19d20d8fd64a6146bd6edc238","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.4_1774825701998_0.8465147590597724","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@aisnitch/client","version":"0.2.5","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.5","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"56216389a180d8684e14d1feeb1b782d43a16280","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.5.tgz","fileCount":9,"integrity":"sha512-p7J7ewaskDA/o+hDE4352x5iUw0zzS3g9lgHjfA6fVXQ7w4+52EMUeNIALErvtEOmjnwVHfRLHaHQq7w867NiA==","signatures":[{"sig":"MEQCIHjcoFY8MfmbXvM/R8AQO91bW5BpEBoXvJEkl7pp+mk+AiB9iQvSLDz4BZcp6ttbhnQLOJMFf72Oqmgq66ETHAtwRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203788},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"425e055eac732b0e6bf8e00a96c03ca3af84af8d","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.5_1774863348248_0.19235087380984317","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"@aisnitch/client","version":"0.2.12","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.12","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"b7a23edb350ce0bbbe7e2a6582012e350b019fef","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.12.tgz","fileCount":9,"integrity":"sha512-8WCmAnpo59wOBX5f9DH5UMLa+DUyGbL3ITp44ouc+jzBysS0pHlRn5BSXL8gXD9bEg/fQ6MJlnBg/+E0bVb5hg==","signatures":[{"sig":"MEUCIQCKGTH48Wb6+XkWwA7B2CZkVhBhJsr4gLmdXt9MtEPljQIgHbd22eQgf03kZnijHLqJBA2YRS2OVc2vZptWFtfonw8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"c30ce4622d933cee1d0702d72f7d7327ec3fc6bc","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.12_1775048477290_0.4729451092600927","host":"s3://npm-registry-packages-npm-production"}},"0.2.13":{"name":"@aisnitch/client","version":"0.2.13","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.13","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"91746f47a4eaa295c93bc690633739df903aca22","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.13.tgz","fileCount":9,"integrity":"sha512-jr1AGBgyNtXi16P3sYd39L1EqzOMWjmduhra2gPgE8QzFh2YPS7soOQuUNM06usFu1txnfrznawm6Xs+YxRckQ==","signatures":[{"sig":"MEUCIQCLuu37FnGuWME//MUvYw9XOiiGxFe6mhXuDCf/+mA54AIgHpyTf5WXXIijavVZ6/UyJmQBk1NU2P02IV4zc9f8AKs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"cb76bfd7bfd5ee7a33856543633c05f7e00cfe15","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.13_1775049237800_0.6260067530470341","host":"s3://npm-registry-packages-npm-production"}},"0.2.15":{"name":"@aisnitch/client","version":"0.2.15","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.15","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"8433d426efe5a67ca6d5facdf8b3395c64d673e6","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.15.tgz","fileCount":9,"integrity":"sha512-hqrA/DmL0Iw6B00BTQfoxJgjdGMvJYEa6gb+HGUFD2UfP/dCwVvoIV00ckFLwhsMgysnR+dVgN8Qg0tPwAdjEg==","signatures":[{"sig":"MEUCICVYi9E1QZIQbmtHdsQFJeCr3syyYngDdEheoVpjtxEgAiEAuEsl5KuJAf6+uxkjM0hU1zjMzHbh3D3+xhZ/f5gzj2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"317bdc83b8d03525aed4c8fa87c62428e2822771","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.15_1775050364443_0.4316317394832394","host":"s3://npm-registry-packages-npm-production"}},"0.2.16":{"name":"@aisnitch/client","version":"0.2.16","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.16","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"e1102a480d55f61a9aed17014ceb2c8e73732e61","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.16.tgz","fileCount":9,"integrity":"sha512-RGhp3A1aOyYB8qR3CzHXkux2PJGv0CHi8rJU/q3UU00hsz88Y56dMke+oiABCwJHYJlcpdWs89FNcHd+0gZiYg==","signatures":[{"sig":"MEUCICYBxZOgMM1wAwFd+e/b87ghTr4MXL4/U7IQUt3d0925AiEA1iuQnxbFqEYkwTFzPRL5uqDFep8sYySlvTIUvY1OTIU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"7d3a5707bca7cb0d1671e92a982c78136b6419e9","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.4","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.16_1775050842771_0.8203610618215338","host":"s3://npm-registry-packages-npm-production"}},"0.2.17":{"name":"@aisnitch/client","version":"0.2.17","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.17","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"892fc552887f9c992996add0893983db6203e3b7","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.17.tgz","fileCount":9,"integrity":"sha512-c4rR4z9q/KSyt3BN3DbpcyIvM7zEusiek6bwzVAYo0zLmaC+DD/xALtlNOovMLBi1eKMGR3TrT7bDGbw+S4G1A==","signatures":[{"sig":"MEQCIEFJErebN2k6GHFkUCr1UMkZ6W3Pzsckz0PpB2sTUR5BAiBC5bmJaJAHHTOAs1xaRDKuC5NZejk24wdBtqIfVggvkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d33520d6ccbdaef80ad429b92023674dd4384974","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.17_1778158762550_0.677786921804745","host":"s3://npm-registry-packages-npm-production"}},"0.2.18":{"name":"@aisnitch/client","version":"0.2.18","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.18","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"c9359250ae54b77c9090befe1abc027b81586d04","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.18.tgz","fileCount":9,"integrity":"sha512-r8UdQR1Cmo0QrupAixRIkN0XaurZoKGrlRb2Pf9Ev6DzKvImhMY/ubfqpW54Vi5IcNj4oGH6lJYMDbBpLSbnXg==","signatures":[{"sig":"MEQCIFF+NbgGUeZOPjQBxZ+qcLpzEcSoe08ql0ayN8SdzyHJAiBYrzgo+N0jkVwRwZWeTQbL3h4g/ryux8WYBVDqGTC+vQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3108e39c7aa57ac5238609267e495616c5d0ad89","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.18_1778159938305_0.10701817690547077","host":"s3://npm-registry-packages-npm-production"}},"0.2.19":{"name":"@aisnitch/client","version":"0.2.19","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.19","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"a462dd26103f326097a46d50dbedccb3d857732b","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.19.tgz","fileCount":9,"integrity":"sha512-jAc1cJpubLFHMHKE3Tz96NBZ8YYDSKOwb8HyEb/kUVw+hIJe9KmDSl1VsrOpkoPpO8CqaTIgViHjtvT8x0Ee8g==","signatures":[{"sig":"MEQCIHHEn23Rh2cg7oer14aLnrkfzk7RnhQ2XAYdrOOtCxgOAiBpcPCGLBy3HORW/VBt2OcZej3Y3TcRogav4P8qPmBgaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"f5ebe9ce7e6be5c04fd752849f38973ff5409f30","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.19_1778161254294_0.5571523085984185","host":"s3://npm-registry-packages-npm-production"}},"0.2.20":{"name":"@aisnitch/client","version":"0.2.20","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.20","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"c149034ce877009f4ede7c96f4f993d166530587","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.20.tgz","fileCount":9,"integrity":"sha512-CWzH3hUuhv9qRMkHD0Fd1DTcyK5lNVbPjOJD5shQfrBFVCN1MQFehpmrj1MGWjBWPGKbGLtp1B4o3DdmsqSnxA==","signatures":[{"sig":"MEUCIFD1a7JvRq2ncQaghQ256gKQ4dY6PcD7lR6pcP0n4niQAiEAlvqeKMKGoxrcJuZANxSKd2KRtFYO3xg+kTaWDcnbRak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"b439321942a3d5b52b20fa34821cb325bfca7c27","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.20_1778192621209_0.26883860428550577","host":"s3://npm-registry-packages-npm-production"}},"0.2.21":{"name":"@aisnitch/client","version":"0.2.21","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.21","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"0b67417acda392426be98abefee8d884799bd14b","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.21.tgz","fileCount":9,"integrity":"sha512-jR7rR52Mqb9FeDYPmdcJqCComG9T8MgXa7zKIHcdckY6yuv1Oae0NA1RQX9ni/U7EZsB/o0B7X/SFi+FYXGhlQ==","signatures":[{"sig":"MEUCIQDkJQP6vTllJ/PAGOStMy+wBr3aTgJ7EAKx+DSP9noPIAIgWZZtyROjPtL66qyUsAD8N6ZlxqbZIcBdW7K1TMUtgXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9fed6210ea7ed230a4818278199b432d4a85543e","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.21_1778197487358_0.21713921817308557","host":"s3://npm-registry-packages-npm-production"}},"0.2.22":{"name":"@aisnitch/client","version":"0.2.22","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.22","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"74c874e56d6bf215be8f347d05307cb60f2d2e67","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.22.tgz","fileCount":9,"integrity":"sha512-lTL4gtApZgayjcailD88R6q+wRQgA6MPNQjCA3Q7CWIe/M6C7VRklxk1/teHYVtYZpBYXxG3r318guV/QOTMDw==","signatures":[{"sig":"MEYCIQCXP8f3xhJdGvCIP0LxVulGjI8bB10cvtFYSiZG1pOIgwIhAKnCEhOZwTXmsXk1VRvzzkt9BlcqkUsuLI90Q+qZnGxn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"77a18167db17b66f9bdf3e34152e38f417808d94","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.22_1778286950870_0.8196106095582727","host":"s3://npm-registry-packages-npm-production"}},"0.2.23":{"name":"@aisnitch/client","version":"0.2.23","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.23","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"6edc974509a226314acc1b183cb797891c2adbd4","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.23.tgz","fileCount":9,"integrity":"sha512-Xl6y5dhCyjhWUMBhN8+wNIyAAK1zIF6hipepumIGmCi6JFELXInyNsbwA4lHA7/P+kxFsfHg2qvkT4FYmlpTZw==","signatures":[{"sig":"MEUCICXtu5bqLd8cRmcIlv10Alq1IHmRkJScssFmBBh9G+u4AiEA5fSjSQqWq26g3Edzwwr6bdsooHN1jxojDd8ht+6znpk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2fb9bbe42c26b5693d6946d6ea8ce9f463abd14a","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.23_1778316893829_0.4873611693771338","host":"s3://npm-registry-packages-npm-production"}},"0.2.24":{"name":"@aisnitch/client","version":"0.2.24","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.24","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"7b7eaa242bea5f71a77d927aef4dcf6e1f72210f","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.24.tgz","fileCount":9,"integrity":"sha512-ws1b77uc7eTPRVl2ah4YXj/qmIt8JOzTtYpmyW5FR6xztrOVCIZWQL7lISfkRjcfAlJwgPa/iZ0atjq97wSnbQ==","signatures":[{"sig":"MEYCIQCB8w+90kxqNjfqO4d0fzz43hOQb4Xnw6KvInGeADWaXgIhALLSL/RAF7RkCHFdnNrQWH+aeQ9rD7jgkKRSshPnhrAl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203789},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2364088f5ecee56bb42bb3344cb95c4eceaf080e","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.24_1778609926223_0.5348154382384598","host":"s3://npm-registry-packages-npm-production"}},"0.2.25":{"name":"@aisnitch/client","version":"0.2.25","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"url":"https://github.com/vava-nessa","name":"Vanessa Depraute"},"license":"Apache-2.0","_id":"@aisnitch/client@0.2.25","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"dist":{"shasum":"d7cdb72f41fb81d7723781fb084f34a70a18c313","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.25.tgz","fileCount":9,"integrity":"sha512-BVPORQMJU2alNNNn8fgq4jTBPP8ZbzEz/1XYG9y5FCLzppEiEjMcIpVzAfkLkZkrS4JvrrRev6GpKP/HWkkMWQ==","signatures":[{"sig":"MEUCIHBe976RNDhgF/nC14lgCpmBgdO9V3zcaXQaJW69oYl1AiEAkMWMtfIzYrF0Irc87KISuwt2m8I3tunHj0A+E2y24B4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203731},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"326ab3044687a184e5c3d515c69f9687604119af","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","clean":"rm -rf coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"repository":{"url":"git+https://github.com/vava-nessa/AISnitch.git","type":"git","directory":"packages/client"},"_npmVersion":"10.9.7","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","tsup":"^8.5.1","vitest":"^4.1.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/client_0.2.25_1778611128902_0.8035396084517685","host":"s3://npm-registry-packages-npm-production"}},"0.2.26":{"name":"@aisnitch/client","version":"0.2.26","description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"author":{"name":"Vanessa Depraute","url":"https://github.com/vava-nessa"},"license":"Apache-2.0","homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"repository":{"type":"git","url":"git+https://github.com/vava-nessa/AISnitch.git","directory":"packages/client"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"engines":{"node":">=20.0.0"},"scripts":{"build":"tsup","clean":"rm -rf coverage dist","lint":"eslint .","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit","check":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"publishConfig":{"access":"public"},"peerDependencies":{"zod":"^4.0.0"},"peerDependenciesMeta":{"zod":{"optional":false}},"devDependencies":{"@vitest/coverage-v8":"^4.1.2","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^4.1.2","zod":"^4.3.6"},"_id":"@aisnitch/client@0.2.26","gitHead":"4306fba3a35a23a0ec865c338fa7b5a18f4c59f4","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-BcqqgBmGJradWEMCKcUJDUIOU8z0HK3LI2JDd/yFVEJ1daE9S4KOZfeoYqwspTNns/LQS3vGdZo1zhLUjje3+Q==","shasum":"7c838eae285eff6ae9af52a41c2c2906deaaf7dc","tarball":"https://registry.npmjs.org/@aisnitch/client/-/client-0.2.26.tgz","fileCount":9,"unpackedSize":203731,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aisnitch%2fclient@0.2.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCRJ8PZot+qTShWH8xJLfD07rkAZVWv5/pPZa4o0gTslgIhAJVU8oVRLsiDhpHFsGxKlAAFD493hLCKYBA5AR2k70n4"}]},"_npmUser":{"name":"vava-nessa","email":"vanessadepraute@gmail.com"},"directories":{},"maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/client_0.2.26_1778668277957_0.8927355227199476"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T20:39:28.144Z","modified":"2026-05-13T10:31:18.488Z","0.1.0":"2026-03-29T20:39:28.359Z","0.1.1":"2026-03-29T21:00:35.289Z","0.1.2":"2026-03-29T23:01:37.536Z","0.2.4":"2026-03-29T23:08:22.134Z","0.2.5":"2026-03-30T09:35:48.387Z","0.2.12":"2026-04-01T13:01:17.446Z","0.2.13":"2026-04-01T13:13:57.957Z","0.2.15":"2026-04-01T13:32:44.601Z","0.2.16":"2026-04-01T13:40:42.943Z","0.2.17":"2026-05-07T12:59:22.684Z","0.2.18":"2026-05-07T13:18:58.442Z","0.2.19":"2026-05-07T13:40:54.446Z","0.2.20":"2026-05-07T22:23:41.351Z","0.2.21":"2026-05-07T23:44:47.521Z","0.2.22":"2026-05-09T00:35:51.034Z","0.2.23":"2026-05-09T08:54:54.013Z","0.2.24":"2026-05-12T18:18:46.392Z","0.2.25":"2026-05-12T18:38:49.202Z","0.2.26":"2026-05-13T10:31:18.124Z"},"bugs":{"url":"https://github.com/vava-nessa/AISnitch/issues"},"author":{"name":"Vanessa Depraute","url":"https://github.com/vava-nessa"},"license":"Apache-2.0","homepage":"https://github.com/vava-nessa/AISnitch/tree/main/packages/client#readme","keywords":["aisnitch","ai","agent","websocket","client","sdk","claude-code","opencode","monitoring"],"repository":{"type":"git","url":"git+https://github.com/vava-nessa/AISnitch.git","directory":"packages/client"},"description":"Lightweight TypeScript SDK to consume the AISnitch WebSocket event stream — auto-reconnect, Zod parsing, session tracking, filters, and human-readable helpers.","maintainers":[{"name":"vava-nessa","email":"vanessadepraute@gmail.com"}],"readme":"# @aisnitch/client\n\n**The official TypeScript SDK for the AISnitch event stream.**\n\n[![npm](https://img.shields.io/npm/v/@aisnitch/client?logo=npm)](https://www.npmjs.com/package/@aisnitch/client)\n[![License: Apache-2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](../../LICENSE)\n\nConnect to AISnitch and consume live AI tool activity in 3 lines. Auto-reconnect, Zod-validated parsing, session tracking, composable filters, human-readable descriptions, and mascot state mapping — everything a consumer needs, zero boilerplate.\n\n---\n\n## Before / After\n\n**Without the SDK** — 40+ lines of manual WebSocket handling, JSON parsing, reconnect logic, type definitions, welcome message filtering:\n\n```typescript\nconst ws = new WebSocket('ws://127.0.0.1:4820');\nws.onmessage = (msg) => {\n  const raw = JSON.parse(msg.data);\n  if (raw.type === 'welcome') { /* store welcome... */ return; }\n  // manual validation...\n  // manual session tracking...\n  // manual reconnect on close...\n  // manual type definitions...\n};\n```\n\n**With the SDK** — 3 lines:\n\n```typescript\nimport { createAISnitchClient, describeEvent } from '@aisnitch/client';\n\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\nclient.on('event', (e) => console.log(describeEvent(e)));\n// → \"claude-code is editing code → src/index.ts [myproject]\"\n```\n\nYou get auto-reconnect (exponential backoff), Zod validation (invalid messages silently dropped), full TypeScript types, session tracking, and the event emitter — all handled for you.\n\n---\n\n## Table of Contents\n\n- [Install](#install)\n- [Quick Start](#quick-start)\n- [Use Cases](#use-cases)\n  - [Live Dashboard / Status Monitor](#1-live-dashboard--status-monitor)\n  - [Sound Notifications (PeonPing-style)](#2-sound-notifications-peonping-style)\n  - [Animated Mascot / Companion App](#3-animated-mascot--companion-app)\n  - [Menu Bar Widget (Electron / Tauri)](#4-menu-bar-widget-electron--tauri)\n  - [CI / Slack / Discord Bot](#5-ci--slack--discord-bot)\n- [Framework Integration](#framework-integration)\n  - [React](#react)\n  - [Vue 3](#vue-3)\n- [API Reference](#api-reference)\n  - [createAISnitchClient()](#createaisnitchclientoptions)\n  - [AISnitchClient](#aisnitchclient)\n  - [SessionTracker](#sessiontracker)\n  - [Filters](#filters)\n  - [describeEvent()](#describeeventevent)\n  - [formatStatusLine()](#formatstatuslineevent-sessionnumber)\n  - [eventToMascotState()](#eventtomascotstateevent)\n  - [parseEvent() / parseWelcome()](#parseeventraw--parsewelcomeraw)\n- [TypeScript Integration](#typescript-integration)\n- [Troubleshooting](#troubleshooting)\n- [Event Types Reference](#event-types-reference)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\npnpm add @aisnitch/client zod\n```\n\n**Node.js** consumers also need:\n\n```bash\npnpm add ws\npnpm add -D @types/ws    # for TypeScript\n```\n\n**Browser** consumers don't need `ws` — the native `WebSocket` is auto-detected.\n\n| Dependency | Role | Required? |\n|---|---|---|\n| `zod` | Event validation (peer dep) | Yes |\n| `ws` | WebSocket for Node.js | Node.js only |\n\n---\n\n## Quick Start\n\n### Node.js\n\n```typescript\nimport { createAISnitchClient, describeEvent } from '@aisnitch/client';\nimport WebSocket from 'ws';\n\nconst client = createAISnitchClient({\n  WebSocketClass: WebSocket as any,\n});\n\nclient.on('connected', (welcome) => {\n  console.log(`AISnitch v${welcome.version}`);\n  console.log(`Active tools: ${welcome.activeTools.join(', ')}`);\n});\n\nclient.on('event', (e) => {\n  console.log(describeEvent(e));\n});\n\nclient.on('disconnected', () => {\n  console.log('Disconnected — will auto-reconnect...');\n});\n```\n\n### Browser\n\n```typescript\nimport { createAISnitchClient, describeEvent } from '@aisnitch/client';\n\n// No WebSocketClass needed — native WebSocket auto-detected\nconst client = createAISnitchClient();\n\nclient.on('event', (e) => {\n  document.getElementById('status')!.textContent = describeEvent(e);\n});\n```\n\n---\n\n## Use Cases\n\n### 1. Live Dashboard / Status Monitor\n\nDisplay all AI agent activity in a single terminal or web page. Track sessions, see what each agent is doing, how many events each has processed.\n\n```typescript\nimport {\n  createAISnitchClient,\n  describeEvent,\n  formatStatusLine,\n} from '@aisnitch/client';\nimport WebSocket from 'ws';\n\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n\n// 📖 The SDK tracks sessions automatically — no manual bookkeeping\nclient.on('connected', (welcome) => {\n  console.log(`\\n🟢 Connected to AISnitch v${welcome.version}`);\n  console.log(`   Active tools: ${welcome.activeTools.join(', ')}\\n`);\n});\n\n// 📖 Every event gets a human-readable description out of the box\nlet sessionCounter = 0;\nconst sessionNumbers = new Map<string, number>();\n\nclient.on('event', (e) => {\n  // Assign session numbers for display\n  if (!sessionNumbers.has(e['aisnitch.sessionid'])) {\n    sessionNumbers.set(e['aisnitch.sessionid'], ++sessionCounter);\n  }\n  const num = sessionNumbers.get(e['aisnitch.sessionid'])!;\n\n  // formatStatusLine produces lines like:\n  // \"#1 /home/user/myproject — claude-code is thinking...\"\n  // \"#2 /home/user/api — codex is editing code → src/db.ts\"\n  console.log(formatStatusLine(e, num));\n});\n\n// 📖 Periodic session summary\nsetInterval(() => {\n  const sessions = client.sessions?.getAll() ?? [];\n  if (sessions.length === 0) return;\n\n  console.log(`\\n--- ${sessions.length} active session(s) ---`);\n  for (const s of sessions) {\n    console.log(`  [${s.tool}] ${s.lastActivity} (${s.eventCount} events since ${s.startedAt})`);\n  }\n  console.log('');\n}, 10_000);\n```\n\n**What `describeEvent()` produces for each event type:**\n\n| Event | Output |\n|---|---|\n| `session.start` | `claude-code started a new session [myproject]` |\n| `agent.thinking` | `claude-code is thinking...` |\n| `agent.coding` | `claude-code is editing code → src/index.ts [myproject]` |\n| `agent.tool_call` | `claude-code is calling a tool → Bash [myproject]` |\n| `agent.asking_user` | `claude-code is waiting for user input` |\n| `agent.error` | `claude-code encountered an error — Rate limit exceeded` |\n| `task.complete` | `claude-code completed the task [myproject]` |\n\n---\n\n### 2. Sound Notifications (PeonPing-style)\n\nPlay sounds when your agents do things — a keyboard clatter when they code, a bell when they need input, a fanfare when a task completes. This is the pattern that [PeonPing](https://github.com/nichochar/peon-ping) popularized.\n\n```typescript\nimport { createAISnitchClient, filters, type AISnitchEventType } from '@aisnitch/client';\nimport WebSocket from 'ws';\n\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n\n// 📖 Map each event type to a sound file\nconst SOUND_MAP: Partial<Record<AISnitchEventType, string>> = {\n  'session.start':     './sounds/boot.wav',\n  'session.end':       './sounds/shutdown.wav',\n  'task.start':        './sounds/ping.wav',\n  'task.complete':     './sounds/fanfare.wav',\n  'agent.thinking':    './sounds/hum.wav',\n  'agent.coding':      './sounds/keyboard.wav',\n  'agent.tool_call':   './sounds/tool.wav',\n  'agent.asking_user': './sounds/bell.wav',\n  'agent.error':       './sounds/error.wav',\n  'agent.idle':        './sounds/crickets.wav',\n};\n\nclient.on('event', (e) => {\n  const soundFile = SOUND_MAP[e.type];\n  if (soundFile) {\n    playSound(soundFile);  // your audio playback function\n  }\n});\n\n// 📖 Want sounds only for Claude Code? Use a filter:\n// client.on('event', (e) => {\n//   if (filters.byTool('claude-code')(e)) playSound(SOUND_MAP[e.type]);\n// });\n```\n\n**Browser variant with Web Audio:**\n\n```typescript\nimport { createAISnitchClient, type AISnitchEventType } from '@aisnitch/client';\n\nconst client = createAISnitchClient(); // browser — native WS\n\nconst audioCache = new Map<string, HTMLAudioElement>();\n\nfunction playSound(file: string): void {\n  let audio = audioCache.get(file);\n  if (!audio) {\n    audio = new Audio(file);\n    audioCache.set(file, audio);\n  }\n  audio.currentTime = 0;\n  audio.play();\n}\n```\n\n---\n\n### 3. Animated Mascot / Companion App\n\nBuild a desktop pet, overlay widget, or animated character that reacts to your AI agents. The SDK maps every event to a `MascotState` with mood, animation name, color, and label.\n\n```typescript\nimport { createAISnitchClient, eventToMascotState, type MascotState } from '@aisnitch/client';\n\nconst client = createAISnitchClient();\n\nclient.on('event', (e) => {\n  const state: MascotState = eventToMascotState(e);\n\n  // state.mood      → 'idle' | 'thinking' | 'working' | 'waiting' | 'celebrating' | 'panicking'\n  // state.animation → 'ponder' | 'type' | 'hammer' | 'tap' | 'dance' | 'shake' | ...\n  // state.color     → '#a855f7' (hex accent color)\n  // state.label     → 'Thinking...' | 'Coding' | 'Needs input' | ...\n  // state.detail    → 'src/index.ts' | 'Bash' | 'Rate limit exceeded' (optional)\n\n  updateSprite(state.mood, state.animation);\n  updateColorScheme(state.color);\n  updateLabel(state.label);\n  if (state.detail) updateTooltip(state.detail);\n});\n```\n\n**Complete mood mapping:**\n\n| Event Type | Mood | Animation | Color | Label |\n|---|---|---|---|---|\n| `session.start` | `celebrating` | `wave` | `#22c55e` | New session! |\n| `session.end` | `idle` | `sleep` | `#6b7280` | Session ended |\n| `task.start` | `working` | `stretch` | `#3b82f6` | New task |\n| `task.complete` | `celebrating` | `dance` | `#22c55e` | Task done! |\n| `agent.thinking` | `thinking` | `ponder` | `#a855f7` | Thinking... |\n| `agent.coding` | `working` | `type` | `#f59e0b` | Coding |\n| `agent.tool_call` | `working` | `hammer` | `#f59e0b` | Tool call |\n| `agent.streaming` | `working` | `talk` | `#3b82f6` | Streaming |\n| `agent.asking_user` | `waiting` | `tap` | `#ef4444` | Needs input |\n| `agent.idle` | `idle` | `yawn` | `#6b7280` | Idle |\n| `agent.error` | `panicking` | `shake` | `#ef4444` | Error! |\n| `agent.compact` | `thinking` | `compress` | `#a855f7` | Compacting |\n\nYou supply the sprites/CSS/canvas rendering — the SDK handles the state machine.\n\n---\n\n### 4. Menu Bar Widget (Electron / Tauri)\n\nShow the current agent activity in your system tray. Update the tray title and tooltip on every event.\n\n```typescript\nimport { createAISnitchClient, formatStatusLine, describeEvent } from '@aisnitch/client';\nimport WebSocket from 'ws';\n\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n\nlet sessionCounter = 0;\nconst sessionMap = new Map<string, number>();\n\nclient.on('event', (e) => {\n  // 📖 Assign numbered sessions: #1, #2, #3...\n  if (!sessionMap.has(e['aisnitch.sessionid'])) {\n    sessionMap.set(e['aisnitch.sessionid'], ++sessionCounter);\n  }\n  const num = sessionMap.get(e['aisnitch.sessionid'])!;\n\n  // 📖 Update tray icon and text\n  tray.setTitle(formatStatusLine(e, num));\n  // → \"#1 ~/myproject — claude-code is thinking...\"\n\n  tray.setToolTip(\n    `AISnitch — ${client.sessions?.count ?? 0} active session(s)`,\n  );\n\n  // 📖 Show native notification on events that need attention\n  if (e.type === 'agent.asking_user') {\n    new Notification({\n      title: `${e['aisnitch.tool']} needs input`,\n      body: describeEvent(e),\n    }).show();\n  }\n});\n\nclient.on('disconnected', () => {\n  tray.setTitle('AISnitch — offline');\n});\n```\n\n---\n\n### 5. CI / Slack / Discord Bot\n\nPost activity summaries to team channels. Notify when an agent finishes, errors out, or needs attention.\n\n```typescript\nimport { createAISnitchClient, filters, describeEvent } from '@aisnitch/client';\nimport WebSocket from 'ws';\n\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n\n// 📖 Post to Slack when agents need human input or hit errors\nclient.on('event', (e) => {\n  if (filters.needsAttention(e)) {\n    postToSlack({\n      channel: '#ai-agents',\n      text: `⚠️ ${describeEvent(e)}`,\n      emoji: e.type === 'agent.error' ? ':rotating_light:' : ':wave:',\n    });\n  }\n});\n\n// 📖 Daily summary: post session stats every hour\nsetInterval(() => {\n  const sessions = client.sessions?.getAll() ?? [];\n  if (sessions.length === 0) return;\n\n  const summary = sessions\n    .map((s) => `• *${s.tool}* — ${s.lastActivity} (${s.eventCount} events)`)\n    .join('\\n');\n\n  postToSlack({\n    channel: '#ai-agents',\n    text: `📊 *Active AI sessions:*\\n${summary}`,\n  });\n}, 3_600_000);\n\n// 📖 Alert on rate limits across any tool\nclient.on('event', (e) => {\n  if (e.type === 'agent.error' && e.data.errorType === 'rate_limit') {\n    postToSlack({\n      channel: '#ai-agents',\n      text: `🚨 Rate limit hit on *${e['aisnitch.tool']}*: ${e.data.errorMessage ?? 'unknown'}`,\n    });\n  }\n});\n```\n\n---\n\n## Framework Integration\n\n### React\n\nA complete, production-ready React hook with TypeScript support:\n\n```tsx\nimport { useEffect, useRef, useState } from 'react';\nimport {\n  createAISnitchClient,\n  type AISnitchClient,\n  type AISnitchClientOptions,\n  type AISnitchEvent,\n  type SessionState,\n  type WelcomeMessage,\n} from '@aisnitch/client';\n\n/**\n * 📖 Core hook — connects to AISnitch and returns live events, sessions, and connection state.\n * Handles connect/disconnect/cleanup automatically.\n */\nexport function useAISnitch(options?: AISnitchClientOptions) {\n  const [events, setEvents] = useState<AISnitchEvent[]>([]);\n  const [latestEvent, setLatestEvent] = useState<AISnitchEvent | null>(null);\n  const [sessions, setSessions] = useState<SessionState[]>([]);\n  const [connected, setConnected] = useState(false);\n  const [welcome, setWelcome] = useState<WelcomeMessage | null>(null);\n  const clientRef = useRef<AISnitchClient | null>(null);\n\n  useEffect(() => {\n    const client = createAISnitchClient(options);\n    clientRef.current = client;\n\n    client.on('connected', (w) => {\n      setConnected(true);\n      setWelcome(w);\n    });\n\n    client.on('disconnected', () => setConnected(false));\n\n    client.on('event', (e) => {\n      setLatestEvent(e);\n      setEvents((prev) => [...prev.slice(-499), e]);\n      // 📖 Refresh sessions from the built-in tracker\n      setSessions(client.sessions?.getAll() ?? []);\n    });\n\n    return () => client.destroy();\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const clear = () => {\n    setEvents([]);\n    setLatestEvent(null);\n  };\n\n  return { events, latestEvent, sessions, connected, welcome, clear };\n}\n```\n\n**Usage in a component:**\n\n```tsx\nfunction AIActivityPanel() {\n  const { events, sessions, connected, welcome } = useAISnitch();\n\n  return (\n    <div>\n      <header>\n        {connected\n          ? `🟢 AISnitch v${welcome?.version} — ${sessions.length} session(s)`\n          : '🔴 Disconnected — reconnecting...'}\n      </header>\n\n      {sessions.map((s) => (\n        <div key={s.sessionId}>\n          <strong>[{s.tool}]</strong> {s.lastActivity}\n          <span> ({s.eventCount} events)</span>\n        </div>\n      ))}\n\n      <ul>\n        {events.map((e) => (\n          <li key={e.id}>\n            <code>{e['aisnitch.tool']}</code> — {e.type}\n            {e.data.activeFile && ` → ${e.data.activeFile}`}\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n}\n```\n\n**Filtered hook — only get events you care about:**\n\n```tsx\nimport { filters, type EventFilter } from '@aisnitch/client';\n\nexport function useAISnitchFiltered(filter: EventFilter) {\n  const { events, ...rest } = useAISnitch();\n  const filtered = events.filter(filter);\n  return { events: filtered, ...rest };\n}\n\n// Usage:\nconst { events } = useAISnitchFiltered(filters.byTool('claude-code'));\nconst { events } = useAISnitchFiltered(filters.isCoding);\nconst { events } = useAISnitchFiltered(filters.needsAttention);\n```\n\n---\n\n### Vue 3\n\n```typescript\nimport { onMounted, onUnmounted, ref, type Ref } from 'vue';\nimport {\n  createAISnitchClient,\n  type AISnitchClient,\n  type AISnitchEvent,\n  type SessionState,\n  type WelcomeMessage,\n} from '@aisnitch/client';\n\nexport function useAISnitch(url?: string) {\n  const events: Ref<AISnitchEvent[]> = ref([]);\n  const latestEvent: Ref<AISnitchEvent | null> = ref(null);\n  const sessions: Ref<SessionState[]> = ref([]);\n  const connected = ref(false);\n  const welcome: Ref<WelcomeMessage | null> = ref(null);\n  let client: AISnitchClient | null = null;\n\n  onMounted(() => {\n    client = createAISnitchClient(url ? { url } : undefined);\n\n    client.on('connected', (w) => {\n      connected.value = true;\n      welcome.value = w;\n    });\n\n    client.on('disconnected', () => {\n      connected.value = false;\n    });\n\n    client.on('event', (e) => {\n      latestEvent.value = e;\n      events.value = [...events.value.slice(-499), e];\n      sessions.value = client?.sessions?.getAll() ?? [];\n    });\n  });\n\n  onUnmounted(() => {\n    client?.destroy();\n  });\n\n  function clear() {\n    events.value = [];\n    latestEvent.value = null;\n  }\n\n  return { events, latestEvent, sessions, connected, welcome, clear };\n}\n```\n\n**Usage in a component:**\n\n```vue\n<script setup lang=\"ts\">\nimport { useAISnitch } from './composables/useAISnitch';\nimport { describeEvent } from '@aisnitch/client';\n\nconst { events, sessions, connected, welcome } = useAISnitch();\n</script>\n\n<template>\n  <div>\n    <p v-if=\"connected\">\n      🟢 AISnitch v{{ welcome?.version }} — {{ sessions.length }} session(s)\n    </p>\n    <p v-else>🔴 Disconnected — reconnecting...</p>\n\n    <div v-for=\"s in sessions\" :key=\"s.sessionId\">\n      <strong>[{{ s.tool }}]</strong> {{ s.lastActivity }}\n    </div>\n\n    <ul>\n      <li v-for=\"e in events\" :key=\"e.id\">\n        {{ describeEvent(e) }}\n      </li>\n    </ul>\n  </div>\n</template>\n```\n\n---\n\n## API Reference\n\n### `createAISnitchClient(options?)`\n\nFactory function — creates a client and connects immediately. **This is the recommended entry point.**\n\n```typescript\nimport { createAISnitchClient } from '@aisnitch/client';\n\nconst client = createAISnitchClient({\n  url: 'ws://127.0.0.1:4820',       // default\n  autoReconnect: true,                // default\n  reconnectIntervalMs: 3000,          // initial delay — default: 3s\n  maxReconnectIntervalMs: 30000,      // backoff cap — default: 30s\n  WebSocketClass: WebSocket,          // required in Node.js (pass `ws`)\n  trackSessions: true,                // default — enables client.sessions\n});\n```\n\nReturns an `AISnitchClient` instance.\n\n---\n\n### `AISnitchClient`\n\nThe core class. Manages the WebSocket connection, event parsing, reconnection, and session tracking.\n\n#### Methods\n\n| Method | Description |\n|---|---|\n| `connect()` | Open the WebSocket connection. Safe to call multiple times. |\n| `disconnect()` | Close cleanly. Suppresses auto-reconnect. |\n| `destroy()` | Full teardown — disconnect + remove all listeners. Permanent. |\n| `on(event, callback)` | Subscribe to an event. Returns an unsubscribe function. |\n| `off(event, callback)` | Remove a specific listener. |\n\n#### Properties\n\n| Property | Type | Description |\n|---|---|---|\n| `connected` | `boolean` | Whether the WebSocket is currently open |\n| `welcome` | `WelcomeMessage \\| null` | Last welcome message received |\n| `sessions` | `SessionTracker \\| null` | Built-in session tracker (if `trackSessions` is true) |\n\n#### Events\n\n```typescript\n// 📖 All validated AISnitch events (CloudEvents envelope)\nclient.on('event', (e: AISnitchEvent) => { ... });\n\n// 📖 Fires when WebSocket opens AND welcome message is received\nclient.on('connected', (welcome: WelcomeMessage) => { ... });\n\n// 📖 Fires on WebSocket close\nclient.on('disconnected', () => { ... });\n\n// 📖 Fires on WebSocket errors (connection refused, etc.)\nclient.on('error', (err: Error) => { ... });\n```\n\n#### Auto-Reconnect Behavior\n\nWhen the connection drops and `autoReconnect` is `true` (default), the client retries with exponential backoff:\n\n```\nAttempt 1 → wait 3s\nAttempt 2 → wait 6s\nAttempt 3 → wait 12s\nAttempt 4 → wait 24s\nAttempt 5+ → wait 30s (cap)\n```\n\nThe timer resets to 3s as soon as a connection succeeds. Calling `disconnect()` or `destroy()` stops all reconnection attempts.\n\n#### Unsubscribe Pattern\n\n```typescript\n// on() returns an unsubscribe function\nconst unsub = client.on('event', handler);\n\n// Later:\nunsub(); // removes the listener\n\n// Or use off() directly:\nclient.off('event', handler);\n```\n\n---\n\n### `SessionTracker`\n\nTracks active AI tool sessions in real-time. Available via `client.sessions` when `trackSessions` is enabled (default).\n\nSessions are created on the first event for a given `aisnitch.sessionid` and removed on `session.end`.\n\n#### Methods\n\n| Method | Returns | Description |\n|---|---|---|\n| `get(sessionId)` | `SessionState \\| undefined` | Get a single session by ID |\n| `getAll()` | `SessionState[]` | All currently active sessions |\n| `getByTool(tool)` | `SessionState[]` | Filter sessions by tool name |\n| `clear()` | `void` | Remove all tracked sessions |\n\n#### Properties\n\n| Property | Type | Description |\n|---|---|---|\n| `count` | `number` | Number of active sessions |\n\n#### `SessionState`\n\n```typescript\ninterface SessionState {\n  tool: ToolName;            // 'claude-code', 'opencode', etc.\n  sessionId: string;         // unique session identifier\n  project?: string;          // project name (if known)\n  cwd?: string;              // working directory (if known)\n  lastEvent: AISnitchEvent;  // most recent event\n  lastActivity: string;      // human-readable description of last activity\n  eventCount: number;        // total events received in this session\n  startedAt: string;         // ISO timestamp of first event\n}\n```\n\n#### Example\n\n```typescript\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n\n// Wait for some events, then query sessions:\nconst all = client.sessions.getAll();\n// → [{ tool: 'claude-code', project: 'myapp', eventCount: 42, ... }]\n\nconst claude = client.sessions.getByTool('claude-code');\n// → only Claude Code sessions\n\nconst single = client.sessions.get('claude-code:myapp:p12345');\n// → one specific session or undefined\n```\n\n---\n\n### Filters\n\nComposable, typed predicate functions. Each returns `(event: AISnitchEvent) => boolean`.\n\n```typescript\nimport { filters } from '@aisnitch/client';\n```\n\n| Filter | Signature | Matches |\n|---|---|---|\n| `filters.byTool(tool)` | `(ToolName) => EventFilter` | Events from a specific AI tool |\n| `filters.byType(type)` | `(AISnitchEventType) => EventFilter` | A single event type |\n| `filters.byTypes(...types)` | `(...AISnitchEventType[]) => EventFilter` | Any of several event types |\n| `filters.byProject(name)` | `(string) => EventFilter` | Events from a specific project |\n| `filters.needsAttention` | `EventFilter` | `agent.asking_user` or `agent.error` |\n| `filters.isCoding` | `EventFilter` | `agent.coding` or `agent.tool_call` |\n| `filters.isActive` | `EventFilter` | Everything except `agent.idle` and `session.end` |\n\n#### Composing Filters\n\nFilters are standard predicates — compose them with `Array.filter`, `&&`, or any pattern you prefer:\n\n```typescript\n// Chain with Array.filter\nconst claudeCoding = allEvents\n  .filter(filters.byTool('claude-code'))\n  .filter(filters.isCoding);\n\n// Combine in a callback\nclient.on('event', (e) => {\n  if (filters.byTool('claude-code')(e) && filters.isCoding(e)) {\n    console.log('Claude is coding:', e.data.activeFile);\n  }\n});\n\n// Create composite filters\nconst urgentClaude = (e: AISnitchEvent) =>\n  filters.byTool('claude-code')(e) && filters.needsAttention(e);\n```\n\n---\n\n### `describeEvent(event)`\n\nGenerate a short human-readable description of any AISnitch event.\n\n```typescript\nimport { describeEvent } from '@aisnitch/client';\n\ndescribeEvent(event);\n// → \"claude-code is editing code → src/index.ts [myproject]\"\n// → \"codex is calling a tool → Bash\"\n// → \"opencode encountered an error — Rate limit exceeded\"\n// → \"claude-code completed the task [myapp]\"\n```\n\nIncludes contextual details when available: active file, tool name, tool input, error message, project name.\n\n---\n\n### `formatStatusLine(event, sessionNumber?)`\n\nGenerate a numbered status line for dashboards and TUIs.\n\n```typescript\nimport { formatStatusLine } from '@aisnitch/client';\n\nformatStatusLine(event, 3);\n// → \"#3 /home/user/myproject — claude-code is thinking...\"\n\nformatStatusLine(event);\n// → \"/home/user/myproject — claude-code is thinking...\"\n```\n\n---\n\n### `eventToMascotState(event)`\n\nMap an event to a mood/animation/color state for animated companions.\n\n```typescript\nimport { eventToMascotState, type MascotState } from '@aisnitch/client';\n\nconst state: MascotState = eventToMascotState(event);\n```\n\n```typescript\ninterface MascotState {\n  mood: 'idle' | 'thinking' | 'working' | 'waiting' | 'celebrating' | 'panicking';\n  animation: string;  // suggested animation name (e.g. 'type', 'ponder', 'shake')\n  color: string;      // hex accent color (e.g. '#f59e0b')\n  label: string;      // short label (e.g. 'Coding', 'Thinking...')\n  detail?: string;    // optional context (tool name, file path, error message)\n}\n```\n\nSee [Use Case #3](#3-animated-mascot--companion-app) for the complete mood mapping table.\n\n---\n\n### `parseEvent(raw)` / `parseWelcome(raw)`\n\nLow-level Zod-powered parsers. These are what the client uses internally — exposed for advanced use cases.\n\n```typescript\nimport { parseEvent, parseWelcome } from '@aisnitch/client';\n\nconst event = parseEvent(someUnknownData);\n// → AISnitchEvent | null (never throws)\n\nconst welcome = parseWelcome(someUnknownData);\n// → WelcomeMessage | null (never throws)\n```\n\nBoth return `null` on invalid input — they never throw. Useful if you're building a custom WebSocket handler or parsing events from a different source.\n\n---\n\n## TypeScript Integration\n\nThe SDK is written in TypeScript with strict types throughout. Every type is exported and ready for use.\n\n### Type Imports\n\n```typescript\nimport type {\n  AISnitchEvent,       // full event envelope (CloudEvents + AISnitch extensions)\n  AISnitchEventData,   // normalized payload (data.*)\n  AISnitchEventType,   // 'session.start' | 'agent.thinking' | ... (12 types)\n  ToolName,            // 'claude-code' | 'opencode' | ... (17 tools)\n  ErrorType,           // 'rate_limit' | 'context_overflow' | 'tool_failure' | 'api_error'\n  ToolInput,           // { filePath?: string; command?: string }\n  WelcomeMessage,      // welcome payload on connection\n  MascotState,         // mood/animation/color for companions\n  SessionState,        // tracked session snapshot\n  AISnitchClientOptions,\n} from '@aisnitch/client';\n```\n\n### Constant Arrays\n\n```typescript\nimport {\n  AISNITCH_EVENT_TYPES,  // readonly ['session.start', 'session.end', ...] (12 items)\n  TOOL_NAMES,            // readonly ['claude-code', 'opencode', ...] (17 items)\n  ERROR_TYPES,           // readonly ['rate_limit', 'context_overflow', ...] (4 items)\n} from '@aisnitch/client';\n\n// Use in type guards, switch statements, UI dropdowns, etc.\nfor (const type of AISNITCH_EVENT_TYPES) {\n  console.log(type); // fully typed as AISnitchEventType\n}\n```\n\n### Full Autocompletion\n\nThe event types and tool names are string literal unions, so your editor gives you full autocompletion:\n\n```typescript\n// ✅ Autocompletes all 12 types\nfilters.byType('agent.'); // → agent.thinking, agent.coding, agent.tool_call, ...\n\n// ✅ Autocompletes all 17 tools\nfilters.byTool('c'); // → claude-code, codex, copilot-cli, cline, continue, cursor\n\n// ✅ Event fields are fully typed\nclient.on('event', (e) => {\n  e.type;                  // AISnitchEventType\n  e['aisnitch.tool'];     // ToolName\n  e.data.errorType;       // 'rate_limit' | 'context_overflow' | ... | undefined\n  e.data.toolInput?.filePath; // string | undefined\n});\n```\n\n---\n\n## Troubleshooting\n\n### \"Connection refused\" / client never connects\n\nAISnitch daemon must be running. Start it first:\n\n```bash\naisnitch start --daemon   # background daemon\n# or\naisnitch start            # foreground with TUI\n```\n\nThen verify:\n\n```bash\ncurl http://127.0.0.1:4821/health\n# → { \"status\": \"ok\", ... }\n```\n\n### \"No events received\"\n\n1. Check that at least one adapter is set up: `aisnitch adapters`\n2. Try mock mode: `aisnitch start --mock all` (generates fake events)\n3. Verify your consumer is connected: check the `consumers` count in `/health`\n\n### Node.js: \"Cannot find module 'ws'\"\n\n`ws` is not bundled with the SDK — install it separately:\n\n```bash\npnpm add ws\npnpm add -D @types/ws\n```\n\nThen pass it to the client:\n\n```typescript\nimport WebSocket from 'ws';\nconst client = createAISnitchClient({ WebSocketClass: WebSocket as any });\n```\n\n### \"No WebSocket implementation found\"\n\nThis means you're in Node.js and didn't pass `WebSocketClass`. Browsers have `WebSocket` natively, Node.js doesn't. See above.\n\n### Events arrive but fail validation (silently dropped)\n\nThe SDK uses Zod to validate every incoming message. If events are being dropped:\n\n1. Check AISnitch daemon version matches the SDK version\n2. Use `parseEvent()` directly to debug: `const result = parseEvent(raw); if (!result) console.log('Invalid:', raw);`\n\n### Auto-reconnect isn't working\n\n- `disconnect()` intentionally disables reconnect. Use `connect()` to resume.\n- `destroy()` is permanent — the client cannot be reused after destroy.\n- Check your `autoReconnect` option (default: `true`).\n\n---\n\n## Event Types Reference\n\n| Type | Description | Example trigger |\n|---|---|---|\n| `session.start` | A tool session began | Tool launched, first hook received |\n| `session.end` | Session closed | Tool exited, process disappeared |\n| `task.start` | User submitted a prompt | New user message |\n| `task.complete` | Task finished | Response complete |\n| `agent.thinking` | Model is reasoning | Thinking block, reflection |\n| `agent.streaming` | Model is generating output | Text streaming |\n| `agent.coding` | Model is editing files | Write, Edit, MultiEdit |\n| `agent.tool_call` | Model used a tool | Bash, Grep, web search |\n| `agent.asking_user` | Waiting for human input | Permission prompt |\n| `agent.idle` | No activity (timeout) | 120s silence (configurable) |\n| `agent.error` | Something went wrong | Rate limit, API error |\n| `agent.compact` | Context compaction | Memory cleanup |\n\n### Recognized Tool Names\n\n`claude-code` `opencode` `gemini-cli` `codex` `goose` `copilot-cli` `cursor` `aider` `amp` `cline` `continue` `windsurf` `qwen-code` `openclaw` `openhands` `kilo` `unknown`\n\n---\n\n## License\n\nApache-2.0, © [Vanessa Depraute / vava-nessa](https://github.com/vava-nessa).\n","readmeFilename":"README.md"}