Bundle
dsh-resource-lease
Resource lease governance: auto-registers browser tabs, background jobs, processes and ports as session-owned leases with TTL auto-reclaim, pinning and manual sweep.
- Source
- r-ayin
- License
- MIT
- Updated
- Updated 7 days ago
Readme
# dsh-resource-lease — 资源租约治理插件
解决「agent 打开浏览器 tab / 后台 job / 临时进程后忘记关」的问题。**不依赖模型自觉**:资源打开即自动登记租约(归属会话 + TTL),回收由机制执行。
## 三层防线
1. **自动登记**(tools/result 观察钩子,零提示词依赖)
- browser_tab_new → browser-tab 租约(tabId + 归属会话 + TTL,默认 240min)
- bash/subagent/workflow 带 run_in_background → job 租约(jobId,默认 360min)
- 其他资源(run_code 里起的服务器等)→ lease_register 工具手动登记
2. **自动回收**(三个触发点互为冗余)
- session/disposed → 关闭该会话全部 session 级租约(正常路径)
- daemon 每 60s 扫 TTL 过期租约(会话挂死兜底)
- 启动 10s 后扫过期账(宿主重启兜底;注册表持久化于 ~/.dsh/resource-lease/leases.json)
- 浏览器空闲 10min 且**实查 0 残留 tab** 才 browser_close(共享实例安全闸:有未登记 tab 绝不误关)
3. **分类策略**
- session(默认):随会话/TTL 自动回收
- pinned:用户说「这个留着」→ lease_pin 升级,永不自动回收
- system:白名单(cron/watchdog 服务、外部 Chrome 本来就不登记,天然豁免)
## 工具面(agent)
| 工具 | 用途 |
|------|------|
| lease_list | 列租约(默认当前会话活跃;all=true 全部) |
| lease_register | 手动登记(kind=process/port/custom;process/port 需 pid) |
| lease_pin | pinned 升级/降级 |
| lease_release | 立即关闭(force=true 连 pinned 也关) |
| lease_sweep | 立即扫一轮(给 sessionId 则清该会话) |
## 面板(conversation.view slot「资源租约」)
活跃租约表 + 单个关闭/固定 + 清扫过期,10s 自动刷新。宿主 API:/resource-lease/api/{leases,release,pin,sweep}。
## 回收执行路径(实测)
- browser tab → ctx.tools.execute('browser_tab_close')(无 agent 上下文可用,PTC 不拦)
- job → ctx.jobs.kill(jobId, sessionId, reason) 直连服务(job_kill 工具是 agent 作用域注册,全局视图不可见——v1 实测踩坑)
- process/port → process.kill(pid, SIGTERM)
- 「资源已不存在」(not found/ESRCH/already-finished)视为关闭成功;'unknown tool' 不算——连续失败 3 次标 failed 停止重试,面板可见待人工处理
## 构建(离线,无需 npm install)
- host:bash scripts/build.sh(DSH_CHECKOUT 自动探测 ~/dsh-harness)
- client:bash scripts/build-client.sh(tsc CJS + 手工 __ModuleLoader__ 包装,替代 tsdown)
- 一键:dev_build_plugin → dev_inject_plugin / dev_reload_package 热重载
## 配置(cordis.patch.yml 可覆盖)
sweepIntervalMs(60s) tabTtlMinutes(240) jobTtlMinutes(360) autoCloseBrowser(true) browserIdleCloseMs(10min) keepClosedHours(72)
Install
dsh plugin --profile web add github:r-ayin/dsh-resource-lease
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-resource-lease from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.