全部小册
源码版本 dsh-v0.1.7-rc.2
深入浅出 DeepSeek Harness
从一次回车到完整 Agent 平台
沿 DeepSeek Harness 官方仓库的固定 commit,从你在终端敲下 dsh 或在浏览器按下回车讲起,追踪消息怎样穿过 Inbox 进入 Agent Loop,事件日志怎样同时支撑模型上下文、持久化与界面投影,并继续拆解工具治理、Goal、多 Agent、Cordis、MCP、SDK、安全与验证体系。
目录
56 章已发布
查阅索引
- --session-id 只接已经存在的会话
- Web 隔着网关等请求,headless 跑完就退
- !!js 条件行:disabled: !!js "!ctx.get('profileContext')"——CLI 插件只在 profile 启动时加载
- cordis.yml 组合:空根与五层 patch 栈
- "最近的目录赢":同名技能按 rank 升序进层,先到先得,项目层压住全局层——项目目录覆盖全局是有意的,不是 bug
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- /api 的两道关:Host 围栏与浏览器 cookie
- Web 隔着网关等请求,headless 跑完就退
- $events 流转发 Host Cordis 事件,$events/result 回传客户端瀑布结果
- 浏览器到运行时,中间没有大表
- 19 个 gateway/* 基础设施错误码与业务错误身份分离,lookup 拒绝保留 session/not-found 等专属码
- 浏览器到运行时,中间没有大表
- 23 种确定性故障 + random:connection_reset/stream_disconnect/stall/malformed_json/rate_limit/context_overflow… 每种一种失败姿势
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 按 id 找 Agent:活的直接用,冷的从日志恢复,同一个 id 只恢复一次
- Web 隔着网关等请求,headless 跑完就退
- 版本号乐观并发:每次物化写入换新 randomUUID,ifVersion 对不上就是 version-conflict,不静默覆盖
- Telemetry 是观测侧车,不是第二个会话引擎
- 包名单可过滤:package_allowlist/package_blocklist 正则在注册后筛掉不需要的包
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 被认领的消息不回收件箱,除非监听器自己放回去
- 被取走的消息不一定进历史
- 被跳过的 bundle
- 插件树是一层层补丁叠出来的
- 崩溃恢复:SessionLogScanner 把最后一条没写完的半截记录判为 torn tail,truncate 回最后一条完整事件
- 写一半崩了,已写的数据也不坏
- 必需清单决定启动成败
- dsh 启动器管到哪里为止
- 边界即生命周期:进程归 ctx.subprocess 管,executor 重载不杀正在跑的子进程
- 能力接入的接缝:Service、Provider 与 Consumer
- 标记在追加时核对;恢复、分叉和离线读取按同一套规则重建清单
- 日志只增不减,历史有进有出
- 表变了,下一步写一条新的 request/header,名字有增减再写一条 developer/message;路由按 toolUpdate 决定模型收到什么
- 工具表是按 Agent 算出来的
- 表面不存消息内容,只存一串节点 seq(nodes: SessionSeq[]),消息按需从事件账本现取
- 模型看到的历史,是现折出来的
- 表面投影折出模型可见消息;SessionProjection 折出跨事件的业务状态(goal、todo、上下文快照)
- 事件是流水,状态是折叠出来的投影
- 表面折叠:analyzeEventLog 用 foldSurface 把消息合并折叠后,事件表面分 current/shadowed/log-only 三种归宿
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 捕获即脱敏:session-telemetry/record 瀑布由部署方挂载规则,服务自身零规则,innermost next() 原样放行
- Telemetry 是观测侧车,不是第二个会话引擎
- 不启动核对叠层结果
- 插件树是一层层补丁叠出来的
- 不是每个 commit 都要更新:只有改变核心叙事(owner/边界/恢复路径)才必须更新
- 从一个 commit 到下一版:这本书怎样更新并收束
- 参数的根是开放的对象,没声明的键不算错;default 只是注解,缺省值由工具自己补
- 拦下坏参数的不止一层
- 参数格式由 defineTool 在定义时编进 JSON Schema 子集,子集以外的写法当场报错;发给模型的格式和检查用的格式出自同一次编译
- 拦下坏参数的不止一层
- 仓库即插件:.dsh 不只是技能目录,它把仓库声明成一个可被自动装载的能力包
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 策略按调用携带:SandboxPolicy 是 per-call 的,不是 provider 上固定的
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 策略属于路由:默认 normal,五个码、每一步最多 5 次、0.5 秒起翻倍、封顶 10 秒、±10% 的随机数;Retry-After 不超过上限就照办,超过就不重来
- 每一次失败都有下文
- 插件的消息投影只改已有消息的内容,节点和 id 不变,读历史从此离不开这个插件
- 日志只增不减,历史有进有出
- 插件的依赖声明 inject
- 插件跟着它等的服务起落
- 插入补丁与按 id 修改
- 插件树是一层层补丁叠出来的
- 查不到适配器时不带句柄往下走,请求交给 llm/stream 监听器;两道手续里别的错误直接结束这一轮
- 请求离开进程之前
- 程序里的 tools 是桥:每个可见工具一个绑定函数,调用经注册表的镜像调度器当子调用执行,结果 curate 后交回
- 程序在子进程里,工具在宿主上
- 程序跑在全新 Node 进程里:类型先剥掉,环境从空开始,沙箱和 bash 用同一个服务,堆上限由参数定
- 程序在子进程里,工具在宿主上
- 池子的节奏:开始一个就提交一次、看一眼取消,落定一个就提交、再补池;名额数的是派发出去还没落定的调用
- 同时在跑的调用共用着什么
- 传输是换行分隔的 JSON-RPC 2.0:每行一个 JSON 对象,不是 LSP 风格的 Content-Length 头帧
- stdio 上,程序对程序的 JSON-RPC
- 创建事务:准备、组装、补存发布前的事件、发布
- Agent 没有自己的 id
- 次数从日志里折出来:llmRetry 投影按路由和策略计数,step/start、turn/end 清零;同一条链共用 retryId
- 每一次失败都有下文
- 错误是类型化的:TransportClosedError / RequestTimeoutError / SdkProtocolError,Python 侧 Pydantic 模型校验响应
- 两根语言,同一条线
- 带来源的启动环境快照
- dsh 启动器管到哪里为止
- 单单调版本号:SESSION_FORMAT_VERSION=4,bump 只由 writer 发出的结构变化决定,加普通事件类型不 bump
- 旧会话打开时,版本号说了算
- 单行流式翻译:createRestore 逐行 decodeRow,compact run 不展开直传,inherited cut 预声明 finish 对账
- 旧会话打开时,版本号说了算
- 导入之前的版本准入
- 插件树是一层层补丁叠出来的
- 倒序启动、同时撤销;同一个 effect 里一步等一步
- 插件跟着它等的服务起落
- 登记即 effect
- 插件跟着它等的服务起落
- 第一步最后的决定里没有消息,这一轮以 completed 收场,驱动不再看队列
- 被取走的消息不一定进历史
- 调用方身份门禁:tool-session-query 先解 Caller(id/header/boundary),工作区授权可见血缘投影
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 顶替用一条新事件换下当前历史里的一段,来源列表要盖住换下的每一条,原事件留在日志里
- 日志只增不减,历史有进有出
- 冻结物理 codec:每个已发布版本一个 codec(decodeHeader + 逐行 createDecoder),发布后永不改动
- 旧会话打开时,版本号说了算
- 断开 = 结果与清理未知:不重连、不回滚,租约心跳兜底
- 同一个运行时,在另一台主机上
- 对话块投影把内容块分类成 text/reasoning/image/tool-call,未知块降级 other
- 日志是事实,对话是投影
- 发布前失败抛固定安全事实(product/stage/category),不泄 Host 内部;发布后 result 永不 reject,扁平化为 stopReason
- 另一个产品里的 Agent,当你的子 Agent
- 发布顺序:Session 进表、Agent 进表、宣告 Session、宣告 Agent
- Agent 没有自己的 id
- 放行的消息里可以有从没进过收件箱的快照和说明
- 被取走的消息不一定进历史
- 放行先开 step,路由定下之后才提交系统提示词和 user/message
- 被取走的消息不一定进历史
- 放行之后还有守卫,守卫只能拒绝,批下来的调用守卫照样能拦;结果策略没有要问这一项
- 另一头有没有人
- 分层环境与 bootstrap-only 名字
- dsh 启动器管到哪里为止
- 服务离开时依赖方卸载,回来时从头重跑
- 插件跟着它等的服务起落
- 服务只沿祖先链查找
- 插件跟着它等的服务起落
- 改配置改 cordis.patch.yml,不改根 cordis.yml
- cordis.yml 组合:空根与五层 patch 栈
- 格式检查在 defineTool 包装的 execute 开头,放行策略、审批、守卫和 tools/execute 上的包装都在它之前
- 拦下坏参数的不止一层
- 格式写不出的规矩(正整数、非空、成对的参数、没声明的键)由工具主体自己查,报普通的错误,不带码
- 拦下坏参数的不止一层
- 根 Include
- 插件树是一层层补丁叠出来的
- 根上下文不做声明检查
- 插件跟着它等的服务起落
- 根上下文的 dispose 是一次清场
- 插件跟着它等的服务起落
- 更新不是批量替换 verifiedCommit:批量换哈希是制造漂移最快的方式
- 从一个 commit 到下一版:这本书怎样更新并收束
- 更新粒度:单章可更新,但全部 verifiedCommit 要一起指向新 commit
- 从一个 commit 到下一版:这本书怎样更新并收束
- 工具的失败收成出错的结果;取消时不再开始,等已开始的,提交时成功的改记 ABORTED,没开始的补一对;调度器自己出错不编结果
- 几个工具能不能一起跑
- 工具调用和结果由写入的一方配对,推导不补也不查
- 日志只增不减,历史有进有出
- 工具注册表分层:一个全局层,每个作用域一层;register 只带定义,登记落在调用它的上下文所带的作用域
- 工具表是按 Agent 算出来的
- 挂着后台任务服务时,前台调用也先登记成 job;到点还在跑,就交回已有输出和编号,进程接着跑
- 命令可以比它的调用活得久
- 观测侧车定位:session-telemetry 只拥有 CAPTURE 一侧,batching/retry/loss policy 是 reporting SDK 的地盘,本包刻意不建模
- Telemetry 是观测侧车,不是第二个会话引擎
- 管理类请求有保留配额:heartbeat/close 各 1,process.terminate/fs.streamClose 各 128
- 同一个运行时,在另一台主机上
- 管理面是版本化 JSON-RPC:4 字节大端长度前缀帧、64 MiB 帧上限、pending 128、写尾串行化
- 同一个运行时,在另一台主机上
- 归一化即脱敏:会话 id、运行 cwd、RPC id、时间戳、goal 时钟、hook 时长全部刷成占位符,快照才能跨机跨时一致
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 规则翻译成 WebhookSessionRequest:workspacePath/title/prompt/agentPreset/permissionPreset/model 缺省走默认模型
- 一条投递,一个根会话
- 规则注册表是 fire-and-forget:dispatch 快照投递、按 kind 分发给所有匹配规则、不等回调结算
- 一条投递,一个根会话
- 恢复和分叉之后,新的循环实例从日志里现读系统消息,resume 请求头本身不另起一组
- 系统提示词也是一条消息
- 恢复沿用 id,fork 换新 id 并记下 parentSession
- Agent 没有自己的 id
- 会变的事实做成运行时上下文快照,跟在历史后面,变了才发
- 系统提示词也是一条消息
- 会话空白时可选/重选 preset;一旦开了第一轮(turnBoundary),select 抛 agent-preset/locked,配置冻结
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 会唤醒 Agent 的写入都经 send;splice、prepend、replace、remove 直接改队列,不唤醒,也不改排
- 插话等下一步,排队等下一轮
- 技能是带 frontmatter 的 Markdown 文件:SKILL_NAME 校验 kebab-case,正文按需加载、目录清单常驻提示
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 加载失败先撤回,再停在 FAILED
- 插件跟着它等的服务起落
- 架构已迁移:"no API Proxy service remains",一元操作落在各业务 Remote 拥主方,不再有集中的 40+ 方法大表
- 浏览器到运行时,中间没有大表
- 监听器一层套一层,默认决定在最里层,不调 next() 就截断里层
- 被取走的消息不一定进历史
- 检查点包装在顶层调用的主体开跑前刷盘,同一个会话同时来的几次刷盘在一条写链上排队
- 同时在跑的调用共用着什么
- 建会话是一条事务:校验 → preset 作用域 → 工作区创建 → Agent 创建 → attach → 权限/标题 → 首条消息
- 一条投递,一个根会话
- 脚本不进父进程:共享 PTC 执行器每次调用新开一个 Node 进程,进程隔离与取消归执行器,vm 域只做脚本沙箱
- 工作流编排:脚本如何编排一批 Agent
- 接线顺序对了还要对号:构造里再校验 ctx.ptcRuntime.language === 'typescript'
- 能力接入的接缝:Service、Provider 与 Consumer
- 进程、job、终端都只在内存里,重开会话一个也接不回
- 命令可以比它的调用活得久
- 进程归共享子进程服务:spill/grace/managed range 与本地进程同一套
- 另一个产品里的 Agent,当你的子 Agent
- 进程没等 turn/end 落盘就没了,下次加载补 interrupted;循环在进程里从不写 interrupted 和 forked
- 每一次失败都有下文
- 进程内的子 Agent 在委派时被钉成 never,问不到人;提问服务只让运行时的根 Agent 问人
- 另一头有没有人
- 进程四步 prepare→start→done→terminate;prepare 先发私有流端点,全部通道认证完成才 start
- 同一个运行时,在另一台主机上
- 精确 live sender:ctx.agents.get(sender.id)!==sender 即拒,运行后顶替的 agent 不能冒名发信
- Agent 之间的消息:send_message 的直邻路由
- 精确键集合解码:每个形状只许恰好那几个字段,多一少一都拒绝
- Goal 不是状态对象,是一串可折叠的事件
- 拒绝让这一轮以 blocked 收场,没有单独的拒绝事件
- 被取走的消息不一定进历史
- 拒绝语义:任何迁移阶段错误都被 throwUnsupportedRefusal 包成"X refuses this format vN"
- 旧会话打开时,版本号说了算
- 壳与 Host 之间是私有 Node IPC:boot injections、readiness、shutdown、fatal 诊断、platform-session 都走它
- 桌面壳里,装着整个运行时
- 可复用的指令排在前面,本机路径、URL、工作目录排在后面
- 系统提示词也是一条消息
- 可见表每次现算:全局层和各上级由远到近叠,近的顶替远的;过滤只管继承来的;自己那一层不过滤、同名顶替;呈现方式不是 native 时放进 run_code
- 工具表是按 Agent 算出来的
- 客户端校验三样东西才放行:helper 摘要(helperHash)、PTC 入口摘要(bootstrapHash)、握手协议版本
- 同一个运行时,在另一台主机上
- 空存储值即"处处缺席":describe/listRecords 只报键名与元信息,永不回读值
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 空的根配置与补丁栈
- 插件树是一层层补丁叠出来的
- 空的提示词清掉所有版本,空的系统消息占位但不发给模型
- 系统提示词也是一条消息
- 空根哲学:cordis.yml 就是 [],每次启动重写,只作 Loader 的 baseUrl 锚点
- cordis.yml 组合:空根与五层 patch 栈
- 控制通道按长度前缀的 JSON 帧走:ready/boot 握手后,程序发 call、log、done,宿主回 reply;协议、输出、并发都有硬限额
- 程序在子进程里,工具在宿主上
- 快照隔离:eventsSnapshot 全量快照 O(1) 复用,后续 append 不污染已发出的快照
- 会话里没有状态,只有一本只追加的流水账
- 扩展字段放在模型读不到的地方,2xx 之后才确认,会话日志以至少一次的方式送达
- 请求离开进程之前
- 了结的 job 由 tool-jobs 送通知:主人忙就旁注,闲就叫醒;模型已经知道结果的、主人正被撤下的不送
- 命令可以比它的调用活得久
- 冷接管先 query.observeSession 读快照做闸门,再 agents.resume;接管前再对活日志重读一次闸门,防 overlay 半路改 preset
- 命令行里,问一句话就退出
- 冷投递命中未驻留孩子 → coldResume 重建 Activation 后再投,descriptor 供全部重建输入
- Agent 之间的消息:send_message 的直邻路由
- 历史第一位留给提示词,顶替它的只能是正好盖住它的 system/message
- 系统提示词也是一条消息
- 连接监督器:自动重连(指数退避、最多 10 次、30s 上限),生成代次 close 超时 5s 收尾
- 外部进程的工具,怎样进全局工具表又不撞名
- 两侧都只是 thinner client:spawn 进程、读写 NDJSON、配对 req_id、分发通知,不实现任何 Agent 逻辑
- 两根语言,同一条线
- 两道防线:shell maybeTruncate 硬截断(字符级)与 spill-policy bound 软截断(token 级)相互独立
- 工具输出太大时,全文落盘,上下文只留一张书签
- 两个入口共用 dsh-base 的运行时,差在各自 bundle 叠上去的几行
- Web 隔着网关等请求,headless 跑完就退
- 两个入口共用 Harness home 下的会话目录,在写锁上相遇
- Web 隔着网关等请求,headless 跑完就退
- 两阶段 syncTools:先 listTools(cacheMode:refresh) 拉全量,校验无重名,再一次性旧摘新挂——避免半新半旧的工具表
- 外部进程的工具,怎样进全局工具表又不撞名
- 两类方法十二个入口:SessionQueryEngine 只把 searchSessions/searchEvents 留给后端实现,其余十个(readSession/listEvents/traceSession…)全部 concrete
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 两条记录通道:ledger 通道逐事件镜像 session log,ops 通道只带 agent-error 与 shutdown 两个无日志归宿的信号
- Telemetry 是观测侧车,不是第二个会话引擎
- 两种 change shape:GoalSnapshotChangeMeta 与 GoalClearChangeMeta 墓碑,version:1
- Goal 不是状态对象,是一串可折叠的事件
- 两种传输:stdio 起子进程(env 走 scrubbedParentEnv 擦除凭据后再叠 config.env);streamable-http 连 URL
- 外部进程的工具,怎样进全局工具表又不撞名
- 浏览器走两条路:一元 POST /api 经 Connection 进 Gateway;流式经 Upgrade 到 WebSocket mux(/api/remote.mux)
- 浏览器到运行时,中间没有大表
- 流结束后写一条 assistant/message 或 assistant/attempt,stream 字段压紧存放收下的每一片块,展开后一片不差;回答事件不带 sourceEventSeqs
- 为什么不边流边记
- 流进行中循环不为这次尝试写日志;agent/assistant-stream 的帧只在进程里,监听器改不了拼出和记下的内容
- 为什么不边流边记
- 录制即 harvesting:record 模式在 graceful shutdown flush 之后,把持久化的 session JSONL 收割下来归一化
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 路由声明 in-history、这一步不另起一组、文字不空时,变了的提示词追加在历史末尾;否则归并回第一条
- 系统提示词也是一条消息
- 轮次靠消息归属:user/message{source.kind=goal} 推进 roundsStarted,必须严格是下一个 admitted round
- Goal 不是状态对象,是一串可折叠的事件
- 轮次预算:maxGoalRounds 上限,resume 时耗尽即拒
- Goal 的相位机、revision CAS 与轮次预算
- 没有后台任务服务,或者登记被拒,前台命令才到点就被执行器杀掉
- 命令可以比它的调用活得久
- 每次 bash 调用起一个新的 bash -c:工具拼请求,执行器补缺省和时限,子进程服务起进程、按进程范围停进程
- 命令可以比它的调用活得久
- 每次尝试开头先走 agent/request 和 prepareCall,拿到模型能力再写日志
- 请求离开进程之前
- 每读一次流建一个 AssistantStreamAttempt:每片块记下到达时刻、只拷一次冻结快照,同时交给压紧记录、组装器和 chunk 帧
- 为什么不边流边记
- 每个 Agent 只有一个收件箱,里面是 next-turn 与 next-step 两个有序列表
- 插话等下一步,排队等下一轮
- 每个 preset 挂载时建一个独立 scope 的常驻树(PresetMount),多个 Agent 共享同一份插件实例,不每人一份
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 每会话串行化:operationTails 按 sessionId 排队完整读改写,disposing 期间拒收新写入
- Telemetry 是观测侧车,不是第二个会话引擎
- 每条事件是一个结构化信封:type + seq + time + data,外加可选的 ignorable 与 surface 两字段
- 每条事件都装在带五格字段的信封里
- 每一步开头认领 next-step 的全部,一轮的第一步再加 next-turn 队首一条
- 插话等下一步,排队等下一轮
- 密钥文件权限:0600(文件)/0700(目录),assertOwnerOnly 发现权限太开就拒,提示 chmod 600
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 命名空间是可移植契约:全局名、错误类名都要过一份跨后端的合法标识符清单,一个后端合法的名字在所有后端合法
- 程序在子进程里,工具在宿主上
- 模型写给相邻 Agent 的信两个方向都走 steer,运行时的结束通知按父 Agent 的状态选动词
- 插话等下一步,排队等下一轮
- 模型只能点名加载 isModelInvocable 的技能;斜杠手势 /skill-name 在用户消息里被识别,模型主动调用走 ctx.skills.get
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 默认 FEEDBACK_ONLY:部署默认不抓会话内容,只有显式 feedback 提交才授权回放 canonical log;fork seed 不算数
- Telemetry 是观测侧车,不是第二个会话引擎
- 默认的取消清空队列并记为取消,keepInbox 只停这一轮
- 插话等下一步,排队等下一轮
- 目标先验检查:给消息打分前必须证明该 assistant/message 事件真实存在于日志,否则 target-not-found
- Telemetry 是观测侧车,不是第二个会话引擎
- 能不能一起跑由工具声明:isConcurrencySafe 返回的正好是 true 才算并行;没声明、抛错、别的返回值、调用者看不见的工具都是独占
- 几个工具能不能一起跑
- 能不能一起跑只在一个调用开始之前问,开始以后不再问;注册表在一步中间变了,没开始的按新定义判断,一组可能被切短
- 同时在跑的调用共用着什么
- 能产生消息的只有五种事件,写入时必须带 surfaceOp 标记,别的事件不许带
- 日志只增不减,历史有进有出
- 能力接缝三件套:abstract Service 定义契约 → declare module 挂载 Context 类型 → static inject 声明消费依赖
- 能力接入的接缝:Service、Provider 与 Consumer
- 平台文档用持久 WebContentsView 分区,凭据走私有 Node IPC,renderer 收不到 token
- 桌面壳里,装着整个运行时
- 评分是二元的:rating 只有 positive/negative,不是 1-5 星;另挂 7 个 category 与可选 note
- Telemetry 是观测侧车,不是第二个会话引擎
- 启动器参数与应用参数的分界
- dsh 启动器管到哪里为止
- 签名阶段用账号级独占文件句柄串行:硬件令牌签名互斥,公共密钥检查最多四个进程、32 个一批
- 桌面壳里,装着整个运行时
- 签名资源里带一整套 dsh:独立 Node/Python/pnpm 发行,锁文件钉住归档与 wheel 哈希,runtime.json 记录载荷摘要
- 桌面壳里,装着整个运行时
- 清单上的每个节点投影成一条消息,空的系统、开发者、助手消息不产生消息
- 日志只增不减,历史有进有出
- 取消/失败后 settleRunResult:cancelled → aborted,其它 rejection → error,诊断 4 KiB 上限不拆 UTF-8
- 另一个产品里的 Agent,当你的子 Agent
- 取消不撤销已完成的远端变更:completed remote mutation is not rolled back
- 同一个运行时,在另一台主机上
- 取消落在哪里,日志就停在哪里:尝试之间取消,有 llm/retry 而没有 llm/retry-started;尝试之中取消,按第 09 章结算
- 每一次失败都有下文
- 取消之后、收尾之前到达的唤醒改排下一轮,并被记下;disposed 的取消之后只改排、不记
- 插话等下一步,排队等下一轮
- 全快照变更:goal/change 每次写"改完之后的样子",不写 delta
- Goal 不是状态对象,是一串可折叠的事件
- 缺省走 agents.create(随机 session-id + meta.cwd);带 --session-id 走 resolveAgent 接管已持久化会话
- 命令行里,问一句话就退出
- 认领之后、写进历史之前,agent/pre-step 是这一步的最后一道关
- 被取走的消息不一定进历史
- 认证在 provider 层:GitHub 适配器用 x-hub-signature-256 验签名,body 有界 UTF-8,secret 从凭据服务解析
- 一条投递,一个根会话
- 三处独立闸门:配置层不写值、文件层权限锁死、日志层抹掉 role('secret'),任何一处漏了另两处兜
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 三类声明证据等级:配置声明只能证明可组合,类型声明只能证明允许传什么,只有调用点与状态写入证明实际运行
- 从一个 commit 到下一版:这本书怎样更新并收束
- 三种模式:replay(默认)/ record / refresh,由 DSH_SNAPSHOT 环境变量切换
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 沙箱模式和审批策略是会话日志里的两个旋钮,只认最后一条,重开会话时照日志重放;预设只是两个旋钮的组合,执行时不读预设的名字
- 另一头有没有人
- 深冻结账本:每个 event 被 deepFreeze,读到的 event.data 是落盘值而非调用方可变输入
- 会话里没有状态,只有一本只追加的流水账
- 审批从两处发出:tools/pre-execute 上的放行策略答 ask,或者工具主体要升权;默认的随附组合里只有后一处
- 另一头有没有人
- 审批服务先看策略再找人:never 谁也不问、一律 rejected;没人接、应答者出错或答非所问都是 unavailable;等着时中止是 cancelled
- 另一头有没有人
- 声明可以并行的承诺:不改父 Agent 的状态,共享的东西容得下并发,记录的先后要么无所谓、要么错了会被拦下
- 同时在跑的调用共用着什么
- 省略理由有法定句式:OMITTED_COMPANION_REASON 正则要求"No … companion is published because…",不是随口一句话
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 失败不吞不炸兄弟:child/registry/handle 三类失败聚成一条 ACTIVATION_TEARDOWN_FAILED,多边界用 AggregateError
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 失败回滚与正常撤下走同一个只执行一次的撤销函数
- Agent 没有自己的 id
- 失败回滚只回滚已做的:attached 之后失败 detach + dispose,回滚失败只记日志不覆盖原失败
- 一条投递,一个根会话
- 失败纪律:parallel/pipeline 普通错误归一成 per-item null,fatal WorkflowError 穿透 combinator
- 工作流编排:脚本如何编排一批 Agent
- 失败是包可归因的:InvariantError code=INVARIANT,消息格式 invariant violated by "包名": …
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 失败是一类结果:exception、timeout、abort、worker-exit、invalid-output、output-limit、protocol、sandbox-unavailable
- 程序在子进程里,工具在宿主上
- 失败在哪里浮出,决定留下什么:两道手续里出错,这次尝试什么也没写;组请求时出错,已经写下的留着,这次尝试不结算;适配器以下的失败收成带码的结束块,整段流写成 assistant/attempt 再问要不要重来;读流时抛出的错先结算,再原样抛出,不问要不要重来
- 每一次失败都有下文
- 时限包装不和主体赛跑:到点只发信号,主体收场之前名额一直占着
- 同时在跑的调用共用着什么
- 实时的那份可能作废,要作数的输出从日志取;计量和回放读嵌入的流
- 为什么不边流边记
- 事件分两大阵营:surface-eligible(5 种,产生模型可见消息)与 log-only(边界/追踪/元数据)
- 每条事件都装在带五格字段的信封里
- 事件先 enqueueLive 进写后批量,200ms 一个 timer flush,不是每条事件立刻 fsync
- 写一半崩了,已写的数据也不坏
- 事件沿同一条链往上送:主机层的监听器收所有 Agent 的调用,preset 里的监听器收加入这一版的 Agent 的调用
- 工具表是按 Agent 算出来的
- 适配器把提供方的流翻成七种中性的块:index 关联交错的块,block-end 带完整内容,finish 带结束原因和回放状态
- 为什么不边流边记
- 适配器以下的失败收成一个收尾块,监听器和消费方的错误照样抛
- 请求离开进程之前
- 收件箱是会话日志里 agent/inbox/spliced 事件的折叠,ReactLoopInbox 自己不存列表
- 插话等下一步,排队等下一轮
- 收敛六步:resident.delete → releaseSlot → notifySettlement → releaseOwnership → observer.settle → 有 failure 才 throw
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 收尾必经 sessions.flush 把会话日志落盘,再 summarize;appExit 由 launcher 注入,completed 退 0、其余退 1
- 命令行里,问一句话就退出
- 收尾通知有 announced 闸门:从没被投递过的孩子不欠父一个交代
- Agent 之间的消息:send_message 的直邻路由
- 输出到上限时丢工具调用和裁回放条目是同一次取舍
- 为什么不边流边记
- 输入脚本按序执行:newSession 把服务器发的随机 id 收进 {{sessionId}} 变量,后续步骤引用它
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 数据库自家人权限:打开索引库用 wx 模式 + 0o600,PRAGMA application_id 与 user_version 双重识别防错文件
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 数据面每流独立:ssh -O forward -L + TLS-PSK(PSK-AES256-GCM-SHA384),每流 randomBytes(32) 能力密钥
- 同一个运行时,在另一台主机上
- 双路径耐久性核对:live session append 后重开 handle 读回,header 三元组(id/createdAt/cwd)深等才算落盘
- Telemetry 是观测侧车,不是第二个会话引擎
- 私有 Node 启动器环境只作用于包操作,不污染 Host PATH——PTC 与 agent shell 的环境是另一张白纸
- 桌面壳里,装着整个运行时
- 四层防线互不信任:Trust 决定问不问人,Permission 决定放行什么,Sandbox 决定文件写到哪,Network 决定联网到哪
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 四道门一次过:checkManifest/checkBuild/checkSource/checkOmissionReason,结构不全就是 violation
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 四个服务器到客户端通知:session.event、session.status、subagent.started、subagent.finished
- stdio 上,程序对程序的 JSON-RPC
- 四类证据分别刷新:源码引用 / 可复现实验 / 叙事审计 / 最小更新闭包
- 从一个 commit 到下一版:这本书怎样更新并收束
- 算前台还是后台,看调用方等不等 result(),不看进程怎么起
- 命令可以比它的调用活得久
- 随附的 DeepSeek 适配器在回答结束时要求参数解析得出 JSON 对象,否则整条回答报 MALFORMED_RESPONSE,没有工具结果
- 拦下坏参数的不止一层
- 随附模板与 --from-default-profile
- dsh 启动器管到哪里为止
- 随附组合挂着的工具里,声明了可以并行的只有读文件、读图片、联网搜索和抓取、委派子 Agent 这几样,写法都是一律 true;写、改、bash、grep、glob 都独占
- 几个工具能不能一起跑
- 锁 commit = 可复核性:每条 SourceEvidence 的 path/行号/符号在该 commit 上都能复跑
- 从一个 commit 到下一版:这本书怎样更新并收束
- 提供方进入 ACTIVE,服务才可见
- 插件跟着它等的服务起落
- 提交指针:结果先进格子,按单子顺序提交,写 tool/result、交出附带的消息、看 concludesTurn;名额在跑完时让出,不等提交
- 几个工具能不能一起跑
- 提示词里的工具、按名字查定义、调度器分类、派发前找定义,查的是同一张可见表
- 工具表是按 Agent 算出来的
- 提示词作为 system/message 写进会话,请求从日志推出,循环发出的请求不带 system 字段
- 系统提示词也是一条消息
- 提问没有策略、没有成对的审计,问题和回答就是 tool/call 和 tool/result;计划评审走的也是提问
- 另一头有没有人
- 停一条命令按进程范围停:POSIX 先 SIGTERM,宽限 3 秒后 SIGKILL;Windows 直接结束
- 命令可以比它的调用活得久
- 通知订阅两派:TS 是 subscribe() 返回异步可迭代流,Python 是 next_notification() 轮询拉取
- 两根语言,同一条线
- 同一个 id 的先后几次生命周期,按对象区分
- Agent 没有自己的 id
- 同一个 id 同一时刻只有一次创建在路上
- Web 隔着网关等请求,headless 跑完就退
- 投递被接纳后 webhook 所有权结束:Agent 归 ctx 生命周期,走普通会话行为
- 一条投递,一个根会话
- 投递历史保留上限:days + records 双约束
- 目标之下的三件套——plan、todo、schedule
- 投递两态:steer 插最近一步,queue 排独立新 turn;父收尾时 idle→queue、忙→steer
- Agent 之间的消息:send_message 的直邻路由
- 投递消息带来源痕迹:kind/provider/source/deliveryId/ruleId/form notice,进消息 source
- 一条投递,一个根会话
- 投递与 disposal 共享临界区:closing 已开就等 disposal 结束再重试;不静默吞信
- Agent 之间的消息:send_message 的直邻路由
- 推理流走 stderr(streamReasoning),最终文本走 stdout;--json 时 stdout 变成换行分隔的运行事件流
- 命令行里,问一句话就退出
- 退出都是幂等:TS disposeRuntimeProcess,Python close() 先发 shutdown 再关 stdin
- 两根语言,同一条线
- 退出前 Host 报两个事实:会打断的活动任务、已武装的定时提醒;都没有才静默退出
- 桌面壳里,装着整个运行时
- 外部 Agent 作子 Agent:provider 契约 + 五面能力旗(agentOptions/outputSchema/depthLimit/toolFilter/persona),启动前逐面校验
- 另一个产品里的 Agent,当你的子 Agent
- 外部 provider 全部声明 NO_START_CAPABILITIES(五旗全 false)、inheritsParentContext=false:子进程是新环境
- 另一个产品里的 Agent,当你的子 Agent
- 唯一读父会话的是 workspace cwd:resolveChildCwd(config cwd 优先,否则父会话 cwd,都没有即拒绝)
- 另一个产品里的 Agent,当你的子 Agent
- 未注册 provider → NO_PROVIDER;要求了不支的能力 → UNSUPPORTED_CAPABILITY,都在 start 前响亮失败
- 另一个产品里的 Agent,当你的子 Agent
- 未注册方法回 -32601,handler 异常回 -32603;客户端用 req_id 配对 pending 请求
- stdio 上,程序对程序的 JSON-RPC
- 文件监听器读到 observed 里的路径就跳过:宿主自己写的,不触发重载,避免自激环
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 文件命名世代:session.jsonl=v0,session.vN.jsonl=v1..v4,正则只认 canonical 名
- 旧会话打开时,版本号说了算
- 无法强制即 SANDBOX_UNAVAILABLE:没有后端能执行时 fail-closed,绝不裸奔
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 无密钥录制测试:dsh-session-snapshot 服务于 pnpm run test:snapshot,不改一行产品代码、不需要任何 API key
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 五层 patch 栈:bundle layers → profile cordis.patch.yml → $DSH_HOME/cordis.patch.yml → --patch overlays → telemetryPatch
- cordis.yml 组合:空根与五层 patch 栈
- 五维度比较:package graph / public symbols / event vocabulary / config schema / 产品入口
- 从一个 commit 到下一版:这本书怎样更新并收束
- 系统提示词由注册表把各插件登记的段落拼成:同名的由近的作用域胜出,按一张集中的排序表排,瀑布之后 complete 段落独占
- 系统提示词也是一条消息
- 先写 llm/retry 再等,等完再写 llm/retry-started:等待本身留在日志里,排了却没开始的重试读得出来
- 每一次失败都有下文
- 先追加事件、后发 end 帧;回答拼不成或日志拒收,end 帧写已放弃
- 为什么不边流边记
- 相邻迁移链:defineSessionFormatMigration 强制 to=from+1,编译期四边缺一即拒、多一边也拒
- 旧会话打开时,版本号说了算
- 相位机:active/paused/blocked/complete 四态,每条边在 fold 与服务层双重校验
- Goal 的相位机、revision CAS 与轮次预算
- 项目根的 .dsh/skills 是 rank 100 的技能层:随仓库提交、随仓库走,进这个仓库就先吃这个仓库的技能
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 消费方不 import 实现,只 import 类型:PtcWorkflowEngine.inject = ['subagents','ptcRuntime','sandboxPolicy']
- 能力接入的接缝:Service、Provider 与 Consumer
- 写入侧:encodeCurrentHeader/encodeCurrentEvent 永远产出 v4,旧磁盘文件一个字节不改
- 旧会话打开时,版本号说了算
- 新会话钉进默认预设:设置里存的那个,没有就按组合的默认值推出;不设 DSH_PERMISSION_MODE 时是 workspace-write 加 ask
- 另一头有没有人
- 循环只认路由名,LlmRuntime 把名字对到登记的适配器;一个名字只有一个适配器,整组替换没有空窗
- 请求离开进程之前
- 严格插值:变量没登记、这次没有值或写法不对,都直接报错
- 系统提示词也是一条消息
- 一步的工具调用按模型写下的顺序排成单子,参数只解析一次,调用开始时先写 tool/call,再做放行检查
- 几个工具能不能一起跑
- 一次点击的路径:浏览器、Connection、API Gateway、会话控制器、Agent 工厂
- Web 隔着网关等请求,headless 跑完就退
- 一次会话里目录真变了才重发清单:JSON 摘要 + catalogHistory 回扫历史,未变化轮次静默
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 一个 context 只许一个实现:加载第二个抛 cordis 标准 duplicate-service
- 能力接入的接缝:Service、Provider 与 Consumer
- 一个 id 同一时刻只有一个驱动者
- Agent 没有自己的 id
- 一个线程里的"一起跑"是等待的重叠:一个主体停在 await 上时,别的主体接着往下走
- 同时在跑的调用共用着什么
- 一轮收尾先看信号:已中止记 aborted 和取消原因的拷贝,不发 agent/error;否则记 error,LlmError 原样,其余经 errorChain 记成 UNKNOWN
- 每一次失败都有下文
- 一轮一个 AbortController;信号交给这一轮要等的事件、随请求到适配器、给重试的等待和工具调度器,循环自己在固定的检查点停下
- 每一次失败都有下文
- 一轮正常收尾且队列不空才开下一轮;被拒、出错、被取消,或第一步的决定为空时,驱动停下
- 插话等下一步,排队等下一轮
- 引用而非值:配置里写 ${VAR_NAME},credentialRef 把它解析成内存引用,运行时才取值,值不进配置文件
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 用量在结束块之前交、结束块之后不再交块,是适配器要守的约定;适配器抛错由运行时补一个 error 或 aborted 的结束块
- 为什么不边流边记
- 游离的 Session:只供读取,不进表,没有 Agent
- Agent 没有自己的 id
- 预设服务必须躲在 isolate realm:leakedServices 发现预设往 root realm 发服务,mountPreset 直接拒绝
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 原子发布用 tmp(wx 0o600)+ link()+unlink(),而非 rename(),防并发覆盖
- 写一半崩了,已写的数据也不坏
- 远端 helper 用同一套本地实现:SandboxedFileSystem、LocalSubprocessRuntime、LocalSandboxProvider
- 同一个运行时,在另一台主机上
- 运行时 owner、持久的来历、同进程的发起者,三种关系不占用 id
- Agent 没有自己的 id
- 运行时守卫服务 InvariantRegistry:register 即占名,重复注册直接抛错;每个包的 install 跑在自己的 child fiber
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 运行时在适配器边界改写请求副本:文件、纯文本模型的图、工具增减、别家的回放状态
- 请求离开进程之前
- 运行中重新叠层
- 插件树是一层层补丁叠出来的
- 账本两类消息刻意分家:agent-message/relay(孩子的话)与 subagent-settled/notice(runtime 旁白)
- Agent 之间的消息:send_message 的直邻路由
- 真子进程真协议:ACP adapter 用 cordis Loader boot 真实 agent bin,经 ACP JSON-RPC over stdio 驱动,不是进程内假对象
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 证据自证:每个场景自带足够的落盘证据证明模型可见输出与文件系统效果,不采信 agent 自己的报告
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 直邻通信:驻留子→父、父→子;非驻留子发给父直接 UNAUTHORIZED
- Agent 之间的消息:send_message 的直邻路由
- 只有 allowed-once 放行,而且只放这一次;approval/asked 和 approval/decided 只进日志,模型只看到那个调用的结果
- 另一头有没有人
- 只有派发重叠:放不放行、结果策略都按单子顺序一个个跑,放行这一关停下来等,后面的调用都开始不了
- 几个工具能不能一起跑
- 只有三个 wire 方法:initialize、session/prompt、shutdown;会话在首次 session/prompt 时惰性创建
- stdio 上,程序对程序的 JSON-RPC
- 只有循环组装提示词,每一步在 pre-step 里重拼一次,同一步的重试沿用同一份文字
- 系统提示词也是一条消息
- 重来回到这一步开头:重走 agent/request 和 prepareCall,不再写 user/message,从改过的日志重新推出消息
- 每一次失败都有下文
- 重选走 recompose → emit tools/change,工具 schema 换了要通知依赖它的东西
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 注册表把参数定成存得成 JSON 的冻结快照;溢出成无穷大的数和负零存不成,调用直接收成出错的结果,不经过放行和结果策略
- 拦下坏参数的不止一层
- 注册表在主体之前把调用方的信号并回来,包装换掉信号也断不了这一轮的取消
- 同时在跑的调用共用着什么
- 桌面默认端口 19387(区别于 Web 的 3080),进程内转发应用 HTTP 请求到已认证 Web Host
- 桌面壳里,装着整个运行时
- 桌面应用是包着完整 dsh Web 应用的 Electron 壳:RunAsNode 子进程跑共享 profile runner,主窗口加载 dsh-app://app/
- 桌面壳里,装着整个运行时
- 子调用调度与原生循环同一套规则:提交序、head-of-line、exclusive 屏障、maxParallel,注册表变化时重新分类
- 程序在子进程里,工具在宿主上
- 字段整值替换,config 不合并
- 插件树是一层层补丁叠出来的
- 自改边界:宿主用 write/edit 改自己的技能文件时,observeHostMutation 把这次写记入 observed 集合
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 组边跑边切:独占的单独一组;能并行的往后延伸,开始每个之前再问一次,碰到第一个不能并行的就停;同时在跑的最多 maxParallelToolCalls 个,默认 10
- 几个工具能不能一起跑
- 作用域链:Web 的会话把 Agent 挂到它那一版 preset 下面,子 Agent 加入父 Agent 挂的那一版;headless 的 Agent 没有上一级
- 工具表是按 Agent 算出来的
- abort 即 cancelled:用户撤销提问,请求结算为 cancelled,不留下半截审批
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- ACP:独立 process/session/model,permission 默认 reject 自动应答不浮提示
- 另一个产品里的 Agent,当你的子 Agent
- activation 副作用:pause/block/complete 一律 disarm,只有 resume armed,edit 保持
- Goal 的相位机、revision CAS 与轮次预算
- activation 进程本地:armed/disarmed 不落盘,GoalProjection 故意不含它
- Goal 不是状态对象,是一串可折叠的事件
- Agent 层反向 teardown:machine.cancel({kind:''disposed''}) → whenIdle → scope.dispose → handle.close → detach → untrack
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- Agent 的 id 就是它驱动的 Session 的 id
- Agent 没有自己的 id
- Agent inbox 是唯一 turn 队列:编排服务不建 Task、不建中间包装,只往 inbox 投
- Agent 之间的消息:send_message 的直邻路由
- Agent.cancel(cause):默认 inbox.clear + abort 进行中 phase;dispose 路径 keepInbox:true 保留收件箱
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- agent() 并发槽 FIFO:默认 min(16, cores-2),排队等槽不无限生成;三道上限 AGENT_CAP/ITEM_CAP/syncTimeout
- 工作流编排:脚本如何编排一批 Agent
- agent/request-error 是瀑布:每一层可以交回 retry 接手,可以调 next() 先听里层的,也可以不往里问、直接交回空;最后没人要重来,就抛出 LlmError,这一轮以 error 收场
- 每一次失败都有下文
- AgentPresetRegistry 是一个 TypertRemoteService:preset 不是磁盘目录发现,而是插件用 AgentPreset 行注册进来的声明
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- agents 与 sessions 两张表都以 SessionId 为键
- Agent 没有自己的 id
- always 不看码、不限次数、先问里层;碰上永远不会好的错会一直重来到有人取消,随附的配置没有用它
- 每一次失败都有下文
- append-only 日志是唯一事实源;Surface fold 在浏览器安全的子路径里把事件折成可见消息块
- 日志是事实,对话是投影
- append() 是唯一入口:没有 update、没有 delete、没有 splice,纠错只能靠追加更正事件
- 会话里没有状态,只有一本只追加的流水账
- appExit 缺失时插件直接抛错——headless 不自己决定进程何时结束,它只请求退出
- 命令行里,问一句话就退出
- ask 必须落在开放 turn 内:turn/start 未闭合时才允许挂起等人,越界即拒
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- assertAdoptable 是接管闸门:拒跑在 agent preset 下的会话、拒 subagent/forked 会话、拒 cwd 缺失或不符的会话
- 命令行里,问一句话就退出
- BlockAssembler 容忍缺开始和结束的块,以 block-end 为准,关上以后的增量不理,没收到 finish 按正常停止算
- 为什么不边流边记
- blockedReason:lower-kebab code + 非空 message,随快照落盘
- Goal 的相位机、revision CAS 与轮次预算
- bound() 的预算会计:先按最坏情况预留 GAP 与 notice 的 token,再决定原文留多少
- 工具输出太大时,全文落盘,上下文只留一张书签
- buildForkSeed = 父前缀 + end-seed{inherited:true} + openTurnClosers{forked}
- 断点、分叉与压缩:不重写历史的三种接管
- bundle 层、profile 层、home 层、命令行 overlay 与遥测开关
- 插件树是一层层补丁叠出来的
- cancel 与 dispose 是两个方向:cancel 自上而下中止传播,dispose 自下而上收敛释放
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- ChildLock 按 childId 串行化投递/释放/销毁,失败不传染下一个调用者
- Agent 之间的消息:send_message 的直邻路由
- Claude Code:官方 Agent SDK 起 CLI,权限默认 dontAsk
- 另一个产品里的 Agent,当你的子 Agent
- clear 墓碑:revision+1 不删历史,goal 置空但 lastRef 保留
- Goal 的相位机、revision CAS 与轮次预算
- Codex:包内固定命令 app-server --stdio,先 initialize 再 thread/start 建临时线程后才 publish,权限默认 never
- 另一个产品里的 Agent,当你的子 Agent
- compaction/start 同步相邻追加即持久锁;失败恰好补一次 compaction/end{error},故意留 unmatched 可察觉
- 断点、分叉与压缩:不重写历史的三种接管
- Connection 层管浏览器认证(dsh-auth cookie/HMAC)、Host/Origin 信任、请求信封与精确 Fetch 路由
- 浏览器到运行时,中间没有大表
- ConnectionController 指数退避重连,generation 就绪帧带 Host home
- 浏览器到运行时,中间没有大表
- contain() 兜底:脚本钩子丢的 promise 挂 noop 回收,宿主不被 unhandled rejection 带走
- 工作流编排:脚本如何编排一批 Agent
- create 特例:revision 必须 1、phase 必须 active、roundsStarted 必须 0、当前 goal 要么没有要么已 complete
- Goal 不是状态对象,是一串可折叠的事件
- credentialKey 只认标识符形状:REF_PATTERN 要求 ^[A-Za-z_][A-Za-z0-9_]*$,不是随便一段文本都算引用
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- DeepSeek 适配器把中性历史拼成 Messages 请求体,发出前核对工具调用和结果的配对
- 请求离开进程之前
- deepseek-official 和 deepseek-account 是同一套适配器实现的两个实例:线格式和扩展字段相同,凭证、出错时的改写、模型发现和设置各自分开,凭证每次请求现取
- 请求离开进程之前
- delegationDepth:会话头单调地板 + runtime 可选加深
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- deliveryId 只作痕迹,不做内置去重:重复投递由规则自己判断
- 一条投递,一个根会话
- deriveEventMessage 是逐字透传:user/system/developer/assistant/tool 五类映射,其余事件投影成 null
- 模型看到的历史,是现折出来的
- deriveMessages() 只投影新节点,contentGeneration 变了才整份重建,交出冻结的快照
- 日志只增不减,历史有进有出
- displayFailure 对 AUTH 码屏蔽凭据原文,只留 code——诊断留在日志,UI 不留
- 日志是事实,对话是投影
- dispose = inbox.close(() => finishDisposal):memoized 共享事务,"拆两遍"观察到同一个 quiescence
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- dispose 幂等:摘 abort 监听 → 本地取消 → 后端 teardown 到静默
- 另一个产品里的 Agent,当你的子 Agent
- doc 同步 gate 群:doc-typecheck/docs-site-build/verify-doc-graphs/verify-md-links/verify-type-equiv/verify-cordis-catalog
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- doc-sync gate:20+ 文档验证 gate,跑已生成产物与源码的结构比对
- 从一个 commit 到下一版:这本书怎样更新并收束
- drain 三兄弟:drain(全树)/drainDescendants(按父链)/drainChildren(精选),之后 admission 闸门 DRAINING
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- enforcement 分 full/partial:partial 不等于 full,要绝对边界的调用不能当 full 用
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- env 显式层叠在凭据擦除后副本,环境是显式给的,不是隐式继承的
- 另一个产品里的 Agent,当你的子 Agent
- fiber 与它的六个状态
- 插件跟着它等的服务起落
- findProjectRoot 向上找 .git/package.json:项目级能力根锚定在仓库根,不是当前 cwd
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- finishDisposal child-first:先 cancel 并并行 dispose 全部 ownedChildren,再 whenIdle、flushFinalState、capture、handle.dispose
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- flattenLineage 按父子关系缩进,孤儿降级 root、成环告警,顺序不重排
- 日志是事实,对话是投影
- fold 即校验:replay 解码器同时是 append 期 write gate
- Goal 不是状态对象,是一串可折叠的事件
- followup、steer、inject 都经 send 写入,差别在进哪个列表、唤不唤醒
- 插话等下一步,排队等下一轮
- fork 四拒绝码:SESSION_NOT_FOUND / SESSION_NOT_LIVE / SESSION_ALREADY_EXISTS / INVALID_BOUNDARY
- 断点、分叉与压缩:不重写历史的三种接管
- FTS5 双表:persisted_docs 常驻虚拟表与 temp.live_docs 临时虚拟表,活会话内容默认不进全文索引
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- fused AbortSignal:调用方取消、owner fiber 卸载、工厂 teardown 三路合成,永不挂死后端
- 断点、分叉与压缩:不重写历史的三种接管
- Gateway 层只管分发:invoke() 一元调用、stream() 流式方法、descriptor 解析与 zod 校验
- 浏览器到运行时,中间没有大表
- generation 用 users 引用计数:最后一个 joined Agent 离开且树已 retired,collect 才 dispose 这一代
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- header 冻结,之后的变化记在日志里
- Agent 没有自己的 id
- headless 的树里挂着 Gateway,却没有把请求送到它面前的 connection 与 Web 服务器
- Web 隔着网关等请求,headless 跑完就退
- headless 的一次运行独占一段日志区间
- Web 隔着网关等请求,headless 跑完就退
- headless 是同一个 Agent 运行时的一次性面孔:commander 解析 task/--json/--session-id,publish 一个 headlessStartup 服务,runner 惰性消费它
- 命令行里,问一句话就退出
- home 层压过 profile 层:机器级偏好对所有 profile 生效
- cordis.yml 组合:空根与五层 patch 栈
- host 是唯一计算点:客户端只存整值、按 seq 合并,不做域折叠;新投影域零客户端代码
- 日志是事实,对话是投影
- host bindings 是唯一回桥:begin/startChild/childResult/disposeChild/progress,真孩子走 ctx.subagents.start
- 工作流编排:脚本如何编排一批 Agent
- initialize 是就绪边界:先 await loader 再配 provider/model/reasoningEffort,然后才置 initialized=true
- stdio 上,程序对程序的 JSON-RPC
- invariant companion 是包级守卫:每个 workspace 包要么发 ./invariant companion,要么 README 写清省略理由
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- job 记在发起调用的 Agent 名下:活过这次调用和这一轮,Agent 撤下时被停
- 命令可以比它的调用活得久
- LLM 调用前 assertUsableApiKey:空 key 或含非法字符直接报错,且错误消息不回显 key 本体
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- llm/stream 监听器能观察、包一层、整个接下调用,改不了请求
- 请求离开进程之前
- materializeFromRealm:vm 域值过界只能是 lossless JSON——class 实例/稀疏数组/symbol 键/bigint 全拒
- 工作流编排:脚本如何编排一批 Agent
- maxParallelToolCalls 设成 1,日志的先后和全部独占时一样;池子按组现建,别的 Agent、子 Agent、run_code 的程序各有各的队列
- 同时在跑的调用共用着什么
- mcp-client 是一个 Cordis 插件,inject=['tools']:按 server 名注册一个 MCP server 连接,把它的工具同步进全局工具表
- 外部进程的工具,怎样进全局工具表又不撞名
- MessageFeedback 是日志事件不是历史:feedback/message-put 标注"Log-only human feedback; never enters model history"
- Telemetry 是观测侧车,不是第二个会话引擎
- minimal preset 和 sdk-minimal 的 bash 是一个 Agent 一个常驻 shell:跨调用、跨轮,超时、被停就整个重置
- 命令可以比它的调用活得久
- mutationToolName:知道是哪个工具动了技能,才能把"宿主写"和"外部改"区分开
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- Network 层只放 HTTP(S)、URL 长度封顶、禁内嵌凭证、同源才跟随重定向、不带浏览器 ambient cookie
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- nextMutationTime:Math.max(Date.now, updatedAt) 钳住时钟回拨
- Goal 的相位机、revision CAS 与轮次预算
- Notifier 微任务/动画帧批,受控输入 notifyNow 同步通知,防 React 把 caret 弹回末尾
- 日志是事实,对话是投影
- one-shot vs continuable:终止式委派 vs 可冷启恢复的会话
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- openTurnClosers 双原因:interrupted(崩溃恢复)与 forked(中切分叉)共用算法,只差措辞与 turn/end reason
- 断点、分叉与压缩:不重写历史的三种接管
- packages 下挂在这个瀑布上的只有三个监听器:llm-retry 按码,compaction-basic 接 CONTEXT_WINDOW_EXCEEDED,compaction-image-offload 接 IMAGE_OFFLOAD_REQUIRED;组合挂了哪个,决定哪种失败会被重来
- 每一次失败都有下文
- patch 语义:整行替换 config(不 merge),行顺序不承载语义,activation 由服务可用性驱动
- cordis.yml 组合:空根与五层 patch 栈
- pending:选了但未生效的模式,配对 command/done 结算
- 目标之下的三件套——plan、todo、schedule
- persistContiguous:ensureLease → assertContiguous → 先修 torn-tail / 重写 recoveredTail → persistBatch → 推进 cursor
- 写一半崩了,已写的数据也不坏
- plan-mode:二进制投影 {active, pending},plan/mode 事件 + /plan 命令生命周期
- 目标之下的三件套——plan、todo、schedule
- prepareCall 让模型信息和派发取自适配器配置的同一代,句柄只能用一次,请求配置必须和冻结的逐项相同
- 请求离开进程之前
- PresetDefinition = {id, name?, description?, order?, plugins: Cordis entry list}:一组子插件声明就是一个预设
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- profile 简写与保留名
- dsh 启动器管到哪里为止
- profile runner 接管进程生命周期
- dsh 启动器管到哪里为止
- ProjectionDefinition 是一份纯函数契约:key + stateSchema + init + apply + wire + stateVersion
- 事件是流水,状态是折叠出来的投影
- ProjectionValueStore 每会话存两类行:sequenced(高 seq 胜)与 cached(持久化快照视图,让位 sequenced)
- 日志是事实,对话是投影
- prompt 强制 initialized、跨 await 两次断言活 Agent、经附件库接纳编码图片
- stdio 上,程序对程序的 JSON-RPC
- provider 失败只作废该层缓存并 warn,不炸整个收集;只有可收集时才写 cacheable 项
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- PTC 模式把模型面折叠成一个 run_code:别的工具只能从程序里调,直接调就报错;both 模式才保留原生入口
- 程序在子进程里,工具在宿主上
- publicToolName 给外部工具加 server 前缀防撞车:超 64 字符或含非法字符时截短后拼 12 位哈希
- 外部进程的工具,怎样进全局工具表又不撞名
- Python 侧 DeepSeekHarness 是 context manager:Popen 拉起 server、initialize 握手、Session.run 收集通知到 final 响应
- 两根语言,同一条线
- readHeader 四态:current / migration-required / unsupported / malformed,只读首行不碰事件体
- 旧会话打开时,版本号说了算
- readSession 是重放验证不是读取:corpus.load 全量事件后 Session.create 重放,能跑完才返回快照
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- redactSecrets 在日志层兜底:对象里 role('secret') 的字段 walk 到即替换成 RedactedSecret,不进日志
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- register 只查输出格式;原样登记的工具(比如 MCP 工具)参数格式没人查,由工具自己处理
- 拦下坏参数的不止一层
- resolve 三级优先级:request.mode ?? session override ?? defaultMode
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- resolveChildDepth = parent.depth + 1,超过 maxDepth 抛 SubagentDepthError
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- result 永不 reject:脚本跑完 completed、炸了 error、取消 cancelled,全部走 stopReason
- 工作流编排:脚本如何编排一批 Agent
- resume 三件事:write 夺门(排除并发)、冷读物理合法日志、interruptedTurnClosers 补尾 turn
- 断点、分叉与压缩:不重写历史的三种接管
- retainContent 头尾双向保留,中间插入 GAP 占位,omittedBytes/omittedImages 驱动 notice
- 工具输出太大时,全文落盘,上下文只留一张书签
- return guidance 只在 send_message 工具在场时注入,孩子才知道要主动发结果
- Agent 之间的消息:send_message 的直邻路由
- revision CAS 牌:每次变更恰好 +1,错牌 GOAL_STALE_REVISION
- Goal 不是状态对象,是一串可折叠的事件
- revision CAS:每次 durable 变更恰好 +1,对牌错 GOAL_STALE_REVISION
- Goal 的相位机、revision CAS 与轮次预算
- run 一了结就把子调度全部中止并排干,图片结果经 deferContext 带回,模型历史只记外层
- 程序在子进程里,工具在宿主上
- run_code 不归任何一层:不能登记、不能写进过滤条件,只放给呈现方式不是 native 的 Agent
- 工具表是按 Agent 算出来的
- run_code 自己的参数也由 defineTool 查;程序里的调用先要存得成 JSON,再走同一条路,被拒时程序收到 ToolCallError
- 拦下坏参数的不止一层
- run() 先 await loader 再取 agents/sessions,缺服务就静默返回;空白 sessionId 直接抛错
- 命令行里,问一句话就退出
- runtime-closure 兜底:部署 manifest 必须含 preset 引用的每个插件与每个必需 workspace peer,否则 cordis 加载时才炸就晚了
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- Sandbox 三模式:read-only / workspace-write / danger-full-access,默认 read-only 是 fail-safe
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- schedule CAS 更新:expected 整条旧记录对牌
- 目标之下的三件套——plan、todo、schedule
- schedule miss 三码:not_found / ended / conflict
- 目标之下的三件套——plan、todo、schedule
- schedule/change:版本化变更事件,六种记录 kind
- 目标之下的三件套——plan、todo、schedule
- seed 契约:isSeeded 必须显式 seed 与 inheritedEventCount;end-seed{inherited:true} 标记切分点
- 断点、分叉与压缩:不重写历史的三种接管
- seenGoalIds:建过的 id 永不复用,clear 后重建也不许同名
- Goal 不是状态对象,是一串可折叠的事件
- send_message 是全局唯一的控制面工具:薄适配把参数交给 ctx.subagents.sendMessage,不自带路由与授权
- Agent 之间的消息:send_message 的直邻路由
- server 名是受管资源:activeServerNames 是 WeakMap<ctx, Set>,同名 server 在同一上下文里二次注册直接拒绝
- 外部进程的工具,怎样进全局工具表又不撞名
- server instructions 被包一层、截到 32KB,作为该 server 工具的附加说明喂给模型
- 外部进程的工具,怎样进全局工具表又不撞名
- Session 的 id 只在 header 里存一份
- Agent 没有自己的 id
- Session 的心脏是 private readonly log:一个只追加、永不修改、永不删除的事件数组
- 会话里没有状态,只有一本只追加的流水账
- session companion 的记账本:每会话 SessionTrace 记 lastSeq/openTurn/openStep/nextTurn/nextStep/pendingCalls
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- session.create 是建或接管
- Web 隔着网关等请求,headless 跑完就退
- Session.create 与 Session.fromRestore:snapshot 模式逐事件快照深冻,detached/shared-frozen 模式零拷贝只校验
- 断点、分叉与压缩:不重写历史的三种接管
- SessionProjectionRegistry 监听 session/created 初始化 cell、session/event 急切 drive 每个注册单元
- 事件是流水,状态是折叠出来的投影
- ShellExecutor extends Service:super(ctx,'shell') 把抽象类注册成 ctx.shell
- 能力接入的接缝:Service、Provider 与 Consumer
- shutdown 是 memoized 单次退出:flush 传输 → dispose 根 fiber → exit(0),竞态只退出一次
- stdio 上,程序对程序的 JSON-RPC
- SkillFilesystem 把六个磁盘根目录按固定 rank 排序成候选层:项目 .dsh/skills=100、项目 .agents=200、自定义=300、用户 .dsh=400、用户 .agents=500,运行期注册=250,打包技能=600
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- SkillRegistry 用 scopeChainOf 作 collect 缓存键:工作区变了缓存键就变,跨会话串味被结构上排除
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- snake_case 与 camelCase 的边界在客户端:Python 的 max_tokens 映射成线上的 maxTokens,reasoning_effort→reasoningEffort
- 两根语言,同一条线
- sourceEventSeqs 是因果链:压缩节点必须把它遮蔽的每个旧节点都列进来源
- 每条事件都装在带五格字段的信封里
- spill 不是截断而是搬运:全文落盘 + 模型视野只留带 locator 的书签
- 工具输出太大时,全文落盘,上下文只留一张书签
- SSH 执行环境把文件系统、子进程和沙箱整体搬到远端:一条 OpenSSH 控制主控承载管理面,数据面每进程每通道独立转发
- 同一个运行时,在另一台主机上
- start() 预检在父进程:validateMeta、assertBodyParses(只 parse 不执行)、provider 注册检查,失败同步抛 WorkflowError 且没有 run
- 工作流编排:脚本如何编排一批 Agent
- startsRequestSeries 让这一步另起一组请求,只在第一次尝试时生效
- 被取走的消息不一定进历史
- stdout/stderr 通道再套一层 RPC 传输出快照,stdin/control 是原始 duplex
- 同一个运行时,在另一台主机上
- subagent 身份投影:null ⟺ 无合法 descriptor
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SUBAGENT_DESCRIPTOR_VERSION=3:字段集精确锁定,加字段必升版本
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- subagent/descriptor:孩子出生时写的身份事件,log-only,过 compaction
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- subagentCatalog:直接孩子目录,剔除 fork 继承事实
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- subagentTiming:settledMs + open turn 窗口
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- surface replace 不变量:sourceEventSeqs 覆盖全部遮蔽节点、tool/result 只改 content、节点 0 system 保护
- 断点、分叉与压缩:不重写历史的三种接管
- SurfaceManager 增量折叠:validateNext 预演计划,_processDelta 把新事件尾追折进表面状态
- 模型看到的历史,是现折出来的
- surfaceOp 只有两种取值:append 追尾,或 {op:replace,startSeq,endSeq} 替换一段表面节点
- 每条事件都装在带五格字段的信封里
- SystemPromptProjection 决定系统提示是 append 新节点还是 replace 旧 head
- 模型看到的历史,是现折出来的
- telemetry 开关:DSH_TELEMETRY_DISABLED 任何非空值都关(off-by-mistake 优先)
- cordis.yml 组合:空根与五层 patch 栈
- todo/write:整条列表快照 last-wins,TodoItem 无 id 无优先级
- 目标之下的三件套——plan、todo、schedule
- TodoItem 三态:pending / in_progress / completed
- 目标之下的三件套——plan、todo、schedule
- tool-cordis 是只读运行时勘探:cordis_inspect_list/query 让模型读 Host/Client 的服务与 schema,但不能改
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- tool-pairing 平衡:N 个节点 N+1 个切分点,增量 BalanceCache 挂在 surface.replaceGeneration 上
- 断点、分叉与压缩:不重写历史的三种接管
- tool-skill 在 pre-step 阶段先于任何工具加载注入完整目录清单:"This complete catalog replaces every earlier available-skills list"
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- ToolArgsError(INVALID_ARGS)收成普通的出错结果,经过结果策略、按顺序提交;码记进 tool/result,模型只读到文字
- 拦下坏参数的不止一层
- tools/execute 上的包装同时处在几个调用里:只许换 exec.signal,要换回,交回之前要停稳
- 同时在跑的调用共用着什么
- traceEvent 替换链:一条被替换的 assistant/message 可沿 replacement 指针追出 replacementChain 与派生事件集 derivedEventSeqs
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- traceSession 血缘:沿 parentSession 向上走,遇到环抛 SESSION_QUERY_INVALID_LINEAGE,断链停在最近可解析祖先
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- Trust 层 user-approval:ApprovalPolicy 只有 ask/never 两值,ask 在没有 answerer 时 fail-closed 落 unavailable
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- TS 侧 DeepSeekHarness 是 AsyncDisposable:spawn 子进程、memoized initialize 握手、HarnessSession.run 推一个 prompt 并等到整轮静止
- 两根语言,同一条线
- turn/end 写在 finally 里;max-tokens 粘住以后,后面的步改不回来;turn/end 不带用量
- 每一次失败都有下文
- unmatched start 越过最新 end-seed 边界即豁免(属于上一生命周期)
- 断点、分叉与压缩:不重写历史的三种接管
- useProjection(key) 是第五个框架钩子座,身份稳定 face,组件订阅一次
- 日志是事实,对话是投影
- v3→v4 特例:裸迁移拒绝开工,必须 createSessionFormatCatalogWithChildren 显式传入历史 child facts
- 旧会话打开时,版本号说了算
- vm.Context 只挂六个冻结全局:agent/parallel/pipeline/phase/log/args——脚本拿不到任何 Node API
- 工作流编排:脚本如何编排一批 Agent
- wake 纪律:disposal 永不 latch,teardown 不等任何模型 turn
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- watchSettlement:孩子自然跑完,poke+idle 后 runMaintenance 里长出一次 dispose
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- Web 的 Agent 归会话控制器所有,留在主机进程里
- Web 隔着网关等请求,headless 跑完就退
- Web 让每个会话挂自己的 preset,headless 用进程级的一套工具与提示词
- Web 隔着网关等请求,headless 跑完就退
- Web 由浏览器回答,请求经 api-remotes 转出,后连上的浏览器也会收到;ACP 由客户端回答;headless 和 SDK 没有应答者;sdk-minimal 不挂审批服务
- 另一头有没有人
- Web 在主机层关掉按 Agent 组合的工具行,改由 preset 挂;三个 preset 里的 subagent 装在每个 Agent 自己那一层
- 工具表是按 Agent 算出来的
- webhook 会话是不从对话开始的根会话:外部投递经 provider 层认证、规则翻译成 Session 请求、事务建会话
- 一条投递,一个根会话
- WebSocket mux 一条 socket 多路复用逻辑流:open/item/end/cancel 帧,uplink inbox 有界字节数
- 浏览器到运行时,中间没有大表
- whole-value event rule:apply 不感兴趣就必须返回同一个 state 引用(Object.is),零下游工作
- 事件是流水,状态是折叠出来的投影
- Windows 打包先扫描 PE 内容,保留有效供应商签名、签署未签名代码,密封运行时哈希前先过硬件令牌签名
- 桌面壳里,装着整个运行时
- workflow 是脚本编排:父写一段脚本声明 parallel/pipeline,由 runtime 起一批子 Agent,不是父自己跑多回合
- 工作流编排:脚本如何编排一批 Agent
- WorkflowEngine 契约:result 永不 reject,workflow/end 恰好一次,listener 失败 contained
- 能力接入的接缝:Service、Provider 与 Consumer
- _pendingPlan 缓存 validateNext 预演的计划,事件真正入账时 applySurfacePlan 落地
- 模型看到的历史,是现折出来的
- /plan 命令:发起 → 等 command/done → plan/mode 落账
- 目标之下的三件套——plan、todo、schedule
- 表和最近一条请求头不同:写 request/header(change)→ 名字有增减再写 developer/message → 折叠成 toolHistory → 适配器按 toolUpdate 投影
- 工具表是按 Agent 算出来的
- 裁剪产物经 saveText 写入会话私目录,notice 追加在保留内容末尾
- 工具输出太大时,全文落盘,上下文只留一张书签
- 插件登记:register → 按调用者的作用域落进全局层或某一层 → 插件卸载或作用域销毁时撤掉
- 工具表是按 Agent 算出来的
- 插件加载:具体子类作为 plugin 注册 → cordis 调 super(ctx, name) 挂载到 Context
- 能力接入的接缝:Service、Provider 与 Consumer
- 常驻 shell:第一次调用时建终端 → 每条命令包上两个标记写进去 → 等到结束标记 → 超时、被停、shell 退出就重置 → Agent 撤下时关掉
- 命令可以比它的调用活得久
- 撤下 Agent:disposed 取消清空当时排着的消息 → 等它停稳(这期间才到的留在队列里)→ 关闭写句柄排干日志;恢复后留下的仍在队列,不自动开跑
- 插话等下一步,排队等下一轮
- 撤下:取消驱动者并等它停下 → 撤作用域 → 关写句柄 → 删 Agent → 删 Session(宣告过的补发 disposed)
- Agent 没有自己的 id
- 程序里一次工具调用:快照参数 → 入队 → 分类(parallel/exclusive)→ pre-execute → body → post-execute → 记 tool/ptc-dispatch → 结果回程序
- 程序在子进程里,工具在宿主上
- 出错的结果:tools/post-execute → tool/result 记错误的名字和码 → 模型下一步读到 Error: 开头的文字
- 拦下坏参数的不止一层
- 初始化:宿主 spawn 子进程 → initialize(await loader、解析 provider adapter、llm.resolveCallConfig)→ 返回
- stdio 上,程序对程序的 JSON-RPC
- 创建:agents.create 随机 session-id、meta.cwd=进程目录、setup 注入当前模型选择
- 命令行里,问一句话就退出
- 创建:sessions.prepare(不进表)→ 认领写句柄(不写盘)→ ReactLoopAgent 与作用域 → setup / commit() → 补存发布前的事件 → sessions.enter → agents.enter → session/created → agent/created
- Agent 没有自己的 id
- 打开旧文件:inspectSessionFormatVersion 只读首行 → readHeader 分类
- 旧会话打开时,版本号说了算
- 登记:插件挂载时 registerAdapter(路由名, 适配器);设置变了用 replace 整组替换
- 请求离开进程之前
- 登记:段落、上下文、工具提供者、变量,按全局、preset、Agent 分层
- 系统提示词也是一条消息
- 等:任意一个派发落定 → 移出池子 → 提交能提交的 → 看一眼取消 → 再补池
- 同时在跑的调用共用着什么
- 调 LLM 前:assertUsableApiKey 拦空/非法 key
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 调度器:参数解析一次,空的当 {},解析不了留原文 → 写 tool/call
- 拦下坏参数的不止一层
- 定义工具:defineTool 编译参数格式 → 超出子集就抛错;register 查输出格式
- 拦下坏参数的不止一层
- 断开:child close → fail() → 所有 pending/active 拒绝、socket 销毁、SIGTERM/SIGKILL、删控制目录;远端 outcome 未知
- 同一个运行时,在另一台主机上
- 断线:onclose → scheduleReconnect(退避、计数)→ 达上限放弃;ready 稳定窗口重置计数
- 外部进程的工具,怎样进全局工具表又不撞名
- 对话:session/prompt → 边收通知边等 → 拿到 result / final
- 两根语言,同一条线
- 对话:session/prompt → getOrCreateSession(惰性建 Agent)→ followup → 边跑边推通知 → 返回结果
- stdio 上,程序对程序的 JSON-RPC
- 发现:roots() 枚举六个根 → discoverRoot 逐根解析绝对路径/可写性 → parseSkillFile 读 frontmatter → 按 rank 进候选层
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 翻译完成:restoreReleasedV4Artifact + validateInstalledCurrentSessionArtifact(Session.fromRestore detached)
- 旧会话打开时,版本号说了算
- 放行:step/start → agent/request → prepareCall → system/message → user/message(第一次尝试)→ request/header → 发出请求
- 被取走的消息不一定进历史
- 放行后:step() 渲染一次 → 每次尝试:agent/request、prepareCall → 按路由和组决定追加、不写或归并 → system/message → user/message(第一次尝试)→ request/header、request/context → 从日志推出消息
- 系统提示词也是一条消息
- 放行那一关:tools/pre-execute 答 ask → 审批服务 → allowed-once 才往下走 → 守卫 → 派发
- 另一头有没有人
- 分发:快照 + deepFreeze → 遍历注册表 → kind 匹配的规则各起一次调用 → HTTP 先回 202,不等规则结算
- 一条投递,一个根会话
- 父 agent 委派 → resolveChildDepth → 写 descriptor → 孩子入目录
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 根上下文 → Loader → 根 Include → 每一行的 fiber
- 插件跟着它等的服务起落
- 更新:electron-updater 下载 → mandatory-update 覆盖层 → lock 后新请求 503、已接纳的排干 → 安装前等待清理完成 → 重启装新签名资源
- 桌面壳里,装着整个运行时
- 共享:Agent join 到 standing scope → generation.users++;离开 → users--,归零且 retired 才 collect
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 构造 seed 时按 append 同一条不变量校验,seq 必须从 0 连续
- 会话里没有状态,只有一本只追加的流水账
- 构造:SessionCorpus(ctx, persistedReadConcurrency) + SessionObservationReader(ctx, preparedSessionCacheSize),三个旋钮全部安全整数校验
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 关闭窗口:隐藏并继续跑任务,Windows 首次隐藏先确认;托盘或 Dock 召回
- 桌面壳里,装着整个运行时
- 管理请求:request(method, params, schema) → 4 字节长度前缀帧 → helper 端 handler 分发 → 结果/错误帧回客户端,zod 校验后交调用方
- 同一个运行时,在另一台主机上
- 规则:run(delivery, signal) → null 不建会话;返回 Session 请求则进 createWebhookSession
- 一条投递,一个根会话
- 孩子 resume:取 header.delegationDepth 作地板,不会退化成顶层
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 后台 job:登记 → 当场交回编号 → 输出每 150 毫秒抽进输出环 → 了结 → 送通知或不送 → 主人撤下时删记录
- 命令可以比它的调用活得久
- 恢复:按 id 打开日志来写 → 读出事件 → 给中断的 turn 补收尾事件 → 用存下的 header 重建 Session → 同一次 setup 与发布,来源记为 resume
- Agent 没有自己的 id
- 回答结束:DeepSeek 适配器解析每个调用的参数 → 不是对象就整条回答 MALFORMED_RESPONSE
- 拦下坏参数的不止一层
- 回答写进日志 → 挑出工具调用 → executeToolCalls(一步一次)
- 几个工具能不能一起跑
- 会话挂 preset:setup 里 mount → Agent 的钥匙挂到这一版下面;还没开过一轮时可以改挂
- 工具表是按 Agent 算出来的
- 会话建立:钉进默认预设 → permission/preset、sandbox/mode、approval/policy;/permission 切换:先记预设,再只写变了的旋钮,策略变了旁注一句
- 另一头有没有人
- 加载:崩溃留下的尾巴先补收尾 → 种子逐条走同一套核对 → 清单重建
- 日志只增不减,历史有进有出
- 加载:模型调 skill(skillName) → list 查到 → 查 isModelInvocable → ctx.skills.get(...) → 正文进上下文
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 监听:chokidar 事件到 → isRelevantWatchEvent → 查 observed,命中则跳过重载
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 建 detached checkout → 确认干净 → 五维度比较 → 四类证据刷新 → 最小更新闭包 → doc-sync gate → 真实 dogfood
- 从一个 commit 到下一版:这本书怎样更新并收束
- 建连:mkdtemp 控制目录 → ssh -T -M -S(BatchMode/StrictHostKeyChecking/ForwardAgent=no)→ 远程 node --disable-sigusr1 helper → SshRpcPeer → hello 握手 → 双摘要校验 → 心跳
- 同一个运行时,在另一台主机上
- 交出以后:llm/stream 监听器 → adapterStream 改写副本 → 适配器
- 请求离开进程之前
- 接管:resolveAgent → 要 sessionPersistence 与 sessionQuery → assertAdoptable → observe/resume → 再 assertAdoptable 一次
- 命令行里,问一句话就退出
- 解析:commander 读 task 位置参数与 --json/--session-id,jsonRequested 扫描停在 -- 并跳过 --session-id 的值
- 命令行里,问一句话就退出
- 进组 → 补池:按单子的顺序开始,开始前重问模式 → 写 tool/call、过放行、派发出去 → 提交能提交的、看一眼取消 → 池满、单子到头、碰上不能一起跑的或被取消就停
- 同时在跑的调用共用着什么
- 静态工厂分 create(snapshot 拷贝)与 fromRestore(借用冻结事件)两条路径
- 会话里没有状态,只有一本只追加的流水账
- 开会话:follow 基线带 asOfSeq → seed() 清 cached、按 seq 落值
- 日志是事实,对话是投影
- 开始一个调用:写 tool/call → tools/pre-execute、审批、守卫(按顺序)→ 派发(可重叠)→ 结果进格子
- 几个工具能不能一起跑
- 勘探:模型调 cordis_inspect_list → cordis_inspect_query 读服务/事件/schema,全程只读
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 空闲时:followup 或 steer → send → splice 进列表 → 开驱动 → turn/start → 第一步认领(到这里都在这次调用返回之前)→ agent/pre-step
- 插话等下一步,排队等下一轮
- 控制通道:子进程先发 ready,宿主回 boot(代码+命名空间+限额),程序发 call/log/done,宿主对每个 call 回一条 reply
- 程序在子进程里,工具在宿主上
- 历史 child 收集:historicalSessionFormatCatalog(currentVersion=3)只读不递归发布
- 旧会话打开时,版本号说了算
- 连接:createTransport(stdio/streamable-http)→ connect → initialize → listTools → syncChain 串行
- 外部进程的工具,怎样进全局工具表又不撞名
- 列表:session.list 快照带 title 投影 → flattenLineage → 侧栏缩进树
- 日志是事实,对话是投影
- 另起一组:startsRequestSeries 或历史被替换 → 提示词归并回第一个系统节点、工具整份声明 → request/header 记 series 或带 startsSeries
- 被取走的消息不一定进历史
- 流:Upgrade → /api/remote.mux → admit(peer) → handleUpgrade → mux.open → 双向帧
- 浏览器到运行时,中间没有大表
- 流结束:error / aborted → assistant/attempt(第 12 章);否则 blocks() → assistant/message(带 stream)→ committed 的 end 帧
- 为什么不边流边记
- 落盘:writeFileAtomic 0600/0700;assertOwnerOnly 启动时查权限
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 没人重来:抛出 LlmError → step/end → turn/end(error)
- 每一次失败都有下文
- 每次尝试:new AssistantStreamAttempt → start 帧 → 每片块:时刻、快照、压紧记录、组装器、chunk 帧
- 为什么不边流边记
- 每次尝试开头:agent/request → prepareCall(查表、适配器绑定同一代配置、校验、补默认值、冻结)→ 按能力写日志 → 推出消息、冻结 → 句柄的 stream()
- 请求离开进程之前
- 每次访问 nodes / deriveEventMessage 前先 _processDelta 把尚未折叠的尾部事件折掉
- 模型看到的历史,是现折出来的
- 每条 session/event 触发 drive:apply(state,event) 得到新 state,再算 view 与上一次 Object.is 比较
- 事件是流水,状态是折叠出来的投影
- 每一步开头:拼提示词 → 工具提供者按 Agent 算可见表 → 按呈现方式筛 → 排序
- 工具表是按 Agent 算出来的
- 每一步认领之后:assemble(合并、排序、求值、瀑布、complete)→ 渲染运行时上下文 → agent/pre-step
- 系统提示词也是一条消息
- 模型调 send_message → 工具 execute 取 exec.agent → ctx.subagents.sendMessage(sender, target, blocks, {signal})
- Agent 之间的消息:send_message 的直邻路由
- 默认关闭:maxInlineTokens 缺省时 spill-policy 不挂任何钩子
- 工具输出太大时,全文落盘,上下文只留一张书签
- 派发:tools/execute 上的包装一层层换信号 → 注册表并回调用方的信号 → 主体 → 摘掉中继、各层换回
- 同时在跑的调用共用着什么
- 配置:写 ${NAME} → credentialRef 校验形状 → 存引用不存值
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 启动:客户端 spawn dsh 子进程 → initialize 握手(memoized,只一次)
- 两根语言,同一条线
- 启动:Electron 主进程 → RunAsNode 子进程跑 desktop-host → runProfile(profile: desktop, port 19387) → Host boot → IPC ready(url, injections) → 主窗口加载 dsh-app://app/
- 桌面壳里,装着整个运行时
- 启动:findProjectRoot 定项目根 → .dsh/skills 作为 rank100 根进候选层 → 随仓库装载
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 前台调用(没有这个服务或登记被拒):拼请求 → 执行器按时限起进程 → 到点由截止信号杀掉
- 命令可以比它的调用活得久
- 前台调用(有后台任务服务):拼请求 → 登记 job → 在启动函数里起进程 → 等到 timeoutMs → 跑完撤记录交回 / 到点交回编号 / 被停就停掉 job
- 命令可以比它的调用活得久
- 请求:窗口 HTTP 经 Electron 转发到已认证 Web Host,丢弃连接级响应头,插件包响应标 no-store;WebSocket 只对所属窗口带凭据
- 桌面壳里,装着整个运行时
- 请求:浏览器 POST /api/<ns>/<method> → Connection 认证/信任 → Gateway claimsEndpoint → invoke → 业务 Remote
- 浏览器到运行时,中间没有大表
- 取消:不再开始 → 等已开始的 → 按顺序提交 → 给剩下的每个调用补一对 → 这一轮以 aborted 收场
- 几个工具能不能一起跑
- 取消:cancel() 中止这一轮的信号 → 下一个检查点抛出 → step/end → turn/end(aborted,带取消原因)
- 每一次失败都有下文
- 热更:chokidar 监听(depth:1, awaitWriteFinish)→ isRelevantWatchEvent 过滤 → 命中技能变化 → 重收层、失效缓存、重发清单
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 认领 → 组装系统提示词 → 运行时上下文快照 → agent/pre-step → 拒绝(blocked)/ 第一步为空(completed)/ 放行(step/start)
- 被取走的消息不一定进历史
- 日志:redactSecrets walk,role(secret)→RedactedSecret
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 审计:list/resolve 每次读都 auditRows,等 Host tree settle 后再报 broken/pending
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 审批服务:不在一轮里就抛错 → 写 approval/asked → 中止、never 直接定 → approval/request 上的应答者 → 写 approval/decided
- 另一头有没有人
- 失败:assistant/attempt → agent/request-error →(llm-retry)llm/retry → 等 → llm/retry-started → 回到这一步开头
- 每一次失败都有下文
- 失败降级:计价/写盘/归属任一缺失都 warn 并返回 undefined 保留原文
- 工具输出太大时,全文落盘,上下文只留一张书签
- 事务:resolveRequest → permissionPresets.resolve → agentPresets.resolve/acquireScope → workspaceRegistry.create → agents.create(webhook-uuid) → attachSession → 权限/标题 → followup 首条消息
- 一条投递,一个根会话
- 收集:collectFresh 先全局后链上覆盖 → compareIndexedCandidates 按 rank→providerOrder→localOrder 决胜 → renderSkillContent 拼正文
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 收敛:resident.delete → releaseSlot → notifySettlement → releaseOwnership → settle → throw failure
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 收尾:规则卸载 hide → abort → drain active;投递接纳后会话归普通生命周期
- 一条投递,一个根会话
- 收尾:dispose → generation.close(5s 超时)→ 摘 effect、释放 serverName
- 外部进程的工具,怎样进全局工具表又不撞名
- 收尾:finally 里追加 turn/end → 走完了步且收件箱不空就开下一轮,否则驱动停下;崩溃后加载时补 interrupted
- 每一次失败都有下文
- 收尾:run 因任何原因了结 → runController.abort → 中止在飞子调用、放弃未开始的 → 排干日志任务 → 外层结果回模型
- 程序在子进程里,工具在宿主上
- 收尾:sessions.flush → summarize → stdout/JSON 收尾 → appExit(0/1)
- 命令行里,问一句话就退出
- 收尾:settleRunResult 永不 reject;cancelled → aborted;dispose 幂等 teardown 到进程静默
- 另一个产品里的 Agent,当你的子 Agent
- 收尾:shutdown → setImmediate 后 disposeAndExit → flush → rootFiber.dispose → exit(0)
- stdio 上,程序对程序的 JSON-RPC
- 收尾:watchSettlement 到 ready → finishDisposal → notifySettlement:announced 闸门 → 父 closing inject / idle queue / 忙 steer,失败仅 warn
- Agent 之间的消息:send_message 的直邻路由
- 提交(按顺序):tools/post-execute → 写 tool/result → 附带的消息接到 next-step → 看 concludesTurn
- 几个工具能不能一起跑
- 提问:ask_user_question → user-questions/request 上的应答者 → 回答作为工具结果进历史
- 另一头有没有人
- 停:terminate → SIGTERM → 宽限 → SIGKILL;子进程服务等整个范围空了才放手;DSH 进程退出时同步 SIGKILL
- 命令可以比它的调用活得久
- 停下:cancel → 默认清空(outcome: canceled)或 keepInbox 保留 → 中止当前活动 → 收尾时按记下的唤醒重开驱动
- 插话等下一步,排队等下一轮
- 同步:Phase1 fetch(listTools refresh、重名拒绝)→ Phase2 swap(旧工具摘除、新工具挂入、失败回滚)
- 外部进程的工具,怎样进全局工具表又不撞名
- 投递:GitHub 推事件 → POST 路由 → 校验方法/内容类型/有界 body → 验签名 → 解析 payload → 组 VerifiedWebhookDelivery → dispatch
- 一条投递,一个根会话
- 推导:buildRequest → deriveMessages()(只投影新节点,或整份重建)→ 冻结 → 连同工具定义和工具历史组成请求
- 日志只增不减,历史有进有出
- 退出:⌘Q/菜单/托盘 → IPC quit-inspection → Host 报活动任务与定时提醒 → 无则静默退出,有则原生询问框
- 桌面壳里,装着整个运行时
- 退出:dispose/close → shutdown → flush → 子进程退出
- 两根语言,同一条线
- 违例:检查失败抛 InvariantError(code=INVARIANT),连带包名一起暴露,不是匿名断言
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 文本读取:fs.stream 建迭代器(上限 128)→ fs.next 逐块 → fs.streamClose 关;整文本传输上限 8 MiB,超了报 FS_TOO_LARGE
- 同一个运行时,在另一台主机上
- 问第一个没开始的调用的 executionMode → 独占:单独一组;并行:往后延伸,开始每个之前再问
- 几个工具能不能一起跑
- 武装后挂两个 prepend 钩子:tools/post-execute 面向模型、tools/ptc-dispatch-log 面向 PTC 日志
- 工具输出太大时,全文落盘,上下文只留一张书签
- 消费方构造:inject 数组里的服务全部就位后才实例化 Consumer
- 能力接入的接缝:Service、Provider 与 Consumer
- 写入:append 事件经 encodeCurrentEvent 落 session.v4.jsonl
- 旧会话打开时,版本号说了算
- 写入:Session.append → 核对数据和标记,对着当前清单算好这次变化 → 进日志
- 日志只增不减,历史有进有出
- 写失败:整批 concat 回队首 + drainPaused=true,等 session/flush 重试
- 写一半崩了,已写的数据也不坏
- 卸载:fiber 名下的 effect 倒序启动、同时撤销;同一个 effect 里 yield 的几步倒序、一步等一步
- 插件跟着它等的服务起落
- 新 commit 落地:判断是否改变叙事;不改变则可选,改变则必须
- 从一个 commit 到下一版:这本书怎样更新并收束
- 选:select(agent, id) → 查 turnBoundary,已开轮则锁;否则 recompose 绑定 → append agent-preset/selected
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 一次 run_code:解析参数 → 升权审批(可选)→ 建 run 级 abort → 枚举可见工具成绑定 → runtime.resolve 补 cwd/时限/策略 → 起进程 → 握手 → 跑程序
- 程序在子进程里,工具在宿主上
- 一次尝试:agent/request、prepareCall →(只在第一次)user/message → 请求头 → 读流 → assistant/message 或 assistant/attempt
- 每一次失败都有下文
- 一次远程进程:process.prepare(发流端点)→ 客户端逐通道 connectStream(forward -L + TLS-PSK)→ 全部认证后 process.start → 跑 → process.done(退出码/输出快照/spill)→ process.terminate(清理)
- 同一个运行时,在另一台主机上
- 一轮当中:steer 或 inject → next-step → 最近的步边界被认领;followup → next-turn → 这一轮正常收尾后开下一轮
- 插话等下一步,排队等下一轮
- 运行:whenIdle → followup(task) → whenIdle,stderr 流式吐推理
- 命令行里,问一句话就退出
- 运行时:CredentialProvider 按引用取值进内存 → LLM 用 → 用完不落盘
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 运行中:projection 帧 apply(key,value,seq) → 高 seq 胜 → Notifier 批 → React 重渲染
- 日志是事实,对话是投影
- 运行中:requestCancel(runAbort + wire.interrupt);child.done 提前结束 → processFailure → 扁平化为 stopReason error
- 另一个产品里的 Agent,当你的子 Agent
- 折叠:追加接到清单末尾;顶替换下一段;消息投影改内容、不动清单
- 日志只增不减,历史有进有出
- 之后:输出到上限就结束这一步;有工具调用交给调度器;否则这一步完成
- 为什么不边流边记
- 重连:断 → 指数退避 → 新 generation → ready 帧带 host.home
- 浏览器到运行时,中间没有大表
- 重启读:readStoredLog stat 身份 → decodeStoredLog 截 torn tail → 重建 cursor
- 写一半崩了,已写的数据也不坏
- 重问的答案变成不能 → 补池停在这个调用前面 → 之后每次补池再问它 → 池子跑空时还是不能,这一组才结束 → 外层循环再问它,它领头开下一组
- 同时在跑的调用共用着什么
- 主体里的升权:按当前模式跑、被沙箱拒 → 模型带 sandbox_permissions 和 justification 重试 → approveEscalation → 审批服务 → 这一次按批下的模式跑
- 另一头有没有人
- 注册:AgentPreset 行 apply → agentPresets.register(definition) → activate → mountPreset 建常驻树
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 注册:apply() → resolveReconnectPolicy → ctx.effect reserve serverName → startConnection → await connection.ready
- 外部进程的工具,怎样进全局工具表又不撞名
- 注册表:快照、冻结 → tools/pre-execute、审批、守卫 → tools/execute 上的包装 → defineTool 查格式 → 主体查自己的规矩
- 拦下坏参数的不止一层
- 注入:tool-skill pre-step listener(先于 catalog listener)→ renderCatalogMessage → pre-step listener 把清单放进 system prompt 区
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 子 agent:composeFrom 继承父 preset 的同一代,不另起一份
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 自改:write/edit 工具写技能文件 → fs/observed 事件 → observeHostMutation 记入 observed
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- ACTIVE →(服务离开、换了提供方、重启、换配置、被移除)UNLOADING → PENDING / LOADING / FAILED / DISPOSED
- 插件跟着它等的服务起落
- agent():readAgentOptions → acquireSlot(FIFO) → startChild binding → subagents.start → race(run.result, abort) → finally run.dispose
- 工作流编排:脚本如何编排一批 Agent
- append() 七层顺序:组 surfaceMetadata → snapshotJsonValue → 重入检查 → deepFreeze → validateSessionEventData → surfaceManager.validateNext → push+派发
- 会话里没有状态,只有一本只追加的流水账
- appReady 之后:hmr 监听补丁文件 → readProfilePatches → reconcileProfilePatches
- 插件树是一层层补丁叠出来的
- argv → 展开简写 → parseDshArgs → DshInvocation → 按 mode 分发
- dsh 启动器管到哪里为止
- assertSourceEventReferences:来源必须是数组、不可空、不可重复、必须早于自身 seq、必须覆盖全部被遮蔽节点
- 每条事件都装在带五格字段的信封里
- block:active→blocked + resolveBlockReason + disarm
- Goal 的相位机、revision CAS 与轮次预算
- boot:Loader → prepare → mountRootInclude → 等待结算 → auditStartupEntries
- dsh 启动器管到哪里为止
- boot:readProfilePatches 读五层 → provide profileContext → 挂载 PluginPackages
- cordis.yml 组合:空根与五层 patch 栈
- build 期:package-invariants 扫 packages/*/*,无 companion 查 README 句式,有 companion 查 exports/files/tsconfig/tsdown 四件套
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- bundle 层 → profile 的 cordis.patch.yml → $DSH_HOME/cordis.patch.yml → --patch → 遥测开关
- 插件树是一层层补丁叠出来的
- cancel:先赢先得 abort controller + 全部 disposeChild;startChild 与取消竞速(started after cancellation)
- 工作流编排:脚本如何编排一批 Agent
- clear:墓碑 commit,返回 tombstone ref
- Goal 的相位机、revision CAS 与轮次预算
- clear:写墓碑事件,state.goal 置空、roundsStarted 归零
- Goal 不是状态对象,是一串可折叠的事件
- Codex 启动:spawn [execPath, bin, app-server, --stdio] → wire.initialize → wire.startThread(spec.cwd) → 发布
- 另一个产品里的 Agent,当你的子 Agent
- compaction:validateSurfaceRegion → inspectEntryState → append start → summarize → commit replace → append end
- 断点、分叉与压缩:不重写历史的三种接管
- complete:transition(三活相位→complete, disarm)
- Goal 的相位机、revision CAS 与轮次预算
- composeProfile:组合 patch 栈 + 冻结 overlays
- cordis.yml 组合:空根与五层 patch 栈
- continuable 冷启:从 descriptor 重建 composition
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- create:resolveCreateGoal → prepareMutation → commitSnapshot 写 goal/change
- Goal 不是状态对象,是一串可折叠的事件
- DeepSeek 适配器:卸下的图换占位、核对预算 → 现取凭证 → 序列化、核对配对 → 准备扩展字段 → POST → 2xx 后确认送达、追加水位 → 读 SSE
- 请求离开进程之前
- DeepSeek:2xx 后确认扩展 → parseSse → translate → 七种块(message_stop 时先 usage 后 finish)
- 为什么不边流边记
- deliverFollowup:locks.run(childId) → 无驻留 coldResume / closing 已开等 disposal / 否则 submitAdmitted + announced=true
- Agent 之间的消息:send_message 的直邻路由
- disposal:先给仍在接管的会话补 shutdown 运维记录,再 await backend.shutdown(),失败只 warn 不拖垮应用 teardown
- Telemetry 是观测侧车,不是第二个会话引擎
- dispose(activation) → inbox.close(finishDisposal) → 共享关闭事务
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- drain:标记 draining → 等 materializations → 找 roots → disposeRoots
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- drive():runtime.run(program=data:URL guest, bindings=workflowHost, cwd=工作区根, timeoutMs=null, signal)
- 工作流编排:脚本如何编排一批 Agent
- edit:expectCurrent(ref) 对牌 → revision+1 → commitCurrent
- Goal 不是状态对象,是一串可折叠的事件
- FactoryOwnership.dispose:accepting=false → teardown.abort → 等全部 liveAgents + startupTasks
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- fiber unload:effect 注册的 cleanup 统一 abort 全部 live runs
- 能力接入的接缝:Service、Provider 与 Consumer
- finally:controller.abort → dispose 全部已发孩子 → drain pending → liveAgents 统一补 cancelled agent-end
- 工作流编排:脚本如何编排一批 Agent
- finishDisposal:cancel(parent) → Promise.all(children dispose) → whenIdle → flushFinalState → capture → handle.dispose
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- foldSurface 把一串事件离线折成当前表面,SurfaceManager 增量维护同一个状态
- 每条事件都装在带五格字段的信封里
- fork 归属:fork 继承的反馈属于父会话;isFeedback 过滤 seq < inheritedEventCount 的 seed 事件
- Telemetry 是观测侧车,不是第二个会话引擎
- fork:子 id 占用检查 → 快照复制 → boundary 校验 → buildForkSeed → create(isSeeded, parentSession, inherited+1)
- 断点、分叉与压缩:不重写历史的三种接管
- guest:runWorkflowGuest(begin) → WorkflowExecution.drive(vm.Context + 包裹脚本) → 逐事件 flush progress
- 工作流编排:脚本如何编排一批 Agent
- headless:headless-startup 提供 headlessStartup → runner 等 loader.await() → agents.create,或者 runner 自己的 resolveAgent 核对后 agents.resume → whenIdle → 记下 firstSeq → followup → whenIdle → sessions.flush → 打印答案 → appExit
- Web 隔着网关等请求,headless 跑完就退
- live 捕获:session/created → adopt(沿 handoffCursor 补历史);session/event → captureEvent(structuredClone body)→ redact → backend.emit
- Telemetry 是观测侧车,不是第二个会话引擎
- loadLayeredEnv:进程继承 > 调用目录 .env > $DSH_HOME/.env
- dsh 启动器管到哪里为止
- MessageFeedback.put:resolveNote → 目标事件存在性 → ifVersion CAS → 相同值 no-op 不发事件 → append feedback/message-put
- Telemetry 是观测侧车,不是第二个会话引擎
- migration-required:createRestore 编译 v0→v1→v2→v3→v4 迁移流,逐行 transformEvent/transformRun
- 旧会话打开时,版本号说了算
- Network:URL 预检(协议/长度/凭证)→ 同源判断 → 重定向是否跟随
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- on-demand 捕获:不挂持续监听,captureSession(session, throughSeq?) 显式从 cursor+1 读 canonical log 回放
- Telemetry 是观测侧车,不是第二个会话引擎
- pause:transition(active→paused, disarm)
- Goal 的相位机、revision CAS 与轮次预算
- pause/resume/complete/block:transition 走相位表
- Goal 不是状态对象,是一串可折叠的事件
- PENDING →(声明的服务都有处于 ACTIVE 的提供方)LOADING →(求值配置、跑完回调)ACTIVE
- 插件跟着它等的服务起落
- planSurfaceEvent 先按当前表面状态算出替换区间,再校验来源引用、工具改写、system-head 改写
- 每条事件都装在带五格字段的信封里
- post-execute 先 await next() 拿下游决策,再对成品内容 bound
- 工具输出太大时,全文落盘,上下文只留一张书签
- prepareProfile:loadProfile → 重写空根 cordis.yml
- cordis.yml 组合:空根与五层 patch 栈
- provider.start:resolveChildCwd(config cwd → 父会话 cwd,无则拒绝)→ spawn 子进程(共享子进程服务)→ 初始化 → 发布 run handle(localAgent undefined)
- 另一个产品里的 Agent,当你的子 Agent
- ptc 模式装配:加载 runtime → 校验语言 → run_code 的 description/parameters 按语言 flavor 发射 → SDK 段按调用方可见工具生成
- 程序在子进程里,工具在宿主上
- push 后立即 eventsSnapshot=undefined,下一次全量读才重建
- 会话里没有状态,只有一本只追加的流水账
- push 前先收集 session/event 回调,push 后再同步派发,失败不污染 log
- 会话里没有状态,只有一本只追加的流水账
- readProfilePatches → boot → mountRootInclude → prepareProfilePatches(叠一次、准入、装进一条 insert)→ 根 Include → Loader
- 插件树是一层层补丁叠出来的
- readSession:corpus.load → Session.create(..., currentSessionMessageProjections) → structuredClone header + snapshots 返回
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- record:boot 真子进程 → 按脚本喂输入 → graceful shutdown flush → harvest JSONL → 归一化 → 提交快照
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- refresh:产品行为合法变更后整体重录快照,diff 即变更审查
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- replay:boot 真子进程 → 喂同样输入 → mock LLM 按录制剧本吐 chunks → 对比归一化 stdout 与 session log
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- resume:open(id,'write') → read(0) → closers 非空则 append → prepare(seed+closers) → setupAndPublish('resume')
- 断点、分叉与压缩:不重写历史的三种接管
- resume:resumable 集合检查 + 预算检查 + armed
- Goal 的相位机、revision CAS 与轮次预算
- retained.text 与当前快照相同就不产新消息,避免无谓的 replace
- 模型看到的历史,是现折出来的
- run 期:各包 companion 注入 invariants 服务,register(包名, installer) 占名,install 在 child fiber 里挂检查
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- runProfile:装代理 → composeProfile → 关机与 fail-loud → boot(prepare) → 提交 appReady
- dsh 启动器管到哪里为止
- RuntimeContextProjection 构造时反向扫描找最近 retained user/message,之后监听 session/event 增量更新
- 模型看到的历史,是现折出来的
- Sandbox:consumer 边界 resolve 策略(三级优先级)→ provider.confine 包 argv → 后端执行;无后端即 SANDBOX_UNAVAILABLE
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- schedule 创建:选 kind → 算 scheduledAt → schedule/change 落账
- 目标之下的三件套——plan、todo、schedule
- sendMessage:精确 live sender 校验 → assertAdmitting → 路由判定(parentSession 命中 sendToParent,否则 deliverToChild steer)
- Agent 之间的消息:send_message 的直邻路由
- sendToParent:ACTIVATION_CLOSING 闸门 → PARENT_UNAVAILABLE 闸门 → createAgentMessage → sendWaking(steer)
- Agent 之间的消息:send_message 的直邻路由
- session/created(且 seq===0)为每个注册单元建 UnitCell,state=init(header,inheritedEventCount)
- 事件是流水,状态是折叠出来的投影
- session/event → enqueueLive(structuredClone push,arm 200ms timer)
- 写一半崩了,已写的数据也不坏
- start():validateMeta → assertBodyParses → resolveProvider → 构造 WorkerInit/WorkerLimits → new PtcWorkflowRun → 发 workflow/start
- 工作流编排:脚本如何编排一批 Agent
- start(name, request):expectProvider(NO_PROVIDER)→ assertCapabilities(UNSUPPORTED_CAPABILITY)→ 深度/输出 schema 校验 → descriptor 快照 → provider.start(resolved)
- 另一个产品里的 Agent,当你的子 Agent
- stateVersion bumped 后,旧版本持久化投影缓存行直接作废而非前向套用
- 事件是流水,状态是折叠出来的投影
- submitAdmitted:同步跨过 admission 截断 → authorizeLineage → acquireOwnership → inbox.deliver → wake
- Agent 之间的消息:send_message 的直邻路由
- surfaceOpOf 在 append 点把关:非 surface 类型不许带 surfaceOp/sourceEventSeqs,surface 类型必须带
- 每条事件都装在带五格字段的信封里
- timer 到或 session/flush → drainBuffered → persistContiguous
- 写一半崩了,已写的数据也不坏
- todo 工具:append todo/write,fold 取最新
- 目标之下的三件套——plan、todo、schedule
- traceEvent:定位事件 → 沿 eventSources/replacement 双向收链 → replacementChain + derivedEventSeqs
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- traceSession:byId 建表 → parentSession 向上走 → ancestrySeen 检测环 → 断链记录 unresolvedParentId
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- Trust:tool 发起 ask → 校验在开放 turn 内 → 挂起等 answerer → decide 落 allowed-once/rejected;abort 落 cancelled
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- UnitCell 缓存 views[prev,current] 两份原始结果,引用没变就不发布变更
- 事件是流水,状态是折叠出来的投影
- watchSettlement:poke → whenIdle → settlementState(ready) → runMaintenance(dispose)
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- Web 按 id 取 Agent:resolveAgent → 活的直接用 → 否则 observeSession 读日志、agents.resume(同一个 id 只恢复一次)→ 再核子 Agent 归属
- Web 隔着网关等请求,headless 跑完就退
- Web 新建:startSession → sessions.create → remote.session.create → POST /api/session/create → Host 围栏与 cookie → Gateway 认领并核对参数 → SessionController 的 create → ensureSession → createOrAdopt → agents.create 或 agents.resume → 挂进工作区 → 返回 sessionId
- Web 隔着网关等请求,headless 跑完就退
- __dsh_program__
- 程序在子进程里,工具在宿主上
- --session-id
- Web 隔着网关等请求,headless 跑完就退
- -M -S
- 同一个运行时,在另一台主机上
- -O forward -L
- 同一个运行时,在另一台主机上
- /permission
- 另一头有没有人
- 19387
- 桌面壳里,装着整个运行时
- AbortController
- 插话等下一步,排队等下一轮 每一次失败都有下文
- ABORTED
- 几个工具能不能一起跑 同时在跑的调用共用着什么
- ABORTED_BEFORE_DISPATCH
- 几个工具能不能一起跑 另一头有没有人
- ACCOUNT_SIGN_IN_REQUIRED
- 请求离开进程之前
- acquireSlot
- 工作流编排:脚本如何编排一批 Agent
- ACTIVATION_CLOSING
- Agent 之间的消息:send_message 的直邻路由
- ACTIVATION_TEARDOWN_FAILED
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- ACTIVE
- 插件跟着它等的服务起落
- activeServerNames
- 外部进程的工具,怎样进全局工具表又不撞名
- adapterDefaults
- 请求离开进程之前
- adapterStream
- 请求离开进程之前
- additionalContexts
- 插话等下一步,排队等下一轮 几个工具能不能一起跑
- additionalProperties
- 拦下坏参数的不止一层
- AGENT_CAP
- 工作流编排:脚本如何编排一批 Agent
- agent-instructions
- 插话等下一步,排队等下一轮
- agent-message
- 插话等下一步,排队等下一轮
- agent-preset/locked
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- agent-preset/selected
- Agent 没有自己的 id 工具表是按 Agent 算出来的 一组插件声明,怎样变成一个可共享的 Agent 配置
- Agent.cancel
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- agent.ctx
- 工具表是按 Agent 算出来的
- agent.session
- Agent 没有自己的 id
- agent/assistant-stream
- 为什么不边流边记
- agent/created
- Agent 没有自己的 id
- agent/disposed
- Agent 没有自己的 id
- agent/error
- 被取走的消息不一定进历史 每一次失败都有下文
- agent/inbox/claimed
- 插话等下一步,排队等下一轮
- agent/inbox/discarded
- 插话等下一步,排队等下一轮
- agent/inbox/inserted
- 插话等下一步,排队等下一轮
- agent/inbox/spliced
- 插话等下一步,排队等下一轮 被取走的消息不一定进历史 日志只增不减,历史有进有出
- agent/pre-step
- 插话等下一步,排队等下一轮 被取走的消息不一定进历史
- agent/request
- 被取走的消息不一定进历史 请求离开进程之前
- agent/request-error
- 每一次失败都有下文
- agent/status
- 被取走的消息不一定进历史
- agent/turn-stopping
- 插话等下一步,排队等下一轮 每一次失败都有下文
- AgentHandle
- Agent 没有自己的 id
- AgentLoop
- Agent 没有自己的 id
- AgentMessageSource
- Agent 之间的消息:send_message 的直邻路由
- AgentPresetRegistry
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- agents.create
- Agent 没有自己的 id Web 隔着网关等请求,headless 跑完就退
- agents.enter
- Agent 没有自己的 id
- agents.get
- Agent 没有自己的 id
- agents.resume
- Agent 没有自己的 id Web 隔着网关等请求,headless 跑完就退
- allowed-once
- 另一头有没有人
- analyzeEventLog
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- api-remotes
- 另一头有没有人
- app:web-surface
- 系统提示词也是一条消息
- applyEntryPatches
- 插件树是一层层补丁叠出来的
- applyGoalEvent
- Goal 不是状态对象,是一串可折叠的事件
- approval
- 插话等下一步,排队等下一轮
- approval/asked
- 另一头有没有人
- approval/decided
- 另一头有没有人
- approval/policy
- 另一头有没有人
- approval/request
- 另一头有没有人
- ApprovalOutcome
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- ApprovalPolicy
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- approveEscalation
- 另一头有没有人
- archived-session-gate
- 被取走的消息不一定进历史
- ASK_ABORTED
- 另一头有没有人
- ASK_CANCELLED
- 另一头有没有人
- ask_user_question
- 另一头有没有人
- assemble
- 系统提示词也是一条消息
- assertAdoptable
- 命令行里,问一句话就退出
- assertBodyParses
- 工作流编排:脚本如何编排一批 Agent
- assertCompactionInactive
- 断点、分叉与压缩:不重写历史的三种接管
- assertContiguous
- 写一半崩了,已写的数据也不坏
- assertOwnerOnly
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- assertSourceEventReferences
- 断点、分叉与压缩:不重写历史的三种接管
- assertSystemHeadRewrite
- 断点、分叉与压缩:不重写历史的三种接管
- assertToolResultRewrite
- 断点、分叉与压缩:不重写历史的三种接管
- assertUsableApiKey
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- assertUsableCwd
- 另一个产品里的 Agent,当你的子 Agent
- assistant/attempt
- 日志只增不减,历史有进有出 为什么不边流边记 每一次失败都有下文 拦下坏参数的不止一层
- assistant/chunk
- 为什么不边流边记
- assistant/message
- 日志只增不减,历史有进有出 为什么不边流边记
- AssistantStreamAccumulator
- 为什么不边流边记
- AssistantStreamAttempt
- 为什么不边流边记
- AsyncLocalStorage
- Agent 没有自己的 id
- attachSession
- 一条投递,一个根会话
- auditStartupEntries
- dsh 启动器管到哪里为止
- authenticateStream
- 同一个运行时,在另一台主机上
- auto-review
- 另一头有没有人
- BalanceCache
- 断点、分叉与压缩:不重写历史的三种接管
- bash-local
- 命令可以比它的调用活得久
- bash-sandbox
- 命令可以比它的调用活得久
- begin
- 工作流编排:脚本如何编排一批 Agent
- bindScopeParent
- 工具表是按 Agent 算出来的 一组插件声明,怎样变成一个可共享的 Agent 配置
- BlockAssembler
- 为什么不边流边记
- blocked
- 被取走的消息不一定进历史
- blocks()
- 为什么不边流边记
- bootstrapHash
- 同一个运行时,在另一台主机上
- bootstrapIncludes
- 插件树是一层层补丁叠出来的
- buildForkSeed
- 断点、分叉与压缩:不重写历史的三种接管
- BUNDLED_SKILL_RANK
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- cancel
- 插话等下一步,排队等下一轮 每一次失败都有下文
- catalogHistory
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- ChildLock
- Agent 之间的消息:send_message 的直邻路由
- childResult
- 工作流编排:脚本如何编排一批 Agent
- claim
- 插话等下一步,排队等下一轮
- closeInitiators
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- CodeRunFailedError
- 程序在子进程里,工具在宿主上
- collectConfigDumpLayers
- 插件树是一层层补丁叠出来的
- collectFresh
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- commit()
- Agent 没有自己的 id
- compact-checkpoint
- 日志只增不减,历史有进有出
- compaction-basic
- 每一次失败都有下文
- compaction-image-offload
- 每一次失败都有下文
- compactSurfaceRegion
- 断点、分叉与压缩:不重写历史的三种接管
- compareIndexedCandidates
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- complete
- 系统提示词也是一条消息
- completed
- 被取走的消息不一定进历史
- composeAgent
- Web 隔着网关等请求,headless 跑完就退
- composeProfile
- dsh 启动器管到哪里为止 cordis.yml 组合:空根与五层 patch 栈
- concludesTurn
- 几个工具能不能一起跑
- concludeTurn
- 几个工具能不能一起跑
- configuredAgentIdentities
- Agent 没有自己的 id
- connection.rpc.call
- Web 隔着网关等请求,headless 跑完就退
- ConnectionController
- 浏览器到运行时,中间没有大表
- contain
- Telemetry 是观测侧车,不是第二个会话引擎
- contentGeneration
- 日志只增不减,历史有进有出
- CONTEXT_WINDOW_EXCEEDED
- 每一次失败都有下文
- ControlPersist=no
- 同一个运行时,在另一台主机上
- cordis_inspect_list
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- cordis_inspect_query
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- createAgentMessage
- Agent 之间的消息:send_message 的直邻路由
- createExecutor
- 外部进程的工具,怎样进全局工具表又不撞名
- createOrAdopt
- Web 隔着网关等请求,headless 跑完就退
- createProcessDeepSeekHarness
- 两根语言,同一条线
- createProcessShutdown
- dsh 启动器管到哪里为止
- createRestore
- 旧会话打开时,版本号说了算
- createRunCodeTool
- 程序在子进程里,工具在宿主上
- createScope
- 工具表是按 Agent 算出来的
- createSessionFormatCatalog
- 旧会话打开时,版本号说了算
- createSessionFormatCatalogWithChildren
- 旧会话打开时,版本号说了算
- createSessionFormatV3ToV4
- 旧会话打开时,版本号说了算
- createSettlementMessage
- Agent 之间的消息:send_message 的直邻路由
- createWebhookSession
- 一条投递,一个根会话
- createWindowsTokenSigner
- 桌面壳里,装着整个运行时
- creations
- Web 隔着网关等请求,headless 跑完就退
- credentialKey
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- credentialRef
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- ctx.effect
- 插件跟着它等的服务起落
- ctx.get
- 插件跟着它等的服务起落
- ctx.inject
- 插件跟着它等的服务起落
- ctx.jobs
- 命令可以比它的调用活得久
- ctx.on
- 插件跟着它等的服务起落
- ctx.plugin
- 插件跟着它等的服务起落
- ctx.provide
- 插件跟着它等的服务起落
- ctx.shell
- 命令可以比它的调用活得久
- ctx.subprocess
- 命令可以比它的调用活得久
- ctx.systemPrompt
- 系统提示词也是一条消息
- ctx.terminals
- 命令可以比它的调用活得久
- currentInitiator
- Agent 没有自己的 id
- declare module
- 能力接入的接缝:Service、Provider 与 Consumer
- decodeGoalChange
- Goal 不是状态对象,是一串可折叠的事件
- deepseek-account
- 请求离开进程之前
- deepseek-official
- 请求离开进程之前
- DeepSeekHarness
- 两根语言,同一条线
- deepseekLlmApiExtensions
- 请求离开进程之前
- DEFAULT_MAX_INSTRUCTION_BYTES
- 外部进程的工具,怎样进全局工具表又不撞名
- deferContext
- 几个工具能不能一起跑
- deferLoading
- 工具表是按 Agent 算出来的
- DEFERRED_AGENT_OPTIONS
- 工作流编排:脚本如何编排一批 Agent
- defineSessionFormatMigration
- 旧会话打开时,版本号说了算
- defineTool
- 几个工具能不能一起跑 拦下坏参数的不止一层 同时在跑的调用共用着什么
- DELEGATED_CALLER
- 另一头有没有人
- delegationDepthOf
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- deliverFollowup
- Agent 之间的消息:send_message 的直邻路由
- deliverToChild
- Agent 之间的消息:send_message 的直邻路由
- deployment:persona-prefix
- 系统提示词也是一条消息
- deployment:persona-suffix
- 系统提示词也是一条消息
- deriveEventMessage
- 日志只增不减,历史有进有出
- deriveMessages
- 系统提示词也是一条消息 日志只增不减,历史有进有出
- desktop-host
- 桌面壳里,装着整个运行时
- developer/message
- 日志只增不减,历史有进有出 工具表是按 Agent 算出来的
- disableRenegotiation
- 同一个运行时,在另一台主机上
- discoverRoot
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- disposeChild
- 工作流编排:脚本如何编排一批 Agent
- disposed
- 插话等下一步,排队等下一轮
- DISPOSED
- 插件跟着它等的服务起落
- disposeInitiators
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- disposeRoots
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- docSyncLeafGates
- Invariant 目录文档化:CI 怎样逼每个包自带守卫 从一个 commit 到下一版:这本书怎样更新并收束
- dontAsk
- 另一个产品里的 Agent,当你的子 Agent
- drainChildren
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- drainDescendants
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- DRAINING
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- drainPaused
- 写一半崩了,已写的数据也不坏
- DSH_DESKTOP_NODE_EXECUTABLE
- 桌面壳里,装着整个运行时
- DSH_DESKTOP_UNSIGNED
- 桌面壳里,装着整个运行时
- DSH_PERMISSION_MODE
- 另一头有没有人
- dsh_plugin_packages
- 请求离开进程之前
- dsh_session_log
- 请求离开进程之前
- DSH_SNAPSHOT
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- DSH_SNAPSHOT_CHILD_FILES
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- DSH_TOOLS_MODE
- 工具表是按 Agent 算出来的
- DSH_WEB_URL
- 系统提示词也是一条消息
- dsh-app://app/
- 桌面壳里,装着整个运行时
- dsh-runtimes
- 桌面壳里,装着整个运行时
- dsh-session-snapshot
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- dsh-stream
- 同一个运行时,在另一台主机上
- DshInvocation
- dsh 启动器管到哪里为止
- DUPLICATE_ADAPTER
- 请求离开进程之前
- duplicate-service
- 能力接入的接缝:Service、Provider 与 Consumer
- ELECTRON_RUN_AS_NODE
- 桌面壳里,装着整个运行时
- electron-updater
- 桌面壳里,装着整个运行时
- enableRunInBackground
- 命令可以比它的调用活得久
- ensureSession
- Web 隔着网关等请求,headless 跑完就退
- epoch
- 插件跟着它等的服务起落
- errorChain
- 每一次失败都有下文
- exec.signal
- 同时在跑的调用共用着什么
- executeToolCalls
- 几个工具能不能一起跑
- executionMode
- 几个工具能不能一起跑 同时在跑的调用共用着什么
- exit_plan_mode
- 另一头有没有人
- ExitOnForwardFailure
- 同一个运行时,在另一台主机上
- expectCurrent
- Goal 的相位机、revision CAS 与轮次预算
- FactoryOwnership
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- FAILED
- 插件跟着它等的服务起落
- FEEDBACK_CATEGORIES
- Telemetry 是观测侧车,不是第二个会话引擎
- feedback/committed
- Telemetry 是观测侧车,不是第二个会话引擎
- feedback/message-put
- Telemetry 是观测侧车,不是第二个会话引擎
- FiberState
- 插件跟着它等的服务起落
- findProjectRoot
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- finishDisposal
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- FinishReason
- 为什么不边流边记
- firstSeq
- Web 隔着网关等请求,headless 跑完就退
- flattenLineage
- 日志是事实,对话是投影
- foldConsumedWork
- 被取走的消息不一定进历史
- foldGoal
- Goal 不是状态对象,是一串可折叠的事件
- foldSubagentDescriptor
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- foldSurface
- 日志只增不减,历史有进有出 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- follow
- Web 隔着网关等请求,headless 跑完就退
- followup
- Web 隔着网关等请求,headless 跑完就退 插话等下一步,排队等下一轮
- form
- 一条投递,一个根会话
- formatSpillNotice
- 工具输出太大时,全文落盘,上下文只留一张书签
- FS_STALE_VERSION
- 同时在跑的调用共用着什么
- fs/observed
- 同时在跑的调用共用着什么
- fuseToolSignals
- 同时在跑的调用共用着什么
- gateway/arguments-invalid
- Web 隔着网关等请求,headless 跑完就退
- gateway/service-unavailable
- Web 隔着网关等请求,headless 跑完就退
- GENERATION_CLOSE_TIMEOUT_MS
- 外部进程的工具,怎样进全局工具表又不撞名
- generation.users
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- getOrCreateSession
- stdio 上,程序对程序的 JSON-RPC
- getSectionOrder
- 系统提示词也是一条消息
- GOAL_CHANGE_VERSION
- Goal 不是状态对象,是一串可折叠的事件
- GOAL_STALE_REVISION
- Goal 不是状态对象,是一串可折叠的事件 Goal 的相位机、revision CAS 与轮次预算
- goal-round-driver
- 被取走的消息不一定进历史
- goal/change
- Goal 不是状态对象,是一串可折叠的事件
- GoalActivation
- Goal 不是状态对象,是一串可折叠的事件
- GoalBlockReason
- Goal 的相位机、revision CAS 与轮次预算
- GoalClearChangeMeta
- Goal 不是状态对象,是一串可折叠的事件
- GoalMessageSource
- Goal 不是状态对象,是一串可折叠的事件
- GoalPhase
- Goal 的相位机、revision CAS 与轮次预算
- GoalProjection
- Goal 不是状态对象,是一串可折叠的事件
- goalProjectionDefinition
- 事件是流水,状态是折叠出来的投影
- GoalSnapshot
- Goal 不是状态对象,是一串可折叠的事件
- handoffCursor
- Telemetry 是观测侧车,不是第二个会话引擎
- harness:identity
- 系统提示词也是一条消息
- HarnessClient
- 两根语言,同一条线
- HarnessSdkRequestMap
- stdio 上,程序对程序的 JSON-RPC
- HarnessSession
- 两根语言,同一条线
- hasDesktopActiveTasks
- 桌面壳里,装着整个运行时
- header.id
- Agent 没有自己的 id
- headerSeq
- 工具表是按 Agent 算出来的
- headless-runner
- Web 隔着网关等请求,headless 跑完就退
- headless-startup
- Web 隔着网关等请求,headless 跑完就退
- headlessStartup
- Web 隔着网关等请求,headless 跑完就退 命令行里,问一句话就退出
- helperHash
- 同一个运行时,在另一台主机上
- historicalSessionFormatCatalog
- 旧会话打开时,版本号说了算
- hooks-claude-code
- 被取走的消息不一定进历史
- hooks-codex
- 被取走的消息不一定进历史
- ifVersion
- Telemetry 是观测侧车,不是第二个会话引擎
- image/offload
- 日志只增不减,历史有进有出 每一次失败都有下文
- in-history
- 系统提示词也是一条消息
- includeRuntimeContext
- 系统提示词也是一条消息
- inheritedEventCount
- 旧会话打开时,版本号说了算
- inheritsParentContext
- 另一个产品里的 Agent,当你的子 Agent
- initializeProfileFromDefault
- dsh 启动器管到哪里为止
- inject
- 插件跟着它等的服务起落 插话等下一步,排队等下一轮
- inspectSessionFormatVersion
- 旧会话打开时,版本号说了算
- installFailLoud
- dsh 启动器管到哪里为止
- installInitialModelSelection
- 一条投递,一个根会话
- interrupt_agent
- 插话等下一步,排队等下一轮 Agent 之间的消息:send_message 的直邻路由
- interruptByParent
- 插话等下一步,排队等下一轮
- interrupted
- 被取走的消息不一定进历史 每一次失败都有下文
- interruptedTurnClosers
- 断点、分叉与压缩:不重写历史的三种接管
- INVALID_ARGS
- 拦下坏参数的不止一层
- INVALID_PREPARED_CALL
- 请求离开进程之前
- INVALID_TOOL_OUTPUT
- 拦下坏参数的不止一层
- InvariantError
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- InvariantRegistry
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- isConcurrencySafe
- 几个工具能不能一起跑 同时在跑的调用共用着什么
- isEnterableDirectory
- 另一个产品里的 Agent,当你的子 Agent
- isFeedback
- Telemetry 是观测侧车,不是第二个会话引擎
- isModelInvocable
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- isOwnedBy
- Agent 没有自己的 id
- isRelevantWatchEvent
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- ITEM_CAP
- 工作流编排:脚本如何编排一批 Agent
- job_kill
- 命令可以比它的调用活得久
- job_list
- 命令可以比它的调用活得久
- job_output
- 命令可以比它的调用活得久
- jobs-local
- 命令可以比它的调用活得久
- JsonChannel
- 程序在子进程里,工具在宿主上
- justification
- 另一头有没有人
- keepInbox
- 插话等下一步,排队等下一轮
- lastVerified
- 从一个 commit 到下一版:这本书怎样更新并收束
- LaunchEnvironmentSnapshot
- dsh 启动器管到哪里为止
- leakedServices
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- leaseMs
- 同一个运行时,在另一台主机上
- LEGAL_API_KEY
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- LIVE_WRITE_BATCH_MAX_DELAY_MS = 200
- 写一半崩了,已写的数据也不坏
- llm-replay
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- llm-retry
- 每一次失败都有下文
- llm.imageRequestPricing
- 工具输出太大时,全文落盘,上下文只留一张书签
- llm/retry
- 每一次失败都有下文
- llm/retry-started
- 每一次失败都有下文
- llm/stream
- 请求离开进程之前
- LlmError
- 每一次失败都有下文
- llmRetry
- 每一次失败都有下文
- LlmRuntime
- 请求离开进程之前
- load_workspace_dependencies
- 桌面壳里,装着整个运行时
- loader.await()
- Web 隔着网关等请求,headless 跑完就退
- LOADING
- 插件跟着它等的服务起落
- loadLayeredEnv
- dsh 启动器管到哪里为止
- loadProfileDirectory
- 插件树是一层层补丁叠出来的
- localAgent
- 另一个产品里的 Agent,当你的子 Agent
- lock.json
- 桌面壳里,装着整个运行时
- MALFORMED_RESPONSE
- 为什么不边流边记 拦下坏参数的不止一层
- materializeFromRealm
- 工作流编排:脚本如何编排一批 Agent
- MAX_SUBAGENT_DIAGNOSTIC_BYTES
- 另一个产品里的 Agent,当你的子 Agent
- max-tokens
- 每一次失败都有下文
- maxDepth
- 工具表是按 Agent 算出来的
- maxInlineTokens
- 工具输出太大时,全文落盘,上下文只留一张书签
- maxMessageBytes
- 程序在子进程里,工具在宿主上
- maxOutputBytes
- 程序在子进程里,工具在宿主上
- maxOutputChars
- 工具输出太大时,全文落盘,上下文只留一张书签
- maxParallelSubCalls
- 同时在跑的调用共用着什么
- maxParallelToolCalls
- 几个工具能不能一起跑 同时在跑的调用共用着什么
- maxPendingCalls
- 程序在子进程里,工具在宿主上
- mcp-client
- 外部进程的工具,怎样进全局工具表又不撞名
- MessageFeedbackService
- Telemetry 是观测侧车,不是第二个会话引擎
- META_INVALID
- 工作流编排:脚本如何编排一批 Agent
- MISSING_CREDENTIAL
- 请求离开进程之前
- MOCK_LLM_BEHAVIORS
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- MODEL_DOES_NOT_SUPPORT_IMAGES
- Agent 之间的消息:send_message 的直邻路由
- modelSelectionSettings
- 工具表是按 Agent 算出来的
- mountPreset
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- mountRootInclude
- 插件树是一层层补丁叠出来的
- mutationToolName
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- newSession
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- newSessionExpectError
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- next_notification
- 两根语言,同一条线
- next-step
- 插话等下一步,排队等下一轮
- next-turn
- 插话等下一步,排队等下一轮
- next()
- 被取走的消息不一定进历史
- nextMutationTime
- Goal 的相位机、revision CAS 与轮次预算
- NO_ADAPTER
- 请求离开进程之前
- NO_PROVIDER
- 另一头有没有人 另一个产品里的 Agent,当你的子 Agent
- NO_START_CAPABILITIES
- 另一个产品里的 Agent,当你的子 Agent
- node --disable-sigusr1
- 同一个运行时,在另一台主机上
- NodePtcRuntime
- 程序在子进程里,工具在宿主上 能力接入的接缝:Service、Provider 与 Consumer
- nodes
- 模型看到的历史,是现折出来的
- NOT_RESUMABLE
- Agent 之间的消息:send_message 的直邻路由
- note-too-large
- Telemetry 是观测侧车,不是第二个会话引擎
- Notifier
- 日志是事实,对话是投影
- notifySettlement
- Agent 之间的消息:send_message 的直邻路由
- observed
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- observeHostMutation
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- OMITTED_COMPANION_REASON
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- onExpiry
- 命令可以比它的调用活得久
- openTurnClosers
- 断点、分叉与压缩:不重写历史的三种接管
- outcome: 'canceled'
- 插话等下一步,排队等下一轮
- OutputLedger
- 程序在子进程里,工具在宿主上
- outputSnapshotFrameLimit
- 同一个运行时,在另一台主机上
- owner
- Agent 没有自己的 id
- package_allowlist
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- package_blocklist
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- package-invariants.ts
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- PARENT_UNAVAILABLE
- Agent 之间的消息:send_message 的直邻路由
- parentSession
- Agent 没有自己的 id
- parseDshArgs
- dsh 启动器管到哪里为止
- parseReadArgs
- 拦下坏参数的不止一层
- parseSkillFile
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- PENDING
- 插件跟着它等的服务起落
- performShutdown
- stdio 上,程序对程序的 JSON-RPC
- permission
- 另一个产品里的 Agent,当你的子 Agent
- permission-presets
- 另一头有没有人
- permission/preset
- 另一头有没有人
- persistedReadConcurrency
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- plan-mode
- 被取走的消息不一定进历史
- plan:policy
- 系统提示词也是一条消息
- plan/mode
- 目标之下的三件套——plan、todo、schedule
- PlanProjection
- 目标之下的三件套——plan、todo、schedule
- PlanUnitState
- 目标之下的三件套——plan、todo、schedule
- platform-session
- 桌面壳里,装着整个运行时
- PORTABLE_RESERVED_WORDS
- 程序在子进程里,工具在宿主上
- prepareCall
- 被取走的消息不一定进历史 请求离开进程之前
- preparedSessionCacheSize
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- prepareProfile
- dsh 启动器管到哪里为止
- prepareProfilePatches
- 插件树是一层层补丁叠出来的
- prepend
- 被取走的消息不一定进历史
- presentAs
- 工具表是按 Agent 算出来的
- presentCall
- 拦下坏参数的不止一层
- presentResult
- 拦下坏参数的不止一层
- PresetDefinition
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- PresetMount
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- PresetTree
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- PreStepDecision
- 被取走的消息不一定进历史
- primary-runtime
- 桌面壳里,装着整个运行时
- private readonly log
- 会话里没有状态,只有一本只追加的流水账
- process.prepare
- 同一个运行时,在另一台主机上
- PROFILE_PATCH_FILENAME
- cordis.yml 组合:空根与五层 patch 栈
- PROFILE_ROOT_CONFIG
- cordis.yml 组合:空根与五层 patch 栈
- PROFILE_ROOT_FILENAME
- cordis.yml 组合:空根与五层 patch 栈
- PROFILE_TEMPLATES
- dsh 启动器管到哪里为止
- ProgramBootData
- 程序在子进程里,工具在宿主上
- progress
- 工作流编排:脚本如何编排一批 Agent
- PROJECT_DSH_RANK
- 技能文件从哪几个目录冒出来,又怎样进模型视野 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- projection was removed or replaced
- 模型看到的历史,是现折出来的
- ProjectionDefinition<K,S>
- 事件是流水,状态是折叠出来的投影
- ProjectionValueStore
- 日志是事实,对话是投影
- projectJsonRun
- 命令行里,问一句话就退出
- promoteOnTimeout
- 命令可以比它的调用活得久
- PROMPT_COMMAND
- 命令可以比它的调用活得久
- PromptAssembly
- 系统提示词也是一条消息
- provideCmdline
- dsh 启动器管到哪里为止
- PSK-AES256-GCM-SHA384
- 同一个运行时,在另一台主机上
- PTC_ONLY_INSTRUCTION
- 程序在子进程里,工具在宿主上
- PtcBindingFunction
- 程序在子进程里,工具在宿主上
- PtcRunFailure
- 程序在子进程里,工具在宿主上
- PtcRunRequest
- 程序在子进程里,工具在宿主上
- PtcRunResult
- 程序在子进程里,工具在宿主上
- PtcWorkflowEngine
- 工作流编排:脚本如何编排一批 Agent 能力接入的接缝:Service、Provider 与 Consumer
- PtcWorkflowRun
- 工作流编排:脚本如何编排一批 Agent
- publicToolName
- 外部进程的工具,怎样进全局工具表又不撞名
- quit-inspection
- 桌面壳里,装着整个运行时
- randomBytes(32)
- 同一个运行时,在另一台主机上
- RATE_LIMIT
- 每一次失败都有下文
- ReactLoopAgent
- Agent 没有自己的 id
- ReactLoopInbox
- 插话等下一步,排队等下一轮
- readBoundedUtf8Body
- 一条投递,一个根会话
- readHeader
- 旧会话打开时,版本号说了算
- readProfilePatches
- 插件树是一层层补丁叠出来的 cordis.yml 组合:空根与五层 patch 栈
- readSession
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- readStableSnapshot
- 写一半崩了,已写的数据也不坏
- readWindowMax
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- reconcileProfilePatches
- 插件树是一层层补丁叠出来的
- RECONNECT_DEFAULTS
- 外部进程的工具,怎样进全局工具表又不撞名
- recovery
- 旧会话打开时,版本号说了算
- RedactedSecret
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- redactSecrets
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- REF_PATTERN
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- registerAdapter
- 请求离开进程之前
- registerMessageProjection
- 日志只增不减,历史有进有出
- releasedV4SessionFormatCodec
- 旧会话打开时,版本号说了算
- REMOTE_STREAM_MUX_PATH
- 浏览器到运行时,中间没有大表
- remote.session.create
- Web 隔着网关等请求,headless 跑完就退
- RemoteError
- 浏览器到运行时,中间没有大表
- RemoteProcesses
- 同一个运行时,在另一台主机上
- RemoteStreamMuxServer
- 浏览器到运行时,中间没有大表
- renderConfigDump
- 插件树是一层层补丁叠出来的
- renderPrompt
- 系统提示词也是一条消息
- renderSkillContent
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- replace
- 请求离开进程之前
- replaceGeneration
- 日志只增不减,历史有进有出 断点、分叉与压缩:不重写历史的三种接管
- ReplayEntry
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- reportSkippedBundles
- 插件树是一层层补丁叠出来的
- reportStartupFailure
- dsh 启动器管到哪里为止
- REQUEST_EXTENSION
- 请求离开进程之前
- request/context
- 系统提示词也是一条消息
- request/header
- 被取走的消息不一定进历史 系统提示词也是一条消息 工具表是按 Agent 算出来的
- RequestErrorAction
- 每一次失败都有下文
- requireInitiator
- Agent 没有自己的 id
- RESERVED_BINDING_GLOBALS
- 程序在子进程里,工具在宿主上
- RESERVED_ERROR_MEMBERS
- 程序在子进程里,工具在宿主上
- resolveAgent
- Web 隔着网关等请求,headless 跑完就退 命令行里,问一句话就退出
- resolveBundleDir
- 插件树是一层层补丁叠出来的
- resolveChildCwd
- 另一个产品里的 Agent,当你的子 Agent
- resolveChildDepth
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- resolveTelemetryPatch
- 插件树是一层层补丁叠出来的 cordis.yml 组合:空根与五层 patch 栈
- restoreOtherClaimed
- 被取走的消息不一定进历史
- restrict
- 工具表是按 Agent 算出来的
- RESULT_UNSERIALIZABLE
- 工作流编排:脚本如何编排一批 Agent
- resume
- 系统提示词也是一条消息
- resumeSessionId
- Agent 没有自己的 id
- resumeWith
- 断点、分叉与压缩:不重写历史的三种接管
- Retry-After
- 每一次失败都有下文
- retryId
- 每一次失败都有下文
- role('secret')
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- roots()
- Agent 没有自己的 id 技能文件从哪几个目录冒出来,又怎样进模型视野
- run_in_background
- 命令可以比它的调用活得久
- runCli
- dsh 启动器管到哪里为止
- runDumpConfig
- 插件树是一层层补丁叠出来的
- runMaintenance
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- runProfile
- dsh 启动器管到哪里为止 cordis.yml 组合:空根与五层 patch 栈 桌面壳里,装着整个运行时
- RUNTIME_RANK
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- runtime.json
- 桌面壳里,装着整个运行时
- RuntimeContextProjection
- 系统提示词也是一条消息
- runWorkflowGuest
- 工作流编排:脚本如何编排一批 Agent
- sandbox_permissions
- 另一头有没有人 命令可以比它的调用活得久
- SANDBOX_UNAVAILABLE
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- sandbox/mode
- 另一头有没有人 命令可以比它的调用活得久
- SandboxPolicyService
- 能力接入的接缝:Service、Provider 与 Consumer Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- Scenario
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- schedule/change
- 目标之下的三件套——plan、todo、schedule
- schedule/changed
- 目标之下的三件套——plan、todo、schedule
- ScheduleRecord
- 目标之下的三件套——plan、todo、schedule
- ScheduleUpdateMiss
- 目标之下的三件套——plan、todo、schedule
- SCRIPT_PARSE
- 工作流编排:脚本如何编排一批 Agent
- scrubbedParentEnv
- 外部进程的工具,怎样进全局工具表又不撞名
- SDK_RENDERERS
- 程序在子进程里,工具在宿主上
- SECTION_ORDERS
- 系统提示词也是一条消息
- seedLength
- Agent 没有自己的 id
- seenGoalIds
- Goal 不是状态对象,是一串可折叠的事件
- selfMod
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- send
- 插话等下一步,排队等下一轮
- send_message
- 插话等下一步,排队等下一轮 Agent 之间的消息:send_message 的直邻路由
- sendMessage
- 插话等下一步,排队等下一轮
- sendToParent
- Agent 之间的消息:send_message 的直邻路由
- sendWaking
- 插话等下一步,排队等下一轮 Agent 之间的消息:send_message 的直邻路由
- seq = SessionSeq(this.log.length)
- 会话里没有状态,只有一本只追加的流水账
- series
- 被取走的消息不一定进历史
- session append cannot reenter
- 会话里没有状态,只有一本只追加的流水账
- SESSION_FORMAT_VERSION
- 旧会话打开时,版本号说了算
- SESSION_QUERY_INVALID_LINEAGE
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- SESSION_QUERY_SESSION_NOT_FOUND
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- session-controller
- Web 隔着网关等请求,headless 跑完就退
- session-log-deepseek/delivery-accepted
- 请求离开进程之前
- session-reference
- 被取走的消息不一定进历史
- session-telemetry/record
- Telemetry 是观测侧车,不是第二个会话引擎
- Session.append
- 日志只增不减,历史有进有出
- session.cancel
- 插话等下一步,排队等下一轮
- session.prompt
- 插话等下一步,排队等下一轮
- session.updateQueue
- 插话等下一步,排队等下一轮
- session/created
- Agent 没有自己的 id
- session/disposed
- Agent 没有自己的 id
- session/end-seed
- 会话里没有状态,只有一本只追加的流水账
- session/writer-held
- Web 隔着网关等请求,headless 跑完就退
- sessionController
- Web 隔着网关等请求,headless 跑完就退
- SessionController
- Web 隔着网关等请求,headless 跑完就退
- SessionCorpus
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- SessionForkError
- 断点、分叉与压缩:不重写历史的三种接管
- SessionForkErrorCode
- 断点、分叉与压缩:不重写历史的三种接管
- SessionFormatCodec
- 旧会话打开时,版本号说了算
- SessionFormatEventRun
- 旧会话打开时,版本号说了算
- SessionFormatHeaderReadResult
- 旧会话打开时,版本号说了算
- sessionFormatLogFilename
- 旧会话打开时,版本号说了算
- SessionFormatMigration
- 旧会话打开时,版本号说了算
- SessionFormatUnsupportedMigrationError
- 旧会话打开时,版本号说了算
- sessionFormatV3ToV4
- 旧会话打开时,版本号说了算
- SessionId
- Agent 没有自己的 id
- SessionObservationReader
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- sessionPersistence
- Web 隔着网关等请求,headless 跑完就退
- sessionQuery
- Agent 没有自己的 id Web 隔着网关等请求,headless 跑完就退
- SessionQueryEngine
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- sessions.enter
- Agent 没有自己的 id
- sessions.flush
- Web 隔着网关等请求,headless 跑完就退
- sessions.get
- Agent 没有自己的 id
- sessions.prepare
- Agent 没有自己的 id
- SessionSeedEventState
- 断点、分叉与压缩:不重写历史的三种接管
- SessionStore
- Agent 没有自己的 id
- SessionTelemetryBackend
- Telemetry 是观测侧车,不是第二个会话引擎
- SessionTelemetryCoordinator
- Telemetry 是观测侧车,不是第二个会话引擎
- SessionTrace
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- setActivation
- Goal 的相位机、revision CAS 与轮次预算
- settlementState
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- settleRunResult
- 另一个产品里的 Agent,当你的子 Agent
- setup
- Agent 没有自己的 id
- severityOf
- Telemetry 是观测侧车,不是第二个会话引擎
- ShellExecRequest
- 命令可以比它的调用活得久
- ShellExecutor
- 命令可以比它的调用活得久 能力接入的接缝:Service、Provider 与 Consumer
- SIGKILL
- 命令可以比它的调用活得久
- signWindowsCode
- 桌面壳里,装着整个运行时
- signWindowsDesktopRuntime
- 桌面壳里,装着整个运行时
- SIGTERM
- 命令可以比它的调用活得久
- SKILL_GESTURE
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- SkillFilesystem
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- SkillRegistry
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- skippedBundles
- 插件树是一层层补丁叠出来的
- sourceEventSeqs
- 日志只增不减,历史有进有出 为什么不边流边记
- sourceVersion
- 从一个 commit 到下一版:这本书怎样更新并收束
- spawnTerminal
- 命令可以比它的调用活得久
- SSH_MAX_PROCESS_HANDLES
- 同一个运行时,在另一台主机上
- SSH_MAX_TEXT_STREAMS
- 同一个运行时,在另一台主机上
- SSH_PROTOCOL_VERSION
- 同一个运行时,在另一台主机上
- SshConnection
- 同一个运行时,在另一台主机上
- SshRpcPeer
- 同一个运行时,在另一台主机上
- standingMountFor
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- startChild
- 工作流编排:脚本如何编排一批 Agent
- startConnection
- 外部进程的工具,怎样进全局工具表又不撞名
- startSession
- Web 隔着网关等请求,headless 跑完就退
- startsRequestSeries
- 被取走的消息不一定进历史 系统提示词也是一条消息
- startsSeries
- 被取走的消息不一定进历史
- STARTUP_ENVIRONMENT_NAMES
- 程序在子进程里,工具在宿主上
- StartupError
- dsh 启动器管到哪里为止
- stateOf
- 插话等下一步,排队等下一轮
- static inject
- 能力接入的接缝:Service、Provider 与 Consumer
- step/end
- 被取走的消息不一定进历史
- step/start
- 被取走的消息不一定进历史
- StreamChunk
- 为什么不边流边记
- streamReasoning
- 命令行里,问一句话就退出
- stripTypeScriptTypes
- 程序在子进程里,工具在宿主上
- subagent-settled
- 插话等下一步,排队等下一轮
- SubagentCapabilities
- 另一个产品里的 Agent,当你的子 Agent
- SubagentCatalogEntry
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SubagentContinuationManager.sendMessage
- Agent 之间的消息:send_message 的直邻路由
- SubagentDepthError
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SubagentDescriptorData
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SubagentIdentityProjection
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SubagentInbox
- 插话等下一步,排队等下一轮 Agent 之间的消息:send_message 的直邻路由
- SubagentProvider
- 另一个产品里的 Agent,当你的子 Agent
- SubagentRunId
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- SubagentSettledMessageSource
- Agent 之间的消息:send_message 的直邻路由
- SubagentStopReason
- 另一个产品里的 Agent,当你的子 Agent
- submitAdmitted
- Agent 之间的消息:send_message 的直邻路由
- subprocessRunHandle
- 另一个产品里的 Agent,当你的子 Agent
- SUPPORTED_AGENT_OPTIONS
- 工作流编排:脚本如何编排一批 Agent
- surfaceContext
- 系统提示词也是一条消息
- SurfaceEventType
- 每条事件都装在带五格字段的信封里
- SurfaceManager
- 日志是事实,对话是投影
- surfaceOp
- 日志只增不减,历史有进有出
- syncTools
- 外部进程的工具,怎样进全局工具表又不撞名
- system-prompt/assemble
- 系统提示词也是一条消息
- system-prompt/change
- 系统提示词也是一条消息
- system/message
- 被取走的消息不一定进历史 系统提示词也是一条消息 日志只增不减,历史有进有出
- SystemPrompt
- 系统提示词也是一条消息
- SystemPromptProjection
- 系统提示词也是一条消息
- systemPromptUpdate
- 系统提示词也是一条消息 请求离开进程之前
- target-not-found
- Telemetry 是观测侧车,不是第二个会话引擎
- TELEMETRY_ROW_ID
- cordis.yml 组合:空根与五层 patch 栈
- terminal-bash
- 命令可以比它的调用活得久
- text-chunks
- 为什么不边流边记
- thread/start
- 另一个产品里的 Agent,当你的子 Agent
- timeoutMs
- 同时在跑的调用共用着什么 命令可以比它的调用活得久
- todo/write
- 目标之下的三件套——plan、todo、schedule
- TodoItem
- 目标之下的三件套——plan、todo、schedule
- TOOL_TIMEOUT
- 同时在跑的调用共用着什么
- tool-addition
- 工具表是按 Agent 算出来的
- tool-bash
- 命令可以比它的调用活得久
- tool-bash-persistent
- 命令可以比它的调用活得久
- tool-call-chunks
- 为什么不边流边记
- tool-jobs
- 插话等下一步,排队等下一轮 命令可以比它的调用活得久
- tool-pwsh-persistent
- 命令可以比它的调用活得久
- tool-removal
- 工具表是按 Agent 算出来的
- tool-skill
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- tool-subagent-control
- 插话等下一步,排队等下一轮
- tool-terminal
- 命令可以比它的调用活得久
- tool/call
- 日志只增不减,历史有进有出 几个工具能不能一起跑 拦下坏参数的不止一层 同时在跑的调用共用着什么
- tool/ptc-dispatch
- 拦下坏参数的不止一层 程序在子进程里,工具在宿主上
- tool/ptc-dispatch-start
- 程序在子进程里,工具在宿主上
- tool/result
- 日志只增不减,历史有进有出 几个工具能不能一起跑 拦下坏参数的不止一层 同时在跑的调用共用着什么
- ToolArgsError
- 拦下坏参数的不止一层
- ToolCallError
- 拦下坏参数的不止一层 程序在子进程里,工具在宿主上
- toolFilter
- 工具表是按 Agent 算出来的
- toolHistory
- 工具表是按 Agent 算出来的
- toolOrder
- 工具表是按 Agent 算出来的
- ToolOutputError
- 拦下坏参数的不止一层
- toolPairingBalancedBefore
- 断点、分叉与压缩:不重写历史的三种接管
- ToolRuntime
- 工具表是按 Agent 算出来的
- tools:sdk
- 程序在子进程里,工具在宿主上
- tools/change
- 工具表是按 Agent 算出来的
- tools/execute
- 几个工具能不能一起跑 拦下坏参数的不止一层 同时在跑的调用共用着什么
- tools/post-execute
- 几个工具能不能一起跑 拦下坏参数的不止一层 同时在跑的调用共用着什么 另一头有没有人
- tools/pre-execute
- 几个工具能不能一起跑 工具表是按 Agent 算出来的 拦下坏参数的不止一层 另一头有没有人
- tools/ptc-dispatch-log
- 程序在子进程里,工具在宿主上
- tools/result
- 工具表是按 Agent 算出来的 同时在跑的调用共用着什么
- toolUpdate
- 请求离开进程之前 工具表是按 Agent 算出来的
- traceEvent
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- traceSession
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- transition
- Goal 的相位机、revision CAS 与轮次预算
- transitionError
- Goal 的相位机、revision CAS 与轮次预算
- translate
- 为什么不边流边记
- TRUNCATED_MESSAGE
- 工具输出太大时,全文落盘,上下文只留一张书签
- turn/end
- 被取走的消息不一定进历史 每一次失败都有下文
- turn/start
- 被取走的消息不一定进历史
- typert-gateway
- Web 隔着网关等请求,headless 跑完就退
- TypertGatewayService
- 浏览器到运行时,中间没有大表
- UNAUTHORIZED
- Agent 之间的消息:send_message 的直邻路由
- unavailable
- 另一头有没有人
- UnitCell
- 事件是流水,状态是折叠出来的投影
- UNKNOWN
- 每一次失败都有下文
- UNLOADING
- 插件跟着它等的服务起落
- UNSUPPORTED_CAPABILITY
- 另一个产品里的 Agent,当你的子 Agent
- UNSUPPORTED_CONTENT
- 请求离开进程之前
- UNSUPPORTED_REASONING_EFFORT
- 请求离开进程之前
- unwrapExports
- 插件跟着它等的服务起落
- update-tasks
- 桌面壳里,装着整个运行时
- useProjection
- 日志是事实,对话是投影
- user-questions
- 另一头有没有人
- user-questions/request
- 另一头有没有人
- user/message
- 被取走的消息不一定进历史 系统提示词也是一条消息 日志只增不减,历史有进有出
- validateInstalledCurrentSessionArtifact
- 旧会话打开时,版本号说了算
- validateMeta
- 工作流编排:脚本如何编排一批 Agent
- validation
- 旧会话打开时,版本号说了算
- verifiedCommit
- 从一个 commit 到下一版:这本书怎样更新并收束
- VerifiedWebhookDelivery
- 一条投递,一个根会话
- verify-cordis-catalog
- 从一个 commit 到下一版:这本书怎样更新并收束
- verify-md-links
- 从一个 commit 到下一版:这本书怎样更新并收束
- verify-runtime-closure.ts
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- verify-type-equiv
- 从一个 commit 到下一版:这本书怎样更新并收束
- version-conflict
- Telemetry 是观测侧车,不是第二个会话引擎
- wakeRequested
- 插话等下一步,排队等下一轮
- watchSettlement
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- WEB_BLOCKED_URL
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- WEB_FETCH_MAX_URL_LENGTH
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- WEB_REDIRECT_BLOCKED
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- web-runtime
- Web 隔着网关等请求,headless 跑完就退
- WebhookHttpError
- 一条投递,一个根会话
- WebhookRule
- 一条投递,一个根会话
- WebhookRuntime
- 一条投递,一个根会话
- WebhookSessionRequest
- 一条投递,一个根会话
- webRuntime
- 插件跟着它等的服务起落
- webServer
- 插件跟着它等的服务起落
- webStartup
- 插件跟着它等的服务起落
- whole-value event rule
- 事件是流水,状态是折叠出来的投影
- withContinuableReturnGuidance
- Agent 之间的消息:send_message 的直邻路由
- withInitiator
- Agent 没有自己的 id
- withoutInitiator
- Agent 没有自己的 id
- withPhase
- Goal 的相位机、revision CAS 与轮次预算
- withWindowsSigningStage
- 桌面壳里,装着整个运行时
- workdir
- 命令可以比它的调用活得久
- WorkflowEngine
- 能力接入的接缝:Service、Provider 与 Consumer
- WorkflowError
- 工作流编排:脚本如何编排一批 Agent
- WorkflowExecution
- 工作流编排:脚本如何编排一批 Agent
- workspace-changes
- 拦下坏参数的不止一层
- workspaceRegistry.create
- 一条投递,一个根会话
- writeFileAtomic
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- x-api-key
- 请求离开进程之前
- x-deepseek-harness-session-id
- 请求离开进程之前
- x-deepseek-harness-user-id
- 请求离开进程之前
- x-dsh-auth-token
- 请求离开进程之前
- x-github-delivery
- 一条投递,一个根会话
- x-github-event
- 一条投递,一个根会话
- x-hub-signature-256
- 一条投递,一个根会话
- 按行号看 runProfile 的交接顺序
- dsh 启动器管到哪里为止
- 把 approval policy 设成 never,观察每个 ask 是否自动 rejected
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 把密钥文件 chmod 644 再启动:assertOwnerOnly 提示 chmod 600
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 从 paused 直接 block 看 transitionError 消息
- Goal 的相位机、revision CAS 与轮次预算
- 读 agent-loop resumeWith 看 write 夺门顺序
- 断点、分叉与压缩:不重写历史的三种接管
- 读 apps/desktop-host/src/index.ts 看 RunAsNode 子进程与 IPC 词汇
- 桌面壳里,装着整个运行时
- 读 apps/desktop/scripts/sign-primary-runtime.ts 看"先签名后密封哈希"的顺序
- 桌面壳里,装着整个运行时
- 读 catalog.ts readHeader 四态分支
- 旧会话打开时,版本号说了算
- 读 chain.ts 验证相邻强制与缺边拒绝
- 旧会话打开时,版本号说了算
- 读 client.ts 的 NotificationSubscriptionImpl.push 看推/拉两种模式如何在同一订阅合一
- 两根语言,同一条线
- 读 codex run.ts 看 thread/start 发布与固定安全事实
- 另一个产品里的 Agent,当你的子 Agent
- 读 continuation.ts:292-325 看 deliverFollowup 的重试循环:只有"输了截断"的投递才重试
- Agent 之间的消息:send_message 的直邻路由
- 读 createWebhookSession 看事务与回滚分支
- 一条投递,一个根会话
- 读 dispose.ts 看 EOF→SIGTERM→SIGKILL 梯子为什么只在进程真退出后 resolve
- 两根语言,同一条线
- 读 filename.ts 验证 session.jsonl 与 session.vN.jsonl 命名规则
- 旧会话打开时,版本号说了算
- 读 helper-processes.ts 看 prepare 先发端点、全部通道认证后才 start
- 同一个运行时,在另一台主机上
- 读 index.ts 的 run() 看双重 assertAdoptable 如何焊死 overlay 改 preset 的时间窗
- 命令行里,问一句话就退出
- 读 mcp-empty-ptc 录制,看程序里两次 tools.bash 的调用与返回
- 程序在子进程里,工具在宿主上
- 读 mcp-resources-ptc 录制,看 Promise.all 并行调 MCP 工具时子调用怎样分类
- 程序在子进程里,工具在宿主上
- 读 out-of-process.ts 看 NO_START_CAPABILITIES 与 resolveChildCwd 的拒绝语义
- 另一个产品里的 Agent,当你的子 Agent
- 读 projection-store.ts 看 seed 为什么先删所有 cached 行再按 seq 落值
- 日志是事实,对话是投影
- 读 protocol.ts 看帧格式与配额实现
- 同一个运行时,在另一台主机上
- 读 region.ts 验证 start 与失败 end 的成对追加
- 断点、分叉与压缩:不重写历史的三种接管
- 读 repair.ts 两种原因的合成措辞差异
- 断点、分叉与压缩:不重写历史的三种接管
- 读 server.ts 的 handleRequest 看为什么只有三个 wire 方法
- stdio 上,程序对程序的 JSON-RPC
- 读 startup.ts 的 jsonRequested 看为什么 --session-id 的值要被跳过
- 命令行里,问一句话就退出
- 读 stream-server.ts 看 WebSocket mux 心跳丢 2 次为什么 terminate
- 浏览器到运行时,中间没有大表
- 读 surface.ts 验证 replace 三不变量
- 断点、分叉与压缩:不重写历史的三种接管
- 读 tool-subagent-control/src/index.ts 看工具层有多薄:除了取 exec.agent 与 brandString,没有任何路由
- Agent 之间的消息:send_message 的直邻路由
- 读 transport.ts 顶部注释看 NDJSON 三态帧与 LSP 头帧的取舍
- stdio 上,程序对程序的 JSON-RPC
- 读 v3-to-v4 migration.ts 验证裸迁移拒绝与 child facts 注入
- 旧会话打开时,版本号说了算
- 读 Web 和 ACP 各一段升权的实录,看一次审批在日志里留下什么
- 另一头有没有人
- 读 webhook-github handler 看认证拒绝的 HTTP 状态码序列
- 一条投递,一个根会话
- 读两段 Web 录制的日志,看独占调用和并行组在 tool/call、tool/result 的先后上怎样区分
- 几个工具能不能一起跑
- 读两段录制,看前台调用到点转进后台时交回什么,job 名额满了又会怎样
- 命令可以比它的调用活得久
- 读迁移笔记看一元操作为什么要从 API Proxy 大表拆回业务拥主方
- 浏览器到运行时,中间没有大表
- 读同一段录制,看工具在一轮中途被登记、撤掉时,日志里的 request/header 和 developer/message
- 工具表是按 Agent 算出来的
- 读一段 headless 组合下的录制,看全局层交给 Agent 的工具
- 工具表是按 Agent 算出来的
- 读一段 Web 的实录,看会话开头钉进的预设和几次切换各写下哪些事件,模型又读到什么
- 另一头有没有人
- 读一段回放录制,看解析不了的参数文字走到工具时,tool/call 和 tool/result 记下什么
- 拦下坏参数的不止一层
- 读一段录制,看后台 job 了结时,通知怎样进收件箱、又怎样进历史
- 命令可以比它的调用活得久
- 读一段提问的实录,看问题和回答记在哪里
- 另一头有没有人
- 对照 message-feedback put 路径逐行走:note-blank/target-not-found/version-conflict 三条拒绝边
- Telemetry 是观测侧车,不是第二个会话引擎
- 给非 surface 事件加 surfaceOp:抛 is not surface-eligible and cannot carry surfaceOp
- 每条事件都装在带五格字段的信封里
- 构造 seeded session 缺 seed / 缺 inheritedEventCount 分别在构造点抛错
- 会话里没有状态,只有一本只追加的流水账
- 构造一个 version=99 的 descriptor,看 fold 是不是返回 undefined
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 故意删一个包的 src/invariant.ts 但不写 README 理由,跑 package-invariants 看是否红
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 故意在脚本里写 export const meta = {...},看 SCRIPT_PARSE 怎样在发布前就把它拦下
- 工作流编排:脚本如何编排一批 Agent
- 故意注册两个 ShellExecutor 子类,确认第二个加载即抛 duplicate-service
- 能力接入的接缝:Service、Provider 与 Consumer
- 耗尽预算后 resume 看拒绝消息
- Goal 的相位机、revision CAS 与轮次预算
- 会话空白时切 preset:成功;开了第一轮再切:select 抛 agent-preset/locked
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 会话私目录按 sessionId 的 sha256 前 12 位命名为 session-<hash>
- 工具输出太大时,全文落盘,上下文只留一张书签
- 看 --host 0.0.0.0 的拒绝、监听地址的取值、围栏与认证的顺序、令牌与 cookie、URL 何时打印
- Web 隔着网关等请求,headless 跑完就退
- 看 Agent 接口里 id 的类型、两张表的键、enter 的身份检查、Session 的 id 从哪里读,以及谁在往两张表里放东西
- Agent 没有自己的 id
- 看 Agent 消息的两处 steer、结束通知的三种投递和消息来源类型
- 插话等下一步,排队等下一轮
- 看 applyEntryPatches 怎样整值替换字段,对照 webserver 行和它的必填字段
- 插件树是一层层补丁叠出来的
- 看 approval、tool-jobs、agent-instructions、tool-subagent-control 四行在 dsh-base、headless、Web 主机层和四个 preset 里的开关
- 插话等下一步,排队等下一轮
- 看 bin.ts 的四个分支各自 import 哪个模块
- dsh 启动器管到哪里为止
- 看 bootstrap-only 前缀和 Harness home 的代理豁免
- dsh 启动器管到哪里为止
- 看 command-compact 的有序拆除,以及 fiber 卸载时怎样启动撤销
- 插件跟着它等的服务起落
- 看 DeepSeek 的 translate 在哪几处交出块
- 为什么不边流边记
- 看 DeepSeek 序列化在发请求之前拒收的几种历史
- 请求离开进程之前
- 看 displayFailure 怎么对 AUTH 码屏蔽凭据原文
- 日志是事实,对话是投影
- 看 dump 的来源注释格式,以及 dump 收集了哪几层
- 插件树是一层层补丁叠出来的
- 看 fiber 怎样由几项事实推出稳定状态,又怎样决定下一步
- 插件跟着它等的服务起落
- 看 frontmatter 三个字段是否都指向同一 commit
- 从一个 commit 到下一版:这本书怎样更新并收束
- 看 headless runner 的结算等待、恢复前的检查、独占区间与退出码
- Web 隔着网关等请求,headless 跑完就退
- 看 hmr 监听哪些文件、哪些 bundle 关掉了它
- 插件树是一层层补丁叠出来的
- 看 owner 与发起者的接口,以及驱动者、工具执行、定时任务怎样用它们
- Agent 没有自己的 id
- 看 packages 下挂在 agent/request-error 上的监听器,以及三个插件在各个组合里的那几行
- 每一次失败都有下文
- 看 packages 下谁发、谁听 agent/assistant-stream,以及日志认得的 assistant/ 事件还剩哪两种
- 为什么不边流边记
- 看 plan 能力没装时投影 key 是不是缺席
- 目标之下的三件套——plan、todo、schedule
- 看 prepareProfilePatches 怎样把所有行装进一条 insert
- 插件树是一层层补丁叠出来的
- 看 preStep 的四个动作、默认决定,以及瀑布由外到内、不调 next() 就截断的实现
- 被取走的消息不一定进历史
- 看 readProfilePatches 怎样按顺序接起各层
- 插件树是一层层补丁叠出来的
- 看 session.create 铸 id、只在调用方给了 id 时查盘、creations 去重、建目录与新建,以及浏览器唯一会改为新建的错误码
- Web 隔着网关等请求,headless 跑完就退
- 看 startsRequestSeries 的唯一来源和 request/header 的三种理由
- 被取走的消息不一定进历史
- 看 Web 的 bundle 声明的五个补丁文件,数出新建 Web profile 的行数
- 插件树是一层层补丁叠出来的
- 看 Web 这条链上每一行声明了什么,以及“只认 ACTIVE 的提供方”落在哪两行
- 插件跟着它等的服务起落
- 看必需启动清单
- dsh 启动器管到哪里为止
- 看标记的拒绝规则、随附代码里写五种消息事件的地方,以及压缩和修剪挂在哪些组合里
- 日志只增不减,历史有进有出
- 看仓库里录下的一段会话:同一轮两步各追加一条 system/message,只有一个请求头
- 系统提示词也是一条消息
- 看读取检查的三处出口,以及 unwrapExports 先取默认导出
- 插件跟着它等的服务起落
- 看队列事件的折叠、投影的注册与读取、重复 id 的拒绝
- 插话等下一步,排队等下一轮
- 看发布的四步和撤销函数里的拆除顺序
- Agent 没有自己的 id
- 看放行之后 step() 里的提交顺序
- 被取走的消息不一定进历史
- 看各处取消带不带 keepInbox,以及撤下 Agent 时的取消
- 插话等下一步,排队等下一轮
- 看各个包里挂在 llm/stream 上的监听器,以及 dsh-base 挂了哪两个
- 请求离开进程之前
- 看恢复路径的几个关键步骤和 header 的校验
- Agent 没有自己的 id
- 看会话控制器、Web 服务器、connection、api-remotes 和 Gateway 各由哪个 bundle 插入,Gateway 构造函数里的两段嵌套声明,以及谁在调用 Gateway 的进程内入口
- Web 隔着网关等请求,headless 跑完就退
- 看会话控制器装进 Gateway 的查找、被丢掉的句柄、follow 的后台激活、只停一轮的取消,以及默认关着的定时提醒
- Web 隔着网关等请求,headless 跑完就退
- 看会话目录的位置、Web 的默认 preset、runner 拒绝 preset 会话的报错与写锁的报错
- Web 隔着网关等请求,headless 跑完就退
- 看简写展开,以及“分界之后的 --patch 归应用”的测试
- dsh 启动器管到哪里为止
- 看两段录制里调用和结果怎样配对:并行的两个调用,和工具阶段的一次取消
- 日志只增不减,历史有进有出
- 看两个 DeepSeek 插件各登记哪个路由名,dsh-base、sdk-minimal 里挂着哪几行,回放补丁怎样关掉 API key 那一行
- 请求离开进程之前
- 看没开 step 的两种收场,和正常收尾之后才有的队列检查
- 被取走的消息不一定进历史
- 看三处按 id 的独占检查,以及并发同 id 创建的上游测试
- Agent 没有自己的 id
- 看三段录制里失败的那一步各留下了什么:重来成功、不重来、压缩以后重来
- 每一次失败都有下文
- 看三个动词的目标列表、每轮第一步与之后各步的认领目标、续步与开下一轮的判断
- 插话等下一步,排队等下一轮
- 看随附代码登记的两个扩展字段、三个 DSH 请求头,以及一段录制会话里的送达水位
- 请求离开进程之前
- 看随附代码里谁调 prepareCall,循环又从句柄上读了哪些字段
- 请求离开进程之前
- 看随附的 bundle 和 Web preset 给 persona 配的文字,以及关掉身份句、运行时上下文和标成 complete 的地方
- 系统提示词也是一条消息
- 看随附目录里哪个模型声明了 in-history,默认模型是谁,pi-ai 有没有声明
- 系统提示词也是一条消息
- 看随附组合里执行器和常驻 shell 的时限那几行
- 命令可以比它的调用活得久
- 看推导缓存的几处判断和守着它的测试
- 日志只增不减,历史有进有出
- 看五个随附模板
- dsh 启动器管到哪里为止
- 看需要投影定义的事件类型、登记它的插件和挂它的那一行
- 日志只增不减,历史有进有出
- 看一段 ACP 录制里,流进行到一半被取消的那一步
- 每一次失败都有下文
- 看一段手写回应的录制里,输出到上限的回答:流里留着没写完的调用,消息里没有,回放条目跟着裁
- 为什么不边流边记
- 看一段由回放重新生成的对话录制里,回答事件嵌着的流怎样压紧、签名放在哪
- 为什么不边流边记
- 看源码里哪几处返回拒绝,以及它们在随附组合里由哪一行挂上
- 被取走的消息不一定进历史
- 看运行时写 system/message 的唯一位置,以及循环发出的请求从日志推出消息、不带 system
- 系统提示词也是一条消息
- 看组装提示词的唯一调用点,以及 system-prompt/change 没有监听者
- 系统提示词也是一条消息
- 空 content 的 assistant/message:deriveEventMessage 返回 null
- 模型看到的历史,是现折出来的
- 连续写两次 todo 列表看 fold 是不是 last-wins
- 目标之下的三件套——plan、todo、schedule
- 列出随附工具里声明可以并行的地方,和写在旁边的理由
- 同时在跑的调用共用着什么
- 模型用 write 改一个技能文件:监听器不重载(observed 记账),下一轮目录清单不闪变
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 目录无变化连续多轮:renderCatalogUpdate 比对 digest,未变化不重发清单
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 拿旧 expected 去 update schedule 看 miss 码
- 目标之下的三件套——plan、todo、schedule
- 配空 key 调模型:assertUsableApiKey 抛 blank key,错误消息不含 key
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 配置里写一个非法引用名(含空格):credentialRef 拒
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 人为把 revision 写成 +2 看 requireNextRevision 是否拒绝
- Goal 不是状态对象,是一串可折叠的事件
- 人为多加一个字段看 decodeGoalChange 是否拒绝
- Goal 不是状态对象,是一串可折叠的事件
- 时钟回拨后看 nextMutationTime 是否钳住
- Goal 的相位机、revision CAS 与轮次预算
- 手动在编辑器改同一文件:监听器重载(不在 observed),目录清单更新
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 同名技能放项目 .dsh/skills 与用户 ~/.dsh/skills:collect 后项目版胜出,因为 PROJECT_DSH_RANK=100 < USER_DSH_RANK=400
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 同时对一个 Activation 从 signal 和 drain 两路 dispose,确认两方 await 的是同一个 promise
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 同一 ctx 注册两个同名 server:第二次 apply 在 reserve 阶段被拒(server name already in use)
- 外部进程的工具,怎样进全局工具表又不撞名
- 往 profile 的 cordis.patch.yml 写一行 disabled,确认下一个 boot 该行即停
- cordis.yml 组合:空根与五层 patch 栈
- 文件名 = 6 字节随机 hex 前缀 + encodeSegment(工具名),wx 0o600 拒绝覆盖
- 工具输出太大时,全文落盘,上下文只留一张书签
- 写一半杀进程:重启后日志末尾半截记录被 truncate
- 写一半崩了,已写的数据也不坏
- 沿一次新建会话逐层找出客户端调用、POST、准入、Gateway 的认领与核对,以及被调用的远程方法
- Web 隔着网关等请求,headless 跑完就退
- 用 jq 把一段录制的日志按标记折一遍,看压缩摘要怎样顶替两条消息
- 日志只增不减,历史有进有出
- 预设里一个服务没加 isolate:mountPreset 抛 Preset services require isolate realms
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 在 readSession 里注释掉 Session.create,直接改坏一条快照事件再读——验证重放验证会拦住手改日志
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 在 readSession 路径上确认 readSession 重放的是 Session.create,telemetry 从不反向构造 Session
- Telemetry 是观测侧车,不是第二个会话引擎
- 在 snapshots/session 下挑一个场景目录,对比录制的 JSONL 与归一化后的快照文本
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 在项目 .dsh/skills 加一个技能:重启/重收后它 rank100 最先被收录,压过用户同名技能
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- 在只读模式跑一个写文件命令,看是否被 denial signature 拦下而非裸跑
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 找出钉住池子节奏、上限和重分类的调度器测试,看上限为 2 时日志前四条的次序
- 同时在跑的调用共用着什么
- 找出随附代码里调 restrict 的地方,确认 bundle 里没有配 toolFilter
- 工具表是按 Agent 算出来的
- 找出所有换掉 exec.signal 的地方,看每一处在哪里换回
- 同时在跑的调用共用着什么
- 找出源码里读写 approval/asked、approval/decided 的地方
- 另一头有没有人
- 找出源码里回答审批和提问的监听器,以及随附组合里挂着这几行的地方
- 另一头有没有人
- 找出源码里抛 ToolArgsError 的地方
- 拦下坏参数的不止一层
- 重连:断网后按 500ms→指数→30s 退避,10 次后放弃;恢复后 ready 稳定窗口把计数清零
- 外部进程的工具,怎样进全局工具表又不撞名
- 注册两个同 id preset:register 第二次抛 Duplicate agent preset
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 注册一个只关心 goal/change 的投影:其余事件 apply 原样返回同引用
- 事件是流水,状态是折叠出来的投影
- append 5 条事件:磁盘上只出现一次 200ms 批量写
- 写一半崩了,已写的数据也不坏
- append 一条 user/message 后读 nodes:末尾多出一个 seq
- 模型看到的历史,是现折出来的
- bump stateVersion:旧持久化投影缓存被丢弃
- 事件是流水,状态是折叠出来的投影
- checkout 固定 commit 跑章节里的只读 bash,复跑每条 SourceEvidence
- 从一个 commit 到下一版:这本书怎样更新并收束
- foldGoal 从头折叠一条含 create/edit/pause 的日志
- Goal 不是状态对象,是一串可折叠的事件
- foreign format version:refuseForeignFormatVersion 直接拒读
- 写一半崩了,已写的数据也不坏
- fork 一个带孩子的 session,看目录是否剔除了被继承的孩子
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- goal fold 抛错:state.failure 记下 replay failed at session event N
- 事件是流水,状态是折叠出来的投影
- grep fts5 确认 persisted_docs 与 temp.live_docs 两张虚拟表的分工
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- grep isFeedback 确认默认模式下只有 feedback/record 与同会话 feedback/message-* 授权回放
- Telemetry 是观测侧车,不是第二个会话引擎
- grep MOCK_LLM_BEHAVIORS 数故障行为条数,确认 23 种 + random
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- grep register 找全仓所有自带 invariant 的包名
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- grep SESSION_FORMAT_VERSION 看 bump 政策注释原文
- 旧会话打开时,版本号说了算
- parallel 里塞一个 throw 普通 Error 的 thunk,确认它变 null 而不是炸掉整批
- 工作流编排:脚本如何编排一批 Agent
- provider 抛错:该层 listLayerCandidates catch → cacheable=false、warn 一行、继续其它层,不炸收集
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- replace 漏列一个被遮蔽节点:抛 must include every shadowed surface node
- 每条事件都装在带五格字段的信封里
- resume 一个孙代 session,看 delegationDepth 是不是仍按地板算
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- seed 事件 seq 不从 0 连续:seed event at index i has seq j (expected i)
- 会话里没有状态,只有一本只追加的流水账
- server 端两个工具同名:Phase1 fetch 直接拒绝,不进入 swap
- 外部进程的工具,怎样进全局工具表又不撞名
- snapshotEvents() 全量读走 Object.freeze([...log]) 缓存,分片读每次新 freeze
- 会话里没有状态,只有一本只追加的流水账
- snapshots/session/bash-spill/session.v4.jsonl 里可 grep 到真实 notice:Omitted 1494 bytes .../session-5e53dc8acfe4/2ce9d7a31a38-bash.txt
- 工具输出太大时,全文落盘,上下文只留一张书签
- sourceEventSeqs 指向未来 seq:抛 must reference earlier events
- 每条事件都装在带五格字段的信封里
- SystemPrompt 渲染文本未变:project 返回空数组,不产 commit
- 模型看到的历史,是现折出来的
- --from-default-profile 的目标目录已存在:拒绝,不复用
- dsh 启动器管到哪里为止
- 按 --session-id 接一个 Web 建的会话:会话记着 preset,runner 拒绝
- Web 隔着网关等请求,headless 跑完就退
- 把投影插件卸载后再读表面:抛 projection was removed or replaced
- 模型看到的历史,是现折出来的
- 必需插件没激活:StartupError,退出码 1,完整诊断在 $DSH_HOME/logs
- dsh 启动器管到哪里为止
- 补丁的 id 写错:只留下一条 entry not found 警告
- 插件树是一层层补丁叠出来的
- 插件停下后遗留的回调再读注入的服务:cannot get required service … in inactive context
- 插件跟着它等的服务起落
- 读兄弟插件提供的服务却没有声明:cannot get property … without inject,这一行 FAILED
- 插件跟着它等的服务起落
- 多写一行 export default apply:Loader 拿到裸函数,inject 丢失,插件一读服务就报 without inject
- 插件跟着它等的服务起落
- 改写放行决定时只写 kind 和 messages:startsRequestSeries 会被丢掉
- 被取走的消息不一定进历史
- 给 user/message 重新加 per-type framing:投影层刻意不做,framing 由 producer 烤进 content
- 模型看到的历史,是现折出来的
- 工具调用缺 taskRequired:executor 直接抛,不发空请求
- 外部进程的工具,怎样进全局工具表又不撞名
- 挂载失败:record.broken 记下,roster 里标 broken,不炸 host
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 恢复出一段 recoveredTail:下次 persistContiguous 先重写它再写新批
- 写一半崩了,已写的数据也不坏
- 恢复时组装得和上次不同:模型面对一段它没法照着行动的历史
- Agent 没有自己的 id
- 会话控制器那一行正在重载时发请求:gateway/service-unavailable
- Web 隔着网关等请求,headless 跑完就退
- 简写之后再写 --profile:select a profile only once
- dsh 启动器管到哪里为止
- 看到 step/start 就以为消息进了历史:agent/request 或 prepareCall 期间取消,这一步不写 user/message
- 被取走的消息不一定进历史
- 看到 turn/start 就以为这一轮调了模型:被拒或第一步为空的一轮没有 step/start,也没有 user/message
- 被取走的消息不一定进历史
- 可选插件激活失败:只警告一次,应用照常运行
- dsh 启动器管到哪里为止
- 另一个写句柄占着这个会话:打开来写时抛 is already owned by an active write handle,跨进程由内核锁挡住
- Agent 没有自己的 id
- 没装持久化后端时用 --session-id:直接报错;不带它新建,退出后什么也不剩
- Web 隔着网关等请求,headless 跑完就退
- 密钥文件权限太开:assertOwnerOnly 直接拒服务,不硬跑
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 命令行上 --host 0.0.0.0:Web 的启动插件拒绝,启动以用法错误结束
- Web 隔着网关等请求,headless 跑完就退
- 模型点名未声明 modelInvocable 的技能:拒绝(isModelInvocable false)
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- 拿一个打错的 id 调 session.create:得到一个用这个 id 新建的空会话,不报错
- Web 隔着网关等请求,headless 跑完就退
- 拿着旧的 Agent 对象按 id 办事:表里这个 id 已经换成新的生命周期,只比 id 会认错对象
- Agent 没有自己的 id
- 批量替换 verifiedCommit 不验证内容
- 从一个 commit 到下一版:这本书怎样更新并收束
- 启动器的 flag 写在应用参数后面:原样交给了应用
- dsh 启动器管到哪里为止
- 启动失败:failOnStartupError 默认 false,不炸 host,只记日志
- 外部进程的工具,怎样进全局工具表又不撞名
- 取消之后 inject 一条,以为会改排到下一轮:改排只对会唤醒的发送生效,inject 照旧进 next-step
- 插话等下一步,排队等下一轮
- 日志忘记过 redact:role(secret) 字段会明文泄漏
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 设了 DSH_TELEMETRY_DISABLED,dump 里的遥测行仍显示启用
- 插件树是一层层补丁叠出来的
- 提供方一直不来或两行互相等待:停在 PENDING,没有超时,也不检测环
- 插件跟着它等的服务起落
- 同时给 workspaceId 和 cwd:gateway/bad-request
- Web 隔着网关等请求,headless 跑完就退
- 同一个作用域里两个插件提供同名服务:后到的那个 FAILED,报 has been registered at
- 插件跟着它等的服务起落
- 无会话归属(no session owner)或无 ctx.spillStore → 抛错 → 降级保留原文
- 工具输出太大时,全文落盘,上下文只留一张书签
- 项目 .env 里设 PATH、NODE_OPTIONS 或 DEEPSEEK_BASE_URL:启动被拒绝
- dsh 启动器管到哪里为止
- 写盘被外部竞争/权限拒绝 → catch 后 warn keeping the inline content
- 工具输出太大时,全文落盘,上下文只留一张书签
- 信任类型声明不看调用点
- 从一个 commit 到下一版:这本书怎样更新并收束
- 需要先后的撤销分在几个 effect 里,或 yield 了包过一层的 disposer:撤销并发进行,顺序没有保证
- 插件跟着它等的服务起落
- 选了不存在的 preset:resolve/retain 抛 agent-preset/not-found(带 available 列表)
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 压缩 replace 遮蔽 retained user/message:RuntimeContextProjection 把 retained 置 null
- 模型看到的历史,是现折出来的
- 以为 --json 是 commander option:它是手写 argv 扫描,--session-id 的值即使字面是 --json 也不算开关
- 命令行里,问一句话就退出
- 以为 activation 落盘:它进程本地,resume 后每个进程自己重决
- Goal 不是状态对象,是一串可折叠的事件
- 以为 ask 没人答就放行:ask 在无 answerer 时 fail-closed 落 unavailable,不猜用户会同意
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 以为 assistant/message 用 sourceEventSeqs 引用它的块:带了会被拒收,流就嵌在事件里
- 为什么不边流边记
- 以为 cached 标题能活在打开的会话里:seed 全删 cached,连上的会话才是事实
- 日志是事实,对话是投影
- 以为 change 是 delta:每次都写全快照
- Goal 不是状态对象,是一串可折叠的事件
- 以为 clear 删了历史:它只写墓碑,fold 仍能看到 lastRef
- Goal 的相位机、revision CAS 与轮次预算
- 以为 closers 只用于崩溃:fork 中切父的 open turn 时走同一套算法
- 断点、分叉与压缩:不重写历史的三种接管
- 以为 compaction 删了旧事件:物理日志一行不删,只是表面节点被 replace 遮蔽
- 断点、分叉与压缩:不重写历史的三种接管
- 以为 complete 段落会连运行时上下文一起清掉:它只换段落,运行时上下文要单独抑制
- 系统提示词也是一条消息
- 以为 complete 后能原地复活:complete 是单向门,要新建
- Goal 的相位机、revision CAS 与轮次预算
- 以为 Cookie 跨 host 能用:Connection 验 authority,签名观众必须等于当前 host
- 浏览器到运行时,中间没有大表
- 以为 cordis.yml 是手写配置:它每次启动被清空重写
- cordis.yml 组合:空根与五层 patch 栈
- 以为 ctx.shell 是全局单例:它是 per-context 的,子 context 要重新接线
- 能力接入的接缝:Service、Provider 与 Consumer
- 以为 danger-full-access 下永远不会有人被问:放行策略答 ask 与沙箱无关,实验包的 auto 预设就是 danger-full-access 加 ask
- 另一头有没有人
- 以为 default 会被填进参数:它只是注解,缺省值由工具补
- 拦下坏参数的不止一层
- 以为 deliveryId 能挡重复投递:它只进消息 source 作痕迹,去重是规则自己的事
- 一条投递,一个根会话
- 以为 deny 一个名字就保证它消失:子 Agent 自己那一层登记的同名工具照样可见;Web 里的 subagent 就在子 Agent 自己那一层,写进 deny 会让子 Agent 建不起来,往下派几层由 maxDepth 管
- 工具表是按 Agent 算出来的
- 以为 deriveMessages() 每次都从头算:它只投影新节点,历史被改写过才整份重建
- 日志只增不减,历史有进有出
- 以为 dispatch 等规则跑完:fire-and-forget,HTTP 202 先回,规则失败只记日志
- 一条投递,一个根会话
- 以为 edit 会改 phase:edit 相位与 blockedReason 都不动
- Goal 的相位机、revision CAS 与轮次预算
- 以为 executor 重载会杀掉正在跑的进程:进程归 ctx.subprocess 边界管
- 能力接入的接缝:Service、Provider 与 Consumer
- 以为 goal 是个存起来的对象:它只在 fold 结果里存在
- Goal 不是状态对象,是一串可折叠的事件
- 以为 headless 的树里没有 Gateway:它来自 dsh-base,只是没有 connection 把请求送到它面前
- Web 隔着网关等请求,headless 跑完就退
- 以为 headless 会等后台 job 跑完:它等 Agent 闲下来就请求退出,还在跑的 job 在卸下时被停
- 命令可以比它的调用活得久
- 以为 headless 会自动同意:默认的 ask 策略下没有应答者,审批落成 unavailable;启动前设 DSH_PERMISSION_MODE=danger-full-access,沙箱放开、策略变成 never,升权用不着问,送到审批服务的请求不问人,直接 rejected
- 另一头有没有人
- 以为 headless 自己 exit:appExit 是 launcher 注入的请求,缺失即插件挂载抛错
- 命令行里,问一句话就退出
- 以为 helper 摘要只查一次:hello 双摘要(helperHash + bootstrapHash)任一不符即拒绝,PTC 入口未配就不可用
- 同一个运行时,在另一台主机上
- 以为 id 直接比对:会话 id 每次跑都随机,归一化刷成占位符后才有 diff 可言
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 以为 initialize 可以跳过:未 initialized 推 prompt 直接抛错
- stdio 上,程序对程序的 JSON-RPC
- 以为 initialize 可以重复握手:initialized ??= memoize,第二次直接复用 Promise
- 两根语言,同一条线
- 以为 inject 顺序无所谓:缺一个依赖,Consumer 构造根本不被调用
- 能力接入的接缝:Service、Provider 与 Consumer
- 以为 INVALID_ARGS 会发给模型:码只记进日志,模型读到的是 Error: invalid arguments 开头的文字
- 拦下坏参数的不止一层
- 以为 invariant 是可选的 debug assert:它是 CI 强制的包级合同,缺失即 build 失败
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 以为 kill 一下就完事:梯子三段,SIGKILL 只在 exit edge 后 resolve,防僵尸
- 两根语言,同一条线
- 以为 llm/stream 监听器能改请求:next() 不收参数,监听器只能动流
- 请求离开进程之前
- 以为 maxParallelToolCalls 管着整个进程:它只管一个 Agent 的一组,子 Agent、run_code 的程序各有各的
- 同时在跑的调用共用着什么
- 以为 mock 只有成功路径:23 种故障行为就是为了把错误路径也钉成可复现
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 以为 never 下被拒的理由出自用户:没人被问到,理由文字仍说 the user rejected,要靠运行时上下文分辨
- 另一头有没有人
- 以为 note 端到端加密:没有任何加密逻辑,note 按 UTF-8 字节上限明文落盘,别写密钥
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为 open turn 会阻止 fork:fork 用 forked closers 合成收尾,父可能在切分点之后才写完结果
- 断点、分叉与压缩:不重写历史的三种接管
- 以为 parallel 一个失败全批炸:普通错误归一成 per-item null,只有 fatal WorkflowError 穿透
- 工作流编排:脚本如何编排一批 Agent
- 以为 partial 就是 full:partial 边界不全,要绝对隔离的调用必须另想办法
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 以为 patch 是 deep merge:整行替换,只改一个 key 必须重述全部
- cordis.yml 组合:空根与五层 patch 栈
- 以为 plan 是个复杂规划器:它只是个开关
- 目标之下的三件套——plan、todo、schedule
- 以为 preset 的定义换了,正在跑的会话跟着换工具:旧的一版有会话挂着就留着
- 工具表是按 Agent 算出来的
- 以为 register 会检查参数格式:它只查输出格式,原样登记的工具参数没人查
- 拦下坏参数的不止一层
- 以为 register 能指定工具给谁:去向只看调用它的上下文
- 工具表是按 Agent 算出来的
- 以为 renderer 能碰到凭据:平台文档凭据只经私有 Node IPC 到 preload,页面脚本收不到 token
- 桌面壳里,装着整个运行时
- 以为 result 会 reject:发布后永不 reject,失败扁平化为 stopReason
- 另一个产品里的 Agent,当你的子 Agent
- 以为 resume 会把孩子当顶层重新计数
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 以为 resume 会把旧进程拉起来:它读的是磁盘日志,进程早就没了
- 断点、分叉与压缩:不重写历史的三种接管
- 以为 run 结束就是程序结束:run 一了结,还在飞的子调用被中止、未开始的被放弃,一个都不留
- 程序在子进程里,工具在宿主上
- 以为 run_code 的程序能直接调任何工具:ptc 模式下模型面只有 run_code 一个入口,其余工具都要从程序里走绑定
- 程序在子进程里,工具在宿主上
- 以为 schedule update 是 PATCH:是 CAS 整条替换
- 目标之下的三件套——plan、todo、schedule
- 以为 SDK 做 Agent:它是 thin client,只启动进程/配对 req_id/分发通知/幂等退出
- 两根语言,同一条线
- 以为 send_message 是子 Agent 工具的私货:它在独立包里全局注册,多个委派工具共享一个控制面
- Agent 之间的消息:send_message 的直邻路由
- 以为 shutdown 会重入:shutdownTask ??= memoized,竞态只退一次
- stdio 上,程序对程序的 JSON-RPC
- 以为 SSH 通道是加密的:管理面走 OpenSSH exec stdout(SSH 加密),数据面走 TLS-PSK;PSK 证明身份不需要 X.509
- 同一个运行时,在另一台主机上
- 以为 stderr 是启动诊断的可靠通道:fatal 诊断走 IPC 消息(stderr 字节与 IPC 消息竞争,壳报先到者)
- 桌面壳里,装着整个运行时
- 以为 steer 会打断正在进行的模型请求:它要等这一步结束
- 插话等下一步,排队等下一轮
- 以为 subagent.finished 覆盖跨进程:它只报 info.local 的本进程子代理
- stdio 上,程序对程序的 JSON-RPC
- 以为 teardown 要等模型跑完:disposal 永不 latch,abort 即停
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 以为 telemetry 能恢复会话:它只镜像事件,没有 createSession/resumeSession,冷操作连 Session 或 Agent 都不构造
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为 telemetry 要等于 "0" 才关:任何非空值都关
- cordis.yml 组合:空根与五层 patch 栈
- 以为 todo 条目有 id:没有,整条替换
- 目标之下的三件套——plan、todo、schedule
- 以为 traceEvent 只追一条替换:它同时收 replacementChain 与 derivedEventSeqs 两个方向
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 以为 unknown-version descriptor 被静默忽略
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 以为 v3→v4 自动能跑:裸迁移 createStage 直接抛错,必须显式传 child facts(空数组也算)
- 旧会话打开时,版本号说了算
- 以为 vm 沙箱等于进程隔离:vm.Context 仍在同一进程;进程隔离与取消由共享 PTC 执行器提供
- 工作流编排:脚本如何编排一批 Agent
- 以为 Web 的"新建会话"一定新建:带着空会话的 id 时是接管
- Web 隔着网关等请求,headless 跑完就退
- 以为 Web 的工具都在 preset 那一层:三个 preset 里的 subagent 在每个 Agent 自己那一层,主机层的工具行登记进全局层
- 工具表是按 Agent 算出来的
- 以为 Web 的每个会话都可能被钩子拒绝:钩子插件不在随附组合里
- 被取走的消息不一定进历史
- 以为 Web 的每个会话都能用 send_message:minimal preset 没有挂 tool-subagent-control
- 插话等下一步,排队等下一轮
- 以为 Web 的停止按钮会丢掉排队的消息:它带 keepInbox,归档正在跑的会话和 ACP 的取消才清空
- 插话等下一步,排队等下一轮
- 以为 webhook 会话是特殊会话:接纳后就是普通根会话,sessionId webhook-uuid 只是命名约定
- 一条投递,一个根会话
- 以为 webhook 直接建会话:规则是中间层,把投递翻译成 Session 请求;翻译不合法就失败
- 一条投递,一个根会话
- 以为 workflow 是父自己的多回合编排:脚本在另一个进程跑,父只通过 bindings 看到事件
- 工作流编排:脚本如何编排一批 Agent
- 以为按下停止会立刻杀掉一切:循环在检查点停下,已经开始的工具要等它们停下
- 每一次失败都有下文
- 以为版本号可以随便加:bump 由 writer 结构变化决定,漏 bump 会让旧运行时静默读错新日志
- 旧会话打开时,版本号说了算
- 以为绑定调用会另走一套规则:子调用和原生调用同池调度,exclusive 照样全屏障,结果按提交序提交
- 程序在子进程里,工具在宿主上
- 以为包装换掉信号就能让调用躲开取消:注册表在主体之前把调用方的信号并回来
- 同时在跑的调用共用着什么
- 以为包装里记个共享的变量没事:同一个包装同时处在几个调用里
- 同时在跑的调用共用着什么
- 以为被拒、出错之后排着的消息会接着跑:驱动停下,等下一次唤醒
- 插话等下一步,排队等下一轮
- 以为被拒的调用也占名额:名额只数派发出去还没落定的调用
- 同时在跑的调用共用着什么
- 以为被拒的消息会回到收件箱:循环不退还,只有监听器自己放回的才在
- 被取走的消息不一定进历史
- 以为变量缺值会换成空串:严格插值直接报错,这一轮以 error 收场,请求不发
- 系统提示词也是一条消息
- 以为并行组里整个调用都在重叠:只有派发重叠,放行和结果策略按顺序;放行这一关停下来等,后面的调用都开始不了
- 几个工具能不能一起跑
- 以为部署时再发现缺插件:runtime-closure 在 build 期就拦住 manifest 缺项
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 以为参数命名两边一致:Python 写 snake_case,客户端映射层转线上 camelCase
- 两根语言,同一条线
- 以为参数写坏了模型总能看到报错:DeepSeek 路由上解析不出对象的参数让整条回答作废,这一轮以 error 收场
- 拦下坏参数的不止一层
- 以为插件缺省的 120 秒就是随附的时限:dsh-base 那一行把 bash 的缺省时限改成了 60 秒
- 命令可以比它的调用活得久
- 以为查不到适配器请求就发不出:llm/stream 监听器可以整个接下这次调用,没人接才以 NO_ADAPTER 收尾
- 请求离开进程之前
- 以为拆除失败会吞:失败聚成 ACTIVATION_TEARDOWN_FAILED 抛回,drain 据此报错
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 以为拆除是先杀父再清孩子:顺序反了,进行中的 turn 还在给父发信
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 以为常驻 shell 的状态能跨重开会话:它只活在内存里,新的 Agent 从头建一个
- 命令可以比它的调用活得久
- 以为常驻 shell 里用 & 起的服务会一直在:任何一条命令超时或被停,整个 shell 连同它都被重置
- 命令可以比它的调用活得久
- 以为超时就是等:request 超时主动 abandon.abort,传输层丢 pending,不堆积
- 两根语言,同一条线
- 以为撤下 Agent 之后收件箱一定是空的:只有撤除开始时排着的被清掉,撤除途中才到的留下,关闭写句柄时随日志落盘;进程没走完撤除就结束时,那次清空可能已经落盘,也可能没有,恢复后以落了盘的为准;留在队列里的不自动开跑
- 插话等下一步,排队等下一轮
- 以为程序里的 console 是 Node 全套:程序拿到的是五个方法的 shim,输出全部进日志台账
- 程序在子进程里,工具在宿主上
- 以为程序能继承宿主环境:环境从空开始,只留 PATH 这类启动变量,连 ELECTRON_RUN_AS_NODE 都被滤掉
- 程序在子进程里,工具在宿主上
- 以为打开旧会话就是读同一个文件:磁盘原封不动,内存里是翻译后的 v4 逻辑 artifact
- 旧会话打开时,版本号说了算
- 以为第一步为空之后驱动会接着处理排队的消息:它不看队列,等下一次唤醒
- 被取走的消息不一定进历史
- 以为调度器自己出错时也会补结果:它不编造,还没提交的调用一直没有结果
- 几个工具能不能一起跑
- 以为订阅 agent/assistant-stream 的插件能改回答:它拿到的是冻结快照,抛错只记警告
- 为什么不边流边记
- 以为读 header 就要读全文:readHeader 只看首行 version,事件体一个字不碰
- 旧会话打开时,版本号说了算
- 以为断开能重连:单次会话,断开 = 结果与清理未知,所有在飞操作一并失败
- 同一个运行时,在另一台主机上
- 以为发布前失败会走 run:能力/注册/启动失败抛固定安全事实(product/stage/category),不泄 Host 内部
- 另一个产品里的 Agent,当你的子 Agent
- 以为发信人是谁都行:精确 live sender 校验,顶替/非驻留身份一律 UNAUTHORIZED
- Agent 之间的消息:send_message 的直邻路由
- 以为翻译失败会尽力而为:任何阶段错误都包成 UnsupportedMigrationError 响亮拒绝
- 旧会话打开时,版本号说了算
- 以为反馈进模型历史:它是 log-only 事件,模型看不到,删除也只加一条 delete 事件,旧评分留在日志里
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为返回值想给什么给什么:vm 域 class 实例过界被 materializeFromRealm 拒成 RESULT_UNSERIALIZABLE
- 工作流编排:脚本如何编排一批 Agent
- 以为放行策略拿到的参数已经合格式:格式检查在 execute 的开头,放行、审批、守卫和包装都在它之前
- 拦下坏参数的不止一层
- 以为非驻留子也能给父发信:头部不是驻留 Activation 的孩子发给父,被直邻闸门拒绝
- Agent 之间的消息:send_message 的直邻路由
- 以为分类函数返回一个真值就算并行:必须正好是 true
- 几个工具能不能一起跑
- 以为分组在开跑前一次分好:开始每个调用之前都再问一次,组边跑边切
- 几个工具能不能一起跑
- 以为父会自动收到孩子的收尾:父不自动收 transcript,孩子必须主动 send_message;收尾通知是 runtime 旁白且有 announced 闸门
- Agent 之间的消息:send_message 的直邻路由
- 以为格式检查拦得住正整数、非空这类规矩:这些由工具主体自己查,报错不带码
- 拦下坏参数的不止一层
- 以为格式里没声明的键会被拒:参数的根是开放的对象,要拦得靠工具自己
- 拦下坏参数的不止一层
- 以为给插件自己的事件加个标记就能让模型读到:五种以外的事件带标记会被拒,要么写这五种事件,要么登记消息投影
- 日志只增不减,历史有进有出
- 以为管理请求不受限:ordinary 共享 pending 预算,管理类(heartbeat/close/terminate/streamClose)各占保留配额
- 同一个运行时,在另一台主机上
- 以为还有 40+ 方法大表:no API Proxy service remains,一元操作各归业务 Remote 拥主方
- 浏览器到运行时,中间没有大表
- 以为环境变量会透传:外部子进程拿到的是凭据擦除后的副本,API key 要显式配 env 才进子进程
- 另一个产品里的 Agent,当你的子 Agent
- 以为活会话也在 FTS 里:live_docs 是 temp 表,默认不把未持久化内容灌进索引
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 以为脚本里写 export const meta 合法:meta 是请求数据字段,写进脚本体直接 SCRIPT_PARSE
- 工作流编排:脚本如何编排一批 Agent
- 以为接管一个活会话也行:活 Agent 直接拒,一次性 runner 不能独占运行区间
- 命令行里,问一句话就退出
- 以为结果按跑完的先后写进日志:按模型写下的顺序提交,后面的先跑完也要等前面的
- 几个工具能不能一起跑
- 以为界面上闪过的字就是回答:出错重来、日志拒收,实时的那份就作废;被取消时也只留写了字的文字和推理
- 为什么不边流边记
- 以为进程在流中间死掉,已流出的字还留在日志里:一片也不在,恢复只补收尾
- 为什么不边流边记
- 以为进程重启后会接着问:等着的问题只活在内存里,重开会话不会再问
- 另一头有没有人
- 以为可以 paused 直接 block:必须先 resume 回 active
- Goal 的相位机、revision CAS 与轮次预算
- 以为客户端断开挂 request.close:必须挂 response.close,否则 GET 立刻 abort 流式响应
- 浏览器到运行时,中间没有大表
- 以为客户端做域折叠:host 是唯一计算点,客户端只存整值按 seq 合并,新域零客户端代码
- 日志是事实,对话是投影
- 以为快照测试是录屏回放:它回放的是 LLM 剧本与协议帧,断言对象是归一化后的可对比文本
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 以为快照提交后永不更新:refresh 模式就是为合法行为变更准备的重录通道
- Mock Snapshot 测试:启动真实子进程,录制一次,重放一万次
- 以为快照闸门就够了:resume 后还要对活日志再 assertAdoptable 一次
- 命令行里,问一句话就退出
- 以为离线就装不了依赖:独立 Python/Node/pnpm 发行 + 锁定归档,离线安装是设计目标
- 桌面壳里,装着整个运行时
- 以为两个客户端并发打分是 last-write-wins:ifVersion 对不上直接 version-conflict,必须重读重试
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为另起一组一定让缓存失效:之前没追加过提示词、也没宣布过新增工具时,请求仍是上一次的延长
- 被取走的消息不一定进历史
- 以为轮次是状态字段:它是日志里数出来的 admitted 消息条数
- Goal 不是状态对象,是一串可折叠的事件
- 以为没配 cwd 会落到服务器目录:resolveChildCwd 拒绝而非回退——一个服务器进程服务多个会话
- 另一个产品里的 Agent,当你的子 Agent
- 以为每个 token 都写进日志:流进行中这些块不进日志,流结束后才整段写成一条事件
- 为什么不边流边记
- 以为每一步只准备一次:每次尝试开头都重新走 agent/request 和 prepareCall,重试也一样
- 请求离开进程之前
- 以为每一轮在日志里都有 turn/end:进程没等它落盘就没了,要到下次加载才补上 interrupted
- 每一次失败都有下文
- 以为默认只重试两次:默认每一步最多 5 次,间隔大约 0.5、1、2、4、8 秒
- 每一次失败都有下文
- 以为目录包含 fork 继承来的祖先孩子
- 子代理的血缘——subagent 怎么知道自己是谁的孩子
- 以为能不能一起跑在一组开跑前就定好了:每开始一个之前才问,注册表中途变了,组会被切短
- 同时在跑的调用共用着什么
- 以为能传 agentOptions/outputSchema/persona:外部 provider 五旗全 false,请求即 UNSUPPORTED_CAPABILITY
- 另一个产品里的 Agent,当你的子 Agent
- 以为批处理全局适用:受控输入走 notifyNow 同 tick 直路,防 React 把 caret 弹回末尾
- 日志是事实,对话是投影
- 以为批准过一次就记住了:只有 allowed-once,只放这一次,会话的沙箱模式不变
- 另一头有没有人
- 以为迁移可以跳代:只允许相邻边,v0 必须走 v0→v1→v2→v3→v4 四段
- 旧会话打开时,版本号说了算
- 以为签名验证失败也回 200:401 invalid webhook signature,错误码不泄漏请求细节
- 一条投递,一个根会话
- 以为前台 bash 到点就被杀:挂着后台任务服务时它转进后台接着跑,没有这条路或登记被拒才杀
- 命令可以比它的调用活得久
- 以为切预设会把两个旋钮都重写一遍:先记预设,只写变了的旋钮
- 另一头有没有人
- 以为清空提示词只要把最新一版改成空的:更早的版本会重新生效,所以所有有字的版本都要清空
- 系统提示词也是一条消息
- 以为请求体不限:http-bridge 300MiB 上限,按图片聚合 + base64 膨胀留余量
- 浏览器到运行时,中间没有大表
- 以为请求体里只有模型读的内容:DeepSeek 路由上还并排带着会话日志的增量和插件包清单
- 请求离开进程之前
- 以为取消会回滚:取消不撤销已完成的远端变更,提示语原样是 completed remote mutation is not rolled back
- 同一个运行时,在另一台主机上
- 以为取消之前就跑完的调用,结果总会记成功:它要是排在慢调用后面,提交时信号已经中止,成功的结果一律改记 ABORTED
- 几个工具能不能一起跑
- 以为全书都得重写,其实单章即可
- 从一个 commit 到下一版:这本书怎样更新并收束
- 以为缺服务会报错:agents/sessions 缺席时 run() 静默 return,把失败留给 launcher
- 命令行里,问一句话就退出
- 以为认领为空这一步就不走:判断看最后的决定,变了的运行时上下文快照也算一条
- 被取走的消息不一定进历史
- 以为日志里写着的对话都会发给模型:收件箱的记录、失败的尝试、被顶替的旧对话都不在历史里
- 日志只增不减,历史有进有出
- 以为沙箱挡不住就硬跑:SANDBOX_UNAVAILABLE 是 fail-closed,不裸奔
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 以为上传默认包含全部对话:默认 FEEDBACK_ONLY,未提交反馈的会话内容一次都不出本机
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为上下文超限也由 llm-retry 重试:它不在默认的码里,由 compaction-basic 压缩以后重来;没挂压缩插件的组合里,这一轮以 error 收场
- 每一次失败都有下文
- 以为上限一满就一批一批地跑:空出一个名额就补一个,不等整批
- 同时在跑的调用共用着什么
- 以为审批批下来就一定能执行:放行之后还有守卫,守卫只能拒绝
- 另一头有没有人
- 以为省略理由随便写:正则卡死句式,不按句式写一样 violation
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 以为失败的 compaction 会留个开着的锁:它故意留 unmatched start 供下一次检测,而不是悄悄抹平
- 断点、分叉与压缩:不重写历史的三种接管
- 以为失败会抛异常:程序跑挂了是结果里的 error 字段,CodeRunFailedError 是给模型看的整段文本
- 程序在子进程里,工具在宿主上
- 以为失败会清理干净:回滚只覆盖已做的步骤,回滚本身失败只记 warn 日志
- 一条投递,一个根会话
- 以为失败码原样显示:displayFailure 对 AUTH 只留 code,凭据原文留日志不入 UI
- 日志是事实,对话是投影
- 以为时限一到名额就空出来:时限包装等主体收场才交回,不听信号的主体一直占着名额
- 同时在跑的调用共用着什么
- 以为适配器写死在循环里:循环只记路由名,同一个名字在产品里是 DeepSeek 适配器,在回放测试里是录好的回应
- 请求离开进程之前
- 以为四层可以合成一个总开关:合起来等于没有防线,一层失守全盘沦陷
- Trust / Permission / Sandbox / Network:四层防线为什么不能合成一个开关
- 以为送达水位在请求发出时就写下:它在端点回 2xx 之后、读回应之前才追加
- 请求离开进程之前
- 以为随附的 Web 里定时提醒在跑:schedule 那一行默认 disabled: true,打开之后才会按 id 唤起 Agent
- Web 隔着网关等请求,headless 跑完就退
- 以为所有跨 Agent 的投递都是 steer:人发给子 Agent 的消息可以排队,结束通知按父 Agent 的状态排队、插话或旁注
- 插话等下一步,排队等下一轮
- 以为所有失败都会走重试:交出请求之前的错和读流时抛出的错都不问瀑布,这一轮直接以 error 收场
- 每一次失败都有下文
- 以为索引库就是事实源:索引可以重建,日志才是;查询只读 corpus 的快照展示面
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 以为提示词变了请求头就要重写:追加不动请求头;改写第一条才让这次请求记作另起一组
- 系统提示词也是一条消息
- 以为提示词一变就改写开头:路由声明了 in-history 而且不另起一组时,新版本追加在历史末尾
- 系统提示词也是一条消息
- 以为停掉这一轮会停掉后台 job:登记以后调用的取消信号碰不到它,要 job_kill、有人停、归档会话、Agent 撤下这类事才停得下它
- 命令可以比它的调用活得久
- 以为停一条命令一定停得下它的所有子孙:macOS,还有连不上用户级 systemd 的 Linux,只有进程组这一种办法,逃出进程组的不保证
- 命令可以比它的调用活得久
- 以为同一步的调用天然并行:没声明 isConcurrencySafe 的一律独占,随附组合挂着的工具里只有读文件、读图片、联网和委派这几样声明了
- 几个工具能不能一起跑
- 以为投递会被静默吞掉:inbox closing 已开时投递方等 disposal 结束再重试,不把信投进正在拆的房子
- Agent 之间的消息:send_message 的直邻路由
- 以为投递历史无限长:有 days+records 双上限
- 目标之下的三件套——plan、todo、schedule
- 以为推导会替缺结果的工具调用补上结果:配对是写入一方的事,调度器内部出错时历史里就留着没有结果的调用
- 日志只增不减,历史有进有出
- 以为退出检查只问一次:询问框打开期间再次退出并入同一个框,不叠第二个
- 桌面壳里,装着整个运行时
- 以为脱敏规则内置:瀑布自身零规则,导出数据干净程度取决于部署挂载了什么
- Telemetry 是观测侧车,不是第二个会话引擎
- 以为外部子 Agent 能继承父上下文:inheritsParentContext=false,子进程是新环境,唯一读的是 workspace cwd
- 另一个产品里的 Agent,当你的子 Agent
- 以为违例是匿名 throw:InvariantError 必带包名,可归因到具体包
- Invariant 目录文档化:CI 怎样逼每个包自带守卫
- 以为问注册表能知道某一步发了什么提示词:注册表只知道现在,那一步的文字在日志里
- 系统提示词也是一条消息
- 以为系统提示词随请求的 system 字段发出:循环发出的请求让它空着,提示词是从日志推出的第一条系统消息
- 系统提示词也是一条消息
- 以为先密封哈希再签名也行:打包流水线要求先签名、后密封,密封后还要再验一遍并跑 smoke
- 桌面壳里,装着整个运行时
- 以为先写 llm/retry 是为了崩溃后不重复计次:次数随 turn/end 清零,先写是为了让等待本身留在日志里
- 每一次失败都有下文
- 以为消息内容和流一定对得上:输出到上限时消息去掉了工具调用,流里还在
- 为什么不边流边记
- 以为卸掉 image-offload 插件不影响已有会话:用过它的会话读历史就报错,日志里有这种事件的会话没有它也加载不了
- 日志只增不减,历史有进有出
- 以为血缘可以成环自洽:anecestrySeen 一见环就抛错,不认"父子相认"
- 轨迹查询与重放验证:readSession 为什么要把整个日志再跑一遍
- 以为压缩删掉了旧对话:顶替只是把它们从清单上换下,原事件还在日志里
- 日志只增不减,历史有进有出
- 以为一个线程里不会有竞态:竞态出在 await 前后,声明可以并行就得把这些情形兜住
- 同时在跑的调用共用着什么
- 以为一轮当中的认领会顺带取走下一条排队的消息:只有一轮的第一步取 next-turn
- 插话等下一步,排队等下一轮
- 以为有 sessions/create:会话在 session/prompt 时经 getOrCreateSession 惰性建
- stdio 上,程序对程序的 JSON-RPC
- 以为在 DeepSeek 路由上缺结果的工具调用会被自动补上:适配器在序列化时拒收,默认的重试策略也不重试 INVALID_REQUEST
- 请求离开进程之前
- 以为在模型页上改了设置,正在跑的那次请求就用上:它按准备时的那一代配置发完,下一次尝试才用新的
- 请求离开进程之前
- 以为这条线是 LSP:它是 NDJSON 每行一个 JSON 对象,无 Content-Length 头
- stdio 上,程序对程序的 JSON-RPC
- 以为重放帧无害:apply 高 seq 胜,旧 seq 直接丢弃,防重连后标题倒退
- 日志是事实,对话是投影
- 以为重复 dispose 会炸:memoized close 事务共享,重复拆共享同一份 quiescence
- 多 Agent 拆除:cancel 与 dispose 的两个方向
- 以为重复 open 只是丢弃:它是唯一关 socket 的协议违规,其余乱序帧只丢弃
- 浏览器到运行时,中间没有大表
- 以为重试成功以后,失败的那次就不留痕迹:它先整段写成 assistant/attempt,才去问要不要重来
- 每一次失败都有下文
- 以为重试次数跨步累计:llmRetry 投影在 step/start 和 turn/end 清零
- 每一次失败都有下文
- 以为注册表一变模型马上知道:下一步开头才重算,这一步里点到刚撤掉的工具,派发时是找不到工具的错误
- 工具表是按 Agent 算出来的
- 以为桌面是另一个运行时:桌面就是 dsh Web 应用加一个 Electron 壳,Host 还是同一个 profile runner
- 桌面壳里,装着整个运行时
- 以为子 Agent 继承父 Agent 的全部工具:它加入的是父 Agent 挂的那一版 preset,父 Agent 自己那一层传不到它
- 工具表是按 Agent 算出来的
- 以为子 Agent 也能弹审批或向人提问:委派时被钉成 never,提问报 DELEGATED_CALLER
- 另一头有没有人
- 以为组请求时出错就什么也没留下:系统提示词、第一次的 user/message、请求头可能已经写进日志,只是这次尝试不结算
- 每一次失败都有下文
- 以为组装器会拒收写错的流:缺边界、多增量它照拼;进门就拒的是存不成 JSON 的块
- 为什么不边流边记
- 用没有模板的名字启动:profile does not exist,要先用 dsh plugin 建出来
- dsh 启动器管到哪里为止
- 由 headless 建、又在 Web 里打开过的会话,另一个进程用 --session-id 接不上:写锁在 Web 进程手里
- Web 隔着网关等请求,headless 跑完就退
- 预设服务泄漏到 root realm:mountPreset 拒绝,invariant 事后再查
- 一组插件声明,怎样变成一个可共享的 Agent 配置
- 运行中改 --patch 指向的文件:不生效,要重启
- 插件树是一层层补丁叠出来的
- 这个 id 已有活着的 Session 或 Agent:抛 session … already exists 或 agent … is already registered
- Agent 没有自己的 id
- 整份重述过的 config 不再跟着 bundle 升级
- 插件树是一层层补丁叠出来的
- 直接把 key 字面量写进配置:不是被当引用解析,值可能进日志
- 密钥只在内存里转一圈,日志里永远只看到它的"名字"
- 只改行号不改 owner,叙事悄悄漂移
- 从一个 commit 到下一版:这本书怎样更新并收束
- 只写 port: 8080 去改 webserver 行:config 整个被换掉,host 缺失,启动以退出码 1 结束
- 插件树是一层层补丁叠出来的
- 重入 append(发布中再 append):抛 cannot reenter,保护一次发布边界
- 会话里没有状态,只有一本只追加的流水账
- Agent 的 id 与它手里 Session 的 id 不等:agents.enter 抛 agent id … does not match session id …,不进表
- Agent 没有自己的 id
- append 时传入仍可变对象:落盘的是深快照,调用方事后修改不影响账本
- 会话里没有状态,只有一本只追加的流水账
- append 写到一半崩:rollbackAppend 把文件 truncate 回写前大小
- 写一半崩了,已写的数据也不坏
- apply 对不感兴趣的事件返回新对象:即使内容相同也触发下游重算
- 事件是流水,状态是折叠出来的投影
- assistant/message 带 sourceEventSeqs:抛 embeds its source stream and cannot carry
- 每条事件都装在带五格字段的信封里
- bundle 解析失败或版本不兼容:整层跳过,必需行跟着消失时启动审计拦不住
- 插件树是一层层补丁叠出来的
- cordis_inspect_query 改 runtime:工具全程只读,不能调业务 Service
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- frontmatter 写禁用 invocation 键(invocable/mode):rejectLegacyInvocationKey 抛 "frontmatter field \"invocable\" is unsupported; use \"modelInvocable\""
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- goal fold 失败不被捕获:会让整个 drive 崩,而不是记一个 failure 字段
- 事件是流水,状态是折叠出来的投影
- headless 的文本模式不打印会话 id,要接着问得从 --json 的第一条事件里拿
- Web 隔着网关等请求,headless 跑完就退
- imageRequestPricing 缺失或不一致 → 抛错 → 降级保留原文
- 工具输出太大时,全文落盘,上下文只留一张书签
- notice 自身超出 maxInlineTokens → 抛 spill notice for … exceeds maxInlineTokens → 降级
- 工具输出太大时,全文落盘,上下文只留一张书签
- observeHostMutation 漏记:宿主自改被当成外部改动 → 触发重载环(自激)
- 仓库里的 .dsh 目录,怎样变成整个工作区的能力包
- Phase2 swap 失败:回滚到旧工具表,不留下半套
- 外部进程的工具,怎样进全局工具表又不撞名
- provider 失败:只作废该层缓存,其它层照常,warn 一行
- 技能文件从哪几个目录冒出来,又怎样进模型视野
- rename 并发覆盖:改用 link()+unlink(),EEXIST 即拒绝覆盖
- 写一半崩了,已写的数据也不坏
- replace 区间两端不存在于当前表面:替换区间校验失败
- 每条事件都装在带五格字段的信封里
- seed 表面投影非法:invalid seed event at index i(与 live append 同校验)
- 会话里没有状态,只有一本只追加的流水账
- seed 含 BigInt/Map/Date:seed event is not losslessly JSON-serializable
- 会话里没有状态,只有一本只追加的流水账
- Session 先于驱动者离表:收尾事件不再通知出去,持久化收不到(工厂把 Session 的进出折进 Agent 的拆除链来防止)
- Agent 没有自己的 id
- setup、commit() 或 agent/created 的监听器抛错:整个创建回滚,宣告过的条目补发 disposed
- Agent 没有自己的 id
- unknown required 事件在恢复点被拒:白名单 assertSessionEventEnvelope 拦截
- 每条事件都装在带五格字段的信封里
- Web 服务器监听失败:webserver 停在 FAILED,web-runtime 和 connection 停在 PENDING
- 插件跟着它等的服务起落