@te-river/opencode-team-mode 1.5.11 → 1.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -57
- package/README.zh-CN.md +126 -47
- package/dist/agents.d.ts +5 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +37 -11
- package/dist/agents.js.map +1 -1
- package/dist/approval-gate.d.ts +54 -16
- package/dist/approval-gate.d.ts.map +1 -1
- package/dist/approval-gate.js +163 -42
- package/dist/approval-gate.js.map +1 -1
- package/dist/host-hooks.d.ts +115 -0
- package/dist/host-hooks.d.ts.map +1 -0
- package/dist/host-hooks.js +270 -0
- package/dist/host-hooks.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -4
- package/dist/index.js.map +1 -1
- package/dist/prompts/lead.d.ts +1 -1
- package/dist/prompts/lead.d.ts.map +1 -1
- package/dist/prompts/lead.js +88 -6
- package/dist/prompts/lead.js.map +1 -1
- package/dist/prompts/shared.d.ts +1 -1
- package/dist/prompts/shared.d.ts.map +1 -1
- package/dist/prompts/shared.js +203 -119
- package/dist/prompts/shared.js.map +1 -1
- package/dist/prompts/specialists.d.ts +2 -2
- package/dist/prompts/specialists.d.ts.map +1 -1
- package/dist/prompts/specialists.js +73 -23
- package/dist/prompts/specialists.js.map +1 -1
- package/dist/tm/args-schema.d.ts +31 -1
- package/dist/tm/args-schema.d.ts.map +1 -1
- package/dist/tm/args-schema.js +155 -39
- package/dist/tm/args-schema.js.map +1 -1
- package/dist/tm/bash-timeout.d.ts +72 -0
- package/dist/tm/bash-timeout.d.ts.map +1 -0
- package/dist/tm/bash-timeout.js +100 -0
- package/dist/tm/bash-timeout.js.map +1 -0
- package/dist/tm/browser.d.ts +250 -20
- package/dist/tm/browser.d.ts.map +1 -1
- package/dist/tm/browser.js +1200 -143
- package/dist/tm/browser.js.map +1 -1
- package/dist/tm/config.d.ts +129 -0
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js +117 -1
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/dispatch.d.ts +95 -0
- package/dist/tm/dispatch.d.ts.map +1 -0
- package/dist/tm/dispatch.js +369 -0
- package/dist/tm/dispatch.js.map +1 -0
- package/dist/tm/index.d.ts +32 -7
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +74 -5
- package/dist/tm/index.js.map +1 -1
- package/dist/tm/memory.d.ts +88 -10
- package/dist/tm/memory.d.ts.map +1 -1
- package/dist/tm/memory.js +881 -99
- package/dist/tm/memory.js.map +1 -1
- package/dist/tm/pipelines.d.ts +26 -3
- package/dist/tm/pipelines.d.ts.map +1 -1
- package/dist/tm/pipelines.js +167 -11
- package/dist/tm/pipelines.js.map +1 -1
- package/dist/tm/ptc/budgets.d.ts +22 -1
- package/dist/tm/ptc/budgets.d.ts.map +1 -1
- package/dist/tm/ptc/budgets.js +87 -8
- package/dist/tm/ptc/budgets.js.map +1 -1
- package/dist/tm/ptc/contract.d.ts +49 -9
- package/dist/tm/ptc/contract.d.ts.map +1 -1
- package/dist/tm/ptc/contract.js +41 -3
- package/dist/tm/ptc/contract.js.map +1 -1
- package/dist/tm/ptc/driver.d.ts +5 -2
- package/dist/tm/ptc/driver.d.ts.map +1 -1
- package/dist/tm/ptc/driver.js +47 -15
- package/dist/tm/ptc/driver.js.map +1 -1
- package/dist/tm/ptc/engines.d.ts +15 -4
- package/dist/tm/ptc/engines.d.ts.map +1 -1
- package/dist/tm/ptc/engines.js +281 -28
- package/dist/tm/ptc/engines.js.map +1 -1
- package/dist/tm/ptc/index.d.ts +4 -4
- package/dist/tm/ptc/index.d.ts.map +1 -1
- package/dist/tm/ptc/index.js +2 -2
- package/dist/tm/ptc/index.js.map +1 -1
- package/dist/tm/ptc/pscan.d.ts +20 -1
- package/dist/tm/ptc/pscan.d.ts.map +1 -1
- package/dist/tm/ptc/pscan.js +328 -14
- package/dist/tm/ptc/pscan.js.map +1 -1
- package/dist/tm/ptc/summary.d.ts.map +1 -1
- package/dist/tm/ptc/summary.js +23 -1
- package/dist/tm/ptc/summary.js.map +1 -1
- package/dist/tm/ptc/tool.d.ts +34 -3
- package/dist/tm/ptc/tool.d.ts.map +1 -1
- package/dist/tm/ptc/tool.js +117 -20
- package/dist/tm/ptc/tool.js.map +1 -1
- package/dist/tm/pty.d.ts +70 -0
- package/dist/tm/pty.d.ts.map +1 -0
- package/dist/tm/pty.js +242 -0
- package/dist/tm/pty.js.map +1 -0
- package/dist/tm/search.d.ts +128 -15
- package/dist/tm/search.d.ts.map +1 -1
- package/dist/tm/search.js +556 -47
- package/dist/tm/search.js.map +1 -1
- package/dist/tm/shell-bridge.d.ts +14 -1
- package/dist/tm/shell-bridge.d.ts.map +1 -1
- package/dist/tm/shell-bridge.js +57 -10
- package/dist/tm/shell-bridge.js.map +1 -1
- package/dist/tm/webfetch.d.ts +29 -7
- package/dist/tm/webfetch.d.ts.map +1 -1
- package/dist/tm/webfetch.js +117 -15
- package/dist/tm/webfetch.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/installation.md +216 -17
- package/package.json +5 -2
package/README.zh-CN.md
CHANGED
|
@@ -43,10 +43,11 @@ TeamMode 对每一个的回应:
|
|
|
43
43
|
|
|
44
44
|
| 痛点 | TeamMode 的回答 |
|
|
45
45
|
|---|---|
|
|
46
|
-
| 🔥 **上下文爆炸** |
|
|
46
|
+
| 🔥 **上下文爆炸** | 所有受治理工具的输出超过内容分档阈值(散文 4000 / 数据 2000 token,CJK 感知)就卸载到本地 run 存储,换成 80 token 的预览 + HMAC 句柄。agent 需要什么再分页取什么——窗口永远淹不了。 |
|
|
47
47
|
| 🐌 **回合开销** | `tm_ptc_run`:agent 写**一个程序**,单回合内发起 N 次受治理调用。运行期间零 LLM 回合。 |
|
|
48
|
-
| 🕳️ **静默副作用** | R6/R2 审批门禁:环境变量读取和危险操作走 OpenCode 官方确认弹窗,
|
|
48
|
+
| 🕳️ **静默副作用** | R6/R2 审批门禁:环境变量读取和危险操作走 OpenCode 官方确认弹窗,1 分钟没人理自动拒绝。插件从不代替你批准——它只会拒绝。 |
|
|
49
49
|
| 🌫️ **幻觉式调研** | 联网是双角色的授权 + 白名单受治理工具链。抓不到的事实就报告为缺口——绝不编造。 |
|
|
50
|
+
| 🧭 **纯文本墙** | 回复被引导成宿主渲染得最快的形状:逐文件 / 逐用例 / 逐条发现用 markdown 表格,diff 和配置用围栏代码块,浏览器截图只在你明确要求时才内联附上。宿主不画 mermaid,所以没有 agent 会假装它在画。 |
|
|
50
51
|
|
|
51
52
|
底下还有流程纪律:确定性路由表、≥2 次派工先出 ≤30 行计划等你批、agent
|
|
52
53
|
之间用 `STATUS/CHANGES/FINDINGS/EVIDENCE/HANDOFF` 结构化交接、以及静态
|
|
@@ -126,8 +127,10 @@ OpenCode 下次启动时装好。
|
|
|
126
127
|
|
|
127
128
|
| 系统 | 缓存位置 |
|
|
128
129
|
|---|---|
|
|
129
|
-
| macOS / Linux | `
|
|
130
|
-
| Windows | `
|
|
130
|
+
| macOS / Linux | `find ~/.cache/opencode/packages -type d -name '*opencode-team-mode*' -prune -exec rm -rf {} +` |
|
|
131
|
+
| Windows (PowerShell) | `foreach ($r in "$HOME\.cache\opencode\packages", "$env:LOCALAPPDATA\opencode\cache\packages") { if (Test-Path $r) { Get-ChildItem $r -Directory -Recurse -Filter '*opencode-team-mode*' -EA SilentlyContinue | Sort-Object { $_.FullName.Length } | Remove-Item -Recurse -Force -EA SilentlyContinue } }` |
|
|
132
|
+
|
|
133
|
+
⚠️ OpenCode 是从 `~/.cache/opencode/packages/` 加载插件的(可能嵌套在 `@te-river/` 作用域目录里),**不是** `~/.config/opencode/node_modules`——所以删除必须递归:只删顶层会静默漏掉作用域式的缓存副本。
|
|
131
134
|
|
|
132
135
|
如果插件还被 npm 装进了 `~/.config/opencode`,package-lock 会钉住版本——在那里再跑一次 `npm install @te-river/opencode-team-mode@latest`。完整配方(含 agent 更新提示词)见[安装指南·更新](./docs/installation.md)。
|
|
133
136
|
- **前置条件:** [OpenCode](https://opencode.ai)(桌面版或 CLI)+ Node ≥ 18。
|
|
@@ -196,18 +199,23 @@ team 完成。rateLimit.ts (new) · app.ts (+3) · 14 测试全绿
|
|
|
196
199
|
|
|
197
200
|
## 🧰 受治理的工具与安全
|
|
198
201
|
|
|
199
|
-
TeamMode
|
|
200
|
-
|
|
202
|
+
TeamMode 加的每个工具都跑在**同一条治理管线**下:超过卸载阈值的输出永不
|
|
203
|
+
进入上下文窗口——阈值按内容分档:散文(text/log/markdown)走
|
|
204
|
+
`TM_OFFLOAD_THRESHOLD_TEXT`(4000),结构化数据(json/csv/code/binary)走
|
|
205
|
+
`TM_OFFLOAD_THRESHOLD_DATA`(2000),内容类别未知时回退全局
|
|
206
|
+
`TM_OFFLOAD_THRESHOLD`。超限输出卸载到 run 存储,换成内容感知预览 +
|
|
201
207
|
HMAC 句柄,agent 真需要 payload 时用 `tm_fetch` 分页取。
|
|
202
208
|
|
|
203
209
|
| 工具 | 功能 | 角色 |
|
|
204
210
|
|---|---|---|
|
|
205
|
-
| `tm_read` / `tm_grep` / `tm_bash` / `tm_fetch` | 受治理的文件读 / 正则搜索 / 只读 shell(白名单)/
|
|
206
|
-
| `tm_memory` | 项目 +
|
|
207
|
-
| `tm_ptc_run` | 批量编排:一个程序、N 次受治理调用、零 LLM
|
|
208
|
-
| `tm_search` |
|
|
211
|
+
| `tm_read` / `tm_grep` / `tm_bash` / `tm_fetch` | 受治理的文件读 / 正则搜索 / 只读 shell(白名单)/ 句柄分页(JSON 句柄支持 `fields` 点路径投影——刻意小的 jq 子集,如 `items[].name`) | 全部六个 agent |
|
|
212
|
+
| `tm_memory` | 会话 + 项目 + 全局三层记忆库(Markdown + frontmatter):add / search / list / forget / compact | 全部六个 agent |
|
|
213
|
+
| `tm_ptc_run` | 批量编排:一个程序、N 次受治理调用、零 LLM 回合;联网角色还能在程序里调 `tm.search` / `tm.webfetch` | 全部六个 agent |
|
|
214
|
+
| `tm_search` | 多引擎网络搜索,返回提取、去重、RRF 融合后的命中列表 | Lead + Researcher |
|
|
209
215
|
| `tm_webfetch` | 白名单页面的单次受治理 GET(搜索页自动提取) | Lead + Researcher |
|
|
210
|
-
| `
|
|
216
|
+
| `tm_dispatch` / `tm_join` | **异步子代理派发**:`tm_dispatch` 在独立子会话里启动某个专员并立刻返回其 id(内置 `task` 会把你阻塞到子代理结束),`tm_join` 负责回收——不带参数=状态快照,`waitMs`=有界等待,`cancel:true` 取消跑飞的子任务;回收到的回复同样走卸载管线,五份长报告变成句柄+预览而不是压垮你的上下文 | 仅 Lead(子代理不得再派发) |
|
|
217
|
+
| `tm_pty` | 在宿主自己的终端会话上**非阻塞执行命令**(`start`/`status`/`list`/`kill`):独立的构建与测试各自一个会话并行跑,不再串成一条 120 秒的 bash 调用。它不抓输出(命令自己 tee 日志,用 `tm_read` 读),且每次启动都先过 R6 分类器、R2 危险面 glob,再走官方确认窗,才真的建进程 | 仅 Lead |
|
|
218
|
+
| `tm_browser` | 交互式浏览器会话(**驱动你的默认浏览器**):16 个 Playwright 动词(快照优先:`take_snapshot` → 按 uid 寻址的 `click`/`fill`/`drag`…)+ 5 个旧版兼容动词(open/navigate/read/screenshot/close);Playwright 引擎需 Node ≥ 20,不满足或导入失败时自动降级到旧版 CDP 引擎。它开的是**你自己的默认浏览器渠道**(默认装 Edge Beta 就开 Beta),除操作者设 `TM_BROWSER_HEADLESS` 外保持有头;页面自家图片/CSS/JS 靠 `same-site` 子资源策略正常加载;`take_screenshot { image:true }` 会附一张 JPEG,让模型真能看见画面 | Lead + Researcher + Tester(仅 UI 验证) |
|
|
211
219
|
|
|
212
220
|
> **固定工具优先级阶梯(每个任务都适用):① TeamMode 受治理工具(`tm_*`)
|
|
213
221
|
> → ② 用户 MCP/插件工具 → ③ 模型自己的推理。** 它同时是回退链:某个受治理
|
|
@@ -221,23 +229,37 @@ HMAC 句柄,agent 真需要 payload 时用 `tm_fetch` 分页取。
|
|
|
221
229
|
### 上下文治理:卸载、句柄、预览
|
|
222
230
|
|
|
223
231
|
大的工具输出是上下文成本的主要来源——每一步都要重发整个窗口。所以超过
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
232
|
+
内容分档阈值的(散文 → `TM_OFFLOAD_THRESHOLD_TEXT`,结构化数据 →
|
|
233
|
+
`TM_OFFLOAD_THRESHOLD_DATA`,未知类别 → 全局 `TM_OFFLOAD_THRESHOLD`)
|
|
234
|
+
结果写进本地 run 存储(`<repo>/.git/opencode-team/`,永不污染工作树),
|
|
235
|
+
换成带内容感知预览的句柄:JSON 键 / CSV 表头+形状 / 日志 ERROR×N 统计 /
|
|
236
|
+
代码签名 / 二进制元数据,硬顶 80 token。agent 真需要 payload 时用
|
|
237
|
+
`tm_fetch`(HMAC 签名、run 域、带过期)分页读;JSON 句柄还可以直接要
|
|
238
|
+
`fields` 点路径投影(刻意小的 jq 子集:`items[].name`、
|
|
239
|
+
`[].stargazers_count`),大 API 转储只留需要的字段、原文从不进窗口。
|
|
240
|
+
`tm_bash` 只放行只读命令(白名单),失败以结构化错误返回,不糊原始转储。
|
|
241
|
+
|
|
242
|
+
### 会话 + 项目 + 全局三层记忆(tm_memory)
|
|
231
243
|
|
|
232
244
|
耐久的事实——构建命令、环境怪癖、架构决策、你的约定——以人可编辑的
|
|
233
|
-
Markdown + frontmatter
|
|
234
|
-
|
|
235
|
-
- **`
|
|
236
|
-
- **`
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
245
|
+
Markdown + frontmatter 存放,共三层:
|
|
246
|
+
|
|
247
|
+
- **`session`**:仅本次会话的瞬时事实——进程内、按 TTL 清扫(`TM_MEMORY_SESSION_TTL_MIN`,默认 240 分钟),对其他会话不可见;除非 `TM_MEMORY_SESSION_PERSIST=1` 才落盘到 `memories/sessions/<sid>/`。
|
|
248
|
+
- **`project`**(默认):`<repo>/.git/opencode-team/memories/…` —— 每 checkout 一份,贴近 git。存放本仓库的事实:构建命令、环境怪癖、架构决策。
|
|
249
|
+
- **`global`**:`~/.opencode-team/memories/global/`(可用 `TM_MEMORY_GLOBAL_DIR` 覆盖)——**跟着你走遍所有项目**。存放用户级约定:偏好的包管理器、提交风格、工具习惯。
|
|
250
|
+
|
|
251
|
+
动作:`add` / `search`(确定性关键词打分)/ `list` / `forget` / `compact`;
|
|
252
|
+
每条记忆上限 4000 字符。`search` 走全部三层,**会话 > 项目 > 全局**优先:
|
|
253
|
+
项目条目获得 +2 的近似同分加权,同名上层条目遮蔽下层(永不浮出)。
|
|
254
|
+
近重复从不堆积:`add` 命中同层同分类的既有条目(去重键,或
|
|
255
|
+
title+keywords 的 Jaccard ≥ 0.6)时**并入既有条目**——新内容胜出、
|
|
256
|
+
keywords 取并集、旧 slug 进 `supersedes:`、答复标注"已合并"(这是正常
|
|
257
|
+
现象,别再换个变体标题重复添加)。某层到达 `TM_MEMORY_MAX_ENTRIES`
|
|
258
|
+
(每作用域 200)时 add 故意失败:先跑 `compact`——默认 dry-run 只报合并
|
|
259
|
+
计划,带 `apply:true` 重跑才执行,执行前所有原件先复制进带时间戳的
|
|
260
|
+
`.compact-backup` 树(回滚路径)。超过 `TM_MEMORY_STALE_DAYS`(30 天)的
|
|
261
|
+
条目在搜索结果里标 `[stale Nd]`。agent 被要求先搜记忆再做项目假设,
|
|
262
|
+
也把来之不易的事实存下来留给下个会话。
|
|
241
263
|
|
|
242
264
|
### 🌐 真正好用的网络搜索(中国可用)
|
|
243
265
|
|
|
@@ -247,17 +269,20 @@ agent 永远看不到原始搜索页的噪音。
|
|
|
247
269
|
|
|
248
270
|
| 引擎 | 说明 |
|
|
249
271
|
|---|---|
|
|
250
|
-
| `
|
|
251
|
-
| `
|
|
252
|
-
| `
|
|
272
|
+
| `auto`(默认) | 给查询分类,**并行**扇出匹配的引擎(每条路由至少 2 条腿),按 host+path 去重后做加权 RRF 融合,产出标有来源引擎的 top-10 列表。排序按命中与查询词的真实重叠度打折(地板 `TM_SEARCH_RELEVANCE_FLOOR`),高权重引擎的无关结果不再压过别的引擎最好的一条。路由:报错/camelCase API → `stackoverflow`+`github`+`bing`;开发生态(发布、框架、开源)→ `hn`+`github`+`npm`;中文 → `bing`+`moegirl`+`stackoverflow`+`hn`;其它 → `bing`+`stackoverflow`+`hn`+`github`。用 `TM_SEARCH_DEFAULT_ENGINE` 钉别的默认 |
|
|
273
|
+
| `bing` | cn.bing.com——唯一活着的中文 HTML SERP;多词 CJK 查询自动保护短语边界(加引号),markup 洗牌拆不散结果列表 |
|
|
274
|
+
| `stackoverflow` | api.stackexchange.com 问题搜索(免 Key,300 次/天/IP)→ 带复合摘要的编号问题列表;`auto` 跟踪配额,耗尽自动换 `bing` 顶上 |
|
|
275
|
+
| `hn` | Hacker News(Algolia API,免 Key)→ 帖子标题 + 摘要与原文链接 |
|
|
253
276
|
| `bilibili` | 视频搜索 |
|
|
254
277
|
| `moegirl` | MediaWiki 搜索 API——词条标题 + 摘要,结构化 |
|
|
255
278
|
| `npm` | registry 搜索 → name@version + 描述,结构化 |
|
|
256
|
-
| `github` | 仓库搜索 API → star 数 +
|
|
279
|
+
| `github` | 仓库搜索 API → star 数 + 描述,结构化;`org:` / `user:` / `stars:` / `language:` 限定符透传折进查询(如 `vector db stars:>500 language:rust`) |
|
|
257
280
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
281
|
+
七个引擎在中国大陆**全部免 Key 可达**,且全部在种子域名白名单内。旧的
|
|
282
|
+
中文 HTML SERP(`sogou` / `so` / `baidu` / `bing-int`)已被**移除**——
|
|
283
|
+
实测定标(2026-09-14)显示它们只返回反爬壳或 100% 空结果,连手动选择
|
|
284
|
+
都不再提供。空结果时错误信息会点名替代引擎,不让 agent 卡死。另两条
|
|
285
|
+
通道补全能力面:
|
|
261
286
|
|
|
262
287
|
- `tm_webfetch` —— 已知 URL,单次受治理 GET。它抓到的搜索引擎页面同样
|
|
263
288
|
自动提取为命中列表。`registry.npmjs.org/<pkg>/latest` 这类 JSON 端点
|
|
@@ -265,9 +290,23 @@ agent 永远看不到原始搜索页的噪音。
|
|
|
265
290
|
- `tm_browser` —— JS 渲染页:**驱动你的默认浏览器**(Windows 读注册表 /
|
|
266
291
|
Linux 读 xdg-settings;仅限 Chromium 系——默认是 Firefox 时回退到
|
|
267
292
|
Edge/Chrome 探测顺序,因为 CDP 是 Chromium 专有协议;`TM_BROWSER_PATH`
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
`
|
|
293
|
+
可强制指定),默认有头运行,隔离临时 profile,**域名白名单在网络层
|
|
294
|
+
逐请求、逐重定向跳强制**。动作面与 chrome-devtools-mcp 对齐:**16 个
|
|
295
|
+
Playwright 动词**(`navigate_page` · `take_snapshot` · `click` · `fill` ·
|
|
296
|
+
`hover` · `drag` · `press_key` · `select_page` · `upload_file` · `wait_for`
|
|
297
|
+
· `evaluate_script` · `list_console_messages` · `list_network_requests` ·
|
|
298
|
+
`list_pages` · `take_screenshot` · `handle_dialog`)+ 5 个旧版兼容动词
|
|
299
|
+
(`open` / `navigate` / `read` / `screenshot` / `close`)。快照优先:
|
|
300
|
+
`take_snapshot` 返回注入了 `[uid=eN]` 标记的 aria 快照,后续动作按 uid
|
|
301
|
+
寻址节点而不是猜定位器;快照受
|
|
302
|
+
`TM_BROWSER_SNAPSHOT_MAX_TOKENS`(默认 1200)硬顶。
|
|
303
|
+
**引擎分工:** 主引擎是 `playwright-core`(optionalDependencies——
|
|
304
|
+
需 **Node ≥ 20**;旧版 Node 或导入失败时,整个插件实例自动降级到零依赖
|
|
305
|
+
`cdp-legacy` 引擎,只保留核心动词;可用 `TM_BROWSER_ENGINE=playwright|cdp-legacy`
|
|
306
|
+
钉死)。从不下载浏览器——Playwright 按路径启动**你自己装的**浏览器,
|
|
307
|
+
`npx playwright install` 不属于用户流程(依赖本体在 npm
|
|
308
|
+
install/发布时解析)。默认隔离临时 profile:登录态想跨会话保留,只有
|
|
309
|
+
显式设置 `TM_BROWSER_USER_DATA_DIR` 这一条路。
|
|
271
310
|
|
|
272
311
|
**伪装浏览器请求头后仍收到 403** 时,错误信息是一条指令:该站点的门槛是
|
|
273
312
|
JS 挑战 / TLS 指纹级别,只有真实浏览器能过——会直接让 agent 调 `tm_browser`
|
|
@@ -276,22 +315,24 @@ JS 挑战 / TLS 指纹级别,只有真实浏览器能过——会直接让 age
|
|
|
276
315
|
(`maimai.cn` 脉脉 ≠ maimai DX 游戏)不会混入命中列表——用
|
|
277
316
|
`TM_HIT_BLACKLIST` 可扩展命中黑名单。
|
|
278
317
|
|
|
279
|
-
|
|
318
|
+
种子白名单(三个联网工具共用,23 个主机;baidu/moegirl/bilibili 用的是父域,
|
|
280
319
|
所有兄弟子域——baike.baidu.com、mzh.moegirl.org.cn、space.bilibili.com——
|
|
281
320
|
一并覆盖):`baidu.com`、`moegirl.org.cn`、`bilibili.com`、`www.sogou.com`、
|
|
282
321
|
`www.so.com`、`cn.bing.com`、`www.bing.com`、`zhihu.com`、`juejin.cn`、
|
|
283
322
|
`csdn.net`、`cnblogs.com`、`gitee.com`、`github.com`、`api.github.com`、
|
|
284
323
|
`raw.githubusercontent.com`、`gist.githubusercontent.com`、`ghproxy.net`
|
|
285
|
-
(github raw 的大陆镜像)、`stackoverflow.com`、`
|
|
324
|
+
(github raw 的大陆镜像)、`stackoverflow.com`、`api.stackexchange.com`
|
|
325
|
+
+ `hn.algolia.com`(两个 JSON 搜索引擎)、`npmjs.org`、`pypi.org`、
|
|
286
326
|
`learn.microsoft.com`——用
|
|
287
|
-
`TM_WEBFETCH_ALLOWED_DOMAINS` 扩展(`"*"`
|
|
327
|
+
`TM_WEBFETCH_ALLOWED_DOMAINS` 扩展(`"*"` 放开全部主机;自定义列表是
|
|
328
|
+
**替换**种子,保留引擎主机否则 `tm_search` 没了目标)。architect /
|
|
288
329
|
implementer / reviewer **没有**联网授权——网络问题会报告为缺口,绝不编造。
|
|
289
330
|
tester 仅持有 `tm_browser`,用于本项目的治理化 UI 验证(本地开发服务器、
|
|
290
331
|
预览路由);开放网络抓取仍归两个联网角色。
|
|
291
332
|
|
|
292
333
|
**白名单外是门,不是墙。** 当抓取 / 搜索 / 浏览器打开的目标主机不在白名单
|
|
293
334
|
内时,工具会把 URL 交给 OpenCode 的**官方确认弹窗**——由你裁决,每次一个
|
|
294
|
-
目标(无人应答照常走
|
|
335
|
+
目标(无人应答照常走 1 分钟自动拒绝,插件依旧绝不代你批准)。每个弹窗
|
|
295
336
|
同时触发一条**系统 toast 通知**,即使你没盯着屏幕也知道有待批准的操作。
|
|
296
337
|
env 文件 URL 和非 http(s) 协议保持硬拦截、无弹窗——R6 红线不可被"同意"。
|
|
297
338
|
|
|
@@ -300,10 +341,17 @@ env 文件 URL 和非 http(s) 协议保持硬拦截、无弹窗——R6 红线
|
|
|
300
341
|
**R6 环境变量保护。** TeamMode 激活时,模型不能悄悄读环境变量。env 读取
|
|
301
342
|
(`printenv`、`env`、`Get-ChildItem env:` 等)和 env 文件(`.env`、shell rc)
|
|
302
343
|
走 OpenCode **官方确认弹窗**;没人应答的弹窗在 `TM_ASK_TIMEOUT_MIN`(默认
|
|
303
|
-
|
|
344
|
+
1 分钟)后**自动拒绝**。通配符表达不了的 env 读取(命令内嵌 `$VAR` /
|
|
304
345
|
`${VAR}` / `$env:`、命令替换)和 `tm_*` 包装通道保持**硬拦截**——没有弹窗
|
|
305
346
|
可钻。审计日志只记录工具名 + 模式类别 + 裁决——绝不记录命令文本、路径、
|
|
306
|
-
|
|
347
|
+
变量名或值。裁决现在还解释"弹窗已无法应答"的情形:应答打到**已关闭**的
|
|
348
|
+
弹窗(宿主 404——计时器早已自动拒绝)记为 `already-closed`、不触发降级;
|
|
349
|
+
插件侧应答形状错误记为 `rejected-shape-bug`;用户在自动拒绝**之后**才到的
|
|
350
|
+
回复记为 `late-<verdict>`(仅可观测——拒绝已成事实,插件依旧绝不代你批准)。
|
|
351
|
+
自动拒绝的地板为 1 分钟,可用 `TM_ASK_TIMEOUT_FLOOR_MIN` 调节。短默认值是安全
|
|
352
|
+
的:抢在计时器之后的应答会良性记为 `already-closed`(宿主对已关闭弹窗返回
|
|
353
|
+
404——不触发门禁降级),实测约 120 秒的滞后是宿主→插件事件总线的**投递**
|
|
354
|
+
延迟,并非点击解析延迟。
|
|
307
355
|
|
|
308
356
|
**R2 危险操作(同一个弹窗)。** 删除、git 发布、网络抓取、包安装/发布、
|
|
309
357
|
进程/系统、提权——统统不允许静默放行。日常验证栈(`npm test`、`tsc`、
|
|
@@ -363,24 +411,52 @@ Team Lead 自己从不删黑板,你可以随时审计任何一次运行。
|
|
|
363
411
|
| 环境变量 | 默认 | 用途 |
|
|
364
412
|
|---|---|---|
|
|
365
413
|
| `TM_ENV_PROTECT` | `strict` | R6 模式:`strict` / `standard` / `off`(off 同时解除审批计时器) |
|
|
366
|
-
| `TM_ASK_TIMEOUT_MIN` | `
|
|
414
|
+
| `TM_ASK_TIMEOUT_MIN` | `1` | 无人应答弹窗自动拒绝前等待的分钟数(地板 1 分钟——安全:抢跑应答良性记为 `already-closed`;宿主应答事件到插件晚约 120 秒是事件总线投递延迟,非点击解析延迟) |
|
|
415
|
+
| `TM_ASK_TIMEOUT_FLOOR_MIN` | `1` | 上述自动拒绝的强制最小时长 |
|
|
367
416
|
| `TM_ENV_PROTECT_EXTRA_DENY` | — | 额外拦截模式(正则;永远硬拦截,不走弹窗) |
|
|
368
|
-
| `TM_OFFLOAD_THRESHOLD` | `2000` |
|
|
417
|
+
| `TM_OFFLOAD_THRESHOLD` | `2000` | 全局卸载兜底阈值(token,CJK 感知估算)——内容类别未知时使用 |
|
|
418
|
+
| `TM_OFFLOAD_THRESHOLD_TEXT` | `4000` | 散文类(text / log / markdown)卸载阈值 |
|
|
419
|
+
| `TM_OFFLOAD_THRESHOLD_DATA` | `2000` | 结构化载荷(json / csv / code / binary)卸载阈值 |
|
|
369
420
|
| `TM_PREVIEW_MAX_TOKENS` | `80` | 预览硬顶 |
|
|
370
421
|
| `TM_FETCH_MAX_LINES` | `2000` | tm_fetch 单页行数上限 |
|
|
371
422
|
| `TM_BLACKBOARD_DIR` / `TM_TRAJECTORY_DIR` | `<repo>/.git/opencode-team/…` | 卸载存储 / 轨迹账本(tmpdir 回退;显式值 = 绝对或项目相对) |
|
|
372
423
|
| `TM_BLACKBOARD_TTL` | `7` | 存储保留天数 |
|
|
373
424
|
| `TM_BASH_READONLY_ALLOWED` | 内置表 | tm_bash 白名单 |
|
|
374
|
-
| `
|
|
425
|
+
| `TM_SEARCH_DEFAULT_ENGINE` | `auto` | tm_search 未显式给 `engine` 时的默认引擎(`auto` = 分类 + 并行扇出 + RRF 融合;也可钉表中任一引擎) |
|
|
426
|
+
| `TM_SEARCH_WEIGHTS` | 未设 | 按引擎覆盖融合权重,如 `bing=0.3,hn=0.25`;未列出的沿用内置表 |
|
|
427
|
+
| `TM_SEARCH_RELEVANCE_FLOOR` | `0.35` | 与查询词零重叠的命中只保留该比例的权重(压垃圾,不删引擎) |
|
|
428
|
+
| `TM_SEARCH_MAX_HITS` | `10` | 每引擎腿与融合列表保留的命中数 |
|
|
429
|
+
| `TM_SEARCH_DISABLED_ENGINES` | 未设 | 从引擎表与所有 `auto` 路由中移除的引擎(`sogou,baidu` 写法) |
|
|
430
|
+
| `TM_BROWSER_SUBRESOURCE` | `same-site` | 顶层导航过白名单后,页面子资源的策略:`same-site` = 图/媒体/字体/样式表一律放行,脚本/XHR 仅当属于本次会话真正打开过的站点;`passive` = 只放被动资源;`off` = 旧行为(逐请求过白名单)。被拦掉的请求会在下一次快照以"N 个子资源请求被拦截"告知 |
|
|
431
|
+
| `TM_BROWSER_IDLE_MS` | `180000` | 无人触碰的浏览器会话超过该毫秒数自动关闭并提示用户(0 关闭该回收)——没人负责的窗口是打扰用户的 bug |
|
|
432
|
+
| `TM_BROWSER_IMAGE_MAX_BYTES` | `400000` | `take_screenshot { image:true }` 内联给模型的 JPEG 上限;超过则只回路径并说明原因 |
|
|
433
|
+
| `TM_BASH_TIMEOUT_PROBE_MS` | `60000` | 对只读探针命令(P3 白名单内)强制夹顶模型自设的 `timeout`(0 关闭) |
|
|
434
|
+
| `TM_BASH_TIMEOUT_MAX_MS` | `0` | 其它 bash 命令的可选全局上限——默认关闭,真实构建保留它要的超时 |
|
|
435
|
+
| `TM_PTY_MAX` | `4` | 本插件同时最多保持多少个 `tm_pty` 终端会话 |
|
|
436
|
+
| `TM_TOOL_HINTS` | `on` | 通过 `tool.definition` 把本插件的调用点纪律追加到内置 `bash` / `task` 的**描述**后面(只追加、幂等,绝不替换宿主原文) |
|
|
437
|
+
| `TM_AGENT_TEMPERATURE` | `off` | `on` 时按角色分档采样(architect 0.35 / researcher 0.3 / reviewer 0.1 / 其余 0.2)经 `chat.params` 生效;也可写 `reviewer=0.05;team=0.4`。默认关闭=守住"所有 agent 0.2"这条既定原则 |
|
|
438
|
+
| `TM_COMPACTION_CONTEXT` | `on` | 在宿主压缩前追加"必须存活清单"(回复骨架、offload 句柄、未回收的子会话 id、出处、板上路径)。只做追加——宿主自己的压缩提示词不被替换 |
|
|
439
|
+
| `TM_COMPACTION_AUTOCONTINUE` | `on` | 设 `off` 则压缩后不让宿主静默续跑,先由人复核状态 |
|
|
440
|
+
| `TM_SHELL_NO_COLOR` | `on` | 经 `shell.env` 给每个子 shell 注入 `NO_COLOR`/`TERM=dumb`(ANSI 进度条纯属上下文税)。绝不覆盖宿主已设的值 |
|
|
441
|
+
| `TM_SHELL_ENV` | — | 显式 `KEY=VALUE;KEY2=VALUE2` 透传进子 shell——刻意用白名单,避免这个钩子变成父环境泄露通道 |
|
|
442
|
+
| `TM_WEBFETCH_ALLOWED_DOMAINS` | 23 个种子主机 | tm_webfetch / tm_search / tm_browser 白名单(`"*"` 全开;空 = 全拒;自定义值**替换**种子——保留引擎主机) |
|
|
375
443
|
| `TM_BROWSER_PATH` | 自动探测 | tm_browser 可执行文件覆盖(默认用你的默认浏览器——Chromium 系时;否则回退 Edge/Chrome 探测) |
|
|
376
444
|
| `TM_BROWSER_HEADLESS` | `auto` | `1` 无头(CI)/ `0` 有头 / `auto`(仅无显示的 Linux 用无头) |
|
|
377
|
-
| `
|
|
445
|
+
| `TM_BROWSER_ENGINE` | `playwright` | `playwright`(需 Node ≥ 20;导入失败自动降级)/ `cdp-legacy`(零依赖 CDP pipe,仅核心动词) |
|
|
446
|
+
| `TM_BROWSER_SNAPSHOT_MAX_TOKENS` | `1200` | `take_snapshot` 载荷硬顶 |
|
|
447
|
+
| `TM_BROWSER_USER_DATA_DIR` | —(隔离临时 profile) | 显式持久 profile 目录——登录态跨会话保留的唯一途径 |
|
|
448
|
+
| `TM_MEMORY_GLOBAL_DIR` | `~/.opencode-team/memories/global/` | tm_memory GLOBAL 层存储 |
|
|
449
|
+
| `TM_MEMORY_SESSION_TTL_MIN` | `240` | session 层条目 TTL(惰性 + 启动清扫) |
|
|
450
|
+
| `TM_MEMORY_MAX_ENTRIES` | `200` | 每作用域条目上限;超限 add 故意失败——先跑 `compact` |
|
|
451
|
+
| `TM_MEMORY_STALE_DAYS` | `30` | 超过此天数的条目在搜索结果标 `[stale Nd]`(`0` 关闭) |
|
|
452
|
+
| `TM_MEMORY_SESSION_PERSIST` | —(瞬态) | `1` 时 session 条目同时落盘 `memories/sessions/<sid>/` |
|
|
378
453
|
| `TM_HIT_BLACKLIST` | `maimai.cn` | 永不进入搜索命中列表的额外域名(逗号/分号分隔;过滤同名不同站噪音) |
|
|
379
454
|
| `TM_PTC_MAX_PROGRAM_CHARS` | `4000` | PTC 程序源码上限 |
|
|
380
455
|
| `TM_PTC_MAX_CALLS` | `20` | PTC 单次运行桥接调用预算(1–200) |
|
|
381
456
|
| `TM_PTC_MAX_ERRORS` | `3` | PTC 单次运行错误预算(1–50) |
|
|
382
457
|
| `TM_PTC_TIMEOUT_MS` | `60000` | PTC 单次运行墙钟超时(5s–10min) |
|
|
383
458
|
| `TM_PTC_ENGINE` | `auto` | `auto`(worker→inline 降级)/ `worker` / `inline` |
|
|
459
|
+
| `TM_PTC_WEB_BRIDGE` | `on` | 向 PTC 程序暴露 `tm.search` / `tm.webfetch`(`off` 从桥接集移除) |
|
|
384
460
|
|
|
385
461
|
---
|
|
386
462
|
|
|
@@ -398,6 +474,9 @@ Team Lead 自己从不删黑板,你可以随时审计任何一次运行。
|
|
|
398
474
|
路由低于 3 次派工就是路由 bug。
|
|
399
475
|
- **审批门禁(计数式):** ≥2 次派工 → 计划(≤30 行)→ **等你批准** → 执行。
|
|
400
476
|
阻塞性问题立刻批量问,不猜、不挤牙膏。
|
|
477
|
+
- **并发派工:** 互相独立的派工批进**同一轮**并行执行(多 implementer 各带
|
|
478
|
+
文件所有权 + 原文数据契约、三维度评审、分包 tester 同时跑);派工权 Team
|
|
479
|
+
Lead 独有——专家角色已收回 `task`,子代理不再生子代理。
|
|
401
480
|
- **自适应评审:** 默认一名评审;高风险画像(鉴权/安全面、跨模块契约、
|
|
402
481
|
公共 API)才三维度并行。
|
|
403
482
|
- **静态验证:** 构建 / 类型检查 / lint / 测试。禁止临时起意的浏览器自动化;
|
|
@@ -470,7 +549,7 @@ OpenCode 按 spec 字符串缓存插件,从不重新解析 `@latest`(上游
|
|
|
470
549
|
宿主无关。无显示的 Linux 上 `tm_browser` 自动转无头。
|
|
471
550
|
|
|
472
551
|
**确认弹窗我不理会会怎样?**
|
|
473
|
-
`TM_ASK_TIMEOUT_MIN`(默认
|
|
552
|
+
`TM_ASK_TIMEOUT_MIN`(默认 1 分钟)后自动拒绝。插件从不自我批准——它
|
|
474
553
|
能站的队只有"你"或者"没人"。
|
|
475
554
|
|
|
476
555
|
---
|
package/dist/agents.d.ts
CHANGED
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
* high-risk profiles.
|
|
28
28
|
* - All agents run at temperature 0.2 for format discipline.
|
|
29
29
|
*/
|
|
30
|
-
import type { AgentConfig } from "./types.js";
|
|
30
|
+
import type { AgentConfig, AgentPermission } from "./types.js";
|
|
31
|
+
/** Grant the async levers to the lead only (issue #6 + #7). A child cannot
|
|
32
|
+
* dispatch or spawn processes: these matrix entries and the tools' own
|
|
33
|
+
* runtime `ctx.agent` checks are two independent locks. */
|
|
34
|
+
export declare function applyDispatcherPermission(permission: AgentPermission, isTeamLead: boolean): void;
|
|
31
35
|
export declare const agents: Record<string, AgentConfig>;
|
|
32
36
|
//# sourceMappingURL=agents.d.ts.map
|
package/dist/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAkH9D;;4DAE4D;AAC5D,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAIhG;AAiLD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAO9C,CAAA"}
|
package/dist/agents.js
CHANGED
|
@@ -76,8 +76,11 @@ const NEVER_ALLOWED = [
|
|
|
76
76
|
"skill",
|
|
77
77
|
"question",
|
|
78
78
|
];
|
|
79
|
-
/** Built-ins granted per agent; every one NOT granted is denied.
|
|
80
|
-
* and question are LEAD-ONLY grants (see the whitelist
|
|
79
|
+
/** Built-ins granted per agent; every one NOT granted is denied. task,
|
|
80
|
+
* todowrite and question are LEAD-ONLY grants (see the whitelist calls
|
|
81
|
+
* below): only the lead dispatches — specialists spawning sub-agents is
|
|
82
|
+
* the nesting the T3 task-reclaim closed (architect and reviewer lost
|
|
83
|
+
* "task"; the matrix deny is zero-bypass, live-verified T0.4③). The
|
|
81
84
|
* lead's prompt MANDATES a todo list ("your state memory is the todo
|
|
82
85
|
* list") and batched blocking questions — denying those tools to the lead
|
|
83
86
|
* made the prompt unfulfillable; specialists answer through the lead
|
|
@@ -113,8 +116,26 @@ const whitelist = (...granted) => {
|
|
|
113
116
|
permission["tm_webfetch"] = "deny";
|
|
114
117
|
permission["tm_search"] = "deny";
|
|
115
118
|
permission["tm_browser"] = "deny";
|
|
119
|
+
// Async dispatch (tm_dispatch / tm_join) is the LEAD's lever — the tm_*
|
|
120
|
+
// wildcard would otherwise hand every specialist the ability to spawn
|
|
121
|
+
// sub-agents, which is exactly the nesting T3 closed.
|
|
122
|
+
permission["tm_dispatch"] = "deny";
|
|
123
|
+
permission["tm_join"] = "deny";
|
|
124
|
+
// tm_pty starts a real process, so it must pop the OFFICIAL dialog on
|
|
125
|
+
// every use: the WEB_ASK_MAP shape is what makes PermissionV2's findLast
|
|
126
|
+
// resolve to `ask` instead of swallowing the ask under the tm_* allow.
|
|
127
|
+
// Default deny; the lead gets the ask-map (applyDispatcherPermission).
|
|
128
|
+
permission["tm_pty"] = "deny";
|
|
116
129
|
return permission;
|
|
117
130
|
};
|
|
131
|
+
/** Grant the async levers to the lead only (issue #6 + #7). A child cannot
|
|
132
|
+
* dispatch or spawn processes: these matrix entries and the tools' own
|
|
133
|
+
* runtime `ctx.agent` checks are two independent locks. */
|
|
134
|
+
export function applyDispatcherPermission(permission, isTeamLead) {
|
|
135
|
+
permission["tm_dispatch"] = isTeamLead ? "allow" : "deny";
|
|
136
|
+
permission["tm_join"] = isTeamLead ? "allow" : "deny";
|
|
137
|
+
permission["tm_pty"] = isTeamLead ? { ...WEB_ASK_MAP } : "deny";
|
|
138
|
+
}
|
|
118
139
|
/** Apply the tm_ptc_run grant to an agent's permission block. All six
|
|
119
140
|
* agents get `allow` (overrides the tm_* wildcard for explicit key priority). */
|
|
120
141
|
function applyPtcPermission(permission, _isTeamLead) {
|
|
@@ -169,12 +190,14 @@ const architect = {
|
|
|
169
190
|
"module breakdown before implementation.",
|
|
170
191
|
prompt: ARCHITECT_PROMPT,
|
|
171
192
|
color: "#38BDF8", // sky blue
|
|
172
|
-
// Whitelist: tm_* x4
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
193
|
+
// Whitelist: tm_* x4 only (T3 task-reclaim: "task" DROPPED — no
|
|
194
|
+
// sub-agents for sub-agents, the lead is the only dispatcher);
|
|
195
|
+
// tm_webfetch DENIED (not a network role). Fully read-only by design
|
|
196
|
+
// (T2.1): output lives in the reply; if a board artifact is ever
|
|
197
|
+
// dispatched, the BLACKBOARD WRITE FAILED fallback hands the content to
|
|
198
|
+
// the lead inline (see Blackboard rules).
|
|
176
199
|
// No bash — unchanged from the pre-T2.1 architect bash:deny posture.
|
|
177
|
-
permission: whitelist(
|
|
200
|
+
permission: whitelist(),
|
|
178
201
|
temperature: 0.2,
|
|
179
202
|
};
|
|
180
203
|
const implementer = {
|
|
@@ -199,12 +222,13 @@ const reviewer = {
|
|
|
199
222
|
"any non-trivial change.",
|
|
200
223
|
prompt: REVIEWER_PROMPT,
|
|
201
224
|
color: "#FB923C", // orange
|
|
202
|
-
// Whitelist: tm_* x4 +
|
|
203
|
-
//
|
|
204
|
-
//
|
|
225
|
+
// Whitelist: tm_* x4 + bash; tm_webfetch DENIED (not a network role).
|
|
226
|
+
// T3 task-reclaim: "task" DROPPED (only the lead dispatches). No
|
|
227
|
+
// edit/write (T2.1): findings travel in the reply skeleton; a dispatched
|
|
228
|
+
// board artifact rides the BLACKBOARD WRITE FAILED
|
|
205
229
|
// inline fallback (see Blackboard rules). bash backs the evidence
|
|
206
230
|
// standard — the reviewer must be able to run npm test / tsc itself.
|
|
207
|
-
permission: whitelist("
|
|
231
|
+
permission: whitelist("bash"),
|
|
208
232
|
temperature: 0.2,
|
|
209
233
|
};
|
|
210
234
|
const tester = {
|
|
@@ -255,12 +279,14 @@ for (const a of [architect, implementer, reviewer, tester, researcher]) {
|
|
|
255
279
|
if (teamLead.permission) {
|
|
256
280
|
applyPtcPermission(teamLead.permission, true);
|
|
257
281
|
applyNetworkPermission(teamLead.permission, true);
|
|
282
|
+
applyDispatcherPermission(teamLead.permission, true);
|
|
258
283
|
}
|
|
259
284
|
for (const a of [architect, implementer, reviewer, tester, researcher]) {
|
|
260
285
|
if (a.permission) {
|
|
261
286
|
applyPtcPermission(a.permission, false);
|
|
262
287
|
// tester: tm_browser only (UI verification); researcher: full web grant
|
|
263
288
|
applyNetworkPermission(a.permission, a === researcher, a === tester);
|
|
289
|
+
applyDispatcherPermission(a.permission, false);
|
|
264
290
|
}
|
|
265
291
|
}
|
|
266
292
|
/* ------------------------------------------------------------------ */
|
package/dist/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElE,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AACxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,aAAa,GAAG;IACpB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU;IACV,WAAW;IACX,WAAW;IACX,KAAK;IACL,OAAO;IACP,UAAU;CACF,CAAA;AAEV
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/approval-gate.d.ts
CHANGED
|
@@ -63,28 +63,49 @@
|
|
|
63
63
|
* no-op (events are the sole pending signal there).
|
|
64
64
|
*/
|
|
65
65
|
import type { PermissionEvent } from "./types.js";
|
|
66
|
-
/** Default timeout, in minutes, before an unanswered dialog is auto-rejected.
|
|
67
|
-
|
|
66
|
+
/** Default timeout, in minutes, before an unanswered dialog is auto-rejected.
|
|
67
|
+
* 1 min (user directive) — an unanswered dialog no longer hangs for 10.
|
|
68
|
+
* A short timer is safe because a reject that lands on an already-closed
|
|
69
|
+
* request is benign; see `MIN_ASK_TIMEOUT_MIN` for the full rationale. */
|
|
70
|
+
export declare const DEFAULT_ASK_TIMEOUT_MIN = 1;
|
|
68
71
|
/**
|
|
69
|
-
* Hard floor (minutes) for the auto-reject timeout.
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
72
|
+
* Hard floor (minutes) for the auto-reject timeout. The HISTORIC 3-min
|
|
73
|
+
* floor existed to dodge the measured ~120s `permission.replied` bus lag:
|
|
74
|
+
* a shorter timer would fire before the cancel arrives and auto-reject a
|
|
75
|
+
* just-approved request. That lag, though, is the HOST DELIVERING the
|
|
76
|
+
* replied event to the plugin over the bus — NOT the host resolving the
|
|
77
|
+
* user's click: an approval takes effect instantly host-side, so the
|
|
78
|
+
* plugin's late reject simply targets an already-closed request id → 404.
|
|
79
|
+
* T2's `classifyReplyFailure` maps that outcome to the benign
|
|
80
|
+
* `already-closed` verdict (it never flips the gate to `degraded`, and the
|
|
81
|
+
* approved command runs either way); `onReplied` records a reply landing
|
|
82
|
+
* after the auto-reject as `late-<verdict>` for observability. With that
|
|
83
|
+
* classification in place a short timeout no longer disables the gate, so
|
|
84
|
+
* the floor drops to 1 minute (user directive). Trade-off: an UNANSWERED
|
|
85
|
+
* dialog auto-rejects after 1 min — a user who stepped away re-triggers
|
|
86
|
+
* the command. In-range values below the floor still clamp UP to it.
|
|
87
|
+
*
|
|
88
|
+
* This is the FALLBACK default of the floor. The live floor comes from the
|
|
89
|
+
* P0 config knob `TM_ASK_TIMEOUT_FLOOR_MIN`
|
|
90
|
+
* (`resolveTmConfig().askTimeoutFloorMin`, itself defaulted to 1).
|
|
77
91
|
*/
|
|
78
|
-
export declare const MIN_ASK_TIMEOUT_MIN =
|
|
92
|
+
export declare const MIN_ASK_TIMEOUT_MIN = 1;
|
|
79
93
|
/** The verdict vocabulary recorded in the audit trail (privacy: no command
|
|
80
|
-
* text, path, variable name or value is ever logged).
|
|
81
|
-
|
|
94
|
+
* text, path, variable name or value is ever logged). `already-closed` /
|
|
95
|
+
* `rejected-shape-bug` split the old blanket `degraded` on a failed reply by
|
|
96
|
+
* `classifyReplyFailure`; a late reply past the auto-reject is recorded as a
|
|
97
|
+
* dynamic `late-<verdict>` string (observability only — never re-runs or
|
|
98
|
+
* revives the command). */
|
|
99
|
+
export type ApprovalVerdict = "ask" | "allowed-once" | "allowed-always" | "rejected" | "timeout-rejected" | "already-closed" | "rejected-shape-bug" | "degraded";
|
|
82
100
|
/**
|
|
83
101
|
* Resolve `TM_ASK_TIMEOUT_MIN`. Unset / blank / non-numeric / <1 / >1440
|
|
84
|
-
* (24h) fall back to the
|
|
102
|
+
* (24h) fall back to the 1-minute default — a mistyped value can never
|
|
85
103
|
* disable the timeout or make it absurdly long. Valid values below the
|
|
86
|
-
*
|
|
87
|
-
* `
|
|
104
|
+
* floor clamp UP to it — the floor is the P0 config knob
|
|
105
|
+
* `TM_ASK_TIMEOUT_FLOOR_MIN` (`resolveTmConfig().askTimeoutFloorMin`,
|
|
106
|
+
* default 1). The historic ~120s bus-lag reason for a 3-min floor is
|
|
107
|
+
* obsolete: a late reject on an already-closed id is benign
|
|
108
|
+
* `already-closed`, not a degraded flip (see `MIN_ASK_TIMEOUT_MIN`).
|
|
88
109
|
*/
|
|
89
110
|
export declare function resolveAskTimeoutMs(env?: Record<string, string | undefined>): number;
|
|
90
111
|
type TimerHandle = unknown;
|
|
@@ -153,6 +174,23 @@ export interface ApprovalGate {
|
|
|
153
174
|
/** Number of pending requests currently being timed (tests / introspection). */
|
|
154
175
|
pendingSize(): number;
|
|
155
176
|
}
|
|
177
|
+
/** How a FAILED permission-reply call should be treated by the gate. */
|
|
178
|
+
export type ReplyFailureClass = "benign-closed" | "param-shape" | "transport";
|
|
179
|
+
/**
|
|
180
|
+
* Classify a reply-call failure so the gate no longer flips permanently
|
|
181
|
+
* `degraded` on a harmless close. `unwrapSdkEnvelope` has already hoisted the
|
|
182
|
+
* HTTP status onto the thrown envelope error; a genuine `Promise.reject`
|
|
183
|
+
* arrives as a plain Error with no status.
|
|
184
|
+
* - `benign-closed`: 404, or a NotFound/PermissionNotFound name/_tag — the
|
|
185
|
+
* dialog was ALREADY closed on the host (the D4 late-reply race): our
|
|
186
|
+
* reject was a no-op, so the popup path stays trustworthy.
|
|
187
|
+
* - `param-shape`: 400, or a BadRequest/InvalidRequest name/_tag — our
|
|
188
|
+
* reply body/params are wrong for this host: a real integration bug.
|
|
189
|
+
* - `transport`: everything else — a genuine Error, a 5xx, or an empty /
|
|
190
|
+
* status-less body — we could not reach or close the dialog.
|
|
191
|
+
* Reads only the error CLASS + status number (privacy: never message text).
|
|
192
|
+
*/
|
|
193
|
+
export declare function classifyReplyFailure(err: unknown): ReplyFailureClass;
|
|
156
194
|
/** True when the client exposes a permission-reply path at all. index.ts
|
|
157
195
|
* arms the gate ONLY for such a client — fail-closed otherwise (no armed
|
|
158
196
|
* auto-reject ⇒ the R6 hook keeps hard-throwing every env read). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD;;;2EAG2E;AAC3E,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAkBpC;;;;;4BAK4B;AAC5B,MAAM,MAAM,eAAe,GACvB,KAAK,GACL,cAAc,GACd,gBAAgB,GAChB,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,oBAAoB,GACpB,UAAU,CAAA;AAEd;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAWjG;AAED,KAAK,WAAW,GAAG,OAAO,CAAA;AAE1B,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,CAAA;IACzD,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB;;;iFAG6E;IAC7E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IACzC,2EAA2E;IAC3E,KAAK,IAAI,IAAI,CAAA;IACb,2CAA2C;IAC3C,OAAO,IAAI,IAAI,CAAA;IACf,yEAAyE;IACzE,OAAO,IAAI,OAAO,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACrC;;8DAE0D;IAC1D,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvC;;;;8EAI0E;IAC1E,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3C;uFACmF;IACnF,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1C,gFAAgF;IAChF,WAAW,IAAI,MAAM,CAAA;CACtB;AAuED,wEAAwE;AACxE,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,WAAW,CAAA;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAgBpE;AA8DD;;qEAEqE;AACrE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAErE;AAyBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAqUvE"}
|