@xiechimon/cairn-cli 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/cli.mjs +298 -902
  2. package/dist/cli.mjs.map +4 -4
  3. package/package.json +17 -13
package/dist/cli.mjs CHANGED
@@ -51650,20 +51650,13 @@ function isImageAttachmentExt(ext) {
51650
51650
  var BRAND = {
51651
51651
  cliCommandName: "cairn",
51652
51652
  envPrefix: "CAIRN_",
51653
- /** 用户主目录名(挂 $HOME 下)。 */
51654
51653
  homeDirName: ".cairn",
51655
- /** 工作区目录 = <home>/workspaces/<conversationId>(02 §5.8 同槽改名)。 */
51656
51654
  workspacesDirName: "workspaces",
51657
51655
  branchPrefix: "cairn/conv-",
51658
51656
  apiKeyPrefix: "cairn_",
51659
- /** 非品牌槽保持项:远程 MCP 路径(02 §5.8)。 */
51660
51657
  remoteMcpPath: "/api/mcp",
51661
- /** 自有包名(02 §5.8 复刻处置「自发包名」;06 册 W2-D1 npm 公发 → @xiechimon/cairn-cli)。 */
51662
51658
  cliPackageName: "@xiechimon/cairn-cli",
51663
- /** manifest/界面品牌词(素材替换计划 D2:产品名 Cairn;D3 已触发,
51664
- * 界面词槽 Todos→Cairn 同批切换,#109)。 */
51665
51659
  manifestName: "Cairn",
51666
- /** 会话 cookie 名(01 §4.2 自设 [设计];品牌前缀同槽延伸,#109 补登记)。 */
51667
51660
  sessionCookieName: "cairn_session"
51668
51661
  };
51669
51662
  var ENV_VARS = {
@@ -51672,41 +51665,16 @@ var ENV_VARS = {
51672
51665
  team: "CAIRN_TEAM",
51673
51666
  workspacesDir: "CAIRN_WORKSPACES_DIR",
51674
51667
  home: "CAIRN_HOME",
51675
- /** server SPA 静态同源托管根覆写(02/A1,M5;缺省 = monorepo 布局
51676
- * apps/web/dist 存在即托管,apps/server config.ts)。 */
51677
51668
  webDir: "CAIRN_WEB_DIR",
51678
- /** OAuth 握手面 client 凭证对(#231:self-host 无中心 App,用户自注
51679
- * GitHub OAuth App 后以 env 注入;缺 = authorize 400 未配置)。 */
51680
51669
  githubOauthClientId: "CAIRN_GITHUB_OAUTH_CLIENT_ID",
51681
51670
  githubOauthClientSecret: "CAIRN_GITHUB_OAUTH_CLIENT_SECRET",
51682
- /** server 可选 token 鉴权(#251,06 册 D8):设 = 开(Bearer 头主干道;
51683
- * 两条 SSE stream 端点另收 ?token=——EventSource 无法设 header);
51684
- * 未设/空串 = 关(默认,行为与现状一致)。 */
51685
51671
  token: "CAIRN_TOKEN",
51686
- /** 技能根目录覆写(spec 13 #367:skills = 本地目录现扫只读投影;
51687
- * 缺省 = SKILLS_DIR_DEFAULT `~/.agents/skills`,records/skill.ts 单源)。
51688
- * spec 14/#371:daemon 侧同键读扫描根(缺省同上;指向不存在目录 =
51689
- * 空 skills 集,非致命)。 */
51672
+ requireToken: "CAIRN_REQUIRE_TOKEN",
51690
51673
  skillsDir: "CAIRN_SKILLS_DIR",
51691
- /** 本地 MCP config 文件(spec 13/#368):server 投影 UI 面、daemon 解析
51692
- * 执行端点,各读各机;默认 ~/.claude.json 的 mcpServers 段。 */
51693
51674
  mcpConfig: "CAIRN_MCP_CONFIG",
51694
- /** 自定义端点是否声明推理能力(=1 时开):开了 pi 才下发 reasoning_effort,
51695
- * 思考深度才受 thinkingLevel 控制。opt-in——不同后端对该字段容忍度不同
51696
- * (实测某 relay 只认 low/high/max,传 medium 直接 400),默认打开会让一部分
51697
- * 自定义端点整条挂掉。 */
51698
51675
  customModelReasoning: "CAIRN_CUSTOM_MODEL_REASONING",
51699
- /** pi 提示缓存保留档(#927,spec 26):`long` = 长保留档(anthropic
51700
- * cache_control ttl 1h / openai prompt_cache_retention 24h,由 pi 适配器
51701
- * 落请求面);未设/其它值 = `short`(pi 缺省档,请求面与既往零漂移)。
51702
- * long 会向网关发送新字段——部分通道拒未知字段(#654 同族),故 opt-in。 */
51703
51676
  piCacheRetention: "CAIRN_PI_CACHE_RETENTION",
51704
- /** #1149 环境钩子超时毫秒覆写(缺省 20min,WORKSPACE_HOOK_TIMEOUT_MS)。
51705
- * 非 20min 缺省即 opt-in:数值非法(非正整数)= 忽略 env,用缺省。 */
51706
51677
  hookTimeoutMs: "CAIRN_HOOK_TIMEOUT_MS",
51707
- /** #1406 server 的 GitHub issue 进料轮询开关(opt-in,默认关):1 / true /
51708
- * yes 才开——开了每 5 分钟把已连接 GitHub 的项目里带 ready-for-agent 的
51709
- * open issue(D5 核打标人)导入并派发,存量按最旧先;升级不自动开工。 */
51710
51678
  issueIntake: "CAIRN_ISSUE_INTAKE"
51711
51679
  };
51712
51680
  var MACHINE_TOKEN_PATTERN = /^[0-9a-f]{64}$/;
@@ -51717,51 +51685,31 @@ function conversationBranch(conversationId) {
51717
51685
 
51718
51686
  // ../../packages/shared/src/records/machine-capabilities.ts
51719
51687
  var machineHardwareSchema = external_exports.object({
51720
- /** os.cpus().length。 */
51721
51688
  cpuCores: external_exports.number().int().positive(),
51722
- /** os.totalmem(),MiB。可选:升级前落库的指纹没有此字段,读侧不得因此整行
51723
- * 解析失败;推荐公式对缺席者回落估算。 */
51724
51689
  memoryTotalMb: external_exports.number().int().nonnegative().optional(),
51725
- /** os.freemem(),MiB。 */
51726
51690
  memoryAvailableMb: external_exports.number().int().nonnegative(),
51727
- /** os.loadavg()[0],1 分钟负载。 */
51728
51691
  loadAvg1: external_exports.number().nonnegative(),
51729
- /** 技能根所在卷的可用空间,MiB(statfs;根不可读则回落 `/`)。 */
51730
51692
  diskFreeMb: external_exports.number().int().nonnegative()
51731
51693
  });
51732
51694
  var machineCapabilitiesSchema = external_exports.object({
51733
- /** 已装 MCP server slug 集(小写归一,parseClaudeMcpEntries 单源;与
51734
- * agent.mcpServers 勾选值 / claim 载荷 slug 同值域)。 */
51735
51695
  mcpServers: external_exports.array(external_exports.string()),
51736
- /** 本机技能目录名集(machine-owned skills,CAIRN_SKILLS_DIR 扫描根)。
51737
- * team skills 维持 server 单源按步下发(票面界限),不进本清单。 */
51738
51696
  skills: external_exports.array(external_exports.string()),
51739
51697
  hardware: machineHardwareSchema.optional()
51740
51698
  });
51741
51699
  var requiredCapabilitiesSchema = external_exports.object({
51742
- /** 机器必须已装的 MCP server slug 集(⊆ 机器上报 capabilities.mcpServers;
51743
- * 比对前小写归一——与 parseClaudeMcpEntries slug 律同源)。 */
51744
51700
  mcpServers: external_exports.array(external_exports.string()).optional(),
51745
- /** 机器 claude-code 必须已配置的模型 id 集(⊆ claudeCodeReport.models[].id;
51746
- * pi 侧模型由 server 按步物化下发、无本机清单,本维只对 claude-code 机器
51747
- * 事实判定——机器无 claudeCodeReport 快照 = 未知,放行)。 */
51748
51701
  models: external_exports.array(external_exports.string()).optional()
51749
51702
  });
51750
51703
  var stepQueueBlockedSchema = external_exports.object({
51751
51704
  kind: external_exports.enum(["machine-offline", "capability-missing"]),
51752
- /** capability-missing:缺项可读名(capabilityMissingLabels 值域);
51753
- * machine-offline:空集。 */
51754
51705
  missing: external_exports.array(external_exports.string())
51755
51706
  });
51756
51707
  var agentMachineFitRowSchema = external_exports.object({
51757
51708
  machineId: recordId,
51758
51709
  name: external_exports.string(),
51759
51710
  online: external_exports.boolean(),
51760
- /** 机器 enabledRuntimes 是否含该 agent 步所需 runtime(#682 闸同判据)。 */
51761
51711
  runtimeOk: external_exports.boolean(),
51762
- /** 能力闸缺项(capabilityMissingLabels 值域);null = 未上报快照(未知)。 */
51763
51712
  missing: external_exports.array(external_exports.string()).nullable(),
51764
- /** agent.mcpServers 声明中该机未装的 slug;null = 未上报快照(未知)。 */
51765
51713
  mcpGaps: external_exports.array(external_exports.string()).nullable(),
51766
51714
  canRun: external_exports.boolean()
51767
51715
  });
@@ -51773,8 +51721,6 @@ var agentMachineFitResponseSchema = external_exports.object({
51773
51721
  var secretRecordSchema = external_exports.object({
51774
51722
  id: recordId,
51775
51723
  teamId: recordId,
51776
- /** 密钥名(表单 ph `STRIPE_API_KEY`,r2 §6.3;名形 = 环境变量风格的标识符,
51777
- * 取用通道按此名寻址)。 */
51778
51724
  name: external_exports.string(),
51779
51725
  description: external_exports.string().nullable()
51780
51726
  });
@@ -51811,54 +51757,21 @@ var fallbackModelsSchema = external_exports.array(external_exports.object({ prov
51811
51757
  var agentRecordSchema = external_exports.object({
51812
51758
  id: recordId,
51813
51759
  displayName: external_exports.string(),
51814
- /** 职责;未设置时 UI 显「未设置职责」(r3 §4),null 形状 [推断]。 */
51815
51760
  description: external_exports.string().nullable(),
51816
51761
  status: agentStatusSchema,
51817
51762
  avatarUrl: external_exports.string().nullable(),
51818
- /** provider id(r3 §4 样本 provider:"r3-gw" = BYOK 自定义服务商)。 */
51819
51763
  provider: external_exports.string().nullable(),
51820
51764
  modelId: external_exports.string().nullable(),
51821
- /** persona 角色位(#1250 / ADR 0018 决策 0):seeded 角色 agent 的身份键
51822
- * (团队内唯一——unique index on (teamId, persona));非角色 agent = null。
51823
- * 消费面 = persona seeding 幂等键 + review fan-out 三视角解析 + web 指派
51824
- * 面默认槽位。缺省 = 加法契约(老 server 响应/存量行无该键照常解析)。 */
51825
51765
  persona: external_exports.enum(PERSONA_ROLES).nullish(),
51826
- /** 思考强度(r3 样本 null = UI「默认」;wire 值词表未采 [推断])。 */
51827
51766
  thinkingLevel: external_exports.string().nullable(),
51828
- /** 权限 6 开关的已开集 + 授予工具;wire 项形 [推断]。读侧宽(string[],
51829
- * 存量行残值可读);写侧严 = filterAgentTools(XMON-77)——machines
51830
- * enabledRuntimes 同一读写分工。 */
51831
51767
  tools: external_exports.array(external_exports.string()),
51832
- /** 团队密钥授权集(关联 secret id [推断];值只写不读,02 §8)。 */
51833
51768
  secrets: external_exports.array(external_exports.string()),
51834
- /** 默认携带技能(#1169):单值,关联 skill id,null = 不携带。旧 agent.skills
51835
- * 字段「skills[0] 单值」消费面(详情页概览 Select)的正本。与 skillsAllowlist
51836
- * 互不影响:携带不必授权,授权不必携带。 */
51837
51769
  defaultSkill: external_exports.string().nullable(),
51838
- /** 授权白名单(#1169):关联 skill id 集;**null = 不限制**(全量可读,创建
51839
- * 缺省);数组 = 白名单(名单外目录 Read 被 #917 deny 硬挡,bypassPermissions
51840
- * 下仍挡)。「谁都不许读」须显式写 []——闸从意外默认变回有意选择。 */
51841
51770
  skillsAllowlist: external_exports.array(external_exports.string()).nullable(),
51842
- /** MCP 逐个勾选(关联 mcp_server id [推断],02 §7.1)。 */
51843
51771
  mcpServers: external_exports.array(external_exports.string()),
51844
- /** agent 级并发上限(#1138):该 Agent 名下同时执行的 worker 步数上限;
51845
- * null = 不限(缺省——单用户低并发不强制默认值,只对显式设置的 Agent
51846
- * 生效)。claim 候选级闸消费(machines.ts tryClaim,与机器 maxConcurrent
51847
- * 双层各自 gate)。optional 形 = 加法契约(machine maxConcurrent 同律):
51848
- * 老 server 响应缺字段可解析(消费面回退不渲染);server 恒发全块。 */
51849
51772
  maxConcurrentTasks: external_exports.number().int().nullable().optional(),
51850
- /** 归属机(#1259):agent 绑定的机器 id,其步只投给该机。null = 未设
51851
- * 归属机(存量回填漏网)——不可领步,UI 可补。optional 形 = 加法契约
51852
- * (maxConcurrentTasks 同律):老 server 响应缺字段可解析。 */
51853
51773
  machineId: recordId.nullable().optional(),
51854
- /** 能力要求声明(#1251 / ADR 0018 决策 4.2):该 Agent 的步对执行机的
51855
- * 能力要求(MCP slug 集 / claude-code 模型 id 集)。null = 无要求(缺省/
51856
- * 存量行)。消费面 = dispatch-eligibility 能力闸(机器上报快照不满足 →
51857
- * 不领该 Agent 的步)+ agent 面「哪些机器可跑它」。nullish 加法契约
51858
- * (maxConcurrentTasks 同律):老 server 响应缺字段照常解析。 */
51859
51774
  requiredCapabilities: requiredCapabilitiesSchema.nullish(),
51860
- /** 降级链(#1493):null = 不降级。nullish 加法契约(requiredCapabilities
51861
- * 同律):老 server 响应缺字段照常解析。 */
51862
51775
  fallbackModels: fallbackModelsSchema.nullish()
51863
51776
  });
51864
51777
  var createAgentBodySchema = external_exports.object({
@@ -51867,40 +51780,21 @@ var createAgentBodySchema = external_exports.object({
51867
51780
  provider: external_exports.string().nullish(),
51868
51781
  modelId: external_exports.string().nullish(),
51869
51782
  thinkingLevel: external_exports.string().nullish(),
51870
- /** persona 角色位(#1250):nullish——显式 null = 不挂角色(普通 agent);
51871
- * 正常创建缺省不带位。值域 PERSONA_ROLES(词表外值 400)。 */
51872
51783
  persona: external_exports.enum(PERSONA_ROLES).nullish(),
51873
51784
  tools: external_exports.array(external_exports.string()).optional(),
51874
51785
  secrets: external_exports.array(external_exports.string()).optional(),
51875
- /** 单值槽(#1169):数组(含单元素)拒——携带语义不得再经数组位表达。 */
51876
51786
  defaultSkill: external_exports.string().nullish(),
51877
- /** nullish(#1169):显式 null = 不限制(与缺省同值);[] = 显式全拒。 */
51878
51787
  skillsAllowlist: external_exports.array(external_exports.string()).nullish(),
51879
51788
  mcpServers: external_exports.array(external_exports.string()).optional(),
51880
- /** agent 级并发上限(#1138):值域 1..50(Multica agent 层闸同区间,
51881
- * r10 §5.4);nullish——显式 null = 不限(与缺省同值)。 */
51882
51789
  maxConcurrentTasks: external_exports.number().int().min(1).max(50).nullish(),
51883
- /** 归属机(#1259):创建必填——机器归属单源在 agent 层(任务层钉选已
51884
- * 退役)。server 校验该机在本团队、启用了对应 runtime、且(claude-code
51885
- * 时)已配 modelId。 */
51886
51790
  machineId: recordId,
51887
- /** 能力要求声明(#1251):nullish——显式 null = 清空回无要求(与缺省
51888
- * 同值);对象形状由 requiredCapabilitiesSchema 收严(类型错 400)。 */
51889
51791
  requiredCapabilities: requiredCapabilitiesSchema.nullish(),
51890
- /** 降级链(#1493):nullish——显式 null = 清空(不降级);超过 5 个 400。 */
51891
51792
  fallbackModels: fallbackModelsSchema.nullish()
51892
51793
  });
51893
51794
  var agentTaskSchema = external_exports.object({
51894
- /** 行种类。观测到的字面量只有 'build'(墓碑行的字面量未采 [推断])。 */
51895
51795
  kind: external_exports.literal("build"),
51896
- /** build 自身状态。'waiting' = 已建、尚无机器领取,消费面落 PhasePill 时
51897
- * 映射为 `queued`。非等待态的 token 未采 [推断]——本仓发 null,消费面按
51898
- * `todo.phase` 渲染,渲染结果与原件同(跑起来的 build,其 todo.phase 本身
51899
- * 就是 planning/building)。 */
51900
51796
  state: external_exports.literal("waiting").nullable(),
51901
- /** 行的 key(原件 `key={r.buildId}`);= todo.latestBuildId。 */
51902
51797
  buildId: recordId,
51903
- /** 行内被渲染的字段(含点击落点 id)。 */
51904
51798
  todo: external_exports.object({
51905
51799
  id: recordId,
51906
51800
  seqNum: external_exports.number().int(),
@@ -51917,17 +51811,10 @@ var chiefRecordSchema = external_exports.object({
51917
51811
  id: external_exports.string(),
51918
51812
  userId: recordId,
51919
51813
  teamId: recordId,
51920
- /** 绑定 Agent(走 PATCH teams/{id}/chief + 二次确认,记忆不迁移告示,
51921
- * r5 §2);未绑定 null。#1260:chief 的模型/思考强度/归属机全部读这
51922
- * 个 Agent 的自身配置,chief 记录不持覆盖槽。 */
51923
51814
  agent: external_exports.object({ agentId: recordId }).nullable(),
51924
- /** 章程 = 常设指示(r5 §2 章程 tab;空态「尚无章程。点击编辑,为总管添加
51925
- * 常设指示。」);raw 观测默认空串(chief-record-testA.json 一手)。 */
51926
51815
  charter: external_exports.string().nullable(),
51927
51816
  lastTurnAt: epochMs.nullable(),
51928
51817
  createdAt: epochMs,
51929
- /** 用户时区(raw chief-record-testA.json 一手 `tz:"Asia/Shanghai"`;
51930
- * r5 §3.6 正文枚举漏记,M4a 补录)。 */
51931
51818
  tz: external_exports.string().nullable().optional()
51932
51819
  });
51933
51820
  var chiefWatchSchema = external_exports.object({
@@ -51937,7 +51824,6 @@ var chiefWatchSchema = external_exports.object({
51937
51824
  title: external_exports.string(),
51938
51825
  projectName: external_exports.string(),
51939
51826
  phase: phaseSchema,
51940
- /** 派工 watch 的 reason canon(02 §4.3/r5 §3.5 原文)。 */
51941
51827
  reason: external_exports.string(),
51942
51828
  createdAt: epochMs,
51943
51829
  threadId: recordId,
@@ -51954,22 +51840,13 @@ var chiefOrchestrationActivitySchema = external_exports.object({
51954
51840
  });
51955
51841
  var chiefGetResponseSchema = external_exports.object({
51956
51842
  chief: chiefRecordSchema,
51957
- /** 绑定 Agent 全记录(records/agent.ts 形状);未绑定 null。 */
51958
51843
  agentActor: agentRecordSchema.nullable(),
51959
- /** context.tokens 随回合增长(r5 §3.6 两次 API 实测 27065→29866)。 */
51960
51844
  context: external_exports.object({
51961
51845
  tokens: external_exports.number().int(),
51962
51846
  contextWindow: external_exports.number().int()
51963
51847
  }).nullable(),
51964
51848
  watches: external_exports.array(chiefWatchSchema),
51965
- /** wakes[] 非空形态未实测(r5 §10:set_wake 实走遗留)[推断],开放条目。 */
51966
51849
  wakes: external_exports.array(external_exports.record(external_exports.string(), external_exports.unknown())),
51967
- /** 编排状态块(#895 spec 21 A5 [设计],加法契约——optional:老封套/老
51968
- * web 不带它仍可 parse,忽略即退化现状):homeMachineId = 绑定 Agent
51969
- * 的归属机(#1260:chief 步去处的唯一答案;未绑定/未设 = null);
51970
- * activity = per 机 running/waiting 计数(team 域 chief 步计数——
51971
- * machines 页是团队面)。消费方 = machines 页三态读标注(A8:join
51972
- * useMachines,行内零控件)。server 恒发全块(getChiefEnvelope)。 */
51973
51850
  orchestration: external_exports.object({
51974
51851
  homeMachineId: recordId.nullable(),
51975
51852
  activity: external_exports.array(chiefOrchestrationActivitySchema)
@@ -51977,11 +51854,9 @@ var chiefGetResponseSchema = external_exports.object({
51977
51854
  });
51978
51855
  var chiefThreadSchema = external_exports.object({
51979
51856
  id: external_exports.string(),
51980
- // chief-<uuid>
51981
51857
  chiefId: recordId,
51982
51858
  userId: recordId,
51983
51859
  teamId: recordId,
51984
- /** 首句截断 + …(r5 §3.6)。 */
51985
51860
  title: external_exports.string(),
51986
51861
  createdAt: epochMs,
51987
51862
  updatedAt: epochMs,
@@ -51992,17 +51867,10 @@ var chiefThreadSchema = external_exports.object({
51992
51867
  openedAt: epochMs
51993
51868
  }),
51994
51869
  pendingSessionResumeAt: epochMs.nullable(),
51995
- /** 工具定义/结果哈希表(51 词表的哈希键面,r5 §3.1;词表本体归 M4)。 */
51996
51870
  toolDefHashes: external_exports.record(external_exports.string(), external_exports.string()),
51997
51871
  toolResultHashes: external_exports.record(external_exports.string(), external_exports.string()),
51998
51872
  activeRun: activeRunSchema,
51999
51873
  lastTurnError: external_exports.string().nullable().optional(),
52000
- /** 回合排队投影(#1108 [设计],加法契约 optional):活动回合的步还在
52001
- * pending(未被任何机器认领)时由 server 派生——抽屉在飞存在行据此从
52002
- * `处理中...` 切到 `排队中...` + 位次 + 等待对象。缺席 = 回合不在飞或
52003
- * 已被认领(老 server / fixture 面同形退化,呈现回落既有标签)。形 =
52004
- * stepJournalRowSchema.queue 同源(records/step.ts StepQueueInfo——
52005
- * 位次与等待对象只有一套口径)。 */
52006
51874
  turnQueue: external_exports.object({
52007
51875
  position: external_exports.number().int().min(1),
52008
51876
  waitingFor: external_exports.object({
@@ -52011,7 +51879,6 @@ var chiefThreadSchema = external_exports.object({
52011
51879
  running: external_exports.number().int(),
52012
51880
  capacity: external_exports.number().int()
52013
51881
  }).nullable(),
52014
- /** pending 成因(#1251,StepQueueInfo.blocked 同源同形)。 */
52015
51882
  blocked: stepQueueBlockedSchema.optional()
52016
51883
  }).nullable().optional()
52017
51884
  });
@@ -52049,7 +51916,6 @@ var chiefTurnErrorContentSchema = external_exports.object({
52049
51916
  });
52050
51917
  var ASK_USER_QUESTION_KIND = "ask_user_question";
52051
51918
  var askUserQuestionSchema = external_exports.object({
52052
- /** 短标题(卡上按块头渲染)。 */
52053
51919
  header: external_exports.string().min(1),
52054
51920
  question: external_exports.string().min(1),
52055
51921
  options: external_exports.array(
@@ -52058,7 +51924,6 @@ var askUserQuestionSchema = external_exports.object({
52058
51924
  description: external_exports.string().optional()
52059
51925
  })
52060
51926
  ).max(8),
52061
- /** 多选(选项题;自由文本题恒单答,位被忽略)。 */
52062
51927
  multiSelect: external_exports.boolean().optional()
52063
51928
  });
52064
51929
  var askUserAnswerSchema = external_exports.object({
@@ -52092,9 +51957,6 @@ var machineAskResponseSchema = external_exports.object({
52092
51957
  });
52093
51958
  var conversationMessagesResponseSchema = external_exports.object({
52094
51959
  messages: external_exports.array(transcriptRowSchema),
52095
- /** chips/steerPending/nextCursor 细形未逐一采集 [推断](steerPending[] 为
52096
- * 数组形观测;steer 语义 = 回合中补充说明即送,r5 §3.6)。W3 #278 起
52097
- * build 会话分支透出单槽 pending 内容([pending.content])。 */
52098
51960
  chips: external_exports.unknown(),
52099
51961
  historyEpoch: external_exports.number().int(),
52100
51962
  steerPending: external_exports.array(external_exports.unknown()),
@@ -52128,30 +51990,19 @@ var providerModelSchema = external_exports.object({
52128
51990
  maxTokens: external_exports.number().int().positive().optional()
52129
51991
  });
52130
51992
  var providerCompatSchema = external_exports.object({
52131
- /** 系统提示词走 developer 角色的支持位(r3 §2 表单实测;false = 用
52132
- * system 角色发)。 */
52133
51993
  supportsDeveloperRole: external_exports.boolean().optional(),
52134
- /** token 上限字段名:现代 `max_completion_tokens` / 旧式 `max_tokens`。
52135
- * 部分网关通道拒现代字段(#654 实测:relay 确定性 400「Model does not
52136
- * support this protocol」,同形重试恒败)。 */
52137
51994
  maxTokensField: external_exports.enum(["max_completion_tokens", "max_tokens"]).optional(),
52138
- /** 是否发送 OpenAI `store` 字段(pi 探测默认对未知端点发 `store:false`)。
52139
- * 部分网关通道拒该字段(#654 同上)。 */
52140
51995
  supportsStore: external_exports.boolean().optional()
52141
51996
  });
52142
51997
  var providerRecordSchema = external_exports.object({
52143
51998
  kind: external_exports.literal("custom"),
52144
51999
  providerId: external_exports.string(),
52145
- // 服务商 ID(表单 ph `例如 my-relay`,r3 §2)
52146
52000
  label: external_exports.string(),
52147
52001
  baseUrl: external_exports.string(),
52148
- // 表单 ph `https://api.example.com/v1`(r3 §2)
52149
52002
  api: providerApiSchema,
52150
- /** 「以 Authorization: Bearer 请求头发送 API 密钥」复选(r3 §2/§6.2)。 */
52151
52003
  authHeader: external_exports.boolean(),
52152
52004
  compat: providerCompatSchema,
52153
52005
  models: external_exports.array(providerModelSchema),
52154
- // `探测模型` 对 /v1/models 拉列表(r3 §2)
52155
52006
  id: recordId,
52156
52007
  createdBy: recordId,
52157
52008
  createdAt: epochMs,
@@ -52182,8 +52033,6 @@ var toolCallRecordSchema = external_exports.object({
52182
52033
  id: external_exports.string(),
52183
52034
  name: external_exports.string(),
52184
52035
  arguments: external_exports.unknown(),
52185
- /** 执行结果(toolcall 块完成时可能尚未有结果——live 回传时缺省,
52186
- * transcript 终稿必含 [设计])。 */
52187
52036
  result: external_exports.unknown().optional(),
52188
52037
  isError: external_exports.boolean().optional(),
52189
52038
  startedAt: epochMs.optional(),
@@ -52208,16 +52057,10 @@ var modelUsageSchema = external_exports.object({
52208
52057
  var agentTokenUsageSchema = external_exports.array(modelUsageSchema);
52209
52058
  var providerConfigSchema = external_exports.object({
52210
52059
  kind: external_exports.enum(["api_key", "oauth", "http"]),
52211
- /** preset provider id(38 目录,records/provider.ts)或 custom providerId。 */
52212
52060
  providerId: external_exports.string(),
52213
52061
  label: external_exports.string().optional(),
52214
- /** custom 端点 baseUrl(preset 走 pi 内建目录时可缺省)。 */
52215
52062
  baseUrl: external_exports.string().optional(),
52216
- /** custom 端点三协议(records/provider.ts providerApiSchema)。 */
52217
52063
  api: providerApiSchema.optional(),
52218
- /** 兼容旋钮(#654:records/provider.ts providerCompatSchema——maxTokensField
52219
- * / supportsStore / supportsDeveloperRole;daemon 物化进 pi models.json,
52220
- * 缺省位 = pi 端点探测默认)。 */
52221
52064
  compat: providerCompatSchema.optional(),
52222
52065
  authHeader: external_exports.boolean().optional(),
52223
52066
  models: external_exports.array(providerModelSchema).optional(),
@@ -52236,7 +52079,6 @@ var mcpEndpointSchema = external_exports.object({
52236
52079
  command: external_exports.string().optional(),
52237
52080
  args: external_exports.array(external_exports.string()).optional(),
52238
52081
  headers: external_exports.record(external_exports.string(), external_exports.string()).optional(),
52239
- /** stdio 子进程环境(config env 段;SDK 与默认继承环境合并后 spawn)。 */
52240
52082
  env: external_exports.record(external_exports.string(), external_exports.string()).optional()
52241
52083
  });
52242
52084
  var stepEventSchema = external_exports.discriminatedUnion("type", [
@@ -52275,7 +52117,7 @@ var sessionRefSchema = external_exports.object({
52275
52117
 
52276
52118
  // ../../packages/shared/src/ansi.ts
52277
52119
  var ANSI_ESCAPE_RE = (
52278
- // biome-ignore lint/suspicious/noControlCharactersInRegex: 剥离器的本体就是控制字符——ESC/BEL 是 CSI/OSC 序列的定义字符,无可替代写法。
52120
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ESC/BEL are the literal bytes of CSI/OSC sequences; there is no alternative spelling.
52279
52121
  /\x1b\[[0-?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g
52280
52122
  );
52281
52123
  function stripAnsiEscapes(text) {
@@ -52285,11 +52127,8 @@ function stripAnsiEscapes(text) {
52285
52127
  // ../../packages/shared/src/records/plan.ts
52286
52128
  var PLAN_FILE_NAME = "plan.md";
52287
52129
  var planRecordSchema = external_exports.object({
52288
- /** = build.planDocId(documents/{id}/diff 的 {id} 同值)。 */
52289
52130
  id: recordId,
52290
52131
  buildId: recordId,
52291
- // ≡ conversationId
52292
- /** 文档版本(v1、v2…,r5 §4 版本机制)。 */
52293
52132
  version: external_exports.number().int().min(1),
52294
52133
  createdAt: epochMs
52295
52134
  });
@@ -52310,34 +52149,22 @@ var infoReportMessageSchema = external_exports.object({
52310
52149
  // ../../packages/shared/src/records/review.ts
52311
52150
  var reviewSeveritySchema = external_exports.enum(["blocking", "suggestion", "info"]);
52312
52151
  var reviewFindingSchema = external_exports.object({
52313
- /** 稳定 id(呈现层编号排序键;服务端写库时建议 1..N 自然序生成)。 */
52314
52152
  id: external_exports.string(),
52315
52153
  severity: reviewSeveritySchema,
52316
- /** finding 标题(r8 60/65:finding 段第一行;与 description 段区分)。 */
52317
52154
  summary: external_exports.string(),
52318
- /** finding 解释段(r8 60:finding 段第二行;多行按 \n 拆段渲染)。 */
52319
52155
  description: external_exports.string().optional(),
52320
- /** 引用文件路径(r8 60/65:file 字段;缺省 = 无引用)。 */
52321
52156
  file: external_exports.string().optional(),
52322
- /** 文件内行号(r8 60/65:file:line 形式;缺省 = 仅文件)。#808:模型常把
52323
- * 行号写成字符串(如 "line": "1")——coerce 容错,保持 int/positive 语义。 */
52324
52157
  line: external_exports.coerce.number().int().positive().optional(),
52325
- /** 建议修复段(r8 60/65:建议段;缺省 = 无建议)。 */
52326
52158
  suggestion: external_exports.string().optional()
52327
52159
  });
52328
52160
  var reviewVerdictSchema = external_exports.object({
52329
- /** 一段总结(r8 60:审核消息首段;方案是否通过 + 概览)。 */
52330
52161
  conclusion: external_exports.string(),
52331
- /** 编号 findings(按 id 升序;缺省 = 仅结论无 findings,含义 = 方案
52332
- * 通过)。blocking 项触发 server 端自动修订回路。 */
52333
52162
  findings: external_exports.array(reviewFindingSchema).default([])
52334
52163
  });
52335
52164
  var reviewGateSchema = external_exports.enum(["confirm", "review"]);
52336
52165
  var reviewPromptMetaSchema = external_exports.object({
52337
52166
  kind: external_exports.literal("review"),
52338
52167
  agentId: external_exports.string(),
52339
- /** 缺省 = 无该字段的存量 prompt(#511 之前入队):按 `confirm` 语义处理
52340
- * (不开检出、材料不含变更),与旧 server 行为逐字节一致。 */
52341
52168
  gate: reviewGateSchema.optional()
52342
52169
  });
52343
52170
  function parseReviewPromptMeta(prompt) {
@@ -52361,10 +52188,7 @@ var CHECKOUT_SECTION = [
52361
52188
 
52362
52189
  // ../../packages/shared/src/records/document-diff.ts
52363
52190
  var diffHunkSchema = external_exports.object({
52364
- /** `@@ -1,17 +1,14 @@`(r5 §4 实测 hunk 头)。 */
52365
52191
  header: external_exports.string(),
52366
- /** ±行与上下文行(双侧行号由渲染层展开,01 §4.1 diff 视图 = npm diff 数据
52367
- * + 自建渲染)。 */
52368
52192
  lines: external_exports.array(external_exports.string())
52369
52193
  });
52370
52194
  var diffFileSchema = external_exports.object({
@@ -52374,24 +52198,301 @@ var diffFileSchema = external_exports.object({
52374
52198
  hunks: external_exports.array(diffHunkSchema)
52375
52199
  });
52376
52200
  var documentDiffSchema = external_exports.object({
52377
- /** chip `v1 → v2`(r5 §4)。 */
52378
52201
  fromVersion: external_exports.number().int(),
52379
52202
  toVersion: external_exports.number().int(),
52380
52203
  files: external_exports.array(diffFileSchema)
52381
52204
  });
52382
52205
  var diffFileContentSchema = external_exports.object({
52383
- /** conv 分支名(brand.ts conversationBranch(buildId))。 */
52384
52206
  ref: external_exports.string(),
52385
- /** 解析后的 conv 分支头 commit sha。 */
52386
52207
  commit: external_exports.string(),
52387
52208
  path: external_exports.string(),
52388
52209
  size: external_exports.number().int(),
52389
- /** 二进制(首 8KB 含 NUL,git 同款启发式)→ base64;超 1 MiB 闸门 = 413
52390
- * 不落本封套(server 侧 DIFF_FILE_MAX_BYTES)。 */
52391
52210
  encoding: external_exports.enum(["utf-8", "base64"]),
52392
52211
  content: external_exports.string()
52393
52212
  });
52394
52213
 
52214
+ // ../../packages/shared/src/records/merge-gate.ts
52215
+ var MERGE_POLICIES = ["human", "shadow", "autonomous"];
52216
+ var mergePolicySchema = external_exports.enum(MERGE_POLICIES);
52217
+ var GATE_LIMITS = {
52218
+ maxLines: 800,
52219
+ maxFiles: 40,
52220
+ compareFileCap: 300,
52221
+ fixRoundsMax: 2,
52222
+ roundsMax: 4,
52223
+ perspectiveDeadlineMs: 36e5,
52224
+ perspectiveRetries: 1
52225
+ };
52226
+ var EVIDENCE_EXECUTABLE_EXTENSIONS = [
52227
+ ".mjs",
52228
+ ".cjs",
52229
+ ".js",
52230
+ ".mts",
52231
+ ".cts",
52232
+ ".ts",
52233
+ ".jsx",
52234
+ ".tsx",
52235
+ ".sh",
52236
+ ".py",
52237
+ ".bash",
52238
+ ".zsh",
52239
+ ".fish",
52240
+ ".ps1",
52241
+ ".psm1",
52242
+ ".bat",
52243
+ ".cmd",
52244
+ ".html",
52245
+ ".htm"
52246
+ ];
52247
+ var AUTO_MERGE_PATH_GLOBS = [
52248
+ "apps/*/src/**",
52249
+ "apps/*/test/**",
52250
+ "apps/*/e2e/**",
52251
+ "packages/*/src/**",
52252
+ "packages/*/test/**",
52253
+ "integration/test/**",
52254
+ "docs/verify/**"
52255
+ ];
52256
+ var PROTECTED_PATH_GLOBS = [
52257
+ ".github/**",
52258
+ "**/.husky/**",
52259
+ "**/.claude/**",
52260
+ "**/.pi/**",
52261
+ "**/.cursor/**",
52262
+ "**/.mcp.json",
52263
+ "**/.ckignore",
52264
+ "**/CLAUDE*.md",
52265
+ "**/AGENTS*.md",
52266
+ "docs/pr-review.md",
52267
+ "docs/adr/**",
52268
+ "**/scripts/**",
52269
+ "**/*.config.*",
52270
+ "**/biome.json",
52271
+ "**/biome.jsonc",
52272
+ "**/tsconfig*.json",
52273
+ "**/.gitignore",
52274
+ "**/.gitattributes",
52275
+ "**/drizzle/**",
52276
+ "**/package.json",
52277
+ "pnpm-lock.yaml",
52278
+ "pnpm-workspace.yaml",
52279
+ "**/.npmrc",
52280
+ "apps/server/src/lib/secret-box.ts",
52281
+ "apps/server/src/lib/keys.ts",
52282
+ "apps/server/src/lib/token-auth.ts",
52283
+ "apps/server/src/lib/attachments-token.ts",
52284
+ "apps/server/src/services/secrets.ts",
52285
+ "apps/server/src/services/credentials.ts",
52286
+ "apps/server/src/services/api-keys.ts",
52287
+ "apps/server/src/services/webhook-tokens.ts",
52288
+ "apps/server/src/services/oauth.ts",
52289
+ "apps/server/src/routes-machine.ts",
52290
+ "apps/server/src/services/machine*.ts",
52291
+ "apps/daemon/src/credentials.ts",
52292
+ "apps/daemon/src/secret-channel.ts",
52293
+ "apps/daemon/src/shell-channel.ts",
52294
+ "apps/daemon/src/machine-client.ts",
52295
+ "apps/daemon/src/backend/command-gate.ts",
52296
+ "apps/server/src/services/mcp-face.ts",
52297
+ "apps/server/src/services/mcp-servers.ts",
52298
+ "apps/server/src/routes-webhook.ts",
52299
+ "apps/server/src/db/client.ts"
52300
+ ];
52301
+ var MERGE_GATE_SOURCE_GLOBS = [
52302
+ "apps/server/src/services/merge-gate/**",
52303
+ "packages/shared/src/records/merge-gate.ts",
52304
+ "apps/daemon/src/merge-decision.ts"
52305
+ ];
52306
+ var CHIEF_DISPATCH_DIR = "integration/eval/chief-dispatch";
52307
+ var CHIEF_DISPATCH_HARNESS_PATHS = [
52308
+ `${CHIEF_DISPATCH_DIR}/stack.mts`,
52309
+ "apps/daemon/src/backend/pi.ts",
52310
+ "apps/server/src/services/chief-tools.ts",
52311
+ "packages/shared/src/protocol/chief-tools.ts",
52312
+ `${CHIEF_DISPATCH_DIR}/grade.mts`,
52313
+ ".claude/hillclimb/chief-dispatch/cases.json",
52314
+ "apps/server/src/services/chief.ts",
52315
+ `${CHIEF_DISPATCH_DIR}/repo-seed/.github/workflows/ci.yml`,
52316
+ `${CHIEF_DISPATCH_DIR}/repo-seed/CHANGELOG.md`,
52317
+ `${CHIEF_DISPATCH_DIR}/repo-seed/Dockerfile`,
52318
+ `${CHIEF_DISPATCH_DIR}/repo-seed/README.md`,
52319
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/daemon/package.json`,
52320
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/README.md`,
52321
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/package.json`,
52322
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/auth.ts`,
52323
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/export.ts`,
52324
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/routes.ts`,
52325
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/search.ts`,
52326
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/tasks.ts`,
52327
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/server/src/todos.ts`,
52328
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/README.md`,
52329
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/package.json`,
52330
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/src/board.tsx`,
52331
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/src/export-button.tsx`,
52332
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/src/login.tsx`,
52333
+ `${CHIEF_DISPATCH_DIR}/repo-seed/apps/web/src/theme.ts`,
52334
+ `${CHIEF_DISPATCH_DIR}/repo-seed/docs/api.md`,
52335
+ `${CHIEF_DISPATCH_DIR}/repo-seed/docs/deploy.md`,
52336
+ `${CHIEF_DISPATCH_DIR}/repo-seed/docs/index.md`,
52337
+ `${CHIEF_DISPATCH_DIR}/repo-seed/docs/usage.md`,
52338
+ `${CHIEF_DISPATCH_DIR}/repo-seed/package.json`,
52339
+ `${CHIEF_DISPATCH_DIR}/repo-seed/packages/shared/README.md`,
52340
+ `${CHIEF_DISPATCH_DIR}/repo-seed/packages/shared/package.json`,
52341
+ `${CHIEF_DISPATCH_DIR}/repo-seed/packages/shared/src/protocol.ts`
52342
+ ];
52343
+ var harnessRegressionResultSchema = external_exports.object({
52344
+ patchDigest: external_exports.string().min(1),
52345
+ harness_sha: external_exports.string().regex(/^[0-9a-f]{64}$/),
52346
+ decision_ok: external_exports.number().finite().min(0).max(1),
52347
+ trace_digest: external_exports.string().regex(/^[0-9a-f]{64}$/)
52348
+ });
52349
+ var COMPARE_FILE_STATUSES = [
52350
+ "added",
52351
+ "removed",
52352
+ "modified",
52353
+ "renamed",
52354
+ "copied",
52355
+ "changed",
52356
+ "unchanged"
52357
+ ];
52358
+ var compareFileSchema = external_exports.object({
52359
+ status: external_exports.enum(COMPARE_FILE_STATUSES),
52360
+ filename: external_exports.string().min(1),
52361
+ previousFilename: external_exports.string().min(1).nullable(),
52362
+ sha: external_exports.string().nullable(),
52363
+ additions: external_exports.number().int().nonnegative(),
52364
+ deletions: external_exports.number().int().nonnegative(),
52365
+ patchSha: external_exports.string().regex(/^[0-9a-f]{64}$/).nullable()
52366
+ });
52367
+ var BLOCKER_CLASSES = ["policy", "transient", "human"];
52368
+ var MERGE_BLOCKERS = [
52369
+ { code: "policy-human", class: "policy", label: "\u9879\u76EE\u7B56\u7565\u4E3A\u4EBA\u5DE5\u5408\u5E76" },
52370
+ { code: "autonomy-paused", class: "policy", label: "\u81EA\u6CBB\u5408\u5E76\u5DF2\u6682\u505C" },
52371
+ { code: "daily-cap", class: "policy", label: "\u5F53\u65E5\u81EA\u6CBB\u5408\u5E76\u6570\u5DF2\u8FBE\u4E0A\u9650" },
52372
+ { code: "not-applicable", class: "policy", label: "\u4E0D\u662F GitHub PR \u5F62\u6001\u7684\u6784\u5EFA" },
52373
+ { code: "not-current-build", class: "transient", label: "\u4E0D\u662F\u4EFB\u52A1\u7684\u5F53\u524D\u6784\u5EFA" },
52374
+ { code: "phase-not-review", class: "transient", label: "\u4EFB\u52A1\u4E0D\u5728\u5BA1\u6838\u5173\u53E3" },
52375
+ { code: "work-in-flight", class: "transient", label: "\u8FD8\u6709\u6B65\u9AA4\u5728\u8DD1" },
52376
+ {
52377
+ code: "pr-unreadable",
52378
+ class: "transient",
52379
+ label: "\u8BFB\u4E0D\u5230 PR \u6216\u4ED3\u5E93\u9ED8\u8BA4\u5206\u652F\uFF0C\u6216 PR \u7684 head \u4E0D\u662F\u53EF\u7528\u7684 SHA"
52380
+ },
52381
+ { code: "pr-not-open", class: "human", label: "PR \u5DF2\u5408\u5E76\u6216\u5DF2\u5173\u95ED" },
52382
+ { code: "pr-draft", class: "transient", label: "PR \u662F\u8349\u7A3F" },
52383
+ { code: "pr-behind-base", class: "transient", label: "PR \u843D\u540E\u4E8E\u76EE\u6807\u5206\u652F\u6216\u843D\u540E\u6570\u672A\u77E5" },
52384
+ { code: "pr-from-fork", class: "human", label: "PR \u6765\u81EA fork" },
52385
+ { code: "base-not-default", class: "human", label: "PR \u7684\u76EE\u6807\u5206\u652F\u4E0D\u662F\u9ED8\u8BA4\u5206\u652F" },
52386
+ { code: "mergeable-state", class: "transient", label: "GitHub \u5224\u5B9A\u6682\u4E0D\u53EF\u5408\u5E76" },
52387
+ { code: "self-required", class: "human", label: "cairn/merge-gate \u88AB\u8BBE\u6210\u4E86\u5FC5\u9700\u68C0\u67E5" },
52388
+ {
52389
+ code: "required-checks-unreadable",
52390
+ class: "transient",
52391
+ label: "\u8BFB\u4E0D\u5230\u5F53\u524D head \u7684\u68C0\u67E5\u6216\u5FC5\u9700\u68C0\u67E5\u6E05\u5355"
52392
+ },
52393
+ { code: "required-checks-none", class: "human", label: "\u9ED8\u8BA4\u5206\u652F\u6CA1\u6709\u5FC5\u9700\u68C0\u67E5" },
52394
+ { code: "required-check-missing", class: "transient", label: "\u5FC5\u9700\u68C0\u67E5\u5728\u5F53\u524D head \u4E0A\u7F3A\u5E2D" },
52395
+ { code: "required-check-pending", class: "transient", label: "\u5FC5\u9700\u68C0\u67E5\u8FD8\u5728\u8DD1" },
52396
+ { code: "required-check-failed", class: "transient", label: "\u5FC5\u9700\u68C0\u67E5\u672A\u901A\u8FC7" },
52397
+ { code: "pr-evidence-not-green", class: "transient", label: "pr-evidence \u672A\u901A\u8FC7" },
52398
+ {
52399
+ code: "patch-unavailable",
52400
+ class: "transient",
52401
+ label: "\u8BFB\u4E0D\u5230\u5F53\u524D head \u7684 compare\uFF0C\u8865\u4E01\u6458\u8981\u6682\u4E0D\u53EF\u5F97"
52402
+ },
52403
+ {
52404
+ code: "compare-malformed",
52405
+ class: "human",
52406
+ label: "compare \u7684\u54CD\u5E94\u5F62\u72B6\u4E0D\u5BF9\uFF0C\u6216\u5B83\u7684 SHA\uFF08\u8BF7\u6C42\u7684 head\u3001\u63D0\u4EA4\u3001\u7236\u63D0\u4EA4\uFF09\u5199\u9519"
52407
+ },
52408
+ { code: "compare-truncated", class: "human", label: "compare \u6587\u4EF6\u5217\u8868\u88AB\u622A\u65AD" },
52409
+ {
52410
+ code: "patch-unbindable",
52411
+ class: "human",
52412
+ label: "\u8865\u4E01\u65E0\u6CD5\u53D6\u6458\u8981\uFF08\u8BC1\u636E\u4E4B\u5916\u6CA1\u6709\u6587\u4EF6\uFF0C\u6216\u6709\u6587\u4EF6\u7F3A blob sha\uFF09"
52413
+ },
52414
+ { code: "size-cap", class: "human", label: "\u8865\u4E01\u8D85\u8FC7 800 \u884C\u6216 40 \u4E2A\u6587\u4EF6" },
52415
+ { code: "protected-path", class: "human", label: "\u6539\u52A8\u547D\u4E2D D4 \u4FDD\u62A4\u8DEF\u5F84" },
52416
+ { code: "outside-auto-merge", class: "human", label: "\u6539\u52A8\u5728\u53EF\u81EA\u52A8\u5408\u5E76\u96C6\u4E4B\u5916" },
52417
+ { code: "test-deleted", class: "human", label: "\u5220\u9664\u4E86\u6D4B\u8BD5" },
52418
+ {
52419
+ code: "opaque-file",
52420
+ class: "human",
52421
+ label: "\u8BC1\u636E\u76EE\u5F55\u5916\u6709\u770B\u4E0D\u5230 diff \u7684\u6587\u4EF6\uFF08\u4E8C\u8FDB\u5236\u3001diff \u8FC7\u5927\u6216\u7EAF\u6539\u540D\uFF09"
52422
+ },
52423
+ { code: "evidence-outside-ticket", class: "human", label: "\u6539\u52A8\u4E86\u522B\u7684\u7968\u7684\u8BC1\u636E\u76EE\u5F55" },
52424
+ { code: "evidence-executable", class: "human", label: "\u8BC1\u636E\u76EE\u5F55\u91CC\u65B0\u589E\u6216\u6539\u52A8\u4E86\u53EF\u6267\u884C\u6587\u4EF6" },
52425
+ {
52426
+ code: "harness-regression-missing",
52427
+ class: "human",
52428
+ label: "\u6539\u4E86 harness \u4F46\u7F3A\u5C11\u7ED1\u5B9A\u5F53\u524D\u8865\u4E01\u7684\u56DE\u5F52\u8BC4\u6D4B\u7ED3\u679C"
52429
+ },
52430
+ {
52431
+ code: "harness-regression-stale",
52432
+ class: "human",
52433
+ label: "\u56DE\u5F52\u8BC4\u6D4B\u7ED3\u679C\u7ED1\u5B9A\u7684\u8865\u4E01\u6458\u8981\u4E0D\u662F\u5F53\u524D\u8865\u4E01"
52434
+ },
52435
+ {
52436
+ code: "harness-regression-below-threshold",
52437
+ class: "human",
52438
+ label: "\u56DE\u5F52\u8BC4\u6D4B decision_ok \u4F4E\u4E8E\u57FA\u7EBF\u7F6E\u4FE1\u533A\u95F4\u4E0B\u9650"
52439
+ },
52440
+ { code: "issue-ref-missing", class: "human", label: "\u4EFB\u52A1\u6765\u6E90\u89E3\u4E0D\u51FA issue \u53F7" },
52441
+ {
52442
+ code: "evidence-link-missing",
52443
+ class: "transient",
52444
+ label: "PR body \u7F3A\u9489\u5728\u672C PR \u63D0\u4EA4\u4E0A\u3001\u6307\u5411\u672C PR \u8BC1\u636E\u7684 raw \u6C38\u4E45\u94FE"
52445
+ },
52446
+ { code: "verify-missing", class: "transient", label: "\u5F53\u524D\u8865\u4E01\u6CA1\u6709\u9A8C\u8BC1\u5224\u5B9A" },
52447
+ { code: "verify-failed", class: "transient", label: "\u9A8C\u8BC1\u672A\u901A\u8FC7" },
52448
+ { code: "verify-extraction-failed", class: "transient", label: "\u9A8C\u8BC1\u5224\u5B9A\u63D0\u53D6\u5931\u8D25" },
52449
+ { code: "verify-evidence-invalid", class: "transient", label: "\u9A8C\u8BC1\u8BC1\u636E\u4E0D\u5728\u672C\u7968\u76EE\u5F55" },
52450
+ { code: "verify-tampered", class: "human", label: "\u9A8C\u8BC1\u8005\u6539\u4E86\u4EE3\u7801" },
52451
+ { code: "review-missing", class: "transient", label: "\u6709\u89C6\u89D2\u8FD8\u6CA1\u6709\u5BA1\u6838\u5224\u5B9A" },
52452
+ { code: "review-blocking", class: "transient", label: "\u5BA1\u6838\u6709 blocking \u53D1\u73B0" },
52453
+ { code: "review-extraction-failed", class: "transient", label: "\u5BA1\u6838\u5224\u5B9A\u63D0\u53D6\u5931\u8D25" },
52454
+ { code: "perspective-timed-out", class: "human", label: "\u5BA1\u6838\u89C6\u89D2\u8D85\u65F6" },
52455
+ { code: "decision-missing", class: "transient", label: "chief \u8FD8\u6CA1\u6709\u51FA go/no-go" },
52456
+ { code: "decision-no-go", class: "transient", label: "chief \u5224 no-go" },
52457
+ { code: "decision-extraction-failed", class: "transient", label: "chief \u5224\u5B9A\u63D0\u53D6\u5931\u8D25" },
52458
+ { code: "fix-rounds-exhausted", class: "human", label: "\u4FEE\u590D\u8F6E\u7528\u5B8C" },
52459
+ { code: "fix-no-change", class: "human", label: "\u4FEE\u590D\u8F6E\u6CA1\u6709\u6539\u52A8\u8865\u4E01" },
52460
+ { code: "gate-rounds-exhausted", class: "human", label: "\u95F8\u8F6E\u6B21\u7528\u5B8C" },
52461
+ { code: "no-reviewers", class: "human", label: "\u56E2\u961F\u6CA1\u6709\u53EF\u6D3E\u7684\u5BA1\u6838\u89C6\u89D2" },
52462
+ { code: "no-verifier", class: "human", label: "\u56E2\u961F\u6CA1\u6709\u53EF\u6D3E\u7684\u9A8C\u8BC1\u8005" },
52463
+ { code: "no-decider", class: "human", label: "chief \u6CA1\u6709\u53EF\u7528\u7684 agent" }
52464
+ ];
52465
+ var MERGE_BLOCKER_CODES = MERGE_BLOCKERS.map((b4) => b4.code);
52466
+ var mergeBlockerSchema = external_exports.object({
52467
+ code: external_exports.enum(MERGE_BLOCKER_CODES),
52468
+ class: external_exports.enum(BLOCKER_CLASSES),
52469
+ label: external_exports.string(),
52470
+ detail: external_exports.array(external_exports.string())
52471
+ });
52472
+ var mergeReadinessSchema = external_exports.object({
52473
+ ready: external_exports.boolean(),
52474
+ headSha: external_exports.string().nullable(),
52475
+ patchDigest: external_exports.string().nullable(),
52476
+ policy: mergePolicySchema,
52477
+ blockers: external_exports.array(mergeBlockerSchema)
52478
+ });
52479
+ for (const value of [
52480
+ MERGE_POLICIES,
52481
+ GATE_LIMITS,
52482
+ EVIDENCE_EXECUTABLE_EXTENSIONS,
52483
+ AUTO_MERGE_PATH_GLOBS,
52484
+ PROTECTED_PATH_GLOBS,
52485
+ MERGE_GATE_SOURCE_GLOBS,
52486
+ CHIEF_DISPATCH_HARNESS_PATHS,
52487
+ COMPARE_FILE_STATUSES,
52488
+ BLOCKER_CLASSES,
52489
+ ...MERGE_BLOCKERS,
52490
+ MERGE_BLOCKERS,
52491
+ MERGE_BLOCKER_CODES
52492
+ ]) {
52493
+ Object.freeze(value);
52494
+ }
52495
+
52395
52496
  // ../../packages/shared/src/records/project.ts
52396
52497
  var PROJECT_REPO_KINDS = ["hosted", "github", "local"];
52397
52498
  var projectRepoKindSchema = external_exports.enum(PROJECT_REPO_KINDS);
@@ -52399,30 +52500,20 @@ var projectRecordSchema = external_exports.object({
52399
52500
  id: recordId,
52400
52501
  name: external_exports.string(),
52401
52502
  teamId: recordId,
52402
- /** 项目描述(#1242 设置页可编辑面):可空,null/缺键 = 无描述(行值
52403
- * null 时 toProjectRecord 不带键——与 repoKind 等可空列同口径)。 */
52404
52503
  description: external_exports.string().optional(),
52405
- /** repo 形态(02 §3);字段名/值 [推断]。GitHub 接入侧连号授权、
52406
- * executor push conv 分支、建 PR、读 PR/issues/CI workflow runs。 */
52407
52504
  repoKind: projectRepoKindSchema.optional(),
52408
- // —— M2b repo 形态展开(本 schema 头注「M2 实现期展开」的落地;皆 [推断],
52409
- // wire 补采后收紧,04 附录 A)——
52410
- /** 托管 repo 名段:远端 URL `<host>/<teamId>/<repoName>`(r3 §1.4 daemon.log
52411
- * `Cloning <teamId>/r3-lifecycle` 实测形状;值 = 项目名 slug [设计])。 */
52412
52505
  repoName: external_exports.string().optional(),
52413
- /** GitHub 接入 `owner/repo`(02 §3 接入形态;字段名 [推断])。 */
52414
52506
  githubRepo: external_exports.string().optional(),
52415
- /** local 形态:用户本机 git 工作树仓绝对路径(spec 12 / #359;server 端
52416
- * `~` 展开后的规范化值,daemon 镜像 clone 同源消费)。github 形态(ADR
52417
- * 0017 / #1213):可选同机执行加速位——server 只做形态校验(绝对路径),
52418
- * 存在性与 git 仓判定在 daemon 侧(路径可能活在执行机上,server 看不见),
52419
- * 失格静默回落 GitHub clone。 */
52420
52507
  localPath: external_exports.string().optional(),
52421
- /** clone URL(「Git 复制检出命令」卡数据源,02 §9.3)。托管 = 本地主机代位
52422
- * (02 §5.8 gitHostDomain 槽);github = github.com 派生 [设计];local 形态
52423
- * 无远端 URL 面(daemon 直接 clone localPath,spec 12)。 */
52508
+ mergePolicy: mergePolicySchema.optional(),
52509
+ localChecks: external_exports.array(external_exports.string().min(1)).optional(),
52424
52510
  cloneUrl: external_exports.string().optional()
52425
52511
  });
52512
+ var projectMergeConfigSchema = external_exports.object({
52513
+ mergePolicy: mergePolicySchema.default("human"),
52514
+ localChecks: external_exports.array(external_exports.string().min(1)).default([])
52515
+ });
52516
+ var patchProjectMergeConfigSchema = projectMergeConfigSchema.partial().strict();
52426
52517
  var githubRepoRefSchema = external_exports.object({
52427
52518
  owner: external_exports.string(),
52428
52519
  repo: external_exports.string()
@@ -52459,9 +52550,7 @@ var LOCAL_ERROR_REASON_COPY = {
52459
52550
  not_absolute: "\u9700\u8981\u7EDD\u5BF9\u8DEF\u5F84"
52460
52551
  };
52461
52552
  var projectTreeResponseSchema = external_exports.object({
52462
- /** 请求 ref 回显(缺省 `HEAD`)。 */
52463
52553
  ref: external_exports.string(),
52464
- /** 解析后的 commit sha(ref 不存在 = 404 {error})。 */
52465
52554
  commit: external_exports.string(),
52466
52555
  path: external_exports.string(),
52467
52556
  entries: external_exports.array(
@@ -52469,24 +52558,18 @@ var projectTreeResponseSchema = external_exports.object({
52469
52558
  name: external_exports.string(),
52470
52559
  path: external_exports.string(),
52471
52560
  type: external_exports.enum(["blob", "tree"]),
52472
- /** blob 字节数;tree 为 null(ls-tree -l 语义)。 */
52473
52561
  size: external_exports.number().int().nullable()
52474
52562
  })
52475
52563
  )
52476
52564
  });
52477
52565
  var projectFilesResponseSchema = external_exports.object({
52478
- /** 请求 ref 回显(缺省 `HEAD`)。 */
52479
52566
  ref: external_exports.string(),
52480
- /** 解析后的 commit sha(ref 不存在 = 404 {error},与 tree/file 同口径)。 */
52481
52567
  commit: external_exports.string(),
52482
- /** 行数超 limit 即截断(git 序取前 N);截断只影响召回,不影响交互帧率
52483
- * (客户端全量本地 fuzzy)。 */
52484
52568
  truncated: external_exports.boolean(),
52485
52569
  files: external_exports.array(
52486
52570
  external_exports.object({
52487
52571
  path: external_exports.string(),
52488
52572
  type: external_exports.enum(["blob", "tree"]),
52489
- /** blob 字节数;tree 为 null(ls-tree -l 语义,与 tree 面同形)。 */
52490
52573
  size: external_exports.number().int().nullable()
52491
52574
  })
52492
52575
  )
@@ -52496,7 +52579,6 @@ var projectFileResponseSchema = external_exports.object({
52496
52579
  commit: external_exports.string(),
52497
52580
  path: external_exports.string(),
52498
52581
  size: external_exports.number().int(),
52499
- /** 二进制判定(首 8KB 含 NUL,git 同款启发式 [设计])→ base64。 */
52500
52582
  encoding: external_exports.enum(["utf-8", "base64"]),
52501
52583
  content: external_exports.string()
52502
52584
  });
@@ -52510,16 +52592,13 @@ var projectBranchesResponseSchema = external_exports.object({
52510
52592
  )
52511
52593
  });
52512
52594
  var projectCommitsResponseSchema = external_exports.object({
52513
- /** 解析的 ref 回显(缺省 = 默认分支)。 */
52514
52595
  ref: external_exports.string(),
52515
52596
  commits: external_exports.array(
52516
52597
  external_exports.object({
52517
52598
  sha: external_exports.string(),
52518
52599
  shortSha: external_exports.string(),
52519
- /** 提交标题行(git log %s 同义)。 */
52520
52600
  message: external_exports.string(),
52521
52601
  authorName: external_exports.string(),
52522
- /** 作者时间 epoch ms(git log %aI 解析)。 */
52523
52602
  at: external_exports.number()
52524
52603
  })
52525
52604
  )
@@ -52527,11 +52606,8 @@ var projectCommitsResponseSchema = external_exports.object({
52527
52606
  var projectCommitDetailResponseSchema = external_exports.object({
52528
52607
  sha: external_exports.string(),
52529
52608
  shortSha: external_exports.string(),
52530
- /** 提交标题行(%s,与列表行 message 同源同值——详情头「与列表行一致」
52531
- * 验收的数据面)。 */
52532
52609
  message: external_exports.string(),
52533
52610
  authorName: external_exports.string(),
52534
- /** 作者时间 epoch ms(git %aI 解析,列表行同源)。 */
52535
52611
  at: external_exports.number(),
52536
52612
  files: external_exports.array(diffFileSchema)
52537
52613
  });
@@ -52620,15 +52696,10 @@ function stepTakesSecrets(kind) {
52620
52696
  }
52621
52697
  var stepRecordSchema = external_exports.object({
52622
52698
  id: recordId,
52623
- // 观测形态 base64 样(r3 §9 `claim step=3iE_…`、r5 §3.1)
52624
- /** 所属 build(≡ conversationId,CONTEXT.md 实体等式)。 */
52625
52699
  buildId: recordId,
52626
52700
  kind: stepKindSchema,
52627
- /** claim 到该步的机器;未领取 null [推断]。 */
52628
52701
  machineId: recordId.nullable(),
52629
52702
  createdAt: epochMs
52630
- // journal 状态字段(heartbeat/tool/done 生命周期,02 §5.4;recover 细节
52631
- // [推断])归 M2/M3 按实现展开,不预发明。
52632
52703
  });
52633
52704
  var stepStatusSchema = external_exports.enum([
52634
52705
  "pending",
@@ -52648,19 +52719,8 @@ var quotaWaitSchema = external_exports.object({
52648
52719
  var stepJournalRowSchema = stepRecordSchema.extend({
52649
52720
  status: stepStatusSchema,
52650
52721
  checkpointCommit: recordId.nullable(),
52651
- /** 排队投影(#1108):pending 步的「在排队、位次、等谁」——server 读侧
52652
- * 派生(steps 查询按行计算),SSE step 事件不带(事件只报状态流转,
52653
- * 队列细节由查询重取承载)。claimed/done 等非 pending 行缺席 = 不在
52654
- * 排队。optional 加法契约:老 server / fixture 面缺席 = 排队呈现退
52655
- * 化(回落既有 `处理中...` 标签),零回归。
52656
- * hold(#1257):额度挂起中的 pending 步带(reason + retryAt = 退避到期/
52657
- * 下次尝试时刻)——排队行呈现「等额度」而非「等空闲机器」;非挂起步
52658
- * 缺席。 */
52659
52722
  queue: external_exports.object({
52660
- /** 团队 FIFO 位次(1-based;钉选步只数该机可见集——钉同机或未钉)。 */
52661
52723
  position: external_exports.number().int().min(1),
52662
- /** 等待对象:钉选机器(含其 running/capacity 快照);null = 未钉
52663
- * (等待任何在线机器)。 */
52664
52724
  waitingFor: external_exports.object({
52665
52725
  machineId: recordId,
52666
52726
  name: external_exports.string(),
@@ -52671,48 +52731,29 @@ var stepJournalRowSchema = stepRecordSchema.extend({
52671
52731
  reason: external_exports.literal("quota"),
52672
52732
  retryAt: epochMs
52673
52733
  }).optional(),
52674
- /** pending 成因(#1251,加法契约 optional):machine-offline = 等机器
52675
- * 上线(等待有用);capability-missing = 无机器满足能力要求(装 X 即
52676
- * 解锁,missing 携缺项可读名)。缺席 = 正常排队(有可领机器)或老
52677
- * server——呈现回落既有排队标签,零回归。 */
52678
52734
  blocked: stepQueueBlockedSchema.optional()
52679
52735
  }).optional(),
52680
52736
  skillInjection: skillInjectionSchema.nullable(),
52681
52737
  blockerHandoff: blockerHandoffSchema.optional(),
52682
- /** #1261 配额挂起投影:status=waiting_quota 行在位(其余缺席——zod strip
52683
- * 下 record 对拍不漂移;老 server / fixture 面缺席 = 呈现回落既有标签,
52684
- * 零回归)。 */
52685
52738
  quotaWait: quotaWaitSchema.optional()
52686
52739
  });
52687
52740
  var buildStepActionBodySchema = external_exports.discriminatedUnion("action", [
52688
52741
  external_exports.object({
52689
52742
  action: external_exports.literal("revision"),
52690
- /** 观测值仅 "plan"(r5 §4 抓包);side 词表未采齐,不收窄以外值。 */
52691
52743
  side: external_exports.literal("plan"),
52692
52744
  feedback: external_exports.string(),
52693
52745
  clientMessageId: external_exports.string()
52694
- // <uuid>(r5 §4 抓包)
52695
52746
  }),
52696
52747
  external_exports.object({ action: external_exports.literal("confirm") }),
52697
52748
  external_exports.object({
52698
52749
  action: external_exports.literal("review"),
52699
- /** 执行审核的 Agent id(与 chief-agent-dialog 同源 memberType:"agent" 行
52700
- * 的 actorId)。#1250(ADR 0018 层 1):缺省 = fan-out 三视角——server
52701
- * 按团队 persona(CodeReviewer/SecurityAuditor/TestEngineer)各入队一条
52702
- * review 步(agentId 经各自步的 prompt meta header 透出);无 persona
52703
- * 时回落 assignment.review 槽单步;两者皆缺 400。携带 agentId = 既有
52704
- * 单审核人路径,行为不变。 */
52705
52750
  agentId: external_exports.string().optional(),
52706
- /** 可选关注点 textarea 内容;空串视为未填。fan-out 路径随各视角 prompt
52707
- * 逐份注入。 */
52708
52751
  focus: external_exports.string().optional()
52709
52752
  }),
52710
52753
  external_exports.object({
52711
52754
  action: external_exports.literal("restart"),
52712
- /** 空消息不成发送(原站语义「发消息触发」):直连 API 也收不住空稿。 */
52713
52755
  feedback: external_exports.string().min(1),
52714
52756
  clientMessageId: external_exports.string()
52715
- // <uuid>(revision 同形,r5 §4;server 侧现未消费)
52716
52757
  })
52717
52758
  ]);
52718
52759
  var STEP_ACTIVITY_PHASES = [
@@ -52728,20 +52769,9 @@ var STEP_ACTIVITY_PHASES = [
52728
52769
  var stepActivityPhaseSchema = external_exports.enum(STEP_ACTIVITY_PHASES);
52729
52770
  var stepActivityReportSchema = external_exports.object({
52730
52771
  phase: stepActivityPhaseSchema,
52731
- /** phase='tool' 时在位:最近开始执行的工具名(并行工具 = 最后一个开始的;
52732
- * 终稿工具行仍经 message 事件落库,本字段只是进行态标签)。 */
52733
52772
  tool: external_exports.string().optional(),
52734
- /** phase='retrying' 时在位:auto_retry 轮次(1 起)。 */
52735
52773
  attempt: external_exports.number().int().optional(),
52736
- /** #1308:协议回落 / 网络重试开新一轮时在位。server hub 与 web 在飞
52737
- * text/thinking 快照按此位清掉;普通 starting / 节流重发不得带此位。 */
52738
52774
  resetLive: external_exports.boolean().optional(),
52739
- /** #918 技能事实(本步累计,首见序,去重按 name、denied 粘滞):daemon 从
52740
- * 工具调用流识别的「读了哪些技能」,被 deny 挡下的同样在列(判定源 =
52741
- * 工具事实,分类单源 skill-facts.ts)。每份上报都携带当前累计集——hub
52742
- * 单槽天然保住全集,订阅进场补发即拿到完整清单。缺省 = 本步尚无技能
52743
- * 事实(旧 daemon 恒缺省,零回归)。上限见 daemon activity.ts 的
52744
- * SKILL_FACTS_CAP(载荷有界)。 */
52745
52775
  skills: external_exports.array(skillFactSchema).optional()
52746
52776
  });
52747
52777
  var stepActivitySchema = stepActivityReportSchema.extend({
@@ -52763,7 +52793,6 @@ var todoAgentRefSchema = external_exports.object({
52763
52793
  });
52764
52794
  var buildHistoryEntrySchema = external_exports.object({
52765
52795
  buildId: recordId,
52766
- // buildId ≡ conversationId(CONTEXT.md/r3 §3.0)
52767
52796
  createdAt: epochMs
52768
52797
  });
52769
52798
  var TASK_SOURCE_KINDS = ["github-issue", "github-issue-self", "orchestration"];
@@ -52789,13 +52818,10 @@ var todoRecordSchema = external_exports.object({
52789
52818
  teamId: recordId,
52790
52819
  projectId: recordId,
52791
52820
  title: external_exports.string(),
52792
- /** 结构化描述(r3 §3.1 创建表单四行占位;chief 措辞→spec 三段式见 02 §4.3)。 */
52793
52821
  spec: external_exports.string(),
52794
52822
  phase: phaseSchema,
52795
52823
  phaseAt: epochMs,
52796
- /** 看板序号 `#seqNum`(CONTEXT.md:todo 持久且带序号)。 */
52797
52824
  seqNum: external_exports.number().int(),
52798
- /** 列内排序位(01 §4.1 拖拽面:@dnd-kit 列内 orderIndex 排序)。 */
52799
52825
  orderIndex: external_exports.number(),
52800
52826
  tagIds: external_exports.array(recordId),
52801
52827
  assignment: assignmentSchema.nullable(),
@@ -52805,46 +52831,19 @@ var todoRecordSchema = external_exports.object({
52805
52831
  hasChanges: external_exports.boolean(),
52806
52832
  hasPlan: external_exports.boolean(),
52807
52833
  buildHistory: external_exports.array(buildHistoryEntrySchema),
52808
- /** 来源任务引用;语义未特写 [推断](r3 §3.0 字段表列名照抄)。#1250(ADR
52809
- * 0018 层 2)落地为拆父子指针:chief split_todo 建的子卡本列 = 父卡 id
52810
- * (存量恒 null 不变);「子全 done 父自动收」的归账键。 */
52811
52834
  sourceTodo: recordId.nullable(),
52812
- /** 依赖边(#1250 / ADR 0018 层 2,blocking 语义):阻塞本卡的兄弟子卡 id
52813
- * 集(chief split_todo 写入);全集 done 前本卡不可派发(startBuilds 闸)。
52814
- * 缺省 = 无依赖(存量行/非拆卡同形)。 */
52815
52835
  blockedBy: external_exports.array(recordId).nullish(),
52816
- /** 记录版本号(r3 §3.0 观测值 2–4;SSE 文档事件带 seq/v,02 §1.2/r5 §7.2)。 */
52817
52836
  v: external_exports.number().int(),
52818
- // —— r5 §3.2 SSE todo doc 补录(chief 派工溯源)——
52819
- /** 创建者 = 用户或 Chief 绑定 Agent id;人工建时的取值未分离观测 [推断]。 */
52820
52837
  createdBy: recordId.nullable(),
52821
52838
  ownerId: recordId.nullable(),
52822
- /** 来源 build(chief 回合 id,形如 `chief-…`);人工建时 null [推断]。 */
52823
52839
  sourceBuildId: external_exports.string().nullable(),
52824
- // —— #446 来源两列(ADR 0005 D6,溯源家族位;#640 扩 orchestration 档)——
52825
- /** 来源种类(TASK_SOURCE_KINDS 注释:导入 vs 自建的方向位 + 编排来源);
52826
- * local 项目 / 未连接 GitHub 的项目且非总管拆出 = null(至多一个来源,
52827
- * 两列够用)。 */
52828
52840
  sourceKind: todoSourceKindSchema.nullable(),
52829
- /** 来源引用(`github:owner/repo#123` 形 = githubIssueSourceRef 单源;
52830
- * `chief:<uuid>` 形 = orchestrationSourceRef 单源,#640);无来源 = null。 */
52831
52841
  sourceRef: external_exports.string().nullable(),
52832
52842
  output: todoOutputSchema.default("code"),
52833
- /** #1257 板面挂起态(server 读侧派生,不落列):在飞 todo 的当前步挂起时
52834
- * 透出——`quota` = 等额度(retryAt = 退避到期/下次尝试时刻,null = 不适用);
52835
- * `machine` = 等机器(#1259 起语义 = 归属机不在线/团队零在线)。缺席 = 未挂
52836
- * 起(正常排队 / 在跑 / 终态)——板面据此区分「等机器/等额度」挂起态与
52837
- * 「执行失败」红态。optional 加法契约:老 server / fixture 面缺席 = 板面
52838
- * 无挂起 chip,零回归。 */
52839
52843
  waitingOn: external_exports.object({
52840
52844
  on: external_exports.enum(["machine", "quota"]),
52841
52845
  retryAt: epochMs.nullable()
52842
52846
  }).optional(),
52843
- /** #1261 等额度投影(读侧派生,不存列):latest build 活动步 waiting_quota
52844
- * 时在位——板面卡态/横幅的数据源(哪一路 relay、下次探测时刻,形态比
52845
- * waitingOn.on='quota' 多 lane/kind/retryAfterMs 三位)。null = 无挂起;
52846
- * 键缺席 = fixture/老 server 面(optional 加法契约,零回归)。
52847
- * 形态单源 = records/step.ts quotaWaitSchema。 */
52848
52847
  quotaWait: quotaWaitSchema.nullable().optional(),
52849
52848
  usageCost: usageCostSchema.optional()
52850
52849
  });
@@ -53081,7 +53080,6 @@ var remoteToolDefSchema = external_exports.object({
53081
53080
  label: external_exports.string().optional(),
53082
53081
  description: external_exports.string(),
53083
53082
  parameters: external_exports.unknown().optional(),
53084
- /** 读工具幂等可重放(重试预算面,r5 §3.1 bundle 提取)。 */
53085
53083
  replaySafe: external_exports.boolean().optional()
53086
53084
  });
53087
53085
  var machineToolRelayBodySchema = external_exports.object({
@@ -53217,7 +53215,6 @@ var githubListParams = (max) => obj(
53217
53215
  ["projectId"]
53218
53216
  );
53219
53217
  var CHIEF_REMOTE_TOOLS = [
53220
- // —— 读侧 16(replaySafe,r5 §3.1;#627 +models)——
53221
53218
  {
53222
53219
  name: "projects",
53223
53220
  description: "List the team projects with their repo binding and todo counts.",
@@ -53246,9 +53243,6 @@ var CHIEF_REMOTE_TOOLS = [
53246
53243
  parameters: obj({}),
53247
53244
  replaySafe: true
53248
53245
  },
53249
- // models(#627):候选模型清单——create_agent/update_agent 的
53250
- // provider/modelId 值域。agents 工具返回的是各 agent 的已配 modelId,
53251
- // 不是候选集;本工具才是值域正本。
53252
53246
  {
53253
53247
  name: "models",
53254
53248
  description: "List the model candidates for agents as rows {provider, providerLabel, modelId, modelName}. Read this before setting provider/modelId on create_agent or update_agent \u2014 only values from this list are valid.",
@@ -53287,9 +53281,6 @@ var CHIEF_REMOTE_TOOLS = [
53287
53281
  },
53288
53282
  {
53289
53283
  name: "docs",
53290
- // 批量读是刻意的:这个工具实测占全部工具调用的 64%,而每次调用都是一整趟
53291
- // 模型往返(上下文重发一遍,是成本的大头)。paths 一次给多个文件路径,
53292
- // 把「读五个文件」从五趟压到一趟。
53293
53284
  description: "Read repository documents (files at a ref) for a project. Pass several paths at once to read them in one call.",
53294
53285
  parameters: obj(
53295
53286
  {
@@ -53307,9 +53298,6 @@ var CHIEF_REMOTE_TOOLS = [
53307
53298
  parameters: obj({ buildId: str("Optional build id filter.") }),
53308
53299
  replaySafe: true
53309
53300
  },
53310
- // GitHub 读三件(#1406 P5a-2):读项目所连仓库的真数据;只回结构化字段,
53311
- // 列表不带 issue / PR 正文。标题等字段谁都能写(公开仓任何人可开 issue、
53312
- // 从 fork 开 PR),description 明说它们是数据。
53313
53301
  {
53314
53302
  name: "issues",
53315
53303
  description: `List issues of a GitHub-backed project's repository, newest first, without bodies (pull requests are left out, so a page can hold fewer than perPage entries). Each entry: number, title, state, labels, author, authorAssociation, createdAt, updatedAt, htmlUrl, taskId (the id of this team's task made from the issue, or null). hasMore = another page exists. Titles, labels and logins are written by third parties (anyone can open an issue on a public repository): ${GITHUB_DATA_NOTE}`,
@@ -53353,8 +53341,6 @@ var CHIEF_REMOTE_TOOLS = [
53353
53341
  ]),
53354
53342
  replaySafe: true
53355
53343
  },
53356
- // —— 组织侧 21(raw 19 − delete_skills + create_skill/update_skill
53357
- // + set_remote_shell 回摆 XMON-115 + split_todo #1250)——
53358
53344
  {
53359
53345
  name: "create_todo",
53360
53346
  description: "Create a todo in a project. Title = verb phrase; spec = the three-section transform (user quote block, \u8981\u6C42 bullets, \u8865\u5145\u4FE1\u606F bullets).",
@@ -53370,9 +53356,6 @@ var CHIEF_REMOTE_TOOLS = [
53370
53356
  ["projectId", "title", "spec"]
53371
53357
  )
53372
53358
  },
53373
- // split_todo(#1250 / ADR 0018 层 2):大票拆 N 子卡 + blocking 依赖边。
53374
- // 拆解方案落父卡 plan 文档并停 confirm 关口给人审(人可整树驳回)——确认
53375
- // 即派发无阻塞子卡,后续波次随 blocker 完成自动起,子全 done 父自动收。
53376
53359
  {
53377
53360
  name: "split_todo",
53378
53361
  description: "Split a big todo into N sub-cards with blocking dependency edges (ADR 0018 layer 2). Each sub-card pins one role agent and runs direct-execute (no per-card plan gate). The split scheme lands on the parent plan doc and parks at the parent confirm gate for human review \u2014 confirming the parent dispatches the unblocked sub-cards; later waves auto-start as their blockers finish; the parent auto-completes when every sub-card is done. Split only when subtasks are truly independent or orderable \u2014 single-view single-artifact work should run as one todo, not be split.",
@@ -53502,9 +53485,6 @@ var CHIEF_REMOTE_TOOLS = [
53502
53485
  description: "Delete agents from the team.",
53503
53486
  parameters: obj({ agentIds: idArr("Agent ids to delete.") }, ["agentIds"])
53504
53487
  },
53505
- // create_skill / update_skill(XMON-109,CHIEF_TOOLS_ADDED 登记):组织面
53506
- // 写件,归 delete_skills 的 raw 组织位。写向 = 团队技能根本地目录,body
53507
- // 语义与 REST 写面同形(frontmatter 是唯一真值)。
53508
53488
  {
53509
53489
  name: "create_skill",
53510
53490
  description: "Create a team skill as a folder in the team skills directory. The skill is a SKILL.md entry file (frontmatter name and description are required and must match the declared values) plus optional extra files.",
@@ -53553,11 +53533,6 @@ var CHIEF_REMOTE_TOOLS = [
53553
53533
  description: "Delete team secrets by name or id.",
53554
53534
  parameters: obj({ names: idArr("Secret names or ids to delete.") }, ["names"])
53555
53535
  },
53556
- // set_remote_shell(XMON-115 回摆,XMON-77 除名解除):chief 会话写某
53557
- // agent 的「远程 shell」开关——写 agent.tools(开关词),与 REST PATCH
53558
- // /agents/{aid} 同字段同过滤;执法面 = claim 双闸注册 + 步中每命令预检
53559
- // (XMON-108),fail-closed。enabled 必填显式(缺省/非布尔 400,不沿用
53560
- // #573 前缺省 true 的 fail-open 形)。
53561
53536
  {
53562
53537
  name: "set_remote_shell",
53563
53538
  description: "Grant or revoke the remote shell permission switch of an agent.",
@@ -53587,13 +53562,8 @@ var CHIEF_REMOTE_TOOLS = [
53587
53562
  description: "Remove the schedule of a todo.",
53588
53563
  parameters: obj({ todoId: str("Todo id.") }, ["todoId"])
53589
53564
  },
53590
- // —— 执行侧 5 ——
53591
53565
  {
53592
53566
  name: "run_builds",
53593
- // #903(ADR 0014):withPlan = chief 的逐次派发判定(判定权归
53594
- // chief,无团队设置槽);缺省 = 先规划(fail-safe:判不准的方向是
53595
- // 「多问一次」)。dispatchReason 把判定理由落进 transcript(回执可
53596
- // 审计、用户可就地一句话推翻)。直修只跳过方案确认——审阅闸恒在。
53597
53567
  description: "Start builds for todos: assignment picks the executing agent per responsibility fit; withPlan is your per-dispatch judgment (omit = plan first) \u2014 state the reason via dispatchReason; the review gate applies either way. Assignment must set at least one slot (plan and/or build agentId) \u2014 an empty assignment is rejected.",
53598
53568
  parameters: obj(
53599
53569
  {
@@ -53602,10 +53572,6 @@ var CHIEF_REMOTE_TOOLS = [
53602
53572
  {
53603
53573
  plan: obj({ agentId: str("Planning agent id.") }),
53604
53574
  build: obj({ agentId: str("Executing agent id.") }),
53605
- // #1250(ADR 0018 层 1):review/verify 槽随派发可带——review
53606
- // 槽 = 无 persona 时的单审核人回落位;verify 槽在位时 review
53607
- // 关口抵达即入队验证步(槽空零动作,语义与 REST builds 面
53608
- // 同一 assignmentSchema)。
53609
53575
  review: obj({
53610
53576
  agentId: str("Fallback review agent id (used when no review persona is seeded).")
53611
53577
  }),
@@ -53633,9 +53599,6 @@ var CHIEF_REMOTE_TOOLS = [
53633
53599
  },
53634
53600
  {
53635
53601
  name: "run_review",
53636
- // #1250(ADR 0018 层 1):fan-out 三视角——persona 三员各入队一条 review
53637
- // 步(agentId 走各自 prompt meta header),三份 verdict 并行落会话;无
53638
- // persona 时回落 assignment.review 槽单步。
53639
53602
  description: "Request an independent review run of a build: fans out the three review perspectives (CodeReviewer / SecurityAuditor / TestEngineer) as parallel read-only review steps, each reporting its own verdict; falls back to the assignment review slot when personas are absent.",
53640
53603
  parameters: obj({ buildId: str("Build id.") }, ["buildId"])
53641
53604
  },
@@ -53654,11 +53617,7 @@ var CHIEF_REMOTE_TOOLS = [
53654
53617
  description: "(Blocked \u2014 merge is human-only. #1256, ADR 0018.) Merge reviewed builds into the default branch \u2014 only through the web UI human exit; calling this tool from a machine (chief/MCP) is hard-rejected.",
53655
53618
  parameters: obj({ buildIds: idArr("Build ids to merge.") }, ["buildIds"])
53656
53619
  },
53657
- // —— Chief 私有侧 10 ——
53658
53620
  {
53659
- // #1049:结构化问答 + 阻塞语义。工具结果 = 用户在问答卡上的实际选择
53660
- // (等答期间本回合 step 挂起,答完同一回合继续);取消/步终态 →
53661
- // cancelled 文本。D3:server 侧永不超时自动拍板。
53662
53621
  name: "ask_user",
53663
53622
  description: "Ask the user structured questions and block this turn until they answer a question card (same turn continues with their choices as the tool result). Use it whenever the answer would change what you do next; batch up to 4 questions per call instead of asking one at a time.",
53664
53623
  parameters: obj(
@@ -53897,26 +53856,14 @@ var DAEMON_LOG_PREFIXES = [
53897
53856
  "workspace",
53898
53857
  "recover",
53899
53858
  "wake",
53900
- // MCP per-turn 连接面(r3 §1.5 daemon.log 实测行 `[mcp] r3mcp: connect
53901
- // failed — its tools are unavailable this turn: fetch failed…`;M4b 补录,
53902
- // 02 §5.3 前缀词表回写)。
53903
53859
  "mcp",
53904
- // skills 执行面注入诊断行(#371,spec 14:`[skills] <type>: <msg>` 族,
53905
- // type ∈ loaded/collision/invalid-frontmatter/missing-skill-md/cap/invalid,
53906
- // 词表正源 = daemon backend/skills.ts classifySkillDiagnostic + buildSkillsCatalog)。
53907
53860
  "skills",
53908
- // 命令闸裁决行(#866 T5:`[gate] <ask|reject>: rule=<id> command=<…>`——只记
53909
- // 非放行裁决,allow 静默;词表正源 = daemon backend/command-gate.ts)。
53910
53861
  "gate",
53911
- // pi project trust 裁决行(#925 D1:`[trust] denied: <.pi/…> present in
53912
- // worktree …`——只记受保护资源在位的 denied 行,空 worktree 静默;词表
53913
- // 正源 = daemon backend/pi.ts detectTrustProtectedResources)。
53914
53862
  "trust"
53915
53863
  ];
53916
53864
  var machineJsonSchema = external_exports.object({
53917
53865
  machineId: external_exports.string(),
53918
53866
  token: external_exports.string().regex(MACHINE_TOKEN_PATTERN),
53919
- // 64hex
53920
53867
  teamId: recordId,
53921
53868
  serverUrl: external_exports.string()
53922
53869
  });
@@ -53929,28 +53876,15 @@ var daemonJsonSchema = external_exports.object({
53929
53876
  runner: external_exports.literal("cli")
53930
53877
  });
53931
53878
  var WORKTREE_CONTRACT = {
53932
- /** 基座 `<workspacesRoot>/<projectId>/repo`(baseRepoDir)。 */
53933
53879
  baseRepoSubpath: "<projectId>/repo",
53934
- /** 任务目录 `<workspacesRoot>/<conversationId>`(目录名 = UUIDv7)。 */
53935
53880
  taskDirLayout: "<workspacesRoot>/<conversationId>",
53936
- /** 分支 = 品牌前缀 + conversationId(brand.ts conversationBranch());
53937
- * worktree add -b,base = origin/<convBranch> 否则 origin/<defaultBranch>。 */
53938
53881
  branchPrefix: BRAND.branchPrefix,
53939
- /** 复用/恢复:存在→reused;checkpoint→reset --hard + clean -fd(restored);
53940
- * 陈旧→remove --force + prune + branch -D。 */
53941
53882
  checkpointResetArgs: ["reset --hard", "clean -fd"],
53942
53883
  staleCleanupArgs: ["worktree remove --force", "worktree prune", "branch -D"],
53943
- /** 并发保护:projectLock(projectId) 串行化同项目工作区操作。 */
53944
53884
  concurrencyGuard: "projectLock(projectId)",
53945
- /** 防分叉护栏:origin/<branch> 有本机没有的提交且 worktree 不在该分支 → 抛错。 */
53946
53885
  remoteBranchDiverged: "remote branch diverged",
53947
- /** 每步结束自动 push 本 conversation 工作分支;合并用 git merge --no-edit <ref>。 */
53948
53886
  mergeArgs: "merge --no-edit",
53949
- /** 强制同步面板文案 canon(r3 §3.9)。 */
53950
53887
  forceSyncCopy: "\u4E22\u5F03\u4EE3\u7801\u4FEE\u6539\u5E76\u5220\u9664\u975E\u5FFD\u7565\u7684\u672A\u8DDF\u8E2A\u6587\u4EF6\uFF1B\u4FDD\u7559\u5FFD\u7565\u5185\u5BB9\u3002\u4EC5\u672C\u6B21\u751F\u6548\u3002",
53951
- /** 重试预算(r3 bundle 注释原话数值):push 覆盖 git-host 5xx 窗口;
53952
- * 冷 worktree ls-remote+fetch「~2 min typical, ~8 min worst on /done's path」;
53953
- * merge 轮走 gitNetwork。 */
53954
53888
  retryBudgetCanon: "~2 min typical, ~8 min worst on /done's path"
53955
53889
  };
53956
53890
  var ORPHAN_WORKTREE_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
@@ -53972,60 +53906,20 @@ var REMOTE_TOOL_TIMEOUT_MS = 1e4;
53972
53906
  // ../../packages/shared/src/records/machine.ts
53973
53907
  var MACHINE_RUNTIMES = ["pi", "claude-code", "gemini"];
53974
53908
  var machineRecordSchema = external_exports.object({
53975
- /** machineId(r3 §1.2 观测形 `TlZ2sSD4EJCxjNJqVhdo_`;server 记录键名
53976
- * [推断])。 */
53977
53909
  id: recordId,
53978
- /** cairn start --name 默认 hostname(r3 §1.1);机器页显示样 `r3-mbp 离线
53979
- * …NJqVhdo_ · max 3`(r3 §1.2)。 */
53980
53910
  name: external_exports.string(),
53981
53911
  teamId: recordId,
53982
- /** presence(02 §1.2 machine_presence 事件 {machineId, online})。 */
53983
53912
  online: external_exports.boolean(),
53984
- /** 机器页数据含 latestCliVersion(r5 §8 实测 "0.1.53");用于 MCP/记忆等
53985
- * 版本墙提示(02 §7.1/§8)。 */
53986
53913
  latestCliVersion: external_exports.string().nullable(),
53987
- /** 本机 vs 接入机(spec 11 A9):server 启动 seed / hostname 匹配的 enroll
53988
- * 落 'local',其余恒 'remote';本机行钉 machines 页列表首且不可删(A8)。 */
53989
53914
  kind: external_exports.enum(["local", "remote"]),
53990
- /** per-runtime 开关态(spec 11 A9):默认 [] = 全关;machines 页 switch
53991
- * PATCH 写回。读侧宽(string[],spec 11 模块清单原文)、写侧严
53992
- * (patchMachineBodySchema 钉 MACHINE_RUNTIMES enum)——词表演进时旧库
53993
- * 行仍可读出,入口恒收严。 */
53994
53915
  enabledRuntimes: external_exports.array(external_exports.string()),
53995
- /** 机器层 shell 访问闸(XMON-108 R1,UI 承诺文案 agent.ts「远程 shell」
53996
- * 副文案的本体):与 agent 层「远程 shell」开关联合判定(双闸齐开才有
53997
- * remote_shell,见 claimedStepSchema.localTools)。默认 false(存量行
53998
- * migration 回填)——「机器 shell 权限改动秒级热加载」由每调用预检兑现
53999
- * (POST /api/machine/shell/{stepId} 复读本列,非 claim 期一次闸)。 */
54000
53916
  shellEnabled: external_exports.boolean(),
54001
- /** 机器并发上限(#1108):该机同时执行的步数 N——server claim 闸 +
54002
- * daemon 本地闸双侧消费;超过 N 的步留 pending(排队)。#1241 起未覆盖时
54003
- * 本值是 server 按能力指纹算的推荐值(见 concurrencySource);用户改过
54004
- * 则以用户值为准。DB NOT NULL 默认 3。optional 形 = 加法契约:老 server
54005
- * 响应缺该字段,消费方回退(daemon 的本地闸按 1 串行,web 不渲染并发面);
54006
- * server 恒发全块。 */
54007
53917
  maxConcurrent: external_exports.number().int().optional(),
54008
- /** #1241:true = 用户写过 maxConcurrent,心跳不再用推荐值覆盖。缺席 =
54009
- * 老 server(web 不标手动/自动)。 */
54010
53918
  maxConcurrentOverridden: external_exports.boolean().optional(),
54011
- /** #1241:按当前硬件算出的推荐值(覆盖时也发,恢复自动回到这个数)。
54012
- * 无硬件 = 保守默认。缺席 = 老 server。 */
54013
53919
  recommendedConcurrent: external_exports.number().int().optional(),
54014
- /** #1241:选择器可选区间(按总内存;无指纹 = 1..8)。PATCH 写域仍是 1..16。
54015
- * 缺席 = 老 server(web 退回 1..8)。 */
54016
53920
  concurrencyRange: external_exports.object({ min: external_exports.number().int(), max: external_exports.number().int() }).optional(),
54017
- /** #1241:manual = 用户覆盖;measured = 推荐值来自硬件;estimate = 没有
54018
- * 可用指纹,maxConcurrent 是保守默认。缺席 = 老 server。 */
54019
53921
  concurrencySource: external_exports.enum(["measured", "estimate", "manual"]).optional(),
54020
- /** 该机当前 claimed 非 chief 步数(#1108 排队可见的机器面读数,`执行中 n/N`
54021
- * n;#1148 起 chief 在跑不进 n——n 恒 ≤ N):读侧派生(listSteps/claim
54022
- * 时点计数),不落库。optional 形同 maxConcurrent——老 server 缺席时机器
54023
- * 页不渲染该标注。 */
54024
53922
  runningSteps: external_exports.number().int().optional(),
54025
- /** 机器能力清单(#1251 / ADR 0018 决策 4.1):daemon 经 enroll/presence
54026
- * 上报的已装 MCP slug 集 + 本机技能名集。三态:清单 = 已上报;null =
54027
- * 从未上报(老 daemon——机器页显示「未上报」,能力闸按未知放行);缺席 =
54028
- * 老 server 响应(读侧加法契约,消费面回落不渲染)。 */
54029
53923
  capabilities: machineCapabilitiesSchema.nullish()
54030
53924
  });
54031
53925
  var patchMachineBodySchema = external_exports.object({
@@ -54041,17 +53935,9 @@ var evacuateMachineBodySchema = external_exports.object({
54041
53935
  var MODEL_SOURCE_RUNTIMES = ["pi", "claude-code", "gemini"];
54042
53936
  var modelSourceRuntimeSchema = external_exports.enum(MODEL_SOURCE_RUNTIMES);
54043
53937
  var modelSourceModelSchema = external_exports.object({
54044
- /** 模型 id(pi = custom provider models[] 的 id;claude-code = settings.json
54045
- * 槽值原样)。 */
54046
53938
  id: external_exports.string().min(1),
54047
- /** 显示名(pi = models[] 的 name;claude-code = 模型 id 原样)。 */
54048
53939
  name: external_exports.string().min(1),
54049
- /** 槽位名(claude-code:default / opus / sonnet / …,env.ANTHROPIC_*_MODEL
54050
- * 中段小写化;pi 段缺省)。 */
54051
53940
  slot: external_exports.string().optional(),
54052
- /** #1288 活性标注:alive = 目录在且未报死 / dead = 运行时 404 回填 /
54053
- * unknown = 未探过或探活失败(缺省 = unknown,fail-open)。
54054
- * 只读位:server 探活回填,web 消费不写。 */
54055
53941
  liveness: external_exports.enum(["alive", "dead", "unknown"]).optional()
54056
53942
  });
54057
53943
  var claudeBinInfoSchema = external_exports.object({
@@ -54066,24 +53952,11 @@ var claudeAuthStateSchema = external_exports.object({
54066
53952
  });
54067
53953
  var modelSourceSchema = external_exports.object({
54068
53954
  runtime: modelSourceRuntimeSchema,
54069
- /** claude-code:上报机器的 settings.json 存在且解析为对象;pi 恒 true
54070
- * (server 在跑 = cairn 自有 runtime 可用)。**不是**「二进制装了」的
54071
- * 判据——那是 `bin`(#1050)。 */
54072
53955
  installed: external_exports.boolean(),
54073
- /** 上报机器的 hostname(os.hostname())——「已安装在 <hostname>」文案源。
54074
- * #707 起跟随执行机,不再是 server 主机。 */
54075
53956
  hostname: external_exports.string(),
54076
- /** #1259 归属机维:该段来自哪台机器(machine id)——创建 agent 三级
54077
- * 级联按它过滤模型清单。pi 段缺席(server 侧目录,机器无关)。 */
54078
53957
  machineId: external_exports.string().optional(),
54079
53958
  models: external_exports.array(modelSourceModelSchema),
54080
- /** claude 二进制事实(#1050)。三态,别压平:
54081
- * - 对象 = 探到了(path + version);
54082
- * - `null` = **探过了、没有**(PATH 上没有 / 不可执行 / 超时)——这是
54083
- * 「配置文件在而二进制缺失」那条假绿的判据,页面对它说「未安装」;
54084
- * - 缺席 = 没探过(老 daemon 未上报),UI 闭嘴(不写「未知」)。 */
54085
53959
  bin: claudeBinInfoSchema.nullable().optional(),
54086
- /** 机器本地凭据态(#1050):由步内预检回填,随节拍上行;缺席同 bin。 */
54087
53960
  auth: claudeAuthStateSchema.optional()
54088
53961
  });
54089
53962
  var modelSourcesEnvelopeSchema = external_exports.object({
@@ -54145,16 +54018,11 @@ var modelRefSchema = external_exports.object({
54145
54018
  var verifyEvidenceSchema = external_exports.object({
54146
54019
  path: external_exports.string().min(1),
54147
54020
  note: external_exports.string().optional(),
54148
- /** 对应方案 Verification 清单的第几项(从 1 起,#1492)。缺省 = 老 verdict
54149
- * 或无清单任务,不对应具体清单项。 */
54150
54021
  item: external_exports.coerce.number().int().min(1).optional()
54151
54022
  });
54152
54023
  var verifyVerdictSchema = external_exports.object({
54153
- /** 本轮交付是否通过验证(如实报——失败是有效结论,不是本步的错误)。 */
54154
54024
  passed: external_exports.boolean(),
54155
- /** 一段总结:跑了什么、对账结果(CI / PR body / 证据包)。 */
54156
54025
  conclusion: external_exports.string(),
54157
- /** 证据条目(缺省 = 无证据——「跑过但零产物」按未通过处理由人裁量)。 */
54158
54026
  evidence: external_exports.array(verifyEvidenceSchema).default([])
54159
54027
  });
54160
54028
 
@@ -54168,18 +54036,9 @@ var skillInjectionFactsSchema = external_exports.object({
54168
54036
  // ../../packages/shared/src/protocol/machine-wire.ts
54169
54037
  var machineEnrollBodySchema = external_exports.object({
54170
54038
  teamId: recordId,
54171
- /** cairn start --name(缺省 = hostname)。 */
54172
54039
  name: external_exports.string().optional(),
54173
- /** CLI 版本(机器页 latestCliVersion 数据源,r5 §8)。 */
54174
54040
  cliVersion: external_exports.string().optional(),
54175
- /** 本机 claude-code 模型上报(#707):daemon 读本机 settings.json 随注册
54176
- * 上行,免等首个 presence 节拍。缺席 = 旧 daemon(server 视为未知)。 */
54177
54041
  claudeCode: claudeCodeReportSchema.optional(),
54178
- /** 机器能力清单(#1251 / ADR 0018 决策 4.1):已装 MCP slug 集 + 本机
54179
- * 技能名集,随注册上行免等首个 presence 节拍。wire 级宽松位(z.unknown,
54180
- * 心跳红线 02 §5.4——坏形状永不 400 注册/心跳);server 侧对
54181
- * machineCapabilitiesSchema 单独 safeParse 收严落库,失败丢弃保留旧值。
54182
- * 缺席 = 旧 daemon(server 视为未知,能力闸放行)。 */
54183
54042
  capabilities: external_exports.unknown().optional()
54184
54043
  });
54185
54044
  var machineEnrollResponseSchema = machineJsonSchema;
@@ -54189,7 +54048,6 @@ var machineEnrollStartBodySchema = external_exports.object({
54189
54048
  });
54190
54049
  var machineEnrollStartResponseSchema = external_exports.object({
54191
54050
  enrollId: external_exports.string(),
54192
- /** 浏览器授权 URL(登录页授权团队,02 §5.2)。 */
54193
54051
  url: external_exports.string()
54194
54052
  });
54195
54053
  var machineEnrollPollBodySchema = external_exports.object({ enrollId: external_exports.string() });
@@ -54203,10 +54061,6 @@ var machineEnrollConfirmResponseSchema = external_exports.object({ machine: mach
54203
54061
  var machinePresenceBodySchema = external_exports.object({
54204
54062
  cliVersion: external_exports.string().optional(),
54205
54063
  claudeCode: claudeCodeReportSchema.optional(),
54206
- /** 机器能力清单(#1251,enroll 同律):wire 级宽松位(z.unknown)——
54207
- * 字段级解析失败不阻心跳(02 §5.4 红线),收严在 server 侧 safeParse
54208
- * (machineCapabilitiesSchema),失败丢弃该字段保留旧值、presence 恒
54209
- * {ok:true}。缺席 = 旧 daemon,server 保留旧值。 */
54210
54064
  capabilities: external_exports.unknown().optional()
54211
54065
  });
54212
54066
  var machineOkResponseSchema = external_exports.object({ ok: external_exports.literal(true) });
@@ -54218,76 +54072,36 @@ var machineClaimBodySchema = external_exports.object({
54218
54072
  });
54219
54073
  var claimedStepSchema = external_exports.object({
54220
54074
  step: stepRecordSchema,
54221
- /** ≡ step.buildId(CONTEXT.md 实体等式;显式字段 = 02 §5.7 `for conv <uuid>`)。
54222
- * chief 步 = `chief-<uuid>`(conversationId ≡ threadId,r5 §3.1)。 */
54223
54075
  conversationId: recordId,
54224
- /** 会话语义(02 §4.2/§5.7):new session | continue session(合并轮/驳回
54225
- * 重规划/chief 续轮复用同 conv pi 会话)。sessionId = 引擎侧会话标识(done 回传)。 */
54226
54076
  session: external_exports.object({
54227
54077
  action: external_exports.enum(["new", "continue"]),
54228
54078
  sessionId: external_exports.string().nullable(),
54229
- /** #1312:上一轮会话所在机器。仅当它与本步领取机不同时携带(换绑 /
54230
- * 迁移后会话文件还在旧机器上)。同机或缺省 = 旧 daemon 形,zod strip
54231
- * 无版本墙。 */
54232
54079
  priorMachineId: external_exports.string().optional()
54233
54080
  }),
54234
- /** 续轮指令(server 合成 [设计]):驳回 feedback 注入重规划轮(r5 §4
54235
- * 「v2 内容忠实执行反馈」的宿主等价物)、chief 回合任务文本/wake 事实。
54236
- * 缺省 = daemon 按 kind 兜底(CONTINUE_PROMPTS)或 title+spec 任务文本。 */
54237
54081
  instruction: external_exports.string().nullable().optional(),
54238
- /** worker 步任务面;chief 步缺省(无 todo 语境,r5 §3.1)。 */
54239
54082
  todo: external_exports.object({
54240
54083
  id: recordId,
54241
54084
  seqNum: external_exports.number().int(),
54242
54085
  title: external_exports.string(),
54243
54086
  spec: external_exports.string(),
54244
- /** 任务元信息注入面(#446 / ADR 0005 分叉律):github 形态项目携带,
54245
- * 缺省 = local/hosted 现行为(daemon 回落 FIXED_TAGS 单标签 + 占位
54246
- * 回填指令,文本逐字节不变)。vocab = 项目标签集镜像的 name 列(claim
54247
- * 时现取,不缓存第二真值;标签数量上限的分叉落点在 server setTaskMeta
54248
- * 校验分支与工具面 tags 数组形,不进本载荷);titleFinal = 标题已是
54249
- * 真值(issue 来源),daemon 不注入回填指令且 server 拒绝 title 覆写。
54250
- * 纯增可选字段无版本墙:旧 daemon 忽略 = 现行为。 */
54251
54087
  meta: external_exports.object({
54252
54088
  titleFinal: external_exports.boolean(),
54253
54089
  vocab: external_exports.array(external_exports.object({ name: external_exports.string() }))
54254
54090
  }).optional(),
54255
- /** #1406 任务来源两列(todo 记录同名列的投影):sourceKind='github-issue'
54256
- * 时 daemon 把任务文本包进 GitHub issue 原文围栏(ADR 0021 D5),且不在
54257
- * systemPrompt 里写标题。种类用宽 string 而非枚举:server 新增来源种类时,
54258
- * 旧 daemon 不因枚举失配拒掉整条 claim。缺省 = 旧 server 形(无围栏,
54259
- * 现行为);旧 daemon 按 zod strip 忽略。 */
54260
54091
  sourceKind: external_exports.string().nullable().optional(),
54261
54092
  sourceRef: external_exports.string().nullable().optional(),
54262
54093
  blockerHandoff: blockerHandoffSchema.optional(),
54263
54094
  output: external_exports.string().nullable().optional()
54264
54095
  }).optional(),
54265
- /** worker 步项目面;chief 步 = 探索基座(可缺省 = 裸目录回合)。 */
54266
54096
  project: external_exports.object({
54267
54097
  id: recordId,
54268
54098
  name: external_exports.string(),
54269
- /** repo 绑定位(M3b worktree 契约接线,02 §3/§5.5 + spec 12 local 形态):
54270
- * cloneUrl = 托管 `<origin>/git/<teamId>/<repoName>`(02 §5.8
54271
- * gitHostDomain 槽本地代位)、GitHub https 派生、或 local 形态的用户仓库
54272
- * 绝对路径(server 端 validateLocalRepoPath 规范化值——daemon 镜像 clone
54273
- * 源与 ff-only 落地面同吃该路径,git clone 对本地路径默认走硬链接);
54274
- * null = 项目未绑 repo(工作区退化为裸目录)。 */
54275
54099
  repo: external_exports.object({
54276
- // 词表单源 = PROJECT_REPO_KINDS(records/project.ts;新 kind 落地
54277
- // 即随 wire,免三处散射编辑)。
54278
54100
  kind: external_exports.enum(PROJECT_REPO_KINDS),
54279
54101
  cloneUrl: external_exports.string(),
54280
- /** github 形态同机加速位(ADR 0017 / #1213):项目行 localPath
54281
- * 非空时携带。daemon 物化时双条件判定(路径存在 + 该路径 origin
54282
- * 归一化后与 cloneUrl 同仓),不过则静默回落 GitHub clone——
54283
- * 路径活在执行机,server 侧不预判。local 形态不携带(cloneUrl
54284
- * 即路径本身)。 */
54285
54102
  localPath: external_exports.string().optional()
54286
54103
  }).nullable()
54287
54104
  }).optional(),
54288
- /** 执行 Agent(worker 步 = assignment 按步类取槽,02 §4.2/r5 §5;chief 步 =
54289
- * 绑定 Agent,模型 = 绑定 Agent 模型 r5 §3.1);null = 未指派(不可执行,
54290
- * server 侧不派发 [设计])。 */
54291
54105
  agent: external_exports.object({
54292
54106
  id: recordId,
54293
54107
  displayName: external_exports.string(),
@@ -54295,75 +54109,19 @@ var claimedStepSchema = external_exports.object({
54295
54109
  provider: external_exports.string().nullable(),
54296
54110
  modelId: external_exports.string().nullable(),
54297
54111
  thinkingLevel: external_exports.string().nullable(),
54298
- /** 该 Agent 记忆条目注入 systemPrompt(02 §4.4 读路径最小形;注入形
54299
- * [推断] 保留,04 附录 A)。 */
54300
54112
  memories: external_exports.array(external_exports.object({ title: external_exports.string(), content: external_exports.string() })).optional(),
54301
- /** 授权白名单(#1169 起正名,原 skills 字段拆出的授权半边):null =
54302
- * 不限制(全量可读,创建缺省——[] 旧行已随迁移转 null);数组 = 白名单
54303
- * (#917 deny 吃它,名单外 Read 硬挡);[] = 显式全拒(有意选择,不再
54304
- * 是意外缺省)。worker 步恒携带(null 或数组);chief 步不携带(信任面
54305
- * 全量直通)。旧 daemon 忽略本字段 = 其缺省律全量直通——混版本窗口里
54306
- * 老 daemon 对白名单行不设挡(窗口期接受,server+daemon 同步部署即收)。 */
54307
54113
  skillsAllowlist: external_exports.array(external_exports.string()).nullable().optional(),
54308
- /** 默认携带技能(#1169 携带半边,单值):worker 步恒携带(null = 未设);
54309
- * daemon 据此把非空值排进 #1116 注入绑定序首位(自动携带语义)。chief
54310
- * 步不携带(chief 目录恒全量,无绑定序)。 */
54311
54114
  defaultSkill: external_exports.string().nullable().optional(),
54312
- /** #1106 派发技能注入选择(worker 步恒携带含空数组):本步任务 brief
54313
- * 实际注入的技能 id 集(= 服务端按任务文本对授予集规则选出的子集;
54314
- * [] = 已计算零命中——零注入不是故障;缺省 = 旧 server 未做选择,
54315
- * 目录注入回落 skillsAllowlist 白名单全量)。ids ⊆ skillsAllowlist
54316
- * (授权上限不变——denied 判定仍吃 allowlist 全量,本字段只收窄目录
54317
- * 注入面)。纯增可选字段:旧 daemon 忽略 = 现行为,无版本墙。 */
54318
54115
  injectedSkills: external_exports.array(external_exports.string()).optional(),
54319
- /** 权限开关已开集(XMON-77):词表 = AGENT_TOOL_SWITCHES 六档(XMON-84
54320
- * 用户拍板 B 恢复全六档),执法落点 = daemon 收尾闸(merge fail-fast +
54321
- * push 软拒)与 server requestMerge 闸——只消费 合并分支/推送分支 两
54322
- * 执法档,四无本体档照常透传(无消费方,本体另立规划票)。worker 步恒
54323
- * 携带——含空数组([] = 全关,least-privilege;缺省保留给老 server =
54324
- * fail-open 版本墙,两态不得混淆)。chief 步不携带(chief 步不开
54325
- * worktree、无 git 收尾——两开关无语义)。读侧宽:存量行残值原样透传,
54326
- * daemon 只认已知档。无版本墙:纯增可选字段,旧 daemon 忽略 = 现行为
54327
- * (推送不受限)。 */
54328
54116
  tools: external_exports.array(external_exports.string()).optional()
54329
54117
  }).nullable(),
54330
- /** chief 步块(r5 §3.1:Chief 回合 = pi 会话 + 服务端 relay 工具;细节
54331
- * [设计]——wire 未采)。 */
54332
54118
  chief: external_exports.object({
54333
- /** ≡ conversationId 去 `chief-` 前缀后的线程 id(chief-<uuid> 同值)。 */
54334
54119
  threadId: recordId,
54335
- /** server 合成 system prompt(charter + 团队资源清单 + 策略指引,
54336
- * 02 §4.3 接口契约「输入:用户自然语言消息 + 团队资源清单」)。 */
54337
54120
  systemPrompt: external_exports.string(),
54338
- /** 本回合触发(user 消息轮 / wake 轮,r5 §3.5)。 */
54339
54121
  trigger: external_exports.enum(["user", "gate", "settle", "failed", "wake"])
54340
54122
  }).optional(),
54341
- /** remoteTools[](服务端定义、服务端执行;chief 步 = 51 词表全量,
54342
- * protocol/chief-tools.ts;worker 步 = 记忆三件套 WORKER_MEMORY_REMOTE_TOOLS,
54343
- * 02 §4.4/r5 §6「worker 侧同族工具经 remoteTools 下发」。位形一手 = bundle
54344
- * 提取,r5 §3.1)。 */
54345
54123
  remoteTools: external_exports.array(remoteToolDefSchema).optional(),
54346
- /** daemon 本地工具注册依据(XMON-108 R1,XMON-85 规划「权限决策单点在
54347
- * server」):server 在 claim 时算好的词集,daemon 照此注册 LocalToolDef
54348
- * (agent-backend.ts)——词缺席 = 工具不注册(fail-closed;与 mcpServers
54349
- * 版本墙不同,这里缺省与空数同义,无混发形状失败模式)。当前两词:
54350
- * remote_shell(AGENT_TOOL_SHELL ∩ machine.shellEnabled 双闸)与
54351
- * create_tag(agent.tools ∋ 创建标签,与机器旗无关——T1/XMON-111 消费,
54352
- * 契约由本票一次定死)。worker 步恒携带含空数组([] = 无本地工具,
54353
- * least-privilege,skills/tools 同律);chief 步不携带(chief 无 worktree/
54354
- * 无本地工具语义,跨机 shell 派发显式缓期)。每条命令的真实闸在预检端点
54355
- * (本字段只是注册面),步中关闸不影响在跑会话的下一次预检。纯增可选
54356
- * 字段:旧 daemon 解析即丢弃,无版本墙。 */
54357
54124
  localTools: external_exports.array(external_exports.string()).optional(),
54358
- /** 已授权 MCP slug 列表(spec 13 断约:原 McpEndpoint[] 改 string[]——
54359
- * server 不再解析端点、不再持有任何 MCP 凭证;执行 daemon 读本机
54360
- * `~/.claude.json` 按 slug 自行解析,per-turn 连接、失败降级不阻断,
54361
- * 工具名 `mcp__<slug>__<tool>`,未知 slug daemon 侧跳过。三态受管
54362
- * (#1307,对齐 Multica mcp_config.go):数组(含 [] = 受管严格空——
54363
- * daemon 据此给 claude-code SDK 上 strictMcpConfig 锁,用户全局 MCP 不进
54364
- * 会话)= 受管集合;缺省 = 继承 runtime 配置,只在版本墙
54365
- * (MCP_MIN_CLI_VERSION,断约时提升)未达时由新 server 发出——旧 daemon
54366
- * 视为无 MCP 运行,不存在混发两种形状的失败模式。 */
54367
54125
  mcpServers: external_exports.array(external_exports.string()).optional()
54368
54126
  });
54369
54127
  var LOCAL_TOOL_REMOTE_SHELL = "remote_shell";
@@ -54375,15 +54133,8 @@ var machineSyncCommandSchema = external_exports.object({
54375
54133
  syncId: recordId,
54376
54134
  buildId: recordId,
54377
54135
  projectId: recordId,
54378
- /** 目标仓 clone URL(机器基座未存在该 project 时 daemon 据此 clone);同
54379
- * build 已有 worktree 的机器复用本地,不发此 clone。 */
54380
54136
  cloneUrl: external_exports.string(),
54381
- /** 同步目标目录(机器本机路径;web 默认 `~/<homeDirName>/workspaces/<buildId>`,
54382
- * 用户可改——r1 changelog 09-13 文本)。 */
54383
54137
  directory: external_exports.string(),
54384
- /** ref = 分支名(`cairn/conv-<uuid>`,brand conversationBranch);
54385
- * commit = 完整 40hex sha(daemon 端 fetch 后 reset --hard 到此 sha,spec
54386
- * `目标提交 <12hex>` r3 §3.9 展示形但 wire 用 40hex 简化对拍)。 */
54387
54138
  ref: external_exports.string(),
54388
54139
  commit: external_exports.string(),
54389
54140
  force: external_exports.boolean()
@@ -54397,8 +54148,6 @@ var machineStreamEventSchema = external_exports.discriminatedUnion("type", [
54397
54148
  external_exports.object({ type: external_exports.literal("wake") }),
54398
54149
  external_exports.object({ type: external_exports.literal("shutdown") }),
54399
54150
  external_exports.object({ type: external_exports.literal("steer"), stepId: recordId }),
54400
- // stop = 用户停止钮中断在跑步(M7 #308 [设计],steer 同律:只带 stepId
54401
- // 信号,discard 勾选位经 GET /api/machine/stop 拉取-确认)。
54402
54151
  external_exports.object({ type: external_exports.literal("stop"), stepId: recordId }),
54403
54152
  external_exports.object({ type: external_exports.literal("sync"), sync: machineSyncCommandSchema })
54404
54153
  ]);
@@ -54446,16 +54195,8 @@ var machineToolResponseSchema = external_exports.union([
54446
54195
  machineToolRelayResponseSchema
54447
54196
  ]);
54448
54197
  var machineTokenResponseSchema = external_exports.object({
54449
- /** 该步 Agent 的 provider 配置(apiKey 内存态经 SecretBox 解密下发,02 §8
54450
- * 运行时层;无 key 网关可留空 = r3 §2 表单语义)。 */
54451
54198
  provider: providerConfigSchema.nullable(),
54452
- /** 本步可取用的团队密钥(名字 → 明文;服务端解析契约 = M2c
54453
- * services/credentials.ts)。明文只出现在本返回值(02 §8 纪律),且**不得**
54454
- * 铺进 agent 进程环境——daemon 持有真值,agent 经本地取用通道显式取用。
54455
- * 按 step kind 收窄:plan/review/chief 步恒空(records/step.ts
54456
- * stepTakesSecrets)。 */
54457
54199
  secrets: external_exports.record(external_exports.string(), external_exports.string()),
54458
- /** 托管 repo git 凭证(02 §3/§5.4:per-step 注入;接线随 git 面)。 */
54459
54200
  git: external_exports.object({
54460
54201
  username: external_exports.string(),
54461
54202
  password: external_exports.string()
@@ -54507,74 +54248,20 @@ var quotaBlockSchema = external_exports.object({
54507
54248
  var machineDoneBodySchema = external_exports.object({
54508
54249
  status: external_exports.enum(["success", "failed", "stopped"]),
54509
54250
  errorMessage: external_exports.string().optional(),
54510
- /** pi 会话标识(continue session 复用面:合并轮/重规划轮,02 §4.2)。 */
54511
54251
  sessionId: external_exports.string().optional(),
54512
- /** per-model 用量(token_usage 记账,02 §6.2/r3 §3.8)。 */
54513
54252
  usage: external_exports.array(modelUsageSchema).optional(),
54514
- /** review 列位双键之一(02 §4.1/r5 §8)。 */
54515
54253
  hasChanges: external_exports.boolean().optional(),
54516
- /** 工作分支偏离(#1195/#1277):daemon 步收尾发现 HEAD 停在契约分支之外的
54517
- * 具名分支时携带(expected = 会话分支,actual = 实际 HEAD 分支;detached
54518
- * HEAD / 查询失败不携带)。消费面 = server 产物闸 2:build 步携带即硬失败。
54519
- * hasChanges=false 时原因说明步窗口内无提交;有提交时拒绝自动收工,且不保留
54520
- * 本步 PR 回填。两态都点名两分支。 */
54521
54254
  workBranchDrift: external_exports.object({ expected: external_exports.string().min(1), actual: external_exports.string().min(1) }).optional(),
54522
- /** 步收尾时 conv 分支 HEAD sha [设计](M3b):per-step checkpoint 数据源
54523
- * (「恢复到此处」r3 §3.5/02 §4.2)+ 合并步 fast-forward 落地键
54524
- * (「目标提交 <12hex>」r3 §3.9 面板同族)。 */
54525
54255
  commit: external_exports.string().optional(),
54526
- /** AI 审核步 findings(M7 #330,r8 §3.1):仅 review 步携带,daemon 解析
54527
- * agent 终轮 JSON 输出后置入;server 落库 + 判 blocking 触发自动修订。
54528
- * 形状 = records/review.ts reviewVerdictSchema(conclusion + findings[])。 */
54529
54256
  findings: reviewVerdictSchema.optional(),
54530
- /** AI 审核步 verdict 提取失败原因(#700 B-C13):review 步 daemon 未能从
54531
- * transcript 取出合法 verdict 时随 done 携带(findings 缺位;两字段互斥,
54532
- * 同现 = 新 daemon 对旧 server 的无害冗余,findings 优先)。server 据此
54533
- * 把 verdict 消息兜底拆成两态:「判定提取失败」+ extractionError 原因上
54534
- * 浮(web 审核面可分辨提取器失败),两字段皆缺(旧 daemon 无信号)才落
54535
- * 「审核未返回结论」。非 review 步不携带。长度上限 = schema 面第二道闸
54536
- * (daemon 侧已截断,防 bug daemon 单条打爆 DB)。 */
54537
54257
  findingsError: external_exports.string().max(FINDINGS_ERROR_CHAR_LIMIT).optional(),
54538
- /** PR 回填(#704 / B-C16,Multica link-back 只读方向):github 形态步收尾
54539
- * 时 daemon 只读探测 conv 分支上的 PR(机器 gh / per-step token / 匿名三
54540
- * 梯,单次有界),探测命中才携带——无 PR / 探测失败 = 缺席(面板分支名在、
54541
- * PR 槽留空,不造数据、不重试)。server 落 build.prUrl/prNumber 并发布。 */
54542
54258
  prUrl: external_exports.string().optional(),
54543
54259
  prNumber: external_exports.number().int().optional(),
54544
- /** 变更投影上报(#704 失败方式 5:非 hosted 形态投影真值源 = daemon 步
54545
- * 收尾上报):conv 分支相对 origin/<default> 的 unified diff 原文。daemon
54546
- * 侧受 CHANGES_DIFF_MAX_BYTES 上限(超限缺席——投影回落空集而非半截假象);
54547
- * server parseUnifiedDiff 解析后落 build.changes 列,readBuildChanges 非
54548
- * hosted 分支消费。hosted 形态真值源仍是 server bare repo,daemon 不上报
54549
- * (双真值源漂移面不引入)。 */
54550
54260
  changesDiff: external_exports.string().optional(),
54551
- /** 验证步 verdict(#1250 / ADR 0018 层 1):仅 verify 步携带,daemon 解析
54552
- * agent 终轮 JSON 输出后置入;server 落 VERIFY_VERDICT_KIND 消息行。
54553
- * 形状 = records/verify.ts verifyVerdictSchema(passed + conclusion +
54554
- * evidence[])。非 verify 步不携带(findings 的 review 律——解析面按步类
54555
- * 开,规避假阳)。 */
54556
54261
  verifyVerdict: verifyVerdictSchema.optional(),
54557
- /** 验证步 verdict 提取失败原因(#1250,findingsError 同律):verify 步
54558
- * daemon 未能从 transcript 取出合法 verdict 时随 done 携带(verifyVerdict
54559
- * 缺位)。server 据此落「验证判定提取失败」兜底消息,不静默吞错。长度
54560
- * 上限同 findingsError(schema 面第二道闸)。 */
54561
54262
  verifyVerdictError: external_exports.string().max(FINDINGS_ERROR_CHAR_LIMIT).optional(),
54562
- /** #1261 配额熔断信号:daemon 识别 quota/capacity(分类单源 =
54563
- * shared/task-failure.ts)后随 done 携带——server 据此挂起「等额度」
54564
- * (step waiting_quota + 通知 + 探测续跑),而非走 failed 漏斗判死。
54565
- * status 仍为 'failed'(旧 server zod strip 掉本字段 = 普通失败收尾,
54566
- * 混版本零破坏;同 findingsError 的无害冗余律)。空流/非配额错误不携带
54567
- * (分类面不猜——不可见即污染可观测性)。 */
54568
54263
  quotaBlock: quotaBlockSchema.optional(),
54569
- /** #1493 无输出信号:status=success 但本步 transcript 没有任何 assistant
54570
- * 消息时 daemon 携带 true。server 的「0 token 静默失败」判定要求它在位——
54571
- * pi 对不回 usage 的 relay 也报 0 token 行,单看 usage 会误判。旧 daemon
54572
- * 缺席 = 不判(zod strip / 缺省,混版本零破坏)。 */
54573
54264
  noOutput: external_exports.literal(true).optional(),
54574
- /** #1186 实际注入名集:daemon 在 scan + 字节预算之后随 done 携带
54575
- * (injected / omitted / unrendered)。旧 daemon 缺席 = server 不落断言
54576
- * (zod strip,混版本零破坏)。不是 step.skillInjection:那一列是 claim
54577
- * 期的选择 hits,预算截断之后的名字只在这里。 */
54578
54265
  skillInjectionFacts: skillInjectionFactsSchema.optional(),
54579
54266
  report: external_exports.string().max(INFO_REPORT_MAX_BYTES).optional()
54580
54267
  });
@@ -54658,7 +54345,6 @@ var claudeMcpConfigSchema = external_exports.object({
54658
54345
  });
54659
54346
  var CLAUDE_CONFIG_FILE_NAME = ".claude.json";
54660
54347
  var MCP_TOOL_REGISTRY = [
54661
- // —— 读 11 组(02 §7.2)——
54662
54348
  { grant: "Todos", name: "todos", kind: "read" },
54663
54349
  { grant: "Projects", name: "projects", kind: "read" },
54664
54350
  { grant: "Conversation", name: "conversation", kind: "read" },
@@ -54670,7 +54356,6 @@ var MCP_TOOL_REGISTRY = [
54670
54356
  { grant: "Issues", name: "issues", kind: "read" },
54671
54357
  { grant: "Pull Requests", name: "pull_requests", kind: "read" },
54672
54358
  { grant: "Workflow Runs", name: "workflow_runs", kind: "read" },
54673
- // —— 写 13 项(02 §7.2)——
54674
54359
  { grant: "Create Todo", name: "create_todo", kind: "write" },
54675
54360
  { grant: "Update Todo", name: "update_todo", kind: "write" },
54676
54361
  { grant: "Message Todo", name: "message_todo", kind: "write" },
@@ -54690,14 +54375,10 @@ var MCP_REGISTRY_BY_NAME = new Map(MCP_TOOL_REGISTRY.map((t) => [t.name, t]));
54690
54375
  // ../../packages/shared/src/records/permission-rules.ts
54691
54376
  var permissionActionSchema = external_exports.enum(["allow", "ask", "reject"]);
54692
54377
  var permissionRuleSchema = external_exports.object({
54693
- /** 稳定 id(审计口径:日志行与拒绝文案引用它)。 */
54694
54378
  id: external_exports.string().min(1),
54695
- /** 工具名(pi 面小写 `bash` / SDK 面 `Bash` 等均可写;`*` = 全工具)。 */
54696
54379
  tool: external_exports.string().min(1),
54697
- /** 参数槽 glob(bash 面即 `{command: '<glob>'}`;缺省 = 全匹配)。 */
54698
54380
  matches: external_exports.record(external_exports.string(), external_exports.string()).optional(),
54699
54381
  action: permissionActionSchema,
54700
- /** 给人看的一句话(为什么拦/放)。 */
54701
54382
  description: external_exports.string().optional()
54702
54383
  });
54703
54384
  function matchGlob(pattern, value) {
@@ -58210,22 +57891,12 @@ var daemonConfigSchema = external_exports.object({
58210
57891
  serverUrl: external_exports.string(),
58211
57892
  apiKey: external_exports.string().optional(),
58212
57893
  teamId: external_exports.string().optional(),
58213
- /** --name 默认 hostname(r3 §1.1)。 */
58214
57894
  name: external_exports.string(),
58215
- /** CAIRN_HOME 默认 ~/.cairn(02 §5.3 布局根;r3 §1.1 实测原名 TDS_HOME)。 */
58216
57895
  home: external_exports.string(),
58217
- /** 持久工作区根(02 §5.5 baseRepo/任务目录的父层)。 */
58218
57896
  workspacesDir: external_exports.string(),
58219
57897
  foreground: external_exports.boolean(),
58220
- /** skills 扫描根(spec 14/#371):CAIRN_SKILLS_DIR 缺省 ~/.agents/skills;
58221
- * 目录不存在 = 空 skills 集,非致命(扫描层降级,config 不校验存在性)。 */
58222
57898
  skillsDir: external_exports.string(),
58223
- /** 本机 MCP config(spec 13/#368):claim slug 列表在此解析成执行端点。
58224
- * 默认 ~/.claude.json;CAIRN_MCP_CONFIG 覆盖。执行机各读各机——stdio
58225
- * 命令在真正的执行机上起,密钥值从不跨 wire。 */
58226
57899
  mcpConfigPath: external_exports.string(),
58227
- /** #1149 环境钩子超时 ms(缺省 WORKSPACE_HOOK_TIMEOUT_MS 20min;
58228
- * CAIRN_HOOK_TIMEOUT_MS 覆写,非正整数 = 忽略用缺省)。 */
58229
57900
  hookTimeoutMs: external_exports.number().int().positive()
58230
57901
  });
58231
57902
  var DEFAULT_SERVER_URL = "http://127.0.0.1:8787";
@@ -58262,7 +57933,6 @@ function loadDaemonConfig(input2 = {}, env = process.env) {
58262
57933
  workspacesDir,
58263
57934
  foreground: input2.foreground ?? false,
58264
57935
  skillsDir,
58265
- // Settings 缝优先级同律:显式入参 > env > 默认(~/.claude.json)。
58266
57936
  mcpConfigPath: resolve(
58267
57937
  input2.mcpConfigPath ?? env[ENV_VARS.mcpConfig] ?? join(homedir(), CLAUDE_CONFIG_FILE_NAME)
58268
57938
  ),
@@ -61743,6 +61413,11 @@ var TerminalHandle = class _TerminalHandle {
61743
61413
  }
61744
61414
  };
61745
61415
 
61416
+ // src/version.ts
61417
+ import { createRequire as createManifestRequire } from "node:module";
61418
+ var requireManifest = createManifestRequire(import.meta.url);
61419
+ var DAEMON_VERSION = requireManifest("../package.json").version;
61420
+
61746
61421
  // src/backend/acp.ts
61747
61422
  var GEMINI_CAPABILITIES = {
61748
61423
  name: "gemini",
@@ -61911,7 +61586,7 @@ var GeminiBackend = class {
61911
61586
  await connection.agent.request(methods.agent.initialize, {
61912
61587
  protocolVersion: PROTOCOL_VERSION,
61913
61588
  clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, session: {} },
61914
- clientInfo: { name: "cairn", version: "0.2.0" }
61589
+ clientInfo: { name: "cairn", version: DAEMON_VERSION }
61915
61590
  });
61916
61591
  const response = resumeId ? await connection.agent.request(methods.agent.session.load, {
61917
61592
  sessionId: resumeId,
@@ -99039,8 +98714,6 @@ function createSkillReadGate(denied, log) {
99039
98714
  };
99040
98715
  return {
99041
98716
  check: check2,
99042
- // pi read.js 的 operations 是整体替换(`options.operations ?? default`),
99043
- // 三件必须齐——detectImageMimeType 透传 pi 原实现,图片读取面零扰动。
99044
98717
  operations: {
99045
98718
  readFile: async (absolutePath) => {
99046
98719
  await guard(absolutePath);
@@ -99060,7 +98733,6 @@ var CLAUDE_CODE_CAPABILITIES = {
99060
98733
  name: "claude-code",
99061
98734
  thinkingLevels: ["low", "medium", "high", "xhigh", "max"],
99062
98735
  oauthProviders: [],
99063
- // 认证机器本地(A4),无 oauth 订阅面
99064
98736
  compaction: true,
99065
98737
  sessionResume: true
99066
98738
  };
@@ -99293,8 +98965,6 @@ var ClaudeSessionHandle = class {
99293
98965
  this.events = this.queue.iterable();
99294
98966
  void this.pump();
99295
98967
  }
99296
- /** SDKMessage 泵 → 映射 → 事件面。终局事件(done/error/message_stop)收
99297
- * 事件面;生成器耗尽(输入流关后 query 自然收尾)= 无终局兜底收面。 */
99298
98968
  async pump() {
99299
98969
  try {
99300
98970
  for await (const msg of this.q) {
@@ -99324,9 +98994,6 @@ var ClaudeSessionHandle = class {
99324
98994
  this.queue.end();
99325
98995
  if (!this.abort.signal.aborted) this.abort.abort();
99326
98996
  }
99327
- /** steer = 流输入队列(下轮消费)+ steer 事件(A8:与 pi 中途注入语义有
99328
- * 已知差异,文档化不抹平;interrupt 归 T2)。images = #730 随话交付的
99329
- * 图片(内联 image content block 同 prompt 面机制)。 */
99330
98997
  async steer(text, images) {
99331
98998
  this.input.push(buildUserMessage(text, images));
99332
98999
  this.queue.push({ type: "steer", text });
@@ -99363,8 +99030,6 @@ function textBlock(text) {
99363
99030
  function toImageBlock(img) {
99364
99031
  return {
99365
99032
  type: "image",
99366
- // mimeType 恒在四值联合内(resolver inlineMime 收口)——cast = 类型面
99367
- // 与运行时保证的对齐,不是放宽。
99368
99033
  source: { type: "base64", media_type: img.mimeType, data: img.data }
99369
99034
  };
99370
99035
  }
@@ -99611,7 +99276,6 @@ function buildClaudeSdkOptions(parts) {
99611
99276
  permissionMode: "bypassPermissions",
99612
99277
  disallowedTools: parts.disallowedTools,
99613
99278
  includePartialMessages: true,
99614
- // text_delta/thinking_delta 增量面
99615
99279
  settingSources: [...CLAUDE_SETTING_SOURCES],
99616
99280
  ...mcpSection,
99617
99281
  ...parts.effort !== void 0 ? { effort: parts.effort } : {},
@@ -99625,10 +99289,7 @@ function buildClaudeSdkOptions(parts) {
99625
99289
  ...parts.resumeId !== null ? { resume: parts.resumeId } : { sessionId: parts.sessionId },
99626
99290
  ...parts.skillDenyRules !== void 0 && parts.skillDenyRules.length > 0 ? { settings: { permissions: { deny: [...parts.skillDenyRules] } } } : {},
99627
99291
  ...parts.executablePath !== void 0 ? { pathToClaudeCodeExecutable: parts.executablePath } : {},
99628
- // #1148:SDK env 是**整替**语义(不与 process.env 合并)——必须先展开
99629
- // process.env 保 PATH/HOME/ANTHROPIC_* 等继承位,per-step 值最后覆盖。
99630
99292
  ...parts.env !== void 0 ? { env: { ...process.env, ...parts.env } } : {},
99631
- // #1171:原生插件通道(团队技能 → CLI Skill 发现面)。空/缺省 = 键不发。
99632
99293
  ...parts.plugins !== void 0 && parts.plugins.length > 0 ? { plugins: parts.plugins } : {},
99633
99294
  abortController: parts.abortController
99634
99295
  };
@@ -99639,11 +99300,6 @@ var ClaudeCodeBackend = class {
99639
99300
  }
99640
99301
  opts;
99641
99302
  capabilities = CLAUDE_CODE_CAPABILITIES;
99642
- /** 简报文件通道(#958):SDK 只在 `settingSources` 含 `'project'` 时读
99643
- * worktree 的 CLAUDE.md。#917 起该选项由 buildClaudeSdkOptions 显式钉成
99644
- * CLAUDE_SETTING_SOURCES(含 'project')——承重位从「依赖 SDK 缺省」变成
99645
- * 「产品声明 + 单测钉值」;改动那份列表前先重验简报存活(spec 24 §通道漂移)。
99646
- * AGENTS.md 一概不读。 */
99647
99303
  brief = {
99648
99304
  backendId: "claude-code",
99649
99305
  composeBody: (opts, base) => appendSkillsCatalog(
@@ -99672,7 +99328,6 @@ var ClaudeCodeBackend = class {
99672
99328
  mcpServers[HOST_MCP_SERVER_NAME] = M8e({
99673
99329
  name: HOST_MCP_SERVER_NAME,
99674
99330
  alwaysLoad: true,
99675
- // 50 件 chief 词表必须全量进 prompt(不defer 给工具搜索)
99676
99331
  tools: hostTools
99677
99332
  });
99678
99333
  }
@@ -99713,9 +99368,7 @@ var ClaudeCodeBackend = class {
99713
99368
  ...append !== void 0 ? { append } : {},
99714
99369
  skillDenyRules,
99715
99370
  ...this.opts.executablePath !== void 0 ? { executablePath: this.opts.executablePath } : {},
99716
- // #1148 步级 env(worker 步端口基座)→ SDK 子进程环境(整替 + 展开)。
99717
99371
  ...opts.env !== void 0 ? { env: opts.env } : {},
99718
- // #1171 原生插件通道(null = 通道关,键不发)。
99719
99372
  ...nativePluginDir !== null ? { plugins: [{ type: "local", path: nativePluginDir }] } : {},
99720
99373
  abortController: abort
99721
99374
  });
@@ -100142,11 +99795,8 @@ function daemonSettingsManager() {
100142
99795
  function piUnattendedEnvPins(env) {
100143
99796
  const pins = {
100144
99797
  PI_OFFLINE: "1",
100145
- // 模型目录网络刷新关闭(self-host 确定性;pi docs/sdk.md)
100146
99798
  PI_TELEMETRY: "0",
100147
- // 安装遥测 + provider attribution 头(D2)
100148
99799
  PI_SKIP_VERSION_CHECK: "1",
100149
- // pi.dev latest-version 请求(子进程继承面同钉)
100150
99800
  PI_CACHE_RETENTION: resolvePiCacheRetention(env)
100151
99801
  };
100152
99802
  for (const key of Object.keys(pins)) {
@@ -100455,12 +100105,6 @@ function mapPiSessionEvent(event, state) {
100455
100105
  return [{ type: "auto_retry_start", attempt: event.attempt ?? 1 }];
100456
100106
  case "auto_retry_end":
100457
100107
  return [{ type: "auto_retry_end", attempt: event.attempt ?? 1 }];
100458
- // 收敛判定(#926):agent_settled 是「pi 不会再自动继续」的权威信号
100459
- // (docs/sdk.md §Subscribing)。agent_end 只标记一次低层 run 结束,其后仍可能
100460
- // 有排队工作 / 溢出恢复继续(_handlePostAgentRun → agent.continue),故 agent_end
100461
- // 一律不发 done——旧 agent_end(!willRetry) 推断只覆盖错误重试一条继续路径,
100462
- // 会在排队工作继续时提前发 done 并 dispose 会话(时序赌博)。done 携 state 累积
100463
- // usage(agent_settled 在所有 message_end 之后,usage 比 agent_end 时刻更完整)。
100464
100108
  case "agent_settled": {
100465
100109
  const usage = [...state.usage.values()];
100466
100110
  return [{ type: "done", usage }];
@@ -100541,11 +100185,6 @@ var PiSessionHandle = class {
100541
100185
  state;
100542
100186
  closed = false;
100543
100187
  stopping = false;
100544
- /** 收尾:先发 session_shutdown(pi 唯一公开的扩展收尾缝——AgentSession
100545
- * Runtime.dispose 同形做法),MCP 扩展在 handler 里关连接(stdio 子进程/
100546
- * HTTP 流);随后 dispose。单会话的 dispose() **不发**该事件(1.0.4 源读
100547
- * + 2026-10-08 探针实测:不发则 MCP stdio 子进程泄漏——daemon 长活进程
100548
- * 每步漏一个)。发射失败 fail-open(dispose 兜底清理)。 */
100549
100188
  finish() {
100550
100189
  if (this.closed) return;
100551
100190
  this.closed = true;
@@ -100570,11 +100209,6 @@ var PiSessionHandle = class {
100570
100209
  }
100571
100210
  this.queue.push({ type: "steer", text });
100572
100211
  }
100573
- /** 后端内部错误上浮面(#698):prompt() 预检拒绝(auth 校验 / compaction
100574
- * 守卫 / input handler 拒绝)在 agent run 之前 throw——无事件无终局,原先
100575
- * 被吞掉会把 runner 挂到流超时看门狗(报看门狗不报真凶)。经此注入事件
100576
- * 面:推 error 事件并收面。幂等:已收面(done 已到)则事件被队列丢弃、
100577
- * finish 重入无副作用。 */
100578
100212
  emitBackendError(message) {
100579
100213
  this.queue.push({ type: "error", error: { message, retryable: false } });
100580
100214
  this.finish();
@@ -100600,10 +100234,6 @@ var PiBackend = class {
100600
100234
  }
100601
100235
  opts;
100602
100236
  capabilities = PI_CAPABILITIES;
100603
- /** 简报文件通道(#958):pi 的 resource-loader 原生就读 cwd 的上下文文件
100604
- * (候选序 `AGENTS.override.md > AGENTS.md > AGENTS.MD > CLAUDE.md > CLAUDE.MD`,
100605
- * first-wins),且 `systemPromptOverride` 只替换 customPrompt、不抑制这条加载。
100606
- * 故简报写进那个文件即被引擎读到,无需任何后端侧改动。 */
100607
100237
  brief = {
100608
100238
  backendId: "pi",
100609
100239
  composeBody: (opts, base) => appendSkillsCatalog(
@@ -100631,8 +100261,6 @@ var PiBackend = class {
100631
100261
  }
100632
100262
  return this.open(opts, file2);
100633
100263
  }
100634
- /** #654 协议 400 自适配(AgentBackend 可选面;纯函数转发——学习态在模块
100635
- * 级 Map,open() 物化时消费)。 */
100636
100264
  adaptProviderCompat(provider, errorMessage) {
100637
100265
  return adaptProviderCompat(provider, errorMessage);
100638
100266
  }
@@ -100702,15 +100330,8 @@ var PiBackend = class {
100702
100330
  cwd: opts.cwd,
100703
100331
  agentDir: this.opts.agentDir,
100704
100332
  settingsManager,
100705
- // pi 原生发现关断(#917,spec 14 §技能可见面收归 3):loader 自注入的
100706
- // `<available_skills>` 段(agentDir/skills 与 .pi/skills 默认目录)与
100707
- // cairn catalog 构成重复清单,且不受 agent.skills 白名单约束。关断后
100708
- // 技能目录只剩简报文件通道一份。`noContextFiles` / `agentsFilesOverride`
100709
- // 是 AGENTS.md 简报的承重位(spec 24 §通道漂移),一概不动。
100710
100333
  noSkills: true,
100711
100334
  ...opts.systemPrompt !== void 0 ? { systemPromptOverride: () => opts.systemPrompt } : {},
100712
- // #929/#930 挂点:闸 + MCP 注册 + pi 自家 MCP 连接器(loadConfig 钉空
100713
- // = 不读 agentDir / project 的 mcp.json,端点唯一来源是本机 config 解析)。
100714
100335
  extensionFactories: [
100715
100336
  gateExtension,
100716
100337
  mcpRegisterExtension,
@@ -100724,7 +100345,6 @@ var PiBackend = class {
100724
100345
  name: def.name,
100725
100346
  label: def.label ?? def.name,
100726
100347
  description: def.description,
100727
- // parameters = JSON Schema(typebox 产物 wire 形,protocol/chief-tools.ts)。
100728
100348
  parameters: def.parameters ?? { type: "object", properties: {} },
100729
100349
  execute: async (_id, params) => {
100730
100350
  try {
@@ -100789,10 +100409,6 @@ var PiBackend = class {
100789
100409
  resourceLoader: loader,
100790
100410
  sessionManager,
100791
100411
  settingsManager,
100792
- // 工具面(#930):已知名走 sessionToolNames(MCP 名连接后才存在,
100793
- // 传 []);有 MCP 端点时附允许清单 pattern——tools 是持续过滤器,不带
100794
- // mcp__ 条目会把 direct MCP 工具与资源工具藏掉(agent-session
100795
- // allowedToolNames 语义),带上即由 MCP 扩展连接后激活直报。
100796
100412
  tools: [
100797
100413
  ...sessionToolNames({
100798
100414
  readOnly: opts.readOnly === true,
@@ -100858,9 +100474,6 @@ function materializeProvider(modelsPath, provider) {
100858
100474
  id: m.id,
100859
100475
  name: m.name,
100860
100476
  ...CUSTOM_MODEL_DEFAULTS,
100861
- // 成本声明位(#927):server 下发的价格(USD / 1M tokens)覆盖零默认
100862
- // ——pi calculateCost 据此算 per-message cost。未声明维持零价(诚实 0,
100863
- // 宿主不造价格表)。
100864
100477
  ...m.cost !== void 0 ? { cost: m.cost } : {},
100865
100478
  ...m.contextWindow !== void 0 ? { contextWindow: m.contextWindow } : {},
100866
100479
  ...m.maxTokens !== void 0 ? { maxTokens: m.maxTokens } : {},
@@ -100979,8 +100592,6 @@ function readClaudeCodeReport(homeDir = homedir5(), extra = {}) {
100979
100592
  installed: source.installed,
100980
100593
  hostname: source.hostname,
100981
100594
  models: source.models,
100982
- // bin 三态原样透出(#1050):对象 = 探到了;null = 探过了没有;键缺席
100983
- // 只在调用方没探时出现——三种在页面上的渲染各不相同,不合并。
100984
100595
  ...extra.bin !== void 0 ? { bin: extra.bin } : {},
100985
100596
  ...extra.auth ? { auth: toWireAuth(extra.auth) } : {}
100986
100597
  };
@@ -101026,8 +100637,6 @@ var StepJournal = class {
101026
100637
  return null;
101027
100638
  }
101028
100639
  }
101029
- /** claimed/running/awaiting-upload = pending(recover 面,r3 §1.5
101030
- * `[recover] no pending steps found` 的对偶)。 */
101031
100640
  pending() {
101032
100641
  if (!existsSync6(this.dir)) return [];
101033
100642
  return readdirSync3(this.dir).filter((f) => f.startsWith("step-") && f.endsWith(".json")).map((f) => {
@@ -101209,7 +100818,6 @@ var MachineClient = class {
101209
100818
  const raw = await res.json();
101210
100819
  return opts.parse ? opts.parse(raw) : raw;
101211
100820
  }
101212
- // —— enroll(02 §5.2 路径二:apiKey Bearer)———————————————————————————————
101213
100821
  async enroll(body) {
101214
100822
  const { apiKey, ...rest } = body;
101215
100823
  return this.request("POST", "/api/machine/enroll", {
@@ -101230,7 +100838,6 @@ var MachineClient = class {
101230
100838
  parse: (raw) => machineEnrollPollResponseSchema.parse(raw)
101231
100839
  });
101232
100840
  }
101233
- // —— 机器面(token Bearer)———————————————————————————————————————————————
101234
100841
  async me() {
101235
100842
  return this.request("GET", "/api/machine/me", {
101236
100843
  parse: (raw) => machineRecordSchema.parse(raw)
@@ -101248,9 +100855,6 @@ var MachineClient = class {
101248
100855
  parse: (raw) => machineRecoverResponseSchema.parse(raw)
101249
100856
  });
101250
100857
  }
101251
- /** claim 长轮询(server hold ~75s,r3 §1.5);调用方给 signal 控制中断。
101252
- * #1148:body 携 maxWorkers(worker 并发上限自报,server 闸取 min);缺
101253
- * 省 = 空 body(老 server 形)。 */
101254
100858
  async claim(signal, body) {
101255
100859
  const res = await this.request(
101256
100860
  "POST",
@@ -101306,9 +100910,6 @@ var MachineClient = class {
101306
100910
  parse: (raw) => machineOkResponseSchema.parse(raw)
101307
100911
  });
101308
100912
  }
101309
- /** remoteTools relay(r5 §3.1 bundle `remoteTools.ts` 语义):replaySafe 读工具
101310
- * 带重试预算 [500,2000]ms + 10s 超时;写工具(非 replaySafe)单次不重试。
101311
- * 服务端拒绝(4xx {error})→ 抛错由上层转 pi 工具结果文本;成功 → text。 */
101312
100913
  async relayTool(stepId, name, params, opts = {}) {
101313
100914
  const replaySafe = opts.replaySafe ?? false;
101314
100915
  const delays = replaySafe ? [...REMOTE_TOOL_RETRY_DELAYS_MS] : [];
@@ -101349,11 +100950,6 @@ var MachineClient = class {
101349
100950
  parse: (raw) => machineTokenResponseSchema.parse(raw)
101350
100951
  });
101351
100952
  }
101352
- /** 问答阻塞通道(#1049):循环到终态。每轮 = 一次 hold 长轮询(server ~70s
101353
- * 返回 pending 时重发同 requestId——幂等命中既有卡);请求超时 = hold + 15s
101354
- * 余量(连接挂死不当成「server 说 pending」);网络/5xx 无限重试(D3 的
101355
- * daemon 半边:等答期间任何瞬断都不终结等待),server 4xx 抛错。signal 是
101356
- * 唯一退出面(runner 停止/收线)。 */
101357
100953
  async askUser(stepId, body, opts = {}) {
101358
100954
  const HOLD_MS = 7e4;
101359
100955
  const REQUEST_TIMEOUT_MS = HOLD_MS + 15e3;
@@ -101432,8 +101028,6 @@ var MachineClient = class {
101432
101028
  } catch (err) {
101433
101029
  lastErr = err;
101434
101030
  if (err instanceof MachineApiError && err.status < 500) throw err;
101435
- if (err instanceof MachineApiError) {
101436
- }
101437
101031
  }
101438
101032
  const delay = delays[attempt];
101439
101033
  if (delay === void 0) break;
@@ -101447,9 +101041,6 @@ var MachineClient = class {
101447
101041
  parse: (raw) => machineUploadUrlsResponseSchema.parse(raw)
101448
101042
  });
101449
101043
  }
101450
- /** 预签名 PUT(绝对 URL;一次性)。机器 token 仅同源附带(预签名 URL 若
101451
- * 指向异源存储,不得外泄 Bearer [设计])。body 双形:transcript.json =
101452
- * JSON;plan.md = 原文 text/markdown(02 §4.2 plan 即文件)。 */
101453
101044
  async putUpload(url2, headers, body, contentType) {
101454
101045
  const sameOrigin = new URL(url2).origin === new URL(this.opts.serverUrl).origin;
101455
101046
  const token = sameOrigin ? this.opts.getToken?.() : void 0;
@@ -101471,8 +101062,6 @@ var MachineClient = class {
101471
101062
  parse: (raw) => machineOkResponseSchema.parse(raw)
101472
101063
  });
101473
101064
  }
101474
- /** steer 拉取-确认(W3 #279):GET /api/machine/steer?stepId=([设计]
101475
- * MACHINE_WIRE_EXTENSIONS 登记位;本机在跑步单槽 pending)。 */
101476
101065
  async steer(stepId) {
101477
101066
  const res = await this.request(
101478
101067
  "GET",
@@ -101481,8 +101070,6 @@ var MachineClient = class {
101481
101070
  );
101482
101071
  return res.content;
101483
101072
  }
101484
- /** stop 拉取-确认(M7 #308):GET /api/machine/stop?stepId=([设计]
101485
- * MACHINE_WIRE_EXTENSIONS 登记位;本机在跑步单槽 pending,steer 同形)。 */
101486
101073
  async stop(stepId) {
101487
101074
  const res = await this.request(
101488
101075
  "GET",
@@ -101491,10 +101078,6 @@ var MachineClient = class {
101491
101078
  );
101492
101079
  return res.discard;
101493
101080
  }
101494
- /** sync 状态回写(M7 #319):POST /api/machine/sync-result/{syncId} =
101495
- * machine-wire MACHINE_WIRE_EXTENSIONS 登记位;daemon 在 running 起步 +
101496
- * synced/failed 收尾两时刻回写,server 侧 transition 函数负责状态机守面 + 推
101497
- * team stream branch_sync 事件给 web 实时结果卡。 */
101498
101081
  async syncResult(syncId, body) {
101499
101082
  await this.request("POST", `/api/machine/sync-result/${syncId}`, {
101500
101083
  body,
@@ -101551,7 +101134,6 @@ var MachineClient = class {
101551
101134
  }
101552
101135
  throw lastErr instanceof Error ? lastErr : new Error("shell result writeback failed");
101553
101136
  }
101554
- /** wake SSE(02 §1.2 机器通道):帧解析回调;连接断开自然返回。 */
101555
101137
  async stream(signal, onEvent, onConnected) {
101556
101138
  const token = this.opts.getToken?.();
101557
101139
  const res = await this.fetchImpl(this.url("/api/machine/stream"), {
@@ -101917,11 +101499,6 @@ function gitCredentialEnv(cred, parent = process.env) {
101917
101499
  }
101918
101500
  const target = credentialTarget(cred.url);
101919
101501
  return {
101920
- // 空值重置 credential.helper 列表(git 语义:空值清空此前累积的全部
101921
- // helper,含父环境条目与 URL 作用域条目里的)。缺此条则系统级/全局
101922
- // osxkeychain 等 helper 叠加在前:同主机命中陈旧凭证(上一步已撤销的
101923
- // token)致 auth 失败,且成功轮会回写钥匙串(凭证落盘面,破 02 §8 不落盘
101924
- // 纪律)。重置后本步内联 helper 是唯一来源。
101925
101502
  GIT_CONFIG_COUNT: String(target === null ? n + 1 : n + 2),
101926
101503
  [`GIT_CONFIG_KEY_${n}`]: "credential.helper",
101927
101504
  [`GIT_CONFIG_VALUE_${n}`]: "",
@@ -101933,7 +101510,6 @@ function gitCredentialEnv(cred, parent = process.env) {
101933
101510
  CAIRN_GIT_CRED_USERNAME: cred.username,
101934
101511
  CAIRN_GIT_CRED_PASSWORD: cred.password
101935
101512
  },
101936
- // 交互提示关闭(无 tty 场景挂起护栏)。
101937
101513
  GIT_TERMINAL_PROMPT: "0"
101938
101514
  };
101939
101515
  }
@@ -102008,8 +101584,6 @@ var gitPrim = {
102008
101584
  timeoutMs: NET_TIMEOUT_MS
102009
101585
  });
102010
101586
  },
102011
- /** 默认分支(origin/HEAD symbolic-ref;缺省回退 main——r3 §3.6 origin/main
102012
- * 正典值 [推断回退])。 */
102013
101587
  async remoteDefaultBranch(repoDir) {
102014
101588
  const r = await runGit(["symbolic-ref", "--short", "refs/remotes/origin/HEAD"], {
102015
101589
  cwd: repoDir,
@@ -102028,8 +101602,6 @@ var gitPrim = {
102028
101602
  });
102029
101603
  return r.code === 0;
102030
101604
  },
102031
- /** origin remote URL(#1213/ADR 0017 选源对账用);无 origin / git 失败 =
102032
- * null(调用方按失格回落处理,不抛)。只读 config,不触网络。 */
102033
101605
  async remoteUrl(dir) {
102034
101606
  const r = await runGit(["remote", "get-url", "origin"], {
102035
101607
  cwd: dir,
@@ -102039,9 +101611,6 @@ var gitPrim = {
102039
101611
  const url2 = r.stdout.trim();
102040
101612
  return url2 === "" ? null : url2;
102041
101613
  },
102042
- /** origin 的原始配置值(`remote.origin.url`,#1484):不经 insteadOf 改写——
102043
- * `remote get-url` 返回改写后的 URL,与 cloneUrl 比较会误判偏离。无 origin /
102044
- * git 失败 = null。 */
102045
101614
  async originConfigUrl(dir) {
102046
101615
  const r = await runGit(["config", "--get", "remote.origin.url"], {
102047
101616
  cwd: dir,
@@ -102051,9 +101620,6 @@ var gitPrim = {
102051
101620
  const url2 = r.stdout.trim();
102052
101621
  return url2 === "" ? null : url2;
102053
101622
  },
102054
- /** git 仓判定(`rev-parse --git-dir` code 0;工作树仓与裸库同形——#1210
102055
- * 执行面 fail-loud 预检只问「能否作为 clone 源」,worktree-only 的收紧
102056
- * 属 server 创建闸 validateLocalRepoPath,不在执行面重判)。 */
102057
101623
  async isGitDir(dir) {
102058
101624
  const r = await runGit(["rev-parse", "--git-dir"], {
102059
101625
  cwd: dir,
@@ -102061,17 +101627,12 @@ var gitPrim = {
102061
101627
  });
102062
101628
  return r.code === 0;
102063
101629
  },
102064
- /** origin remote URL 重指(#1213/ADR 0017:本地源 clone 后把 origin 指回
102065
- * GitHub 真值,后续 fetch/push 照常走真值远端)。 */
102066
101630
  async setRemoteUrl(repoDir, url2) {
102067
101631
  await runGitOk(["remote", "set-url", "origin", "--", url2], {
102068
101632
  cwd: repoDir,
102069
101633
  timeoutMs: META_TIMEOUT_MS
102070
101634
  });
102071
101635
  },
102072
- /** `git remote set-head origin -a`(#1213/ADR 0017):向真值远端查询其 HEAD
102073
- * 并重钉 origin/HEAD——clone 自本地源的 origin/HEAD 是**用户检出分支**,
102074
- * 默认分支判定会漂;本原语把 defaultBranch 真值源拉回远端。 */
102075
101636
  async remoteSetHeadAuto(repoDir, cred) {
102076
101637
  await runGitOk(["remote", "set-head", "origin", "--auto"], {
102077
101638
  cwd: repoDir,
@@ -102086,7 +101647,6 @@ var gitPrim = {
102086
101647
  });
102087
101648
  return r.code === 0;
102088
101649
  },
102089
- /** 远端领先本地的提交数(防分叉护栏数据面,02 §5.5)。 */
102090
101650
  async countRemoteAhead(repoDir, branch) {
102091
101651
  const local = await gitPrim.hasLocalBranch(repoDir, branch);
102092
101652
  const range = local ? `refs/heads/${branch}..refs/remotes/origin/${branch}` : "";
@@ -102134,20 +101694,10 @@ var gitPrim = {
102134
101694
  const r = await runGit(["branch", "--show-current"], { cwd: dir, timeoutMs: META_TIMEOUT_MS });
102135
101695
  return r.code === 0 && r.stdout.trim() !== "" ? r.stdout.trim() : null;
102136
101696
  },
102137
- /** `checkout [--force] <全限定 ref> --`(#1329)。git 2.43 的 checkout 不认
102138
- * `--end-of-options`(当 pathspec 吞掉、退 1)。全限定 ref + `--` 不会被当成选项
102139
- * 或路径。force 语义(与 sync.ts `force` 字段一致):非 force 时 plain checkout,
102140
- * 拒绝覆盖脏跟踪文件——防止 sync 在 reset --hard 之前就把用户的未提交改动
102141
- * 吃掉(票 HIGH 数据丢失面)。force 时 checkout 强制覆盖(随后 clean -fd
102142
- * 仍丢弃未跟踪文件)。 */
102143
101697
  async checkout(dir, ref, force) {
102144
101698
  const args = force ? ["checkout", "--force", ref, "--"] : ["checkout", ref, "--"];
102145
101699
  await runGitOk(args, { cwd: dir, timeoutMs: META_TIMEOUT_MS });
102146
101700
  },
102147
- /** checkpoint 恢复(02 §5.5:`reset --hard`)。git 2.43 的 reset 开了
102148
- * PARSE_OPT_KEEP_DASHDASH,`--end-of-options` 留在 argv 里,verify_filename
102149
- * 见到 `-` 开头就退出 128(#1316)。rev-parse 认这个旗标,先把 commit 解成
102150
- * 对象 id,再 `reset --hard <oid>`。oid 只有十六进制,不会被 reset 当成选项。 */
102151
101701
  async resetHard(dir, commit) {
102152
101702
  const oid = await runGitOk(
102153
101703
  ["rev-parse", "--verify", "--end-of-options", `${commit}^{commit}`],
@@ -102164,9 +101714,6 @@ var gitPrim = {
102164
101714
  async addAll(dir) {
102165
101715
  await runGitOk(["add", "-A"], { cwd: dir, timeoutMs: META_TIMEOUT_MS });
102166
101716
  },
102167
- /** 暂存区里含指定**固定串**的文件,只在这些路径里找(#958 闸 5 的认标记扫描)。
102168
- * 限定路径集是有意的:全仓 grep 会拖慢每次提交,而候选名只有五个。无命中 =
102169
- * 空数组(`git grep` 的退出码 1 是「没匹配」,不是错)。 */
102170
101717
  async stagedPathsContaining(dir, needle, paths) {
102171
101718
  if (paths.length === 0) return [];
102172
101719
  const r = await runGit(["grep", "--cached", "-l", "-F", "-e", needle, "--", ...paths], {
@@ -102176,16 +101723,9 @@ var gitPrim = {
102176
101723
  if (r.code !== 0) return [];
102177
101724
  return r.stdout.split("\n").map((line) => line.trim()).filter((line) => line !== "");
102178
101725
  },
102179
- /** 把某个路径移出暂存区(#958 闸 5:认标记剔除时用)。`reset --` 会把索引项
102180
- * 还原到 HEAD——跟踪文件 = 本轮对它的改动不随本次提交走(既定取舍,见
102181
- * docs/spec/24 闸 4);未跟踪文件 = 从索引里摘掉。 */
102182
101726
  async unstagePath(dir, path2) {
102183
101727
  await runGitOk(["reset", "-q", "--", path2], { cwd: dir, timeoutMs: META_TIMEOUT_MS });
102184
101728
  },
102185
- /** ref 里含指定**固定串**的文件,只在这些路径里找(#958 闸 4 的推送后检测)。
102186
- * 与 `stagedPathsContaining` 同一套限定理由:候选名只有五个,全仓 grep 不值。
102187
- * 输出形为 `<ref>:<path>`,此处剥掉 ref 前缀。无命中 = 空数组(`git grep`
102188
- * 的退出码 1 是「没匹配」,不是错)。 */
102189
101729
  async pathsContainingInRef(dir, ref, needle, paths) {
102190
101730
  if (paths.length === 0) return [];
102191
101731
  const r = await runGit(["grep", "-l", "-F", "-e", needle, ref, "--", ...paths], {
@@ -102198,7 +101738,6 @@ var gitPrim = {
102198
101738
  return sep7 === -1 ? line : line.slice(sep7 + 1);
102199
101739
  });
102200
101740
  },
102201
- /** commit;干净树(nothing to commit)= false 不抛。 */
102202
101741
  async commit(dir, message, identity) {
102203
101742
  const r = await runGit(["commit", "-m", message], {
102204
101743
  cwd: dir,
@@ -102225,21 +101764,12 @@ var gitPrim = {
102225
101764
  timeoutMs: NET_TIMEOUT_MS
102226
101765
  });
102227
101766
  },
102228
- /** annotated tag 创建(XMON-111 T1):`git tag -a -m <msg> <tag> [commit]`;
102229
- * commit null = HEAD。tag 已存在 / 名字非法 = git 自拒 → 抛错携带拒绝原文
102230
- * (create_tag 工具原样返回 agent)。--end-of-options 挡 tag 名 `-` 开头
102231
- * 的选项注入面(push/reset 同律)。身份必传(同 commit 原语):annotated
102232
- * tag 的 tagger ident 没有 git 兜底——无全局 user.name/user.email 的机器
102233
- * 上 `git tag -a` 直接挂 128(empty ident name)。 */
102234
101767
  async tagCreate(dir, tag, message, commit, identity) {
102235
101768
  await runGitOk(
102236
101769
  ["tag", "-a", "-m", message, "--end-of-options", tag, ...commit ? [commit] : []],
102237
101770
  { cwd: dir, env: commitEnv(identity), timeoutMs: META_TIMEOUT_MS }
102238
101771
  );
102239
101772
  },
102240
- /** `git push origin refs/tags/<tag>`(XMON-111 T1):凭证注入同 push 原语
102241
- * (per-step token 只经 env credential.helper,不进 argv/磁盘)。远端已有
102242
- * 同名异值 tag = git 拒绝(永不 force)→ 抛错携带拒绝原文。 */
102243
101773
  async tagPush(dir, tag, cred) {
102244
101774
  await runGitOk(["push", "--end-of-options", "origin", `refs/tags/${tag}`], {
102245
101775
  cwd: dir,
@@ -102247,8 +101777,6 @@ var gitPrim = {
102247
101777
  timeoutMs: NET_TIMEOUT_MS
102248
101778
  });
102249
101779
  },
102250
- /** `git merge --no-edit origin/<defaultBranch>`(02 §5.5/r3 §3.6);冲突 =
102251
- * 自动 `merge --abort` 后抛错(失败仅人工重跑,02/A6)。 */
102252
101780
  async mergeNoEdit(dir, ref) {
102253
101781
  const r = await runGit(["merge", "--no-edit", "--end-of-options", ref], {
102254
101782
  cwd: dir,
@@ -102261,7 +101789,6 @@ var gitPrim = {
102261
101789
  }
102262
101790
  throw new Error(`git merge failed (${r.code}): ${r.stderr.trim() || r.stdout.trim()}`);
102263
101791
  },
102264
- /** conv 分支领先 origin/<default> 的提交数(hasChanges 判定面)。 */
102265
101792
  async countAhead(dir, defaultBranch) {
102266
101793
  const r = await runGit(["rev-list", "--count", `refs/remotes/origin/${defaultBranch}..HEAD`], {
102267
101794
  cwd: dir,
@@ -102271,13 +101798,6 @@ var gitPrim = {
102271
101798
  const n = Number.parseInt(r.stdout.trim(), 10);
102272
101799
  return Number.isNaN(n) ? 0 : n;
102273
101800
  },
102274
- /** 步窗口内有新提交的本地分支短名集(#1195 产物并集面:agent 自建分支
102275
- * 交付后 HEAD 切回会话分支时,收尾按 HEAD 计数恒 0——本原语把「base 之
102276
- * 外、tip 落在窗口内」的分支捞回来)。for-each-ref 按 tip 提交时刻降序,
102277
- * 出窗即断(其后全更早);rev-list 调用数有上限(基座仓分支巨多时不烧
102278
- * 收尾预算)。提交时刻是秒粒度、与步起点墙钟同源同机——留 2s 边距吸收
102279
- * 秒内截断。base 不可解析 = rev-list 恒非零退 = 空集(fail-open,探测
102280
- * 是收尾附加面不阻断)。归属裁决(邻座 conv 分支排除)在调用方。 */
102281
101801
  async branchesWithNewCommits(dir, baseCommit, sinceMs) {
102282
101802
  const r = await runGit(
102283
101803
  [
@@ -102309,10 +101829,6 @@ var gitPrim = {
102309
101829
  }
102310
101830
  return found;
102311
101831
  },
102312
- /** conv 分支相对 origin/<default> 的 unified diff 原文(#704 非 hosted 形态
102313
- * 投影上报数据源;三-dot = merge-base 起算,server readBuildChanges 同语义)。
102314
- * 基座引用缺位(空仓/未 fetch)= 空串——投影按上报零改动处理,不抛错
102315
- * (探测是收尾附加面,不阻断步收尾)。 */
102316
101832
  async diffAgainstRemoteDefault(dir, defaultBranch) {
102317
101833
  const r = await runGit(["diff", `origin/${defaultBranch}...HEAD`], {
102318
101834
  cwd: dir,
@@ -102321,7 +101837,6 @@ var gitPrim = {
102321
101837
  if (r.code !== 0) return "";
102322
101838
  return r.stdout;
102323
101839
  },
102324
- /** 提交时刻(epoch ms;孤儿回收龄判定用 [设计])。 */
102325
101840
  async commitTime(dir, commit) {
102326
101841
  const r = await runGit(["log", "-1", "--format=%ct", "--end-of-options", commit], {
102327
101842
  cwd: dir,
@@ -102632,8 +102147,6 @@ function segmentContent(seg) {
102632
102147
  var SegmentBuffer = class {
102633
102148
  kind = null;
102634
102149
  text = "";
102635
- /** 追加增量。kind 与当前段不同 → 先把当前段封出并返回(调用方负责落行),
102636
- * 再以新 kind 开段。返回 null = 本调用未触发封段(F1/F4)。 */
102637
102150
  append(kind, text) {
102638
102151
  if (text === "") return null;
102639
102152
  const sealed = this.kind !== null && this.kind !== kind ? this.seal() : null;
@@ -102641,8 +102154,6 @@ var SegmentBuffer = class {
102641
102154
  this.text += text;
102642
102155
  return sealed;
102643
102156
  }
102644
- /** 全文事件(thinking 块终全文)。同 kind = 权威替换(F5);异 kind 先封
102645
- * 当前段(F2)再以全文开段。 */
102646
102157
  replace(kind, text) {
102647
102158
  if (text === "") return null;
102648
102159
  const sealed = this.kind !== null && this.kind !== kind ? this.seal() : null;
@@ -102650,7 +102161,6 @@ var SegmentBuffer = class {
102650
102161
  this.text = text;
102651
102162
  return sealed;
102652
102163
  }
102653
- /** 封出当前段(空段不派出,F4);封后缓冲清空(F3)。 */
102654
102164
  seal() {
102655
102165
  if (this.kind === null || this.text === "") {
102656
102166
  this.kind = null;
@@ -102662,7 +102172,6 @@ var SegmentBuffer = class {
102662
102172
  this.text = "";
102663
102173
  return seg;
102664
102174
  }
102665
- /** 当前未封段(读用,不改状态)。 */
102666
102175
  current() {
102667
102176
  return this.kind === null || this.text === "" ? null : { kind: this.kind, text: this.text };
102668
102177
  }
@@ -102709,10 +102218,7 @@ function execCommand(command, cwd, timeoutMs) {
102709
102218
  let settled = false;
102710
102219
  const child = spawn5("bash", ["-lc", command], {
102711
102220
  cwd,
102712
- // 自建进程组:超时 kill(-pid) 才能覆盖 `cmd &` 后台子孙(POSIX 语义;
102713
- // daemon 只跑 macOS/Linux,supervisor detached 先例同族)。
102714
102221
  detached: true,
102715
- // stdin 关死:等输入的命令立即失败而不是挂满超时。
102716
102222
  stdio: ["ignore", "pipe", "pipe"],
102717
102223
  env: process.env
102718
102224
  });
@@ -103281,10 +102787,7 @@ async function runWorkspaceHook(input2) {
103281
102787
  let settled = false;
103282
102788
  const child = spawn6(path2, [], {
103283
102789
  cwd,
103284
- // 自建进程组:超时 kill(-pid) 覆盖 `cmd &` 后台子孙(POSIX 语义,
103285
- // shell-channel / supervisor detached 先例同族)。
103286
102790
  detached: true,
103287
- // stdin 关死:等输入的钩子立即失败而不是挂满超时。
103288
102791
  stdio: ["ignore", "pipe", "pipe"],
103289
102792
  env
103290
102793
  });
@@ -103365,7 +102868,6 @@ async function localSourceUsable(localPath, cloneUrl) {
103365
102868
  return { ok: true };
103366
102869
  }
103367
102870
  var WorkspaceManager = class {
103368
- /** projectLock(projectId):同项目工作区操作串行化(02 §5.5 并发保护)。 */
103369
102871
  locks = /* @__PURE__ */ new Map();
103370
102872
  logger;
103371
102873
  orphanTtlMs;
@@ -103453,8 +102955,6 @@ var WorkspaceManager = class {
103453
102955
  await runNet(
103454
102956
  "clone",
103455
102957
  (cred) => withGitNetRetries(() => gitPrim.clone(input2.cloneUrl, baseRepoDir, cred)),
103456
- // 失败 clone 的残目录清场(同 local-path 失败路径;残目录会让 machine
103457
- // 路 clone 拒绝落地)。
103458
102958
  () => rmSync7(baseRepoDir, { recursive: true, force: true })
103459
102959
  );
103460
102960
  }
@@ -103550,15 +103050,6 @@ var WorkspaceManager = class {
103550
103050
  this.logger.workspace(`Readonly export (origin/${defaultBranch}, no git metadata)`);
103551
103051
  return false;
103552
103052
  }
103553
- /** #1149 环境钩子挂点(prepare 两出口各一次):
103554
- * - setup(fresh 检出后):失败/超时 = 步失败——WorkspaceHookError 直接
103555
- * 抛出(runner prepare catch → done failed),且**回滚 worktree**(刚
103556
- * 检出的树上没有 agent 工作,可安全清),使重试认领重新走 fresh→setup
103557
- * 而非 reused→resume 掩盖装机缺口。
103558
- * - resume(reused 复用时):失败/超时非致命——warning 落 workspace 日志,
103559
- * 步继续;note(ok/timeout)仍随 PreparedWorkspace 投影进步日志。
103560
- * 钩子文件缺失 = 静默跳过(零日志零进程,无钩子仓行为与现状一致)。
103561
- * 同项目串行化由 projectLock 免费提供(两 conv 并发 setup 不互踩)。 */
103562
103053
  async runHookStage(cwd, name, credentials) {
103563
103054
  try {
103564
103055
  const note = await runWorkspaceHook({
@@ -103598,8 +103089,6 @@ var WorkspaceManager = class {
103598
103089
  const head = await gitPrim.head(cwd);
103599
103090
  return { committed, head };
103600
103091
  }
103601
- /** #958 闸 4 的检测半:ref 里是否带着简报标记。见 WorktreeOps 的接口注释——
103602
- * 这是检测不是预防,agent 自己提交的那条路径 daemon 拦不住。 */
103603
103092
  async briefMarkerInRef(cwd, ref) {
103604
103093
  return gitPrim.pathsContainingInRef(cwd, ref, BRIEF_MARKER_BEGIN, [
103605
103094
  ...BRIEF_RECONCILE_FILENAMES
@@ -103609,10 +103098,6 @@ var WorkspaceManager = class {
103609
103098
  if (isReadonlyExportDir(cwd)) throw new ReadOnlyWorkspaceError(cwd);
103610
103099
  await withGitNetRetries(() => gitPrim.push(cwd, branch, credentials));
103611
103100
  }
103612
- /** 合并步 conv 分支与默认分支的合并(02 §5.5/r3 §3.6)。local 形态的落地
103613
- * = conv 分支 push 回用户仓库(#1211:用户主检出的分支/工作树永不被
103614
- * cairn 触碰——本类所有 git 操作的作用域都限于基座 clone 与其 worktree,
103615
- * 从不对用户仓库目录执行 merge/branch 类写操作)。 */
103616
103101
  async mergeDefaultBranch(cwd, defaultBranch) {
103617
103102
  const output2 = await gitPrim.mergeNoEdit(cwd, `origin/${defaultBranch}`);
103618
103103
  return { output: output2 };
@@ -103623,17 +103108,12 @@ var WorkspaceManager = class {
103623
103108
  async countAhead(cwd, defaultBranch) {
103624
103109
  return gitPrim.countAhead(cwd, defaultBranch);
103625
103110
  }
103626
- /** HEAD 所在分支(#1195 收尾偏离检测面;detached / 查询失败 = null)。 */
103627
103111
  async currentBranch(cwd) {
103628
103112
  return gitPrim.currentBranch(cwd);
103629
103113
  }
103630
- /** 步窗口内有新提交的本地分支集(#1195 产物并集面;归属裁决在 runner)。 */
103631
103114
  async branchesWithNewCommits(cwd, baseCommit, sinceMs) {
103632
103115
  return gitPrim.branchesWithNewCommits(cwd, baseCommit, sinceMs);
103633
103116
  }
103634
- /** conv 分支 unified diff(#704 非 hosted 形态投影上报数据源):
103635
- * `git diff origin/<default>...HEAD`——merge-base 到工作头的变更,与 server
103636
- * readBuildChanges 的 `${baseSha}...${headSha}` 同语义。 */
103637
103117
  async diffAgainstDefault(cwd, defaultBranch) {
103638
103118
  return gitPrim.diffAgainstRemoteDefault(cwd, defaultBranch);
103639
103119
  }
@@ -103642,9 +103122,6 @@ var WorkspaceManager = class {
103642
103122
  await gitPrim.cleanFd(cwd);
103643
103123
  this.logger.workspace("Worktree restored");
103644
103124
  }
103645
- /** 孤儿回收(r3 §1.4 cleanupOrphanWorktrees(ttlMs = 7*24h)):conv 形状
103646
- * 目录、非活步(journal pending 面)、龄超 TTL → 陈旧清理三步。龄 =
103647
- * 目录 mtime 与最后提交时刻取新 [设计](未采观测值)。 */
103648
103125
  async cleanupOrphans(input2) {
103649
103126
  const ttlMs = input2.ttlMs > 0 ? input2.ttlMs : this.orphanTtlMs;
103650
103127
  const active = new Set(input2.activeConversationIds);
@@ -103682,7 +103159,6 @@ var WorkspaceManager = class {
103682
103159
  }
103683
103160
  return removed;
103684
103161
  }
103685
- /** 单工作区陈旧清理(remove --force + prune + branch -D,02 §5.5)。 */
103686
103162
  async removeStale(convDir) {
103687
103163
  const branch = await gitPrim.currentBranch(convDir);
103688
103164
  const commonDir = await gitPrim.commonGitDir(convDir);
@@ -103937,13 +103413,7 @@ async function runClaimedStep(deps, claimed, opts, heartbeat, stop, provenance)
103937
103413
  const isReview = claimed.step.kind === "review";
103938
103414
  const isVerify = claimed.step.kind === "verify";
103939
103415
  const reviewGate = (isReview ? parseReviewPromptMeta(claimed.instruction ?? null)?.gate : void 0) ?? "confirm";
103940
- const basePrompt = opts.resume?.prompt ?? (isChief || isReview || isVerify ? claimed.instruction ?? "" : claimed.session.action === "continue" && claimed.session.sessionId ? (
103941
- // #703 续轮指令投递:claim 载荷 instruction 在位(补写轮 #113 /
103942
- // 驳回重规划 r5 §4 / 失败重启反馈)→ 真的进会话——此前一律发
103943
- // CONTINUE_PROMPTS 占位句,补写轮拿不到「写 plan.md」指令(B-C10
103944
- // 两轮全空同源)。缺省回落词表(合并轮/确认后执行轮等无指令续轮)。
103945
- claimed.instruction ?? CONTINUE_PROMPTS[claimed.step.kind]
103946
- ) : buildTaskPrompt(claimed));
103416
+ const basePrompt = opts.resume?.prompt ?? (isChief || isReview || isVerify ? claimed.instruction ?? "" : claimed.session.action === "continue" && claimed.session.sessionId ? claimed.instruction ?? CONTINUE_PROMPTS[claimed.step.kind] : buildTaskPrompt(claimed));
103947
103417
  const isInfoBuild = claimed.step.kind === "build" && claimed.todo?.output === "info";
103948
103418
  const readonlyWorkspace = !isChief && claimed.todo?.output === "info";
103949
103419
  const reportFile = join19(deps.paths.reportsDir, convId, REPORT_FILE_NAME);
@@ -104056,17 +103526,10 @@ async function runClaimedStep(deps, claimed, opts, heartbeat, stop, provenance)
104056
103526
  projectId: claimed.project?.id ?? "",
104057
103527
  conversationId: convId,
104058
103528
  cloneUrl: repo.cloneUrl,
104059
- // local 形态可达预检(#1210):cloneUrl 是登记机路径,他机不可达
104060
- // 时 prepare 抛 LocalRepoUnreachableError(下方 catch 合成用户文案)。
104061
103529
  repoKind: repo.kind,
104062
103530
  workspacesRoot: deps.workspacesDir,
104063
103531
  credentials: creds.git,
104064
- // 双执行源(ADR 0017 / #1213):github 形态加速位随 claim 载荷透传到
104065
- // workspace 物化处做选源;其余形态 null(现行为)。
104066
103532
  localPath: repo.kind === "github" ? repo.localPath ?? null : null,
104067
- // #1225 machine 凭据降级闸:github 形态开(per-step token auth 失败 →
104068
- // 执行机本机 git 凭据);hosted 走 server per-step key 恒关、local 无
104069
- // 凭据面恒关。
104070
103533
  machineCredentialFallback: repo.kind === "github",
104071
103534
  ...readonlyWorkspace ? { readonly: true } : {}
104072
103535
  });
@@ -104218,8 +103681,6 @@ ${deliveryPrompt}`;
104218
103681
  provider,
104219
103682
  modelId: agent.modelId,
104220
103683
  ...agent.thinkingLevel ? { thinkingLevel: agent.thinkingLevel } : {},
104221
- // 简报通道在位(#958)= 简报落 worktree 上下文文件(见下方写盘点),
104222
- // systemPrompt 通道必须**清空**——两条通道同时开着,模型会看到两份重复清单。
104223
103684
  ...systemPrompt && backend.brief === void 0 ? { systemPrompt } : {},
104224
103685
  cwd,
104225
103686
  ...deliveryPrompt !== null ? { prompt: deliveryPrompt } : {},
@@ -104227,11 +103688,6 @@ ${deliveryPrompt}`;
104227
103688
  ...localToolDefs.length > 0 ? { localTools: localToolDefs } : {},
104228
103689
  ...remoteTools && remoteTools.length > 0 ? {
104229
103690
  remoteTools,
104230
- // relay 执行(r5 §3.1 bundle:execute → POST tool/<stepId> {name,params}
104231
- // → {text};replaySafe 读工具带重试预算 + 10s 超时;ask_user 拦截
104232
- // 走专用问答通道(#1049,见上方 runAskChannel)——pi customTool 与
104233
- // claude-code in-process MCP 工具两消费面同径。client.askUser 缺席
104234
- // (单测桩)回落 relayTool 旧径。
104235
103691
  executeRemoteTool: (name, params) => {
104236
103692
  if (name === "ask_user" && client2.askUser) return runAskChannel(params);
104237
103693
  const def = remoteTools.find((t) => t.name === name);
@@ -104240,34 +103696,14 @@ ${deliveryPrompt}`;
104240
103696
  });
104241
103697
  }
104242
103698
  } : {},
104243
- // 三态透传(#1307):claim 键在位(含 [] = 受管严格空)→ SessionOpts 键
104244
- // 在位透传(claude-code backend 据此上 strictMcpConfig 锁);缺省不造键
104245
- // (继承态,两态不得在此塌缩——skillsAllowlist #1169 同律)。
104246
103699
  ...claimedMcp !== void 0 ? { mcpServers: mcpEndpoints } : {},
104247
- // 授权白名单(#372→#1169 拆字段正名):worker/review 步 = claim 载荷
104248
- // agent.skillsAllowlist——数组(含 [] = 显式全拒,deny 规则吃它)原样透传;
104249
- // **null(不限制)与缺省(旧 server 未携带)都不传**(backend 面全量直通
104250
- // ——null 被误读成全拒即本票主修位,两态不在此塌缩);chief 步不传
104251
- // (信任面全量 catalog)。过滤落点 = backend catalog 构建(backend/pi.ts)。
104252
103700
  ...isChief || agent.skillsAllowlist == null ? {} : { skillsAllowlist: agent.skillsAllowlist },
104253
- // #1106 派发技能注入选择 + #1169 defaultSkill 绑定序首位:claim 载荷
104254
- // agent.injectedSkills(server 按任务文本对授予集规则选出,ids ⊆
104255
- // skillsAllowlist)在位(含 [])= 目录注入按本集收窄;defaultSkill 非空
104256
- // 时排本集首位并去重(自动携带语义——#1116 注入排序面,不让位给 id 字典
104257
- // 序);[] = 已计算零命中(零注入不是故障)。chief 步不携带;旧 server
104258
- // 未携带 injectedSkills = 不造集(目录注入回落 allowlist 全量,零回归)。
104259
- // deny 面(#917)不受重排影响——授权上限只看 skillsAllowlist。
104260
103701
  ...isChief || injectedForSession === void 0 ? {} : { injectedSkills: injectedForSession },
104261
103702
  onSkillsResolved: (names) => {
104262
103703
  skillInjection.facts = names;
104263
103704
  },
104264
- // 团队技能物化目录(XMON-112 S2):backend 把它排在本机 skillsDir 之前
104265
- // 扫描(同名冲突团队条目胜,pi first-wins);null = 纯本机(零回归)。
104266
103705
  ...teamSkillsDir !== null ? { teamSkillsDir } : {},
104267
- // 只读回合(#511):审核者不下发 edit/write——写入在工具面即被拒,且它
104268
- // 对检出造成的任何写入在收尾被丢弃(见下「审核步收尾」)。
104269
103706
  ...isReview ? { readOnly: true } : {},
104270
- // #1148 步级 env(端口基座):machine-loop 按槽位构造,跨缝透传 backend。
104271
103707
  ...opts.env !== void 0 || readonlyWorkspace ? { env: { ...opts.env, ...readonlyWorkspace ? READONLY_GIT_ENV : {} } } : {}
104272
103708
  };
104273
103709
  let continueId = claimed.session.action === "continue" ? opts.resume?.sessionId ?? claimed.session.sessionId : null;
@@ -105055,8 +104491,6 @@ ${hook.output.trimEnd()}${truncated}`;
105055
104491
  owner: ghRef.owner,
105056
104492
  repo: ghRef.repo,
105057
104493
  branch: head,
105058
- // per-step token(github_connection 下发时);未连接 = null → 匿名梯
105059
- // (公开仓可达)。机器 gh 梯在前——agent 开 PR 用的就是它。
105060
104494
  token: creds.git?.password ?? null
105061
104495
  }).catch((err) => {
105062
104496
  logger.step(
@@ -105096,35 +104530,21 @@ ${hook.output.trimEnd()}${truncated}`;
105096
104530
  const sessionIdForDone = handle?.sessionId ?? continueId;
105097
104531
  const doneBody = {
105098
104532
  status,
105099
- // #1262:捕获侧剥 ANSI(SGR + OSC8)——工具输出(biome 等)的颜色码/
105100
- // 超链接转义不落 build.errorMessage(板面纯文本);单源 = shared
105101
- // stripAnsiEscapes,web 渲染侧同函数兜底存量脏行。
105102
104533
  ...lastError !== null ? { errorMessage: stripAnsiEscapes(lastError) } : {},
105103
104534
  ...sessionIdForDone !== null ? { sessionId: sessionIdForDone } : {},
105104
104535
  usage: [...usage],
105105
104536
  hasChanges,
105106
- // per-step checkpoint(done 回传 commit:「恢复到此处」数据源 + 合并步
105107
- // fast-forward 落地键,r3 §3.5/§3.9 [设计])。
105108
104537
  ...headCommit !== null ? { commit: headCommit } : {},
105109
104538
  ...reviewExtraction?.status === "ok" ? { findings: reviewExtraction.verdict } : {},
105110
104539
  ...reviewExtraction?.status === "failed" ? { findingsError: reviewExtraction.reason } : {},
105111
104540
  ...verifyExtraction?.status === "ok" ? { verifyVerdict: verifyExtraction.verdict } : {},
105112
104541
  ...verifyExtraction?.status === "failed" ? { verifyVerdictError: verifyExtraction.reason } : {},
105113
- // 交付面回填(#704):探测命中才带(无 PR / 失败 = 缺席);diff 上报
105114
- // 恒带算得值(含空串——「已上报且零改动」与「未上报」在 server 侧分列)。
105115
104542
  ...prProbe !== null ? { prUrl: prProbe.url, prNumber: prProbe.number } : {},
105116
104543
  ...changesDiff !== null ? { changesDiff } : {},
105117
- // #1195 工作分支偏离(检测到时恒带,与 hasChanges 无关):server 产物闸
105118
- // 在 hasChanges=false 时据此把失败原因从误导性「构建零改动」换成点名
105119
- // 分支偏离。
105120
104544
  ...branchDrift !== null ? { workBranchDrift: branchDrift } : {},
105121
- // #1261 配额熔断信号(server 侧挂起等额度的判据;旧 server zod strip =
105122
- // 普通失败,混版本零破坏)。
105123
104545
  ...quotaBlock !== null ? { quotaBlock } : {},
105124
104546
  ...skillInjection.facts !== null ? { skillInjectionFacts: skillInjection.facts } : {},
105125
104547
  ...report !== null ? { report } : {},
105126
- // #1493 无输出信号:成功收尾但 transcript 零 assistant 消息(server「0 token
105127
- // 静默失败」判据的前提——单看 usage 会误判不回 usage 的 relay)。
105128
104548
  ...status === "success" && !messages.some((m) => m.role === "assistant") ? { noOutput: true } : {}
105129
104549
  };
105130
104550
  journal.update(stepId, {
@@ -105425,11 +104845,6 @@ async function resolveCheckoutRef(directory, ref) {
105425
104845
  }
105426
104846
  }
105427
104847
 
105428
- // src/version.ts
105429
- import { createRequire as createManifestRequire } from "node:module";
105430
- var requireManifest = createManifestRequire(import.meta.url);
105431
- var DAEMON_VERSION = requireManifest("../package.json").version;
105432
-
105433
104848
  // src/machine-loop.ts
105434
104849
  var sleep = (ms2) => new Promise((r) => setTimeout(r, ms2));
105435
104850
  function nextBackoffMs(current, cap = CLAIM_BACKOFF_CAP_MS) {
@@ -105459,22 +104874,15 @@ async function runMachine(opts) {
105459
104874
  const backend = opts.backend ?? createPiBackend({
105460
104875
  agentDir: paths.agentRuntimeDir,
105461
104876
  sessionDir: paths.chatSessionsDir,
105462
- // skills 执行面注入(spec 14/#371):skillsDir = CAIRN_SKILLS_DIR 扫描根;
105463
- // cwd = daemon home(project 级解析不随任务 worktree 切换跳变)。
105464
104877
  skills: { skillsDir: config2.skillsDir, cwd: config2.home },
105465
104878
  resolveSessionFile: (sid) => resolveSessionFile(paths, sid),
105466
104879
  onSession: (sid, file2) => {
105467
104880
  if (file2) recordSession(paths, sid, file2);
105468
104881
  },
105469
- // [mcp] 降级行(r3 §1.5 canon;02 §5.3 前缀词表 mcp 位)。
105470
104882
  onMcpLog: (msg) => logger.mcp(msg),
105471
- // [skills] 诊断行(spec 14/#371;前缀词表 skills 位)。
105472
104883
  onSkillsLog: (msg) => logger.skills(msg),
105473
- // [gate] 裁决行(#866 T5 命令闸;只记非放行裁决,allow 静默)。
105474
104884
  onGateLog: (msg) => logger.gate(msg),
105475
- // [trust] 裁决行(#925 D1:受保护资源在位的 denied 行,空 worktree 静默)。
105476
104885
  onTrustLog: (msg) => logger.trust(msg),
105477
- // 非 SSE 响应诊断文案的「哪台机器」位(#882;与 #867 同值来源)。
105478
104886
  machineName: config2.name
105479
104887
  });
105480
104888
  if (opts.backend === void 0) {
@@ -105519,18 +104927,10 @@ async function runMachine(opts) {
105519
104927
  }
105520
104928
  if (claudeBackend === null) {
105521
104929
  claudeBackend = createClaudeCodeBackend({
105522
- // skills 通道与 pi 同律(A9 复用 buildSkillsCatalog)。
105523
104930
  skills: { skillsDir: config2.skillsDir, cwd: config2.home },
105524
104931
  onSkillsLog: (msg) => logger.skills(msg),
105525
- // 缺凭据失败文案的「哪台机器」位(#867 T6;机器名 = 注册/上线序列里
105526
- // 那一个,与 machines 页显示同值)。
105527
104932
  machineName: config2.name,
105528
- // #1050 路径单源:探到的绝对路径钉给 SDK,免掉「探的二进制」与
105529
- // 「执行的二进制」不是一个(CAIRN_CLAUDE_BIN 此前只喂 auth 探针)。
105530
104933
  ...claudeBin !== null ? { executablePath: claudeBin.path } : {},
105531
- // #1171 原生插件通道两位:缓存分区单源(plugins/ 在 team-skills 缓存
105532
- // 根下)+ #1050 探测版本(下限闸输入;探测缺位 = 版本不可证 →
105533
- // fail-closed 跳过插件通道,catalog 兜底)。
105534
104934
  teamSkillsCacheDir: paths.teamSkillsCacheDir,
105535
104935
  ...claudeBin !== null ? { executableVersion: claudeBin.version } : {}
105536
104936
  });
@@ -105684,7 +105084,6 @@ async function runMachine(opts) {
105684
105084
  resume: { sessionId: entry.sessionId, prompt: entry.prompt },
105685
105085
  running: 1,
105686
105086
  ...entry.stopRequest != null ? { stopRequest: entry.stopRequest } : {},
105687
- // #1148 端口基座:续跑 worker 步照领槽(恢复面与主循环同律)。
105688
105087
  ...claimed.step.kind === "chief" ? {} : { env: workerEnv(stepRecord.id) }
105689
105088
  });
105690
105089
  } else {
@@ -105802,7 +105201,6 @@ async function runMachine(opts) {
105802
105201
  skillsDir: config2.skillsDir,
105803
105202
  sessionHandles,
105804
105203
  stops,
105805
- // #867 T6:runtime 步凭据预检(机器名进失败文案;探针缺省 = 真 CLI)。
105806
105204
  machineName: config2.name,
105807
105205
  claudeCodeAuthProbe: probeAuthAndRemember,
105808
105206
  ...opts.heartbeatIntervalMs !== void 0 ? { heartbeatIntervalMs: opts.heartbeatIntervalMs } : {}
@@ -105992,8 +105390,6 @@ async function runForeground(opts) {
105992
105390
  paths,
105993
105391
  logger,
105994
105392
  idleSleepPrevention: true,
105995
- // #1149:环境钩子超时(config 已解析 env/默认;machine-loop 注给
105996
- // WorkspaceManager)。
105997
105393
  hookTimeoutMs: config2.hookTimeoutMs
105998
105394
  });
105999
105395
  const onSignal = (signal) => {