{"id":"cbe83d29-8ab7-4d63-adae-2d83985dbc32","entityType":"agent","slug":"clawhub-zhaobod1-huo15-huihuoyun-odoo","name":"Huo15 Huihuoyun Odoo","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zhaobod1-huo15-huihuoyun-odoo","canonicalPath":"/agent/clawhub-zhaobod1-huo15-huihuoyun-odoo","generatedAt":"2026-10-11T03:58:07.858Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":null},"description":"自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号... Skill: Huo15 Huihuoyun Odoo Owner: zhaobod1 Summary: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号... Tags: latest:1.23.2, plugin:1.23.0 Version history: v1.23.2 | 2026-05-10T18:40:32.216Z | auto - 新增 CHANGELOG.md 文件，便于追踪历史变更 - 更新 package.json（细节未公开） - 文档完整性增强，历史版本变更信息更清晰可查 v1.23.0 | 2026-05-07T09:19:51.849","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-huihuoyun-odoo","sourceUrl":"https://clawhub.ai/zhaobod1/huo15-huihuoyun-odoo","homepage":"https://clawhub.ai/zhaobod1/skills/huo15-huihuoyun-odoo","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zhaobod1/huo15-huihuoyun-odoo","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/zhaobod1/skills/huo15-huihuoyun-odoo","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":null},"stars":null,"forks":null,"downloads":1209,"packageName":null,"latestVersion":"1.23.2","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T01:13:10.703Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T01:13:10.771Z","lastCrawledAt":"2026-10-11T01:13:10.703Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T01:13:10.704Z","lastVerifiedAt":null,"highlights":[{"version":"1.23.2","createdAt":"2026-05-10T18:40:32.216Z","changelog":"- 新增 CHANGELOG.md 文件，便于追踪历史变更 - 更新 package.json（细节未公开） - 文档完整性增强，历史版本变更信息更清晰可查","fileCount":26,"zipByteSize":230925},{"version":"1.23.0","createdAt":"2026-05-07T09:19:51.849Z","changelog":"- 默认权限策略改为按 sender_id 隔离，odoo_connect 默认每个人配自己账号，与 Odoo 内部权限同步。 - 新增 shared 参数（默认 false，原 private 参数标为 deprecated 并兼容），显式支持组织共用公共账号场景。 - 明确规定不再主动判断/质疑用户上传附件内容是否与意图相符，避免错误拦截用户流程。 - SKILL.md 文档更新：详细说明 sender_id 隔离/共享账号用法，补充 LLM 附件处理硬规则。 - 继承 v1.22+ 功能（record_id、include_lines、永久 RPC hook 修复、审批工作流等）。","fileCount":24,"zipByteSize":228656},{"version":"1.22.0","createdAt":"2026-05-04T02:42:27.238Z","changelog":"v1.22.0重点：销售/采购订单查询大幅升级，合同/对账一步到位。 - odoo_sale_orders 和 odoo_purchase_orders 支持直接按 \"name\"（如 S00016）和 record_id 精确查找。 - 新增 include_lines 参数，一次获取明细、合计、税额、付款条件，写销售/采购合同免反复查接口。 - description 字段强化，明确用途防止误操作和手写 JSON-RPC 易错。 - 完全兼容 v1.21 性能修复和 v1.20 审批工作流功能。 - 文档详细标明新用法、应用场景及核心参数。","fileCount":23,"zipByteSize":222958},{"version":"1.21.0","createdAt":"2026-05-03T09:48:25.815Z","changelog":"v1.21.0 性能与稳定性重大修复 - 优化 before_prompt_build：改为只查内存缓存（不再触发 RPC 挂死问题）。 - Odoo RPC 请求新增超时控制，统一使用 AbortSignal.timeout(3000)，防卡线程。 - 启动期异步预热 default agent，明显降低首条响应延迟（P50 由16.4s 预期降至 <3s）。 - 增加发布脚本（scripts/release.sh），并补全历史 CHANGELOG（v1.19、v1.20）。 - SKILL.md 说明和应用场景已更新，涵盖 13 大业务域和 204 个工具。","fileCount":22,"zipByteSize":218368},{"version":"1.10.0","createdAt":"2026-04-26T10:15:18.229Z","changelog":"**Major update with enhanced notification and internal sync capabilities:** - Added modules for envelope caching, mutation logs, notification bus, notification preferences, and notification routing. - Introduced Markdown-to-HTML utility. - Updated config and Odoo client modules to support new notification and caching features. - Refined documentation to clarify scope and usage, removing Odoo-only references for broader compatibility. - Updated dependencies and added package-lock.json for improved package management.","fileCount":19,"zipByteSize":136935},{"version":"1.3.1","createdAt":"2026-04-22T02:39:56.044Z","changelog":"- Updated skill name to \"huo15-claude-odoo\" and display name/description to align with new branding. - Expanded and clarified usage guide, including configuration, feature coverage, and FAQ sections. - Enhanced documentation on supported scenarios for managers in tasks, CRM, project, helpdesk, finance, sales, and daily overview. - Improved tables of natural language command examples and corresponding Odoo actions. - Added detailed list and description of all plugin tools and background sync channels. - Updated changelog to reflect new functionalities and improvements.","fileCount":12,"zipByteSize":37490},{"version":"1.1.1","createdAt":"2026-04-11T13:39:09.930Z","changelog":"自动检测数据库，智能引导用户输入连接信息","fileCount":12,"zipByteSize":31225},{"version":"1.1.0","createdAt":"2026-04-11T06:27:15.918Z","changelog":"v1.1.0: CRM商机、项目里程碑、工时、销售/采购订单、Helpdesk工单、发票/逾期账款、每日概况","fileCount":11,"zipByteSize":26794}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-huihuoyun-odoo","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T03:58:07.855Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huihuoyun-odoo/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":null},"readme":"Skill: Huo15 Huihuoyun Odoo\n\nOwner: zhaobod1\n\nSummary: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号...\n\nTags: latest:1.23.2, plugin:1.23.0\n\nVersion history:\n\nv1.23.2 | 2026-05-10T18:40:32.216Z | auto\n\n- 新增 CHANGELOG.md 文件，便于追踪历史变更\n- 更新 package.json（细节未公开）\n- 文档完整性增强，历史版本变更信息更清晰可查\n\nv1.23.0 | 2026-05-07T09:19:51.849Z | auto\n\n- 默认权限策略改为按 sender_id 隔离，odoo_connect 默认每个人配自己账号，与 Odoo 内部权限同步。\n- 新增 shared 参数（默认 false，原 private 参数标为 deprecated 并兼容），显式支持组织共用公共账号场景。\n- 明确规定不再主动判断/质疑用户上传附件内容是否与意图相符，避免错误拦截用户流程。\n- SKILL.md 文档更新：详细说明 sender_id 隔离/共享账号用法，补充 LLM 附件处理硬规则。\n- 继承 v1.22+ 功能（record_id、include_lines、永久 RPC hook 修复、审批工作流等）。\n\nv1.22.0 | 2026-05-04T02:42:27.238Z | auto\n\nv1.22.0重点：销售/采购订单查询大幅升级，合同/对账一步到位。\n\n- odoo_sale_orders 和 odoo_purchase_orders 支持直接按 \"name\"（如 S00016）和 record_id 精确查找。\n- 新增 include_lines 参数，一次获取明细、合计、税额、付款条件，写销售/采购合同免反复查接口。\n- description 字段强化，明确用途防止误操作和手写 JSON-RPC 易错。\n- 完全兼容 v1.21 性能修复和 v1.20 审批工作流功能。\n- 文档详细标明新用法、应用场景及核心参数。\n\nv1.21.0 | 2026-05-03T09:48:25.815Z | auto\n\nv1.21.0 性能与稳定性重大修复\n\n- 优化 before_prompt_build：改为只查内存缓存（不再触发 RPC 挂死问题）。\n- Odoo RPC 请求新增超时控制，统一使用 AbortSignal.timeout(3000)，防卡线程。\n- 启动期异步预热 default agent，明显降低首条响应延迟（P50 由16.4s 预期降至 <3s）。\n- 增加发布脚本（scripts/release.sh），并补全历史 CHANGELOG（v1.19、v1.20）。\n- SKILL.md 说明和应用场景已更新，涵盖 13 大业务域和 204 个工具。\n\nv1.10.0 | 2026-04-26T10:15:18.229Z | auto\n\n**Major update with enhanced notification and internal sync capabilities:**\n\n- Added modules for envelope caching, mutation logs, notification bus, notification preferences, and notification routing.\n- Introduced Markdown-to-HTML utility.\n- Updated config and Odoo client modules to support new notification and caching features.\n- Refined documentation to clarify scope and usage, removing Odoo-only references for broader compatibility.\n- Updated dependencies and added package-lock.json for improved package management.\n\nv1.3.1 | 2026-04-22T02:39:56.044Z | auto\n\n- Updated skill name to \"huo15-claude-odoo\" and display name/description to align with new branding.\n- Expanded and clarified usage guide, including configuration, feature coverage, and FAQ sections.\n- Enhanced documentation on supported scenarios for managers in tasks, CRM, project, helpdesk, finance, sales, and daily overview.\n- Improved tables of natural language command examples and corresponding Odoo actions.\n- Added detailed list and description of all plugin tools and background sync channels.\n- Updated changelog to reflect new functionalities and improvements.\n\nv1.1.1 | 2026-04-11T13:39:09.930Z | user\n\n自动检测数据库，智能引导用户输入连接信息\n\nv1.1.0 | 2026-04-11T06:27:15.918Z | user\n\nv1.1.0: CRM商机、项目里程碑、工时、销售/采购订单、Helpdesk工单、发票/逾期账款、每日概况\n\nArchive index:\n\nArchive v1.23.2: 26 files, 230925 bytes\n\nFiles: CHANGELOG-v1.19.md (3544b), CHANGELOG-v1.20.md (6088b), CHANGELOG-v1.22.md (4958b), CHANGELOG-v1.23.md (6592b), CHANGELOG.md (839b), index.ts (329201b), openclaw.plugin.json (2542b), package-lock.json (259330b), package.json (1855b), README.md (10748b), scripts/release.sh (11335b), skill-card.md (2795b), SKILL.md (12796b), src/modules/config-manager.ts (7140b), src/modules/envelope-cache.ts (1659b), src/modules/mutation-log.ts (4571b), src/modules/notification-bus.ts (5783b), src/modules/notification-poller.ts (9267b), src/modules/notification-prefs.ts (4397b), src/modules/notification-router.ts (5633b), src/modules/odoo-client.ts (213318b), src/types/index.ts (6609b), src/utils/date-utils.ts (2296b), src/utils/md-to-html.ts (2346b), tsconfig.json (483b), _meta.json (140b)\n\nFile v1.23.2:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号，与内部 RBAC 对齐 — 销售看销售的、管理员看管理员的）；旧 private 参数标 deprecated，新参数 shared（默认 false）；prompt 加附件硬规则（不替用户判断附件内容相符性）。继承 v1.22 record_id+include_lines / v1.21 hook RPC 永久挂修复 / v1.20 审批工作流。Use when：接 Odoo/辉火云、企业 ERP 操作、CRM/任务/财务/销售/工单管理、自然语言企微/钉钉调用 ERP、写销售/采购合同需要订单明细。\nversion: 1.23.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置（v1.23 默认按 sender_id 隔离 — 每人配自己的）\n\n### 方式一：通过对话连接（推荐）\n\n每位同事 @ 机器人时各自配一次自己的辉火云账号：\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 你自己的邮箱@huo15.com，密码 xxxxxx\n\n龙虾自动调 `odoo_connect`，**默认按当前 sender_id 隔离保存**到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`，与 Odoo 内部 RBAC 对齐 —— 销售看销售的、管理员看管理员的，不再共用同一账号。\n\n### 「为什么不默认全员共用？」\n\nv1.10–v1.22 默认全员共享一套凭据，结果 Odoo 内部权限失效（不管你是销售还是管理员，看到的数据完全一样）。v1.23 起反转：**每个 sender_id 用自己的账号 = 权限按 Odoo 用户区分**。这是绝大多数企业期望的协作模型。\n\n### 方式二：组织共用一个公共账号（少数场景）\n\n仅当组织内只有一个 Odoo 公共只读账号、所有同事都用它访问相同数据时：\n\n> 帮我连接辉火云，组织内大家共用这个账号：…，请保存为共享配置\n\nLLM 会调 `odoo_connect(shared=true)` 写入 `default.json`，作为兜底 fallback。**注意**：此时 Odoo RBAC 失效，所有人看到的数据完全一致。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接辉火云企业套件 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## 使用纪律（hard rules，给 LLM）\n\n### 附件 / 文件内容判断\n\n用户上传压缩包/文档/Excel 让你\"建商机/任务/工单\"等操作时：\n\n1. **附件内容由用户负责**。不要解读\"内容是不是跟商机字段对得上\"、\"这文件像不像 ERP 数据\"。即便附件是工厂排产、菜单、随便一个 PDF，也直接按用户意图建记录。\n2. 解压/读附件**仅用于提取用户明示的字段**（如用户说\"客户名取里面表头第一行\"），不主动做\"内容相符性\"判断后打回用户。\n3. **正确工作流**：先按用户口头说的字段（公司名/金额/阶段等）调 `odoo_crm_create` → 再用 `odoo_attach_file` 把附件挂到该 crm.lead → 回报\"商机 #X 已创建并附上文件\"。\n4. 用户没说要看附件内容时**绝不主动解析后质疑**用户。常见错误回复：「我解压出来的内容跟商机对不上，你发错了吗？」 ❌ —— 这是越权。\n5. 只有用户**明确问**\"这附件是什么\"时才解读。\n\n### 凭据隔离\n\n- 默认 sender_id 隔离 — 每个同事独立账号，权限按 Odoo 角色区分。\n- 不主动建议\"配一次全员通用\"。仅当用户明确说\"组织共用一个公共账号\"才传 `shared: true`。\n- 用户问\"为什么我看不到 X\"/\"为什么权限不区分\"——可能落到了 shared fallback，让对方各自调 `odoo_connect` 配自己账号即可。\n\n---\n\n## Changelog\n\n- **v1.23.0** — **默认权限模型反转**：odoo_connect 默认按 sender_id 隔离（旧版默认全员 shared 导致 Odoo RBAC 失效）；新参数 `shared`（默认 false），旧 `private` 标 deprecated 仍兼容；prompt supplement 加附件硬规则（不替用户判断附件内容相符性，避免 LLM 解压看到内容跟\"商机\"字段对不上就打回用户的越权行为）；SKILL.md 同步说明\n- **v1.22.0** — odoo_sale_orders / odoo_purchase_orders 加 name + record_id + include_lines（写合同/对账免 N+1 RPC）+ description 强化防 LLM 走 exec/curl 手写 JSON-RPC\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.23.2:README.md\n\n# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| `odoo_sale_orders` | 查看销售订单 |\n| `odoo_purchase_orders` | 查看采购订单 |\n| `odoo_invoices` | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| `odoo_tickets` | 查看客服工单 |\n| `odoo_ticket_create` | 创建客服工单 |\n\n### 联系人（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_contacts` | 查询联系人/客户/供应商 |\n| `odoo_contact_create` | 创建联系人/客户/供应商 |\n\n### 库存（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_stock_levels` | 查看库存水平 |\n| `odoo_stock_pickings` | 查看调拨单/出入库单 |\n\n### HR 人事（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_employees` | 查询员工列表 |\n| `odoo_leaves` | 查看请假记录 |\n| `odoo_attendances` | 查看考勤打卡记录 |\n\n### 审批（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_approvals` | 查看审批请求 |\n\n### 助手\n| 工具 | 说明 |\n|------|------|\n| `odoo_search` | 通用搜索（任意模型任意条件） |\n| `odoo_daily_briefing` | 实施经理每日工作概况 |\n\n---\n\n## WeCom 动态 Agent 多用户隔离\n\n搭配 `@huo15/wecom` 插件的动态 agent 能力，每个企微用户/群组拥有独立的辉火云连接：\n\n1. **凭据隔离** — 用户 A 的辉火云账号密码，用户 B 看不到也用不了\n2. **Session 隔离** — 每个用户各自的辉火云 session，互不干扰\n3. **数据隔离** — 每个用户看到的是自己辉火云账号的数据\n4. **自动恢复** — 每个用户的凭据独立持久化，重启后自动恢复\n\n**实现原理**：\n- 工具通过 `ctx.agentId` 获取当前用户的动态 agent ID（如 `wecom-acct-ws-dm-zhangsan`）\n- 配置持久化到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`\n- OdooClient 和 NotificationPoller 均按 agentId 隔离存储\n\n---\n\n## 使用示例\n\n```\n👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）...\n```\n\n---\n\n## 通知同步\n\n插件连接后自动轮询（默认 30 秒），推送以下变更：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 Chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 技术架构\n\n- **JSON-RPC 对接** — 通过 `/web/session/authenticate` 和 `/web/dataset/call_kw` 与辉火云后端通信\n- **Per-Agent 隔离** — 按 `ctx.agentId` 隔离 OdooClient / Poller / Config，兼容 WeCom 动态 agent\n- **数据库自动检测** — `/web/database/list` 查询可用数据库，单库自动选择\n- **Session 自动重连** — `ensureAuthenticated()` 在轮询前自动检查并恢复 session\n- **高水位线去重** — 消息/邮件用 `id > highWaterMark` 去重，避免时钟偏差问题\n- **基线初始化** — 首次启动静默建立水位线，不推送历史数据\n- **OpenClaw 插件规范** — `definePluginEntry` + `api.registerTool()` + `api.on(\"before_prompt_build\")`\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、账号密码。用 `odoo_status` 查看当前状态。数据库名一般不用手动填，插件会自动检测。\n\n**Q: WeCom 多用户场景下，每个用户都要单独连接吗？**\nA: 是的。每个企微用户首次使用辉火云企业套件功能时会被引导输入自己的系统地址和账号密码，之后自动保存，无需重复输入。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 如何断开连接并清除保存的密码？**\nA: 告诉龙虾\"断开辉火云连接\"，会调用 `odoo_disconnect` 清除当前用户的凭据。\n\n---\n\n## Changelog\n\n- **v1.2.0** — Per-agent 凭据隔离（WeCom 多用户）、智能连接引导、数据库自动检测、联系人/客户管理、库存查询（stock.quant/stock.picking）、HR 员工/考勤/请假、审批流查询、odoo_disconnect 工具。共 32 个工具\n- **v1.1.0** — CRM 商机管道、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\n---\n\n## License\n\nMIT\n\n---\n\n<div align=\"center\">\n\n**公司名称：** 青岛火一五信息科技有限公司\n\n**联系邮箱：** postmaster@huo15.com | **QQ群：** 1093992108\n\n---\n\n**关注逸寻智库公众号，获取更多资讯**\n\n<img src=\"https://tools.huo15.com/uploads/images/system/qrcode_yxzk.jpg\" alt=\"逸寻智库公众号二维码\" style=\"width: 200px; height: auto; margin: 10px 0;\" />\n\n</div>\n\n---\n\nFile v1.23.2:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.23.2\",\n  \"publishedAt\": 1778438432216\n}\n\nFile v1.23.2:CHANGELOG-v1.19.md\n\n# v1.19.0 (2026-04-28)\n\n**核心修复：消除每次 prompt 注入 ~7900 字 / ~2000 tokens 的工具表，TTFT（首字延迟）实测降幅显著。**\n\n## 背景\n\n诊断发现 `before_prompt_build` hook 在每次 LLM call 之前都注入 ~7900 字的工具速查 + 自然语言映射表到 system context（[index.ts:5212-5489](index.ts#L5212)）。\n\n**用户感受**：哪怕只发\"你好\"也注入这 2000 tokens。LLM 处理这堆 prompt + reasoning thinking 一起拖到 TTFT 70-150 秒。\n\n实测 14:33-14:35 dispatch 拆解：\n- dispatch-start → first deliver-block = **129 秒**\n- 大头是 LLM TTFT 72 秒（首字延迟）\n- 加上 plugin 多次 reload 拖累 ~17 秒\n\n## 改动\n\n### 删 — system context 7900 字 → 1500 字\n\n[index.ts](index.ts) 的 `registerHooks` 函数中 `appendSystemContext` 模板字面量整体重写：\n\n| 删 | 改成 |\n|---|---|\n| 工具速查（共 77 个）整段 6500 字 | 只保留 6 行高频工具速查（任务 / CRM / 项目 / 客服 / 财务 / 联系人 / 检索 / 状态） |\n| 自然语言 → 工具映射 130+ 行 8000+ 字 | 全删（让 LLM 自己推断意图，识别不出再调 odoo_help） |\n| 常用数据模型 26 个 | 缩到 14 个最常用 |\n| 日期 & 字段规范 6 条 | 保留全部（这部分对 LLM 调用工具时仍重要，但本身只 200 字） |\n\n最终 system context 注入约 1500 字 / ~400 tokens。\n\n### 加 — `odoo_help` 工具（按需查工具表）\n\n新增 `api.registerTool({ name: 'odoo_help', ... })`，参数：\n\n- 无参数 → 返回完整 7900 字工具表 + 自然语言映射 + 数据模型清单\n- `keyword=\"<模糊词>\"` → 行级模糊匹配（如 `\"请假\"` 返回所有请假相关工具行；`\"CRM\"` 返回 CRM 分类）\n\nLLM 在不知道某意图对应哪个工具时**主动调 odoo_help**，把 token 消耗从\"每次 prompt 都付\"改成\"按需付\"。\n\n工具数从 189 → **190**。\n\n### 不改\n\n- 未连接路径的 system context（[index.ts:5176-5202](index.ts#L5176)）保留——那段本来就没工具表，只是连接引导\n- 189 工具的实现逻辑 / 接口 / 业务规则 全部不动\n- 共享凭据规则、品牌口径硬规则、用户/系统/凭据动态字段 全保留\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 |\n|---|---|---|\n| 每次 prompt 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens |\n| TTFT 预期降幅 | — | -5 ~ -25 秒 |\n| 工具数 | 189 | 190 (+ odoo_help) |\n| LLM 调用工具的能力 | 完整可见 | 高频 8 个直接可见，其他通过 odoo_help 按需查 |\n\n## 风险与缓解\n\n- **风险**：LLM 看不到完整工具表可能导致它\"不知道某个工具存在\"\n- **缓解**：\n  1. system context 顶部明确告知\"完整 189 工具表调 odoo_help\"\n  2. odoo_help 工具的 description 写明 \"按需获取详细信息\"\n  3. 高频 8 个工具仍然在 system context 里直接可见，覆盖 80% 日常需求\n\n## 测试\n\n- `tsc --noEmit` exit 0（剩余 schema 字段警告是 v1.18 之前就存在的 SDK 类型定义问题，与本次改动无关）\n- 启动期 log 应从 `[odoo] 189 个工具已注册` 变为 `[odoo] 190 个工具已注册（v1.19 — 加 odoo_help 按需查工具表，system context 不再每次注入 ~7900 字）`\n- before_prompt_build 钩子注册 log 加 `v1.19 system context 已瘦身 ~6500 字 → 调 odoo_help 按需取详`\n\n## 兼容性\n\n完全向下兼容。所有 189 工具签名 / 行为 / 业务逻辑不变。LLM 端如果还期望从 system context 看完整工具表，调 odoo_help 即可恢复 v1.18 行为。\n\nFile v1.23.2:CHANGELOG-v1.20.md\n\n# v1.20.0 (2026-04-28)\n\n**核心修复：tier 分级让默认 prompt tool schema 从 ~190 工具 / ~17000 tokens 砍到 ~30 工具 / ~3000 tokens。配合 v1.19 的 system context 瘦身，每次 prompt 总省 ~16000 tokens。**\n\n## 背景\n\nv1.19 把 `before_prompt_build` 注入的 system context 从 7900 字砍到 1500 字（节省 ~1700 tokens）。但实测 `dispatch-start → deliver-start` TTFT 仍 70-150 秒。\n\n进一步诊断（直接 curl DeepSeek API）：\n\n| 测试 | 端到端时间 |\n|---|---|\n| DeepSeek 流式 TTFT | **530ms** |\n| DeepSeek 非流式（含响应） | **790ms** |\n\n→ DeepSeek API 端**完全没问题**。**真正的 TTFT 元凶是 prompt 太大**（单大头 = 189 个 odoo 工具的 JSON schema），LLM 端 prefill 处理 30k+ tokens 才出第一字。\n\n预估每个 odoo 工具 schema ≈ 80-200 tokens（name + description + properties + required）：\n\n- description 总和 16470 字符 / ~5490 tokens\n- 加 schema 结构（properties / required / type 等）×3-4 倍 → **15000-20000 tokens** 仅 odoo 一个 plugin\n\n## 改动\n\n### `index.ts` — 引入 tier 分级\n\n新增 `ODOO_TOOL_TIERS`（module-level 常量）：\n\n```ts\nconst ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};\n```\n\n`registerTools` 函数顶部读 plugin config：\n\n```ts\nconst cfg = (api.pluginConfig ?? {}) as { tier?: 'minimal' | 'core' | 'extended' };\nconst tier = cfg.tier ?? 'core';  // 默认 core\nconst allowedTools = tier === 'extended' ? null : ODOO_TOOL_TIERS[tier];\n\nconst register = (opts) => {\n  if (allowedTools === null || allowedTools.has(opts.name) || opts.name === 'odoo_help') {\n    api.registerTool(opts);\n    registeredCount++;\n  } else {\n    skippedCount++;\n  }\n};\n```\n\n然后 sed 把 489-5500 行内 189 个 `api.registerTool(` 替换为 `register(` —— **所有 189 个工具走 register wrapper 过滤**。\n\n`odoo_help` 工具**始终注册**（任何 tier），保证 LLM 能查完整工具表。\n\n### `index.ts` — system context 提示当前 tier\n\n将 v1.19 的 \"完整 189 个工具表 …\" 提示更新为 \"**当前 tier=core（默认 30 个高频工具直接可见）。完整 190 个工具调 odoo_help 查；如需恢复 v1.18 全量行为：改 ~/.openclaw/openclaw.json 的 plugins.entries.odoo.config.tier='extended'**\"。\n\n### `index.ts` — 启动期 log 报告 tier 状态\n\n```\nv1.18: [odoo] 189 个工具已注册（v1.18 — Studio 元编程+审计...）\nv1.19: [odoo] 190 个工具已注册（v1.19 — 加 odoo_help...）\nv1.20: [odoo] 30 个工具已注册（v1.20 — tier=core 精简档位 / 跳过 160 个，节省 ~12800 tokens schema）\n       完整 190 工具调 odoo_help 查；改 plugins.entries.odoo.config.tier=\"extended\" 可恢复全量。\n```\n\n## tier 三档\n\n### `minimal`（10 工具）\n\n仅最核心连接 + 任务搜索：\n```\nodoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\nodoo_create_task / odoo_list_tasks / odoo_my_today\nodoo_search / odoo_daily_briefing\n```\n\n适合：极致性能，仅做\"连接 + 任务列表\"演示场景。\n\n### `core`（30 工具，默认）\n\n覆盖 80% 日常需求的高频 30 个：\n\n- 连接 & 状态（5）：odoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\n- 任务 & 活动（8）：odoo_create_task / odoo_list_tasks / odoo_update_task / odoo_my_today / odoo_my_workload / odoo_create_activity / odoo_calendar_today / odoo_complete_activity\n- CRM（5）：odoo_crm_pipeline / odoo_crm_create / odoo_crm_update / odoo_crm_won / odoo_crm_lost\n- 项目（2）：odoo_project_overview / odoo_timesheet_log\n- 客服（2）：odoo_tickets / odoo_ticket_create\n- 财务（3）：odoo_invoices / odoo_sale_orders / odoo_purchase_orders\n- 联系人（2）：odoo_contacts / odoo_contact_create\n- 检索（2）：odoo_search / odoo_daily_briefing\n- 消息（1）：odoo_message_post\n\n### `extended`（190 工具，v1.18/1.19 行为）\n\n完整暴露所有工具（含 HR 全套 / 库存深化 / 生产 MRP / Studio 元编程 / 审计 / 多公司联动等）。\n\n适合：需要全功能，不在意 prompt token 开销。\n\n## 配置切换\n\n在 `~/.openclaw/openclaw.json`：\n\n```jsonc\n{\n  \"plugins\": {\n    \"entries\": {\n      \"odoo\": {\n        \"config\": {\n          \"tier\": \"extended\"   // 或 \"core\"（默认）/ \"minimal\"\n        }\n      }\n    }\n  }\n}\n```\n\n改完后 `launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway` 重启 gateway 即生效。\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 | **v1.20 默认** | v1.20 extended |\n|---|---|---|---|---|\n| system context 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens |\n| 工具数量 | 189 | 190 | **30** | 190 |\n| 工具 schema 占 tokens | ~17000 | ~17000 | **~3000** | ~17000 |\n| **每次 prompt 总 token** | 19000 | 17400 | **3400** | 17400 |\n| LLM TTFT 预估 | 70-150s | 65-145s | **15-50s** | 65-145s |\n\n注：实际 TTFT 受 LLM 端 prefill 速度、conversation history、其他 plugin 注入影响。\n\n## 风险与缓解\n\n- **风险**：默认只 30 工具，LLM 不知道\"odoo_employee_skills\"等工具存在 → 用户问相关问题时 LLM 表现退化\n- **缓解 1**：system context 顶部明确告知\"完整 190 工具调 odoo_help 查\"\n- **缓解 2**：odoo_help 工具的 description 写明 \"按需获取详细信息（无参 = 完整 190 工具表 / keyword 模糊匹配）\"\n- **缓解 3**：core 30 个已覆盖 80% 日常场景；不在 core 但常用的工具，用户可手动调到 extended\n\n## 测试\n\n- `tsc --noEmit` exit 0（v1.19 还有 ~20 个 schema warning，v1.20 因为 register wrapper 用 generic 反而**全部消除**）\n- 启动期 log 应从 `190 个工具已注册（v1.19 …）` 变为 `30 个工具已注册（v1.20 — tier=core …）`\n\n## 兼容性\n\n完全向下兼容。改 plugin config `tier=\"extended\"` 即恢复 v1.19 行为，所有 190 工具签名 / 行为 / 业务逻辑全部不变。\n\nFile v1.23.2:CHANGELOG-v1.22.md\n\n# v1.22.0 (2026-05-04)\n\n**`odoo_sale_orders` / `odoo_purchase_orders` 三大增强：按编号查 + 一次拿明细 + 强化 description 防 LLM 走 exec curl**\n\n## 背景\n\n会话 `agent:main:wecom:direct:zhaobo` 里，赵博发了「未来电脑的销售单（编号：S00016），按照这个帮我写一个软件销售合同」。\n\ntrajectory 复盘（[详细见会话诊断]）：\n\n1. main agent（deepseek-v4-pro）看了 `odoo_sale_orders` 工具\n2. **schema 只有 `limit / state / partner_id`，没有按订单编号查的字段**\n3. LLM 觉得\"这工具不能按 S00016 编号查具体单\"，**改走 `exec` + `curl JSON-RPC` 手写**\n4. 手写折腾了 9 次（postmaster 没销售权限 → uid=5 ZhaoBo 才成功）\n5. 拿到 S00016 数据后 LLM 状态混乱，重复说\"先查一下...\"就 stop，**没生成合同**\n\n5 是模型行为问题（已转 P0 跟踪），但 2 是 **tool design gap** ——本版修。\n\n## 改动\n\n### 1. `odoo_sale_orders` schema 加 3 个字段\n\n[`index.ts:1228-1310`](index.ts:1228)\n\n```diff\n schema:\n   properties:\n+    name:          { type: 'string', description: '订单编号（如 \"S00016\"），精确匹配' }\n+    record_id:     { type: 'number', description: '按 sale.order 记录 ID 直读' }\n+    include_lines: { type: 'boolean', description: '同时拉订单明细（sale.order.line），写合同/对账强烈建议 true' }\n     limit:         ...\n     state:         ...\n     partner_id:    ...\n```\n\n返回字段补齐：`amount_untaxed / amount_tax / amount_total / payment_term / currency / note`，\ninclude_lines=true 时每单挂 `order_line[]`（id, product_id, name, product_uom_qty, qty_delivered,\nqty_invoiced, product_uom, price_unit, discount, price_subtotal, price_total, price_tax）。\n\n### 2. `odoo_purchase_orders` 同步加 name/record_id/include_lines\n\n[`index.ts:1313-1395`](index.ts:1313)\n\n字段对齐（采购侧 `qty_received` / `qty_invoiced` / `date_planned` / `notes`）。\n\n### 3. `OdooClient.getSaleOrders` / `getPurchaseOrders` 内部支持\n\n[`src/modules/odoo-client.ts:336-403`](src/modules/odoo-client.ts:336)\n\n- name → `domain.push(['name', '=', name])`\n- record_id → `domain.push(['id', '=', record_id])`\n- include_lines → 一次性 `searchRead('sale.order.line', [['order_id', 'in', orderIds]])` **避免 N+1 RPC**\n- 按 `(order_id, sequence)` 排序后挂回各 order 的 `order_line[]`\n\n### 4. description 强化 — 防 LLM 走 exec curl 手写 RPC\n\n[`index.ts:1230-1240`](index.ts:1230) — 参考 memory `feedback_tool_description_vs_prompt_level_constraint.md`，把具体 anti-pattern 字面写进 description：\n\n```\n查询销售订单（sale.order）。支持三种用法：\n(a) 列表浏览：limit + state + partner_id；\n(b) ⭐ 按订单编号查具体单：name=\"S00016\"（精确匹配，最常用）；\n(c) 按记录 ID 直读：record_id=9。\n⭐ 写合同 / 对账 / 回邮件这类需要明细的场景：必传 include_lines=true，\n一次拿回 partner / 产品 / 数量 / 单价 / 折扣 / 小计 / 税额 / 合计 / 付款条件，\n避免后续再发多次 RPC。不要走 exec/curl 手写 JSON-RPC，本工具已经覆盖。\n```\n\n实际 anti-pattern：之前 deepseek-v4-pro 看到 description 太弱（\"查看销售订单/报价单列表\"），就自己写 9 次 curl。新版直接告诉它\"覆盖了，别 hack\"。\n\n### 5. log 字符串和三处 version 对齐\n\n`api.logger.info` 字符串从 `v1.21.0` 改到 `v1.22.0`（之前 v1.20.x→v1.21 时漏改这条 log，gateway log 一直显示 v1.9 是因为 runtime 装的还是 v1.20.2 旧拷贝）。\n\n`package.json` / `SKILL.md` / `openclaw.plugin.json` / `index.ts` log 字符串四处全部对齐到 1.22.0。\n\n## 测试\n\n- `tsc --noEmit` 通过\n- 没有 unit test（odoo plugin 一直没建 test suite，本版不补——避免 scope creep）\n- 集成验证：发版后 `openclaw plugins install` 重装 + 重启 gateway，手工跑 `odoo_sale_orders name='S00016' include_lines=true` 看返回完整明细\n\n## 兼容性\n\n完全向下兼容。\n\n- 老代码 / 老 prompt 不传新字段 → behavior 不变（只有 limit/state/partner_id）\n- 新字段都是 optional，schema 校验无 breaking change\n- `getSaleOrders` 不传 include_lines → 不发 sale.order.line RPC，零成本\n\n## 红线自查\n\n- ✅ 无 `child_process / execSync / spawnSync`\n- ✅ `compat.pluginApi: \">=2026.2.24\"` 是 ranged，不是裸版本\n- ✅ `peerDependencies.openclaw: \">=2026.2.24\"` 是 ranged\n- ✅ 不修改 openclaw 核心代码\n- ✅ 不复制龙虾原生功能（odoo_sale_orders 是辉火云特有，没原生等价物）\n\n## 不变\n\n- v1.21.0 的 hook RPC 永久挂修复（首字延迟 P50 16.4s → <3s）继承\n- v1.20 审批工作流深化继承\n- v1.19 工具分级 tier（core/minimal/extended）继承——本版改的两个工具都在 core tier，default 启用\n- 其他 42 个 core tier 工具未动\n- 用户自定义 manifest 凭据（pluginConfig.odoo）行为不变\n\nFile v1.23.2:CHANGELOG-v1.23.md\n\n# v1.23.0 — 默认权限模型反转 + 附件硬规则\n\n发布日期: 2026-05-07\n\n## 一句话\n\n`odoo_connect` 默认从「全员共享」反转为「按 sender_id 隔离」,让 Odoo 内部 RBAC 真正起作用;同时给 LLM 加附件硬规则,杜绝「解压看到内容跟商机字段对不上就打回用户」的越权行为。\n\n---\n\n## 触发本次发版的事故\n\n用户在企微群里上传 `AI报价单.rar` 让 LLM 建商机。LLM 解压后回复:\n\n> 等等,我解压出来的这批文件内容是工厂生产排产计划,和 Odoo19 商机的内容对不上。你发的可能不是同一个压缩包?\n\n用户被迫解释一通。然后说要让 LLM 帮建商机:\n\n> 应该是每个同事都需要输入自己的账号密码。为了就是不同人拥有不同的权限\n\n但 v1.22 prompt 主动建议「配一次咱们组织所有同事就都能用了 👍」——直接跟用户期望相反。\n\n两件事暴露了:\n\n1. **权限模型设计错误**:v1.10 起默认 `scope='shared'` 让所有人共用同一个 Odoo 账号 → Odoo 内部 RBAC 完全失效(销售/管理员看到的数据一样)\n2. **LLM 越权解读附件内容**:插件没有 prompt 级硬约束,LLM 看到附件内容跟\"商机\"字面对不上就替用户做\"内容相符性\"判断\n\n---\n\n## Bug 1: 默认凭据 scope 反转\n\n### 旧行为(v1.10–v1.22)\n\n```ts\n// config-manager.ts\nsaveOdooConfig(odooConfig, agentId, scope: 'shared' | 'agent' = 'shared')\n\n// odoo_connect tool\nprivate?: boolean   // false=shared(默认), true=agent\nconst scope = params.private ? 'agent' : 'shared';\n```\n\nprompt 主动建议:\n\n> 配一次之后,所有同事 @ 我都能用,不需要再输入\n\n后果:\n\n- 一个销售配了自己账号 → 全员都用销售账号 → 销售看不到管理员看的数据? 或者更糟:**所有人都看到销售看的数据**(包括财务 / HR / 客户隐私)\n- Odoo 用户 RBAC 完全失效。设计得很精细的 group_ids / record_rule 形同虚设\n- 不符合企业协作模型(\"每人按角色分权限\"是绝大多数企业期望)\n\n### 新行为(v1.23)\n\n```ts\n// config-manager.ts\nsaveOdooConfig(odooConfig, agentId, scope: 'shared' | 'agent' = 'agent')\n\n// odoo_connect tool —— 新增 shared 参数,语义反转,旧 private 标 deprecated 但仍兼容\n{\n  shared?: boolean,   // 默认 false = sender_id 隔离 = per-user RBAC\n  private?: boolean,  // [deprecated] 仍兼容旧 agent memory:private=true → agent\n}\n\n// 优先级:shared 显式 > private 兼容 > 默认 agent\nlet scope: 'shared' | 'agent';\nif (typeof params.shared === 'boolean') scope = params.shared ? 'shared' : 'agent';\nelse if (typeof params.private === 'boolean') scope = params.private ? 'agent' : 'shared';\nelse scope = 'agent';\n```\n\nprompt 改成:\n\n> 每个同事用自己的账号,权限按你的 Odoo 角色区分(销售看销售的、管理员看管理员的)。绝不要主动建议「配一次全员通用」。\n\n### Fallback 链不变\n\n```\n{agentId}.json    ← 默认写这里(per-sender_id)\ndefault.json      ← shared=true 时写这里,作为兜底 fallback\npluginConfig.odoo ← manifest 静态预填(老路径)\nodoo-config.json  ← legacy\n```\n\n如果用户真的有\"组织共用一个公共只读账号\"场景,显式说\"组织共用\",LLM 会调 `odoo_connect(shared=true)` 写 default.json。\n\n---\n\n## Bug 2: 附件硬规则\n\n### 旧行为\n\nprompt 没有任何关于\"附件内容判断\"的约束。LLM 看到附件,自然按\"读了就要用\"的常识做内容相符性判断,看到不一致就打回用户。\n\n### 新行为\n\n`before_prompt_build` hook 注入硬规则(未连接 + 已连接两段都加):\n\n> **附件 / 文件内容判断 — 硬规则**\n>\n> 1. 附件内容由用户负责。不要解读\"内容是不是跟商机字段对得上\"\n> 2. 解压/读附件**仅用于提取用户明示的字段**\n> 3. **正确工作流**:`odoo_crm_create` 建商机 → `odoo_attach_file` 挂附件 → 回报完成\n> 4. 用户没说要看附件内容时**绝不主动解析后质疑**用户\n> 5. 只有用户**明确问**\"这附件是什么\"时才解读\n>\n> 常见错误回复:「我解压出来的内容跟商机对不上,你发错了吗?」 ❌\n\n理论依据:`feedback_tool_description_vs_prompt_level_constraint.md` —— 把具体 anti-pattern 字面写进 prompt,比抽象描述有效得多。直接把用户截屏里 LLM 那句越权回复抄进 prompt 当反例,LLM 下次就不会复制粘贴自己的烂回复。\n\n---\n\n## Breaking changes\n\n`odoo_connect` 默认 scope 反转。**已有 v1.22 部署的影响**:\n\n- 已存在的 `default.json`(shared 凭据) **不会被自动迁移或删除**,fallback 链照常工作 → 没有显式 sender_id 配置的成员仍走 shared。\n- 已有 `{agentId}.json` 也照常生效(优先级最高)。\n- **首次升级后用户主动调 `odoo_connect`**:写入位置变了(从 default.json → {agentId}.json)。如果用户希望继续共享,必须显式说\"组织共用\"或传 shared=true。\n\n**迁移建议**:升级到 v1.23 后,各成员各自 @ 机器人调一次 `odoo_connect` 配自己账号即可。已存在的 default.json 留作兜底,不影响。\n\n---\n\n## 文件变化\n\n- `src/modules/config-manager.ts` — `saveOdooConfig` 默认参数 `'shared'` → `'agent'`,文件头注释改写说明权限模型反转\n- `index.ts`\n  - `odoo_connect` schema 加 `shared` 参数,`private` 标 deprecated 但仍兼容\n  - `odoo_connect` description 强化:**绝不主动建议全员共用**\n  - handler 加 shared > private > 默认 agent 的优先级判断\n  - `odoo_whoami` 兜底文案改写\n  - `before_prompt_build` hook 未连接段:文案翻新 + 加附件硬规则\n  - `before_prompt_build` hook 已连接段:credSourceLabel 改写 + 加附件硬规则\n- `SKILL.md` — 首次配置段、Changelog、附件硬规则段\n- `package.json` / `openclaw.plugin.json` — 版本 bump 到 1.23.0,description 同步\n\n---\n\n## 自查 checklist\n\n- [x] `compat.pluginApi` 是 ranged(`>=2026.2.24`)\n- [x] `package.json.version` / `openclaw.plugin.json.version` / `SKILL.md.version` 三处一致 = 1.23.0\n- [x] 没引入 `child_process` / `execSync` / `spawnSync`\n- [x] typecheck 通过\n- [x] `odoo_connect` 旧 `private` 参数仍兼容(避免老 agent memory 里的调用失败)\n- [x] SKILL.md 大小 < 25KB\n\n---\n\n## 关联\n\n- 触发事件: 2026-05-07 用户企微群 LLM 越权回复 + 默认全员共享反馈\n- 上游 memory: `feedback_plugins_must_be_independently_installable.md` / `feedback_tool_description_vs_prompt_level_constraint.md`\n- 下游 memory: 本次会沉淀 `feedback_default_permission_model_per_user_vs_shared.md`(详见会话末尾)\n\nFile v1.23.2:CHANGELOG.md\n\n# Changelog\n\n## 1.23.2 — 2026-05-11(manifest runtimeExtensions — 让 OpenClaw 2026.5.x 找到 dist/)\n\n### 触发\n\nOpenClaw 2026.5.x gateway / `openclaw doctor` 启动报：\n\n```\nplugins.entries.odoo: plugin odoo: installed plugin package requires\n  compiled runtime output for TypeScript entry index.ts: expected\n  ./dist/index.js, ./dist/index.mjs, ./dist/index.cjs, ...\n```\n\n### 根因\n\nOpenClaw 2026.5.x `dist/discovery-CVL9-KJt.js` 在加载 npm 安装的插件时,对 `package.json.openclaw.extensions` 里 `.ts` 入口要求显式声明编译产物路径(`runtimeExtensions[]`)。\n\n### 改动\n\n`package.json` 加 `openclaw.runtimeExtensions: [\"./dist/index.js\"]`,显式告诉 OpenClaw ts entry 编译后的 JS 在哪。dist/index.js 已经由 prepublishOnly 自动生成。\n\n### 不影响\n\n代码逻辑不变,只动 manifest。\n\nFile v1.23.2:skill-card.md\n\n## Description:\n\nHuo15 Huihuoyun Odoo lets an agent use natural language to operate Huihuoyun/Odoo ERP workflows across tasks, CRM, projects, helpdesk, finance, sales, HR, inventory, manufacturing, customer service, knowledge, and Studio-style administration.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[zhaobod1](https://clawhub.ai/user/zhaobod1)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nEmployees, implementation managers, project managers, sales managers, and operations teams use this skill to query and update Huihuoyun/Odoo ERP records through an OpenClaw agent. It supports daily briefings, task and activity management, CRM pipeline work, sales and purchase review, invoices, helpdesk tickets, HR, inventory, notifications, and administrative workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can expose broad ERP, administration, Studio, automation, report scheduling, CSV import, webhook, arbitrary file-upload, and local-file capabilities to an agent.\n\nMitigation: Have an administrator review the enabled tool tier before installation and disable capabilities that are unnecessary for the deployment.\n\nRisk: The skill handles ERP credentials and can be configured in ways that over-share privileged accounts.\n\nMitigation: Use low-privilege per-user ERP accounts, avoid shared administrator credentials, and use protected secret handling instead of ordinary chat for passwords when available.\n\nRisk: The skill connects to external ERP origins and performs background polling or automation.\n\nMitigation: Require HTTPS allowlisted ERP origins and review polling channels, intervals, and automation scope before production use.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/zhaobod1/skills/huo15-huihuoyun-odoo)\n- [Huihuoyun Website](https://www.huo15.com)\n- [OpenClaw Project](https://github.com/nicepkg/openclaw)\n- [Huo15 Companion Videos](https://space.bilibili.com/400418085)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with tool-call descriptions, configuration snippets, and shell commands.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May propose or execute ERP actions through configured OpenClaw tools; users should review actions that modify business records.]\n\n## Skill Version(s):\n\n1.23.2 (source: server release evidence and package.json; SKILL.md frontmatter reports 1.23.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.23.2:openclaw.plugin.json\n\n{\n  \"id\": \"odoo\",\n  \"name\": \"火一五·辉火云企业套件插件\",\n  \"description\": \"自然语言操作辉火云企业套件，企业级全场景 ERP + 系统管理 + Studio 元编程 + 工具分级助手，204 个工具（含 odoo_help）覆盖销售/采购/库存/生产/会计/HR/项目/CRM/客服/知识/通知/智能/报表 13 业务域 + 系统级 + Studio 元编程；v1.23 默认权限反转（odoo_connect 默认按 sender_id 隔离 + 新 shared 参数 + 附件硬规则）；v1.22 sale/purchase 加 name+record_id+include_lines；v1.10 共享凭据；v1.11–v1.13 HR 三步走；v1.14 Analytics & Orchestration；v1.15 个人视图+CRM 智能+跨域桥+库存深化+多公司；v1.16 业务深化；v1.17 自动化与治理；v1.18 Studio 元编程；v1.19 工具分级 tier；v1.20 审批工作流+克隆+CSV+Mail+资源+报表订阅\",\n  \"version\": \"1.23.0\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"odoo\": {\n        \"type\": \"object\",\n        \"description\": \"辉火云企业套件 连接配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"辉火云企业套件 系统地址，如 https://www.huo15.com\"\n          },\n          \"db\": {\n            \"type\": \"string\",\n            \"description\": \"数据库名称，如 huo15\"\n          },\n          \"username\": {\n            \"type\": \"string\",\n            \"description\": \"用户名（邮箱或登录名）\"\n          },\n          \"password\": {\n            \"type\": \"string\",\n            \"description\": \"密码\"\n          }\n        },\n        \"required\": [\"url\", \"db\", \"username\", \"password\"]\n      },\n      \"sync\": {\n        \"type\": \"object\",\n        \"description\": \"通知同步配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"description\": \"是否启用后台通知同步\",\n            \"default\": true\n          },\n          \"intervalSeconds\": {\n            \"type\": \"number\",\n            \"description\": \"轮询间隔（秒），默认 30\",\n            \"default\": 30\n          },\n          \"channels\": {\n            \"type\": \"array\",\n            \"description\": \"需要同步的通知类型\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n            },\n            \"default\": [\"todo\", \"activity\", \"message\"]\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.23.2:package.json\n\n{\n  \"name\": \"@huo15/huo15-huihuoyun-odoo\",\n  \"version\": \"1.23.2\",\n  \"description\": \"火一五·辉火云企业套件插件 v1.23.0 — 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号，与内部 RBAC 对齐：销售看销售的、管理员看管理员的）；新参数 shared（默认 false），旧 private 标 deprecated 但仍兼容；prompt supplement 加附件硬规则（不替用户判断'附件内容是否相符'后打回用户的越权行为）。继承 v1.22 record_id+include_lines / v1.21 hook RPC 永久挂修复（首字延迟 P50 16.4s→<3s）/ v1.20 审批工作流 / 204 工具覆盖 13 业务域 + Studio 元编程。\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"build\": {\n      \"openclawVersion\": \"2026.4.10\"\n    },\n    \"compat\": {\n      \"pluginApi\": \">=2026.2.24\"\n    },\n    \"runtimeExtensions\": [\n      \"./dist/index.js\"\n    ]\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"plugin\",\n    \"huohuoyun\",\n    \"huihuoyun\",\n    \"erp\",\n    \"huo15\",\n    \"crm\",\n    \"helpdesk\",\n    \"invoice\"\n  ],\n  \"author\": \"jobzhao15\",\n  \"license\": \"MIT\",\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.2.24\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"typescript\": \"^5.5.0\"\n  },\n  \"scripts\": {\n    \"typecheck\": \"tsc --noEmit\",\n    \"release\": \"bash scripts/release.sh\",\n    \"prepublishOnly\": \"npm run typecheck && npm run build\",\n    \"build\": \"tsc && cp package.json dist/ && cp openclaw.plugin.json dist/ 2>/dev/null || true\"\n  },\n  \"files\": [\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"src/**/*\",\n    \"SKILL.md\",\n    \"dist/**/*\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://cnb.cool/huo15/tools/huo15-huihuoyun-odoo\"\n  }\n}\n\nFile v1.23.2:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\"]\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.23.0: 24 files, 228656 bytes\n\nFiles: CHANGELOG-v1.19.md (3544b), CHANGELOG-v1.20.md (6088b), CHANGELOG-v1.22.md (4958b), CHANGELOG-v1.23.md (6592b), index.ts (329201b), openclaw.plugin.json (2542b), package-lock.json (259330b), package.json (1658b), README.md (10748b), scripts/release.sh (11335b), SKILL.md (12796b), src/modules/config-manager.ts (7140b), src/modules/envelope-cache.ts (1659b), src/modules/mutation-log.ts (4571b), src/modules/notification-bus.ts (5783b), src/modules/notification-poller.ts (9267b), src/modules/notification-prefs.ts (4397b), src/modules/notification-router.ts (5633b), src/modules/odoo-client.ts (213318b), src/types/index.ts (6609b), src/utils/date-utils.ts (2296b), src/utils/md-to-html.ts (2346b), tsconfig.json (483b), _meta.json (140b)\n\nFile v1.23.0:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号，与内部 RBAC 对齐 — 销售看销售的、管理员看管理员的）；旧 private 参数标 deprecated，新参数 shared（默认 false）；prompt 加附件硬规则（不替用户判断附件内容相符性）。继承 v1.22 record_id+include_lines / v1.21 hook RPC 永久挂修复 / v1.20 审批工作流。Use when：接 Odoo/辉火云、企业 ERP 操作、CRM/任务/财务/销售/工单管理、自然语言企微/钉钉调用 ERP、写销售/采购合同需要订单明细。\nversion: 1.23.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置（v1.23 默认按 sender_id 隔离 — 每人配自己的）\n\n### 方式一：通过对话连接（推荐）\n\n每位同事 @ 机器人时各自配一次自己的辉火云账号：\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 你自己的邮箱@huo15.com，密码 xxxxxx\n\n龙虾自动调 `odoo_connect`，**默认按当前 sender_id 隔离保存**到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`，与 Odoo 内部 RBAC 对齐 —— 销售看销售的、管理员看管理员的，不再共用同一账号。\n\n### 「为什么不默认全员共用？」\n\nv1.10–v1.22 默认全员共享一套凭据，结果 Odoo 内部权限失效（不管你是销售还是管理员，看到的数据完全一样）。v1.23 起反转：**每个 sender_id 用自己的账号 = 权限按 Odoo 用户区分**。这是绝大多数企业期望的协作模型。\n\n### 方式二：组织共用一个公共账号（少数场景）\n\n仅当组织内只有一个 Odoo 公共只读账号、所有同事都用它访问相同数据时：\n\n> 帮我连接辉火云，组织内大家共用这个账号：…，请保存为共享配置\n\nLLM 会调 `odoo_connect(shared=true)` 写入 `default.json`，作为兜底 fallback。**注意**：此时 Odoo RBAC 失效，所有人看到的数据完全一致。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接辉火云企业套件 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## 使用纪律（hard rules，给 LLM）\n\n### 附件 / 文件内容判断\n\n用户上传压缩包/文档/Excel 让你\"建商机/任务/工单\"等操作时：\n\n1. **附件内容由用户负责**。不要解读\"内容是不是跟商机字段对得上\"、\"这文件像不像 ERP 数据\"。即便附件是工厂排产、菜单、随便一个 PDF，也直接按用户意图建记录。\n2. 解压/读附件**仅用于提取用户明示的字段**（如用户说\"客户名取里面表头第一行\"），不主动做\"内容相符性\"判断后打回用户。\n3. **正确工作流**：先按用户口头说的字段（公司名/金额/阶段等）调 `odoo_crm_create` → 再用 `odoo_attach_file` 把附件挂到该 crm.lead → 回报\"商机 #X 已创建并附上文件\"。\n4. 用户没说要看附件内容时**绝不主动解析后质疑**用户。常见错误回复：「我解压出来的内容跟商机对不上，你发错了吗？」 ❌ —— 这是越权。\n5. 只有用户**明确问**\"这附件是什么\"时才解读。\n\n### 凭据隔离\n\n- 默认 sender_id 隔离 — 每个同事独立账号，权限按 Odoo 角色区分。\n- 不主动建议\"配一次全员通用\"。仅当用户明确说\"组织共用一个公共账号\"才传 `shared: true`。\n- 用户问\"为什么我看不到 X\"/\"为什么权限不区分\"——可能落到了 shared fallback，让对方各自调 `odoo_connect` 配自己账号即可。\n\n---\n\n## Changelog\n\n- **v1.23.0** — **默认权限模型反转**：odoo_connect 默认按 sender_id 隔离（旧版默认全员 shared 导致 Odoo RBAC 失效）；新参数 `shared`（默认 false），旧 `private` 标 deprecated 仍兼容；prompt supplement 加附件硬规则（不替用户判断附件内容相符性，避免 LLM 解压看到内容跟\"商机\"字段对不上就打回用户的越权行为）；SKILL.md 同步说明\n- **v1.22.0** — odoo_sale_orders / odoo_purchase_orders 加 name + record_id + include_lines（写合同/对账免 N+1 RPC）+ description 强化防 LLM 走 exec/curl 手写 JSON-RPC\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.23.0:README.md\n\n# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| `odoo_sale_orders` | 查看销售订单 |\n| `odoo_purchase_orders` | 查看采购订单 |\n| `odoo_invoices` | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| `odoo_tickets` | 查看客服工单 |\n| `odoo_ticket_create` | 创建客服工单 |\n\n### 联系人（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_contacts` | 查询联系人/客户/供应商 |\n| `odoo_contact_create` | 创建联系人/客户/供应商 |\n\n### 库存（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_stock_levels` | 查看库存水平 |\n| `odoo_stock_pickings` | 查看调拨单/出入库单 |\n\n### HR 人事（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_employees` | 查询员工列表 |\n| `odoo_leaves` | 查看请假记录 |\n| `odoo_attendances` | 查看考勤打卡记录 |\n\n### 审批（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_approvals` | 查看审批请求 |\n\n### 助手\n| 工具 | 说明 |\n|------|------|\n| `odoo_search` | 通用搜索（任意模型任意条件） |\n| `odoo_daily_briefing` | 实施经理每日工作概况 |\n\n---\n\n## WeCom 动态 Agent 多用户隔离\n\n搭配 `@huo15/wecom` 插件的动态 agent 能力，每个企微用户/群组拥有独立的辉火云连接：\n\n1. **凭据隔离** — 用户 A 的辉火云账号密码，用户 B 看不到也用不了\n2. **Session 隔离** — 每个用户各自的辉火云 session，互不干扰\n3. **数据隔离** — 每个用户看到的是自己辉火云账号的数据\n4. **自动恢复** — 每个用户的凭据独立持久化，重启后自动恢复\n\n**实现原理**：\n- 工具通过 `ctx.agentId` 获取当前用户的动态 agent ID（如 `wecom-acct-ws-dm-zhangsan`）\n- 配置持久化到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`\n- OdooClient 和 NotificationPoller 均按 agentId 隔离存储\n\n---\n\n## 使用示例\n\n```\n👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）...\n```\n\n---\n\n## 通知同步\n\n插件连接后自动轮询（默认 30 秒），推送以下变更：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 Chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 技术架构\n\n- **JSON-RPC 对接** — 通过 `/web/session/authenticate` 和 `/web/dataset/call_kw` 与辉火云后端通信\n- **Per-Agent 隔离** — 按 `ctx.agentId` 隔离 OdooClient / Poller / Config，兼容 WeCom 动态 agent\n- **数据库自动检测** — `/web/database/list` 查询可用数据库，单库自动选择\n- **Session 自动重连** — `ensureAuthenticated()` 在轮询前自动检查并恢复 session\n- **高水位线去重** — 消息/邮件用 `id > highWaterMark` 去重，避免时钟偏差问题\n- **基线初始化** — 首次启动静默建立水位线，不推送历史数据\n- **OpenClaw 插件规范** — `definePluginEntry` + `api.registerTool()` + `api.on(\"before_prompt_build\")`\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、账号密码。用 `odoo_status` 查看当前状态。数据库名一般不用手动填，插件会自动检测。\n\n**Q: WeCom 多用户场景下，每个用户都要单独连接吗？**\nA: 是的。每个企微用户首次使用辉火云企业套件功能时会被引导输入自己的系统地址和账号密码，之后自动保存，无需重复输入。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 如何断开连接并清除保存的密码？**\nA: 告诉龙虾\"断开辉火云连接\"，会调用 `odoo_disconnect` 清除当前用户的凭据。\n\n---\n\n## Changelog\n\n- **v1.2.0** — Per-agent 凭据隔离（WeCom 多用户）、智能连接引导、数据库自动检测、联系人/客户管理、库存查询（stock.quant/stock.picking）、HR 员工/考勤/请假、审批流查询、odoo_disconnect 工具。共 32 个工具\n- **v1.1.0** — CRM 商机管道、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\n---\n\n## License\n\nMIT\n\n---\n\n<div align=\"center\">\n\n**公司名称：** 青岛火一五信息科技有限公司\n\n**联系邮箱：** postmaster@huo15.com | **QQ群：** 1093992108\n\n---\n\n**关注逸寻智库公众号，获取更多资讯**\n\n<img src=\"https://tools.huo15.com/uploads/images/system/qrcode_yxzk.jpg\" alt=\"逸寻智库公众号二维码\" style=\"width: 200px; height: auto; margin: 10px 0;\" />\n\n</div>\n\n---\n\nFile v1.23.0:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.23.0\",\n  \"publishedAt\": 1778145591849\n}\n\nFile v1.23.0:CHANGELOG-v1.19.md\n\n# v1.19.0 (2026-04-28)\n\n**核心修复：消除每次 prompt 注入 ~7900 字 / ~2000 tokens 的工具表，TTFT（首字延迟）实测降幅显著。**\n\n## 背景\n\n诊断发现 `before_prompt_build` hook 在每次 LLM call 之前都注入 ~7900 字的工具速查 + 自然语言映射表到 system context（[index.ts:5212-5489](index.ts#L5212)）。\n\n**用户感受**：哪怕只发\"你好\"也注入这 2000 tokens。LLM 处理这堆 prompt + reasoning thinking 一起拖到 TTFT 70-150 秒。\n\n实测 14:33-14:35 dispatch 拆解：\n- dispatch-start → first deliver-block = **129 秒**\n- 大头是 LLM TTFT 72 秒（首字延迟）\n- 加上 plugin 多次 reload 拖累 ~17 秒\n\n## 改动\n\n### 删 — system context 7900 字 → 1500 字\n\n[index.ts](index.ts) 的 `registerHooks` 函数中 `appendSystemContext` 模板字面量整体重写：\n\n| 删 | 改成 |\n|---|---|\n| 工具速查（共 77 个）整段 6500 字 | 只保留 6 行高频工具速查（任务 / CRM / 项目 / 客服 / 财务 / 联系人 / 检索 / 状态） |\n| 自然语言 → 工具映射 130+ 行 8000+ 字 | 全删（让 LLM 自己推断意图，识别不出再调 odoo_help） |\n| 常用数据模型 26 个 | 缩到 14 个最常用 |\n| 日期 & 字段规范 6 条 | 保留全部（这部分对 LLM 调用工具时仍重要，但本身只 200 字） |\n\n最终 system context 注入约 1500 字 / ~400 tokens。\n\n### 加 — `odoo_help` 工具（按需查工具表）\n\n新增 `api.registerTool({ name: 'odoo_help', ... })`，参数：\n\n- 无参数 → 返回完整 7900 字工具表 + 自然语言映射 + 数据模型清单\n- `keyword=\"<模糊词>\"` → 行级模糊匹配（如 `\"请假\"` 返回所有请假相关工具行；`\"CRM\"` 返回 CRM 分类）\n\nLLM 在不知道某意图对应哪个工具时**主动调 odoo_help**，把 token 消耗从\"每次 prompt 都付\"改成\"按需付\"。\n\n工具数从 189 → **190**。\n\n### 不改\n\n- 未连接路径的 system context（[index.ts:5176-5202](index.ts#L5176)）保留——那段本来就没工具表，只是连接引导\n- 189 工具的实现逻辑 / 接口 / 业务规则 全部不动\n- 共享凭据规则、品牌口径硬规则、用户/系统/凭据动态字段 全保留\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 |\n|---|---|---|\n| 每次 prompt 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens |\n| TTFT 预期降幅 | — | -5 ~ -25 秒 |\n| 工具数 | 189 | 190 (+ odoo_help) |\n| LLM 调用工具的能力 | 完整可见 | 高频 8 个直接可见，其他通过 odoo_help 按需查 |\n\n## 风险与缓解\n\n- **风险**：LLM 看不到完整工具表可能导致它\"不知道某个工具存在\"\n- **缓解**：\n  1. system context 顶部明确告知\"完整 189 工具表调 odoo_help\"\n  2. odoo_help 工具的 description 写明 \"按需获取详细信息\"\n  3. 高频 8 个工具仍然在 system context 里直接可见，覆盖 80% 日常需求\n\n## 测试\n\n- `tsc --noEmit` exit 0（剩余 schema 字段警告是 v1.18 之前就存在的 SDK 类型定义问题，与本次改动无关）\n- 启动期 log 应从 `[odoo] 189 个工具已注册` 变为 `[odoo] 190 个工具已注册（v1.19 — 加 odoo_help 按需查工具表，system context 不再每次注入 ~7900 字）`\n- before_prompt_build 钩子注册 log 加 `v1.19 system context 已瘦身 ~6500 字 → 调 odoo_help 按需取详`\n\n## 兼容性\n\n完全向下兼容。所有 189 工具签名 / 行为 / 业务逻辑不变。LLM 端如果还期望从 system context 看完整工具表，调 odoo_help 即可恢复 v1.18 行为。\n\nFile v1.23.0:CHANGELOG-v1.20.md\n\n# v1.20.0 (2026-04-28)\n\n**核心修复：tier 分级让默认 prompt tool schema 从 ~190 工具 / ~17000 tokens 砍到 ~30 工具 / ~3000 tokens。配合 v1.19 的 system context 瘦身，每次 prompt 总省 ~16000 tokens。**\n\n## 背景\n\nv1.19 把 `before_prompt_build` 注入的 system context 从 7900 字砍到 1500 字（节省 ~1700 tokens）。但实测 `dispatch-start → deliver-start` TTFT 仍 70-150 秒。\n\n进一步诊断（直接 curl DeepSeek API）：\n\n| 测试 | 端到端时间 |\n|---|---|\n| DeepSeek 流式 TTFT | **530ms** |\n| DeepSeek 非流式（含响应） | **790ms** |\n\n→ DeepSeek API 端**完全没问题**。**真正的 TTFT 元凶是 prompt 太大**（单大头 = 189 个 odoo 工具的 JSON schema），LLM 端 prefill 处理 30k+ tokens 才出第一字。\n\n预估每个 odoo 工具 schema ≈ 80-200 tokens（name + description + properties + required）：\n\n- description 总和 16470 字符 / ~5490 tokens\n- 加 schema 结构（properties / required / type 等）×3-4 倍 → **15000-20000 tokens** 仅 odoo 一个 plugin\n\n## 改动\n\n### `index.ts` — 引入 tier 分级\n\n新增 `ODOO_TOOL_TIERS`（module-level 常量）：\n\n```ts\nconst ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};\n```\n\n`registerTools` 函数顶部读 plugin config：\n\n```ts\nconst cfg = (api.pluginConfig ?? {}) as { tier?: 'minimal' | 'core' | 'extended' };\nconst tier = cfg.tier ?? 'core';  // 默认 core\nconst allowedTools = tier === 'extended' ? null : ODOO_TOOL_TIERS[tier];\n\nconst register = (opts) => {\n  if (allowedTools === null || allowedTools.has(opts.name) || opts.name === 'odoo_help') {\n    api.registerTool(opts);\n    registeredCount++;\n  } else {\n    skippedCount++;\n  }\n};\n```\n\n然后 sed 把 489-5500 行内 189 个 `api.registerTool(` 替换为 `register(` —— **所有 189 个工具走 register wrapper 过滤**。\n\n`odoo_help` 工具**始终注册**（任何 tier），保证 LLM 能查完整工具表。\n\n### `index.ts` — system context 提示当前 tier\n\n将 v1.19 的 \"完整 189 个工具表 …\" 提示更新为 \"**当前 tier=core（默认 30 个高频工具直接可见）。完整 190 个工具调 odoo_help 查；如需恢复 v1.18 全量行为：改 ~/.openclaw/openclaw.json 的 plugins.entries.odoo.config.tier='extended'**\"。\n\n### `index.ts` — 启动期 log 报告 tier 状态\n\n```\nv1.18: [odoo] 189 个工具已注册（v1.18 — Studio 元编程+审计...）\nv1.19: [odoo] 190 个工具已注册（v1.19 — 加 odoo_help...）\nv1.20: [odoo] 30 个工具已注册（v1.20 — tier=core 精简档位 / 跳过 160 个，节省 ~12800 tokens schema）\n       完整 190 工具调 odoo_help 查；改 plugins.entries.odoo.config.tier=\"extended\" 可恢复全量。\n```\n\n## tier 三档\n\n### `minimal`（10 工具）\n\n仅最核心连接 + 任务搜索：\n```\nodoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\nodoo_create_task / odoo_list_tasks / odoo_my_today\nodoo_search / odoo_daily_briefing\n```\n\n适合：极致性能，仅做\"连接 + 任务列表\"演示场景。\n\n### `core`（30 工具，默认）\n\n覆盖 80% 日常需求的高频 30 个：\n\n- 连接 & 状态（5）：odoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\n- 任务 & 活动（8）：odoo_create_task / odoo_list_tasks / odoo_update_task / odoo_my_today / odoo_my_workload / odoo_create_activity / odoo_calendar_today / odoo_complete_activity\n- CRM（5）：odoo_crm_pipeline / odoo_crm_create / odoo_crm_update / odoo_crm_won / odoo_crm_lost\n- 项目（2）：odoo_project_overview / odoo_timesheet_log\n- 客服（2）：odoo_tickets / odoo_ticket_create\n- 财务（3）：odoo_invoices / odoo_sale_orders / odoo_purchase_orders\n- 联系人（2）：odoo_contacts / odoo_contact_create\n- 检索（2）：odoo_search / odoo_daily_briefing\n- 消息（1）：odoo_message_post\n\n### `extended`（190 工具，v1.18/1.19 行为）\n\n完整暴露所有工具（含 HR 全套 / 库存深化 / 生产 MRP / Studio 元编程 / 审计 / 多公司联动等）。\n\n适合：需要全功能，不在意 prompt token 开销。\n\n## 配置切换\n\n在 `~/.openclaw/openclaw.json`：\n\n```jsonc\n{\n  \"plugins\": {\n    \"entries\": {\n      \"odoo\": {\n        \"config\": {\n          \"tier\": \"extended\"   // 或 \"core\"（默认）/ \"minimal\"\n        }\n      }\n    }\n  }\n}\n```\n\n改完后 `launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway` 重启 gateway 即生效。\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 | **v1.20 默认** | v1.20 extended |\n|---|---|---|---|---|\n| system context 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens |\n| 工具数量 | 189 | 190 | **30** | 190 |\n| 工具 schema 占 tokens | ~17000 | ~17000 | **~3000** | ~17000 |\n| **每次 prompt 总 token** | 19000 | 17400 | **3400** | 17400 |\n| LLM TTFT 预估 | 70-150s | 65-145s | **15-50s** | 65-145s |\n\n注：实际 TTFT 受 LLM 端 prefill 速度、conversation history、其他 plugin 注入影响。\n\n## 风险与缓解\n\n- **风险**：默认只 30 工具，LLM 不知道\"odoo_employee_skills\"等工具存在 → 用户问相关问题时 LLM 表现退化\n- **缓解 1**：system context 顶部明确告知\"完整 190 工具调 odoo_help 查\"\n- **缓解 2**：odoo_help 工具的 description 写明 \"按需获取详细信息（无参 = 完整 190 工具表 / keyword 模糊匹配）\"\n- **缓解 3**：core 30 个已覆盖 80% 日常场景；不在 core 但常用的工具，用户可手动调到 extended\n\n## 测试\n\n- `tsc --noEmit` exit 0（v1.19 还有 ~20 个 schema warning，v1.20 因为 register wrapper 用 generic 反而**全部消除**）\n- 启动期 log 应从 `190 个工具已注册（v1.19 …）` 变为 `30 个工具已注册（v1.20 — tier=core …）`\n\n## 兼容性\n\n完全向下兼容。改 plugin config `tier=\"extended\"` 即恢复 v1.19 行为，所有 190 工具签名 / 行为 / 业务逻辑全部不变。\n\nFile v1.23.0:CHANGELOG-v1.22.md\n\n# v1.22.0 (2026-05-04)\n\n**`odoo_sale_orders` / `odoo_purchase_orders` 三大增强：按编号查 + 一次拿明细 + 强化 description 防 LLM 走 exec curl**\n\n## 背景\n\n会话 `agent:main:wecom:direct:zhaobo` 里，赵博发了「未来电脑的销售单（编号：S00016），按照这个帮我写一个软件销售合同」。\n\ntrajectory 复盘（[详细见会话诊断]）：\n\n1. main agent（deepseek-v4-pro）看了 `odoo_sale_orders` 工具\n2. **schema 只有 `limit / state / partner_id`，没有按订单编号查的字段**\n3. LLM 觉得\"这工具不能按 S00016 编号查具体单\"，**改走 `exec` + `curl JSON-RPC` 手写**\n4. 手写折腾了 9 次（postmaster 没销售权限 → uid=5 ZhaoBo 才成功）\n5. 拿到 S00016 数据后 LLM 状态混乱，重复说\"先查一下...\"就 stop，**没生成合同**\n\n5 是模型行为问题（已转 P0 跟踪），但 2 是 **tool design gap** ——本版修。\n\n## 改动\n\n### 1. `odoo_sale_orders` schema 加 3 个字段\n\n[`index.ts:1228-1310`](index.ts:1228)\n\n```diff\n schema:\n   properties:\n+    name:          { type: 'string', description: '订单编号（如 \"S00016\"），精确匹配' }\n+    record_id:     { type: 'number', description: '按 sale.order 记录 ID 直读' }\n+    include_lines: { type: 'boolean', description: '同时拉订单明细（sale.order.line），写合同/对账强烈建议 true' }\n     limit:         ...\n     state:         ...\n     partner_id:    ...\n```\n\n返回字段补齐：`amount_untaxed / amount_tax / amount_total / payment_term / currency / note`，\ninclude_lines=true 时每单挂 `order_line[]`（id, product_id, name, product_uom_qty, qty_delivered,\nqty_invoiced, product_uom, price_unit, discount, price_subtotal, price_total, price_tax）。\n\n### 2. `odoo_purchase_orders` 同步加 name/record_id/include_lines\n\n[`index.ts:1313-1395`](index.ts:1313)\n\n字段对齐（采购侧 `qty_received` / `qty_invoiced` / `date_planned` / `notes`）。\n\n### 3. `OdooClient.getSaleOrders` / `getPurchaseOrders` 内部支持\n\n[`src/modules/odoo-client.ts:336-403`](src/modules/odoo-client.ts:336)\n\n- name → `domain.push(['name', '=', name])`\n- record_id → `domain.push(['id', '=', record_id])`\n- include_lines → 一次性 `searchRead('sale.order.line', [['order_id', 'in', orderIds]])` **避免 N+1 RPC**\n- 按 `(order_id, sequence)` 排序后挂回各 order 的 `order_line[]`\n\n### 4. description 强化 — 防 LLM 走 exec curl 手写 RPC\n\n[`index.ts:1230-1240`](index.ts:1230) — 参考 memory `feedback_tool_description_vs_prompt_level_constraint.md`，把具体 anti-pattern 字面写进 description：\n\n```\n查询销售订单（sale.order）。支持三种用法：\n(a) 列表浏览：limit + state + partner_id；\n(b) ⭐ 按订单编号查具体单：name=\"S00016\"（精确匹配，最常用）；\n(c) 按记录 ID 直读：record_id=9。\n⭐ 写合同 / 对账 / 回邮件这类需要明细的场景：必传 include_lines=true，\n一次拿回 partner / 产品 / 数量 / 单价 / 折扣 / 小计 / 税额 / 合计 / 付款条件，\n避免后续再发多次 RPC。不要走 exec/curl 手写 JSON-RPC，本工具已经覆盖。\n```\n\n实际 anti-pattern：之前 deepseek-v4-pro 看到 description 太弱（\"查看销售订单/报价单列表\"），就自己写 9 次 curl。新版直接告诉它\"覆盖了，别 hack\"。\n\n### 5. log 字符串和三处 version 对齐\n\n`api.logger.info` 字符串从 `v1.21.0` 改到 `v1.22.0`（之前 v1.20.x→v1.21 时漏改这条 log，gateway log 一直显示 v1.9 是因为 runtime 装的还是 v1.20.2 旧拷贝）。\n\n`package.json` / `SKILL.md` / `openclaw.plugin.json` / `index.ts` log 字符串四处全部对齐到 1.22.0。\n\n## 测试\n\n- `tsc --noEmit` 通过\n- 没有 unit test（odoo plugin 一直没建 test suite，本版不补——避免 scope creep）\n- 集成验证：发版后 `openclaw plugins install` 重装 + 重启 gateway，手工跑 `odoo_sale_orders name='S00016' include_lines=true` 看返回完整明细\n\n## 兼容性\n\n完全向下兼容。\n\n- 老代码 / 老 prompt 不传新字段 → behavior 不变（只有 limit/state/partner_id）\n- 新字段都是 optional，schema 校验无 breaking change\n- `getSaleOrders` 不传 include_lines → 不发 sale.order.line RPC，零成本\n\n## 红线自查\n\n- ✅ 无 `child_process / execSync / spawnSync`\n- ✅ `compat.pluginApi: \">=2026.2.24\"` 是 ranged，不是裸版本\n- ✅ `peerDependencies.openclaw: \">=2026.2.24\"` 是 ranged\n- ✅ 不修改 openclaw 核心代码\n- ✅ 不复制龙虾原生功能（odoo_sale_orders 是辉火云特有，没原生等价物）\n\n## 不变\n\n- v1.21.0 的 hook RPC 永久挂修复（首字延迟 P50 16.4s → <3s）继承\n- v1.20 审批工作流深化继承\n- v1.19 工具分级 tier（core/minimal/extended）继承——本版改的两个工具都在 core tier，default 启用\n- 其他 42 个 core tier 工具未动\n- 用户自定义 manifest 凭据（pluginConfig.odoo）行为不变\n\nFile v1.23.0:CHANGELOG-v1.23.md\n\n# v1.23.0 — 默认权限模型反转 + 附件硬规则\n\n发布日期: 2026-05-07\n\n## 一句话\n\n`odoo_connect` 默认从「全员共享」反转为「按 sender_id 隔离」,让 Odoo 内部 RBAC 真正起作用;同时给 LLM 加附件硬规则,杜绝「解压看到内容跟商机字段对不上就打回用户」的越权行为。\n\n---\n\n## 触发本次发版的事故\n\n用户在企微群里上传 `AI报价单.rar` 让 LLM 建商机。LLM 解压后回复:\n\n> 等等,我解压出来的这批文件内容是工厂生产排产计划,和 Odoo19 商机的内容对不上。你发的可能不是同一个压缩包?\n\n用户被迫解释一通。然后说要让 LLM 帮建商机:\n\n> 应该是每个同事都需要输入自己的账号密码。为了就是不同人拥有不同的权限\n\n但 v1.22 prompt 主动建议「配一次咱们组织所有同事就都能用了 👍」——直接跟用户期望相反。\n\n两件事暴露了:\n\n1. **权限模型设计错误**:v1.10 起默认 `scope='shared'` 让所有人共用同一个 Odoo 账号 → Odoo 内部 RBAC 完全失效(销售/管理员看到的数据一样)\n2. **LLM 越权解读附件内容**:插件没有 prompt 级硬约束,LLM 看到附件内容跟\"商机\"字面对不上就替用户做\"内容相符性\"判断\n\n---\n\n## Bug 1: 默认凭据 scope 反转\n\n### 旧行为(v1.10–v1.22)\n\n```ts\n// config-manager.ts\nsaveOdooConfig(odooConfig, agentId, scope: 'shared' | 'agent' = 'shared')\n\n// odoo_connect tool\nprivate?: boolean   // false=shared(默认), true=agent\nconst scope = params.private ? 'agent' : 'shared';\n```\n\nprompt 主动建议:\n\n> 配一次之后,所有同事 @ 我都能用,不需要再输入\n\n后果:\n\n- 一个销售配了自己账号 → 全员都用销售账号 → 销售看不到管理员看的数据? 或者更糟:**所有人都看到销售看的数据**(包括财务 / HR / 客户隐私)\n- Odoo 用户 RBAC 完全失效。设计得很精细的 group_ids / record_rule 形同虚设\n- 不符合企业协作模型(\"每人按角色分权限\"是绝大多数企业期望)\n\n### 新行为(v1.23)\n\n```ts\n// config-manager.ts\nsaveOdooConfig(odooConfig, agentId, scope: 'shared' | 'agent' = 'agent')\n\n// odoo_connect tool —— 新增 shared 参数,语义反转,旧 private 标 deprecated 但仍兼容\n{\n  shared?: boolean,   // 默认 false = sender_id 隔离 = per-user RBAC\n  private?: boolean,  // [deprecated] 仍兼容旧 agent memory:private=true → agent\n}\n\n// 优先级:shared 显式 > private 兼容 > 默认 agent\nlet scope: 'shared' | 'agent';\nif (typeof params.shared === 'boolean') scope = params.shared ? 'shared' : 'agent';\nelse if (typeof params.private === 'boolean') scope = params.private ? 'agent' : 'shared';\nelse scope = 'agent';\n```\n\nprompt 改成:\n\n> 每个同事用自己的账号,权限按你的 Odoo 角色区分(销售看销售的、管理员看管理员的)。绝不要主动建议「配一次全员通用」。\n\n### Fallback 链不变\n\n```\n{agentId}.json    ← 默认写这里(per-sender_id)\ndefault.json      ← shared=true 时写这里,作为兜底 fallback\npluginConfig.odoo ← manifest 静态预填(老路径)\nodoo-config.json  ← legacy\n```\n\n如果用户真的有\"组织共用一个公共只读账号\"场景,显式说\"组织共用\",LLM 会调 `odoo_connect(shared=true)` 写 default.json。\n\n---\n\n## Bug 2: 附件硬规则\n\n### 旧行为\n\nprompt 没有任何关于\"附件内容判断\"的约束。LLM 看到附件,自然按\"读了就要用\"的常识做内容相符性判断,看到不一致就打回用户。\n\n### 新行为\n\n`before_prompt_build` hook 注入硬规则(未连接 + 已连接两段都加):\n\n> **附件 / 文件内容判断 — 硬规则**\n>\n> 1. 附件内容由用户负责。不要解读\"内容是不是跟商机字段对得上\"\n> 2. 解压/读附件**仅用于提取用户明示的字段**\n> 3. **正确工作流**:`odoo_crm_create` 建商机 → `odoo_attach_file` 挂附件 → 回报完成\n> 4. 用户没说要看附件内容时**绝不主动解析后质疑**用户\n> 5. 只有用户**明确问**\"这附件是什么\"时才解读\n>\n> 常见错误回复:「我解压出来的内容跟商机对不上,你发错了吗?」 ❌\n\n理论依据:`feedback_tool_description_vs_prompt_level_constraint.md` —— 把具体 anti-pattern 字面写进 prompt,比抽象描述有效得多。直接把用户截屏里 LLM 那句越权回复抄进 prompt 当反例,LLM 下次就不会复制粘贴自己的烂回复。\n\n---\n\n## Breaking changes\n\n`odoo_connect` 默认 scope 反转。**已有 v1.22 部署的影响**:\n\n- 已存在的 `default.json`(shared 凭据) **不会被自动迁移或删除**,fallback 链照常工作 → 没有显式 sender_id 配置的成员仍走 shared。\n- 已有 `{agentId}.json` 也照常生效(优先级最高)。\n- **首次升级后用户主动调 `odoo_connect`**:写入位置变了(从 default.json → {agentId}.json)。如果用户希望继续共享,必须显式说\"组织共用\"或传 shared=true。\n\n**迁移建议**:升级到 v1.23 后,各成员各自 @ 机器人调一次 `odoo_connect` 配自己账号即可。已存在的 default.json 留作兜底,不影响。\n\n---\n\n## 文件变化\n\n- `src/modules/config-manager.ts` — `saveOdooConfig` 默认参数 `'shared'` → `'agent'`,文件头注释改写说明权限模型反转\n- `index.ts`\n  - `odoo_connect` schema 加 `shared` 参数,`private` 标 deprecated 但仍兼容\n  - `odoo_connect` description 强化:**绝不主动建议全员共用**\n  - handler 加 shared > private > 默认 agent 的优先级判断\n  - `odoo_whoami` 兜底文案改写\n  - `before_prompt_build` hook 未连接段:文案翻新 + 加附件硬规则\n  - `before_prompt_build` hook 已连接段:credSourceLabel 改写 + 加附件硬规则\n- `SKILL.md` — 首次配置段、Changelog、附件硬规则段\n- `package.json` / `openclaw.plugin.json` — 版本 bump 到 1.23.0,description 同步\n\n---\n\n## 自查 checklist\n\n- [x] `compat.pluginApi` 是 ranged(`>=2026.2.24`)\n- [x] `package.json.version` / `openclaw.plugin.json.version` / `SKILL.md.version` 三处一致 = 1.23.0\n- [x] 没引入 `child_process` / `execSync` / `spawnSync`\n- [x] typecheck 通过\n- [x] `odoo_connect` 旧 `private` 参数仍兼容(避免老 agent memory 里的调用失败)\n- [x] SKILL.md 大小 < 25KB\n\n---\n\n## 关联\n\n- 触发事件: 2026-05-07 用户企微群 LLM 越权回复 + 默认全员共享反馈\n- 上游 memory: `feedback_plugins_must_be_independently_installable.md` / `feedback_tool_description_vs_prompt_level_constraint.md`\n- 下游 memory: 本次会沉淀 `feedback_default_permission_model_per_user_vs_shared.md`(详见会话末尾)\n\nFile v1.23.0:openclaw.plugin.json\n\n{\n  \"id\": \"odoo\",\n  \"name\": \"火一五·辉火云企业套件插件\",\n  \"description\": \"自然语言操作辉火云企业套件，企业级全场景 ERP + 系统管理 + Studio 元编程 + 工具分级助手，204 个工具（含 odoo_help）覆盖销售/采购/库存/生产/会计/HR/项目/CRM/客服/知识/通知/智能/报表 13 业务域 + 系统级 + Studio 元编程；v1.23 默认权限反转（odoo_connect 默认按 sender_id 隔离 + 新 shared 参数 + 附件硬规则）；v1.22 sale/purchase 加 name+record_id+include_lines；v1.10 共享凭据；v1.11–v1.13 HR 三步走；v1.14 Analytics & Orchestration；v1.15 个人视图+CRM 智能+跨域桥+库存深化+多公司；v1.16 业务深化；v1.17 自动化与治理；v1.18 Studio 元编程；v1.19 工具分级 tier；v1.20 审批工作流+克隆+CSV+Mail+资源+报表订阅\",\n  \"version\": \"1.23.0\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"odoo\": {\n        \"type\": \"object\",\n        \"description\": \"辉火云企业套件 连接配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"辉火云企业套件 系统地址，如 https://www.huo15.com\"\n          },\n          \"db\": {\n            \"type\": \"string\",\n            \"description\": \"数据库名称，如 huo15\"\n          },\n          \"username\": {\n            \"type\": \"string\",\n            \"description\": \"用户名（邮箱或登录名）\"\n          },\n          \"password\": {\n            \"type\": \"string\",\n            \"description\": \"密码\"\n          }\n        },\n        \"required\": [\"url\", \"db\", \"username\", \"password\"]\n      },\n      \"sync\": {\n        \"type\": \"object\",\n        \"description\": \"通知同步配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"description\": \"是否启用后台通知同步\",\n            \"default\": true\n          },\n          \"intervalSeconds\": {\n            \"type\": \"number\",\n            \"description\": \"轮询间隔（秒），默认 30\",\n            \"default\": 30\n          },\n          \"channels\": {\n            \"type\": \"array\",\n            \"description\": \"需要同步的通知类型\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n            },\n            \"default\": [\"todo\", \"activity\", \"message\"]\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.23.0:package.json\n\n{\n  \"name\": \"@huo15/huo15-huihuoyun-odoo\",\n  \"version\": \"1.23.0\",\n  \"description\": \"火一五·辉火云企业套件插件 v1.23.0 — 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号，与内部 RBAC 对齐：销售看销售的、管理员看管理员的）；新参数 shared（默认 false），旧 private 标 deprecated 但仍兼容；prompt supplement 加附件硬规则（不替用户判断'附件内容是否相符'后打回用户的越权行为）。继承 v1.22 record_id+include_lines / v1.21 hook RPC 永久挂修复（首字延迟 P50 16.4s→<3s）/ v1.20 审批工作流 / 204 工具覆盖 13 业务域 + Studio 元编程。\",\n  \"type\": \"module\",\n  \"main\": \"index.ts\",\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"build\": {\n      \"openclawVersion\": \"2026.4.10\"\n    },\n    \"compat\": {\n      \"pluginApi\": \">=2026.2.24\"\n    }\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"plugin\",\n    \"huohuoyun\",\n    \"huihuoyun\",\n    \"erp\",\n    \"huo15\",\n    \"crm\",\n    \"helpdesk\",\n    \"invoice\"\n  ],\n  \"author\": \"jobzhao15\",\n  \"license\": \"MIT\",\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.2.24\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"typescript\": \"^5.5.0\"\n  },\n  \"scripts\": {\n    \"typecheck\": \"tsc --noEmit\",\n    \"release\": \"bash scripts/release.sh\",\n    \"prepublishOnly\": \"npm run typecheck\"\n  },\n  \"files\": [\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"src/**/*\",\n    \"SKILL.md\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://cnb.cool/huo15/tools/huo15-huihuoyun-odoo\"\n  }\n}\n\nFile v1.23.0:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\"]\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.22.0: 23 files, 222958 bytes\n\nFiles: CHANGELOG-v1.19.md (3544b), CHANGELOG-v1.20.md (6088b), CHANGELOG-v1.22.md (4958b), index.ts (325637b), openclaw.plugin.json (2672b), package-lock.json (259330b), package.json (1600b), README.md (10748b), scripts/release.sh (11335b), SKILL.md (9633b), src/modules/config-manager.ts (6749b), src/modules/envelope-cache.ts (1659b), src/modules/mutation-log.ts (4571b), src/modules/notification-bus.ts (5783b), src/modules/notification-poller.ts (9267b), src/modules/notification-prefs.ts (4397b), src/modules/notification-router.ts (5633b), src/modules/odoo-client.ts (213318b), src/types/index.ts (6609b), src/utils/date-utils.ts (2296b), src/utils/md-to-html.ts (2346b), tsconfig.json (483b), _meta.json (140b)\n\nFile v1.22.0:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.22.0 重点：odoo_sale_orders / odoo_purchase_orders 加 name（按 'S00016' 编号查）+ record_id + include_lines（一次拿明细+合计+税额+付款条件，写合同/对账免 N+1 RPC）+ description 强化（防 LLM 偏向 exec/curl 手写 JSON-RPC）。继承 v1.21 hook RPC 永久挂修复（首字延迟 P50 16.4s→<3s）+ v1.20 审批工作流。Use when：接 Odoo/辉火云、企业 ERP 操作、CRM/任务/财务/销售/工单管理、自然语言企微/钉钉调用 ERP、写销售/采购合同需要订单明细。\nversion: 1.22.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 admin@huo15.com，密码 xxxxxx\n\n龙虾会自动调用 `odoo_connect` 工具，连接信息保存本地，下次启动自动恢复。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接辉火云企业套件 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## Changelog\n\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.22.0:README.md\n\n# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| `odoo_sale_orders` | 查看销售订单 |\n| `odoo_purchase_orders` | 查看采购订单 |\n| `odoo_invoices` | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| `odoo_tickets` | 查看客服工单 |\n| `odoo_ticket_create` | 创建客服工单 |\n\n### 联系人（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_contacts` | 查询联系人/客户/供应商 |\n| `odoo_contact_create` | 创建联系人/客户/供应商 |\n\n### 库存（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_stock_levels` | 查看库存水平 |\n| `odoo_stock_pickings` | 查看调拨单/出入库单 |\n\n### HR 人事（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_employees` | 查询员工列表 |\n| `odoo_leaves` | 查看请假记录 |\n| `odoo_attendances` | 查看考勤打卡记录 |\n\n### 审批（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_approvals` | 查看审批请求 |\n\n### 助手\n| 工具 | 说明 |\n|------|------|\n| `odoo_search` | 通用搜索（任意模型任意条件） |\n| `odoo_daily_briefing` | 实施经理每日工作概况 |\n\n---\n\n## WeCom 动态 Agent 多用户隔离\n\n搭配 `@huo15/wecom` 插件的动态 agent 能力，每个企微用户/群组拥有独立的辉火云连接：\n\n1. **凭据隔离** — 用户 A 的辉火云账号密码，用户 B 看不到也用不了\n2. **Session 隔离** — 每个用户各自的辉火云 session，互不干扰\n3. **数据隔离** — 每个用户看到的是自己辉火云账号的数据\n4. **自动恢复** — 每个用户的凭据独立持久化，重启后自动恢复\n\n**实现原理**：\n- 工具通过 `ctx.agentId` 获取当前用户的动态 agent ID（如 `wecom-acct-ws-dm-zhangsan`）\n- 配置持久化到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`\n- OdooClient 和 NotificationPoller 均按 agentId 隔离存储\n\n---\n\n## 使用示例\n\n```\n👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）...\n```\n\n---\n\n## 通知同步\n\n插件连接后自动轮询（默认 30 秒），推送以下变更：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 Chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 技术架构\n\n- **JSON-RPC 对接** — 通过 `/web/session/authenticate` 和 `/web/dataset/call_kw` 与辉火云后端通信\n- **Per-Agent 隔离** — 按 `ctx.agentId` 隔离 OdooClient / Poller / Config，兼容 WeCom 动态 agent\n- **数据库自动检测** — `/web/database/list` 查询可用数据库，单库自动选择\n- **Session 自动重连** — `ensureAuthenticated()` 在轮询前自动检查并恢复 session\n- **高水位线去重** — 消息/邮件用 `id > highWaterMark` 去重，避免时钟偏差问题\n- **基线初始化** — 首次启动静默建立水位线，不推送历史数据\n- **OpenClaw 插件规范** — `definePluginEntry` + `api.registerTool()` + `api.on(\"before_prompt_build\")`\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、账号密码。用 `odoo_status` 查看当前状态。数据库名一般不用手动填，插件会自动检测。\n\n**Q: WeCom 多用户场景下，每个用户都要单独连接吗？**\nA: 是的。每个企微用户首次使用辉火云企业套件功能时会被引导输入自己的系统地址和账号密码，之后自动保存，无需重复输入。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 如何断开连接并清除保存的密码？**\nA: 告诉龙虾\"断开辉火云连接\"，会调用 `odoo_disconnect` 清除当前用户的凭据。\n\n---\n\n## Changelog\n\n- **v1.2.0** — Per-agent 凭据隔离（WeCom 多用户）、智能连接引导、数据库自动检测、联系人/客户管理、库存查询（stock.quant/stock.picking）、HR 员工/考勤/请假、审批流查询、odoo_disconnect 工具。共 32 个工具\n- **v1.1.0** — CRM 商机管道、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\n---\n\n## License\n\nMIT\n\n---\n\n<div align=\"center\">\n\n**公司名称：** 青岛火一五信息科技有限公司\n\n**联系邮箱：** postmaster@huo15.com | **QQ群：** 1093992108\n\n---\n\n**关注逸寻智库公众号，获取更多资讯**\n\n<img src=\"https://tools.huo15.com/uploads/images/system/qrcode_yxzk.jpg\" alt=\"逸寻智库公众号二维码\" style=\"width: 200px; height: auto; margin: 10px 0;\" />\n\n</div>\n\n---\n\nFile v1.22.0:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.22.0\",\n  \"publishedAt\": 1777862547238\n}\n\nFile v1.22.0:CHANGELOG-v1.19.md\n\n# v1.19.0 (2026-04-28)\n\n**核心修复：消除每次 prompt 注入 ~7900 字 / ~2000 tokens 的工具表，TTFT（首字延迟）实测降幅显著。**\n\n## 背景\n\n诊断发现 `before_prompt_build` hook 在每次 LLM call 之前都注入 ~7900 字的工具速查 + 自然语言映射表到 system context（[index.ts:5212-5489](index.ts#L5212)）。\n\n**用户感受**：哪怕只发\"你好\"也注入这 2000 tokens。LLM 处理这堆 prompt + reasoning thinking 一起拖到 TTFT 70-150 秒。\n\n实测 14:33-14:35 dispatch 拆解：\n- dispatch-start → first deliver-block = **129 秒**\n- 大头是 LLM TTFT 72 秒（首字延迟）\n- 加上 plugin 多次 reload 拖累 ~17 秒\n\n## 改动\n\n### 删 — system context 7900 字 → 1500 字\n\n[index.ts](index.ts) 的 `registerHooks` 函数中 `appendSystemContext` 模板字面量整体重写：\n\n| 删 | 改成 |\n|---|---|\n| 工具速查（共 77 个）整段 6500 字 | 只保留 6 行高频工具速查（任务 / CRM / 项目 / 客服 / 财务 / 联系人 / 检索 / 状态） |\n| 自然语言 → 工具映射 130+ 行 8000+ 字 | 全删（让 LLM 自己推断意图，识别不出再调 odoo_help） |\n| 常用数据模型 26 个 | 缩到 14 个最常用 |\n| 日期 & 字段规范 6 条 | 保留全部（这部分对 LLM 调用工具时仍重要，但本身只 200 字） |\n\n最终 system context 注入约 1500 字 / ~400 tokens。\n\n### 加 — `odoo_help` 工具（按需查工具表）\n\n新增 `api.registerTool({ name: 'odoo_help', ... })`，参数：\n\n- 无参数 → 返回完整 7900 字工具表 + 自然语言映射 + 数据模型清单\n- `keyword=\"<模糊词>\"` → 行级模糊匹配（如 `\"请假\"` 返回所有请假相关工具行；`\"CRM\"` 返回 CRM 分类）\n\nLLM 在不知道某意图对应哪个工具时**主动调 odoo_help**，把 token 消耗从\"每次 prompt 都付\"改成\"按需付\"。\n\n工具数从 189 → **190**。\n\n### 不改\n\n- 未连接路径的 system context（[index.ts:5176-5202](index.ts#L5176)）保留——那段本来就没工具表，只是连接引导\n- 189 工具的实现逻辑 / 接口 / 业务规则 全部不动\n- 共享凭据规则、品牌口径硬规则、用户/系统/凭据动态字段 全保留\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 |\n|---|---|---|\n| 每次 prompt 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens |\n| TTFT 预期降幅 | — | -5 ~ -25 秒 |\n| 工具数 | 189 | 190 (+ odoo_help) |\n| LLM 调用工具的能力 | 完整可见 | 高频 8 个直接可见，其他通过 odoo_help 按需查 |\n\n## 风险与缓解\n\n- **风险**：LLM 看不到完整工具表可能导致它\"不知道某个工具存在\"\n- **缓解**：\n  1. system context 顶部明确告知\"完整 189 工具表调 odoo_help\"\n  2. odoo_help 工具的 description 写明 \"按需获取详细信息\"\n  3. 高频 8 个工具仍然在 system context 里直接可见，覆盖 80% 日常需求\n\n## 测试\n\n- `tsc --noEmit` exit 0（剩余 schema 字段警告是 v1.18 之前就存在的 SDK 类型定义问题，与本次改动无关）\n- 启动期 log 应从 `[odoo] 189 个工具已注册` 变为 `[odoo] 190 个工具已注册（v1.19 — 加 odoo_help 按需查工具表，system context 不再每次注入 ~7900 字）`\n- before_prompt_build 钩子注册 log 加 `v1.19 system context 已瘦身 ~6500 字 → 调 odoo_help 按需取详`\n\n## 兼容性\n\n完全向下兼容。所有 189 工具签名 / 行为 / 业务逻辑不变。LLM 端如果还期望从 system context 看完整工具表，调 odoo_help 即可恢复 v1.18 行为。\n\nFile v1.22.0:CHANGELOG-v1.20.md\n\n# v1.20.0 (2026-04-28)\n\n**核心修复：tier 分级让默认 prompt tool schema 从 ~190 工具 / ~17000 tokens 砍到 ~30 工具 / ~3000 tokens。配合 v1.19 的 system context 瘦身，每次 prompt 总省 ~16000 tokens。**\n\n## 背景\n\nv1.19 把 `before_prompt_build` 注入的 system context 从 7900 字砍到 1500 字（节省 ~1700 tokens）。但实测 `dispatch-start → deliver-start` TTFT 仍 70-150 秒。\n\n进一步诊断（直接 curl DeepSeek API）：\n\n| 测试 | 端到端时间 |\n|---|---|\n| DeepSeek 流式 TTFT | **530ms** |\n| DeepSeek 非流式（含响应） | **790ms** |\n\n→ DeepSeek API 端**完全没问题**。**真正的 TTFT 元凶是 prompt 太大**（单大头 = 189 个 odoo 工具的 JSON schema），LLM 端 prefill 处理 30k+ tokens 才出第一字。\n\n预估每个 odoo 工具 schema ≈ 80-200 tokens（name + description + properties + required）：\n\n- description 总和 16470 字符 / ~5490 tokens\n- 加 schema 结构（properties / required / type 等）×3-4 倍 → **15000-20000 tokens** 仅 odoo 一个 plugin\n\n## 改动\n\n### `index.ts` — 引入 tier 分级\n\n新增 `ODOO_TOOL_TIERS`（module-level 常量）：\n\n```ts\nconst ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};\n```\n\n`registerTools` 函数顶部读 plugin config：\n\n```ts\nconst cfg = (api.pluginConfig ?? {}) as { tier?: 'minimal' | 'core' | 'extended' };\nconst tier = cfg.tier ?? 'core';  // 默认 core\nconst allowedTools = tier === 'extended' ? null : ODOO_TOOL_TIERS[tier];\n\nconst register = (opts) => {\n  if (allowedTools === null || allowedTools.has(opts.name) || opts.name === 'odoo_help') {\n    api.registerTool(opts);\n    registeredCount++;\n  } else {\n    skippedCount++;\n  }\n};\n```\n\n然后 sed 把 489-5500 行内 189 个 `api.registerTool(` 替换为 `register(` —— **所有 189 个工具走 register wrapper 过滤**。\n\n`odoo_help` 工具**始终注册**（任何 tier），保证 LLM 能查完整工具表。\n\n### `index.ts` — system context 提示当前 tier\n\n将 v1.19 的 \"完整 189 个工具表 …\" 提示更新为 \"**当前 tier=core（默认 30 个高频工具直接可见）。完整 190 个工具调 odoo_help 查；如需恢复 v1.18 全量行为：改 ~/.openclaw/openclaw.json 的 plugins.entries.odoo.config.tier='extended'**\"。\n\n### `index.ts` — 启动期 log 报告 tier 状态\n\n```\nv1.18: [odoo] 189 个工具已注册（v1.18 — Studio 元编程+审计...）\nv1.19: [odoo] 190 个工具已注册（v1.19 — 加 odoo_help...）\nv1.20: [odoo] 30 个工具已注册（v1.20 — tier=core 精简档位 / 跳过 160 个，节省 ~12800 tokens schema）\n       完整 190 工具调 odoo_help 查；改 plugins.entries.odoo.config.tier=\"extended\" 可恢复全量。\n```\n\n## tier 三档\n\n### `minimal`（10 工具）\n\n仅最核心连接 + 任务搜索：\n```\nodoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\nodoo_create_task / odoo_list_tasks / odoo_my_today\nodoo_search / odoo_daily_briefing\n```\n\n适合：极致性能，仅做\"连接 + 任务列表\"演示场景。\n\n### `core`（30 工具，默认）\n\n覆盖 80% 日常需求的高频 30 个：\n\n- 连接 & 状态（5）：odoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\n- 任务 & 活动（8）：odoo_create_task / odoo_list_tasks / odoo_update_task / odoo_my_today / odoo_my_workload / odoo_create_activity / odoo_calendar_today / odoo_complete_activity\n- CRM（5）：odoo_crm_pipeline / odoo_crm_create / odoo_crm_update / odoo_crm_won / odoo_crm_lost\n- 项目（2）：odoo_project_overview / odoo_timesheet_log\n- 客服（2）：odoo_tickets / odoo_ticket_create\n- 财务（3）：odoo_invoices / odoo_sale_orders / odoo_purchase_orders\n- 联系人（2）：odoo_contacts / odoo_contact_create\n- 检索（2）：odoo_search / odoo_daily_briefing\n- 消息（1）：odoo_message_post\n\n### `extended`（190 工具，v1.18/1.19 行为）\n\n完整暴露所有工具（含 HR 全套 / 库存深化 / 生产 MRP / Studio 元编程 / 审计 / 多公司联动等）。\n\n适合：需要全功能，不在意 prompt token 开销。\n\n## 配置切换\n\n在 `~/.openclaw/openclaw.json`：\n\n```jsonc\n{\n  \"plugins\": {\n    \"entries\": {\n      \"odoo\": {\n        \"config\": {\n          \"tier\": \"extended\"   // 或 \"core\"（默认）/ \"minimal\"\n        }\n      }\n    }\n  }\n}\n```\n\n改完后 `launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway` 重启 gateway 即生效。\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 | **v1.20 默认** | v1.20 extended |\n|---|---|---|---|---|\n| system context 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens |\n| 工具数量 | 189 | 190 | **30** | 190 |\n| 工具 schema 占 tokens | ~17000 | ~17000 | **~3000** | ~17000 |\n| **每次 prompt 总 token** | 19000 | 17400 | **3400** | 17400 |\n| LLM TTFT 预估 | 70-150s | 65-145s | **15-50s** | 65-145s |\n\n注：实际 TTFT 受 LLM 端 prefill 速度、conversation history、其他 plugin 注入影响。\n\n## 风险与缓解\n\n- **风险**：默认只 30 工具，LLM 不知道\"odoo_employee_skills\"等工具存在 → 用户问相关问题时 LLM 表现退化\n- **缓解 1**：system context 顶部明确告知\"完整 190 工具调 odoo_help 查\"\n- **缓解 2**：odoo_help 工具的 description 写明 \"按需获取详细信息（无参 = 完整 190 工具表 / keyword 模糊匹配）\"\n- **缓解 3**：core 30 个已覆盖 80% 日常场景；不在 core 但常用的工具，用户可手动调到 extended\n\n## 测试\n\n- `tsc --noEmit` exit 0（v1.19 还有 ~20 个 schema warning，v1.20 因为 register wrapper 用 generic 反而**全部消除**）\n- 启动期 log 应从 `190 个工具已注册（v1.19 …）` 变为 `30 个工具已注册（v1.20 — tier=core …）`\n\n## 兼容性\n\n完全向下兼容。改 plugin config `tier=\"extended\"` 即恢复 v1.19 行为，所有 190 工具签名 / 行为 / 业务逻辑全部不变。\n\nFile v1.22.0:CHANGELOG-v1.22.md\n\n# v1.22.0 (2026-05-04)\n\n**`odoo_sale_orders` / `odoo_purchase_orders` 三大增强：按编号查 + 一次拿明细 + 强化 description 防 LLM 走 exec curl**\n\n## 背景\n\n会话 `agent:main:wecom:direct:zhaobo` 里，赵博发了「未来电脑的销售单（编号：S00016），按照这个帮我写一个软件销售合同」。\n\ntrajectory 复盘（[详细见会话诊断]）：\n\n1. main agent（deepseek-v4-pro）看了 `odoo_sale_orders` 工具\n2. **schema 只有 `limit / state / partner_id`，没有按订单编号查的字段**\n3. LLM 觉得\"这工具不能按 S00016 编号查具体单\"，**改走 `exec` + `curl JSON-RPC` 手写**\n4. 手写折腾了 9 次（postmaster 没销售权限 → uid=5 ZhaoBo 才成功）\n5. 拿到 S00016 数据后 LLM 状态混乱，重复说\"先查一下...\"就 stop，**没生成合同**\n\n5 是模型行为问题（已转 P0 跟踪），但 2 是 **tool design gap** ——本版修。\n\n## 改动\n\n### 1. `odoo_sale_orders` schema 加 3 个字段\n\n[`index.ts:1228-1310`](index.ts:1228)\n\n```diff\n schema:\n   properties:\n+    name:          { type: 'string', description: '订单编号（如 \"S00016\"），精确匹配' }\n+    record_id:     { type: 'number', description: '按 sale.order 记录 ID 直读' }\n+    include_lines: { type: 'boolean', description: '同时拉订单明细（sale.order.line），写合同/对账强烈建议 true' }\n     limit:         ...\n     state:         ...\n     partner_id:    ...\n```\n\n返回字段补齐：`amount_untaxed / amount_tax / amount_total / payment_term / currency / note`，\ninclude_lines=true 时每单挂 `order_line[]`（id, product_id, name, product_uom_qty, qty_delivered,\nqty_invoiced, product_uom, price_unit, discount, price_subtotal, price_total, price_tax）。\n\n### 2. `odoo_purchase_orders` 同步加 name/record_id/include_lines\n\n[`index.ts:1313-1395`](index.ts:1313)\n\n字段对齐（采购侧 `qty_received` / `qty_invoiced` / `date_planned` / `notes`）。\n\n### 3. `OdooClient.getSaleOrders` / `getPurchaseOrders` 内部支持\n\n[`src/modules/odoo-client.ts:336-403`](src/modules/odoo-client.ts:336)\n\n- name → `domain.push(['name', '=', name])`\n- record_id → `domain.push(['id', '=', record_id])`\n- include_lines → 一次性 `searchRead('sale.order.line', [['order_id', 'in', orderIds]])` **避免 N+1 RPC**\n- 按 `(order_id, sequence)` 排序后挂回各 order 的 `order_line[]`\n\n### 4. description 强化 — 防 LLM 走 exec curl 手写 RPC\n\n[`index.ts:1230-1240`](index.ts:1230) — 参考 memory `feedback_tool_description_vs_prompt_level_constraint.md`，把具体 anti-pattern 字面写进 description：\n\n```\n查询销售订单（sale.order）。支持三种用法：\n(a) 列表浏览：limit + state + partner_id；\n(b) ⭐ 按订单编号查具体单：name=\"S00016\"（精确匹配，最常用）；\n(c) 按记录 ID 直读：record_id=9。\n⭐ 写合同 / 对账 / 回邮件这类需要明细的场景：必传 include_lines=true，\n一次拿回 partner / 产品 / 数量 / 单价 / 折扣 / 小计 / 税额 / 合计 / 付款条件，\n避免后续再发多次 RPC。不要走 exec/curl 手写 JSON-RPC，本工具已经覆盖。\n```\n\n实际 anti-pattern：之前 deepseek-v4-pro 看到 description 太弱（\"查看销售订单/报价单列表\"），就自己写 9 次 curl。新版直接告诉它\"覆盖了，别 hack\"。\n\n### 5. log 字符串和三处 version 对齐\n\n`api.logger.info` 字符串从 `v1.21.0` 改到 `v1.22.0`（之前 v1.20.x→v1.21 时漏改这条 log，gateway log 一直显示 v1.9 是因为 runtime 装的还是 v1.20.2 旧拷贝）。\n\n`package.json` / `SKILL.md` / `openclaw.plugin.json` / `index.ts` log 字符串四处全部对齐到 1.22.0。\n\n## 测试\n\n- `tsc --noEmit` 通过\n- 没有 unit test（odoo plugin 一直没建 test suite，本版不补——避免 scope creep）\n- 集成验证：发版后 `openclaw plugins install` 重装 + 重启 gateway，手工跑 `odoo_sale_orders name='S00016' include_lines=true` 看返回完整明细\n\n## 兼容性\n\n完全向下兼容。\n\n- 老代码 / 老 prompt 不传新字段 → behavior 不变（只有 limit/state/partner_id）\n- 新字段都是 optional，schema 校验无 breaking change\n- `getSaleOrders` 不传 include_lines → 不发 sale.order.line RPC，零成本\n\n## 红线自查\n\n- ✅ 无 `child_process / execSync / spawnSync`\n- ✅ `compat.pluginApi: \">=2026.2.24\"` 是 ranged，不是裸版本\n- ✅ `peerDependencies.openclaw: \">=2026.2.24\"` 是 ranged\n- ✅ 不修改 openclaw 核心代码\n- ✅ 不复制龙虾原生功能（odoo_sale_orders 是辉火云特有，没原生等价物）\n\n## 不变\n\n- v1.21.0 的 hook RPC 永久挂修复（首字延迟 P50 16.4s → <3s）继承\n- v1.20 审批工作流深化继承\n- v1.19 工具分级 tier（core/minimal/extended）继承——本版改的两个工具都在 core tier，default 启用\n- 其他 42 个 core tier 工具未动\n- 用户自定义 manifest 凭据（pluginConfig.odoo）行为不变\n\nFile v1.22.0:openclaw.plugin.json\n\n{\n  \"id\": \"odoo\",\n  \"name\": \"火一五·辉火云企业套件插件\",\n  \"description\": \"自然语言操作辉火云企业套件，企业级全场景 ERP + 系统管理 + Studio 元编程 + 工具分级助手，204 个工具（含 odoo_help）覆盖销售/采购/库存/生产/会计/HR/项目/CRM/客服/知识/通知/智能/报表 13 业务域 + 系统级 + Studio 元编程；v1.10 共享凭据；v1.11–v1.13 HR 三步走；v1.14 Analytics & Orchestration；v1.15 个人视图+CRM 智能+跨域桥+库存深化+多公司；v1.16 业务深化；v1.17 自动化与治理；v1.18 Studio 元编程+审计+多公司联动+通用 pivot+外部集成；v1.19 工具分级 tier（core/minimal/extended）+ odoo_help；v1.20 审批工作流（categories/create/confirm/my_pending）+ 克隆与 CSV 导入（clone/clone_with_lines/csv_import）+ Mail 关注（followers/subscribe/unsubscribe）+ 资源与工作时间（resources/resource_calendar）+ 报表订阅 cron + translate_get\",\n  \"version\": \"1.22.0\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"odoo\": {\n        \"type\": \"object\",\n        \"description\": \"辉火云企业套件 连接配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"辉火云企业套件 系统地址，如 https://www.huo15.com\"\n          },\n          \"db\": {\n            \"type\": \"string\",\n            \"description\": \"数据库名称，如 huo15\"\n          },\n          \"username\": {\n            \"type\": \"string\",\n            \"description\": \"用户名（邮箱或登录名）\"\n          },\n          \"password\": {\n            \"type\": \"string\",\n            \"description\": \"密码\"\n          }\n        },\n        \"required\": [\"url\", \"db\", \"username\", \"password\"]\n      },\n      \"sync\": {\n        \"type\": \"object\",\n        \"description\": \"通知同步配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"description\": \"是否启用后台通知同步\",\n            \"default\": true\n          },\n          \"intervalSeconds\": {\n            \"type\": \"number\",\n            \"description\": \"轮询间隔（秒），默认 30\",\n            \"default\": 30\n          },\n          \"channels\": {\n            \"type\": \"array\",\n            \"description\": \"需要同步的通知类型\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n            },\n            \"default\": [\"todo\", \"activity\", \"message\"]\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.22.0:package.json\n\n{\n  \"name\": \"@huo15/huo15-huihuoyun-odoo\",\n  \"version\": \"1.22.0\",\n  \"description\": \"火一五·辉火云企业套件插件 v1.22.0 — odoo_sale_orders / odoo_purchase_orders 加 name（按 'S00016' 编号查）+ record_id（按 ID 取）+ include_lines（一次拿明细+合计+税额+付款条件，写合同/对账免 N+1 RPC）。description 强化：明确 prompt LLM '不要走 exec/curl 手写 JSON-RPC，本工具已经覆盖'，避免 deepseek 类模型偏向自己 hack。继承 v1.21 hook RPC 永久挂修复（首字延迟 P50 16.4s → <3s）+ v1.20 审批工作流 + v1.19 工具分级 tier + 204 工具覆盖 13 业务域 + Studio 元编程。\",\n  \"type\": \"module\",\n  \"main\": \"index.ts\",\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"build\": {\n      \"openclawVersion\": \"2026.4.10\"\n    },\n    \"compat\": {\n      \"pluginApi\": \">=2026.2.24\"\n    }\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"plugin\",\n    \"huohuoyun\",\n    \"huihuoyun\",\n    \"erp\",\n    \"huo15\",\n    \"crm\",\n    \"helpdesk\",\n    \"invoice\"\n  ],\n  \"author\": \"jobzhao15\",\n  \"license\": \"MIT\",\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.2.24\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"typescript\": \"^5.5.0\"\n  },\n  \"scripts\": {\n    \"typecheck\": \"tsc --noEmit\",\n    \"release\": \"bash scripts/release.sh\",\n    \"prepublishOnly\": \"npm run typecheck\"\n  },\n  \"files\": [\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"src/**/*\",\n    \"SKILL.md\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://cnb.cool/huo15/tools/huo15-huihuoyun-odoo\"\n  }\n}\n\nFile v1.22.0:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\"]\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.21.0: 22 files, 218368 bytes\n\nFiles: CHANGELOG-v1.19.md (3544b), CHANGELOG-v1.20.md (6088b), index.ts (322314b), openclaw.plugin.json (2672b), package-lock.json (259330b), package.json (1683b), README.md (10748b), scripts/release.sh (11335b), SKILL.md (9454b), src/modules/config-manager.ts (6749b), src/modules/envelope-cache.ts (1659b), src/modules/mutation-log.ts (4571b), src/modules/notification-bus.ts (5783b), src/modules/notification-poller.ts (9267b), src/modules/notification-prefs.ts (4397b), src/modules/notification-router.ts (5633b), src/modules/odoo-client.ts (210495b), src/types/index.ts (6609b), src/utils/date-utils.ts (2296b), src/utils/md-to-html.ts (2346b), tsconfig.json (483b), _meta.json (140b)\n\nFile v1.21.0:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.21.0 关键性能修复：before_prompt_build hook 改为只查内存缓存（不再走 RPC 永久挂）+ RPC fetch 加 AbortSignal.timeout(3000) + 启动期异步预热 default agent，首字延迟 P50 从 16.4s 期望降到 <3s。Use when：接 Odoo/辉火云、企业 ERP 操作、CRM/任务/财务/工单管理、自然语言企微/钉钉调用 ERP。\nversion: 1.21.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 admin@huo15.com，密码 xxxxxx\n\n龙虾会自动调用 `odoo_connect` 工具，连接信息保存本地，下次启动自动恢复。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接辉火云企业套件 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## Changelog\n\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.21.0:README.md\n\n# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| `odoo_sale_orders` | 查看销售订单 |\n| `odoo_purchase_orders` | 查看采购订单 |\n| `odoo_invoices` | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| `odoo_tickets` | 查看客服工单 |\n| `odoo_ticket_create` | 创建客服工单 |\n\n### 联系人（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_contacts` | 查询联系人/客户/供应商 |\n| `odoo_contact_create` | 创建联系人/客户/供应商 |\n\n### 库存（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_stock_levels` | 查看库存水平 |\n| `odoo_stock_pickings` | 查看调拨单/出入库单 |\n\n### HR 人事（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_employees` | 查询员工列表 |\n| `odoo_leaves` | 查看请假记录 |\n| `odoo_attendances` | 查看考勤打卡记录 |\n\n### 审批（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_approvals` | 查看审批请求 |\n\n### 助手\n| 工具 | 说明 |\n|------|------|\n| `odoo_search` | 通用搜索（任意模型任意条件） |\n| `odoo_daily_briefing` | 实施经理每日工作概况 |\n\n---\n\n## WeCom 动态 Agent 多用户隔离\n\n搭配 `@huo15/wecom` 插件的动态 agent 能力，每个企微用户/群组拥有独立的辉火云连接：\n\n1. **凭据隔离** — 用户 A 的辉火云账号密码，用户 B 看不到也用不了\n2. **Session 隔离** — 每个用户各自的辉火云 session，互不干扰\n3. **数据隔离** — 每个用户看到的是自己辉火云账号的数据\n4. **自动恢复** — 每个用户的凭据独立持久化，重启后自动恢复\n\n**实现原理**：\n- 工具通过 `ctx.agentId` 获取当前用户的动态 agent ID（如 `wecom-acct-ws-dm-zhangsan`）\n- 配置持久化到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`\n- OdooClient 和 NotificationPoller 均按 agentId 隔离存储\n\n---\n\n## 使用示例\n\n```\n👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）...\n```\n\n---\n\n## 通知同步\n\n插件连接后自动轮询（默认 30 秒），推送以下变更：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 Chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 技术架构\n\n- **JSON-RPC 对接** — 通过 `/web/session/authenticate` 和 `/web/dataset/call_kw` 与辉火云后端通信\n- **Per-Agent 隔离** — 按 `ctx.agentId` 隔离 OdooClient / Poller / Config，兼容 WeCom 动态 agent\n- **数据库自动检测** — `/web/database/list` 查询可用数据库，单库自动选择\n- **Session 自动重连** — `ensureAuthenticated()` 在轮询前自动检查并恢复 session\n- **高水位线去重** — 消息/邮件用 `id > highWaterMark` 去重，避免时钟偏差问题\n- **基线初始化** — 首次启动静默建立水位线，不推送历史数据\n- **OpenClaw 插件规范** — `definePluginEntry` + `api.registerTool()` + `api.on(\"before_prompt_build\")`\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、账号密码。用 `odoo_status` 查看当前状态。数据库名一般不用手动填，插件会自动检测。\n\n**Q: WeCom 多用户场景下，每个用户都要单独连接吗？**\nA: 是的。每个企微用户首次使用辉火云企业套件功能时会被引导输入自己的系统地址和账号密码，之后自动保存，无需重复输入。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 如何断开连接并清除保存的密码？**\nA: 告诉龙虾\"断开辉火云连接\"，会调用 `odoo_disconnect` 清除当前用户的凭据。\n\n---\n\n## Changelog\n\n- **v1.2.0** — Per-agent 凭据隔离（WeCom 多用户）、智能连接引导、数据库自动检测、联系人/客户管理、库存查询（stock.quant/stock.picking）、HR 员工/考勤/请假、审批流查询、odoo_disconnect 工具。共 32 个工具\n- **v1.1.0** — CRM 商机管道、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\n---\n\n## License\n\nMIT\n\n---\n\n<div align=\"center\">\n\n**公司名称：** 青岛火一五信息科技有限公司\n\n**联系邮箱：** postmaster@huo15.com | **QQ群：** 1093992108\n\n---\n\n**关注逸寻智库公众号，获取更多资讯**\n\n<img src=\"https://tools.huo15.com/uploads/images/system/qrcode_yxzk.jpg\" alt=\"逸寻智库公众号二维码\" style=\"width: 200px; height: auto; margin: 10px 0;\" />\n\n</div>\n\n---\n\nFile v1.21.0:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.21.0\",\n  \"publishedAt\": 1777801705815\n}\n\nFile v1.21.0:CHANGELOG-v1.19.md\n\n# v1.19.0 (2026-04-28)\n\n**核心修复：消除每次 prompt 注入 ~7900 字 / ~2000 tokens 的工具表，TTFT（首字延迟）实测降幅显著。**\n\n## 背景\n\n诊断发现 `before_prompt_build` hook 在每次 LLM call 之前都注入 ~7900 字的工具速查 + 自然语言映射表到 system context（[index.ts:5212-5489](index.ts#L5212)）。\n\n**用户感受**：哪怕只发\"你好\"也注入这 2000 tokens。LLM 处理这堆 prompt + reasoning thinking 一起拖到 TTFT 70-150 秒。\n\n实测 14:33-14:35 dispatch 拆解：\n- dispatch-start → first deliver-block = **129 秒**\n- 大头是 LLM TTFT 72 秒（首字延迟）\n- 加上 plugin 多次 reload 拖累 ~17 秒\n\n## 改动\n\n### 删 — system context 7900 字 → 1500 字\n\n[index.ts](index.ts) 的 `registerHooks` 函数中 `appendSystemContext` 模板字面量整体重写：\n\n| 删 | 改成 |\n|---|---|\n| 工具速查（共 77 个）整段 6500 字 | 只保留 6 行高频工具速查（任务 / CRM / 项目 / 客服 / 财务 / 联系人 / 检索 / 状态） |\n| 自然语言 → 工具映射 130+ 行 8000+ 字 | 全删（让 LLM 自己推断意图，识别不出再调 odoo_help） |\n| 常用数据模型 26 个 | 缩到 14 个最常用 |\n| 日期 & 字段规范 6 条 | 保留全部（这部分对 LLM 调用工具时仍重要，但本身只 200 字） |\n\n最终 system context 注入约 1500 字 / ~400 tokens。\n\n### 加 — `odoo_help` 工具（按需查工具表）\n\n新增 `api.registerTool({ name: 'odoo_help', ... })`，参数：\n\n- 无参数 → 返回完整 7900 字工具表 + 自然语言映射 + 数据模型清单\n- `keyword=\"<模糊词>\"` → 行级模糊匹配（如 `\"请假\"` 返回所有请假相关工具行；`\"CRM\"` 返回 CRM 分类）\n\nLLM 在不知道某意图对应哪个工具时**主动调 odoo_help**，把 token 消耗从\"每次 prompt 都付\"改成\"按需付\"。\n\n工具数从 189 → **190**。\n\n### 不改\n\n- 未连接路径的 system context（[index.ts:5176-5202](index.ts#L5176)）保留——那段本来就没工具表，只是连接引导\n- 189 工具的实现逻辑 / 接口 / 业务规则 全部不动\n- 共享凭据规则、品牌口径硬规则、用户/系统/凭据动态字段 全保留\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 |\n|---|---|---|\n| 每次 prompt 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens |\n| TTFT 预期降幅 | — | -5 ~ -25 秒 |\n| 工具数 | 189 | 190 (+ odoo_help) |\n| LLM 调用工具的能力 | 完整可见 | 高频 8 个直接可见，其他通过 odoo_help 按需查 |\n\n## 风险与缓解\n\n- **风险**：LLM 看不到完整工具表可能导致它\"不知道某个工具存在\"\n- **缓解**：\n  1. system context 顶部明确告知\"完整 189 工具表调 odoo_help\"\n  2. odoo_help 工具的 description 写明 \"按需获取详细信息\"\n  3. 高频 8 个工具仍然在 system context 里直接可见，覆盖 80% 日常需求\n\n## 测试\n\n- `tsc --noEmit` exit 0（剩余 schema 字段警告是 v1.18 之前就存在的 SDK 类型定义问题，与本次改动无关）\n- 启动期 log 应从 `[odoo] 189 个工具已注册` 变为 `[odoo] 190 个工具已注册（v1.19 — 加 odoo_help 按需查工具表，system context 不再每次注入 ~7900 字）`\n- before_prompt_build 钩子注册 log 加 `v1.19 system context 已瘦身 ~6500 字 → 调 odoo_help 按需取详`\n\n## 兼容性\n\n完全向下兼容。所有 189 工具签名 / 行为 / 业务逻辑不变。LLM 端如果还期望从 system context 看完整工具表，调 odoo_help 即可恢复 v1.18 行为。\n\nFile v1.21.0:CHANGELOG-v1.20.md\n\n# v1.20.0 (2026-04-28)\n\n**核心修复：tier 分级让默认 prompt tool schema 从 ~190 工具 / ~17000 tokens 砍到 ~30 工具 / ~3000 tokens。配合 v1.19 的 system context 瘦身，每次 prompt 总省 ~16000 tokens。**\n\n## 背景\n\nv1.19 把 `before_prompt_build` 注入的 system context 从 7900 字砍到 1500 字（节省 ~1700 tokens）。但实测 `dispatch-start → deliver-start` TTFT 仍 70-150 秒。\n\n进一步诊断（直接 curl DeepSeek API）：\n\n| 测试 | 端到端时间 |\n|---|---|\n| DeepSeek 流式 TTFT | **530ms** |\n| DeepSeek 非流式（含响应） | **790ms** |\n\n→ DeepSeek API 端**完全没问题**。**真正的 TTFT 元凶是 prompt 太大**（单大头 = 189 个 odoo 工具的 JSON schema），LLM 端 prefill 处理 30k+ tokens 才出第一字。\n\n预估每个 odoo 工具 schema ≈ 80-200 tokens（name + description + properties + required）：\n\n- description 总和 16470 字符 / ~5490 tokens\n- 加 schema 结构（properties / required / type 等）×3-4 倍 → **15000-20000 tokens** 仅 odoo 一个 plugin\n\n## 改动\n\n### `index.ts` — 引入 tier 分级\n\n新增 `ODOO_TOOL_TIERS`（module-level 常量）：\n\n```ts\nconst ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};\n```\n\n`registerTools` 函数顶部读 plugin config：\n\n```ts\nconst cfg = (api.pluginConfig ?? {}) as { tier?: 'minimal' | 'core' | 'extended' };\nconst tier = cfg.tier ?? 'core';  // 默认 core\nconst allowedTools = tier === 'extended' ? null : ODOO_TOOL_TIERS[tier];\n\nconst register = (opts) => {\n  if (allowedTools === null || allowedTools.has(opts.name) || opts.name === 'odoo_help') {\n    api.registerTool(opts);\n    registeredCount++;\n  } else {\n    skippedCount++;\n  }\n};\n```\n\n然后 sed 把 489-5500 行内 189 个 `api.registerTool(` 替换为 `register(` —— **所有 189 个工具走 register wrapper 过滤**。\n\n`odoo_help` 工具**始终注册**（任何 tier），保证 LLM 能查完整工具表。\n\n### `index.ts` — system context 提示当前 tier\n\n将 v1.19 的 \"完整 189 个工具表 …\" 提示更新为 \"**当前 tier=core（默认 30 个高频工具直接可见）。完整 190 个工具调 odoo_help 查；如需恢复 v1.18 全量行为：改 ~/.openclaw/openclaw.json 的 plugins.entries.odoo.config.tier='extended'**\"。\n\n### `index.ts` — 启动期 log 报告 tier 状态\n\n```\nv1.18: [odoo] 189 个工具已注册（v1.18 — Studio 元编程+审计...）\nv1.19: [odoo] 190 个工具已注册（v1.19 — 加 odoo_help...）\nv1.20: [odoo] 30 个工具已注册（v1.20 — tier=core 精简档位 / 跳过 160 个，节省 ~12800 tokens schema）\n       完整 190 工具调 odoo_help 查；改 plugins.entries.odoo.config.tier=\"extended\" 可恢复全量。\n```\n\n## tier 三档\n\n### `minimal`（10 工具）\n\n仅最核心连接 + 任务搜索：\n```\nodoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\nodoo_create_task / odoo_list_tasks / odoo_my_today\nodoo_search / odoo_daily_briefing\n```\n\n适合：极致性能，仅做\"连接 + 任务列表\"演示场景。\n\n### `core`（30 工具，默认）\n\n覆盖 80% 日常需求的高频 30 个：\n\n- 连接 & 状态（5）：odoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\n- 任务 & 活动（8）：odoo_create_task / odoo_list_tasks / odoo_update_task / odoo_my_today / odoo_my_workload / odoo_create_activity / odoo_calendar_today / odoo_complete_activity\n- CRM（5）：odoo_crm_pipeline / odoo_crm_create / odoo_crm_update / odoo_crm_won / odoo_crm_lost\n- 项目（2）：odoo_project_overview / odoo_timesheet_log\n- 客服（2）：odoo_tickets / odoo_ticket_create\n- 财务（3）：odoo_invoices / odoo_sale_orders / odoo_purchase_orders\n- 联系人（2）：odoo_contacts / odoo_contact_create\n- 检索（2）：odoo_search / odoo_daily_briefing\n- 消息（1）：odoo_message_post\n\n### `extended`（190 工具，v1.18/1.19 行为）\n\n完整暴露所有工具（含 HR 全套 / 库存深化 / 生产 MRP / Studio 元编程 / 审计 / 多公司联动等）。\n\n适合：需要全功能，不在意 prompt token 开销。\n\n## 配置切换\n\n在 `~/.openclaw/openclaw.json`：\n\n```jsonc\n{\n  \"plugins\": {\n    \"entries\": {\n      \"odoo\": {\n        \"config\": {\n          \"tier\": \"extended\"   // 或 \"core\"（默认）/ \"minimal\"\n        }\n      }\n    }\n  }\n}\n```\n\n改完后 `launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway` 重启 gateway 即生效。\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 | **v1.20 默认** | v1.20 extended |\n|---|---|---|---|---|\n| system context 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens | ~1500 字 / ~400 tokens |\n| 工具数量 | 189 | 190 | **30** | 190 |\n| 工具 schema 占 tokens | ~17000 | ~17000 | **~3000** | ~17000 |\n| **每次 prompt 总 token** | 19000 | 17400 | **3400** | 17400 |\n| LLM TTFT 预估 | 70-150s | 65-145s | **15-50s** | 65-145s |\n\n注：实际 TTFT 受 LLM 端 prefill 速度、conversation history、其他 plugin 注入影响。\n\n## 风险与缓解\n\n- **风险**：默认只 30 工具，LLM 不知道\"odoo_employee_skills\"等工具存在 → 用户问相关问题时 LLM 表现退化\n- **缓解 1**：system context 顶部明确告知\"完整 190 工具调 odoo_help 查\"\n- **缓解 2**：odoo_help 工具的 description 写明 \"按需获取详细信息（无参 = 完整 190 工具表 / keyword 模糊匹配）\"\n- **缓解 3**：core 30 个已覆盖 80% 日常场景；不在 core 但常用的工具，用户可手动调到 extended\n\n## 测试\n\n- `tsc --noEmit` exit 0（v1.19 还有 ~20 个 schema warning，v1.20 因为 register wrapper 用 generic 反而**全部消除**）\n- 启动期 log 应从 `190 个工具已注册（v1.19 …）` 变为 `30 个工具已注册（v1.20 — tier=core …）`\n\n## 兼容性\n\n完全向下兼容。改 plugin config `tier=\"extended\"` 即恢复 v1.19 行为，所有 190 工具签名 / 行为 / 业务逻辑全部不变。\n\nFile v1.21.0:openclaw.plugin.json\n\n{\n  \"id\": \"odoo\",\n  \"name\": \"火一五·辉火云企业套件插件\",\n  \"description\": \"自然语言操作辉火云企业套件，企业级全场景 ERP + 系统管理 + Studio 元编程 + 工具分级助手，204 个工具（含 odoo_help）覆盖销售/采购/库存/生产/会计/HR/项目/CRM/客服/知识/通知/智能/报表 13 业务域 + 系统级 + Studio 元编程；v1.10 共享凭据；v1.11–v1.13 HR 三步走；v1.14 Analytics & Orchestration；v1.15 个人视图+CRM 智能+跨域桥+库存深化+多公司；v1.16 业务深化；v1.17 自动化与治理；v1.18 Studio 元编程+审计+多公司联动+通用 pivot+外部集成；v1.19 工具分级 tier（core/minimal/extended）+ odoo_help；v1.20 审批工作流（categories/create/confirm/my_pending）+ 克隆与 CSV 导入（clone/clone_with_lines/csv_import）+ Mail 关注（followers/subscribe/unsubscribe）+ 资源与工作时间（resources/resource_calendar）+ 报表订阅 cron + translate_get\",\n  \"version\": \"1.20.1\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"odoo\": {\n        \"type\": \"object\",\n        \"description\": \"辉火云企业套件 连接配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"辉火云企业套件 系统地址，如 https://www.huo15.com\"\n          },\n          \"db\": {\n            \"type\": \"string\",\n            \"description\": \"数据库名称，如 huo15\"\n          },\n          \"username\": {\n            \"type\": \"string\",\n            \"description\": \"用户名（邮箱或登录名）\"\n          },\n          \"password\": {\n            \"type\": \"string\",\n            \"description\": \"密码\"\n          }\n        },\n        \"required\": [\"url\", \"db\", \"username\", \"password\"]\n      },\n      \"sync\": {\n        \"type\": \"object\",\n        \"description\": \"通知同步配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"description\": \"是否启用后台通知同步\",\n            \"default\": true\n          },\n          \"intervalSeconds\": {\n            \"type\": \"number\",\n            \"description\": \"轮询间隔（秒），默认 30\",\n            \"default\": 30\n          },\n          \"channels\": {\n            \"type\": \"array\",\n            \"description\": \"需要同步的通知类型\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n            },\n            \"default\": [\"todo\", \"activity\", \"message\"]\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.21.0:package.json\n\n{\n  \"name\": \"@huo15/huo15-huihuoyun-odoo\",\n  \"version\": \"1.21.0\",\n  \"description\": \"火一五·辉火云企业套件插件 v1.21.0 — **关键性能修复**：before_prompt_build hook 不再每次走 RPC 认证恢复（fetch 无 timeout 永久挂 → OpenClaw 15s 强行掐断 → 用户实测首字延迟 P50=16.4s/P95=54.9s 的真凶）。改成：① hook 只查内存缓存；② RPC fetch 加 AbortSignal.timeout(3000) 兜底；③ register() 启动期 fire-and-forget 预热 default agent。期望首字延迟 P50→<3s。继承 v1.20 审批工作流深化、v1.19 工具分级 tier、204 个工具覆盖销售/采购/库存/生产/会计/HR/项目/CRM/客服/知识/通知/智能/报表 13 业务域 + 系统级 + Studio 元编程。\",\n  \"type\": \"module\",\n  \"main\": \"index.ts\",\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"build\": {\n      \"openclawVersion\": \"2026.4.10\"\n    },\n    \"compat\": {\n      \"pluginApi\": \">=2026.2.24\"\n    }\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"plugin\",\n    \"huohuoyun\",\n    \"huihuoyun\",\n    \"erp\",\n    \"huo15\",\n    \"crm\",\n    \"helpdesk\",\n    \"invoice\"\n  ],\n  \"author\": \"jobzhao15\",\n  \"license\": \"MIT\",\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.2.24\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"typescript\": \"^5.5.0\"\n  },\n  \"scripts\": {\n    \"typecheck\": \"tsc --noEmit\",\n    \"release\": \"bash scripts/release.sh\",\n    \"prepublishOnly\": \"npm run typecheck\"\n  },\n  \"files\": [\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"src/**/*\",\n    \"SKILL.md\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://cnb.cool/huo15/tools/huo15-huihuoyun-odoo\"\n  }\n}\n\nFile v1.21.0:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\"]\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.10.0: 19 files, 136935 bytes\n\nFiles: index.ts (149058b), openclaw.plugin.json (2626b), package-lock.json (259329b), package.json (1486b), README.md (10748b), SKILL.md (9027b), src/modules/config-manager.ts (6749b), src/modules/envelope-cache.ts (1659b), src/modules/mutation-log.ts (4571b), src/modules/notification-bus.ts (5783b), src/modules/notification-poller.ts (9267b), src/modules/notification-prefs.ts (4397b), src/modules/notification-router.ts (5633b), src/modules/odoo-client.ts (49328b), src/types/index.ts (6609b), src/utils/date-utils.ts (2296b), src/utils/md-to-html.ts (2346b), tsconfig.json (483b), _meta.json (140b)\n\nFile v1.10.0:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务、CRM、项目、工单、财务、销售\nversion: 1.1.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 admin@huo15.com，密码 xxxxxx\n\n龙虾会自动调用 `odoo_connect` 工具，连接信息保存本地，下次启动自动恢复。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接辉火云企业套件 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## Changelog\n\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.10.0:README.md\n\n# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| `odoo_sale_orders` | 查看销售订单 |\n| `odoo_purchase_orders` | 查看采购订单 |\n| `odoo_invoices` | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| `odoo_tickets` | 查看客服工单 |\n| `odoo_ticket_create` | 创建客服工单 |\n\n### 联系人（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_contacts` | 查询联系人/客户/供应商 |\n| `odoo_contact_create` | 创建联系人/客户/供应商 |\n\n### 库存（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_stock_levels` | 查看库存水平 |\n| `odoo_stock_pickings` | 查看调拨单/出入库单 |\n\n### HR 人事（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_employees` | 查询员工列表 |\n| `odoo_leaves` | 查看请假记录 |\n| `odoo_attendances` | 查看考勤打卡记录 |\n\n### 审批（v1.2 新增）\n| 工具 | 说明 |\n|------|------|\n| `odoo_approvals` | 查看审批请求 |\n\n### 助手\n| 工具 | 说明 |\n|------|------|\n| `odoo_search` | 通用搜索（任意模型任意条件） |\n| `odoo_daily_briefing` | 实施经理每日工作概况 |\n\n---\n\n## WeCom 动态 Agent 多用户隔离\n\n搭配 `@huo15/wecom` 插件的动态 agent 能力，每个企微用户/群组拥有独立的辉火云连接：\n\n1. **凭据隔离** — 用户 A 的辉火云账号密码，用户 B 看不到也用不了\n2. **Session 隔离** — 每个用户各自的辉火云 session，互不干扰\n3. **数据隔离** — 每个用户看到的是自己辉火云账号的数据\n4. **自动恢复** — 每个用户的凭据独立持久化，重启后自动恢复\n\n**实现原理**：\n- 工具通过 `ctx.agentId` 获取当前用户的动态 agent ID（如 `wecom-acct-ws-dm-zhangsan`）\n- 配置持久化到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`\n- OdooClient 和 NotificationPoller 均按 agentId 隔离存储\n\n---\n\n## 使用示例\n\n```\n👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）...\n```\n\n---\n\n## 通知同步\n\n插件连接后自动轮询（默认 30 秒），推送以下变更：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 Chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 技术架构\n\n- **JSON-RPC 对接** — 通过 `/web/session/authenticate` 和 `/web/dataset/call_kw` 与辉火云后端通信\n- **Per-Agent 隔离** — 按 `ctx.agentId` 隔离 OdooClient / Poller / Config，兼容 WeCom 动态 agent\n- **数据库自动检测** — `/web/database/list` 查询可用数据库，单库自动选择\n- **Session 自动重连** — `ensureAuthenticated()` 在轮询前自动检查并恢复 session\n- **高水位线去重** — 消息/邮件用 `id > highWaterMark` 去重，避免时钟偏差问题\n- **基线初始化** — 首次启动静默建立水位线，不推送历史数据\n- **OpenClaw 插件规范** — `definePluginEntry` + `api.registerTool()` + `api.on(\"before_prompt_build\")`\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、账号密码。用 `odoo_status` 查看当前状态。数据库名一般不用手动填，插件会自动检测。\n\n**Q: WeCom 多用户场景下，每个用户都要单独连接吗？**\nA: 是的。每个企微用户首次使用辉火云企业套件功能时会被引导输入自己的系统地址和账号密码，之后自动保存，无需重复输入。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 如何断开连接并清除保存的密码？**\nA: 告诉龙虾\"断开辉火云连接\"，会调用 `odoo_disconnect` 清除当前用户的凭据。\n\n---\n\n## Changelog\n\n- **v1.2.0** — Per-agent 凭据隔离（WeCom 多用户）、智能连接引导、数据库自动检测、联系人/客户管理、库存查询（stock.quant/stock.picking）、HR 员工/考勤/请假、审批流查询、odoo_disconnect 工具。共 32 个工具\n- **v1.1.0** — CRM 商机管道、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\n---\n\n## License\n\nMIT\n\n---\n\n<div align=\"center\">\n\n**公司名称：** 青岛火一五信息科技有限公司\n\n**联系邮箱：** postmaster@huo15.com | **QQ群：** 1093992108\n\n---\n\n**关注逸寻智库公众号，获取更多资讯**\n\n<img src=\"https://tools.huo15.com/uploads/images/system/qrcode_yxzk.jpg\" alt=\"逸寻智库公众号二维码\" style=\"width: 200px; height: auto; margin: 10px 0;\" />\n\n</div>\n\n---\n\nFile v1.10.0:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.10.0\",\n  \"publishedAt\": 1777198518229\n}\n\nFile v1.10.0:openclaw.plugin.json\n\n{\n  \"id\": \"odoo\",\n  \"name\": \"火一五·辉火云企业套件插件\",\n  \"description\": \"自然语言操作辉火云企业套件，77 个工具覆盖任务与指派、活动闭环（完成/改期）、日历（今日/改期/取消）、邮件（直发/模板）、内部动态 chatter（发评论/内部记录/历史）、附件/文档、关注者、CRM、项目/里程碑（新建/更新/标记完成）、工单闭环（改/关/派）、审批动作（通过/拒绝）、财务、库存、HR、知识库、批量更新、撤销上一步；内置跨渠道通知基座（NotificationBus）：企微/钉钉/飞书订阅辉火云消息与活动提醒，per-agent 偏好过滤（kind/优先级/静音时段），入站回复自动写回内部动态；v1.10 共享凭据：组织内配一次，全员跨渠道（企微/钉钉/飞书）@龙虾 自动复用同一套凭据，禁止重复询问；新增 odoo_whoami 查看当前凭据来源\",\n  \"version\": \"1.10.0\",\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"odoo\": {\n        \"type\": \"object\",\n        \"description\": \"辉火云企业套件 连接配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"辉火云企业套件 系统地址，如 https://www.huo15.com\"\n          },\n          \"db\": {\n            \"type\": \"string\",\n            \"description\": \"数据库名称，如 huo15\"\n          },\n          \"username\": {\n            \"type\": \"string\",\n            \"description\": \"用户名（邮箱或登录名）\"\n          },\n          \"password\": {\n            \"type\": \"string\",\n            \"description\": \"密码\"\n          }\n        },\n        \"required\": [\"url\", \"db\", \"username\", \"password\"]\n      },\n      \"sync\": {\n        \"type\": \"object\",\n        \"description\": \"通知同步配置\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"description\": \"是否启用后台通知同步\",\n            \"default\": true\n          },\n          \"intervalSeconds\": {\n            \"type\": \"number\",\n            \"description\": \"轮询间隔（秒），默认 30\",\n            \"default\": 30\n          },\n          \"channels\": {\n            \"type\": \"array\",\n            \"description\": \"需要同步的通知类型\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n            },\n            \"default\": [\"todo\", \"activity\", \"message\"]\n          }\n        }\n      }\n    }\n  }\n}\n\nFile v1.10.0:package.json\n\n{\n  \"name\": \"@huo15/huo15-huihuoyun-odoo\",\n  \"version\": \"1.10.0\",\n  \"description\": \"火一五·辉火云企业套件插件 — 自然语言操作辉火云企业套件，实施经理助手，77 个工具覆盖任务、活动闭环、日历、邮件（含模板）、内部动态 chatter（发评论/内部记录/历史）、附件/文档、关注者、CRM、项目/里程碑治理、工单闭环（改/关/派）、审批通过/拒绝、财务、销售、知识库、批量更新、撤销；跨渠道通知基座（企微/钉钉/飞书）+ per-agent 偏好 + 入站回复写回内部动态 + v1.10 共享凭据：组织内配一次，全员跨渠道复用，禁止重复询问密码\",\n  \"type\": \"module\",\n  \"main\": \"index.ts\",\n  \"openclaw\": {\n    \"extensions\": [\n      \"./index.ts\"\n    ],\n    \"build\": {\n      \"openclawVersion\": \"2026.4.10\"\n    },\n    \"compat\": {\n      \"pluginApi\": \">=2026.2.24\"\n    }\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"plugin\",\n    \"huohuoyun\",\n    \"huihuoyun\",\n    \"erp\",\n    \"huo15\",\n    \"crm\",\n    \"helpdesk\",\n    \"invoice\"\n  ],\n  \"author\": \"jobzhao15\",\n  \"license\": \"MIT\",\n  \"peerDependencies\": {\n    \"openclaw\": \">=2026.2.24\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"typescript\": \"^5.5.0\"\n  },\n  \"files\": [\n    \"index.ts\",\n    \"openclaw.plugin.json\",\n    \"src/**/*\",\n    \"SKILL.md\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://cnb.cool/huo15/tools/huo15-huihuoyun-odoo\"\n  }\n}\n\nFile v1.10.0:tsconfig.json\n\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\"]\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}\n\nArchive v1.3.1: 12 files, 37490 bytes\n\nFiles: index.ts (63373b), openclaw.plugin.json (1971b), package.json (1035b), README.md (10669b), SKILL.md (8995b), src/modules/config-manager.ts (2979b), src/modules/notification-poller.ts (9267b), src/modules/odoo-client.ts (29037b), src/types/index.ts (1898b), src/utils/date-utils.ts (2296b), tsconfig.json (483b), _meta.json (139b)\n\nFile v1.3.1:SKILL.md\n\n---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 Odoo 19 Enterprise — 实施经理助手，覆盖任务、CRM、项目、工单、财务、销售\nversion: 1.1.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的 Odoo 19 Enterprise 插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n> 帮我连接 Odoo，地址 https://www.huo15.com，数据库 huo15，账号 admin@huo15.com，密码 xxxxxx\n\n龙虾会自动调用 `odoo_connect` 工具，连接信息保存本地，下次启动自动恢复。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的 Odoo 记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n| 商机 #88 输了 | 调用 odoo_crm_lost |\n| 商机 #88 预计收入改为 50 万 | 更新 expected_revenue |\n| 查看 CRM 各阶段 | odoo_search(model=\"crm.stage\") |\n\n---\n\n## 项目管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 项目进展如何 | 查看所有项目列表 + 里程碑 |\n| 「辉火云实施」项目进度 | 查看指定项目 + 其里程碑 |\n| 里程碑完成了多少 | 返回每个里程碑的 done_tasks/task_count |\n| 今天记录了3小时的需求分析工时 | 创建工时记录 3h |\n| 在任务 #55 上记录 2 小时工时 | 关联任务的工时记录 |\n\n---\n\n## 客服工单（Helpdesk）\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的工单 | 列出指派给我的工单 |\n| 查看紧急工单 | odoo_tickets(priority=\"3\") |\n| 帮我提交一个问题：系统登录失败 | 创建 helpdesk.ticket |\n| 客户华为的工单 | odoo_tickets(partner_id=...) |\n\n---\n\n## 销售 & 采购\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看销售订单 | 列出有效销售订单 |\n| 查看待确认的报价单 | odoo_sale_orders(state=\"draft\") |\n| 查看采购订单 | 列出有效采购订单 |\n| 查询到货日期 | odoo_purchase_orders，查 planned_arrival |\n\n---\n\n## 财务 / 发票\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看发票 | 列出最近发票 |\n| 有哪些客户还没付款 | odoo_invoices(payment_state=\"not_paid\") |\n| 逾期应收账款 | odoo_invoices(overdue_only=true) |\n| 查供应商账单 | odoo_invoices(move_type=\"in_invoice\") |\n\n---\n\n## 消息 / 邮件\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的消息 | 列出未读 chatter 消息 |\n| 看看邮件通知 | 列出收件箱未读通知 |\n| 给商机 #88 发条消息：正在跟进 | 在 crm.lead #88 上发 chatter |\n\n---\n\n## 通用搜索\n\n| 你说 | 模型 | 示例 |\n|------|------|------|\n| 帮我查「华为」客户 | res.partner | name ilike 华为 |\n| 查所有活跃项目 | project.project | active=true |\n| 查库存情况 | stock.quant | — |\n| 查员工列表 | hr.employee | — |\n| 查产品 | product.product | — |\n| 查活动类型 | mail.activity.type | — |\n| 查 CRM 阶段 | crm.stage | — |\n| 查工单阶段 | helpdesk.stage | — |\n\n---\n\n## 通知同步（后台轮询）\n\n插件启动后每 30 秒（可配置）自动检查：\n\n| 通道 | 触发条件 |\n|------|---------|\n| todo | 我的任务有新增或更新 |\n| activity | 今日到期活动 |\n| message | 新 chatter 消息 |\n| email（可选）| 新邮件通知 |\n| calendar（可选）| 今明两天内的新日历事件 |\n\n---\n\n## 工具完整列表（23 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| odoo_connect | 连接 Odoo 系统 |\n| odoo_status | 检查连接状态和轮询状态 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| odoo_create_task | 创建待办任务 |\n| odoo_list_tasks | 查看待办列表（支持 today_only/state 筛选） |\n| odoo_update_task | 更新任务（状态/阶段/截止日期/优先级） |\n| odoo_create_activity | 创建活动提醒（关联到记录） |\n| odoo_list_activities | 查看今日及逾期活动 |\n| odoo_activity_types | 查询活动类型列表 |\n| odoo_create_event | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| odoo_get_messages | 查看未读消息/邮件通知 |\n| odoo_send_message | 向记录发送 chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| odoo_crm_pipeline | 查看商机管道 |\n| odoo_crm_create | 创建商机/线索 |\n| odoo_crm_update | 更新商机信息 |\n| odoo_crm_won | 标记赢单 |\n| odoo_crm_lost | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| odoo_project_overview | 项目列表 + 里程碑进度 |\n| odoo_timesheet_log | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n|------|------|\n| odoo_sale_orders | 查看销售订单 |\n| odoo_purchase_orders | 查看采购订单 |\n| odoo_invoices | 查看发票/账单（支持逾期筛选） |\n\n### 客服\n| 工具 | 说明 |\n|------|------|\n| odoo_tickets | 查看客服工单 |\n| odoo_ticket_create | 创建客服工单 |\n\n### 搜索 & 助手\n| 工具 | 说明 |\n|------|------|\n| odoo_search | 通用搜索（任意模型任意条件） |\n| odoo_daily_briefing | ⭐ 实施经理每日工作概况 |\n\n---\n\n## 常见问题\n\n**Q: 连接失败怎么办？**\nA: 检查 URL（末尾不带斜杠）、数据库名（区分大小写）、账号密码。用 `odoo_status` 查看当前状态。\n\n**Q: 活动提醒需要哪些参数？**\nA: 必须提供 `res_model`（如 crm.lead）、`res_id`（记录ID）、`activity_type_id`、`date_deadline`。\n通过 `odoo_activity_types` 查询系统中的活动类型。\n\n**Q: 商机阶段 ID 怎么获取？**\nA: 通过 `odoo_search(model=\"crm.stage\")` 查询所有 CRM 阶段及其 ID。\n\n**Q: 每日概况失败提示没有 helpdesk 模块？**\nA: 系统中未安装 Helpdesk 模块时，工单部分会自动跳过，其他项正常返回。\n\n---\n\n## Changelog\n\n- **v1.1.0** — CRM 商机管道（查询/创建/赢/输/更新）、项目里程碑、工时记录、销售/采购订单、Helpdesk 工单、发票/逾期账款查询、任务状态更新、活动类型查询、实施经理每日概况（odoo_daily_briefing）\n- **v1.0.0** — 基础版：待办/任务、活动提醒、日历事件、消息/邮件、通用搜索、后台轮询\n\nFile v1.3.1:README.md\n\n# 火一五·辉火云·欧度插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com\n\nArchive v1.1.1: 12 files, 31225 bytes\n\nFiles: index.ts (47848b), openclaw.plugin.json (1854b), package.json (1030b), README.md (7330b), SKILL.md (8995b), src/modules/config-manager.ts (1868b), src/modules/notification-poller.ts (9267b), src/modules/odoo-client.ts (22021b), src/types/index.ts (1898b), src/utils/date-utils.ts (2296b), tsconfig.json (483b), _meta.json (139b)\n\nArchive v1.1.0: 11 files, 26794 bytes\n\nFiles: index.ts (46412b), openclaw.plugin.json (1854b), package.json (1027b), SKILL.md (8995b), src/modules/config-manager.ts (1868b), src/modules/notification-poller.ts (9267b), src/modules/odoo-client.ts (21210b), src/types/index.ts (1898b), src/utils/date-utils.ts (2296b), tsconfig.json (483b), _meta.json (139b)","readmeExcerpt":"Skill: Huo15 Huihuoyun Odoo Owner: zhaobod1 Summary: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号... Tags: latest:1.23.2, plugin:1.23.0 Version history: v1.23.2 | 2026-05-10T18:40:32.216Z | auto - 新增 CHANGELOG.md 文件，便于追踪历史变更 - 更新 package.json（细节未公开） - 文档完整性增强，历史版本变更信息更清晰可查 v1.23.0 | 2026-05-07T09:19:51.849","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}"},{"language":"bash","snippet":"openclaw plugins install @huo15/huo15-huihuoyun-odoo"},{"language":"bash","snippet":"openclaw restart"},{"language":"json","snippet":"{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}"},{"language":"text","snippet":"👤 帮我连接公司系统\n🦞 好的，请提供：1) 系统地址 2) 用户名 3) 密码\n\n👤 地址 https://erp.huo15.com，用户名 zhang@huo15.com，密码 xxx\n🦞 已成功连接到 erp.huo15.com（数据库: huo15），欢迎使用辉火云企业套件！\n\n👤 今天有什么工作？\n🦞 汇总：3个待办任务、2个到期活动、1个紧急工单、华为商机需跟进...\n\n👤 帮我创建任务：明天发报价单给华为\n🦞 已创建任务 #456，截止日期 2026-04-13\n\n👤 查看我的商机\n🦞 你有 5 个活跃商机：华为ERP项目（报价阶段，50万）...\n\n👤 商机 #88 赢了\n🦞 已标记商机 #88 为赢单\n\n👤 有哪些客户还没付款\n🦞 3张未付发票：华为 ¥12,000（逾期15天）...\n\n👤 查下产品A还有多少库存\n🦞 产品A 库存：上海仓 120 件、北京仓 45 件\n\n👤 研发部有哪些员工\n🦞 研发部共 8 人：张三（前端）、李四（后端）..."},{"language":"ts","snippet":"const ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: huo15-claude-odoo\ndisplayName: 火一五·辉火云企业套件插件\ndescription: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号，与内部 RBAC 对齐 — 销售看销售的、管理员看管理员的）；旧 private 参数标 deprecated，新参数 shared（默认 false）；prompt 加附件硬规则（不替用户判断附件内容相符性）。继承 v1.22 record_id+include_lines / v1.21 hook RPC 永久挂修复 / v1.20 审批工作流。Use when：接 Odoo/辉火云、企业 ERP 操作、CRM/任务/财务/销售/工单管理、自然语言企微/钉钉调用 ERP、写销售/采购合同需要订单明细。\nversion: 1.23.0\n---\n\n# 辉火云企业套件插件使用指南\n\nOpenClaw 龙虾的辉火云企业套件插件。连接后即可用自然语言全面操作辉火云系统，\n尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n---\n\n## 首次配置（v1.23 默认按 sender_id 隔离 — 每人配自己的）\n\n### 方式一：通过对话连接（推荐）\n\n每位同事 @ 机器人时各自配一次自己的辉火云账号：\n\n> 帮我连接辉火云企业套件，地址 https://www.huo15.com，数据库 huo15，账号 你自己的邮箱@huo15.com，密码 xxxxxx\n\n龙虾自动调 `odoo_connect`，**默认按当前 sender_id 隔离保存**到 `~/.openclaw/plugin-configs/odoo/{agentId}.json`，与 Odoo 内部 RBAC 对齐 —— 销售看销售的、管理员看管理员的，不再共用同一账号。\n\n### 「为什么不默认全员共用？」\n\nv1.10–v1.22 默认全员共享一套凭据，结果 Odoo 内部权限失效（不管你是销售还是管理员，看到的数据完全一样）。v1.23 起反转：**每个 sender_id 用自己的账号 = 权限按 Odoo 用户区分**。这是绝大多数企业期望的协作模型。\n\n### 方式二：组织共用一个公共账号（少数场景）\n\n仅当组织内只有一个 Odoo 公共只读账号、所有同事都用它访问相同数据时：\n\n> 帮我连接辉火云，组织内大家共用这个账号：…，请保存为共享配置\n\nLLM 会调 `odoo_connect(shared=true)` 写入 `default.json`，作为兜底 fallback。**注意**：此时 Odoo RBAC 失效，所有人看到的数据完全一致。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## ⭐ 实施经理每日概况\n\n每天早上第一句话：\n\n> 今天有什么工作？\n\n龙虾会一次性汇总：\n\n| 类别 | 内容 |\n|------|------|\n| 📋 今日截止任务 | project.task 今日 deadline |\n| ⏰ 活动提醒 | 今日及逾期的 mail.activity |\n| 🎫 待处理工单 | 指派给我的 helpdesk.ticket |\n| 💰 逾期应收 | 未付款且已逾期的 account.move |\n| 🏆 商机跟进 | 需要今日跟进的 crm.lead |\n| 💬 未读消息 | mail.message 未读数 |\n\n---\n\n## 待办 / 任务\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 帮我写个待办 | 追问标题后创建任务（project.task） |\n| 帮我创建任务：明天发报价单给华为 | 直接创建，截止日期设为明天 |\n| 紧急待办：处理生产故障 | 创建优先级=3（紧急）的任务 |\n| 看看我的待办 | 列出我的全部待办 |\n| 我今天有什么要做的 | 列出今日截止任务 + 今日活动 |\n| 把任务 #123 标记完成 | 更新 state = 1_done |\n| 把任务 #123 截止日期改到下周五 | 更新 date_deadline |\n| 任务 #123 调高优先级为紧急 | 更新 priority = 3 |\n\n---\n\n## 活动提醒\n\n活动（mail.activity）关联到具体的辉火云记录（任务、商机、客户等）。\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 提醒我明天开会 | 创建活动提醒，截止明天 |\n| 帮我在客户 #42 上设一个跟进提醒 | 在 res.partner #42 创建活动 |\n| 查看我今天有哪些活动 | 列出今日到期活动 |\n| 查看逾期提醒 | 列出今日及逾期活动 |\n| 有哪些活动类型 | 调用 odoo_activity_types |\n\n> 常用 activity_type_id：4=待办、1=邮件、2=电话、3=会议（具体以系统为准，可通过 odoo_activity_types 查询）\n\n---\n\n## 日历 / 会议\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 安排一个会议 | 追问主题和时间后创建 calendar.event |\n| 明天上午10点安排产品评审会，持续1小时 | 创建 10:00~11:00 |\n| 下午2点约华为团队开会 | 创建 14:00~15:00 |\n| 查看我的日程安排 | odoo_search(model=\"calendar.event\") |\n\n---\n\n## CRM 商机管理\n\n| 你说 | 龙虾做什么 |\n|------|-----------|\n| 查看我的商机 | 查看我的商机管道 |\n| 查看全部销售人员的商机 | odoo_crm_pipeline(all_users=true) |\n| 新建一个商机：华为 ERP 项目 | 创建商机，追问金额/阶段 |\n| 把商机 #88 推进到下一阶段 | 更新 stage_id |\n| 把商机 #88 赢了 | 调用 odoo_crm_won |\n"},{"path":"README.md","content":"# 火一五·辉火云企业套件插件\n\n---\n\n<div align=\"center\">\n\n<img src=\"https://tools.huo15.com/uploads/images/system/logo-colours.png\" alt=\"火一五Logo\" style=\"width: 120px; height: auto; display: inline; margin: 0;\" />\n\n</div>\n\n<div align=\"center\">\n\n<h3>打破信息孤岛，用一套系统驱动企业增长</h3>\n<h3>加速企业用户向全场景人工智能机器人转变</h3>\n\n</div>\n<div align=\"center\">\n\n| 🏫 教学机构 | 👨‍🏫 讲师 | 📧 联系方式         | 💬 QQ群      | 📺 配套视频                         |\n|:-----------:|:--------:|:------------------:|:-----------:|:-----------------------------------:|\n| 逸寻智库 | Job | support@huo15.com | 1093992108  | [📺 B站视频](https://space.bilibili.com/400418085) |\n\n</div>\n---\n\n## 简介\n\n**火一五·辉火云企业套件插件** 是 [OpenClaw](https://github.com/nicepkg/openclaw) 的辉火云企业套件适配插件，让你用自然语言全面操作辉火云企业套件。尤其适合**实施经理、项目经理、销售经理**的日常工作场景。\n\n连接后，龙虾 AI Agent 即可帮你管理待办、跟进商机、查看工单、核对账款、记录工时、查库存、看员工——一句话搞定。\n\n### 核心特性\n\n- **Per-Agent 凭据隔离** — 搭配 WeCom 动态 agent，每个企微用户拥有独立的辉火云凭据，互不干扰\n- **智能连接引导** — 首次使用自动引导输入系统地址、用户名、密码；数据库自动检测\n- **实施经理每日概况** — 一句\"今天有什么工作？\"汇总任务、活动、工单、逾期账款、商机、未读消息\n- **待办 & 任务** — 创建、列表、更新状态/优先级/截止日期\n- **CRM 商机管道** — 查看/创建/推进/赢单/输单\n- **项目 & 里程碑** — 项目进度总览、里程碑完成率、工时记录\n- **客服工单** — 查看/创建 Helpdesk 工单\n- **销售 & 采购** — 查看销售订单、采购订单\n- **财务发票** — 发票查询、逾期应收账款筛选\n- **联系人/客户** — 查询/创建联系人、客户、供应商\n- **库存管理** — 库存水平查询、调拨单/出入库单\n- **HR 人事** — 员工查询、考勤打卡记录、请假记录\n- **审批流** — 查看审批请求\n- **活动提醒** — 创建活动、查看今日到期/逾期活动\n- **日历会议** — 创建日历事件\n- **消息 & 邮件** — 未读消息查看、Chatter 消息发送\n- **通用搜索** — 搜索任意辉火云数据模型（客户、产品、员工、库存...）\n- **后台通知同步** — 自动轮询推送新任务/活动/消息/邮件/日历变更\n\n---\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/huo15-huihuoyun-odoo\n```\n\n重启 OpenClaw 生效：\n\n```bash\nopenclaw restart\n```\n\n---\n\n## 首次配置\n\n### 方式一：通过对话连接（推荐）\n\n用户只需说一句话，插件会自动引导：\n\n> 帮我连接公司系统\n\n龙虾会依次询问：系统地址、用户名、密码。数据库自动检测（单库自动连接，多库让你选择）。\n\n连接信息按 agent 隔离保存，下次使用自动恢复，无需重新输入。\n\n### 方式二：通过 openclaw.plugin.json 预配置\n\n```json\n{\n  \"odoo\": {\n    \"url\": \"https://www.huo15.com\",\n    \"db\": \"huo15\",\n    \"username\": \"admin@huo15.com\",\n    \"password\": \"your-password\"\n  },\n  \"sync\": {\n    \"enabled\": true,\n    \"intervalSeconds\": 30,\n    \"channels\": [\"todo\", \"activity\", \"message\", \"email\", \"calendar\"]\n  }\n}\n```\n\n---\n\n## 工具列表（32 个）\n\n### 基础\n| 工具 | 说明 |\n|------|------|\n| `odoo_connect` | 连接辉火云企业套件（db 可选，自动检测） |\n| `odoo_status` | 检查连接状态和轮询状态 |\n| `odoo_disconnect` | 断开连接并清除已保存凭据 |\n\n### 任务 & 活动\n| 工具 | 说明 |\n|------|------|\n| `odoo_create_task` | 创建待办任务 |\n| `odoo_list_tasks` | 查看待办列表（支持 today_only/state 筛选） |\n| `odoo_update_task` | 更新任务（状态/阶段/截止日期/优先级） |\n| `odoo_create_activity` | 创建活动提醒（关联到记录） |\n| `odoo_list_activities` | 查看今日及逾期活动 |\n| `odoo_activity_types` | 查询活动类型列表 |\n| `odoo_create_event` | 创建日历事件/会议 |\n\n### 消息\n| 工具 | 说明 |\n|------|------|\n| `odoo_get_messages` | 查看未读消息/邮件通知 |\n| `odoo_send_message` | 向记录发送 Chatter 消息 |\n\n### CRM\n| 工具 | 说明 |\n|------|------|\n| `odoo_crm_pipeline` | 查看商机管道 |\n| `odoo_crm_create` | 创建商机/线索 |\n| `odoo_crm_update` | 更新商机信息 |\n| `odoo_crm_won` | 标记赢单 |\n| `odoo_crm_lost` | 标记输单 |\n\n### 项目 & 工时\n| 工具 | 说明 |\n|------|------|\n| `odoo_project_overview` | 项目列表 + 里程碑进度 |\n| `odoo_timesheet_log` | 记录工时 |\n\n### 销售 & 采购 & 财务\n| 工具 | 说明 |\n"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huihuoyun-odoo\",\n  \"version\": \"1.23.2\",\n  \"publishedAt\": 1778438432216\n}"},{"path":"CHANGELOG-v1.19.md","content":"# v1.19.0 (2026-04-28)\n\n**核心修复：消除每次 prompt 注入 ~7900 字 / ~2000 tokens 的工具表，TTFT（首字延迟）实测降幅显著。**\n\n## 背景\n\n诊断发现 `before_prompt_build` hook 在每次 LLM call 之前都注入 ~7900 字的工具速查 + 自然语言映射表到 system context（[index.ts:5212-5489](index.ts#L5212)）。\n\n**用户感受**：哪怕只发\"你好\"也注入这 2000 tokens。LLM 处理这堆 prompt + reasoning thinking 一起拖到 TTFT 70-150 秒。\n\n实测 14:33-14:35 dispatch 拆解：\n- dispatch-start → first deliver-block = **129 秒**\n- 大头是 LLM TTFT 72 秒（首字延迟）\n- 加上 plugin 多次 reload 拖累 ~17 秒\n\n## 改动\n\n### 删 — system context 7900 字 → 1500 字\n\n[index.ts](index.ts) 的 `registerHooks` 函数中 `appendSystemContext` 模板字面量整体重写：\n\n| 删 | 改成 |\n|---|---|\n| 工具速查（共 77 个）整段 6500 字 | 只保留 6 行高频工具速查（任务 / CRM / 项目 / 客服 / 财务 / 联系人 / 检索 / 状态） |\n| 自然语言 → 工具映射 130+ 行 8000+ 字 | 全删（让 LLM 自己推断意图，识别不出再调 odoo_help） |\n| 常用数据模型 26 个 | 缩到 14 个最常用 |\n| 日期 & 字段规范 6 条 | 保留全部（这部分对 LLM 调用工具时仍重要，但本身只 200 字） |\n\n最终 system context 注入约 1500 字 / ~400 tokens。\n\n### 加 — `odoo_help` 工具（按需查工具表）\n\n新增 `api.registerTool({ name: 'odoo_help', ... })`，参数：\n\n- 无参数 → 返回完整 7900 字工具表 + 自然语言映射 + 数据模型清单\n- `keyword=\"<模糊词>\"` → 行级模糊匹配（如 `\"请假\"` 返回所有请假相关工具行；`\"CRM\"` 返回 CRM 分类）\n\nLLM 在不知道某意图对应哪个工具时**主动调 odoo_help**，把 token 消耗从\"每次 prompt 都付\"改成\"按需付\"。\n\n工具数从 189 → **190**。\n\n### 不改\n\n- 未连接路径的 system context（[index.ts:5176-5202](index.ts#L5176)）保留——那段本来就没工具表，只是连接引导\n- 189 工具的实现逻辑 / 接口 / 业务规则 全部不动\n- 共享凭据规则、品牌口径硬规则、用户/系统/凭据动态字段 全保留\n\n## 用户可见效果\n\n| 项 | v1.18 | v1.19 |\n|---|---|---|\n| 每次 prompt 注入 | ~7900 字 / ~2000 tokens | ~1500 字 / ~400 tokens |\n| TTFT 预期降幅 | — | -5 ~ -25 秒 |\n| 工具数 | 189 | 190 (+ odoo_help) |\n| LLM 调用工具的能力 | 完整可见 | 高频 8 个直接可见，其他通过 odoo_help 按需查 |\n\n## 风险与缓解\n\n- **风险**：LLM 看不到完整工具表可能导致它\"不知道某个工具存在\"\n- **缓解**：\n  1. system context 顶部明确告知\"完整 189 工具表调 odoo_help\"\n  2. odoo_help 工具的 description 写明 \"按需获取详细信息\"\n  3. 高频 8 个工具仍然在 system context 里直接可见，覆盖 80% 日常需求\n\n## 测试\n\n- `tsc --noEmit` exit 0（剩余 schema 字段警告是 v1.18 之前就存在的 SDK 类型定义问题，与本次改动无关）\n- 启动期 log 应从 `[odoo] 189 个工具已注册` 变为 `[odoo] 190 个工具已注册（v1.19 — 加 odoo_help 按需查工具表，system context 不再每次注入 ~7900 字）`\n- before_prompt_build 钩子注册 log 加 `v1.19 system context 已瘦身 ~6500 字 → 调 odoo_help 按需取详`\n\n## 兼容性\n\n完全向下兼容。所有 189 工具签名 / 行为 / 业务逻辑不变。LLM 端如果还期望从 system context 看完整工具表，调 odoo_help 即可恢复 v1.18 行为。"},{"path":"CHANGELOG-v1.20.md","content":"# v1.20.0 (2026-04-28)\n\n**核心修复：tier 分级让默认 prompt tool schema 从 ~190 工具 / ~17000 tokens 砍到 ~30 工具 / ~3000 tokens。配合 v1.19 的 system context 瘦身，每次 prompt 总省 ~16000 tokens。**\n\n## 背景\n\nv1.19 把 `before_prompt_build` 注入的 system context 从 7900 字砍到 1500 字（节省 ~1700 tokens）。但实测 `dispatch-start → deliver-start` TTFT 仍 70-150 秒。\n\n进一步诊断（直接 curl DeepSeek API）：\n\n| 测试 | 端到端时间 |\n|---|---|\n| DeepSeek 流式 TTFT | **530ms** |\n| DeepSeek 非流式（含响应） | **790ms** |\n\n→ DeepSeek API 端**完全没问题**。**真正的 TTFT 元凶是 prompt 太大**（单大头 = 189 个 odoo 工具的 JSON schema），LLM 端 prefill 处理 30k+ tokens 才出第一字。\n\n预估每个 odoo 工具 schema ≈ 80-200 tokens（name + description + properties + required）：\n\n- description 总和 16470 字符 / ~5490 tokens\n- 加 schema 结构（properties / required / type 等）×3-4 倍 → **15000-20000 tokens** 仅 odoo 一个 plugin\n\n## 改动\n\n### `index.ts` — 引入 tier 分级\n\n新增 `ODOO_TOOL_TIERS`（module-level 常量）：\n\n```ts\nconst ODOO_TOOL_TIERS = {\n  minimal: new Set([...]),  // 10 个：连接 + 最核心任务\n  core:    new Set([...]),  // 30 个：覆盖 80% 日常需求（默认）\n  // extended: null = 全部 190 个（v1.19 行为）\n};\n```\n\n`registerTools` 函数顶部读 plugin config：\n\n```ts\nconst cfg = (api.pluginConfig ?? {}) as { tier?: 'minimal' | 'core' | 'extended' };\nconst tier = cfg.tier ?? 'core';  // 默认 core\nconst allowedTools = tier === 'extended' ? null : ODOO_TOOL_TIERS[tier];\n\nconst register = (opts) => {\n  if (allowedTools === null || allowedTools.has(opts.name) || opts.name === 'odoo_help') {\n    api.registerTool(opts);\n    registeredCount++;\n  } else {\n    skippedCount++;\n  }\n};\n```\n\n然后 sed 把 489-5500 行内 189 个 `api.registerTool(` 替换为 `register(` —— **所有 189 个工具走 register wrapper 过滤**。\n\n`odoo_help` 工具**始终注册**（任何 tier），保证 LLM 能查完整工具表。\n\n### `index.ts` — system context 提示当前 tier\n\n将 v1.19 的 \"完整 189 个工具表 …\" 提示更新为 \"**当前 tier=core（默认 30 个高频工具直接可见）。完整 190 个工具调 odoo_help 查；如需恢复 v1.18 全量行为：改 ~/.openclaw/openclaw.json 的 plugins.entries.odoo.config.tier='extended'**\"。\n\n### `index.ts` — 启动期 log 报告 tier 状态\n\n```\nv1.18: [odoo] 189 个工具已注册（v1.18 — Studio 元编程+审计...）\nv1.19: [odoo] 190 个工具已注册（v1.19 — 加 odoo_help...）\nv1.20: [odoo] 30 个工具已注册（v1.20 — tier=core 精简档位 / 跳过 160 个，节省 ~12800 tokens schema）\n       完整 190 工具调 odoo_help 查；改 plugins.entries.odoo.config.tier=\"extended\" 可恢复全量。\n```\n\n## tier 三档\n\n### `minimal`（10 工具）\n\n仅最核心连接 + 任务搜索：\n```\nodoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\nodoo_create_task / odoo_list_tasks / odoo_my_today\nodoo_search / odoo_daily_briefing\n```\n\n适合：极致性能，仅做\"连接 + 任务列表\"演示场景。\n\n### `core`（30 工具，默认）\n\n覆盖 80% 日常需求的高频 30 个：\n\n- 连接 & 状态（5）：odoo_connect / odoo_status / odoo_disconnect / odoo_whoami / odoo_help\n- 任务 & 活动（8）：odoo_create_task / odoo_list_tasks / odoo_update_task / odoo_my_today / odoo_my_workload / odoo_create_activity / odoo_calendar_today / odoo_complete_activity\n- CRM（5）：odoo_crm_pipeline / odoo_crm_create / odoo_crm_update / odoo_crm_won / odoo_crm_lost\n- 项目（2）：odoo_project_overview / odoo_timesheet_log\n- 客服（2）：odoo_tickets / odoo_ticket_create\n- 财务（3）：odoo_invoices / odoo_sale_orders / odoo_purchase_orders\n- 联系人（2）：odoo_c"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号... Skill: Huo15 Huihuoyun Odoo Owner: zhaobod1 Summary: 自然语言操作 辉火云企业套件 — 实施经理助手，覆盖任务/CRM/项目/工单/财务/销售/HR/库存/生产/客服/知识/Studio 元编程 13 业务域 204 个工具。v1.23.0 默认权限模型反转：odoo_connect 默认按 sender_id 隔离（每个企微/钉钉/飞书成员配自己的 Odoo 账号... Tags: latest:1.23.2, plugin:1.23.0 Version history: v1.23.2 | 2026-05-10T18:40:32.216Z | auto - 新增 CHANGELOG.md 文件，便于追踪历史变更 - 更新 package.json（细节未公开） - 文档完整性增强，历史版本变更信息更清晰可查 v1.23.0 | 2026-05-07T09:19:51.849","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1284,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T01:13:10.771Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:58:07.858Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}