{"_id":"@flomesh/ztm-chat","_rev":"33-9c49ed94b85f9aa9b4890a24261b7d27","name":"@flomesh/ztm-chat","dist-tags":{"next":"2026.2.20-rc.3","latest":"2026.3.26"},"versions":{"2026.2.15":{"name":"@flomesh/ztm-chat","version":"2026.2.15","_id":"@flomesh/ztm-chat@2026.2.15","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"40149c343cdd651b5bf5b7b9ce76b16155ed5e1f","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.15.tgz","fileCount":3,"integrity":"sha512-EilMOpqrmSCE6/DKGlokFc5KV3D8RXZt4M3C+i4W57eWp/8MuNslg1IKMvTD2H1ksWvvJeR5coUg4YKZY/H4ng==","signatures":[{"sig":"MEQCIEMI9iPgf3NCW3PZTlcXIc2JY9Zyzpr9tKCO22KRJcvlAiAJjJbQtE94YnRtBNAI+Uxh7U6C9JGH7/SP2jIGIosuZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29531},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5a98629f470815263e6a1fb5d9252291996d15b1","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.15_1771330290553_0.5171453277016651","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-alpha.1":{"name":"@flomesh/ztm-chat","version":"2026.2.18-alpha.1","_id":"@flomesh/ztm-chat@2026.2.18-alpha.1","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"424cc7fe2c0de7eea535f8e76f5bce5e329ee05c","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-alpha.1.tgz","fileCount":3,"integrity":"sha512-1hZ5bpWlv/nbXRaXugM4UYH9M8wlIE7LSxrE1RkNMumr0WeZ6tUzgFl3f7IPXydBc2m+ArbOchB31hzZEhvm7Q==","signatures":[{"sig":"MEQCIDlSDBz0YwkuIlszRSp+no05+N3KezijAHRGpTKvmP4NAiB/cmTBu2KJzunHoOAt2X4AIA/Gp1sEHRgsl3RYZ8KSpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30072},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8df41e1556fb8bcef805190c84bd287e3e19462d","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-alpha.1_1771393776323_0.36083961388742214","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-alpha.3":{"name":"@flomesh/ztm-chat","version":"2026.2.18-alpha.3","_id":"@flomesh/ztm-chat@2026.2.18-alpha.3","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"c1b175c9f966ffdd8bd868eff8997673b6909283","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-alpha.3.tgz","fileCount":3,"integrity":"sha512-wpfCr18tQuhzUvIZ3rRhiJY2+8Utk84V5RdilU2hhdCAUE26paKqUD531gmrDg1I6AtUy6UvNtdCSPlNDdHo0A==","signatures":[{"sig":"MEUCIFNMQBbQj5xtpF/sEWDxx29YR8XY1YzW7ti452Kjlu6rAiEA2u06TzUhnFps5CBNT5uVy1hEcGbl7oJ2tU5tBsFPEGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30072},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c7f5ce1c1bcf063d7c273c729aedb34e69fe17d3","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-alpha.3_1771395571959_0.1285653974327543","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-beta.1":{"name":"@flomesh/ztm-chat","version":"2026.2.18-beta.1","_id":"@flomesh/ztm-chat@2026.2.18-beta.1","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"3c394888944bbd19d64b103cd2a53f45c59cdba3","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-beta.1.tgz","fileCount":3,"integrity":"sha512-icu9txqBBiflbJPIgQ0g9OghF9SZhoJFyP90A8B24YQxfc4FhJcRvGRhSjNCI/nUchNcDjo/RKh51Xy+AaVQ5g==","signatures":[{"sig":"MEYCIQDwHulwPBN7ut5q1kTVGYOc7Qwenp2MpYX+6la2lfl3HwIhANrvjV2VsCB2yW6rZ71S9GfACJFfG8S90OgEsWYtYyqQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30071},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"22f9a8dc2ace768f9ba379d7c447d8a5f3f5a215","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-beta.1_1771396625784_0.3800571860356441","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-rc.1":{"name":"@flomesh/ztm-chat","version":"2026.2.18-rc.1","_id":"@flomesh/ztm-chat@2026.2.18-rc.1","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"30ae2b1ad6269a19893cfb0b7bf47bf998599af3","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-rc.1.tgz","fileCount":3,"integrity":"sha512-7WdkTzd1utXSu1JBrtCAPwnJzLyzZBq1/0ilNb2gdOIyliaEHl0GFYJidx2/1Emzvi7z6qTlldvIw0mdzeDnGA==","signatures":[{"sig":"MEYCIQCXFnJJERHZ6LWKDHOgUFUb3sSY1baBB5DuYkOOZDwYwgIhAIqRasBiHnbCTncsIx7A7zFIsvlkVACmFygqza+0yF1l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30069},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"20f3c0e05e323ef040700e7354e23fca893f9c80","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-rc.1_1771412839961_0.15154476108958814","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-rc.2":{"name":"@flomesh/ztm-chat","version":"2026.2.18-rc.2","_id":"@flomesh/ztm-chat@2026.2.18-rc.2","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"7aa5c60e24af2678142166e2f5d61cfb5bd278af","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-rc.2.tgz","fileCount":3,"integrity":"sha512-XG2S/te7QtClG5UgHgkp6bZ0dDvJ5Dlpacm88TGHPBuSx1WfkYWZ/seWSJ/CgAq5ynPzeuuOQaJo6LA45iOxiA==","signatures":[{"sig":"MEQCICEoT0E3azOFWyeys5chyg9/OEjtrdg9hNPgfOPzdhnZAiApYGDuhAuqdqDmKQydcHFiuLrHtGxFACdVnIU7pXSTaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30069},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"75253c48aa68ae2b1c0f26e1356843655c08a6a7","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-rc.2_1771417171133_0.5690794139111235","host":"s3://npm-registry-packages-npm-production"}},"2026.2.18-rc.3":{"name":"@flomesh/ztm-chat","version":"2026.2.18-rc.3","_id":"@flomesh/ztm-chat@2026.2.18-rc.3","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"c0cfba9cea8dbe99d4ae148b95cf873e1622e369","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.18-rc.3.tgz","fileCount":3,"integrity":"sha512-rrVrpOUA3dyv0UFDSesUj5RuhCQzbopfeTaDtX/hKbU5PlVvTw1DDsUFMLTRdOVot/iDRIpD4VtzX2VyYjenjQ==","signatures":[{"sig":"MEUCIQC484vKTrryjYbSVQUkX7rLcKKV0RH/SzOeoZ5djNocXgIgPv/J/6Zdc+aLsI/DHp0SkAaYNPU0OsDZhECgVsFdn7o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30069},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"0e727cd79176e0dd2e749b6009d995ebfc375261","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.18-rc.3_1771418862914_0.06693783250159946","host":"s3://npm-registry-packages-npm-production"}},"2026.2.20-rc.1":{"name":"@flomesh/ztm-chat","version":"2026.2.20-rc.1","_id":"@flomesh/ztm-chat@2026.2.20-rc.1","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"3c14071f449b83aeb747b903eed2e16a9b62f2f6","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.20-rc.1.tgz","fileCount":3,"integrity":"sha512-JJic3zRZY2ebcMhu9NRma8kVvomD2Vw//hqAQ0RsnnDrlgqLn9f+bhjH5OMbZufl3BC9iud1oDkeHc6FMnBUPA==","signatures":[{"sig":"MEQCIAuC7eFoiiLC9WLMA3dK4OmSSqvXOUZO3jNVxP+08uimAiBUjIkVbVGJfr7QTmfL4VfF6tFDbbkw9OxDMz23eZoEug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30335},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"bebe3f2980a723dfad7507d92d68cfcaad580b6f","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"husky":"^9.1.7","eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","lint-staged":"^16.2.7","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.20-rc.1_1771518818043_0.4506273106273133","host":"s3://npm-registry-packages-npm-production"}},"2026.2.20-rc.3":{"name":"@flomesh/ztm-chat","version":"2026.2.20-rc.3","_id":"@flomesh/ztm-chat@2026.2.20-rc.3","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"d0fe904a37f76027171089f5f545521548ed2bda","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.20-rc.3.tgz","fileCount":3,"integrity":"sha512-le7/z2rhhEuP38cneBbu7bnjzzTZwdLUuzY/DDwvCq35sfnungKTP7A1d8QTHMMOl9zmPrHjXPFtoFHYdiwFrw==","signatures":[{"sig":"MEYCIQCTjs8lq5jhIWZwhzwUyEnjD/b1SFip1Cjo/PKOx7vbEgIhAOcMSW70R3hrQncFjd/LCDyZYbeHoAN/3cUzzKG8fTw2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30335},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b5645d13cf1397a320de0ff565f3c609ef7f0223","scripts":{"lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","changelog":"git-cliff --output CHANGELOG.md","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","changelog:preview":"git-cliff --unreleased","changelog:unreleased":"git-cliff --unreleased"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"husky":"^9.1.7","eslint":"^10.0.0","vitest":"^4.0.18","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","lint-staged":"^16.2.7","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.20-rc.3_1771521222235_0.9108571447504412","host":"s3://npm-registry-packages-npm-production"}},"2026.2.23":{"name":"@flomesh/ztm-chat","version":"2026.2.23","_id":"@flomesh/ztm-chat@2026.2.23","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"bcd393e463760228711ad5c7d8bd58ddd92a201b","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.23.tgz","fileCount":5,"integrity":"sha512-SStC4DaAqve91R1NjsYWn8k/VrBI+dnsOSk53CvqvP94ToAv6CGl5ccmDzFe3KGwCapsHLYsBPD6fhdl0aX0qA==","signatures":[{"sig":"MEUCIQDw2GWiVW/yPHTPTwIvtHnIGmKR1+Xqo3fJ3k6zmJNa6AIgNI8Tcvl/5ojIPtlW9c+KZQlDrF8Zz21fe9SZW9v/ERM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1105208},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"7c23a9df91f92ee87ce760bb3dbe931f138bbbba","scripts":{"lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.9","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.0.0","vitest":"^4.0.18","esbuild":"^0.27.3","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","lint-staged":"^16.2.7","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","conventional-changelog-cli":"^2.2.2","conventional-changelog-angular":"^8.1.0","@typescript-eslint/eslint-plugin":"^8.0.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.23_1771841533170_0.2852656610981832","host":"s3://npm-registry-packages-npm-production"}},"2026.2.25":{"name":"@flomesh/ztm-chat","version":"2026.2.25","_id":"@flomesh/ztm-chat@2026.2.25","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"2ecef40a23cbadf15ed9b2e0ceab166bf274d0c4","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.25.tgz","fileCount":5,"integrity":"sha512-02+/5R7jww0e65Oc8+YW06EZK95x6K1va+wvJfNAgIwQalNaJBKc7jbABWBRWVGhVb4UiUZ07ChjT6+vu8iSWw==","signatures":[{"sig":"MEQCIGirEn+3ofX4rNIF6KutiniFgFiDh07HA3jpTTsmy/RAAiA0UC5ePGbYrfKwxWmss2cJmxAnUVQqn1klX27FMV/Fzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1233277},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"f30219ff957a7db983d544b5f2265b8288e2ccff","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.6.2","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.0","dependencies":{"openclaw":"^2026.2.22","@sinclair/typebox":"^0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.0.0","vitest":"^4.0.18","esbuild":"^0.27.3","typedoc":"^0.28.17","prettier":"^3.0.0","typescript":"^5.9.3","@types/node":"^24.10.13","lint-staged":"^16.2.7","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.25_1772011221385_0.18660102243248078","host":"s3://npm-registry-packages-npm-production"}},"2026.2.26":{"name":"@flomesh/ztm-chat","version":"2026.2.26","_id":"@flomesh/ztm-chat@2026.2.26","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"a965436aa3f21a6a5d38adbd45f51a7af218d6e0","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.26.tgz","fileCount":5,"integrity":"sha512-kOtmK6S98hPHMDV9dvUqk5ZT/Dq1Daod0sd3/9oxuSHSVk/v2RU85VoHPD1Q9MN5SDy5Ww3yuZhgdA+XJIpQwg==","signatures":[{"sig":"MEQCIEP1GxYlSmZ1bHMb6rmC1YKMHsF19hMS2BFYMsAMAGYcAiAs9z2AxndZTQIBMX9PZ3J/uV4hfGB+2/PcUQ0vnxZr0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1235743},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"e5820473be6c0a75ed44956c1bc6b40ddcf27bdf","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"2026.2.24","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.10.13","lint-staged":"16.2.7","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.26_1772110887749_0.9173508717747207","host":"s3://npm-registry-packages-npm-production"}},"2026.2.27":{"name":"@flomesh/ztm-chat","version":"2026.2.27","_id":"@flomesh/ztm-chat@2026.2.27","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"b4434345a31794a1013b156c882cf7790ef5e7a6","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.27.tgz","fileCount":5,"integrity":"sha512-HGFfui+gnGKhh4p+vxi17BVySVQl0G4XMxLPIlndVfQCEgYAlw3B4OgOXkUDa7j7zEylvRsZnGxCSYQlbqw3Fg==","signatures":[{"sig":"MEQCIFiQBntxKkvTMVVrCyy6TMjxl35kv9D/ihqWPZzYMbOTAiAmv6a9Qg98vzDa/Bw3OXhPVX4qEggoV1QR8oy77f32zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1236056},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"d9a369440c483a38ddc3bdb53ae5a0c1079cef52","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"2026.2.26","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.10.15","lint-staged":"16.2.7","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.27_1772165416461_0.07936877928394948","host":"s3://npm-registry-packages-npm-production"}},"2026.2.28":{"name":"@flomesh/ztm-chat","version":"2026.2.28","_id":"@flomesh/ztm-chat@2026.2.28","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"5ebec02ecde20ee2937a460f612b692c37b08f72","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.2.28.tgz","fileCount":5,"integrity":"sha512-SuSGx016lK8yn7qVU89ZDL4ZlNRLMtzsN2p8oBE/uQavXsvkxeyEcs9bBooxj9xnAzXdebSu0yHfGFUPRJAB+A==","signatures":[{"sig":"MEYCIQC3J9ypqKqJgL9Awa6VPqeu7FF33/HZTF5mu79w3o6OVgIhAP70zt82EugpZ0X9GZn1cQZkAPXxYqb38qLnoV2qM3kz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1240027},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"6ed2eaffb264507f9de452b3a7c653d7d60f9f09","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"2026.2.26","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.10.15","lint-staged":"16.2.7","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.2.28_1772257177734_0.5520258707594805","host":"s3://npm-registry-packages-npm-production"}},"2026.3.2":{"name":"@flomesh/ztm-chat","version":"2026.3.2","_id":"@flomesh/ztm-chat@2026.3.2","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"dist":{"shasum":"a0c789ebcd8f4f36de9f193a3cf0bf0aa549a345","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.2.tgz","fileCount":5,"integrity":"sha512-z0sXWY9DbHwKmn2ubIPFm3aXC7cEEEEfePk7c/2zYknh6btB+WHHoYx46DeElLwm3sbqNSeAhFL1NQNAtl0t0g==","signatures":[{"sig":"MEUCIQDR+9M/fRV7QaKCRB9cTtj7ysFHlPKJ5rvZVvj5VqCQxAIgKoWh2WOUy4e8lSl2bq6C9nARLsyVHTE2Fbwhuxyurpc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1281918},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"690a5c51f7d533e7d43dd53651a444ac34f69942","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"i0r3k","email":"13998677226@163.com"},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7","fast-xml-parser":">=5.3.8"},"_npmVersion":"11.8.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.13.1","dependencies":{"openclaw":"2026.2.26","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.11.0","lint-staged":"16.3.1","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.2_1772419634069_0.4283285602575111","host":"s3://npm-registry-packages-npm-production"}},"2026.3.5":{"name":"@flomesh/ztm-chat","version":"2026.3.5","_id":"@flomesh/ztm-chat@2026.3.5","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"2dc892661fd1c26ea3aa5f5687a941105351c442","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.5.tgz","fileCount":5,"integrity":"sha512-Q/0GO8LZSDIv68OFemOKmAT6DllEv8vpiT9fnYG9qfqrjnXzTUXk3Uuzptl+OgJZJOHFKhjxIf/eQQnv1XclnQ==","signatures":[{"sig":"MEUCIAM+zPNbRbG5SgoA3GP5uvaW1JoFw0HhBuJ1XcojA4bBAiEA24RS2JcT4wyC5gIbB3b6IcF6IK5ESQ398RNEEhFnz08=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1269018},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"e0a87388a032f546d9a5eb48beea9ee7c6e4525b","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.7","fast-xml-parser":">=5.3.8"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"openclaw":"2026.3.2","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.11.0","lint-staged":"16.3.2","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.5_1772677481328_0.14554738160345426","host":"s3://npm-registry-packages-npm-production"}},"2026.3.6":{"name":"@flomesh/ztm-chat","version":"2026.3.6","_id":"@flomesh/ztm-chat@2026.3.6","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"4bfec0e3e6f9d88e51e538ef196231af42d46ab4","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.6.tgz","fileCount":5,"integrity":"sha512-K/lXg0bcxm441dHavrP2yyem+3tRPDECrk6OPwjyDo50jIDCisa4b1ixN2K7Rqz+T1YzOt2F7zN13CibkN+pQA==","signatures":[{"sig":"MEYCIQDH4XWW1IeQIlWvkuoBRbP4gVWSrMkd/00rVoAGSfqk4QIhAJ7HNbEN+eiyowu7D8XBxvGsYhsMJaAOaYNoR1ng4cMY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1279847},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"a8ae92d003872581a0c70c2acebf8ff68d626039","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"openclaw":"2026.3.2","@sinclair/typebox":"0.34.48"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.11.0","lint-staged":"16.3.2","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.6_1772764002140_0.1063972457012019","host":"s3://npm-registry-packages-npm-production"}},"2026.3.7":{"name":"@flomesh/ztm-chat","version":"2026.3.7","_id":"@flomesh/ztm-chat@2026.3.7","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"1ffca567b7f3e53a966ad3ded1de837517bb89ed","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.7.tgz","fileCount":5,"integrity":"sha512-G6Aew1AjUTSYDeBhkkcsH1z00E8sIo9tW6SUe2+PoPhWPn52ThbOiRjWH7QkXSRpjnBEDN9OrtRdJUAx3b71Kg==","signatures":[{"sig":"MEQCIGTeJfRr/+XlcsyOPp9v1kVeQzRhB1miQbDuI2qCAE0wAiB7oHO212rh8iRazhabW35xd617l2/Z7WJ/N7wIEcZuKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1178514},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"6483b28367855e057e040bd672f2ab5abcf26ed5","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"3.24.1","openclaw":"2026.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.2","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.11.2","lint-staged":"16.3.2","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.56.1","@typescript-eslint/eslint-plugin":"8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.7_1772893942881_0.19198968008297834","host":"s3://npm-registry-packages-npm-production"}},"2026.3.10":{"name":"@flomesh/ztm-chat","version":"2026.3.10","_id":"@flomesh/ztm-chat@2026.3.10","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"46486883943c22ee688836e4d2e2943b237d2cc6","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.10.tgz","fileCount":5,"integrity":"sha512-+JnKNZp5Rf6QuYeN9tTAVjE4rI5QLGExwK6i9+rGfaf+qiNovaW5mBPItsRc2MlzHQKu2OriL/Zjn86q2EfqiA==","signatures":[{"sig":"MEYCIQDbTXPK9dpYmiP/hAMn/4pZgtfur4xAF0dCu/rVFnm2AQIhAPDzDZB81ba1ziAMMQhYYH2Hal9QG+XNC43tJBuj6j0m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2320324},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"f5075d5e9b55cb10c0bff2bb3e435438c4af43e4","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.3","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.3.2","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.57.0","@typescript-eslint/eslint-plugin":"8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.10_1773130620038_0.8181496286761638","host":"s3://npm-registry-packages-npm-production"}},"2026.3.11":{"name":"@flomesh/ztm-chat","version":"2026.3.11","_id":"@flomesh/ztm-chat@2026.3.11","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"78c41890b3ea9d1af6a737fd4a3bd0a8b1a47340","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.11.tgz","fileCount":5,"integrity":"sha512-4RAdOtAwoTtiTWpvBmdZ8SavoobR2LW755uDuj47foMA2tbw8hPq0mLXOqXm/K93Fsl1AkYMF+1ubXBLplVo4g==","signatures":[{"sig":"MEUCIQCEleWeIoM92tal4D/SLkDMHSI+GtmtKWGp1O3ByZsKwwIgeOcD74pHNnKcr/bngCaPt3I5EunlLq/TgFHc3QtbEzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2333840},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"6e2399f442bbe164bc1084dd3463270e28342de3","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.3","vitest":"4.0.18","esbuild":"0.27.3","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.3.3","@vitest/coverage-v8":"4.0.18","@typescript-eslint/parser":"8.57.0","@typescript-eslint/eslint-plugin":"8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.11_1773208099046_0.0439725212281179","host":"s3://npm-registry-packages-npm-production"}},"2026.3.13":{"name":"@flomesh/ztm-chat","version":"2026.3.13","_id":"@flomesh/ztm-chat@2026.3.13","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"56050251090b614dd99c76e9f70adab7eebfe85e","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.13.tgz","fileCount":5,"integrity":"sha512-TOw8CcHgmJBTl1K3lhEtBjAf+pwQHc1JqD/6zjudclVbGC6gkMVpESXDjlOCUY5CQ8WysjXxprt2j9NqpZdlfg==","signatures":[{"sig":"MEUCIQCLRQ7CnG4aq74/vZPZe5Tjj3gfx2pEomNTJNMmOMxeXgIgOUjwMBj4TtFjXfPpEzQUuEN9JS/+Cg+7nDhVdSR8ftg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2371879},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"324df125406b3afe228b1360bf3edf73c9be9f90","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.3","vitest":"4.1.0","esbuild":"0.27.4","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.3.3","@vitest/coverage-v8":"4.1.0","@typescript-eslint/parser":"8.57.0","@typescript-eslint/eslint-plugin":"8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.13_1773379473963_0.2258969810144249","host":"s3://npm-registry-packages-npm-production"}},"2026.3.15":{"name":"@flomesh/ztm-chat","version":"2026.3.15","_id":"@flomesh/ztm-chat@2026.3.15","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"8789df45f6c25ea863ce1ad84a70f32bbd7f339e","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.15.tgz","fileCount":5,"integrity":"sha512-qwp+91Gclb8hzYs0U1KDvbw3F+uBN+UwrTJPL+b5WpcO/F8SxBDA9b12k/ihjSvP43B23c3DQcpdl2CD1sIE9Q==","signatures":[{"sig":"MEQCIF80v9xD4UOghgSnaPtbr4UuzRJi571Ijop1V4XE1CKUAiAcPoucGPlNb3iC9tz6N06y8JvMkt/O3rljtC5JV0BhgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2427089},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"442ffe0eaccb79856082017ba4f4f257b01156d7","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","pre:release":"npx tsx scripts/pre-release-check.ts","docs:api:fix":"npx tsx scripts/fix-api-documentation.ts fix","docs:coverage":"npx tsx scripts/measure-doc-coverage.ts","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","docs:api:check":"npx tsx scripts/fix-api-documentation.ts check","prepublishOnly":"npm run build","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","pre:release:quick":"npx tsx scripts/pre-release-check.ts | grep -E '(PASS|FAIL|Summary)'","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","docs:coverage:check":"npx tsx scripts/measure-doc-coverage.ts || exit 1","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","yauzl":">=3.2.1","file-type":">=21.3.2","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.3","vitest":"4.1.0","esbuild":"0.27.4","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.3.4","@vitest/coverage-v8":"4.1.0","@typescript-eslint/parser":"8.57.0","@typescript-eslint/eslint-plugin":"8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.15_1773547629447_0.692468863338966","host":"s3://npm-registry-packages-npm-production"}},"2026.3.16":{"name":"@flomesh/ztm-chat","version":"2026.3.16","_id":"@flomesh/ztm-chat@2026.3.16","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"a240d2bdc8befaf5002a3328f95eb3ffd241d2a5","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.16.tgz","fileCount":6,"integrity":"sha512-lvuinXozo44u2Dv/1YCA2Y7tkxQPDg/AfNDBJtm+mK/qgoZcelvYAHSB9RiKaG/Ha88yvM6dt8RH+urU+h81VA==","signatures":[{"sig":"MEUCIQDOFw1qGpMuaxmyzUEdTOc2Ztz87KV1c+rKGep6HXgXOAIgTSCeTLbDjlVDHNZ/TyPhSyU/a6BWGVrPLzqXxk0qwig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2435142},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"1f6421221101c2e3ef70945682efea7a4c300989","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:check":"typedoc --emit none","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","pre:release":"npx tsx scripts/pre-release-check.ts","docs:api:fix":"npx tsx scripts/fix-api-documentation.ts fix","docs:coverage":"npx tsx scripts/measure-doc-coverage.ts","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","docs:api:check":"npx tsx scripts/fix-api-documentation.ts check","prepublishOnly":"npm run build","version:plugin":"npx tsx scripts/update-plugin-version.ts","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","pre:release:quick":"npx tsx scripts/pre-release-check.ts | grep -E '(PASS|FAIL|Summary)'","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","docs:coverage:check":"npx tsx scripts/measure-doc-coverage.ts || exit 1","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","yauzl":">=3.2.1","file-type":">=21.3.2","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.0.3","vitest":"4.1.0","esbuild":"0.27.4","typedoc":"0.28.17","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.3.4","@vitest/coverage-v8":"4.1.0","@typescript-eslint/parser":"8.57.0","@typescript-eslint/eslint-plugin":"8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.16_1773593373450_0.5702102149361443","host":"s3://npm-registry-packages-npm-production"}},"2026.3.25":{"name":"@flomesh/ztm-chat","version":"2026.3.25","_id":"@flomesh/ztm-chat@2026.3.25","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"dist":{"shasum":"48be382b3dcd4e8ab99f91e89afbe8cfadd5e7a1","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.25.tgz","fileCount":6,"integrity":"sha512-SbdogzrK/4Nf0V3P6yxlgBNJCr6V5RpO7t9Es498zI0y5CKqLQ5LWBbotVJGG3eA7xyJecwMi7TYU8nGMNjOfg==","signatures":[{"sig":"MEYCIQCqbdmNN1sTwgyCBvQkAiqDO6YPfjP1180ynbhV5DtIoAIhAJoKvHpyZLdSVvPSHHgJ47MlDkvS/UC/ZmBVMYFJHSOj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2410235},"main":"./dist/index.js","type":"module","exports":{".":{"import":"./dist/index.js"}},"gitHead":"2d38cc6ebc6da8fe840f684e30f5f4fc56d1b2a5","scripts":{"docs":"typedoc","lint":"eslint src index.ts index.test.ts --ext .ts","test":"vitest run","build":"node esbuild.config.js","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","prepare":"husky","test:e2e":"vitest run --config vitest.config.e2e.ts","changelog":"git-cliff --output CHANGELOG.md","test:unit":"vitest run --config vitest.config.unit.ts","typecheck":"tsc --noEmit","docs:check":"typedoc --emit none","docs:watch":"typedoc --watch","test:watch":"vitest","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","build:watch":"node esbuild.config.js --watch","pre:release":"npx tsx scripts/pre-release-check.ts","docs:api:fix":"npx tsx scripts/fix-api-documentation.ts fix","docs:coverage":"npx tsx scripts/measure-doc-coverage.ts","test:coverage":"vitest run --coverage","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","docs:api:check":"npx tsx scripts/fix-api-documentation.ts check","prepublishOnly":"npm run build","version:plugin":"npx tsx scripts/update-plugin-version.ts","test:integration":"vitest run --config vitest.config.integration.ts","changelog:preview":"git-cliff --unreleased","pre:release:quick":"npx tsx scripts/pre-release-check.ts | grep -E '(PASS|FAIL|Summary)'","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","docs:coverage:check":"npx tsx scripts/measure-doc-coverage.ts || exit 1","changelog:unreleased":"git-cliff --unreleased","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"openclaw":{"channel":{"id":"ztm-chat","blurb":"Decentralized P2P messaging via ZTM network","label":"ZTM Chat","order":40,"aliases":["ztm"],"selectionLabel":"ZTM Chat","quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"},"extensions":["./index.ts"]},"overrides":{"tar":">=7.5.10","yauzl":">=3.2.1","file-type":">=21.3.2","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10"},"repository":{"url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git","type":"git"},"_npmVersion":"11.9.0","description":"ZTM Chat channel plugin for OpenClaw","directories":{},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","openclaw":"2026.3.23-2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"9.1.7","madge":"8.0.0","eslint":"10.1.0","vitest":"4.1.1","esbuild":"0.27.4","typedoc":"0.28.18","prettier":"3.8.1","typescript":"5.9.3","@types/node":"24.12.0","lint-staged":"16.4.0","@vitest/coverage-v8":"4.1.1","@typescript-eslint/parser":"8.57.1","@typescript-eslint/eslint-plugin":"8.57.1"},"_npmOperationalInternal":{"tmp":"tmp/ztm-chat_2026.3.25_1774408643649_0.7419456648201037","host":"s3://npm-registry-packages-npm-production"}},"2026.3.26":{"name":"@flomesh/ztm-chat","version":"2026.3.26","description":"ZTM Chat channel plugin for OpenClaw","type":"module","main":"./dist/index.js","exports":{".":{"import":"./dist/index.js"}},"overrides":{"tar":">=7.5.10","fast-xml-parser":">=5.3.8","@hono/node-server":">=1.19.10","file-type":">=21.3.2","yauzl":">=3.2.1"},"scripts":{"build":"node esbuild.config.js","build:watch":"node esbuild.config.js --watch","build:types":"tsc --emitDeclarationOnly --declaration --declarationDir dist --removeComments","test":"vitest run","test:unit":"vitest run --config vitest.config.unit.ts","test:integration":"vitest run --config vitest.config.integration.ts","test:e2e":"vitest run --config vitest.config.e2e.ts","test:watch":"vitest","test:coverage":"vitest run --coverage","test:coverage:unit":"vitest run --coverage --config vitest.config.unit.ts","test:coverage:integration":"vitest run --coverage --config vitest.config.integration.ts","typecheck":"tsc --noEmit","lint":"eslint src index.ts index.test.ts --ext .ts","format":"prettier --write \"src/**/*.ts\" \"index.ts\" \"index.test.ts\"","check:circular":"madge src/ index.ts index.test.ts --circular --extensions ts","prepublishOnly":"npm run build","changelog":"git-cliff --output CHANGELOG.md","changelog:unreleased":"git-cliff --unreleased","changelog:preview":"git-cliff --unreleased","prepare":"husky","docs":"typedoc","docs:check":"typedoc --emit none","docs:watch":"typedoc --watch","docs:coverage":"npx tsx scripts/measure-doc-coverage.ts","docs:coverage:check":"npx tsx scripts/measure-doc-coverage.ts || exit 1","docs:api:check":"npx tsx scripts/fix-api-documentation.ts check","docs:api:fix":"npx tsx scripts/fix-api-documentation.ts fix","pre:release":"npx tsx scripts/pre-release-check.ts","pre:release:quick":"npx tsx scripts/pre-release-check.ts | grep -E '(PASS|FAIL|Summary)'","version:plugin":"npx tsx scripts/update-plugin-version.ts"},"dependencies":{"openclaw":"2026.3.23-2","zod":"4.3.6"},"devDependencies":{"@types/node":"24.12.0","@typescript-eslint/eslint-plugin":"8.57.1","@typescript-eslint/parser":"8.57.1","@vitest/coverage-v8":"4.1.1","esbuild":"0.27.4","eslint":"10.1.0","husky":"9.1.7","lint-staged":"16.4.0","madge":"8.0.0","prettier":"3.8.1","typedoc":"0.28.18","typescript":"5.9.3","vitest":"4.1.1"},"openclaw":{"extensions":["./index.ts"],"channel":{"id":"ztm-chat","label":"ZTM Chat","selectionLabel":"ZTM Chat","blurb":"Decentralized P2P messaging via ZTM network","aliases":["ztm"],"order":40,"quickstartAllowFrom":true},"install":{"npmSpec":"@flomesh/ztm-chat","localPath":"extensions/ztm-chat","defaultChoice":"npm"}},"repository":{"type":"git","url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git"},"publishConfig":{"access":"public"},"lint-staged":{"*.ts":["prettier --write","eslint --fix"]},"gitHead":"546e65abff68bcc4f30c01a443c908c3d88b1bf0","_id":"@flomesh/ztm-chat@2026.3.26","bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-SiLlwGECPPgzPiQrA6hgrJrzqFZsMCJYnAslJXodAMWn/yGkIu8m4GYjlV/QaLxhkRvutwmkwQm9Y4jfvScu1Q==","shasum":"e60c052abf16695dcb142047f9b8ac47546e2fca","tarball":"https://registry.npmjs.org/@flomesh/ztm-chat/-/ztm-chat-2026.3.26.tgz","fileCount":6,"unpackedSize":2410235,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@flomesh%2fztm-chat@2026.3.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFj2SJ1tlq9Tf+ibISRjQIL9HkMLo1C5NujkhZvvF/EwAiAIlv94sT/Ra9M67/0wMyG+uBEAAHuuIWEZTOgDPzuxPQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0d223e09-4617-484f-87a4-f556b0cdb95b"}},"directories":{},"maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ztm-chat_2026.3.26_1774409573117_0.5485454590674428"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-17T12:11:30.404Z","modified":"2026-03-25T03:32:53.640Z","2026.2.15":"2026-02-17T12:11:30.727Z","2026.2.17":"2026-02-17T12:31:40.063Z","2026.2.18":"2026-02-17T12:51:39.026Z","2026.2.19":"2026-02-17T16:49:18.098Z","2026.2.20":"2026-02-17T17:13:52.252Z","2026.2.18-alpha.1":"2026-02-18T05:49:36.480Z","2026.2.18-alpha.3":"2026-02-18T06:19:32.117Z","2026.2.18-beta.1":"2026-02-18T06:37:05.934Z","2026.2.18-rc.1":"2026-02-18T11:07:20.102Z","2026.2.18-rc.2":"2026-02-18T12:19:31.279Z","2026.2.18-rc.3":"2026-02-18T12:47:43.057Z","2026.2.20-rc.1":"2026-02-19T16:33:38.203Z","2026.2.20-rc.3":"2026-02-19T17:13:42.391Z","2026.2.23":"2026-02-23T10:12:13.356Z","2026.2.25":"2026-02-25T09:20:21.539Z","2026.2.26":"2026-02-26T13:01:28.050Z","2026.2.27":"2026-02-27T04:10:16.695Z","2026.2.28":"2026-02-28T05:39:37.900Z","2026.3.2":"2026-03-02T02:47:14.283Z","2026.3.5":"2026-03-05T02:24:41.558Z","2026.3.6":"2026-03-06T02:26:42.378Z","2026.3.7":"2026-03-07T14:32:23.097Z","2026.3.10":"2026-03-10T08:17:00.213Z","2026.3.11":"2026-03-11T05:48:19.280Z","2026.3.13":"2026-03-13T05:24:34.142Z","2026.3.15":"2026-03-15T04:07:09.651Z","2026.3.16":"2026-03-15T16:49:33.636Z","2026.3.25":"2026-03-25T03:17:23.808Z","2026.3.26":"2026-03-25T03:32:53.324Z"},"bugs":{"url":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/issues"},"homepage":"https://github.com/clawparty-ai/openclaw-channel-plugin-ztm#readme","repository":{"type":"git","url":"git+https://github.com/clawparty-ai/openclaw-channel-plugin-ztm.git"},"description":"ZTM Chat channel plugin for OpenClaw","maintainers":[{"name":"i0r3k","email":"13998677226@163.com"}],"readme":"# ZTM Chat Channel Plugin for OpenClaw\n\n[![OpenClaw Plugin](https://img.shields.io/badge/OpenClaw-Plugin-orange?logo=github)](https://openclaw.ai)\n[![ZTM](https://img.shields.io/badge/ZTM-Extension-purple?logo=github)](https://github.com/flomesh-io/ztm)\n[![npm version](https://img.shields.io/npm/v/@flomesh/ztm-chat.svg?color=cb3837&logo=npm)](https://npmjs.com/package/@flomesh/ztm-chat)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/clawparty-ai/openclaw-channel-plugin-ztm/test.yml?logo=githubactions)](https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/actions)\n[![Test Coverage](https://img.shields.io/codecov/c/github/clawparty-ai/openclaw-channel-plugin-ztm?logo=codecov)](https://codecov.io/gh/clawparty-ai/openclaw-channel-plugin-ztm)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178c6?logo=typescript&color=yellow)](https://www.typescriptlang.org/)\n[![Vitest](https://img.shields.io/badge/Vitest-v4.0+-6E9F18?logo=vitest&logoColor=white)](https://vitest.dev)\n[![Release Version](https://img.shields.io/github/v/release/clawparty-ai/openclaw-channel-plugin-ztm?sort=date)](https://github.com/clawparty-ai/openclaw-channel-plugin-ztm/releases/latest)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n\nThis plugin integrates OpenClaw with ZTM (Zero Trust Mesh) Chat, enabling decentralized P2P messaging through the ZTM network.\n\n## Architecture\n\n```mermaid\nflowchart TB\n    subgraph ZTM[\"ZTM Network\"]\n        User[\"ZTM User\"]\n        Agent[\"ZTM Agent\"]\n    end\n\n    subgraph OpenClaw[\"OpenClaw Gateway\"]\n        Plugin[\"ztm-chat Plugin\"]\n        Dispatcher[\"Message Dispatcher\"]\n        AgentLLM[\"AI Agent\"]\n    end\n\n    subgraph Storage[\"Local Storage\"]\n        State[\"Message State\"]\n        Pairing[\"Pairing Store\"]\n    end\n\n    User -->|\"DM/Group Message\"| Agent\n    Agent -->|\"Chat App API\"| Plugin\n    Plugin -->|\"Route\"| Dispatcher\n    Dispatcher -->|\"Check Policy\"| AgentLLM\n    AgentLLM -->|\"Response\"| Plugin\n    Plugin -->|\"Chat App API\"| Agent\n    Agent -->|\"Deliver\"| User\n\n    Plugin --> State\n    Plugin --> Pairing\n```\n\n**Data Flow:**\n1. User sends message to ZTM Agent\n2. Plugin polls Chat App API for new messages\n3. Dispatcher checks DM/Group policy\n4. If allowed, route to AI Agent\n5. AI Agent generates response\n6. Plugin sends response via Chat App API\n7. ZTM Agent delivers to user\n\n## Features\n\n- **Peer-to-Peer Messaging**: Send and receive messages with other ZTM users\n- **Remote Connection**: Connect to ZTM Agent from anywhere via HTTP API\n- **Secure**: Supports mTLS authentication with ZTM certificates\n- **Decentralized**: Messages flow through the ZTM P2P network\n- **Multi-Account**: Support for multiple ZTM bot accounts with isolated state\n- **User Discovery**: Browse and discover other users in your ZTM mesh\n- **Real-Time Updates**: Watch mechanism for message monitoring (1-second polling interval)\n- **Message Deduplication**: Prevents duplicate message processing\n- **Structured Logging**: Context-aware logger with sensitive data filtering\n- **Interactive Wizard**: CLI-guided configuration setup\n- **Group Chat Support**: Multi-user group conversations with permission control\n- **Fine-Grained Access Control**: Per-group policies, mention gating, and tool restrictions\n\n## Installation\n\n### 1. Install ZTM CLI\n\nDownload ZTM from GitHub releases and install to `/usr/local/bin`:\n\n```bash\n# Download (example: v2.0.0 for Linux x86_64)\ncurl -L \"https://github.com/flomesh-io/ztm/releases/download/v2.0.0/ztm-aio-v2.0.0-generic_linux-x86_64.tar.gz\" -o /tmp/ztm.tar.gz\n\n# Extract\ntar -xzf /tmp/ztm.tar.gz -C /tmp\n\n# Install to /usr/local/bin (requires sudo)\nsudo mv /tmp/bin/ztm /usr/local/bin/ztm\n\n# Cleanup\nrm /tmp/ztm.tar.gz\n\n# Verify\nztm version\n```\n\n### 2. Start ZTM Agent\n\n```bash\nztm start agent\n```\n\nThe agent will start listening on `http://localhost:7777` by default.\n\n### 3. Install Plugin\n\n#### Option A: Install from npm (recommended for users)\n\n```bash\nopenclaw plugins install @flomesh/ztm-chat\n```\n\n#### Option B: Local development installation\n\n```bash\n# Install dependencies first\nnpm install\n\n# Install from local path\nopenclaw plugins install -l .\n\n# Or link for development\nnpm link\nopenclaw plugins install -l .\n```\n\nAfter installation, the plugin will be available as `ztm-chat` (or `ztm` as alias).\n\n### 4. Run Configuration Wizard\n\n```bash\nopenclaw onboard\n```\n\nSelect **\"ZTM Chat (P2P)\"** from the channel list.\n\nThe wizard will guide you through:\n1. **ZTM Agent URL** (default: `http://localhost:7777`)\n2. **Permit Source Selection**\n   - Permit Source: `server` (from permit server) or `file` (from local file)\n   - Permit Server URL (when server): `https://clawparty.flomesh.io:7779/permit`\n   - Permit File Path (when file): path to local permit.json\n3. **Bot Username** (default: `openclaw-bot`)\n4. **Security Settings**\n   - DM Policy: `pairing` (recommended), `allow`, or `deny`\n   - Allow From: Whitelist of usernames (or `*` for all)\n5. **Group Chat Settings** (if enabled)\n   - Enable Groups: Yes/No\n   - Group Policy: `allowlist`, `open`, or `disabled`\n   - Require Mention: Yes/No (default: Yes)\n6. **Summary & Save**\n\n### 5. Restart OpenClaw\n\n```bash\nopenclaw gateway restart\n```\n\n## Group Chat\n\n### Overview\n\nZTM Chat supports group conversations with fine-grained permission control. When `enableGroups` is enabled, the bot can:\n\n- Receive and process messages from group chats\n- Reply to group messages with @mention support\n- Apply per-group access policies\n- Restrict available tools based on group membership\n\n### How It Works\n\n```mermaid\nflowchart TB\n    subgraph Remote[\"Remote User Environment\"]\n        User1[\"Member 1\"]\n        User2[\"Member 2\"]\n        User3[\"Member 3\"]\n        RemotePlugin[\"ZTM Chat Plugin<br/>(HTTP API Client)\"]\n        RemoteAgent[\"ZTM Agent<br/>(Remote)\"]\n        RemoteFiles[\"Message Files<br/>(Remote)\"]\n    end\n\n    subgraph P2P[\"ZTM P2P Network\"]\n        Hub[\"Mesh Hub<br/>(Coordinates Sync)\"]\n    end\n\n    subgraph Local[\"Local Bot Environment\"]\n        LocalAgent[\"ZTM Agent<br/>(Local)\"]\n        LocalFiles[\"Message Files<br/>(Local)\"]\n        LocalPlugin[\"ZTM Chat Plugin<br/>(HTTP API Client)\"]\n\n        subgraph PluginFlow[\"Bot Message Processing\"]\n            Watch[\"Watch Loop<br/>(1s interval)\"]\n            Classify[\"Classify Changes<br/>(peer/group)\"]\n            Fetch[\"Fetch Messages<br/>(HTTP API)\"]\n            Policy[\"Policy Check\"]\n            Dispatch[\"Dispatch Callbacks\"]\n            AI[\"AI Agent\"]\n            Send[\"Send Response<br/>(HTTP API)\"]\n        end\n    end\n\n    User1 -->|\"@mention\"| RemotePlugin\n    User2 -->|\"@mention\"| RemotePlugin\n    User3 -->|\"@mention\"| RemotePlugin\n\n    RemotePlugin -->|\"HTTP Request\"| RemoteAgent\n    RemoteAgent -->|\"HTTP Response\"| RemotePlugin\n    RemoteAgent -->|\"Read/Write\"| RemoteFiles\n\n    RemoteFiles -->|\"P2P Sync\"| Hub\n    Hub -->|\"P2P Sync\"| LocalFiles\n    LocalAgent -->|\"Read/Write\"| LocalFiles\n\n    LocalPlugin -->|\"HTTP Request\"| LocalAgent\n    LocalAgent -->|\"HTTP Response\"| LocalPlugin\n\n    LocalPlugin -->|\"1. watchChanges\"| Watch\n    Watch -->|\"2. Changed Items\"| Classify\n    Classify -->|\"3. Peer/Group\"| Fetch\n    Fetch -->|\"4. getMessages\"| LocalPlugin\n    LocalPlugin -->|\"Messages\"| Fetch\n\n    Fetch -->|\"5. Messages\"| Policy\n    Policy -->|\"Allow\"| Dispatch\n    Policy -->|\"Deny\"| Ignore[Ignore Message]\n\n    Dispatch -->|\"6. Notify Callbacks\"| AI\n    AI -->|\"7. Response\"| Send\n    Send -->|\"8. sendGroupMessage\"| LocalPlugin\n\n    LocalPlugin -->|\"9. HTTP POST\"| LocalAgent\n    LocalAgent -->|\"Write to Files\"| LocalFiles\n    LocalFiles -->|\"P2P Sync\"| Hub\n    Hub -->|\"P2P Sync\"| RemoteFiles\n    RemoteAgent -->|\"Write to Files\"| RemoteFiles\n\n    RemotePlugin -->|\"Display\"| User1\n    RemotePlugin -->|\"Display\"| User2\n    RemotePlugin -->|\"Display\"| User3\n```\n\n### Mention Gating\n\nWhen `requireMention` is enabled (default), the bot will only process messages that @mention the bot username:\n\n```\n# Bot username: my-bot\n\n# These messages will be processed:\n@my-bot can you help me?\nHey @my-bot what's up?\n\n# These messages will be ignored:\nhello everyone!\ngood morning\n```\n\n**Note:** `requireMention` applies to ALL users, including the group creator. This ensures even the group owner must explicitly mention the bot to trigger a response.\n\n### Per-Group Configuration\n\nYou can configure different policies for different groups:\n\n```yaml\nchannels:\n  ztm-chat:\n    accounts:\n      my-bot:\n        enableGroups: true\n        groupPolicy: allowlist  # Default for unknown groups\n        requireMention: true   # Global default (can be overridden per group)\n        groupPermissions:\n          alice/team:\n            groupPolicy: open\n            requireMention: false\n          bob/project-x:\n            groupPolicy: allowlist\n            requireMention: true\n            allowFrom: [bob, charlie, david]\n          private/secret-group:\n            groupPolicy: disabled\n```\n\n### Tool Restrictions\n\nControl which tools are available in each group:\n\n```yaml\nchannels:\n  ztm-chat:\n    accounts:\n      my-bot:\n        groupPermissions:\n          alice/team:\n            groupPolicy: open\n            requireMention: false\n            tools:\n              allow:\n                - group:messaging\n                - group:sessions\n                - group:runtime\n            toolsBySender:\n              admin:\n                alsoAllow:\n                  - exec\n                  - fs\n```\n\n#### Tool Policy Options\n\n| Option | Description |\n|--------|-------------|\n| `tools.allow` | Only allow these tools (deny all others) |\n| `tools.deny` | Deny these tools (allow all others) |\n| `toolsBySender.{user}.alsoAllow` | Additional tools for specific users |\n| `toolsBySender.{user}.deny` | Deny tools for specific users |\n\n#### Default Tools\n\nBy default, groups only have access to:\n- `group:messaging` - Send/receive messages\n- `group:sessions` - Session management\n\n### Creator Privileges\n\nGroup creators have special privileges that allow them to bypass certain policy checks:\n\n| Check | Creator Bypass? |\n|-------|---------------|\n| `groupPolicy` (disabled/allowlist/open) | ✅ Yes |\n| `allowFrom` whitelist | ✅ Yes |\n| `requireMention` | ❌ No (still required) |\n\nThis ensures the bot owner can always interact with their own groups while still requiring explicit @mentions to trigger responses.\n\n## Usage\n\n### Sending a Message\n\nFrom any ZTM user, send a message to your bot:\n\n```\nHello! Can you help me with something?\n```\n\nThe bot will respond through OpenClaw's AI agent.\n\n### Pairing Mode\n\nBy default, the bot uses **pairing mode** (`dmPolicy: \"pairing\"`):\n\n1. **New users** must be approved before they can send messages\n2. When an unapproved user sends a message, the bot sends them a pairing code\n3. Approve users using the CLI with their pairing code\n\n#### List Pending Requests\n\n```bash\nopenclaw pairing list ztm-chat\n```\n\n#### Approve a Pairing Request\n\n```bash\nopenclaw pairing approve ztm-chat <code>\n```\n\n#### Pairing Mode Policies\n\n| Policy | Behavior |\n|--------|----------|\n| `allow` | Accept messages from all users (no approval needed) |\n| `deny` | Reject messages from all users (except allowFrom list) |\n| `pairing` | Require explicit approval for new users (recommended) |\n\n## CLI Commands\n\n### Onboarding Commands\n\n```bash\n# Interactive setup wizard (recommended)\nopenclaw onboard\n\n# Select \"ZTM Chat\" from the channel list\n# Follow the 6-step configuration wizard\n\n# Manage existing configuration\nopenclaw onboard\n# Select \"ZTM Chat\" -> \"Manage\" -> Choose option:\n#   - Test Connection: Verify ZTM Agent connectivity\n#   - Update Configuration: Re-run the wizard\n#   - Remove: Display removal instructions\n```\n\n### Channel Commands\n\n```bash\n# Check channel status\nopenclaw channels status ztm-chat\n\n# View configuration\nopenclaw channels describe ztm-chat\n\n# Probe connection\nopenclaw channels status ztm-chat --probe\n\n# Enable/disable channel\nopenclaw channels disable ztm-chat\nopenclaw channels enable ztm-chat\n\n# List connected peers\nopenclaw channels directory ztm-chat peers\n\n# List groups (if enabled)\nopenclaw channels directory ztm-chat groups\n```\n\n### Pairing Commands\n\n```bash\n# List pending pairing requests\nopenclaw pairing list ztm-chat\n\n# Approve a pairing request\nopenclaw pairing approve ztm-chat <code>\n```\n\n## Configuration\n\n### Configuration File\n\nConfiguration is stored in `openclaw.yaml` under `channels.ztm-chat`:\n\n#### Mode 1: Server (from permit server)\n\n```yaml\nchannels:\n  ztm-chat:\n    enabled: true\n    accounts:\n      my-bot:\n        agentUrl: \"http://localhost:7777\"\n        permitSource: \"server\"\n        permitUrl: \"https://clawparty.flomesh.io:7779/permit\"\n        meshName: \"production-mesh\"\n        username: \"my-bot\"\n        enableGroups: true\n        dmPolicy: \"pairing\"\n        allowFrom:\n          - alice\n          - trusted-team\n        groupPolicy: \"allowlist\"\n        requireMention: true\n        groupPermissions:\n          alice/team:\n            creator: \"alice\"\n            group: \"team\"\n            groupPolicy: \"open\"\n            requireMention: false\n            allowFrom: []\n            tools:\n```\n\n#### Mode 2: File (from local permit.json)\n\n```yaml\nchannels:\n  ztm-chat:\n    enabled: true\n    accounts:\n      my-bot:\n        agentUrl: \"http://localhost:7777\"\n        permitSource: \"file\"\n        permitFilePath: \"/path/to/permit.json\"\n        meshName: \"production-mesh\"\n        username: \"my-bot\"\n        enableGroups: true\n        dmPolicy: \"pairing\"\n        allowFrom:\n          - alice\n          - trusted-team\n        groupPolicy: \"allowlist\"\n        requireMention: true\n        groupPermissions:\n          alice/team:\n            creator: \"alice\"\n            group: \"team\"\n            groupPolicy: \"open\"\n            requireMention: false\n            allowFrom: []\n            tools:\n              allow:\n                - group:messaging\n                - group:sessions\n                - group:runtime\n            toolsBySender:\n              admin:\n                alsoAllow:\n                  - exec\n```\n\n### Configuration Options\n\n**Required:**\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `agentUrl` | string | ZTM Agent API URL |\n| `permitSource` | string | Permit source: `\"server\"` (from permit server) or `\"file\"` (from local file) |\n| `meshName` | string | Name of your ZTM mesh |\n| `username` | string | Bot's ZTM username |\n\n**Required (when permitSource is \"server\"):**\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `permitUrl` | string | Permit Server URL |\n\n**Optional (when permitSource is \"file\"):**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `permitFilePath` | string | - | Path to local permit.json file |\n\n**Optional - Basic:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enabled` | boolean | `true` | Enable/disable account |\n| `enableGroups` | boolean | `false` | Enable group chat support |\n| `dmPolicy` | string | `\"pairing\"` | DM policy: `allow`, `deny`, `pairing` |\n| `allowFrom` | string[] | `[]` | List of approved usernames |\n| `apiTimeout` | number | `30000` | API timeout in milliseconds (1000-300000) |\n\n**Optional - Group:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `groupPolicy` | string | `\"allowlist\"` | Default group policy: `open`, `allowlist`, `disabled` |\n| `requireMention` | boolean | `true` | Require @mention for group messages (global default) |\n| `groupPermissions` | object | `{}` | Per-group permission overrides |\n\n### Group Permission Options\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `groupPolicy` | string | Policy for this group: `open`, `allowlist`, `disabled` |\n| `requireMention` | boolean | Require @mention to process message (default: `true`) |\n| `allowFrom` | string[] | Whitelist of allowed senders |\n| `tools.allow` | string[] | Only allow these tools |\n| `tools.deny` | string[] | Deny these tools |\n| `toolsBySender` | object | Sender-specific tool overrides |\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `ZTM_CHAT_LOG_LEVEL` | Logging level: `debug`, `info`, `warn`, `error` |\n\n\n## Message Processing Pipeline (ADR-010 Compliant)\n\nThis plugin follows **ADR-010: Multi-Layer Message Processing Pipeline** for consistent message handling:\n\n### Architecture Layers\n\n| Layer | Module | Responsibility |\n|-------|--------|----------------|\n| **Layer 1** | `watcher.ts` | Chat Processing (orchestration) |\n| **Layer 2** | `processor.ts` | Message Processing (validation, watermark, normalization) |\n| **Layer 3** | `policy-checker.ts` | **Policy Enforcement** (unified DM/Group checking) |\n| **Layer 4** | `message-dispatcher.ts` | Dispatch (callback execution) |\n| **Layer 5** | `dispatcher.ts` | Persistence (watermark updates) |\n\n### Key Design Principle\n\n**Unified Policy Checking (ADR-010 Layer 3):**\n\n- **DM messages**: Check DM policy (pairing/allowlist/deny modes)\n- **Group messages**: Check **ONLY** Group policy (DM policy is **NOT** applied)\n- **Timing**: Policy checks happen **before** watermark updates\n\nThis fixes the critical bug where `dmPolicy:deny` was incorrectly rejecting group messages.\n\n### DM Message Flow\n\n```\n1. Message arrives from ZTM\n2. processPeerMessage() validates self-message check\n3. checkMessagePolicy() applies DM policy (Layer 3)\n4. processIncomingMessage() normalizes (Layer 2, skipPolicyCheck=true)\n5. notifyMessageCallbacks() updates watermark (Layer 5)\n6. handleInboundMessage() dispatches to AI agent (Layer 4)\n```\n\n### Group Message Flow\n\n```\n1. Message arrives from ZTM\n2. processGroupMessage() validates self-message check\n3. checkMessagePolicy() applies Group policy (Layer 3) - NOT DM policy\n4. processIncomingMessage() normalizes (Layer 2, skipPolicyCheck=true)\n5. notifyMessageCallbacks() updates watermark (Layer 5)\n6. handleInboundMessage() dispatches to AI agent (Layer 4)\n```\n\n\n## Message Flow\n\n### Direct Message (DM)\n\n```mermaid\nsequenceDiagram\n    participant U as ZTM User\n    participant A as ZTM Agent\n    participant P as Plugin\n    participant B as AI Agent\n\n    U->>A: 1. Send DM to bot\n    A->>A: 2. Store message\n    P->>A: 3. Poll /api/meshes/{mesh}/apps/ztm/chat/api/peers/{bot}/messages\n    A->>P: 4. Return new messages\n    P->>P: 5. Check DM policy (allow/deny/pairing)\n    alt Policy allows\n        P->>B: 6. Route to AI agent\n        B->>P: 7. Generate response\n        P->>A: 8. Send via Chat App API\n        A->>U: 9. Deliver to recipient\n    else Policy denied\n        P->>P: 6. Ignore message\n    end\n```\n\n### Group Message\n\n```mermaid\nsequenceDiagram\n    participant M as ZTM Member\n    participant A as ZTM Agent\n    participant P as Plugin\n    participant B as AI Agent\n\n    M->>A: 1. Send @mention to group\n    A->>A: 2. Store message\n    P->>A: 3. Poll Chat App API for new messages\n    A->>P: 4. Return new messages\n    P->>P: 5. Get group permissions (creator/groupId)\n    P->>P: 6. Check: creator? → allow\n    P->>P: 7. Check: policy (open/allowlist/disabled)\n    P->>P: 8. Check: allowFrom whitelist\n    P->>P: 9. Check: requireMention (@{bot})\n    alt All checks pass\n        P->>B: 10. Route to AI agent (with tools filter)\n        B->>P: 11. Generate response\n        P->>A: 12. Send reply to group\n        A->>M: 13. Deliver to all members\n    else Any check fails\n        P->>P: Log and ignore message\n    end\n```\n\n### Message Processing Pipeline\n\n```mermaid\nflowchart TD\n    A[Incoming Message] --> B{isGroup?}\n\n    B -->|No| C[DM Flow]\n    B -->|Yes| D[Group Flow]\n\n    C --> C1{DM Policy}\n    C1 -->|allow| E[Route to AI]\n    C1 -->|deny| F[Ignore]\n    C1 -->|pairing| G{Paired?}\n    G -->|Yes| E\n    G -->|No| H[Send Pairing Request]\n\n    D --> D1{Get Group Permissions}\n    D1 --> D2{Is Creator?}\n    D2 -->|Yes| E\n    D2 -->|No| D3{Policy}\n    D3 -->|disabled| F\n    D3 -->|allowlist| D4{In allowFrom?}\n    D3 -->|open| D5{requireMention?}\n    D4 -->|Yes| E\n    D4 -->|No| F\n    D5 -->|Yes| D6{Mention?}\n    D5 -->|No| E\n    D6 -->|Yes| E\n    D6 -->|No| F\n\n    E --> E1{Resolve Agent Route}\n    E1 --> E2{Dispatch to Agent}\n    E2 --> E3{Filter Tools}\n\n    E3 --> I[Generate Response]\n    I --> J{Send Response}\n    J -->|DM| J1[sendZTMMessage]\n    J -->|Group| J2[sendGroupMessage]\n\n    F --> K[Log and Ignore]\n    H --> K\n```\n\n> **Note**: This diagram shows the **functional behavior** of policy checks from a user perspective. The internal implementation uses a unified policy checking architecture (ADR-010 Layer 3) where all policy decisions happen before message normalization. See [ADR-010: Multi-Layer Message Processing Pipeline](docs/adr/ADR-010-multi-layer-message-pipeline.md) for implementation details.\n\n### Policy Decision Matrix\n\n**DM Policy Check Order:**\n\n| Step | Condition | Next Step |\n|------|-----------|-----------|\n| 1 | Empty sender | → Deny (ignore) |\n| 2 | Sender in `allowFrom` config | → Allow (whitelisted) |\n| 3 | Sender in pairing store | → Allow (whitelisted) |\n| 4 | Policy = `allow` | → Allow (allowed) |\n| 5 | Policy = `deny` | → Deny (denied) |\n| 6 | Policy = `pairing` | → Send pairing request |\n\n**Group Policy Check Order:**\n\n| Step | Condition | Next Step |\n|------|-----------|-----------|\n| 1 | Empty sender | → Deny (ignore) |\n| 2 | Sender = creator | → Step 6 (bypass policy) |\n| 3 | groupPolicy = `disabled` | → Deny (denied) |\n| 4 | groupPolicy = `allowlist` + not in allowFrom | → Deny (whitelisted) |\n| 5 | groupPolicy = `open` | → Continue |\n| 6 | requireMention = true + no @mention | → Deny (mention_required) |\n| 7 | All checks passed | → Allow (creator/whitelisted/allowed) |\n\n**Result Actions:**\n\n| Action | Description |\n|--------|-------------|\n| `process` | Message allowed, route to AI agent |\n| `ignore` | Message denied, log and discard |\n| `pairing` | Send pairing request to user |\n\n## ZTM API\n\nThe plugin uses the ZTM Agent API for identity/mesh operations and the Chat App API for messaging:\n\n### Agent API (Identity & Mesh)\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | `/api/identity` | Get agent identity (certificate) |\n| GET | `/api/meshes/{meshName}` | Get mesh connection status |\n| POST | `/api/meshes/{meshName}` | Join mesh with permit data |\n\n### Chat App API\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | `/api/meshes/{meshName}/apps/ztm/chat/api/users` | List all users in mesh |\n| GET | `/api/meshes/{meshName}/apps/ztm/chat/api/chats` | Get all chats (DMs and groups) |\n| GET | `/api/meshes/{meshName}/apps/ztm/chat/api/peers/{peer}/messages` | Get peer messages (with since/before) |\n| POST | `/api/meshes/{meshName}/apps/ztm/chat/api/peers/{peer}/messages` | Send message to peer |\n| GET | `/api/meshes/{meshName}/apps/ztm/chat/api/groups/{creator}/{group}/messages` | Get group messages |\n| POST | `/api/meshes/{meshName}/apps/ztm/chat/api/groups/{creator}/{group}/messages` | Send message to group |\n\n### Message API Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `since` | number | Get messages after this timestamp (Unix ms) |\n| `before` | number | Get messages before this timestamp (Unix ms) |\n| `limit` | number | Maximum number of messages to return (default: 50) |\n\n### Example API Calls\n\n```bash\n# Get agent identity (certificate)\ncurl http://localhost:7777/api/identity\n\n# Get mesh status\ncurl http://localhost:7777/api/meshes/openclaw-mesh\n\n# Join mesh (with permit data)\ncurl -X POST http://localhost:7777/api/meshes/openclaw-mesh \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"ca\":\"...\",\"agent\":{\"certificate\":\"...\"},\"bootstraps\":[\"host:port\"]}'\n\n# List users\ncurl http://localhost:7777/api/meshes/openclaw-mesh/apps/ztm/chat/api/users\n\n# Get peer messages (last 10)\ncurl \"http://localhost:7777/api/meshes/openclaw-mesh/apps/ztm/chat/api/peers/alice/messages?limit=10\"\n\n# Send message to peer\ncurl -X POST http://localhost:7777/api/meshes/openclaw-mesh/apps/ztm/chat/api/peers/alice/messages \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\": \"Hello!\"}'\n\n# Get group messages\ncurl \"http://localhost:7777/api/meshes/openclaw-mesh/apps/ztm/chat/api/groups/alice/team/messages\"\n\n# Send message to group\ncurl -X POST http://localhost:7777/api/meshes/openclaw-mesh/apps/ztm/chat/api/groups/alice/team/messages \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\": \"Hello everyone!\"}'\n```\n\n## Troubleshooting\n\n### Connection Failed\n\n1. Verify ZTM Agent is running:\n   ```bash\n   curl http://localhost:7777/api/meshes\n   ```\n\n2. Check mesh name matches:\n   ```bash\n   curl http://localhost:7777/api/meshes\n   ```\n\n3. Check plugin logs:\n   ```bash\n   openclaw logs --level debug --channel ztm-chat\n   ```\n\n### No Messages Received\n\n1. Check bot username is correct in configuration\n2. Verify ZTM Agent is running:\n   ```bash\n   curl http://localhost:7777/api/meshes\n   ```\n3. Check mesh connectivity:\n   ```bash\n   openclaw channels status ztm-chat --probe\n   ```\n\n## Development\n\n### Running Tests\n\n```bash\nnpm install\nnpm test            # Run all tests\nnpm test:watch     # Watch mode\nnpm run test:coverage  # Run tests with coverage\n```\n\n\n### Debug Logging\n\n```bash\nZTM_CHAT_LOG_LEVEL=debug openclaw restart\n```","readmeFilename":"README.md"}