{"_id":"@baoyog/agent-vue2","_rev":"9-37fb250e951aa1958100d483583b932f","name":"@baoyog/agent-vue2","dist-tags":{"latest":"1.6.1"},"versions":{"1.1.0":{"name":"@baoyog/agent-vue2","version":"1.1.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.1.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"0cabbc9ca08d79105523ef1461f7e696e472a192","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.1.0.tgz","fileCount":5,"integrity":"sha512-oHjCBQDt80oN5vBt18v8D/kCFzajRGFn0N1srxM0a5IL1ri11noSRe1Eu2JvOc1K4/d8fUl2Wdn6YHfVuPpPzQ==","signatures":[{"sig":"MEUCIA8eLOiF9vOT0/PnKPHDaq9N946ABI5klR4KrSBev6aPAiEA6n0zDispxCsZti2qXJ66s9rbvFDwXMo9l+D2PIkLm6g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50277},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"0739123cbb95471255c4032400ac20d3a3601c80","scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"10.9.0","description":"宝遥智能体 Vue2 通用插件 - 无第三方 UI 框架依赖的嵌入式对话组件","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.1.0_1786285332638_0.08293254900705072","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@baoyog/agent-vue2","version":"1.2.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.2.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"8c281bcbcc0ea252746289ba5497cb05c7964081","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.2.0.tgz","fileCount":5,"integrity":"sha512-MxH00HqscLAtwanJ5pxwO6iWORZpDhj4bhtAqkQXc4VbpMTLJ7O2SBuKJVFpxOqA5eKyhI3xjp3bksqazY3MWg==","signatures":[{"sig":"MEYCIQC7k5UZOql+tTzP8stt41YWtNdOC4dFI/2lZC5BkIQ4ZAIhAJE9A+cOndr/DQ9UFccmKE48h/SYbdXSGL+7vW7rpBQZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77316},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"0739123cbb95471255c4032400ac20d3a3601c80","scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"10.9.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.2.0_1786286662503_0.49757904702294486","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@baoyog/agent-vue2","version":"1.3.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.3.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"7e8c0e2d09382394f75a7841b12aeb6a6ae7c2b5","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.3.0.tgz","fileCount":5,"integrity":"sha512-9I/o0+ODe/b+G61IVZr7a8+IaRMvWwAOITfzDPpp8hivQMFglLNouUYtF3lutTiNcXSjOtYxjqLpKCY4gzxZ2g==","signatures":[{"sig":"MEUCIQCuFqTlkhGlJZqD91g21fmUiuEVtkfPlltsMgh9BJotagIgX0DcaeZYJocoWWTKlHMCc6Hp7uaEAly6ql9Ys0Yq1V8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90050},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"63af68e6f7466d43eebb0981fdc7beefa986c5d5","scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"10.9.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.3.0_1786333465140_0.9357028185811078","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@baoyog/agent-vue2","version":"1.3.1","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.3.1","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"19674f3566ac123a784e7edefdf23b136a551747","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.3.1.tgz","fileCount":5,"integrity":"sha512-8FnM3H5sloZQ3lRxDumyhox1LwaoO7VhBrNagMam48yw755KVCr3XkI3os4Iqmo3fOYIsrgqF3/uXOEh/+V/zg==","signatures":[{"sig":"MEUCIQD+wWYqv/hyxIezAavM+5jbJpFbSpKw7C3/P6xHHl+vgQIgKWtUQWGlD93a6xRgsn69qNHTmtToJpsmFdZssMZ+M70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93235},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"63af68e6f7466d43eebb0981fdc7beefa986c5d5","scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"10.9.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.3.1_1786333759619_0.9733301286333456","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@baoyog/agent-vue2","version":"1.3.2","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.3.2","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"916a4fa75bfa2e47fdde4301255c5c761175cb36","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.3.2.tgz","fileCount":5,"integrity":"sha512-7FssDJ62WOdWW3E+HeaHaTypBDGF83fgLwUEYOwb+iGdniIrPJWurlPF1z0eK8cr/pBrttLyY5wicviCP1IWaQ==","signatures":[{"sig":"MEUCID9XHPToJdcU9RWLWVElC/zSwvzaICPT6ZpfRXKDSf6wAiEAugClabF/Y7Bkv8PjasfeidyqDIlozS1uP8SyTgB1qzQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93743},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"039732a1c8411855e861bf6c3698a344c1eff183","scripts":{"dev":"vite","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"11.17.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.3.2_1787239021483_0.5880542429618678","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@baoyog/agent-vue2","version":"1.4.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.4.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"bdee5150834b88e50c760d52bdc00de0347b476d","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.4.0.tgz","fileCount":5,"integrity":"sha512-vbJZx6H3kOXYprepHusqL/9bSIlvEfPoYaprn6U/Z7X9o5aCaAWBjRg4C1jjI0mHTo9j48NrzidSiXyc4MXg4A==","signatures":[{"sig":"MEQCIAXVtAuU0UvpEqNJ8H5qMnLC3eFy1NfSla5CYVg5N1vKAiBJfRSWdlDoaEH6Wc0oSvjqMOkwejsYkjJNCTjHa0e2Yg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119345},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"36ddf0080fbac0343fbf2389e809fd49ed2ee2d8","scripts":{"dev":"vite","test":"node --test test/*.test.js","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"11.17.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.4.0_1787287757977_0.3345091482549407","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@baoyog/agent-vue2","version":"1.5.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.5.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"6f59f9d8922ed08bce55ea47810c1dc907f736ed","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.5.0.tgz","fileCount":5,"integrity":"sha512-Ga9yBwjhkg2bH/D1BmUDq88W/BkkY7CohRt5lBCudJoH12ukVaJ3llD8VcvrUqovcsk9DZTcEQ74oRxTxK62Mg==","signatures":[{"sig":"MEUCIASLY5uzZzbRpGXFrcV1rMIyPyg46WrW1Wgvwo2/t34kAiEAvppi4rznvYT5MLxW8Jxlf6iVnfyEjBgwhA3RYVSp/YU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131534},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"36ddf0080fbac0343fbf2389e809fd49ed2ee2d8","scripts":{"dev":"vite","test":"node --test test/*.test.js","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"11.17.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.5.0_1787288086864_0.2125495871663492","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@baoyog/agent-vue2","version":"1.6.0","keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","_id":"@baoyog/agent-vue2@1.6.0","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"dist":{"shasum":"6ade2b9c0507761df390be698e0c74375308626f","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.6.0.tgz","fileCount":5,"integrity":"sha512-BeCqqksjCljMqEOu4zIQa9EFbjyVECrKmJET+aZ9MmjmCz9yjkYDHPFPckKiyIghox/8stR141G1RElbZeCMOg==","signatures":[{"sig":"MEUCIHb9PjyaG954gFCR4livPoREeAcSTI2qZz25hgloxqdCAiEAuwq6Jl6a3kPcjDfuXgE9igeJXO7uBPoWqzjj2aK8ayw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143726},"main":"./dist/baoyog-agent-vue2.umd.js","type":"module","style":"./dist/style.css","module":"./dist/baoyog-agent-vue2.es.js","engines":{"node":">=12"},"gitHead":"36ddf0080fbac0343fbf2389e809fd49ed2ee2d8","scripts":{"dev":"vite","test":"node --test test/*.test.js","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"_npmVersion":"11.17.0","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^2.7.16","sass":"^1.70.0","vite":"^5.4.0","@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vue-template-compiler":"^2.7.16"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"_npmOperationalInternal":{"tmp":"tmp/agent-vue2_1.6.0_1787290224322_0.4414868735694686","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@baoyog/agent-vue2","version":"1.6.1","description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","type":"module","main":"./dist/baoyog-agent-vue2.umd.js","module":"./dist/baoyog-agent-vue2.es.js","style":"./dist/style.css","scripts":{"dev":"vite","build":"vite build","test":"node --test test/*.test.js","preview":"vite preview"},"engines":{"node":">=12"},"peerDependencies":{"vue":"^2.6.0 || ^2.7.0"},"devDependencies":{"@baoyog/agent-core":"file:../baoyog-ai-agent-core","@vitejs/plugin-vue2":"^2.3.0","vite":"^5.4.0","vue":"^2.7.16","sass":"^1.70.0","vue-template-compiler":"^2.7.16"},"keywords":["vue2","ai","agent","chat","form","baoyog"],"license":"MIT","gitHead":"36ddf0080fbac0343fbf2389e809fd49ed2ee2d8","_id":"@baoyog/agent-vue2@1.6.1","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-MsFs59ulBRZCFA9M+svLvQesBb13+Kg8hSmt7FEblUbamGc0/cfji5kDu7BrnfC5E8s2DWsEHpKquazZhHEEhg==","shasum":"213fec895048ecff25a29db18fbbea87a13c0b00","tarball":"https://registry.npmjs.org/@baoyog/agent-vue2/-/agent-vue2-1.6.1.tgz","fileCount":5,"unpackedSize":147010,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAuqhndXHX/9A4tn3exz3xAJubP/BjYB6Nlg0X1y79kdAiA4dhKdRkeJ3/eZMLAvVR5g0UDzYQCc0Wrpy4BWnItsEw=="}]},"_npmUser":{"name":"likun_2026","email":"515844980@qq.com"},"directories":{},"maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agent-vue2_1.6.1_1787290617923_0.4523324258505639"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-09T14:22:12.456Z","modified":"2026-08-21T05:36:58.222Z","1.1.0":"2026-08-09T14:22:12.795Z","1.2.0":"2026-08-09T14:44:22.657Z","1.3.0":"2026-08-10T03:44:25.288Z","1.3.1":"2026-08-10T03:49:19.770Z","1.3.2":"2026-08-20T15:17:01.749Z","1.4.0":"2026-08-21T04:49:18.134Z","1.5.0":"2026-08-21T04:54:47.054Z","1.6.0":"2026-08-21T05:30:24.467Z","1.6.1":"2026-08-21T05:36:58.061Z"},"license":"MIT","keywords":["vue2","ai","agent","chat","form","baoyog"],"description":"宝遥智能体 Vue2 通用插件 - 支持标准化表单助手且无第三方 UI 框架依赖","maintainers":[{"name":"likun_2026","email":"515844980@qq.com"}],"readme":"# 宝遥智能体 Vue2 插件 (@baoyog/agent-vue2)\n\n可嵌入任意 **Vue2** 系统的智能体对话组件，支持 SSE 流式通信、工具调用展示、Markdown 渲染。组件使用原生 HTML、内置 SVG 图标和隔离样式，不依赖 Element UI、Ant Design Vue 或其他第三方 UI 框架。\n\n从 `1.2.0` 开始提供 `AiFormAssistant` 和 `createFormAdapter`，用于把表单快照、字段白名单、类型转换、最终确认和补丁回填标准化。`1.3.0` 起内置统一智能体客户端，支持一致的认证、会话、SSE、停止生成和标准错误信息。\n\n鉴权、会话、AG-UI SSE、停止生成和标准错误统一使用 `@baoyog/agent-core`。业务系统推荐通过 `getAccessToken` 从自己的服务端取得短期 Token，禁止在浏览器中配置 Client Secret。\n\n```js\ngetAccessToken: function (context) {\n  return businessApi.getAiToken({ force: context.force }).then(function (res) { return res.token })\n}\n```\n\n## 安装\n\n```bash\nnpm install @baoyog/agent-vue2\n```\n\n> 只有 `vue` 是 peerDependency。Vue 2.6、Vue 2.7 项目均可使用。\n\n## 使用\n\n### 标准表单助手（推荐）\n\n```vue\n<template>\n  <AiFormAssistant\n    scene-code=\"purchase.order\"\n    biz-type=\"采购订单\"\n    title=\"采购单填报助手\"\n    :base-url=\"agent.baseUrl\"\n    :chat-key=\"agent.chatKey\"\n    :agent-id=\"agent.agentId\"\n    :agent-code=\"agent.agentCode\"\n    :record-id=\"orderId\"\n    :adapter=\"formAdapter\"\n    :context-params=\"{ token, tenantId, userId }\"\n    @save-request=\"handleSave\"\n  />\n</template>\n\n<script>\nimport { AiFormAssistant, createFormAdapter, formConverters } from '@baoyog/agent-vue2'\nimport '@baoyog/agent-vue2/dist/style.css'\n\nexport default {\n  components: { AiFormAssistant },\n  computed: {\n    formAdapter() {\n      return createFormAdapter({\n        getValues: () => this.form,\n        setValue: (key, value) => this.$set(this.form, key, value),\n        fields: {\n          name: { label: '订单名称' },\n          amount: {\n            label: '订单金额',\n            fromForm: formConverters.minorToMajor,\n            toForm: formConverters.majorToMinor,\n          },\n          signDate: { label: '签订日期', fromForm: formConverters.date },\n        },\n      })\n    },\n  },\n}\n</script>\n```\n\n一轮对话中多次调用 `propose_form_patch` 时，`AgentChat` 只在运行结束后输出最后一份补丁；`AiFormAssistant` 再统一展示一次确认。只有用户点击“应用到表单”后才调用适配器，`save-request` 也只表示保存意图，最终仍由宿主系统执行原有校验和保存方法。\n\n### 约定式通用适配器\n\n多个业务页面接入时，推荐使用 `createConventionFormAdapter`。页面只声明子组件、字段来源、转换预设、选择器配对和表格方法名，不再重复实现 `getValues`、`setValue`、金额转换及组件定位。\n\n```js\nimport { createConventionFormAdapter } from '@baoyog/agent-vue2'\n\ncreateConventionFormAdapter({\n  page: this,\n  defaultSection: 'info',\n  sections: {\n    info: { ref: 'OrderInfo', model: 'formItem' },\n    detail: { ref: 'OrderDetail', model: 'formItem' },\n  },\n  fields: {\n    name: { label: '订单名称', required: true },\n    amount: { label: '订单金额', converter: 'money' },\n    customerId: {\n      label: '客户 ID',\n      pair: { labelKey: 'customerName', method: 'setAgentCustomer' },\n    },\n    customerName: { label: '客户名称', writable: false },\n  },\n  tables: {\n    detailList: {\n      section: 'detail',\n      source: 'detailList',\n      label: '订单明细',\n      component: 'table',\n      rowKey: 'agentRowId',\n      ensureMethod: 'ensureAgentRowIds',\n      addMethod: 'addAgentRow',\n      setCellMethod: 'setAgentCell',\n      removeMethod: 'removeAgentRow',\n      columns: {\n        productName: { label: '产品', required: true },\n        price: { label: '单价', converter: 'money' },\n        quantity: { label: '数量', converter: 'number' },\n      },\n    },\n  },\n  actions: {\n    openCustomerSelector: {\n      label: '打开客户选择器',\n      section: 'info',\n      ref: 'customerSelect',\n      method: 'handleCcClick',\n      args: [],\n    },\n  },\n  validateForm: () => this.validatePage(),\n})\n```\n\n内置转换预设包括 `money`、`percent`、`number`、`date`、`stringArray`。`pair` 用于统一处理 ID 与显示名称；表格列同样支持转换预设。无法通用化的联动计算继续放在宿主组件方法或 `afterApply` 钩子中。\n\n### 动态表单与字段联动\n\n字段存在依赖关系时，通过 `dependsOn` 声明顺序，并用 `isReady` 或 `waitFor` 告诉运行时下游字段何时完成加载。确认回填后，组件会逐字段执行：先设置上游字段，触发宿主页面原有 change 逻辑，等待下游选项就绪，再校验并设置下游字段。\n\n```js\nformAdapter() {\n  return createFormAdapter({\n    getValues: () => this.form,\n    setValue: async (key, value) => {\n      this.$set(this.form, key, value)\n      if (key === 'categoryId') await this.loadProducts(value)\n    },\n    fields: {\n      categoryId: {\n        label: '产品分类',\n        component: 'select',\n        valueType: 'string',\n        required: true,\n        options: this.categoryOptions,\n      },\n      productId: {\n        label: '产品',\n        component: 'select',\n        valueType: 'string',\n        required: true,\n        dependsOn: ['categoryId'],\n        optionsSource: { type: 'api', trigger: 'categoryId' },\n        getOptions: () => this.productOptions,\n        isReady: () => !this.productLoading,\n        validate: (value) => this.productOptions.some((item) => item.value === value)\n          || '所选产品不属于当前分类',\n      },\n    },\n  })\n}\n```\n\n动态适配器同时提供：\n\n- `getSchema()`：返回可序列化字段结构、依赖和选项来源。\n- `getState()`：返回字段当前值、显隐、禁用和加载状态。\n- `getOptions(field)`：读取字段最新选项。\n- `waitForField(field)`：等待异步联动完成。\n- `setField(field, value)`：通过宿主页面赋值逻辑修改单字段。\n- `executePatch(values)`：按依赖顺序执行整份补丁。\n\n`AiFormAssistant` 会把 `formSchema`、`formState` 和 `currentFormData` 放入每次对话的上下文。旧版只实现基础 `getSnapshot/applyPatch` 的适配器仍然兼容。\n\n### 动态明细表格\n\n数组字段声明为 `component: 'table'` 后，运行时可以按行标识更新已有行、添加新行，并处理行内字段联动：\n\n```js\nproductLines: {\n  label: '产品明细',\n  component: 'table',\n  rowKey: 'id',\n  // 默认 false：补丁中未出现的已有行不会被删除。\n  replaceRows: false,\n  getRows: () => this.form.productLines,\n  addRow: row => this.addProductRow(row),       // 返回新行对象或行 ID\n  updateRow: (rowId, patch) => this.updateProductRow(rowId, patch),\n  removeRow: rowId => this.removeProductRow(rowId),\n  setCell: (rowId, column, value) => this.setProductCell(rowId, column, value),\n  waitForCell: (rowId, column) => this.waitProductCellReady(rowId, column),\n  columns: {\n    categoryId: { label: '分类', component: 'select' },\n    productId: {\n      label: '产品',\n      component: 'select',\n      dependsOn: ['categoryId'],\n      toForm: (value, context) => this.resolveProductId(context.rowKey, value),\n      validate: (value, context) => this.isValidProduct(context.rowKey, value)\n        || '产品不属于当前分类',\n    },\n    quantity: { label: '数量', valueType: 'number', required: true },\n    unitPrice: { label: '单价', valueType: 'number', required: true },\n  },\n}\n```\n\n对应补丁仍使用普通数组，便于智能体生成和用户确认：\n\n```json\n{\n  \"productLines\": [\n    { \"id\": \"LINE-1\", \"quantity\": 10 },\n    { \"categoryId\": \"CAT-1\", \"productId\": \"产品一\", \"quantity\": 2, \"unitPrice\": 100 }\n  ]\n}\n```\n\n运行规则：\n\n- 包含行 ID：更新该行中补丁明确给出的单元格。\n- 不包含行 ID：调用 `addRow` 创建新行，宿主必须返回新行对象或行 ID。\n- 行内字段根据 `columns.*.dependsOn` 排序并等待联动。\n- `replaceRows` 默认为 `false`，不会因为模型漏写某行而删除已有数据。\n- 只有业务明确要求“数组即完整明细”时才开启 `replaceRows: true`；开启后补丁中缺失的已有行会调用 `removeRow`。\n\n适配器还公开 `getTableRows`、`addTableRow`、`updateTableRow` 和 `removeTableRow`，宿主页面可以用于调试或自定义确认流程。\n\n### 复杂业务动作\n\n附件选择、客户选择器、保存草稿等操作不能表示成普通字段值时，在适配器中注册白名单动作：\n\n```js\ncreateFormAdapter({\n  getValues: () => this.form,\n  fields: { /* 字段协议 */ },\n  validateForm: () => this.$refs.form.validate()\n    .then(() => ({ valid: true }))\n    .catch(() => ({ valid: false, message: '请先完善必填项' })),\n  actions: {\n    openCustomerSelector: {\n      label: '打开客户选择器',\n      description: '打开页面已有的客户选择弹窗',\n      execute: payload => this.openCustomerSelector(payload.keyword),\n    },\n    requestAttachmentUpload: {\n      label: '选择合同附件',\n      description: '打开文件选择器，文件仍由用户选择',\n      execute: () => this.$refs.attachmentUploader.open(),\n    },\n    saveDraft: {\n      label: '保存草稿',\n      execute: () => this.saveDraft(),\n    },\n  },\n})\n```\n\n平台智能体需要启用内置工具 `propose_form_actions`。工具只返回动作计划，不执行页面操作。插件在一轮运行结束后展示统一确认框，用户确认后才调用 `executeActions`。\n\n支持的标准动作类型：\n\n| 类型 | 参数 | 作用 |\n|------|------|------|\n| `set_field` | `field`, `value` | 修改一个白名单字段 |\n| `set_fields` | `values` | 按联动协议批量回填 |\n| `add_table_row` | `field`, `value` | 新增明细行 |\n| `update_table_row` | `field`, `rowKey`, `values` | 更新指定明细行 |\n| `remove_table_row` | `field`, `rowKey` | 删除指定明细行 |\n| `trigger_action` | `name`, `payload` | 调用宿主注册的白名单业务动作 |\n| `validate` | `fields` | 调用宿主表单校验 |\n| `request_submit` | - | 产生 `save-request`，不会直接提交 |\n\n`trigger_action` 的 `name` 不在 `actions` 注册表中时会被拒绝。上传动作只能打开宿主文件选择器，智能体不能代替用户读取或选择本地文件。\n\n### 方式一：全局注册\n\n```js\n// main.js\nimport Vue from 'vue'\nimport BaoyogAgent from '@baoyog/agent-vue2'\nimport '@baoyog/agent-vue2/dist/style.css'\n\nVue.use(BaoyogAgent, {\n  baseUrl: 'https://ai.example.com/web/api',\n  devBaseUrl: 'http://127.0.0.1:13060/web/api',\n  chatKey: '从智能体发布配置中获取',\n  agentId: '2079080349952217090',\n  agentCode: 'form_agent_001',\n})\n```\n\n```vue\n<!-- 任意组件 -->\n<template>\n  <AgentChat\n    agent-code=\"form_agent_001\"\n    biz-type=\"采购合同\"\n    :context-params=\"{ token: shortLivedBusinessToken }\"\n    @form-patch=\"applyPatch\"\n    @submit-request=\"confirmSubmit\"\n  />\n</template>\n```\n\n### 方式二：按需引入\n\n```vue\n<script>\nimport { AgentChat } from '@baoyog/agent-vue2'\nimport '@baoyog/agent-vue2/dist/style.css'\n\nexport default {\n  components: { AgentChat },\n}\n</script>\n\n<template>\n  <AgentChat\n    :api-base-url=\"apiUrl\"\n    :agent-code=\"code\"\n    :token=\"token\"\n    :biz-type=\"bizType\"\n  />\n</template>\n```\n\n### 方式三：CDN\n\n```html\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@baoyog/agent-vue2/dist/style.css\">\n<script src=\"https://unpkg.com/vue@2.7\"></script>\n<script src=\"https://unpkg.com/@baoyog/agent-vue2\"></script>\n<script>\n  // 自动注册 AgentChat 组件\n  new Vue({ el: '#app' })\n</script>\n```\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `baseUrl` | `String` | - | 生产环境后端 API 地址（包含 `/web/api`） |\n| `devBaseUrl` | `String` | - | 本地后端 API 地址（包含 `/web/api`） |\n| `chatKey` | `String` | **必填** | 静默换取平台运行 Token |\n| `agentId` | `String` | **必填** | 创建持久会话所需的智能体数据库 ID |\n| `agentCode` | `String` | **必填** | 智能体编码 |\n| `bizType` | `String` | `''` | 业务类型，自动生成初始消息 |\n| `contextParams` | `Object` | `{}` | 请求级业务上下文，仅建议传短期凭证 |\n| `title` | `String` | `'AI 助手'` | 面板标题 |\n| `placeholder` | `String` | `'输入消息，Enter 发送...'` | 输入框提示 |\n| `emptyHint` | `String` | `'有什么可以帮你？'` | 空状态提示 |\n| `defaultCollapsed` | `Boolean` | `true` | 是否默认折叠为悬浮按钮 |\n\n## AiFormAssistant Props\n\n除 `AgentChat` 的连接与界面属性外，标准表单助手还支持：\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| `sceneCode` | `String` | 业务场景编码，例如 `contract.sales` |\n| `recordId` | `String/Number` | 当前业务记录 ID；为空表示新增 |\n| `operation` | `String` | 可选，默认根据 recordId 推断 `CREATE/UPDATE` |\n| `adapter` | `Object` | `createFormAdapter` 返回的表单适配器 |\n| `disabled` | `Boolean` | 是否禁用助手 |\n| `contextProvider` | `Function` | 每次发送前补充动态业务上下文 |\n\n事件：`patch-proposed`、`patch-applied`、`actions-proposed`、`actions-applied`、`patch-rejected`、`save-request`、`error`。\n\n## 本地开发\n\n```bash\ncd baoyog-ai-vue2-plugin\nnpm install\nnpm run dev      # 启动 demo（端口 3201）\nnpm run build    # 构建到 dist/\n```\n\n`form-patch` 只表示回填建议，`submit-request` 只表示用户表达了提交意图。插件不会直接调用业务提交接口，宿主页面必须展示确认并再次执行本地校验。\n\n## 通信协议\n\n通过 `POST /api/runtime/agui/run/{agentCode}` 发起 SSE 流式请求，响应遵循 AgentScope SSE 事件协议：\n\n- `TEXT_MESSAGE_START / TEXT_MESSAGE_CONTENT` — AI 回复文本\n- `TOOL_CALL_START / TOOL_CALL_ARGS / TOOL_CALL_RESULT` — 工具调用\n- `RUN_FINISHED` — 执行完成\n- `RUN_ERROR` — 执行失败\n\n## 目录结构\n\n```\nbaoyog-ai-vue2-plugin/\n├── src/\n│   ├── index.js        # 插件入口，install + 导出\n│   ├── AgentChat.vue   # 主组件\n│   ├── AiFormAssistant.vue # 标准表单助手\n│   ├── formAdapter.js  # 表单适配器与转换器\n│   └── ai-agent.js     # Markdown 渲染 + SSE 处理\n├── demo/               # 本地调试\n├── package.json\n└── vite.config.js\n```\n","readmeFilename":"README.md"}