{"_id":"@my-life-buddies/buddy-runtime","_rev":"45-c15a6830171bf50a6e116b304bfddf7e","name":"@my-life-buddies/buddy-runtime","dist-tags":{"latest":"0.24.0","dev":"0.24.0-dev.8"},"versions":{"0.0.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.0.1","_id":"@my-life-buddies/buddy-runtime@0.0.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"ed02ffe49cfe13da6ce8638883a2fee5ffbbf2bb","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.0.1.tgz","fileCount":58,"integrity":"sha512-jz4+HsIDDMM0I1GB81FtbFhw7rIzxXz5CFJ4aV6YC6uxy0/2ZXAo+2MhFZNwyBa0KeSDld7kgilr0m1vF9mNjA==","signatures":[{"sig":"MEUCIE8vPHkti01hgrwxkfYjdtWZ1TvOaBk9w8hGQnbeGzA4AiEA0pstZqbwNnABh4rbAyH2CPe1tCPohS5ZwJMjUYQuTao=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188211},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"5d4213ff1253ac79632149af213b4d7e3ada8cd9","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.0.1_1789040549014_0.11217633900538937","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@my-life-buddies/buddy-runtime","version":"0.0.2","_id":"@my-life-buddies/buddy-runtime@0.0.2","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"7a62860aabe139721d0da56330060389b1ab2de5","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.0.2.tgz","fileCount":58,"integrity":"sha512-1mhhXjiEdqVf6HyuOwxgZGD6b0AOXGUpIFrPAJh4JRe/rWzGbLrklXkRzV/eAwgjgJDOzgPb0cY53ba4gJuSxQ==","signatures":[{"sig":"MEQCIBh3aujjsGSY07EfAkgfCT0TWioVpnoW4bdZoSb2V8w2AiBrEPR0mr/CeBYffoCNA61zqsaGjV/Kv0FKAqf5dv7R2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197387},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"3d77353c74453fe2a3ffdc9bc15c36bbf506788a","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.0.2_1789051987629_0.5248298243146741","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@my-life-buddies/buddy-runtime","version":"0.0.3","_id":"@my-life-buddies/buddy-runtime@0.0.3","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"46cebc5a58139420fa27199228863febe3c7e805","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.0.3.tgz","fileCount":62,"integrity":"sha512-XDU3XAU6geh5u+Sve63jCzMktbdyaMN4pJbLHku4xfaMKT4AhkIpSlOgPv/WM4cU4hhdTWMv80q+I+KxAXkmbw==","signatures":[{"sig":"MEUCIQCrbbDZDHhg88PwKA8mwtNShMQKqJ7rPCtqblGe+JZNPAIgZCkovgKxxNgMeTZA2HKA/Fe0RuPgFOthnKlRfxMP87A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229812},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"1e1e3539725d1f8ae4d86926ca166836ec9980f7","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.0.3_1789095111312_0.5268623135298827","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.1.0","_id":"@my-life-buddies/buddy-runtime@0.1.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"70d5c2644919b888f53ce1e315bd03fe822a341a","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.1.0.tgz","fileCount":78,"integrity":"sha512-7YIWQuXqt/mxiiCpgxrm4Y8WQnY++XV9ehFJavjP8AzZjRN/TSJKU2E+5uD0Zpqu8+sqLqMds9p/PbW9YQyHQQ==","signatures":[{"sig":"MEQCIEgNLub06MkWRwikEsNzxJ3qIzpuBxL4oBqHxexRXr4aAiAgT33hCRMW8TEH1c6SITPnolTNgoL0tYKHtTnk6z6S0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293524},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"c484f2263291b8ff0a9b52dca06a8798a08cf95d","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.1.0_1789114577971_0.007171009782312332","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.2.0","_id":"@my-life-buddies/buddy-runtime@0.2.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"b9ded6e332c125fd1dfb1af5ea5f539a358b354b","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.2.0.tgz","fileCount":82,"integrity":"sha512-ga8Kl3t6QZH8pCMa//E8yBdzNSKsLM5nE99ZSC7qomJKTOjH76TazddRhhaMpzV51uHDJYd02H07ZfRAp59cMw==","signatures":[{"sig":"MEQCIDdyxLZJINe9cfcMyIMrqCM+jX43BwYprgfzY0n1kZfRAiBrryeJZiLdsfA1OddBVKfOIm0udOS/piuT4Qm54lOsBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296534},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"87eef32fbe3a9ca7a3e364233f736b702eadaa8e","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.2.0_1789136888798_0.4527873693989848","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.3.0","_id":"@my-life-buddies/buddy-runtime@0.3.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"1687ff17489ce728a832909cfd8eb267b851884b","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.3.0.tgz","fileCount":82,"integrity":"sha512-EnjLYfSAjnD66e3CUV5v1o+TvmF9uXGYfjQeuFCpoXorRdkiZ0xQ5E8iXMgboJOwoTfcFBe0nnP2wgVcuzXOdA==","signatures":[{"sig":"MEUCIQCbuhdmVWwIlKWecG5Cp6t/FSUXhlBeUPRk1f1gntV8+QIgFp9Pnuzk9Nbx/w552ovYwU8Y3G4qT9IcmCGSuVUIpeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335690},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"ffd916088102679d5183b1c08a935fff7c9dcbae","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.3.0_1789185721540_0.5668070846392794","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.3.1","_id":"@my-life-buddies/buddy-runtime@0.3.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"0a6a99adac14eff78b28c3ea6e4e9558735650a2","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.3.1.tgz","fileCount":82,"integrity":"sha512-Z/oILolpgoHn7adrwUdqj5EtsnPQ+8ZiyzVku/Af/6Ia9Xq6q+mO/3PNP+AD6cImQn4dOKYc6rtXbM3UM9POeg==","signatures":[{"sig":"MEQCIHlrPuRbwJHVHHVJnQ0rgIL9NK24K+3h0G0Bu2U+WosXAiA7pypNU9Gqcp7Ctzhn712o5gBFB/ZcGMDRW9fvQ9vDKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":334416},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"1447aeac452e64bc7bc5e11b38bd8b8ce0ef7aca","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.3.1_1789198315672_0.6539398295482102","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.4.0","_id":"@my-life-buddies/buddy-runtime@0.4.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"0fdf1140a4959e8ac83d2b98b08b838e624b9d90","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.4.0.tgz","fileCount":74,"integrity":"sha512-JZIx+zfWh2dPYCQxFkxkpyo6baSapwAHMSRXu7epvNL/6o4z77rVCc/Q3z5q/bpyq9Pbb1iZhpxOjtxFojqlow==","signatures":[{"sig":"MEYCIQCAz5X5Ve6dkvp4pP1B9H+2f0aiEm2CUC7THJ6toVgfcQIhAImY3Mh9GIA2RtH+7ZH4BqRHjawhw8x1kif+n/TQQEOu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316093},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"8059ce96cf76ac170c4b241b8d94c417ce9e875e","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.4.0_1789207201631_0.7821313792","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.4.1","_id":"@my-life-buddies/buddy-runtime@0.4.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"c43cc763af33140bc0457ec5d0a16a24953d605f","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.4.1.tgz","fileCount":74,"integrity":"sha512-nS1sLsKqJ+gKd/KbAhPONRYF0hR7QAvPHfSRqOjxRekka3qdwqNbBDBBukReIanrbXl0WqDfBWD4hMRY2bG4sw==","signatures":[{"sig":"MEQCIGwRmvg6+3I/3ScDYzUu1a4hcirm/v7AzIFuiUhh1epEAiAofiej+mHx0uGCw51eAZYMvK49T8TxxnxeSFEVTuwo4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336043},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"6c2fcbd83de1adc3a3d4e91bc7d99dedc95fb4b3","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.4.1_1789213042917_0.4956929523261224","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@my-life-buddies/buddy-runtime","version":"0.4.2","_id":"@my-life-buddies/buddy-runtime@0.4.2","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"83b4279793f9eb5ae66719805af2c133b329132a","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.4.2.tgz","fileCount":74,"integrity":"sha512-kGophx36YjHU4KzjMdnJA/3LHLDENO80ytba/6qrmHQeOBFmKr/c8gueWD/+n60ouwcOXkClI2w5kgzVX/S5+w==","signatures":[{"sig":"MEUCIQCj1BFSlEUcy5CeY/ZC2nWgIT4b82AewAaXBtMD321ozgIgcgTLjvuqGtDVAoD8Ygu1SwEjrtLlvmUpOdExTT8A6TY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":332943},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"87af0e2451dbeb996e7058403e4b14ef76e904e0","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.4.2_1789351127731_0.771525022688945","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.5.0","_id":"@my-life-buddies/buddy-runtime@0.5.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"3eff4de0b8d8bebedad8ed93419a3134326c1871","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.5.0.tgz","fileCount":78,"integrity":"sha512-1Aesk5Bl3AUeON7DDgXlsOpQ5FAaacQij/eXdvonK0PiQD8UHuTkEL+RgXPPrKVXtpucMc/cR87OYxawtsqjOQ==","signatures":[{"sig":"MEQCIAzgOsr+ErOdb8xs5LuKvyhtRGsErErp8MKKrYZT06pLAiAV6bZDh7VCPmPLvcz8xuX1pgw8n+LhT+FXujYisK6PFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378370},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"b2ddb4dc1c0c87483736557a10d03e247c499ec8","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/platform/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.5.0_1789371659914_0.36137607369343194","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.6.0","_id":"@my-life-buddies/buddy-runtime@0.6.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"b3421d5c0e5fd41b727b46528c8b223fb9bc67e9","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.6.0.tgz","fileCount":74,"integrity":"sha512-BYgDaIg8gBBtd8qREnuvw8jmvMwBDPCxIqT20c4kkEDSmhYoBNxxatIfKPwF9OfsQHCS70Z/wW9i3GOqvbgn/g==","signatures":[{"sig":"MEYCIQDZZ46byf9BO4axpAJCZCH2hNXGrXgDyqHZX7Rgit9LwQIhALjOBhZaVd2KNSViVKFP+fBgQV0Rt5ZGCVaEo1gSAa/3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":377858},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"03bf1d598b4f5d04e17b8e9c2b6a9e66436fe875","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.6.0_1789377684141_0.5591890716232057","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.7.0","_id":"@my-life-buddies/buddy-runtime@0.7.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"}],"dist":{"shasum":"50115bb7ee1b8cc54a05d93dc89bcdf33831ec8f","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.7.0.tgz","fileCount":74,"integrity":"sha512-0pbgWb6CHPqDeL1HMSQm3Kpl+xpHGlMz4+cmL6hKWPYNlhSogAqri8NjbFLmoq+v8lyrElAS0M8DvDW4yu990A==","signatures":[{"sig":"MEUCIHyolg+XNnOq0+EHdCIozUO1dIbaEvQmuyRVScbTdgrRAiEApunAPz3L9+6jLV0ybhOBdwHRbCSekQSCEN+iSyfb89I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383444},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"3c7393f59b28b4d7c5477364bc1cb36c80292493","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.7.0_1789380013868_0.1464437230705753","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.8.0","_id":"@my-life-buddies/buddy-runtime@0.8.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"98058a7a67092b375e264ca1bd5d5c5c13fbb175","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.8.0.tgz","fileCount":74,"integrity":"sha512-I34HbleUS9LQR4CbyNwBtSjrPWMfxG2YMkx8CCj/d4Q32KDy9lsymNHOo5tlJyio1ZdXS+X1L4FeKtq6yDPnMQ==","signatures":[{"sig":"MEYCIQC9tXD1i37h7jfENZ0n3CO79wNfSOJR8unQqAAChZj+BAIhAOH42Izq/crcOItLqiq/G77fJNtndj451iuGEHFuoHF9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383009},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"fa81dc51dfbe6e54b59b408317c8a43af1bebe15","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.8.0_1789395082838_0.18400112038531202","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.9.0","_id":"@my-life-buddies/buddy-runtime@0.9.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"b1c3d2591f9d73647eb468efb2c9a3ef255d55c3","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.9.0.tgz","fileCount":82,"integrity":"sha512-1AJe5vDh8HGYLt4os4aOO4SxkObwaG/Do0o4nz61BVMfLp28LYJNqiri5XpZISRbqziAeSv1Kw5HLQYJMFLpaw==","signatures":[{"sig":"MEUCIQDzNBAF5EBH23uWPDw/PYJf6fyxl8mStRIJ2fPfHZv4VQIgSkNsquJlMkJE6jSRlTTsuZuudoZQBG+CkNycQ51Ctq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":408973},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"710c630269e9453c81bec0cc3d78f2cdb84dc953","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"MLB 搭子运行时，基于 pi-agent-core：订阅平台事件流、拉取消息、驱动模型、写回回复。开发者调用 BuddyServer.start 交一份配置即可跑起一只搭子","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.9.0_1789402904205_0.12134082538869051","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.10.0","_id":"@my-life-buddies/buddy-runtime@0.10.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"14d28f83c45d71ce8e2a1acf67158db167cfa5c3","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.10.0.tgz","fileCount":86,"integrity":"sha512-8oIs4o5z1fg3GsogBAifXutOevnI/nntpDcnJtM+4mu96zccTkFDf85WG2SlL07nwP4ewtfMrLPBkJZTKsdpjg==","signatures":[{"sig":"MEYCIQCxkInYj036a/KYkaCywuT4E018nYEjEOSIuirKAINGwwIhAN6oxqAKMs39quj0YJFYyVxsYiGd9hg6IHpnBTyk+SJH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":424379},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"66fa9afd85e1d483888e8bc8d91a154b1dbe3822","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"搭搭开发者工具：基于 pi-agent-core 的 搭子运行时","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.10.0_1789447475256_0.4968817132491319","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.11.0","_id":"@my-life-buddies/buddy-runtime@0.11.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"6a6cffa2480504484ecaeedfc987158ad6432f87","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.11.0.tgz","fileCount":86,"integrity":"sha512-6mqO05OK3GRtJwbQXlyKFxk63iq5MUctnihA0d75iBQlbSoxbOSs06FI4+dvIrZ8JBU0brioag4+8jD9Fy482g==","signatures":[{"sig":"MEYCIQCYIqDvp2OsEXDrNf8JfuGPGInxveyNxWUI7uExcCOhaQIhAN46PtrqJvKLjapvgJrTQ3UdDvP2hCZ/uJMXv+oVEP83","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":424604},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"d4e57f3178691fc06c0048a36b1a9e4b59f874be","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"搭搭开发者工具：基于 pi-agent-core 的 搭子运行时","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.11.0_1789456079209_0.2175134892421875","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.12.0","_id":"@my-life-buddies/buddy-runtime@0.12.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"149b5a2871021b1f7b3c763a8aab18827dc77116","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.12.0.tgz","fileCount":86,"integrity":"sha512-bA+F7LoR6ZAXH2fClqT+lrhuCpQKZLKZ4H4VIBqbl4V5TKJhRyaSuzaRUBKxpMpXOCKAetdPyIaQrmInsat10A==","signatures":[{"sig":"MEYCIQC4ZISE4p/FvaC9H5lPDDFxq5tJf/kEPMZJAqdeDkMu7QIhANQFmTzcAfIW/s+iMud4qnLQMEvbzDlHn3ti0jkw5y7X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428683},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"038fc1ae13ae09718ff0a8adfb654a5d1f83257c","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"搭搭开发者工具：基于 pi-agent-core 的 搭子运行时","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.12.0_1789460138436_0.6160256455754598","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.12.1","_id":"@my-life-buddies/buddy-runtime@0.12.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"82aa62b44c3e497afed54674f8f293168aec2c73","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.12.1.tgz","fileCount":86,"integrity":"sha512-9X3Gp7sm+V2Krfc70E4m8gQ8KPYdubiDmHvg3JjXb6Xsx0sPgaQF6XjZrlejIo14G6w3nA1voqj7avWN54UCfQ==","signatures":[{"sig":"MEQCIE4TEG5wVd+iGZlE/tNIWGn1OFzxa43N1BlDnMhPreBTAiBs+7l8VEbEHIpO3pLhIyucO6LMmXFLgwxWT7Qm/zuErg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427193},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"2ce83ee12ba8d8917f8b88675f9bda9179c82996","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.12.1_1789470186036_0.22167343377481297","host":"s3://npm-registry-packages-npm-production"}},"0.12.2":{"name":"@my-life-buddies/buddy-runtime","version":"0.12.2","_id":"@my-life-buddies/buddy-runtime@0.12.2","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"83eeb5aca9435ad9b7d5944f60729042cff8320e","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.12.2.tgz","fileCount":86,"integrity":"sha512-LoPt78FO/h6roKoOjVBREeW5UxsZv1NEE41RkIdhg4ffeHL0rzQvi9yaXel+PNT9W9Ud5JfxDTMF7kpqgs0Y7A==","signatures":[{"sig":"MEUCIDevAJQbx3anzWaFhHnQ/O3iZ9w8C+JqW6uHwRh9C05cAiEAgvQ4hnTuVyBxZ8vTm2sXtXpeaqKk5CSELCMN+yZlkvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429481},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"8d80173c398c8a312852cfd8d0b8d6e473a84bb4","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.12.2_1789475669042_0.5902760463059438","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.13.0","_id":"@my-life-buddies/buddy-runtime@0.13.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"15df47fac0d6f857aa316d45c205ad5b918e7360","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.13.0.tgz","fileCount":90,"integrity":"sha512-LvILKiLOGit5He0/Xz0YKucWxNE2pWXwrybBIXrZOW5z07sJID4IQEdoOXqNAj77mG+K8NjGh1pfyzSLsyYFGw==","signatures":[{"sig":"MEUCIQCO4tMVwSOYcQ6C12hqs6BblF4ekQi1L/UZrncs8RJhtgIgNm1rGgxpDJbXsUaVKGYnkZa18a9tPHpvGxa36LCw2IE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453983},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"adc67635ad70d6bb5979a45b50375323149d549d","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.13.0_1789491295891_0.7962388360861452","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.14.0","_id":"@my-life-buddies/buddy-runtime@0.14.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"7a78187730b56ed19626f994f7fa34767d80ef8b","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.14.0.tgz","fileCount":90,"integrity":"sha512-xDOiOiq3VbjDddy1fVWG0rEKoHA7crpfgpqCS+DHxpHor91HSFsbqItd0pSFOlih2bd5Wl9pTIwo2IiXFdBbSw==","signatures":[{"sig":"MEQCIHPLVLckM8N0xABqCC2s0SRayqbWuwKd2shIM65K/U6wAiBlyMEtqNPww0WHjS1cbq9kvp43Zq1MX/t2HKJJR8liUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":451750},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"f9987e6331ea577d633313a3e7419eeac9c14bf2","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.14.0_1789525037934_0.12103369988922119","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.14.1","_id":"@my-life-buddies/buddy-runtime@0.14.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"ef49e26a7d1865aa5bd6fbdf3c78f9b36cb7d1a4","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.14.1.tgz","fileCount":90,"integrity":"sha512-ZEyL5DLOEE8SYQGTGvvsKFzzmCPHI3Qh3DFuhsGeKJiPrOuUnBtmBp0m3zJBnLpMzeD+awkodaONwWYrweJE+g==","signatures":[{"sig":"MEUCIQC9kuulS3NcZh0kgxFTn+xklSSsK/2zFp+VdFYgWOVETwIgfpfW80+R2dr/zFMtVs/3C9EPgAvqO+MvFy4nebeizbk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448563},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"0707c1eff5503f862d532b923056c6536b38887a","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.14.1_1789528504458_0.539144998195201","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.15.0","_id":"@my-life-buddies/buddy-runtime@0.15.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"a3058c5748f9a1969affbefe97b0d0017bf26da7","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.15.0.tgz","fileCount":90,"integrity":"sha512-nQoPmSyoFlpQJnJPDZh5UIJiVz3pqceAYAX5GvNOcipqj0dwZK25perytC4X9c9l94JTnEDwOzIiWT7aP5Be3g==","signatures":[{"sig":"MEUCIQCMFetjmF4sNrlf5BQNzi+yTKAPWMugmd5ctt4ru3u8owIgQAYneaT/ZjSmxLpjsq7Iv/Pv/8pwzg2J3hjpb4u0gUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450759},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"81b31cf3eea24e5238d5514367a35e4d677df496","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.15.0_1789535265153_0.43498114073695726","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.16.0","_id":"@my-life-buddies/buddy-runtime@0.16.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"64a7bba1e04b7461d79391dc073e5acbf4c6c8a0","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.16.0.tgz","fileCount":90,"integrity":"sha512-NkJef6s39Fs/pnxtC5q5ee8dEFMUudPcyO6a4v22xMZmaDIsFBvb/R3D1q1/bVrSCKAvhSaVe0sM9LrhuPn02w==","signatures":[{"sig":"MEUCIF1nDvaVuZFhxIV5LdBN50shmWbWIRr0j+01iwch6pmxAiEAry5PuABDOfjb7ojgxs8Zc20XuwDDS/Jv9yVDSm6RFus=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460251},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"be3e41bf43cf6de124be8949e09eb028d2d3d8df","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.16.0_1789555962917_0.627146250364242","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.17.0","_id":"@my-life-buddies/buddy-runtime@0.17.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"c22ecf9a838f5d78f8f09651fbab9632d74a75b8","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.17.0.tgz","fileCount":94,"integrity":"sha512-mhA8iNvdDcxOrhcZ1TjyZBrGkyosxbPzT2+GJKQMJD/PMGXmxGolsdRTpGQA75DOlHsZJf3/dG+OfP18H6VEZg==","signatures":[{"sig":"MEUCICjixW4vx+fKB5UQ6fKX46ox1KTFHRlaLd+vpLJTkGr4AiEA+O/XO6bm477VGb+sFNzFIF00FndOLeG4w6e1ScLGCXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":471648},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"e13ad140bb5b2c08b5a58818625f16144abccd92","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.17.0_1789578091190_0.48955657742558656","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.18.0","_id":"@my-life-buddies/buddy-runtime@0.18.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"a120df971d74f7f75638c3f8500d2d1b3a324e4e","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.18.0.tgz","fileCount":94,"integrity":"sha512-/k1zoVy/k09pHuyQ/uSyEd71FcbwKii6J9wzVT+KQVdWsCSV2uIudytTD5jQf5IfJH2rTr2dNYr+nOo/tpqXyw==","signatures":[{"sig":"MEUCIGhQ/e2aEYHMsNg9X9vlwVS0PTsyIOaccgyMLuT3RcYcAiEAu5koqfz1TLL6zHh8HwM2UA3aK1pv6UGKQZ8IvMlUhwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":473235},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"6390508e8126e147febb52683e6ac723abf3202f","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.18.0_1789581686998_0.4741755743426721","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.19.0","_id":"@my-life-buddies/buddy-runtime@0.19.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"6226c9a9d00979fe5c866cc3d84c1db12b63ae63","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.19.0.tgz","fileCount":94,"integrity":"sha512-0vQCaesl5kNHneK/FKUbIgTNKLslZo6uqqKPSsTG3pArtRvlfmcQgNf+oweSMsz0H5MoNhjxqvWeDUA741dDTg==","signatures":[{"sig":"MEUCIQCN1YxaDxKHXjqgUWu5rX+MgeZyhEgB83DOLnu2aQSsBQIgClII3s8QboOmKlK6p7xaHKT22VeRxQqQi+DmmnXUXBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":479880},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"64b614365dc866febe301164c0b5e9267117cb8d","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.19.0_1789631176423_0.26917266764119985","host":"s3://npm-registry-packages-npm-production"}},"0.19.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.19.1","_id":"@my-life-buddies/buddy-runtime@0.19.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"9fe090570dd3514e2b5a94a4f6773741b126caad","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.19.1.tgz","fileCount":94,"integrity":"sha512-eSku7IIfKupsTQZxWSnfa3kUbbA6WNcy4n1/0Plz9eHxNH6bubNRBDfd9i9+TFQFa9b+ivBb22b1ESmqmwU7Yg==","signatures":[{"sig":"MEYCIQD0Me1qOjCi4j27+G5Tuixky6vfzgnC/+Cm34a87uevRQIhAOiWjMZ//zkmXWv7Tw9VenJnRCXJzpGOtR7gpUNj7PjM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480495},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"1c875fd8c97180dbd64b52ddf8ffaba00fa89ba1","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.19.1_1789636143374_0.577241644371782","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.20.0","_id":"@my-life-buddies/buddy-runtime@0.20.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"b13f17d7eae715a7e1794ac66925ce16f37ebd90","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.20.0.tgz","fileCount":94,"integrity":"sha512-jsAdsc7U83hxPOwjyeI06TzeGZ0Mb2Rpu4y8553yYCsRNp4G4/zX3Cm8bJOJQvGhmhTEIEa518jVrrmDWJnmrQ==","signatures":[{"sig":"MEUCIQCkD6qPZLOCLWRruxQtZ7aDwfXYPjc5vjLzZPwpLBqUgQIgekmS7bHr+i3QXjkSGpHvnHzjbEBKuDMJ2mpzoPCGSoY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480492},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"25812e42b24ba1c5e3cb97d64b63d39278e61a16","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.20.0_1789640093226_0.07823453743640796","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.21.0","_id":"@my-life-buddies/buddy-runtime@0.21.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"71537863a4691757f383621e234fc3d577b86501","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.21.0.tgz","fileCount":98,"integrity":"sha512-aNguFKWwxALYhrrvip/elYygjIKzjtvOOhMxx3kBQ53EoS71OFrAd+t574BqaUcVNPhFtBuh62Or61CCFdS3Ow==","signatures":[{"sig":"MEUCIQC54N4/NdPuZ/VyajSpRvHSRXeJx15UAR0svh0QCsK/2wIgQNQq6lmE6c1JS7GBxcRecDzADApOLsQZVyQOHrmJ9Uk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":501692},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"a38804ee175ad9376ec7746a5174ddf5718567ec","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.21.0_1789651446777_0.3114230510729321","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.22.0","_id":"@my-life-buddies/buddy-runtime@0.22.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"72476cd03faa40077b6b94645797186e3a99182a","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.22.0.tgz","fileCount":98,"integrity":"sha512-I+IKHqhXWTu0F6p3IgbcDf/dmXcug9X8rxdsSKz8mDB3cmtx+KTEkK1M559XxA/QPDJcDMWGIEuNK/C6oFS8Tg==","signatures":[{"sig":"MEUCIQCZu4l7b6+MDh/D2qZA8Bl/AFADKG7m/0ZwFdLrwF61SwIge8uH64gzCpP+ngB9cCQ1h3H1NOYhmjf22DuDwDxE34k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":501695},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"0740c9f435d5f23ad11a295e0e1e7777723e6e31","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.22.0_1789652937976_0.25814386428926217","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.23.0","_id":"@my-life-buddies/buddy-runtime@0.23.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"8458f11f721e74ae4751257fc42d6c063517da56","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.23.0.tgz","fileCount":98,"integrity":"sha512-quF3otVe27Fz2eWT3LcqV8hCun0qBy9V1aISWUwWUJ06Lk+JeI7istvvjCu4s/yLAoNy7POdamYfHMQgN/p6Mw==","signatures":[{"sig":"MEUCIQD0IqLjPtm9o1HwqTu8QOu5GV3Xagh/dz20OKUsPgYpSwIgEsyaGPteSIg2Uo2lFMtR7MTg/WnTADx72o8415btIZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBvoDVRT2UnlnCY//6ZT+jnBsvKNsmenGfpLAG1LZYA1AiAuZjbVNM6Wue/wyAiqQGCn5XgKHTj2N9gtry0yBe7unA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":498016},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"a107b372dfcf306be7e318582d918a34821af97e","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.23.0_1789735491433_0.18837150943064151","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.0":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.0","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.0","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"042ac973d4347e68ae1d327342016042eadf3136","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.0.tgz","fileCount":99,"integrity":"sha512-05C5gVLSjiUUUYtjtB5LQk8nLhqTflWv6vwSQR0Qb28FlaF22Qba0cKbnH0qV/L0R5sMlYtaQEoEi//yT6rmbA==","signatures":[{"sig":"MEYCIQCz0ROLJ2LxMZDpLEaHhE4y1CY7k9jmK2ZCxr3yjgrimQIhAP6LKSOwNt7T5qWwCRVyacZkBxDaitd4TiDBbHrROyJx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBez/PdRHpY0FHk8aroFI8LU8E/8TaTgTJWjgueozZdsAiBbsPMFEEc2RVZYSuGrhF1ChZ2IQ7C+1OHDIqY/sivJ0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514042},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"2f053e66c31b219eca24ca14ddb360b3f6260193","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.0_1789967833623_0.24829648100042978","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.1":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.1","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.1","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"1e9c3f74bd500f78e14ed5839beecda966613a4b","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.1.tgz","fileCount":99,"integrity":"sha512-MOqTHnl4mYSinTZKFHRMet9sSfxD15fxqRsqvVkyQM9wt4rtkF4/qvQB9VevdmJ7HGYLawXzZC8JgWNZ6N96+g==","signatures":[{"sig":"MEUCIGihWMO0S/DXYRlXNF0/A1NQ8uxRVNv3C48drv5KR1l4AiEA4+5EuzAdT9lRTKx7RVYMSBRrlvLIfj8hi+5iLsL7miU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHZ/rrKSIdOpvhXQk6Z/AFR2/cBfPBhIWPKvoKjWSQkCAiAr+/7/VHlml+0zYaBNF6ha7Q1yOoLq3A9e+6zGCn5Grg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514100},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"e3d5091292192ec026958752549e71d6c8738f38","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"node scripts/check-publish.ts && npm run build","release:preview":"node scripts/release.ts --preview"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.1_1789968245710_0.9489619340500317","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.2":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.2","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.2","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"5daf9ebece466d44130e164f184b72942b00bb46","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.2.tgz","fileCount":99,"integrity":"sha512-NUydzktG4eRxbHhPokZRkQMt0w7dQwJPOKFSH6TWWDxr5QkKPX1MbmP/B/OWJR/Zg9AP+EIt3vqrfc2C5P+xow==","signatures":[{"sig":"MEQCIAecY3IPuBfIPVvHmKfS4XIgp9iaFxH+4si+0WeSzpPWAiB4Oh/RSC/j2G5XdnpWgLyfKFl5/+FOsDwnyMRbTWwlBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFeJ2JDnWlkAKKP+tfKPBAfG/0lG9QbXWsIQ4300iscVAiBSUOtY8gXxEINIXpQEwydW2m4txDFbW9YHDUUG/zEhaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514100},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"8160efb19e26cca68de04cfe716a5692308f0496","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"node scripts/check-publish.ts && npm run build","release:preview":"node scripts/release.ts --preview"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.2_1789968858551_0.36611172799912906","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.3":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.3","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.3","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"2f809d7c458214297976dd06dd6f29d6215c7ad0","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.3.tgz","fileCount":119,"integrity":"sha512-/kgeLAmlFAt3mhYJTdeVTnuxEMSVsxa4/IsGrX0TjQe0NHzEqCb3AHXSatYcSRvJh0xt3YRZkkkRmDAA1QoxAA==","signatures":[{"sig":"MEUCIDMyUCXSdS+2cjpgzCbWj65ZJ+uBXyEng+TZLcMDmIZbAiEAle193Vrzb6SBVYY7J1uHmO5UitGeyosZRJ1tUMqdVzY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCawDbsIEwkuJMt0pc8stLVqOKo+WqVSeuHfuR5aYedVgIgc4dya2wbz45ggiDIC7CKNQtZxfk7Ir3VcaRHeIq2ZAM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":574825},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"938a118d3fe7fce569167ba9290529e7288c236f","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/services/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.3_1789998802440_0.4273657063065113","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.4":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.4","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.4","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"75620ad8b6b933208fe4307aa8e363d9ae6a251c","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.4.tgz","fileCount":119,"integrity":"sha512-pUaKMVx7R/x6cQJrnVdq/WJ5V8zSvQr7ElfMBxi74rIB+XkzjjBlCpm+vDqaqQN/8Llwzk+bt4h0vj6+aorVOA==","signatures":[{"sig":"MEYCIQDJ+N8euAsgXPWqyLGGYNNM8cbXhq2m2pU1wW4YxLbqBQIhAKG/LNEFLy4ml5L/yzfgZRDiVFm3Sg3kMgbxWvUA0a+O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8tTmI89xE9Bgq8onIut9NqOEz8V7aW0TISmGp1IohqwIhAMPJdPyDCbRvfyKFFHTLfOHuYfnOfLjIFxt9cXw3qMB3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":607270},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"c287c1848c1eb8f2dd4dac9945eb46ab2df7d20f","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts src/services/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},"_npmVersion":"11.9.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"24.14.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.4_1790002318373_0.8090775927060676","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.5":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.5","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.5","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"3c2f87f229bd58d993666a2d2dd640972bcad828","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.5.tgz","fileCount":103,"integrity":"sha512-eQAsdPJswJXZPg0ojcK/rOyEXSd+9OIf7m0Xc9hI1hSxicKkrpBQd7N+L8bUMklBJz1HHXMX2JldPr/QiXXe4Q==","signatures":[{"sig":"MEUCIQCgIjk5IyGgNDakj8zp5ZsyiLVksPN8ScG1lhW/F9WjuAIgZrUCbcA4siECt+1quhvU93UFScUdRhYV9LGHNXBootE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDnMhZZDsJYSBFl80oGqj5fgDp5aY/4B84vXcSf++v4+AIhANlegFREXp29X4IQvIDUdV+Fm7qDhL/MZxI1aB1pWz65","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":563984},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"1b226846b67d247f78c7fcf42cd3044e7f8c7442","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},"_npmVersion":"11.9.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"24.14.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.5_1790062204924_0.9571408621824558","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.6":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.6","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.6","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"cebbc043539e4937fb54b3806cc9cdb98bf11aa3","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.6.tgz","fileCount":103,"integrity":"sha512-R8Gvb8VGNhVHB210KeBu3sDMCpNFAnRuqcOWAtR/VzhaDM8SqLMQlblRSfsg9b9KrFZK0JMMmfQGarc7ulxuvw==","signatures":[{"sig":"MEYCIQD+LZFszpn5D3tINOZG3xsSd5xGaHj7X6uCAslWbFVsTgIhAON+rO5+/iKwg0uw8wBugfharJYXdsqoy2O3P5h8fHh6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCSJz6IZhzG1pcVeWFP4+b83l702Y4iogzUMv2V1hF7PgIgHdMDbDgcGyElIv/7C3Oczr8MAqooVuzqQ7c6kpR9qDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":565399},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"0288e654628a12c28d99cf550bfbbd91de4b8fcf","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.6_1790084390071_0.12424958216354387","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.7":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.7","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.7","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"83edc765083da3b44b53cbbe6088319a983d64c6","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.7.tgz","fileCount":99,"integrity":"sha512-WU/HG/XnlGtGjR4FC+pMVJpo95Qtq9fWdfkV/7Owk+oJK87rTkVRcSgmumJHNJJONdZkyStzDtFm/i+5DYoMiw==","signatures":[{"sig":"MEQCIEjgH+OS/n7X026bUOoo6TJ9k2EdPNxTXJ6Wa3gzboCIAiBTRMF79RRnYVmbJP3ic0Dp3JLmAbSmdI/Bg4FftD0qVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDQbRAbrK1dy/VzYCHoUphOfNQRiaGH9Kcoe3+RUA6V9AiEAv7yFTXYLwGkjdWi/ANJbVJq4i+ak9AmgVlm1FlfYpQw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":547867},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"7ca3b476869305af626b1d7541df3be04d6568f5","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.7_1790091536978_0.4735816681884295","host":"s3://npm-registry-packages-npm-production"}},"0.24.0-dev.8":{"name":"@my-life-buddies/buddy-runtime","version":"0.24.0-dev.8","_id":"@my-life-buddies/buddy-runtime@0.24.0-dev.8","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"dist":{"shasum":"681a049acf0edd21671e6e2ed8161683cb4173ad","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0-dev.8.tgz","fileCount":99,"integrity":"sha512-3ZWrUac91txWJHAuDQOIUREEkMDp9+gvk5qp5OTRgA5h8pkl/6n1Bp8RH01rxeBzXtOIRqKQiHneso4J0XKHEA==","signatures":[{"sig":"MEYCIQCGXx71jtstZSGu3kcOPMfvQnXVXOhkd91xIxZxfbn88AIhALfvWT3wN9Opj6Y9JARH+h5DXypJlUrA73nGZBgMyIlV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHBEZCiWlzXZEW2s9B/1KW0V1aJNUy6BkmFW13TLeskEAiBcPYLdyeXU3GztSblLOye2ofs9HetWN6VPLVdgULEOQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":551127},"type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"7e35538ec16fc16e0e48814c0cbde4bfc6ad5e6d","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"tmp":"tmp/buddy-runtime_0.24.0-dev.8_1790133583514_0.18449136053441229","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"_id":"@my-life-buddies/buddy-runtime@0.24.0","dist":{"shasum":"f37cace83d818621dd7f0f00f9811dfdba5e4a05","tarball":"https://registry.npmjs.org/@my-life-buddies/buddy-runtime/-/buddy-runtime-0.24.0.tgz","fileCount":99,"integrity":"sha512-dtiiUts3uIvLOsrghct1P60WDPeNvkjh6NR/Hexpa2X2czxHoOeEESIS16/GQkGo/VGr69/xCSrGt1MzOqeLMA==","signatures":[{"sig":"MEUCIQCXY7vObZ0osGkfO3g3sdTQiAgK4coOiU81SuiYU468pAIgW6N14BNWfCAaMCRDfNNV3ckRwUlAb51qYU2ltnj7hsY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDzvLohb5Kjzegu4cjqL7p6CvcW/77bwsHmmspqSBTh/AIgUNkc/bfOVDlnKT+KPcm9N5j/LsCqNycTEoIfiiaI46E="}],"unpackedSize":551917},"name":"@my-life-buddies/buddy-runtime","type":"module","engines":{"node":">=22.19.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","buddy-runtime-source":"./src/index.ts"},"./package.json":"./package.json"},"gitHead":"7b52bb90498824d3e9b12354bdba40626eefafb2","scripts":{"test":"node --test src/*.test.ts src/conversation/*.test.ts src/tools/*.test.ts","build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","release":"node scripts/release.ts","check:api":"node scripts/check-api.ts","typecheck":"tsc --noEmit -p tsconfig.json","release:dev":"node scripts/release.ts --dev","prepublishOnly":"node scripts/check-publish.ts && npm run build"},"version":"0.24.0","_npmUser":{"name":"lij.season","email":"lij.season@gmail.com"},"_npmVersion":"11.13.0","description":"「搭搭」搭子服务的运行时基座","directories":{},"maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"_nodeVersion":"26.1.0","dependencies":{"typebox":"1.3.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-agent-core":"0.85.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^26.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/buddy-runtime_0.24.0_1790141099038_0.6075182544744824"}}},"time":{"created":"2026-09-10T11:42:28.821Z","modified":"2026-09-23T05:24:59.322Z","0.0.1":"2026-09-10T11:42:29.157Z","0.0.2":"2026-09-10T14:53:07.749Z","0.0.3":"2026-09-11T02:51:51.470Z","0.1.0":"2026-09-11T08:16:18.099Z","0.2.0":"2026-09-11T14:28:08.980Z","0.3.0":"2026-09-12T04:02:01.693Z","0.3.1":"2026-09-12T07:31:55.817Z","0.4.0":"2026-09-12T10:00:01.806Z","0.4.1":"2026-09-12T11:37:23.054Z","0.4.2":"2026-09-14T01:58:47.884Z","0.5.0":"2026-09-14T07:41:00.065Z","0.6.0":"2026-09-14T09:21:24.352Z","0.7.0":"2026-09-14T10:00:14.011Z","0.8.0":"2026-09-14T14:11:22.982Z","0.9.0":"2026-09-14T16:21:44.329Z","0.10.0":"2026-09-15T04:44:35.394Z","0.11.0":"2026-09-15T07:07:59.346Z","0.12.0":"2026-09-15T08:15:38.640Z","0.12.1":"2026-09-15T11:03:06.170Z","0.12.2":"2026-09-15T12:34:29.178Z","0.13.0":"2026-09-15T16:54:56.038Z","0.14.0":"2026-09-16T02:17:18.056Z","0.14.1":"2026-09-16T03:15:04.609Z","0.15.0":"2026-09-16T05:07:45.273Z","0.16.0":"2026-09-16T10:52:43.071Z","0.17.0":"2026-09-16T17:01:31.339Z","0.18.0":"2026-09-16T18:01:27.161Z","0.19.0":"2026-09-17T07:46:16.596Z","0.19.1":"2026-09-17T09:09:03.519Z","0.20.0":"2026-09-17T10:14:53.386Z","0.21.0":"2026-09-17T13:24:06.929Z","0.22.0":"2026-09-17T13:48:58.137Z","0.23.0":"2026-09-18T12:44:51.538Z","0.24.0-dev.0":"2026-09-21T05:17:13.738Z","0.24.0-dev.1":"2026-09-21T05:24:05.801Z","0.24.0-dev.2":"2026-09-21T05:34:18.654Z","0.24.0-dev.3":"2026-09-21T13:53:22.526Z","0.24.0-dev.4":"2026-09-21T14:51:58.456Z","0.24.0-dev.5":"2026-09-22T07:30:05.025Z","0.24.0-dev.6":"2026-09-22T13:39:50.176Z","0.24.0-dev.7":"2026-09-22T15:38:57.090Z","0.24.0-dev.8":"2026-09-23T03:19:43.611Z","0.24.0":"2026-09-23T05:24:59.141Z"},"description":"「搭搭」搭子服务的运行时基座","maintainers":[{"name":"lij.season","email":"lij.season@gmail.com"},{"name":"jiangchaoxhs","email":"yinshi2@xiaohongshu.com"},{"name":"andytong","email":"thxxforever@gmail.com"}],"readme":"# @my-life-buddies/buddy-runtime\n\n搭子服务的运行时基座，负责平台通信与会话管理，开发者可专注在领域逻辑。主要职责：\n\n1. **平台通信**：基于平台协议接收消息、调用模型，并将回复写回平台。运行时本身无状态，会话历史、记忆等数据均持久化在平台 —— **开发者无需为会话历史与记忆自建存储，服务运维无需关注数据持久**。\n\n2. **会话管理**：搭子与每位用户的私聊、群聊各对应一个会话，每个会话持有一个基于 [`@earendil-works/pi-agent-core`](https://www.npmjs.com/package/@earendil-works/pi-agent-core) 的 Agent 实例。基座接管会话的完整生命周期：冷启重建、空闲回收、超长历史压缩 —— **开发者无需关注 Agent 生命周期，基座全接管**。\n\n3. **会话配置**：每个会话实例创建时调用开发者传入的 Buddy 配置工厂函数，入参为当前会话的 `conversation` 对象，提供已绑定当前会话的平台能力，包括资料、提问、记忆、用户授权数据、小挂件、主动服务、付费服务等 —— **开发者可以尽情组合各种数据和能力，提供有特色差异的服务**。\n\n开始创造你的「搭子」吧！\n\n## 1. 快速开始\n\n### 1.1 安装\n\n```bash\nnpm install @my-life-buddies/buddy-runtime typebox\n```\n\n### 1.2 创建搭子\n\n通过 `@my-life-buddies/cli` 完成搭搭账号注册，并创建一个新的搭子，获取 buddyId 与开发令牌（平台另有一把正式令牌，只在托管运行时注入，不经 CLI 下发）。buddyId 写进 `package.json` 的 `buddyId` 字段，开发令牌写进 `.env` 的 `BUDDY_TOKEN`。\n\n### 1.3 搭子工程框架\n\n```\nmy-buddy/\n├─ .env            BUDDY_TOKEN\n├─ src/index.ts   \n└─ package.json    buddyId 字段\n```\n\n```json\n{\n\t\"name\": \"my-buddy\",\n\t\"buddyId\": \"b_1234567890abcdef\",\n\t\"private\": true,\n\t\"type\": \"module\",\n\t\"scripts\": { \"start\": \"node --env-file-if-exists=.env src/index.ts\" }\n}\n```\n\n```ts\nimport { BuddyServer } from \"@my-life-buddies/buddy-runtime\";\nimport type { AgentTool } from \"@my-life-buddies/buddy-runtime\";\nimport { Type } from \"typebox\";\n\nconst PLAN_MENU_PARAMS = Type.Object({ date: Type.String() });\n\nconst planMenu: AgentTool<typeof PLAN_MENU_PARAMS, undefined> = {\n\tname: \"plan_menu\",\n\tlabel: \"正在排菜单\",\n\tdataAccessPolicy: { retention: \"none\", result: \"derived\", arguments: \"private\" },\n\tdescription: \"给某一天排三餐。\",\n\tparameters: PLAN_MENU_PARAMS,\n\texecute: async (_id, { date }) => ({\n\t\tcontent: [{ type: \"text\", text: `${date} 的三餐排好了。` }],\n\t\tdetails: undefined,\n\t}),\n};\n\nawait BuddyServer.start(() => ({\n\tinitialState: {\n\t\tmodel: \"kimi-k3\",\n\t\tsystemPrompt: \"你是「小涂阿姨」——一位管做饭的阿姨……\",\n\t\ttools: [planMenu],\n\t},\n}));\n```\n\n## 2. 配置\n\n### 2.1 `BuddyServer.start(buddy)`\n\n连上平台开始处理消息，返回 `{ stop(): Promise<void> }`。\n\n`buddy` 是每场会话建起来时调用一次的工厂函数，返回这场会话的配置，见 2.2、2.3。DataAccess 声明不属于会话工厂，单独写在工程根目录的 `data-access.json`，见 3.4。\n\n**buddyId 与 token**：buddyId 从工程 `package.json` 顶层的 `buddyId` 字段读，token 从环境变量 `BUDDY_TOKEN` 读，缺一个都启动失败。创建搭子时会下发 buddyId 与开发 token：buddyId 写进 `package.json`，随工程进 git 与发布包，平台收包时会比对它与推送目标是否一致；开发 token 写在 `.env`，由启动命令带进环境变量。正式上线时平台托管注入正式 token 到同名变量，对开发者无感。\n\n**buddy 的生命周期**：`buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后，下一条消息会重新调用，所以闭包里的变量不能当长期存储，需要存储会话状态可以根据场景使用 3.3 记忆、3.5 小挂件实现。\n\n**buddy 的会话压缩**：会话历史长到一定程度时，运行时在会话被回收后把早先的对话压成一份摘要写回平台，下次重建时模型看到的是「摘要 + 最近的原文」。开发者不用做任何事，也没有开关。\n\n### 2.2 `BuddyOptions`\n\n`buddy` 的返回值。\n\n```ts\nimport type {\n\tAfterToolCallContext,\n\tAfterToolCallResult,\n\tAgentTool,\n\tBeforeToolCallContext,\n\tBeforeToolCallResult,\n\tModelId,\n\tShouldStopAfterTurnContext,\n\tThinkingLevel,\n} from \"@my-life-buddies/buddy-runtime\";\n\ninterface BuddyOptions {\n\t// 必填。这场会话的初始状态\n\tinitialState: {\n\t\t// 必填。模型 id，ModelId 是 \"kimi-k2.6\" | \"kimi-k3\" | \"deepseek-v4-flash\" | \"deepseek-v4-pro\" | \"glm-5.3\" | \"MiniMax-M3\"。每场会话可以选不同的模型\n\t\tmodel: ModelId;\n\n\t\t// 必填。人设与做事规则。为保证模型缓存，只放不随回合变化的内容\n\t\tsystemPrompt: string;\n\n\t\t// 可选。模型只看得到这里的工具；平台工具从 conversation.tools 里取来放进去，见第 3 节\n\t\ttools?: AgentTool[];\n\n\t\t// 可选，默认 \"off\"。ThinkingLevel 是 \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\"。\n\t\t// 模型不支持的级别在请求时就近换成支持的一档，建会话时打一条 warn\n\t\tthinkingLevel?: ThinkingLevel;\n\t};\n\n\t// 可选。模型出错或一句话没说时发的兜底回复，用户和模型之后都看得到；主动服务的回合不发\n\terrorReply?: string;\n\n\t// 可选。工具执行前调用，context 里有这次的 toolCall、校验过的 args 和当前上下文。\n\t// 返回 { block: true, reason } 时工具不执行，模型看到 reason；抛异常时工具也不执行，模型看到异常信息\n\tbeforeToolCall?: (context: BeforeToolCallContext, signal?: AbortSignal) => Promise<BeforeToolCallResult | undefined>;\n\n\t// 可选。工具执行完调用，context 里带着执行结果；返回的 content、details、isError 会替换结果里的同名字段，抛异常时结果换成异常信息\n\tafterToolCall?: (context: AfterToolCallContext, signal?: AbortSignal) => Promise<AfterToolCallResult | undefined>;\n\n\t// 可选。模型说完一步（这一步的工具也跑完）后调用，返回 true 就不再请求模型。\n\t// 这一步发出了权限请求卡或题卡时，这一轮直接停下，不调它\n\tshouldStopAfterTurn?: (context: ShouldStopAfterTurnContext, signal?: AbortSignal) => boolean | Promise<boolean>;\n}\n```\n\n### 2.3 `Conversation`\n\n`buddy` 拿到的参数，工具闭包里也能用。\n\n```ts\ninterface Conversation {\n\t// 会话键：私聊以 p_ 开头，群聊以 g_ 开头。开发者自己存的数据要按它隔离\n\tkey: string;\n\n\t// 日志，每行开头带搭子 id\n\tlog: BuddyLogger;\n\n\t// 平台工具，见第 3 节：运行时造好、绑好这场会话，挑要用的放进 initialState.tools\n\ttools: {\n\t\tresource_list: AgentTool;\n\t\tresource_read: AgentTool;\n\t\task_question: AgentTool;\n\t\tdata_access_query: AgentTool;\n\t\tdata_access_request: AgentTool;\n\t\twidget_create: AgentTool;\n\t\twidget_read: AgentTool;\n\t\twidget_read_module: AgentTool;\n\t\twidget_rename: AgentTool;\n\t\twidget_write_record: AgentTool;\n\t\twidget_delete_record: AgentTool;\n\t\twidget_send: AgentTool;\n\t};\n\n\t// 资料，见 3.1：resources/ 里的 .md，进程启动时读好，所有会话共用\n\tresource: {\n\t\tlist(): string[];\n\t\tread(file: string): string;\n\t};\n\n\t// 记忆，见 3.3：这场会话的长期记忆，存在平台上\n\tmemory: {\n\t\tlist(): Promise<MemoryEntry[]>;\n\t\twrite(key: string, text: string): Promise<void>;\n\t\tdelete(key: string): Promise<void>;\n\t};\n\n\t// 授权数据，见 3.4：私聊不传 memberId，群聊传消息前缀里的 m_…\n\tdataAccess: {\n\t\tquery(request: { datasets: string[]; memberId?: string }): Promise<DatasetAccessResult[]>;\n\t\trequest(input: DataAccessRequestInput & { idempotencyKey: string }): Promise<void>;\n\t};\n\n\t// 小挂件，见 3.5\n\twidget: {\n\t\tlist(): Promise<WidgetSummary[]>;\n\t\tcreate(input: { type: string; title: string; idempotencyKey?: string }): Promise<{ id: string }>;\n\t\tread(id: string): Promise<Widget>;\n\t\treadModule(id: string, module: string): Promise<{ records: WidgetRecord[] }>;\n\t\trename(id: string, title: string): Promise<void>;\n\t\twriteRecord(\n\t\t\tid: string,\n\t\t\tinput: { module: string; recordId: string; data: Record<string, unknown>; expectedRevision?: number },\n\t\t): Promise<{ revision?: number }>;\n\t\tdeleteRecord(id: string, module: string, recordId: string): Promise<void>;\n\t\tsetPresentation(id: string, input: { summary: string; imageMediaId: string }): Promise<void>;\n\t\tsend(id: string, options: { idempotencyKey: string; openTarget?: WidgetOpenTarget }): void;\n\t};\n\n\t// 主动服务，见 3.6：按稳定 key 订阅、查询和关闭；isRunning 判断现在是不是主动服务的回合\n\tproactive: {\n\t\tsubscribe(key: string, request: ProactiveSubscriptionRequest): Promise<ProactiveSubscription>;\n\t\tlist(): Promise<ProactiveSubscription[]>;\n\t\tunsubscribe(key: string): Promise<boolean>;\n\t\tunsubscribeAll(): Promise<number>;\n\t\tisRunning(): boolean;\n\t};\n}\n```\n\n## 3. 平台能力\n\n| 能力 | `conversation` 对象方法 | 模型工具（`conversation.tools` 上） |\n|---|---|---|\n| 资料 | `conversation.resource.list` / `conversation.resource.read` | `resource_list` / `resource_read` |\n| 提问 | 无 | `ask_question` |\n| 记忆 | `conversation.memory` | 无，开发者可以根据具体场景，自己组装成适合的模型工具 |\n| 用户授权数据 | `conversation.dataAccess.query` / `conversation.dataAccess.request` | `data_access_query` / `data_access_request` |\n| 小挂件 | `conversation.widget.list` / `conversation.widget.create` / `conversation.widget.read` / `conversation.widget.readModule` / `conversation.widget.rename` / `conversation.widget.writeRecord` / `conversation.widget.deleteRecord` / `conversation.widget.setPresentation` / `conversation.widget.send` | `widget_create` / `widget_read` / `widget_read_module` / `widget_rename` / `widget_write_record` / `widget_delete_record` / `widget_send` |\n| 主动服务 | `conversation.proactive.subscribe` / `list` / `unsubscribe` / `unsubscribeAll` / `isRunning` | `proactive_subscribe` / `proactive_list` / `proactive_unsubscribe` / `proactive_unsubscribe_all` |\n\n```ts\nbuddy: (conversation) => ({\n\tinitialState: {\n\t\tmodel: \"kimi-k3\",\n\t\tsystemPrompt: PERSONA,\n\t\ttools: [conversation.tools.resource_list, conversation.tools.resource_read, conversation.tools.ask_question, ...myTools],\n\t},\n}),\n```\n\n### 3.1 资料\n\n搭子随身带的只读资料：把 `.md` 放进工程目录下的 `resources/`，模型先列出有哪些资料，再按需读一篇。资料在进程启动时一次读好，整场会话、每个回合读到的都是同一份。\n\n**准备工作**\n\n资料放在工程目录（`package.json` 所在目录）下的 `resources/`：\n\n```\nmy-buddy/                  工程目录\n├─ package.json\n├─ resources/\n│  └─ research/\n│     └─ 01-writings.md    清单里写作 research/01-writings.md\n└─ src/index.ts            入口脚本\n```\n\n- 资料更改要重启进程，建议 watch `resources/` 实时重启。\n\n**`conversation` 对象方法**\n\n| 方法 | 做什么 |\n|---|---|\n| `list()` | 全部资料的路径，相对 `resources/`，按路径排序 |\n| `read(file)` | 读一篇的正文，`file` 照 `list()` 给的路径原样填 |\n\n```ts\nconst notes = conversation.resource.read(\"research/01-writings.md\");\n```\n\n**模型工具**\n\n把 `conversation.tools.resource_list` 和 `conversation.tools.resource_read` 放进 `initialState.tools`，模型就能先列出有哪些资料，再按路径读一篇。`systemPrompt` 里交代清楚这只搭子带了哪类资料、什么时候该去翻。\n\n**限制与异常**\n\n- 两个方法都是同步的，读的是进程启动时读好的那份。\n- 没有资料时 `resource_list` 回「没有资料」。\n- `read(file)` 读不存在的那篇时抛异常。\n- 主动服务的回合内也能调。\n\n### 3.2 提问\n\n让模型发一张题卡请用户选：一个问题加 2 到 4 个可以直接点的选项。私聊、群聊都能用。题卡发出，这一轮就到此结束，等用户操作。\n\n**`conversation` 对象方法**\n\n没有。`conversation` 不提供发题卡的方法，题卡只由模型发。\n\n**模型工具**\n\n把 `conversation.tools.ask_question` 放进 `initialState.tools`，模型就能发题卡。\n\n- 参数是 `question`（题目，不超过 500 字）和 `options`（2 到 4 个，每个不超过 30 字，不能重复）。\n- 题目和选项只写在参数里，回复正文里不再说一遍。\n- 用户点选项，就是用选项原文发一条消息，跟自己打字一样；也可以不点，直接打字回答，或者说别的。\n\n**限制与异常**\n\n- 参数不合规时模型会看到错误，改了再调。\n- 题卡的题目和选项跟正文一样属于用户可见会话内容，读过授权数据的这一轮也能发；Runtime 会保留题目与选项，保证用户回答后模型仍知道原题。长期业务状态（记忆、小挂件写入、订阅描述）按「留多久」在 3.3、3.4、3.5、3.6 各自封。\n- 主动服务的回合里照常能发，运行时不拦。\n\n### 3.3 记忆\n\n这场会话的长期记忆，搭子写给自己的印象，存在平台上，平台只存不读。只在本会话内可见，会话删除时一并清除。\n\n**`conversation` 对象方法**\n\n| 方法 | 做什么 |\n|---|---|\n| `list()` | 列出全部，按 `key` 字典序 |\n| `write(key, text)` | 覆盖写一条 |\n| `delete(key)` | 删一条，不存在也算成功 |\n\n```ts\ninterface MemoryEntry {\n\tkey: string;\n\ttext: string;\n\tupdatedAt: number;  // 最后写入时刻，毫秒\n}\n```\n\n**模型工具**\n\n运行时不提供记忆工具。要让模型自己记东西，按这只搭子要记什么，自己包一个：\n\n```ts\nconst REMEMBER_PARAMS = Type.Object({ topic: Type.String(), text: Type.String() });\n\nawait BuddyServer.start((conversation) => {\n\tconst remember: AgentTool<typeof REMEMBER_PARAMS, undefined> = {\n\t\tname: \"remember\",\n\t\tlabel: \"正在记下\",\n\t\tdataAccessPolicy: { retention: \"durable\", result: \"derived\", arguments: \"private\" },\n\t\tdescription: \"把一条关于对方的印象记下来，同一主题覆盖旧的。\",\n\t\tparameters: REMEMBER_PARAMS,\n\t\texecute: async (_id, { topic, text }) => {\n\t\t\tawait conversation.memory.write(topic, text);\n\t\t\treturn { content: [{ type: \"text\", text: \"记下了。\" }], details: undefined };\n\t\t},\n\t};\n\treturn { initialState: { model: \"kimi-k3\", systemPrompt: PERSONA, tools: [remember] } };\n});\n```\n\n**限制与异常**\n\n- `key` 非空、不含空白与 `/`、最长 64 字；`text` 单条不超过 16 KB；每场会话最多 64 条、合计不超过 256 KB。\n- 超限、`key` 不合法或网络出错时抛异常，异常信息是平台给出的原因，在工具里调用时模型能看到。\n- 这一轮读过用户授权数据之后，`memory.write`（含开发者包出来的 `remember` 之类）抛异常，`list` / `delete` 不受影响，见 3.4 的「数据只在当轮可见」。\n- 主动服务的回合里跟普通回合一样能读能写，运行时不按回合性质拦。\n\n### 3.4 用户授权数据\n\n用户同意后，搭子可以读用户的睡眠、运动、位置、日程等数据。数据按 Dataset 分项，用户逐项同意。搭子拿不到用户的真实 id。查到的数据只在当轮可见，见本节末尾。\n\n这里有三层不同概念：\n\n1. **Runtime 能力目录**：当前 SDK 支持哪些 Dataset，由包导出的 `DATA_ACCESS_CAPABILITIES` 提供。\n2. **搭子数据声明**：这只搭子实际需要其中哪些 Dataset，以及各自用途，写在工程根目录的 `data-access.json`。\n3. **用户 Grant**：用户是否同意这只搭子读取某个已声明 Dataset，由客户端授权流程管理，搭子不能代替用户授予。\n\n所有数据能力都在 `data-access.json` 中声明。位置和日历与健康数据的授权语义相同；差别是它们的 Snapshot 更短，过期后由平台请求在线 App 静默刷新。\n\n**准备工作**\n\nRuntime 能力目录直接从 Runtime 包导入，开发者工具和项目代码都不需要网络请求：\n\n```ts\nimport {\n\tDATA_ACCESS_CAPABILITIES,\n\tdataAccessCapability,\n\ttype DataAccessDatasetId,\n} from \"@my-life-buddies/buddy-runtime\";\n\nfor (const capability of DATA_ACCESS_CAPABILITIES) {\n\tconsole.log(capability.id, capability.title, capability.source, capability.schemaVersion);\n}\n\nconst sleep = dataAccessCapability(\"health.sleep\");\n```\n\n这份导出是开发者可选 `id` 的权威来源。新增 Dataset 随 Runtime 版本发布；developer-platform、脚手架和预检都应读取该导出，不再维护一份手写枚举。\n\n声明写在工程根目录（与 `package.json` 同级）的 `data-access.json`：\n\n```json\n{\n\t\"requirements\": [\n\t\t{ \"id\": \"health.sleep\", \"purpose\": \"根据你最近的睡眠调整作息建议\" }\n\t]\n}\n```\n\n- `id`：从 `DATA_ACCESS_CAPABILITIES` 中选。\n- `purpose`：用途，1～200 字。用户看到这句话再决定是否同意。\n- `requirements` 最多 32 项，不允许重复；配置对象和每一项都不接受额外字段。\n- 文件缺失等价于 `{ \"requirements\": [] }`。Runtime 启动时先严格校验，再把整份声明上传平台；即使为空也会上传，以清除旧声明。上传失败则启动失败。\n- Server 在注册时按声明用途和 Schema 计算版本；`id`、`purpose` 与 Schema 都没变化时保留已有 Grant，变化后要求重新授权。\n- 后续查询、HealthKit 权限卡和主动服务请求只发送 Dataset ID，不再重复携带用途声明。\n- 本地 `.env` 里放的是 CLI 发的开发令牌，进程连上平台后身份是 `<buddyId>-dev`，实际使用形成的授权上下文与正式搭子隔离。\n\n可以声明的 Dataset：\n\n| Dataset | 内容 | `data.items` 每条的字段 |\n|---|---|---|\n| `health.sleep` | 睡眠，每天一条 | `date`、`totalSleepMinutes`、`sleepStartLocal`、`sleepEndLocal`、`awakeMinutes`、`coreSleepMinutes`、`deepSleepMinutes`、`remSleepMinutes`、`unspecifiedSleepMinutes` |\n| `health.workouts` | 运动记录，每次一条 | `id`、`date`、`startAt`、`type`、`durationMinutes`、`calories`、`sourceApp` |\n| `health.distance` | 距离与配速，对应一次运动 | `workoutId`、`date`、`startAt`、`distanceKm`、`paceSecondsPerKm` |\n| `health.heartRate` | 心率，对应一段睡眠或一次运动 | `context`（`sleep` / `workout`）、`referenceId`、`date`、`startAt`、`beatsPerMinute` |\n| `health.hrv` | 心率变异性 | `date`、`milliseconds` |\n| `health.respiratoryRate` | 呼吸频率 | `date`、`breathsPerMinute` |\n| `health.oxygenSaturation` | 血氧 | `date`、`percent` |\n| `health.environmentalAudioExposure` | 环境音量 | `date`、`decibels` |\n| `device.location` | 当前位置 | `latitude`、`longitude`、`accuracy`、`timestamp` |\n| `device.calendar` | 未来日程 | `events` 数组，每条含 `title`、`startAt`、`endAt`、`isAllDay`、`calendar` |\n\n部分字段可能缺失，取值前先判断。\n\n**`conversation` 对象方法**\n\n开发者自己的工具直接调用 `conversation.dataAccess`，不用把 `data_access_*` 放进 `initialState.tools`：\n\n| 方法 | 做什么 |\n|---|---|\n| `query({ datasets, memberId? })` | 查询已授权 Dataset，每个 Dataset 各自一个状态 |\n| `request({ reason, datasets, memberId?, idempotencyKey })` | 发数据授权卡；群聊必须明确目标成员 |\n\n```ts\nconst [sleep] = await conversation.dataAccess.query({ datasets: [\"health.sleep\"] });\nif (sleep.status === \"available\") {\n\t// sleep.data.items 是每天一条的睡眠记录\n}\n```\n\n- `datasets`：一次最多 8 个。\n- `memberId`：私聊不传；群聊必传，取群消息开头 `[名字 #m_…]` 里的 `m_…`，查这位成员的数据，传错时抛异常。\n\n**模型工具**\n\n把 `conversation.tools.data_access_query`、`data_access_request` 放进 `initialState.tools`，模型就能自己查数据、发授权卡。放进去只决定模型能不能调用它们，不等于声明 Dataset，也不等于获得用户授权；没声明 Dataset 时照常注册，查询的每一项都回 `notDeclared`。\n\n先查询，缺授权再发卡：\n\n```ts\nawait BuddyServer.start((conversation) => ({\n\tinitialState: {\n\t\tmodel: \"kimi-k3\",\n\t\tsystemPrompt: [\n\t\t\t\"聊到作息时，先用 data_access_query 查询 health.sleep。\",\n\t\t\t\"返回 notGranted 时，说明当前问题为什么需要数据，再用 data_access_request 发授权卡。\",\n\t\t\t\"用户处理授权卡后会开启新回合；再次调用 data_access_query。\",\n\t\t\t\"用户拒绝后不要在同一任务里反复申请。\",\n\t\t].join(\"\\n\"),\n\t\ttools: [conversation.tools.data_access_query, conversation.tools.data_access_request],\n\t},\n}));\n```\n\n完整链路：\n\n```text\ndata_access_query\n→ notGranted\n→ data_access_request { datasets: [\"health.sleep\"], reason: \"...\" }\n→ 用户在授权卡操作，平台更新 Grant 和 Snapshot\n→ 隐藏结果开启新回合\n→ data_access_query\n→ available + data\n```\n\n位置和日历使用同一条查询链路。Snapshot 过期时，平台会尝试请求在线 App 静默刷新；App 不在线或系统权限被关时返回 `unavailable` 或 `systemPermissionDenied`。\n\n**限制与异常**\n\n每个 Dataset 各自一个状态，只有 `available` 带 `data`：\n\n| 状态 | 意思 |\n|---|---|\n| `available` | 读到了 |\n| `notDeclared` | 搭子没有声明这项数据 |\n| `notGranted` | 用户没有同意，或改过用途后还没重新同意 |\n| `disabledInGroup` | 这位成员在这个群里关掉了这项数据 |\n| `unavailable` | 平台上还没有这位用户的这项数据，或数据已过期 |\n| `systemPermissionDenied` | 业务授权仍有效，但用户在系统设置中关闭了位置或日历权限 |\n\n- 查询接口不会把「从未授权」和「用途变化后需重新确认」分成两种模型状态，都会返回 `notGranted`；重新确认原因由用户侧授权页面展示。\n- `data_access_request` 发卡前必须在同一回合查询对应 Dataset，且只接受 `notGranted`。`systemPermissionDenied` 应直接引导用户到系统设置重新开启权限；`available`、`unavailable` 和 `disabledInGroup` 都不能重复发卡。\n- 群聊查询和发卡都必须使用同一个目标成员 `memberId`：`data_access_query { datasets, memberId }` 返回 `notGranted` 后，才能调用 `data_access_request { datasets, memberId, reason }`。目标必须来自消息前缀中的 `#m_…`，不能按昵称猜测。卡片全群可见，但只有目标成员能操作。\n- 一次查询的响应超过 512 KiB 时抛异常，减少 Dataset 再查。\n- 发出授权卡后当前回合结束，等待用户操作。\n\n**数据只在当轮可见**\n\n查到的原始 Dataset 结构（工具查询结果原件）只用于这一轮：平台不存原文，搭子进程里的那份在 run 结束时替换成 Dataset 状态摘要。Runtime 按步骤追踪数据流：读取数据之前已经生成的工具步骤原样保留；DataAccess 查询自己的结果只保留 Dataset 状态；读取之后的工具步骤，私有参数和心声抹掉，结果缺省也抹掉，只有明确声明结果与输入无关的工具才保留结果；正文继续作为用户可见聊天记录保存。\n\n**判定标准是「留多久」**：\n\n- **用户可见出口（一律留）**：正文（`text` 块）跟用户直接看得见的话是同一份，通过 delta 就已经推给用户，落库照留；题卡的题目和选项也归到这一类，Runtime 会在内部 Tool 历史里保留这组用户可见参数，用户回答后模型仍知道原题；授权卡的理由同理。\n- **长期出口（读过数据的这一轮拒收）**：`memory.write` / `remember`、`widget.create` / `rename` / `writeRecord` / `setPresentation`、`proactive.subscribe` 的 `title` / `reason` / `trigger`——这些跨会话可读，模型看一次数据能刻很久，Runtime 抛异常拒收，模型能看到错误信息（一般是「本回合已经读取用户授权数据，不能写入 …」）。\n- **开发者工具必须声明 `dataAccessPolicy`**：纯计算或只读工具设 `retention: \"none\"`；只向当前聊天发送用户可见内容的工具设 `retention: \"conversation\"`；写数据库、文件或长期状态的设 `retention: \"durable\"`；访问第三方服务的设 `retention: \"external\"`。缺省按最保守的 `external` 处理。结果确定不回显模型参数时才设 `result: \"independent\"`；参数本身就是用户看到的卡片内容时设 `arguments: \"user-visible\"`。\n- **只读、删除记录、发送不带打开目标的小挂件引用不受影响**：`widget.list` / `read` / `readModule` / `deleteRecord`、`proactive.list` / `unsubscribe` / `unsubscribeAll` 都不新增内容；`widget.send` 不带 `openTarget` 时照常，带 `openTarget` 时会把 `state` 等内容写进消息，读过数据后拒收。\n\n这么设计是为了让用户撤销授权后，Runtime 不能再次读取原始数据，也不能把本轮原始数据写入长期业务状态。已经向用户展示并进入聊天记录的正文或题卡不会追溯删除。\n\n由此有两条实操结论：\n\n- **想让某个结论以后还在场，就在回复里说出来**（用户当场就看到）。运行时不管这一类，正文和题卡里的数字照留——用户已经看到过，档案里再抹只会让下一轮的搭子跟用户看到的对不上。\n- **不要把查到的数据往长期存的地方搬**。往 `memory` / `widget` / `proactive` 里写会被 Runtime 直接拒收；开发者工具未声明策略时按 `external` 拦截，声明为 `durable` / `external` 的工具既不能在已读数据后执行，也不能在自身执行过程中读取 DataAccess。直接绕过 Runtime 写文件或发网络请求不在工具 Gate 的控制范围内。\n- 只有查询结果真正包含 `available + data` 时才进入敏感状态；`notGranted`、`unavailable`、`disabledInGroup`、`notDeclared` 只是状态，不会误封后续操作。\n\n### 3.5 小挂件\n\n小挂件是会话里一块给用户看的结构化面板，比如一份菜单。建小挂件、读整个或一个模块、改标题、写记录、删记录，并把它发进当前聊天，模型和开发者代码都能做。平台不提供删除整个小挂件或跨会话分享的能力。\n\n**准备工作**\n\n一个小挂件是工程目录下 `widgets/` 里的一个子目录，目录名就是小挂件类型 id。\n\n```\nmy-buddy/                  工程目录\n├─ package.json\n├─ widgets/\n│  └─ menu/                类型 id 是 menu\n│     ├─ schema.json       每个模块写一句 description 给模型读，每条记录的形状是一份 JSON Schema\n│     └─ index.html        展示页面，单个 HTML 文件\n└─ src/index.ts\n```\n\n资料小挂件要重启进程，建议 watch `widgets/` 实时重启。\n\n`schema.json` 需要同时声明页面与 Agent 对每个模块能做的记录操作。旧 Schema 没有 `operations` 时，页面保持只读，Agent 保持原有记录 CRUD 能力。字段写 `readOnly: true` 后，页面创建或修改记录时不能写入或移除该字段；图片字段用 `format: \"media-id\"`，记录里只保存平台返回的 `mediaId`。\n\n```json\n{\n  \"description\": \"宠物档案\",\n  \"modules\": {\n    \"pets\": {\n      \"description\": \"一条记录是一只宠物\",\n      \"operations\": {\n        \"userUI\": [\"read\", \"create\", \"update\"],\n        \"agent\": [\"read\", \"create\", \"update\", \"delete\"]\n      },\n      \"record\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"avatarMediaId\": { \"type\": \"string\", \"format\": \"media-id\" },\n          \"createdBy\": { \"type\": \"string\", \"readOnly\": true }\n        },\n        \"required\": [\"name\"]\n      }\n    }\n  }\n}\n```\n\n`index.html` 不能直接访问平台接口或任意外部网络。页面通过平台注入的 `window.dadaWidget` 调用 `records.list/get/create/update/delete`、`media.pickAndUpload/url` 与 `close`；身份、令牌、Widget id 和会话 id 都由客户端注入并校验，不交给页面拼接。用户关闭页面后，平台会把本次记录变更聚合成一次不可见输入交给 Agent；不需要回复时 Agent 可以保持静默。\n\n**`conversation` 对象方法**\n\n| 方法 | 做什么 |\n|---|---|\n| `list()` | 列出这场会话里的小挂件，不带记录 |\n| `create({ type, title, idempotencyKey? })` | 新建一个，回 `{ id }`；同一个 `idempotencyKey` 重复建回同一个 id |\n| `read(id)` | 读整个小挂件，含各模块的记录 |\n| `readModule(id, module)` | 读一个模块，回 `{ records }` |\n| `rename(id, title)` | 改标题，id 不变，聊天里发过的卡片跟着显示新标题 |\n| `writeRecord(id, { module, recordId, data, expectedRevision? })` | 写一条记录，已存在就整条覆盖，回 `{ revision }`；带 `expectedRevision` 时版本号对不上，平台回 409 |\n| `deleteRecord(id, module, recordId)` | 删一条记录 |\n| `setPresentation(id, { summary, imageMediaId })` | 设聊天里卡片的摘要（不超过 500 字）和封面图，`imageMediaId` 传空串去掉封面 |\n| `send(id, { idempotencyKey, openTarget? })` | 发进聊天：可把这张卡锚到声明过的语义入口和具体记录；放进发送队列就返回，不等平台确认送达；同一个 `idempotencyKey` 重复发只落一条 |\n\n```ts\nexecute: async (toolCallId, params) => {\n\tconst { id } = await conversation.widget.create({ type: \"menu\", title: \"本周菜单\", idempotencyKey: `menu:${toolCallId}` });\n\tawait conversation.widget.writeRecord(id, { module: \"菜单\", recordId: \"2026-09-14\", data: { dishes: [\"红烧肉\", \"清炒时蔬\"] } });\n\tconversation.widget.send(id, {\n\t\tidempotencyKey: `menu-send:${toolCallId}`,\n\t\topenTarget: {\n\t\t\tversion: 1,\n\t\t\tentry: \"menu-day\",\n\t\t\tresource: { module: \"菜单\", recordId: \"2026-09-14\" },\n\t\t},\n\t});\n\treturn { content: [{ type: \"text\", text: \"菜单建好了。\" }], details: undefined };\n},\n```\n\n**模型工具**\n\n把要用的 `conversation.tools.widget_*` 放进 `initialState.tools`，模型就能自己建、读、改、发小挂件。\n\n- 工具说明里附上各类型的模块与字段，模型不用另外交代形状。\n- 类型可在 `schema.json.openTargets` 声明语义入口。`widget_send` 只发送 `entry + resource + state`，不让应用或模型拼 H5 URL；平台会校验入口属于该类型、目标记录真实存在，再把打开目标随消息保存。\n- 入口绑定某个模块时，`resource.recordId` 指向该 Widget 实例里已写入的真实记录；需要页签等纯展示状态时，在入口的 `state` JSON Schema 中显式声明，Runtime 会把允许字段写进工具说明。\n- 这场会话里已有哪些小挂件，平台会在消息里告诉模型。\n- 平台请求失败时，模型只看到「平台请求失败（HTTP 409），请查询最新状态后再操作」这类提示，不带具体原因。\n- `widget_send` 把小挂件放进发送队列就返回，不等平台确认送达。\n\n**限制与异常**\n\n- Widget 只属于创建它的一个会话，不能跨会话分享或转发；当前会话成员统一可编辑、可固定到首页。\n- 页面只能执行 `schema.json` 的 `operations.userUI` 已声明的操作；Agent 只能执行 `operations.agent` 已声明的操作。未声明的操作平台回 403。\n- `data` 要符合 `schema.json` 里这个模块的 `record`，不符合时平台回 400。\n- 平台回非 2xx、网络出错、超过 30 秒或响应超过 4 MiB 时抛异常，异常的 `status` 是 HTTP 状态码，不带平台给的原因。写操作不自动重试，失败后先读一遍真实状态再决定。\n- 这一轮读过用户授权数据之后，写入类操作（`create` / `rename` / `writeRecord` / `setPresentation` 及对应模型工具）抛异常；只读、删除、`send` 不受影响，见 3.4 的「数据只在当轮可见」。\n- 主动服务的回合里这些方法跟普通回合一样能调，运行时不按回合性质拦；要限制就在 `beforeToolCall` 里自己拦，见 3.6。\n\n### 3.6 主动服务\n\n让搭子在约定的时机主动找用户说话，比如每周一次复盘。目前主动服务仅支持私聊。\n\n1. 搭子按稳定 `key` 向平台创建或更新一条主动服务订阅，其中包含触发条件；相同 `key` 不会重复创建。\n2. 触发条件满足，且没被免打扰时段、冷却时间、每日上限拦下时，平台向搭子发起一次主动服务的回合。\n3. 模型判断要不要开口：要就直接写出发给用户的消息，平台在落库那一刻再过一遍闸门，过了才发给用户，拦下就不发；不要就输出跳过标记，这一轮到此结束，用户什么也看不到。\n\n**`conversation` 对象方法**\n\n| 方法 | 做什么 |\n|---|---|\n| `subscribe(key, request)` | 按稳定 `key` 创建或更新一条订阅，相同 `key` 更新原订阅并重新启用 |\n| `list()` | 当前会话的全部订阅，包括已关闭项 |\n| `unsubscribe(key)` | 关闭指定订阅，回是否找到 |\n| `unsubscribeAll()` | 关闭全部 active 订阅，回关掉几条 |\n| `isRunning()` | 现在是不是主动服务的回合 |\n\n它挂在这场会话的 `conversation` 上，凡是拿得到 `conversation` 的地方都能调：自己工具的 `execute` 里、`beforeToolCall` / `afterToolCall` 里、配置工厂函数体里。\n\n```ts\nawait conversation.proactive.subscribe(\"weekly-review\", {\n\ttitle: \"每周复盘\",\n\treason: \"在约定时间结合最近聊天做一次简短复盘\",\n\ttrigger: { type: \"schedule\", at: firstReviewAt, intervalMinutes: 7 * 24 * 60 },\n});\n```\n\n`subscribe` 的字段：\n\n| 字段 | 说明 |\n|---|---|\n| `key` | 必填，订阅的稳定标识：1～64 位小写字母、数字、点、下划线或横线，首位为字母或数字；相同 `key` 更新原订阅并重新启用 |\n| `title` | 必填，订阅名称，最长 100 字 |\n| `reason` | 必填，为什么要主动找用户，最长 500 字 |\n| `trigger` | 必填，什么时候触发：`workout.completed`、`sleep.ready`、`{ type: \"data.updated\", dataset? }`，或 `{ type: \"schedule\", at, intervalMinutes? }`。一条订阅只对应一种触发 |\n| `quietHours` | 可选，免打扰时段，缺省 `{ start: \"22:30\", end: \"08:00\", timezone: \"Asia/Shanghai\" }` |\n| `cooldownMinutes` | 可选，冷却时间，缺省 120，取 0～10080 |\n| `dailyLimit` | 可选，每天最多几次，缺省 3，取 1～20 |\n\n**模型工具**\n\n让模型自己决定是否订阅或关闭时，把需要的 `conversation.tools.proactive_*` 放进 `initialState.tools`，字段与上面那张表一样。什么场景可以订阅、何时只能查询或关闭，要在 `systemPrompt` 里说清楚：\n\n```ts\nawait BuddyServer.start((conversation) => ({\n\tinitialState: {\n\t\tmodel: \"kimi-k3\",\n\t\tsystemPrompt: \"你是跑步搭子。用户表达想坚持训练时，可以用 proactive_subscribe 订阅跑后复盘；用户要求关闭时先查询再关闭。\",\n\t\ttools: [conversation.tools.proactive_subscribe, conversation.tools.proactive_list, conversation.tools.proactive_unsubscribe, conversation.tools.data_access_query],\n\t},\n}));\n```\n\n代码订阅和模型订阅二选一或并用，产物都是一条订阅，只是谁决定何时订阅不同。\n\n**限制与异常**\n\n- 字段不合法、在群聊里调用，或同一用户对这只搭子已有 20 个 active 订阅时抛异常。\n- 关闭订阅时，尚未完成的主动服务会同步取消。\n- 这一轮读过用户授权数据之后，`subscribe`（含模型工具 `proactive_subscribe`）抛异常；`list` / `unsubscribe` / `unsubscribeAll` 不受影响，见 3.4 的「数据只在当轮可见」。\n\n**主动服务的回合，不允许使用部分模型工具**\n\n主动服务的回合里工具清单一个字都不动，平台工具和你自己的工具都照常执行，运行时不按回合性质拦任何一个。有时我们想禁用部分模型工具，比如一些写操作，可以使用 `beforeToolCall` 的钩子函数，用 `conversation.proactive.isRunning()` 能判断当前是不是主动服务的回合：\n\n```ts\nbeforeToolCall: async ({ toolCall }) =>\n\tconversation.proactive.isRunning() && toolCall.name !== \"read_plan\"\n\t\t? { block: true, reason: \"这一轮用户不在场，这个工具用不了。\" }\n\t\t: undefined,\n```\n","readmeFilename":"README.md"}