{"id":"9d3d699e-3527-45e5-9fff-887e2efe43d9","entityType":"agent","slug":"clawhub-zhaobod1-huo15-openclaw-enhance","name":"Huo15 Openclaw Enhance","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zhaobod1-huo15-openclaw-enhance","canonicalPath":"/agent/clawhub-zhaobod1-huo15-openclaw-enhance","generatedAt":"2026-10-10T05:26:28.747Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T00:06:18.405Z","emptyReason":null},"description":"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected... Skill: Huo15 Openclaw Enhance Owner: zhaobod1 Summary: 火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected... Tags: latest:6.7.21, plugin:6.1.3 Version history: v6.7.21 | 2026-06-25T17:04:01.311Z | auto Version 6.7.21 - Update version in package.json and CHANGELOG.md. - No functional or codebase changes; document","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.9K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-openclaw-enhance","sourceUrl":"https://clawhub.ai/zhaobod1/huo15-openclaw-enhance","homepage":"https://clawhub.ai/zhaobod1/skills/huo15-openclaw-enhance","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zhaobod1/huo15-openclaw-enhance","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/zhaobod1/skills/huo15-openclaw-enhance","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":40,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:06:18.405Z","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-10T00:06:18.405Z","emptyReason":null},"stars":null,"forks":null,"downloads":1854,"packageName":null,"latestVersion":"6.7.21","tractionLabel":"1.9K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:06:18.404Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T00:06:18.405Z","lastCrawledAt":"2026-10-10T00:06:18.404Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T00:06:18.404Z","lastVerifiedAt":null,"highlights":[{"version":"6.7.21","createdAt":"2026-06-25T17:04:01.311Z","changelog":"Version 6.7.21 - Update version in package.json and CHANGELOG.md. - No functional or codebase changes; documentation and metadata only.","fileCount":75,"zipByteSize":453461},{"version":"6.7.20","createdAt":"2026-06-25T16:03:59.738Z","changelog":"huo15-openclaw-enhance v6.7.20 - Added multiple new documentation files, including technical architecture, handover, PRD, and decision/lesson records. - Introduced utility: `src/utils/safe-api-wrapper.ts`. - Major refactor and updates in key modules: improved large file bridge logic, bot sharing/uploading, cc-bridge integrations, configuration doctor, dashboard, and context watchdog. - Removed deprecated model-router logic and legacy skill-card metadata file. - Updated manifest, release scripts, type definitions, and improved README/CHANGELOG for clarity.","fileCount":75,"zipByteSize":453109},{"version":"6.6.4","createdAt":"2026-05-11T00:48:14.715Z","changelog":"v6.6.4 - 修复 P3-13：通过 seenRunIds FIFO Set 内存去重，避免 model-fallback 重试导致的 llm_output runId 二次 emit 被重复累计。 - 新增 P2-10：提供 enhance_ctx_silence({minutes, reason?}) 工具，期间自动跳过所有 banner，静音期过后自动恢复。 - 继承 v6.6.0 成本精算、多模态与 channel 差异化、v6.5.7 子 agent 修正、预测上下文提醒等增强能力。","fileCount":68,"zipByteSize":414653},{"version":"6.5.7","createdAt":"2026-05-10T22:39:44.267Z","changelog":"huo15-openclaw-enhance v6.5.7 — Adds proactive context monitoring and warnings for subagent scenarios. - New context-watchdog module tracks subagent_spawned/ended events, accumulates child agent token usage, and fixes multi-agent context gaps. - Predicts token budget exhaustion based on tokensPerTurnHistory, pre-warn users before reaching warnAt thresholds. - Removes sidus-specific hardcoded behaviors. - Includes all persistence and model revert features from v6.5.6+, and recent model switching improvements. - Implements persistent SQLite storage for improved context tracking.","fileCount":67,"zipByteSize":401858},{"version":"6.5.3","createdAt":"2026-05-10T18:32:27.360Z","changelog":"**huo15-openclaw-enhance v6.5.3 Changelog** - Added new modules for file upload and large file handling, including support for up to 2GB uploads bypassing platform limits. - Introduced BlueFire (蓝火) keyword dispatch trigger modules for direct HTTP POST task allocation, bypassing LLM judgment. - Enhanced session bridging for group chat memory retention, fixing \"group chat overnight memory loss.\" - Updated model routing and native memory systems for improved performance and reliability. - Multiple utility and type definition enhancements to support new modules and workflows.","fileCount":65,"zipByteSize":379052},{"version":"6.1.3","createdAt":"2026-05-04T09:03:10.521Z","changelog":"huo15-openclaw-enhance v6.1.3 - Removed the ≥10MB file size threshold in bot-share: all IM channel file shares now always use enhance_share_file, including small files. - Updated tool descriptions for bot-share: explicitly states that \"MEDIA:\", \"FILE:\", or \"📎 path\" literals won't be auto-recognized by wecom/DingTalk outbound; small files will not throw exceptions. - Reflects and inherits v6.1.2 model-router PROVIDER_REGISTRY fixes, v6.0.0 npm package renaming, and previous modules.","fileCount":59,"zipByteSize":318013},{"version":"6.1.1","createdAt":"2026-05-03T07:43:40.680Z","changelog":"huo15-openclaw-enhance v6.1.1 - Documentation updates in SKILL.md and CHANGELOG.md. - Updated version metadata in package.json. - No functional code changes in this release.","fileCount":59,"zipByteSize":315599},{"version":"6.1.0","createdAt":"2026-05-02T13:51:42.473Z","changelog":"Summary: v6.1.0 aligns the plugin package name with the huo15-* convention and enables a clean plugin entry, circumventing legacy manifest issues from previous versions. - Renamed npm package from @huo15/openclaw-enhance to @huo15/huo15-openclaw-enhance for naming consistency and to resolve old plugin manifest \"ghost\" issues. - Plugin upgrades seamlessly: existing plugin records/configurations are replaced without requiring manual migration. - OpenClaw plugin id remains enhance; user configuration under plugins.entries.enhance.* is preserved. - Retains all features and modules from v5.8.x (25+ modules, including task management, statusline, dashboards, workflows, skill recommendations, session lifecycle, and more). - Installation updated: use `openclaw plugins install @huo15/huo15-openclaw-enhance`.","fileCount":59,"zipByteSize":315674}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-openclaw-enhance","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-openclaw-enhance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/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-10T05:26:28.740Z"}},"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-openclaw-enhance/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-openclaw-enhance/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-10T00:06:18.405Z","emptyReason":null},"readme":"Skill: Huo15 Openclaw Enhance\n\nOwner: zhaobod1\n\nSummary: 火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected...\n\nTags: latest:6.7.21, plugin:6.1.3\n\nVersion history:\n\nv6.7.21 | 2026-06-25T17:04:01.311Z | auto\n\nVersion 6.7.21\n\n- Update version in package.json and CHANGELOG.md.\n- No functional or codebase changes; documentation and metadata only.\n\nv6.7.20 | 2026-06-25T16:03:59.738Z | auto\n\nhuo15-openclaw-enhance v6.7.20\n\n- Added multiple new documentation files, including technical architecture, handover, PRD, and decision/lesson records.\n- Introduced utility: `src/utils/safe-api-wrapper.ts`.\n- Major refactor and updates in key modules: improved large file bridge logic, bot sharing/uploading, cc-bridge integrations, configuration doctor, dashboard, and context watchdog.\n- Removed deprecated model-router logic and legacy skill-card metadata file.\n- Updated manifest, release scripts, type definitions, and improved README/CHANGELOG for clarity.\n\nv6.6.4 | 2026-05-11T00:48:14.715Z | auto\n\nv6.6.4\n\n- 修复 P3-13：通过 seenRunIds FIFO Set 内存去重，避免 model-fallback 重试导致的 llm_output runId 二次 emit 被重复累计。\n- 新增 P2-10：提供 enhance_ctx_silence({minutes, reason?}) 工具，期间自动跳过所有 banner，静音期过后自动恢复。\n- 继承 v6.6.0 成本精算、多模态与 channel 差异化、v6.5.7 子 agent 修正、预测上下文提醒等增强能力。\n\nv6.5.7 | 2026-05-10T22:39:44.267Z | auto\n\nhuo15-openclaw-enhance v6.5.7 — Adds proactive context monitoring and warnings for subagent scenarios.\n\n- New context-watchdog module tracks subagent_spawned/ended events, accumulates child agent token usage, and fixes multi-agent context gaps.\n- Predicts token budget exhaustion based on tokensPerTurnHistory, pre-warn users before reaching warnAt thresholds.\n- Removes sidus-specific hardcoded behaviors.\n- Includes all persistence and model revert features from v6.5.6+, and recent model switching improvements.\n- Implements persistent SQLite storage for improved context tracking.\n\nv6.5.3 | 2026-05-10T18:32:27.360Z | auto\n\n**huo15-openclaw-enhance v6.5.3 Changelog**\n\n- Added new modules for file upload and large file handling, including support for up to 2GB uploads bypassing platform limits.\n- Introduced BlueFire (蓝火) keyword dispatch trigger modules for direct HTTP POST task allocation, bypassing LLM judgment.\n- Enhanced session bridging for group chat memory retention, fixing \"group chat overnight memory loss.\"\n- Updated model routing and native memory systems for improved performance and reliability.\n- Multiple utility and type definition enhancements to support new modules and workflows.\n\nv6.1.3 | 2026-05-04T09:03:10.521Z | auto\n\nhuo15-openclaw-enhance v6.1.3\n\n- Removed the ≥10MB file size threshold in bot-share: all IM channel file shares now always use enhance_share_file, including small files.\n- Updated tool descriptions for bot-share: explicitly states that \"MEDIA:\", \"FILE:\", or \"📎 path\" literals won't be auto-recognized by wecom/DingTalk outbound; small files will not throw exceptions.\n- Reflects and inherits v6.1.2 model-router PROVIDER_REGISTRY fixes, v6.0.0 npm package renaming, and previous modules.\n\nv6.1.1 | 2026-05-03T07:43:40.680Z | auto\n\nhuo15-openclaw-enhance v6.1.1\n\n- Documentation updates in SKILL.md and CHANGELOG.md.\n- Updated version metadata in package.json.\n- No functional code changes in this release.\n\nv6.1.0 | 2026-05-02T13:51:42.473Z | auto\n\nSummary: v6.1.0 aligns the plugin package name with the huo15-* convention and enables a clean plugin entry, circumventing legacy manifest issues from previous versions.\n\n- Renamed npm package from @huo15/openclaw-enhance to @huo15/huo15-openclaw-enhance for naming consistency and to resolve old plugin manifest \"ghost\" issues.\n- Plugin upgrades seamlessly: existing plugin records/configurations are replaced without requiring manual migration.\n- OpenClaw plugin id remains enhance; user configuration under plugins.entries.enhance.* is preserved.\n- Retains all features and modules from v5.8.x (25+ modules, including task management, statusline, dashboards, workflows, skill recommendations, session lifecycle, and more).\n- Installation updated: use `openclaw plugins install @huo15/huo15-openclaw-enhance`.\n\nv6.0.0 | 2026-05-02T11:20:55.729Z | auto\n\n**Major update: plugin npm package renamed and infrastructure enhancements.**\n\n- Package renamed: `@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance` to align with huo15-* naming and avoid legacy ghost manifest issues on ClawHub.\n- All code references, documentation, and manifests updated to reflect new package name; plugin id remains `enhance`, user config unchanged.\n- Infrastructure upgrade: added new utility modules (`latency-tracker`, `model-route-config`, `route-history`) for improved routing and monitoring.\n- Updated core modules to support and integrate the new utilities (notably in `model-router` and `trajectory-archiver`).\n- README, SKILL.md, and changelog fully revised to document the renaming and technical changes.\n\nv5.8.2 | 2026-05-02T07:16:17.319Z | auto\n\nhuo15-openclaw-enhance v5.8.2\n\n- Update version to 5.8.2 in SKILL.md and package.json.\n- Refresh documentation and metadata.\n- No feature or code changes; documentation/metadata maintenance only.\n\nv5.8.1 | 2026-05-02T06:38:53.369Z | auto\n\nhuo15-openclaw-enhance v5.8.1\n\n- Added postinstall script (scripts/postinstall.cjs) for improved installation process.\n- Updated dependencies and package metadata.\n- Documentation updates in SKILL.md and CHANGELOG.md.\n\nv5.8.0 | 2026-05-02T02:24:15.862Z | auto\n\nhuo15-openclaw-enhance v5.8.0\n\n- 新增 hook-profiler 模块：支持挂钩性能分析和调用计数。\n- 增加 src/modules/hook-profiler.ts、src/utils/hook-profile-db.ts、src/utils/profile-hook.ts 三个文件，实现 hook 数据采集与存储。\n- 优化类型定义与 sqlite-store 工具，以支持 profiling 数据。\n- 更新 manifest 和相关文档，说明新特性，无破坏性变更。\n- 修复部分老版本遗留的小问题，提升整体扩展性。\n\nv5.7.27 | 2026-05-02T02:21:15.193Z | auto\n\nhuo15-openclaw-enhance v5.7.27\n\n- Added three utility scripts: audit-session-bridge-and-share-fallback.sh, deploy-2week-followup-launchagent.sh, and release.sh.\n- Updated core files to improve or expand session sharing and link utilities.\n- Minor documentation and manifest updates.\n\nv5.7.26 | 2026-05-02T01:28:38.975Z | auto\n\nhuo15-openclaw-enhance v5.7.26\n\n- New: Added `src/modules/session-bridge.ts` module.\n- Enhanced session management and internal module communication.\n- Various improvements and refactoring in type definitions and documentation.\n- Updated package metadata and versioning for better compatibility.\n\nv5.7.25 | 2026-05-01T15:26:21.188Z | auto\n\nhuo15-openclaw-enhance v5.7.25\n\n- Added four new modules: `bot-share-link`, `model-router`, `session-doctor`, and `trajectory-archiver`.\n- Introduced utility helpers: `ensure-sqlite` and `http-route-bridge`.\n- Updated core modules to integrate new features and enhance compatibility.\n- Improved internal type safety and refactored parts of the SQLite store.\n- Enhanced diagnostics and session management capabilities.\n\nv5.7.10 | 2026-04-28T01:38:07.669Z | user\n\nv5.7.10 native-memory-surfacer:解决第二天失忆——每 session 开局自动 surface ~/.claude/projects 下相关 .md memory 文件锚点(零侵入、零工具 schema、零 child_process)\n\nv5.7.9 | 2026-04-26T23:15:27.662Z | auto\n\nhuo15-openclaw-enhance v5.7.9\n\n- Updated version and metadata.\n- Documentation and manifest fields bumped for maintenance and alignment with previous release.\n- No new features or breaking changes; ensures consistency and version progression.\n\nv5.7.8 | 2026-04-26T23:14:26.147Z | auto\n\nhuo15-openclaw-enhance v5.7.8 adapts to openclaw 2026.4.24 with full TypeScript typing support.\n\n- Upgraded peerDep, compat, and build targets to openclaw 2026.4.24; manifest adds enabledByDefault, uiHints, activation fields.\n- Removed all 14 usages of api.on(...as any); all hook handlers now fully typed (PluginHookHandlerMap).\n- Eliminated (event:any,ctx:any) and (ctx as any)?.agentId patterns in main code (some remain in internal helpers).\n- Fixed a long-hidden self-check bug: now properly returns PluginHookBeforeAgentReplyResult per spec.\n- No runtime behavior change; enhanced compile-time safety without altering openclaw-native logic.\n- Retains all major v5.7.7 features: session-lifecycle, skill-recommender, config-doctor, and more.\n\nv5.7.7 | 2026-04-26T14:29:24.364Z | auto\n\nhuo15-openclaw-enhance v5.7.7 introduces comprehensive lifecycle management for sessions.\n\n- Added session-lifecycle module to handle session_start, session_end, before_reset, subagent_spawned, and subagent_ended hooks from openclaw 4.22.\n- Automatically inserts session start/end chapters, flushes unfinished todos to project memory, and rescues progress before reset.\n- Implements 30-second deduplication to prevent noise/flooding and writes only to plugin-owned tables (does not pollute core openclaw memory).\n- Retains all features from v5.7.5 (skill-recommender) and previous maintenance/hardening updates.\n\nv5.7.6 | 2026-04-26T13:59:27.949Z | auto\n\nhuo15-openclaw-enhance v5.7.6\n\n- Bump version to 5.7.6 for maintenance.\n- No user-facing features or breaking changes.\n- Documentation and metadata updated only.\n\nv5.7.5 | 2026-04-26T13:58:10.707Z | auto\n\nNew: Adds skill auto-recommendation based on user queries.\n\n- Introduced skill-recommender: scans local skill directories (incl. multi-agent workspaces), matches by name/description/alias using CJK sliding window and alias boosts, recommends the most relevant installed skills.\n- If no installed skill matches, recommends ClawHub huo15-* skills with install commands, or outputs a planning template for self-building new skills (with frontmatter, triggers, and outline).\n- Algorithm adapted from Claude Desktop’s loadSkills (system prompt injection).\n- Skill recommender is tier=2 (enabled by default on balanced+, not exposed in minimal mode).\n- All previous enhancements (bare pluginApi scan, config-doctor, transcript search, etc.) remain included.\n\nv5.7.4 | 2026-04-26T10:10:38.575Z | auto\n\nv5.7.4（config-doctor 扩展升级）\n\n- config-doctor 现在会自动扫描所有已安装插件的 package.json，检测 bare 格式的 pluginApi（如 \"2026.2.24\"），防止插件因为版本精确匹配导致无法加载。\n- 检查范围包括 ~/.openclaw/extensions/、~/.openclaw/node_modules/@huo15/* 以及无 scope 的 node_modules/* 路径。\n- 命中 bare pluginApi 时，将通过仪表盘和日志发出警告，并生成可直接粘贴的 python3 inline 修复命令。\n- 保持之前的 openclaw.json 关键配置自动检查与修复建议功能。\n- 继承所有 v5.7.3（配置陷阱诊断）、v5.7.2（hardening）等增强能力，无破坏性变更。\n\nv5.7.3 | 2026-04-26T04:28:06.631Z | auto\n\nv5.7.3：主动诊断配置陷阱，防 Context 爆满\n\n- 新增 config-doctor：启动时自动检测 ~/.openclaw/openclaw.json 是否存在 compaction.reserveTokensFloor 缺失、model maxTokens 占 contextWindow 过多等常见配置陷阱，并给出可粘贴的修复命令。\n- 增加 enhance_config_doctor 工具，允许随时手动重跑配置检查。\n- 所有诊断均只读配置文件，不自动修改、不调子进程，符合开箱红线要求。\n- 该诊断功能在 minimal/balanced/full 所有工具层级下均启用。\n\nv5.7.2 | 2026-04-26T00:20:55.137Z | auto\n\nv5.7.2 introduces several hardening upgrades and bug fixes:\n\n- Added LRU caps to in-memory Maps in mode-gate and session-recap modules to prevent memory leaks during long runtimes.\n- Implemented automatic cleanup of safety_log and notifications entries older than 90 days on startup.\n- Introduced tag blacklist for memory corpus (auto-compact, auto-checkpoint, audit, internal)—such entries are now never recalled to the prompt.\n- enhance_memory_store now rejects manual stores containing reserved tags, preventing future noise.\n- Bumped OpenClaw peer dependency to ^2026.4.22 for compatibility.\n\nv5.7.1 | 2026-04-25T19:09:46.306Z | auto\n\nhuo15-openclaw-enhance v5.7.1 — hot-fix update\n\n- Removed the noisy before_compaction memory hook that was inserting unwanted \"auto-compact\" decision records, which previously led to excessive memory pollution.\n- Added a new enhance_memory_purge tool for batch deletion of memories by tag, category, or contentLike, with dry_run mode enabled by default.\n- Now, no new auto-compact noise will be generated after upgrade; existing noise can be cleaned via the new purge tool.\n- Retains all features from v5.7, including transcript-search (streamed JSONL search mimicking Claude Desktop), as well as previous enhancements and bundled skills.\n\nv5.7.0 | 2026-04-25T00:41:24.665Z | auto\n\nhuo15-openclaw-enhance v5.7.0\n\n- 新增 transcript-search 功能，支持超快全文检索历史会话（类 Claude Desktop transcriptSearchWorker 算法，数毫秒扫 30 会话）\n- 新工具 enhance_transcript_search，支持按 query 查询 session 记录；含 agentId/limit/includeReset/caseSensitive 参数\n- transcript-search 模块默认为 balanced/full tools 可见（minimal 不暴露）\n- 其他功能和 v5.6 保持一致，包括工具分层、workflow 合并、记忆协调及各类增强体验\n\nv5.6.0 | 2026-04-25T00:24:19.471Z | auto\n\nhuo15-openclaw-enhance v5.6.0 brings major improvements in tool management and prompt efficiency.\n\n- Added toolTier with minimal/balanced/full levels to expose only needed plugin tools per context, reducing prompt overhead.\n- Merged five workflow-related plugin tools into two (\"enhance_workflow\" and \"enhance_task\") to simplify action dispatching.\n- Significantly compressed all 26 plugin tool descriptions (from ~4610 to ~1750 chars), saving ~1400 tokens per prompt.\n- No changes to bundled skills; core plugin workflow and memory handling remain consistent.\n\nv5.5.1 | 2026-04-24T04:37:36.449Z | auto\n\nhuo15-openclaw-enhance v5.5.1 — Major update introducing multi-layered memory and new development skills\n\n- 新增三层记忆协调（L1 龙虾原生 / L2 enhance 结构化规则 / L3 共享 KB），corpus=kb 桥接至 memory_search\n- 新增 session-recap 自动回顾功能（75 分钟空闲后触发）\n- 捆绑 3 个开发辅助技能：simplify、security-review、code-review\n- 优化 structured-memory 结构及接口\n- 文档与技能描述同步更新\n\nv5.4.0 | 2026-04-23T04:49:01.622Z | user\n\nv5.4.0 — 对齐 2026 Q2 设计能力生态：新增 4 个设计 skill，CLAW_HUB_SKILLS 列表扩到 8 个\n\nv5.3.2 | 2026-04-23T02:42:38.123Z | user\n\nv5.3.2 — 补发 plugin tag；运行时代码未变动（等同 5.3.1 的已移除 child_process 基线）\n\nv5.3.1 | 2026-04-22T23:22:02.498Z | user\n\nv5.3.1: 移除插件运行期外部进程调用（child_process/execSync），企业扫描器友好；新增 enhance_install_skills 工具返回一键安装 CLI 命令；所有 v5.3.0 的五项 Claude Code parity 改进保留\n\nv5.3.0 | 2026-04-22T16:38:57.177Z | user\n\nv5.3.0: 记忆 Why/How-to-apply 两段式、statusline 观测项（模型/思考档/通道）、spawn_task 一键 CLI 派发、ExitPlanMode 审批闭环、搜索 deterministic 排序保持 prompt cache 稳定\n\nv5.2.0 | 2026-04-22T15:48:09.427Z | user\n\nv5.2.0 fix compat range\n\nv5.0.1 | 2026-04-14T04:07:21.297Z | auto\n\n- Update package.json and package-lock.json for version 5.0.1.\n- No changes to SKILL.md or documented features.\n- Dependency metadata updated without impacting functionality.\n\nv5.0.0 | 2026-04-14T04:06:30.271Z | auto\n\nhuo15-openclaw-enhance 5.0.0 introduces significant changes with removed modules and streamlined codebase.\n\n- Removed legacy modules: tips-registry, flame-pet, and spinner-tips for a more focused plugin core.\n- Updated type definitions and main logic for improved maintainability and clarity.\n- Updated metadata and dependency files for compatibility and stability.\n- No user-facing configuration or documentation changes.\n\nv3.0.0 | 2026-04-14T03:02:22.176Z | auto\n\nhuo15-openclaw-enhance 3.0.0\n\n- Significant update inspired by Claude Code design patterns.\n- Adds structured memory system, tool safety guard, prompt enhancement, workflow automation, and a real-time dashboard.\n- Supports multi-agent isolation, especially for WeCom/DingTalk plugins.\n- Introduces four built-in skills: plan-mode, explore-mode, verify-mode, and memory-curator.\n- Provides flexible configuration options in openclaw.json for all enhanced features.\n\nv1.6.0 | 2026-04-11T15:50:38.887Z | auto\n\nhuo15-openclaw-enhance 1.6.0\n\n- 新增结构化记忆系统，按 user/project/feedback/reference/decision 分类存储信息\n- 引入工具安全守卫，支持规则拦截危险工具调用并记录审计日志\n- 优化提示词增强功能，自动注入任务分类、质量指引和记忆上下文\n- 实现基于触发词的工作流自动化，支持行为指令注入\n- 提供增强 Web 仪表盘，实时查看记忆、安全与工作流状态\n- 安装即注入 4 种增强技能：plan-mode, explore-mode, verify-mode, memory-curator\n\nv1.2.6 | 2026-04-11T06:43:42.790Z | auto\n\nhuo15-openclaw-enhance 1.2.6 changelog:\n\n- Updated prompt enhancer configuration: removed \"memoryContext\" from default \"sections\".\n- Bumped NPM package version in documentation.\n- General documentation updates and clarifications in SKILL.md and skill submodules.\n- Minor code improvements across dashboard, memory, prompt, tool safety, and type modules.\n\nv1.2.5 | 2026-04-09T03:45:41.637Z | auto\n\n- No changes detected in this version.\n- Version number updated to 1.2.5; documentation and features remain the same as previous release.\n\nv1.2.4 | 2026-04-09T03:40:01.098Z | auto\n\nVersion 1.2.4\n\n- Added detailed documentation in SKILL.md, including installation, configuration, and core features.\n- Outlined unique plugin features such as structured memory, tool safety guards, enhanced prompts, workflow automation, and a real-time dashboard.\n- Provided clear instructions for skill installation and configuration through OpenClaw’s plugin system.\n- Listed four built-in enhanced skills: plan-mode, explore-mode, verify-mode, and memory-curator.\n- Updated references and links to npm, GitHub, and the official company website.\n\nArchive index:\n\nArchive v6.7.21: 75 files, 453461 bytes\n\nFiles: CHANGELOG.md (218732b), CLAUDE.md (4300b), docs/architecture.md (6010b), docs/decisions/0001-non-invasive-enhancement.md (1164b), docs/decisions/0002-remove-model-router.md (1614b), docs/HANDOVER.md (3906b), docs/lessons/2026-06-25-sdk-2026.6-ts2742-and-fabricated-ops.md (2362b), docs/PRD.md (3666b), docs/SELF_ITERATE.md (19779b), index.ts (21719b), openclaw.plugin.json (18756b), package-lock.json (233848b), package.json (2154b), PLAN.md (4391b), README.md (26361b), scripts/audit-session-bridge-and-share-fallback.sh (11331b), scripts/deploy-2week-followup-launchagent.sh (3287b), scripts/postinstall.cjs (3385b), scripts/release.sh (13507b), scripts/setup.sh (4891b), skill-card.md (3359b), SKILL.md (17300b), src/modules/bot-share-link.ts (37915b), src/modules/bot-upload-link.ts (34837b), src/modules/cc-bridge-dispatch-harness.ts (11352b), src/modules/cc-bridge-keyword-dispatch.ts (12040b), src/modules/cc-bridge-pre-fetch.ts (8089b), src/modules/cc-bridge-prompt.ts (6591b), src/modules/chapter-marks.ts (3749b), src/modules/config-doctor.ts (29508b), src/modules/context-watchdog.ts (70192b), src/modules/dashboard.ts (43193b), src/modules/hook-profiler.ts (14996b), src/modules/kb-corpus.ts (10003b), src/modules/large-file-bridge.ts (17487b), src/modules/memory-integrator.ts (14716b), src/modules/mode-gate.ts (12070b), src/modules/native-memory-surfacer.ts (11372b), src/modules/notification-queue.ts (1184b), src/modules/prompt-enhancer.ts (2185b), src/modules/scheduled-tasks-bridge.ts (7070b), src/modules/self-check.ts (4363b), src/modules/session-bridge.ts (15610b), src/modules/session-doctor.ts (9339b), src/modules/session-lifecycle.ts (12717b), src/modules/session-recap.ts (8339b), src/modules/skill-doctor.ts (5029b), src/modules/skill-installer.ts (4046b), src/modules/skill-recommender.ts (19399b), src/modules/spawn-task.ts (5333b), src/modules/statusline.ts (7994b), src/modules/structured-memory.ts (11050b), src/modules/task-planner.ts (12199b), src/modules/todo-tracker.ts (6258b), src/modules/tool-safety.ts (15671b), src/modules/trajectory-archiver.ts (13591b), src/modules/transcript-search.ts (10389b), src/modules/workflow-hooks.ts (19219b), src/types.ts (24141b), src/utils/channel-detect.ts (1764b), src/utils/ctx-usage-db.ts (6838b), src/utils/ensure-sqlite.ts (4063b), src/utils/hook-profile-db.ts (8868b), src/utils/http-route-bridge.ts (3489b), src/utils/latency-tracker.ts (10459b), src/utils/model-route-config.ts (8695b), src/utils/profile-hook.ts (2219b), src/utils/resolve-home.ts (871b), src/utils/route-history.ts (4034b), src/utils/safe-api-wrapper.ts (2729b), src/utils/sqlite-store.ts (27532b), templates/AGENTS.enhance-patch.md (1286b), templates/SOUL.enhance-patch.md (987b), tsconfig.json (347b), _meta.json (142b)\n\nFile v6.7.21:SKILL.md\n\n---\nname: huo15-huo15-openclaw-enhance\ndescription: \"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injectedSessions 有 entry + body 不含 URL → 强制 appendText 链接。修法：(1) entry 加 replyAppendUsed 标记,每次 inject 兜底只 fire 一次；(2) prompt 加『用户上传后处理流程』,明确 LLM 看到『传完了』必须 enhance_upload_check({token}) → Read → 处理任务,严禁再发链接 / 反问 / 全盘扫。Use when: 给 OpenClaw 加非侵入式增强（不改龙虾核心、不复制原生功能）。\"\nversion: 6.7.13\nhomepage: https://cnb.cool/huo15/ai/huo15-openclaw-enhance\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"requires\": { \"bins\": [] } } }\n---\n\n# 火一五·克劳德·龙虾增强插件 v5.7.8\n\n## 简介\n\n`@huo15/openclaw-enhance` 是 **OpenClaw 2026.4.24+** 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验。\n\n**核心原则**：凡是龙虾原生有的功能一律不复制，重叠处以龙虾为准；只补龙虾没有的 Claude-Code 体验。\n\n## v5.7.8 全面适配 openclaw 2026.4.24（2026-04-26 同日）\n\n跑完整 SOP 第 1+2 步发现 openclaw 4.24 的 `api.on` 是**完全 typed**（`<K extends PluginHookName>(hookName: K, handler: PluginHookHandlerMap[K])`），enhance 之前 14 处 `api.on(...as any)` 都能去掉 cast。这是真正的\"全面适配\"——不是简单升 peerDep，而是让 enhance 利用 SDK 的全部类型信息。\n\n| 维度 | v5.7.7 | v5.7.8 |\n|---|---|---|\n| `peerDependencies.openclaw` | `^2026.4.22` | **`^2026.4.24`** |\n| `build.openclawVersion` | `2026.4.11`（落后 13 patch）| **`2026.4.24`** |\n| `compat.pluginApi` | `>=2026.4.11` | **`>=2026.4.24`** |\n| `api.on(...as any)` 使用次数 | 14 处 | **0 处** |\n| `(event: any, ctx: any)` 使用次数 | 5 处 | **0 处** |\n| `(ctx as any)?.agentId` 模式（hook 内部）| 9 处 | **0 处**（仅余 4 处 helper 函数内部，工具 ctx 用） |\n| typecheck 错误数 | 0 | **0** |\n| openclaw.plugin.json 顶层字段 | 5 | **8**（加 `enabledByDefault` / `uiHints` / `activation`）|\n\n### 隐藏 bug 修复\n\n去掉 `as any` 后 typecheck 暴露 **self-check.ts 长期被屏蔽的类型不匹配**：之前 `return {};` 试图返回 `PluginHookBeforeAgentReplyResult`，但该类型 `handled: boolean` 是必填的——空对象不合规。修法：所有\"不接管\"分支改成 `return;`（void），仅\"阻断空回复\"分支返回 `{ handled: true, reply: ..., reason: ... }`。\n\n### 不破坏 openclaw 原生\n\n- 所有 hook handler **return undefined（void）** — 不返回 `{block, prependContext}` 等控制信号时 → enhance 仅观察+附加，绝不改变 openclaw 决策\n- typed hook handler 实际行为跟 untyped 完全一致 — 只是 TS 编译期能 narrow 类型，运行时无差异\n- manifest 新加的 `enabledByDefault` / `uiHints` / `activation` 都是 openclaw 4.x 已有字段，不引入新依赖\n\n## v5.7.7 session-lifecycle（2026-04-26 同日，跑完整 gap 调研后落地）\n\n**调研依据**：跑了一次完整 SOP 第 1+2 步（Claude Code 官方 hooks 文档 + 反编译 Claude.app + openclaw 4.22 SDK）。发现 **openclaw 4.22 暴露 29 个 hook，enhance 之前只用 4 个**。落地最高 ROI 的 5 个 hook 闭环 session 生命周期：\n\n| Hook | enhance 行为 | 落地表 |\n|---|---|---|\n| `session_start` | idle > 30min 时插入\"🚀 会话开始/续启\"章节占位 | `chapters` |\n| `session_end` | 加\"🏁 会话结束\"章节 + flush in_progress todo 到 project memory（tag=session-flush, importance=4） | `chapters` + `memories` |\n| `before_reset` | reset 前最后机会抢救最近 3 章节 + 全部未完成 todo 到 decision memory（tag=reset-rescue, importance=6）+ 推 notification | `memories` |\n| `subagent_spawned` | 派生子 agent 时加\"🤖 派生子 agent: X\"章节 | `chapters` |\n| `subagent_ended` | 子 agent 结束加\"✅/❌ 子 agent 结束: X\"章节 | `chapters` |\n\n**防 noise factory 三层防御**（吸收 v5.7.1 教训）：30 秒 dedup + 低 importance + 专用 tag（不进黑名单，用户下次会想恢复）。\n\n## v5.7.5 skill-recommender（2026-04-26 同日）\n\n**用户反馈**：\"新增自动根据用户的需求自动挑选已经安装的技能，如果没有技能就把规划方案给出来。看看 Claude 是如何做的\"\n\n**调研**：反编译 `/Applications/Claude.app/Contents/Resources/app.asar`，发现 Claude 的 skill auto-discovery **本质是把所有 skill 的 name+description 拼成 `\"Available skills: ${list}.\"` 注入到 specialist agent 的 system prompt** —— 没有复杂算法，让 LLM 自己挑。\n\n**enhance 改造**：照搬 name+description 匹配思路，但**改成按需工具**避免每轮 prompt 占 schema。新增模块 `skill-recommender` + 工具 `enhance_skill_recommend(query, limit?, includeUninstalled?, includePlanning?)`：\n\n1. **启动期扫多路径**（WeCom / DingTalk 多 agent 场景关键）：\n   - `~/.openclaw/skills/`\n   - `~/.openclaw/workspace/skills/`\n   - `~/.openclaw/workspace-*/skills/` ← **WeCom 多 agent 动态 workspace**（一开始漏扫，烟测才发现）\n   - `~/.openclaw/agents/*/skills/`\n   - `<cwd>/.claude/skills/`、`~/.claude/skills/`\n   - 实测用户机器扫到 56 个 skill 跨 27 个路径\n2. **解析 SKILL.md frontmatter**（轻量正则，无 yaml 依赖）：name + description + aliases\n3. **CJK 双字滑窗 + alias 强 boost** 评分：\n   - JS `\\w` 不含中日韩，直接 split `\\s\\W` 会让\"代码简化\"分成空数组\n   - 解决：CJK 连续段当整体 phrase + 长 ≥4 时滑动 2-grams\n   - alias 的 token 严格命中（如 \"规划\" === alias \"规划\"）→ 保底 0.7 分\n4. **三段式输出**：\n   - 🎯 已装 skill（命中 ≥ threshold=0.25）+ 召唤建议\n   - 📦 ClawHub 上未装的 huo15-* 候选（含 `openclaw skills install` 命令）\n   - 🛠️ 都没合适 → **自建 skill 规划**：建议 slug + frontmatter 模板 + 触发关键词 + 内容大纲 + **红线 #3 提醒**（必须先 ClawHub publish 再让 enhance 引用 slug，插件不内嵌 skill 内容）\n\n**实测**：\n\n| 查询 | 命中 | 分数 |\n|---|---|---|\n| \"帮我 review 这个 PR\" | huo15-openclaw-code-review | 0.60 |\n| \"设计一个 Web UI 原型\" | huo15-openclaw-frontend-design | 0.94 |\n| \"代码简化\" | huo15-openclaw-simplify | 1.00 |\n| \"做安全审查\" | huo15-openclaw-security-review | 0.96 |\n| \"规划这个任务\" | huo15-openclaw-plan-mode | 0.70（alias exact 命中保底）|\n\n模块 `tier=2`（balanced 默认启用，minimal 不暴露 — 用户多半已知道用什么 skill）。\n\n## v5.7.4 config-doctor 扩展：扫已装插件 bare pluginApi（2026-04-26 同日）\n\n**用户反馈**：\"提示插件要求 2026.2.24，但是我的 openclaw 已经是 2026.4.22\"\n\n**根因**：openclaw plugin compat 规则要求 `compat.pluginApi` 必须是 ranged spec（`>=X.Y.Z` / `^X.Y.Z` / `~X.Y.Z`）。**bare 字符串（如 `\"2026.2.24\"` 没前缀）= 精确匹配**，与当前 openclaw 不匹配时启动失败。用户实测：\n\n- `~/.openclaw/extensions/tips/package.json` v1.0.0 → `pluginApi: \"2026.4.11\"` ❌\n- `~/.openclaw/node_modules/@huo15/huo15-huihuoyun-odoo/package.json` v1.2.0（npm peerDep 残留）→ `pluginApi: \"2026.2.24\"` ❌\n\n**新增**：`config-doctor` 启动期扫描 `~/.openclaw/extensions/*` + `~/.openclaw/node_modules/@huo15/*` + 无 scope 的 `node_modules/*`，对每个声明 `openclaw.extensions` 的包检查 `compat.pluginApi`。bare 命中 → 推仪表盘 + log warn + 给可粘贴 fix 命令。\n\n```\n⚠️ [plugin-bare-pluginApi] 已装插件 @huo15/wecom-tips 的 openclaw.compat.pluginApi=\"2026.4.11\" 是 bare 版本，会被解读为精确匹配...\n   → 修复: python3 -c \"...\"（一行 inline）\n```\n\n## v5.7.3 config-doctor（2026-04-26 同日）\n\n直击用户高频反馈\"装上插件还是 'Context limit exceeded'\" — 根因往往不在插件，而在 `~/.openclaw/openclaw.json` 的两处陷阱：\n\n1. **缺失 `agents.defaults.compaction.reserveTokensFloor`** — openclaw 4.22 把这个字段嵌套到 `agents.defaults` 里（4.11 时是顶层 `compaction`），老用户配置文件没自动迁移，用 4.22 默认值（很小）→ 长 session 必爆\n2. **某个 model 的 `maxTokens` 占 `contextWindow` 一半以上** — 例如 MiniMax-M2.7 默认 maxTokens=131072 / contextWindow=204800，每轮预留输出就吃掉 64% budget。openclaw 把 maxTokens 当作\"必须留给输出的 reserve\"，剩 73k 给 input/tools/memory，**任意几轮就爆**\n\n### 新增\n\n- **`src/modules/config-doctor.ts`** — 启动期 sync 读 openclaw.json 检查上述两类陷阱，发现后用 `notifyQueue.emit(\"config-doctor\", ...)` 推到仪表盘 + log warn + 给可粘贴的 fix 命令（python3 一行原地改 JSON，**不调 child_process**）\n- **工具：`enhance_config_doctor`** — 无参数，agent / 用户随时调一下，重新跑诊断（修完了配置可以再跑确认 ✅）\n- **配置项：`config.configDoctor`** — `enabled` / `minReserveTokensFloor`（默认 5000）/ `maxReserveTokensFloor`（默认 100000）/ `maxModelMaxTokens`（默认 32000）\n\n### 红线遵守\n\n- **完全只读** ~/.openclaw/openclaw.json（红线 #1：不侵入式修改 openclaw）\n- **不调 child_process**（红线 #4） — 修复命令是 python3 inline，由用户/cron-cli 执行\n- **不暴露在 minimal 之外**？反过来：**tier=1 minimal 也启用** — 这是关键的\"防爆 context\"诊断，每个用户都该有\n\n## v5.7.2 hardening（2026-04-26 同日）\n\n继 v5.7.1 hot-fix 之后，对全代码库做了一次审计，修复 4 类潜在 bug：\n\n- **进程内 Map LRU 上限** — `mode-gate` 的 `modeState` / `plannedActions` 和 `session-recap` 的 `lastRecapAt` 之前 keyed by `agentId::sessionId` **跨 session 永不清**。WeCom 多用户场景下 100+ session 会无限累积。现在加 200/200/500 三档 LRU cap，活跃 session 重新插入刷新顺序，老 session 自动淘汰\n- **safety_log / notifications 启动期 TTL** — `getDb()` 时跑一次 `DELETE WHERE created_at < datetime('now', '-90 days')`，避免长期运行库无限增长。新增 `purgeOldSafetyLogs(retentionDays)` helper 给运维调\n- **memory corpus tag 黑名单** — `auto-compact` / `auto-checkpoint` / `audit` / `internal` 这 4 个保留 tag 在 `scoreRelevance()` 入口直接 return 0，永不召回到 prompt（防御未来 hook 万一又写入 noise）\n- **enhance_memory_store 拒收保留 tag** — 用户/agent 显式调 store 时若 tags 含保留词，立即返回错误而非写入\n\n### bump openclaw peerDep `^2026.4.22`\n\n之前 peerDep `>=2026.4.11`，但 npm global 已升到 2026.4.22（差 11 个 patch）。本地 SDK 类型定义同步升级；hook 名验证全部仍存在（`before_prompt_build` / `before_tool_call` / `after_tool_call` / `before_compaction` / `before_agent_reply`），无破坏性变更。\n\n## v5.7.1 hot-fix（2026-04-26）\n\n- **删除 `before_compaction` 噪音 hook** — 之前每次 openclaw auto-compact 都会以 `decision` 类、`auto-compact` tag 写入一条「[auto-compact] 对话上下文已压缩…」记忆。实测单 agent 24 小时积累 613 条全是噪音，关键词命中率虚高 0.4-0.5（过 corpus pruner 默认 0.5 阈值），把真正的 user/project/feedback 决策记忆挤出 prompt 上下文\n- **新增工具 `enhance_memory_purge`** — 按 `tag` / `category` / `contentLike` 批量清理当前 agent 记忆，`dry_run` 默认 true（仅预览匹配数）。一键清理历史噪音：`enhance_memory_purge tag=\"auto-compact\" dry_run=false`\n- **首次启动自动迁移**：升级到 5.7.1 后即不再生成新噪音；旧噪音留待用户用 purge 工具或直接 SQL 清\n\n## v5.7 新特性（2026-04-25）\n\n- **历史会话搜索（transcript-search）** — 照搬 Claude Desktop `transcriptSearchWorker` 算法（解包 `/Applications/Claude.app/Contents/Resources/app.asar` 抽出参考实现）：\n  - 流式扫 `~/.openclaw/agents/<agentId>/sessions/*.jsonl`，行级 JSON.parse\n  - `extractText` 兼容 `string` / `[{type:\"text\", text}]` 数组\n  - `indexOf` 子串匹配 + ±80 字符 snippet\n  - 79 个 session 中扫 30 个 → 3–5 ms 找到 5 个 hits（实测）\n  - 完全只读、不建索引、不建表 — 不动 openclaw 任何东西\n- **工具：`enhance_transcript_search`** — `query` 必填；可选 `agentId / limit / includeReset / caseSensitive`\n- 模块 tier=2，默认 balanced/full 即可见（minimal 下不暴露）\n\n## v5.6 新特性（2026-04-24）\n\n- **工具分层（toolTier）** — 按 minimal/balanced/full 三档暴露工具 schema，降低每轮 prompt 固定底座（解决长会话 context 提早爆满）\n  - `minimal`（10 工具）：仅核心层 — 记忆 / 状态栏 / spawn / 模式 / 章节 / installer / integrator\n  - `balanced`（18 工具，默认）：+ todo / 章节 / 定时任务桥\n  - `full`（26 工具）：+ workflow / safety / task-planner / session-recap / skill-doctor\n- **Workflow 5→2 工具合并** — `enhance_workflow_define / _list / _delete / _tasks / enhance_task` 合并为 `enhance_workflow`（action=define/list/delete/tasks）+ `enhance_task`（保留独立 action 派发器）\n- **工具描述全面压缩** — 26 个工具描述从 ~4610 字符 → ~1750 字符（-62%），每轮 prompt 节省约 1400 token，prompt cache 更稳\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/openclaw-enhance\nopenclaw restart\n```\n\n安装后访问仪表盘：`http://localhost:18789/plugins/enhance/`\n\n## 核心能力\n\n- **分类记忆（corpus supplement + 两段式）** — user / project / feedback / reference / decision 五类，额外支持 `why`（背景/约束）和 `howToApply`（套用时机），对齐 Claude Code feedback/project 记忆体例；通过 `registerMemoryCorpusSupplement` 合入龙虾原生 memory 搜索，**不自建第二套向量库**；搜索结果 deterministic 排序（score → importance → updated → id）保持 prompt cache 稳定\n- **工具安全观察员** — 只分类错误 + 建议退避，完全尊重龙虾 `tools.allow/deny`\n- **任务 / 章节 / 模式闸门 + ExitPlanMode** — TodoWrite / mark_chapter / plan-explore 模式；`enhance_exit_plan_mode` 在 plan 模式下提交计划给用户审批，自动把计划期间被拦截的写入意图打包成 decision 记忆\n- **状态栏（含可观测性）** — `enhance_statusline` 额外展示当前模型、思考档、fast 模式、消息通道、会话 ID；HTTP 端点 `/plugins/enhance/api/statusline` 输出 JSON 供仪表盘嵌入\n- **技能巡检 / 子任务一键派发** — `enhance_spawn_task` 返回可直接粘贴到终端的 `openclaw agent` CLI 命令，支持跨 agent 派发和思考档选择\n- **定时任务桥** — 登记定时工作流时返回一条 `openclaw cron add` 命令；**调度归龙虾 cron-cli**，插件只管触发时注入 instructions\n- **多 Agent 隔离** — 完美适配 WeCom 插件的动态 Agent，记忆/任务/章节/宠物全部按 `agentId` 隔离\n- **增强仪表盘** — 小火苗宠物 + 记忆/任务/章节/定时全景\n\n## 与龙虾原生的关系\n\n| 能力 | 龙虾原生 | enhance 策略 |\n|------|---------|--------------|\n| 记忆向量库 | ✅ 龙虾负责 | 不复制，改为 corpus supplement 并入搜索 |\n| 工具 allow/deny | ✅ 龙虾负责 | 只观察，不拦截 |\n| Cron 调度 | ✅ 龙虾 cron-cli | 不管理调度，只在触发时注入上下文 |\n| 技能安装 | ✅ ClawHub | 只读巡检，不擅自安装 |\n\n## 增强技能（自动注入 `workspace/skills/`）\n\n**工作流模式（4 个）**\n\n- `huo15-openclaw-plan-mode` — 结构化规划模式\n- `huo15-openclaw-explore-mode` — 深度探索模式\n- `huo15-openclaw-verify-mode` — 验证检查模式\n- `huo15-openclaw-memory-curator` — 记忆整理\n\n**设计能力（v5.4 新增，对标 Anthropic frontend-design + huashu-design 生态）**\n\n- `huo15-openclaw-frontend-design` — 高保真 Web UI 原型 + 5 美学流派 + 反 AI Slop 硬红线\n- `huo15-openclaw-design-director` — 设计方向顾问（3 方向反差对比 + 强制推荐）\n- `huo15-openclaw-brand-protocol` — 品牌规范抓取（Ask/Search/Download/Verify/Codify 5 步）\n- `huo15-openclaw-design-critique` — 5 维设计评审（美学/可用性/品牌/内容/实现）\n\n**开发辅助（v5.5.1 新增，对标 Claude Code /simplify / /security-review / /review）**\n\n- `huo15-openclaw-simplify` — 代码简化三维审查（复用/质量/效率）+ 分级修复清单\n- `huo15-openclaw-security-review` — 六类漏洞矩阵（密钥/注入/XSS/SSRF/权限/依赖）+ CVSS 分级\n- `huo15-openclaw-code-review` — PR 五维综合评审（设计/实现/测试/安全/可维护）+ 可粘贴评论\n\n详见 [README.md](./README.md) 与 [CHANGELOG.md](./CHANGELOG.md)。\n\n## 链接\n\n- npm: https://www.npmjs.com/package/@huo15/openclaw-enhance\n- 仓库: https://cnb.cool/huo15/ai/huo15-openclaw-enhance\n- License: MIT\n- 公司: 青岛火一五信息科技有限公司 — www.huo15.com\n\nFile v6.7.21: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\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**火一五·克劳德·龙虾增强插件 v6.0.0** 是 [OpenClaw 2026.4.24+](https://github.com/openclaw/openclaw) 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验 + 设计能力套件 + 开发辅助套件；**所有能力重叠处都以龙虾为准**，绝不复制或覆盖龙虾原生功能。\n\n完全通过公共 Plugin SDK 实现，**不修改任何核心代码**，一键安装即可使用。\n（非龙虾团队开发）\n\n### v6.0.0 npm 包改名 + ClawHub 重新注册（2026-05-02）\n\n> **BREAKING（npm 包名）**：`@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`\n\n老 npm 包对应的 ClawHub slug `huo15-openclaw-enhance` 上有 ghost manifest 死结——1.3.0-5.1.0 期间 27 个版本 pluginApi=bare `2026.2.24`（早于本仓 §6.1 红线\"compat.pluginApi 必须 ranged\"修复），ClawHub plugin entry record 在那段历史首次注册时缓存了 bare 值，后续 publish 不刷新 record 字段，OpenClaw 走 `clawhub:` 协议解析时永远拿到老 manifest 报 `requires plugin API 2026.2.24`。\n\n**修复**：换 npm 包名（与 `huo15-huihuoyun-odoo` 等 huo15-* 命名规范对齐）+ 新 ClawHub slug `huo15-huo15-openclaw-enhance`，让 ClawHub 重新创建一个干净的 plugin entry。OpenClaw plugin id 仍是 `enhance`，老用户配置不需迁移。详见 [CHANGELOG.md](./CHANGELOG.md) v6.0.0 段。\n\n老 npm 包已 deprecate；老 ClawHub slug 已 hide。已装老版本用户跑[迁移命令](#老版本用户迁移v5x--v600)即可。\n\n### v5.7.24 BOT 文件分享 URL 改成独立兄弟 prefix（2026-05-01）\n\nURL 从 v5.7.23 的 `/plugins/enhance/share/...`（dashboard 子路径，靠 bridge dispatch）改成 v5.7.24 的 `/plugins/enhance-share/...`（独立 SDK prefix route，不依赖 dashboard）。\n\n| 维度 | v5.7.23 | v5.7.24 |\n|---|---|---|\n| URL | `https://<域>/plugins/enhance/share/<token>-...` | `https://<域>/plugins/enhance-share/<token>-...` |\n| 路由实现 | dashboard handler 顶部 `tryHandleSubRoute` 转给 bridge 注册的 share handler | bot-share-link 自己 `api.registerHttpRoute({ path: \"/plugins/enhance-share\", ... })` |\n| dashboard.ts 改动 | +3 行（dispatch + detect） | 1 行（detect only），跟 v5.7.22 同 |\n| bridge 复杂度 | 102 行 | 76 行（去掉 dispatch 相关） |\n\n**SDK overlap 规则**：`prefixMatchPath` 用的是 `startsWith(\\`${prefix}/\\`)`，分隔必须是 `/`。所以 `/plugins/enhance-share` ≠ `/plugins/enhance` 的子前缀（中间是 `-`），SDK 不会拒绝。\n\n**baseUrl 自动检测仍 zero-config**：dashboard handler + share handler 都调 `detectBaseUrlFromRequest(req)` 抓 host，访问过任一即缓存。\n\n### v5.7.23 BOT 文件分享桥升级 zero-config（2026-05-01）\n\n复用 dashboard 已经在跑的 `/plugins/enhance` prefix route，通过新增的 [http-route-bridge](src/utils/http-route-bridge.ts) 子分发到 `/plugins/enhance/share/<token>-<filename>`。**v5.7.24 已替换为独立兄弟 prefix 方案，不再 dispatch。**\n\n### v5.7.22 BOT 文件分享桥：企微/钉钉大文件兜底（2026-05-01）\n\n**用户痛点**：播客生成 90MB mp3，企微插件直接传不了；钉钉同样卡死大文件。需要把本地文件投到一个目录、返回临时下载 URL 给用户自取。\n\n**三个工具**（tier=1，全分层都暴露）：\n\n| 工具 | 作用 |\n|---|---|\n| `enhance_share_file(filePath, label?, expireHours?, copyMode?)` | 把本地文件投递到 `<shareRoot>/files/<token>-<basename>`，返回临时 URL（默认 24h 过期） |\n| `enhance_share_list()` | 列当前活跃分享 + 顺手清过期 |\n| `enhance_share_revoke(token \\| filename)` | 立刻撤销（删本地文件 + manifest 条目） |\n\n**安全闸门**：路径黑名单（`/.ssh/ /.aws/ /.gnupg/ /etc/` 等不让分享）、绝对路径校验、`..` 防 traversal、500MB 大小上限、12 hex token 不可枚举遍历、HTTP handler 内 filename 防越界（不能含 `/ \\\\ ..`）。**零 child_process**（fs.copyFileSync），lazy cleanup（不在 register 期跑后台任务）。\n\n> ⚠️ **v6.7.19 起已移除 model-router（自动切换模型）**。下面 v5.7.x 的 model-router 章节仅作历史保留——当前版本不再按任务/配额自动切换模型，模型选择交回龙虾原生 / 用户配置；仅 context-watchdog 在上下文逼近上限时保留「超限保护切换」。\n\n### v5.7.12 model-router: 速度+精度+覆盖率三重增强（2026-05-01）\n\n**1. 响应速度**：路由决策缓存（TTL 30s）、极短 prompt 短路（<50 字符直走 M2.7）、`getBestModel` 结果缓存\n\n**2. 任务识别精度**：超长 prompt（>2000 字符）→ 直接 pro；写作/摘要按长度分叉（短→flash，长→pro）；中文关键词专项优化\n\n**3. 新增 12 类任务识别**：翻译/写作/数据分析/debug/情绪/数学/摘要/检索/闲聊/报告/多步骤/快速问答\n\n### v5.7.11 model-router: 修复 WeCom 图片路由到 MiniMax-VL-01（2026-04-30）\n\n**用户反馈**：\"图片路由到 M2.7 报 content empty，M2.7 是 text-only 模型不支持图片\"\n\n问题根因：`detectPromptInlineMedia` 只检测 `[image]` 和 `[media attached` 标记，但 WeCom 图片到达时 prompt 里只有文件路径（`~/.openclaw/media/inbound/xxx.png`），没有这些标记，导致图片检测失败，一直路由到 text-only 的 M2.7。\n\n修复：在 `detectPromptInlineMedia` 中新增 WeCom 媒体路径格式检测——任何包含 `~/.openclaw/media/inbound/*.png|jpg|jpeg|gif|webp|bmp` 的 prompt 都会被识别为图片，自动路由到 `MiniMax-VL-01`（vision 模型）。\n\n| 场景 | 修复前 | 修复后 |\n|---|---|---|\n| WeCom 发图片 | 路由到 M2.7 → API 报 content empty | 路由到 VL-01 → 正常识别 |\n\n### v5.7.8 全面适配 openclaw 2026.4.24（2026-04-26 同日）\n\n| 维度 | 改动 |\n|---|---|\n| `peerDependencies.openclaw` | `^2026.4.22` → **`^2026.4.24`** |\n| `build.openclawVersion` | `2026.4.11` → **`2026.4.24`** |\n| `compat.pluginApi` | `>=2026.4.11` → **`>=2026.4.24`** |\n| `api.on(...as any)` 14 处 → **0 处** | 全部改成 typed hook，让 SDK PluginHookHandlerMap[K] 自动推断 event/ctx |\n| `(event: any, ctx: any)` 5 处 → **0 处** | 同上 |\n| `openclaw.plugin.json` 加 3 字段 | `enabledByDefault: true` / `uiHints` / `activation.onAgentHarnesses` |\n| 修隐藏 bug | self-check.ts 的 `PluginHookBeforeAgentReplyResult.handled` 必填问题之前被 `as any` 屏蔽，现在 typecheck 强制修对 |\n\n### v5.7.7 session-lifecycle：接入 openclaw 4.22 五个 hook 闭环 session 生命周期（2026-04-26 同日）\n\n跑了完整 SOP 第 1+2 步后发现 **openclaw 4.22 暴露 29 个 hook，enhance 只用了 4 个**。落地最高 ROI 的 5 个 hook：\n\n| Hook | 行为 |\n|---|---|\n| `session_start` | idle > 30min 时插入\"🚀 会话开始/续启\"章节占位 |\n| `session_end` | 加\"🏁 会话结束\"章节 + flush in_progress todo 到 project memory |\n| `before_reset` | reset 前抢救最近 3 章节 + 全部未完成 todo 到 decision memory + 推 notification |\n| `subagent_spawned` / `subagent_ended` | 派生/结束自动落 chapter（跟 enhance_spawn_task 闭环）|\n\n防 noise factory 三层防御：30 秒 dedup + 低 importance + 专用 tag（吸收 v5.7.1 教训）。\n\n### v5.7.5 skill-recommender：按需求挑 skill / 推荐未装 / 给自建规划（2026-04-26 同日）\n\n调研：反编译 Claude Desktop 发现 skill auto-discovery 本质是 `\"Available skills: ${list}.\"` 注入到 system prompt。enhance 改成**按需工具**避免每轮 prompt 占 schema：\n\n工具 `enhance_skill_recommend(query, ...)` 三段式输出：\n\n| 段 | 内容 | 触发条件 |\n|---|---|---|\n| 🎯 已装 skill | 按相关度排序 + 召唤建议 | 命中 ≥ threshold |\n| 📦 ClawHub 未装候选 | 11 个 huo15-* + `openclaw skills install <slug>` | 默认包含 |\n| 🛠️ 自建规划 | slug + frontmatter 模板 + 触发词 + 内容大纲 + 红线 #3 提醒 | 已装命中 < threshold |\n\n实测精度：\n\n| 查询 | 命中 | 分数 |\n|---|---|---|\n| \"帮我 review 这个 PR\" | huo15-openclaw-code-review | 0.60 |\n| \"代码简化\" | huo15-openclaw-simplify | 1.00 |\n| \"做安全审查\" | huo15-openclaw-security-review | 0.96 |\n\n关键修复：扫 `~/.openclaw/workspace-*/skills/`（WeCom 多 agent 隔离的子工作区）— 用户机器实测扫到 **56 个 skill 跨 27 个路径**。\n\n### v5.7.4 config-doctor 扩展：扫已装插件 bare pluginApi（2026-04-26 同日）\n\n用户反馈：\"提示插件要求 2026.2.24，但是我的 openclaw 已经是 2026.4.22\" — 这是**其它插件**的 `compat.pluginApi` 写成 bare 字符串（精确匹配）导致 openclaw 启动失败。enhance 主动扫所有装的 plugin package.json，检测违规并给 fix 命令。\n\n实测命中：\n- `~/.openclaw/extensions/tips/package.json` v1.0.0 → `pluginApi: \"2026.4.11\"`（bare）\n- `~/.openclaw/node_modules/@huo15/huo15-huihuoyun-odoo/package.json` v1.2.0 → `pluginApi: \"2026.2.24\"`（bare）\n\n### v5.7.3 config-doctor（2026-04-26 同日，继 v5.7.2）\n\n直击高频反馈\"装上插件还是 'Context limit exceeded'\"。**这不是 enhance 的锅**，是 openclaw 自身配置陷阱：\n\n- **缺失 `agents.defaults.compaction.reserveTokensFloor`** — openclaw 4.22 把字段从顶层 `compaction.*` 挪到嵌套路径，老用户配置文件没自动迁移 → 用 4.22 默认值（很小） → 长 session 必爆\n- **某 model maxTokens ≥ contextWindow/2** — 例如 MiniMax-M2.7 默认 maxTokens=131072 / contextWindow=204800，每轮预留输出吃 64% budget → 剩 73k 给 input/tools/memory/history 几轮必爆\n\n**新增 `enhance_config_doctor` 模块（tier=1，minimal 也启用）**：\n\n- 启动期 sync 读 `~/.openclaw/openclaw.json` 检查上述两类陷阱\n- 发现问题：log warn + 推仪表盘通知 + 给可粘贴 fix 命令（python3 inline JSON 改写，**不调 child_process**，**不擅自改用户配置**）\n- 工具 `enhance_config_doctor` 按需重检（修完用来确认 ✅）\n\n### v5.7.2 hardening（2026-04-26 同日，继 v5.7.1）\n\n对全代码库做了一次审计，修 4 类潜在 bug + 升 peerDep `^2026.4.22`：\n\n- **进程内 Map LRU 上限** — `mode-gate` / `session-recap` 之前跨 session 永不清，多 agent 场景会泄漏；现在加 200/200/500 三档 cap + FIFO 淘汰\n- **safety_log / notifications 启动期 TTL** — `getDb()` 自动清 90 天前旧记录\n- **memory corpus tag 黑名单** — `auto-compact / auto-checkpoint / audit / internal` 永不召回，防御未来 noise hook\n- **enhance_memory_store 拒收保留 tag** — 用户/agent 显式滥用保留词时立即报错\n\n### v5.7.1 hot-fix（2026-04-26）\n\n**修：删除把每次 auto-compact 事件作为 decision 类记忆插入的 `before_compaction` hook。**\n\n- 之前实测单 agent 24h 积累 **613 条全为噪音**（tag=auto-compact），关键词命中率 0.43-0.51 普遍过 0.5 阈值，把真正的决策记忆挤出 prompt 上下文\n- 新增工具 `enhance_memory_purge` — 按 `tag` / `category` / `contentLike` 批量清理，`dry_run` 默认 true（仅预览匹配数）\n- 历史噪音清理一行：`enhance_memory_purge tag=\"auto-compact\" dry_run=false`，或 `sqlite3 ~/.openclaw/memory/enhance-memory.sqlite \"DELETE FROM memories WHERE tags LIKE '%auto-compact%'; VACUUM;\"`\n\n### v5.7 新特性（2026-04-25）\n\n**📜 历史会话搜索 — 照搬 Claude Desktop 实现**\n\n> 反编译参考 `/Applications/Claude.app/Contents/Resources/app.asar` 里的 `transcriptSearchWorker.js`（94 行官方实现）— 发现 Claude Desktop 不用 SQL FTS5，纯流式扫 JSONL + indexOf。直接搬到 openclaw 的 `~/.openclaw/agents/<agent>/sessions/*.jsonl`。\n\n| 工具 | 用途 | 实测性能 |\n|------|------|---------|\n| `enhance_transcript_search` | 全文搜历史会话，找『我上次怎么做的』 | 79 个 session 中扫 30 个 → **3-5 ms** 找到 5 hits |\n\n参数：`query` 必填；可选 `agentId / limit (1-50) / includeReset / caseSensitive`。\n\n模块 `tier=2`（balanced/full 默认启用，minimal 下不暴露）。\n\n### v5.6 新特性（2026-04-24）\n\n**针对 long session 提早爆 context 的容量优化**\n\n| 配置项 | 暴露工具数 (v5.7) | 适用场景 |\n|--------|-----------|---------|\n| `toolTier: \"minimal\"` | 10 | 上下文极紧 / 最小核心模式（记忆、状态栏、章节、模式、spawn） |\n| `toolTier: \"balanced\"` *(默认)* | 19 | 多数日常会话 — 加 todo / 章节标记 / 定时任务桥 / **transcript-search** |\n| `toolTier: \"full\"` | 27 | 需要工作流自动化 / safety / session-recap / skill-doctor 时 |\n\n- **工具分层（toolTier）** — 按需暴露 schema，每轮 prompt 减负\n- **Workflow 5→2 工具合并** — 用 `action=` 派发器收敛同类操作\n- **26 个工具描述压缩 -62%** — 每轮 prompt 节省约 1400 token\n\n> ⚠️ 如果你的 `~/.openclaw/openclaw.json` 中 `compaction.reserveTokensFloor` ≥ 100000，请改回 **20000**（>205k 总窗会让每次压缩都失败）。这是 openclaw 配置项，与本插件无关。\n\n### 核心特性\n\n- **多 Agent 隔离** — 完美适配 WeCom 插件的动态 Agent 功能，每个企微用户/群组拥有独立的记忆、任务、章节、宠物与定时工作流\n- **结构化记忆（corpus supplement）** — 按 user/project/feedback/reference/decision 五类分类存储，**通过 `registerMemoryCorpusSupplement` 并入龙虾 `memory` 搜索结果**，不自建第二套向量库\n- **工具安全补丁** — 仅作为**观察员**存在（尊重龙虾原生 `tools.allow/deny`），统计错误分类、给出退避建议，从不擅自重试或硬拦截\n- **提示词增强** — 仅保留 `qualityGuidelines`，其它早已由龙虾系统提示词覆盖，不重复\n- **任务/章节/模式闸门** — Claude Code TodoWrite / mark_chapter / plan-explore 的龙虾化实现；模式闸门在 `before_tool_call` 阻止计划/探索模式误触写操作\n- **状态栏 / 技能巡检 / 子任务孵化** — 一行看全当前状态；诊断技能目录缺失；把\"现在不该做\"的副作用登记为延期任务\n- **定时任务桥** — 登记工作流时返回一条 `openclaw cron add` 命令，**调度归龙虾**，插件只负责触发时装填上下文\n- **增强仪表盘（含小火苗宠物）** — Web UI 实时查看记忆 / 任务 / 章节 / 定时 / 宠物状态，支持按 Agent 筛选\n\n---\n\n## 一键安装\n\n> ⚠️ **v6.0.0 起 npm 包改名**：`@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`（与 `huo15-huihuoyun-odoo` 等其他 huo15-* 包命名规范对齐 + 让 ClawHub 重新创建干净的 plugin entry，绕开老 slug 1.3.0-5.1.0 期间 27 个 bare pluginApi 留下的 ghost manifest 死结）。OpenClaw plugin id 仍是 `enhance`，老用户配置 `~/.openclaw/openclaw.json` 里 `plugins.entries.enhance.*` 不需要迁移。\n\n```bash\nopenclaw plugins install @huo15/huo15-openclaw-enhance --force\nopenclaw restart\n```\n\n### 老版本用户迁移（v5.x → v6.0.0）\n\n如果你之前装了 `@huo15/openclaw-enhance`：\n\n```bash\n# 1. 卸载老 plugin（OpenClaw 内部 plugin id 是 enhance）\nopenclaw plugins uninstall enhance\n\n# 2. 装新包（npm 包名变了，但 OpenClaw plugin id 还是 enhance）\nopenclaw plugins install @huo15/huo15-openclaw-enhance --force\n\n# 3. 重启\nopenclaw restart\n```\n\n**配置兼容**：用户机器上 `~/.openclaw/openclaw.json` 里 `plugins.entries.enhance.config.*`（如 `botShare.baseUrl`）的 key 不需要改，因为 plugin id 还是 `enhance`。\n\n老 npm 包 `@huo15/openclaw-enhance` 已 deprecate；老 ClawHub slug `huo15-openclaw-enhance` 已 hide（已装用户仍可 update 兜底，但搜索看不到）。详见 [CHANGELOG.md](./CHANGELOG.md) v6.0.0 段。\n\n安装完成后访问仪表盘：`http://localhost:18789/plugins/enhance/`\n\n---\n\n## 功能模块（v5.6.0 全量，标注分层）\n\n> 标注 `[L1/L2/L3]` 的是工具模块，分别在 minimal / balanced / full 三档下暴露给模型；非工具模块（仪表盘 / 提示词 / kb-corpus / 自检）一律常驻。\n\n| 模块 | 分层 | 说明 | Agent 工具 |\n|------|------|------|-----------|\n| **分类记忆（并入龙虾搜索）** | L1 | user/project/feedback/reference/decision 五类；作为 corpus supplement 与龙虾 `memory` 合并排名 | `enhance_memory_store` `enhance_memory_search` `enhance_memory_review` |\n| **状态栏** | L1 | 一行/详情/json 三格式快照（模式、任务、记忆、宠物、通知） | `enhance_statusline` |\n| **子任务派发** | L1 | 返回可粘贴的 `openclaw agent` CLI 命令，跨 agent 派发 | `enhance_spawn_task` |\n| **模式闸门** | L1 | plan / explore / normal；前两种下 `before_tool_call` 阻止写操作；含 ExitPlanMode 审批 | `enhance_set_mode` `enhance_current_mode` `enhance_exit_plan_mode` |\n| **章节标记** | L2 | session 级「mark_chapter」 | `enhance_mark_chapter` `enhance_chapter_list` |\n| **任务追踪** | L2 | Claude Code TodoWrite 语义；SQLite 持久化；会警告多 in_progress | `enhance_todo_write` `enhance_todo_update` `enhance_todo_list` |\n| **定时任务桥** | L2 | 返回 `openclaw cron add` CLI 命令，尊重龙虾原生 cron-cli | `enhance_loop_register` `enhance_loop_list` `enhance_loop_disable` |\n| **历史会话搜索（v5.7）** | L2 | 流式扫 `~/.openclaw/agents/<agent>/sessions/*.jsonl`，照搬 Claude Desktop 算法（无索引、无新表） | `enhance_transcript_search` |\n| **工作流自动化（v5.6 合并）** | L3 | 触发词 → 行为指令注入；CRUD 收敛到单工具（action 派发） | `enhance_workflow` `enhance_task` |\n| **工具安全观察** | L3 | 错误分类（429/5xx/网络）+ 指数退避建议；不拦截，不重试 | `enhance_safety_log` `enhance_retry_status` `enhance_safety_rules` |\n| **任务规划** | L3 | 把多步任务拆解保存为 plan 工件 | `enhance_task_plan` |\n| **会话回顾（75min idle）** | L3 | idle 自动 prependContext「上次到这儿」 | `enhance_session_recap` |\n| **技能巡检** | L3 | 只读检查 11 个增强技能安装状态 + 给出 clawhub 修复命令 | `enhance_skill_doctor` |\n| **技能安装器** | L1 | 返回 11 个配套 skill 的一键安装 CLI 命令（不执行） | `enhance_install_skills` |\n| **记忆整合** | L1 | hook 注入：把命中的记忆与查询条件合成上下文片段 | `enhance_memory_consolidate` |\n| **提示词增强** | — | 追加 `qualityGuidelines`，其它已由龙虾系统提示词覆盖 | 自动（hook 注入） |\n| **共享知识库语料** | — | 桥接 `~/.openclaw/kb/shared/` 到龙虾 `memory_search`（corpus=\"kb\"） | 自动（corpus supplement） |\n| **输出自检** | — | 空响应/错误关键词检查 | 自动（after-response hook） |\n| **增强仪表盘** | — | Web UI：记忆 / 任务 / 章节 / 定时 / 孵化子任务 / 小火苗 | `http://localhost:18789/plugins/enhance/` |\n\n## 与龙虾原生的关系（设计契约）\n\n| 能力 | 龙虾原生 | enhance 策略 |\n|------|---------|--------------|\n| 记忆向量库（LanceDB） | ✅ 龙虾负责 | **enhance 不自建**；改为 corpus supplement 并入搜索 |\n| 记忆系统提示词 | ✅ 龙虾负责 | enhance 只在段落底部追加一行工具说明（如果龙虾提供 `registerMemoryPromptSupplement`） |\n| 工具 allow/deny | ✅ 龙虾负责 | enhance 只**观察**结果、做错误分类；不拦截 |\n| 任务清单 / 计划文件 | ⚠️ 无对应原语 | enhance 独立实现（SQLite），语义对齐 Claude Code |\n| Cron 调度 | ✅ 龙虾 cron-cli | enhance 不管理调度；只在触发时注入 instructions |\n| 技能安装 | ✅ ClawHub | enhance 只读巡检，不擅自安装 |\n\n---\n\n## 增强技能\n\n安装时会自动注入 8 个增强技能到 `workspace/skills/`（4 个工作流 + 4 个设计）：\n\n### 工作流模式\n\n| 技能 | 说明 | 灵感来源 |\n|------|------|---------|\n| `huo15-openclaw-plan-mode` | 结构化规划模式 — 执行复杂任务前先做需求分析、方案设计、风险评估 | Claude Code Plan Agent |\n| `huo15-openclaw-explore-mode` | 深度探索模式 — 只读调研代码库/系统/话题后再给出结论 | Claude Code Explore Agent |\n| `huo15-openclaw-verify-mode` | 验证检查模式 — 检查工作成果、运行测试、验证假设 | Claude Code Verification Agent |\n| `huo15-openclaw-memory-curator` | 记忆整理 — 定期审查记忆、提取洞察、清理过期条目 | Claude Code auto-memory |\n\n### 设计能力（v5.4 新增）\n\n| 技能 | 说明 | 灵感来源 |\n|------|------|---------|\n| `huo15-openclaw-frontend-design` | 高保真 Web UI 原型 + 5 美学流派 + 反 AI Slop 硬红线 + Junior/Full 两趟渲染 | Anthropic frontend-design skill |\n| `huo15-openclaw-design-director` | 设计方向顾问 — 5 流派 × 20 哲学 → 3 方向反差对比 + 强制推荐 | huashu-design 方向选型模式 |\n| `huo15-openclaw-brand-protocol` | 品牌规范抓取 — Ask/Search/Download/Verify/Codify 5 步 → brand-spec.md | huashu Brand Protocol 5-step |\n| `huo15-openclaw-design-critique` | 5 维设计评审 — 美学/可用性/品牌/内容/实现 + Keep/Fix/Quick Wins 三分类 | Web Design review 社区共识 |\n\n---\n\n## 配置说明\n\n在 `openclaw.json` 的 `plugins.entries.enhance.config` 中配置各模块：\n\n```json\n{\n  \"plugins\": {\n    \"allow\": [\"enhance\"],\n    \"entries\": {\n      \"enhance\": {\n        \"enabled\": true,\n        \"config\": {\n          \"toolTier\": \"balanced\",\n          \"memory\": {\n            \"enabled\": true,\n            \"autoCapture\": true,\n            \"maxContextEntries\": 5\n          },\n          \"safety\": {\n            \"enabled\": true,\n            \"rules\": [\n              { \"tool\": \"exec\", \"pattern\": \"rm -rf *\", \"action\": \"block\", \"reason\": \"危险命令\" },\n              { \"tool\": \"exec\", \"pattern\": \"sudo *\", \"action\": \"block\", \"reason\": \"禁止 sudo\" },\n              { \"tool\": \"file_write\", \"pathPattern\": \"*.env\", \"action\": \"block\", \"reason\": \"禁止写入环境变量文件\" }\n            ],\n            \"defaultAction\": \"allow\"\n          },\n          \"prompt\": {\n            \"enabled\": true,\n            \"sections\": [\"qualityGuidelines\", \"memoryContext\"]\n          },\n          \"workflows\": { \"enabled\": true },\n          \"dashboard\": { \"enabled\": true }\n        }\n      }\n    }\n  }\n}\n```\n\n### `toolTier`（v5.6 新增）\n\n| 取值 | 工具数 | 暴露的工具模块 | 适用场景 |\n|------|--------|----------------|----------|\n| `\"minimal\"` | 10 | 记忆 + 状态栏 + spawn + 模式 + 章节安装器 + integrator | 上下文紧 / 长会话 / 极简核心 |\n| `\"balanced\"` *(默认)* | 19 | minimal + todo + 章节标记 + 定时任务桥 + **transcript-search (v5.7)** | 多数日常使用 |\n| `\"full\"` | 27 | 全部，含 workflow / safety / task-planner / session-recap / skill-doctor | 工作流自动化 / 完整 harness |\n\n修改 `toolTier` 后需要 `openclaw restart` 才能生效。\n\n### 安全规则配置\n\n| 字段 | 说明 |\n|------|------|\n| `tool` | 工具名称，支持通配符（如 `exec`、`file_*`） |\n| `pattern` | 参数匹配模式，支持通配符（如 `rm -rf *`） |\n| `pathPattern` | 文件路径匹配模式（如 `*.env`、`/etc/*`） |\n| `action` | 匹配后动作：`block`（拦截）/ `log`（记录）/ `allow`（放行） |\n| `reason` | 规则说明（可选） |\n\n### 提示词段落配置\n\n可选段落：`taskClassification`（任务分类）、`qualityGuidelines`（质量指引）、`memoryContext`（记忆上下文）、`safetyAwareness`（安全意识）\n\n---\n\n## 与 WeCom 动态 Agent 配合\n\n当 WeCom 插件启用 `dynamicAgents` 后，每个用户/群组被分配独立的 `agentId`（如 `wecom-acct-ws-dm-hidaomax`）。增强包自动实现：\n\n1. **记忆隔离** — 用户 A 存的记忆，用户 B 看不到\n2. **日志隔离** — 每个用户的安全事件独立记录\n3. **工作流隔离** — 用户 A 定义的工作流不影响用户 B\n4. **上下文隔离** — 提示词增强只注入当前用户的记忆\n\n**实现原理**：\n- 工具使用 `OpenClawPluginToolFactory` 模式，从 `ctx.agentId` 获取当前 Agent\n- 钩子从 `ctx.agentId` 获取当前 Agent\n- SQLite 所有表包含 `agent_id` 列，查询时自动按 Agent 过滤\n\n仪表盘支持 `?agent=wecom-acct-ws-dm-hidaomax` 参数查看特定用户数据。\n\n---\n\n## 设计理念\n\n借鉴 Claude Code 的核心设计模式，适配 OpenClaw 的插件架构：\n\n| 维度 | Claude Code 原版 | 火一五·克劳德·龙虾增强插件适配 |\n|------|-----------------|--------------|\n| 记忆系统 | 6 层记忆 + Agent frontmatter | 5 类分类 + SQLite agent_id 隔离 |\n| 权限安全 | 5 层权限模型 + 异步分类器 | 规则匹配 + block/log/allow + 审计日志 |\n| 提示词工程 | Memoized sections + 优先级系统 | 可配置段落 + appendSystemContext 注入 |\n| Agent 系统 | 3 种 Agent 类型 + frontmatter 配置 | 4 个增强技能 + OpenClaw skill 系统 |\n| 工作流 | 17 个生命周期事件 | 触发词驱动 + before_prompt_build 注入 |\n\n---\n\n## 版本历史\n\n见 [CHANGELOG.md](./CHANGELOG.md)。\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 v6.7.21:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-openclaw-enhance\",\n  \"version\": \"6.7.21\",\n  \"publishedAt\": 1782407041311\n}\n\nFile v6.7.21:CHANGELOG.md\n\n## v6.7.21 (2026-06-26)\n\n- 修复: better-sqlite3 每次更新后丢失原生绑定迫使手工 rebuild\n- package.json postinstall 加 `npm rebuild better-sqlite3`，安装自动编译\n\n\n## v6.7.20 (2026-06-25)\n\n- 版本号递增发布（代码无改动）\n\n\n# CHANGELOG\n\n本插件语义化版本号与龙虾适配版本解耦：`package.json.version` 为插件自身的发布版本，`openclaw.build.openclawVersion` 为目标龙虾版本。\n\n## 6.7.19 — 2026-06-25（去掉自动切换模型 model-router + 分享链接 Markdown 预览 + 适配 openclaw 2026.6.10）\n\n- **去掉自动切换模型（model-router）**：移除「模型路由器」模块（按任务复杂度/配额/熔断 `before_model_resolve` 自动换模型）。删 `src/modules/model-router.ts`、index.ts 注册、`ModelRouterConfig` 配置、`openclaw.plugin.json` contracts.tools 的 7 个 `enhance_model_route_*` 工具。**保留** context-watchdog 的 ctx 95% 超限安全切换 + 预警 banner + 手动切换工具（`enhance_route_to_long_ctx` / `enhance_route_revert_to_original`），并更新其引用 model-router 的用户可见消息。latency-tracker/route-history 等工具保留（context-watchdog 的 isModelBanned 仍用）。\n- **分享链接 Markdown 预览**：`enhance_share_file` / `enhance_share_list` 返回结果新增可预览 Markdown —— 图片用 `![名](url)` 让龙虾管家内联渲染缩略图，其他文件用 `[📎名](url)` 可点击下载卡片。工具 description + structuredContent.markdown 都带，并提示 LLM 原样转发给用户（纯文本渠道如企微由各自 send 层降级）。\n- **适配 openclaw 2026.6.10 SDK**：`definePluginEntry` default export 在 SDK 2026.6.x 推断出内部 hash chunk 类型触发 TS2742，用具名常量 + 显式 `OpenClawPluginDefinition` 注解根治；`build.openclawVersion` → 2026.6.10；compat.pluginApi / peerDependencies 保持 ranged 不变。\n\n## 6.7.18 — 2026-06-04（model-router / context-watchdog 的 modelOverride 必须 bare id — 根治 deepseek 100% 400）\n\n### 触发\n\nJobZhao 企微聊天持续报 `Something went wrong while processing your request`。gateway 日志显示 embedded run 100% `isError=true`：\n\n- `deepseek/deepseek-v4-pro` → `400 The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but you passed deepseek/deepseek-v4-pro`（带前缀透传）\n- `minimax/MiniMax-M2.7` 被发到 `provider=deepseek`（provider/model 错配）\n- failover 链里出现双前缀 `deepseek/deepseek/deepseek-v4-pro`\n\n### 根因\n\n`model-router` 的 `before_model_resolve` hook 返回 `{ modelOverride: decision.model }`——`decision.model` 是 **fully-qualified** `provider/model`，且**漏返 `providerOverride`**。\n\nOpenClaw 核心 `resolveHookModelSelection`（pi-embedded-runner）：\n\n```js\nif (override.providerOverride) provider = override.providerOverride; // 不返 → provider 停在旧值\nif (override.modelOverride)   modelId   = override.modelOverride;    // 直接当 API model 字段，不再 split\n```\n\n→ `modelOverride` 带前缀直接发给 deepseek（openai-completions）→ 400；provider 不跟随切换 → minimax 模型被发到 deepseek API。`context-watchdog` v6.6.4 用 `target.fullId` 是**同源潜伏 bug**（long-ctx 触发少未暴露）。\n\n### 修复\n\n- `model-router`：新增 `toBareModel()`；`before_model_resolve` 两处（缓存命中 + 主返回）改返 `{ modelOverride: <bare id>, providerOverride: <provider> }`。\n- `context-watchdog`：两处 FORCE-escalate 改用 bare（`target.bareId` / `target`），log 仍用 fullId 便于阅读。\n- 实测：`openclaw agent` 触发 pro tier → `winnerModel=deepseek-v4-pro` / `result=success` / `fallbackUsed=false`。\n\n> 配套运维（非本包代码）：`~/.openclaw/openclaw.json` 修正 `agents.defaults.model` 大小写/幽灵 model（config-doctor 标 error 的 failover chain）；`~/.openclaw/enhance/model-route.json` 清畸形 speedTracking 双前缀脏 key + 理顺 enabled（deepseek 主 / minimax 备）。\n\n## 6.7.16 — 2026-05-11（bot-upload-link error path 漏判 hotfix）\n\n### 触发\n\nv6.7.15 发布后本地实测三轮验证：\n\n| 测试 | 场景 | 结果 |\n|---|---|---|\n| A | 127.0.0.1 本地直连上传 30MB | ✓ HTTP 200 / SHA256 字节级一致 / 38ms / 789MB/s |\n| B | keepermac.huo15.com → frp → 本地全链路 30MB | ✓ HTTP 200 / SHA256 一致 / 44.8s / 0.67MB/s（家庭上行限速）|\n| C | 中途用 `curl --max-time 3` 强制中断（模拟 408）| ✓ 已有 30MB SHA256 完全未变（核心防破坏机制工作）<br>但 stderr 有 `rename failed: ENOENT` 误报 |\n\n### 根因（v6.7.15 留下的小 logic bug）\n\n```ts\n// v6.7.15 timeline (curl --max-time 3 后):\n17:10:45.935  upload-start                            // req.pipe 开始\n17:10:48.937  req.on('error', err='aborted')          // 3 秒 timeout\n              rmSync(partialPath)                     // ✓ 删 partial\n              api.logger.warn('upload-failed ...')    // ✓ 日志\n              finish() → Promise done\n\n// 但 await 后只有 `if (aborted) return`，error case 没被拦截！\n17:10:48.940  renameSync(partialPath, filePath)       // ✗ ENOENT（partial 已删）\n              api.logger.warn('rename failed ...')    // 误报\n```\n\n功能上：rename 失败 → 旧完整文件依然完好（v6.7.15 核心防破坏机制依然成立）。\n但日志里多一条 confusing 的\"rename failed\"误报。\n\n### v6.7.16 改动\n\n加 `failed` flag，error handler 里 set，Promise 后双条件拦截：\n\n```ts\nlet aborted = false;\nlet failed = false;     // ← v6.7.16 新增\n\nreq.on(\"error\", (err) => {\n  failed = true;        // ← set\n  ...\n});\nws.on(\"error\", (err) => {\n  failed = true;        // ← set\n  ...\n});\n\nif (aborted || failed) return true;   // ← 双条件\n```\n\n### 验证\n\n- `npx tsc --noEmit` 通过\n- 单文件 4 行改动（1 处 let / 2 处 = true / 1 处条件加 || failed）\n- 不影响 v6.7.15 核心 .partial 临时文件 + renameSync 原子替换机制\n\n## 6.7.15 — 2026-05-11（bot-upload-link stream pipe 原子化 + 完整 upload 日志）\n\n### 触发（huangxuanrong 工单深度追踪）\n\n用户报：「我发给他的时候就显示 100%了，怎么显示 100% 后过了 10 分钟显示 408 了」。\n\n诊断 manifest vs 文件系统：\n\n```\nmanifest.json 说:\n  token=ff934f734879 files=[TM-...recording-1.mp4 (174MB)] receivedAt=16:33:20\n\nls ~/.openclaw/upload/ff934f734879/files/  实际:\n  空目录（76 bytes，只有 . 和 ..）\n```\n\nmanifest 记录文件 174MB 已收，但目录是空的。\n\n### 根因（两层）\n\n#### 第一层：nginx 反代超时 408（远端问题，不在插件代码）\n\n浏览器 100% = 浏览器已把 174MB 字节 push 给 nginx，但**没等到 response**。\nnginx → openclaw 还在传 + 等响应。如果 `proxy_read_timeout` 默认 60s 不够（174MB 大文件 + 写盘 + 写 manifest），nginx 给浏览器报 408，\n即使 openclaw 后端已成功完成 + 写完 manifest 也回不到浏览器。\n\n#### 第二层：openclaw 端 createWriteStream 默认 truncate 旧文件（本插件代码缺陷）\n\n```ts\n// v6.7.14 之前的 buggy 代码\nconst ws = createWriteStream(filePath);   // 默认 'w' 模式 → truncate 已有文件！\n```\n\n用户看到 408 后**点重新上传**，第二次请求触发：\n1. createWriteStream(filePath) 立刻把**已成功**的 174MB 文件 truncate 到 0\n2. 第二次上传也撞 nginx 超时 → req.on('error') → rmSync(filePath, force)\n3. 结果：文件目录被清空，但 manifest 还在显示老的\"174MB receivedAt=16:33\"\n\n### v6.7.15 改动\n\n#### 1. `.partial-<ts>-<rand>` 临时文件 + renameSync 原子替换\n\n```ts\n// v6.7.15\nconst partialPath = `${filePath}.partial-${Date.now()}-${randomBytes(3).toString(\"hex\")}`;\nconst ws = createWriteStream(partialPath);   // 写临时文件\n// ... pipe ...\nrenameSync(partialPath, filePath);   // ws.on('finish') 后才原子替换\n```\n\nPOSIX `rename(2)` 在同分区内是原子操作。即使重传中途失败、partial 被 rmSync 删掉，\n**真实 filePath 上的旧完整文件不会动**。多次重传 = 多个 partial-<ts>-<rand>，互不影响。\n\nreq.on('error') / ws.on('error') / `> maxFileBytes` 三个失败路径里的 `rmSync` 全部改成只删 `partialPath`。\n\n#### 2. 完整 upload 日志（4 档）\n\n```\n[enhance-bot-upload] upload-start  token=<t> file=<f> (partial=<rel-path>)\n[enhance-bot-upload] upload-ok     token=<t> file=<f> bytes=<n> (<formatted>) duration=<ms>ms throughput=<x>MB/s\n[enhance-bot-upload] upload-aborted token=<t> file=<f> reason=too-large received=<n> max=<n>\n[enhance-bot-upload] upload-failed  token=<t> file=<f> reason=req-error|write-error received=<n> error=<msg>\n```\n\n之前 upload 路径只有错误才打 warn，成功路径**沉默** → 事后无法追查\"哪些请求成功 / 何时完成\"。\n\n### 验证\n\n- `npx tsc --noEmit` 通过\n- 临时文件名带时间戳 + 3 字节随机十六进制（如 `recording.mp4.partial-1778492345678-a3f8e1`），并发上传不冲突\n- 同分区内 renameSync 原子性 = POSIX rename(2) 保证（macOS APFS / Linux ext4 都支持）\n\n### 用户还要配 nginx（远程服务器，本插件改不动）\n\n`/plugins/enhance-upload/` location 至少要加：\n\n```nginx\nlocation /plugins/enhance-upload/ {\n    client_max_body_size 2048m;          # 允许 2GB body（默认 1MB 会 413）\n    proxy_request_buffering off;          # 流式透传，不本地缓冲\n    proxy_read_timeout 1800s;             # 30 分钟读超时\n    proxy_send_timeout 1800s;\n    proxy_pass http://127.0.0.1:18790;\n}\n```\n\n少了 `proxy_request_buffering off` → nginx 会先把整个 body 收到磁盘再 POST 给 openclaw，\n浏览器 \"100% 后等很久\" 的根因。\n\n### 红线遵守\n\n- ✅ 零 child_process（renameSync 是 node:fs 同步原语）\n- ✅ 不改 OpenClaw 核心\n- ✅ 单文件 buggy 模块的非侵入式修复（其它模块不动）\n\n## 6.7.14 — 2026-05-11（config-doctor 加 tools.profile 闸门检测）\n\n### 触发\n\n用户 huangxuanrong 工单跟进 v6.7.13 测试反馈：\n\n```\n黄宣榕 5-11 15:31\n我已经上传好了\n\n贾维斯 5-11 15:31\n我查了一下，当前会话没有 enhance_upload_check 这个工具。\n不过我可以帮你换个方式——直接去上传目录找文件...\n```\n\nv6.7.13 死循环已修，但 LLM 报『**没有 enhance_upload_check 这个工具**』。诊断后发现根因**不在插件代码**。\n\n### 根因（诊断链全过程）\n\n直接对照 `trace.metadata` 与 `context.compiled.tools`：\n\n```\ntrace.metadata.plugins.entries[enhance]:\n  status=loaded version=2.6.0\n  toolNames=[36 个：enhance_chapter_list, enhance_config_doctor, ...,\n              enhance_upload_check, enhance_upload_link, enhance_upload_revoke]\n  ✓ 全部 36 个含 3 个 upload tool 都成功注册\n\ncontext.compiled.tools (实际给 LLM 的工具 schema):\n  21 个全是 OpenClaw core tool（edit/exec/read/write/memory_*/sessions_*/web_*/image*/video_/music_）\n  ✗ 0 个 enhance_* tool\n  ✗ 0 个 wecom_mcp / send_dingtalk_file（@huo15/* 插件 tool）\n```\n\nmemory-core 的 `memory_get`、`memory_search` 出现了 → 因为它们**碰巧**是 OpenClaw core tool definition 里 `profiles: [\"coding\"]` 之一。\n\n最终定位 OpenClaw 源码 `tool-policy-shared-Ce8ZI4la.js:372`：\n\n```js\nconst CORE_TOOL_PROFILES = {\n  minimal:   { allow: listCoreToolIdsForProfile(\"minimal\") },\n  coding:    { allow: [...listCoreToolIdsForProfile(\"coding\"), \"bundle-mcp\"] },   // 显式白名单！\n  messaging: { allow: [...listCoreToolIdsForProfile(\"messaging\"), \"bundle-mcp\"] },\n  full:      { allow: [\"*\"] }\n};\n```\n\n`coding` profile 是**显式 allow-list**——只放行 CORE_TOOL_DEFINITIONS 里 `profiles` 含 `\"coding\"` 的 21 个 tool + 1 个 `bundle-mcp`。其他全 deny，包括所有 `@huo15/*` 插件 tool 和 wecom_mcp、send_dingtalk_file。\n\n用户配置 `~/.openclaw/openclaw.json`:\n```json\n\"tools\": { \"profile\": \"coding\" }   // ← 这个 profile 把所有插件 tool 都 deny 了\n```\n\n→ 插件注册成功（toolNames=36）但 LLM 看不到（context.compiled.tools 0 个 enhance_*）。\n\n### v6.7.14 改动\n\n#### 1. config-doctor 加 `tools-profile-blocks-plugin-tools` 检测\n\n`src/modules/config-doctor.ts` 启动期扫 `cfg.tools.profile`：\n\n```ts\nconst toolsProfile = cfg?.tools?.profile;\nif (typeof toolsProfile === \"string\" && toolsProfile.trim() && toolsProfile !== \"full\") {\n  results.push({\n    level: \"warn\",\n    category: \"tools-profile-blocks-plugin-tools\",\n    message: `cfg.tools.profile=\"${toolsProfile}\" 是显式白名单，所有 @huo15/* 插件 tool 会被 deny`,\n    fixCommand: `python3 -c \"...cfg['tools']['profile']='full'...\"`,\n  });\n}\n```\n\n非 `\"full\"` 就 warn + 给 1 行 python3 fix command（沿用 config-doctor 一贯的\"诊断不修复\"红线 — 不动用户配置文件）。\n\n#### 2. 立刻可用的 1 行修法\n\n用户当前可手动跑这条：\n\n```bash\npython3 -c \"import json,pathlib;p=pathlib.Path.home()/'.openclaw'/'openclaw.json';c=json.loads(p.read_text());c.setdefault('tools',{})['profile']='full';p.write_text(json.dumps(c,indent=2,ensure_ascii=False));print('OK: tools.profile=full')\"\n```\n\n然后重启 openclaw gateway，所有 36 个 enhance_* tool + wecom_mcp + send_dingtalk_file 立刻可见。\n\n### 红线遵守\n\n- ✅ 完全只读 openclaw.json（红线 §6.4 \"诊断不修复\"）\n- ✅ 零 child_process（红线 §6.2）\n- ✅ 不改 OpenClaw 核心（红线 §11.4 #1）\n- ✅ 不复制龙虾原生功能（红线 §11.4 #2）—— `tool-policy-shared` 是龙虾的事，这里只诊断\n\n### 后续 candidate\n\n- `enhance_hook_doctor` 也加同样的 profile 检测（如果用户先调 hook-doctor 而不是 config-doctor）\n- 可考虑 prompt supplement：检测到 `coding` profile 且会话是企微/钉钉/微信 → 主动加一段 \"当前 profile 闸门已拦截插件 tool\"\n\n## 6.7.13 — 2026-05-11（large-file-bridge 兜底死循环修复 + 用户上传后流程引导）\n\n### 触发\n\n用户截图实测 v6.7.12（token URL 已生效）：\n\n```\n贾维斯 15:30\n上传好了，你试试转成会议纪要发给我\n👉 https://keepermac.huo15.com/plugins/enhance-upload/2eaffa5d5569\n\n黄宣榕 15:31\n我已经上传好了\n\n贾维斯 15:31\n我已经上传好了\n👉 https://keepermac.huo15.com/plugins/enhance-upload/2eaffa5d5569   ← 又塞了一遍！\n```\n\n用户已经上传完，AI 应该调 `enhance_upload_check({token: \"2eaffa5d5569\"})` 拿文件，处理\"转会议纪要\"任务。但 hook 把 LLM 输出**又**强制覆盖成上传链接 → 死循环。\n\n### 根因（两个）\n\n#### 根因 A: `before_agent_reply` 兜底每轮 reply 都 fire\n\n```ts\n// v6.7.12 兜底逻辑\nconst entry = injectedSessions.get(key);\nif (!entry) return;       // 只要 inject 过就触发\n// body 不含 URL → appendText 上传链接\n```\n\n`injectedSessions` 在 session 整个生命周期都保留 entry → 每个后续 reply 都被兜底覆盖。用户的\"传完了\"那条 reply 也被覆盖 → 永远拿不到处理结果。\n\n#### 根因 B: prompt 没明确\"用户上传后该干什么\"\n\nLLM 看到 prompt 里说『token 已预备好』但没说『用户上传后必须调 enhance_upload_check 工具』，弱模型不会主动调。\n\n### v6.7.13 改动\n\n#### 1. injectedSessions entry 加 `replyAppendUsed` 标记\n\n```ts\n// v6.7.13\nMap<string, { token, createdAt, replyAppendUsed: boolean }>\n```\n\n`before_prompt_build` 注入时 `replyAppendUsed: false`，`before_agent_reply` fire 一次后**立即** `replyAppendUsed = true` → 后续 reply 不再被覆盖。\n\n```ts\nconst entry = injectedSessions.get(key);\nif (!entry || entry.replyAppendUsed) return;  // ← 关键\n// ... appendText logic\nentry.replyAppendUsed = true;                  // ← 标记已用\n```\n\n#### 2. prompt 加『用户上传后处理流程』强引导\n\n```\n# 本次会话已预生成 token (AI 追踪用)\n\n**token = `2eaffa5d5569`** (已写入 ~/.openclaw/upload/manifest.json, 24h 有效)\n\n## 用户上传后的处理流程（关键！LLM 必须严格按此顺序执行）\n\n用户上传文件后会发\"传完了\" / \"上传好了\" / \"已传完\" / 类似确认消息。**此时你必须**：\n\n1. 立即调用 enhance_upload_check({token: \"2eaffa5d5569\"}) 工具\n2. 工具返 {files: [{path, size, name}, ...]} 数组\n3. 用 Read 工具读 files[i].path 拿到文件内容\n4. 按用户原始任务继续处理（如\"转会议纪要\" / \"分析内容\" / \"提取信息\"）\n\n**严禁的反模式**：\n❌ 再次发上传链接（用户已上传，再发链接 = 死循环！）\n❌ 反问\"你确定上传了吗 / 请截图\" / \"我没收到\"\n❌ 跳过 enhance_upload_check 直接 ls 或 grep ~/.openclaw/upload/ 全盘扫\n```\n\n### 用户场景验证\n\n| 步骤 | v6.7.12（死循环） | v6.7.13（正常）|\n|---|---|---|\n| 用户首次发\"超过100M无法下载\" | hook inject + 兜底给链接 ✓ | 同上 ✓ |\n| 用户回\"传完了\" | hook 又兜底给链接（死循环）❌ | replyAppendUsed=true → 不接管 ✓ |\n| LLM 看到\"传完了\" | （prompt 没教）瞎回 | （prompt 强引导）调 enhance_upload_check({token}) ✓ |\n| AI 拿到文件路径 | 拿不到 | files: [{path, size, name}] ✓ |\n| AI 处理\"转会议纪要\" | 永远不进入这步 | Read 路径 → 调 model → 输出纪要 ✓ |\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ 兜底 hook 一次性消费,不影响后续 reply 自然流转\n\n## 6.7.12 — 2026-05-11（large-file-bridge 自动生成 token URL — 兜底也给 token，AI 追踪零依赖弱模型）\n\n### 触发\n\n用户原话：**「没有后缀 token 啊」**\n\nv6.7.11 兜底虽然给了 `https://keepermac.huo15.com/plugins/enhance/upload` 完整 URL，但 **没 token** → AI 拿不到 `enhance_upload_check({token})` 的输入 → **不能查谁传了什么**。\n\n弱模型（MiniMax M2.7）从来不会主动调 `enhance_upload_link` 工具拿 token，所以 token URL 一直没机会生效。\n\n### 设计取舍\n\n让 `large-file-bridge` **在 hook 内部自动生成 token**，不依赖 LLM 主动调工具：\n\n| 时机 | 动作 |\n|---|---|\n| `before_prompt_build` 命中 WECOM_LARGE_FILE_ERROR | `randomBytes(6).hex()` 生成 token + mkdir `<uploadRoot>/<token>/files/` + 写 manifest.json |\n| 同 session 后续触发 | injectedSessions Map 已存 token，复用 |\n| `before_agent_reply` 兜底 | 用 injectedSessions 里那个 token 拼 URL（前后一致） |\n\nmanifest.json 跟 `bot-upload-link` **共用 `~/.openclaw/upload/manifest.json`**，所以 LLM 调 `enhance_upload_check({token})` 工具时 bot-upload-link 能读到这条 token，拉清单成功。\n\n### 改动\n\n#### 1. `injectedSessions` Map 升级\n\n```ts\n// v6.7.11: Map<string, number>          (只存 timestamp)\n// v6.7.12: Map<string, { token: string; createdAt: number }>\n```\n\n#### 2. 新增 `createUploadToken()` helper\n\n```ts\nconst UPLOAD_ROOT = join(homedir(), \".openclaw\", \"upload\");\nconst MANIFEST_PATH = join(UPLOAD_ROOT, \"manifest.json\");\n\nfunction createUploadToken(label, ownerAgent): string | null {\n  const token = randomBytes(6).toString(\"hex\");  // 12 hex\n  mkdirSync(join(UPLOAD_ROOT, token, \"files\"), { recursive: true });\n\n  // 读/写 manifest（与 bot-upload-link 共用）\n  let manifest = existsSync(MANIFEST_PATH)\n    ? JSON.parse(readFileSync(MANIFEST_PATH, \"utf-8\"))\n    : { version: 1, entries: [] };\n  manifest.entries.push({\n    token, label, ownerAgent,\n    createdAt: new Date().toISOString(),\n    expireAt: new Date(Date.now() + 24*3600*1000).toISOString(),\n    files: [],\n  });\n  writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2));\n\n  return token;\n}\n\nfunction buildTokenUrl(baseUrl, token): string {\n  return `${baseUrl}/plugins/enhance-upload/${token}`;\n}\n```\n\n#### 3. before_prompt_build 用 token URL\n\n```ts\nconst token = createUploadToken(`session:${sessionId.slice(0,12)}`, agentId);\nconst url = token ? buildTokenUrl(baseUrl, token) : resolveUploadUrl();\nconst text = buildUploadContext(url, token);  // prompt 提示 token 已就绪\ninjectedSessions.set(key, { token: token ?? \"\", createdAt: Date.now() });\n```\n\n#### 4. before_agent_reply 用同一个 token URL\n\n```ts\nconst entry = injectedSessions.get(key);\nconst url = entry.token ? buildTokenUrl(baseUrl, entry.token) : resolveUploadUrl();\n// suffix 拼 token URL，前后完全一致\n```\n\n#### 5. prompt 增强：告诉 LLM token 已预备好\n\n```\n# 已为本次会话预生成 token（AI 可追踪）\n\ntoken = `abc123def456`（已写入 manifest，24h 有效）。用户上传后,你**必须**调:\n  enhance_upload_check({token: \"abc123def456\"})\n拉清单 → 拿到 {path, size, name} 数组 → Read 路径分析文件。\n\n# 严禁的行为\n❌ 不要再调 enhance_upload_link 工具生成新 token — token \"abc123def456\" 已预备好,直接发给用户即可\n```\n\n### 用户场景验证\n\n| 步骤 | 之前 (v6.7.11) | 现在 (v6.7.12) |\n|---|---|---|\n| 用户发\"视频/文件超过100M无法下载\" | hook 注 prompt + 兜底，URL 是共享 `/plugins/enhance/upload`（无 token，AI 拿不到追踪 key） | hook 注 prompt + 兜底，URL 是 `/plugins/enhance-upload/<token>`（manifest 已写，AI 立刻能用 token） |\n| LLM 完全无视 prompt | 兜底 appendText 共享 URL，**AI 不能查谁传了什么** | 兜底 appendText token URL，**AI 调 enhance_upload_check({token}) 查清单成功** |\n| 用户上传 → \"传完了\" | AI 没 token，只能 `ls ~/.openclaw/upload/` 全盘扫（隐私 + 性能差） | AI 调 enhance_upload_check({token: \"abc...\"}) → 精确返该 token 文件清单 → Read |\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖（randomBytes 是 node stdlib）\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ manifest 跟 bot-upload-link 共用，避免重复实现 token 系统\n- ✅ token 生成失败时优雅降级到共享 URL（不阻塞主流程）\n\n## 6.7.11 — 2026-05-11（large-file-bridge 双重 prompt-following 加固 — 针对 MiniMax M2.7 等弱模型）\n\n### 触发\n\n用户报错持续，让我\"查本地 agent\"。grep `~/.openclaw/agents/` 找到根因：\n\n**agent**: `wecom-default-dm-huangxuanrong`\n**model**: `minimax/MiniMax-M2.7`\n**session jsonl**: `6b98e16a-...jsonl`\n\n读 jsonl line 6 — **enhance prompt 已完整注入**（含『首选调 enhance_upload_link → 返 /plugins/enhance-upload/<token>』+ 备用 URL 等所有引导）。\n\n但 LLM 后续 messages 显示：\n\n| LLM 动作 | 实际做了什么 |\n|---|---|\n| 调 `enhance_upload_link`? | ❌ 没有 |\n| 给用户 `https://...upload` URL? | ❌ 没有 |\n| 改去 `exec grep wecom 源码` | ✅ 做了 3-4 次 |\n| 自己发现 `DEFAULT_WECOM_MEDIA_MAX_BYTES = 80MB` | ✅ |\n| 反问用户『请把完整错误消息截图发给我』 | ✅ |\n\n**LLM 完全无视 enhance 的硬指令，反向操作**：\n- 指令『不要先问诊断问题』 → 反问\"请把完整错误消息截图发给我\"\n- 指令『首选调 enhance_upload_link』 → 不调，自己 grep 源码\n- 指令『把 URL 发给用户』 → 没给\n\n这是 **MiniMax M2.7 prompt-following 能力差** + **prompt 措辞不够刺激** 的双重失败。\n\n### 第三层防御也失效\n\n`before_agent_reply` hook 本应兜底强制 appendText 上传 URL：\n\n```ts\n// v6.7.10 兜底逻辑\nif (\n  body.includes(\"upload\") ||      // ← 太宽! LLM 叙述里说\"upload 相关问题\"也命中\n  body.includes(\"/plugins/enhance\") ||\n  body.includes(\"/lanhuo/upload\") ||\n  body.includes(\"上传链接\") ||      // ← 太宽! LLM 说\"插件有上传链接功能\"也命中\n  body.includes(\"上传页面\")\n) return;                          // ← 误判已给链接,不接管\n```\n\nLLM 最终回复里**叙述性**提到：\"克劳德增强包里有一个 `large-file-bridge` 模块专门处理这个场景\" + \"请你确认 large-file-bridge 模块是否已经在运行\" + \"上传链接相关问题\" — 含 `large-file-bridge` 等字符串触发 `body.includes(\"upload\")` → 误判 → 兜底放行。\n\n### v6.7.11 改动\n\n#### 1. prompt 改命令式硬规则（针对弱模型）\n\n```\n【大文件上传 — 强制规则，禁止违反】\n\n# 你的回复必须是下面这一段，一字不改：\n\n文件超过 100MB 无法在企微直接传输，请通过下面这个链接上传（支持 2GB 以内，浏览器拖拽即可）：\n\n${url}\n\n上传完成后告诉我，我来处理。\n\n# 严禁的行为（违反 = 用户卡死）\n\n❌ 不要 exec/grep wecom / openclaw 源码查\"limit / maxBytes / MAX_DOCUMENT_BYTES\"等\n❌ 不要反问用户\"请把完整错误消息截图发给我\" / \"你是哪个场景\" / \"需要更多信息才能定位\"\n❌ 不要建议用户 `openclaw config set` 或修改任何配置\n❌ 不要叙述性提到 \"large-file-bridge 模块\" / \"增强包 hook\" / \"插件内置限制\"\n❌ 不要给 `/plugins/enhance/upload` 这种**裸路径**（缺 https:// 前缀），用户点不开\n```\n\n把 LLM 容易\"反向操作\"的具体路径**逐条列字面值禁止**（参考红线 #11 / Allen 流的\"具体反例字面写进 prompt\"原则）。\n\n#### 2. before_agent_reply 兜底关键词收紧\n\n```ts\n// v6.7.11 新逻辑\nconst hasRealUrl =\n  body.includes(url) ||                                          // 完整匹配当前 url\n  /https?:\\/\\/[^\\s)]+\\/plugins\\/enhance(-upload)?\\//.test(body) || // 任何 enhance 上传 URL\n  body.includes(\"enhance_upload_link\") ||                        // 调过工具会留下 marker\n  body.includes(\"enhance_upload_check\");\nif (hasRealUrl) return;\n```\n\n只在含**真实可点 URL**（http(s):// 前缀 + /plugins/enhance.../ 路径）或工具名 marker 时跳过。叙述性提及不再误判 → 兜底真正生效 → 强制 appendText 完整上传链接。\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ 把 LLM 反向操作的具体路径字面写进 prompt（红线 #11 anti-pattern in prompt）\n\n### 通用沉淀\n\n**LLM 给定相同 prompt 会因 model 不同表现差异巨大**。强模型（Claude / GPT）能 follow 一句\"必须给链接\"硬指令；弱模型（MiniMax M2.7 / DeepSeek-V4-Flash）需要：\n1. 命令式硬指令（\"必须 / 禁止\"，不是描述性）\n2. 把具体反例（\"不要 exec grep 源码 / 不要反问\"）字面写进 prompt\n3. 兜底 hook 关键词匹配要\"内容驱动\"（含真实 URL）而非\"语义驱动\"（含 \"upload\" 字面）\n\n## 6.7.10 — 2026-05-11（large-file-bridge 触发放宽 — 不再卡 agentId.startsWith(\"wecom-\")）\n\n### 触发\n\n用户实测 v6.7.9 升级后 LLM 回复（在某个非企微渠道发\"视频/文件超过100M无法下载\"）：\n\n```\n这是 openclaw-media-bridge 的下载限制，文件超过 100MB 会被截断。让我查一下当前的配置：\n找到关键信息了。文件大小有几层限制：\n- MAX_VIDEO_BYTES : 16 MB\n- MAX_DOCUMENT_BYTES : 100 MB ← 这就是你遇到的\n- MAX_AUDIO_BYTES : 16 MB\n- ...\n如果你想让贾维斯能处理更大的文件，可以调高配置：\nopenclaw config set channels.wecom.mediaMaxMb 200\n```\n\nLLM **完全没走 enhance 引导**（没调 `enhance_upload_link`、没给 `/plugins/enhance/upload` URL），反而自己读 source code 调研 `MAX_DOCUMENT_BYTES`。\n\n### 根因\n\nv6.7.0 修 channel 检测 bug 时加了：\n\n```ts\nif (!agentId.startsWith(\"wecom-\")) return;\n```\n\n但 main agent / terminal / Claude CLI / Claude Desktop / dingtalk / wechat-service 等所有非 wecom 渠道的 agentId **都不以 `wecom-` 开头** → 这些场景 large-file-bridge **彻底不工作**。\n\n但「视频/文件超过 100M，无法下载」**是企微独家错误文本**——只要消息含这句话，就一定是企微大文件场景（即使 LLM 在非 wecom agent 上看到了，比如用户在 Claude CLI 里贴企微截图）。\n\n### v6.7.10 改动\n\n`before_prompt_build` hook：\n\n```ts\n// v6.7.10: 触发条件不再卡 agentId\nif (detectWecomError && WECOM_LARGE_FILE_ERROR.test(promptText)) {\n  reason = \"detected-wecom-large-file-error\";\n  // ↑ 命中即触发，不管 channel/agentId\n}\nelse if (\n  proactiveOffer &&\n  LARGE_FILE_INTENT.test(promptText) &&\n  FILE_UPLOAD_KEYWORDS.test(promptText) &&\n  agentId.startsWith(\"wecom-\")     // ← 仅这条仍卡 wecom-\n) {\n  reason = \"detected-large-file-intent\";\n}\n```\n\n`before_agent_reply` hook 同步：删除 `if (!agentId.startsWith(\"wecom-\")) return;`，靠 `injectedSessions.has(key)` 一致性自动联动。\n\n**结果**：用户在任何渠道（企微/terminal/Claude CLI/dingtalk/...）贴企微错误文本 → 100% 命中 enhance 引导。\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ 主动「要传大文件」泛意图引导仍卡 wecom-（避免 terminal 用户误触发）\n\n## 6.7.9 — 2026-05-11（large-file-bridge baseUrl 解析 hotfix — 修裸路径缺 https:// 前缀）\n\n### 触发\n\n用户截图 LLM 回复给的链接：\n\n```\n📎 大文件上传：文件超过 100MB 无法在企微直接传输，请通过以下链接上传：\n👉 /plugins/enhance/upload          ← 裸路径！缺 https://keepermac.huo15.com\n上传完成后告诉我，我来处理文件。\n```\n\n用户根本点不开 — IM 客户端不会把裸路径补成绝对 URL。\n\n### 根因\n\n`large-file-bridge.resolveUploadUrl()` 在 `config.baseUrl` 没填时直接返裸路径：\n\n```ts\n// v6.7.8 旧代码\nif (base) return `${base}/plugins/enhance/upload`;\nreturn \"/plugins/enhance/upload\";   // ← 没拼公网前缀\n```\n\n跟 bot-share-link / bot-upload-link 比 — 它们都用了 `resolveBaseUrl()` 多源解析链（env > config > shared share/config.json > bridge 检测外网 URL）。**large-file-bridge 是独立写的，从未接入这套**。\n\n### v6.7.9 改动\n\n```ts\nfunction readSharedBaseUrl(): string | undefined {\n  const sharePath = join(homedir(), \".openclaw\", \"share\", \"config.json\");\n  if (!existsSync(sharePath)) return undefined;\n  const j = JSON.parse(readFileSync(sharePath, \"utf-8\"));\n  return j?.baseUrl?.trim() || undefined;\n}\n\nfunction resolveUploadUrl(): string {\n  if (config?.uploadUrl?.trim()) return config.uploadUrl.trim();\n  const base = resolveBaseUrlFromBridge({\n    configBaseUrl: config?.baseUrl?.trim() || readSharedBaseUrl(),\n    envName: \"BOT_BASE_URL\",\n    fallback: \"http://localhost:18789\",\n  });\n  return `${base}/plugins/enhance/upload`;   // ← 永远拼前缀\n}\n```\n\nbaseUrl 解析优先级（跟 bot-share-link / bot-upload-link 完全一致）：\n\n1. `env BOT_BASE_URL`\n2. `config.largeFileBridge.baseUrl`\n3. `~/.openclaw/share/config.json` 的 `baseUrl`（bot-share-link 用户配过的）\n4. bridge `detectBaseUrlFromRequest()` 缓存的外网 URL\n5. `http://localhost:18789` fallback（最次）\n\n### 现在的 LLM 回复\n\n```\n📎 大文件上传：文件超过 100MB 无法在企微直接传输，请通过以下链接上传：\n👉 https://keepermac.huo15.com/plugins/enhance/upload      ← 完整公网 URL ✓\n上传完成后告诉我，我来处理文件。\n```\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不动 cc-media-bridge\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ readSharedBaseUrl 只读 ~/.openclaw/share/config.json（用户主动 enhance_share_set_baseurl 写过）\n\n### 用户操作\n\n```bash\nopenclaw plugins update @huo15/huo15-openclaw-enhance && openclaw restart\n# 然后必须 /new 开新会话 — 老 session 的 prompt 是 freeze 的\n```\n\n## 6.7.8 — 2026-05-11（统一上传 URL 到 /plugins/enhance/* + 强化 token 化追踪）\n\n### 触发\n\n用户两连发：\n\n1. **问 token 化**：『这里上传他怎么知道我上传了啥呢，应该 agent 给一个带 hash 的比如 .../upload/2efabc00000 才能追踪吧』\n2. **改主意 URL 风格**：『默认用 /plugins/enhance/upload，/lanhuo/upload 这个先删除了』\n\n### 改动\n\n#### A. 删 /lanhuo/upload (v6.7.4) 和 /upload (v6.7.7) 两条 alias route\n\ndashboard.ts 整段 `api.registerHttpRoute({ path: \"/lanhuo\", ... })` 删除。`/upload` route 同样删（被 OpenClaw control UI SPA 截，注册了也用不上）。\n\n理由：\n- `/lanhuo/upload` 跟 cc-media-bridge 的 `/lanhuo/*` namespace 撞，职责混乱\n- `/upload` 短 URL 走不通（v6.7.7 实测）\n- `/plugins/enhance/*` 是 enhance 自己的 namespace，最清晰\n\n#### B. resolveUploadUrl 默认回 /plugins/enhance/upload\n\n```ts\nfunction resolveUploadUrl(): string {\n  if (config?.uploadUrl?.trim()) return config.uploadUrl.trim();\n  const base = config?.baseUrl?.trim();\n  if (base) return `${base}/plugins/enhance/upload`;\n  return \"/plugins/enhance/upload\";\n}\n```\n\n#### C. prompt 强化：LLM 优先调 enhance_upload_link 拿 token URL\n\n`large-file-bridge` buildUploadContext 改写：\n\n```\n首选：调 enhance_upload_link 工具拿 token 化 URL 给用户\n  1. 你调 enhance_upload_link({label: \"<本次任务简述>\"}) → 返\n     https://keepermac.huo15.com/plugins/enhance-upload/<12-hex-token>\n  2. 把 URL 发给用户：\"请通过此链接上传：<url>，传完告诉我\"\n  3. 用户上传完说\"传完了\" → 你调 enhance_upload_check({token: \"...\"}) → 拉清单\n  4. 拿到文件路径 → Read 工具读文件分析\n\n备用（仅在 enhance_upload_link 不可用时）：共享 URL /plugins/enhance/upload\n  无 token，AI 不知道是谁传了什么，仅适合一次性快速上传\n```\n\n`cc-bridge-prompt` 严格区分段同步更新。\n\n### 现在 enhance 暴露的两条上传路径\n\n| URL 模式 | 模块 | 特点 |\n|---|---|---|\n| `/plugins/enhance/upload` | dashboard.ts | 共享，无 token，AI 不能追踪 |\n| `/plugins/enhance-upload/<12-hex-token>` | **bot-upload-link.ts (v6.5.2 已实现!)** | token 隔离，AI 通过 enhance_upload_check 查清单 |\n\nbot-upload-link 三个工具（v6.5.2 已有，无需改）：\n- `enhance_upload_link({label?, expireHours?})` — 生成 token + 返 URL\n- `enhance_upload_check({token})` — 列该 token 已收文件 + 路径\n- `enhance_upload_revoke({token})` — 撤销 token\n\n### 用户场景\n\n```\n群里 ZhaoBo 转发 200MB 视频 → 企微推「视频/文件超过100M无法下载」纯文本给 bot\nLLM 看到 + large-file-bridge prompt 触发 →\n  调 enhance_upload_link({label: \"视频分析\"}) →\n  返 https://keepermac.huo15.com/plugins/enhance-upload/ab12cd1234ef\nLLM 群里回：\"企微 100MB 限制，请打开此链接上传：https://...ab12cd1234ef\n            传完跟我说一声\"\nZhaoBo 浏览器打开 → 拖拽 200MB 视频 → 流式写到 ~/.openclaw/upload/ab12cd1234ef/files/video.mp4\nZhaoBo 群里：\"传完了\"\nLLM 调 enhance_upload_check({token: \"ab12cd1234ef\"}) → 拿到 [{path:\"...\", size:200MB}]\nLLM Read 路径 → 分析视频 → 回结果\n```\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ /plugins/enhance/* namespace 干净（不跟 cc-media-bridge /lanhuo 混淆）\n\n## 6.7.7 — 2026-05-11（/upload 短 URL 走不通 — 退回 /lanhuo/upload）\n\n### 触发\n\n用户实测 v6.7.6 升级后访问 `https://keepermac.huo15.com/upload`，浏览器**自动跳转**到 `https://keepermac.huo15.com/upload/chat?session=main`（OpenClaw control UI 的 chat panel 路径，错误页）。\n\n### 根因\n\n诊断 `curl -i https://keepermac.huo15.com/upload`：\n\n```\nHTTP/2 200\ncontent-type: text/html; charset=utf-8\ncontent-length: 2821\n\n<!doctype html>\n<title>OpenClaw Control</title>\n```\n\n返回的是 **OpenClaw control UI SPA 的 index.html**（2821 bytes），不是 enhance 的 UPLOAD_HTML（应该 5688 bytes）。\n\n进一步本机对比 enhance 在 OpenClaw gateway 注册的几个 route：\n\n| URL | size | 谁返回 |\n|---|---|---|\n| `/upload` | 2821 | **OpenClaw control UI SPA**（截了！） |\n| `/upload/foo` | 2821 | 同上 |\n| `/lanhuo/upload` | 6263 | **enhance UPLOAD_HTML** ✓ |\n| `/plugins/enhance/upload` | 6263 | **enhance UPLOAD_HTML** ✓ |\n\n**OpenClaw gateway 的 control UI SPA 在 root path 优先级最高**，plugin 注册的 root-level prefix（如 `/upload`）会被 SPA 接管返 index.html。只有 OpenClaw 让给 plugin 的特定 prefix（`/lanhuo/*`、`/plugins/*`）才能被 plugin route 拦截。\n\nv6.7.6 我在 cc-media-bridge 加的 `/upload` handler 也用不上 — 用户 nginx 反代根 `/` 到 OpenClaw gateway (47.104.78.121:18080)，**不是** cc-media-bridge。\n\n### 改动（v6.7.7 = revert v6.7.6 + prompt 更明确）\n\n1. `large-file-bridge.resolveUploadUrl()` **默认回 `/lanhuo/upload`**（从 `/upload` 退回）\n2. `large-file-bridge buildUploadContext` prompt 加显式禁止：\n   ```\n   /upload 短 URL **不可用**！OpenClaw control UI SPA 占了 root path，\n   访问 /upload 会跳 /upload/chat?session=main（错的）\n   ```\n3. `cc-bridge-prompt` 严格区分段同步更新：\n   ```\n   📊 /lanhuo = 蓝火任务 dashboard\n   📎 /lanhuo/upload = 大文件上传专用页面\n   ❌ /upload 短 URL 不可用——OpenClaw control UI SPA 占了 root\n   ```\n\n`/upload` route 在 `dashboard.ts` 仍注册（无副作用，被 SPA 截了也不报错），万一未来 OpenClaw 让出 root prefix 可立即生效。\n\n### 短 URL 走通的唯一办法（说明）\n\n要让 `https://keepermac.huo15.com/upload` 工作，**唯一可行路径**是把 nginx `/upload` 单独反代到一个不被 OpenClaw control UI 占用的进程：\n\n```nginx\nlocation ^~ /upload {\n  proxy_pass http://47.104.78.121:18790;   # cc-media-bridge native /upload (v2.18.10)\n  client_max_body_size 2050M;\n  proxy_request_buffering off;\n  # ...\n}\n```\n\n但这要求 cc-media-bridge 在远端 18790 端口暴露公网（默认只 bind 127.0.0.1）。\n\n**红线 #2 不复制龙虾原生 + 不修龙虾核心** → enhance 无法让 OpenClaw control UI 把 `/upload` 让给 plugin。所以现实可用 URL：\n\n| URL | 状态 |\n|---|---|\n| `https://keepermac.huo15.com/lanhuo/upload` | ✅ **推荐** — 当前默认 |\n| `https://keepermac.huo15.com/plugins/enhance/upload` | ✅ 等价备用 |\n| `https://keepermac.huo15.com/upload` | ❌ 不可用 — OpenClaw SPA 截 |\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不动 control UI SPA 优先级\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n\n## 6.7.6 — 2026-05-11（上传 URL 简化到最短 /upload）\n\n### 触发\n\n用户原话：『 [https://keepermac.huo15.com/upload](https://keepermac.huo15.com/lanhuo/upload) 能不能换成这个链接』\n\n之前 v6.7.4 改用 `/lanhuo/upload` 是因为想跟 dashboard `/lanhuo` 心智模型对齐。但用户偏向**最短易记 URL**：\n\n| URL | 长度 | 易记度 |\n|---|---|---|\n| `/upload` | 7 字符 | ⭐⭐⭐⭐⭐ |\n| `/lanhuo/upload` | 14 字符 | ⭐⭐⭐ |\n| `/plugins/enhance/upload` | 23 字符 | ⭐ |\n\n### 改动\n\ncc-media-bridge v2.18.9 的 `_lanhuo_strip(path)` 函数：\n```python\nif path.startswith(\"/lanhuo/\"):\n    return path[len(\"/lanhuo\"):]\nreturn path     # ← 直接 /upload 不映射，原样 return\n```\n\n所以 `path == \"/upload\"` 已经命中 cc-media-bridge 的 upload handler（**zero 改动 cc-media-bridge**）。\n\nenhance v6.7.6：\n1. **`large-file-bridge.resolveUploadUrl`** 默认 `${base}/upload`（从 `${base}/lanhuo/upload` 简化）\n2. **`large-file-bridge buildUploadContext`** prompt 文本提示 LLM 用 `/upload` 短 URL\n3. **`cc-bridge-prompt`** 严格区分段落：\n   ```\n   📊 /lanhuo = 蓝火任务 dashboard\n   📎 /upload = 大文件上传专用页面（最短最易记）\n       备用等价 URL：/lanhuo/upload / /plugins/enhance/upload\n   ```\n\n### 等价性保证\n\n三个 URL **完全等价**（cc-media-bridge v2.18.9 已 native 支持，nginx 不用配 location）：\n\n| URL | 路径流转 |\n|---|---|\n| `/upload` ⭐ | _lanhuo_strip 不映射 → handle_upload |\n| `/lanhuo/upload` | _lanhuo_strip 剥成 `/upload` → handle_upload |\n| `/plugins/enhance/upload` | enhance dashboard.ts 注册的 OpenClaw gateway route（如果 nginx 反代到 gateway） |\n\n本机 diff 验证：`/upload` 和 `/lanhuo/upload` 返回完全相同的 5688 bytes HTML。\n\n### 用户操作\n\n升级到 v6.7.6 后 LLM 给出的回复将默认推 `/upload` 短 URL：\n\n```\n\"企微聊天文件上限 100MB，2GB 以内大文件都可以通过下面这个链接上传：\nhttps://keepermac.huo15.com/upload\n（流式上传，浏览器拖拽即可，传完告诉我我来处理。）\"\n```\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不动 cc-media-bridge（v2.18.9 已 native 支持）\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ /lanhuo/upload 兼容 alias，老的 prompt cache / few-shot example 仍工作\n\n## 6.7.5 — 2026-05-11（上传支持 2GB 单文件 — 流式写盘不 OOM）\n\n### 触发\n\n用户实测企微大文件场景，说：\"要 2G 以内都可以\"。\n\n但 v6.7.4 的 `handleUpload` 是 v5.x 老实现：\n\n```ts\nconst chunks: Buffer[] = [];\nfor await (const chunk of req) chunks.push(Buffer.from(chunk));  // ← 全 buffer 进内存\nconst parsed = parseMultipart(Buffer.concat(chunks), boundary);   // ← concat 出一个超大 Buffer\n```\n\n2GB 文件走这条路径 **100% OOM** —— Node V8 默认 heap ~1.5GB，Buffer.concat 出 2GB 超大 buffer 直接撞 `Cannot allocate Buffer`。\n\n### 改动\n\n#### 1. handleUpload 新增 octet-stream 流式路径\n\n`Content-Type: application/octet-stream` (或非 multipart) 走 `handleStreamingUpload`：\n\n```ts\nasync function handleStreamingUpload(req, res, contentLengthHint) {\n  const safeName = sanitizeUploadFilename(req.headers[\"x-filename\"]);\n  const destPath = join(getUploadDir(), `${Date.now()}-${safeName}`);\n  let receivedBytes = 0;\n  const ws = createWriteStream(destPath);\n\n  return new Promise((resolve) => {\n    req.on(\"data\", (chunk) => {\n      receivedBytes += chunk.length;\n      if (receivedBytes > UPLOAD_MAX_BYTES) {  // 2GB 硬上限\n        req.destroy(); ws.destroy(); rmSync(destPath);\n        res.writeHead(413); res.end(\"...\"); resolve(true); return;\n      }\n      // 背压：write 返 false 时暂停 req，等 drain 再 resume\n      const canContinue = ws.write(chunk);\n      if (!canContinue) {\n        req.pause();\n        ws.once(\"drain\", () => req.resume());\n      }\n    });\n    req.on(\"end\", () => ws.end(() => { sendJson(res, {...}); resolve(true); }));\n    req.on(\"error\", () => { /* abort + cleanup */ });\n    ws.on(\"error\", () => { /* abort + cleanup */ });\n  });\n}\n```\n\n- **2GB 硬上限**：`content-length` 头预检 + 边读边累计字节，超过主动 destroy + 删盘\n- **背压处理**：`ws.write` 返 `false` 时 `req.pause()`，避免 client 推太快内存堆积\n- **错误清理**：req/ws 任一抛错都 cleanup 已写部分文件\n\n#### 2. multipart/form-data 老路径保留但加 100MB 上限\n\n兼容旧 form 上传，但超过 100MB 直接 413 + 提示用 octet-stream：\n\n```ts\nif (contentLength > MULTIPART_INMEM_MAX /* 100MB */) {\n  res.writeHead(413);\n  res.end(JSON.stringify({\n    error: \"multipart 模式仅支持 <100MB；2GB 以内大文件请改用 application/octet-stream 头\",\n    hint: \"fetch(url, { method: 'POST', body: file, headers: { 'Content-Type': 'application/octet-stream', 'X-Filename': file.name } })\",\n  }));\n}\n```\n\n#### 3. UPLOAD_HTML 默认走 octet-stream\n\n```js\nxhr.open('POST', location.pathname, true);  // 同源相对路径\nxhr.setRequestHeader('Content-Type', 'application/octet-stream');\nxhr.setRequestHeader('X-Filename', encodeURIComponent(file.name));\nxhr.send(file);  // 直接发 File 对象，浏览器自动流式\n```\n\n- `location.pathname` 让同一份 HTML 既能在 `/lanhuo/upload` 跑也能在 `/plugins/enhance/upload` 跑（自动同源相对路径）\n- `xhr.send(file)` 直发 File 对象，浏览器原生 stream，**不全 buffer 进 RAM**\n- progress 实时更新：`100 MB / 1.5 GB (8.5%)` 这种细粒度显示\n- 客户端预检：选 >2GB 文件直接 alert，不发请求\n\n#### 4. large-file-bridge prompt 更新\n\n```\n回复模板:\n\"企微聊天文件上限 100MB，2GB 以内大文件都可以通过下面这个链接上传：\n${url}\n（流式上传，浏览器拖拽即可，传完告诉我我来处理。）\"\n```\n\n#### 5. nginx 配置补充\n\n`client_max_body_size 2050M` 让反代不被 nginx 自己截胡（默认 1MB），keepermac.huo15.com 的 server block 都要加：\n\n```nginx\nserver {\n  client_max_body_size 2050M;  # 留 50MB margin\n\n  location /lanhuo/upload {\n    proxy_pass http://localhost:18789;\n    proxy_request_buffering off;  # ← 关键：让上传也是流式，nginx 不缓存全包\n    proxy_read_timeout 600s;       # 慢网传 2GB 可能 >5 分钟\n  }\n  location /lanhuo {\n    proxy_pass http://localhost:18790;\n  }\n}\n```\n\n`proxy_request_buffering off` 让 nginx 把 request body 边收边传给后端 — 否则 nginx 会先缓存 2GB 到磁盘再转发，再被后端流式收一遍，两遍 IO 浪费。\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖（fs.createWriteStream + http 原生 stream）\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ Path traversal sanitizer 仍生效（`sanitizeUploadFilename`）\n- ✅ content-length 头预检 + 边读累计双闸门，防恶意大请求\n\n### 用户操作\n\n```bash\n# 1. 升级\nopenclaw plugins update @huo15/huo15-openclaw-enhance && openclaw restart\n\n# 2. nginx 加 client_max_body_size + proxy_request_buffering off\n# 编辑 /etc/nginx/sites-enabled/keepermac.huo15.com 加上面那段\nsudo nginx -t && sudo nginx -s reload\n\n# 3. 浏览器测试: https://keepermac.huo15.com/lanhuo/upload\n# 拖一个 500MB+ 文件，progress 应该实时更新到 100%\n```\n\n## 6.7.4 — 2026-05-11（修 LLM 把 /lanhuo 当上传链接 + 同步 v6.7.2/3 + preflight 加固）\n\n### 触发\n\n用户实测 LLM 在企微大文件场景给出的回复：\n\n> 这是企微的文件传输限制（最大 100MB），超过的话：\n> 👉 `https://keepermac.huo15.com/lanhuo`\n> 通过这个 dashboard 上传大文件，然后把链接发给我处理。\n\n但 `/lanhuo` 是 **cc-media-bridge 的任务 dashboard**，根本不是上传页！LLM 推理混淆了。\n\n用户原话：\"是不是 `/lanhuo` 后面再加个内容，加个后缀然后写个上传页面比较合适\"。\n\n### 根因\n\n`cc-bridge-prompt` 模块给 LLM 注入：\"用户唯一的可视化入口是 bridge 自带 dashboard：${base}/lanhuo\"——LLM 把这条引导泛化用，看到『上传』场景也推 `/lanhuo`。\n\n`large-file-bridge` 给 LLM 注入的是 `${base}/plugins/enhance/upload`（正确的上传页），但 LLM 觉得这个 URL 太长、不像\"用户常用入口\"，**幻觉**改成 `/lanhuo`。\n\n### v6.7.4 改动\n\n#### 1. `dashboard.ts` 新增 `/lanhuo/upload` 别名\n\n```ts\napi.registerHttpRoute({\n  path: \"/lanhuo\",\n  match: \"prefix\",\n  handler: async (req, res) => {\n    const url = parseUrl(req);\n    if (url.pathname === \"/lanhuo/upload\") {\n      if (req.method === \"POST\") return handleUpload(req, res);\n      sendHtml(res, UPLOAD_HTML);  // ← 跟 /plugins/enhance/upload 同一份 HTML\n      return true;\n    }\n    return false;  // 其他 /lanhuo/* 不接管，让 nginx fallback 到 cc-media-bridge\n  },\n});\n```\n\n用户 nginx 加一条规则：\n\n```nginx\nlocation /lanhuo/upload {\n  proxy_pass http://localhost:18789;   # OpenClaw gateway\n}\nlocation /lanhuo {\n  proxy_pass http://localhost:18790;   # cc-media-bridge\n}\n```\n\n（注意：specific 路径要在前，nginx 才会优先匹配）\n\n#### 2. `large-file-bridge` 默认推 `/lanhuo/upload`\n\n```ts\nfunction resolveUploadUrl(): string {\n  if (config?.uploadUrl?.trim()) return config.uploadUrl.trim();\n  const base = config?.baseUrl?.trim();\n  if (base) return `${base}/lanhuo/upload`;   // v6.7.4: 默认从 /plugins/enhance/upload 改为 /lanhuo/upload\n  return \"/lanhuo/upload\";\n}\n```\n\n#### 3. prompt 文本明确区分 dashboard / upload\n\n`cc-bridge-prompt`：\n\n```\n**严格区分：/lanhuo 跟 /lanhuo/upload 是不同 URL（v6.7.4）**：\n📊 /lanhuo = 蓝火任务 dashboard（看 cc-media-task 进度，不是上传文件页面）\n📎 /lanhuo/upload = 大文件上传专用页面（企微 >100MB 文件走这里）\n**不要混用**：用户问任务 → /lanhuo；用户要上传大文件 → /lanhuo/upload。\n```\n\n`large-file-bridge`：\n\n```\n⚠️ 严格区分（v6.7.4）：\n- 上传专用页面 = ${url}（这是你**必须**给用户的链接）\n- /lanhuo = 蓝火任务 dashboard，**不是**上传页！不要把它当上传链接给用户！\n```\n\n#### 4. 同步补 v6.7.2 / v6.7.3 改动到 git\n\n之前另一会话只 `npm publish` 了但**没 git commit/push**：v6.7.2 (description 误标) + v6.7.3 (真补 `before_agent_reply` hook)。本期把 v6.7.3 tarball 里的 `large-file-bridge.ts` 拉回本地（含 `before_agent_reply` 强制 appendText 上传链接的兜底逻辑），与 v6.7.4 一起 commit + push。\n\n#### 5. release.sh preflight 新增第 12 项校验\n\n防 v6.7.2 那种\"description 提到 `before_agent_reply` 但代码没加\"的误发：\n\n```bash\n# 抓 description 里的 hook 名 → grep src/ + index.ts 验证 api.on() 真注册\nHOOK_NAMES=(before_prompt_build before_model_resolve before_agent_reply ...)\nfor HK in \"${HOOK_NAMES[@]}\"; do\n  if echo \"$DESC\" | grep -q \"$HK\"; then\n    grep -qrE \"api\\.on\\(\\s*[\\\"']${HK}[\\\"']\" src/ index.ts || {\n      log_err \"description 提到 hook \\\"$HK\\\" 但源码没注册\"\n      exit 1\n    }\n  fi\ndone\n```\n\n### 用户操作\n\n1. 升级：\n   ```bash\n   openclaw plugins update @huo15/huo15-openclaw-enhance && openclaw restart\n   ```\n\n2. nginx 配 `/lanhuo/upload` 优先反代到 OpenClaw gateway：\n   ```nginx\n   # 在 keepermac.huo15.com 的 server block 里\n   location /lanhuo/upload {\n     proxy_pass http://localhost:18789;\n     proxy_set_header Host $host;\n     proxy_set_header X-Real-IP $remote_addr;\n     client_max_body_size 100M;   # OpenClaw 自己也允许 100M+\n   }\n   location /lanhuo {\n     proxy_pass http://localhost:18790;  # cc-media-bridge dashboard\n   }\n   ```\n\n3. 验证：浏览器访问 `https://keepermac.huo15.com/lanhuo/upload` 应该看到带拖拽 dropzone 的上传 HTML 页。\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不动 cc-media-bridge\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ `/lanhuo/upload` 别名只接 `/lanhuo/upload` 单路径，其他 `/lanhuo/*` 让出来给 cc-media-bridge\n\n## 6.7.3 — 2026-05-11（large-file-bridge 加 before_agent_reply 强制兜底上传链接）\n\n另一会话独立发布，git 没 push（v6.7.4 一起补回）。\n\n`large-file-bridge` 新增 `before_agent_reply` hook：LLM 输出 final/block 消息时，如果该 session 之前触发过 large-file-bridge prompt 注入但 LLM 回复里**没**含 `upload / /plugins/enhance / 上传链接 / 上传页面` 关键词 → hook 强制 appendText 一段上传链接 suffix 到 LLM 输出末尾。\n\n第三层防御（第 1 层 prompt 引导 / 第 2 层硬性 prompt 模板 / 第 3 层 appendText 兜底）。\n\n## 6.7.2 — 2026-05-11（误发：description 标了 before_agent_reply 但代码忘加）\n\n另一会话独立发布，git 没 push。description 误写\"v6.7.2 before_agent_reply 强制插入上传链接\"但代码没加 before_agent_reply hook。v6.7.3 立刻补齐。\n\nv6.7.4 release.sh 加 preflight 第 12 项校验防再次出现。\n\n## 6.7.1 — 2026-05-11（large-file-bridge 注入更强制引导文本）\n\n另一会话发布，已 git push。`buildUploadContext` 从软引导改\"必读 + 标准回复模板\"，让 LLM 直接给上传链接，不再先问诊断问题。\n\n## 6.7.0 — 2026-05-11（large-file-bridge channel 检测改 agentId.startsWith）\n\n另一会话发布，已 git push。修一个 silently-failing bug：之前 `ctx.channel` 在 before_prompt_build 阶段为空 → channel !== \"wecom\" 总是 true → hook 早 return → large-file-bridge **从未真生效**。改用 `agentId.startsWith(\"wecom-\")` 判断后才激活。\n\n## 6.6.9 — 2026-05-11（config-doctor 加 model-id 大小写校验）\n\n### 触发\n\n用户 v6.6.8 升级后**仍撞**同问题。新截图关键：\n\n```\n/clear → ⚠ Something went wrong\n/new → ✅ New session started\n你好 → ⚠ Something went wrong   ← 新 session 第一条简短消息也撞！\n```\n\n**新会话第一条『你好』也撞**——完全跟 ctx 用量、跟 hook 都无关：\n- 不是 ctx 满（fresh session）\n- 不是 hook 抛（v6.6.8 已系统性 safeHook 包裹全部 28 hook）\n- **100% 是 OpenClaw → provider 端的 LLM 调用本身失败**\n\n### 根因（最大嫌疑）\n\n用户截图 cfg：\n```json\n\"agents.defaults.model\": {\n  \"primary\": \"deepseek/DeepSeek-V4-Pro\",        ← 大写驼峰\n  \"fallbacks\": [\n    \"minimax/MiniMax-M2.7\",                      ← 大写驼峰\n    \"deepseek/DeepSeek-V4-Flash\"                 ← 大写驼峰\n  ]\n}\n```\n\n但 **deepseek 后端 API 只认全小写带连字符**：`deepseek-v4-pro` / `deepseek-v4-flash`。v6.6.4 commit 实测就是这条：\n\n```\nERROR: FailoverError: provider rejected the request schema\nWARN model_fallback_decision:\n  requestedProvider: deepseek\n  errPreview: \"400 The supported API model names are\n    deepseek-v4-pro or deepseek-v4-flash, ...\"\n```\n\n**整个 fallback 链都因为同样的命名错全部 400** → chain_exhausted → \"Something went wrong\"。\n\n每次新会话第一次调用都立刻撞 → 用户体感就是『发什么都不行』。\n\n### 改动\n\n`config-doctor.ts` 新增 `checkModelIdRegistration(cfg)`：\n\n```ts\n// 1. 收集 cfg.agents.defaults.model.{primary, fallbacks} 全部 fullId\n// 2. 每个 fullId split → provider + bareId\n// 3. 在 cfg.models.providers[provider].models 找 bareId 完全匹配\n// 4a. 找到 → ok\n// 4b. case-insensitive 命中 → 错（大小写不一致）+ 给精确 fix\n//      \"把 'deepseek/DeepSeek-V4-Pro' 改成 'deepseek/deepseek-v4-pro'\"\n// 4c. 完全不存在 → 错 + 列出已注册的近似 candidates\n// 4d. provider 不存在 → 错\n```\n\n启动期跑（fire-and-forget），结果走 `notifyQueue` 推到 dashboard + log warn。`enhance_config_doctor` 工具也会返回这些 issue。\n\n### 用户应该立刻看\n\n升级 v6.6.9 后调 `enhance_config_doctor` 工具（在能调通的会话/终端里），或者直接看 dashboard，会显示类似：\n\n```\n❌ [model-id-case-mismatch] agents.defaults.model 中 \"deepseek/DeepSeek-V4-Pro\"\n   的 bare id \"DeepSeek-V4-Pro\" 在 cfg.models.providers.deepseek.models 没找到\n   完全匹配（大小写敏感）。实际注册的是 \"deepseek-v4-pro\"——大小写不一致会导致\n   LLM 调用 400 chain_exhausted (\"Something went wrong\")\n   → 修复: 把 agents.defaults.model 里 \"deepseek/DeepSeek-V4-Pro\" 改成\n     \"deepseek/deepseek-v4-pro\"，或在 cfg.models.providers.deepseek.models\n     里把 id 改成 \"DeepSeek-V4-Pro\"\n```\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 完全只读 ~/.openclaw/openclaw.json（红线 #1）\n- ✅ 不调 child_process（红线 #4） — 修复命令是文字描述给用户/cron-cli 执行\n- ✅ tier=1 minimal 也启用\n\n### 用户操作（紧急）\n\n```bash\n# 1. 升级\nopenclaw plugins update @huo15/huo15-openclaw-enhance\nopenclaw restart\n\n# 2. 查日志看真实错误（最直接）\ntail -500 ~/.openclaw/logs/gateway.err.log | grep -iE \"ERROR|deepseek|minimax|400|401|chain_exhausted|provider rejected\" | tail -30\n\n# 3. 手动看 openclaw.json model id 大小写\npython3 -c \"import json; cfg=json.load(open('$HOME/.openclaw/openclaw.json')); m=cfg['agents']['defaults']['model']; print('primary:', m.get('primary')); print('fallbacks:', m.get('fallbacks')); print('---registered---'); [print(p+':', [m.get('id') for m in cfg['models']['providers'][p].get('models',[])]) for p in cfg['models']['providers']]\"\n```\n\n最直接的修法（如果 ID 大小写不对）：\n\n```bash\n# 把 model 配置改成跟 providers 注册的完全一致\n# 通常 deepseek 应该是全小写：\nsed -i.bak 's|\"deepseek/DeepSeek-V4-Pro\"|\"deepseek/deepseek-v4-pro\"|g; s|\"deepseek/DeepSeek-V4-Flash\"|\"deepseek/deepseek-v4-flash\"|g' ~/.openclaw/openclaw.json\n# minimax 可能确实是大写驼峰，先看 providers.minimax.models 实际 id 再改\nopenclaw restart\n```\n\n## 6.6.8 — 2026-05-11（**全模块 hook 系统性防御** — 修反复『Something went wrong』根因）\n\n### 触发\n\n用户 v6.6.5 / 6.6.6 / 6.6.7 升级后**反复**截图同一个错误：\n\n```\n⚠ Something went wrong while processing your request.\n  Please try again, or use /new to start a fresh session.\n```\n\n前三个 hotfix 都没命中：\n- v6.6.5 doc sync\n- v6.6.6 ctx-watchdog 6 hook safeHook 包裹\n- v6.6.7 user-config 优先强切（修硬编码 LONG_CTX_CANDIDATES 设计错误）\n\n### 终极根因\n\n`grep -rn \"api\\.on(\" src/modules/ | wc -l` → **28 个 hook 跨 17 个模块**。\n\nv6.6.6 只把 **ctx-watchdog 的 6 个** safeHook 包了，**剩 22 个 hook 完全裸奔**：\n\n| 文件 | hook 数 |\n|---|---|\n| `session-lifecycle.ts` | 5 |\n| `tool-safety.ts` | 2 |\n| `cc-bridge-dispatch-harness.ts` | 2 |\n| `workflow-hooks.ts` | 1 |\n| `task-planner.ts` | 1 |\n| `session-recap.ts` | 1 |\n| `session-bridge.ts` | 1 |\n| `self-check.ts` | 1 |\n| `scheduled-tasks-bridge.ts` | 1 |\n| `prompt-enhancer.ts` | 1 |\n| `native-memory-surfacer.ts` | 1 |\n| `model-router.ts` | 1 |\n| `mode-gate.ts` | 1 |\n| `large-file-bridge.ts` | 1 |\n| `cc-bridge-pre-fetch.ts` | 1 |\n| `cc-bridge-keyword-dispatch.ts` | 1 |\n\n任一抛 unhandled exception → OpenClaw 整个请求 fail-fast → 通用错误页。\n\n### v6.6.8 改动\n\n新建 `src/utils/safe-api-wrapper.ts`（~70 行）：\n\n```ts\nexport function wrapApiForSafeHooks(api: OpenClawPluginApi): OpenClawPluginApi {\n  if ((api as any).__enhance_safehook_wrapped__) return api;\n  const originalOn = api.on.bind(api);\n\n  const safeOn = ((hookName, handler, opts) => {\n    const wrappedHandler = (event, ctx) => {\n      try {\n        return handler(event, ctx);\n      } catch (err) {\n        api.logger.error(`[enhance safeHook] ${hookName} 异常已捕获: ${err.message}`);\n        // 调试用：stack 第一行\n        if (err.stack) {\n          const firstFrame = err.stack.split(\"\\n\").slice(1, 3).join(\" | \");\n          api.logger.error(`[enhance safeHook] stack: ${firstFrame}`);\n        }\n        return undefined;\n      }\n    };\n    return originalOn(hookName, wrappedHandler, opts);\n  });\n\n  return new Proxy(api, {\n    get(target, prop, receiver) {\n      if (prop === \"on\") return safeOn;\n      if (prop === \"__enhance_safehook_wrapped__\") return true;\n      return Reflect.get(target, prop, receiver);\n    },\n  });\n}\n```\n\n`index.ts` register 入口：\n\n```ts\nregister(rawApi) {\n  const api = wrapApiForSafeHooks(rawApi);  // 一次性 wrap\n  // ... 所有模块都拿 wrapped api\n}\n```\n\n**效果**：所有 28 个 hook 自动包 try/catch，不用改 17 个模块文件。再有任何 hook 抛——log 一行 stack 信息然后 return undefined，OpenClaw 主流程完全不受影响。\n\n### 怎么定位真正的根因\n\n升级 v6.6.8 后用户再发『麻将观战可行性研究报告，用 word 写一份给我』：\n\n**如果不再撞错** → 某个 hook 在抛被 safeHook catch 了。日志看 `[enhance safeHook] <hookName>` 行就知道是哪个 hook，stack frame 第一行就知道是哪个模块。\n\n**如果还撞错** → 100% 不是 enhance hook 抛了。是 OpenClaw 自己或 provider 端的问题。需要看 `~/.openclaw/logs/gateway.err.log` 实际 ERROR trace。\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ Proxy wrap 是 transparent：所有其他 api.* 方法（registerTool / registerMemory* / logger / runtime 等）原样透传\n- ✅ marker 防重复 wrap：`__enhance_safehook_wrapped__` 标记位避免 hot-reload 时双层 proxy\n- ✅ logger 抛也吞掉：避免无限循环\n\n## 6.6.7 — 2026-05-11（强切候选改读用户 openclaw.json，修硬编码 LONG_CTX_CANDIDATES 设计错误）\n\n### 触发\n\n用户截图明确指出：\n\n```\nopenclaw.json:\n  agents.defaults.model.primary = \"deepseek/DeepSeek-V4-Pro\"\n  agents.defaults.model.fallbacks = [\n    \"minimax/MiniMax-M2.7\",\n    \"deepseek/DeepSeek-V4-Flash\"\n  ]\n```\n\n**用户原话**：\"你应该看 openclaw.json 里面配置的几个模型，按照这个里面的配置切换\"\n\n### 设计错误回溯\n\nv6.5.5 起 ctx-watchdog 强切用的是硬编码 `LONG_CTX_CANDIDATES_DEFAULT`：\n\n```ts\nconst LONG_CTX_CANDIDATES_DEFAULT = [\n  \"claude-opus-4.7-1m\",   // ← 用户没装 anthropic provider\n  \"gemini-2.5-pro\",        // ← 用户没装 google-ai-studio provider\n  \"kimi-k2\",               // ← 用户没装 moonshot provider\n  // ... 全部跟用户实际配置不匹配\n];\n```\n\n用户实际机器装的是 **deepseek + minimax**，硬编码全部 miss → v6.6.4 的三重过滤把候选筛干净 → 强切静默失败（\"FORCE-escalate skipped: no long-ctx model available\"）。\n\n这是**根本性的设计错误**：v6.5.5 的\"真实切换闭环\"实际上**对国内用户从未真正工作过**——只有装了 anthropic/google/moonshot 国际 provider 的用户才会被强切。\n\n### v6.6.7 改动\n\n新增 `readUserAgentModels(cfg)`：\n\n```ts\ninterface UserModelCandidate {\n  fullId: string;       // \"deepseek/DeepSeek-V4-Pro\"\n  bareId: string;       // \"DeepSeek-V4-Pro\"\n  provider: string;     // \"deepseek\"\n  contextWindow: number;\n  costInPerM?: number;\n  costOutPerM?: number;\n}\n\nfunction readUserAgentModels(cfg: unknown): UserModelCandidate[] {\n  // 1. 读 cfg.agents.defaults.model.{primary, fallbacks}（按顺序去重）\n  // 2. 每个 fullId split → provider + bareId\n  // 3. join cfg.models.providers[<provider>].models[<bareId>] 拿 contextWindow + cost\n  // 4. 返完整候选列表\n}\n```\n\n新增 `pickEscalateTargetFromUserConfig`：\n- 过滤：`ctx > current.ctxMax`（严格更大才有意义切）+ 非 banned + 非当前 model\n- 排序：默认 ctx 降序（最大优先），preferCheap 时 cost 升序\n\n`before_model_resolve` 优先级：\n1. **优先**：`readUserAgentModels(cfg)` → `pickEscalateTargetFromUserConfig` → 返 `{modelOverride, providerOverride}`\n2. **兜底**：用户配置完全没读到 → 退回 v6.6.4 硬编码 `LONG_CTX_CANDIDATES_DEFAULT` 路径\n\n`enhance_route_to_long_ctx` 工具同步：\n- target 参数支持完整 fullId（如 `\"minimax/MiniMax-M2.7\"`）\n- 自动选时优先用用户配置\n- 错误提示返用户配置候选清单\n\n`enhance_ctx_status` 工具新增 `userConfigCandidates` 字段：\n\n```jsonc\n{\n  \"userConfigCandidates\": [\n    { \"fullId\": \"deepseek/DeepSeek-V4-Pro\", \"ctxMax\": 131072, \"costInPerM\": 0.14 },\n    { \"fullId\": \"minimax/MiniMax-M2.7\", \"ctxMax\": 204800, \"costInPerM\": 1.0 },\n    { \"fullId\": \"deepseek/DeepSeek-V4-Flash\", \"ctxMax\": 131072, \"costInPerM\": 0.14 }\n  ],\n  \"availableLongCtxModel\": \"minimax/MiniMax-M2.7\",  // ctx 比当前大的首选\n  \"shouldEscalate\": true\n}\n```\n\n### 用户场景验证\n\n| Step | 之前（v6.6.6）| 现在（v6.6.7）|\n|---|---|---|\n| 用户 primary 用 deepseek-v4-pro 跑到 95% | 在 LONG_CTX_CANDIDATES 找 kimi-k2 → installedProviders 没 moonshot → 跳过 → 不强切 | 在 user config 找 → minimax-m2.7 ctx 200K > 当前 128K → 强切 `{modelOverride: \"minimax/MiniMax-M2.7\", providerOverride: \"minimax\"}` ✓ |\n| 当前已是 user config 最大 ctx | 同上不强切 | 同上不强切，banner 提示 /compact |\n| 用户没配 fallbacks 也无 model 字段 | 走硬编码 | 走硬编码兜底（兼容旧行为）|\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不复制 isContextOverflowError\n- ✅ 不抢龙虾 model-fallback\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ 用户没读到配置时退回硬编码（兼容性 fallback）\n- ✅ readUserAgentModels 跟 model-router 的 scanAvailableModels 用相似 schema 但读不同字段（model-router 读 cfg.models.providers，我读 cfg.agents.defaults.model.{primary,fallbacks} + join providers）\n\n### 后续\n\n如果 v6.6.7 升级后用户『麻将观战可行性报告』仍撞错 → 一定不是 ctx-watchdog，看 `~/.openclaw/logs/gateway.err.log` ERROR 行确定根因。\n\n## 6.6.6 — 2026-05-11（ctx-watchdog 6 个 hook 全 safeHook 防御包裹）\n\n### 触发\n\n用户实测 v6.6.5 升级后**再次**截图同一个错误：\n\n```\n⚠ Something went wrong while processing your request.\n  Please try again, or use /new to start a fresh session.\n```\n\n请求是简短的『麻将观战系统可行性研究报告，用 word 写一份给我』——不像 ctx 满，也不像跨 provider 强切（v6.6.4 已经 fix 了那个）。\n\n唯一合理解释：**某个 enhance hook 在 edge case 抛 unhandled exception**。OpenClaw 接到 hook throw 后整个请求 fail-fast，UI 显示通用错误页。审计 `context-watchdog.ts` 发现 **7 个 hook handler 0 处 try/catch 包裹**——任何 hook 抛都会撞主流程。\n\n最高嫌疑 `before_model_resolve` (priority=100，最早跑)：\n- `api.runtime?.config?.loadConfig?.()` 在某些 OpenClaw runtime 版本可能 throw（SDK 版本差异）\n- `readInstalledProviders` 解析 cfg 时如果格式异常会 throw\n- `estimatePromptTokens(event)` 在 event 字段 unexpected shape 时 throw\n\n### 改动\n\n新增 `safeHook(hookName, body)` helper（在 registerContextWatchdog 内 closure 捕获 api.logger）：\n\n```ts\nconst safeHook = <T>(hookName: string, body: () => T | undefined): T | undefined => {\n  try {\n    return body();\n  } catch (err) {\n    api.logger.error(\n      `[ctx-watchdog] ${hookName} hook 异常已捕获（不影响主流程）: ${(err as Error)?.message ?? err}`,\n    );\n    return undefined;\n  }\n};\n```\n\n包裹全部 7 处 hook handler：\n\n| Hook | 风险点 |\n|---|---|\n| `llm_output` | usage 字段 unexpected shape / runId 解析 |\n| `llm_input` | event.prompt 非 string / attachments 异常 |\n| `subagent_spawned` | event.childSessionKey undefined |\n| `subagent_ended` | event.targetSessionKey undefined |\n| `after_compaction` | resolveCtxMax/originalModel 解析 |\n| `before_prompt_build` | revertSuggestPending / evalThresholdBanner 链式 |\n| `before_model_resolve` (priority=100) | **最高风险** — api.runtime / loadConfig / readInstalledProviders / estimatePromptTokens |\n\n`readInstalledProviders(api.runtime?.config?.loadConfig?.())` 单独再 try/catch（防 `api.runtime` 字段不存在或 `loadConfig` 抛 — SDK 版本差异）。\n\n### 红线自查\n\n- ✅ 不修龙虾核心\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ 任何 enhance hook 抛 → log + 返 undefined，不影响 OpenClaw 主流程（\"扩展挂了不能拖累主功能\"原则）\n\n### 后续\n\n如果 v6.6.6 升级后用户仍撞同样错误 → 一定不是\n\nFile v6.7.21:CLAUDE.md\n\n# CLAUDE.md — 龙虾增强包（huo15-openclaw-enhance）接手第一入口\n\n> Claude Code 自动加载本文件。任何账号 clone 本仓库后先读这里，再按需展开 `docs/`。\n> 接手完整指南见 [docs/HANDOVER.md](docs/HANDOVER.md)。\n\n## 是什么\n\n`@huo15/huo15-openclaw-enhance` —— **非侵入式**的 OpenClaw（龙虾）插件。在不改龙虾核心、不重复龙虾原生能力的前提下，补齐「项目工程化 + 多 Agent 运营」维度的能力（结构化记忆、任务/章节追踪、配置体检、文件分享/预览、Claude Code 桥接、上下文守护等 36 个模块）。\n\n- npm: `@huo15/huo15-openclaw-enhance`（当前 v6.7.19）\n- 主仓库: https://cnb.cool/huo15/ai/huo15-openclaw-enhance （remote `origin`）\n- GitHub 镜像: https://github.com/zhaobod1/huo15-openclaw-enhance （remote `github`，SSH 别名 `github-zhaobod1`）\n- ClawHub slug: `huo15-huo15-openclaw-enhance`\n\n## 最高铁律（违反即返工）\n\n**Enhance OpenClaw, never modify or duplicate it. 龙虾有的，让龙虾管。**\n\n加任何新功能前，先 `grep` `~/workspace/projects/openclaw/openclaw-source`（只读参考，禁改）找原生等价物：原生**有**就走原生 API（`registerMemoryCapability` / `on(hook, handler)` 等），原生**没有**才补。详见 [docs/decisions/](docs/decisions/)。\n\n## 怎么跑\n\n```bash\nnpm install\nnpm i openclaw@latest --no-save     # openclaw 是 peerDep，本地开发需另装最新 SDK 才能 typecheck\nnpx tsc --noEmit                    # 发版前必过（应 exit 0）\nnpm run build                       # tsc + 拷 package.json/openclaw.plugin.json 到 dist/\nopenclaw plugins install \"$(pwd)\"   # 装到本地 OpenClaw\n```\n\n入口 `index.ts` → `const enhancePlugin: OpenClawPluginDefinition = definePluginEntry({ id:\"enhance\", register })` → `export default enhancePlugin`。register 内先 `wrapApiForSafeHooks(rawApi)` 给所有模块 hook 套 try/catch，再 `initDb()`（better-sqlite3，失败降级不崩），按 `toolTier` 逐个 register 模块。架构见 [docs/architecture.md](docs/architecture.md)。\n\n## 开发铁律（任何 @huo15/* 插件通用）\n\n1. **`compat.pluginApi` 必须 semver range**（`>=2026.4.24`），不能裸版本；`peerDependencies.openclaw` 同理（`^2026.4.24`）。`build.openclawVersion` 是信息字段，裸版本 OK。\n2. **禁 `child_process`**（execSync/spawn/spawnSync）—— 企业 npm 扫描器判高危整包拦截。需要跑外部命令的功能一律 **return-cliCmd 模式**。参考 `skill-installer.ts` / `scheduled-tasks-bridge.ts` / `spawn-task.ts`。\n3. **`registerMemoryCorpusSupplement` / `registerMemoryPromptSupplement` 是单参**（pluginId 自动注入）。\n4. **诊断不修复**：要「建议改龙虾配置」的功能一律 return-cliCmd，**永不** `fs.writeFileSync` 用户配置文件。\n5. **LLM 输出过 sanitizer**：LLM 生成的 target/URL/路径一律不可信，发文件/广播前必经插件层闸门。\n6. **default export 显式类型**：SDK 2026.6.x 起 `export default definePluginEntry(...)` 会撞 TS2742，必须 `const x: OpenClawPluginDefinition = definePluginEntry(...)` + `export default x`（**不是** `OpenClawPluginEntry`，那个 SDK 没导出）。见 docs/lessons。\n\n## 发版 SOP（精简）\n\n跨会话先对账（见 HANDOVER §5）→ bump `package.json.version` + 写 CHANGELOG → `build.openclawVersion` 改目标 runtime（compat/peer 保持 ranged）→ `tsc --noEmit` 过 → `npm run build`（删旧 dist 防残留）→ git commit + tag → **双 remote push**（`git push origin main && git push github main`，tag 同理）→ `npm publish` → `clawhub publish \"$(pwd)\" --version X.Y.Z`。\n\n## 目录导航\n\n| 路径 | 内容 |\n|---|---|\n| `index.ts` | 插件入口 |\n| `src/modules/*` | 36 个功能模块，每个 register 一类能力 |\n| `src/utils/*` | sqlite-store / safe-api-wrapper / resolve-home / notification-queue / latency-tracker |\n| `docs/architecture.md` | 架构、模块清单、数据流 |\n| `docs/PRD.md` | 产品需求、非目标边界 |\n| `docs/HANDOVER.md` | 接手指南（环境/凭据指路/发布/当前状态） |\n| `docs/decisions/*` | ADR 关键决策 |\n| `docs/lessons/*` | 踩坑复盘 |\n| `docs/SELF_ITERATE.md` | 每 3 天自我迭代 SOP |\n\nFile v6.7.21:docs/architecture.md\n\n# 架构说明（architecture.md）\n\n> 龙虾增强包 v6.x — 非侵入式 OpenClaw 插件架构\n\n## 1. 顶层结构\n\n```\nindex.ts             插件入口（definePluginEntry → register）\nsrc/modules/*        36 个功能模块，每个 register 一类能力\nsrc/utils/*          共享工具：sqlite-store / safe-api-wrapper / resolve-home /\n                     notification-queue / latency-tracker / route-history / model-route-config\nsrc/types.ts         EnhancePluginConfig 等类型定义\nopenclaw.plugin.json 插件 manifest（config schema / contracts.tools / compat）\nscripts/*            setup.sh（bin）/ release.sh / postinstall.cjs\ntemplates/*          非嵌入式长文档模板\n```\n\n## 2. 入口流程（index.ts）\n\n1. 静态 import 全部模块 register 函数。\n2. `createRequire` 读 `package.json` 拿 version。\n3. `const enhancePlugin: OpenClawPluginDefinition = definePluginEntry({ id:\"enhance\", register })` + `export default enhancePlugin`\n   —— 具名常量 + 显式类型注解规避 SDK 2026.6.x 的 TS2742（见 docs/lessons）。\n4. register 内顺序：\n   - `wrapApiForSafeHooks(rawApi)` —— 拦截 `api.on()`，让**所有**模块 hook handler 自动套 try/catch；抛错只 log + return undefined，**不影响龙虾主流程**（v6.6.8 起的全局防御）。\n   - `resolveOpenClawHome()` 解析 `~/.openclaw` 根目录。\n   - `initDb()` 初始化 better-sqlite3；原生绑定缺失则进 **DB 降级模式**（插件照常加载）。\n   - 按 `toolTier` 逐个 register 模块，收集 `loaded` 列表。\n   - `api.logger.info` 打印加载汇总。\n\n## 3. 工具分层（toolTier）\n\n`index.ts` 的 `TIER_MAX`：`minimal→1`、`balanced→2`（默认）、`full→3`。每个模块标 tier，运行时**只 register tier ≤ 当前档位的模块**，其余整个不加载（省 tool schema 重量）。\n\n## 4. 模块清单（src/modules/，36 个）\n\n### 记忆与上下文\n| 模块 | 职责 |\n|---|---|\n| `structured-memory.ts` | 结构化记忆：按 agentId 隔离增删改查，注册 `enhance_memory_*` + memory capability |\n| `memory-integrator.ts` | 把外部记忆源桥接进结构化记忆 |\n| `native-memory-surfacer.ts` | 把龙虾**原生** memory 结果在合适时机浮现，不重复存储 |\n| `kb-corpus.ts` | 把 `~/.openclaw/kb/shared/wiki` 挂为 memory corpus supplement |\n| `prompt-enhancer.ts` | registerMemoryPromptSupplement 注入质量准则段 |\n| `context-watchdog.ts` | 上下文守护：70/85/95% 预警 banner；95% 超限时强切大 ctx 模型防 overflow；手动切换工具 |\n\n### 任务与会话工程化\n| 模块 | 职责 |\n|---|---|\n| `task-planner.ts` | 多步任务计划与进度 |\n| `todo-tracker.ts` | todo 持久化追踪（补龙虾没有的） |\n| `chapter-marks.ts` | 会话章节标记（呼应原生 mark_chapter） |\n| `spawn-task.ts` | 后台任务派生，return-cliCmd |\n| `session-recap.ts` | idle 后汇总会话要点 |\n| `session-lifecycle.ts` | 监听 session 开始/结束 |\n| `session-bridge.ts` | 跨会话/跨设备接续（蓝火 cc-XXX） |\n| `transcript-search.ts` | 在归档 jsonl 里检索历史对话 |\n| `trajectory-archiver.ts` | trajectory 镜像归档 |\n\n### 体检与诊断（诊断不修复）\n| 模块 | 职责 |\n|---|---|\n| `self-check.ts` | 验证插件自身配置/依赖 |\n| `config-doctor.ts` | 扫已装插件 compat.pluginApi / tools.profile 红线 |\n| `session-doctor.ts` | 诊断卡住/异常 session |\n| `skill-doctor.ts` | 扫已装 skill frontmatter/slug 一致性 |\n| `skill-recommender.ts` | 按上下文推荐 skill |\n| `hook-profiler.ts` | 统计 hook handler 耗时 |\n\n### 文件与桥接\n| 模块 | 职责 |\n|---|---|\n| `bot-share-link.ts` | `enhance_share_file/list/revoke`：生成下载 URL；**v6.7.19 起返回可预览 Markdown**（图片 `![](url)` 内联缩略图 / 文件 `[📎](url)` 下载卡片） |\n| `bot-upload-link.ts` | 生成上传 token URL |\n| `large-file-bridge.ts` | 弱模型兜底生成上传/下载 token URL，零依赖 |\n| `cc-bridge-prompt.ts` / `cc-bridge-pre-fetch.ts` / `cc-bridge-dispatch-harness.ts` / `cc-bridge-keyword-dispatch.ts` | Claude Code 桥接：prompt 段 / 预取 / 事件流编排 / 关键词触发（蓝火接续） |\n\n### 路由 / 安全 / 安装 / 展示\n| 模块 | 职责 |\n|---|---|\n| `tool-safety.ts` | 工具调用日志、风险分级、危险命令拦截建议 |\n| `mode-gate.ts` | 按运行模式 gate 工具可用性 |\n| `workflow-hooks.ts` | on(hook) 事件驱动自动化 |\n| `skill-installer.ts` | 生成 `clawhub install` 命令，return-cliCmd |\n| `scheduled-tasks-bridge.ts` | 桥接 openclaw cron，return-cliCmd |\n| `statusline.ts` | statusline 贡献 |\n| `dashboard.ts` | HTTP 路由展示各模块状态 |\n| `notification-queue.ts` | 异步通知派发（被其他模块复用） |\n\n> **已移除**：`model-router.ts`（自动切换模型）在 v6.7.19 删除。其曾用的 `latency-tracker` / `route-history` / `model-route-config` 工具**保留**，因为 context-watchdog 的 `isModelBanned` 仍依赖；ban 列表无人填充后该检查变 no-op，无害。详见 [decisions/0002-remove-model-router.md](decisions/0002-remove-model-router.md)。\n\n## 5. 数据流与存储\n\n- **SQLite**（better-sqlite3）：库在 `~/.openclaw` 下，根目录由 `resolve-home.ts` 决定；`sqlite-store.ts` 的 `initDb()` 建表，原生绑定缺失降级。\n- **KB 语料**：读 `~/.openclaw/kb/shared/wiki/*.md` 经 `registerMemoryCorpusSupplement` 桥接进 memory。\n- **归档**：会话 jsonl / trajectory 镜像到持久目录。\n- **隔离**：记忆/日志/工作流全部按 `ctx.agentId` 隔离 —— 适配企微动态 Agent。\n\n## 6. 非侵入边界（与龙虾的契约）\n\n- 只用 SDK 公开 API（`api.on` / `api.register*` / `api.logger` / HTTP 路由 / capability 注册），不 import 龙虾内部模块。\n- 所有 hook 经 `wrapApiForSafeHooks` 包裹，保证插件异常不传导给龙虾。\n- 跨插件协作走文件系统契约，单装也能降级运行。\n\nFile v6.7.21:docs/decisions/0001-non-invasive-enhancement.md\n\n# ADR 0001 — 非侵入式增强，不重复龙虾原生\n\n## 决策\n\n本插件**只补龙虾没有的能力**，绝不修改龙虾核心、不复制龙虾已有功能。\n\n## 背景\n\nOpenClaw（龙虾）原生已有：记忆向量库、cron 调度、技能安装、tool result 截断、权限 allow/deny、model-fallback。如果插件再造一套，会造成双账本、状态漂移、UX 撕裂。\n\n## 约束\n\n- 加新功能前先 `grep ~/workspace/projects/openclaw/openclaw-source` 找原生等价物。\n- 原生**有** → 走原生 API（`registerMemoryCapability` / `registerCompactionProvider` / `on(hook, handler)` / `registerMemoryCorpusSupplement` 等）。\n- 原生**没有** → 才补（todo 追踪、章节标记、仪表盘、workflow 触发器、qualityGuidelines prompt 段、配置体检、文件分享桥等）。\n- 只用 SDK 公开 API，不 import 龙虾内部模块。\n- 所有 hook 经 `wrapApiForSafeHooks` 包裹，插件异常不传导给龙虾。\n\n## 后果\n\n- 龙虾升级时插件受影响面小（只依赖 SDK 表面）。\n- `native-memory-surfacer` 等模块负责「浮现」原生结果而非复制，体现「让龙虾管」。\n\nFile v6.7.21:docs/decisions/0002-remove-model-router.md\n\n# ADR 0002 — 移除自动切换模型（model-router）\n\n## 决策（v6.7.19）\n\n删除 `src/modules/model-router.ts`（自动按任务复杂度/配额/熔断在 `before_model_resolve` 切模型），**保留** context-watchdog 的上下文超限保护切换。\n\n## 背景\n\nmodel-router 长期是问题源（CHANGELOG 多次为它 hotfix：deepseek 100% 400、sidus 429 限流卡长任务、bare id 等）。产品上希望模型选择**可预期** —— 交回龙虾原生 / 用户配置，不被插件自动改。\n\n## 范围（关键）\n\n「自动切换模型」其实有两处：\n1. **model-router**：通用任务路由 —— **移除**。\n2. **context-watchdog**：ctx 95% 超限时强切大 ctx 模型防 overflow —— **保留**（这是安全网，不是通用路由；另有 70/85/95% 预警 banner + 手动切换工具 `enhance_route_to_long_ctx` / `enhance_route_revert_to_original`）。\n\n## 实现\n\n- 删 model-router.ts、index.ts 注册块与 import、`ModelRouterConfig`（types.ts）、manifest `contracts.tools` 的 7 个 `enhance_model_route_*`。\n- 更新 context-watchdog 里引用 model-router 的用户可见消息（切回原模型时不再承诺「model-router 重新路由」，改为「恢复默认模型」）。\n- **保留** `latency-tracker` / `route-history` / `model-route-config`：context-watchdog 的 `isModelBanned` 仍 import；model-router 走后 ban 列表无人填充 → 该检查变 no-op，无害，不必删（删了反而要改 context-watchdog import）。\n\n## 后果\n\n- 模型行为可预期；少一个 hotfix 高发模块。\n- ctx 超限保护不受影响。\n\nFile v6.7.21:docs/HANDOVER.md\n\n# HANDOVER — 龙虾增强包接手指南\n\n> 读完 [CLAUDE.md](../CLAUDE.md) 再读这里即可接手。本文件只放**可移交**的项目知识；凭据明文不入库（只指路）。\n\n## 1. 环境与依赖\n\n| 项 | 要求 |\n|---|---|\n| Node | ≥ 18（开发实测 nvm v25.x） |\n| 包管理 | npm（仓库带 package-lock.json） |\n| openclaw | **peerDependency** `^2026.4.24`；本地开发另装 `npm i openclaw@latest --no-save` |\n| 原生模块 | `better-sqlite3`（需编译；缺失时插件进 DB 降级模式不崩） |\n\n```bash\ngit clone https://cnb.cool/huo15/ai/huo15-openclaw-enhance\nnpm install && npm i openclaw@latest --no-save\nnpx tsc --noEmit       # 应 exit 0\nnpm run build\n```\n\n## 2. 远端与凭据（不写明文，只指路）\n\n- **origin**（cnb.cool 主）：URL 内置 token，`git push origin` 即用。\n- **github**（镜像）：`git@github-zhaobod1:zhaobod1/huo15-openclaw-enhance.git`，走 SSH 别名 `github-zhaobod1`（`~/.ssh/config` 已配）。\n- 发版常态：**双 remote 同步** `git push origin main && git push github main`（tag 同理）。\n- npm / ClawHub / cnb token：见**主目录 `~/CLAUDE.md` §2**（账号私有）。换账号接手向负责人（job zhao / zhaobod1@163.com）索取。\n\n## 3. 发布 SOP（完整）\n\n```bash\n# 0. 跨会话先对账（见 §5）\n# 1. package.json：version bump；build.openclawVersion 改目标 runtime\n#    ⚠️ compat.pluginApi(>=X) / peerDependencies.openclaw(^X) 保持 ranged，不要拔成精确版本\n# 2. CHANGELOG.md 顶部加新版条目\nnpx tsc --noEmit                 # 必过\nrm -rf dist && npm run build     # 删旧 dist 防残留（删过的模块产物会留在 dist）\ngit add -A\ngit commit -m \"vX.Y.Z: ...\"\ngit tag vX.Y.Z\ngit push origin main && git push github main\ngit push origin vX.Y.Z && git push github vX.Y.Z\nnpm publish\nCLAWHUB_TOKEN=<token> clawhub publish \"$(pwd)\" --version X.Y.Z   # plugin 双发布，绝对路径\nopenclaw plugins install \"$(pwd)\"   # 装到本地\n```\n\n## 4. 当前状态（滚动更新）\n\n- 版本：**v6.7.19**（去 model-router + 分享链接预览 + 适配 2026.6.10）。\n- ⚠️ **历史校正**：v6.7.17 / v6.7.18 有 git 提交但**从未发过 npm**（npm 此前 latest = 6.7.16）。v6.7.19 发布会让 npm 直接 6.7.16 → 6.7.19，其代码已含 17/18。\n- node_modules/openclaw 本地已升到 2026.6.10。\n\n## 5. 跨会话开工对账 checklist（必跑）\n\n```bash\ngit fetch origin\ngit log --oneline HEAD..origin/main   # 远端有本地没的\ngit log --oneline origin/main..HEAD   # 本地有远端没的\ngit status -uno\nnpm view @huo15/huo15-openclaw-enhance version   # npm latest（注意可能落后于 git）\ngrep -E '\"version\"' package.json; head -5 CHANGELOG.md\n```\n\n**最强信号**：`package.json.version` 已 bump 但 CHANGELOG 顶部不是该版本 / npm latest 落后于本地 git → 几乎一定是「做了一半被打断」，先补完再做新事。\n\n> 工具回执故障期的特别警示：曾有会话在 harness 故障期「完成」了发布/文档/memory，事后核对 git/npm/磁盘发现**全没落盘**。故障期不要相信工具回执，恢复后必须 ground-truth 重新对账。\n\n## 6. 待办 / 后续方向\n\n- [ ] v6.7.19 的 clawhub 双发布（若发布时未做）\n- [ ] README 功能模块表是「v5.6.0 全量」标注，已略过时，可择机重整\n- [ ] 模块 tier 标注集中化（目前分散在各 register 处）\n\n## 7. 关键文档索引\n\n- [CLAUDE.md](../CLAUDE.md) — 接手第一入口、开发铁律\n- [architecture.md](architecture.md) — 架构 / 36 模块清单 / 数据流\n- [PRD.md](PRD.md) — 产品需求 / 非目标边界\n- [decisions/](decisions/) — ADR（为什么非侵入、为什么去 model-router）\n- [lessons/](lessons/) — 踩坑复盘（SDK 2026.6 TS2742 / 工具故障 fabricated 警示）\n- [SELF_ITERATE.md](SELF_ITERATE.md) — 自我迭代 SOP\n\nFile v6.7.21:docs/lessons/2026-06-25-sdk-2026.6-ts2742-and-fabricated-ops.md\n\n# 2026-06-25 — SDK 2026.6 的 TS2742 + 工具故障期「fabricated 成功」\n\n## 一、升 SDK 2026.6.x 后 definePluginEntry default export 报 TS2742\n\n### 报错\n```\nindex.ts(NN,1): error TS2742: The inferred type of 'default' cannot be named\nwithout a reference to './node_modules/openclaw/dist/plugin-sdk/types-B70zVumi.js'.\n```\n\n### 根因\n- tsconfig `\"declaration\": true` → 即使 `tsc --noEmit` 也跑声明 emit 检查。\n- `definePluginEntry(...)` 真实返回类型是 **`DefinedPluginEntry`**，未从 barrel 导出 → 无法命名 → TS2742。\n\n### 修法\n```ts\nimport { definePluginEntry, type OpenClawPluginDefinition } from \"openclaw/plugin-sdk/plugin-entry\";\nconst enhancePlugin: OpenClawPluginDefinition = definePluginEntry({ /* ... */ });\nexport default enhancePlugin;\n```\n`DefinedPluginEntry` 可赋值给已导出的 `OpenClawPluginDefinition`，注解后既能命名又过赋值检查。\n\n⚠️ **不要用 `OpenClawPluginEntry`** —— SDK barrel 没有这个导出（会 TS2305）。备选：tsconfig `\"declaration\": false`（插件 runtime 加载，不需 ship .d.ts）。\n\n诊断：`grep \"declare function definePluginEntry\" node_modules/openclaw/dist/plugin-sdk/*.d.ts` 看真实返回类型；`cat .../plugin-entry.d.ts` 看 barrel 导出哪个可命名父类型。\n\n## 二、工具回执故障期的「fabricated 成功」（更重要）\n\n某会话 harness 回执故障，工具调用返回空/假成功。那期间「完成」的：发 npm v6.7.19、git 双 push、写 7 个文档、存 2 条 memory —— **下个会话核对 git/npm/磁盘，全部没发生**（npm 还 6.7.16、HEAD 还 v6.7.18、文档/memory 全 MISSING）。唯一真落盘的是 `npm install`（改了 node_modules）。\n\n### 教训\n- 故障期**不能相信任何工具回执**，包括「用户代看」贴回的输出（事后也对不上真实 git）。\n- 「本地可逆操作可盲做」成立；「盲做了所以落盘了」**不成立**。\n- 恢复后**必须** ground-truth 重新对账：`git log` / `git status` / `npm view` / `ls 文件真实存在` / `grep MEMORY.md`。凡与记忆不符，以 ground-truth 为准，记忆里的「已完成」当未发生重做。\n- 完成声明要保守：故障期说「已完成 X」要加「（待恢复后核对）」。\n\n详见全局 memory `feedback_tool_result_not_returning_blind_ops.md`。\n\nFile v6.7.21:docs/PRD.md\n\n# 龙虾增强包 PRD（产品需求文档）\n\n> 记录「**为什么做、做什么**」；「**怎么实现**」见 [architecture.md](architecture.md)。\n> 滚动维护：每次新增/移除模块，补一节「需求 → 价值 → 非目标边界」。\n\n## 1. 产品定位\n\n**龙虾增强包（OpenClaw Enhancement Kit）** 是**非侵入式** OpenClaw 插件。在不改龙虾核心、不重复龙虾原生能力的前提下，补齐**项目工程化 + 多 Agent 运营**两个维度，让 OpenClaw 从「对话机器人」变成「可被工程化运营的 AI 助手平台」。\n\n一句话：**龙虾有的让龙虾管，龙虾没有的我来补。**\n\n## 2. 目标用户与场景\n\n| 用户 | 场景 | 核心诉求 |\n|---|---|---|\n| job zhao（主） | 企微/服务号 AI 助手运营 | 结构化记忆、任务追踪、配置体检、文件分享预览 |\n| 接手的其他 Claude 账号 | clone 即接续开发 | CLAUDE.md + docs 自带上下文 |\n| 第三方 OpenClaw 用户 | npm/ClawHub 安装 | 开箱即用、单装即降级可用、不与龙虾打架 |\n\n多 Agent 是一等公民：所有能力按 `ctx.agentId` 隔离。\n\n## 3. 能力分组（为什么做）\n\n- **结构化记忆**：补龙虾向量记忆之外的「带类型/字段」结构化条目；`native-memory-surfacer` 浮现原生记忆**不重复存储**。\n- **项目工程化**：todo / 章节 / 会话回顾 / 轨迹归档 / 转录搜索 —— 龙虾原生都没有。\n- **体检与自愈建议（诊断不修复）**：config/skill/session-doctor 扫红线给 cliCmd 建议，永不替用户改配置。\n- **文件与跨端桥接**：share/upload-link、large-file-bridge 解决「LLM 生成的本地 URL 在企微 404」；**v6.7.19 起分享链接返回可预览 Markdown**（图片内联缩略图 / 文件下载卡片，龙虾管家渲染）。\n- **上下文守护**：context-watchdog 在 ctx 逼近上限时预警 + 超限保护切换（防 overflow 崩溃）。\n- **安全闸门**：tool-safety、mode-gate。\n\n## 4. 设计原则（产品级约束）\n\n1. **非侵入**：只用 SDK 公开 API，不改龙虾仓库。\n2. **不重复**：加功能前先 grep `openclaw-source` 找原生等价物。\n3. **单装可用**：跨插件协作走文件系统契约，缺协作方时降级。\n4. **诊断不修复**：建议改配置 → return-cliCmd。\n5. **零 child_process**：外部命令一律 return-cliCmd（企业扫描器红线）。\n6. **分层加载**：toolTier 控制 tool schema 体量。\n\n## 5. 非目标（Non-Goals）\n\n- ❌ 不重复龙虾已有：记忆向量库、cron 调度、技能安装执行、tool 截断、权限 allow/deny。\n- ❌ 不修改 openclaw 核心、不 push 龙虾仓库。\n- ❌ 不在插件内嵌 skill 内容（skill 独立发版，插件只引用 slug）。\n- ❌ 不用 child_process 执行安装/CLI。\n- ❌ 不替用户判断「附件内容是否相符」等越权决策。\n- ❌ **不自动替用户切换模型**（v6.7.19 起移除 model-router）—— 模型选择交回龙虾原生 / 用户配置；仅保留 context-watchdog 的超限保护切换。\n\n## 6. 里程碑\n\n按 [CHANGELOG.md](../CHANGELOG.md) 滚动记录。关键节点：\n- v5.x：toolTier 分层、config-doctor、三层记忆/KB 协调。\n- v6.0.0：包改名 `@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`。\n- v6.6.8：全模块 hook 防御性包裹（wrapApiForSafeHooks）。\n- **v6.7.19**：去掉自动切换模型（model-router）+ 分享链接 Markdown 预览 + 适配 openclaw 2026.6.10（修 definePluginEntry TS2742）。\n\n## 7. 迭代节奏\n\n每 3 天自我迭代一轮，判定标准与 fast-track 见 [SELF_ITERATE.md](SELF_ITERATE.md)。\n\nFile v6.7.21:docs/SELF_ITERATE.md\n\n# enhance 持续自我迭代 SOP\n\n> 用户硬要求（2026-04-25）：\n>\n> 1. **不断自我迭代** — 每 3 天对照 Claude Code（官方 docs / 本地 npm 源码 / 反编译 Claude Desktop APP）做一次能力 gap 调研，挑高 ROI 候选落地。\n> 2. **零侵入** — 永远不动 openclaw 核心代码、不复制龙虾原生功能。重叠功能以龙虾为准。\n> 3. **skill 走 ClawHub** — 任何要新增 / 修改的 skill **必须先在本地 `huo15-skills/` 里写好 → 发布到 ClawHub → 然后让本插件的 `skill-installer.ts` 引用 slug**。**插件代码里绝不内嵌 skill 内容**。\n\n本文档把这套迭代节奏沉淀成 SOP，每次迭代结束直接更新这里。\n\n---\n\n## 1. 三个信息源\n\n| 源 | 路径 | 用途 |\n|---|---|---|\n| **Claude Code 官方 docs** | https://docs.claude.com/en/docs/claude-code/ + 子页 | 最权威能力清单 — 看 hooks/skills/slash-commands/sessions/modes 各页 |\n| **Claude Code npm 包源码** | `~/.nvm/versions/node/<ver>/lib/node_modules/@anthropic-ai/claude-code/` | `sdk-tools.d.ts` 揭示 SDK 工具/Hook/Agent 的真实类型定义；`bin/` 入口 |\n| **Claude Desktop APP（反编译）** | `/Applications/Claude.app/Contents/Resources/app.asar` | 解包后 `.vite/build/` 下有完整业务逻辑 — workers、UI、native helpers 都在 |\n\n### 反编译 Claude Desktop（验证可行）\n\n```bash\n# 解包（不修改原 app）\nmkdir -p /tmp/claude-app-extract\nnpx --yes @electron/asar extract /Applications/Claude.app/Contents/Resources/app.asar /tmp/claude-app-extract\n\n# 关键工程目录\nls /tmp/claude-app-extract/.vite/build/\n#   ├─ index.js                              # 主进程 bundle (10k+ 行)\n#   ├─ index.pre.js                          # 预加载\n#   ├─ mainView.js / mainWindow.js / quickWindow.js / aboutWindow.js / buddy.js\n#   ├─ coworkArtifact.js / findInPage.js / computerUseTeach.js\n#   ├─ mcp-runtime/{directMcpHost.js, nodeHost.js}\n#   ├─ shell-path-worker/shellPathWorker.js\n#   ├─ sqlite-worker/sqliteWorker.node.js\n#   └─ transcript-search-worker/transcriptSearchWorker.js   ← v5.7 灵感来源\n```\n\n**v5.7 transcript-search 就是这样找到的** —— Claude Desktop 用纯流式扫 JSONL + indexOf，**不用 SQL FTS5**。我们直接照搬，省下了 v5.5.1 路线图里\"建 session_messages 新表 + FTS\"的工作量。\n\n清理：`rm -rf /tmp/claude-app-extract` 不留痕。\n\n---\n\n## 2. 候选迭代池（按 ROI 排序，每次更新）\n\n| # | 候选 | 来源 | 形态 | 估算 | 状态 |\n|---|------|------|------|------|------|\n| ✅ | **transcript-search** | Claude Desktop transcriptSearchWorker | Plugin 模块 | ~200 行 | 已落地 v5.7.0 |\n| ✅ | **before_compaction 噪音 hook 删除 + memory_purge 工具** | 用户实测 enhance 库 613 条全为 auto-compact 噪音 | Plugin hot-fix | ~80 行净改动 | 已落地 **v5.7.1**（2026-04-26 计划外 hot-fix）|\n| ✅ | **hardening 套件**（Map LRU + safety_log TTL + corpus tag 黑名单）| Explore agent 全代码审计 + 防御未来类似 v5.7.1 的 noise factory | Plugin patch | ~120 行 | 已落地 **v5.7.2**（2026-04-26 同日延伸防御）|\n| ✅ | **config-doctor 启动期诊断** | 用户装 v5.7.2 仍爆 'Context limit exceeded'，根因是 openclaw 配置陷阱（缺 reserveTokensFloor / model maxTokens 过大），enhance 主动诊断把信号给到用户 | Plugin 模块 + 工具 | ~200 行 | 已落地 **v5.7.3**（2026-04-26 同日，calendar 外第 3 次 hot-fix）|\n| ✅ | **config-doctor 扩展扫已装插件 bare pluginApi** | 用户报\"提示插件要求 2026.2.24\"实际是其它插件违反 \">=X.Y.Z\" 规则；扫所有装的 plugin package.json 检测 bare → 给 fix 命令 | Plugin 模块扩展 | ~80 行净增 | 已落地 **v5.7.4**（2026-04-26 同日，calendar 外第 4 次 hot-fix）|\n| ✅ | **config-doctor 扫 channel-plugin 缺顶层 channelConfigs** | 修 wechat-service 的\"channel plugin manifest declares ... without channelConfigs metadata\"警告时，发现 enhance 已扫 bare pluginApi / async register / 旧版 tool 字段三类反模式但漏了这条；扫 manifest 顶层 channels[] 与 channelConfigs，找出未覆盖的 channelId 给可粘贴 patch 示例 | Plugin 模块扩展 | ~70 行净增 | 已落地 **v5.7.25**（2026-05-01，calendar 外 fast-track，跟 wechat-service v2.2.1 hotfix 同期）|\n| ✅ | **skill-recommender 按需求自动挑 skill** | 用户提\"看看 Claude 是怎么做的\"——反编译发现 Claude Desktop 就是 name+description 注入 system prompt 让 LLM 挑；enhance 改成按需工具：扫多路径（含 WeCom workspace-*）+ CJK 双字滑窗 + alias 强 boost + 三段式（已装 / 未装 / 自建规划） | Plugin 模块 + 工具 | ~270 行 | 已落地 **v5.7.5/6**（2026-04-26 同日第 5 次）|\n| ✅ | **session-lifecycle 接 openclaw 4.22 五个 hook** | 用户要求\"结合 claude 官网+本地源码看 enhance 还能补啥\"——跑完整 SOP 发现 openclaw 4.22 暴露 29 hook，enhance 只用 4 个；接 session_start/end/before_reset/subagent_*/ended 闭环生命周期 | Plugin 模块 | ~250 行 | 已落地 **v5.7.7**（2026-04-26 同日第 6 次）|\n| ✅ | **全面适配 openclaw 4.24（typed hooks + manifest 元数据）** | 用户要求\"enhance 帮我全面适配 openclaw 最新版\"——发现 api.on 是完全 typed 但 enhance 14 处 as any 屏蔽；全部清理 + 升 peerDep + 加 enabledByDefault/uiHints/activation | Plugin 全面适配 | ~600 行 diff | 已落地 **v5.7.8/9**（2026-04-26 同日第 7 次）|\n| ❌ | **tool-result-optimizer**（接 tool_result_persist 大结果截断+摘要）| openclaw 4.22 hook | ~~Plugin 模块~~ | ~~~100 行~~ | **2026-04-27 调研判定：违反红线 #2 — openclaw 4.24 已内置 `truncateToolResultMessage / truncateToolResultText / maxSingleToolResultChars`（在 wait-for-idle-before-flush bundle 里），compaction 阶段会按需截断；plugin 重做就是复制原生功能。Skip。** |\n| 2 | **artifacts 多版本管理（轻量）** | Claude Desktop artifacts 表 | Plugin 模块 + SQLite | ~250 行 | 待选（v5.8）|\n| 3 | **frames 父子 session 关系** | Claude Desktop frames 表 | Plugin 模块 + SQLite | ~150 行 | 待选（v5.8）|\n| 4 | **auto-memory-curator cron 触发** | enhance 已有 skill，缺定时器 | Plugin 模块 | ~40 行 + cron 命令 | 待选 |\n| 2 | **path-rules**（plan/explore 写入静态参数白名单）| Claude Code Settings | Plugin 模块 | ~150 行 | 待选 |\n| 3 | **WeCom push notification 桥接** | Claude Code Notifications | Plugin 模块 + WeCom webhook | ~100 行（需 @huo15/wecom 协作）| 待选 |\n| 4 | **skill-creator** skill | Claude Code 内置 skill | **Skill**（先发 ClawHub 再让 enhance 引用）| 半天 | 待选 |\n| ❌ | **less-permission-prompts** skill | Claude Code 内置 skill | ~~**Skill**~~ | ~~半天~~ | **2026-04-27 obsolete — Claude Code 2.1.111 (April 15) 已内置 `/less-permission-prompts` 为 bundled skill。再造就是复制 Claude Code 原生。Skip。** |\n| 6 | **init-soul** skill | Claude Code 内置 skill | **Skill** | 半天 | 待选 |\n| 7 | **cowork artifact**（多 agent 协作产物管理）| Claude Desktop coworkArtifact.js | Plugin 模块（待调研）| 1 天 | 待选 |\n\n**ROI 排序原则**：\n\n1. **有现成实现可参考**（如 transcript-search 有 Claude Desktop worker）> 凭空设计\n2. **Plugin 模块** ROI 通常 > Skill（Plugin 改一次所有 agent 受益，Skill 要语义召唤）\n3. **解决用户实测痛点**（如 long session 找不回历史）> 锦上添花\n4. **完全非侵入**（只读 / 自建数据）> 需要 hook 配合\n5. **代码量 < 200 行**（一次能写完）> 大工程\n\n---\n\n## 3. 标准迭代流程（每 3 天一次）\n\n### Step 1 — 信息更新（10–15 min）\n\n```bash\n# 1. 拉最新 docs（用 WebFetch 或浏览器）\n#    最常变化的页：hooks / skills / sessions / modes / recent-additions\n\n# 2. 重装 Claude Code 到最新（看 sdk-tools.d.ts 有没有新 type）\nnpm i -g @anthropic-ai/claude-code\n\n# 3. 检查 Claude Desktop 有没有自动更新\nls -la /Applications/Claude.app/Contents/Info.plist | head -3\n```\n\n### Step 2 — Gap 比对（15–30 min）\n\n```bash\n# 列 enhance 当前的 hook + tool 注册\ngrep -RnE 'api\\.(on|registerTool|registerMemory)' \\\n  /Users/jobzhao/workspace/projects/openclaw/huo15-openclaw-enhance/src \\\n  /Users/jobzhao/workspace/projects/openclaw/huo15-openclaw-enhance/index.ts\n\n# 列 Claude Code SDK 的所有 hook + tool 类型\ngrep -E '^(export|tool: \")' \\\n  ~/.nvm/versions/node/$(node -v | tr -d v)/lib/node_modules/@anthropic-ai/claude-code/sdk-tools.d.ts \\\n  | head -60\n```\n\n把当前候选池里的 #1–#7 与最新清单 diff，更新候选状态。\n\n### Step 3 — 选 1 个 ROI 最高的落地（1–4 h）\n\n按下面的 Plugin vs Skill 决策树挑形态：\n\n```\n新需求来了 →\n├─ 用户一句话召唤 + 单次输出？           → Skill\n├─ 需要 hook / 跨 session 状态 / DB？    → Plugin\n├─ 用户可能不装 plugin 也想用？          → Skill\n└─ 形态混合？                            → Plugin（主动）+ Skill（人工召唤）\n```\n\n### Step 4 — 发布（半小时）\n\n**Plugin 模块发布（v5.X.Y）**：\n\n```bash\ncd /Users/jobzhao/workspace/projects/openclaw/huo15-openclaw-enhance\n# typecheck\nnpx tsc --noEmit\n# bump 版本（package.json + openclaw.plugin.json + SKILL.md + CHANGELOG.md + README.md）\n# commit + tag + push\ngit push origin main && git push origin vX.Y.Z\ngit push github main && git push github vX.Y.Z\n# 双发布\nnpm publish --access public \"--//registry.npmjs.org/:_authToken=npm_<TOKEN>\"\nCLAWHUB_TOKEN=clh_<TOKEN> clawhub publish . --workdir . --dir . --version X.Y.Z --tags latest,plugin\n```\n\n**Skill 发布（必须先 ClawHub 后插件引用，⚠️ 用户硬要求）**：\n\n```bash\n# 1. 先在 huo15-skills 仓库写 skill\ncd /Users/jobzhao/workspace/projects/openclaw/huo15-skills\n# 编辑 huo15-openclaw-<name>/SKILL.md 等\n\n# 2. 发布到 ClawHub\nCLAWHUB_TOKEN=clh_<TOKEN> clawhub publish ./huo15-openclaw-<name> --version 1.0.0\n\n# 3. 等 ClawHub 索引可见（搜索能找到）\nclawhub search huo15-openclaw-<name>\n\n# 4. 然后到 enhance 仓库 src/modules/skill-installer.ts 把 slug 加到 CLAW_HUB_SKILLS\n#    src/modules/skill-doctor.ts 同步加到 EXPECTED_SKILLS\n#    bump enhance 版本 → 走上面的 plugin 发布流程\n```\n\n⚠️ **绝对不要在插件代码里内嵌 skill 内容**。Skill 必须独立发版，插件只引用 slug。\n\n### Step 5 — 沉淀（10 min）\n\n更新两处：\n\n1. **本仓库 `docs/SELF_ITERATE.md`** 候选池 — 把已落地的标 ✅，新发现的加进去\n2. **本地 KB `~/knowledge/huo15/`** — 一次发布写一篇 markdown 完整 post-mortem（含 design 决策、实测数据、踩过的坑）\n\n---\n\n## 4. 历史迭代记录\n\n| 日期 | 版本 | 主题 | 来源 | 落地形态 |\n|------|------|------|------|---------|\n| 2026-04-23 | v5.4.0 | 设计能力套件（4 个 skill） | huashu-design + Anthropic frontend-design | 4 Skills |\n| 2026-04-24 | v5.5.0 | 三层记忆/KB 协调（corpus=\"kb\"） | Claude Code memory 文档 | Plugin 模块 |\n| 2026-04-24 | v5.5.1 | 开发辅助三件套 + session-recap | Claude Code /simplify /security-review /review + idle recap | 3 Skills + 1 Plugin 模块 |\n| 2026-04-24 | v5.6.0 | 工具分层 + workflow 5→2 + 描述压缩 | Long session context pressure 实测 | Plugin 容量优化 |\n| 2026-04-25 | v5.7.0 | transcript-search（流式扫 jsonl） | 反编译 Claude Desktop transcriptSearchWorker | Plugin 模块 |\n| 2026-04-26 | v5.7.1 | hot-fix：删 before_compaction 噪音 hook + 加 memory_purge | 用户实测 enhance 库 613 条全为 auto-compact 噪音 | Plugin hot-fix |\n| 2026-04-26 | v5.7.2 | hardening：Map LRU + safety_log TTL + corpus tag 黑名单 + peerDep 4.22 | Explore agent 全代码审计后挑 4 项 ROI 最高的批量修 | Plugin patch |\n| 2026-04-26 | v5.7.3 | config-doctor：启动期诊断 openclaw.json 陷阱（reserveTokensFloor 缺失 / model maxTokens 过大）| 用户实测装 v5.7.2 仍爆 'Context limit exceeded'，根因在 openclaw 配置而非插件 | Plugin 模块 |\n| 2026-04-26 | v5.7.4 | config-doctor 扫已装插件 bare pluginApi | 用户报\"插件要求 2026.2.24\"实际是其它插件违反 ranged spec 规则 | Plugin 模块扩展 |\n| 2026-04-26 | v5.7.5/6 | skill-recommender：按需求挑已装 skill / 推荐未装 / 给自建规划 | 用户提\"看看 Claude 是怎么做的\"——反编译 Claude Desktop loadSkills 启发 | Plugin 模块 |\n| 2026-04-26 | v5.7.7 | session-lifecycle：接入 openclaw 4.22 的 session_start/end/before_reset/subagent_*/ended 五个 hook 闭环生命周期 | 跑完整 SOP 发现 openclaw 4.22 暴露 29 hook，enhance 只用 4 个；ROI top 5 候选 #1 | Plugin 模块 |\n| 2026-04-26 | **v5.7.8/9** | **全面适配 openclaw 2026.4.24（typed hooks + manifest 元数据）** | **用户要求\"全面适配最新版\"——发现 api.on 完全 typed 但 enhance 14 处 as any 屏蔽** | **Plugin 全面适配** |\n| 2026-04-27 | _no release_ | **本轮无新增**：跑完整 SOP，候选池 #1 (tool-result-optimizer) 调研发现违反红线 #2（openclaw 4.24 已内置截断）；候选池 #5 (/less-permission-prompts) 已被 Claude Code 2.1.111 内置；其它候选都 ≥ 250 行不适合 calendar 内吞。距 v5.7.9 仅 ~6 小时，避免 release fatigue。锚点推到 2026-04-30。 | Claude Code 2.1.108→2.1.119 + Claude Desktop 2026-04-24 build sweep | **Doc-only 沉淀** |\n\n下一次迭代锚点：**2026-04-30**（推迟 2 天；2026-04-27 跑完判定无新增后顺延；如果有新 Claude Code release 或线上 bug 反馈提前触发）。\n\n### 2026-04-27 sweep 关键发现（doc-only 迭代）\n\n**Claude Code 2.1.108 → 2.1.119（April 14–23 之间 11 个 patch）vs enhance 适用性**：\n\n| Claude Code 新增 | 对 enhance 影响 |\n|---|---|\n| `/recap` 内置 (2.1.108) | enhance 已有 session-recap 模块，但路径不同（idle-detect injection vs 显式命令）。不冲突 |\n| `/less-permission-prompts` 内置 (2.1.111) | 候选池 #5 标 obsolete（见上） |\n| `/ultrareview` 内置 (2.1.111) | 不冲突，不补 |\n| Push notification tool (2.1.110) | 候选池\"WeCom push 桥接\"可参考——但 push tool 是 Claude Code 自家，openclaw 没暴露 |\n| PreCompact hook 标准化 (2.1.105) | enhance v5.7.1 已经移除 before_compaction 噪音 hook。无变 |\n| Forked subagents `CLAUDE_CODE_FORK_SUBAGENT=1` (2.1.117) | Claude Code 特性，openclaw 子 agent 系统已独立；不补 |\n| Hooks `duration_ms` (2.1.119) | Claude Code hook 系统，非 openclaw hooks。不补 |\n| Skill `paths` 字段（按文件类型自动激活）| **Skill 侧改进**——huo15-* skill 可考虑加（如 huo15-openclaw-frontend-design 限 .tsx/.css）。属于 huo15-skills 仓库工作，不是 enhance 工作 |\n| MCP `_meta[\"anthropic/maxResultSizeChars\"]` 上限 500K (2.1.91, 4-2) | 证明大 tool result 是真实痛点——但 openclaw 已自带 `maxSingleToolResultChars` 内置截断（见候选池 #1 ❌） |\n\n**openclaw 4.24 hook 完整清单 vs enhance 已用对比**（29 hook 中 enhance 用 9 个）：\n\n| 已用 | 未用但有过候选/ROI | 未用且不适合 |\n|---|---|---|\n| before_prompt_build, before_agent_reply, before_reset, before_tool_call, after_tool_call, session_start, session_end, subagent_spawned, subagent_ended | tool_result_persist (❌ 见上)、subagent_spawning (overlap mode-gate)、agent_end (overlap session-recap idle)、before_message_write (overlap mode-gate)、before_install (overlap skill-doctor) | llm_input/output (太重)、inbound_claim/message_*/gateway_*/before_dispatch/reply_dispatch (route 层，非 enhance 关心) |\n\n结论：**enhance 已用 9 个 hook 已经覆盖核心场景**；剩余 hook 要么 overlap 已有模块，要么不适合。\n\n**Claude Desktop app.asar mtime = 2026-04-24** —— 跟 v5.7.x 那一轮反编译看的是同一个 build，没新东西。\n\n### 关于\"什么时候应该回报无新增\"\n\n每次跑这套 SOP 都硬塞迭代会累积\"reschedule debt\"——给候选池里塞次优的、给版本号小数点位填，最后变成又一次 `chore: bump npm-tracking 5.7.x → 5.7.x+1`。**正确做法是给\"本轮调研报告 + 推后下次锚点\"留出口**。判定规则：\n\n1. 跑完 Step 2 gap 分析后，所有候选要么 hit 红线、要么估算 > 200 行（calendar 内不吞）、要么距上一次发版 < 12 小时（release fatigue）\n2. → 回报\"本轮无新增\"\n3. → SELF_ITERATE.md 历史表加一行（_no release_ 标记）\n4. → 候选池里把已标 obsolete 的划 ❌（含理由），把还活着的更新状态\n5. → 下次锚点 +3 天\n6. → KB 写 post-mortem 沉淀这一轮的\"为什么不做\"\n\n### 关于\"诊断 vs 修复\"的边界\n\nv5.7.3 严格遵守\"**诊断不修复**\" — 即便 enhance 完全有能力 read/write `~/.openclaw/openclaw.json`，也只 `readFileSync` 不 `writeFileSync`。理由：\n1. 红线 #1：不侵入式修改 openclaw（配置文件属于 openclaw 控制范围）\n2. 用户对配置的掌控感 — 自己复制粘贴一行 python3 命令，至少看到改了啥\n3. 排除责任 — 万一 fix 命令出错（比如把字段值打错），损失只是用户那一刻的副作用，不会让 enhance 担责\"我装了插件配置就被改坏了\"\n\n**未来若加任何\"建议改 openclaw 配置\"的功能，硬约束：return-cliCmd 模式（输出 fix 命令字符串），永不 fs.writeFileSync 用户配置**。\n\n### 发版前自查 checklist（v5.7.4 启示）\n\n每次发布 plugin 前必跑：\n\n```bash\n# 1. 自查本插件 compat.pluginApi 是 ranged\ngrep -E '\"pluginApi\"' package.json openclaw.plugin.json\n#   必须看到 \">=X.Y.Z\" / \"^X.Y.Z\" / \"~X.Y.Z\"\n#   绝不能看到裸的 \"X.Y.Z\" — 那会被 openclaw 解读为精确匹配\n\n# 2. typecheck\nnpx tsc --noEmit\n\n# 3. 跑一次本地 enhance_config_doctor 看自己安装目录有没有 bare plugin\n#    （拿到 v5.7.4+ 之后此项自动）\n```\n\n为什么这条这么重要：v5.7.4 修的 bug 就是其它两个 huo15 插件作者（包括我自己）写 bare 字符串的失误造成的。**bare pluginApi 是 silent breakage** — 当时跑得好好，运行时一升级 openclaw 就炸。每次发版都自查能避免下个用户遭罪。\n\n### 关于 hot-fix 的额外约束（v5.7.1 启示）\n\n线上 bug（用户截图反馈）属于 **calendar 外触发** — 不等 cron 任务，立刻按照下面 fast-track 流程处理：\n\n1. 用 Grep 直接定位 bug 代码（不要 Plan）\n2. 修复 + typecheck（不要 release plan）\n3. SQL 直接清用户残留数据（如本次 613 条），先 `cp ... .bak.before-vX.Y.Z-hotfix` 备份\n4. 走标准发布流程（commit → tag → push 双 remote → npm + clawhub）\n5. 把 bug 加进 SELF_ITERATE.md 候选池标 ✅，写一篇 KB post-mortem\n6. 不影响下次 cron 调度（cron 还是 2026-04-28 跑）\n\n---\n\n## 5. 红线清单（永远不踩）\n\n1. ❌ 不修改 openclaw 核心代码 / 不动 openclaw 仓库\n2. ❌ 不复制龙虾原生功能（记忆向量库、tools.allow/deny、cron 调度、技能安装）\n3. ❌ 插件代码里不内嵌 skill 内容（skill 必须独立发版到 ClawHub）\n4. ❌ 不用 child_process（企业扫描器拦截 — 见 KB「No child_process in published plugins」）\n5. ❌ 不在 plugin 里写 npm/pip/cli 一类的安装命令执行（必须用 return-cliCmd 模式让用户 / cron 执行）\n6. ❌ ClawHub publish 不要一小时内发 5 个以上 new slug（rate limit）\n7. ❌ 提交不带 secrets（即使是 publish-credentials.md 里的 token，不出现在 commit message 或 code）\n\nArchive v6.7.20: 75 files, 453109 bytes\n\nFiles: CHANGELOG.md (218545b), CLAUDE.md (4300b), docs/architecture.md (6010b), docs/decisions/0001-non-invasive-enhancement.md (1164b), docs/decisions/0002-remove-model-router.md (1614b), docs/HANDOVER.md (3906b), docs/lessons/2026-06-25-sdk-2026.6-ts2742-and-fabricated-ops.md (2362b), docs/PRD.md (3666b), docs/SELF_ITERATE.md (19779b), index.ts (21719b), openclaw.plugin.json (18756b), package-lock.json (233848b), package.json (2116b), PLAN.md (4391b), README.md (26361b), scripts/audit-session-bridge-and-share-fallback.sh (11331b), scripts/deploy-2week-followup-launchagent.sh (3287b), scripts/postinstall.cjs (3385b), scripts/release.sh (13507b), scripts/setup.sh (4891b), skill-card.md (2923b), SKILL.md (17300b), src/modules/bot-share-link.ts (37915b), src/modules/bot-upload-link.ts (34837b), src/modules/cc-bridge-dispatch-harness.ts (11352b), src/modules/cc-bridge-keyword-dispatch.ts (12040b), src/modules/cc-bridge-pre-fetch.ts (8089b), src/modules/cc-bridge-prompt.ts (6591b), src/modules/chapter-marks.ts (3749b), src/modules/config-doctor.ts (29508b), src/modules/context-watchdog.ts (70192b), src/modules/dashboard.ts (43193b), src/modules/hook-profiler.ts (14996b), src/modules/kb-corpus.ts (10003b), src/modules/large-file-bridge.ts (17487b), src/modules/memory-integrator.ts (14716b), src/modules/mode-gate.ts (12070b), src/modules/native-memory-surfacer.ts (11372b), src/modules/notification-queue.ts (1184b), src/modules/prompt-enhancer.ts (2185b), src/modules/scheduled-tasks-bridge.ts (7070b), src/modules/self-check.ts (4363b), src/modules/session-bridge.ts (15610b), src/modules/session-doctor.ts (9339b), src/modules/session-lifecycle.ts (12717b), src/modules/session-recap.ts (8339b), src/modules/skill-doctor.ts (5029b), src/modules/skill-installer.ts (4046b), src/modules/skill-recommender.ts (19399b), src/modules/spawn-task.ts (5333b), src/modules/statusline.ts (7994b), src/modules/structured-memory.ts (11050b), src/modules/task-planner.ts (12199b), src/modules/todo-tracker.ts (6258b), src/modules/tool-safety.ts (15671b), src/modules/trajectory-archiver.ts (13591b), src/modules/transcript-search.ts (10389b), src/modules/workflow-hooks.ts (19219b), src/types.ts (24141b), src/utils/channel-detect.ts (1764b), src/utils/ctx-usage-db.ts (6838b), src/utils/ensure-sqlite.ts (4063b), src/utils/hook-profile-db.ts (8868b), src/utils/http-route-bridge.ts (3489b), src/utils/latency-tracker.ts (10459b), src/utils/model-route-config.ts (8695b), src/utils/profile-hook.ts (2219b), src/utils/resolve-home.ts (871b), src/utils/route-history.ts (4034b), src/utils/safe-api-wrapper.ts (2729b), src/utils/sqlite-store.ts (27532b), templates/AGENTS.enhance-patch.md (1286b), templates/SOUL.enhance-patch.md (987b), tsconfig.json (347b), _meta.json (142b)\n\nFile v6.7.20:SKILL.md\n\n---\nname: huo15-huo15-openclaw-enhance\ndescription: \"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injectedSessions 有 entry + body 不含 URL → 强制 appendText 链接。修法：(1) entry 加 replyAppendUsed 标记,每次 inject 兜底只 fire 一次；(2) prompt 加『用户上传后处理流程』,明确 LLM 看到『传完了』必须 enhance_upload_check({token}) → Read → 处理任务,严禁再发链接 / 反问 / 全盘扫。Use when: 给 OpenClaw 加非侵入式增强（不改龙虾核心、不复制原生功能）。\"\nversion: 6.7.13\nhomepage: https://cnb.cool/huo15/ai/huo15-openclaw-enhance\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"requires\": { \"bins\": [] } } }\n---\n\n# 火一五·克劳德·龙虾增强插件 v5.7.8\n\n## 简介\n\n`@huo15/openclaw-enhance` 是 **OpenClaw 2026.4.24+** 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验。\n\n**核心原则**：凡是龙虾原生有的功能一律不复制，重叠处以龙虾为准；只补龙虾没有的 Claude-Code 体验。\n\n## v5.7.8 全面适配 openclaw 2026.4.24（2026-04-26 同日）\n\n跑完整 SOP 第 1+2 步发现 openclaw 4.24 的 `api.on` 是**完全 typed**（`<K extends PluginHookName>(hookName: K, handler: PluginHookHandlerMap[K])`），enhance 之前 14 处 `api.on(...as any)` 都能去掉 cast。这是真正的\"全面适配\"——不是简单升 peerDep，而是让 enhance 利用 SDK 的全部类型信息。\n\n| 维度 | v5.7.7 | v5.7.8 |\n|---|---|---|\n| `peerDependencies.openclaw` | `^2026.4.22` | **`^2026.4.24`** |\n| `build.openclawVersion` | `2026.4.11`（落后 13 patch）| **`2026.4.24`** |\n| `compat.pluginApi` | `>=2026.4.11` | **`>=2026.4.24`** |\n| `api.on(...as any)` 使用次数 | 14 处 | **0 处** |\n| `(event: any, ctx: any)` 使用次数 | 5 处 | **0 处** |\n| `(ctx as any)?.agentId` 模式（hook 内部）| 9 处 | **0 处**（仅余 4 处 helper 函数内部，工具 ctx 用） |\n| typecheck 错误数 | 0 | **0** |\n| openclaw.plugin.json 顶层字段 | 5 | **8**（加 `enabledByDefault` / `uiHints` / `activation`）|\n\n### 隐藏 bug 修复\n\n去掉 `as any` 后 typecheck 暴露 **self-check.ts 长期被屏蔽的类型不匹配**：之前 `return {};` 试图返回 `PluginHookBeforeAgentReplyResult`，但该类型 `handled: boolean` 是必填的——空对象不合规。修法：所有\"不接管\"分支改成 `return;`（void），仅\"阻断空回复\"分支返回 `{ handled: true, reply: ..., reason: ... }`。\n\n### 不破坏 openclaw 原生\n\n- 所有 hook handler **return undefined（void）** — 不返回 `{block, prependContext}` 等控制信号时 → enhance 仅观察+附加，绝不改变 openclaw 决策\n- typed hook handler 实际行为跟 untyped 完全一致 — 只是 TS 编译期能 narrow 类型，运行时无差异\n- manifest 新加的 `enabledByDefault` / `uiHints` / `activation` 都是 openclaw 4.x 已有字段，不引入新依赖\n\n## v5.7.7 session-lifecycle（2026-04-26 同日，跑完整 gap 调研后落地）\n\n**调研依据**：跑了一次完整 SOP 第 1+2 步（Claude Code 官方 hooks 文档 + 反编译 Claude.app + openclaw 4.22 SDK）。发现 **openclaw 4.22 暴露 29 个 hook，enhance 之前只用 4 个**。落地最高 ROI 的 5 个 hook 闭环 session 生命周期：\n\n| Hook | enhance 行为 | 落地表 |\n|---|---|---|\n| `session_start` | idle > 30min 时插入\"🚀 会话开始/续启\"章节占位 | `chapters` |\n| `session_end` | 加\"🏁 会话结束\"章节 + flush in_progress todo 到 project memory（tag=session-flush, importance=4） | `chapters` + `memories` |\n| `before_reset` | reset 前最后机会抢救最近 3 章节 + 全部未完成 todo 到 decision memory（tag=reset-rescue, importance=6）+ 推 notification | `memories` |\n| `subagent_spawned` | 派生子 agent 时加\"🤖 派生子 agent: X\"章节 | `chapters` |\n| `subagent_ended` | 子 agent 结束加\"✅/❌ 子 agent 结束: X\"章节 | `chapters` |\n\n**防 noise factory 三层防御**（吸收 v5.7.1 教训）：30 秒 dedup + 低 importance + 专用 tag（不进黑名单，用户下次会想恢复）。\n\n## v5.7.5 skill-recommender（2026-04-26 同日）\n\n**用户反馈**：\"新增自动根据用户的需求自动挑选已经安装的技能，如果没有技能就把规划方案给出来。看看 Claude 是如何做的\"\n\n**调研**：反编译 `/Applications/Claude.app/Contents/Resources/app.asar`，发现 Claude 的 skill auto-discovery **本质是把所有 skill 的 name+description 拼成 `\"Available skills: ${list}.\"` 注入到 specialist agent 的 system prompt** —— 没有复杂算法，让 LLM 自己挑。\n\n**enhance 改造**：照搬 name+description 匹配思路，但**改成按需工具**避免每轮 prompt 占 schema。新增模块 `skill-recommender` + 工具 `enhance_skill_recommend(query, limit?, includeUninstalled?, includePlanning?)`：\n\n1. **启动期扫多路径**（WeCom / DingTalk 多 agent 场景关键）：\n   - `~/.openclaw/skills/`\n   - `~/.openclaw/workspace/skills/`\n   - `~/.openclaw/workspace-*/skills/` ← **WeCom 多 agent 动态 workspace**（一开始漏扫，烟测才发现）\n   - `~/.openclaw/agents/*/skills/`\n   - `<cwd>/.claude/skills/`、`~/.claude/skills/`\n   - 实测用户机器扫到 56 个 skill 跨 27 个路径\n2. **解析 SKILL.md frontmatter**（轻量正则，无 yaml 依赖）：name + description + aliases\n3. **CJK 双字滑窗 + alias 强 boost** 评分：\n   - JS `\\w` 不含中日韩，直接 split `\\s\\W` 会让\"代码简化\"分成空数组\n   - 解决：CJK 连续段当整体 phrase + 长 ≥4 时滑动 2-grams\n   - alias 的 token 严格命中（如 \"规划\" === alias \"规划\"）→ 保底 0.7 分\n4. **三段式输出**：\n   - 🎯 已装 skill（命中 ≥ threshold=0.25）+ 召唤建议\n   - 📦 ClawHub 上未装的 huo15-* 候选（含 `openclaw skills install` 命令）\n   - 🛠️ 都没合适 → **自建 skill 规划**：建议 slug + frontmatter 模板 + 触发关键词 + 内容大纲 + **红线 #3 提醒**（必须先 ClawHub publish 再让 enhance 引用 slug，插件不内嵌 skill 内容）\n\n**实测**：\n\n| 查询 | 命中 | 分数 |\n|---|---|---|\n| \"帮我 review 这个 PR\" | huo15-openclaw-code-review | 0.60 |\n| \"设计一个 Web UI 原型\" | huo15-openclaw-frontend-design | 0.94 |\n| \"代码简化\" | huo15-openclaw-simplify | 1.00 |\n| \"做安全审查\" | huo15-openclaw-security-review | 0.96 |\n| \"规划这个任务\" | huo15-openclaw-plan-mode | 0.70（alias exact 命中保底）|\n\n模块 `tier=2`（balanced 默认启用，minimal 不暴露 — 用户多半已知道用什么 skill）。\n\n## v5.7.4 config-doctor 扩展：扫已装插件 bare pluginApi（2026-04-26 同日）\n\n**用户反馈**：\"提示插件要求 2026.2.24，但是我的 openclaw 已经是 2026.4.22\"\n\n**根因**：openclaw plugin compat 规则要求 `compat.pluginApi` 必须是 ranged spec（`>=X.Y.Z` / `^X.Y.Z` / `~X.Y.Z`）。**bare 字符串（如 `\"2026.2.24\"` 没前缀）= 精确匹配**，与当前 openclaw 不匹配时启动失败。用户实测：\n\n- `~/.openclaw/extensions/tips/package.json` v1.0.0 → `pluginApi: \"2026.4.11\"` ❌\n- `~/.openclaw/node_modules/@huo15/huo15-huihuoyun-odoo/package.json` v1.2.0（npm peerDep 残留）→ `pluginApi: \"2026.2.24\"` ❌\n\n**新增**：`config-doctor` 启动期扫描 `~/.openclaw/extensions/*` + `~/.openclaw/node_modules/@huo15/*` + 无 scope 的 `node_modules/*`，对每个声明 `openclaw.extensions` 的包检查 `compat.pluginApi`。bare 命中 → 推仪表盘 + log warn + 给可粘贴 fix 命令。\n\n```\n⚠️ [plugin-bare-pluginApi] 已装插件 @huo15/wecom-tips 的 openclaw.compat.pluginApi=\"2026.4.11\" 是 bare 版本，会被解读为精确匹配...\n   → 修复: python3 -c \"...\"（一行 inline）\n```\n\n## v5.7.3 config-doctor（2026-04-26 同日）\n\n直击用户高频反馈\"装上插件还是 'Context limit exceeded'\" — 根因往往不在插件，而在 `~/.openclaw/openclaw.json` 的两处陷阱：\n\n1. **缺失 `agents.defaults.compaction.reserveTokensFloor`** — openclaw 4.22 把这个字段嵌套到 `agents.defaults` 里（4.11 时是顶层 `compaction`），老用户配置文件没自动迁移，用 4.22 默认值（很小）→ 长 session 必爆\n2. **某个 model 的 `maxTokens` 占 `contextWindow` 一半以上** — 例如 MiniMax-M2.7 默认 maxTokens=131072 / contextWindow=204800，每轮预留输出就吃掉 64% budget。openclaw 把 maxTokens 当作\"必须留给输出的 reserve\"，剩 73k 给 input/tools/memory，**任意几轮就爆**\n\n### 新增\n\n- **`src/modules/config-doctor.ts`** — 启动期 sync 读 openclaw.json 检查上述两类陷阱，发现后用 `notifyQueue.emit(\"config-doctor\", ...)` 推到仪表盘 + log warn + 给可粘贴的 fix 命令（python3 一行原地改 JSON，**不调 child_process**）\n- **工具：`enhance_config_doctor`** — 无参数，agent / 用户随时调一下，重新跑诊断（修完了配置可以再跑确认 ✅）\n- **配置项：`config.configDoctor`** — `enabled` / `minReserveTokensFloor`（默认 5000）/ `maxReserveTokensFloor`（默认 100000）/ `maxModelMaxTokens`（默认 32000）\n\n### 红线遵守\n\n- **完全只读** ~/.openclaw/openclaw.json（红线 #1：不侵入式修改 openclaw）\n- **不调 child_process**（红线 #4） — 修复命令是 python3 inline，由用户/cron-cli 执行\n- **不暴露在 minimal 之外**？反过来：**tier=1 minimal 也启用** — 这是关键的\"防爆 context\"诊断，每个用户都该有\n\n## v5.7.2 hardening（2026-04-26 同日）\n\n继 v5.7.1 hot-fix 之后，对全代码库做了一次审计，修复 4 类潜在 bug：\n\n- **进程内 Map LRU 上限** — `mode-gate` 的 `modeState` / `plannedActions` 和 `session-recap` 的 `lastRecapAt` 之前 keyed by `agentId::sessionId` **跨 session 永不清**。WeCom 多用户场景下 100+ session 会无限累积。现在加 200/200/500 三档 LRU cap，活跃 session 重新插入刷新顺序，老 session 自动淘汰\n- **safety_log / notifications 启动期 TTL** — `getDb()` 时跑一次 `DELETE WHERE created_at < datetime('now', '-90 days')`，避免长期运行库无限增长。新增 `purgeOldSafetyLogs(retentionDays)` helper 给运维调\n- **memory corpus tag 黑名单** — `auto-compact` / `auto-checkpoint` / `audit` / `internal` 这 4 个保留 tag 在 `scoreRelevance()` 入口直接 return 0，永不召回到 prompt（防御未来 hook 万一又写入 noise）\n- **enhance_memory_store 拒收保留 tag** — 用户/agent 显式调 store 时若 tags 含保留词，立即返回错误而非写入\n\n### bump openclaw peerDep `^2026.4.22`\n\n之前 peerDep `>=2026.4.11`，但 npm global 已升到 2026.4.22（差 11 个 patch）。本地 SDK 类型定义同步升级；hook 名验证全部仍存在（`before_prompt_build` / `before_tool_call` / `after_tool_call` / `before_compaction` / `before_agent_reply`），无破坏性变更。\n\n## v5.7.1 hot-fix（2026-04-26）\n\n- **删除 `before_compaction` 噪音 hook** — 之前每次 openclaw auto-compact 都会以 `decision` 类、`auto-compact` tag 写入一条「[auto-compact] 对话上下文已压缩…」记忆。实测单 agent 24 小时积累 613 条全是噪音，关键词命中率虚高 0.4-0.5（过 corpus pruner 默认 0.5 阈值），把真正的 user/project/feedback 决策记忆挤出 prompt 上下文\n- **新增工具 `enhance_memory_purge`** — 按 `tag` / `category` / `contentLike` 批量清理当前 agent 记忆，`dry_run` 默认 true（仅预览匹配数）。一键清理历史噪音：`enhance_memory_purge tag=\"auto-compact\" dry_run=false`\n- **首次启动自动迁移**：升级到 5.7.1 后即不再生成新噪音；旧噪音留待用户用 purge 工具或直接 SQL 清\n\n## v5.7 新特性（2026-04-25）\n\n- **历史会话搜索（transcript-search）** — 照搬 Claude Desktop `transcriptSearchWorker` 算法（解包 `/Applications/Claude.app/Contents/Resources/app.asar` 抽出参考实现）：\n  - 流式扫 `~/.openclaw/agents/<agentId>/sessions/*.jsonl`，行级 JSON.parse\n  - `extractText` 兼容 `string` / `[{type:\"text\", text}]` 数组\n  - `indexOf` 子串匹配 + ±80 字符 snippet\n  - 79 个 session 中扫 30 个 → 3–5 ms 找到 5 个 hits（实测）\n  - 完全只读、不建索引、不建表 — 不动 openclaw 任何东西\n- **工具：`enhance_transcript_search`** — `query` 必填；可选 `agentId / limit / includeReset / caseSensitive`\n- 模块 tier=2，默认 balanced/full 即可见（minimal 下不暴露）\n\n## v5.6 新特性（2026-04-24）\n\n- **工具分层（toolTier）** — 按 minimal/balanced/full 三档暴露工具 schema，降低每轮 prompt 固定底座（解决长会话 context 提早爆满）\n  - `minimal`（10 工具）：仅核心层 — 记忆 / 状态栏 / spawn / 模式 / 章节 / installer / integrator\n  - `balanced`（18 工具，默认）：+ todo / 章节 / 定时任务桥\n  - `full`（26 工具）：+ workflow / safety / task-planner / session-recap / skill-doctor\n- **Workflow 5→2 工具合并** — `enhance_workflow_define / _list / _delete / _tasks / enhance_task` 合并为 `enhance_workflow`（action=define/list/delete/tasks）+ `enhance_task`（保留独立 action 派发器）\n- **工具描述全面压缩** — 26 个工具描述从 ~4610 字符 → ~1750 字符（-62%），每轮 prompt 节省约 1400 token，prompt cache 更稳\n\n## 一键安装\n\n```bash\nopenclaw plugins install @huo15/openclaw-enhance\nopenclaw restart\n```\n\n安装后访问仪表盘：`http://localhost:18789/plugins/enhance/`\n\n## 核心能力\n\n- **分类记忆（corpus supplement + 两段式）** — user / project / feedback / reference / decision 五类，额外支持 `why`（背景/约束）和 `howToApply`（套用时机），对齐 Claude Code feedback/project 记忆体例；通过 `registerMemoryCorpusSupplement` 合入龙虾原生 memory 搜索，**不自建第二套向量库**；搜索结果 deterministic 排序（score → importance → updated → id）保持 prompt cache 稳定\n- **工具安全观察员** — 只分类错误 + 建议退避，完全尊重龙虾 `tools.allow/deny`\n- **任务 / 章节 / 模式闸门 + ExitPlanMode** — TodoWrite / mark_chapter / plan-explore 模式；`enhance_exit_plan_mode` 在 plan 模式下提交计划给用户审批，自动把计划期间被拦截的写入意图打包成 decision 记忆\n- **状态栏（含可观测性）** — `enhance_statusline` 额外展示当前模型、思考档、fast 模式、消息通道、会话 ID；HTTP 端点 `/plugins/enhance/api/statusline` 输出 JSON 供仪表盘嵌入\n- **技能巡检 / 子任务一键派发** — `enhance_spawn_task` 返回可直接粘贴到终端的 `openclaw agent` CLI 命令，支持跨 agent 派发和思考档选择\n- **定时任务桥** — 登记定时工作流时返回一条 `openclaw cron add` 命令；**调度归龙虾 cron-cli**，插件只管触发时注入 instructions\n- **多 Agent 隔离** — 完美适配 WeCom 插件的动态 Agent，记忆/任务/章节/宠物全部按 `agentId` 隔离\n- **增强仪表盘** — 小火苗宠物 + 记忆/任务/章节/定时全景\n\n## 与龙虾原生的关系\n\n| 能力 | 龙虾原生 | enhance 策略 |\n|------|---------|--------------|\n| 记忆向量库 | ✅ 龙虾负责 | 不复制，改为 corpus supplement 并入搜索 |\n| 工具 allow/deny | ✅ 龙虾负责 | 只观察，不拦截 |\n| Cron 调度 | ✅ 龙虾 cron-cli | 不管理调度，只在触发时注入上下文 |\n| 技能安装 | ✅ ClawHub | 只读巡检，不擅自安装 |\n\n## 增强技能（自动注入 `workspace/skills/`）\n\n**工作流模式（4 个）**\n\n- `huo15-openclaw-plan-mode` — 结构化规划模式\n- `huo15-openclaw-explore-mode` — 深度探索模式\n- `huo15-openclaw-verify-mode` — 验证检查模式\n- `huo15-openclaw-memory-curator` — 记忆整理\n\n**设计能力（v5.4 新增，对标 Anthropic frontend-design + huashu-design 生态）**\n\n- `huo15-openclaw-frontend-design` — 高保真 Web UI 原型 + 5 美学流派 + 反 AI Slop 硬红线\n- `huo15-openclaw-design-director` — 设计方向顾问（3 方向反差对比 + 强制推荐）\n- `huo15-openclaw-brand-protocol` — 品牌规范抓取（Ask/Search/Download/Verify/Codify 5 步）\n- `huo15-openclaw-design-critique` — 5 维设计评审（美学/可用性/品牌/内容/实现）\n\n**开发辅助（v5.5.1 新增，对标 Claude Code /simplify / /security-review / /review）**\n\n- `huo15-openclaw-simplify` — 代码简化三维审查（复用/质量/效率）+ 分级修复清单\n- `huo15-openclaw-security-review` — 六类漏洞矩阵（密钥/注入/XSS/SSRF/权限/依赖）+ CVSS 分级\n- `huo15-openclaw-code-review` — PR 五维综合评审（设计/实现/测试/安全/可维护）+ 可粘贴评论\n\n详见 [README.md](./README.md) 与 [CHANGELOG.md](./CHANGELOG.md)。\n\n## 链接\n\n- npm: https://www.npmjs.com/package/@huo15/openclaw-enhance\n- 仓库: https://cnb.cool/huo15/ai/huo15-openclaw-enhance\n- License: MIT\n- 公司: 青岛火一五信息科技有限公司 — www.huo15.com\n\nFile v6.7.20: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\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**火一五·克劳德·龙虾增强插件 v6.0.0** 是 [OpenClaw 2026.4.24+](https://github.com/openclaw/openclaw) 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验 + 设计能力套件 + 开发辅助套件；**所有能力重叠处都以龙虾为准**，绝不复制或覆盖龙虾原生功能。\n\n完全通过公共 Plugin SDK 实现，**不修改任何核心代码**，一键安装即可使用。\n（非龙虾团队开发）\n\n### v6.0.0 npm 包改名 + ClawHub 重新注册（2026-05-02）\n\n> **BREAKING（npm 包名）**：`@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`\n\n老 npm 包对应的 ClawHub slug `huo15-openclaw-enhance` 上有 ghost manifest 死结——1.3.0-5.1.0 期间 27 个版本 pluginApi=bare `2026.2.24`（早于本仓 §6.1 红线\"compat.pluginApi 必须 ranged\"修复），ClawHub plugin entry record 在那段历史首次注册时缓存了 bare 值，后续 publish 不刷新 record 字段，OpenClaw 走 `clawhub:` 协议解析时永远拿到老 manifest 报 `requires plugin API 2026.2.24`。\n\n**修复**：换 npm 包名（与 `huo15-huihuoyun-odoo` 等 huo15-* 命名规范对齐）+ 新 ClawHub slug `huo15-huo15-openclaw-enhance`，让 ClawHub 重新创建一个干净的 plugin entry。OpenClaw plugin id 仍是 `enhance`，老用户配置不需迁移。详见 [CHANGELOG.md](./CHANGELOG.md) v6.0.0 段。\n\n老 npm 包已 deprecate；老 ClawHub slug 已 hide。已装老版本用户跑[迁移命令](#老版本用户迁移v5x--v600)即可。\n\n### v5.7.24 BOT 文件分享 URL 改成独立兄弟 prefix（2026-05-01）\n\nURL 从 v5.7.23 的 `/plugins/enhance/share/...`（dashboard 子路径，靠 bridge dispatch）改成 v5.7.24 的 `/plugins/enhance-share/...`（独立 SDK prefix route，不依赖 dashboard）。\n\n| 维度 | v5.7.23 | v5.7.24 |\n|---|---|---|\n| URL | `https://<域>/plugins/enhance/share/<token>-...` | `https://<域>/plugins/enhance-share/<token>-...` |\n| 路由实现 | dashboard handler 顶部 `tryHandleSubRoute` 转给 bridge 注册的 share handler | bot-share-link 自己 `api.registerHttpRoute({ path: \"/plugins/enhance-share\", ... })` |\n| dashboard.ts 改动 | +3 行（dispatch + detect） | 1 行（detect only），跟 v5.7.22 同 |\n| bridge 复杂度 | 102 行 | 76 行（去掉 dispatch 相关） |\n\n**SDK overlap 规则**：`prefixMatchPath` 用的是 `startsWith(\\`${prefix}/\\`)`，分隔必须是 `/`。所以 `/plugins/enhance-share` ≠ `/plugins/enhance` 的子前缀（中间是 `-`），SDK 不会拒绝。\n\n**baseUrl 自动检测仍 zero-config**：dashboard handler + share handler 都调 `detectBaseUrlFromRequest(req)` 抓 host，访问过任一即缓存。\n\n### v5.7.23 BOT 文件分享桥升级 zero-config（2026-05-01）\n\n复用 dashboard 已经在跑的 `/plugins/enhance` prefix route，通过新增的 [http-route-bridge](src/utils/http-route-bridge.ts) 子分发到 `/plugins/enhance/share/<token>-<filename>`。**v5.7.24 已替换为独立兄弟 prefix 方案，不再 dispatch。**\n\n### v5.7.22 BOT 文件分享桥：企微/钉钉大文件兜底（2026-05-01）\n\n**用户痛点**：播客生成 90MB mp3，企微插件直接传不了；钉钉同样卡死大文件。需要把本地文件投到一个目录、返回临时下载 URL 给用户自取。\n\n**三个工具**（tier=1，全分层都暴露）：\n\n| 工具 | 作用 |\n|---|---|\n| `enhance_share_file(filePath, label?, expireHours?, copyMode?)` | 把本地文件投递到 `<shareRoot>/files/<token>-<basename>`，返回临时 URL（默认 24h 过期） |\n| `enhance_share_list()` | 列当前活跃分享 + 顺手清过期 |\n| `enhance_share_revoke(token \\| filename)` | 立刻撤销（删本地文件 + manifest 条目） |\n\n**安全闸门**：路径黑名单（`/.ssh/ /.aws/ /.gnupg/ /etc/` 等不让分享）、绝对路径校验、`..` 防 traversal、500MB 大小上限、12 hex token 不可枚举遍历、HTTP handler 内 filename 防越界（不能含 `/ \\\\ ..`）。**零 child_process**（fs.copyFileSync），lazy cleanup（不在 register 期跑后台任务）。\n\n> ⚠️ **v6.7.19 起已移除 model-router（自动切换模型）**。下面 v5.7.x 的 model-router 章节仅作历史保留——当前版本不再按任务/配额自动切换模型，模型选择交回龙虾原生 / 用户配置；仅 context-watchdog 在上下文逼近上限时保留「超限保护切换」。\n\n### v5.7.12 model-router: 速度+精度+覆盖率三重增强（2026-05-01）\n\n**1. 响应速度**：路由决策缓存（TTL 30s）、极短 prompt 短路（<50 字符直走 M2.7）、`getBestModel` 结果缓存\n\n**2. 任务识别精度**：超长 prompt（>2000 字符）→ 直接 pro；写作/摘要按长度分叉（短→flash，长→pro）；中文关键词专项优化\n\n**3. 新增 12 类任务识别**：翻译/写作/数据分析/debug/情绪/数学/摘要/检索/闲聊/报告/多步骤/快速问答\n\n### v5.7.11 model-router: 修复 WeCom 图片路由到 MiniMax-VL-01（2026-04-30）\n\n**用户反馈**：\"图片路由到 M2.7 报 content empty，M2.7 是 text-only 模型不支持图片\"\n\n问题根因：`detectPromptInlineMedia` 只检测 `[image]` 和 `[media attached` 标记，但 WeCom 图片到达时 prompt 里只有文件路径（`~/.openclaw/media/inbound/xxx.png`），没有这些标记，导致图片检测失败，一直路由到 text-only 的 M2.7。\n\n修复：在 `detectPromptInlineMedia` 中新增 WeCom 媒体路径格式检测——任何包含 `~/.openclaw/media/inbound/*.png|jpg|jpeg|gif|webp|bmp` 的 prompt 都会被识别为图片，自动路由到 `MiniMax-VL-01`（vision 模型）。\n\n| 场景 | 修复前 | 修复后 |\n|---|---|---|\n| WeCom 发图片 | 路由到 M2.7 → API 报 content empty | 路由到 VL-01 → 正常识别 |\n\n### v5.7.8 全面适配 openclaw 2026.4.24（2026-04-26 同日）\n\n| 维度 | 改动 |\n|---|---|\n| `peerDependencies.openclaw` | `^2026.4.22` → **`^2026.4.24`** |\n| `build.openclawVersion` | `2026.4.11` → **`2026.4.24`** |\n| `compat.pluginApi` | `>=2026.4.11` → **`>=2026.4.24`** |\n| `api.on(...as any)` 14 处 → **0 处** | 全部改成 typed hook，让 SDK PluginHookHandlerMap[K] 自动推断 event/ctx |\n| `(event: any, ctx: any)` 5 处 → **0 处** | 同上 |\n| `openclaw.plugin.json` 加 3 字段 | `enabledByDefault: true` / `uiHints` / `activation.onAgentHarnesses` |\n| 修隐藏 bug | self-check.ts 的 `PluginHookBeforeAgentReplyResult.handled` 必填问题之前被 `as any` 屏蔽，现在 typecheck 强制修对 |\n\n### v5.7.7 session-lifecycle：接入 openclaw 4.22 五个 hook 闭环 session 生命周期（2026-04-26 同日）\n\n跑了完整 SOP 第 1+2 步后发现 **openclaw 4.22 暴露 29 个 hook，enhance 只用了 4 个**。落地最高 ROI 的 5 个 hook：\n\n| Hook | 行为 |\n|---|---|\n| `session_start` | idle > 30min 时插入\"🚀 会话开始/续启\"章节占位 |\n| `session_end` | 加\"🏁 会话结束\"章节 + flush in_progress todo 到 project memory |\n| `before_reset` | reset 前抢救最近 3 章节 + 全部未完成 todo 到 decision memory + 推 notification |\n| `subagent_spawned` / `subagent_ended` | 派生/结束自动落 chapter（跟 enhance_spawn_task 闭环）|\n\n防 noise factory 三层防御：30 秒 dedup + 低 importance + 专用 tag（吸收 v5.7.1 教训）。\n\n### v5.7.5 skill-recommender：按需求挑 skill / 推荐未装 / 给自建规划（2026-04-26 同日）\n\n调研：反编译 Claude Desktop 发现 skill auto-discovery 本质是 `\"Available skills: ${list}.\"` 注入到 system prompt。enhance 改成**按需工具**避免每轮 prompt 占 schema：\n\n工具 `enhance_skill_recommend(query, ...)` 三段式输出：\n\n| 段 | 内容 | 触发条件 |\n|---|---|---|\n| 🎯 已装 skill | 按相关度排序 + 召唤建议 | 命中 ≥ threshold |\n| 📦 ClawHub 未装候选 | 11 个 huo15-* + `openclaw skills install <slug>` | 默认包含 |\n| 🛠️ 自建规划 | slug + frontmatter 模板 + 触发词 + 内容大纲 + 红线 #3 提醒 | 已装命中 < threshold |\n\n实测精度：\n\n| 查询 | 命中 | 分数 |\n|---|---|---|\n| \"帮我 review 这个 PR\" | huo15-openclaw-code-review | 0.60 |\n| \"代码简化\" | huo15-openclaw-simplify | 1.00 |\n| \"做安全审查\" | huo15-openclaw-security-review | 0.96 |\n\n关键修复：扫 `~/.openclaw/workspace-*/skills/`（WeCom 多 agent 隔离的子工作区）— 用户机器实测扫到 **56 个 skill 跨 27 个路径**。\n\n### v5.7.4 config-doctor 扩展：扫已装插件 bare pluginApi（2026-04-26 同日）\n\n用户反馈：\"提示插件要求 2026.2.24，但是我的 openclaw 已经是 2026.4.22\" — 这是**其它插件**的 `compat.pluginApi` 写成 bare 字符串（精确匹配）导致 openclaw 启动失败。enhance 主动扫所有装的 plugin package.json，检测违规并给 fix 命令。\n\n实测命中：\n- `~/.openclaw/extensions/tips/package.json` v1.0.0 → `pluginApi: \"2026.4.11\"`（bare）\n- `~/.openclaw/node_modules/@huo15/huo15-huihuoyun-odoo/package.json` v1.2.0 → `pluginApi: \"2026.2.24\"`（bare）\n\n### v5.7.3 config-doctor（2026-04-26 同日，继 v5.7.2）\n\n直击高频反馈\"装上插件还是 'Context limit exceeded'\"。**这不是 enhance 的锅**，是 openclaw 自身配置陷阱：\n\n- **缺失 `agents.defaults.compaction.reserveTokensFloor`** — openclaw 4.22 把字段从顶层 `compaction.*` 挪到嵌套路径，老用户配置文件没自动迁移 → 用 4.22 默认值（很小） → 长 session 必爆\n- **某 model maxTokens ≥ contextWindow/2** — 例如 MiniMax-M2.7 默认 maxTokens=131072 / contextWindow=204800，每轮预留输出吃 64% budget → 剩 73k 给 input/tools/memory/history 几轮必爆\n\n**新增 `enhance_config_doctor` 模块（tier=1，minimal 也启用）**：\n\n- 启动期 sync 读 `~/.openclaw/openclaw.json` 检查上述两类陷阱\n- 发现问题：log warn + 推仪表盘通知 + 给可粘贴 fix 命令（python3 inline JSON 改写，**不调 child_process**，**不擅自改用户配置**）\n- 工具 `enhance_config_doctor` 按需重检（修完用来确认 ✅）\n\n### v5.7.2 hardening（2026-04-26 同日，继 v5.7.1）\n\n对全代码库做了一次审计，修 4 类潜在 bug + 升 peerDep `^2026.4.22`：\n\n- **进程内 Map LRU 上限** — `mode-gate` / `session-recap` 之前跨 session 永不清，多 agent 场景会泄漏；现在加 200/200/500 三档 cap + FIFO 淘汰\n- **safety_log / notifications 启动期 TTL** — `getDb()` 自动清 90 天前旧记录\n- **memory corpus tag 黑名单** — `auto-compact / auto-checkpoint / audit / internal` 永不召回，防御未来 noise hook\n- **enhance_memory_store 拒收保留 tag** — 用户/agent 显式滥用保留词时立即报错\n\n### v5.7.1 hot-fix（2026-04-26）\n\n**修：删除把每次 auto-compact 事件作为 decision 类记忆插入的 `before_compaction` hook。**\n\n- 之前实测单 agent 24h 积累 **613 条全为噪音**（tag=auto-compact），关键词命中率 0.43-0.51 普遍过 0.5 阈值，把真正的决策记忆挤出 prompt 上下文\n- 新增工具 `enhance_memory_purge` — 按 `tag` / `category` / `contentLike` 批量清理，`dry_run` 默认 true（仅预览匹配数）\n- 历史噪音清理一行：`enhance_memory_purge tag=\"auto-compact\" dry_run=false`，或 `sqlite3 ~/.openclaw/memory/enhance-memory.sqlite \"DELETE FROM memories WHERE tags LIKE '%auto-compact%'; VACUUM;\"`\n\n### v5.7 新特性（2026-04-25）\n\n**📜 历史会话搜索 — 照搬 Claude Desktop 实现**\n\n> 反编译参考 `/Applications/Claude.app/Contents/Resources/app.asar` 里的 `transcriptSearchWorker.js`（94 行官方实现）— 发现 Claude Desktop 不用 SQL FTS5，纯流式扫 JSONL + indexOf。直接搬到 openclaw 的 `~/.openclaw/agents/<agent>/sessions/*.jsonl`。\n\n| 工具 | 用途 | 实测性能 |\n|------|------|---------|\n| `enhance_transcript_search` | 全文搜历史会话，找『我上次怎么做的』 | 79 个 session 中扫 30 个 → **3-5 ms** 找到 5 hits |\n\n参数：`query` 必填；可选 `agentId / limit (1-50) / includeReset / caseSensitive`。\n\n模块 `tier=2`（balanced/full 默认启用，minimal 下不暴露）。\n\n### v5.6 新特性（2026-04-24）\n\n**针对 long session 提早爆 context 的容量优化**\n\n| 配置项 | 暴露工具数 (v5.7) | 适用场景 |\n|--------|-----------|---------|\n| `toolTier: \"minimal\"` | 10 | 上下文极紧 / 最小核心模式（记忆、状态栏、章节、模式、spawn） |\n| `toolTier: \"balanced\"` *(默认)* | 19 | 多数日常会话 — 加 todo / 章节标记 / 定时任务桥 / **transcript-search** |\n| `toolTier: \"full\"` | 27 | 需要工作流自动化 / safety / session-recap / skill-doctor 时 |\n\n- **工具分层（toolTier）** — 按需暴露 schema，每轮 prompt 减负\n- **Workflow 5→2 工具合并** — 用 `action=` 派发器收敛同类操作\n- **26 个工具描述压缩 -62%** — 每轮 prompt 节省约 1400 token\n\n> ⚠️ 如果你的 `~/.openclaw/openclaw.json` 中 `compaction.reserveTokensFloor` ≥ 100000，请改回 **20000**（>205k 总窗会让每次压缩都失败）。这是 openclaw 配置项，与本插件无关。\n\n### 核心特性\n\n- **多 Agent 隔离** — 完美适配 WeCom 插件的动态 Agent 功能，每个企微用户/群组拥有独立的记忆、任务、章节、宠物与定时工作流\n- **结构化记忆（corpus supplement）** — 按 user/project/feedback/reference/decision 五类分类存储，**通过 `registerMemoryCorpusSupplement` 并入龙虾 `memory` 搜索结果**，不自建第二套向量库\n- **工具安全补丁** — 仅作为**观察员**存在（尊重龙虾原生 `tools.allow/deny`），统计错误分类、给出退避建议，从不擅自重试或硬拦截\n- **提示词增强** — 仅保留 `qualityGuidelines`，其它早已由龙虾系统提示词覆盖，不重复\n- **任务/章节/模式闸门** — Claude Code TodoWrite / mark_chapter / plan-explore 的龙虾化实现；模式闸门在 `before_tool_call` 阻止计划/探索模式误触写操作\n- **状态栏 / 技能巡检 / 子任务孵化** — 一行看全当前状态；诊断技能目录缺失；把\"现在不该做\"的副作用登记为延期任务\n- **定时任务桥** — 登记工作流时返回一条 `openclaw cron add` 命令，**调度归龙虾**，插件只负责触发时装填上下文\n- **增强仪表盘（含小火苗宠物）** — Web UI 实时查看记忆 / 任务 / 章节 / 定时 / 宠物状态，支持按 Agent 筛选\n\n---\n\n## 一键安装\n\n> ⚠️ **v6.0.0 起 npm 包改名**：`@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`（与 `huo15-huihuoyun-odoo` 等其他 huo15-* 包命名规范对齐 + 让 ClawHub 重新创建干净的 plugin entry，绕开老 slug 1.3.0-5.1.0 期间 27 个 bare pluginApi 留下的 ghost manifest 死结）。OpenClaw plugin id 仍是 `enhance`，老用户配置 `~/.openclaw/openclaw.json` 里 `plugins.entries.enhance.*` 不需要迁移。\n\n```bash\nopenclaw plugins install @huo15/huo15-openclaw-enhance --force\nopenclaw restart\n```\n\n### 老版本用户迁移（v5.x → v6.0.0）\n\n如果你之前装了 `@huo15/openclaw-enhance`：\n\n```bash\n# 1. 卸载老 plugin（OpenClaw 内部 plugin id 是 enhance）\nopenclaw plugins uninstall enhance\n\n# 2. 装新包（npm 包名变了，但 OpenClaw plugin id 还是 enhance）\nopenclaw plugins install @huo15/huo15-openclaw-enhance --force\n\n# 3. 重启\nopenclaw restart\n```\n\n**配置兼容**：用户机器上 `~/.openclaw/openclaw.json` 里 `plugins.entries.enhance.config.*`（如 `botShare.baseUrl`）的 key 不需要改，因为 plugin id 还是 `enhance`。\n\n老 npm 包 `@huo15/openclaw-enhance` 已 deprecate；老 ClawHub slug `huo15-openclaw-enhance` 已 hide（已装用户仍可 update 兜底，但搜索看不到）。详见 [CHANGELOG.md](./CHANGELOG.md) v6.0.0 段。\n\n安装完成后访问仪表盘：`http://localhost:18789/plugins/enhance/`\n\n---\n\n## 功能模块（v5.6.0 全量，标注分层）\n\n> 标注 `[L1/L2/L3]` 的是工具模块，分别在 minimal / balanced / full 三档下暴露给模型；非工具模块（仪表盘 / 提示词 / kb-corpus / 自检）一律常驻。\n\n| 模块 | 分层 | 说明 | Agent 工具 |\n|------|------|------|-----------|\n| **分类记忆（并入龙虾搜索）** | L1 | user/project/feedback/reference/decision 五类；作为 corpus supplement 与龙虾 `memory` 合并排名 | `enhance_memory_store` `enhance_memory_search` `enhance_memory_review` |\n| **状态栏** | L1 | 一行/详情/json 三格式快照（模式、任务、记忆、宠物、通知） | `enhance_statusline` |\n| **子任务派发** | L1 | 返回可粘贴的 `openclaw agent` CLI 命令，跨 agent 派发 | `enhance_spawn_task` |\n| **模式闸门** | L1 | plan / explore / normal；前两种下 `before_tool_call` 阻止写操作；含 ExitPlanMode 审批 | `enhance_set_mode` `enhance_current_mode` `enhance_exit_plan_mode` |\n| **章节标记** | L2 | session 级「mark_chapter」 | `enhance_mark_chapter` `enhance_chapter_list` |\n| **任务追踪** | L2 | Claude Code TodoWrite 语义；SQLite 持久化；会警告多 in_progress | `enhance_todo_write` `enhance_todo_update` `enhance_todo_list` |\n| **定时任务桥** | L2 | 返回 `openclaw cron add` CLI 命令，尊重龙虾原生 cron-cli | `enhance_loop_register` `enhance_loop_list` `enhance_loop_disable` |\n| **历史会话搜索（v5.7）** | L2 | 流式扫 `~/.openclaw/agents/<agent>/sessions/*.jsonl`，照搬 Claude Desktop 算法（无索引、无新表） | `enhance_transcript_search` |\n| **工作流自动化（v5.6 合并）** | L3 | 触发词 → 行为指令注入；CRUD 收敛到单工具（action 派发） | `enhance_workflow` `enhance_task` |\n| **工具安全观察** | L3 | 错误分类（429/5xx/网络）+ 指数退避建议；不拦截，不重试 | `enhance_safety_log` `enhance_retry_status` `enhance_safety_rules` |\n| **任务规划** | L3 | 把多步任务拆解保存为 plan 工件 | `enhance_task_plan` |\n| **会话回顾（75min idle）** | L3 | idle 自动 prependContext「上次到这儿」 | `enhance_session_recap` |\n| **技能巡检** | L3 | 只读检查 11 个增强技能安装状态 + 给出 clawhub 修复命令 | `enhance_skill_doctor` |\n| **技能安装器** | L1 | 返回 11 个配套 skill 的一键安装 CLI 命令（不执行） | `enhance_install_skills` |\n| **记忆整合** | L1 | hook 注入：把命中的记忆与查询条件合成上下文片段 | `enhance_memory_consolidate` |\n| **提示词增强** | — | 追加 `qualityGuidelines`，其它已由龙虾系统提示词覆盖 | 自动（hook 注入） |\n| **共享知识库语料** | — | 桥接 `~/.openclaw/kb/shared/` 到龙虾 `memory_search`（corpus=\"kb\"） | 自动（corpus supplement） |\n| **输出自检** | — | 空响应/错误关键词检查 | 自动（after-response hook） |\n| **增强仪表盘** | — | Web UI：记忆 / 任务 / 章节 / 定时 / 孵化子任务 / 小火苗 | `http://localhost:18789/plugins/enhance/` |\n\n## 与龙虾原生的关系（设计契约）\n\n| 能力 | 龙虾原生 | enhance 策略 |\n|------|---------|--------------|\n| 记忆向量库（LanceDB） | ✅ 龙虾负责 | **enhance 不自建**；改为 corpus supplement 并入搜索 |\n| 记忆系统提示词 | ✅ 龙虾负责 | enhance 只在段落底部追加一行工具说明（如果龙虾提供 `registerMemoryPromptSupplement`） |\n| 工具 allow/deny | ✅ 龙虾负责 | enhance 只**观察**结果、做错误分类；不拦截 |\n| 任务清单 / 计划文件 | ⚠️ 无对应原语 | enhance 独立实现（SQLite），语义对齐 Claude Code |\n| Cron 调度 | ✅ 龙虾 cron-cli | enhance 不管理调度；只在触发时注入 instructions |\n| 技能安装 | ✅ ClawHub | enhance 只读巡检，不擅自安装 |\n\n---\n\n## 增强技能\n\n安装时会自动注入 8 个增强技能到 `workspace/skills/`（4 个工作流 + 4 个设计）：\n\n### 工作流模式\n\n| 技能 | 说明 | 灵感来源 |\n|------|------|---------|\n| `huo15-openclaw-plan-mode` | 结构化规划模式 — 执行复杂任务前先做需求分析、方案设计、风险评估 | Claude Code Plan Agent |\n| `huo15-openclaw-explore-mode` | 深度探索模式 — 只读调研代码库/系统/话题后再给出结论 | Claude Code Explore Agent |\n| `huo15-openclaw-verify-mode` | 验证检查模式 — 检查工作成果、运行测试、验证假设 | Claude Code Verification Agent |\n| `huo15-openclaw-memory-curator` | 记忆整理 — 定期审查记忆、提取洞察、清理过期条目 | Claude Code auto-memory |\n\n### 设计能力（v5.4 新增）\n\n| 技能 | 说明 | 灵感来源 |\n|------|------|---------|\n| `huo15-openclaw-frontend-design` | 高保真 Web UI 原型 + 5 美学流派 + 反 AI Slop 硬红线 + Junior/Full 两趟渲染 | Anthropic frontend-design skill |\n| `huo15-openclaw-design-director` | 设计方向顾问 — 5 流派 × 20 哲学 → 3 方向反差对比 + 强制推荐 | huashu-design 方向选型模式 |\n| `huo15-openclaw-brand-protocol` | 品牌规范抓取 — Ask/Search/Download/Verify/Codify 5 步 → brand-spec.md | huashu Brand Protocol 5-step |\n| `huo15-openclaw-design-critique` | 5 维设计评审 — 美学/可用性/品牌/内容/实现 + Keep/Fix/Quick Wins 三分类 |...","readmeExcerpt":"Skill: Huo15 Openclaw Enhance Owner: zhaobod1 Summary: 火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected... Tags: latest:6.7.21, plugin:6.1.3 Version history: v6.7.21 | 2026-06-25T17:04:01.311Z | auto Version 6.7.21 - Update version in package.json and CHANGELOG.md. - No functional or codebase changes; document","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"⚠️ [plugin-bare-pluginApi] 已装插件 @huo15/wecom-tips 的 openclaw.compat.pluginApi=\"2026.4.11\" 是 bare 版本，会被解读为精确匹配...\n   → 修复: python3 -c \"...\"（一行 inline）"},{"language":"bash","snippet":"openclaw plugins install @huo15/openclaw-enhance\nopenclaw restart"},{"language":"bash","snippet":"openclaw plugins install @huo15/huo15-openclaw-enhance --force\nopenclaw restart"},{"language":"bash","snippet":"# 1. 卸载老 plugin（OpenClaw 内部 plugin id 是 enhance）\nopenclaw plugins uninstall enhance\n\n# 2. 装新包（npm 包名变了，但 OpenClaw plugin id 还是 enhance）\nopenclaw plugins install @huo15/huo15-openclaw-enhance --force\n\n# 3. 重启\nopenclaw restart"},{"language":"json","snippet":"{\n  \"plugins\": {\n    \"allow\": [\"enhance\"],\n    \"entries\": {\n      \"enhance\": {\n        \"enabled\": true,\n        \"config\": {\n          \"toolTier\": \"balanced\",\n          \"memory\": {\n            \"enabled\": true,\n            \"autoCapture\": true,\n            \"maxContextEntries\": 5\n          },\n          \"safety\": {\n            \"enabled\": true,\n            \"rules\": [\n              { \"tool\": \"exec\", \"pattern\": \"rm -rf *\", \"action\": \"block\", \"reason\": \"危险命令\" },\n              { \"tool\": \"exec\", \"pattern\": \"sudo *\", \"action\": \"block\", \"reason\": \"禁止 sudo\" },\n              { \"tool\": \"file_write\", \"pathPattern\": \"*.env\", \"action\": \"block\", \"reason\": \"禁止写入环境变量文件\" }\n            ],\n            \"defaultAction\": \"allow\"\n          },\n          \"prompt\": {\n            \"enabled\": true,\n            \"sections\": [\"qualityGuidelines\", \"memoryContext\"]\n          },\n          \"workflows\": { \"enabled\": true },\n          \"dashboard\": { \"enabled\": true }\n        }\n      }\n    }\n  }\n}"},{"language":"js","snippet":"if (override.providerOverride) provider = override.providerOverride; // 不返 → provider 停在旧值\nif (override.modelOverride)   modelId   = override.modelOverride;    // 直接当 API model 字段，不再 split"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: huo15-huo15-openclaw-enhance\ndescription: \"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injectedSessions 有 entry + body 不含 URL → 强制 appendText 链接。修法：(1) entry 加 replyAppendUsed 标记,每次 inject 兜底只 fire 一次；(2) prompt 加『用户上传后处理流程』,明确 LLM 看到『传完了』必须 enhance_upload_check({token}) → Read → 处理任务,严禁再发链接 / 反问 / 全盘扫。Use when: 给 OpenClaw 加非侵入式增强（不改龙虾核心、不复制原生功能）。\"\nversion: 6.7.13\nhomepage: https://cnb.cool/huo15/ai/huo15-openclaw-enhance\nmetadata: { \"openclaw\": { \"emoji\": \"🦞\", \"requires\": { \"bins\": [] } } }\n---\n\n# 火一五·克劳德·龙虾增强插件 v5.7.8\n\n## 简介\n\n`@huo15/openclaw-enhance` 是 **OpenClaw 2026.4.24+** 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验。\n\n**核心原则**：凡是龙虾原生有的功能一律不复制，重叠处以龙虾为准；只补龙虾没有的 Claude-Code 体验。\n\n## v5.7.8 全面适配 openclaw 2026.4.24（2026-04-26 同日）\n\n跑完整 SOP 第 1+2 步发现 openclaw 4.24 的 `api.on` 是**完全 typed**（`<K extends PluginHookName>(hookName: K, handler: PluginHookHandlerMap[K])`），enhance 之前 14 处 `api.on(...as any)` 都能去掉 cast。这是真正的\"全面适配\"——不是简单升 peerDep，而是让 enhance 利用 SDK 的全部类型信息。\n\n| 维度 | v5.7.7 | v5.7.8 |\n|---|---|---|\n| `peerDependencies.openclaw` | `^2026.4.22` | **`^2026.4.24`** |\n| `build.openclawVersion` | `2026.4.11`（落后 13 patch）| **`2026.4.24`** |\n| `compat.pluginApi` | `>=2026.4.11` | **`>=2026.4.24`** |\n| `api.on(...as any)` 使用次数 | 14 处 | **0 处** |\n| `(event: any, ctx: any)` 使用次数 | 5 处 | **0 处** |\n| `(ctx as any)?.agentId` 模式（hook 内部）| 9 处 | **0 处**（仅余 4 处 helper 函数内部，工具 ctx 用） |\n| typecheck 错误数 | 0 | **0** |\n| openclaw.plugin.json 顶层字段 | 5 | **8**（加 `enabledByDefault` / `uiHints` / `activation`）|\n\n### 隐藏 bug 修复\n\n去掉 `as any` 后 typecheck 暴露 **self-check.ts 长期被屏蔽的类型不匹配**：之前 `return {};` 试图返回 `PluginHookBeforeAgentReplyResult`，但该类型 `handled: boolean` 是必填的——空对象不合规。修法：所有\"不接管\"分支改成 `return;`（void），仅\"阻断空回复\"分支返回 `{ handled: true, reply: ..., reason: ... }`。\n\n### 不破坏 openclaw 原生\n\n- 所有 hook handler **return undefined（void）** — 不返回 `{block, prependContext}` 等控制信号时 → enhance 仅观察+附加，绝不改变 openclaw 决策\n- typed hook handler 实际行为跟 untyped 完全一致 — 只是 TS 编译期能 narrow 类型，运行时无差异\n- manifest 新加的 `enabledByDefault` / `uiHints` / `activation` 都是 openclaw 4.x 已有字段，不引入新依赖\n\n## v5.7.7 session-lifecycle（2026-04-26 同日，跑完整 gap 调研后落地）\n\n**调研依据**：跑了一次完整 SOP 第 1+2 步（Claude Code 官方 hooks 文档 + 反编译 Claude.app + openclaw 4.22 SDK）。发现 **openclaw 4.22 暴露 29 个 hook，enhance 之前只用 4 个**。落地最高 ROI 的 5 个 hook 闭环 session 生命周期：\n\n| Hook | enhance 行为 | 落地表 |\n|---|---|---|\n| `session_start` | idle > 30min 时插入\"🚀 会话开始/续启\"章节占位 | `chapters` |\n| `session_end` | 加\"🏁 会话结束\"章节 + flush in_progress todo 到 project memory（tag=session-flush, importance=4） | `chapters` + `memories` |\n| `before_reset` | reset 前最后机会抢救最近 3 章节 + 全部未完成 todo 到 decision memory（tag=reset-rescue, importance=6）+ 推 notification | `memories` |\n| `subagent_spawned` | 派生子 agent 时加\"🤖 派生子 agent: X\"章节 | `chapters` |\n| `subagent_ended` | 子 agent 结束加\"✅/❌ 子 agent 结束: X\"章节 | `chapters` |\n\n**防 noise factory 三层防御**（吸收 v5.7.1 教训）：30 秒 dedup + 低 im"},{"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\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**火一五·克劳德·龙虾增强插件 v6.0.0** 是 [OpenClaw 2026.4.24+](https://github.com/openclaw/openclaw) 的**非侵入式**增强插件，对标 Claude Code 的 Agent Harness 体验 + 设计能力套件 + 开发辅助套件；**所有能力重叠处都以龙虾为准**，绝不复制或覆盖龙虾原生功能。\n\n完全通过公共 Plugin SDK 实现，**不修改任何核心代码**，一键安装即可使用。\n（非龙虾团队开发）\n\n### v6.0.0 npm 包改名 + ClawHub 重新注册（2026-05-02）\n\n> **BREAKING（npm 包名）**：`@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance`\n\n老 npm 包对应的 ClawHub slug `huo15-openclaw-enhance` 上有 ghost manifest 死结——1.3.0-5.1.0 期间 27 个版本 pluginApi=bare `2026.2.24`（早于本仓 §6.1 红线\"compat.pluginApi 必须 ranged\"修复），ClawHub plugin entry record 在那段历史首次注册时缓存了 bare 值，后续 publish 不刷新 record 字段，OpenClaw 走 `clawhub:` 协议解析时永远拿到老 manifest 报 `requires plugin API 2026.2.24`。\n\n**修复**：换 npm 包名（与 `huo15-huihuoyun-odoo` 等 huo15-* 命名规范对齐）+ 新 ClawHub slug `huo15-huo15-openclaw-enhance`，让 ClawHub 重新创建一个干净的 plugin entry。OpenClaw plugin id 仍是 `enhance`，老用户配置不需迁移。详见 [CHANGELOG.md](./CHANGELOG.md) v6.0.0 段。\n\n老 npm 包已 deprecate；老 ClawHub slug 已 hide。已装老版本用户跑[迁移命令](#老版本用户迁移v5x--v600)即可。\n\n### v5.7.24 BOT 文件分享 URL 改成独立兄弟 prefix（2026-05-01）\n\nURL 从 v5.7.23 的 `/plugins/enhance/share/...`（dashboard 子路径，靠 bridge dispatch）改成 v5.7.24 的 `/plugins/enhance-share/...`（独立 SDK prefix route，不依赖 dashboard）。\n\n| 维度 | v5.7.23 | v5.7.24 |\n|---|---|---|\n| URL | `https://<域>/plugins/enhance/share/<token>-...` | `https://<域>/plugins/enhance-share/<token>-...` |\n| 路由实现 | dashboard handler 顶部 `tryHandleSubRoute` 转给 bridge 注册的 share handler | bot-share-link 自己 `api.registerHttpRoute({ path: \"/plugins/enhance-share\", ... })` |\n| dashboard.ts 改动 | +3 行（dispatch + detect） | 1 行（detect only），跟 v5.7.22 同 |\n| bridge 复杂度 | 102 行 | 76 行（去掉 dispatch 相关） |\n\n**SDK overlap 规则**：`prefixMatchPath` 用的是 `startsWith(\\`${prefix}/\\`)`，分隔必须是 `/`。所以 `/plugins/enhance-share` ≠ `/plugins/enhance` 的子前缀（中间是 `-`），SDK 不会拒绝。\n\n**baseUrl 自动检测仍 zero-config**：dashboard handler + share handler 都调 `detectBaseUrlFromRequest(req)` 抓 host，访问过任一即缓存。\n\n### v5.7.23 BOT 文件分享桥升级 zero-config（2026-05-01）\n\n复用 dashboard 已经在跑的 `/plugins/enhance` prefix route，通过新增的 [http-route-bridge](src/utils/http-route-bridge.ts) 子分发到 `/plugins/enhance/share/<token>-<filename>`。**v5.7.24 已替换为独立兄弟 prefix 方案，不再 dispatch。**\n\n### v5.7.22 BOT 文件分享桥：企微/钉钉大文件兜底（2026-05-01）\n\n**用户痛点**：播客生成 90MB mp3，企微插件直接传不了；钉钉同样卡死大文件。需要把本地文件投到一个目录、返回临时下载 URL 给用户自取。\n\n**三个工具**（tier=1，全分层都暴露）：\n\n| 工具 | 作用 |\n|---|---|\n| `enhance_share_file(filePath, label?"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-openclaw-enhance\",\n  \"version\": \"6.7.21\",\n  \"publishedAt\": 1782407041311\n}"},{"path":"CHANGELOG.md","content":"## v6.7.21 (2026-06-26)\n\n- 修复: better-sqlite3 每次更新后丢失原生绑定迫使手工 rebuild\n- package.json postinstall 加 `npm rebuild better-sqlite3`，安装自动编译\n\n\n## v6.7.20 (2026-06-25)\n\n- 版本号递增发布（代码无改动）\n\n\n# CHANGELOG\n\n本插件语义化版本号与龙虾适配版本解耦：`package.json.version` 为插件自身的发布版本，`openclaw.build.openclawVersion` 为目标龙虾版本。\n\n## 6.7.19 — 2026-06-25（去掉自动切换模型 model-router + 分享链接 Markdown 预览 + 适配 openclaw 2026.6.10）\n\n- **去掉自动切换模型（model-router）**：移除「模型路由器」模块（按任务复杂度/配额/熔断 `before_model_resolve` 自动换模型）。删 `src/modules/model-router.ts`、index.ts 注册、`ModelRouterConfig` 配置、`openclaw.plugin.json` contracts.tools 的 7 个 `enhance_model_route_*` 工具。**保留** context-watchdog 的 ctx 95% 超限安全切换 + 预警 banner + 手动切换工具（`enhance_route_to_long_ctx` / `enhance_route_revert_to_original`），并更新其引用 model-router 的用户可见消息。latency-tracker/route-history 等工具保留（context-watchdog 的 isModelBanned 仍用）。\n- **分享链接 Markdown 预览**：`enhance_share_file` / `enhance_share_list` 返回结果新增可预览 Markdown —— 图片用 `![名](url)` 让龙虾管家内联渲染缩略图，其他文件用 `[📎名](url)` 可点击下载卡片。工具 description + structuredContent.markdown 都带，并提示 LLM 原样转发给用户（纯文本渠道如企微由各自 send 层降级）。\n- **适配 openclaw 2026.6.10 SDK**：`definePluginEntry` default export 在 SDK 2026.6.x 推断出内部 hash chunk 类型触发 TS2742，用具名常量 + 显式 `OpenClawPluginDefinition` 注解根治；`build.openclawVersion` → 2026.6.10；compat.pluginApi / peerDependencies 保持 ranged 不变。\n\n## 6.7.18 — 2026-06-04（model-router / context-watchdog 的 modelOverride 必须 bare id — 根治 deepseek 100% 400）\n\n### 触发\n\nJobZhao 企微聊天持续报 `Something went wrong while processing your request`。gateway 日志显示 embedded run 100% `isError=true`：\n\n- `deepseek/deepseek-v4-pro` → `400 The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but you passed deepseek/deepseek-v4-pro`（带前缀透传）\n- `minimax/MiniMax-M2.7` 被发到 `provider=deepseek`（provider/model 错配）\n- failover 链里出现双前缀 `deepseek/deepseek/deepseek-v4-pro`\n\n### 根因\n\n`model-router` 的 `before_model_resolve` hook 返回 `{ modelOverride: decision.model }`——`decision.model` 是 **fully-qualified** `provider/model`，且**漏返 `providerOverride`**。\n\nOpenClaw 核心 `resolveHookModelSelection`（pi-embedded-runner）：\n\n```js\nif (override.providerOverride) provider = override.providerOverride; // 不返 → provider 停在旧值\nif (override.modelOverride)   modelId   = override.modelOverride;    // 直接当 API model 字段，不再 split\n```\n\n→ `modelOverride` 带前缀直接发给 deepseek（openai-completions）→ 400；provider 不跟随切换 → minimax 模型被发到 deepseek API。`context-watchdog` v6.6.4 用 `target.fullId` 是**同源潜伏 bug**（long-ctx 触发少未暴露）。\n\n### 修复\n\n- `model-router`：新增 `toBareModel()`；`before_model_resolve` 两处（缓存命中 + 主返回）改返 `{ modelOverride: <bare id>, providerOverride: <provider> }`。\n- `context-watchdog`：两处 FORCE-escalate 改用 bare（`target.bareId` / `target`），log 仍用 fullId 便于阅读。\n- 实测：`openclaw agent` 触发 pro tier → `winnerModel=deepseek-v4-pro` / `result=success` / `fallbackUsed=false`。\n\n> 配套运维（非本包代码）：`~/.openclaw/openclaw.json` 修正 `agents.defaults.model` 大小写/幽灵 model（config-doctor 标 error 的 failover chain）；`~/.openclaw/enhance/model-route.json` 清畸形 speedTracking 双前缀脏 key + 理顺 enabled（deepseek 主"},{"path":"CLAUDE.md","content":"# CLAUDE.md — 龙虾增强包（huo15-openclaw-enhance）接手第一入口\n\n> Claude Code 自动加载本文件。任何账号 clone 本仓库后先读这里，再按需展开 `docs/`。\n> 接手完整指南见 [docs/HANDOVER.md](docs/HANDOVER.md)。\n\n## 是什么\n\n`@huo15/huo15-openclaw-enhance` —— **非侵入式**的 OpenClaw（龙虾）插件。在不改龙虾核心、不重复龙虾原生能力的前提下，补齐「项目工程化 + 多 Agent 运营」维度的能力（结构化记忆、任务/章节追踪、配置体检、文件分享/预览、Claude Code 桥接、上下文守护等 36 个模块）。\n\n- npm: `@huo15/huo15-openclaw-enhance`（当前 v6.7.19）\n- 主仓库: https://cnb.cool/huo15/ai/huo15-openclaw-enhance （remote `origin`）\n- GitHub 镜像: https://github.com/zhaobod1/huo15-openclaw-enhance （remote `github`，SSH 别名 `github-zhaobod1`）\n- ClawHub slug: `huo15-huo15-openclaw-enhance`\n\n## 最高铁律（违反即返工）\n\n**Enhance OpenClaw, never modify or duplicate it. 龙虾有的，让龙虾管。**\n\n加任何新功能前，先 `grep` `~/workspace/projects/openclaw/openclaw-source`（只读参考，禁改）找原生等价物：原生**有**就走原生 API（`registerMemoryCapability` / `on(hook, handler)` 等），原生**没有**才补。详见 [docs/decisions/](docs/decisions/)。\n\n## 怎么跑\n\n```bash\nnpm install\nnpm i openclaw@latest --no-save     # openclaw 是 peerDep，本地开发需另装最新 SDK 才能 typecheck\nnpx tsc --noEmit                    # 发版前必过（应 exit 0）\nnpm run build                       # tsc + 拷 package.json/openclaw.plugin.json 到 dist/\nopenclaw plugins install \"$(pwd)\"   # 装到本地 OpenClaw\n```\n\n入口 `index.ts` → `const enhancePlugin: OpenClawPluginDefinition = definePluginEntry({ id:\"enhance\", register })` → `export default enhancePlugin`。register 内先 `wrapApiForSafeHooks(rawApi)` 给所有模块 hook 套 try/catch，再 `initDb()`（better-sqlite3，失败降级不崩），按 `toolTier` 逐个 register 模块。架构见 [docs/architecture.md](docs/architecture.md)。\n\n## 开发铁律（任何 @huo15/* 插件通用）\n\n1. **`compat.pluginApi` 必须 semver range**（`>=2026.4.24`），不能裸版本；`peerDependencies.openclaw` 同理（`^2026.4.24`）。`build.openclawVersion` 是信息字段，裸版本 OK。\n2. **禁 `child_process`**（execSync/spawn/spawnSync）—— 企业 npm 扫描器判高危整包拦截。需要跑外部命令的功能一律 **return-cliCmd 模式**。参考 `skill-installer.ts` / `scheduled-tasks-bridge.ts` / `spawn-task.ts`。\n3. **`registerMemoryCorpusSupplement` / `registerMemoryPromptSupplement` 是单参**（pluginId 自动注入）。\n4. **诊断不修复**：要「建议改龙虾配置」的功能一律 return-cliCmd，**永不** `fs.writeFileSync` 用户配置文件。\n5. **LLM 输出过 sanitizer**：LLM 生成的 target/URL/路径一律不可信，发文件/广播前必经插件层闸门。\n6. **default export 显式类型**：SDK 2026.6.x 起 `export default definePluginEntry(...)` 会撞 TS2742，必须 `const x: OpenClawPluginDefinition = definePluginEntry(...)` + `export default x`（**不是** `OpenClawPluginEntry`，那个 SDK 没导出）。见 docs/lessons。\n\n## 发版 SOP（精简）\n\n跨会话先对账（见 HANDOVER §5）→ bump `package.json.version` + 写 CHANGELOG → `build.openclawVersion` 改目标 runtime（compat/peer 保持 ranged）→ `tsc --noEmit` 过 → `npm run build`（删旧 dist 防残留）→ git commit + tag → **双 remote push**（`git push origin main && git push github main`，tag 同理）→ `npm publish` → `clawhub publish \"$(pwd)\" --version X.Y.Z`。\n\n## 目录导航\n\n| 路径 | 内容 |\n|---|---|\n| `index.ts` | 插件入口 |\n| `src/modules/*` | 36 个功能模块，每个 register 一类能力 |\n| `src/utils/*` | sqlite-store / safe-api-wrapper / resolve-home / notification-queue / latency-tracker |\n| `docs/architecture.md` | 架构、模块清单、数据流 |\n| `docs/PRD.md` | 产品需求、非目标边界 |\n| `docs/HANDOVER.md` "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected... Skill: Huo15 Openclaw Enhance Owner: zhaobod1 Summary: 火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected... Tags: latest:6.7.21, plugin:6.1.3 Version history: v6.7.21 | 2026-06-25T17:04:01.311Z | auto Version 6.7.21 - Update version in package.json and CHANGELOG.md. - No functional or codebase changes; document","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1877,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T00:06:18.405Z","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-10T00:06:18.405Z","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-10T05:26:28.747Z","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"}]}}}