Skip to content

x-bili-plugin-bypass: 1 Allow forced specification | x-bili-plugin-bypass: 1 允许强制指定 #6220

Open

Description

@ranxianglei

x-bili-plugin-bypass: 1 允许强制指定,现在opencode acp存在的时候bili自动禁用,理论上至少有环境变量可以关闭这个功能。

Activity

  1. changed the title [-]x-bili-plugin-bypass: 1 允许强制指定[/-] [+]x-bili-plugin-bypass: 1 Allow forced specification | x-bili-plugin-bypass: 1 允许强制指定[/+] on Nov 11, 2026
  2. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    OwnerAuthor

    🤖 Powered by ework · qwen3.8-27b

    🔶 需要决策

    查重:不重复。已查 open/closed issues 与在途 [PR],无其他条目涉及「强制指定 x-bili-plugin-bypass」或「控制 opencode-acp 自动禁用」(唯一沾边的 #6211 是 Windows NO_PROXY 通配符,与本主题无关)。

    背景一句话:opencode 车道里,bili 靠「acp 状态文件是否存在」自动决定某个会话走哪条压缩路;装了 opencode-acp 且有历史会话时,这些会话就静默绕过 bili、改由进程内 acp 压缩。目前没有任何开关能手动改这个决定。

    现在到底怎么判定的(证据)

    • 「legacy」= acp 持久化状态文件是否存在:<XDG_DATA_HOME|~/.local/share>/opencode/storage/plugin/acp/<sessionID>.json(src/agent/opencode-legacy.ts:126)。
    • 盖 x-bili-plugin-bypass: 1 头的是 opencode 宿主进程里的插件钩子 chat.headers(src/agent/opencode-native.ts:846):命中 legacy 就盖头并提前返回;proxy 侧见头即原样透传(不注入工具 / 不 nudge / 不绑会话,src/server/handle.ts:640),bili 的压缩因此被跳过。
    • 关键:所有相关门(盖头、acp/dcp/acp-cache 命令路由、acp 的 transform、执行器分流)都读同一个可注入谓词 isLegacy(src/agent/opencode-native.ts:735,deps.isLegacy ?? isLegacyAcpSession)。所以加覆盖开关只需在这一个缝上包一层,两个方向都能一致生效——不是散点改动。

    待决问题:新增一个宿主侧覆盖开关(env),叫什么、三态语义怎么定。这属于新增配置面(owner-gate),按规矩实现前需要你拍板。

    推荐方案 A:新增 env BILI_OPENCODE_ACP_BYPASS,三态,在 opencode-native.ts:735 那个缝上按值包一层 isLegacy:

    • 未设 / auto(默认)=现状,按状态文件逐会话检测 —— 零行为变化。
    • 1 / on =强制 bypass:所有 opencode 会话都盖 bypass 头 → 全交进程内 acp 压。
    • 0 / off =强制 plugin:永不盖头 → bili 自己压所有会话(acp 的 transform/命令门一并关掉,不会双处理)。
    • 命名对齐现有 BILI_OPENCODE_ACP_SPEC;env-only 符合「foreign host process 读的宿主姿态」这一类(同一先例)。launcher 会把 shell 里的 BILI_* 继承给 opencode 子进程,standalone 和 bili 启动两种方式都能生效。
    • 必须大声告警的两条风险(不能静默):①强制 on 但 acp 没真正加载 → 流量原样直发、完全没有压缩;②强制 off 且存在 legacy 旧会话 → 它们的 refs/tag 空间在 acp store 里,bili 服务不了完整历史(退化为只读存档)。

    为什么不选别的

    • B(只给单向逃生阀,仅 on 或仅 off):更简单,但表达力弱,后面大概率补另一向,二次返工。
    • C(config-file key + web UI 开关):最完整,但要动双语 docs + web i18n,超出本 issue「至少一个环境变量」的最小诉求;若你之后想在面板里点开关,我再单独补,本次先 env-only。

    我的推荐:A(env-only 三态,默认 auto 零改动)。理由:完全命中你说的「至少一个环境变量能关这个功能」;默认不动任何现有用户;env-only 不扩张 config schema;三态一次到位。

    不决定的默认行为:我先不改代码(守 config-surface gate)。你回一句「可以 / 按你说的来」我就落地 A:单点改那个缝 + 正负用例单测(宿主侧盖头;proxy 侧已有 tests/plugin-bypass.test.ts)+ docs/configuration.md 双语补一段,然后开 PR。

    标签:opencode / scope/wiring / p3 —— opencode 车道接入层的控制面增强,非缺陷、非核心压缩逻辑,默认零行为变化不影响现有用户。

    (ai: qwen/qwen3.8-27b)

  3. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    OwnerAuthor

    🤖 Powered by ework · qwen3.8-27b

    🔶 需要决策(补充确认,接上一条决策请求,避免断线)

    已完成:查重(不重复,唯一沾边的 #6211 是 Windows NO_PROXY 通配符,无关)+ 打标签(opencode / scope/wiring / p3)。机制已查清——legacy 判定 = acp 状态文件存在与否(src/agent/opencode-legacy.ts:126);宿主侧 chat.headers 命中就盖 x-bili-plugin-bypass: 1(src/agent/opencode-native.ts:846);proxy 见头即原样透传、跳过 bili 压缩(src/server/handle.ts:640)。所有相关门都读同一个可注入谓词 isLegacy(src/agent/opencode-native.ts:735)→ 加覆盖开关是单点改动,不是散点。

    待你拍板:推荐方案 A —— 新增 env BILI_OPENCODE_ACP_BYPASS,三态 {auto=默认零行为变化 / 1=强制 bypass / 0=强制 plugin},在那个缝上按值包一层 isLegacy。两条风险做成大声告警:①强制 on 但 acp 没真正加载 → 流量原样直发、无压缩;②强制 off 且存在 legacy 旧会话 → refs/tag 空间在 acp store 里,bili 服务不了完整历史(退化只读存档)。env-only,不扩张 config schema。

    为何先停手:新增配置面属 owner-gate,未拍板前不写代码。

    下一步:回一句「可以 / 按你说的来」我就落地 A —— 单点改缝 + 宿主侧盖头正负用例单测(proxy 侧已有 tests/plugin-bypass.test.ts)+ docs/configuration.md 双语补一段,然后开 PR。

    (ai: qwen/qwen3.8-27b)

  4. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    OwnerAuthor

    为啥不叫x-bili-plugin-bypass本身,不仅仅是opencode,其他的冲突也会自动关闭呀 所以还是要有一个通用的 和opencode没关系吧

  5. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    OwnerAuthor

    🤖 Powered by ework · qwen3.8-27b

    你说得对——上一版把开关绑死在 opencode 上,名字和定位都偏了。查完代码确认一下事实,再给修正方案。

    查证:x-bili-plugin-bypass 到底谁在用

    • 全仓只有一处生产者:opencode 宿主插件的 chat.headers(src/agent/opencode-native.ts:849),命中 legacy 才盖头。
    • 消费端是通用的:proxy 侧 src/server/handle.ts:640 只判「这个头是不是 = 1」,是哪个客户端发的完全不管 → 命中就原样透传、不进管线。所以这确实是一条通用 wire 契约,opencode 只是当前唯一发送方,机制本身跟 opencode 无关。你的判断成立。
    • 「其他冲突也会自动关闭」也对:proxy 里不止这一条让路路径——另有 x-bili-passthrough(native-intercept 分流请求打,src/agent/native-intercept.ts:1887/:2078,消费在 handle.ts:371)、bili→bili 链检测(BILI_HOP_HEADER)、side request 直转(src/preflight.ts:440)。「bili 决定不处理这条请求」是个更宽的主题,bypass 头只是其中一条。

    修正:改名 + 挪到通用层

    • 名字对齐头本身:BILI_PLUGIN_BYPASS(env 形式对应 x-bili-plugin-bypass),去掉 _OPENCODE_ACP_。
    • 放置点从 opencode 宿主挪到 proxy 判定处 handle.ts:640——在那儿按值覆盖判定,才真正「跟客户端无关、对所有生产者统一生效」(将来别的客户端也发这个头,同一个开关管得住),而且改动更集中(一处判定,不用像宿主侧那样包一个喂给 7 个门控的谓词)。三态:
      • 未设(默认)= 现状,照单尊重头,零行为变化;
      • 1 = 强制 bypass:所有流量原样透传;
      • 0 = 永不 bypass:忽略任何入站 bypass 头(含 opencode legacy)。

    必须让你知道代价(proxy 层 = 全局生效,不是按会话)

    • 1 会把所有车道的压缩都关掉,不只 opencode——适合当显式逃生阀,会大声告警。
    • 0 会让任何依赖 bypass 的客户端(今天就是 opencode legacy)丢掉进程内压缩,那些旧会话历史退化为只读存档——同样大声告警。这正是你要的「关掉自动禁用」,但它是全局的。

    我的推荐:BILI_PLUGIN_BYPASS @ proxy 层,默认未设零改动——最贴合你说的「通用、跟 opencode 没关系」。若你其实只想压住 opencode 那一条、不想波及别的车道,那就退回宿主侧实现,但那样用通用名会名不副实。两者我都做得出,我倾向 proxy 层;你点头选哪个即可。

    下一步:确认「proxy 层 / 通用名」后我就落地(handle.ts 判定处加覆盖 + 正负用例单测 + docs/configuration.md 双语一段)并开 PR;未确认前不动代码(config-surface gate)。

    (ai: qwen/qwen3.8-27b)

  6. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    OwnerAuthor

    继续

  7. ranxianglei commented on Nov 12, 2026

    @ranxianglei
    OwnerAuthor

    🤖 Powered by ework · qwen3.8-27b

    [bot] 🏷 (ai: vllm-qwen/qwen3.8-27b)

    已按拍板方案落地,PR 已开:**https://github.com/ranxianglei/billion-context/pull/6360**(`Fixes #6220`)。

    BILI_PLUGIN_BYPASS 三态(env-only,逐请求读取、无需重启,单点改 src/server/handle.ts 判定):

    • unset / auto(默认)= 现状——入站头逐请求决定,逐字节零变化;
    • 1 / on / true = 强制 bypass——所有请求原样透传(不注入工具、不注入 nudge、不绑会话);
    • 0 / off / false = 永不 bypass——忽略任何入站 x-bili-plugin-bypass 头,legacy opencode-acp 会话也走完整管线。

    验证:typecheck 干净、build 成功、tests/plugin-bypass.test.ts 6/6 过(含 force-off 覆盖头→注入 compress 工具的关键用例)、config-surface-guard + gen-config-docs check-coverage 均过。全量回归由 CI 跑。docs/configuration.md 双语 + config-reference seed 已补。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions