{"_id":"super-agent-sdk","_rev":"28-26b188d62822403cfdf9e0bd36ea6761","name":"super-agent-sdk","dist-tags":{"latest":"1.0.27"},"versions":{"1.0.0":{"name":"super-agent-sdk","version":"1.0.0","license":"MIT","_id":"super-agent-sdk@1.0.0","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"779c0e4617b6da46c6c01f03ac9d2db8b71606c3","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.0.tgz","fileCount":8,"integrity":"sha512-ae9wHMVOyOWaPnlF1wUjasQ6x6Pn8+KYH5BdsixgrQkV553sAUxbhOXfWzybSjdGNmZptX537w3PgmYJwtuF5Q==","signatures":[{"sig":"MEUCIE8yRxGVawBinQbKepYjlb+Uu56PhBB4fipXKl9+4w32AiEApqKPs4Hba3Xr3FztcGcSDDgWYYykfuCKIQRv7IhZDjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202045},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"1f2d03b7b14de85c694675af932cb9676e5a50b8","scripts":{"demo":"cd demo && npx vite","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.0_1786961511332_0.49016697959723854","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"super-agent-sdk","version":"1.0.1","license":"MIT","_id":"super-agent-sdk@1.0.1","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"ad83d1aec7d39b35c4f16b584d834443c9c741d3","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.1.tgz","fileCount":8,"integrity":"sha512-O3aX8ERbQc+k8gjZgBGWmLIMioFz1ZPlGAF0lQzVuJa9SWtMoG4XdUFMRimgpVoZd33TUVUF1otAggWi/nRYXQ==","signatures":[{"sig":"MEUCIQCj7M2oc9bthPBebxf/aaPtb2Rh6AZF4SL727rTgwm2GQIga9+Tb9j4HtRGrYFejhJhsPQcSI3Anfa46KohwDVxsa0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202028},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"1f2d03b7b14de85c694675af932cb9676e5a50b8","scripts":{"demo":"cd demo && npx vite","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.1_1786961765905_0.5441332867761006","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"super-agent-sdk","version":"1.0.2","license":"MIT","_id":"super-agent-sdk@1.0.2","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"5debdbd0a5d5d7fc8fc9801571a2f51c197a19bd","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.2.tgz","fileCount":8,"integrity":"sha512-oO+BMl4xC+DmztBAxDilzaT7EzD0E/VJ/xNmwuLBSPjOLURI2P+wnX0ILXUisHDDa1YnjrD3jxEL71+s81c1jg==","signatures":[{"sig":"MEUCIQDU2dC3CSK/ltvJGMIczEwjIh6+y4ApREExhAlrdR+RbwIgWDsn5Zw0My6NyIlwPpvLkcfkYihblq9Pfuk65sKuq1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201477},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"ecc399c663d1bac5cbb07ba9547c03d5888d0b67","scripts":{"demo":"cd demo && npx vite","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.2_1786962812167_0.18804526789860931","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"super-agent-sdk","version":"1.0.3","license":"MIT","_id":"super-agent-sdk@1.0.3","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"aeb8918cd166d12c9a4bc2e3dbf948ed74017b7b","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.3.tgz","fileCount":8,"integrity":"sha512-tlUGRITDcGW7O90zOlbA0DJn+KvHUR8KGGtTp0/BqyEkqv94vLfDYCEfkrQd7iCs8XEA7rQ2xdjVYnB3yVwhyA==","signatures":[{"sig":"MEUCIQDsMnYyNq38Bn4foVsBwdqarU1mkGfXV20zHCpkF2pxUAIgWg6Sq5FfjR9xEDcxp/Ow5nPpJDzJy4vgQuayn+Uvyrs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203317},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"ecc399c663d1bac5cbb07ba9547c03d5888d0b67","scripts":{"demo":"cd demo && npx vite","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.3_1786963640097_0.1331035407935688","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"super-agent-sdk","version":"1.0.4","license":"MIT","_id":"super-agent-sdk@1.0.4","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"a899c3b6cf8bcc13f3ef49cf40564a18736d3f86","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.4.tgz","fileCount":8,"integrity":"sha512-USNJ77tPP1yYkDAU3pgrljpWgjJoj9CzZoa5KxEQJkNS7n2B88r4L6PhrlCbL9dbXwtLLuWNuXtsvVyGOcAY+w==","signatures":[{"sig":"MEYCIQD+FggenEdzrvUOSFvO7TbdP9xqlMPIa1GPSlzZGX5xugIhAIPk0XiJz+SnyVWp4CbFgU3YPf2PhAr8mN9hOmhNDpP3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":237441},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"815f702c65c9e990f3ef1d0a0546fda8cc889f80","scripts":{"demo":"cd demo && npx vite","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.4_1787105826195_0.77378964096219","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"super-agent-sdk","version":"1.0.5","license":"MIT","_id":"super-agent-sdk@1.0.5","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"c2a0dd0bd4d529bd9ceb0a8292f1d542b585fc0c","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.5.tgz","fileCount":12,"integrity":"sha512-JFMaeMNKvxTQTWcKdpN4n9QvDoYyXw6A+/prfO6T43oZc9AysoNs7reShe98E4PMs4tnjxJmRWJgy5OAfeG07g==","signatures":[{"sig":"MEQCIHOOO4V8CqsGHt/FAvZ1vxDX9QAL9rkWBuWjUvHaICHRAiAWsnIfXWzXOczViYIb8tSPiBMUFFFUvfFlE0eRRGqaRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1635555},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"25e1abc23c2a0e4ae15de910ffa57556ea2f0cd3","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.5_1787901777812_0.541298443945414","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"super-agent-sdk","version":"1.0.6","license":"MIT","_id":"super-agent-sdk@1.0.6","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"5c34945980d919f6e457297ca6c991afc7e9e2fd","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.6.tgz","fileCount":12,"integrity":"sha512-RcGNJC09C6dLdcsFEBkDTkFH52PMFTOnS3MPBa3J2zlpmppmtUiTGYGOwb4cCeRChaNJcuP2d1nSF2q62Rp0IA==","signatures":[{"sig":"MEQCIAMb15GYXnm6nVrN1/aEQe21p4fgn6j0t9pSKATWROEJAiAyHslWJGX3Dxn5rTv68wC42OoI7kL10abEwqG/1+mE+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1637305},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"25e1abc23c2a0e4ae15de910ffa57556ea2f0cd3","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.8.2","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"20.19.3","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.6_1787904918488_0.9528079840511403","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"super-agent-sdk","version":"1.0.7","license":"MIT","_id":"super-agent-sdk@1.0.7","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"586c7101b8089cdadf6e81ef815d41c6fb95a2a7","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.7.tgz","fileCount":12,"integrity":"sha512-Ck06Rx/yosEk6Rn/h36LxVB7/n0As0Eu7gnObNHlveXhaaH2Yp/0bAX8nK3JryDG0icdc1r/YgiqNDSliL9qMQ==","signatures":[{"sig":"MEUCIDxbYlrFK3/dbc7kle1FOC6mp55Mcc+O2XGsqea3NBRsAiEA5AadGxLAXjjoCsa+T6lV+B/uuMbrbTn52JEmSn+x9QE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1675045},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"e76bb26edb1d6f75a01bd97b4013a6e958dbd864","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.8.2","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"20.19.3","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.7_1788161872052_0.9939186976893069","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"super-agent-sdk","version":"1.0.8","license":"MIT","_id":"super-agent-sdk@1.0.8","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"85b4fb7842fb0634c63d7e9318a7f6188497c365","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.8.tgz","fileCount":12,"integrity":"sha512-owMBXdxXMpQbHfau0XVMfXFh1NgYJGc23e2MHdPkrTItpsyXUykmDDunzOvPOf1N3J4iQP5JtZlZv71UjSpW3A==","signatures":[{"sig":"MEUCIFMWhTfCOPqV6G8N9ehdJbv6k6+1ai9e5826VXB/bKODAiEAg0IkJZi+mpx6lxqATd+a0bQE6dRCi7jca/sRcshZ0/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1690498},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"65162ed2b5ee0365297629d97d0c3fb064300463","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.5.0","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"21.7.3","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.5.0","@types/react":"^18.3.0","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.8_1788314607537_0.5816037149288724","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"super-agent-sdk","version":"1.0.9","license":"MIT","_id":"super-agent-sdk@1.0.9","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"f22844259aaffd3d24320036e0e322144f7a7a9f","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.9.tgz","fileCount":12,"integrity":"sha512-YOYv7XyVOZNXAKEtMDrpwQ+HVf+B0YR0BMKvOxfFafTVGv+l6dSWUJtdyw9UsRkiyIHVZK1lju18KIRcyEPnmA==","signatures":[{"sig":"MEUCIQC5aEU07axUiV5oBuJA4h7IuzD1GELtpnnqbXEmtH1skwIgWR/+WzrugF+Gy/8m5tENZP10gy4QqoTjoWAUKlpKve8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1743737},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"21fa01f02882cc4a70fad6c9470c7d66e712690e","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.9_1788343411121_0.035181561696455255","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"super-agent-sdk","version":"1.0.10","license":"MIT","_id":"super-agent-sdk@1.0.10","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"e8f3aa1996b6bd9a119112161261ab6f87362117","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.10.tgz","fileCount":12,"integrity":"sha512-blPkbbcGUKZl39jhZ9UGHUPZ3iW0jdxUMcRdwr1dSOMJwzhxSWXAS44Z7Dzc9PR+ds3vG9t1I7H7NKX4hjUJpw==","signatures":[{"sig":"MEYCIQCaq1fbdBdEcAa2MbbMr0zcKHX+pwj4Wj4OAi7qop4mpQIhANUlknRmT3M+9KS+QNl/Ei4EKWA512dpPd+em8W9Xrwb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1765146},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"09c4c76bbdf26d56e217de20145de6724060c33e","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"mammoth":"^1.12.1","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","vite-plugin-dts":"^4.0.0","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.10_1788486988214_0.3857785436239449","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"super-agent-sdk","version":"1.0.11","license":"MIT","_id":"super-agent-sdk@1.0.11","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"9294a16e8ca438ea8c622984f930713c0d8dc626","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.11.tgz","fileCount":14,"integrity":"sha512-tVfMJlEb7jdESuSU84uogmZNomkP1tt6Chg+tnYpUInKabz6gf2VwpiCyV84VeuTzCcsYvaoUcltqXRgC0ABbw==","signatures":[{"sig":"MEUCIQDDkyzId5vIWgvaqbV1nyZVz0Qy7X0CqU9w3KItZq/8rgIgNpVTquSd6qgGwdqevBpiISQJ8eMSJYlg5CiWQ2zQmlA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2082687},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"50b22d43427aa2f2911b4ff3c3be9eacb72354a2","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.11_1788745472066_0.9196451352731918","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"super-agent-sdk","version":"1.0.12","license":"MIT","_id":"super-agent-sdk@1.0.12","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"aa985f9922db4081ae3ab50313943af423c3d94e","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.12.tgz","fileCount":14,"integrity":"sha512-EsJ+4Un2zg5IlHH1bMv8ueAAzfb1b4pUd1n1II55vle4tbnVCa4yCrhiaWTiPywSr/lLEV2KBo+2Xha+vSGIjg==","signatures":[{"sig":"MEQCIF4oNbjmTg4QufXRixKXvMxkA0I/A1uLP1uIOwd6aaI2AiARrcA41zK8Gm81GlnHMvzC5NdFCbsjfp4+bpibxiP+oA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2493335},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"25712b092f81cd7152026b67af97812845687c7f","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.12_1788761005225_0.39656320698282976","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"super-agent-sdk","version":"1.0.13","license":"MIT","_id":"super-agent-sdk@1.0.13","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"47df15bc4ff2e2b7d9e92264d9fc7b804aa3f714","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.13.tgz","fileCount":14,"integrity":"sha512-Qh8fX170pEjjtjXtC2CSFRHm7fW/GlG6vzBcygaj08RuoXshtfu3ar0EArkfGL4fRhUFGUViJw2hFjqt8KCBhg==","signatures":[{"sig":"MEYCIQDOJZlLPlEKJFIeKA2QZcwmCkxqwrHCzeDTbzVOR4NOTwIhALJMWGXp469OKjjg4Gfb6b7Bjocjlmp2W7J+5TIMQB78","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2494797},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"696ee0d8948d37e89c3385ff9130bf1f8c7cfec8","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.13_1788766316259_0.7509946178066866","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"super-agent-sdk","version":"1.0.14","license":"MIT","_id":"super-agent-sdk@1.0.14","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"51771ec3de85f2b74f69d6b70a67655872cff2cb","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.14.tgz","fileCount":14,"integrity":"sha512-aoZOhFgyYlICtvXigKiCdwoxGZqO1C1gY1T+FL0jp6DCEYv1C31221aYqaKwjBuZUjWHH6zENi4Yuguft6Dexw==","signatures":[{"sig":"MEUCIFRVzKkQSkF0q7xU+syfRC57lLsSHTqU0P1grGX3Hm1VAiEA+I/Qhm23/v4XJikii8Jtz2M+bPHj2dUJC5vLsgs8jVs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2497392},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"df3bed6d35268951c551dcc1f60186d9570a24be","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.14_1788769772675_0.3287519023175576","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"super-agent-sdk","version":"1.0.15","license":"MIT","_id":"super-agent-sdk@1.0.15","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"e0dd397601baa1820142313fd35ac1924f181480","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.15.tgz","fileCount":14,"integrity":"sha512-uywkd30EnDTFsi5JR9wyFot5eZq/Bjk9dA/9aP0aaz8CujYzJHgeso+FtDBrfX/AJN6eGNIXemRCfkpFHO07wA==","signatures":[{"sig":"MEUCIEEIdtq79SATTLdkqcwEPXriB71O9hPw/dLHUQV+fcxAAiEApOC4VktvikGCj4lTlQOkAbj0xbatqxrAgWa8XwCDqBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2499791},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"87bddd3ac6a1e7645f947c805d594af90c987ed0","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.15_1788773730788_0.7627262430696897","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"super-agent-sdk","version":"1.0.16","license":"MIT","_id":"super-agent-sdk@1.0.16","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"5a1ecbaf4da57d5d53070b2da23f508efe16a86e","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.16.tgz","fileCount":14,"integrity":"sha512-ZUtGl7sacXd6koWHgj2Q0H9ZXDuycFP5J/imtP4djrLCCNL9RcckOSnx8YIMpUR3NTWjCfZwKwy2t/jVQpDrnQ==","signatures":[{"sig":"MEUCIH2ZrNxpEB6eCV9wCvDQzsQwpj6F7YcBRUQZbpOsGq2kAiEA3xxmx1KK/aBiDEurENjvrJuri+OaMpjdAMdn3PtpJ5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2503770},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"b31074a47c86b73387660e117ac596ef0bb3c0ff","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.16_1788948184227_0.12587038163421904","host":"s3://npm-registry-packages-npm-production"}},"1.0.17":{"name":"super-agent-sdk","version":"1.0.17","license":"MIT","_id":"super-agent-sdk@1.0.17","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"7fd7aa2f0e9a763001fcff0226a655e8730aa07f","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.17.tgz","fileCount":14,"integrity":"sha512-U8kYits1OBW6NWm932GchqPqxhTcLx0bwXu62hnbsNvJyP7jF0hWgZYP3+g5yRXgRlHTJbz5NA6r6UDHKP7bhg==","signatures":[{"sig":"MEUCIDkjNqwMOqneJlZVNOLMEEWVZl00WBG05RUFA8brDV5PAiEAmbrva5RcILYMvXelDqukZWkrg1+suhehtpWYJIgwVy0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2513120},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"9d075f9d22332c41e0c014cf6ebc04586d36acee","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.17_1789026805260_0.9902358783684844","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"super-agent-sdk","version":"1.0.18","license":"MIT","_id":"super-agent-sdk@1.0.18","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"c386bc515176ddb9f90dc03c2fc0658d50455b8c","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.18.tgz","fileCount":14,"integrity":"sha512-GcU4tAgS4RoULqpiRpPeXF7LySlXbSBVi+7ZBQB4QTRKsRCh5t3MzLKqnX0vRGGu8q6S6XbtzxFtpo/jHGrp/Q==","signatures":[{"sig":"MEQCICaE1VrbLC9TjVSkGCfBetl0sFRKal/bQ/o1XGOcgOeYAiA9yrRdt+VmZRqc6NdhVWYRKvNMy6YmxxoVNIsb8YZhMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2514659},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"ab6959c9eb6bb5a950acd197613115df21dad2dd","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.18_1789035904271_0.2196516203815999","host":"s3://npm-registry-packages-npm-production"}},"1.0.19":{"name":"super-agent-sdk","version":"1.0.19","license":"MIT","_id":"super-agent-sdk@1.0.19","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"cca638674cc843994dd25770c07eadfde8488648","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.19.tgz","fileCount":14,"integrity":"sha512-er5ksI32eIlP8LzxBRjQC7I1gAgmaegk1Dck0XMieOmwddJcYPJRsOZJen0bi91721JHDMEb0w7HtTbVBPXOlA==","signatures":[{"sig":"MEYCIQC5VodRt+Jxmu37HFpncNUUvGMs/y4Ouj915hSaBBfTkAIhANF+CVNCKYfcDFpwNswD0c2SuKNdP8ArPHvfBwrJPbr7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBnvo/1c+IUBadvc8nBQAhb2HV9dLmuc3ig+C7o01X8fAiBPFN7n/xduLvJvjDZnfO8EO4Vdmzc3hKzjCJKWrmSRKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2530817},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"7642bfd7746d36654ad634868cfd660f363f781b","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.19_1789350819772_0.21034070442260666","host":"s3://npm-registry-packages-npm-production"}},"1.0.20":{"name":"super-agent-sdk","version":"1.0.20","license":"MIT","_id":"super-agent-sdk@1.0.20","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"347e5abb058a29554ab38a016d6d8e7ec59b503f","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.20.tgz","fileCount":14,"integrity":"sha512-Q07lmkFRTKu12kVJQW9pecUeJQdmlJTsWpLy5kEhdwMLNK8pr/knH0AZ6/bkMtRihF6ha6TFBQlLmafihgxQ9g==","signatures":[{"sig":"MEUCIHMUMrUQfZk8/szz9LM8OS2BThXQUbth2VV9e8SrdpnVAiEA3Jd1DyZbGiWB+rKtceXGvfnrBpKtEd7d3+okMBKhDYE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC1dao7arGGpmE5NtwTdYFGH8bB70KRIW98xBkqdAJDsgIhAL+nF+9/sf15MChe7mX9Rq9XVtkoSSodo4xgyE+gFRjm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2532935},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"d394d4c4a31c310d3f7bfc32bae12caa0bb078b9","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.20_1789438571413_0.45852902524810024","host":"s3://npm-registry-packages-npm-production"}},"1.0.21":{"name":"super-agent-sdk","version":"1.0.21","license":"MIT","_id":"super-agent-sdk@1.0.21","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"0b57f07b44c2dba3f13dc9936a84a7db0631bf5b","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.21.tgz","fileCount":14,"integrity":"sha512-zo+09TVCRq+VLqeoUhYZipQvY74xo3AxXzreSt8Fe8RcAUpZ10DZOZN8eVVsn8DEfolpSDxIOHgAWX9zuQ1lqA==","signatures":[{"sig":"MEUCIQD6GdWftPmMFfuFYBrix8K9mb/HHbjJ2TDKjtJr98yQdQIgISkRJcw8lP/CdZR/Np+oQdUrtp5aIsSR4eH+8mXVAYc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCyp1Ht9q7CIv/T/N1F/khVfFBt008FMCfbOHMzsOZ7vwIgElZX+/kAXNQKyZ6ktSQFHIGyxjj0bfuOXVYX5jHXrGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2547388},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"b6c7402e021e986ddb34dccda32f937fe27f6cfc","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.21_1789537887692_0.3425631146298531","host":"s3://npm-registry-packages-npm-production"}},"1.0.22":{"name":"super-agent-sdk","version":"1.0.22","license":"MIT","_id":"super-agent-sdk@1.0.22","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"291f38e4f8286f4a5f8b371f6826746cef7a430f","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.22.tgz","fileCount":14,"integrity":"sha512-Ld8618ea2b8mItdHXpKLL4eJgvgMEVOCcnjZSeiEY0UslmT/QH9U3ObIrig/Es4zk08mCtMPYZrBFQ39OHjSlg==","signatures":[{"sig":"MEYCIQCxBHlds1qjDOLJvaizjxYPIX1Sn/yvw1Cnu4HALyW9FQIhAKEodaQ1YDvxDKEGgYqvZq8KqR78StzBf5Wm7xlH5UV8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID19tUFceLn/bojgukXUU++qNN146eAmByVS5sYp6fq4AiEAjLlUhEWj3BkWgM2181NER2JsbH1h1od3O1wL6KAJx88=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3627480},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"755c8da7f0593b38e58fe4217b4afa4fb7363028","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.22_1789866830511_0.7634332688386345","host":"s3://npm-registry-packages-npm-production"}},"1.0.23":{"name":"super-agent-sdk","version":"1.0.23","license":"MIT","_id":"super-agent-sdk@1.0.23","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"510b1133ea0944e7873fa50c319cbbd48423f987","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.23.tgz","fileCount":14,"integrity":"sha512-fyk+hxmT5R8mNV1hCUbVRyjlZ+BGZFk4gQnaVG3eskVcLJBK1YfmGlWVozUPec7PmftpjwEhZciAAPxAjSvDQQ==","signatures":[{"sig":"MEYCIQD8m6xTdoEqCmcUrvKFAfeINazLEuTc4FBbRARltp5W/wIhAJfC5ShPjase+9ikfVAD7ffCwD8/qk4Cm9FoDg07geN0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEZo4FmYhbKhne8bX9JAkuU9MnhTO9ry6Lp+9yiE/cTmAiAJDyZnDpLtZyGdHhcwD3yhwnNFa3KrIbj/qva6G5inXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3630040},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"9eba1ba22a942072202d43c194e0c5b67a6f6982","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.23_1789886093552_0.2477744299763649","host":"s3://npm-registry-packages-npm-production"}},"1.0.24":{"name":"super-agent-sdk","version":"1.0.24","license":"MIT","_id":"super-agent-sdk@1.0.24","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"a02c931f91f75caaa8f1a4dcd7670c4ccd2b7161","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.24.tgz","fileCount":14,"integrity":"sha512-oNsKZhkvBzbP23TNhnukcFO16GRQ5LBihQbpmBY5buB0t6GGFl5QKLp/dNbTXhrTctpZDNjfFaQpMCc0SYAByA==","signatures":[{"sig":"MEUCIFp78jQpwuC60Jm0vrBN0u5OK2MFrlf7bubdOwZKmMi7AiEAycc0fs/D36LrFL2QrSnFLjliO9z8Fjet7zsgjf/s3H8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDpy2n44vW3JvxIN61TisI9ntQXaueIf1H5I+XKohPa0AIgcRVbmCbFmHUat+qWDrABgX/4SQHv9K4rHMCvCBukKwU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3642059},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"a93d3d5bbaeb5b2332d0d3c87c29511aa411d801","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.24_1789903917805_0.21827662357202793","host":"s3://npm-registry-packages-npm-production"}},"1.0.25":{"name":"super-agent-sdk","version":"1.0.25","license":"MIT","_id":"super-agent-sdk@1.0.25","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"d0befcd944b1923ca8a9056c2e0565a0c77ac641","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.25.tgz","fileCount":14,"integrity":"sha512-DHPprkitA6tX/wOJ3za6YA3Z4/QtRqG1Pk6QKLCwaYRTYScmNqu5FpC/14T/nvyyKR8YnbvrW1oRl4lnQg03Lw==","signatures":[{"sig":"MEQCIDRMiHGJilGIQFV2XuRdy8d6xEy5IotSxU07tK5NVqevAiAmuzna2p832xJcZBvJxqT1kIHsQZvHv2lMR4J4nJ9s+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCfQABn1Dfp2p4mGmsrozk7CuWy6n0/KEkjuWl0kMlb9AIhAOPttMdQ9Ao+Z1f+SVMIUUnleog8y0Wz6iP0Ozm3s4JB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3642529},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"d1fef21382b319fa01ab5801229181ce8077f65a","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.25_1789974636449_0.4418309382301788","host":"s3://npm-registry-packages-npm-production"}},"1.0.26":{"name":"super-agent-sdk","version":"1.0.26","license":"MIT","_id":"super-agent-sdk@1.0.26","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"dist":{"shasum":"c249f87cc5485961fd332a1531da3cf911110e01","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.26.tgz","fileCount":14,"integrity":"sha512-5JlbhkgDKiq25Gj4PoqiqZ0Kkm+XX3Z7eMRZhIOAt/Sm4UpTmfeSCoKQgR4Lvs/SwEqDqT5a/ca3CDIzltq2gA==","signatures":[{"sig":"MEQCIBsn2UVUZQWs0MUwHeQDFok8PGYYdiVUDBeIvHJB6owGAiBgxTm/6/hrg009nsFoVaOgMGjxbSAYNGnjw1hhPA/F+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDsa4hNRirs7qzj38Z8nmncBwcOKzL8MkF9440+gICGsAiEAlDi6NjPoNcpomcNh0a1t2HtWxNV6cikmmwyOr8J/6bk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3642515},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"d0e8aeace15b8a22cf12c652e5508bf3c57d94ea","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/super-agent-sdk_1.0.26_1789981852928_0.4616390006363602","host":"s3://npm-registry-packages-npm-production"}},"1.0.27":{"_id":"super-agent-sdk@1.0.27","dist":{"shasum":"f5446c3e26becfe4653259cf5770dfcc93d71c93","tarball":"https://registry.npmjs.org/super-agent-sdk/-/super-agent-sdk-1.0.27.tgz","fileCount":14,"integrity":"sha512-HrF/zEeeHgvCTP2nkDsOSz6Z8ElExiHahnCWoezh/hK2FdcvNDnTJVW/aRp1zb0NEjtH12W8GJWt+AMMcPhGXQ==","signatures":[{"sig":"MEUCIGSh3L3KbZVHbKISDI6PZM7EYcN8PDFeCjpkB7F1KNb+AiEAtLwMISX30HNshyI0dBVE39/xvS7LyZuXYeBYfIUBVdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDfV8WkdENiZv5/t4xeLcMDkhhSDCoCFNgJlPwoU5o1FQIhAOOVSm2BE4WRKCf7yj2Yx9apyWsh02+tMQJN0goqf/hQ"}],"unpackedSize":3655601},"main":"./dist/index.cjs","name":"super-agent-sdk","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./widget":{"types":"./dist/widget.d.ts","import":"./dist/widget.mjs"}},"gitHead":"7ade1953a28075acdf1514323b95e11de7322488","license":"MIT","scripts":{"demo":"npx vite --config demo/vite.config.ts","mock":"tsx demo/mock-server.ts","build":"vite build"},"version":"1.0.27","_npmUser":{"name":"itiswell","email":"itiswell@163.com"},"_npmVersion":"10.9.4","description":"Super Agent Web SDK — API + 嵌入式聊天组件","directories":{},"maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"_nodeVersion":"22.22.0","dependencies":{"antd":"^6.6.4","jquery":"^3.7.1","mammoth":"^1.12.1","crypto-js":"^4.2.0","dompurify":"^3.4.14","remark-gfm":"^4.0.1","@ant-design/x":"^2.9.0","react-markdown":"^10.1.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319","devDependencies":{"tsx":"^4.0.0","vite":"^5.4.0","react":"^18.3.0","postcss":"^8.5.26","react-dom":"^18.3.0","typescript":"^5.5.0","tailwindcss":"^3.4.19","@types/react":"^18.3.0","autoprefixer":"^10.5.4","@types/jquery":"^4.0.1","vite-plugin-dts":"^4.0.0","@types/crypto-js":"^4.2.2","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/super-agent-sdk_1.0.27_1790049190998_0.6831280382052218"}}},"time":{"created":"2026-08-17T10:11:51.281Z","modified":"2026-09-22T03:53:11.319Z","1.0.0":"2026-08-17T10:11:51.506Z","1.0.1":"2026-08-17T10:16:06.051Z","1.0.2":"2026-08-17T10:33:32.327Z","1.0.3":"2026-08-17T10:47:20.238Z","1.0.4":"2026-08-19T02:17:06.369Z","1.0.5":"2026-08-28T07:22:58.023Z","1.0.6":"2026-08-28T08:15:18.636Z","1.0.7":"2026-08-31T07:37:52.202Z","1.0.8":"2026-09-02T02:03:27.735Z","1.0.9":"2026-09-02T10:03:31.249Z","1.0.10":"2026-09-04T01:56:28.356Z","1.0.11":"2026-09-07T01:44:32.234Z","1.0.12":"2026-09-07T06:03:25.403Z","1.0.13":"2026-09-07T07:31:56.427Z","1.0.14":"2026-09-07T08:29:32.827Z","1.0.15":"2026-09-07T09:35:30.967Z","1.0.16":"2026-09-09T10:03:04.418Z","1.0.17":"2026-09-10T07:53:25.446Z","1.0.18":"2026-09-10T10:25:04.458Z","1.0.19":"2026-09-14T01:53:39.899Z","1.0.20":"2026-09-15T02:16:11.537Z","1.0.21":"2026-09-16T05:51:27.813Z","1.0.22":"2026-09-20T01:13:50.647Z","1.0.23":"2026-09-20T06:34:53.752Z","1.0.24":"2026-09-20T11:31:57.917Z","1.0.25":"2026-09-21T07:10:36.570Z","1.0.26":"2026-09-21T09:10:53.018Z","1.0.27":"2026-09-22T03:53:11.135Z"},"license":"MIT","description":"Super Agent Web SDK — API + 嵌入式聊天组件","maintainers":[{"name":"itiswell","email":"itiswell@163.com"}],"readme":"# super-agent-sdk\n\nSuper Agent Web SDK —— 为 `super-agent-service` 提供的一站式浏览器端集成方案：既包含纯 JS 的 API 调用层（鉴权、SSE 流式解析、会话与消息接口），也包含开箱即用的嵌入式 React 聊天组件。\n\n## 目录\n\n1. [概述](#1-概述)\n2. [安装](#2-安装)\n3. [快速开始](#3-快速开始)\n4. [SDK 初始化](#4-sdk-初始化)\n5. [API 参考](#5-api-参考)\n6. [聊天组件](#6-聊天组件)\n7. [展示模式](#7-展示模式)\n8. [定制化](#8-定制化)\n9. [会话管理](#9-会话管理)\n10. [中断恢复](#10-中断恢复)\n11. [消息类型](#11-消息类型)\n12. [Human-in-the-Loop](#12-human-in-the-loop)\n13. [高级用法](#13-高级用法)\n\n---\n\n## 1. 概述\n\n`super-agent-sdk` 提供两个入口：\n\n| 入口                     | 说明                                                     | 依赖       |\n| ------------------------ | -------------------------------------------------------- | ---------- |\n| `super-agent-sdk`        | 纯 JS API 调用层，封装鉴权、SSE 流式解析、会话与消息接口 | 无 UI 依赖 |\n| `super-agent-sdk/widget` | 可嵌入式 React 聊天组件                                  | React 18+  |\n\n核心能力：\n\n- **纯 API 模式**：`createSuperAgent()` 返回轻量 SDK 实例，提供流式聊天、会话列表、历史消息、Token 刷新等能力。\n- **嵌入式组件**：`mount()` 挂载 React 聊天组件。\n- **两种展示模式**：`floating`（右下角气泡 + 弹窗面板）与 `fullpage`（整页 DeepSeek 风格布局）。\n- **Markdown 渲染**：内置 `react-markdown` + GFM（表格 / 任务列表 / 删除线），Claude 风格排版，默认转义防 XSS（见 [6.3](#63-markdown-渲染ai-消息)）。\n- **会话持久化**：自动加载会话列表、`localStorage` 记住最近会话、刷新后自动恢复。\n- **附件上传（NOS 直传）**：内置 NOS 直传（分片 + 断点续传 + 进度），📎 选文件随消息发送，沙箱 Agent 可读取文件内容（详见 [5.12](#512-createnosuploader) / [6.1](#61-mount)）。\n\n---\n\n## 2. 安装\n\n```bash\npnpm add super-agent-sdk\n```\n\n纯 API 模式无需任何额外依赖。若使用聊天组件（widget），需同时安装 React：\n\n```bash\npnpm add react react-dom\n```\n\n> `react` / `react-dom` 以 `peerDependencies`（可选）声明，版本要求 `>=18.0.0`。\n\n---\n\n## 3. 快速开始\n\n最简 5 行接入：\n\n```typescript\nimport { createSuperAgent } from \"super-agent-sdk\";\nimport { mount } from \"super-agent-sdk/widget\";\n\nconst sdk = createSuperAgent({\n  botCode: \"tech-researcher\",\n  tokenGateway: \"/api/gateway\",\n});\n// Token 自动获取，无需手动设置\nconst widget = mount(\"#chat\", { sdk });\nwidget.open();\n```\n\n挂载完成后，页面右下角出现聊天气泡，点击展开面板即可开始对话。\n\n---\n\n## 4. SDK 初始化\n\n```ts\nfunction createSuperAgent(config: SDKConfig): SuperAgentSDK;\n```\n\n```ts\nexport interface SDKConfig {\n  botCode: string; // Bot 业务编码（必填，bots.code，跨环境稳定）\n  tokenGateway: string; // Token 网关前缀（必填，不带 host），如 \"/api/gateway\"；token URL = {origin}{tokenGateway}/superagent/v2/token/generate\n  baseUrl?: string; // 业务接口前缀（可选，默认 \"/api/agent/runtime/v1\"），不带 host\n  appId?: string; // 可选，不传则从 token 接口响应自动获取\n  token?: string; // 可选，不传则自动调 token 接口获取\n  tenantId?: number; // 可选：token 网关需租户上下文时传（如 Playground 走 admin 网关），fetchToken 带 X-Tenant-Id 头透传；自建公开网关不传\n  loginUrl?: string; // 可选：cookie 失效重登的兜底跳转页（agent 含 COOKIE 工具时 runtime 校验 cookie，失效 401 cookie_expired）\n  onAuthExpired?: (ctx: { loginUrl?: string; sessionId?: string; botCode: string }) => void; // 可选：完全自定义重登（如带 returnUrl 的 SSO），提供则 SDK 不自行跳转\n}\n```\n\n只需提供 `botCode` 与 `tokenGateway` 即可。`baseUrl` 默认为 `/api/agent/runtime/v1`，`appId` 从 token 接口响应中自动获取。SDK 不要求在创建时传入 `token`——组件挂载后会自动调用 `sdk.getToken()` 获取 token 并内部保存，无需手动设置。`getToken()` 自带并发去重：多 widget 共享同一 sdk 实例时，并发取 token 合并为一次签发请求；业务接口 401 时自动清缓存重签并重试一次。\n\n```ts\nconst sdk = createSuperAgent({\n  botCode: \"tech-researcher\",\n  tokenGateway: \"/api/gateway\",\n});\n```\n\n凭证获取流程：\n\n```\ncreateSuperAgent({ botCode, tokenGateway })\n        ↓\nWidget 挂载时自动调用 sdk.getToken()\n        ↓\nPOST {origin}{tokenGateway}/superagent/v2/token/generate（body: { botCode }）\n        ↓\n后端返回 { token, appId }\n        ↓\nSDK 内部自动保存 token + appId\n        ↓\nready\n```\n\n`tokenGateway` 用于拼接 token 接口路径，`appId` 自动从 token 响应获取（也可手动传入覆盖）。\n\n**cookie 失效重登**（agent 含 COOKIE 工具时）：runtime 入口校验浏览器 cookie，失效返回 401 `{code:\"cookie_expired\", data:{login_url, session_id}}`。SDK 暂存 pending 消息（含 botCode）后跳转重登（优先响应里的 `login_url`，其次配置的 `loginUrl`；提供 `onAuthExpired` 则完全交宿主处理）；重登回来后 widget 恢复同一会话（botCode 定位）并自动重发暂存消息。\n\n---\n\n## 5. API 参考\n\n> **字段命名**：后端接口返回 camelCase 字段，SDK 直接使用，无需转换。\n>\n> - 后端返回 `sessionId`、`createTime`、`updateTime`（bot 外部标识统一 botCode，SDK 不消费内部 id）\n> - SDK 所有公开 API 均使用 camelCase\n\n### 5.1 SDK 实例\n\n```ts\nexport interface SuperAgentSDK {\n  readonly botCode: string; // 当前 Bot Code（bots.code，跨环境稳定）\n  createSession(): Promise<string>;\n  chat(options: ChatOptions): AbortController;\n  listConversations(\n    params?: ListConversationsParams,\n  ): Promise<ListConversationsResult>;\n  renameConversation(sessionId: string, title: string): Promise<void>;\n  deleteConversation(sessionId: string): Promise<void>;\n  getMessages(sessionId: string, options?: { isToolCallVisible?: (toolCode?: string, toolName?: string) => boolean }): Promise<UIMessage[]>;\n  getToken(): Promise<string>;\n  setToken(token: string): void;\n  feedback(\n    messageId: string,\n    type: \"like\" | \"dislike\",\n    options?: { reason?: number; remark?: string },\n  ): Promise<void>;\n  cancelFeedback(messageId: string): Promise<void>;\n  respondInterrupt(\n    interruptId: string,\n    sessionId: string,\n    response: InterruptResponse,\n    onMessage?: (event: ChatEvent) => void,\n    onError?: (error: Error) => void,\n  ): Promise<void>;\n  listSkills(): Promise<SkillInfo[]>;\n  stopGeneration(sessionId: string): Promise<void>;\n}\n```\n\n### 5.2 createSession()\n\n创建新会话，返回 `sessionId`。聊天前必须先创建会话。\n\n- SDK 调用 `POST /chat/sessions`，请求体为 `{ botCode }`\n- 后端返回 `{ sessionId: \"...\" }`\n- SDK 直接返回 `sessionId` 字符串\n\n```ts\nconst sessionId = await sdk.createSession();\n```\n\n### 5.3 chat()\n\n流式聊天。**`sessionId` 为必填**，必须先调用 `createSession()` 获取。返回 `AbortController`，可随时中断。\n\n- SDK 发送 `POST /chat`，请求体为 `{ botCode, sessionId, message, stream }`\n- 后端 SSE 在 `done` 事件中返回 `sessionId`\n\n```ts\nexport interface ChatOptions {\n  sessionId: string; // 必填 — 先调用 createSession()\n  message: string;\n  /** 附件（≤10 个，仅沙箱模式 Agent 支持，其他模式后端返回 400）。需先经直传上传到 NOS 拿到 nosKey。 */\n  attachments?: ChatAttachment[];\n  stream?: boolean; // 默认 true\n  onMessage?: (event: ChatEvent) => void;\n  onError?: (error: Error) => void;\n  onDone?: (result: {\n    sessionId: string;\n    content: string;\n    messageId?: string;\n    roundId?: string; // 本轮对话 id（session.start/session.done 携带）\n    artifacts?: Artifact[]; // done 汇总的本轮文件产物（generate_file 等交付产物）\n  }) => void; // messageId：done/stop 事件带回的后端消息标识（= conversation_messages.message_id，feedback 按它定位；未带回时 SDK 回查历史兜底）\n  signal?: AbortSignal;\n}\n\nexport interface ChatAttachment {\n  nosKey: string; // NOS 对象 key（必填，直传后获得）\n  filename: string; // 原始文件名（必填，模型靠扩展名选择解析方式）\n  size?: number; // 字节数（后端落地时校验）\n  mime?: string; // MIME 类型，如 \"application/pdf\"\n  url?: string; // 下载链接（仅前端回显；发送时 SDK 自动剥离，不进后端）\n}\n```\n\n带附件发送（附件文件会由后端写入沙箱，Agent 可通过 `read_file` / `execute` 读取）：\n\n```ts\nconst attachment = await createNosUploader({ baseURL: \"/api/e5s\" })(file); // 见 5.12\nconst controller = sdk.chat({\n  sessionId,\n  message: \"总结这份报告\",\n  attachments: [attachment],\n  onMessage, onDone, onError,\n});\n```\n\n```ts\nconst sessionId = await sdk.createSession();\n\nconst controller = sdk.chat({\n  sessionId,\n  message: \"帮我写一段排序算法\",\n  stream: true, // 默认 true\n  onMessage: (event) => {\n    switch (event.type) {\n      case \"thinking\":\n        console.log(\"[思考]\", event.content);\n        break;\n      case \"ai\":\n        process.stdout.write(event.content); // 增量输出\n        break;\n      case \"tool_call\":\n        console.log(\"[调用工具]\", event.toolName, event.args);\n        break;\n      case \"tool_result\":\n        console.log(\"[工具结果]\", event.content);\n        break;\n    }\n  },\n  onDone: ({ sessionId, content }) => {\n    console.log(\"\\n完成，sessionId =\", sessionId);\n  },\n  onError: (error) => {\n    console.error(\"出错：\", error.message);\n  },\n});\n\n// 取消：controller.abort();\n```\n\n`stream: false` 时走非流式接口，`onDone` 收到完整回复：\n\n```ts\nsdk.chat({\n  sessionId,\n  message: \"你好\",\n  stream: false,\n  onDone: ({ sessionId, content }) => console.log(\"完整回复：\", content),\n  onError: (error) => console.error(error),\n});\n```\n\n### 5.4 listConversations()\n\n```ts\nexport interface ListConversationsParams {\n  page?: number; // 默认 1\n  size?: number; // 默认 20\n}\n\nexport interface ListConversationsResult {\n  items: Conversation[];\n  total: number;\n}\n\nexport interface Conversation {\n  sessionId: string;\n  title: string | null;\n  createTime: string;\n  updateTime: string;\n}\n```\n\n```ts\nconst { items, total } = await sdk.listConversations({ page: 1, size: 20 });\n```\n\n- SDK 调用 `GET /chat/conversations?botCode=tech-researcher&page=1&size=20`\n- 后端返回的每一项为 `{ sessionId, title, createTime, updateTime }`（bot 外部标识统一 botCode，SDK 不暴露内部 id）\n\n### 5.5 getMessages()\n\n拉取会话历史消息，已转换为 UI 结构：\n\n```ts\nconst messages: UIMessage[] = await sdk.getMessages(sessionId);\n```\n\n后端历史接口按轮次聚合返回 `[{ roundId, artifacts, data: MessageItem[] }]`，SDK 自动摊平为\n`UIMessage[]`：每组的轮级 `artifacts`（与 SSE `done` 同构）挂到该组最后一条 assistant 消息的\n`artifacts`；`roundId` 为 null（存量旧数据）时 SDK 随机生成，业务方无需处理。\n\n可选第二参注入工具过滤（与 widget 的 `toolCallDisplay.hidden/visibleTools` 同一谓词，纯 API 模式自行控制）：\n\n```ts\nconst messages = await sdk.getMessages(sessionId, {\n  // 返回 false 的工具调用/结果不出现在历史里；工具 id（toolCode）优先、展示名兜底\n  isToolCallVisible: (toolCode, toolName) => toolCode !== \"query_order\",\n});\n```\n\n### 5.6 renameConversation() / deleteConversation()\n\n```ts\nawait sdk.renameConversation(sessionId, \"关于部署的讨论\");\nawait sdk.deleteConversation(sessionId);\n```\n\n### 5.7 getToken()\n\n```typescript\nsdk.getToken(): Promise<string>\n```\n\n自动获取并保存访问 token：\n\n- SDK 调用 `POST {origin}{tokenGateway}/superagent/v2/token/generate`，请求体 `{ botCode }`\n- 后端返回 `{ token, appId }`\n- SDK 自动将 token + appId 保存在内部\n- Widget 在挂载时自动调用此方法 —— 通常无需手动调用\n\n```ts\nconst token = await sdk.getToken();\n```\n\n### 5.8 setToken()\n\n```typescript\nsdk.setToken(token: string): void\n```\n\n手动设置 token（用于 token 由外部获取、或测试等场景）。正常情况下无需调用，Widget 挂载时会自动通过 `getToken()` 获取 token。\n\n```ts\nsdk.setToken(\"<TOKEN>\");\n```\n\n### 5.9 feedback() / cancelFeedback()\n\n消息反馈（赞/踩）。调用 `sdk.feedback()` 发送 `POST /chat/messages/{messageId}/feedback`；调用 `sdk.cancelFeedback()` 发送 `DELETE` 取消反馈。\n\n> **messageId 说明**：即消息列表里的 `messageId`（后端 `conversation_messages.message_id`，langchain 原始消息 id，UUID 字符串），**不是** `UIMessage.id`（历史加载为表主键、流式为客户端临时 id，仅作渲染 key）。纯 API 模式从 `getMessages()` 结果取 `UIMessage.messageId`；流式消息由 `done`/`stop` 事件（`onDone` 的 `messageId`）带回，两者都有时以帧内为准。\n\n```ts\nconst messages = await sdk.getMessages(sessionId);\nconst aiMsg = messages.findLast((m) => m.role === \"assistant\");\n\n// 点赞\nawait sdk.feedback(aiMsg.messageId!, \"like\");\n\n// 踩（可附原因 + 备注）\nawait sdk.feedback(aiMsg.messageId!, \"dislike\", {\n  reason: 1, // 1=事实错误 2=逻辑问题 3=不相关 4=信息过时 5=冗长啰嗦 6=难以理解\n  remark: \"时间描述有误\",\n});\n\n// 取消反馈\nawait sdk.cancelFeedback(aiMsg.messageId!);\n```\n\n组件内置的点赞/踩按钮已自动调用 `feedback()`/`cancelFeedback()`：\n\n- 点击已选中的按钮 → 取消（DELETE）\n- 点击另一个按钮 → 切换（POST）\n- 点踩时弹出原因选择面板（可选填原因 + 备注后提交）\n- 消息本身没带 `messageId` 时（如后端 done/stop 帧未回传），SDK 自动拉取一次历史消息，按该消息的 `roundId` 定位到它并取 `messageId` 再发送，业务方无感知\n\n### 5.10 respondInterrupt()\n\n响应中断事件（Human-in-the-Loop），后端继续推送后续 SSE 事件：\n\n```ts\nsdk.respondInterrupt(\n  interruptId: string,\n  sessionId: string,\n  response: InterruptResponse,\n  onMessage?: (event: ChatEvent) => void,\n  onError?: (error: Error) => void\n): Promise<void>\n```\n\nWidget 内置中断卡片会自动调用此方法，纯 API 模式需手动处理（详见 [12. Human-in-the-Loop](#12-human-in-the-loop)）。\n\n### 5.11 listSkills()\n\n获取当前 Bot 绑定的技能列表（用于 `/` 斜杠命令选择技能）：\n\n```ts\nconst skills: SkillInfo[] = await sdk.listSkills();\n// [{ code: \"web-searcher\", name: \"web-searcher\", displayName: \"网页搜索\", description: \"...\" }]\n```\n\n### 5.12 createNosUploader()\n\n内置 NOS 直传上传器（协议对齐 `@netease-ehr/ui` Upload 的 nosUpload 路径，**零依赖**该私有包）：`nosKey = MD5(name:size:ts)` → `GET {baseURL}/nos/token` → nos-js-sdk 分片直传 NOS 边缘节点（默认 4MB 分片 + localStorage 断点续传）→ `GET {baseURL}/nos/url` 取下载地址。内置挂起防护（分片超时 120s + 无进度看门狗 130s）。\n\n```ts\nimport { createNosUploader } from \"super-agent-sdk\";\n\nexport interface NosUploaderConfig {\n  baseURL: string; // 业务网关（与业务系统接口网关一致，如 \"/api/e5s\"，同源相对路径）\n  headers?: Record<string, string>; // 网关鉴权头（token/url 两个 GET 携带）\n  trunkSize?: number; // 分片大小，默认 4MB\n  onProgress?: (percent: number) => void; // 上传进度 0-100\n  chunkTimeoutMs?: number; // 单分片超时，默认 120s\n  stallTimeoutMs?: number; // 无进度看门狗，默认 130s\n  fetchNosUrl?: boolean; // 上传后调 /nos/url 取下载地址，默认 true（失败降级不影响结果）\n}\n\nconst upload = createNosUploader({\n  baseURL: \"/api/e5s\",\n  onProgress: (p) => console.log(`${p}%`),\n});\nconst attachment = await upload(file); // → { nosKey, filename, size, mime, url }\n```\n\n> Widget 场景无需手动调用——`mount({ nosUpload: { baseURL } })` 一行开启（见 [6.1](#61-mount)）。\n\n### 5.13 后端接口对照\n\nSDK 方法 → 后端接口的完整映射：\n\n> 除 `getToken()` 外，其余接口请求均携带 `X-App-Id` 与 `X-Token` 请求头进行鉴权。\n\n| SDK 方法              | HTTP 请求                                    | 请求体                                  | 后端返回                                        |\n| --------------------- | -------------------------------------------- | --------------------------------------- | ----------------------------------------------- |\n| `getToken()`          | `POST {gateway}/superagent/v2/token/generate`                    | `{ botCode }`                           | `{ token, appId }`                              |\n| `createSession()`     | `POST /chat/sessions`                        | `{ botCode }`                             | `{ sessionId }`                                 |\n| `chat()`              | `POST /chat`                                 | `{ botCode, sessionId, message, stream, attachments? }` | SSE 流，`done`/`stop` 事件含 `sessionId`        |\n| `listConversations()` | `GET /chat/conversations`                    | 查询参数 `botCode`、`page`、`size`      | `{ items: [{ sessionId, ... }], total }`（按 botCode 过滤） |\n| `feedback()`          | `POST /chat/messages/{messageId}/feedback`   | `{ type, reason?, remark? }`            | `null`                                          |\n| `cancelFeedback()`    | `DELETE /chat/messages/{messageId}/feedback` | 无 body                                 | `null`                                          |\n| `respondInterrupt()`  | `POST /chat/interrupt/{interruptId}/respond` | `{ sessionId, action, value? }`         | SSE 流（后续事件）                              |\n| `stopGeneration()`    | `POST /chat/stop`                            | `{ sessionId }`                         | `{ stopped: \"pending\", sessionId }`             |\n| `listSkills()`        | `GET /chat/bots/{botCode}/skills`            | —                                       | `[{ code, name, displayName, description }]`    |\n\n---\n\n## 6. 聊天组件\n\n组件通过 `mount()` 从 `super-agent-sdk/widget` 导入。\n\n### 6.1 mount()\n\n```ts\nexport function mount(\n  target: string | HTMLElement,\n  options: MountOptions,\n): WidgetInstance;\n\nexport interface MountOptions {\n  sdk: SuperAgentSDK;\n  mode?: WidgetMode; // 默认 'floating'\n  theme?: ThemeConfig;\n  slots?: Slots;\n  hooks?: EventHooks;\n  welcomeMessage?: string;\n  suggestedPrompts?: string[];\n  title?: string; // 标题，默认 \"AI Assistant\"\n  sidebarDefaultOpen?: boolean; // fullpage 模式：侧边栏初始展开（默认 true）\n  avatar?: AvatarConfig; // 自定义头像（AI 消息始终有内置默认头像；用户头像未配置则不显示）\n  artifactPreview?: boolean; // 产物预览总开关（html/markdown/pdf/docx 预览 + 下载 + 全屏），默认 false\n  capabilities?: CapabilityItem[]; // floating 首页：能力清单（icon + 标签 + 描述）\n  quickLinks?: QuickLinkItem[]; // floating 首页：快速入口\n  logo?: string; // floating 首页居中 Logo（URL），默认 SDK 内置 Logo\n  triggerLogo?: string; // floating 触发按钮 Logo（URL），默认 SDK 内置 Logo\n  showTimestamp?: boolean; // 显示消息时间戳，默认 false 不显示\n  /**\n   * 工具调用展示控制（单一配置面）：显示开关 + 白名单。\n   * 未配置 = 全显示（现状）。工具条恒收起、点击展开（无流式自动展开）。\n   */\n  toolCallDisplay?: {\n    /** 隐藏工具调用与返回（tool_call + tool_result 双向过滤）；默认 false 全显示 */\n    hidden?: boolean;\n    /** 白名单：其中的工具照常显示，其余全藏。条目为工具 id（code，admin 工具管理-编码列），\n     *  兼容展示名匹配（忽略大小写）。仅在 hidden: true 时生效；缺省/空 = 全藏 */\n    visibleTools?: string[];\n  };\n  /** 附件上传器（完全自定义，优先于 nosUpload）。不配置则输入区无附件按钮。 */\n  attachmentUploader?: (file: File) => Promise<ChatAttachment>;\n  /** 内置 NOS 直传（推荐）：配置即用，📎 按钮 + chip 进度 + 断点续传全内置 */\n  nosUpload?: { baseURL: string; headers?: Record<string, string>; trunkSize?: number };\n  /**\n   * 思维链 ThoughtChain 式节点：步骤默认收起、点击展开，\n   * 收起条显示「已深度思考 · 用时 Ns」（仅 live 轮有耗时，历史回显无数据）。\n   * 对象出现（含 {}）即开启；子项仅覆盖（如 { showDuration: false }）。\n   */\n  collapse?: {\n    thinking?: { showDuration?: boolean };\n  };\n}\n\nexport interface CapabilityItem {\n  icon?: string; // 图标 URL\n  label: string; // 能力名称\n  desc?: string; // 能力描述（超长自动省略）\n}\n\nexport interface QuickLinkItem {\n  icon?: string; // 图标 URL\n  label: string; // 入口名称\n  prompt?: string; // 点击后发送的消息\n  action?: PanelAction; // 点击行为：整屏容器 / 外链（优先于 prompt）\n  onClick?: () => void; // 自定义点击行为（优先于 action / prompt）\n}\n\nexport interface WidgetInstance {\n  open(): void;\n  close(): void;\n  destroy(): void;\n}\n```\n\n```ts\nimport { createSuperAgent } from \"super-agent-sdk\";\nimport { mount } from \"super-agent-sdk/widget\";\n\nconst sdk = createSuperAgent({\n  botCode: \"tech-researcher\",\n  tokenGateway: \"/api/gateway\",\n});\n\nconst widget = mount(\"#chat-root\", {\n  sdk,\n  mode: \"floating\",\n  title: \"AI 助手\",\n  welcomeMessage: \"你好！有什么可以帮你的？\",\n  suggestedPrompts: [\"帮我写周报\", \"解释一下这段代码\"],\n  theme: { primaryColor: \"#6366f1\" },\n});\n\nwidget.open(); // 展开面板\nwidget.close(); // 收起面板\nwidget.destroy(); // 卸载并移除 DOM\n```\n\n> 挂载后默认是收起状态，需调用 `widget.open()` 展开。\n\n#### 附件上传（📎 按钮）\n\n配置 `nosUpload`（内置 NOS 直传）或 `attachmentUploader`（完全自定义，优先级更高）任一即启用，二者都不配则附件功能完全隐藏（存量接入零影响）：\n\n```ts\n// 内置直传（推荐，一行开启）\nmount(\"#chat-root\", {\n  sdk,\n  nosUpload: { baseURL: \"/api/e5s\" }, // 业务网关\n});\n\n// 完全自定义（其他对象存储 / 自建网关）\nmount(\"#chat-root\", {\n  sdk,\n  attachmentUploader: async (file) => ({\n    nosKey: await uploadSomewhere(file),\n    filename: file.name,\n    size: file.size,\n    mime: file.type,\n  }),\n});\n```\n\n内置行为：📎 按钮（输入框左下角，绝对定位）选文件（≤10 个）→ 待发送附件以 chip 托盘显示在**输入框上方**（不占输入框内部空间），实时显示上传百分比 → 上传完成显示文件大小（可点击下载）→ 随消息发送 → 沙箱 Agent 读取（仅沙箱模式 Agent 支持，其他模式后端 400）。上传中禁止发送，失败 chip 红标可移除重选；regenerate 会连同附件一起重发。\n\n### 6.2 源码接入（monorepo alias）注意事项\n\nWidget 内部使用 **Tailwind CSS**（utility 全部限定在 `[data-super-agent-widget]` 宿主选择器内、禁用 preflight，不影响宿主页样式）。分发包（`dist`）已内联全部样式；内置图片资产（Logo/图标/头像等）走 CDN 绝对路径（`src/widget/assets/index.ts` 的 `BASE_URL`），**npm 引入无需任何配置**（需能访问 CDN）。\n\n若宿主工程通过 vite alias 直接引用 SDK **源码**（如本仓库 frontend 的做法），则 SDK 的样式会由宿主自己的 PostCSS/Tailwind 管线处理，需要满足：\n\n1. 宿主 `tailwind.config` 的 `content` 包含 SDK 源码路径，否则 widget 的 utility 类不会生成：\n\n```ts\n// frontend/tailwind.config.ts\nexport default {\n  content: [\n    './index.html',\n    './src/**/*.{js,jsx,ts,tsx}',\n    '../sdk/src/**/*.{ts,tsx}', // SDK 源码\n  ],\n  // ...\n};\n```\n\n2. 无需在宿主 config 中镜像 SDK 的 `important: '[data-super-agent-widget]'`（那会把宿主自己的 utility 也锁进 widget 容器内）；宿主管线生成的 utility 为普通类，widget DOM 照常命中，动画/自定义类由 SDK 自带的 `tailwind.css`（运行时注入）保证。\n\n### 6.3 Markdown 渲染（AI 消息）\n\nAI 文本消息（`text` part）按 Markdown 渲染，内置 `react-markdown` + `remark-gfm`（**随 SDK 打包，宿主无需额外安装**）：\n\n- **语法**：CommonMark 全集 + GFM 扩展（表格、任务列表 `- [ ]`、删除线 `~~x~~`、自动链接）\n- **排版**：Claude 风格，色值对齐前端设计 tokens（`frontend/src/theme/tokens.ts`）——链接品牌橙 `#d97757`（hover 加深）、行内代码 `parchment #e8e6dc` 底、代码块 `card #efede6` 底 + `border #e3e1d8` hairline 边框（浅色暖调、横向滚动）、引用块 `clay` 左点缀、表头 `parchment` 底\n- **安全**：默认 HTML 转义 + URL 清洗（`urlTransform`），Markdown 注入不会产生 XSS\n- **流式友好**：未闭合语法（输出中的代码块 / 表格）渐进渲染不跳版\n\n如需完全自定义渲染，通过 `slots.TextPart` 替换（见 [8.3 组件插槽](#83-组件插槽slots)）；`renderMode === \"html\"` 的工具结果不受影响，仍走 DOMPurify 内联渲染。\n\n---\n\n## 7. 展示模式\n\n通过 `mode` 切换两种展示模式：\n\n| 模式               | 说明                                                       |\n| ------------------ | ---------------------------------------------------------- |\n| `floating`（默认） | 右下角 Logo 触发按钮 + 可拖拽/拉伸/最大化的浮窗聊天窗口     |\n| `fullpage`         | 整页布局，左侧会话栏（hr-for-help 风格）+ 右侧聊天区        |\n\n```ts\nmount(\"#chat-root\", { sdk, mode: \"fullpage\" });\n```\n\n`fullpage` 模式下，可通过 `sidebarDefaultOpen` 控制侧边栏初始展开状态：\n\n```ts\nmount(\"#chat-root\", { sdk, mode: \"fullpage\", sidebarDefaultOpen: false });\n```\n\n### 7.1 浮窗模式（floating）交互\n\n浮窗窗口对齐 hr-for-help 设计，开箱具备以下交互能力：\n\n- **标题栏拖拽**：按住顶部导航栏移动窗口（视口内钳制，按钮区域不触发）\n- **左侧拉伸调宽**：窗口左侧 6px 手柄拖拽（右缘稳定不动），宽度范围 360 ~ 800 px，拖超过 800 自动进入大窗\n- **大窗/小窗切换**：header 右侧「大窗」按钮切换；大窗为底部弹出的近全屏 overlay（内容区 800px 居中），回小窗时宽度重置为默认值\n- **内容自适应高度**：聊天内容增长时窗口自动变高（默认 648px，上限 95% 视口，超出后消息区滚动），回到首页恢复默认高度\n- **内嵌会话侧边栏**：header「历史记录」按钮开合；小窗下侧边栏紧贴窗口左缘向外展开（无缝拼接为一个连续圆角窗口，主区位置不动）；大窗模式自动展开（220px），大窗/小窗各自记住用户偏好\n- **关闭即还原**：关闭窗口后几何状态（位置/宽度/大窗态/高度）全部重置\n\n浮窗消息展示对齐 hr-for-help：AI 头像独占一行（无背景色，生成中切换动效头像）、气泡白底描边、用户气泡浅蓝右对齐；`fullpage` 模式保持横排头像 + 经典气泡，两者互不影响。\n\n首页（无消息时）包含：居中 Logo（浮动动画）+ 流光渐变标题 + 能力清单 + 建议词 chips + 快速入口，内容通过 `capabilities` / `suggestedPrompts` / `quickLinks` / `logo` 配置（见 6.1；icon 可复用 `super-agent-sdk/widget` 导出的内置 `ASSETS`）。\n\n---\n\n## 8. 定制化\n\n### 8.1 主题定制\n\n通过 `ThemeConfig` 定制外观，组件内部将其转换为 CSS 变量。\n\n```ts\nexport interface ThemeConfig {\n  primaryColor?: string; // 默认 #6366f1\n  backgroundColor?: string; // 默认 #ffffff\n  fontFamily?: string; // 默认 system-ui, -apple-system, sans-serif\n  borderRadius?: number; // 默认 16 (px)\n  panelWidth?: number; // floating 初始宽度，默认 400 (px)\n  panelHeight?: number; // floating 初始高度，默认 648 (px)\n  zIndex?: number; // 默认 9999\n}\n```\n\n对应的 CSS 变量：\n\n| 变量                | 默认值                                 | 对应字段          |\n| ------------------- | -------------------------------------- | ----------------- |\n| `--sa-primary`      | `#6366f1`                              | `primaryColor`    |\n| `--sa-bg`           | `#ffffff`                              | `backgroundColor` |\n| `--sa-font`         | `system-ui, -apple-system, sans-serif` | `fontFamily`      |\n| `--sa-radius`       | `16px`                                 | `borderRadius`    |\n| `--sa-panel-width`  | `400px`                                | `panelWidth`      |\n| `--sa-panel-height` | `648px`                                | `panelHeight`     |\n| `--sa-z-index`      | `9999`                                 | `zIndex`          |\n\n```ts\nmount(\"#chat-root\", {\n  sdk,\n  theme: {\n    primaryColor: \"#10b981\",\n    backgroundColor: \"#f9fafb\",\n    fontFamily: \"'PingFang SC', 'Microsoft YaHei', sans-serif\",\n    borderRadius: 12,\n    panelWidth: 400,\n    panelHeight: 600,\n    zIndex: 10000,\n  },\n});\n```\n\n### 8.2 头像定制\n\n通过 `avatar` 配置助手与用户的头像，支持图片 URL、emoji 或文本。以 `http(s)://`、`data:`、`blob:`、`/`、`./`、`../`、`//` 开头的字符串渲染为图片，其余作为 emoji/文本展示（无背景色）：\n\n```ts\nexport interface AvatarConfig {\n  assistant?: string; // 图片 URL、emoji 或文本；默认 SDK 内置头像（生成中显示动效头像）\n  user?: string; // 图片 URL、emoji 或文本；未配置则不显示用户头像\n}\n```\n\n```ts\nmount(\"#chat-root\", {\n  sdk,\n  avatar: {\n    assistant: \"🤖\", // 配置后覆盖内置默认头像\n    user: \"https://cdn.example.com/user-avatar.png\",\n  },\n});\n```\n\n### 8.3 组件插槽（Slots）\n\n通过 `slots` 替换内置子组件。所有插槽 Props 均从 `super-agent-sdk/widget` 导出。\n\n```ts\nexport interface Slots {\n  Trigger?: ComponentType<TriggerProps>;\n  Header?: ComponentType<HeaderProps>;\n  Message?: ComponentType<MessageProps>;\n  Composer?: ComponentType<ComposerProps>;\n  ActionBar?: ComponentType<ActionBarProps>;\n  ThreadList?: ComponentType<ThreadListProps>;\n  ThinkingPart?: ComponentType<ThinkingPartProps>;\n  TextPart?: ComponentType<TextPartProps>;\n  ToolCallPart?: ComponentType<ToolCallPartProps>;\n  ToolResultPart?: ComponentType<ToolResultPartProps>;\n  ErrorPart?: ComponentType<ErrorPartProps>;\n  InterruptCard?: ComponentType<InterruptCardProps>;\n  WelcomeScreen?: ComponentType<WelcomeScreenProps>;\n  /** 首屏底部业务定制容器 */\n  AppendContainer?: ComponentType<AppendContainerProps>;\n}\n```\n\n| 插槽             | Props 接口            | 说明                                                                                               |\n| ---------------- | --------------------- | -------------------------------------------------------------------------------------------------- |\n| `Trigger`        | `TriggerProps`        | 悬浮触发按钮                                                                                       |\n| `Header`         | `HeaderProps`         | 面板标题栏                                                                                         |\n| `Message`        | `MessageProps`        | 单条消息容器（完整自定义消息渲染）                                                                 |\n| `Composer`       | `ComposerProps`       | 输入框 / 发送栏                                                                                    |\n| `ActionBar`      | `ActionBarProps`      | 消息操作栏（复制 / 重试 / 反馈）                                                                   |\n| `ThreadList`     | `ThreadListProps`     | 会话列表（浮窗模式覆盖层 / 全屏模式侧边栏）                                                        |\n| `ThinkingPart`   | `ThinkingPartProps`   | 思考过程块                                                                                         |\n| `TextPart`       | `TextPartProps`       | 文本块                                                                                             |\n| `ToolCallPart`   | `ToolCallPartProps`   | 工具调用卡片（可折叠 + 展开后复制参数）                                                            |\n| `ToolResultPart` | `ToolResultPartProps` | 工具返回卡片（pre 滚动 + 复制，JSON 自动格式化；`renderMode===\"html\"` 时 DOMPurify 清洗后直接渲染，最高 60vh 滚动。文件产物卡片已上移至消息级渲染，本组件不再内联展示） |\n| `ErrorPart`      | `ErrorPartProps`      | 错误提示块                                                                                         |\n| `WelcomeScreen`  | `WelcomeScreenProps`  | 空会话欢迎页                                                                                       |\n| `AppendContainer`| `AppendContainerProps`| 首屏底部业务定制区，`openPanel(action)` 开整屏容器或外链（见下）                                   |\n\n#### Trigger\n\n```ts\nexport interface TriggerProps {\n  isOpen: boolean;\n  onClick: () => void;\n  unreadCount?: number;\n  triggerLogo?: string; // 触发按钮 Logo（URL）\n}\n```\n\n```tsx\nfunction MyTrigger({ isOpen, onClick, unreadCount }: TriggerProps) {\n  return (\n    <button\n      onClick={onClick}\n      style={{ position: \"fixed\", right: 24, bottom: 24 }}\n    >\n      {isOpen ? \"关闭\" : \"聊天\"}\n      {unreadCount ? <span>{unreadCount}</span> : null}\n    </button>\n  );\n}\n```\n\n#### Header\n\nfloating 与 fullpage 模式均支持替换；`onToggleThreadList` 在 floating 下切换内嵌会话侧边栏、在 fullpage 下切换左侧边栏；开启 `artifactPreview` 后额外提供产物入口字段。\n\n> 注：fullpage 内置 Header 有标题与产物入口（无关闭按钮）；整屏容器态标题换成面板 `title`、并出现 home 返回入口，需要关闭入口时通过自定义 Header 的 `onClose` 自行渲染。floating 内置 Header 含历史/回首页/大窗/关闭按钮。\n\n```ts\nexport interface HeaderProps {\n  title: string;\n  onClose: () => void;\n  onToggleThreadList: () => void;\n  isMaximized?: boolean;        // floating：大窗状态\n  onToggleMaximize?: () => void; // floating：大窗/小窗切换\n  showHome?: boolean;           // floating：聊天态显示回到首页；整屏容器态显示「返回聊天」\n  onHome?: () => void;          // 回到首页（新会话）；整屏容器态为 closePanel 返回聊天\n  artifactCount?: number;       // 会话产物数量（artifactPreview 开启时提供）\n  onToggleArtifactDrawer?: () => void; // 打开/关闭产物预览抽屉\n  panelTitle?: string;          // 整屏容器态：面板标题（内置 Header 居中显示；自定义 Header 据此自行渲染）\n}\n```\n\n```tsx\nfunction MyHeader({ title, onClose, onToggleThreadList }: HeaderProps) {\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        padding: 12,\n        background: \"#111\",\n      }}\n    >\n      <span style={{ flex: 1, color: \"#fff\", fontWeight: 600 }}>{title}</span>\n      <button onClick={onToggleThreadList}>历史</button>\n      <button onClick={onClose}>关闭</button>\n    </div>\n  );\n}\n```\n\n#### Message（重点：完整自定义消息渲染）\n\n替换后接管整条消息的渲染，可完全自定义布局。`slots` 会透传进来，方便复用内置/自定义的 Part 组件。\n\n```ts\nexport interface MessageProps {\n  message: UIMessage;\n  isStreaming: boolean;\n  isLast: boolean;\n  avatar?: AvatarConfig;\n  slots: Slots;\n  onCopy: () => void;\n  onRegenerate: () => void;\n  onFeedback?: (messageId: string, feedback: \"like\" | \"dislike\") => void;\n}\n```\n\n```tsx\nfunction MyMessage({\n  message,\n  isStreaming,\n  isLast,\n  avatar,\n  slots,\n  onCopy,\n  onRegenerate,\n  onFeedback,\n}: MessageProps) {\n  const isUser = message.role === \"user\";\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        gap: 12,\n        justifyContent: isUser ? \"flex-end\" : \"flex-start\",\n      }}\n    >\n      {!isUser && <div>{avatar?.assistant ?? \"A\"}</div>}\n      <div style={{ maxWidth: \"75%\" }}>\n        {message.parts.map((part, idx) => {\n          switch (part.type) {\n            case \"text\":\n              return <div key={idx}>{part.content}</div>;\n            case \"thinking\":\n              return (\n                <div key={idx} style={{ fontStyle: \"italic\" }}>\n                  {part.content}\n                </div>\n              );\n            case \"tool_call\":\n              return <div key={idx}>[调用 {part.toolName}]</div>;\n            case \"tool_result\":\n              return <div key={idx}>[结果] {part.content}</div>;\n            case \"error\":\n              return (\n                <div key={idx} style={{ color: \"red\" }}>\n                  {part.content}\n                </div>\n              );\n          }\n        })}\n        {isStreaming && isLast && !isUser && <span>|</span>}\n        {!isUser && !isStreaming && (\n          <slots.ActionBar\n            message={message}\n            onCopy={onCopy}\n            onRegenerate={onRegenerate}\n            onFeedback={onFeedback}\n          />\n        )}\n      </div>\n      {isUser && <div>{avatar?.user ?? \"U\"}</div>}\n    </div>\n  );\n}\n```\n\n#### Composer\n\n```ts\nexport interface ComposerProps {\n  status: ChatStatus;\n  onSend: (content: string, attachments?: ChatAttachment[]) => void;\n  onStop: () => void;\n}\n```\n\n```tsx\nfunction MyComposer({ status, onSend, onStop }: ComposerProps) {\n  const [value, setValue] = useState(\"\");\n  const streaming = status === \"streaming\";\n  return (\n    <div style={{ display: \"flex\", gap: 8, padding: 12 }}>\n      <input\n        value={value}\n        onChange={(e) => setValue(e.target.value)}\n        style={{ flex: 1 }}\n      />\n      {streaming ? (\n        <button onClick={onStop}>停止</button>\n      ) : (\n        <button\n          onClick={() => {\n            onSend(value);\n            setValue(\"\");\n          }}\n        >\n          发送\n        </button>\n      )}\n    </div>\n  );\n}\n```\n\n#### ActionBar（含 onFeedback）\n\n```ts\nexport interface ActionBarProps {\n  message: UIMessage;\n  onCopy: () => void;\n  onRegenerate?: () => void;\n  // 传整条 message（内置 ActionBar 的做法）或 messageId / 本地 id 字符串均可\n  onFeedback?: (\n    message: UIMessage | string,\n    feedback: \"like\" | \"dislike\",\n    options?: { reason?: number; remark?: string },\n  ) => void;\n}\n```\n\n```tsx\nfunction MyActionBar({\n  message,\n  onCopy,\n  onRegenerate,\n  onFeedback,\n}: ActionBarProps) {\n  return (\n    <div style={{ display: \"flex\", gap: 8 }}>\n      <button onClick={onCopy}>复制</button>\n      <button onClick={onRegenerate}>重新生成</button>\n      <button onClick={() => onFeedback?.(message.id, \"like\")}>👍</button>\n      <button onClick={() => onFeedback?.(message.id, \"dislike\")}>👎</button>\n    </div>\n  );\n}\n```\n\n#### ThreadList（浮窗内嵌会话侧边栏 + 全屏模式侧边栏）\n\n在 `floating` 模式下作为窗口内嵌侧边栏渲染（小窗 200px / 大窗 220px，随「历史记录」按钮开合）；在 `fullpage` 模式下作为左侧侧边栏渲染（220px，可收起为图标栏）。\n\n```ts\nexport interface ThreadListProps {\n  conversations: Conversation[];\n  activeSessionId: string | null;\n  onSwitch: (sessionId: string) => void;\n  onNew: () => void;\n  onDelete: (sessionId: string) => void;\n  onRename: (sessionId: string, title: string) => void;\n  hasMore?: boolean;\n  onLoadMore?: () => void;\n}\n```\n\n```tsx\nfunction MyThreadList({\n  conversations,\n  activeSessionId,\n  onSwitch,\n  onNew,\n  onDelete,\n  onRename,\n}: ThreadListProps) {\n  return (\n    <div>\n      <button onClick={onNew}>+ 新会话</button>\n      {conversations.map((conv) => (\n        <div\n          key={conv.sessionId}\n          onClick={() => onSwitch(conv.sessionId)}\n          style={{ fontWeight: conv.sessionId === activeSessionId ? 700 : 400 }}\n        >\n          {conv.title || \"新会话\"}\n          <button\n            onClick={(e) => {\n              e.stopPropagation();\n              onRename(conv.sessionId, prompt(\"新标题\") || \"\");\n            }}\n          >\n            改\n          </button>\n          <button\n            onClick={(e) => {\n              e.stopPropagation();\n              onDelete(conv.sessionId);\n            }}\n          >\n            删\n          </button>\n        </div>\n      ))}\n    </div>\n  );\n}\n```\n\n#### ThinkingPart / TextPart / ToolCallPart / ToolResultPart / ErrorPart\n\n```ts\nexport interface ThinkingPartProps {\n  content: string;\n}\nexport interface TextPartProps {\n  content: string;\n}\nexport interface ToolCallPartProps {\n  toolName: string;\n  toolCallId: string;\n  args: string;\n}\nexport interface ToolResultPartProps {\n  toolName: string;\n  toolCallId: string;\n  content: string;\n  artifacts?: Artifact[]; // 仅供自定义 slot 取用；内置组件不再内联渲染文件卡片（已上移至消息级）\n  renderMode?: string;\n  html?: string;\n  artifactPreview?: boolean;\n}\nexport interface ErrorPartProps {\n  content: string;\n  onRetry?: () => void;\n}\n```\n\n```tsx\nfunction MyThinkingPart({ content }: ThinkingPartProps) {\n  return (\n    <div style={{ borderLeft: \"3px solid #a855f7\", padding: 6 }}>{content}</div>\n  );\n}\n\nfunction MyTextPart({ content }: TextPartProps) {\n  return <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>;\n}\n\nfunction MyToolCallPart({ toolName, args }: ToolCallPartProps) {\n  return (\n    <div style={{ border: \"1px solid #f59e0b\" }}>\n      [调用 {toolName}] {args}\n    </div>\n  );\n}\n\nfunction MyToolResultPart({ toolName, content }: ToolResultPartProps) {\n  return (\n    <div style={{ background: \"#ecfdf5\" }}>\n      [{toolName} 结果] {content}\n    </div>\n  );\n}\n\nfunction MyErrorPart({ content, onRetry }: ErrorPartProps) {\n  return (\n    <div style={{ color: \"red\" }}>\n      {content}\n      {onRetry && <button onClick={onRetry}>重试</button>}\n    </div>\n  );\n}\n```\n\n#### AppendContainer（首屏业务定制 + 整屏容器）\n\n首屏（无消息时）在 `WelcomeScreen` 之下预留一块业务定制区，浮窗与全屏模式共用；未配置则不产生任何 DOM。\n用法就一句话：**点一下，`openPanel(action)`**——可视区始终在 chatPanel 内（`link` 除外）。\n\n```ts\nexport type PanelContent = ComponentType<PageProps> | ReactElement; // 组件类型，或带参数的元素\nexport type PanelAction =\n  | { type: 'page'; component: PanelContent; title?: string } // 整屏容器\n  | { type: 'link'; url: string; target?: '_blank' | '_self' }; // 外链\n\nexport interface AppendContainerProps { openPanel: (action: PanelAction) => void }\nexport interface PageProps { close: () => void }\n```\n\n```tsx\nfunction ReportPage({ close }: PageProps) {\n  return (\n    <div style={{ padding: 16 }}>\n      报告内容……\n      <button onClick={close}>返回</button>\n    </div>\n  );\n}\n\nfunction MyHomeBlock({ openPanel }: AppendContainerProps) {\n  return (\n    <>\n      <button onClick={() => openPanel({ type: \"page\", component: ReportPage, title: \"全景报告\" })}>\n        整屏容器\n      </button>\n      <button onClick={() => openPanel({ type: \"link\", url: \"https://example.com\" })}>\n        新窗口外链\n      </button>\n    </>\n  );\n}\n\nmount(\"#app\", { sdk, slots: { AppendContainer: MyHomeBlock } });\n```\n\n要开「第 3 条记录」这类带参数的页面，直接给**元素**，SDK 用 `cloneElement` 补上 `close`：\n\n```tsx\n// 元素形态下 close 声明为可选，才能写 <DetailPage id={3} />（运行时 SDK 必然注入）\nfunction DetailPage({ id, close }: { id: number; close?: () => void }) {\n  return <button onClick={close}>详情 #{id} 返回</button>;\n}\n\nopenPanel({ type: \"page\", component: <DetailPage id={3} />, title: \"详情 #3\" });\n```\n\n给组件类型（`component: DetailPage`）时 `close` 是必填 prop，同样由 SDK 注入。\n\n连定制区都不想写？首屏「快速入口」吃同一个 `action`，纯配置即可接入（`title` 缺省用 `label`）：\n\n```tsx\nmount(\"#app\", {\n  sdk,\n  quickLinks: [\n    { label: \"全景报告\", action: { type: \"page\", component: ReportPage } },\n    { label: \"帮助文档\", action: { type: \"link\", url: \"https://example.com/help\" } },\n  ],\n});\n```\n\n点击优先级：`onClick > action > prompt`。\n\n整屏容器行为：\n\n| 项 | 表现 |\n| --- | --- |\n| 呈现 | 替换「内容区 + 输入区」，Header 保留（小窗仍可拖拽）；`link` 走 `window.open`，不占状态 |\n| 标题 | 无独立标题栏（纯白背景）；`title` 传入时显示在 **Header 居中**（floating 内置 Header / fullpage 均适用，自定义 `slots.Header` 收 `panelTitle` 自行渲染） |\n| 退出 | Header 的 home 图标（tooltip「返回聊天」）/ 业务组件 `close()` / `Esc`；关闭聊天面板时一并清掉 |\n| 窗口几何 | 保持打开前窗态，小窗不自动升大窗；内容在容器内滚动（业务页不写滚动容器） |\n| 栈 | 单层不叠栈，容器内部导航由业务组件自己管 |\n\n注意：浮层组件渲染在 SDK 自己的 `createRoot` 树内，拿不到宿主的 React Context / Router。组件引用直接给，不需要注册表——类型即校验。\n\n### 8.4 事件钩子（EventHooks）\n\n通过 `hooks` 监听组件生命周期与交互事件：\n\n```ts\nexport interface EventHooks {\n  onOpen?: () => void;\n  onClose?: () => void;\n  onMessageSend?: (message: string) => void;\n  onStreamStart?: (sessionId: string) => void;\n  onStreamEnd?: (sessionId: string) => void;\n  onError?: (error: Error) => void;\n  onConversationChange?: (sessionId: string) => void;\n}\n```\n\n```ts\nmount(\"#chat-root\", {\n  sdk,\n  hooks: {\n    onOpen: () => console.log(\"面板已打开\"),\n    onClose: () => console.log(\"面板已关闭\"),\n    onMessageSend: (message) => console.log(\"用户发送：\", message),\n    onStreamStart: (sessionId) =>\n      console.log(\"开始流式输出，会话：\", sessionId),\n    onStreamEnd: (sessionId) => console.log(\"输出结束，会话：\", sessionId),\n    onError: (error) => console.error(\"发生错误：\", error.message),\n    onConversationChange: (sessionId) => console.log(\"切换会话：\", sessionId),\n  },\n});\n```\n\n> 点赞 / 踩由内置 `ActionBar` 组件通过 `ChatState.feedback()` / `cancelFeedback()` 自动处理，无需额外配置（见 [5.9](#59-feedback--cancelfeedback)）。\n\n### 8.5 定制示例\n\n完整的自定义 `Header` + `Message` + `ActionBar` + `WelcomeScreen`：\n\n```tsx\nimport React, { useState } from \"react\";\nimport { createSuperAgent } from \"super-agent-sdk\";\nimport { mount, Icon } from \"super-agent-sdk/widget\";\nimport type {\n  HeaderProps,\n  MessageProps,\n  ActionBarProps,\n  WelcomeScreenProps,\n} from \"super-agent-sdk/widget\";\n\nconst sdk = createSuperAgent({\n  botCode: \"tech-researcher\",\n  tokenGateway: \"/api/gateway\",\n});\nsdk.setToken(\"demo_token\");\n\nfunction CustomHeader({ title, onClose, onToggleThreadList }: HeaderProps) {\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        alignItems: \"center\",\n        padding: \"12px 16px\",\n        background: \"#0f172a\",\n        color: \"#fff\",\n      }}\n    >\n      <Icon name=\"bot\" size={18} color=\"#fff\" />\n      <span style={{ flex: 1, marginLeft: 10, fontWeight: 700 }}>{title}</span>\n      <button onClick={onToggleThreadList}>\n        <Icon name=\"menu\" size={16} />\n      </button>\n      <button onClick={onClose}>\n        <Icon name=\"x\" size={16} />\n      </button>\n    </div>\n  );\n}\n\nfunction CustomMessage({\n  message,\n  isStreaming,\n  isLast,\n  avatar,\n  slots,\n  onCopy,\n  onRegenerate,\n  onFeedback,\n}: MessageProps) {\n  const isUser = message.role === \"user\";\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        gap: 12,\n        justifyContent: isUser ? \"flex-end\" : \"flex-start\",\n        padding: \"4px 0\",\n      }}\n    >\n      {!isUser && (\n        <div\n          style={{\n            width: 36,\n            height: 36,\n            borderRadius: 12,\n            background: \"#6366f1\",\n          }}\n        >\n          {avatar?.assistant || \"A\"}\n        </div>\n      )}\n      <div style={{ maxWidth: \"75%\" }}>\n        {message.parts.map((part, idx) => {\n          switch (part.type) {\n            case \"text\":\n              return (\n                <div key={idx} style={{ whiteSpace: \"pre-wrap\" }}>\n                  {part.content}\n                </div>\n              );\n            case \"thinking\":\n              return (\n                <div\n                  key={idx}\n                  style={{ fontStyle: \"italic\", color: \"#7c3aed\" }}\n                >\n                  {part.content}\n                </div>\n              );\n            case \"tool_call\":\n              return <div key={idx}>[调用 {part.toolName}]</div>;\n            case \"tool_result\":\n              return <div key={idx}>[结果] {part.content}</div>;\n            case \"error\":\n              return (\n                <div key={idx} style={{ color: \"#b91c1c\" }}>\n                  {part.content}\n                </div>\n              );\n          }\n        })}\n        {isStreaming && isLast && !isUser && <span>|</span>}\n        {!isUser && !isStreaming && message.parts.length > 0 && (\n          <slots.ActionBar\n            message={message}\n            onCopy={onCopy}\n            onRegenerate={onRegenerate}\n            onFeedback={onFeedback}\n          />\n        )}\n      </div>\n      {isUser && (\n        <div\n          style={{\n            width: 36,\n            height: 36,\n            borderRadius: 12,\n            background: \"#475569\",\n          }}\n        >\n          {avatar?.user || \"U\"}\n        </div>\n      )}\n    </div>\n  );\n}\n\nfunction CustomActionBar({\n  message,\n  onCopy,\n  onRegenerate,\n  onFeedback,\n}: ActionBarProps) {\n  const [liked, setLiked] = useState<\"like\" | \"dislike\" | null>(null);\n  return (\n    <div style={{ display: \"flex\", gap: 8, marginTop: 6 }}>\n      <button onClick={onCopy}>复制</button>\n      <button onClick={onRegenerate}>重新生成</button>\n      <button\n        onClick={() => {\n          const v = liked === \"like\" ? null : \"like\";\n          setLiked(v);\n          if (v) onFeedback?.(message.id, v);\n        }}\n        style={{ color: liked === \"like\" ? \"#6366f1\" : \"#9ca3af\" }}\n      >\n        👍\n      </button>\n      <button\n        onClick={() => {\n          const v = liked === \"dislike\" ? null : \"dislike\";\n          setLiked(v);\n          if (v) onFeedback?.(message.id, v);\n        }}\n        style={{ color: liked === \"dislike\" ? \"#6366f1\" : \"#9ca3af\" }}\n      >\n        👎\n      </button>\n    </div>\n  );\n}\n\nfunction CustomWelcomeScreen({\n  message,\n  suggestedPrompts,\n  onPromptClick,\n}: WelcomeScreenProps) {\n  return (\n    <div\n      style={{\n        flex: 1,\n        display: \"flex\",\n        flexDirection: \"column\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n      }}\n    >\n      <Icon name=\"sparkles\" size={32} color=\"#6366f1\" />\n      <p>{message || \"有什么可以帮你的？\"}</p>\n      {suggestedPrompts?.map((prompt) => (\n        <button key={prompt} onClick={() => onPromptClick(prompt)}>\n          {prompt}\n        </button>\n      ))}\n    </div>\n  );\n}\n\nmount(\"#chat-root\", {\n  sdk,\n  mode: \"fullpage\",\n  title: \"AI 助手\",\n  welcomeMessage: \"你好！我是 AI 助手\",\n  suggestedPrompts: [\"查询订单\", \"写一段代码\"],\n  slots: {\n    Header: CustomHeader,\n    Message: CustomMessage,\n    ActionBar: CustomActionBar,\n    WelcomeScreen: CustomWelcomeScreen,\n  },\n}).open();\n```\n\n---\n\n## 9. 会话管理\n\n### 9.1 SDK 层面\n\n| 方法                 | 签名                                            | 说明                                 |\n| -------------------- | ----------------------------------------------- | ------------------------------------ |\n| `createSession`      | `() => Promise<string>`                         | 创建新会话，返回 `sessionId`         |\n| `listConversations`  | `(params?) => Promise<ListConversationsResult>` | 获取会话列表（分页）                 |\n| `renameConversation` | `(sessionId, title) => Promise<void>`           | 重命名会话                           |\n| `deleteConversation` | `(sessionId) => Promise<void>`                  | 删除会话                             |\n| `getMessages`        | `(sessionId) => Promise<UIMessage[]>`           | 获取会话历史消息（已转换为 UI 结构） |\n\n```ts\nconst sessionId = await sdk.createSession();\nconst { items, total } = await sdk.listConversations({ page: 1, size: 20 });\nconst messages = await sdk.getMessages(items[0].sessionId);\nawait sdk.renameConversation(items[0].sessionId, \"新标题\");\nawait sdk.deleteConversation(items[0].sessionId);\n```\n\n### 9.2 组件内置能力\n\n- **自动加载**：挂载后自动调用 `listConversations` 拉取会话列表（每页 20 条）。\n- **滚动加载**：会话列表滚动到底部时自动加载下一页，支持任意数量的会话。\n- **切换**：点击会话项加载该会话历史消息并展示。\n- **新建**：点击「新会话」清空当前消息，下次发送时自动调用 `createSession()` 创建新会话。\n- **重命名**：`fullpage` 侧边栏或自定义 `ThreadList` 中调用 `renameConversation`。\n- **删除**：悬停会话项后点击删除按钮。\n- **本地持久化**：最近一次活跃会话写入 `localStorage`，键为 `sa_active_conversation_{botCode}`（按 Bot 隔离，切换 Bot 后互不串扰）。\n\n---\n\n## 10. 中断恢复\n\n### 10.1 停止生成\n\nSDK 提供双信号停止机制，确保多实例部署下也能可靠停止生成：\n\n1. **`abort()`**：断开 SSE 连接，前端即时停止接收\n2. **`POST /chat/stop`**：通过 Redis Pub/Sub 广播取消信号到实际执行的后端实例\n\nWidget 内置的停止按钮已自动执行双信号（`abort()` + `stopGeneration()`），无需手动处理。\n\n#### 纯 API 模式\n\n```ts\nconst controller = sdk.chat({\n  sessionId,\n  message: \"...\",\n  stream: true,\n  onMessage: (event) => {\n    if (event.type === \"stop\") {\n      // 用户主动停止，event.content 为已生成的半截回复全文\n      console.log(\"已停止，半截回复：\", event.content);\n    }\n  },\n  onDone,\n});\n\n// 停止生成：双信号并发\ncontroller.abort();\nawait sdk.stopGeneration(sessionId);\n```\n\n#### stopGeneration()\n\n```ts\nsdk.stopGeneration(sessionId: string): Promise<void>\n```\n\n调用 `POST /chat/stop`，广播取消信号。返回 `{ stopped: \"pending\" }` 表示已受理，实际停止异步发生。SDK 不应阻塞等待——以 SSE 流的 `stop`/`done` 事件或本地 `abort` 作为停止完成的判定。\n\n半截回复（含思考与正文）会保留：既写入数据库（刷新可回显），也写入 checkpoint（影响下一轮对话上下文）。\n\n### 10.2 中断请求\n\n`chat()` 返回 `AbortController`，可随时中断：\n\n```ts\nconst controller = sdk.chat({\n  sessionId,\n  message: \"...\",\n  stream: true,\n  onDone,\n});\ncontroller.abort();\n```\n\n也可在 `ChatOptions.signal` 传入外部 `AbortSignal`，SDK 会将其与内部信号合并，任一触发即中断：\n\n```ts\nconst ac = new AbortController();\nsdk.chat({ sessionId, message: \"...\", signal: ac.signal });\nac.abort();\n```\n\n### 10.3 会话恢复\n\n页面刷新或组件重新挂载时，会话状态自动恢复：\n\n1. 挂载时从 `localStorage` 读取上次活跃会话 ID（键 `sa_active_conversation_{botCode}`）。\n2. 若该会话仍在列表中，自动调用 `getMessages` 拉取历史消息并渲染。\n3. 若存储的会话已不存在（被删除），则自动清空并回退到「新会话」。\n\n整个过程对用户透明，无需额外配置。\n\n---\n\n## 11. 消息类型\n\n### 11.1 UIMessage\n\n```ts\nexport interface UIMessage {\n  id: string; // 渲染 key：历史加载为表主键，流式为客户端临时 id（不用于 feedback）\n  role: \"user\" | \"assistant\";\n  parts: MessagePart[];\n  timestamp: number;\n  messageId?: string; // 后端消息标识（= conversation_messages.message_id），feedback/cancelFeedback 按它定位\n  roundId?: string; // 本轮对话 id（历史分组 roundId；后端为 null 时 SDK 随机生成）\n  artifacts?: Artifact[]; // done 汇总的本轮文件产物（历史取分组 artifacts），消息末尾渲染文件卡片\n}\n```\n\n> **产物渲染**：文件产物（`generate_file` 交付的 html/md/pdf/docx）统一挂在 assistant 消息的\n> `artifacts` 上，渲染在该消息末尾为文件卡片（点击开预览抽屉）。流式来自 `done` 事件，历史来自\n> 分组接口的组级 `artifacts`（与 `done` 同构）。`tool_result` part 不再内联渲染文件卡片。\n\n### 11.2 MessagePart\n\n```ts\nexport type MessagePart =\n  | { type: \"text\"; content: string }\n  | { type: \"thinking\"; content: string }\n  | { type: \"tool_call\"; toolName: string; toolCallId: string; args: string }\n  | {\n      type: \"tool_result\";\n      toolName: string;\n      toolCallId: string;\n      content: string;\n      artifacts?: Artifact[];\n      renderMode?: string;\n      html?: string;\n      markdown?: string;\n      defaultExpanded?: boolean; // config.default_expanded=true 或 renderMode===\"html\"：默认展开\n    }\n  | { type: \"error\"; content: string }\n  | { type: \"attachment\"; attachment: ChatAttachment } // 用户消息携带的附件 chip\n  | {\n      type: \"interrupt\";\n      interrupt: InterruptEvent;\n      resolved?: boolean;\n      response?: InterruptResponse;\n    };\n```\n\n| type          | 字段                                                                      | 说明                            |\n| ------------- | ------------------------------------------------------------------------- | ------------------------------- |\n| `text`        | `content`                                                                 | 文本 / Markdown 内容            |\n| `thinking`    | `content`                                                                 | 思考过程（reasoning）           |\n| `tool_call`   | `toolName`, `toolCallId`, `args`                                          | 工具调用，`args` 为 JSON 字符串 |\n| `tool_result` | `toolName`, `toolCallId`, `content`, `artifacts?`, `renderMode?`, `html?`, `markdown?`, `defaultExpanded?` | 工具返回结果（文件产物已上移至消息级 `UIMessage.artifacts`，part 级 `artifacts` 仅供自定义 slot 取用）；`defaultExpanded=true` 结果块默认展开（缺省收起），来源为工具配置 `config.default_expanded` 或 `renderMode===\"html\"` |\n| `error`       | `content`                                                                 | 错误信息                        |\n| `attachment`  | `attachment`                                                              | 用户消息附件 chip（发送时本地构造 / 历史加载由后端映射，有 `url` 时可下载） |\n| `interrupt`   | `interrupt`, `resolved?`, `response?`                                     | 中断交互卡片（HITL）            |\n\n### 11.3 ChatEvent（流式事件）\n\n```ts\nexport interface ChatEvent {\n  type:\n    | \"user\"\n    | \"thinking\"\n    | \"ai\"\n    | \"tool_call\"\n    | \"tool_result\"\n    | \"done\"\n    | \"stop\"\n    | \"error\"\n    | \"interrupt\";\n  content: string;\n  toolName?: string;\n  toolCallId?: string;\n  args?: string; // JSON.stringify 后的字符串\n  sessionId?: string;\n  messageId?: string; // done/stop 事件携带的后端消息标识（= conversation_messages.message_id，feedback 按它定位消息）\n  interrupt?: InterruptEvent; // interrupt 事件携带中断详情\n  artifacts?: Artifact[]; // tool_result 顶层产物；done 事件汇总本轮产物（Widget 挂到消息级渲染文件卡片）\n  renderMode?: string; // \"html\" 时工具结果为富文本\n  html?: string; // renderMode===\"html\" 时的 HTML 内容\n  markdown?: string; // renderMode===\"markdown\" 时的 markdown 内容\n  defaultExpanded?: boolean; // tool_result 顶层 default_expanded：结果块默认展开（缺省收起）\n  roundId?: string; // session.start/done 携带，本轮对话 id\n}\n```\n\n---\n\n## 12. Human-in-the-Loop\n\nAgent 执行中需要人类介入时（确认敏感操作、选择方案、补充信息、审核内容等），SDK 提供统一的中断交互机制。\n\n### 12.1 核心流程\n\n```\nAgent 执行中\n  → 后端发送 SSE interrupt 事件\n  → SDK 渲染中断交互卡片（按 interruptType 分发）\n  → 用户完成操作\n  → SDK 调用 respondInterrupt() 回传响应\n  → Agent 基于响应继续执行\n```\n\n### 12.2 interrupt 事件\n\n```json\n{\n  \"type\": \"interrupt\",\n  \"interruptId\": \"int_001\",\n  \"interruptType\": \"confirm\",\n  \"content\": \"即将执行转账 ¥500，确认执行？\",\n  \"options\": [\"确认\", \"取消\"]\n}\n```\n\n### 12.3 响应中断\n\n```ts\nawait sdk.respondInterrupt(interruptId, sessionId, {\n  action: \"confirm\",\n});\n```\n\n### 12.4 Widget 自动处理\n\nWidget 内置中断卡片渲染，收到 `interrupt` 事件后自动展示对应交互卡片，用户操作后自动回传，无需业务方处理：\n\n```ts\nmount(\"#chat\", { sdk }).open();\n// 遇到 interrupt 时：自动渲染卡片 → 用户点击 → 自动 respondInterrupt → Agent 继续\n```\n\n> interrupt 帧是流的**暂停点**（后端不发 `done`），`respondInterrupt()` 后的续事件在同一 SSE 流上返回；续流结束（或嵌套 interrupt 再次暂停）后，输入框均可正常继续发送——挂起/续流状态由 Widget 自动管理。\n>\n> pending interrupt 期间在输入框直接发文本（不点卡片）也是\"作答\"：Widget 自动路由到 `POST /chat/interrupt/{interruptId}/respond`（`action=submit` + 原文），而非新开 `/chat` 轮；答案回填到中断卡片，不另插用户气泡（与历史加载口径一致）。\n\n也可通过插槽自定义中断卡片：\n\n```ts\nmount(\"#chat\", {\n  sdk,\n  slots: {\n    InterruptCard: MyInterruptCard, // 自定义全部类型\n  },\n});\n```\n\n### 12.5 纯 API 模式手动处理\n\n```ts\nsdk.chat({\n  sessionId,\n  message: \"帮我转账 ¥500\",\n  onMessage: (e) => {\n    if (e.type === \"interrupt\" && e.interrupt) {\n      // 自定义 UI 处理\n      const ok = window.confirm(e.interrupt.content);\n      sdk.respondInterrupt(e.interrupt.interruptId, sessionId, {\n        action: ok ? \"confirm\" : \"cancel\",\n      });\n    }\n  },\n});\n```\n\n### 12.6 interruptType 一览\n\n| interruptType | 交互     | action                | value 示例              |\n| ------------- | -------- | --------------------- | ----------------------- |\n| `confirm`     | 二次确认 | `confirm` / `cancel`  | —                       |\n| `select`      | 单选     | `select`              | `\"flight_a\"`            |\n| `multiSelect` | 多选     | `submit`              | `[\"name\", \"phone\"]`     |\n| `input`       | 文本输入 | `submit`              | `\"123456\"`              |\n| `form`        | 表单     | `submit`              | `{ name: \"张三\" }`      |\n| `review`      | 内容审阅 | `approve` / `reject`  | 修改后内容              |\n| `approve`     | 审批流   | `approve` / `reject`  | 驳回原因                |\n| `upload`      | 文件上传 | `submit`              | `{ fileId, fileName }`  |\n| `image`       | 图片选择 | `select` / `reject`   | 图片索引                |\n| `auth`        | 授权请求 | `authorized` / `skip` | —                       |\n| `captcha`     | 人机验证 | `verified`            | `\"captcha_token\"`       |\n| `decision`    | 流程分支 | `decide`              | `\"retry\"` 等            |\n| `rating`      | 评分     | `rate`                | `4`                     |\n| `date`        | 日期选择 | `submit`              | `\"2026-08-21T14:00:00\"` |\n| `location`    | 位置选择 | `submit`              | `{ address, lat, lng }` |\n\n> `form` 的字段定义见 `FormField`（`types.ts`）：`type` 支持 `text` / `number` / `password` / `textarea` / `select` / `multiSelect` / `date`；`options` 支持字符串数组或 `{ value, label }` 数组。已回答的历史 interrupt 以禁用态回显用户答案。\n\n> 每个 `interruptType` 的完整字段定义见 [API 文档](./API.md) 与 [HITL 设计文档](../docs/superpowers/specs/2026-08-18-human-in-the-loop-design.md)。\n\n---\n\n## 13. 高级用法\n\n### 13.1 纯 API 模式（不用 Widget）\n\n不挂载组件，仅使用 API 层构建自己的 UI：\n\n```ts\nimport { createSuperAgent } from \"super-agent-sdk\";\n\nconst sdk = createSuperAgent({\n  botCode: \"tech-researcher\",\n  tokenGateway: \"/api/gateway\",\n});\nsdk.setToken(\"<TOKEN>\");\n\nconst sessionId = await sdk.createSession();\n\nlet full = \"\";\nsdk.chat({\n  sessionId,\n  message: \"你好\",\n  onMessage: (e) => {\n    if (e.type === \"ai\") full += e.content;\n  },\n  onDone: ({ sessionId, content }) => console.log(sessionId, content),\n  onError: (err) => console.error(err),\n});\n```\n\n### 13.2 使用 Hooks\n\n从 `super-agent-sdk/widget` 导出 `useChat`、`useConversations`，可在自己的 React 应用中复用：\n\n```ts\nexport function useChat(options: UseChatOptions): UseChatReturn;\n\ninterface UseChatOptions {\n  sdk: SuperAgentSDK;\n  sessionId: string | null;\n  onSessionCreated?: (sessionId: string) => void;\n  onStreamStart?: (sessionId: string) => void;\n  onStreamEnd?: (sessionId: string) => void;\n  onError?: (error: Error) => void;\n  onMessageSend?: (message: string) => void;\n}\n\ninterface UseChatReturn {\n  messages: UIMessage[];\n  status: ChatStatus;\n  error: Error | null;\n  sendMessage: (content: string) => void;\n  stop: () => void;\n  regenerate: () => void;\n  setMessages: (messages: UIMessage[]) => void;\n  respondToInterrupt: (\n    interruptId: string,\n    response: InterruptResponse,\n  ) => void;\n}\n```\n\n```ts\nexport function useConversations(\n  options: UseConversationsOptions,\n): UseConversationsReturn;\n\ninterface UseConversationsOptions {\n  sdk: SuperAgentSDK;\n  onConversationChange?: (sessionId: string) => void;\n  enabled?: boolean; // 默认 true，false 时不自动加载\n}\n\ninterface UseConversationsReturn {\n  conversations: Conversation[];\n  activeConversationId: string | null;\n  loading: boolean;\n  hasMore: boolean;\n  loadConversations: () => Promise<void>;\n  loadMore: () => Promise<void>;\n  switchConversation: (sessionId: string) => Promise<UIMessage[]>;\n  newConversation: () => Promise<void>;\n  deleteConversation: (sessionId: string) => Promise<void>;\n  renameConversation: (sessionId: string, title: string) => Promise<void>;\n  setActiveConversationId: (id: string | null) => void;\n}\n```\n\n```tsx\nfunction MyChat({ sdk }: { sdk: SuperAgentSDK }) {\n  const conv = useConversations({ sdk });\n  const chat = useChat({ sdk, sessionId: conv.activeConversationId });\n\n  return (\n    <div>\n      {chat.messages.map((m) => (\n        <div key={m.id}>\n          {m.role}:{\" \"}\n          {m.parts.map((p) => (p.type === \"text\" ? p.content : \"\")).join(\"\")}\n        </div>\n      ))}\n      <button onClick={() => chat.sendMessage(\"你好\")}>发送</button>\n    </div>\n  );\n}\n```\n\n> `useChat` 在 `sessionId` 为空时会自动调用 `sdk.createSession()` 创建新会话，无需手动处理。\n\n### 13.3 Token 续期\n\n请求返回 `401` 时，SDK 自动重新调用 `POST {tokenGateway}/superagent/v2/token/generate` 获取新 token。\n\n### 13.4 停止与取消请求\n\n`chat()` 返回 `AbortController`；或传入外部 `AbortSignal`（SDK 会合并内部信号，任一触发即中断）。\n\n推荐使用双信号机制停止生成（Widget 内置停止按钮已自动处理）：\n\n```ts\nconst controller = sdk.chat({\n  sessionId,\n  message: \"...\",\n  stream: true,\n  onDone,\n});\n// 双信号停止：abort 断 SSE + POST /chat/stop 广播后端取消\ncontroller.abort();\nawait sdk.stopGeneration(sessionId);\n```\n\n纯客户端取消（不通知后端）：\n\n```ts\ncontroller.abort();\n// 或使用外部 signal\nconst ac = new AbortController();\nsdk.chat({ sessionId, message: \"...\", signal: ac.signal });\nac.abort();\n```\n","readmeFilename":"README.md"}