No description
  • TypeScript 78.7%
  • JavaScript 20.9%
  • Python 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
SikongJueluo 1e2d29060b
feat(triggers): atomic run transitions with embedded outbox and log replay
Close the crash window between a run's state advance and the prompt it owes: both now persist in one run-record write, so a crash can never leave a run awaiting review with no delivery owed (or the reverse).

- embed a transactional outbox (fully composed content, once-minted requestId, best-effort flag) in each run record; state advances, owed prompts, and nudges all commit through one atomic put
- demote the deliveries table to a rebuildable projection serving UI history and manual redelivery; failed outbox entries stay in the record for manual retry, and startup re-derives projection rows from the authoritative outbox so the two tables cannot stay diverged
- replay the durable session logs point-in-time on restart, merging both sides' facts into one event-time timeline (per-session replay judges turns against the wrong round): turn ends the crashed plugin never saw re-derive, pending signals commit or park on log evidence, and goal/turn/reply caches rebuild
- commit a per-run, per-side turn-consumption checkpoint WITH every consumed turn end (advancing, skipped, or paused): replay consumes each turn exactly once, so a round-1 delivery can never be resubmitted as round 2's after a rework-plus-restart
- migrate pre-checkpoint records in ONE merged write per run covering BOTH sides (per-side writes off a stale snapshot clobber each other), leaving a still-pending signal's turn unconsumed so the replay settles it from the log instead of silently stranding the verdict
- buffer boot-window live events without judging them: the log scan seeds the baseline caches first, then buffered events fold and dispatch in arrival order, so a boot-time turn end never freezes its point-in-time context off a not-yet-seeded empty cache
- seed bound sessions' caches from their durable logs before the run exists, distinguishing transient live folds (any live event can create one) from seeded ones via an explicit marker: a transient fold never blocks seeding, a seeded session is never re-seeded over live progress, concurrent seedings of one session SHARE the in-flight read (waiters await it; never treated as done), and buffered live events dispatch exactly once in arrival order over the scanned baseline — each turn end snapshots its own point-in-time goal/reply, so later buffered goal changes cannot leak backwards into earlier turns
- re-seed both sessions inside the run chain BEFORE a resume/redelivery revives a paused run (startup replay only covers then-active runs): buffered turn ends queue behind the revival and are consumed by the live run against the durable baseline
- gate the restart outbox drain by the run's current state: conversation prompts (start/review/rework/resume) only drain for an active run in the matching round/phase, terminal runs keep their committed notices, paused runs wait for the user, and legacy pre-outbox rows follow the same rules
- serialize every same-run read-modify-write (signal, controls, turn-end transitions, delivery settlement) on a per-run chain computing from the latest committed state, so concurrent cancel/extend or receipt/cancel never resurrect the earlier state; network sends run off the chain (the queue may re-enter inline) with settlement back on it
- add fault-injection recovery tests (crash before/after the commit write, after the send, projection-write windows), reviewer-repro regressions across all five review rounds (multi-round restart on current and legacy records, pending verdicts on either side, frozen-inspect boot handoff for live and cold goals, transient-fold and mid-read seeding, shared in-flight waits, buffered goal-change point-in-time, stopped-run drain, projection divergence, concurrent controls under host-realistic delayed puts), a real Cordis + storage-domain + atomic-file medium roundtrip suite, and burst serialization coverage
2026-10-23 16:22:19 +08:00
docs docs(triggers): investigate handoff integration and configuration usability 2026-10-23 16:22:18 +08:00
packages feat(triggers): atomic run transitions with embedded outbox and log replay 2026-10-23 16:22:19 +08:00
scripts build(check): syntax check the web client bundles 2026-10-16 00:25:25 +08:00
.gitignore fix(toolchain-access): first-init lock-dir canonical under symlinked runtime root 2026-10-23 16:22:18 +08:00
AGENTS.md build(check): syntax check the web client bundles 2026-10-16 00:25:25 +08:00
LICENSE Initial commit 2026-09-25 23:41:46 +08:00
package.json build(check): syntax check the web client bundles 2026-10-16 00:25:25 +08:00
pnpm-lock.yaml feat(toolchain-access): add narrow directory grants for toolchain caches 2026-10-23 16:22:16 +08:00
pnpm-workspace.yaml feat(toolchain-access): add narrow directory grants for toolchain caches 2026-10-23 16:22:16 +08:00
README.md fix(cmd-permit): empty seed allowlist, rtk default full access removed 2026-10-23 16:22:17 +08:00
tsconfig.base.json feat(repo): scaffold dsh plugin bundle workspace 2026-09-27 22:45:06 +08:00

dsh-extensions

Out-of-tree DeepSeek Harness 插件 bundle 集,pnpm workspace monorepo。

Bundle 说明
dsh-oauth-providers OAuth 认证的 LLM 厂商集(当前:ChatGPT 订阅),无需 API Key
dsh-plan-usage GLM / OpenAI Codex / MiniMax / OpenCode Go 套餐配额查询,planUsage 服务 + 设置页分区
dsh-auto-permit 审批瀑布上的 AI 判官:小模型在弹窗之前决定是否放行 bash 提权(精确记忆 → 高危形状让路 → 判官调用)
dsh-cmd-permit 同一瀑布上的确定性白名单:配置内的命令族提权不弹窗也不耗判官调用(种子为空——缓存类绕行改走 toolchain-access 目录授权,rtk 代理任意命令也不再默认 Full access);denyShape 高危表以 ctx.cmdPermit 共享给上面那位
dsh-execution-guard 参数预检(审批与副作用之前、同批整体校验)+ 重复 INVALID_ARGS 纠偏提示(原生 repeat-reminder 只认完全相同的参数,抓不到"值在变、形状没变")
dsh-task-anchor checkpoint_task 恢复锚点:记 jj 工作层 / goal 身份 / 阶段 / 归属文件 / 验证摘要,恢复时比对并报告一致或漂移(只报告,不 rebase、不 resume goal)
dsh-auto-env 按 session 工作区自动加载 direnv / devenv 环境
dsh-auto-continue 套餐限额后睡到重置点自动重试,支持跨进程重启续跑
dsh-crew 固定路由委派工具组:三档 subagent(quick / 主力 / smart)+ create_agent 常驻角色代理,档位语义写进工具描述治 over-escalation
dsh-handoff /handoff <任务> 一条命令交接会话,简报即新 session 的首条 prompt
dsh-context-audit /context-audit 命令 + 侧边栏面板:按 provider/model、工具、会话三层统计本机会话日志(缓存命中率、工具失败率…),数据不出本机
dsh-remote-exec 白名单远端容器执行工具:在固定 SSH 主机的固定 Docker 容器里跑 fish 命令,ssh 走宿主侧 spawn,跳板链与 agent 转发原样生效
dsh-rtk-rewrite rtk 命令改写执行器:模型跑 git status、实际执行 rtk git status,用确定性压缩输出降低上下文压力
dsh-search-integrator 多源检索 + 整合模型一次成文:web_research 吃整个问题,去重排序后返回带引文校验的综合答案与覆盖说明
dsh-toolchain-access 沙箱窄目录授权:workspace-write 下精确 bind uv/Cargo/pnpm 缓存与共享锁目录(钉版 bwrap 布局、fail-closed),替代"撞 EROFS 再提权 Full access";接入见 plan-dsh-toolchain-access.md

安装

pnpm install && pnpm build
dsh plugin --profile <profile> add ./packages/<name>
dsh --profile <profile>
  • 插件按 profile 安装,多个 profile 需分别 add。
  • 从 git 安装时 pnpm ≥ 10 会拦截 prepare 脚本,需按提示在 profile 的 pnpm-workspace.yaml 里 allowBuilds 放行——等于授权安装期执行代码,先审阅并钉住 commit。

开发

见 AGENTS.md。

许可

GPL-3.0-or-later。packages/oauth-providers 部分派生自 werifu/dsh-oai-oauth(MIT)与 @earendil-works/pi-ai(MIT),完整许可文本见 THIRD-PARTY-NOTICE.md。