@sema-agent/core 7.55.0 → 7.57.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 (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. package/wire-changes/primitives@7.57.0.json +245 -0
package/dist/core/mcp.js CHANGED
@@ -1,10 +1,10 @@
1
- import { egressText } from "./untrusted-egress.js";
2
1
  import { __resetEnvKnobAnnouncements } from "./env-knob-announce.js";
3
2
  import { resolveEnvBudget } from "./env-budget.js";
4
3
  import { MCP_NAMESPACE } from "./protocol-table.js";
5
- import { resolveProtocolHttpHeaders } from "./protocol-http-auth.js";
4
+ import { declaredHeaderValues, remoteWords, resolveProtocolHttpHeaders } from "./protocol-http-auth.js";
6
5
  import { disposeSectionEntry, sectionAnswerWarning } from "./prompt-section-seat.js";
7
- import { findNamespacePrefixCollision, mintNamespacePrefix, mintNamespacedToolName, normalizeNameSegment } from "./protocol-naming.js";
6
+ import { createToolNameClaims, mintNamespacePrefix, normalizeNameSegment } from "./protocol-naming.js";
7
+ import { mcpToolDropReason, refuseCollidingMcpServerNames } from "./mcp-name-judge.js";
8
8
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
9
9
  import { McpConnectionPool } from "./mcp-connection-pool.js";
10
10
  import { SessionEndingTransport, requestSite } from "./mcp-session-end.js";
@@ -22,6 +22,7 @@ import { DEFAULT_REQUEST_TIMEOUT_MSEC } from "@modelcontextprotocol/sdk/shared/p
22
22
  import { MCP_IMAGE_MAX_BASE64, sharpImageResizer } from "./image-downsample.js";
23
23
  import { sliceHeadSafe, sliceTailSafe } from "./surrogate-safe-slice.js";
24
24
  import { truncateError } from "./tool-errors.js";
25
+ import { peerRequestRefusal } from "./host-floor.js";
25
26
  import { delimitUntrusted, inlineUntrusted, sanitizeUntrustedText } from "./untrusted-text.js";
26
27
  import { discloseReminderShaped, observeReminderMarkEcho } from "./reminder-disclosure.js";
27
28
  import { MARKED_BLOCK_AFTER_DATA } from "./reminder-mint.js";
@@ -161,21 +162,21 @@ export function collapseMcpErrorPrefix(message) {
161
162
  out = out.slice(m[0].length);
162
163
  }
163
164
  }
164
- function sanitizeMcpErrorTextInPlace(err) {
165
+ function sanitizeMcpErrorTextInPlace(err, declared) {
165
166
  if (!(err instanceof Error))
166
167
  return;
167
- const sanitized = egressText("same-principal", err instanceof McpError ? collapseMcpErrorPrefix(err.message) : err.message);
168
+ const sanitized = remoteWords(err instanceof McpError ? collapseMcpErrorPrefix(err.message) : err.message, declared);
168
169
  if (sanitized !== err.message)
169
170
  err.message = sanitized;
170
171
  }
171
- function namedMcpFailureText(err) {
172
- const detail = remoteErrorText(err, { collapse: true });
172
+ function namedMcpFailureText(err, declared) {
173
+ const detail = remoteErrorText(err, declared, { collapse: true });
173
174
  const condition = thrownIs(err, McpError) ? describeMcpSpecErrorCode(readMember(err, "code")) : undefined;
174
175
  return condition !== undefined ? `${condition}: ${detail}` : detail;
175
176
  }
176
- function remoteErrorText(err, opts) {
177
+ function remoteErrorText(err, declared, opts) {
177
178
  const raw = thrownText(err);
178
- return egressText("same-principal", opts?.collapse === true ? collapseMcpErrorPrefix(raw) : raw);
179
+ return remoteWords(opts?.collapse === true ? collapseMcpErrorPrefix(raw) : raw, declared);
179
180
  }
180
181
  function writeEffectWarning(writeEffect) {
181
182
  return writeEffect
@@ -194,7 +195,7 @@ function rethrowHonestMcpError(err, ctx) {
194
195
  }
195
196
  throw e;
196
197
  };
197
- sanitizeMcpErrorTextInPlace(err);
198
+ sanitizeMcpErrorTextInPlace(err, ctx.declared);
198
199
  if (ctx.idle?.signal.reason === IDLE_WATCHDOG_ABORT_REASON) {
199
200
  ctx.liveness?.observe?.("timeout");
200
201
  const serverLabel = inlineUntrusted(ctx.server);
@@ -225,7 +226,7 @@ function rethrowHonestMcpError(err, ctx) {
225
226
  case "connect_refused":
226
227
  case "connection_failed": {
227
228
  const httpFailure = describeHttpTransportFailure(err, ctx.site);
228
- const detail = remoteErrorText(err);
229
+ const detail = remoteErrorText(err, ctx.declared);
229
230
  const fenced = `\nThe transport error follows as external/untrusted data:\n${fenceServerText(`${ctx.server} transport error`, detail)}`;
230
231
  finish(markMcpFailure(new Error(sessionGone(err, ctx.site)
231
232
  ? `${ctx.what} met a lost session on MCP server "${serverLabel}": ${httpFailure.condition}; ${ctx.resent === true ? "the call was sent again once on a fresh session, and the server reported that one gone too — if the server executed it before answering, it ran twice" : "the call was not sent again — if the server executed it before answering, it ran"}. The outcome is unknown.${writeEffectWarning(ctx.writeEffect)}${fenced}`
@@ -240,7 +241,7 @@ function rethrowHonestMcpError(err, ctx) {
240
241
  finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" was rejected with MCP protocol error ${code} — ${condition}. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, err.message)}`, { cause: err }), details({ specErrorCode: code })));
241
242
  }
242
243
  if (ctx.attributeServer) {
243
- finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err))}`, { cause: err }), details()));
244
+ finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err, ctx.declared))}`, { cause: err }), details()));
244
245
  }
245
246
  finish(markMcpFailure(err, details()));
246
247
  }
@@ -248,7 +249,7 @@ function rethrowHonestMcpError(err, ctx) {
248
249
  case "invalid_config":
249
250
  case "unknown": {
250
251
  if (ctx.attributeServer) {
251
- finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err))}`, { cause: err }), details()));
252
+ finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err, ctx.declared))}`, { cause: err }), details()));
252
253
  }
253
254
  if (err instanceof Error)
254
255
  finish(markMcpFailure(err, details()));
@@ -641,7 +642,7 @@ export function mcpToolSchemaProblem(schema) {
641
642
  }
642
643
  return undefined;
643
644
  }
644
- export async function materializeMcpTools(specs, principal, onElicit, imageResizer, reminderDisclosure, mcpRevocations, poolOpts, promptSections, dialable, signal) {
645
+ export async function materializeMcpTools(specs, principal, onElicit, imageResizer, reminderDisclosure, mcpRevocations, poolOpts, promptSections, dialable, signal, hostFloor) {
645
646
  const snapshot = snapshotMcpEntries(specs);
646
647
  const axesRefused = new WeakMap();
647
648
  const entries = snapshot.map((spec) => {
@@ -651,17 +652,7 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
651
652
  axesRefused.set(spec, judged.error);
652
653
  return spec;
653
654
  });
654
- {
655
- const collision = findNamespacePrefixCollision(MCP_NAMESPACE, entries.map((s) => s.name));
656
- if (collision) {
657
- const [a, b] = collision.peers;
658
- const e = new Error(a === b
659
- ? `MCP server "${inlineUntrusted(a, 120)}" is declared twice — each server needs its own name (both mount under "${collision.prefix}", so their tools would shadow each other and a refresh of one would unmount the other's).`
660
- : `MCP server names "${inlineUntrusted(a, 120)}" and "${inlineUntrusted(b, 120)}" both mount under "${collision.prefix}" — the namespaced tool name keeps only [a-zA-Z0-9_-], so they are the same domain to this engine (their tools would shadow each other and a refresh of one would unmount the other's). Rename one.`);
661
- e.code = "config.mcp_server_name_collision";
662
- throw e;
663
- }
664
- }
655
+ refuseCollidingMcpServerNames(entries.map((s) => s.name));
665
656
  let revocationProbeFailed = false;
666
657
  const isServerRevoked = (serverName) => {
667
658
  if (mcpRevocations === undefined)
@@ -767,18 +758,33 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
767
758
  const gatesNow = (h) => {
768
759
  const latest = h.listing.latest();
769
760
  if (latest.at !== h.gatesAt.at)
770
- h.gatesAt = { at: latest.at, gates: intakeListedTools({ tools: [...latest.entries], unproven: latest.unproven }, h.spec, linkOf(h.name), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind).gates };
761
+ h.gatesAt = { at: latest.at, gates: intakeListedTools({ tools: [...latest.entries], unproven: latest.unproven }, h.spec, linkOf(h.name), echoOf(h.spec), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind).gates };
771
762
  return h.gatesAt.gates;
772
763
  };
773
764
  const linkOf = (server) => ({
774
765
  live: () => liveOf(server),
775
766
  recover: (lost) => redialFlights.running(server) ?? (liveOf(server) === lost ? redialFlights.start(server, () => redialDial(server)) : Promise.resolve()),
776
767
  });
768
+ const endpointRefusal = (spec, dialKind) => {
769
+ const transport = spec.transport;
770
+ const raw = dialKind !== "stdio" && typeof transport === "object" && transport !== null && "url" in transport ? transport.url : undefined;
771
+ let url;
772
+ try {
773
+ if (typeof raw !== "string")
774
+ return undefined;
775
+ url = new URL(raw);
776
+ }
777
+ catch {
778
+ return undefined;
779
+ }
780
+ return peerRequestRefusal(`mcp: server "${inlineUntrusted(spec.name, 120)}"`, url, hostFloor);
781
+ };
777
782
  const dialServer = (spec, dialKind, dialOpts) => {
778
- const refusal = axesRefused.get(spec);
783
+ const refusal = axesRefused.get(spec) ?? endpointRefusal(spec, dialKind);
779
784
  return refusal !== undefined ? Promise.reject(refusal) : connectServer(spec, principal, onElicit, imageResizer, mcpDisclosure, isServerRevoked, dialKind, poolOpts?.pool, { ...dialOpts, link: linkOf(spec.name), ...(signal !== undefined ? { signal } : {}) });
780
785
  };
781
786
  const prefixOf = (name) => mintNamespacePrefix(MCP_NAMESPACE, name);
787
+ const echoOf = (spec) => declaredHeaderValues(spec.transport, principal);
782
788
  const heldCount = (name) => serverHandles.find((h) => h.name === name)?.tools.length ?? 0;
783
789
  const reconcileInstructions = (name, after, connected) => {
784
790
  if (!connected)
@@ -808,10 +814,11 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
808
814
  commitConnectedServer(spec, s, dialKinds[i]);
809
815
  }
810
816
  else {
811
- warnings.push(asServerWarning(spec, r.reason));
817
+ const declared = echoOf(spec);
818
+ warnings.push(asServerWarning(spec, r.reason, declared));
812
819
  const { kind, delivered, httpStatus } = classifyMcpFailure(r.reason, { phase: "connect", transport: dialKinds[i] });
813
820
  const liveness = livenessOf(kind, Date.now());
814
- statuses.push({ name: spec.name, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: namedMcpFailureText(r.reason), ...(liveness !== undefined ? { liveness } : {}) });
821
+ statuses.push({ name: spec.name, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: namedMcpFailureText(r.reason, declared), ...(liveness !== undefined ? { liveness } : {}) });
815
822
  }
816
823
  }
817
824
  const resourceTools = buildResourceTools(resourceServers, isServerRevoked);
@@ -859,20 +866,22 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
859
866
  const err = dialed.err;
860
867
  const { kind, delivered, httpStatus } = classifyMcpFailure(err, { phase: "connect", transport: dialKind });
861
868
  const redialLiveness = livenessOf(kind, Date.now());
862
- const status = { name: server, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: namedMcpFailureText(err), ...(redialLiveness !== undefined ? { liveness: redialLiveness } : {}) };
869
+ const declared = echoOf(spec);
870
+ const failure = namedMcpFailureText(err, declared);
871
+ const status = { name: server, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: failure, ...(redialLiveness !== undefined ? { liveness: redialLiveness } : {}) };
863
872
  const sIdx = statuses.findIndex((st) => st.name === server);
864
873
  if (sIdx === -1)
865
874
  statuses.push(status);
866
875
  else
867
876
  statuses[sIdx] = status;
868
- const raised = asServerWarning(spec, err);
877
+ const raised = asServerWarning(spec, err, declared);
869
878
  warnings.push(raised);
870
879
  reconcileInstructions(server, undefined, false);
871
880
  return {
872
881
  server,
873
882
  prefix,
874
883
  outcome: "refused",
875
- reason: inlineUntrusted(namedMcpFailureText(err), 240),
884
+ reason: inlineUntrusted(failure, 240),
876
885
  toolCount: 0,
877
886
  added: [],
878
887
  removed: priorNames,
@@ -930,14 +939,14 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
930
939
  try {
931
940
  const at = h.listing.open();
932
941
  const cacheTools = h.openListing();
933
- const listed = await listToolsLenient(h.client);
942
+ const listed = await listToolsLenient(h.client, undefined, echoOf(h.spec));
934
943
  const answered = h.listing.answer(at, listed.tools, listed.incomplete !== undefined);
935
944
  const mergedRaw = answered.view;
936
945
  if (!answered.recorded) {
937
946
  results.push({ server: h.name, prefix: prefixOf(h.name), status: "failed", toolCount: h.tools.length, added: [], removed: [], error: "a later listing of this server was opened and applied while this one was in the air — this one was discarded" });
938
947
  continue;
939
948
  }
940
- const { serverTools, serverAxes, gates, dropped, accepted } = intakeListedTools({ tools: [...mergedRaw], unproven: answered.unproven }, h.spec, linkOf(h.name), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind);
949
+ const { serverTools, serverAxes, gates, dropped, accepted } = intakeListedTools({ tools: [...mergedRaw], unproven: answered.unproven }, h.spec, linkOf(h.name), echoOf(h.spec), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind);
941
950
  cacheTools(accepted, answered.kept);
942
951
  const priorNames = h.tools.map((t) => t.name);
943
952
  const newNames = serverTools.map((t) => t.name);
@@ -970,7 +979,7 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
970
979
  toolCount: h.tools.length,
971
980
  added: [],
972
981
  removed: [],
973
- error: inlineUntrusted(namingLostSession(err, site, namedMcpFailureText(err)), 240),
982
+ error: inlineUntrusted(namingLostSession(err, site, namedMcpFailureText(err, echoOf(h.spec))), 240),
974
983
  });
975
984
  }
976
985
  }
@@ -1085,7 +1094,7 @@ export async function walkMcpListPages(fetchPage, opts) {
1085
1094
  catch (err) {
1086
1095
  if (pages === 0 || opts.signal?.aborted)
1087
1096
  throw err;
1088
- return { items, incomplete: { reason: "page_error", pages, error: remoteErrorText(err) } };
1097
+ return { items, incomplete: { reason: "page_error", pages, error: remoteErrorText(err, opts.declared ?? []) } };
1089
1098
  }
1090
1099
  opts.onPage?.();
1091
1100
  const pageStart = items.length;
@@ -1168,13 +1177,13 @@ async function readDirViaExtension(rs, uri, signal, timeoutMs, watchdog) {
1168
1177
  if (err instanceof McpError && err.code === ErrorCode.InvalidParams) {
1169
1178
  if (pages > 0)
1170
1179
  return { kind: "ok", resources, cursorInvalid: true };
1171
- const detail = remoteErrorText(err, { collapse: true });
1180
+ const detail = remoteErrorText(err, rs.declared, { collapse: true });
1172
1181
  return { kind: classifyDirReadInvalidParams(detail), detail };
1173
1182
  }
1174
1183
  if (err instanceof McpError && err.code === ErrorCode.MethodNotFound)
1175
1184
  return { kind: "unsupported" };
1176
1185
  if (pages > 0 && !signal?.aborted) {
1177
- return { kind: "ok", resources, incomplete: remoteErrorText(err) };
1186
+ return { kind: "ok", resources, incomplete: remoteErrorText(err, rs.declared) };
1178
1187
  }
1179
1188
  throw err;
1180
1189
  }
@@ -1266,7 +1275,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
1266
1275
  throw watchdog.idleSignal.reason === IDLE_WATCHDOG_ABORT_REASON ? new Error(idleWatchdogTripText(idleMs)) : err;
1267
1276
  });
1268
1277
  return { items: page.resources, ...(page.nextCursor !== undefined ? { nextCursor: page.nextCursor } : {}) };
1269
- }, { budgetMs: mcpToolTimeoutMs(), onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, ...(signal !== undefined ? { signal } : {}) });
1278
+ }, { budgetMs: mcpToolTimeoutMs(), onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, declared: rs.declared, ...(signal !== undefined ? { signal } : {}) });
1270
1279
  all.push(...walk.items.map((r) => ({ server: rs.server, ...r })));
1271
1280
  const lines = walk.items.map((r) => resourceLine(r));
1272
1281
  const body = lines.length ? lines.join("\n") : "(no resources)";
@@ -1279,11 +1288,12 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
1279
1288
  }
1280
1289
  }
1281
1290
  catch (err) {
1291
+ sanitizeMcpErrorTextInPlace(err, rs.declared);
1282
1292
  if (signal?.aborted)
1283
1293
  throw err;
1284
1294
  const msg = watchdog.idleSignal.reason === IDLE_WATCHDOG_ABORT_REASON
1285
1295
  ? idleWatchdogTripText(idleMs)
1286
- : namingLostSession(err, site, remoteErrorText(err));
1296
+ : namingLostSession(err, site, remoteErrorText(err, rs.declared));
1287
1297
  errors.push({ server: rs.server, error: msg });
1288
1298
  sections.push(`[${rs.server}] Error: could not list resources: ${inlineUntrusted(msg)}`);
1289
1299
  }
@@ -1342,7 +1352,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
1342
1352
  try {
1343
1353
  res = await rs.client
1344
1354
  .readResource({ uri }, { signal: watchdog.combinedSignal, timeout: timeoutMs })
1345
- .catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1355
+ .catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1346
1356
  rs.health.observe?.("completed");
1347
1357
  }
1348
1358
  finally {
@@ -1403,7 +1413,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
1403
1413
  try {
1404
1414
  const ext = rs.client.getServerCapabilities()?.extensions?.[MCP_SKILLS_EXTENSION];
1405
1415
  if (ext?.directoryRead === true) {
1406
- const r = await readDirViaExtension(rs, uri, signal, timeoutMs, watchdog).catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1416
+ const r = await readDirViaExtension(rs, uri, signal, timeoutMs, watchdog).catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1407
1417
  const serverSaid = (detail) => `\nThe server's error text follows as external/untrusted data:\n${delimitUntrusted(`${server} error`, truncateMcpErrorText(detail))}`;
1408
1418
  if (r.kind === "not_found") {
1409
1419
  return {
@@ -1431,10 +1441,10 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
1431
1441
  const walk = await walkMcpListPages(async (cursor, remainingMs) => {
1432
1442
  const page = await rs.client
1433
1443
  .listResources(cursor === undefined ? undefined : { cursor }, { signal: watchdog.combinedSignal, timeout: remainingMs })
1434
- .catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs: remainingMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1444
+ .catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs: remainingMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
1435
1445
  rs.health.observe?.("completed");
1436
1446
  return { items: page.resources, ...(page.nextCursor !== undefined ? { nextCursor: page.nextCursor } : {}) };
1437
- }, { budgetMs: timeoutMs, onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, ...(signal !== undefined ? { signal } : {}) });
1447
+ }, { budgetMs: timeoutMs, onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, declared: rs.declared, ...(signal !== undefined ? { signal } : {}) });
1438
1448
  const dirPrefix = uri.endsWith("/") ? uri : `${uri}/`;
1439
1449
  const children = walk.items.filter((r) => typeof r.uri === "string" && r.uri !== uri && r.uri.startsWith(dirPrefix));
1440
1450
  return renderDirChildren(server, uri, children, walk.incomplete ? { listing: walk.incomplete } : undefined);
@@ -1499,7 +1509,7 @@ export function parseCallToolResultLenient(data) {
1499
1509
  return { success: true, data: { ...parsed.data, structuredContent } };
1500
1510
  }
1501
1511
  const LENIENT_CALL_TOOL_RESULT_SCHEMA = { safeParse: parseCallToolResultLenient };
1502
- async function listToolsLenient(client, options) {
1512
+ async function listToolsLenient(client, options, declared) {
1503
1513
  if (!client.getServerCapabilities()?.tools)
1504
1514
  return { tools: [], toolsCapabilityAbsent: true };
1505
1515
  const walk = await walkMcpListPages(async (cursor, remainingMs) => {
@@ -1512,6 +1522,7 @@ async function listToolsLenient(client, options) {
1512
1522
  }, {
1513
1523
  budgetMs: options?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC,
1514
1524
  fingerprintOf: listEntryFingerprint,
1525
+ declared,
1515
1526
  ...(options?.signal !== undefined ? { signal: options.signal } : {}),
1516
1527
  });
1517
1528
  return { tools: walk.items, ...(walk.incomplete !== undefined ? { incomplete: walk.incomplete } : {}) };
@@ -1583,9 +1594,10 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
1583
1594
  const listing = lease?.listing ?? new ConnectionListing();
1584
1595
  const at = listing.open();
1585
1596
  const cacheTools = openListing();
1586
- const listed = await underStartupBound(startupMs, dialOpts?.signal, (options) => listToolsLenient(client, options));
1597
+ const declared = declaredHeaderValues(spec.transport, principal);
1598
+ const listed = await underStartupBound(startupMs, dialOpts?.signal, (options) => listToolsLenient(client, options, declared));
1587
1599
  const answered = listing.answer(at, listed.tools, listed.incomplete !== undefined, dialOpts.carried);
1588
- const { serverTools, serverAxes, gates, dropped, advisories, accepted } = intakeListedTools({ tools: [...answered.view], unproven: answered.unproven }, spec, dialOpts.link, imageResizer, reminderDisclosure, isServerRevoked, transportKind);
1600
+ const { serverTools, serverAxes, gates, dropped, advisories, accepted } = intakeListedTools({ tools: [...answered.view], unproven: answered.unproven }, spec, dialOpts.link, declared, imageResizer, reminderDisclosure, isServerRevoked, transportKind);
1589
1601
  cacheTools(accepted, answered.kept);
1590
1602
  const caps = client.getServerCapabilities();
1591
1603
  const resourceInfo = caps?.resources
@@ -1623,7 +1635,7 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
1623
1635
  ...(instructions ? { instructions } : {}),
1624
1636
  ...(disposed?.defect !== undefined ? { instructionsDefect: disposed.defect } : {}),
1625
1637
  ...(listed.incomplete !== undefined ? { listingIncomplete: listed.incomplete } : {}),
1626
- ...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, health, transportKind: idleKindOf(transportKind), ...resourceInfo } } : {}),
1638
+ ...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, health, transportKind: idleKindOf(transportKind), declared, ...resourceInfo } } : {}),
1627
1639
  };
1628
1640
  }
1629
1641
  catch (err) {
@@ -1631,7 +1643,7 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
1631
1643
  throw err;
1632
1644
  }
1633
1645
  }
1634
- function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure, isServerRevoked, transportKind) {
1646
+ function intakeListedTools(listed, spec, link, declared, imageResizer, reminderDisclosure, isServerRevoked, transportKind) {
1635
1647
  const declaredContentOrigin = spec.contentOrigin;
1636
1648
  const serverTools = [];
1637
1649
  const serverAxes = [];
@@ -1639,7 +1651,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
1639
1651
  const dropped = [];
1640
1652
  const accepted = [];
1641
1653
  const advisories = [];
1642
- const mintedNames = new Map();
1654
+ const claimToolName = createToolNameClaims(MCP_NAMESPACE, spec.name);
1643
1655
  for (const t of listed.tools) {
1644
1656
  if (spec.allowTools && !spec.allowTools.includes(t.name)) {
1645
1657
  continue;
@@ -1679,18 +1691,11 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
1679
1691
  }
1680
1692
  const remoteName = t.name;
1681
1693
  const taskRequired = t.execution !== null && typeof t.execution === "object" && t.execution.taskSupport === "required";
1682
- const namespacedName = mintNamespacedToolName(MCP_NAMESPACE, spec.name, remoteName);
1683
- const mintedBy = mintedNames.get(namespacedName);
1694
+ const { minted: namespacedName, heldBy: mintedBy } = claimToolName(remoteName);
1684
1695
  if (mintedBy !== undefined) {
1685
- dropped.push({
1686
- tool: inlineUntrusted(t.name),
1687
- reason: mintedBy === t.name
1688
- ? `this server listed this tool name more than once in one listing; the first entry is mounted as "${namespacedName}" and the repeat is dropped (one name cannot denote two tools)`
1689
- : `name collides with an earlier tool of this server: both mount as "${namespacedName}" after namespacing (only [a-zA-Z0-9_-] survives), and one name cannot denote two tools`,
1690
- });
1696
+ dropped.push({ tool: inlineUntrusted(t.name), reason: mcpToolDropReason(namespacedName, mintedBy, t.name) });
1691
1697
  continue;
1692
1698
  }
1693
- mintedNames.set(namespacedName, t.name);
1694
1699
  const hintAxis = mcpAxisFor(namespacedName, t.annotations);
1695
1700
  const axis = applyCallerAxisOverride(namespacedName, hintAxis, spec.toolAxes?.[remoteName]);
1696
1701
  if (axis)
@@ -1750,6 +1755,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
1750
1755
  try {
1751
1756
  return rethrowHonestMcpError(err, {
1752
1757
  server: spec.name,
1758
+ declared,
1753
1759
  what,
1754
1760
  timeoutMs,
1755
1761
  writeEffect,
@@ -1793,7 +1799,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
1793
1799
  const errScLine = structuredContentErrorLine(res.structuredContent, parts.join("\n"));
1794
1800
  if (errScLine !== undefined)
1795
1801
  parts.push(errScLine);
1796
- const body = truncateMcpErrorText(egressText("same-principal", parts.join("\n").trim()));
1802
+ const body = truncateMcpErrorText(remoteWords(parts.join("\n").trim(), declared));
1797
1803
  const msg = body
1798
1804
  ? `MCP tool ${inlineUntrusted(remoteName)} reported an error. The server's error content follows as external/untrusted data:\n${delimitUntrusted(`${spec.name} tool error`, body)}`
1799
1805
  : `MCP tool ${inlineUntrusted(remoteName)} reported an error`;
@@ -1842,8 +1848,8 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
1842
1848
  }
1843
1849
  return { serverTools, serverAxes, gates, dropped, advisories, accepted };
1844
1850
  }
1845
- function asServerWarning(spec, err) {
1846
- const warning = new Error(`mcp: server "${spec.name}" failed to connect — skipped (${namedMcpFailureText(err)})`, { cause: sanitizedCause(err) });
1851
+ function asServerWarning(spec, err, declared) {
1852
+ const warning = new Error(`mcp: server "${spec.name}" failed to connect — skipped (${namedMcpFailureText(err, declared)})`, { cause: sanitizedCause(err, declared) });
1847
1853
  warning.code = "mcp.server_unavailable";
1848
1854
  return warning;
1849
1855
  }
@@ -1868,8 +1874,8 @@ function dialDecision(dialable, spec) {
1868
1874
  }
1869
1875
  throw Object.assign(new Error(`MCP materialization refused: the dialable seat could not decide whether to dial server "${inlineUntrusted(spec.name, 120)}" — ${inlineUntrusted(why, 240)}. No server was dialed.`, cause), { code: "config.mcp_dialable_failed" });
1870
1876
  }
1871
- function sanitizedCause(err) {
1872
- const copy = new Error(namedMcpFailureText(err));
1877
+ function sanitizedCause(err, declared) {
1878
+ const copy = new Error(namedMcpFailureText(err, declared));
1873
1879
  const name = thrownName(err);
1874
1880
  if (name !== undefined) {
1875
1881
  if (name !== "")
@@ -2,6 +2,7 @@ import { join } from "node:path";
2
2
  import { uuidv7 } from "../../internal/harness.js";
3
3
  import { atomicWriteFileSync, ensureDirExists, lockedStrictUpdate, readStrictSidecar, enqueueMemoryAnnouncement, ControlPlaneCorruptError } from "./layout.js";
4
4
  import { inlineUntrusted } from "../untrusted-text.js";
5
+ import { extensionWords } from "../untrusted-egress.js";
5
6
  import { deliverEngineNotice } from "../engine-notice.js";
6
7
  import { CONSOLIDATION_FORCE_THROTTLE_FLOOR_MS, screenConsolidationOptions, supersessionFuseCeiling, updateConsolidationGate, recommendationUnconsumed, CONSOLIDATION_WRITE_REFUSED_CODE, ConsolidationRefusedError, } from "./consolidation.js";
7
8
  import { memoryConsolidationIncompleteNotice, memoryConsolidationWithheldNotice } from "./engine.js";
@@ -510,15 +511,15 @@ export async function runMemoryConsolidationDriver(engine, scope, opts) {
510
511
  }
511
512
  catch (err) {
512
513
  if (err instanceof DriverMintFailure) {
513
- announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} FAILED before any write: ${inlineUntrusted(err.detail, 300)}`]);
514
+ announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} FAILED before any write: ${extensionWords(err.detail, 300)}`]);
514
515
  return settle("driver_failed", undefined, err.detail);
515
516
  }
516
517
  if (err instanceof DriverPurityViolation) {
517
- announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} REFUSED on the clean-arm purity gate (no writes): ${inlineUntrusted(err.detail, 300)}`]);
518
+ announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} REFUSED on the clean-arm purity gate (no writes): ${extensionWords(err.detail, 300)}`]);
518
519
  return settle("purity_violation", undefined, err.detail);
519
520
  }
520
521
  if (err instanceof MintInvalidated) {
521
- announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} MINT INVALIDATED: ${inlineUntrusted(err.detail, 300)}`]);
522
+ announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} MINT INVALIDATED: ${extensionWords(err.detail, 300)}`]);
522
523
  if (run.residue === undefined && err.residue.length > 0)
523
524
  run.residue = err.residue;
524
525
  const partial = {
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { closeSync, existsSync, fsyncSync, linkSync, lstatSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
3
3
  import { basename, dirname, join } from "node:path";
4
- import { QUARANTINE_DIR, appendChallengeEvents, enqueueMemoryAnnouncement, ensureDirExists, v1MemoryPathKeyResolver, lineageContributionsOfSession, lockedStrictUpdate, markSessionPolluted, readProjectionDebts, readSessionPollution, readStrictSidecar, ControlPlaneCorruptError } from "./layout.js";
4
+ import { QUARANTINE_DIR, appendChallengeEvents, claimStaging, enqueueMemoryAnnouncement, ensureDirExists, isSameFile, mintStagingName, stagingNamePattern, v1MemoryPathKeyResolver, lineageContributionsOfSession, lockedStrictUpdate, markSessionPolluted, readProjectionDebts, readSessionPollution, readStrictSidecar, ControlPlaneCorruptError } from "./layout.js";
5
5
  import { thrownText } from "../thrown-value.js";
6
6
  export const DELEGATION_SETTLEMENT_FILE = "delegation-settlement.json";
7
7
  function reqStr(v) {
@@ -495,25 +495,6 @@ export function readHolds(controlDir) {
495
495
  function sha256(buf) {
496
496
  return createHash("sha256").update(buf).digest("hex");
497
497
  }
498
- let stagingSeq = 0;
499
- function uniqueStagingName(holdId, now) {
500
- stagingSeq += 1;
501
- return `${holdId}.staging-${now()}-${process.pid}-${stagingSeq}`;
502
- }
503
- function stagingGenerationPattern(holdId) {
504
- return new RegExp(`^${holdId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\.staging-\\d+-\\d+-\\d+(?:\\.claim-\\d+-\\d+)*$`);
505
- }
506
- function claimStaging(stagingPath) {
507
- stagingSeq += 1;
508
- const claimed = `${stagingPath}.claim-${process.pid}-${stagingSeq}`;
509
- try {
510
- renameSync(stagingPath, claimed);
511
- return claimed;
512
- }
513
- catch {
514
- return stagingPath;
515
- }
516
- }
517
498
  function dropStaging(claimedPath) {
518
499
  try {
519
500
  unlinkSync(claimedPath);
@@ -638,7 +619,7 @@ export function openInstructionHold(controlDir, input) {
638
619
  if (!writeCustodyVerified(join(holdDir, captureName), buf)) {
639
620
  return refuse("hold capture verification failed (the custody copy could not be written, made durable, or hashed back to the captured digest)", "capture_lost");
640
621
  }
641
- const stagingName = uniqueStagingName(holdId, input.now);
622
+ const stagingName = mintStagingName(holdId, input.now);
642
623
  const stagingPath = stagingPathBeside(input.absPath, stagingName);
643
624
  try {
644
625
  renameSync(input.absPath, stagingPath);
@@ -695,7 +676,7 @@ export function reconcileHolds(controlDir, input) {
695
676
  }
696
677
  };
697
678
  const finishRemoval = (row, plane) => {
698
- const stagingName = uniqueStagingName(row.holdId, input.now);
679
+ const stagingName = mintStagingName(row.holdId, input.now);
699
680
  renameSync(plane, stagingPathBeside(plane, stagingName));
700
681
  const staging = claimStaging(stagingPathBeside(plane, stagingName));
701
682
  if (sha256(readFileSync(staging)) === row.contentDigest) {
@@ -726,7 +707,14 @@ export function reconcileHolds(controlDir, input) {
726
707
  };
727
708
  const sweepStagingGenerations = (row, plane, custody) => {
728
709
  const seatDir = dirname(plane);
729
- const pattern = stagingGenerationPattern(row.holdId);
710
+ const pattern = stagingNamePattern(row.holdId);
711
+ let seat;
712
+ try {
713
+ seat = lstatSync(plane);
714
+ }
715
+ catch {
716
+ seat = undefined;
717
+ }
730
718
  for (const name of listSeat(seatDir)) {
731
719
  if (!pattern.test(name))
732
720
  continue;
@@ -746,7 +734,10 @@ export function reconcileHolds(controlDir, input) {
746
734
  continue;
747
735
  }
748
736
  }
749
- discloseStranded(row.holdId, row.rel, retireStagingToCustody(staged, holdDir, name).at);
737
+ const onSeat = seat !== undefined && isSameFile(staged, seat);
738
+ const retired = retireStagingToCustody(staged, holdDir, name);
739
+ if (!(onSeat && retired.settled && isSameFile(plane, seat)))
740
+ discloseStranded(row.holdId, row.rel, retired.at);
750
741
  }
751
742
  };
752
743
  const rows = readHolds(controlDir).filter((r) => r.status === "capturing");
@@ -1,7 +1,8 @@
1
1
  import { requireWriteGate } from "./consolidation-write-gate.js";
2
2
  import { readMember, thrownText } from "../thrown-value.js";
3
3
  import { assertServableRequestRoot, joinRequestUrl } from "../../brain/route-adjudicator.js";
4
- import { holdOwnCredentialValues } from "../secret-env.js";
4
+ import { holdOwnCredentialValues, namesASecret } from "../secret-env.js";
5
+ import { remoteWords } from "../protocol-http-auth.js";
5
6
  export const DISTILLER_DEFAULT_MAX_INPUTS_PER_PRODUCT = 32;
6
7
  const SIZE_CLAUSE = {
7
8
  "dl-2": "- the index should be as small as it can be made without losing either of the above.",
@@ -171,29 +172,37 @@ export function openAiCompatChatSeat(seat) {
171
172
  catch (e) {
172
173
  throw distillerConfigRefusal(thrownText(e), e);
173
174
  }
175
+ const declared = namesASecret(apiKey) ? [apiKey] : [];
174
176
  return async (req) => {
175
- const res = await fetch(joinRequestUrl(requestRoot, "/chat/completions"), {
176
- method: "POST",
177
- headers: { "content-type": "application/json", authorization: `Bearer ${apiKey}` },
178
- body: JSON.stringify({
179
- model: seat.model,
180
- messages: [
181
- { role: "system", content: req.system },
182
- { role: "user", content: req.user },
183
- ],
184
- temperature: req.temperature,
185
- max_tokens: req.maxTokens,
186
- }),
187
- });
188
- const text = await res.text();
177
+ let res;
178
+ let text;
179
+ try {
180
+ res = await fetch(joinRequestUrl(requestRoot, "/chat/completions"), {
181
+ method: "POST",
182
+ headers: { "content-type": "application/json", authorization: `Bearer ${apiKey}` },
183
+ body: JSON.stringify({
184
+ model: seat.model,
185
+ messages: [
186
+ { role: "system", content: req.system },
187
+ { role: "user", content: req.user },
188
+ ],
189
+ temperature: req.temperature,
190
+ max_tokens: req.maxTokens,
191
+ }),
192
+ });
193
+ text = await res.text();
194
+ }
195
+ catch (e) {
196
+ throw new Error(`model call failed: ${remoteWords(thrownText(e), declared)}`);
197
+ }
189
198
  if (!res.ok)
190
- throw new Error(`model call failed ${res.status}: ${text.slice(0, 400)}`);
199
+ throw new Error(`model call failed ${res.status}: ${remoteWords(text, declared).slice(0, 400)}`);
191
200
  let body;
192
201
  try {
193
202
  body = JSON.parse(text);
194
203
  }
195
204
  catch {
196
- throw new Error(`model returned non-JSON envelope: ${text.slice(0, 400)}`);
205
+ throw new Error(`model returned non-JSON envelope: ${remoteWords(text, declared).slice(0, 400)}`);
197
206
  }
198
207
  return {
199
208
  content: body.choices?.[0]?.message?.content ?? "",
@@ -19,7 +19,7 @@ import { landedUndecided, layerDigest, layerObservationLookup, readOnlyLayerCand
19
19
  import { markOriginClearanceTombstoned, openOriginClearance, readOriginClearances, settleOriginClearance } from "./origin-clearance.js";
20
20
  import { DEFAULT_MAX_ENTRY_DEPTH, MEMORY_INDEX_FILENAME, captureErasureInput, erasureRequestInvalid, erasureSelectHash, scanEntryFiles, } from "./file-backend.js";
21
21
  import { assembleMemoryExportBundle, computeMemoryBundleHash, memoryBundleInvalid, } from "./export-bundle.js";
22
- import { QUARANTINE_DIR, SCAN_FUSE_THRESHOLD, quarantineAndTombstone, restoreContainedBaseline, indexLineIsStale, readIndexRevs, writeIndexRevs, bumpScanFuse, scanFuseKey, canonicalize, anchorStoreRoot, landingPathOf, landsOutsideStore, storeActRefusal, storeRootMovedRefusal, adoptRootScopeLayout, clearScanFuse, effectiveControlRootOf, drainMemoryAnnouncements, enqueueMemoryAnnouncement, ensureDirExists, markSessionPolluted, readSessionPollution, fileSessionCaptureRecordStore, recordRetrievedAccount, writeFileNoFollow, withPermissionRemedy, permissionRemedyOf, readRetrievedAccount, registerScope, registeredScopes, scopeDirFor, appendChallengeEvents, appendLineageAudit, rebuildStrictControlPlaneLedger, isStrictControlPlaneLedgerCorrupt, CHALLENGE_LEDGER_MAX_EVENTS, adjudicateLineagePending, challengedEntryIds, clearLineageForEntries, discardLineagePending, lineageAccountOfEntry, lineageContributionsOfSession, lineageLatchedIds, promoteLineagePending, readChallengeEvents, readChallengedHistory, readLineageRecord, recordChallengedHistory, recordLineageCredential, reconcileLineage, readProjectionDebts, resolveChallengeEvent, settleProjectionDebts, stageLineagePending, stageProjectionDebts, } from "./layout.js";
22
+ import { QUARANTINE_DIR, SCAN_FUSE_THRESHOLD, quarantineAndTombstone, restoreContainedBaseline, mintStagingName, indexLineIsStale, readIndexRevs, writeIndexRevs, bumpScanFuse, scanFuseKey, canonicalize, anchorStoreRoot, landingPathOf, landsOutsideStore, storeActRefusal, storeRootMovedRefusal, adoptRootScopeLayout, clearScanFuse, effectiveControlRootOf, drainMemoryAnnouncements, enqueueMemoryAnnouncement, ensureDirExists, markSessionPolluted, readSessionPollution, fileSessionCaptureRecordStore, recordRetrievedAccount, writeFileNoFollow, writeFileNoReplace, withPermissionRemedy, permissionRemedyOf, readRetrievedAccount, registerScope, registeredScopes, scopeDirFor, appendChallengeEvents, appendLineageAudit, rebuildStrictControlPlaneLedger, isStrictControlPlaneLedgerCorrupt, CHALLENGE_LEDGER_MAX_EVENTS, adjudicateLineagePending, challengedEntryIds, clearLineageForEntries, discardLineagePending, lineageAccountOfEntry, lineageContributionsOfSession, lineageLatchedIds, promoteLineagePending, readChallengeEvents, readChallengedHistory, readLineageRecord, recordChallengedHistory, recordLineageCredential, reconcileLineage, readProjectionDebts, resolveChallengeEvent, settleProjectionDebts, stageLineagePending, stageProjectionDebts, } from "./layout.js";
23
23
  import { createSessionIncarnationSeat, recalledForAnyIdentity, recalledForIdentity, rememberForIdentity } from "./session-incarnation.js";
24
24
  import { scanMemoryFileName, scanMemoryWrite, scanRemediation } from "./scan.js";
25
25
  import { writableRootOf } from "./types.js";
@@ -1516,7 +1516,7 @@ export class MemoryEngine {
1516
1516
  }
1517
1517
  let restoredCommitted = false;
1518
1518
  if (captured) {
1519
- const stagingName = `${captureName}.staging`;
1519
+ const stagingName = mintStagingName(captureName, this.now);
1520
1520
  const stagingPath = stagingPathBeside(canonical, stagingName);
1521
1521
  try {
1522
1522
  this.refuseOutsideStore(canonical, "containing session residue");
@@ -2475,8 +2475,8 @@ export class MemoryEngine {
2475
2475
  if (committed !== undefined) {
2476
2476
  try {
2477
2477
  this.refuseOutsideStore(f.canonical, "restoring a held entry's committed content", handle);
2478
- writeFileNoFollow(f.canonical, committed);
2479
- report.restored.push(rel);
2478
+ if (writeFileNoReplace(f.canonical, committed) === "written")
2479
+ report.restored.push(rel);
2480
2480
  }
2481
2481
  catch (err) {
2482
2482
  report.warnings.push(`${rel}: the committed content could not be restored after the hold captured this session's edit — the entry is unavailable on the plane until release or the next restore: ${this.writeFailureText(err)}`);