{"id":"d66cae21-a030-4f88-b75e-8b0081686435","entityType":"agent","slug":"clawhub-zhaobod1-huo15-huo15-openclaw-enhance","name":"Huo15 Openclaw Enhance","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zhaobod1-huo15-huo15-openclaw-enhance","canonicalPath":"/agent/clawhub-zhaobod1-huo15-huo15-openclaw-enhance","generatedAt":"2026-10-10T23:50:04.456Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:11:54.184Z","emptyReason":null},"description":"火一五·克劳德·龙虾增强插件 v6.7.13 — large-file-bridge 兜底死循环修 + 用户上传后流程引导：实测用户『我已经上传好了』后 AI 没调 enhance_upload_check 反被兜底又塞了一份上传链接死循环。根因：before_agent_reply 每轮都触发,injected...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-huo15-openclaw-enhance","sourceUrl":"https://clawhub.ai/zhaobod1/huo15-huo15-openclaw-enhance","homepage":"https://clawhub.ai/zhaobod1/skills/huo15-huo15-openclaw-enhance","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zhaobod1/huo15-huo15-openclaw-enhance","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/zhaobod1/skills/huo15-huo15-openclaw-enhance","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Huo15 Openclaw Enhance technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:11:54.184Z","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-10T21:11:54.184Z","emptyReason":null},"stars":null,"forks":null,"downloads":1257,"packageName":null,"latestVersion":"6.7.13","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:11:54.113Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T21:11:54.184Z","lastCrawledAt":"2026-10-10T21:11:54.113Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T21:11:54.113Z","lastVerifiedAt":null,"highlights":[{"version":"6.7.13","createdAt":"2026-05-11T07:36:53.364Z","changelog":"huo15-huo15-openclaw-enhance v6.7.13 - Fixed infinite loop on large-file-bridge upload URL: now only injects the upload link once per session (adds replyAppendUsed marker). - Improved prompt guidance: after user uploads, AI is instructed to call enhance_upload_check({token}) to process files, not to re-send upload links or ask follow-up questions. - Clarified file upload post-processing steps to ensure smooth workflow and prevent repeated prompts.","fileCount":69,"zipByteSize":446550},{"version":"6.7.12","createdAt":"2026-05-11T06:57:11.653Z","changelog":"huo15-huo15-openclaw-enhance v6.7.12 - large-file-bridge now auto-generates a unique token URL for uploads when triggered (to support models that ignore prompts). - Upon before_prompt_build, creates a 12-character hex token using randomBytes(6), storing it in injectedSessions, and writes it to manifest.json (shared with bot-upload-link). - The generated URL (/plugins/enhance-upload/<token>) is consistent before and after agent reply; fallback logic ensures the token URL is always appended to LLM output if needed. - enhance_upload_check can be used to view the list of current tokens/files, ensuring discoverability regardless of model compliance. - Robust fallback guarantees users always receive a valid upload link, even with zero-prompt-following weak models.","fileCount":68,"zipByteSize":442854},{"version":"6.7.11","createdAt":"2026-05-11T06:43:14.360Z","changelog":"huo15-huo15-openclaw-enhance v6.7.11 - Strengthened dual-layer prompt-following for large-file-bridge to prevent LLMs (like MiniMax M2.7) from ignoring directives and reverse-engineering code limits. - Prompt improved to a strict command: the reply must copy a given segment verbatim, forbidding exec, questioning, or configuration changes. - Bottom-layer regex detection now only matches true upload links, no longer triggers on descriptive text containing \"upload\". - Fixes cases where the safeguard in before_agent_reply misjudged regular narrative replies as having issued upload links.","fileCount":68,"zipByteSize":440079},{"version":"6.7.10","createdAt":"2026-05-11T06:13:36.478Z","changelog":"huo15-huo15-openclaw-enhance v6.7.10 重点修复与优化 large-file-bridge 的触发机制： - 放宽 large-file-bridge 触发条件：不再仅限 agentId.startsWith('wecom-')，企微“视频/文件超过 100M,无法下载”等错误文本命中即可触发。 - now allows large-file-bridge in main agent/terminal/cli 等场景，覆盖更多实际 LLM 文件上传提示场景。 - 主动“要传大文件”引导仍限定 wecom- agent，不影响原逻辑。 - 继承 v6.7.9 的 baseUrl 多源解析、v6.7.8 的 /plugins/enhance/* 统一及 token 化追踪链路。 - 持续保证“非侵入式增强”，不改动 OpenClaw 核心或复制原生功能。","fileCount":68,"zipByteSize":438999},{"version":"6.7.9","createdAt":"2026-05-11T05:58:04.955Z","changelog":"huo15-huo15-openclaw-enhance v6.7.9 — 修复 large-file-bridge 上传链接缺公网前缀的问题 - 修正 large-file-bridge 返回的上传链接 baseUrl 解析，避免 LLM 收到的链接只有裸路径（如 /plugins/enhance/upload）缺少 https://公网前缀 - 链接拼接升级为 bot-share-link/bot-upload-link 同款优先级链（环境变量 BOT_BASE_URL > config.baseUrl > 配置文件 > 桥服务自动检测），全场景保证上传链接为公网可访问 - 继承 v6.7.8 路径统一与 token 化上传追踪机制 - 其他功能和用法保持不变","fileCount":68,"zipByteSize":437769},{"version":"6.7.8","createdAt":"2026-05-11T05:32:14.402Z","changelog":"- 上传入口统一为 /plugins/enhance/upload 和 /plugins/enhance-upload/<token>，删除所有 /lanhuo/upload 与 /upload 短链支持 - AI/LLM 调用上传能力时，优先使用带 token 的链接，通过 enhance_upload_check 可追踪具体上传内容 - 共享上传 URL 只做浏览器 fallback，增强安全与可追踪性 - 修改提示和前端逻辑，适配新的上传路径与 token 使用模式","fileCount":68,"zipByteSize":436821},{"version":"6.7.7","createdAt":"2026-05-11T05:23:40.490Z","changelog":"- 修复 /upload 路径与 OpenClaw control UI SPA 冲突，默认回退到 /lanhuo/upload 以确保正常上传 - 更新提示文案，明确告知 /upload 不可用，需使用 /lanhuo/upload - 保持 /lanhuo/upload 及 /plugins/enhance/upload 的兼容 alias - 继承此前版本的大文件流式上传（2GB 不 OOM）能力","fileCount":68,"zipByteSize":435814},{"version":"6.7.6","createdAt":"2026-05-11T05:13:29.045Z","changelog":"v6.7.6 — 上传 URL 支持简化：keepermac.huo15.com/upload 直达上传页。 - 默认上传 URL 简化为最短 /upload，用户可直接访问 keepermac.huo15.com/upload 上传文件 - 提示文案与 LLM 引导统一修改为 /upload，便于用户理解和使用 - large-file-bridge 和 cc-bridge-prompt 相关上传路径均调整为 /upload - 继续兼容历史 alias：/lanhuo/upload、/plugins/enhance/upload 均可使用 - 继承 v6.7.5 的 2GB 单文件流式上传，不会导致内存溢出","fileCount":68,"zipByteSize":433979}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-huo15-openclaw-enhance","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17f6q72skfgyjycm2frgdc8dn83v5mk:huo15-huo15-openclaw-enhance` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/zhaobod1/huo15-huo15-openclaw-enhance before using production credentials."],"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-huo15-openclaw-enhance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-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-10T23:50:04.452Z"}},"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-huo15-openclaw-enhance/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-huo15-openclaw-enhance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhaobod1-huo15-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":"medium","updatedAt":"2026-10-10T21:11:54.184Z","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.13, plugin:6.7.13\n\nVersion history:\n\nv6.7.13 | 2026-05-11T07:36:53.364Z | auto\n\nhuo15-huo15-openclaw-enhance v6.7.13\n\n- Fixed infinite loop on large-file-bridge upload URL: now only injects the upload link once per session (adds replyAppendUsed marker).\n- Improved prompt guidance: after user uploads, AI is instructed to call enhance_upload_check({token}) to process files, not to re-send upload links or ask follow-up questions.\n- Clarified file upload post-processing steps to ensure smooth workflow and prevent repeated prompts.\n\nv6.7.12 | 2026-05-11T06:57:11.653Z | auto\n\nhuo15-huo15-openclaw-enhance v6.7.12\n\n- large-file-bridge now auto-generates a unique token URL for uploads when triggered (to support models that ignore prompts).\n- Upon before_prompt_build, creates a 12-character hex token using randomBytes(6), storing it in injectedSessions, and writes it to manifest.json (shared with bot-upload-link).\n- The generated URL (/plugins/enhance-upload/<token>) is consistent before and after agent reply; fallback logic ensures the token URL is always appended to LLM output if needed.\n- enhance_upload_check can be used to view the list of current tokens/files, ensuring discoverability regardless of model compliance.\n- Robust fallback guarantees users always receive a valid upload link, even with zero-prompt-following weak models.\n\nv6.7.11 | 2026-05-11T06:43:14.360Z | auto\n\nhuo15-huo15-openclaw-enhance v6.7.11\n\n- Strengthened dual-layer prompt-following for large-file-bridge to prevent LLMs (like MiniMax M2.7) from ignoring directives and reverse-engineering code limits.\n- Prompt improved to a strict command: the reply must copy a given segment verbatim, forbidding exec, questioning, or configuration changes.\n- Bottom-layer regex detection now only matches true upload links, no longer triggers on descriptive text containing \"upload\".\n- Fixes cases where the safeguard in before_agent_reply misjudged regular narrative replies as having issued upload links.\n\nv6.7.10 | 2026-05-11T06:13:36.478Z | auto\n\nhuo15-huo15-openclaw-enhance v6.7.10 重点修复与优化 large-file-bridge 的触发机制：\n\n- 放宽 large-file-bridge 触发条件：不再仅限 agentId.startsWith('wecom-')，企微“视频/文件超过 100M,无法下载”等错误文本命中即可触发。\n- now allows large-file-bridge in main agent/terminal/cli 等场景，覆盖更多实际 LLM 文件上传提示场景。\n- 主动“要传大文件”引导仍限定 wecom- agent，不影响原逻辑。\n- 继承 v6.7.9 的 baseUrl 多源解析、v6.7.8 的 /plugins/enhance/* 统一及 token 化追踪链路。\n- 持续保证“非侵入式增强”，不改动 OpenClaw 核心或复制原生功能。\n\nv6.7.9 | 2026-05-11T05:58:04.955Z | auto\n\nhuo15-huo15-openclaw-enhance v6.7.9 — 修复 large-file-bridge 上传链接缺公网前缀的问题\n\n- 修正 large-file-bridge 返回的上传链接 baseUrl 解析，避免 LLM 收到的链接只有裸路径（如 /plugins/enhance/upload）缺少 https://公网前缀\n- 链接拼接升级为 bot-share-link/bot-upload-link 同款优先级链（环境变量 BOT_BASE_URL > config.baseUrl > 配置文件 > 桥服务自动检测），全场景保证上传链接为公网可访问\n- 继承 v6.7.8 路径统一与 token 化上传追踪机制\n- 其他功能和用法保持不变\n\nv6.7.8 | 2026-05-11T05:32:14.402Z | auto\n\n- 上传入口统一为 /plugins/enhance/upload 和 /plugins/enhance-upload/<token>，删除所有 /lanhuo/upload 与 /upload 短链支持\n- AI/LLM 调用上传能力时，优先使用带 token 的链接，通过 enhance_upload_check 可追踪具体上传内容\n- 共享上传 URL 只做浏览器 fallback，增强安全与可追踪性\n- 修改提示和前端逻辑，适配新的上传路径与 token 使用模式\n\nv6.7.7 | 2026-05-11T05:23:40.490Z | auto\n\n- 修复 /upload 路径与 OpenClaw control UI SPA 冲突，默认回退到 /lanhuo/upload 以确保正常上传\n- 更新提示文案，明确告知 /upload 不可用，需使用 /lanhuo/upload\n- 保持 /lanhuo/upload 及 /plugins/enhance/upload 的兼容 alias\n- 继承此前版本的大文件流式上传（2GB 不 OOM）能力\n\nv6.7.6 | 2026-05-11T05:13:29.045Z | auto\n\nv6.7.6 — 上传 URL 支持简化：keepermac.huo15.com/upload 直达上传页。\n\n- 默认上传 URL 简化为最短 /upload，用户可直接访问 keepermac.huo15.com/upload 上传文件\n- 提示文案与 LLM 引导统一修改为 /upload，便于用户理解和使用\n- large-file-bridge 和 cc-bridge-prompt 相关上传路径均调整为 /upload\n- 继续兼容历史 alias：/lanhuo/upload、/plugins/enhance/upload 均可使用\n- 继承 v6.7.5 的 2GB 单文件流式上传，不会导致内存溢出\n\nv6.7.5 | 2026-05-11T03:34:32.932Z | auto\n\n- 上传支持提升：单文件最大上传体积扩展到 2GB，并通过流式写盘方式处理，避免 OOM。\n- handleUpload 新增 octet-stream + X-Filename header 支持，stream 直写本地文件，超 2GB 自动中断并清理残留。\n- 旧 multipart/form-data 上传路径保留，但加 100MB 上限防内存溢出。\n- 上传页面 UPLOAD_HTML 改为二进制流 xhr.send(file)，显示实时进度（MB/GB/百分比）、同源路径兼容 nginx 反代。\n- large-file-bridge prompt 更新说明“2GB 以内都可上传”。\n- 继承 v6.7.4 的 URL 修复和 /lanhuo/upload 别名。\n\nv6.7.4 | 2026-05-11T03:23:41.563Z | auto\n\n- 修复 large-file-bridge 上传链接推送 URL 错位问题，确保用户总是收到 /lanhuo/upload 链接。\n- dashboard 新增 /lanhuo prefix，/lanhuo/upload 作为上传入口，区分与普通仪表盘页面，prompt 也明确区分上传与任务功能。\n- 补全 v6.7.2/3 的 before_agent_reply hook 注册，保持 git 与 npm 包同步。\n- release.sh 新增第 12 项预检：描述里提到的 hook 名必须在 src/ 注册，防止描述与实际代码不一致。\n- 继承此前增强的 prompt 强引导、agentId 前缀 channel 检测、model-id 大小写校验和全模块 hook 防御机制。\n\nv6.6.9 | 2026-05-11T01:40:08.850Z | auto\n\nhuo15-huo15-openclaw-enhance v6.6.9\n\n- config-doctor now checks for model-id case sensitivity: catches config issues where agent model IDs don't exactly match any provider (e.g. \"DeepSeek-V4-Pro\" vs \"deepseek-v4-pro\"), which previously caused \"Something went wrong\" errors on first LLM call.\n- Adds startup validation for all agent default and fallback model IDs; gives precise fix command if only a case mismatch, and suggests registration if model is missing entirely.\n- Inherits previous version’s full safeHook defense (try/catch wrapping all module hooks) and user-config override.\n- No core OpenClaw logic is modified; continues non-intrusive enhancement.\n\nv6.6.8 | 2026-05-11T01:34:31.442Z | auto\n\n**v6.6.8 introduces comprehensive safety wrapping for all plugin hooks**\n\n- Systematically applies try/catch protection to all 28 plugin hooks across 17 modules using a Proxy wrapper for api.on(), not just ctx-watchdog's 6 hooks.\n- Prevents crashes from unhandled exceptions in any hook (e.g. model-router, session-lifecycle, session-bridge, etc.), addressing \"Something went wrong\" errors.\n- All hook exceptions are logged, and the main workflow continues unaffected.\n- Inherits user-config-priority model selection and providerOverride logic from previous versions.\n\nv6.6.7 | 2026-05-11T01:27:47.294Z | auto\n\nhuo15-huo15-openclaw-enhance v6.6.7\n\n- Escalation model candidates now read from user's openclaw.json config, not hardcoded.\n- Adds readUserAgentModels to detect real user model setup (primary, fallbacks, providers) and true contextWindow/cost.\n- pickEscalateTargetFromUserConfig selects targets strictly by available user config and context size.\n- All context escalation and status logic (before_model_resolve, enhance_route_to_long_ctx, enhance_ctx_status) now prioritize user config, using static fallback only as a last resort.\n- Keeps previous v6.6.6 safeHook protections and earlier enhancements (providerOverride, runId dedupe, cost-aware logic, multimodal/accounting, channel differences).\n\nv6.6.6 | 2026-05-11T01:19:52.761Z | auto\n\nv6.6.6 (ctx-watchdog 全面 harden)\n\n- 所有 ctx-watchdog 相关 hook（共 7 个：llm_output、llm_input、subagent_spawned、subagent_ended、after_compaction、before_prompt_build、before_model_resolve）全部用 safeHook() try/catch 包裹，异常安全防护。\n- 任一 hook handler 内部异常不再影响主流程，错误直接 log，主流程继续。\n- readInstalledProviders now independently try/catch，防止因 api.runtime 不存在导致插件崩溃。\n- 解决 v6.6.5 及之前版本偶发 “Something went wrong” 崩溃问题。\n- 继承 v6.6.4 跨 provider 强切 bug 修正与多项稳定性增强。\n\nv6.6.5 | 2026-05-11T01:12:17.732Z | auto\n\nhuo15-huo15-openclaw-enhance v6.6.5\n\n- 修复长上下文模型强制切换时 provider 指定错误，确保 providerOverride 与 modelOverride 同步返回，实现三重过滤并反查用户实际已注册的 provider（v6.6.4）。\n- 优化 cc-bridge-prompt，普通对话消息不再自动附加 dashboard 链接，避免多余的 /lanhuo URL 注入（v6.6.3）。\n- 继承 v6.6.2 的 runId 去重与 enhance_ctx_silence 功能，持续提升上下文守护稳定性。\n- CI 文档同步、代码热修复以及 dashboard 链接误注问题闭环修正。\n\nv6.6.2 | 2026-05-10T23:54:07.020Z | auto\n\nhuo15-huo15-openclaw-enhance v6.6.2\n\n- 修复 llm_output retry 情况下的重复累加 bug：增加 seenRunIds Set（20 项 FIFO），同 runId 的多次 emit 仅计入一次，避免 model-fallback 二次计费。\n- 新增 enhance_ctx_silence 工具（参数：minutes 1-60, reason 可选）；开启后所有 banner 通知静音，自动按时解除。\n- 继承 v6.6.0 版本的 cost-aware、多模态精算、channel 差异化等增强特性。\n\nv6.6.0 | 2026-05-10T23:46:38.832Z | auto\n\nv6.6.0 introduces advanced cost awareness, multi-modal precision, and channel-specific thresholds for OpenClaw context management:\n\n- Adds cost-aware context tracking: maintains real-time LLM model price sheets (18 models), estimates cumulative usage cost (USD), and warns when monthly budget exceeds 80%.\n- Supports multimodal precision: images are counted as 800-1500 context tokens per piece, tuned per model (Gemini 800 / GPT 1200 / Claude 1500).\n- Implements channel-specific thresholds: distinct warn/limit levels for group chat (60/75/90%), direct (65/80/92%), and terminal (70/85/95%); WeCom auto-detects group/direct.\n- Maintains all prior features: subagent context accumulation, predictive warnings, and persistent context tracking.\n- File updates: major logic in context watchdog/types and context DB utilities.\n\nv6.5.7 | 2026-05-10T22:39:23.303Z | auto\n\nv6.5.7 improves context guard logic for multi-agent scenarios and predictive warnings.\n\n- Tracks subagent token usage: child agent token counts now accumulate to parent agent after subagent ends, fixing context tracking blind spot in multi-agent workflows.\n- Predictive overload warning: uses tokensPerTurnHistory of last 5 rounds to forecast when the context will hit warnAt threshold, pushing reminders earlier.\n- Cleans up outdated sidus-specific hardcoded logic.\n- All prior context persistence and revert-to-original features are retained.\n\nv6.5.6 | 2026-05-10T22:26:06.525Z | auto\n\nv6.5.6 introduces persistent context usage tracking and automated model revert to optimize costs.\n\n- Context usage is now stored in a sqlite ctx_usage table (schema v7), persisting data across restarts with 10s throttled flush and 30-day TTL cleanup.\n- After context compaction, if context falls below 60%, the system auto-suggests reverting to the original (non-long-ctx) model.\n- New tools: enhance_route_revert_to_original and enhance_ctx_profile for model management and context profiling.\n- Fully inherits v6.5.5's long-context auto-switching and pre-estimation, v6.5.4's 3-stage banner alerts, and prior enhancements.\n\nv6.5.5 | 2026-05-10T19:03:50.268Z | auto\n\nhuo15-huo15-openclaw-enhance v6.5.5 — 实现上下文守护的真实闭环自动切换 long-ctx 模型\n\n- 新增 before_model_resolve hook（priority=100）：会话累计 token ≥95% 时自动改用超长上下文模型（如 claude-opus-4.7-1m、gemini-2.5-pro、kimi-k2，跳过被禁模型），实现无需 LLM 主动决策即可强制切换\n- 新增 enhance_route_to_long_ctx 工具：允许 LLM 在上下文占用≥80%时主动请求切换到 long-ctx 模型\n- 支持事前 prompt 估算 pendingTokens（按4字符/1token＋图片1500 token计），提前预警即将溢出\n- 升级为真正“闭环”守护：v6.5.4 仅 banner 提醒，v6.5.5 能绕过 LLM 自动调高模型\n\nv6.5.4 | 2026-05-10T18:38:07.646Z | auto\n\nhuo15-huo15-openclaw-enhance v6.5.4 — 新增上下文守护（Context Watchdog），提前预警 token 超标，协助主动切换大 context 模型。\n\n- 新增会话级 token 累加机制，分三档预警（70%/85%/95%）。\n- 达到 80% 时主动建议切换更大 context 的模型。\n- 新增 enhance_ctx_status 工具，支持 LLM 主动查询上下文状态。\n- 支持在溢出错误爆发前预警，提升会话稳定性，与原生 overflow fallback 互补。\n- after_compaction 自动归零，每轮基于 llm_output 统计 token 使用。\n\nv6.5.3 | 2026-05-10T18:34:07.298Z | auto\n\nVersion 6.5.3\n\n- Added context-watchdog module for enhanced reliability and context management.\n- Updated core types and internal interfaces.\n- Improved context and session stability across modules.\n- Refined package metadata and dependency versions.\n- General code maintenance for improved robustness and clarity.\n\nv6.5.2 | 2026-05-10T17:34:39.575Z | auto\n\nhuo15-huo15-openclaw-enhance v6.5.2\n\n- 新增 BOT 文件上传桥（bot-upload-link），支持 LLM 提供上传链接，用户浏览器可上传任意 ≤2GB 文件，并可拉取文件清单，无需新 npm 依赖。\n- 新增 cc-bridge-keyword-dispatch，支持蓝火智能体关键词触发，用户输入关键词即可 HTTP POST 真正触发任务，绕开 LLM 决策。\n- 优化 session-bridge，修复群聊场景跨夜失忆问题，多字段回填，chat_id 支持 null fallback。\n- 新增 large-file-bridge 模块，与 bot-share-link 共享 baseUrl 配置。\n- 兼容继承 v6.2.1 及之前的 token 优化、三层守卫与智能路由功能。\n\nv6.4.2 | 2026-05-10T00:55:41.449Z | auto\n\nhuo15-huo15-openclaw-enhance v6.4.2\n\n- Added new modules: `cc-bridge-dispatch-harness` and `cc-bridge-pre-fetch` for enhanced pre-fetching and dispatch integration.\n- Updated multiple core files to support the new bridge modules and overall architecture improvements.\n- Extended or adjusted types in `src/types.ts` to enable new capabilities.\n- Improved internal session bridge logic for better memory and tool handling.\n\nv6.2.1 | 2026-05-06T08:24:07.464Z | auto\n\nhuo15-huo15-openclaw-enhance v6.2.1\n\n- Reduced memory supplement prompt token usage from 500 to 150 tokens per call, keeping all 5 scenario enums and criteria for LLM guidance.\n- Significantly cuts monthly token cost for this feature (est. ~$52 → ~$16) with no loss of function.\n- All functionalities from v6.2.0 and prior are preserved.\n\nv6.2.0 | 2026-05-06T08:05:56.274Z | auto\n\nhuo15-huo15-openclaw-enhance v6.2.0\n\n- 强化第二天失忆防护：memory-integrator 模块升级，prompt supplement 明确引导 LLM 主动调 enhance_memory_store（覆盖 5 大类典型场景，含判据与 anti-pattern）。\n- session-bridge 注入增强：在上下文添加 PRIOR_SESSION_CHECKPOINT banner，并附完整跨夜 jsonl 路径，鼓励 LLM 主动读取历史确保会话连续性。\n- 继承 v6.1.9 session-bridge 3 倍扩容与 surfacer 松绑等核心增强。\n- 无侵入修改，仅提升 OpenClaw 超长 session/隔夜场景下的记忆可靠性。\n\nv6.1.9 | 2026-05-06T07:51:17.705Z | auto\n\nv6.1.9 addresses \"second-day amnesia\" and improves file surfacing:\n\n- Session-bridge window expanded (messages: 8→20, size: 4KB→12KB, time: 48h→72h) to better retain cross-day context history.\n- Native-memory-surfacer relaxed: max surfaced files 5→12, relevance threshold 0.15→0.05, and new cwdBoost/ageBoost for higher recall. Now user/reference .md files can surface more reliably.\n- No changes to native core or duplication of OpenClaw builtin features.\n- Retains previous enhancements: bot-share routing, capability checks, quota awareness, cc-bridge prompts, dynamic routing, and more.\n\nv6.1.8 | 2026-05-05T15:51:30.773Z | auto\n\n# v6.1.8\n\n- bot-share 文件分发策略调整：小文件优先走渠道本地直发（如 wecom MEDIA:），大文件才走 enhance_share_file 链接。\n- 新增本地直发/链接分流决策表和用户偏好覆盖支持。\n- 更正 v6.1.3 以来的强制 share_file 策略，适配最新版 wecom 通道和 UI 后恢复直发优先。\n- 保持非侵入式增强，继承以往版本的 pickModel capability 验证与 quota-aware 路由等特性。\n\nv6.1.7 | 2026-05-05T14:08:32.618Z | auto\n\nhuo15-huo15-openclaw-enhance v6.1.7\n\n- 修复 model-router 路由能力覆盖问题：selectProvider 返回值现在会过 capability 验证，解决 image 路由被死 entry 覆盖导致能力失效的事故。\n- 保持 v6.1.6 新增的 quota-aware 路由切换机制：遇到 HTTP 422/429/402 或 \"额度超限/quota exceeded\" 类硬错误，立即 ban 1h，下次自动选同模态/同 reasoning 的备选 provider。\n- 其他功能、API 兼容未变。\n\nv6.1.6 | 2026-05-05T01:09:42.183Z | auto\n\nhuo15-huo15-openclaw-enhance v6.1.6\n\n- 新增 model-router \"quota-aware\" 智能切换：遇到 HTTP 422/429/402 或 \"额度超限/quota exceeded\" 等硬错误时立即 ban 当前路由 1 小时，不等错误率累积。\n- 下次路由会自动选择相同模态/推理能力的备选模型，减少中断。\n- 新增工具：enhance_model_route_ban_status（查看 ban 状态）与 enhance_model_route_unban（手动解除 ban）。\n- 继续继承蓝火 dashboard 引导（v6.1.5）、动态智能路由与 cost-budget 支持等功能。\n\nv6.1.5 | 2026-05-04T20:55:51.107Z | auto\n\nhuo15-huo15-openclaw-enhance v6.1.5\n\n- 新增模块：引入 src/modules/cc-bridge-prompt.ts。\n- 多处核心文件优化和更新（index.ts, src/types.ts 等）。\n- package.json 和文档同步版本至 6.1.5。\n\nv6.1.4 | 2026-05-04T18:48:49.629Z | auto\n\n**Summary: Major model-router upgrade.**\n\n- model-router module refactored to auto-read openclaw.json at startup, building a live capabilities table (add models via config, no code changes)\n- Supports image routing, context-aware long-context prioritization, channel-sensitive fallback (IM prefers fast flash models), and circuit breaker (routes around models with >50% error rate)\n- Adds cost-budget mode for better model selection based on expected spend\n- Zero IO on hook call path: does not slow down first-token latency\n- Inherits all features from 6.1.3 (bot-share strict file limits) and previous releases (25+ capability modules)\n\nv6.1.1 | 2026-05-03T07:44:38.726Z | auto\n\nhuo15-huo15-openclaw-enhance v6.1.1\n\n- Improved: Session doctor module further enhances session health checks and lifecycle management.\n- Improved: Trajectory archiver enhancements for session/agent state tracking.\n- Docs: Updated CHANGELOG.md, README.md, and SKILL.md to reflect changes and clarify usage.\n- Manifest and config updates for better compatibility and documentation alignment.\n- Minor internal refactoring for maintainability.\n\nv6.0.0 | 2026-05-02T11:21:58.355Z | auto\n\nMajor update with npm package rename for alignment and manifest issue resolution.\n\n- Package renamed: `@huo15/openclaw-enhance` → `@huo15/huo15-openclaw-enhance` to follow naming convention and enable clean ClawHub plugin entry (fixes ghost manifest issues from bare pluginApi slugs 1.3.0–5.1.0).\n- Installation: now use `openclaw plugins install @huo15/huo15-openclaw-enhance`.\n- OpenClaw plugin id remains `enhance`; upgrade automatically replaces old record without requiring config migration.\n- Inherits all capabilities from 5.8.x: classified memory, tool safety, chapters, workflows, statusline, session-bridge, dashboard, file share, native memory surface, model router, and more (25+ modules).\n- Use case unchanged: seamlessly enhances OpenClaw without altering core functions or duplicating built-ins.\n\nArchive index:\n\nArchive v6.7.13: 69 files, 446550 bytes\n\nFiles: CHANGELOG.md (205023b), docs/SELF_ITERATE.md (19779b), index.ts (22047b), openclaw.plugin.json (19008b), package-lock.json (233848b), package.json (2675b), PLAN.md (4391b), README.md (26041b), 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 (2936b), SKILL.md (17300b), src/modules/bot-share-link.ts (35814b), src/modules/bot-upload-link.ts (31747b), src/modules/cc-bridge-dispatch-harness.ts (11352b), src/modules/cc-bridge-keyword-dispatch.ts (8464b), 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 (27111b), src/modules/context-watchdog.ts (69880b), 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/model-router.ts (57291b), 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 (24560b), 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 (148b)\n\nFile v6.7.13: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.13: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### 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.13:_meta.json\n\n{\n  \"ownerId\": \"kn7byevkn40d6z4p7ghdb097z983tj33\",\n  \"slug\": \"huo15-huo15-openclaw-enhance\",\n  \"version\": \"6.7.13\",\n  \"publishedAt\": 1778485013364\n}\n\nFile v6.7.13:CHANGELOG.md\n\n# CHANGELOG\n\n本插件语义化版本号与龙虾适配版本解耦：`package.json.version` 为插件自身的发布版本，`openclaw.build.openclawVersion` 为目标龙虾版本。\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 升级后用户仍撞同样错误 → 一定不是 ctx-watchdog 而是 OpenClaw 内部或其他 enhance 模块。需要用户提供 `~/.openclaw/logs/gateway.err.log` 实际 trace。\n\n## 6.6.5 — 2026-05-11（doc sync — SKILL.md / package.json description 跟版本号对齐）\n\n### 触发\n\n发现 SKILL.md description 字段还停留在 v6.6.2（但 `version: 6.6.4`）——release.sh preflight 只校验 version 数字相等，没校验 description 文本和 version 的语义一致性。\n\nClawHub manifest 用 SKILL.md description 字段做插件介绍——用户在 ClawHub 浏览插件看到的还是『v6.6.2 runId 去重 + 静音工具』，不知道 v6.6.4 的关键 hotfix（强切 long-ctx 跨 provider 撞 400）。\n\n### 改动\n\n仅 doc sync，无代码改动：\n\n- `SKILL.md` description 同步到 v6.6.5（含 v6.6.3/4/5 hotfix 闭环）\n- `package.json` description 同步到 v6.6.5\n\nClawHub manifest 重新发布后，新用户看到的描述跟实际能力对齐。\n\n## 6.6.4 — 2026-05-11（修跨 provider 强切撞 400 mismatch — long-ctx 选型必带 providerOverride）\n\n### 触发\n\n赵博实测：cfg 改成 `primary=deepseek-v4-flash, fallbacks=[deepseek-v4-pro, minimax/MiniMax-M2.7, ...]` 后，让 BOT 写 word 撞：\n\n```\nERROR: FailoverError: LLM request failed: provider rejected the request schema or tool payload\nWARN model_fallback_decision:\n  requestedProvider: deepseek\n  errPreview: \"400 The supported API model names are deepseek-v4-pro or deepseek-v4-flash, \n               but you passed minimax/MiniMax-M2.7.\"\n  finalOutcome: chain_exhausted\n```\n\nDeepSeek API 收到 `minimax/MiniMax-M2.7`——OpenClaw 把 fallback model id 整串塞给当前 session 的 provider client，跨 provider 时撞 400。\n\n### 双重根因（enhance 自己的 bug）\n\n| Bug | 位置 | 影响 |\n|---|---|---|\n| `LONG_CTX_CANDIDATES_DEFAULT` 只有裸 model id（无 provider prefix） | `context-watchdog.ts:96-104` | 强切返 `modelOverride` 时不知道对应 provider |\n| 强切 hook 只返 `modelOverride` 不返 `providerOverride` | `context-watchdog.ts:1051` 等 3 处 | OpenClaw 核心拿到 model id 但用旧 session provider 调 → API 拒 400 |\n| `pickLongCtxModel` 没过滤\"用户已注册 provider\" | `context-watchdog.ts:434-444` | 选了 claude/gemini/kimi 这种用户没装的 model → 必失败 |\n\n之前 `pickLongCtxModel` 逐个 prefix 试 ban check（`sidus/${c}` / `minimax/${c}` / `anthropic/${c}` ...）— 暴露了\"裸 model id 不知道 provider\"的设计 confusion。\n\n### 修法（不修 OpenClaw 核心）\n\n`PluginHookBeforeModelResolveResult` SDK 类型支持 `providerOverride` 字段（`hook-before-agent-start.types.d.ts`），enhance 一直**没用**。本版补上。\n\n1. **新增 `MODEL_TO_PROVIDER_MAP`**（裸 model id → provider）：\n   ```ts\n   const MODEL_TO_PROVIDER_MAP: Record<string, string> = {\n     \"claude-opus-4.7-1m\": \"anthropic\",\n     \"gemini-2.5-pro\": \"google-ai-studio\",\n     \"kimi-k2\": \"moonshot\",\n     \"minimax-m2\": \"minimax\",\n     \"deepseek-v3.2\": \"deepseek\",\n     // ...约 20 个常见 long-ctx model\n   };\n   ```\n\n2. **新增 `readInstalledProviders(cfg)`** — 从 `cfg.agents.defaults.models` keys 推已注册 provider Set。\n\n3. **`pickLongCtxModel` 加 `installedProviders` 参数过滤**：\n   ```ts\n   const provider = MODEL_TO_PROVIDER_MAP[c];\n   if (!provider) return false;  // 未知 provider 的 candidate 跳\n   if (installedProviders.size > 0 && !installedProviders.has(provider)) return false;\n   ```\n\n4. **强切 hook + `enhance_route_to_long_ctx` tool 同时返 providerOverride**：\n   ```ts\n   const targetProvider = MODEL_TO_PROVIDER_MAP[target];\n   const targetFullId = targetProvider ? `${targetProvider}/${target}` : target;\n   return targetProvider\n     ? { modelOverride: targetFullId, providerOverride: targetProvider }\n     : { modelOverride: target };\n   ```\n\n5. **enhance_route_to_long_ctx 显式 target 也校验 provider 已注册**，给错时返 hint 列已装 providers。\n\n### 用户场景（赵博）效果\n\ncfg 当前装 `deepseek + minimax`：\n\n- candidates 过滤：`gemini/claude/kimi` 全去掉（provider 没装），剩 `minimax-m2` (200K) 不算 long-ctx → 返 null\n- **不强切**，banner 提示用户 /compact\n- 主路径走 cfg.fallbacks `[deepseek-v4-pro]`（同 provider 安全），不撞跨 provider 拼接 bug\n\n### 测试\n\n- `tsc --noEmit` 干净\n- 已有 vitest 全跑通\n\n### 不变\n\n- v6.6.3 cc-bridge-prompt 严格触发条件\n- v6.6.2 runId 去重 + 静音工具\n- v6.6.0 cost-aware + channel 差异化\n- v6.5.7 sidus 清理 + subagent 累加\n- v6.5.6 ctx-usage-db 持久化\n- v6.5.5 真实切换闭环（≥95% 强切）\n\n---\n\n## 6.6.2 — 2026-05-11（上下文守护『runId 去重 + 静音工具』bug fix + UX）\n\n### 触发\n\nv6.6.0 上线后，路线图剩余 P3 / P2 项里挑两个最痛的：\n\n1. **P3-13 龙虾 model-fallback retry 重算 bug**：龙虾 `model-fallback.ts:1011` 检测 ctx overflow 后会触发 retry，retry 时 `llm_output` 同一个 `runId` 会**再 emit 一次**——ctx-watchdog 不去重则 token / cost 累加翻倍，预警提前误触发。\n2. **P2-10 用户烦提醒**：70%-85% 阶段 banner 反复出现，长会话用户希望能临时静音，等任务完了再恢复。\n\n### 改动\n\n#### A. P3-13 runId 去重（context-watchdog.ts）\n\n`SessionUsage` 新增字段：\n\n```ts\nseenRunIds: Set<string>;  // bounded 20 FIFO, in-memory only\n```\n\n`llm_output` 入口：\n\n```ts\nconst runId = String(event?.runId ?? \"\").trim();\nif (runId) {\n  if (s.seenRunIds.has(runId)) {\n    // retry 重复 emit — 跳过 (dedup)\n    return;\n  }\n  s.seenRunIds.add(runId);\n  if (s.seenRunIds.size > SEEN_RUNIDS_LIMIT) {\n    // FIFO eviction（Set 保持插入顺序）\n    s.seenRunIds.delete(s.seenRunIds.values().next().value);\n  }\n}\n```\n\n仅内存（不持久化）—— 重启后 retry 风险自动消失，无需 sqlite schema 复杂化。\n\n#### B. P2-10 enhance_ctx_silence 工具\n\n新工具：\n\n```jsonc\nenhance_ctx_silence({ minutes: 1-60, reason?: string })\n// → 返回 mutedUntilMs / mutedUntilLocal\n```\n\n`before_prompt_build` 入口检查：\n\n```ts\nif (s.mutedUntilMs && Date.now() < s.mutedUntilMs) return undefined;\nif (s.mutedUntilMs && Date.now() >= s.mutedUntilMs) s.mutedUntilMs = undefined;\n```\n\nmute 期间所有 banner（revert / threshold / prediction / budget）都跳过。过期自动解除；重启自动解除（仅内存，不持久化，保护用户不错过真正风险）。\n\n`enhance_ctx_status` 工具响应加 `mutedUntilMs` / `seenRunIdsCount` 字段方便排查。\n\n### 红线自查\n\n- ✅ 不修龙虾核心（仅修自己的累加逻辑防 retry）\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ Silence 不持久化 → 重启自动解除，避免静音错过真正风险（红线 #5\"诊断不修复\"邻位的安全默认）\n\n### 完整路线图状态\n\nv6.5.4 起 16 个完善点已落地 13 个：\n\n| 类 | 完成 | 剩 |\n|---|---|---|\n| P0 | 3/3 | 0 |\n| P1 | 4/4 | 0 |\n| P2 | 4/5 | P2-11/12 dashboard 可视化（依赖 dashboard.ts 改造） |\n| P3 | 2/4 | P3-15 ctx_growth_rate / P3-16 provider-usage 联动 |\n\n剩余 3 项按需启动。ctx-watchdog 主能力已经『跑完一圈』可以稳定服役。\n\n## 6.6.0 — 2026-05-11（上下文守护『cost-aware + 多模态精算 + channel 差异化』收尾）\n\n### 触发\n\nv6.5.7 后路线图剩 3 个 P1/P2 完善点，本期收尾：\n\n1. **P1-4 cost-aware 切换**：long-ctx 模型贵（opus-1m vs sonnet 5x），不分场景一刀切；需要月度预算感知\n2. **P1-6 多模态 token 估算**：固定 1500 token/image 不准——gemini 800 / gpt 1200 / claude 1500，差异 2x\n3. **P2-8 channel-aware 阈值差异化**：群聊每条进上下文涨得快，应该比 terminal 更激进；现在所有渠道用 70/85/95% 不合理\n\n### 改动\n\n#### A. P1-4 cost-aware 切换\n\n新增数据：\n\n```ts\nconst KNOWN_MODEL_COST: Record<string, { in: number; out: number }> = {\n  \"claude-opus-4.7-1m\": { in: 15, out: 75 },  // $/M token\n  \"claude-sonnet-4.5\":  { in: 3,  out: 15 },\n  \"claude-haiku-4.5\":   { in: 1,  out: 5 },\n  \"gpt-5.4\":            { in: 5,  out: 15 },\n  \"gpt-5.4-mini\":       { in: 0.15, out: 0.6 },\n  \"gemini-2.5-pro\":     { in: 1.25, out: 5 },\n  \"gemini-2.5-flash\":   { in: 0.1, out: 0.4 },\n  \"kimi-k2\":            { in: 0.6, out: 2.5 },\n  \"deepseek-v3.2\":      { in: 0.14, out: 0.28 },\n  // ... 18 个常见 model\n};\n```\n\n`SessionUsage.estimatedCostUSD` 字段：\n\n- `llm_output` 时累加 `(input × in + output × out + cacheRead × 0.1 + cacheWrite × 1.25) / 1_000_000`\n- sqlite schema v7→v8 ALTER 加 `estimated_cost_usd REAL DEFAULT 0`\n- 持久化跨 session（hydrate 时恢复）\n- `getMonthlyCostEstimate(agentId?)` 跨 session 月度求和\n\n`monthlyBudgetUSD` 配置（默认 undefined = 不启用）：\n\n- ≥80% 预算 → `evalThresholdBanner` 附加『💰 预算告警』段\n- `before_model_resolve` force-escalate 时 `budgetTight = sessionCost > monthlyBudgetUSD × 0.8`\n- `pickLongCtxModel({ preferCheap: budgetTight })` → 按 cost.in 升序选最便宜的 long-ctx（kimi-k2 $0.6 vs opus-1m $15）\n\n#### B. P1-6 多模态精算\n\n新增 `KNOWN_MODEL_IMAGE_TOKEN_COST`（按 model 单图 token）：\n\n| Model | Token/Image | 来源 |\n|---|---|---|\n| Claude-* | 1500 | Anthropic vision 文档实测 |\n| GPT-5.4 / Codex / Mini | 1200 | OpenAI high detail |\n| Gemini-2.5-pro/flash | 800 | 单图通常 1-3 tile × 258 token |\n| GLM-4.6 / Kimi-K2 | 1500 | 智谱/Moonshot 实测 |\n\n`estimatePromptTokens(event, modelId)` 新增 modelId 参数（不传则用 `event.model` / `event.resolvedRef`）；`resolveImageTokens(modelId)` 内部按 model 查表。\n\n`before_model_resolve` / `before_prompt_build` 都传 `s.lastModel` 进 `estimatePromptTokens` 拿精确估算。\n\n#### C. P2-8 channel-aware 阈值差异化\n\n新增内置 `CHANNEL_THRESHOLDS_DEFAULT`：\n\n| Channel | hint/warn/critical | escalate / force |\n|---|---|---|\n| wecom-group | 60% / 75% / 90% | 65% / 90% |\n| wecom-direct | 65% / 80% / 92% | 70% / 92% |\n| wechat-service | 65% / 80% / 92% | 70% / 92% |\n| dingtalk | 65% / 80% / 92% | 70% / 92% |\n| terminal / default | 70% / 85% / 95% | 80% / 95%（全局沿用） |\n\n`ContextWatchdogConfig.thresholdsByChannel`：用户可覆盖任一渠道任一字段（部分覆盖 fallback 全局）。\n\n`resolveChannel(ctx)`：\n- 读 `ctx.channelId / originatingChannel`\n- `wecom` 进一步按 `agentId` 含 `\"group\"` 拆 `wecom-group` / `wecom-direct`\n- 空/terminal → `default`\n\n`evalThresholdBanner` / `evalPredictionBanner` / `before_model_resolve` 都改用 `resolveThresholds(channel)` 取阈值，每个 session 按其实际 channel 走差异化。\n\n#### D. 工具暴露\n\n`enhance_ctx_status` 新增返回字段：\n\n- `channel`: 当前渠道（\"wecom-group\" / \"terminal\" / ...）\n- `channelThresholds`: 该渠道的 5 个阈值\n- `estimatedCostUSD`: 本会话累计估算成本\n- `monthlyBudgetUSD` / `budgetUsedPercent`: 预算占比\n- `avgTokensPerTurn`: P2-9 预测式提醒的速率指标\n\n`enhance_ctx_profile` 新增：\n- `totalCostUSD`: agent 历史累计\n- `monthly30dSessions` / `monthly30dCostUSD` / `monthlyBudgetUsedPercent`: 30 天画像\n\n### 数据库 migration v7→v8\n\n`migrateV7ToV8` 检测 `ctx_usage` 表已存在但缺 `estimated_cost_usd` 列 → ALTER 加上。新装 v6.6.0 用户 CREATE TABLE 时已包含该列。\n\n### 红线自查\n\n- ✅ 不修龙虾核心 / 不复制 isContextOverflowError\n- ✅ 不抢龙虾 model-fallback\n- ✅ 零 child_process / 零新 npm 依赖\n- ✅ pluginApi `>=2026.4.24` 仍 ranged\n- ✅ KNOWN_MODEL_COST 是 fallback；openclaw.json 注册的 model 真实价格由 model-router 的 capability 表覆盖（互补）\n- ✅ monthlyBudget 仅观察 + 软提示，不强制阻止切换（红线 #5\"诊断不修复\"）\n\n### 路线图收尾\n\n`v6.5.4` 起的 16 个完善点已落地 11 个核心 P0+P1+部分 P2，ctx-watchdog 从『纸上谈兵』→『真实切换』→『状态持久化』→『subagent + 预测』→『cost-aware + 多模态 + channel 差异化』五个阶段闭环。\n\n剩余 P2/P3（按需启动）：\n- P2-10 mute/silence 工具（用户烦提醒时静音 N 分钟）\n- P2-11 dashboard 可视化（sessions overview）\n- P2-12 跨 session 历史画像（已有数据底子，缺 dashboard 入口）\n- P3-13 龙虾 model-fallback 协调（runId 去重，避免 retry 重算）\n- P3-15 ctx_growth_rate 指标（latency-tracker schema 扩展）\n- P3-16 龙虾 provider-usage 联动（真实 quota snapshot）\n\n## 6.5.7 — 2026-05-11（上下文守护『subagent 累加 + 预测式提醒』+ sidus 清理）\n\n### 触发\n\nv6.5.6 路线图剩 5 个完善点，本期挑两个最痛的 + 顺手清掉另一会话遗留的 sidus 残留：\n\n1. **P1-7 subagent token 累加盲区**：子 agent 调 LLM 的 token 走 child sessionKey，main agent 看 ctx 用量永远是\"自己的部分\"，但实际后端 ctx 已经被 child 吃掉一截。蓝火派活 / spawn_task 场景下 ctx-watchdog 严重失真。\n2. **P2-9 反应式 → 预测式**：当前预警是\"已经到 70%才提\"，用户被提醒时只剩 30% 余量；应该按速率预测\"未来 3 轮可能撞 85%\"提前给空间。\n3. **sidus hardcoded 清理**（另一会话遗留 WIP）：`model-router.ts` 默认 fallback `\"sidus/DeepSeek-V4-Flash\"` 不存在（provider 未注册）→ 撞 \"Model not allowed\"。\n\n### 改动\n\n#### A. P1-7 subagent token 累加（context-watchdog.ts）\n\n新增 hooks `subagent_spawned` / `subagent_ended`：\n\n```ts\nconst childToParent = new Map<string, string>();\n\napi.on(\"suba\n\nFile v6.7.13: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\nFile v6.7.13:PLAN.md\n\n# enhance 插件改进规划\n\n> 基于 AI Agent Harness 六层能力架构分析（2026-04-14）\n\n## 源码目录\n`~/workspace/projects/openclaw/huo15-openclaw-enhance/`\n\n## 当前模块清单（v1.9.0）\n| 模块 | 文件 | 功能 | 状态 |\n|------|------|------|------|\n| 结构化记忆 | `modules/structured-memory.ts` | SQLite 持久化，5分类记忆 | ✅ 已有 |\n| 工具安全 | `modules/tool-safety.ts` | hardblock/block/log 三级拦截 | ✅ 已有 |\n| 提示词增强 | `modules/prompt-enhancer.ts` | 追加质量准则 | ✅ 已有 |\n| 工作流自动化 | `modules/workflow-hooks.ts` | 触发词→固定指令 | ✅ 已有 |\n| 仪表盘 | `modules/dashboard.ts` | 统计面板 | ✅ 已有 |\n| 小火苗+贴士 | `modules/flame-pet.ts` | XP系统+每日贴士 | ✅ 已有 |\n| **输出自检** | `modules/self-check.ts` | before_agent_reply 输出验证 | ✅ **新增** |\n| **Context裁剪** | `modules/context-pruner.ts` | before_prompt_build 记忆过滤 | ✅ **新增** |\n\n---\n\n## 已完成（v1.9.0 — 第1次迭代）\n\n### ✅ `self-check.ts`（评估与观测 — P0）\n- Hook: `before_agent_reply` — 在输出发送前拦截\n- 检测：空输出、NO_REPLY、超长输出、错误关键词\n- 非阻断：问题只记录到 SQLite safety_log\n- 可选阻断：空输出时可选择拦截并返回错误提示\n- 配置项：`checkEmpty`、`checkNoReply`、`checkErrorKeywords`、`checkExcessiveLength`、`blockOnEmpty`\n\n### ✅ `context-pruner.ts`（信息边界 — P0）\n- Hook: `before_prompt_build` — 记忆注入前过滤\n- 四维评分：关键词重合度（50%）+ 分类权重（30%）+ 重要性（10%）+ 新鲜度（10%）\n- 阈值可配置（默认 0.25），最多注入 10 条\n- 替代 Claude Code 的 `findRelevantMemories()` LLM 筛选（本地轻量方案）\n\n---\n\n## 待做（规划）\n\n### 🟡 P1 — 第2次迭代\n- `tool-safety.ts` 增加自动重试（429 指数退避、500 重试、新增错误分类）\n- `task-planner.ts`（执行编排）— 任务分解工具\n\n### 🟢 P2 — 第3次迭代\n- 记忆整合：废弃 enhance structured-memory，桥接到 OpenClaw memory-core\n- 工作流增强：条件分支 + 状态追踪\n\n---\n\n## 注意事项\n- 所有模块必须通过 `before_prompt_build` 或工具暴露，不修改 openclaw 核心\n- 多 Agent 隔离：所有状态读取 `ctx.agentId`\n- SQLite 表结构不变，兼容现有数据\n- 仪表盘自动反映新模块的统计数据\n\n## 已完成（v2.0.0 — 第2次迭代）\n\n### ✅ `tool-safety.ts` 增强 — 自动重试\n- `after_tool_call` hook：错误分类（rate_limit/server_error/network_error/auth_error/timeout/unknown）\n- 429 → 指数退避（最多5次，baseDelay 1s，multiplier 2x）\n- 5xx → 重试3次（baseDelay 2s）\n- 网络超时 → 重试2-3次（baseDelay 1s）\n- 401/403 权限错误不重试（直接标记为 auth_error）\n- `enhance_retry_status` 工具：查询当前待重试任务\n- 配置项：`enableRetry: true`（默认开启）\n\n### ✅ `task-planner.ts`（执行编排 — P1）\n- Tool: `enhance_plan_task` — 目标 → 结构化子任务分解\n- Hook: `before_prompt_build` 自动检测触发词并注入规划提示\n- 启发式分解规则：代码开发、Odoo系统、反思模式、通用分解\n- 支持 mode: plan/analyze/reflect\n\n\n## 🐛 Bug修复（v2.0.1）\n\n### ✅ 消除全部10个TS类型错误\n- **根因**：OpenClaw SDK 的 `AgentTool` 类型要求 `label: string`，但运行时 Jiti 解析器不检查此字段\n- **修复**：`api.registerTool(...)` 工厂函数改为 `api.registerTool(( ... as any), ...)`\n- **结果**：`npx tsc --noEmit` → 0 errors\n\n\n## ✅ P2 完成（v2.1.0）\n\n### ✅ 记忆整合 — `memory-integrator.ts`\n- `registerMemoryCapability` 把 enhance SQLite 注册为 OpenClaw corpus supplement\n- OpenClaw 搜索记忆时会同时返回 enhance 的分类记忆\n- 新工具 `enhance_memory_export`：导出所有记忆为 JSON（可同步到 Obsidian/KB）\n\n### ✅ 工作流增强 — `workflow-hooks.ts` 全面升级\n- **正则触发**：触发词支持 `/pattern/flags` 语法\n- **条件分支**：支持 keyword/regex/time_range/day_of_week 条件评估\n- **任务状态**：新增 `enhance_task` 工具（create/update/list/get/delete）\n- **看板视图**：新增 `enhance_workflow_tasks` 工具\n- 任务状态持久化到 `workflows/workflow-tasks.json`（跨 session 追踪）\n\nFile v6.7.13:skill-card.md\n\n## Description:\n\nHuo15 Openclaw Enhance is a third-party OpenClaw plugin that adds agent-harness features such as memory helpers, task and chapter tools, status reporting, model routing, file sharing, upload handoff flows, and diagnostics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[zhaobod1](https://clawhub.ai/user/zhaobod1)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and OpenClaw operators use this plugin to add non-invasive workflow, memory, diagnostics, routing, and file handoff utilities to OpenClaw agent deployments. The plugin is broad and default-on, so teams should review enabled features before installation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The plugin is broad and default-on, and server security evidence says it should be trusted with local OpenClaw sessions, memory, logs, and file-sharing paths.\n\nMitigation: Review configuration before installation and disable transcript bridging, bot share/upload, model routing, context watchdog, LaunchAgent-related, or other features that are not needed.\n\nRisk: File sharing and upload handoff features can expose sensitive local files or directories if used carelessly.\n\nMitigation: Avoid sharing symlinked files, sensitive directories, credentials, or private data; set narrow share roots and expiration windows, and revoke links when done.\n\nRisk: Generated LaunchAgent commands can create persistent cleanup behavior with a deletion policy.\n\nMitigation: Inspect the generated commands and uninstall path before running them, and only enable persistence after accepting the cleanup policy.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/zhaobod1/skills/huo15-huo15-openclaw-enhance)\n- [Publisher profile](https://clawhub.ai/user/zhaobod1)\n- [Project homepage](https://cnb.cool/huo15/ai/huo15-openclaw-enhance)\n- [npm package](https://www.npmjs.com/package/@huo15/openclaw-enhance)\n- [OpenClaw project](https://github.com/openclaw/openclaw)\n- [README](README.md)\n- [CHANGELOG](CHANGELOG.md)\n- [Self-iteration SOP](docs/SELF_ITERATE.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown, JSON-like tool results, inline shell commands, local file paths, and URLs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs may reference local OpenClaw sessions, memory, logs, share paths, upload tokens, and generated setup commands depending on enabled features.]\n\n## Skill Version(s):\n\n6.7.13 (source: server release evidence, SKILL.md frontmatter, package.json, CHANGELOG; CHANGELOG date 2026-05-11)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v6.7.13:templates/AGENTS.enhance-patch.md\n\n<!-- ═══ 龙虾增强包补丁 开始 ═══ -->\n\n## 增强行为准则（龙虾增强包）\n\n### 决策框架\n在执行多步骤任务时，遵循「理解 → 设计 → 执行 → 验证」的流程：\n1. **理解**: 先读相关代码和文档，不要凭空假设\n2. **设计**: 复杂任务先规划（可使用 plan-mode 技能），简单任务直接执行\n3. **执行**: 最小变更原则，一次只改一件事\n4. **验证**: 改完后确认结果正确（可使用 verify-mode 技能）\n\n### 响应模式\n根据请求类型自动调整：\n- **编程任务**: 简洁精准，展示最小 diff，解释 why 而非 what\n- **研究调查**: 系统全面，给出文件路径和行号，区分事实和推测\n- **日常对话**: 自然简短，不过度解释\n\n### 记忆管理\n- 当了解到重要的用户偏好、项目决策、反馈信息时，使用 `enhance_memory_store` 存储\n- 回答问题前，考虑使用 `enhance_memory_search` 查找相关历史记忆\n- 定期使用 memory-curator 技能整理记忆\n\n### 安全意识\n- 执行破坏性操作（删除、覆盖、force push）前先确认\n- 不要提交敏感文件（.env、密钥、凭据）\n- 如果发现安全问题立即指出并修复\n\n<!-- ═══ 龙虾增强包补丁 结束 ═══ -->\n\nFile v6.7.13:templates/SOUL.enhance-patch.md\n\n<!-- ═══ 龙虾增强包补丁 开始 ═══ -->\n\n## 增强行为特质（龙虾增强包）\n\n### 工作风格\n- 直奔主题，一句话能说清的不用三句话\n- 修 bug 不顺手重构，加功能不过度设计\n- 三行相似代码好过一个过早的抽象\n- 失败时先诊断原因再重试，不盲目循环\n\n### 增强能力\n你拥有以下增强工具，在合适的时机使用：\n- `enhance_memory_store/search/review` — 结构化记忆管理\n- `enhance_safety_log/rules` — 安全审计\n- `enhance_workflow_define/list/delete` — 工作流自动化\n- `plan-mode` / `explore-mode` / `verify-mode` / `memory-curator` — 增强技能\n\n### 记忆习惯\n当以下情况发生时，主动存储记忆：\n- 用户纠正你的做法（feedback 类）\n- 用户表达偏好（user 类）\n- 做出重要决策或发现关键信息（decision/project 类）\n- 提到有用的外部资源（reference 类）\n\n<!-- ═══ 龙虾增强包补丁 结束 ═══ -->\n\nFile v6.7.13:openclaw.plugin.json\n\n{\n  \"id\": \"enhance\",\n  \"name\": \"火一五·克劳德·龙虾增强插件\",\n  \"description\": \"非侵入式增强 OpenClaw 2026.4.24+：记忆整合、工具安全、任务/章节/工作流、模式闸门、statusline、定时任务桥接、仪表盘、生命周期监听。v6.1.0 trajectory-archiver v2 路径策略：归档到 sessions-archive 而非 sessions/.archive（移出 sessions/ 子树→openclaw sessions.list 看不到→主线程不 JSON.parse），修复 5/2 实战 sample 暴露的 v1 路径不解决卡顿根因。继承 v6.0.0 npm 包改名 + v5.8.0 hook-profiler\",\n  \"version\": \"2.6.0\",\n  \"enabledByDefault\": true,\n  \"uiHints\": {\n    \"toolTier\": {\n      \"control\": \"select\",\n      \"label\": \"工具分层\"\n    },\n    \"configDoctor.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"配置诊断\"\n    },\n    \"skillRecommender.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"技能推荐\"\n    },\n    \"sessionLifecycle.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"会话生命周期\"\n    },\n    \"nativeMemorySurfacer.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"原生记忆 surface\"\n    },\n    \"botShare.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"BOT 文件分享\"\n    },\n    \"transcriptSearch.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"历史会话搜索\"\n    },\n    \"hookProfiler.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"首字延迟诊断\"\n    },\n    \"largeFileBridge.enabled\": {\n      \"control\": \"switch\",\n      \"label\": \"大文件上传桥接\"\n    }\n  },\n  \"activation\": {\n    \"onAgentHarnesses\": [\n      \"claude\",\n      \"openclaw-default\"\n    ],\n    \"onStartup\": true\n  },\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"toolTier\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"minimal\",\n          \"balanced\",\n          \"full\"\n        ],\n        \"default\": \"balanced\",\n        \"description\": \"工具分层（v5.6+）：minimal=10 工具仅核心 / balanced=18 工具默认 / full=26 工具完整。降低每轮 prompt 工具 schema 总量。修改后需重启 openclaw。\"\n      },\n      \"memory\": {\n        \"type\": \"object\",\n        \"description\": \"增强记忆：本地 SQLite 分类记忆 + 通过 corpus supplement 喂给龙虾原生记忆引擎（不绕过龙虾）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"autoCapture\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxContextEntries\": {\n            \"type\": \"number\",\n            \"default\": 5\n          }\n        }\n      },\n      \"safety\": {\n        \"type\": \"object\",\n        \"description\": \"工具安全补充：仅补充龙虾原生 tools.allow/deny 未覆盖的细粒度规则\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"rules\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"tool\": {\n                  \"type\": \"string\"\n                },\n                \"pattern\": {\n                  \"type\": \"string\"\n                },\n                \"pathPattern\": {\n                  \"type\": \"string\"\n                },\n                \"action\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"block\",\n                    \"hardblock\",\n                    \"log\",\n                    \"allow\"\n                  ]\n                },\n                \"reason\": {\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\n                \"tool\",\n                \"action\"\n              ]\n            },\n            \"default\": []\n          },\n          \"defaultAction\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"allow\",\n              \"log\"\n            ],\n            \"default\": \"allow\"\n          },\n          \"enableRetry\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"prompt\": {\n        \"type\": \"object\",\n        \"description\": \"提示词增强：仅注入龙虾内置系统提示词缺失的章节（qualityGuidelines）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"sections\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"qualityGuidelines\"\n              ]\n            },\n            \"default\": [\n              \"qualityGuidelines\"\n            ]\n          }\n        }\n      },\n      \"workflows\": {\n        \"type\": \"object\",\n        \"description\": \"工作流触发器（关键词 → 指令注入）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"todos\": {\n        \"type\": \"object\",\n        \"description\": \"Claude-Code 风格任务追踪（enhance_todo_write）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"chapters\": {\n        \"type\": \"object\",\n        \"description\": \"会话章节标记（enhance_mark_chapter，仪表盘可跳转）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"mode\": {\n        \"type\": \"object\",\n        \"description\": \"模式闸门：plan/explore 模式下自动拦截写入类工具\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"defaultMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"normal\",\n              \"plan\",\n              \"explore\"\n            ],\n            \"default\": \"normal\"\n          }\n        }\n      },\n      \"statusline\": {\n        \"type\": \"object\",\n        \"description\": \"状态栏：项目/模式/记忆命中/宠物状态实时快照（HTTP /plugins/enhance/api/statusline）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"scheduledTasks\": {\n        \"type\": \"object\",\n        \"description\": \"定时任务桥：注册龙虾 cron-cli 可触发的工作流钩子\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"transcriptSearch\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7 历史会话全文搜索：流式扫 ~/.openclaw/agents/<agent>/sessions/*.jsonl，照搬 Claude Desktop transcriptSearchWorker 算法（无索引、无新表、纯只读）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"hookProfiler\": {\n        \"type\": \"object\",\n        \"description\": \"v5.8.0 量化 OpenClaw 端到端首字延迟：log-tailer 增量解析 ~/.openclaw/logs/gateway.err.log 的 [trace:embedded-run] prep stages 行 + [hooks] timeout/threw 异常事件，落入 enhance-memory.sqlite 两张新表（prep_stage_metrics / hook_profile）。enhance_hook_doctor 工具输出 P50/P95/timeout 排行 + 行动建议。完全只读 + 不替用户改 openclaw.json\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"retentionDays\": {\n            \"type\": \"number\",\n            \"default\": 30,\n            \"description\": \"数据保留天数；启动期清理早于此天数的旧记录\"\n          },\n          \"tailer\": {\n            \"type\": \"object\",\n            \"description\": \"gateway.err.log 增量解析子模块。关闭后只能依赖 profileHook 包装的 enhance 内部 hook 数据，不抓其它 plugin 的 timeout/error 事件\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": true\n              }\n            }\n          }\n        }\n      },\n      \"configDoctor\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7.3 启动期诊断 openclaw.json 陷阱配置（缺失 reserveTokensFloor / model maxTokens 过大），只读不修改用户配置\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"minReserveTokensFloor\": {\n            \"type\": \"number\",\n            \"default\": 5000\n          },\n          \"maxReserveTokensFloor\": {\n            \"type\": \"number\",\n            \"default\": 100000\n          },\n          \"maxModelMaxTokens\": {\n            \"type\": \"number\",\n            \"default\": 32000\n          }\n        }\n      },\n      \"skillRecommender\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7.5 按用户需求挑已装 skill / 推荐未装 huo15-* / 给自建规划。算法照搬 Claude Desktop loadSkills 的 name+description 匹配，按需工具暴露\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"installedThreshold\": {\n            \"type\": \"number\",\n            \"default\": 0.25,\n            \"description\": \"已装命中相关度阈值，低于则触发未装/自建建议\"\n          },\n          \"cacheTtlSec\": {\n            \"type\": \"number\",\n            \"default\": 60,\n            \"description\": \"skill 扫描结果缓存秒数\"\n          }\n        }\n      },\n      \"sessionLifecycle\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7.7 接入 openclaw 4.22 的 session_start / session_end / before_reset / subagent_spawned / subagent_ended hook 闭环 session 生命周期。每个 hook 都做 30 秒 dedup 去重 + 仅写入 enhance 自有表，不污染龙虾原生 memory\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"enableSessionStart\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"enableSessionEnd\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"enableBeforeReset\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"enableSubagent\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"debug\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          }\n        }\n      },\n      \"nativeMemorySurfacer\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7.10 解决'第二天失忆'：每个 session 第一次 before_prompt_build 时按 cwd/git remote 评分,主动 surface ~/.claude/projects/-<cwd>/memory/*.md 的 L1 memory 文件锚点(只 surface name + description + Read 路径,不复制正文,不写任何文件)。零侵入只读、零工具 schema、零 child_process(读 .git/config 替代 git remote)\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"memoryDir\": {\n            \"type\": \"string\",\n            \"description\": \"显式指定 memory 目录;不指定则按 cwd 推断\"\n          },\n          \"maxFiles\": {\n            \"type\": \"number\",\n            \"default\": 5\n          },\n          \"descriptionMaxChars\": {\n            \"type\": \"number\",\n            \"default\": 80\n          },\n          \"threshold\": {\n            \"type\": \"number\",\n            \"default\": 0.15\n          },\n          \"debug\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          }\n        }\n      },\n      \"botShare\": {\n        \"type\": \"object\",\n        \"description\": \"v5.7.24 BOT 文件分享桥（独立 prefix route + zero-config）：企微/钉钉无法直传大文件（>20-50MB）时，把本地文件投递到 <shareRoot>/files/ 并生成 <baseUrl><urlPrefix>/<token>-<basename> 临时下载 URL（默认 24h 过期 lazy 清理）。urlPrefix 默认 /plugins/enhance-share，这是 dashboard /plugins/enhance 的兄弟前缀，SDK overlap 规则下不冲突，由本模块独立 api.registerHttpRoute 注册。baseUrl 优先级：env BOT_BASE_URL > 此配置 > 自动从请求 host 抽 > http://localhost:18789（fallback）。\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"baseUrl\": {\n            \"type\": \"string\",\n            \"description\": \"公网 base URL（不含尾部 /）。一般留空——用户访问过一次 /plugins/enhance/* 或 share 链接后会自动检测；env BOT_BASE_URL 优先级更高\"\n          },\n          \"shareRoot\": {\n            \"type\": \"string\",\n            \"description\": \"落盘根目录，默认 ~/.openclaw/share\"\n          },\n          \"urlPrefix\": {\n            \"type\": \"string\",\n            \"default\": \"/plugins/enhance-share\",\n            \"description\": \"URL 路径前缀。默认 /plugins/enhance-share（独立兄弟 prefix，SDK 不会跟 dashboard /plugins/enhance overlap）\"\n          },\n          \"expireHours\": {\n            \"type\": \"number\",\n            \"default\": 24,\n            \"description\": \"链接默认有效小时数\"\n          },\n          \"maxFileSizeMB\": {\n            \"type\": \"number\",\n            \"default\": 500,\n            \"description\": \"单文件大小上限\"\n          }\n        }\n      },\n      \"largeFileBridge\": {\n        \"type\": \"object\",\n        \"description\": \"v6.x 大文件上传桥接：检测企微 >100MB 文件错误 + 用户主动提大文件上传意图，注入上传链接引导。提供增强工具 enhance_upload_large_file 和上传表单 GET/POST /plugins/enhance/upload。与 botShare 互补（后者负责文件→链接转换，本模块负责检测+上传入口）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"uploadUrl\": {\n            \"type\": \"string\",\n            \"description\": \"自定义上传页面 URL；不填则自动生成为 {baseUrl}/plugins/enhance/upload\"\n          },\n          \"baseUrl\": {\n            \"type\": \"string\",\n            \"description\": \"上传页面基础 URL（企微分享场景需显式填公网地址如 https://example.com:18789）\"\n          },\n          \"detectWecomError\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"检测企微 >100M 错误文本并主动引导\"\n          },\n          \"proactiveOffer\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"用户提大文件/上传时主动提供链接\"\n          }\n        }\n      },\n      \"dashboard\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          }\n        }\n      },\n      \"pet\": {\n        \"type\": \"object\",\n        \"description\": \"小火苗宠物 + 智能贴士\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"color\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"orange\",\n              \"blue\",\n              \"purple\",\n              \"green\",\n              \"white\"\n            ]\n          }\n        }\n      },\n      \"tips\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"injectInPrompt\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"cooldownMinutes\": {\n            \"type\": \"number\",\n            \"default\": 30\n          }\n        }\n      },\n      \"notifications\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxRetained\": {\n            \"type\": \"number\",\n            \"default\": 200\n          }\n        }\n      },\n      \"selfCheck\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"checkEmpty\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"checkNoReply\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"checkErrorKeywords\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"checkExcessiveLength\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"maxLength\": {\n            \"type\": \"number\",\n            \"default\": 20000\n          },\n          \"blockOnEmpty\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          }\n        }\n      },\n      \"contextPruner\": {\n        \"type\": \"object\",\n        \"description\": \"记忆相关性过滤（仅用于 corpus supplement 的 search 排序，不绕过龙虾原生注入）\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"threshold\": {\n            \"type\": \"number\",\n            \"default\": 0.5\n          },\n          \"maxEntries\": {\n            \"type\": \"number\",\n            \"default\": 5\n          },\n          \"debug\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          }\n        }\n      }\n    }\n  },\n  \"contracts\": {\n    \"tools\": [\n      \"enhance_chapter_list\",\n      \"enhance_config_doctor\",\n      \"enhance_current_mode\",\n      \"enhance_exit_plan_mode\",\n      \"enhance_hook_doctor\",\n      \"enhance_install_skills\",\n      \"enhance_loop_disable\",\n      \"enhance_loop_list\",\n      \"enhance_loop_register\",\n      \"enhance_mark_chapter\",\n      \"enhance_memory_export\",\n      \"enhance_memory_purge\",\n      \"enhance_memory_review\",\n      \"enhance_memory_search\",\n      \"enhance_memory_store\",\n      \"enhance_model_route_ban_status\",\n      \"enhance_model_route_disable\",\n      \"enhance_model_route_history\",\n      \"enhance_model_route_mode\",\n      \"enhance_model_route_set\",\n      \"enhance_model_route_status\",\n      \"enhance_model_route_unban\",\n      \"enhance_plan_task\",\n      \"enhance_retry_status\",\n      \"enhance_safety_log\",\n      \"enhance_safety_rules\",\n      \"enhance_session_doctor\",\n      \"enhance_session_recap\",\n      \"enhance_set_mode\",\n      \"enhance_share_file\",\n      \"enhance_share_list\",\n      \"enhance_share_revoke\",\n      \"enhance_share_set_baseurl\",\n      \"enhance_skill_doctor\",\n      \"enhance_skill_recommend\",\n      \"enhance_spawn_task\",\n      \"enhance_statusline\",\n      \"enhance_task\",\n      \"enhance_todo_list\",\n      \"enhance_todo_update\",\n      \"enhance_todo_write\",\n      \"enhance_trajectory_archiver_setup\",\n      \"enhance_transcript_search\",\n      \"enhance_upload_check\",\n      \"enhance_upload_large_file\",\n      \"enhance_upload_link\",\n      \"enhance_upload_revoke\",\n      \"enhance_workflow\"\n    ]\n  }\n}\n\nFile v6.7.13:package-lock.json\n\n{\n  \"name\": \"@huo15/openclaw-enhance\",\n  \"version\": \"5.7.12\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@huo15/openclaw-enhance\",\n      \"version\": \"5.7.12\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@sinclair/typebox\": \"^0.34.49\",\n        \"better-sqlite3\": \"^11.0.0\"\n      },\n      \"bin\": {\n        \"openclaw-enhance-setup\": \"scripts/setup.sh\"\n      },\n      \"devDependencies\": {\n        \"@types/better-sqlite3\": \"^7.6.0\",\n        \"typescript\": \"^5.5.0\"\n      },\n      \"peerDependencies\": {\n        \"openclaw\": \"^2026.4.24\"\n      }\n    },\n    \"node_modules/@agentclientprotocol/sdk\": {\n      \"version\": \"0.19.1\",\n      \"resolved\": \"https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.19.1.tgz\",\n      \"integrity\": \"sha512-oSb3RzjlMoU3Xu6MRJAL/Gd1DyK2+XSmZyUENrt/j1yqt33+ROhxncU6em8nyXEs97D4lVIGaFZ1pN0Q1C9SpA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"peerDependencies\": {\n        \"zod\": \"^3.25.0 || ^4.0.0\"\n      }\n    },\n    \"node_modules/@anthropic-ai/sdk\": {\n      \"version\": \"0.90.0\",\n      \"resolved\": \"https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.90.0.tgz\",\n      \"integrity\": \"sha512-MzZtPabJF1b0FTDl6Z6H5ljphPwACLGP13lu8MTiB8jXaW/YXlpOp+Po2cVou3MPM5+f5toyLnul9whKCy7fBg==\",\n      \"license\": \"MIT\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"json-schema-to-ts\": \"^3.1.1\"\n      },\n      \"bin\": {\n        \"anthropic-ai-sdk\": \"bin/cli\"\n      },\n      \"peerDependencies\": {\n        \"zod\": \"^3.25.0 || ^4.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"zod\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@aws-crypto/crc32\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz\",\n      \"integrity\": \"sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/util\": \"^5.2.0\",\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-browser\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz\",\n      \"integrity\": \"sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/sha256-js\": \"^5.2.0\",\n        \"@aws-crypto/supports-web-crypto\": \"^5.2.0\",\n        \"@aws-crypto/util\": \"^5.2.0\",\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"@aws-sdk/util-locate-window\": \"^3.0.0\",\n        \"@smithy/util-utf8\": \"^2.0.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz\",\n      \"integrity\": \"sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz\",\n      \"integrity\": \"sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@smithy/is-array-buffer\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz\",\n      \"integrity\": \"sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/sha256-js\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz\",\n      \"integrity\": \"sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/util\": \"^5.2.0\",\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/supports-web-crypto\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz\",\n      \"integrity\": \"sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@aws-crypto/util\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz\",\n      \"integrity\": \"sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.222.0\",\n        \"@smithy/util-utf8\": \"^2.0.0\",\n        \"tslib\": \"^2.6.2\"\n      }\n    },\n    \"node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz\",\n      \"integrity\": \"sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz\",\n      \"integrity\": \"sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@smithy/is-array-buffer\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz\",\n      \"integrity\": \"sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@smithy/util-buffer-from\": \"^2.2.0\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/client-bedrock-runtime\": {\n      \"version\": \"3.1037.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.1037.0.tgz\",\n      \"integrity\": \"sha512-Evla4DUdBf1pQpQa7pbfquj7jRaRktkI0qGoWBJBXWB9wQISzJ8OEI4sHugk/W6SF47C7hMP/o3Z/XBrfnejCw==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-crypto/sha256-browser\": \"5.2.0\",\n        \"@aws-crypto/sha256-js\": \"5.2.0\",\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/credential-provider-node\": \"^3.972.36\",\n        \"@aws-sdk/eventstream-handler-node\": \"^3.972.14\",\n        \"@aws-sdk/middleware-eventstream\": \"^3.972.10\",\n        \"@aws-sdk/middleware-host-header\": \"^3.972.10\",\n        \"@aws-sdk/middleware-logger\": \"^3.972.10\",\n        \"@aws-sdk/middleware-recursion-detection\": \"^3.972.11\",\n        \"@aws-sdk/middleware-user-agent\": \"^3.972.35\",\n        \"@aws-sdk/middleware-websocket\": \"^3.972.16\",\n        \"@aws-sdk/region-config-resolver\": \"^3.972.13\",\n        \"@aws-sdk/token-providers\": \"3.1037.0\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@aws-sdk/util-endpoints\": \"^3.996.8\",\n        \"@aws-sdk/util-user-agent-browser\": \"^3.972.10\",\n        \"@aws-sdk/util-user-agent-node\": \"^3.973.21\",\n        \"@smithy/config-resolver\": \"^4.4.17\",\n        \"@smithy/core\": \"^3.23.17\",\n        \"@smithy/eventstream-serde-browser\": \"^4.2.14\",\n        \"@smithy/eventstream-serde-config-resolver\": \"^4.3.14\",\n        \"@smithy/eventstream-serde-node\": \"^4.2.14\",\n        \"@smithy/fetch-http-handler\": \"^5.3.17\",\n        \"@smithy/hash-node\": \"^4.2.14\",\n        \"@smithy/invalid-dependency\": \"^4.2.14\",\n        \"@smithy/middleware-content-length\": \"^4.2.14\",\n        \"@smithy/middleware-endpoint\": \"^4.4.32\",\n        \"@smithy/middleware-retry\": \"^4.5.5\",\n        \"@smithy/middleware-serde\": \"^4.2.20\",\n        \"@smithy/middleware-stack\": \"^4.2.14\",\n        \"@smithy/node-config-provider\": \"^4.3.14\",\n        \"@smithy/node-http-handler\": \"^4.6.1\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/smithy-client\": \"^4.12.13\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"@smithy/url-parser\": \"^4.2.14\",\n        \"@smithy/util-base64\": \"^4.3.2\",\n        \"@smithy/util-body-length-browser\": \"^4.2.2\",\n        \"@smithy/util-body-length-node\": \"^4.2.3\",\n        \"@smithy/util-defaults-mode-browser\": \"^4.3.49\",\n        \"@smithy/util-defaults-mode-node\": \"^4.2.54\",\n        \"@smithy/util-endpoints\": \"^3.4.2\",\n        \"@smithy/util-middleware\": \"^4.2.14\",\n        \"@smithy/util-retry\": \"^4.3.4\",\n        \"@smithy/util-stream\": \"^4.5.25\",\n        \"@smithy/util-utf8\": \"^4.2.2\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/core\": {\n      \"version\": \"3.974.5\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.5.tgz\",\n      \"integrity\": \"sha512-lMPlYlYfQdNZhlkJgnkmESwrY+hNh3PljmZ+37oAqLNdJ6rnILAwFSyc6B3bJeDOtMORNnMQIej0aTRuOlDyhQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@aws-sdk/xml-builder\": \"^3.972.19\",\n        \"@smithy/core\": \"^3.23.17\",\n        \"@smithy/node-config-provider\": \"^4.3.14\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/signature-v4\": \"^5.3.14\",\n        \"@smithy/smithy-client\": \"^4.12.13\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"@smithy/util-base64\": \"^4.3.2\",\n        \"@smithy/util-middleware\": \"^4.2.14\",\n        \"@smithy/util-retry\": \"^4.3.4\",\n        \"@smithy/util-utf8\": \"^4.2.2\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-env\": {\n      \"version\": \"3.972.31\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.31.tgz\",\n      \"integrity\": \"sha512-X/yGB73LmDW/6MdDJGCDzZBUXnM3ys4vs9l+5ZTJmiEswDdP1OjeoAFlFjVGS9o4KB2wZWQ9KOfdVNSSK6Ep3w==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-http\": {\n      \"version\": \"3.972.33\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.33.tgz\",\n      \"integrity\": \"sha512-c0ZF+lwoWVvX5iCaGKL5T/4DnIw88CGqxA0BcBs3U86mIp5EZYPVg+KSPkMXOyokmADvNewiMUfSG2uFwjRp0g==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/fetch-http-handler\": \"^5.3.17\",\n        \"@smithy/node-http-handler\": \"^4.6.1\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/smithy-client\": \"^4.12.13\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"@smithy/util-stream\": \"^4.5.25\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-ini\": {\n      \"version\": \"3.972.35\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.35.tgz\",\n      \"integrity\": \"sha512-jsU4u/cRkKFLKQS0k918FQ27fzXLG5ENiLWQMYE6581zLeI2hWh04ptlrvZMB3wJT/5d+vSzJk74X1CMFr4y8Q==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/credential-provider-env\": \"^3.972.31\",\n        \"@aws-sdk/credential-provider-http\": \"^3.972.33\",\n        \"@aws-sdk/credential-provider-login\": \"^3.972.35\",\n        \"@aws-sdk/credential-provider-process\": \"^3.972.31\",\n        \"@aws-sdk/credential-provider-sso\": \"^3.972.35\",\n        \"@aws-sdk/credential-provider-web-identity\": \"^3.972.35\",\n        \"@aws-sdk/nested-clients\": \"^3.997.3\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/credential-provider-imds\": \"^4.2.14\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-login\": {\n      \"version\": \"3.972.35\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.35.tgz\",\n      \"integrity\": \"sha512-5oa3j0cA50jPqgNhZ9XdJVopuzUf1klRb28/2MfLYWWiPi9DRVvbrBWT+DidbHTT36520VuXZJahQwR+YgSjrg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/nested-clients\": \"^3.997.3\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-node\": {\n      \"version\": \"3.972.36\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.36.tgz\",\n      \"integrity\": \"sha512-4nT2T8Z7vH8KE9EdjEsuIlHpZSlcaK2PrKbQBjuUGU46BCCzF3WvP0u0Uiosni3Ykmmn4rWLVawoOCLotUtCbg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/credential-provider-env\": \"^3.972.31\",\n        \"@aws-sdk/credential-provider-http\": \"^3.972.33\",\n        \"@aws-sdk/credential-provider-ini\": \"^3.972.35\",\n        \"@aws-sdk/credential-provider-process\": \"^3.972.31\",\n        \"@aws-sdk/credential-provider-sso\": \"^3.972.35\",\n        \"@aws-sdk/credential-provider-web-identity\": \"^3.972.35\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/credential-provider-imds\": \"^4.2.14\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-process\": {\n      \"version\": \"3.972.31\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.31.tgz\",\n      \"integrity\": \"sha512-eKeT4MXumpBJsrDLCYcSzIkFPVTFn/es7It2oogp2OhU/ic7P/+xzFpQx9ZhwtXS57Mc5S42BPWi7lHmvs/nYg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-sso\": {\n      \"version\": \"3.972.35\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.35.tgz\",\n      \"integrity\": \"sha512-bCuBdfnj0KGDMdLp6utMTLiJcFN2ek9EgZinxQZZSc3FxjJ/HSqeqab2cjbnoNfy8RM6suDCsRkmVY1izp9I+A==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/nested-clients\": \"^3.997.3\",\n        \"@aws-sdk/token-providers\": \"3.1036.0\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers\": {\n      \"version\": \"3.1036.0\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1036.0.tgz\",\n      \"integrity\": \"sha512-aNSJ6jjDYayxN9ZA1JpycVScX93Lx03kKZ1EXt3DGOTahcWVLJj3oLAlop0xKP+vP2Ga2t49p1tEaMkTbCCaZA==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/nested-clients\": \"^3.997.3\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/credential-provider-web-identity\": {\n      \"version\": \"3.972.35\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.35.tgz\",\n      \"integrity\": \"sha512-swW6Bwvl8lanyEMtZOWE/oR6yqcRQH4HTQZUVsnDVgoXvRjRywpYpLv2BWwjUFyjPrqsdX6FeTkf4tMSe/qFTQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/core\": \"^3.974.5\",\n        \"@aws-sdk/nested-clients\": \"^3.997.3\",\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/property-provider\": \"^4.2.14\",\n        \"@smithy/shared-ini-file-loader\": \"^4.4.9\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/eventstream-handler-node\": {\n      \"version\": \"3.972.14\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.14.tgz\",\n      \"integrity\": \"sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/eventstream-codec\": \"^4.2.14\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-eventstream\": {\n      \"version\": \"3.972.10\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.10.tgz\",\n      \"integrity\": \"sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-host-header\": {\n      \"version\": \"3.972.10\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz\",\n      \"integrity\": \"sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-logger\": {\n      \"version\": \"3.972.10\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz\",\n      \"integrity\": \"sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@smithy/types\": \"^4.14.1\",\n        \"tslib\": \"^2.6.2\"\n      },\n      \"engines\": {\n        \"node\": \">=20.0.0\"\n      }\n    },\n    \"node_modules/@aws-sdk/middleware-recursion-detection\": {\n      \"version\": \"3.972.11\",\n      \"resolved\": \"https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz\",\n      \"integrity\": \"sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@aws-sdk/types\": \"^3.973.8\",\n        \"@aws/lambda-invoke-store\": \"^0.2.2\",\n        \"@smithy/protocol-http\": \"^5.3.14\",\n\nArchive v6.7.12: 68 files, 442854 bytes\n\nFiles: CHANGELOG.md (201411b), docs/SELF_ITERATE.md (19779b), index.ts (22047b), openclaw.plugin.json (19008b), package-lock.json (233848b), package.json (2694b), PLAN.md (4391b), README.md (26041b), scripts/audit-session-bridge-and-share-fallback.sh (11331b), scripts/deploy-2week-followup-launchagent.s...","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.13, plugin:6.7.13 Version history: v6.7.13 | 2026-05-11T07:36:53.364Z | auto huo15-huo15-openclaw-enhance v6.7.13 - Fixed infinite loop on large-file-bridge upload URL: now only injects t","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":"text","snippet":"贾维斯 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   ← 又塞了一遍！"}],"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-huo15-openclaw-enhance\",\n  \"version\": \"6.7.13\",\n  \"publishedAt\": 1778485013364\n}"},{"path":"CHANGELOG.md","content":"# CHANGELOG\n\n本插件语义化版本号与龙虾适配版本解耦：`package.json.version` 为插件自身的发布版本，`openclaw.build.openclawVersion` 为目标龙虾版本。\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()` 生成 toke"},{"path":"docs/SELF_ITERATE.md","content":"# 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 pluginAp"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1664,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T21:11:54.184Z","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-10T21:11:54.184Z","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-10T23:50:04.456Z","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"}]}}}