# openchamber-queue **Repository Path**: open-tecmz/openchamber-queue ## Basic Information - **Project Name**: openchamber-queue - **Description**: OpenChamber 的按项目任务队列扩展:项目空闲时自动开始下一个任务。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-30 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: openchamber, OPENCODE, openchamber-extension ## README
# OpenChamber 队列 **给 [OpenChamber](https://openchamber.dev) 的按项目任务队列扩展。** 添加任务、打开开关,项目空闲满 10 秒后,下一个任务就会自动开始运行 —— 一次一个,无需逐个点击。 [English](./README.md) · 简体中文 [![License: Apache 2.0](https://img.shields.io/badge/license-Apache_2.0-blue.svg)](./LICENSE) [![OpenChamber](https://img.shields.io/badge/OpenChamber-%3E%3D%202.0.0-6f42c1.svg)](https://openchamber.dev) [![Panel languages](https://img.shields.io/badge/panel_en%20%2F%20zh--cn%20%2F%20zh--tw-2ea44f.svg)](#语言) 队列面板:启用开关、任务输入框与待执行列表
任务只有一个字段:**内容**,也就是提示词。模型、agent 等使用项目自身的默认选择。该项目 **连续 10 秒没有正在运行的会话**后,任务才会开始,因此没有任务时侧栏保持安静。 > 这是一个 OpenChamber **扩展**(面板 + 本地服务),不是 OpenCode 插件。 ## 目录 - [功能](#功能) - [工作原理](#工作原理) · [调度规则](#调度规则) · [后台服务](#后台服务) - [安装](#安装) - [使用](#使用) - [存储与持久化](#存储与持久化) - [权限](#权限) - [已知限制](#已知限制) - [开发](#开发) - [语言](#语言) - [许可证](#许可证) ## 功能 - **每个项目一条队列** —— 切换项目即切换队列。 - **自动下发** —— 项目空闲满 10 秒后自动建会话、发内容,无需逐个点击。 - **立即执行** —— 第二个按钮不排队,直接用输入内容创建新会话并发送。 - **单条任务立即运行** —— 每行都有 *执行* 按钮,可立即用该条任务创建会话并把它移出队列,计入「已完成」。 - **提交即出队** —— 任务创建会话后立即从队列移除并计入「已完成」;队列空了会自动关闭开关。 - **询问不阻塞** —— 等待提问的会话不占用项目,下一个任务照常下发。 - **停止时可编辑** —— 点击任务卡片即可就地编辑;队列运行中会拒绝修改。 - **关页面也能工作** —— 由服务器端本地服务驱动,不依赖浏览器标签页。 - **输入不丢** —— 输入框内容按项目保存为草稿并写入本地服务,刷新、重启 OpenChamber 或意外退出后都会恢复;后台队列变化不会清空正在输入的任务。 - **面板多语言** —— 跟随 OpenChamber 语言(英文、简体中文、繁體中文)。 ## 工作原理 ### 调度规则 对每个项目,每次检查: 1. 队列未启用或为空 → 不动作。 2. 队列自己启动的会话仍在**执行** → 等待。 3. 项目里**其它**会话真正在执行 → 等待。 4. 项目还必须**连续空闲满 10 秒**。这 10 秒内只要有会话被激活(你自己开的会话、刚结束的 会话又重试等),就重新计时,让项目有时间平静下来。 5. 取队首待执行任务 → 创建会话 → 发送内容;任务随即离开队列并计入「已完成」。下一个任务 前同样重新等待 10 秒。 6. 该会话不再执行(空闲、消失或正在提问)后项目恢复空闲,重新计时;队列清空后自动关闭开关。 这 10 秒对第一个任务同样生效:打开开关时若有任务在等,会等 10 秒后才开始,而不是立即开始。 「真正在执行」指 `running`、`retrying`、`waiting-permission`;`waiting-question` **不算占用**。所以智能体提问不会卡住队列(其任务早已提交),而你自己开的会话会让队列排队等待。 把命令放到后台执行的会话同样算「在执行」:命令还在跑时它显示为空闲,但队列会一直等到该命令结束才继续。 ### 后台服务 队列由宿主为 `contributes.service` 启动的 Node 进程拥有。它调用本机 OpenChamber 控制 API(与自带 `openchamber` CLI 同一条路)读取会话状态、创建会话、发送提示词, 即使没有面板或窗口打开也持续运行。 面板只是这个服务的视图,**不会**再维护一份自己的队列副本。服务尚未就绪时,面板显示 「连接中」并自动重试。因此,在服务启动过程中加入的任务不会被写进服务看不到的存储里, 要么送达服务,要么面板仍在提示连接中。 本地服务必须在安装时批准,没有它队列无法工作;批准它,队列才能在后台持续运行。 ## 安装 需要 OpenChamber **2.0.0 或更高**(网页版或桌面版)。 1. **设置 → 扩展**。 2. 在 **文件夹、ZIP 或 URL** 中粘贴以下之一并点击 **添加**: - 最新打包的 zip —— 下面的地址始终指向最新构建: `https://github.com/open-tecmz/openchamber-queue/releases/latest/download/openchamber-queue-latest.zip` - 最新 **Releases** 页面上的 `.zip` 文件; - 本地克隆的 `dist/` 目录(先执行一次 `npm run build`); - `release` 分支的 git 地址 —— `https://github.com/open-tecmz/openchamber-queue.git#release` (git 安装可在 设置 → 扩展 中 **更新**,依据 `package.json` 版本号升高; zip 安装不支持应用内更新,需手动重新添加更新的 zip)。 3. 在权限对话框中点击 **允许并启用**。它会列出 `prompt`、`sessions`、`service`; 本地服务以你的完整用户权限运行。 ## 使用 在侧栏扩展区打开 **队列** 面板: 1. 在输入框里填写任务 → **立即执行** 直接创建新会话,或 **加入队列** 排队等待。 2. 打开 **启用队列** 开关。 3. 之后无需干预。项目连续空闲 10 秒后队首任务开跑,跑完自动接下一个。 顶栏显示当前模式,右上角是两个计数:**待执行 / 已完成**。每行有 *执行*、*置顶*、 *重试*(仅失败时)、*删除*;*执行* 会立即用该条任务创建会话并移出队列,不必等项目空闲。 队列停止时,点击某一行会展开为编辑器,带 **保存** / **取消**。 其它入队方式: - 消息菜单 → **加入队列**(把该条消息内容入队); - 聊天框斜杠命令 → `/queue <内容>`。 ## 存储与持久化 | 数据 | 位置 | | --- | --- | | 队列数据 | `~/.config/openchamber-queue/state.json`,或 `$OPENCHAMBER_QUEUE_DATA_DIR/state.json` | | 安装记录与权限 | `/extensions.json` | 队列把状态文件单独放在宿主数据目录**旁边**,绝不放进任何项目目录里。宿主数据目录为 `~/.config/openchamber`,除非宿主侧设置了 `OPENCHAMBER_DATA_DIR`(该变量不会传给 service 进程,因此自定义的宿主数据目录不会被镜像过来)。 数据是普通 JSON 文件,**重启、升级、卸载都不会丢**。每个项目的输入框草稿也保存在同一个 文件里,刷新或重启后会自动恢复。但**后台 worker 不会自动启动**: OpenChamber 只在有请求时才拉起扩展服务,因此 OpenChamber 进程重启后,队列会暂停, 直到你打开一次面板(或触发一次消息动作 / `/queue` 命令)。之后它会常驻,原先已启用的 队列会从断点继续。 卸载扩展会清除安装记录与权限;要一并清空队列数据,请手动删除 `~/.config/openchamber-queue/`。 ## 权限 | 权限 | 用途 | | --- | --- | | `sessions` | 列出项目与会话、创建会话 | | `prompt` | 把任务内容发送到新会话 | | `service` | 拥有队列的本地服务;必需,且以你的完整用户权限运行 | 队列没有面板内的回退模式:若本地服务未获批准,面板会一直停留在连接中状态。 ## 已知限制 - **冷启动** —— 见上文:每次 OpenChamber 进程启动后,需要一次打开面板(或动作) 才能把后台 worker 唤醒。 - **非公开接口** —— 服务使用产品自身的控制 API 与代理的 OpenCode 会话路由。这些接口 自带的 CLI 也在用,但不是面向扩展的公开契约,版本升级可能变动。 - **任务在提交时即计为完成** —— 队列只负责发出提示词,无法判断智能体是否成功; 请到 OpenChamber 的会话中确认结果。 - **清单字符串无法本地化** —— 扩展 API 的面板名、命令描述、动作标签是固定字符串, 它们保持声明语言;面板内部则跟随 OpenChamber 语言。 - 扩展不会在 VS Code 与移动端加载,队列同样不可用。 ## 开发 ```bash npm install npm run build # 组装可安装包到 dist/ npm run typecheck npm test # 先构建,再针对 stub OpenChamber 跑隔离端到端测试 ``` `npm run build` 会把整个可安装包写入 `dist/`:`dist/package.json`、`dist/icon.svg`、 `dist/panel/{index,background}.html`,以及两个产物 `dist/panel/main.js`(浏览器 IIFE) 与 `dist/service/main.js`(Node ESM)。宿主按包内路径直接加载已构建的 `.js`,因此页面与 其 bundle 必须位于同一目录。`dist/` 是生成物,**不提交**;CI 在每次推送到 `main` 时构建它。 开发时把 `dist/` 作为文件夹安装(设置 → 扩展):它直接读取你的目录,改完重建即可刷新。 `npm test` 覆盖后台服务。 宿主不会编译扩展:只发布已构建文件。新增语言只需改 `src/i18n.ts` 并重新构建。这里只使用 `devDependencies`,仓库不包含 `node_modules`。每次改动都要在 `changelog.md` 中记录 (规范见 `AGENTS.md`)。 ## 语言 面板跟随 OpenChamber 语言,找不到时回退英文。面板文案已内置 `en`、`zh-cn`、`zh-tw`; 在 `src/i18n.ts` 的 `DICTIONARIES` 中新增一份即可,字典类型会让缺失的键在编译期报错。 文档提供英文([README.md](./README.md))与简体中文(本文件)。 ## 许可证 [Apache-2.0](./LICENSE)。