@sema-agent/server 7.43.0 → 7.44.0

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 (345) hide show
  1. package/USAGE.md +18 -0
  2. package/dist/adoption/plan.js +31 -192
  3. package/dist/adoption/quiesce.js +3 -86
  4. package/dist/adoption/runner.js +3 -140
  5. package/dist/adoption/sql.js +0 -74
  6. package/dist/adoption/wire.js +0 -80
  7. package/dist/approval-ask-machine.js +0 -75
  8. package/dist/approval-card.js +0 -323
  9. package/dist/approval-deny-reasons.js +0 -42
  10. package/dist/approval-hmac.js +0 -35
  11. package/dist/approval-reconciler.js +8 -166
  12. package/dist/approval.js +4 -67
  13. package/dist/audit.js +1 -44
  14. package/dist/auth-bridge.js +4 -47
  15. package/dist/auth-keys.js +0 -23
  16. package/dist/bake-runner/main.js +4 -65
  17. package/dist/bake-runner/protocol.js +3 -58
  18. package/dist/bake-runner/runner.js +5 -91
  19. package/dist/bench/l8/artifact.js +2 -61
  20. package/dist/bench/l8/escape.js +0 -25
  21. package/dist/bench/l8/index.js +0 -14
  22. package/dist/bench/l8/probes.js +0 -60
  23. package/dist/bench/l8/run-probes.js +2 -45
  24. package/dist/bench/s1/arms.js +14 -189
  25. package/dist/bench/s1/live-deps.js +11 -253
  26. package/dist/bench/s1/oracle.js +1 -36
  27. package/dist/bench/s1/repair-oracle-adapter.js +0 -30
  28. package/dist/bench/s1/reviewer.js +0 -34
  29. package/dist/bench/s1/row.js +0 -62
  30. package/dist/bench/s1/run-firm.js +4 -70
  31. package/dist/bench/s1/runner-ctx.js +0 -40
  32. package/dist/bench/s1/tasks.js +0 -115
  33. package/dist/boot/adoption.js +0 -20
  34. package/dist/boot/budget-tracing.js +3 -55
  35. package/dist/boot/config-center.js +43 -551
  36. package/dist/boot/coordinators.js +1 -69
  37. package/dist/boot/crash-last.js +0 -18
  38. package/dist/boot/deferred-sandbox-path-env.js +3 -119
  39. package/dist/boot/execution-env.js +5 -171
  40. package/dist/boot/governance-seams.js +0 -92
  41. package/dist/boot/leader.js +0 -69
  42. package/dist/boot/limit-sync.js +0 -2
  43. package/dist/boot/memory-boundary.js +3 -91
  44. package/dist/boot/org-memory.js +1 -25
  45. package/dist/boot/parked-revive-gate.js +0 -150
  46. package/dist/boot/permission-rules-audit.js +1 -56
  47. package/dist/boot/reapers.js +15 -273
  48. package/dist/boot/resolve-spec.js +9 -768
  49. package/dist/boot/retention-lane.js +4 -87
  50. package/dist/boot/runner-deps.js +3 -297
  51. package/dist/boot/runtime-caps.js +0 -40
  52. package/dist/boot/session-faces.js +2 -133
  53. package/dist/boot/shutdown.js +9 -83
  54. package/dist/boot/side-query-lane.js +2 -137
  55. package/dist/boot/stores.js +15 -215
  56. package/dist/boot/task-list-lane.js +0 -18
  57. package/dist/boot/webfetch-summarize-lane.js +0 -47
  58. package/dist/boot/workflow-orchestration.js +3 -99
  59. package/dist/boot-reclaim.js +0 -20
  60. package/dist/bounded-session-map.js +0 -19
  61. package/dist/brain.js +2 -139
  62. package/dist/budget.js +9 -244
  63. package/dist/capabilities/builtin-tools.js +0 -3
  64. package/dist/capabilities/center-plugins.js +6 -51
  65. package/dist/capabilities/center-prompts.js +6 -71
  66. package/dist/capabilities/code-review-council.js +7 -40
  67. package/dist/capabilities/collab-workflows.js +1 -44
  68. package/dist/capabilities/hands-lane.js +0 -65
  69. package/dist/capabilities/memory-notice.js +0 -70
  70. package/dist/capabilities/prompt.js +0 -14
  71. package/dist/capabilities/prompts/code-review.js +0 -14
  72. package/dist/capabilities/prompts/identity.js +0 -6
  73. package/dist/capabilities/prompts/team.js +0 -4
  74. package/dist/capabilities/repo-tools.js +0 -34
  75. package/dist/capabilities/sandbox-file-send.js +3 -92
  76. package/dist/capabilities/scenarios.d.ts +0 -1
  77. package/dist/capabilities/scenarios.js +18 -279
  78. package/dist/capabilities/select-environment-tool.js +0 -32
  79. package/dist/capabilities/send-user-file-tool.js +2 -66
  80. package/dist/capabilities/skills.d.ts +1 -2
  81. package/dist/capabilities/skills.js +3 -21
  82. package/dist/capabilities/team.d.ts +3 -11
  83. package/dist/capabilities/team.js +3 -51
  84. package/dist/capabilities/tool-defer.js +0 -3
  85. package/dist/config-center/apply-effective.js +15 -330
  86. package/dist/config-center/apply-ledger.js +5 -38
  87. package/dist/config-center/facade.js +0 -41
  88. package/dist/config-center/hot-keys-registry.js +0 -20
  89. package/dist/config-center/http-client.js +2 -125
  90. package/dist/config-center/mcp-revocation.js +2 -34
  91. package/dist/config-center/read-face.js +0 -59
  92. package/dist/config-center/restart-signal.js +1 -85
  93. package/dist/config-center/skills-mcp.d.ts +1 -1
  94. package/dist/config-center/skills-mcp.js +9 -76
  95. package/dist/config-center/stage-limits.js +8 -35
  96. package/dist/config-invariants.js +0 -16
  97. package/dist/config-lkg.js +0 -42
  98. package/dist/config-provider.js +3 -186
  99. package/dist/config-types.js +0 -5
  100. package/dist/config.js +107 -1145
  101. package/dist/degenerate-instrument.js +3 -67
  102. package/dist/deployment-governance.js +0 -124
  103. package/dist/digest-form.js +0 -12
  104. package/dist/elicitation.js +3 -86
  105. package/dist/env-facts.js +7 -75
  106. package/dist/fleet/fleet-bus.js +34 -507
  107. package/dist/fleet/fleet-reconciler.js +9 -149
  108. package/dist/fleet/fleet-terminal-window.js +10 -178
  109. package/dist/fleet/subagent-tail-bus.js +3 -72
  110. package/dist/fleet-client.js +10 -70
  111. package/dist/fleet-lease.js +5 -79
  112. package/dist/git-api-kind.js +0 -3
  113. package/dist/governance-ask-marks.js +2 -78
  114. package/dist/hooks/branch-transcript.js +0 -74
  115. package/dist/hooks/cc-agent-hook-prompt.js +0 -29
  116. package/dist/hooks/cc-stop-prompt.js +1 -46
  117. package/dist/hooks/hook-llm.js +1 -53
  118. package/dist/hooks/hook-runner.js +20 -414
  119. package/dist/http/active-run-conflict.js +4 -129
  120. package/dist/http/cursor-fingerprint.d.ts +5 -0
  121. package/dist/http/cursor-fingerprint.js +5 -0
  122. package/dist/http/idempotency.js +0 -37
  123. package/dist/http/principal-gate.js +3 -40
  124. package/dist/http/route-ctx.js +0 -9
  125. package/dist/http/routes/a2a-serve.js +7 -319
  126. package/dist/http/routes/admin-config-refresh.js +0 -4
  127. package/dist/http/routes/admin-drain.js +0 -10
  128. package/dist/http/routes/adoption.js +1 -29
  129. package/dist/http/routes/agents-roster.js +1 -47
  130. package/dist/http/routes/approvals-assistant.js +32 -395
  131. package/dist/http/routes/attachments.js +4 -22
  132. package/dist/http/routes/capabilities.js +3 -420
  133. package/dist/http/routes/diagnostics.js +1 -81
  134. package/dist/http/routes/fleet.js +9 -185
  135. package/dist/http/routes/images.js +14 -239
  136. package/dist/http/routes/leader.js +0 -13
  137. package/dist/http/routes/memory-bundle.js +1 -61
  138. package/dist/http/routes/memory-policy.js +9 -99
  139. package/dist/http/routes/notify-wake.js +3 -37
  140. package/dist/http/routes/observability.js +2 -19
  141. package/dist/http/routes/retention-ops.js +2 -34
  142. package/dist/http/routes/rules.js +1 -93
  143. package/dist/http/routes/runs.js +64 -873
  144. package/dist/http/routes/session-sync.js +19 -258
  145. package/dist/http/routes/sessions-list.js +17 -43
  146. package/dist/http/routes/sessions.js +34 -226
  147. package/dist/http/routes/shared-memory.js +5 -36
  148. package/dist/http/routes/side-query.js +1 -87
  149. package/dist/http/routes/tasks.js +52 -722
  150. package/dist/http/routes/trace-usage.js +32 -195
  151. package/dist/http/routes/workflows.js +19 -195
  152. package/dist/http/run-meta.js +0 -6
  153. package/dist/http/send.js +0 -32
  154. package/dist/http/server.js +92 -1597
  155. package/dist/http/sse-lifecycle.js +2 -13
  156. package/dist/http/sse-log.js +3 -48
  157. package/dist/http/tar.js +5 -21
  158. package/dist/http/verify-rounds.js +0 -5
  159. package/dist/http/wire-gate.js +0 -9
  160. package/dist/http/workspace-content.js +0 -10
  161. package/dist/images/bake-validate.js +1 -70
  162. package/dist/images/manifest.js +1 -6
  163. package/dist/index.js +0 -21
  164. package/dist/key-resolver.js +2 -17
  165. package/dist/leader/diffout.js +1 -20
  166. package/dist/leader/diffup.js +0 -47
  167. package/dist/leader/endpoint.js +2 -57
  168. package/dist/leader/fanout.js +3 -45
  169. package/dist/leader/grader-env-factory.js +3 -72
  170. package/dist/leader/leader.js +5 -156
  171. package/dist/leader/merge.js +8 -115
  172. package/dist/leader/planner.js +3 -54
  173. package/dist/leader/repair-oracle.js +1 -60
  174. package/dist/leader/repair-wire.js +2 -79
  175. package/dist/leader/wire.js +8 -307
  176. package/dist/lsp/e2b-bridge.js +4 -64
  177. package/dist/lsp/e2b-manager.js +6 -94
  178. package/dist/lsp/lsp-frames.js +0 -12
  179. package/dist/lsp/manager.js +4 -96
  180. package/dist/lsp/ws-transport.js +5 -55
  181. package/dist/lsp-evict.js +1 -15
  182. package/dist/main.js +57 -765
  183. package/dist/memory-bundle-engine.js +0 -55
  184. package/dist/memory-export.js +0 -4
  185. package/dist/memory-posture.js +1 -15
  186. package/dist/memory-scope.js +11 -148
  187. package/dist/memory-sync-client.js +2 -44
  188. package/dist/memory-sync.js +1 -80
  189. package/dist/model-select.js +3 -80
  190. package/dist/observability/cost-quota.js +1 -17
  191. package/dist/observability/cost-taxonomy.js +0 -34
  192. package/dist/observability/fail-open.js +7 -86
  193. package/dist/observability/logger.js +0 -6
  194. package/dist/observability/metrics.js +0 -94
  195. package/dist/observability/otel-exporter.js +3 -13
  196. package/dist/observability/principal-context.js +0 -9
  197. package/dist/observability/prompt-manifest.js +1 -37
  198. package/dist/observability/rate-limit.js +0 -4
  199. package/dist/observability/secret-env-scrub.js +2 -56
  200. package/dist/observability/tool-trace.js +1 -70
  201. package/dist/orchestration/hardened-vm-runner.js +4 -118
  202. package/dist/orchestration/hardened-vm-worker-runner.js +1 -26
  203. package/dist/orchestration/hardened-vm-worker.js +0 -27
  204. package/dist/orchestration/subagent-steer.js +1 -45
  205. package/dist/orchestration/workflow-agent-steer.js +1 -80
  206. package/dist/orchestration/workflow-completion-inbox.js +32 -285
  207. package/dist/orchestration/workflow-notify-journal.js +16 -259
  208. package/dist/org-memory-admission.js +3 -47
  209. package/dist/parent-watch.js +2 -48
  210. package/dist/parked-decide.js +1 -109
  211. package/dist/per-task-image.js +0 -57
  212. package/dist/plan-cache-probe.js +3 -27
  213. package/dist/plugins/adoption-log-sql.js +2 -119
  214. package/dist/plugins/approval-ask-store-memory.js +3 -38
  215. package/dist/plugins/approval-ask-store-sql.js +6 -188
  216. package/dist/plugins/approval-exemption-store.js +2 -28
  217. package/dist/plugins/background-agent-store-sql.js +4 -105
  218. package/dist/plugins/background-shell-support.js +14 -122
  219. package/dist/plugins/blob-backend.js +6 -169
  220. package/dist/plugins/breaker-state-sql.js +8 -46
  221. package/dist/plugins/caching-session-store.js +4 -106
  222. package/dist/plugins/checkpoint-store-sql.js +18 -505
  223. package/dist/plugins/e2b-orphan-reclaim.js +0 -45
  224. package/dist/plugins/file-outcome-sink.js +0 -9
  225. package/dist/plugins/file-resume-anchor-store.js +4 -43
  226. package/dist/plugins/file-run-store.js +26 -364
  227. package/dist/plugins/file-snapshot-store-sql.js +10 -181
  228. package/dist/plugins/fork-routing-session-store.js +8 -111
  229. package/dist/plugins/host-platform.js +2 -91
  230. package/dist/plugins/image-bake-store-sql.js +7 -250
  231. package/dist/plugins/image-index-sql.js +4 -123
  232. package/dist/plugins/k8s-bg-scripts.js +4 -88
  233. package/dist/plugins/k8s-exec-protocol.js +0 -41
  234. package/dist/plugins/leader-run-store-sql.js +0 -101
  235. package/dist/plugins/local-checkpoint-store.js +8 -128
  236. package/dist/plugins/local-session-store.js +34 -296
  237. package/dist/plugins/local-task-attachment-store.js +2 -16
  238. package/dist/plugins/mailbox-store-sql.js +8 -65
  239. package/dist/plugins/memory-embedder-fingerprint.js +5 -166
  240. package/dist/plugins/memory-embedder.js +4 -70
  241. package/dist/plugins/memory-engine-pg.js +6 -170
  242. package/dist/plugins/memory-engine-tidb.js +7 -155
  243. package/dist/plugins/memory-engine-vector-util.js +0 -10
  244. package/dist/plugins/memory-key-guards.js +0 -34
  245. package/dist/plugins/memory-origin-law.js +0 -187
  246. package/dist/plugins/memory-resume-anchor-store.js +0 -17
  247. package/dist/plugins/memory-run-store.js +12 -89
  248. package/dist/plugins/memory-session-policy-store.js +0 -17
  249. package/dist/plugins/memory-sync-store-pg.js +4 -49
  250. package/dist/plugins/memory-sync-store-tidb.js +3 -35
  251. package/dist/plugins/outcome-ledger-sql.js +3 -97
  252. package/dist/plugins/permission-rule-store-file.js +5 -133
  253. package/dist/plugins/permission-rule-store-sql.d.ts +3 -0
  254. package/dist/plugins/permission-rule-store-sql.js +50 -307
  255. package/dist/plugins/pg-cost-quota.js +0 -7
  256. package/dist/plugins/pg-pool.js +0 -92
  257. package/dist/plugins/pg-rate-limiter.js +2 -13
  258. package/dist/plugins/pg-safe-json.js +4 -40
  259. package/dist/plugins/pg-session-storage.js +25 -189
  260. package/dist/plugins/posix-shell-fs.js +1 -31
  261. package/dist/plugins/remote-env-adb.js +12 -101
  262. package/dist/plugins/remote-env-e2b.js +40 -371
  263. package/dist/plugins/remote-env-file-error.js +0 -37
  264. package/dist/plugins/remote-env-host.js +63 -483
  265. package/dist/plugins/remote-env-k8s.js +32 -326
  266. package/dist/plugins/remote-env-local-docker.js +24 -157
  267. package/dist/plugins/remote-env-ssh.js +20 -128
  268. package/dist/plugins/remote-scratchpad.js +2 -32
  269. package/dist/plugins/remote-shell.js +1 -32
  270. package/dist/plugins/resume-anchor-store-sql.js +0 -11
  271. package/dist/plugins/retention-lane-store-sql.js +0 -108
  272. package/dist/plugins/retention-store-sql.js +4 -383
  273. package/dist/plugins/roster-store-sql.js +0 -55
  274. package/dist/plugins/run-store-sql.js +14 -251
  275. package/dist/plugins/s3-presign.js +2 -49
  276. package/dist/plugins/scheduler-support.js +3 -80
  277. package/dist/plugins/send-file-ledger.js +4 -53
  278. package/dist/plugins/send-user-file.js +4 -94
  279. package/dist/plugins/session-placement.js +1 -89
  280. package/dist/plugins/session-policy-store-sql.js +3 -81
  281. package/dist/plugins/session-store.js +0 -57
  282. package/dist/plugins/shared-memory-store-sql.js +4 -167
  283. package/dist/plugins/sql-driver.js +0 -17
  284. package/dist/plugins/sql-errors.js +0 -7
  285. package/dist/plugins/sql-escape.js +0 -8
  286. package/dist/plugins/sql-row-helpers.js +0 -25
  287. package/dist/plugins/store-backend.js +42 -222
  288. package/dist/plugins/store-contracts.js +2 -46
  289. package/dist/plugins/task-attachment-store.js +3 -49
  290. package/dist/plugins/task-list-store-sql.js +0 -79
  291. package/dist/plugins/tidb-cost-quota.js +1 -4
  292. package/dist/plugins/tidb-pool.js +1 -207
  293. package/dist/plugins/tidb-rate-limiter.js +3 -9
  294. package/dist/plugins/tidb-session-storage.js +4 -70
  295. package/dist/plugins/tidb-session-store.js +19 -341
  296. package/dist/plugins/tool-result-store-sql.js +4 -179
  297. package/dist/plugins/usage-window-store-sql.js +0 -8
  298. package/dist/plugins/web-search.js +10 -132
  299. package/dist/plugins/workflow-journal-store-sql.js +2 -58
  300. package/dist/plugins/workflow-run-store-sql.js +6 -91
  301. package/dist/plugins/worktree-isolation.js +6 -126
  302. package/dist/plugins/write-behind-counter.js +16 -75
  303. package/dist/principal-jwt.js +5 -60
  304. package/dist/project-memory.js +15 -146
  305. package/dist/prompts-domain-validate.js +1 -51
  306. package/dist/question.js +2 -111
  307. package/dist/resource-suspend.js +0 -18
  308. package/dist/router/route-orchestration.js +0 -77
  309. package/dist/rules-consent.d.ts +44 -5
  310. package/dist/rules-consent.js +75 -215
  311. package/dist/run-local.js +14 -381
  312. package/dist/runs.js +29 -617
  313. package/dist/runtime-caps-resolver.js +6 -132
  314. package/dist/runtime-governance.js +1 -232
  315. package/dist/sandbox-pkg-source.js +0 -37
  316. package/dist/sealed-key.js +3 -68
  317. package/dist/security.js +6 -291
  318. package/dist/session-leaf-bus.js +0 -32
  319. package/dist/session-sync-content.js +1 -69
  320. package/dist/session-sync-kernel.js +3 -60
  321. package/dist/session-sync.js +3 -66
  322. package/dist/session-titler.js +7 -41
  323. package/dist/session-watch.js +9 -73
  324. package/dist/shared-memory-scope-authorizer.js +0 -18
  325. package/dist/sighup-idle.js +1 -12
  326. package/dist/spec-fields.js +4 -143
  327. package/dist/store-live-probe.js +3 -49
  328. package/dist/task-a2a.js +1 -126
  329. package/dist/task-cwd.js +1 -103
  330. package/dist/task-mcp.js +1 -89
  331. package/dist/task-settings.js +10 -300
  332. package/dist/task-workflow.js +8 -75
  333. package/dist/tool-approval.d.ts +28 -1
  334. package/dist/tool-approval.js +70 -1430
  335. package/dist/trace/artifacts.js +5 -20
  336. package/dist/trace/engine-notice-wire.js +6 -138
  337. package/dist/trace/ledger-sink.js +7 -96
  338. package/dist/trace/project.js +4 -448
  339. package/dist/trace/redact.js +9 -77
  340. package/dist/turn-activity.js +1 -27
  341. package/dist/usage-analytics.js +4 -34
  342. package/dist/wall-clock-jump-guard.js +1 -68
  343. package/package.json +3 -3
  344. package/dist/capabilities/scenario-alias.d.ts +0 -27
  345. package/dist/capabilities/scenario-alias.js +0 -61
@@ -1,7 +1,6 @@
1
1
  import { sendJson, sendError } from "../send.js";
2
2
  import { gatedPrincipal, explicitOperatorOk } from "../principal-gate.js";
3
3
  export const ADMIN_DRAIN_PATH = "/v1/admin/drain";
4
- /** 上限与 approvals 的 reason 族同量级(消费面同为人读短句;非同一常量——两面语义无关,独立演化)。 */
5
4
  export const MAX_DRAIN_REASON_CHARS = 256;
6
5
  const OPERATOR_ONLY_MESSAGE = "drain declaration is operator-only: the caller principal is not in OPERATOR_PRINCIPALS (an empty list means NO one is an operator — configure it to enable this endpoint)";
7
6
  export async function handleAdminDrain(req, res, url, ctx) {
@@ -16,7 +15,6 @@ async function handleAdminDrainBody(req, res, url, ctx, miss) {
16
15
  miss.fell = true;
17
16
  return;
18
17
  }
19
- // 门序 = operator 面的既有口径(routes/retention-ops.ts 逐字):身份 → 授权 → 验型。
20
18
  const principal = gatedPrincipal(req, deps.config);
21
19
  if (deps.config.requirePrincipal && !principal) {
22
20
  sendError(res, 401, "auth.principal_required", `missing principal header '${deps.config.principalHeader}'`);
@@ -29,18 +27,10 @@ async function handleAdminDrainBody(req, res, url, ctx, miss) {
29
27
  const body = (await ctx.helpers.readJson(req));
30
28
  const reason = body?.reason;
31
29
  if (typeof reason !== "string" || reason.trim().length === 0 || reason.length > MAX_DRAIN_REASON_CHARS) {
32
- // 🔴 A-054.11:这句是操作员唯一的现场提示,所以它必须说出**免鉴权**那半 —— 「verbatim」只告诉他
33
- // 「不会被改写」,不告诉他「谁能读到」。/health 在鉴权门之前、缺省全网卡:写进去的字是公开的。
34
- // 🔴 语序是**被门的形状决定的**(codex 对抗复审 R1-[medium],验真后修):文案冻结门对模板串只冻
35
- // **第一个 `${` 之前**的固定前缀 —— 告诫若排在插值之后,整段安全提示可以被删掉/改写而门恒绿
36
- // (那正是本批自己要修的那类「成文却无看守」)。所以告诫在前、带插值的尺寸句在后:告诫整段落进
37
- // 冻结前缀,受 `400:request.field_invalid#the-drain-reason-is` 那条钉看守。改这句必须同批改冻结表。
38
30
  sendError(res, 400, "request.field_invalid", `the drain reason is surfaced verbatim on the UNAUTHENTICATED /health endpoint (and in 503 draining bodies), so anyone who can reach this port can read it — do not put ticket ids, hostnames, or internal identifiers in it. body must be { reason: string }: a non-empty string of at most ${MAX_DRAIN_REASON_CHARS} characters`);
39
31
  return;
40
32
  }
41
33
  if (!deps.drainState) {
42
- // 无 drain 面的装配(嵌入/测试宿主)上声明无处可落——诚实 501,不吞成 200(声明了却不透出
43
- // 比不能声明更糟:壳以为消费端能看到因由,实际两面永远缺席)。
44
34
  sendError(res, 501, "capability.drain_state_required", "this deployment has no drain state wired (embedded host?) — the declared reason would have nowhere to surface");
45
35
  return;
46
36
  }
@@ -4,9 +4,6 @@ import { checkAdoptionPrincipalShape, checkAdoptionWidths } from "../../adoption
4
4
  import { sendJson, sendError } from "../send.js";
5
5
  import { gatedPrincipal, explicitOperatorOk } from "../principal-gate.js";
6
6
  const ADOPTION_ID_RE = /^\/v1\/adoption\/([^/]+)$/;
7
- /** 结局 → wire。**拒从不走 200 回执包络**(见顶注三条拒的分家)。
8
- * 成功码写死 200(不收 `okStatus` 参数):一个**表达式**状态码会让 errorCode 归一门读不出这是成功面,
9
- * 而且本面本来就只有一个成功码 —— 同参重跑必须与首次同形,重跑创建不了任何东西。 */
10
7
  function sendOutcome(res, out) {
11
8
  switch (out.kind) {
12
9
  case "receipt":
@@ -19,13 +16,6 @@ function sendOutcome(res, out) {
19
16
  boundTo: out.boundTo,
20
17
  });
21
18
  return;
22
- // 闭集穷举:`AdoptionRejectCode` 加一个成员而这里没加臂 ⇒ **编译红**(拒绝码是 wire 契约,
23
- // 不许有一个走到默认臂的静默码)。
24
- //
25
- // 🔴 A-010.19(验真后修):上面这句话此前是**一句自我声明,不是一道门**。内层 switch 只有两条 case
26
- // 而结尾是一个裸 `return;` —— 加第三个拒绝码时 TS 一个字都不会说,请求会走到那个裸 return、
27
- // **一个字节都不写**就把响应扔在那里:调用方看到的是一条挂住的连接直到超时,而不是任何错误。
28
- // 现在由下面的 `never` 断言真正兑现它:少一条臂 ⇒ `out` 收窄不到 `never` ⇒ 赋值失败 ⇒ 编译红。
29
19
  case "rejected":
30
20
  switch (out.code) {
31
21
  case "adoption.destination_conflict":
@@ -42,16 +32,9 @@ function sendOutcome(res, out) {
42
32
  });
43
33
  return;
44
34
  }
45
- // 穷举证明:走到这里 `out.code` 必须已经收窄成 `never`。加一个 `AdoptionRejectCode` 成员而不加臂
46
- // ⇒ 这一行编译红,红在**加码的那一刻**,而不是在生产上表现为一条永不应答的请求。
47
35
  return assertNoRejectCodeLeft(out.code);
48
36
  }
49
37
  }
50
- /** 闭集穷举的落点。**入参类型是 `never`** —— 这就是那道门本身;函数体永远跑不到,写一句响亮抛是为了
51
- * 「万一有人用 `as` 把一个未知码塞进来」时仍然 fail-loud(不是静默挂住连接)。
52
- * ⚠️ 形参**刻意不叫 `code`**:`error-code-key-gate` 按 `code:` 的字面形扫全树错误体(3.0.0 起
53
- * `errorCode` 是唯一机器判别键),一个叫 `code` 的形参会被它当成一处 legacy 键站点。名字换掉比放宽
54
- * 那道门便宜得多 —— 门宽一分,真站点就可能溜过去。 */
55
38
  function assertNoRejectCodeLeft(unhandled) {
56
39
  throw new Error(`adoption: unhandled reject code ${JSON.stringify(unhandled)} — the wire contract's closed set and this switch have drifted apart`);
57
40
  }
@@ -69,9 +52,7 @@ async function handleAdoptionBody(req, res, url, ctx, miss) {
69
52
  miss.fell = true;
70
53
  return;
71
54
  }
72
- // 门序 = operator 面的既有口径:身份(401)→ 授权(403)→ 能力(501)→ 验型(400)。
73
- // 授权在能力之前:一个够不着任何东西的调用方不该从「有没有 SQL 后端」上读出部署形态。
74
- const principal = gatedPrincipal(req, deps.config); // direct-door safe: verified identity, never the spoofable header
55
+ const principal = gatedPrincipal(req, deps.config);
75
56
  if (deps.config.requirePrincipal && !principal) {
76
57
  sendError(res, 401, "auth.principal_required", `missing principal header '${deps.config.principalHeader}'`);
77
58
  return;
@@ -89,8 +70,6 @@ async function handleAdoptionBody(req, res, url, ctx, miss) {
89
70
  if (idMatch) {
90
71
  const id = ctx.helpers.safeDecode(idMatch[1]);
91
72
  if (id === null) {
92
- // 复用既有的 `request.id_invalid`(sessions/attachments 同族),不为一条新路由铸第二个同义码
93
- // ——附录 A 的判据②:只有消费端真会分支时才铸新码。
94
73
  sendError(res, 400, "request.id_invalid", "invalid adoption id");
95
74
  return;
96
75
  }
@@ -116,24 +95,17 @@ async function handleAdoptionBody(req, res, url, ctx, miss) {
116
95
  return;
117
96
  }
118
97
  const { fromPrincipal, toPrincipal } = parsed.data;
119
- // 🔴 键空间卫生在**列宽之前**(A-010.15):带首尾空白的身份在两方言上的唯一键语义不等价
120
- // (MySQL utf8mb4_bin 是 PAD SPACE),而它在本仓根本不是一个可能存在的真身份 —— 详见该函数头注。
121
- // 排在列宽前面的理由与列宽自己那条次序判据同族:两条都能命中时,报**更根本**的那一个。
122
98
  const badShape = checkAdoptionPrincipalShape(fromPrincipal, toPrincipal);
123
99
  if (badShape !== undefined) {
124
100
  sendError(res, 400, "request.field_invalid", "the adoption principals are not in a portable identity shape", { detail: badShape });
125
101
  return;
126
102
  }
127
- // 🔴 列宽校验在**铸行之前**(codex R1-F3):合法长度的 principal 也可能装不进最窄的那根被写列,
128
- // 而那种失败若发生在腿的中途,phase 会永远停在 INTENT —— 每次重发和每次 boot 扫描都再撞一次同样的墙。
129
103
  const tooWide = checkAdoptionWidths(fromPrincipal, toPrincipal);
130
104
  if (tooWide !== undefined) {
131
105
  sendError(res, 400, "request.field_invalid", "the adoption principals do not fit every identity column and derived key this adoption must write", { detail: tooWide });
132
106
  return;
133
107
  }
134
108
  if (fromPrincipal === toPrincipal) {
135
- // 183 §8 的「nothing to adopt」分支:同名不是一次无操作的成功,它是一个提错了的请求
136
- // ——铸一行 adoption_log 会永久占掉那个 from 的 UNIQUE 名额(D7 之后再也收编不了),所以拒在入库之前。
137
109
  sendError(res, 400, "request.field_invalid", "fromPrincipal and toPrincipal are the same — nothing to adopt");
138
110
  return;
139
111
  }
@@ -1,25 +1,6 @@
1
1
  import { sendJson, sendError } from "../send.js";
2
- /** 名册窗的扫描上限(与 fleet 的终态窗同姿势:读面要有界)。窗满时回体带 `truncated:true`,
3
- * `total` 于是诚实地是「窗内行数」而不是租户全量 —— 一个悄悄封顶的 total 比没有 total 更坏。 */
4
2
  export const ROSTER_SCAN_LIMIT = 500;
5
- /** 状态闭集(= core `BackgroundAgentRecord["status"]`)。`satisfies` 让 core 加一个状态词时这里编译红,
6
- * 而不是让一个合法状态在 `?status=` 上被 400 掉(#157 的词表纪律:未知词不许有静默臂,已知词不许漏)。 */
7
3
  const ROSTER_STATUSES = ["running", "parked", "completed", "failed", "killed"];
8
- /**
9
- * 名册行的**逐键处置表**。新增一个 `BackgroundAgentRowSummary` 键 ⇒ 这里编译红(TS2741),强迫对
10
- * 「它上不上名册」表态。`keep` 的键必须同步进下面的白名单构造。
11
- *
12
- * · `handle` / `status` / `spawnedAt` / `updatedAt` / `settledAt`:身份与生命周期,壳渲名册就靠它们。
13
- * · `name` / `agentType`:**寻址与标签**——agent-teams 的按名寻址就是 `name`;二者随行读回给**行的属主
14
- * 自己**,与 `GET /v1/sessions` 回本人会话的 objective 预览同一条租户边界(fleet 那边 scrub 它们是因为
15
- * 那条流上有**未署名会话**的行会落到别的会话的壳里,本面没有那条腿:每一行都已按 scope 过门)。
16
- * · `owner`:租户内部键(门的**输入**:task/session 属主 id),永不渲染 ⇒ strip。
17
- * (`scope` 压根不在 summary 面上 —— 它是 store 的查询键;所以它不是本表的一行,而是结构上就到不了 wire。)
18
- * · `sessionScoped`:门的形状位(行是任务锚还是会话锚),对壳无意义、对攻击者是拓扑线索 ⇒ strip。
19
- * · `sessionId` / `parentSessionId` / `rootSessionId`:会话寻址键 —— 名册不做寻址面(要拿子代产物走
20
- * `/v1/runs/:id/subagents/:handle/output`,那条口有它自己的完整谓词),多给一个可寻址 id 只扩暴露面。
21
- * · `usage`:用量轴归 `/v1/usage` 与 run 面,名册是**姿态面**不是计费面(最小披露:不顺手多发)。
22
- */
23
4
  const ROSTER_KEY_DISPOSITION = {
24
5
  handle: "keep",
25
6
  name: "keep",
@@ -47,8 +28,6 @@ function projectRow(r) {
47
28
  ...(r.settledAt !== undefined ? { settledAt: r.settledAt } : {}),
48
29
  };
49
30
  }
50
- /** 游标 = `(spawnedAt, handle)` 的不透明 base64url —— 排序键**逐字**是它,所以同 `spawnedAt` 的行
51
- * (真实存在:同一拍派出的兄弟子代)不会因为无 tiebreak 而漏页或重页。 */
52
31
  function encodeCursor(c) {
53
32
  return Buffer.from(JSON.stringify(c)).toString("base64url");
54
33
  }
@@ -58,8 +37,6 @@ function decodeCursor(raw) {
58
37
  parsed = JSON.parse(Buffer.from(raw, "base64url").toString());
59
38
  }
60
39
  catch (err) {
61
- // 只带错误的**类名**,不回显 payload 片段(config-provider 的 redactConfigError 同一条纪律:
62
- // 被误粘进查询串的凭据不该经由错误文案再走一圈)。
63
40
  return { ok: false, why: `not decodable base64url JSON (${err instanceof Error ? err.name : "unknown error"})` };
64
41
  }
65
42
  if (typeof parsed !== "object" || parsed === null)
@@ -83,9 +60,7 @@ async function handleAgentRosterBody(req, res, url, ctx, miss) {
83
60
  miss.fell = true;
84
61
  return;
85
62
  }
86
- // 鉴权在店可用性判**之前**(与 GET /v1/sessions 逐字同序):反过来会让「这台装没装 durable agent 店」
87
- // 先于 401 泄给未认证调用方 —— 一个小的后端存在性 oracle。
88
- const { fleetWide, gateOwner } = sessionOwnerScope(req); // direct-door safe:验证过的身份,不是可伪造的头
63
+ const { fleetWide, gateOwner } = sessionOwnerScope(req);
89
64
  if (!fleetWide && gateOwner === null) {
90
65
  sendError(res, 401, "auth.unauthorized", "unauthorized");
91
66
  return;
@@ -105,8 +80,6 @@ async function handleAgentRosterBody(req, res, url, ctx, miss) {
105
80
  const beforeRaw = q.get("before");
106
81
  const decoded = beforeRaw === null ? undefined : decodeCursor(beforeRaw);
107
82
  if (decoded !== undefined && !decoded.ok) {
108
- // 文案冻结在 wire 上(api-error-text-freeze 的一行);`detail` 是 additive 的**为什么**,
109
- // 供调用方自诊(它描述的是调用方自己传进来的串,零跨租户信息)。
110
83
  sendError(res, 400, "request.query_invalid", "before must be the opaque `nextBefore` cursor from a previous page of this endpoint", { detail: decoded.why });
111
84
  return;
112
85
  }
@@ -117,9 +90,6 @@ async function handleAgentRosterBody(req, res, url, ctx, miss) {
117
90
  return;
118
91
  }
119
92
  const status = statusRaw === null ? undefined : statusRaw;
120
- // scope:principal 调用方**钉死自己**(`?scope=` 对它无效 —— 与 GET /v1/sendfile-links 同判);
121
- // fleet-wide(service token / dev-open 单用户)可以指定,缺省 `"default"` = 单租户拼法
122
- // (core prepare-task 的 `spec.principal ?? "default"` 写侧同源,fleet 读侧的 `?? "default"` 同族)。
123
93
  let scope;
124
94
  if (gateOwner !== null) {
125
95
  scope = gateOwner;
@@ -143,30 +113,16 @@ async function handleAgentRosterBody(req, res, url, ctx, miss) {
143
113
  sendError(res, 400, "request.query_invalid", "session must be a non-blank session id when present");
144
114
  return;
145
115
  }
146
- // 两只既有只读口,同一套 scope 门:`listBySession` 按会话树锚(会话锚 ∪ root 锚)窄化,
147
- // 缺席则整 scope。窗上限 +1 用来判「租户行数超窗」,不进结果。
148
116
  const opts = { ...(status !== undefined ? { status } : {}), limit: ROSTER_SCAN_LIMIT + 1 };
149
117
  const scanned = session !== null ? await store.listBySession(scope, session, opts) : await store.listByScope(scope, opts);
150
118
  const truncated = scanned.length > ROSTER_SCAN_LIMIT;
151
119
  let window = truncated ? scanned.slice(0, ROSTER_SCAN_LIMIT) : scanned;
152
- // 🔴 窗边界的**同 spawnedAt 组整组丢弃**(codex 对抗复审 finding 3,验真属实)。
153
- // store 契约只保证 `spawnedAt` 降序、**同毫秒无 tiebreak**;而本面的声明序是 `(spawnedAt, handle)`。
154
- // 于是窗边界那一组兄弟行被 store 按它自己的任意序切开时,按本面的序本该入窗的那一行可能被切掉,
155
- // 而 `before` 游标只在窗内翻 ⇒ 那一行**永远翻不到**(一个静默的洞)。
156
- // 只用 store 保证得了的那条契约修:丢掉尾部整组之后,窗恒是「`spawnedAt > cut` 的**全部**行」——
157
- // 按降序取前缀,这个集合必然完整,于是窗是本面声明序的**干净前缀**。代价=少几行,而 `truncated:true`
158
- // 本就已经说了"还有更多"。**刻意不下推排序/游标契约到 store**:那是 core 的接口,归属上游(源头修复纪律)。
159
- // 判据是**边界真的被切开**(第一个落窗外的行与窗内最后一行同 `spawnedAt`),不是"只要截断就丢一组"——
160
- // 时间戳互不相同时切口本来就干净,无谓丢行会让窗白白变小。
161
120
  if (truncated && window.length > 0 && scanned[ROSTER_SCAN_LIMIT].spawnedAt === window[window.length - 1].spawnedAt) {
162
121
  const cut = window[window.length - 1].spawnedAt;
163
122
  const clean = window.filter((r) => r.spawnedAt > cut);
164
- // 退化形(整窗 501 行同一毫秒)⇒ 丢完就空了,那时保留原窗:少给不如给,且 `truncated` 已如实。
165
123
  if (clean.length > 0)
166
124
  window = clean;
167
125
  }
168
- // 排序键 = 游标键(新→旧,同 spawnedAt 时按 handle 降序):店已按 spawnedAt DESC 给,但 tiebreak 是
169
- // 方言细节,名册自己定死一个确定序,分页才不会在同拍兄弟行上漏页/重页。
170
126
  const sorted = [...window].sort((a, b) => (b.spawnedAt - a.spawnedAt) || (a.handle < b.handle ? 1 : a.handle > b.handle ? -1 : 0));
171
127
  const scoped = cursor === undefined ? sorted : sorted.filter((r) => r.spawnedAt < cursor.spawnedAt || (r.spawnedAt === cursor.spawnedAt && r.handle < cursor.handle));
172
128
  const page = scoped.slice(0, limit);
@@ -174,8 +130,6 @@ async function handleAgentRosterBody(req, res, url, ctx, miss) {
174
130
  const hasMore = last !== undefined && scoped.length > page.length;
175
131
  sendJson(res, 200, {
176
132
  agents: page.map(projectRow),
177
- // `total` = **本名册窗**内的行数(属主口径 —— 跨租户的行既不进页也不进这个数)。窗被截断时
178
- // `truncated:true` 同发,于是这个数字什么时候是"全量"、什么时候是"窗内"对消费端是可判别的。
179
133
  total: window.length,
180
134
  ...(truncated ? { truncated: true } : {}),
181
135
  ...(hasMore ? { nextBefore: encodeCursor({ spawnedAt: last.spawnedAt, handle: last.handle }) } : {}),