dsh-oc 功能支持矩阵

August 16, 2026 · View on GitHub

状态图例:✅ 已支持;🟡 部分支持/有限制;❌ 未实现或仅 stub。 本文件是功能状态入口;路由/协议细节见 PROTOCOL.md。 运行 pnpm run features:update 可刷新文末“自动追踪”部分,手动状态矩阵保留。

下一阶段

下一阶段需求见 ROADMAP.md:自动更新关闭、流式 tool progress、goal、性能测试、协议升级探针、README//help 能力矩阵。

1. 模型

功能状态路由/实现验证方式最后更新
Provider / 模型目录展示(v1 + v2)GET /providerGET /api/modelsrc/bridge/convert/model.tstests/convert/model.spec.tsscripts/e2e-api.shf30b156
默认 build agent 携带可用模型GET /agentGET /api/agentsrc/bridge/router.tstests/bridge-router.spec.tsf30b156
模型选择器回写 dsh(/api/session/:id/modelPOST /api/session/:sessionID/modelPOST /session/:id/message body modeltests/bridge-router.spec.tse2e-api.sh本提交
Reasoning effort / variant 展示与切换Model.variantsModelV2Info.variants、session model varianttests/convert/model.spec.ts、TUI ctrl+t本提交
dsh agent preset 展示与切换(minimal 等)GET /agentGET /api/agentPOST /api/session/:sessionID/agentPOST /session/:id/command /presettests/bridge-router.spec.ts;隔离 profile 无 minimal 时仅 build本提交
Tab//preset 切换 agent 随 prompt 生效prompt 体 agent 应用到会话;已产生回复的会话被 dsh 锁定(409)时,首次提交后显示一次锁定提示tests/bridge-router.spec.ts、真实 TUI 验证本提交
模型/Provider 错误映射src/bridge/errors.tssrc/bridge/rpc.tstests/bridge-router.spec.ts(404/409/400/501)f30b156

2. 会话

功能状态路由/实现验证方式最后更新
会话列表 / 状态GET /sessionGET /session/statusGET /api/sessiontests/bridge-router.spec.tse2e-api.shf30b156
会话列表标题回退持久标题 → 项目目录 basename → session id(对齐 dsh 客户端展示逻辑)tests/convert/session.spec.ts本提交
会话列表真实标题补读dsh session.list 不携带 title 投影;bridge 按会话补读 history tail 投影并缓存,列表显示真实标题(≤40 全量同步、大列表后台补温 24,不阻塞列表)tests/bridge-router.spec.tsscripts/e2e-tui-turn.sh本提交
会话搜索(v2 ?search=)与 limit/目录过滤src/bridge/router.ts /api/sessionsession.searchtests/bridge-router.spec.ts本提交
会话列表分页(v2 cursor next/previous + order)src/bridge/router.ts /api/session offset 游标tests/bridge-router.spec.ts本提交
新建 / 重命名 / 历史 / 消息POST /sessionPATCH /session/:idGET /session/:id/messagetests/bridge-router.spec.tse2e-tui-turn.shf30b156
Prompt(v1 message、v1 alias、v2 prompt)POST /session/:id/messagePOST /session/:id/promptPOST /api/session/:sessionID/prompte2e-api.she2e-tui-turn.shf30b156
--mini promptAsync 提交POST /session/:id/prompt_async(204,slash/模型/agent 处理)tests/bridge-router.spec.tse2e-tui-mini.sh本提交
Abort / cancelPOST /session/:id/aborte2e-api.shf30b156
Fork(parentIDPOST /session/:id/forkPOST /api/session/:id/fork,messageID→atSeqtests/bridge-router.spec.tse2e-api.sh本提交
Todo 投影GET /session/:id/todosrc/bridge/convert/todo.tstests/convert/todo.spec.tstests/bridge-router.spec.tsf30b156
Diff / produced-files / Modified FilesGET /session/:id/diffGET /api/session/:id/diffsession.diff + Snapshot/Patch parttests/bridge-router.spec.tse2e-tui-tools.sh本提交
SSE 会话/消息事件GET /global/eventsrc/bridge/events.tstests/bridge-events.spec.tse2e-api.she2e-tui-stream.shf30b156
SSE 文本 delta 成对重复🟡已知行为:dsh 对同一文本同时下发 assistant/chunk 与 packed text-chunks,且新 mux 订阅会重放;bridge 的 delta 可能成对重复,TUI 以 message.updated 全量文本渲染、实测无重复显示docs/PROTOCOL.md本提交
Agent/流错误 → session.errorstream/errorhost/agent-error 映射tests/bridge-events.spec.ts本提交
SSE mux/host 短暂错误自动重连(指数退避)src/bridge/router.ts startSse 重订阅(默认 250ms 起、最多 3 次)tests/bridge-events.spec.ts本提交
重连 approval/question 重放去重MuxEventTranslator replayGuard(按 SSE 连接)tests/bridge-events.spec.ts本提交
重连后 todo/goal 投影状态保留sharedState 跨 translator 重建共享tests/bridge-events.spec.ts本提交

3. 工具

功能状态路由/实现验证方式最后更新
Tool call / result 四态映射src/bridge/convert/tool.tssrc/bridge/events.tstests/convert/tool.spec.tse2e-tui-turn.shf30b156
工具参数流式(tool-call-delta → input.started/delta/ended + v1 ToolPart 增量)src/bridge/events.ts startToolInput/queueToolDelta/flushToolDeltatests/bridge-events.spec.tsscripts/e2e-api.sh本提交
排队 prompt 可见(session/queue 初始化 + agent/inbox/spliced 增量 → QUEUED 消息)src/bridge/events.ts queuedMessageEventssrc/bridge/state.ts inbox 投影tests/bridge-events.spec.tsscripts/e2e-tui-queue.sh本提交
v2 tool 生命周期(called/progress/success/failed)src/bridge/events.ts endToolInput/completeToolInputImmediatelytests/bridge-events.spec.tsscripts/e2e-api.sh本提交
高频 chunk 节流/批处理MuxEventTranslator toolFlushMs + 合并 pending deltatests/bridge-events.spec.ts(fake timer)本提交
bash/pwsh 实时输出 progress🟡dsh 0.1.0-rc.6 无实时输出帧;参数流式已实时,输出仅在 result 时可见docs/PROTOCOL.mdtests/bridge-events.spec.ts本提交
工具执行由 dsh 后端完成ctx.apiProxy.sessions.prompt、dsh tool 注册表e2e-api.sh(bash 工具)f30b156
read/write/edit 文件变化展示tool result → ToolPart metadata/diff + session.diff + Modified Filestests/convert/tool.spec.tse2e-tui-tools.sh本提交
dsh 多种编辑模式映射(view/create/str_replace/insert/undo_edit)src/bridge/convert/tool.ts 映射为 read/edit 卡片并保留 modetests/convert/tool.spec.tse2e-tui-tools.sh本提交
文本附件/文件 partsrc/bridge/router.ts filePartToContent:data URL 文本/图片、cwd 内本地文件;cwd 外与二进制 400tests/bridge-router.spec.tsscripts/e2e-api.sh本提交
MCP / LSP / formatter 等外围工具src/bridge/stubs.ts 返回 schema-valid 空数据e2e-api.sh 路由矩阵f30b156

4. 权限

功能状态路由/实现验证方式最后更新
Permission ask / once / rejectGET /permissionPOST /permission/:id/reply、v2 对偶路由tests/convert/permission.spec.tse2e-api.shf30b156
“Always” 会话内记忆(同会话同工具自动放行)src/bridge/state.ts savedPermissions + SSE 自动 approvetests/bridge-events.spec.tse2e-api.sh本提交
Saved permissions 查询/删除GET /api/permission/saved + DELETE /api/permission/saved/{id}sessionID:toolName),授权不跨会话泄漏tests/bridge-events.spec.tsscripts/e2e-api-permission.sh本提交
SDK v2 权限/提问 request 别名GET /api/permission/requestGET /api/question/requestGET /api/session/{id}/permission/{rid}tests/bridge-router.spec.tsscripts/e2e-api-permission.sh本提交
TUI 权限/提问键盘交互选项 Down 高亮移动、question Esc 取消、permission Esc=reject(standard 直接拒绝,mini 先弹确认层)scripts/e2e-tui-permission.shscripts/e2e-tui-permission-ext.sh本提交

5. 子代理

功能状态路由/实现验证方式最后更新
主 agent(build)展示GET /agentGET /api/agentsrc/bridge/router.tstests/bridge-router.spec.tsf30b156
Background subagentsGET /experimental/capabilities 返回 { backgroundSubagents: true }POST /experimental/session/{id}/background no-op 成功(dsh 会话服务端常驻、subagent 默认后台)e2e-api.shtests/bridge-router.spec.ts本提交
子代理会话树 / parent-child 渲染Session.parentID、child cwd/parent 继承、child 历史复用tests/convert/session.spec.tse2e-api.sh fork lineage本提交

6. 命令

功能状态路由/实现验证方式最后更新
命令列表GET /commandGET /api/command 注册 /preset /goal /helpe2e-api.shtests/bridge-router.spec.ts本提交
/goal 创建/查看/切换src/bridge/router.ts runGoalCommand + dsh command registrytests/bridge-router.spec.tsscripts/e2e-api-goal.sh本提交
/goal 生命周期(complete/pause/resume/clear)completegoal.complete RPC,其余走 registrytests/bridge-router.spec.tsscripts/e2e-api-goal.sh本提交
TUI /help 能力摘要src/help.ts ocHelp + runHelpCommand(不触发模型轮次)tests/bridge-router.spec.tse2e-api.sh本提交
TUI /help pane e2escripts/e2e-tui-command.sh 输入 /help 断言摘要可见bash scripts/e2e-tui-command.sh本提交
/compact / summarizePOST /session/:id/summarizePOST /session/:id/compactPOST /api/session/:id/compacte2e-api.shtests/bridge-router.spec.ts本提交
Skills 目录GET /skillGET /api/skill 经 dsh skill.list(按目录匹配会话;无会话返回 []tests/bridge-router.spec.tse2e-api.sh本提交
Skills 斜杠命令/command 暴露技能名;命令路由转 session.prompt/name 路径tests/bridge-router.spec.ts本提交
技能斜杠命令 TUI e2escripts/e2e-tui-skill.shDSH_OC_E2E_FAKE_SKILLS 注入 + 真实键盘输入)bash scripts/e2e-tui-skill.sh本提交
References / integrationsGET /referenceGET /api/referenceGET /integration 等返回 schema-valid []e2e-api.shf30b156

7. TUI

功能状态路由/实现验证方式最后更新
opencode attach 启动/退出/信号转发src/tui/index.ts startOpenCodeTuitests/tui/index.spec.tse2e-tui-boot.shf30b156
attach 参数过滤(--session/--dir/--mini/--print-logs/...src/tui/index.ts filterSupportedArgs--dir 同步写入 bridge cwdtests/tui/index.spec.tsscripts/e2e-tui-dir.sh本提交
--dir 路径校验resolveTuiDir:不存在/非目录时明确报错tests/tui/index.spec.ts本提交
数据隔离(config/data/state/cache 在 $DSH_HOME/opencodesrc/tui/index.ts buildChildEnvtests/tui/index.spec.tsf30b156
消息时间戳默认开启DSH_OC_TUI_TIMESTAMPS=1kv.json timestamps: show + tui.json 快捷键tests/tui/index.spec.tsscripts/e2e-tui-timestamps.sh本提交
时间戳运行时切换tui.json 绑定 session_toggle_timestamps / messages_toggle_timestampsctrl+shift+t,也可用 /timestamps手工 TUI 验证本提交
二进制版本校验(--version 精确匹配 + 显式覆盖报错)src/tui/binary.ts parseOpenCodeVersion/verifyOpenCodeVersiontests/tui/binary.spec.tsscripts/e2e-tui-version-lock.sh本提交
自动更新/热更新关闭OPENCODE_DISABLE_AUTOUPDATE=1 + 隔离配置 autoupdate: falsetests/tui/index.spec.tsscripts/e2e-tui-offline.sh本提交
后台外网行为关闭(models fetch / LSP download)OPENCODE_DISABLE_MODELS_FETCH=1OPENCODE_DISABLE_LSP_DOWNLOAD=1tests/tui/index.spec.ts本提交
dsh --profile oc --help 能力摘要src/tui/index.ts ocHelp/helpRequestedtests/tui/index.spec.tsscripts/e2e-tui-help.sh本提交
DSH OC 品牌启动 logo(替换 OpenCode 字符画)tui-branding/ TUI 插件(figlet 生成,scripts/generate-tui-branding-art.mjs)+ prepareOpenCodeTuiState 注入 tui.jsontests/tui/branding-art.spec.tstests/tui/index.spec.tsscripts/e2e-tui-brand.sh本提交

8. 分发

功能状态路由/实现验证方式最后更新
多 arch 平台矩阵(linux/darwin/windows × x64/arm64 + musl/baseline)src/tui/platform.tsopencode-assets.jsontests/tui/platform.spec.tstests/scaffold.spec.ts本提交
官方 npm 平台包优先(opencode-<platform>-<arch>[-baseline][-musl]@1.18.18src/tui/binary.ts npmPackage*$DSH_HOME/opencode/packages/<key>tests/tui/binary.spec.ts(候选顺序/回退)本提交
GitHub Release fallback 按平台独立 sha256 校验src/tui/download.tsopencode-assets.jsontests/tui/download.spec.tstests/scaffold.spec.tsf30b156
代理 / 镜像src/tui/download.ts resolveAssetUrltests/tui/download.spec.tsf30b156

9. 测试

功能状态实现验证方式最后更新
单元/转换/桥/分发测试tests/**/*.spec.tspnpm testf30b156
API e2e 路由矩阵 + 权限流scripts/e2e-api.shbash scripts/e2e-api.shf30b156
TUI boot / turn / stream e2escripts/e2e-tui-boot.shscripts/e2e-tui-turn.shscripts/e2e-tui-stream.sh对应脚本输出 PASSEDf30b156
TUI 时间戳 e2escripts/e2e-tui-timestamps.shbash scripts/e2e-tui-timestamps.sh本提交
离线启动 / 版本锁定 e2escripts/e2e-tui-offline.shscripts/e2e-tui-version-lock.sh对应脚本输出 PASSED本提交
Help e2escripts/e2e-tui-help.shbash scripts/e2e-tui-help.sh本提交
品牌 logo e2escripts/e2e-tui-brand.shbash scripts/e2e-tui-brand.sh本提交
--dir attach e2escripts/e2e-tui-dir.shbash scripts/e2e-tui-dir.sh本提交
--dir 相对路径 e2escripts/e2e-tui-dir.sh 使用相对 sub-projectbash scripts/e2e-tui-dir.sh本提交
--dir 目录过滤 e2escripts/e2e-tui-dir-filter.sh:新会话落在子目录、根会话被过滤bash scripts/e2e-tui-dir-filter.sh本提交
--fork --session attach e2escripts/e2e-tui-fork.shbash scripts/e2e-tui-fork.sh本提交
--continue attach e2escripts/e2e-tui-continue.sh(恢复最新会话)bash scripts/e2e-tui-continue.sh本提交
--mini attach + 回复 e2escripts/e2e-tui-mini.sh:输入 prompt、断言回复且只渲染一次bash scripts/e2e-tui-mini.sh本提交
退出 splash 说明(全量/--mini🟡官方二进制渲染,无法替换;会话有内容(新输入或恢复历史)时 dsh-oc 在下方补一行提示(id 为 dsh 会话 id,恢复用 dsh --profile oc --sessiontests/bridge-router.spec.tsscripts/e2e-tui-mini.sh本提交
Esc 打断/取消(全量/--miniturn.wait/turn.idle 事件驱动 TUI 运行态;POST /session/:id/abortsession.cancel 停止在途流(全量按两次 Esc、mini 一次)tests/bridge-events.spec.tsscripts/e2e-tui-abort.sh本提交
新会话继承最近 preset/preset X 选择记录到 bridge 状态,/new 创建的新会话沿用该 preset(工具集随之变化)tests/bridge-router.spec.ts本提交
--print-logs 透传 e2escripts/e2e-tui-print-logs.sh(fake 二进制 argv 断言)bash scripts/e2e-tui-print-logs.sh本提交
协议探针(路由清单 + 二进制/SDK 版本校验)scripts/probe-opencode.mjstests/fixtures/opencode/routes.jsonpnpm run probetests/protocol-probe.spec.ts本提交
一键自测入口scripts/check-all.sh(typecheck+单测+探针+性能冒烟;--e2e 全量 e2e;--scale N 压测)bash scripts/check-all.sh本提交
GitHub Actions CI.github/workflows/ci.yml(自动)+ .github/workflows/e2e.yml(手动全量 e2e/压测)推送/PR 自动 + workflow_dispatch本提交
流式工具事件 API e2escripts/e2e-api.sh 审批流断言 started/delta/called/successbash scripts/e2e-api.sh本提交
功能矩阵自动追踪scripts/update-feature-matrix.mjspnpm run features:update本提交
会话性能测试(生成器 + 指标 + 报告)scripts/perf.mjs + scripts/perf-session-gen.mjs(dsh Session API 合成日志、zstd 分帧写入)pnpm run perftests/perf.spec.ts本提交
大会话性能验证(200/1000/5000/10000)docs/perf/results-2026-08-15.md:SSE 防抖 + list/history 短 TTL 缓存 + 上游瓶颈记录pnpm run perf -- --sessions 10000本提交
历史读取在途合并与派生页缓存并发调用/启动预取共享同一次 session.list/session.history RPC;full tail 与 100 条页互相派生,TUI 打开会话只扫描一次tests/bridge-router.spec.ts本提交
perf 生成器单测(编码/round-trip/子代理场景)tests/perf.spec.tspnpm test本提交

自动追踪(脚本生成)

运行 pnpm run features:update 重新生成。生成时 HEAD:540e23e(2026-08-17)。

路由注册表

来自 src/bridge/router.tssrc/bridge/stubs.ts 的注册路由;for 循环展开的 /command/skill/reference/integration/api/* 对偶路由会在 路由源码中以 register 动态注册,此处列出已解析的字面量 + stub 路由。

MethodRouteKind来源
GET/experimental/capabilitiesjsonsrc/bridge/stubs.ts
GET/experimental/consolejsonsrc/bridge/stubs.ts
GET/experimental/resourcejsonsrc/bridge/stubs.ts
GET/experimental/workspacejsonsrc/bridge/stubs.ts
GET/experimental/workspace/statusjsonsrc/bridge/stubs.ts
GET/formatterjsonsrc/bridge/stubs.ts
GET/lspjsonsrc/bridge/stubs.ts
GET/mcpjsonsrc/bridge/stubs.ts

测试覆盖

测试文件用例数最后更新
tests/bin.spec.ts4459a99f feat(bin): report dsh-oc and dsh versions for --version
tests/bridge-events.spec.ts66b652f0b feat(bridge): buffer SSE events until first client connects
tests/bridge-fs.spec.ts52fc8dea feat(bridge): return extension-aware content types from fs read
tests/bridge-git.spec.ts6cec436e perf(bridge): merge vcs status numstat into one HEAD diff pass
tests/bridge-router.spec.ts970b0fe10 fix(bridge): remap v1 history parentIDs with surface ids and harden recovery oracle
tests/convert/goal.spec.ts534f5695 feat(bridge): goal projection, /goal command and sidebar todo merge
tests/convert/message.spec.ts2131135cd fix(bridge): align history part ids with live SSE to stop duplicate replies
tests/convert/model.spec.ts7d86e5fa feat(bridge): model variants, reasoning effort and dsh presets
tests/convert/permission.spec.ts40af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
tests/convert/question.spec.ts50af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
tests/convert/session.spec.ts818f17a1 feat(bridge): broadcast session.updated agent after preset switch; harden abort e2e
tests/convert/todo.spec.ts30af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
tests/convert/tool.spec.ts1445630d9 feat(bridge): tool file changes and dsh edit-mode presentation
tests/perf.spec.ts5776d145 test(e2e): remove remaining machine-specific absolute paths
tests/protocol-probe.spec.ts2de7fe57 feat(probe): protocol route/version probe with missing-route reporting
tests/replay-corpus.spec.ts267861f5 test(corpus): drop leftover debug console.log from multi-tool fixture
tests/scaffold.spec.ts7f8bad18 chore: rename package to @chiro2001/dsh-oc
tests/tui/binary.spec.ts18ef1419f feat(tui): disable opencode auto-update/background network and enforce version lock
tests/tui/branding-art.spec.ts33c3984c feat(tui): generate DSH OC home logo with figlet tooling
tests/tui/download.spec.ts781920ee feat(tui): opencode binary resolution, download, spawn and signal handling
tests/tui/index.spec.ts34eba383f feat(tui): print DSH OC brand before --mini launches
tests/tui/platform.spec.ts781920ee feat(tui): opencode binary resolution, download, spawn and signal handling

关键实现最后更新

文件最后更新
src/bridge/convert/common.tsd86e5fa feat(bridge): model variants, reasoning effort and dsh presets
src/bridge/convert/goal.ts34f5695 feat(bridge): goal projection, /goal command and sidebar todo merge
src/bridge/convert/message.ts31135cd fix(bridge): align history part ids with live SSE to stop duplicate replies
src/bridge/convert/model.tsd86e5fa feat(bridge): model variants, reasoning effort and dsh presets
src/bridge/convert/permission.ts0af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
src/bridge/convert/question.ts0af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
src/bridge/convert/session.ts18f17a1 feat(bridge): broadcast session.updated agent after preset switch; harden abort e2e
src/bridge/convert/todo.ts0af3147 feat(bridge): opencode-compatible HTTP/SSE bridge over dsh api proxy
src/bridge/convert/tool.ts0de1c30 feat(bridge): stream tool input deltas and v2 tool lifecycle events
src/bridge/errors.tsd86e5fa feat(bridge): model variants, reasoning effort and dsh presets
src/bridge/events-util.ts9af8f69 fix(bridge): keep real agent preset in messages/labels and stop first-reply duplication
src/bridge/events.tsed881eb fix(bridge): complete every tool-call assistant at turn/end and add replay corpus
src/bridge/fs.ts2fc8dea feat(bridge): return extension-aware content types from fs read
src/bridge/git.tscec436e perf(bridge): merge vcs status numstat into one HEAD diff pass
src/bridge/http.ts5f6aad0 feat(bridge): serve workspace files over /api/fs with wildcard routing
src/bridge/index.ts153f781 feat(tui): show exit hint for resumed sessions with history, not only new input
src/bridge/router-entry.ts6928f8a feat(bridge): expose router entry and add minimal-server renderer attribution
src/bridge/router.ts9af8f69 fix(bridge): keep real agent preset in messages/labels and stop first-reply duplication
src/bridge/routes.ts5f6aad0 feat(bridge): serve workspace files over /api/fs with wildcard routing
src/bridge/routes/boot.tsc958de3 feat(bridge): add global health and lifecycle dispose endpoints
src/bridge/routes/fs.ts2fc8dea feat(bridge): return extension-aware content types from fs read
src/bridge/routes/permission.tsfd1e4b5 feat(bridge): add SDK v2 permission reply alias route
src/bridge/routes/session-v1.ts0b0fe10 fix(bridge): remap v1 history parentIDs with surface ids and harden recovery oracle
src/bridge/routes/session-v2.tsd9e09c0 perf(bridge): bound history pagination with dsh beforeSeq and add baseline
src/bridge/routes/vcs.tsc281121 feat(bridge): serve real git info, status and diffs over /vcs
src/bridge/rpc.ts61e8a42 feat(bridge): serve the dsh skill catalog through /skill routes
src/bridge/sse.tsb652f0b feat(bridge): buffer SSE events until first client connects
src/bridge/state.ts9af8f69 fix(bridge): keep real agent preset in messages/labels and stop first-reply duplication
src/bridge/stubs.tsc281121 feat(bridge): serve real git info, status and diffs over /vcs
src/help.tsa289e00 docs(help): mention background subagents in capability summary
src/index.tsf574dfb feat(tui): dsh --profile oc --help capability summary and README matrix
src/tui/binary.tsef1419f feat(tui): disable opencode auto-update/background network and enforce version lock
src/tui/brand.tseba383f feat(tui): print DSH OC brand before --mini launches
src/tui/download.ts81920ee feat(tui): opencode binary resolution, download, spawn and signal handling
src/tui/index.ts81effdd feat(tui): add candidate opencode upgrade lane with golden trace diff
src/tui/node-undici.d.ts81920ee feat(tui): opencode binary resolution, download, spawn and signal handling
src/tui/platform.ts81920ee feat(tui): opencode binary resolution, download, spawn and signal handling
src/types.ts153f781 feat(tui): show exit hint for resumed sessions with history, not only new input
scripts/audit-local-sessions.sha5925a5 fix(bridge): close provisional messages on turn/end after interrupt
scripts/build-replay-corpus.mjs6928f8a feat(bridge): expose router entry and add minimal-server renderer attribution
scripts/check-all.shaf41815 test(e2e): add /preset inheritance regression for new sessions
scripts/cleanup-e2e-runs.shec31177 chore: add e2e run directory cleanup script
scripts/cleanup-merged-branches.sh2f1ab51 chore(scripts): enumerate remote merged branches for cleanup
scripts/e2e-api-attachment.shcfddd26 test(e2e): cover attachment acceptance and readable rejections
scripts/e2e-api-goal.sh13460d4 feat(bridge): /goal complete via goals API plus full lifecycle e2e
scripts/e2e-api-permission.shefd27f4 test(e2e): make api-permission resilient to mock sequence drift
scripts/e2e-api.sh2fc8dea feat(bridge): return extension-aware content types from fs read
scripts/e2e-cli-bin.she1817df test(e2e): assert dsh-oc --version dual output in cli-bin suite
scripts/e2e-golden-trace.sh81effdd feat(tui): add candidate opencode upgrade lane with golden trace diff
scripts/e2e-install-rollback.she220e93 test(release): add artifact audit and immutable install/rollback drill
scripts/e2e-minimal-server-repro.sha603d6a test(e2e): add raw SSE replay mode and full-trace real repro
scripts/e2e-queued-order-repro.shb72e076 test(e2e): make queued-order QUEUED badge deterministic in CI
scripts/e2e-real-llm.sh609ccd6 test(real): strengthen real-llm queue FIFO and TUI delivery assertions
scripts/e2e-real-queued-order.sha603d6a test(e2e): add raw SSE replay mode and full-trace real repro
scripts/e2e-recovery-consistency.sh008d2ff test(e2e): add crash and SSE-reconnect recovery fault domains
scripts/e2e-recovery-crash.shd5e5d27 fix(e2e): clean orphaned opencode attach after crash kills
scripts/e2e-recovery-sse-reconnect.sh008d2ff test(e2e): add crash and SSE-reconnect recovery fault domains
scripts/e2e-tui-abort.sh1ed1c51 test(e2e): assert interrupt settles the TUI spinner
scripts/e2e-tui-agent-lock.sh1c1e685 test(e2e): cover locked agent switching in the real TUI
scripts/e2e-tui-agent-tab.shed184fc test(e2e): stream mock replies slowly in reply-once assertions
scripts/e2e-tui-boot.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-brand.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-command.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-continue.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-dir-filter.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-dir.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-fork.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-goal-command.shc854d53 test(e2e): cover TUI /goal with a full objective
scripts/e2e-tui-goal.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-help.shf574dfb feat(tui): dsh --profile oc --help capability summary and README matrix
scripts/e2e-tui-mini.shed184fc test(e2e): stream mock replies slowly in reply-once assertions
scripts/e2e-tui-offline.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-permission-ext.sh45b0726 test(e2e): make question highlight assertion theme-agnostic
scripts/e2e-tui-permission-mini.sh261e324 test(e2e): add minimal permission case and 10x flake scan
scripts/e2e-tui-permission.sh4c43254 test(e2e): widen tool slots in TUI permission run A
scripts/e2e-tui-preset-inherit.shaf41815 test(e2e): add /preset inheritance regression for new sessions
scripts/e2e-tui-print-logs.sh7561559 test(e2e): assert --log-level value passthrough to opencode child
scripts/e2e-tui-queue-live.she37d7fd test(e2e): keyboard queue while a live stream is running
scripts/e2e-tui-queue.shc9015cb fix(bridge): mirror dsh pending queue to the TUI and drop prompt debounce
scripts/e2e-tui-skill.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-stream.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-timestamps.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-tools.sh712535a ci: dump TUI pane on every dsh-exit wait failure
scripts/e2e-tui-turn.sh540e23e test(e2e): assert exactly one tool part in tui-turn history
scripts/e2e-tui-version-lock.shef1419f feat(tui): disable opencode auto-update/background network and enforce version lock
scripts/flake-mini-scan.shd5e5d27 fix(e2e): clean orphaned opencode attach after crash kills
scripts/generate-tui-branding-art.mjs3c3984c feat(tui): generate DSH OC home logo with figlet tooling
scripts/minimal-oc-server.mjsac62d57 test(minimal-server): keep raw-replay SSE open and normalize artifact d.ts diff
scripts/normalize-golden-trace.mjsf10e893 test(e2e): record official-TUI queued-followup order repro and golden
scripts/perf-session-gen.mjs3d8a88d feat(perf): session history generator and bridge performance harness
scripts/perf.mjsd9e09c0 perf(bridge): bound history pagination with dsh beforeSeq and add baseline
scripts/probe-opencode.mjs942b799 refactor(bridge): split route registrations into domain modules
scripts/replay-corpus-manifest.mjs9a591f2 test(corpus): add real-session coverage scan and close corpus gaps
scripts/replay-session-audit.sh54c9c31 test(bridge): add reusable real-session replay audit script
scripts/update-feature-matrix.mjs6ecf354 feat(tui): timestamps, feature matrix and multi-arch binary resolution
scripts/update-local-install.shf34db28 chore(tools): add local install updater and harden pack content audit
scripts/update-opencode-assets.mjs6ecf354 feat(tui): timestamps, feature matrix and multi-arch binary resolution
scripts/upgrade-lane.sh81effdd feat(tui): add candidate opencode upgrade lane with golden trace diff
scripts/verify-release-artifacts.shf34db28 chore(tools): add local install updater and harden pack content audit