@sema-agent/core 5.20.0 → 5.21.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 (312) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/agents/agent-definition.d.ts +7 -0
  3. package/dist/agents/agent-transcript-tool.d.ts +30 -0
  4. package/dist/agents/builtin-agents.d.ts +60 -0
  5. package/dist/agents/cascade.d.ts +107 -0
  6. package/dist/agents/cumulative-stats.d.ts +56 -0
  7. package/dist/agents/observer.d.ts +162 -0
  8. package/dist/agents/peer-admission.d.ts +95 -0
  9. package/dist/agents/repair-loop.d.ts +226 -0
  10. package/dist/agents/retain-ledger.d.ts +141 -0
  11. package/dist/agents/roster-store.d.ts +105 -0
  12. package/dist/agents/send-message-tool.d.ts +92 -0
  13. package/dist/agents/session-util.d.ts +5 -0
  14. package/dist/agents/subagent-steps.d.ts +66 -0
  15. package/dist/agents/subagent.d.ts +600 -0
  16. package/dist/agents/suspend-guard.d.ts +29 -0
  17. package/dist/agents/teacher.d.ts +75 -0
  18. package/dist/agents/team.d.ts +120 -1
  19. package/dist/agents/tool-filter.d.ts +34 -0
  20. package/dist/agents/verify.d.ts +198 -0
  21. package/dist/bench/metrics.d.ts +455 -0
  22. package/dist/brain/anthropic.d.ts +30 -0
  23. package/dist/brain/circuit-breaker.d.ts +33 -0
  24. package/dist/brain/context-overflow.d.ts +60 -3
  25. package/dist/brain/degrading.d.ts +67 -0
  26. package/dist/brain/errors.d.ts +42 -0
  27. package/dist/brain/failover.d.ts +15 -0
  28. package/dist/brain/media-degrade.d.ts +39 -0
  29. package/dist/brain/model-presets.d.ts +31 -0
  30. package/dist/brain/open-responses.d.ts +19 -0
  31. package/dist/brain/openai.d.ts +46 -0
  32. package/dist/brain/reasoning.d.ts +106 -1
  33. package/dist/brain/repetition.d.ts +83 -0
  34. package/dist/brain/request-params.d.ts +56 -0
  35. package/dist/brain/retry.d.ts +46 -0
  36. package/dist/brain/routing.d.ts +12 -0
  37. package/dist/brain/status-sink.d.ts +30 -1
  38. package/dist/brain/stream-engine.d.ts +147 -0
  39. package/dist/brain/stream-shared.d.ts +34 -0
  40. package/dist/brain/terminal-cause.d.ts +31 -0
  41. package/dist/brain/timeout.d.ts +107 -0
  42. package/dist/brain/tool-call-id.d.ts +20 -0
  43. package/dist/brain/tool-call-repair.d.ts +13 -0
  44. package/dist/config/catalog.d.ts +47 -0
  45. package/dist/config/defaults.d.ts +33 -0
  46. package/dist/core/a2a-task-state.d.ts +53 -0
  47. package/dist/core/a2a.d.ts +51 -0
  48. package/dist/core/arg-summary.d.ts +62 -0
  49. package/dist/core/ask-question.d.ts +272 -2
  50. package/dist/core/auto-compaction.d.ts +467 -0
  51. package/dist/core/auto-compaction.js +20 -6
  52. package/dist/core/auto-mode-prompt-assets.d.ts +8 -0
  53. package/dist/core/auto-mode-prompt.d.ts +27 -0
  54. package/dist/core/auto-mode.d.ts +54 -3
  55. package/dist/core/auto-promote.d.ts +100 -0
  56. package/dist/core/background-agent-store.d.ts +292 -0
  57. package/dist/core/background-shell.d.ts +110 -0
  58. package/dist/core/cache-break-detector.d.ts +34 -0
  59. package/dist/core/canonical-json.d.ts +57 -0
  60. package/dist/core/checkpoint-store.d.ts +1574 -16
  61. package/dist/core/compliance.d.ts +30 -0
  62. package/dist/core/consolidate-scope.d.ts +75 -0
  63. package/dist/core/context-edit.d.ts +99 -0
  64. package/dist/core/context-guard.d.ts +46 -0
  65. package/dist/core/exec-gate.d.ts +44 -0
  66. package/dist/core/exec-output-tail.d.ts +61 -0
  67. package/dist/core/file-snapshot-store.d.ts +104 -0
  68. package/dist/core/fs-write-gate-policy.d.ts +36 -0
  69. package/dist/core/git-worktree-env.d.ts +31 -0
  70. package/dist/core/governance-codes.d.ts +19 -0
  71. package/dist/core/hooks.d.ts +608 -1
  72. package/dist/core/human-input-projection.d.ts +37 -0
  73. package/dist/core/human-input-projection.js +13 -0
  74. package/dist/core/image-downsample.d.ts +74 -0
  75. package/dist/core/locked-config.d.ts +37 -0
  76. package/dist/core/lsp-diagnostics.d.ts +77 -0
  77. package/dist/core/lsp-protocol.d.ts +29 -0
  78. package/dist/core/lsp-session.d.ts +60 -1
  79. package/dist/core/lsp.d.ts +150 -1
  80. package/dist/core/mailbox-store.d.ts +57 -0
  81. package/dist/core/mcp.d.ts +381 -0
  82. package/dist/core/media-byte-cap.d.ts +21 -0
  83. package/dist/core/memory-admission.d.ts +71 -0
  84. package/dist/core/memory-engine/content-origin.d.ts +64 -0
  85. package/dist/core/memory-engine/data-plane.d.ts +43 -0
  86. package/dist/core/memory-engine/dual-root.d.ts +24 -0
  87. package/dist/core/memory-engine/engine.d.ts +230 -0
  88. package/dist/core/memory-engine/engine.js +103 -35
  89. package/dist/core/memory-engine/file-backend.d.ts +155 -0
  90. package/dist/core/memory-engine/frontmatter.d.ts +16 -0
  91. package/dist/core/memory-engine/layout.d.ts +217 -0
  92. package/dist/core/memory-engine/memory-backend-contract.d.ts +12 -0
  93. package/dist/core/memory-engine/migrate.d.ts +9 -0
  94. package/dist/core/memory-engine/scan.d.ts +12 -0
  95. package/dist/core/memory-engine/scope-contract.d.ts +61 -1
  96. package/dist/core/memory-engine/sync-client.d.ts +87 -0
  97. package/dist/core/memory-engine/sync.d.ts +60 -0
  98. package/dist/core/memory-engine/tools.d.ts +41 -0
  99. package/dist/core/memory-engine/types.d.ts +188 -0
  100. package/dist/core/memory-recall.d.ts +141 -0
  101. package/dist/core/memory-vector.d.ts +20 -0
  102. package/dist/core/memory.d.ts +458 -0
  103. package/dist/core/message-utils.d.ts +6 -0
  104. package/dist/core/oracle-isolation.d.ts +69 -0
  105. package/dist/core/permission-rule-consent.d.ts +138 -0
  106. package/dist/core/permission-rule-model.d.ts +122 -0
  107. package/dist/core/permission-rule-store.d.ts +119 -3
  108. package/dist/core/permission-rules.d.ts +87 -1
  109. package/dist/core/present-plan-tool.d.ts +20 -0
  110. package/dist/core/pricing.d.ts +26 -0
  111. package/dist/core/property-harness.d.ts +86 -0
  112. package/dist/core/protocol-naming.d.ts +38 -0
  113. package/dist/core/protocol-table.d.ts +61 -0
  114. package/dist/core/push-queue.d.ts +1 -0
  115. package/dist/core/remote-env.d.ts +383 -1
  116. package/dist/core/retention-policy.d.ts +33 -0
  117. package/dist/core/retention.d.ts +51 -0
  118. package/dist/core/roles.d.ts +59 -0
  119. package/dist/core/runner/active-skill-scope.d.ts +34 -0
  120. package/dist/core/runner/assemble-result.d.ts +134 -0
  121. package/dist/core/runner/compaction-call-options.d.ts +97 -1
  122. package/dist/core/runner/grounding-signal.d.ts +10 -0
  123. package/dist/core/runner/image.d.ts +17 -0
  124. package/dist/core/runner/image.js +29 -15
  125. package/dist/core/runner/memory-consolidation.d.ts +60 -0
  126. package/dist/core/runner/prepare-memory.d.ts +59 -0
  127. package/dist/core/runner/prepare-task.d.ts +1011 -2
  128. package/dist/core/runner/prepare-task.js +12 -11
  129. package/dist/core/runner/prompt-suggestions.d.ts +7 -0
  130. package/dist/core/runner/runtask.d.ts +304 -3
  131. package/dist/core/runner/session-file-state-replay.d.ts +49 -0
  132. package/dist/core/runner/session-rule-policy.d.ts +58 -0
  133. package/dist/core/runner/strict-output-schema.d.ts +18 -3
  134. package/dist/core/runner/synthetic-tools.d.ts +113 -0
  135. package/dist/core/runner/teardown-bounded.d.ts +34 -0
  136. package/dist/core/runner/tool-disclosure.d.ts +227 -0
  137. package/dist/core/runner/tool-output-projection.d.ts +6 -0
  138. package/dist/core/runner/turn-attachments.d.ts +634 -0
  139. package/dist/core/runner/usage-accounting.d.ts +32 -0
  140. package/dist/core/runtime.d.ts +9 -0
  141. package/dist/core/safe-notify.d.ts +64 -0
  142. package/dist/core/safety-axis-vocab.d.ts +23 -0
  143. package/dist/core/safety-merge-corpus.d.ts +37 -0
  144. package/dist/core/scheduler.d.ts +121 -0
  145. package/dist/core/secret-env.d.ts +32 -0
  146. package/dist/core/select-model.d.ts +15 -0
  147. package/dist/core/sensitive-path-policy.d.ts +42 -0
  148. package/dist/core/session-policy-store.d.ts +94 -0
  149. package/dist/core/session-reconcile.d.ts +80 -0
  150. package/dist/core/session-store.d.ts +85 -0
  151. package/dist/core/session.d.ts +153 -0
  152. package/dist/core/shared-memory/contract.d.ts +22 -0
  153. package/dist/core/shared-memory/normalize.d.ts +123 -2
  154. package/dist/core/shared-memory/tools.d.ts +14 -0
  155. package/dist/core/shared-memory/types.d.ts +105 -0
  156. package/dist/core/shutdown-debug.d.ts +6 -0
  157. package/dist/core/side-query.d.ts +38 -0
  158. package/dist/core/side-query.js +6 -1
  159. package/dist/core/skill-tool-specifier.d.ts +72 -0
  160. package/dist/core/skills-directory.d.ts +100 -1
  161. package/dist/core/spec-contract.d.ts +89 -0
  162. package/dist/core/store-contracts/background-agent-store-contract.d.ts +31 -0
  163. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +26 -0
  164. package/dist/core/store-contracts/contract-harness.d.ts +20 -0
  165. package/dist/core/store-contracts/contract-kit-version.d.ts +27 -0
  166. package/dist/core/store-contracts/file-snapshot-store-contract.d.ts +8 -0
  167. package/dist/core/store-contracts/mailbox-store-contract.d.ts +42 -0
  168. package/dist/core/store-contracts/tool-result-store-contract.d.ts +13 -0
  169. package/dist/core/strategy-store.d.ts +37 -0
  170. package/dist/core/stub-env.d.ts +7 -0
  171. package/dist/core/surrogate-safe-slice.d.ts +35 -0
  172. package/dist/core/task-notification.d.ts +202 -0
  173. package/dist/core/task-outcome.d.ts +53 -0
  174. package/dist/core/task-registry-agent.d.ts +337 -1
  175. package/dist/core/task-registry-monitor.d.ts +12 -0
  176. package/dist/core/task-registry-shared.d.ts +540 -0
  177. package/dist/core/task-registry.d.ts +343 -0
  178. package/dist/core/task-registry.js +13 -2
  179. package/dist/core/task-tool-shape.d.ts +44 -0
  180. package/dist/core/tighten-task-spec.d.ts +21 -0
  181. package/dist/core/tool-detach.d.ts +21 -0
  182. package/dist/core/tool-errors.d.ts +131 -0
  183. package/dist/core/tool-errors.js +4 -0
  184. package/dist/core/tool-name-aliases.d.ts +27 -0
  185. package/dist/core/tool-policy.d.ts +555 -0
  186. package/dist/core/tool-result-budget.d.ts +32 -0
  187. package/dist/core/tool-result-store.d.ts +174 -1
  188. package/dist/core/tools.d.ts +45 -0
  189. package/dist/core/trace.d.ts +323 -0
  190. package/dist/core/types.d.ts +3859 -2
  191. package/dist/core/untrusted-egress.d.ts +8 -0
  192. package/dist/core/untrusted-text.d.ts +156 -0
  193. package/dist/core/usage-window-store.d.ts +95 -0
  194. package/dist/core/version.d.ts +1 -0
  195. package/dist/core/warm-resume.d.ts +17 -0
  196. package/dist/core/wiring-manifest.d.ts +169 -0
  197. package/dist/core/with-retry.d.ts +24 -0
  198. package/dist/core/workflow-journal-store.d.ts +160 -0
  199. package/dist/core/workflow-run-store-contract.d.ts +25 -0
  200. package/dist/core/workflow-run-store.d.ts +119 -0
  201. package/dist/engine/compaction/compaction.d.ts +256 -1
  202. package/dist/engine/compaction/utils.d.ts +94 -0
  203. package/dist/engine/execution-env/kill-tree.d.ts +29 -0
  204. package/dist/engine/execution-env/node-execution-env.d.ts +94 -0
  205. package/dist/engine/harness/agent-harness.d.ts +116 -0
  206. package/dist/engine/harness/agent-harness.js +3 -14
  207. package/dist/engine/harness/messages.d.ts +15 -0
  208. package/dist/engine/harness/types.d.ts +464 -2
  209. package/dist/engine/llm/diagnostics.d.ts +4 -0
  210. package/dist/engine/llm/event-stream.d.ts +3 -0
  211. package/dist/engine/llm/index.d.ts +7 -0
  212. package/dist/engine/llm/types.d.ts +500 -3
  213. package/dist/engine/llm/validation.d.ts +3 -0
  214. package/dist/engine/loop/agent-loop.d.ts +87 -2
  215. package/dist/engine/loop/runtime-deps.d.ts +7 -0
  216. package/dist/engine/loop/types.d.ts +424 -0
  217. package/dist/engine/lsp/frame-decoder.d.ts +13 -0
  218. package/dist/engine/lsp/node-lsp-manager.d.ts +107 -0
  219. package/dist/engine/lsp/stdio-lsp-transport.d.ts +7 -0
  220. package/dist/engine/session/import-validate.d.ts +27 -0
  221. package/dist/engine/session/log-digest.d.ts +93 -0
  222. package/dist/engine/session/memory-repo.d.ts +6 -0
  223. package/dist/engine/session/memory-storage.d.ts +2 -0
  224. package/dist/engine/session/session.d.ts +75 -0
  225. package/dist/engine/session/storage-base.d.ts +8 -0
  226. package/dist/fixtures/index.d.ts +36 -0
  227. package/dist/index.d.ts +16 -1
  228. package/dist/index.js +0 -1
  229. package/dist/internal/harness-types.d.ts +6 -0
  230. package/dist/internal/harness.d.ts +11 -0
  231. package/dist/internal/llm.d.ts +6 -0
  232. package/dist/orchestration/builtin-workflows.d.ts +53 -0
  233. package/dist/orchestration/dev-vm-script-runner.d.ts +19 -0
  234. package/dist/orchestration/goal.d.ts +57 -0
  235. package/dist/orchestration/goal.js +3 -0
  236. package/dist/orchestration/run-spec.d.ts +42 -0
  237. package/dist/orchestration/run-workflow-tool.d.ts +169 -0
  238. package/dist/orchestration/workflow-governance.d.ts +61 -0
  239. package/dist/orchestration/workflow-meta.d.ts +28 -0
  240. package/dist/orchestration/workflow-observe.d.ts +60 -0
  241. package/dist/orchestration/workflow-primitives.d.ts +23 -1
  242. package/dist/orchestration/workflow-sandbox-conformance.d.ts +38 -0
  243. package/dist/orchestration/workflow-script-runner.d.ts +88 -0
  244. package/dist/orchestration/workflow-script-store.d.ts +98 -0
  245. package/dist/orchestration/workflow-size-guideline.d.ts +67 -0
  246. package/dist/orchestration/workflow-types.d.ts +169 -2
  247. package/dist/orchestration/workflow.d.ts +358 -0
  248. package/dist/prompt-assembly/artifact-store.d.ts +33 -0
  249. package/dist/prompt-assembly/artifact.d.ts +25 -0
  250. package/dist/prompt-assembly/assemble.d.ts +20 -0
  251. package/dist/prompt-assembly/composer.d.ts +29 -0
  252. package/dist/prompt-assembly/epoch.d.ts +55 -1
  253. package/dist/prompt-assembly/event-registry.d.ts +35 -0
  254. package/dist/prompt-assembly/explain.d.ts +12 -0
  255. package/dist/prompt-assembly/tool-catalog.d.ts +38 -0
  256. package/dist/prompt-assembly/turn-snapshot.d.ts +40 -0
  257. package/dist/prompt-assembly/types.d.ts +115 -0
  258. package/dist/prompts/coordinator.d.ts +27 -0
  259. package/dist/prompts/default.d.ts +539 -0
  260. package/dist/prompts/simple-sections.d.ts +45 -0
  261. package/dist/prompts/supervisor.d.ts +66 -0
  262. package/dist/scenarios/env.d.ts +28 -0
  263. package/dist/scenarios/full-body.d.ts +50 -0
  264. package/dist/scenarios/scenario-registry.d.ts +60 -0
  265. package/dist/scenarios/teacher-quickstart.d.ts +27 -0
  266. package/dist/server/http.d.ts +17 -0
  267. package/dist/stores/cc/lockfile.d.ts +6 -0
  268. package/dist/stores/cc/mailbox-store.d.ts +8 -0
  269. package/dist/stores/cc/roster-adapter.d.ts +4 -0
  270. package/dist/stores/cc/sidecar-transcript.d.ts +66 -0
  271. package/dist/stores/file/background-agent-store.d.ts +24 -0
  272. package/dist/stores/file/checkpoint-store.d.ts +38 -0
  273. package/dist/stores/file/file-snapshot-store.d.ts +25 -0
  274. package/dist/stores/file/fs-atomic.d.ts +155 -0
  275. package/dist/stores/file/index.d.ts +89 -0
  276. package/dist/stores/file/mailbox-store.d.ts +36 -0
  277. package/dist/stores/file/memory-store.d.ts +82 -0
  278. package/dist/stores/file/permission-rule-store.d.ts +79 -0
  279. package/dist/stores/file/session-policy-store.d.ts +28 -0
  280. package/dist/stores/file/session-store.d.ts +40 -0
  281. package/dist/stores/file/shared-ledger.d.ts +83 -0
  282. package/dist/stores/file/tool-result-store.d.ts +11 -0
  283. package/dist/stores/file/usage-window-store.d.ts +18 -0
  284. package/dist/stores/file/workflow-journal-store.d.ts +100 -0
  285. package/dist/stores/file/workflow-run-store.d.ts +11 -0
  286. package/dist/tools/fs/bash-readonly-classifier.d.ts +282 -0
  287. package/dist/tools/fs/encoding.d.ts +60 -0
  288. package/dist/tools/fs/fs-bash.d.ts +133 -0
  289. package/dist/tools/fs/fs-pdf.d.ts +28 -0
  290. package/dist/tools/fs/fs-search-tools.d.ts +5 -0
  291. package/dist/tools/fs/fs-shared.d.ts +360 -0
  292. package/dist/tools/fs/fs-write.d.ts +16 -0
  293. package/dist/tools/fs/gh-rate-limit.d.ts +22 -0
  294. package/dist/tools/fs/index.d.ts +79 -0
  295. package/dist/tools/fs/notebook.d.ts +56 -0
  296. package/dist/tools/fs/pdf.d.ts +70 -0
  297. package/dist/tools/fs/pdf.js +8 -2
  298. package/dist/tools/fs/repo-map.d.ts +10 -0
  299. package/dist/tools/fs/safety.d.ts +376 -0
  300. package/dist/tools/fs/search.d.ts +131 -0
  301. package/dist/tools/loop-tick.d.ts +24 -0
  302. package/dist/tools/monitor.d.ts +55 -0
  303. package/dist/tools/scheduler-tools.d.ts +51 -0
  304. package/dist/tools/sql-adapters.d.ts +18 -0
  305. package/dist/tools/sql.d.ts +25 -0
  306. package/dist/tools/task-list.d.ts +77 -0
  307. package/dist/tools/todo.d.ts +8 -0
  308. package/dist/tools/web.d.ts +184 -0
  309. package/dist/tools/worktree.d.ts +81 -0
  310. package/package.json +2 -2
  311. package/dist/tools/gitea-issue.d.ts +0 -13
  312. package/dist/tools/gitea-issue.js +0 -75
@@ -1,5 +1,17 @@
1
1
  import type { McpDroppedTool } from "../mcp.js";
2
2
  import { type SkillListingEntry } from "./synthetic-tools.js";
3
+ /**
4
+ * design/133 §R3 — turn-boundary attachment seam: the PURE producer layer (CC `getContextAttachments`
5
+ * parity). This module is the single home of the CC-parity cadence judgment + reminder copy (提示词主权批:
6
+ * harness 语料归 core); it holds NO harness handle, does NO I/O, and never injects anything itself — the
7
+ * run loop (runtask onTurnBoundary) is the ONLY steerer. That split exists so every trigger window is
8
+ * offline-testable and the injection gate/ordering stays at the one arbitration point the engine already has.
9
+ *
10
+ * F3 (wrapper semantics): a {@link TurnAttachment} carries the BODY ONLY — no `<system-reminder>` shell.
11
+ * The steerer wraps each body exactly once at a single call site, so double-wrap/no-wrap can't drift
12
+ * per-producer.
13
+ */
14
+ /** CC-verbatim cadence constants (CC attachments.ts:254-262). */
3
15
  export declare const TODO_REMINDER_CONFIG: {
4
16
  readonly TURNS_SINCE_WRITE: 10;
5
17
  readonly TURNS_BETWEEN_REMINDERS: 10;
@@ -8,107 +20,407 @@ export declare const PLAN_MODE_ATTACHMENT_CONFIG: {
8
20
  readonly TURNS_BETWEEN_ATTACHMENTS: 5;
9
21
  readonly FULL_REMINDER_EVERY_N_ATTACHMENTS: 5;
10
22
  };
23
+ /** RB-313 — CC 2.1.220 tool-search reminder cadence, the shipped defaults of its `juniper_shoal`
24
+ * config block (`sru = 15` / `aru = 10` @185913-185914, read as `{everyNTurns, maxNames}` @185836-185849).
25
+ * `EVERY_N_TURNS` gates BOTH windows (since-last-ToolSearch and since-last-reminder, @608920);
26
+ * `MAX_NAMES` bounds how many undiscovered names the body enumerates before the `(+N more)` tail. */
11
27
  export declare const TOOL_SEARCH_REMINDER_CONFIG: {
12
28
  readonly EVERY_N_TURNS: 15;
13
29
  readonly MAX_NAMES: 10;
14
30
  };
31
+ /** F5: per-boundary stat scan upper bound — at most this many most-recently-read files are stat'ed. */
15
32
  export declare const CHANGED_FILES_MAX = 20;
33
+ /**
34
+ * F5 (记档 known limitation): `ReadEntry.lastReadAt` is wall-clock (Date.now) while `FileInfo.mtimeMs`
35
+ * is the fs clock — a cross-clock comparison (CC getChangedFiles is the same shape: its readFileState
36
+ * timestamp is also wall-clock). The 2s epsilon absorbs ordinary skew/mtime granularity; git-checkout /
37
+ * formatter storms remain a documented false-positive source (hash-confirm 抗假阳 = v2).
38
+ */
16
39
  export declare const CHANGED_FILES_MTIME_EPS_MS = 2000;
40
+ /** Per-boundary payload byte cap over the whole bundle (weak-model context economics). */
17
41
  export declare const ATTACHMENT_BYTE_CAP: number;
18
42
  export type AttachmentSource = "todo_reminder" | "task_reminder" | "tool_search_usage_reminder" | "changed_files" | "plan_mode" | "date_change" | "instructions_change" | "workflow_size_guideline_change" | "budget_usd" | "background_tasks" | "tools_delta" | "agent_listing" | "skills_listing" | "mcp_instructions" | "mcp_dropped_tools";
43
+ /** G1 续批 — one agent type on the delegation tool's roster (ToolSpec.agentListing, filled by
44
+ * createSubagentTool: defined agents + the built-in fork when offered). */
19
45
  export interface AgentListingEntry {
20
46
  name: string;
21
47
  description: string;
48
+ /** Pre-rendered tool-boundary note for the `(Tools: …)` line tail (CC `gHm`/220 `WW_` @465651-465663:
49
+ * "All tools" / "All tools except X, Y" / an explicit list / "None"). Computed by the producer
50
+ * (createSubagentTool → {@link import("../../agents/subagent.js").agentToolsNote}).
51
+ *
52
+ * RB-312③: omitting it no longer drops the tail. 220's `fvd` (@465664-465668) interpolates
53
+ * `WW_(def)` UNCONDITIONALLY and `WW_` is total — its no-allow/no-deny arm returns the literal
54
+ * "All tools" — so every roster line in 220 carries the boundary. sema's optional field only ever
55
+ * meant "a hand-built entry did not precompute one"; that entry's real boundary IS the full offered
56
+ * pool, so {@link AGENT_TOOLS_NOTE_DEFAULT} is substituted and the tail is now always present. Reading a line
57
+ * with no tail as "unknown boundary" was never available to the model anyway — it read as "this type
58
+ * has no tools", the one thing that is never true. */
22
59
  tools?: string;
23
60
  }
61
+ /** G1 通告层: a background task visible to THIS run, snapshotted at the boundary by the
62
+ * runtask-side getter (registry ground truth — the producer never touches the registry itself). */
24
63
  export interface BackgroundTaskSnapshot {
25
64
  id: string;
26
65
  description?: string;
27
66
  status: string;
28
67
  }
68
+ /** One due reminder. `body` is the inner text — the steerer adds the `<system-reminder>` wrapper (F3). */
29
69
  export interface TurnAttachment {
30
70
  source: AttachmentSource;
31
71
  body: string;
32
72
  }
73
+ /** H4 — the thin projection of a todo list kept run-local (NEVER the wire-capped structuredFrom card).
74
+ * Pure CONTENT memory: the write-window anchor lives on {@link AttachmentState.todoLastWriteTurn}
75
+ * (task #51 F3 — the window resets on tool-call INITIATION, which may precede/outlive any ingest). */
33
76
  export interface ListProjection {
77
+ /** ≤{@link PROJECTION_ITEMS_MAX} items, content clipped to {@link PROJECTION_CONTENT_MAX} chars. */
34
78
  items: Array<{
35
79
  content: string;
36
80
  status: string;
37
81
  }>;
38
82
  }
83
+ /**
84
+ * Run-local mutable producer state, owned by the run loop (one per run, torn down with it). Mutated by
85
+ * {@link reduceToolEnd} (ingest) and {@link collectDueAttachments} (window bookkeeping on fire) — both
86
+ * synchronous and deterministic, so the state stays offline-testable despite the mutation.
87
+ */
39
88
  export interface AttachmentState {
89
+ /** TodoWrite family snapshot; undefined = TodoWrite never used this run (CC still reminds: the
90
+ * gentle "hasn't been used recently" nudge with no list section). */
40
91
  todo?: ListProjection;
92
+ /** Task family (TaskCreate/TaskUpdate/TaskGet/TaskList) — keyed by task id so per-task updates from a
93
+ * PARALLEL tool batch commute (F10: distinct ids reduce to the same map in either completion order). */
41
94
  taskItems?: Map<string, {
42
95
  content: string;
43
96
  status: string;
44
97
  }>;
98
+ /** Cadence-clock value AT the last task WRITE anchor block, INCLUSIVE (task #51 F1 block units — see
99
+ * {@link advanceCadenceClock}). 口径① (CC 198 pretty.js:480254): CC's `qFm` counter resets ONLY on a
100
+ * TaskCreate/TaskUpdate tool_use (`a.name === bD || a.name === hF`) — a TaskGet/TaskList READ is NOT
101
+ * engagement and leaves the 10-unit window running. F3: stamped on tool-call INITIATION (the tool_use
102
+ * block existing in the transcript IS CC's anchor — qFm never checks execution outcome, so a failed or
103
+ * policy-blocked write still resets the window), via {@link stampWriteAnchor} from the message walk. */
45
104
  taskLastWriteTurn?: number;
105
+ /** TodoWrite counterpart of {@link taskLastWriteTurn} (same block coordinate, same initiation-anchor
106
+ * semantics — CC BFm :480217-480219 matches the TodoWrite tool_use block by name only). */
46
107
  todoLastWriteTurn?: number;
47
108
  lastTodoReminderTurn: number;
48
109
  lastTaskReminderTurn: number;
110
+ /** RB-313 — cadence-clock value at the last `ToolSearch` tool_use block (CC 220 `cFy` @608887-608914
111
+ * finds it by BACKWARD transcript scan: `turnsSinceLastToolSearch`). Same INITIATION-anchor semantics
112
+ * as {@link taskLastWriteTurn} — the block existing in the transcript is the anchor, no outcome check.
113
+ * `undefined` = never used this leg, which is the state the reminder exists for (220's scan returns the
114
+ * full transcript length there). */
49
115
  toolSearchLastUseTurn?: number;
116
+ /** RB-313 — cadence-clock value at the last tool_search_usage_reminder emitted (CC 220 `cFy`'s
117
+ * `turnsSinceLastReminder`, found by scanning back for the attachment entry itself). */
50
118
  lastToolSearchReminderTurn: number;
119
+ /** plan_mode attachments emitted so far — drives CC's full/sparse rotation (1st, 6th, 11th… = full).
120
+ * 0 also encodes "never attached": CC always attaches on the FIRST plan-mode boundary, then throttles. */
51
121
  planAttachmentCount: number;
52
122
  lastPlanReminderTurn: number;
123
+ /** changed_files per-path dedup: the last mtime already surfaced for a path — the same (path, mtime)
124
+ * is never reported twice. Evicted alongside readFileState's ENOENT eviction (LOW-9: bounded by it). */
53
125
  surfacedMtime: Map<string, number>;
126
+ /** G1 backgroundTasks (CC /compact parity): SET by the run loop when a compaction LANDS,
127
+ * CONSUMED at the next boundary the collector actually runs (a steered-away boundary carries it
128
+ * forward untouched — the collector is never called there). One-shot: post-compact announce once,
129
+ * never per-boundary nagging. A cap-starved bundle loses this one snapshot (documented trade-off,
130
+ * same class as the truncated changed_files batch): the next compaction re-arms it. */
54
131
  postCompactPending: boolean;
132
+ /** G1 续批 agent_listing (CC `agent_listing_delta`): name → description of the agent types already
133
+ * ANNOUNCED this leg. `undefined` = the initial full-roster announcement is still pending (CC
134
+ * isInitial). Advanced ONLY by {@link commitAgentListing} (run-loop-owned: first-frame delivery and
135
+ * intact cap survival at a boundary — MED-3①). A durable-resume leg is SEEDED by the run loop from
136
+ * the checkpoint's `announcedListings.agents` name-set when present ([c209-C] Q5 — the boundary
137
+ * producer then diffs the CURRENT roster against the seed, so cross-leg roster drift IS
138
+ * delta-announced now that the listing frame is the ONLY roster source); an old checkpoint without
139
+ * the field falls back to the MED-3② transcript probe (seeded as the current entries when a listing
140
+ * reminder is found — drift undetectable there, conservative full re-announce when not found). */
55
141
  announcedAgentTypes?: Map<string, string>;
142
+ /** [c209-C] skills_listing counterpart of {@link announcedAgentTypes}: name → description of the
143
+ * skills already ANNOUNCED this leg. `undefined` = the initial full `<skills>` block is still
144
+ * pending. Advanced ONLY by {@link commitSkillsListing} (same first-frame / intact-cap-survival
145
+ * discipline); resume seeding mirrors the agent arm (checkpoint name-set → drift diff; MED-3②
146
+ * transcript probe fallback). No CC anchor for a skills delta exists (209 ships only the initial
147
+ * full listing) — the delta arm is a mechanism-family derivation from `agent_listing_delta`,
148
+ * registered in cc-divergences. */
56
149
  announcedSkills?: Map<string, string>;
150
+ /** [c209-C] R2 C7 — the model-catalog names last ANNOUNCED to the model (the initial frame's
151
+ * "Models available for the 'model' parameter:" tail, Q4). `undefined` = never announced /
152
+ * unknowable (old checkpoint, transcript-probe seed) — the delta arm then stays silent on models
153
+ * (conservative, pre-C7 behavior). Advanced by {@link commitAgentListing} when the committed
154
+ * frame carried a catalog; a durable-resume leg is seeded from the checkpoint's
155
+ * `announcedListings.models` so a catalog change across a suspend IS re-announced (the drift
156
+ * line rides the first boundary's agent_listing frame). */
57
157
  announcedModels?: readonly string[];
158
+ /** [c209-C] R2 C4② — same-boundary anti-starvation latch: set by {@link collectDueAttachments}
159
+ * when a rendered skills_listing block did NOT survive its own bundle intact (clipped/starved —
160
+ * typically because the higher-priority agent_listing spent the byte budget first), cleared when
161
+ * one survives. While set, the NEXT boundary orders skills_listing BEFORE agent_listing, so two
162
+ * listing frames that cannot share one 8KB bundle alternate to completion instead of the
163
+ * agent frame permanently starving the skills frame (each frame individually fits the cap by
164
+ * construction — agent roster ≤ cap by deployment size, skills block ≤ SKILLS_BLOCK_MAX_BYTES). */
58
165
  skillsListingStarved?: boolean;
59
166
  }
167
+ /**
168
+ * [918] A1-R (codex reopen ①) — the date_change lane's OWN state, deliberately NOT an
169
+ * {@link AttachmentState} member: allocating that for a date-only run would activate the cadence
170
+ * content scan + projection reducers on every non-opted run (the reopen's exact finding). Two
171
+ * fields, zero reducers. `announcedDate` starts at the leg's frozen prefix date; the RUN LOOP
172
+ * commits it (the producer below is pure) — the date block rides ABOVE the 8KB bundle cap as a
173
+ * fixed ~140-byte item, so no clipping face exists and commit-at-append is sound (contrast
174
+ * tools_delta's drain-on-intact, which lives inside the capped bundle).
175
+ */
60
176
  export interface DateChangeState {
61
177
  announcedDate: string;
62
178
  }
179
+ /**
180
+ * [A2] C-4 (design-A §4.2/§4.3) — the instructions_change lane's OWN state, the date_change
181
+ * discipline exactly: deliberately NOT an {@link AttachmentState} member (allocating that would
182
+ * activate the cadence reducers on runs that only carry an instruction snapshot), one field, zero
183
+ * reducers. `lastAnnouncedHash` starts as the snapshot's declared per-path hashes
184
+ * (`ProjectMemoryLoad.instructionSources` — what the model is already seeing) and the RUN LOOP
185
+ * commits it via {@link commitInstructionsChange} when it actually appends the frame (the producer
186
+ * below is pure). The frame rides ABOVE the 8KB bundle cap as a fixed ≤{@link INSTRUCTIONS_CHANGE_BYTE_CAP}
187
+ * item — no clipping face exists, so commit-at-append is sound (the [918] A1-R argument verbatim).
188
+ * `null` value = "announced as removed" (a reappearing file re-announces by hash inequality).
189
+ */
63
190
  export interface InstructionsChangeState {
64
191
  lastAnnouncedHash: Map<string, string | null>;
65
192
  }
193
+ /** [A2] C-4 — hard byte ceiling of one instructions_change frame body (design-A §4.3: fixed small
194
+ * frame riding above the 8KB bundle cap; paths are ellipsis-truncated and overflow files are
195
+ * summarized as a count rather than ever growing the frame). */
66
196
  export declare const INSTRUCTIONS_CHANGE_BYTE_CAP = 512;
197
+ /**
198
+ * `workflow_size_guideline_change` (the third above-cap fixed-frame lane) has NO state interface and
199
+ * no producer here on purpose: its copy is the Workflow tool's own
200
+ * `workflowSizeGuidelineChangeNotice`, and rendering it from this module would put an
201
+ * orchestration dependency on the pure attachment producer layer. Its one-field run-local state and
202
+ * its baseline/live comparison live at the single steerer instead (runtask.ts, next to the
203
+ * date_change and instructions_change lanes it is structurally identical to). The kind is listed in
204
+ * {@link AttachmentSource} because the steer wrapper, the byte accounting and the
205
+ * `steering_injected` echo are all keyed on that wordlist.
206
+ */
67
207
  export declare function createAttachmentState(): AttachmentState;
208
+ /**
209
+ * H4 — thin-projection reducer over a tool's RAW `result.details` (NOT the wire `structuredFrom`
210
+ * projection and its 4×16K caps: a huge todo list must shrink into a bounded snapshot here, never
211
+ * disarm the reminder by being dropped wholesale). Only the first-party discriminants `todo` /
212
+ * `task` / `task-list` are recognized — every other card type (subagent `agent`/`fork`/`task-output`,
213
+ * bash, fs, mcp, …) is structurally ignored, which is also the child-isolation contract: a subagent's
214
+ * own todo state never reaches the parent's onToolEnd, and its delegation-card types don't parse here.
215
+ *
216
+ * task #51 F3 (窗口复位/投影摄入拆分, 复审 confirmed): this reducer is PROJECTION INGEST ONLY — it
217
+ * never touches the write windows. CC's window anchor is the tool_use block's PRESENCE in the
218
+ * transcript (qFm/BFm match the block by name, :480217-480219/:480253-480254, with no execution-
219
+ * outcome check), so the run loop stamps the windows on INITIATION via {@link stampWriteAnchor}
220
+ * (inside {@link advanceCadenceClock}'s message walk); ingest stays success-only — a failed write
221
+ * has no trustworthy `details`, exactly like CC's reminder body rendering from the authoritative
222
+ * store rather than from tool results.
223
+ *
224
+ * Idempotent (same event twice ⇒ same state) and commutative across DISTINCT task ids (F10); two
225
+ * whole-list writes (TodoWrite / TaskList) racing in one batch are last-write-wins by nature — the
226
+ * later list IS the truer snapshot, documented rather than fought.
227
+ */
68
228
  export declare function reduceToolEnd(state: AttachmentState, details: unknown): void;
229
+ /** task #51 F2/F3 — which reminder window a tool_use block resets. Resolved by the run loop (alias-aware:
230
+ * ToolSpec.aliases over the mounted roster; RB-476-A retired-name normalization is gone); the producers
231
+ * here never inspect tool names themselves.
232
+ * RB-313 adds `tool_search`: not a write, but the same INITIATION-anchor mechanism (a `ToolSearch`
233
+ * tool_use block resets that lane's "haven't used it recently" window), so it rides the same walk
234
+ * instead of duplicating the message scan. */
69
235
  export type WriteFamily = "todo" | "task" | "tool_search";
236
+ /**
237
+ * task #51 F3 (发起锚) — reset a write window at the cadence-clock value of the write tool_use block
238
+ * (INCLUSIVE of that block). CC's qFm/BFm anchor is the tool_use block's presence in the transcript
239
+ * (:480217-480219/:480253-480254) with NO execution-outcome check — a failed, policy-blocked, or
240
+ * suspended call still resets the 10-unit window. Callers: {@link advanceCadenceClock}'s message walk
241
+ * (the transcript-anchor moment) and the durable-resume gated-write replay (leg-local clock).
242
+ */
70
243
  export declare function stampWriteAnchor(state: AttachmentState, family: WriteFamily, clock: number): void;
244
+ /**
245
+ * 口径④ cadence clock, task #51 F1 (复审 HIGH, verified against observed CC behavior 2026-07-10) — CC's cadence unit is the
246
+ * per-content-block assistant TRANSCRIPT ENTRY, not the physical turn. CC 198 mints ONE
247
+ * `{type:"assistant"}` entry PER content block: the streaming layer at `content_block_stop`
248
+ * (pretty.js:593011-593038 — `content: pnn([Pr],…)` single-block array, `rn.push` per block) and the
249
+ * `tgf` normalizer (:597284 — `content.map` → one single-block entry each). The reminder counters
250
+ * BFm/qFm (:480210-480226/:480246-480262) then tick `r++`/`o++` once per non-`_or` entry, and `_or`
251
+ * (:599513-599517) applied to a single-block entry degenerates to "is this block thinking/
252
+ * redacted_thinking" — so the 10/10 windows consume ONE unit per NON-THINKING CONTENT BLOCK. A
253
+ * `[text, tool_use]` turn costs 2 units, a parallel-k tool batch costs k(+lead) — live probe
254
+ * (bench/probes/task51-cadence-live, real CC 2.1.198 + stub API): `[text, tool_use]×N` fires the
255
+ * task_reminder at request #7, block-exact, where a turn-level clock predicts #11-12.
256
+ *
257
+ * Applied by the run loop once per completed assistant MESSAGE; returns the advanced clock. CC edge
258
+ * semantics kept verbatim: non-array content → `_or` false → counted as ONE entry; an empty array is
259
+ * vacuously all-thinking (`.every`) → 0. sema folds `redacted_thinking` into `{type:"thinking",
260
+ * redacted:true}` (brain/anthropic.ts B2) so matching "thinking" covers both; the literal
261
+ * "redacted_thinking" arm serves CC-shape inputs. `stats.turns` is untouched — it has unrelated
262
+ * consumers (limits/budget/telemetry) whose physical-turn semantics must not drift.
263
+ *
264
+ * F3 write anchors ride the SAME walk: a toolCall block whose name resolves (alias-aware, F2) to a
265
+ * write family stamps that window at the block's inclusive clock value — CC-exact: same-message
266
+ * leading text blocks sit BEFORE the anchor (they consumed budget but are not part of the
267
+ * since-write distance), later sibling blocks count toward it; the LAST write block wins, matching
268
+ * qFm's tail-first scan.
269
+ */
71
270
  export declare function advanceCadenceClock(state: AttachmentState, clock: number, content: unknown, writeFamilyOf: (toolName: string) => WriteFamily | undefined): number;
271
+ /**
272
+ * task #51 F4 (压缩交互, 复审 confirmed) — rebase every reminder window to the CURRENT cadence clock
273
+ * when a compaction LANDS. CC's windows are recomputed per request by BACKWARD TRANSCRIPT SCAN
274
+ * (BFm/qFm): compaction removes the write tool_use anchors and the reminder attachment entries, so
275
+ * both counters find nothing (t=-1/n=-1) and only count post-compaction entries — the windows
276
+ * effectively RESET, needing another 10 non-thinking entries before the next fire. sema's stateful
277
+ * windows would otherwise survive compaction and fire at the first post-compact boundary where CC
278
+ * stays silent. Setting all four fields to `clock` makes each window measure distance from the
279
+ * compaction point — arithmetic-identical to CC's anchor loss. (If a messagesToKeep-style preserved
280
+ * segment is ever implemented, a recent anchor inside the kept tail would survive in CC — refine
281
+ * this to check the preserved segment then; recorded caveat.)
282
+ */
72
283
  export declare function rebaseCadenceWindows(state: AttachmentState, clock: number): void;
73
284
  export interface AttachmentInputs {
285
+ /** COMPLETED assistant turns at this boundary (`stats.turns`). */
74
286
  turn: number;
287
+ /** 口径④/F1 — the BLOCK-level cadence clock at this boundary: total NON-THINKING content blocks
288
+ * across all completed assistant messages ({@link advanceCadenceClock}, CC per-block transcript
289
+ * entries :593011/:597284 ticked by BFm/qFm :480210-480226/:480246-480262). This is the todo/task
290
+ * reminder-cadence clock — thinking blocks never consume 10/10 budget (`_or` :599513), and a
291
+ * multi-block turn consumes one unit PER block, so the windows run 2-3× faster than physical
292
+ * turns on real transcripts (text+tool_use is the norm). Write anchors ({@link stampWriteAnchor})
293
+ * are stamped in this SAME coordinate. Omitted ⇒ falls back to `turn` (correct only for the
294
+ * degenerate one-non-thinking-block-per-turn transcript). plan_mode keeps `turn` (its cadence is
295
+ * a recorded sema deviation already — assistant turns, not CC human turns). */
75
296
  cadenceTurn?: number;
297
+ /** Whether TodoWrite is mounted (CC gate: no tool ⇒ no reminder, ever). */
76
298
  todoMounted: boolean;
299
+ /** Whether the task-family tools are mounted. Both mounted ⇒ task_reminder wins (CC isTodoV2 branch). */
77
300
  taskListMounted: boolean;
301
+ /** Live plan-mode flag (planModeRef.active). One-way in sema: exit re-prepares the run, so a false
302
+ * here simply stops the producer — no re-entry cycle reset is needed (documented deviation from CC's
303
+ * countPlanModeAttachmentsSinceLastExit, which sema's lifecycle makes unreachable). */
78
304
  planActive: boolean;
305
+ /** SR-3 budget_usd lane (CC 198 `QFm` producer :480424-480428 + renderer :600225; 220 `_Fy` @609096
306
+ * with the mount at @607474): the run's cost progress against its $ ceiling, in USD. Only passed
307
+ * when `config.budgetUsd` opted in AND the task actually carries a ceiling (CC gate
308
+ * `e === void 0 → []` — no `maxBudgetUsd`, no lane). CC computes `used = sy()` (session-cumulative
309
+ * totalCostUSD) and `remaining = total − used`, both raw JS numbers; sema feeds the SAME coordinate
310
+ * its budget gate enforces (`stats.costMicroUsd`/`maxCostMicroUsd`, ÷1e6 → USD) so the model-visible
311
+ * numbers can never disagree with the `limits.max_cost_exceeded` verdict. */
79
312
  budgetUsd?: {
80
313
  used: number;
81
314
  total: number;
82
315
  };
83
316
  config: {
84
317
  todoReminder: boolean;
318
+ /** 口径③ — CC `r2o()` kill-switch parity (pretty.js:479167-479171; consumed by both producers at
319
+ * :480232/:480268 as `if (r2o() === "off") return []`). CC resolves the mode from env
320
+ * `CLAUDE_CODE_TODO_REMINDER_MODE` (highest precedence) else the `tengu_soft_slate_nudge` gate;
321
+ * `"off"` silences BOTH the todo and task reminder lanes even when otherwise wired on, any other
322
+ * value (or absence) = CC `"baseline"` (on). sema keeps env resolution at the deployment shell
323
+ * and carries only the resolved mode here — core reads no env. */
85
324
  todoReminderMode?: "baseline" | "off";
325
+ /** RB-313 — tool_search_usage_reminder lane (opt-in, default OFF; CC 220 mounts it only when the
326
+ * `toolSearchReminder` config resolves non-null, @607450-607456 / `cXi` @185859). */
86
327
  toolSearchReminder?: boolean;
87
328
  changedFiles: boolean;
88
329
  planModeReminder: boolean;
330
+ /** SR-3: budget_usd progressive reminder lane (opt-in, default OFF like every 133 member). CC fires
331
+ * it on EVERY attachment cycle while `maxBudgetUsd` is set; there is NO threshold ladder and no
332
+ * throttle window (QFm/`_Fy` are unconditional) — the "progression" is the numbers advancing with
333
+ * spend. sema mirrors that: one line per collected clean boundary, no window state here; the run
334
+ * loop adds a continuation gate (tool-calling turns only — a boundary steer must never EXTEND a
335
+ * finished run, see runtask's `lastTurnHadToolCalls`).
336
+ *
337
+ * RB-311 — attribution CORRECTED (the previous note claimed "gated `d = !t.agentId` :479177 —
338
+ * subagents never see it", which reads 220 wrong). In 220 the `!agentId` flag gates only the
339
+ * MAIN-AGENT-EXCLUSIVE producer group (`_` @607478-607522: ide_selection / output_style /
340
+ * diagnostics / memory_update / token_usage / output_token_usage). `budget_usd` sits in the SHARED
341
+ * group `g` (@607474) and its ONLY door is `maxBudgetUsd === undefined → []` — so a 220 SUBAGENT
342
+ * whose own options carry a ceiling DOES see the readout. Core裁定: follow 220. There is no
343
+ * agent-identity door in this collector to remove — the lane's reachability is entirely
344
+ * "does this task's spec carry a ceiling and opt in", which is true for a child exactly when the
345
+ * deployment gave it both. Capability位 (what the delegation lane does NOT do): `buildChildSpec`
346
+ * (agents/subagent.ts) propagates neither `maxCostUsd` nor `attachments`, so a child spawned by the
347
+ * delegation tool inherits no ceiling and no opt-in and is silent by construction; a child spawned
348
+ * through a workflow governance baseline (`WorkflowGovernanceBaseline.base`, which explicitly
349
+ * snapshots `maxCostUsd` and every other governance field) reaches the lane. */
89
350
  budgetUsd?: boolean;
351
+ /** G1: post-compact background-task announce (opt-in, default OFF like the 133 members). */
90
352
  backgroundTasks?: boolean;
353
+ /** G1: deferred-tool materialization announce (design/36 setTools delta → boundary notice). */
91
354
  toolsDelta?: boolean;
355
+ /** G1 续批: agent-type roster announce (CC `agent_listing_delta`). [c209-C]: listing-family
356
+ * member — default ON at the TaskSpec layer (the frame is the ONLY roster source since the
357
+ * roster left the tool description), unlike the rest of the 133 family. */
92
358
  agentListing?: boolean;
359
+ /** [c209-C]: skills listing announce (initial `<skills>` block + drift deltas). Listing-family
360
+ * member — default ON at the TaskSpec layer, same rationale as `agentListing`. */
93
361
  skillsListing?: boolean;
362
+ /** G1 续批: MCP server-instruction delta announce (CC `mcp_instructions_delta`). */
94
363
  mcpInstructions?: boolean;
95
364
  };
365
+ /** RB-313 — deferred tools whose schemas the model has NOT loaded yet (design/36: declared but not
366
+ * activated), sorted, snapshotted by the run loop. CC 220's equivalent is
367
+ * `tools.filter(iY(u) && !discovered.has(u.name)).map(name).sort()` (@608934-608938). Only passed
368
+ * when `config.toolSearchReminder` is opted in AND the task actually has deferred tools — an empty
369
+ * or absent list silences the lane permanently (CC `no_undiscovered_tools`, @608939). */
96
370
  undiscoveredTools?: readonly string[];
371
+ /** RB-403 — is the direct-call lane mounted on this run's placeholders (`Prepared.deferDirectCall`,
372
+ * i.e. `TaskSpec.deferSelfResolve` not disabled)? Selects which closing sentence the
373
+ * tool_search_usage_reminder body carries; absent ⇒ the default direct-lane posture, matching the
374
+ * spec field's own default. Meaningless unless `config.toolSearchReminder` is on. */
97
375
  deferDirectCall?: boolean;
376
+ /** Boundary-time scan result (already stat'ed + EPS-filtered by the prepare-task closure). Only
377
+ * passed when `changedFiles` is opted in — OFF must mean zero stat calls upstream. */
98
378
  changedFiles?: ReadonlyArray<{
99
379
  path: string;
100
380
  mtimeMs: number;
101
381
  }>;
382
+ /** G1 backgroundTasks: registry snapshot (pending/running only, filtered by the runtask getter).
383
+ * Only fetched when opted in AND `state.postCompactPending` — OFF means zero registry reads. */
102
384
  backgroundTasks?: ReadonlyArray<BackgroundTaskSnapshot>;
385
+ /** G1 toolsDelta: deferred tools MATERIALIZED since the last announcement (prepare-task's
386
+ * rematerialize diff — already newly-added-only, resume-seeded actives never appear here). The
387
+ * CALLER owns consumption: drain its pending list only when the returned capped bundle actually
388
+ * retained the `tools_delta` block (cap starvation must not lose the announcement forever). */
103
389
  newTools?: readonly string[];
390
+ /** design/168 — `true` when the run materializes statically (activation never swaps the tools
391
+ * block): the tools_delta wording must then not claim "full schemas are loaded". Rides beside
392
+ * `newTools` because it qualifies the same frame. */
104
393
  newToolsStaticFace?: boolean;
394
+ /** design/168 — the subset of `newTools` that the static face could not carry in result text and
395
+ * that materialized into the tools block instead. See {@link renderToolsDelta}. */
105
396
  newToolsSwappedUnderStatic?: readonly string[];
397
+ /** design/168 — the same fact for the READDED arm. See {@link renderToolsDelta}. */
106
398
  readdedToolsSwappedUnderStatic?: readonly string[];
399
+ /** RB-309 — the MCP-driven arms of the SAME tools_delta frame (removed / readded / failed servers).
400
+ * Same pre-diffed input + CALLER-owned intact-survival consumption discipline as `newTools`; only
401
+ * passed when `config.toolsDelta` is opted in. See {@link McpToolsDeltaFacts} for reachability. */
107
402
  mcpToolsDelta?: McpToolsDeltaFacts;
403
+ /** G1 续批 agent_listing: the boundary-time roster snapshot of the mounted delegation tool
404
+ * (prepare-time static in practice; the producer's delta path serves dynamic-registration
405
+ * deployments and tests). Only passed when `config.agentListing` opted in. */
108
406
  agentListing?: ReadonlyArray<AgentListingEntry>;
407
+ /** The delegation tool's mounted name — interpolated into the CC-verbatim headers ("…for the
408
+ * Agent tool:"); byte-identical to CC under the default name "Agent". */
109
409
  agentToolName?: string;
410
+ /** [c209-C] Q4 — model catalog names for the agent_listing INITIAL frame's trailing
411
+ * "Models available for the 'model' parameter:" line (no CC anchor — CC's model face is a static
412
+ * tier enum; sema's catalog is deployment-dynamic, so the names ride the same frame the roster
413
+ * does instead of the tool description's cached prefix). [c209-C] R2 C7: a delta frame re-carries
414
+ * the full line ONLY on catalog drift against the KNOWN announced catalog
415
+ * ({@link AttachmentState.announcedModels}, checkpoint-seeded across legs); otherwise the
416
+ * execute-time unknown-model error text remains the fallback disclosure (design/C §2.2). */
110
417
  agentModels?: readonly string[];
418
+ /** [c209-C] skills_listing: the boundary-time skills snapshot (prepare-time static in practice —
419
+ * the delta path serves dynamic-installation deployments and tests, same posture as
420
+ * `agentListing`). Only passed when `config.skillsListing` is on. */
111
421
  skillsListing?: ReadonlyArray<SkillListingEntry>;
422
+ /** G1 续批 mcp_instructions: pending deltas snapshotted from `MaterializedMcp.instructionsDelta`.
423
+ * CALLER-owned consumption on intact cap survival (same `newTools` discipline). */
112
424
  mcpInstructions?: {
113
425
  added: ReadonlyArray<{
114
426
  server: string;
@@ -116,12 +428,88 @@ export interface AttachmentInputs {
116
428
  }>;
117
429
  removed: readonly string[];
118
430
  };
431
+ /** [cc216] mcp_dropped_tools: intake-dropped MCP tools snapshotted from
432
+ * `MaterializedMcp.droppedTools` (rides the `mcpInstructions` opt-in — same MCP announce lane).
433
+ * CALLER-owned consumption on intact cap survival (same `newTools` discipline). Tool names are
434
+ * pre-neutralized at the mcp.ts producer; reasons are core-authored. */
119
435
  mcpDroppedTools?: ReadonlyArray<McpDroppedTool>;
120
436
  }
437
+ /**
438
+ * Compute every reminder due at this clean turn boundary. Pure decision + render — no I/O; the only
439
+ * mutation is the window bookkeeping on the state the caller owns (reminder turns, surfacedMtime),
440
+ * done HERE because the caller only invokes this once per boundary after its injection gate passed —
441
+ * splitting "decide" from "mark sent" would just invite a drift between the two.
442
+ *
443
+ * Returns attachments in EVIDENCE-STRENGTH order (todo/task → plan_mode → budget_usd →
444
+ * background_tasks → tools_delta → agent_listing → skills_listing → mcp_instructions → changed_files), which is also the §R3 MED-6
445
+ * truncation order read backwards: under the 8KB cap changed_files is sacrificed first, the todo/task
446
+ * list last. The G1/续批 members are registry/engine ground truth (strong), but the
447
+ * todo/plan lane keeps priority: it carries the run's own work-tracking state, which the model can
448
+ * least afford to lose.
449
+ */
121
450
  export declare function collectDueAttachments(state: AttachmentState, inp: AttachmentInputs): readonly TurnAttachment[];
451
+ /**
452
+ * RB-313 — CC 2.1.220 (@626269-626280, the `tool_search_usage_reminder` renderer), with the two
453
+ * interpolations resolved: the name list (+ `(+N more)` tail when the census exceeds
454
+ * {@link TOOL_SEARCH_REMINDER_CONFIG}.MAX_NAMES) and the ToolSearch tool's mounted name — sema mounts
455
+ * the same name. The quoted `select:<name>[,<name>...]` form is also sema's real ToolSearch contract
456
+ * (tool-disclosure.ts's `select:` prefix parser), so the copy stays true rather than merely quoted.
457
+ *
458
+ * ONE sema amendment, the same one DD-5 already applied to the sibling ToolSearch description: the
459
+ * closing sentence is POSTURE-AWARE rather than an absolute failure promise. With the RB-403
460
+ * direct-call lane mounted — the default (`TaskSpec.deferSelfResolve` not disabled) — a call on a
461
+ * still-deferred tool whose arguments match the real schema EXECUTES and activates it, so "calling a
462
+ * tool before its schema is loaded will fail" is false for that posture. This face must not assert an
463
+ * execution gate the engine does not implement; the steer stays pessimistic on purpose (activate
464
+ * rather than guess — inventing arguments for an unseen schema is the real failure) but is phrased as
465
+ * the reason it is true. The `deferSelfResolve: false` posture keeps the absolute wording, which is
466
+ * exactly true for it.
467
+ */
122
468
  export declare function renderToolSearchUsageReminder(undiscovered: readonly string[], directCallEnabled?: boolean): string;
469
+ /**
470
+ * SR-3 — CC 2.1.198 VERBATIM template (bundle pretty.js:600225, the `budget_usd` attachment renderer):
471
+ * `USD budget: $${used}/$${total}; $${remaining} remaining`
472
+ * `remaining = total − used` is computed producer-side in CC (QFm :480427 `n = e - t`) and re-derived
473
+ * here from the two inputs — one fewer number to drift. CC interpolates RAW JS numbers (sy() is a
474
+ * float accumulator; no rounding anywhere in QFm or the renderer), kept verbatim: sema's inputs come
475
+ * from integer micro-USD ÷ 1e6, so they render with ≤6 decimals by construction.
476
+ */
477
+ /** [915] A1 — CC messages.ts:4162 verbatim shape (de-branded is a no-op here: the text is neutral). */
123
478
  export declare function renderDateChange(newDate: string): string;
479
+ /**
480
+ * [918] A1-R — the date_change producer (CC attachments.ts:1400-1443 parity): the system-prefix
481
+ * date is FROZEN for the leg (upstream: "cached for the duration of the conversation" — re-rendering
482
+ * the prefix at midnight costs ~920K effective tokens per overnight session, upstream's own comment);
483
+ * when the boundary-time LOCAL date walks away from the last announced one, the model is told at the
484
+ * TAIL instead. String INEQUALITY (backward NTP jumps announce too). PURE — the caller commits
485
+ * `state.announcedDate = today` when it actually appends the attachment (see {@link DateChangeState}).
486
+ */
124
487
  export declare function collectDateChange(state: DateChangeState, today: string): TurnAttachment | undefined;
488
+ /**
489
+ * [A2] C-4 — the instructions_change producer (design-A §4.3): the project-instruction snapshot is
490
+ * FROZEN for the session (§4.1); when the deployment probe reports a file hash that walked away from
491
+ * the last ANNOUNCED one, the model is told at the tail — it can Read the truth on demand (the
492
+ * seeded-read dedup disarms on a changed file, §4.4, so the Read returns the real new content).
493
+ *
494
+ * PURE — same split as {@link collectDateChange}: the caller commits via
495
+ * {@link commitInstructionsChange} when it actually appends the frame (append-⇔-commit holds because
496
+ * the frame rides ABOVE the byte-capped bundle). Rules:
497
+ * - `probed === null` ⇒ the probe declined this boundary (remote cwd / EACCES / transient IO):
498
+ * silent skip, nothing committed, next boundary retries.
499
+ * - string INEQUALITY against the last announced hash triggers (a rollback to an old value is also
500
+ * a change — the date lane's same rule); the SAME value never announces twice (终身一次).
501
+ * - `contentHash: null` = the file is GONE — announced once as removed (`hash → absent`);
502
+ * a reappearing file re-announces by inequality against the committed `null`.
503
+ * - probed paths the snapshot never declared are ignored (the deployment owns the file-name policy;
504
+ * core only compares against the declared baseline).
505
+ * - the frame body is HARD-BOUNDED to {@link INSTRUCTIONS_CHANGE_BYTE_CAP}: paths are
506
+ * ellipsis-truncated, and files that don't fit are summarized as `(+N more…)` — those stay
507
+ * UNCOMMITTED (absent from `announced`) and re-announce at the next boundary.
508
+ * - multi-file changes merge into ONE frame, one line per file (§4.3).
509
+ *
510
+ * Returns the frame plus the `announced` entries that actually rode it (the caller's commit set),
511
+ * or `undefined` when nothing is due.
512
+ */
125
513
  export declare function collectInstructionsChange(state: InstructionsChangeState, probed: ReadonlyArray<{
126
514
  path: string;
127
515
  contentHash: string | null;
@@ -132,56 +520,302 @@ export declare function collectInstructionsChange(state: InstructionsChangeState
132
520
  contentHash: string | null;
133
521
  }>;
134
522
  } | undefined;
523
+ /** [A2] C-4 — the run loop's commit half (append-⇔-commit, {@link InstructionsChangeState}): advance
524
+ * the per-path last-announced hashes for exactly the entries that rode the appended frame. */
135
525
  export declare function commitInstructionsChange(state: InstructionsChangeState, announced: ReadonlyArray<{
136
526
  path: string;
137
527
  contentHash: string | null;
138
528
  }>): void;
139
529
  export declare function renderBudgetUsd(used: number, total: number): string;
530
+ /**
531
+ * SR-7 — CC 2.1.198 VERBATIM inner text (bundle pretty.js:698391-698398, `F6c`): the aggregated
532
+ * orphaned-background-task notice a restarted/resumed leg injects ONCE (CC's own `<system-reminder>`
533
+ * wrapper is added by the caller — sema's single-wrap-point discipline, F3). Line shape CC-exact:
534
+ * `- ${description || "(no description)"} (task ${id})` — `||` kept (an EMPTY description also reads
535
+ * "(no description)", CC-same). Consumed by the runtask durable-resume path, NOT a boundary producer:
536
+ * the trigger is the resume itself (CC gate `CLAUDE_CODE_RESUME_INTERRUPTED_TURN`, :707384), not a
537
+ * cadence window.
538
+ */
140
539
  export declare function renderOrphanedBackgroundTasks(tasks: ReadonlyArray<{
141
540
  id: string;
142
541
  description?: string;
143
542
  }>): string;
543
+ /**
544
+ * RB-309 — CC's per-frame list cap for the `deferred_tools_delta` arms (`lP`, pretty220.js:518269).
545
+ * Lists longer than this collapse to a grouped one-liner + "…and N more".
546
+ */
144
547
  export declare const TOOLS_DELTA_LIST_MAX = 30;
548
+ /** RB-309 — the MCP-driven arms of the deferred-tools announce. All fields are pre-diffed by the
549
+ * producer (prepare-task's `rematerialize` seam / the materialize-time failed-server projection) and
550
+ * are CALLER-drained on intact cap survival, exactly like {@link AttachmentInputs.newTools}. */
145
551
  export interface McpToolsDeltaFacts {
552
+ /** Previously-announced deferred tools that LEFT the harness roster (their server withdrew them —
553
+ * reached through RefreshMcpTools's prefix re-splice). CC `removedNames` @626530. */
146
554
  removed?: readonly string[];
555
+ /** Previously-announced-then-withdrawn deferred tools that came BACK. CC `readdedNames` @626525. */
147
556
  readded?: readonly string[];
557
+ /** Declared MCP servers that failed to connect at materialize (`MaterializedMcp.statuses`, status
558
+ * `"failed"`). `error` is REMOTE/transport text — the producer neutralizes + bounds it at intake.
559
+ * CC `failedMcpServers` @626561. */
148
560
  failedServers?: ReadonlyArray<{
149
561
  name: string;
150
562
  error?: string;
151
563
  }>;
152
564
  }
565
+ /**
566
+ * G1 — deferred-tool materialization announce (design/36 boundary notice). CC 2.1.198 template
567
+ * (bundle pretty.js:599148, `deferred_tools_delta` case) verbatim reads: "The following deferred
568
+ * tools are now available via ${ToolSearch}. Their schemas are NOT loaded — calling them directly
569
+ * will fail with InputValidationError. Use ${ToolSearch} with query \"select:<name>[,...]\" to load
570
+ * tool schemas before calling them:" — but CC announces DISCOVERABLE tools (schemas still deferred),
571
+ * while sema announces MATERIALIZED tools (tool_search already ran setTools; schemas ARE live), so
572
+ * the middle clause is inverted to match sema's actual contract. Same CC shape: lead sentence +
573
+ * name list.
574
+ *
575
+ * RB-309 — CC 2.1.220 (`deferred_tools_delta`, pretty220.js:626512-626600) carries SIX arms; sema
576
+ * shipped only the `added` one. The arms below are the ones whose STATE IS REACHABLE in this engine
577
+ * (data-side audit, RB-309):
578
+ * - `readded` (@626525) / `removed` (@626530): reachable via RefreshMcpTools — the refresh splices a
579
+ * server's whole `mcp__<server>__` prefix domain out of the live tool array and pushes the fresh
580
+ * listing back, so a withdrawn tool genuinely leaves (and a re-advertised one genuinely returns)
581
+ * the roster mid-task. CC's trailing "Load via ToolSearch as before" / "Do not search for them —
582
+ * ToolSearch will return no match" clauses are kept, because sema mounts the SAME ToolSearch name.
583
+ * - `failed` (@626561): reachable from `MaterializedMcp.statuses` (`status: "failed"`, fail-open
584
+ * connect skip). CC additionally splits a MANAGED-POLICY sub-arm off this list (`jlr`/`Oy_` error
585
+ * codes @626575) — sema has no managed-policy error taxonomy, so only the connection-failure form
586
+ * is rendered.
587
+ * DELIBERATELY ABSENT (state unreachable — announcing them would be a §25 honesty breach):
588
+ * - `needs-auth` (@626543): sema's MCP auth surface is STATIC deployment-supplied headers
589
+ * (`McpServerSpec.transport.headers` / `principalHeader`) with no OAuth flow and no
590
+ * authorization-required status — an auth rejection surfaces as an ordinary connect failure and is
591
+ * covered by the `failed` arm above.
592
+ * - `pending` (@626586): `materializeMcpTools` is fully AWAITED inside prepareTask (one
593
+ * `Promise.allSettled` over every server) before the run loop's first turn, so "still connecting"
594
+ * does not exist at any turn boundary — `McpServerStatus.status` is `connected | failed` only.
595
+ * Returns `undefined` when every arm is empty (CC `i.length === 0 → []`).
596
+ */
153
597
  export declare function renderToolsDelta(input: {
154
598
  added?: readonly string[];
155
599
  staticFace?: boolean;
600
+ /** design/168 — the subset of `added` that the STATIC face could not carry and that therefore
601
+ * materialized into the tools block instead (a declaration too large to inline in result text,
602
+ * or one that does not serialize; see the per-tool exemption in prepare-task). Empty/absent on
603
+ * every ordinary static run, which keeps the common frame byte-identical; when it is non-empty
604
+ * the static wording below would otherwise assert compact placeholders for a name the model can
605
+ * see carries a full schema. Meaningless unless `staticFace` is true. */
156
606
  swappedUnderStatic?: readonly string[];
607
+ /** The same exemption fact for the READDED arm (a name announced earlier, withdrawn, and now back).
608
+ * The exemption is sticky within a leg, so a tool that was ever exempt is remounted with its full
609
+ * declaration on readdition — and the readded wording, like the added wording, would otherwise
610
+ * assert compact placeholders the model can see are not there. */
157
611
  readdedSwappedUnderStatic?: readonly string[];
158
612
  } & McpToolsDeltaFacts): string | undefined;
613
+ /** RB-312③ — the `(Tools: …)` value for an entry that precomputed none (CC 220 `WW_`'s terminal arm
614
+ * @465662: no allowlist and no denylist ⇒ the literal "All tools"). */
159
615
  export declare const AGENT_TOOLS_NOTE_DEFAULT = "All tools";
616
+ /** CC 2.1.198 verbatim (bundle pretty.js:599221, `agent_listing_delta` isInitial+showConcurrencyNote arm). */
160
617
  export declare const AGENT_CONCURRENCY_NOTE = "When you launch multiple agents for independent work, send them in a single message with multiple tool uses so they run concurrently.";
618
+ /** CC-verbatim ambient-context tail (CC 2.1.198 `Emr`, pretty.js:599992 — resolved by the 2026-07-10
619
+ * parity spot audit, PARITY-SPOT-AGENT-TYPES F5 / PARITY-SPOT-REMINDERS SR-V1). CC appends it after BOTH
620
+ * removal lists (agent types :599211, mcp instructions :599240) so the model treats the drift notice as
621
+ * background, not something to announce. */
161
622
  export declare const AMBIENT_CONTEXT_NOTE = "This is ambient context \u2014 do not narrate it to the user unless they ask or it is directly relevant to their request.";
623
+ /** CC-verbatim initial-roster header (interpolated tool name) — single-sourced here for the renderer
624
+ * AND the run loop's resume transcript probe (MED-3②: "was the listing ever delivered?"). */
162
625
  export declare function agentListingInitialHeader(toolName: string): string;
626
+ /**
627
+ * [clay session-dedup, codex F1] Rebuild the EXACT announced name-set by replaying every listing
628
+ * frame in a transcript, in order: an initial frame RESETS the set to its names, a delta frame ADDS,
629
+ * a removal frame DELETES. Header-presence alone is NOT a safe seed (it proves "announced once", not
630
+ * WHAT was announced — seeding the current entries would swallow the A→A+B delta and removal-to-zero
631
+ * on ordinary session continuations). Single-sourced next to the renderers so a frame-shape change
632
+ * cannot desync the parser. Returns undefined when NO frame exists (fresh session — announce fully).
633
+ */
163
634
  export declare function replayAnnouncedListing(texts: readonly string[], headers: {
164
635
  initial: string;
165
636
  delta: string;
166
637
  removed: string;
167
638
  }): Set<string> | undefined;
639
+ /** Removal-frame header for the agent-type roster (single-sourced for renderer + replay parser). */
168
640
  export declare const AGENT_LISTING_REMOVED_HEADER = "The following agent types are no longer available:";
641
+ /** CC-verbatim roster-drift header — same single-source rationale as {@link agentListingInitialHeader}. */
169
642
  export declare function agentListingDeltaHeader(toolName: string): string;
643
+ /**
644
+ * G1 续批 — agent-type roster announce (CC 2.1.198 `agent_listing_delta`, bundle pretty.js:599199-599223,
645
+ * headers VERBATIM with the tool name interpolated — byte-identical to CC under the default "Agent").
646
+ * First call (no announced map) = CC `isInitial`: full roster under "Available agent types…", plus the
647
+ * concurrency note when more than one type is offered. Later
648
+ * calls announce only drift: adds under "New agent types are now available…", removals under "The
649
+ * following agent types are no longer available:" + `- <name>` lines, followed by the CC-verbatim
650
+ * {@link AMBIENT_CONTEXT_NOTE} (CC `Emr`, pretty.js:599211/599992). Name-keyed like CC: a description
651
+ * change on an existing name is not re-announced. Every line carries a `(Tools: …)` tail (RB-312③,
652
+ * 220 `fvd`/`WW_` @465651-465668 — the model needs each type's tool boundary to pick a type;
653
+ * PARITY-SPOT-AGENT-TYPES F3), defaulted to {@link AGENT_TOOLS_NOTE_DEFAULT} when the entry precomputed none.
654
+ *
655
+ * RB-312① — showConcurrencyNote, honest attribution: `entries.length > 1` is a sema APPROXIMATION, not
656
+ * CC semantics. 220's real predicate (@607882) is `Aa() !== "pro" && Cq() === "default"` — subscription
657
+ * tier is not "pro" AND the output style is the default one. Neither axis exists in core (BYOM has no
658
+ * subscription plane; there is no output-style plane at all), so the predicate is untranslatable, and
659
+ * 220's intent — "show the parallel-launch hint to users who have not already been told it elsewhere" —
660
+ * has no sema carrier either. The roster-size proxy is kept because it is the one honest thing core can
661
+ * say: a single-type roster cannot be launched concurrently with a different type, so the note would be
662
+ * noise. RESIDUAL (divergences candidate): under a >1 roster sema shows the note where 220 would hide it
663
+ * for a pro/non-default-style user.
664
+ *
665
+ * RB-312② — added/removed ordering: adds are sorted by `localeCompare` and removals by the default
666
+ * `sort()`, exactly as 220 does at @607873 (`c.sort((p,f) => p.agentType.localeCompare(f.agentType)), u.sort()`).
667
+ * This is not cosmetic here: the announced-set advance ({@link commitAgentListing}) is gated on the
668
+ * rendered block surviving the capped bundle BYTE-IDENTICAL against a re-render, so a deployment that
669
+ * merely reorders its declarations between two boundaries used to mint a different byte string for the
670
+ * same content. Sorting makes the frame a function of the SET, which is what that predicate assumes.
671
+ * SCOPED to the DRIFT arms (recorded residual): 220's `c.sort` also covers the isInitial roster, but
672
+ * sema's initial order is CURATED and load-bearing — general-purpose first (the type that is always
673
+ * pickable), the deployment's definitions in declared order, `fork` last — and that curation carries
674
+ * information an alphabetical sort would destroy. The initial frame renders one array once, so it has
675
+ * no re-render byte-identity exposure of its own.
676
+ *
677
+ * 1.256 复审 MED-3①: PURE — never mutates `state`. The announced-set advance is CALLER-owned via
678
+ * {@link commitAgentListing}, committed ONLY when the rendered block survived the byte cap INTACT
679
+ * (tools_delta/mcp_instructions discipline — a cap-clipped/dropped block previously advanced the
680
+ * announced map anyway, losing the roster announcement forever).
681
+ */
170
682
  export declare function renderAgentListingDelta(state: AttachmentState, entries: ReadonlyArray<AgentListingEntry>, toolName: string, models?: readonly string[]): string | undefined;
683
+ /** [c209-C] R2 C7 — the Q4 catalog line, single-sourced for the initial frame's tail AND the
684
+ * drift re-announce arm so the two can never diverge byte-wise. [c209-C] codex 收口 C7 补口: an
685
+ * EMPTY catalog renders an honest "(none)" — reachable only from the DRIFT arm (a known announced
686
+ * catalog shrank to nothing; the initial frame still omits the line when there is nothing to offer). */
687
+ /** Single-sourced carrier prefix of the model-catalog line (renderer + replay parser). */
171
688
  export declare const MODELS_AVAILABLE_PREFIX = "Models available for the 'model' parameter: ";
689
+ /** [codex S3 round 3] Replay the ANNOUNCED model catalog from stamped transcript texts — the last
690
+ * carried "Models available…" line wins (the line is re-carried in full on every drift, [c209-C]
691
+ * C7). Undefined = the catalog was never carried (unknowable — the drift compare stays silent,
692
+ * same conservative arm as an old checkpoint). */
172
693
  export declare function replayAnnouncedModels(texts: readonly string[]): readonly string[] | undefined;
694
+ /**
695
+ * MED-3① commit half of {@link renderAgentListingDelta}: mark the CURRENT roster as announced. The run
696
+ * loop calls this only when the `agent_listing` block survived the capped bundle INTACT (body equality
697
+ * against a re-render — same predicate as the tools_delta drain); a clipped/dropped block leaves the
698
+ * announced map untouched so the next quiet boundary re-announces. Snapshotting `entries` wholesale is
699
+ * equivalent to add/remove bookkeeping (the diff is name-keyed; descriptions are never re-diffed).
700
+ */
173
701
  export declare function commitAgentListing(state: AttachmentState, entries: ReadonlyArray<AgentListingEntry>, models?: readonly string[]): void;
702
+ /** [c209-C] skills drift-frame header — single-sourced for the renderer AND the run loop's resume
703
+ * transcript probe (MED-3② skills arm). Phrasing mirrors {@link agentListingDeltaHeader} (no CC
704
+ * anchor for a skills delta — mechanism-family derivation, registered in cc-divergences). */
174
705
  export declare const SKILLS_LISTING_DELTA_HEADER = "New skills are now available:";
706
+ /** [c209-C] skills removal-arm header — mirrors the agent-listing removal arm's phrasing. */
175
707
  export declare const SKILLS_LISTING_REMOVED_HEADER = "The following skills are no longer available:";
708
+ /**
709
+ * [c209-C] skills_listing producer — the skills counterpart of {@link renderAgentListingDelta}.
710
+ * First call (no announced map) = the full `<skills>` disclosure block VERBATIM (buildSkillsBlock —
711
+ * the exact bytes that used to sit in the stable system prompt now ride the reminder lane; CC 209
712
+ * classic ships its skills listing the same way, as a first-user-turn reminder ~5.9KB, report §5.1).
713
+ * Later calls announce only drift, name-keyed like the agent arm: adds under
714
+ * {@link SKILLS_LISTING_DELTA_HEADER} with the SAME `- name: description` line shape the block uses,
715
+ * removals under {@link SKILLS_LISTING_REMOVED_HEADER} + `- <name>` lines, followed by the
716
+ * CC-verbatim {@link AMBIENT_CONTEXT_NOTE} (agent-removal-arm parity). A description change on an
717
+ * existing name is not re-announced (name-keyed, agent-arm parity).
718
+ *
719
+ * MED-3① discipline: PURE — the announced-set advance is CALLER-owned via {@link commitSkillsListing},
720
+ * committed only on first-frame delivery or intact cap survival at a boundary.
721
+ */
176
722
  export declare function renderSkillsListingDelta(state: AttachmentState, entries: ReadonlyArray<SkillListingEntry>): string | undefined;
723
+ /** [c209-C] commit half of {@link renderSkillsListingDelta} — same MED-3① contract as
724
+ * {@link commitAgentListing}: called by the run loop only on first-frame delivery or when the
725
+ * `skills_listing` block survived the capped bundle INTACT; a clipped/dropped block leaves the
726
+ * announced map untouched so the next quiet boundary re-announces. */
177
727
  export declare function commitSkillsListing(state: AttachmentState, entries: ReadonlyArray<SkillListingEntry>): void;
728
+ /**
729
+ * RB-308 — per-server bound (in CODE POINTS, matching every other clipper in `untrusted-text.ts`) on
730
+ * ONE MCP server's `instructions` text. The text is SERVER-controlled and UNBOUNDED on the wire: the
731
+ * bundle byte cap ({@link ATTACHMENT_BYTE_CAP}) is a per-frame structural backstop on the delta lane
732
+ * and does not exist AT ALL on the stable system-prompt lane, so without this a single server could
733
+ * pin an arbitrarily large blob into the cached prompt prefix for the whole task (and, on the delta
734
+ * lane, wedge the frame permanently against the 8KB cap — the codex 1362 F2 failure shape).
735
+ * Sized at the delta lane's own order of magnitude (the 8KB frame budget), leaving fence + header
736
+ * room under the bundle cap once the "…" truncation marker lands.
737
+ */
178
738
  export declare const MCP_INSTRUCTIONS_MAX_CHARS: number;
739
+ /**
740
+ * RB-308 — the ONE way MCP server-provided instruction text becomes model-facing, used by BOTH the
741
+ * stable system-prompt lane (prepare-task's `# MCP Server Instructions` block, design/64 §17.3) and
742
+ * the boundary delta lane ({@link renderMcpInstructionsDelta}).
743
+ *
744
+ * The bug this closes: the same server-authored string was carried with TWO DIFFERENT trust postures
745
+ * — fenced on the delta lane, RAW-INTERPOLATED (no fence, no bound) into the stable prompt. A single
746
+ * source makes the divergence unrepresentable.
747
+ *
748
+ * Truncation is DISCLOSED (§25 honesty): `delimitUntrusted` clips silently with an ellipsis, which
749
+ * reads to the model as the server's own text. The trailing note lives OUTSIDE the fence, on a
750
+ * trusted line, so the model can tell "the server said less" from "we cut it". The over-length test
751
+ * mirrors `delimitUntrusted`'s own internal condition exactly (both transforms are idempotent, so
752
+ * re-running them here is a no-op and cannot drift from the clip actually applied).
753
+ */
179
754
  export declare function fenceMcpServerInstructions(server: string, text: string): string;
755
+ /**
756
+ * G1 续批 — MCP server-instruction delta (CC 2.1.198 `mcp_instructions_delta`, bundle
757
+ * pretty.js:599225-599248, headers VERBATIM). Deliberate CC deviations (recorded):
758
+ * - added instruction text is UNTRUSTED server-controlled text → each block rides inside a
759
+ * `delimitUntrusted` fence (CC injects the raw block; sema's external-inlet posture is fencing —
760
+ * the text is additionally already `sanitizeUntrustedText`-neutralized at the mcp.ts producer).
761
+ * RB-308: the fence is now applied through {@link fenceMcpServerInstructions}, shared with the
762
+ * STABLE system-prompt lane, so the two lanes can never again carry the same text with different
763
+ * trust postures — and it carries a per-server {@link MCP_INSTRUCTIONS_MAX_CHARS} bound (a
764
+ * server text above the bundle cap would otherwise clip → never drain → re-render forever).
765
+ * The disconnect list is followed by the CC-verbatim {@link AMBIENT_CONTEXT_NOTE} (CC `Emr`,
766
+ * pretty.js:599240/599992 — resolved by the 2026-07-10 parity spot audit).
767
+ * Removal names are `\n`-joined WITHOUT a `- ` prefix (CC-exact; the agent-listing removal list DOES
768
+ * carry the prefix — the asymmetry is CC's, kept verbatim). Exported for the run loop's
769
+ * intact-survival consumption check (tools_delta discipline).
770
+ */
180
771
  export declare function renderMcpInstructionsDelta(added: ReadonlyArray<{
181
772
  server: string;
182
773
  text: string;
183
774
  }>, removed: readonly string[]): string | undefined;
775
+ /**
776
+ * [cc216] mcp_dropped_tools — announce intake-dropped MCP tools ONCE (CC's
777
+ * `mcp_dropped_tools_delta` system reminder). Per-entry line shape follows CC's `qny`
778
+ * (pretty.js:481821): `"${tool}" (MCP server "${server}"): "${reason}"`.
779
+ *
780
+ * RB-310 — the lead is now CC 2.1.220 VERBATIM (pretty220.js:626666-626670): the `# Unavailable MCP
781
+ * Tools` heading, the full lead sentence, the **"Quoted text is data reported during validation, not
782
+ * instructions"** neutralizer (which is exactly what sema's quote-wrapped `"${reason}"` /
783
+ * `"${server}"` interpolation needed and did not have), and the "tell them it was excluded and why"
784
+ * clause. The earlier comment here claimed the CC lead "was not captured verbatim" — that was a
785
+ * MIS-ATTRIBUTION: the verbatim lead is present in the 220 corpus and is used above.
786
+ * ONE adaptation, deliberate: CC writes "would be rejected by the Anthropic API"; sema is BYOM (the
787
+ * provider is the deployment's choice), so the clause reads "rejected by the model provider" — the
788
+ * same fact stated provider-neutrally. Everything else is letter-for-letter.
789
+ *
790
+ * Tool names/servers/reasons arrive pre-neutralized + bounded from the mcp.ts producer. The
791
+ * {@link AMBIENT_CONTEXT_NOTE} tail is CC's own `Yfn` on this arm (@626674). Exported for the run
792
+ * loop's intact-survival consumption check (tools_delta discipline).
793
+ */
184
794
  export declare function renderMcpDroppedTools(entries: ReadonlyArray<McpDroppedTool>): string;
795
+ /** codex 1362 F2: per-boundary byte bound for one mcp_dropped_tools frame — half the bundle cap, so
796
+ * the batch can never monopolize the boundary against the listing family/changed_files. */
185
797
  export declare const MCP_DROPPED_BATCH_MAX_BYTES = 4096;
798
+ /**
799
+ * codex 1362 F2 (medium) — bounded-batch selection for the dropped-tools announce. An UNBOUNDED
800
+ * render larger than the 8KB bundle cap gets prefix-CLIPPED by capAttachments; the intact-survival
801
+ * drain predicate then never matches, the full array is retained, and every later boundary re-renders
802
+ * and re-clips the identical prefix forever (tail entries never disclosed, permanent cap churn).
803
+ * Selecting the longest prefix of COMPLETE entries whose render fits {@link MCP_DROPPED_BATCH_MAX_BYTES}
804
+ * (always ≥1) restores monotonic drainage: the run loop splices exactly the delivered batch, the
805
+ * tail rides later boundaries. Pure/deterministic so the drain predicate can re-derive the exact
806
+ * snapshot. codex r2 F3: the ≥1 floor is SAFE only because entries are bounded at the mcp.ts
807
+ * producer (tool ≤160 cps, reason ≤240 cps, both single-lined) — one rendered entry is always a
808
+ * few hundred bytes, far under both this bound and the 8KB bundle cap, so the single-entry frame
809
+ * can never be cap-clipped into a permanent re-render wedge.
810
+ */
186
811
  export declare function selectMcpDroppedBatch<T extends McpDroppedTool>(entries: ReadonlyArray<T>): T[];
812
+ /**
813
+ * Largest prefix of `s` that fits `maxBytes` UTF-8 bytes (binary search — never splits the budget math).
814
+ *
815
+ * REF-B5 (car R11): the ONE byte-budget prefix search in the runner. runtask.ts's batch-context clip
816
+ * (design/134 §3.1b) used to carry a hand-copied twin whose doc claimed this module "doesn't export
817
+ * it" — that layering argument died once runtask started importing {@link ATTACHMENT_BYTE_CAP} from
818
+ * here, so the budget CONSTANT and the budget MATH now come from the same place. Producer-layer purity
819
+ * is unchanged: this is a pure function of (string, number).
820
+ */
187
821
  export declare function clipToBytes(s: string, maxBytes: number): string;